8#ifndef INTERPOLATOR_HXX
9#define INTERPOLATOR_HXX
12#include "AMReX_Config.H"
13#include "AMReX_MFIter.H"
14#include "AMReX_REAL.H"
15#include "AMReX_Random.H"
16#include "AMReX_RandomEngine.H"
17#include "AMReX_Scan.H"
18#include "cctk_Types.h"
53AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE CCTK_ATTRIBUTE_ALWAYS_INLINE
void
55 const CCTK_REAL *weights,
const CCTK_REAL (&values)[N],
56 const CCTK_REAL &x,
const CCTK_REAL &plo,
57 const CCTK_REAL &dx) {
61 for (
int i = 0; i < N; i++) {
63 CCTK_REAL diff = x - (plo + points[i] * dx);
64 const CCTK_REAL tolerance = 1e-12;
65 if (diff < tolerance && diff > -tolerance) {
70 CCTK_REAL term = weights[i] / diff;
71 num += term * values[i];
95template <
int INTERPOLATION_ORDER>
96AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE CCTK_ATTRIBUTE_ALWAYS_INLINE CCTK_REAL
98 const long int &i0,
const long int &j0,
const long int &k0,
99 const CCTK_REAL &x,
const CCTK_REAL &y,
const CCTK_REAL &z,
100 const amrex::GpuArray<double, 3> &dx,
101 const amrex::GpuArray<double, 3> &plo,
const int &comp) {
103 (((INTERPOLATION_ORDER - 1) * INTERPOLATION_ORDER) >> 1) - 1;
105 const CCTK_INT all_nodes[14] = {0, 1, -1, 0, 1, -1, 0, 1, 2, -2, -1, 0, 1, 2};
107 const CCTK_REAL all_weights[14] = {
108 -1., 1., 0.5, -1., 0.5, -1.0 / 6.0, 0.5,
109 -0.5, 1.0 / 6.0, 1.0 / 24.0, -1.0 / 6.0, 0.25, -1.0 / 6.0, 1.0 / 24.0};
110 const CCTK_INT *nodes = &all_nodes[order];
111 const CCTK_REAL *w = &all_weights[order];
114 CCTK_REAL G[INTERPOLATION_ORDER][INTERPOLATION_ORDER];
115 for (
int j = 0; j < INTERPOLATION_ORDER; j++) {
116 for (
int k = 0; k < INTERPOLATION_ORDER; k++) {
117 CCTK_REAL values[INTERPOLATION_ORDER];
118 CCTK_INT points[INTERPOLATION_ORDER];
119 for (
int i = 0; i < INTERPOLATION_ORDER; i++) {
120 values[i] = f(i0 + nodes[i], j0 + nodes[j], k0 + nodes[k], comp);
121 points[i] = i0 + nodes[i];
123 barycentric_cubic_1d<INTERPOLATION_ORDER>(G[j][k], points, w, values, x,
129 CCTK_REAL H[INTERPOLATION_ORDER];
130 for (
int k = 0; k < INTERPOLATION_ORDER; k++) {
131 CCTK_REAL values[INTERPOLATION_ORDER];
132 CCTK_INT points[INTERPOLATION_ORDER];
133 for (
int j = 0; j < INTERPOLATION_ORDER; j++) {
135 points[j] = j0 + nodes[j];
137 barycentric_cubic_1d<INTERPOLATION_ORDER>(H[k], points, w, values, y,
142 CCTK_INT points[INTERPOLATION_ORDER];
143 for (
int k = 0; k < INTERPOLATION_ORDER; k++) {
144 points[k] = k0 + nodes[k];
147 barycentric_cubic_1d<INTERPOLATION_ORDER>(value, points, w, H, z, plo[2],
187template <
int INTERPOLATION_ORDER>
188AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE CCTK_ATTRIBUTE_ALWAYS_INLINE CCTK_REAL
190 const long int &i0,
const long int &j0,
const long int &k0,
191 const CCTK_REAL &x,
const CCTK_REAL &y,
const CCTK_REAL &z,
192 const amrex::GpuArray<double, 3> &dx,
193 const amrex::GpuArray<double, 3> &plo) {
195 return barycentric_cubic_3d<INTERPOLATION_ORDER>(f, i0, j0, k0, x, y, z, dx,
244 AMREX_GPU_HOST AMREX_FORCE_INLINE CCTK_ATTRIBUTE_ALWAYS_INLINE
void
246 const int (&points)[N],
const CCTK_REAL *weights,
247 const CCTK_REAL (&values)[N],
const CCTK_REAL &x,
248 const CCTK_REAL &plo,
const CCTK_REAL &dx) {
251 CCTK_REAL den_sqr{0.0};
252 CCTK_REAL der_num{0.0};
256 for (
int i = 0; i < N; i++) {
257 CCTK_REAL diff = x - (plo + points[i] * dx);
258 const CCTK_REAL tolerance = 1e-12;
259 if (diff < tolerance && diff > -tolerance) {
262 for (
int j = 0; j < N; j++) {
266 const auto x_j = points[j] * dx;
267 const auto x_i = points[i] * dx;
268 d_f_x += weights[j] * (values[i] - values[j]) / (x_j - x_i);
276 CCTK_REAL term = weights[i] / diff;
277 num += term * values[i];
279 den_sqr += term / diff;
283 for (
int i = 0; i < N; i++) {
284 CCTK_REAL term = weights[i] / (x - (plo + points[i] * dx));
285 der_num += (-term * den / (x - (plo + points[i] * dx)) + term * den_sqr) *
291 d_f_x = der_num / (den * den);
363template <
int INTERPOLATION_ORDER>
364AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE CCTK_ATTRIBUTE_ALWAYS_INLINE
void
366 CCTK_REAL &df_xyz_1, CCTK_REAL &df_xyz_2,
367 amrex::Array4<CCTK_REAL const>
const &f,
368 const long int &i0,
const long int &j0,
369 const long int &k0,
const CCTK_REAL &x,
370 const CCTK_REAL &y,
const CCTK_REAL &z,
371 const amrex::GpuArray<double, 3> &dx,
372 const amrex::GpuArray<double, 3> &plo,
376 (((INTERPOLATION_ORDER - 1) * INTERPOLATION_ORDER) >> 1) - 1;
377 const CCTK_INT all_nodes[14] = {0, 1, -1, 0, 1, -1, 0, 1, 2, -2, -1, 0, 1, 2};
378 const CCTK_REAL all_weights[14] = {
379 -1., 1., 0.5, -1., 0.5, -1.0 / 6.0, 0.5,
380 -0.5, 1.0 / 6.0, 1.0 / 24.0, -1.0 / 6.0, 0.25, -1.0 / 6.0, 1.0 / 24.0};
381 const CCTK_INT *nodes = &all_nodes[order];
382 const CCTK_REAL *w = &all_weights[order];
385 CCTK_REAL G_xyz[INTERPOLATION_ORDER][INTERPOLATION_ORDER];
387 CCTK_REAL G_dxyz[INTERPOLATION_ORDER][INTERPOLATION_ORDER];
388 for (
int j = 0; j < INTERPOLATION_ORDER; j++) {
389 for (
int k = 0; k < INTERPOLATION_ORDER; k++) {
390 CCTK_REAL values[INTERPOLATION_ORDER];
391 CCTK_INT points[INTERPOLATION_ORDER];
392 for (
int i = 0; i < INTERPOLATION_ORDER; i++) {
393 values[i] = f(i0 + nodes[i], j0 + nodes[j], k0 + nodes[k], comp);
394 points[i] = i0 + nodes[i];
396 der_barycentric_cubic_1d<INTERPOLATION_ORDER>(
397 G_xyz[j][k], G_dxyz[j][k], points, w, values, x, plo[0], dx[0]);
402 CCTK_REAL H_xyz[INTERPOLATION_ORDER];
404 CCTK_REAL H_dxyz[INTERPOLATION_ORDER];
406 CCTK_REAL H_xdyz[INTERPOLATION_ORDER];
407 for (
int k = 0; k < INTERPOLATION_ORDER; k++) {
408 CCTK_REAL values[INTERPOLATION_ORDER];
409 CCTK_REAL d_values[INTERPOLATION_ORDER];
410 CCTK_INT points[INTERPOLATION_ORDER];
411 for (
int j = 0; j < INTERPOLATION_ORDER; j++) {
412 values[j] = G_xyz[j][k];
413 d_values[j] = G_dxyz[j][k];
414 points[j] = j0 + nodes[j];
416 der_barycentric_cubic_1d<INTERPOLATION_ORDER>(H_xyz[k], H_xdyz[k], points,
417 w, values, y, plo[1], dx[1]);
418 barycentric_cubic_1d<INTERPOLATION_ORDER>(H_dxyz[k], points, w, d_values, y,
422 CCTK_INT points[INTERPOLATION_ORDER];
423 for (
int k = 0; k < INTERPOLATION_ORDER; k++) {
424 points[k] = k0 + nodes[k];
428 der_barycentric_cubic_1d<INTERPOLATION_ORDER>(f_xyz, df_xyz_2, points, w,
429 H_xyz, z, plo[2], dx[2]);
431 barycentric_cubic_1d<INTERPOLATION_ORDER>(df_xyz_0, points, w, H_dxyz, z,
434 barycentric_cubic_1d<INTERPOLATION_ORDER>(df_xyz_1, points, w, H_xdyz, z,
462template <
int INTERPOLATION_ORDER>
463AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE CCTK_ATTRIBUTE_ALWAYS_INLINE
void
465 const amrex::Array4<CCTK_REAL const> &f,
const long int &i0,
466 const long int &j0,
const long int &k0,
const CCTK_REAL &x,
467 const CCTK_REAL &y,
const CCTK_REAL &z,
468 const amrex::GpuArray<double, 3> &dx,
469 const amrex::GpuArray<double, 3> &plo) {
471 (((INTERPOLATION_ORDER - 1) * INTERPOLATION_ORDER) >> 1) - 1;
472 const CCTK_INT all_nodes[14] = {0, 1, -1, 0, 1, -1, 0, 1, 2, -2, -1, 0, 1, 2};
473 const CCTK_REAL all_weights[14] = {
474 -1., 1., 0.5, -1., 0.5, -1.0 / 6.0, 0.5,
475 -0.5, 1.0 / 6.0, 1.0 / 24.0, -1.0 / 6.0, 0.25, -1.0 / 6.0, 1.0 / 24.0};
476 const CCTK_INT *nodes = &all_nodes[order];
477 const CCTK_REAL *w = &all_weights[order];
479 for (
int comp = 0; comp < 6; comp++) {
482 CCTK_REAL G[INTERPOLATION_ORDER][INTERPOLATION_ORDER];
483 for (
int j = 0; j < INTERPOLATION_ORDER; j++) {
484 for (
int k = 0; k < INTERPOLATION_ORDER; k++) {
485 CCTK_REAL values[INTERPOLATION_ORDER];
486 CCTK_INT points[INTERPOLATION_ORDER];
487 for (
int i = 0; i < INTERPOLATION_ORDER; i++) {
488 values[i] = f(i0 + nodes[i], j0 + nodes[j], k0 + nodes[k], comp);
489 points[i] = i0 + nodes[i];
491 barycentric_cubic_1d<INTERPOLATION_ORDER>(G[j][k], points, w, values, x,
497 CCTK_REAL H[INTERPOLATION_ORDER];
498 for (
int k = 0; k < INTERPOLATION_ORDER; k++) {
499 CCTK_REAL values[INTERPOLATION_ORDER];
500 CCTK_INT points[INTERPOLATION_ORDER];
501 for (
int j = 0; j < INTERPOLATION_ORDER; j++) {
503 points[j] = j0 + nodes[j];
505 barycentric_cubic_1d<INTERPOLATION_ORDER>(H[k], points, w, values, y,
510 CCTK_INT points[INTERPOLATION_ORDER];
511 for (
int k = 0; k < INTERPOLATION_ORDER; k++) {
512 points[k] = k0 + nodes[k];
514 barycentric_cubic_1d<INTERPOLATION_ORDER>(array6[comp], points, w, H, z,
545template <
int INTERPOLATION_ORDER>
546AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE CCTK_ATTRIBUTE_ALWAYS_INLINE
void
548 amrex::GpuArray<amrex::GpuArray<CCTK_REAL, 6>, 3> &d_array6,
549 const amrex::Array4<CCTK_REAL const> &f,
const long int &i0,
550 const long int &j0,
const long int &k0,
const CCTK_REAL &x,
551 const CCTK_REAL &y,
const CCTK_REAL &z,
552 const amrex::GpuArray<double, 3> &dx,
553 const amrex::GpuArray<double, 3> &plo) {
555 (((INTERPOLATION_ORDER - 1) * INTERPOLATION_ORDER) >> 1) - 1;
556 const CCTK_INT all_nodes[14] = {0, 1, -1, 0, 1, -1, 0, 1, 2, -2, -1, 0, 1, 2};
557 const CCTK_REAL all_weights[14] = {
558 -1., 1., 0.5, -1., 0.5, -1.0 / 6.0, 0.5,
559 -0.5, 1.0 / 6.0, 1.0 / 24.0, -1.0 / 6.0, 0.25, -1.0 / 6.0, 1.0 / 24.0};
560 const CCTK_INT *nodes = &all_nodes[order];
561 const CCTK_REAL *w = &all_weights[order];
563 for (
int comp = 0; comp < 6; comp++) {
566 CCTK_REAL G_xyz[INTERPOLATION_ORDER][INTERPOLATION_ORDER];
568 CCTK_REAL G_dxyz[INTERPOLATION_ORDER][INTERPOLATION_ORDER];
569 for (
int j = 0; j < INTERPOLATION_ORDER; j++) {
570 for (
int k = 0; k < INTERPOLATION_ORDER; k++) {
571 CCTK_REAL values[INTERPOLATION_ORDER];
572 CCTK_INT points[INTERPOLATION_ORDER];
573 for (
int i = 0; i < INTERPOLATION_ORDER; i++) {
574 values[i] = f(i0 + nodes[i], j0 + nodes[j], k0 + nodes[k], comp);
575 points[i] = i0 + nodes[i];
577 der_barycentric_cubic_1d<INTERPOLATION_ORDER>(
578 G_xyz[j][k], G_dxyz[j][k], points, w, values, x, plo[0], dx[0]);
583 CCTK_REAL H_xyz[INTERPOLATION_ORDER];
585 CCTK_REAL H_dxyz[INTERPOLATION_ORDER];
587 CCTK_REAL H_xdyz[INTERPOLATION_ORDER];
588 for (
int k = 0; k < INTERPOLATION_ORDER; k++) {
589 CCTK_REAL values[INTERPOLATION_ORDER];
590 CCTK_REAL d_values[INTERPOLATION_ORDER];
591 CCTK_INT points[INTERPOLATION_ORDER];
592 for (
int j = 0; j < INTERPOLATION_ORDER; j++) {
593 values[j] = G_xyz[j][k];
594 d_values[j] = G_dxyz[j][k];
595 points[j] = j0 + nodes[j];
597 der_barycentric_cubic_1d<INTERPOLATION_ORDER>(
598 H_xyz[k], H_xdyz[k], points, w, values, y, plo[1], dx[1]);
599 barycentric_cubic_1d<INTERPOLATION_ORDER>(H_dxyz[k], points, w, d_values,
603 CCTK_INT points[INTERPOLATION_ORDER];
604 for (
int k = 0; k < INTERPOLATION_ORDER; k++) {
605 points[k] = k0 + nodes[k];
609 der_barycentric_cubic_1d<INTERPOLATION_ORDER>(
610 array6[comp], d_array6[2][comp], points, w, H_xyz, z, plo[2], dx[2]);
612 barycentric_cubic_1d<INTERPOLATION_ORDER>(d_array6[0][comp], points, w,
613 H_dxyz, z, plo[2], dx[2]);
615 barycentric_cubic_1d<INTERPOLATION_ORDER>(d_array6[1][comp], points, w,
616 H_xdyz, z, plo[2], dx[2]);
646template <
int INTERPOLATION_ORDER>
647AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE CCTK_ATTRIBUTE_ALWAYS_INLINE
void
649 amrex::GpuArray<amrex::GpuArray<CCTK_REAL, 3>, 3> &d_array3,
650 const amrex::Array4<CCTK_REAL const> &f,
const long int &i0,
651 const long int &j0,
const long int &k0,
const CCTK_REAL &x,
652 const CCTK_REAL &y,
const CCTK_REAL &z,
653 const amrex::GpuArray<double, 3> &dx,
654 const amrex::GpuArray<double, 3> &plo) {
656 (((INTERPOLATION_ORDER - 1) * INTERPOLATION_ORDER) >> 1) - 1;
657 const CCTK_INT all_nodes[14] = {0, 1, -1, 0, 1, -1, 0, 1, 2, -2, -1, 0, 1, 2};
658 const CCTK_REAL all_weights[14] = {
659 -1., 1., 0.5, -1., 0.5, -1.0 / 6.0, 0.5,
660 -0.5, 1.0 / 6.0, 1.0 / 24.0, -1.0 / 6.0, 0.25, -1.0 / 6.0, 1.0 / 24.0};
661 const CCTK_INT *nodes = &all_nodes[order];
662 const CCTK_REAL *w = &all_weights[order];
664 for (
int comp = 0; comp < 3; comp++) {
667 CCTK_REAL G_xyz[INTERPOLATION_ORDER][INTERPOLATION_ORDER];
669 CCTK_REAL G_dxyz[INTERPOLATION_ORDER][INTERPOLATION_ORDER];
670 for (
int j = 0; j < INTERPOLATION_ORDER; j++) {
671 for (
int k = 0; k < INTERPOLATION_ORDER; k++) {
672 CCTK_REAL values[INTERPOLATION_ORDER];
673 CCTK_INT points[INTERPOLATION_ORDER];
674 for (
int i = 0; i < INTERPOLATION_ORDER; i++) {
675 values[i] = f(i0 + nodes[i], j0 + nodes[j], k0 + nodes[k], comp);
676 points[i] = i0 + nodes[i];
678 der_barycentric_cubic_1d<INTERPOLATION_ORDER>(
679 G_xyz[j][k], G_dxyz[j][k], points, w, values, x, plo[0], dx[0]);
684 CCTK_REAL H_xyz[INTERPOLATION_ORDER];
686 CCTK_REAL H_dxyz[INTERPOLATION_ORDER];
688 CCTK_REAL H_xdyz[INTERPOLATION_ORDER];
689 for (
int k = 0; k < INTERPOLATION_ORDER; k++) {
690 CCTK_REAL values[INTERPOLATION_ORDER];
691 CCTK_REAL d_values[INTERPOLATION_ORDER];
692 CCTK_INT points[INTERPOLATION_ORDER];
693 for (
int j = 0; j < INTERPOLATION_ORDER; j++) {
694 values[j] = G_xyz[j][k];
695 d_values[j] = G_dxyz[j][k];
696 points[j] = j0 + nodes[j];
698 der_barycentric_cubic_1d<INTERPOLATION_ORDER>(
699 H_xyz[k], H_xdyz[k], points, w, values, y, plo[1], dx[1]);
700 barycentric_cubic_1d<INTERPOLATION_ORDER>(H_dxyz[k], points, w, d_values,
704 CCTK_INT points[INTERPOLATION_ORDER];
705 for (
int k = 0; k < INTERPOLATION_ORDER; k++) {
706 points[k] = k0 + nodes[k];
710 der_barycentric_cubic_1d<INTERPOLATION_ORDER>(
711 array3[comp], d_array3[2][comp], points, w, H_xyz, z, plo[2], dx[2]);
713 barycentric_cubic_1d<INTERPOLATION_ORDER>(d_array3[0][comp], points, w,
714 H_dxyz, z, plo[2], dx[2]);
716 barycentric_cubic_1d<INTERPOLATION_ORDER>(d_array3[1][comp], points, w,
717 H_xdyz, z, plo[2], dx[2]);
747template <
int INTERPOLATION_ORDER>
748AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE CCTK_ATTRIBUTE_ALWAYS_INLINE
void
750 const amrex::Array4<CCTK_REAL const> &f,
const long int &i0,
751 const long int &j0,
const long int &k0,
const CCTK_REAL &x,
752 const CCTK_REAL &y,
const CCTK_REAL &z,
753 const amrex::GpuArray<double, 3> &dx,
754 const amrex::GpuArray<double, 3> &plo) {
756 (((INTERPOLATION_ORDER - 1) * INTERPOLATION_ORDER) >> 1) - 1;
757 const CCTK_INT all_nodes[14] = {0, 1, -1, 0, 1, -1, 0, 1, 2, -2, -1, 0, 1, 2};
758 const CCTK_REAL all_weights[14] = {
759 -1., 1., 0.5, -1., 0.5, -1.0 / 6.0, 0.5,
760 -0.5, 1.0 / 6.0, 1.0 / 24.0, -1.0 / 6.0, 0.25, -1.0 / 6.0, 1.0 / 24.0};
761 const CCTK_INT *nodes = &all_nodes[order];
762 const CCTK_REAL *w = &all_weights[order];
765 CCTK_REAL G_xyz[INTERPOLATION_ORDER][INTERPOLATION_ORDER];
767 CCTK_REAL G_dxyz[INTERPOLATION_ORDER][INTERPOLATION_ORDER];
768 for (
int j = 0; j < INTERPOLATION_ORDER; j++) {
769 for (
int k = 0; k < INTERPOLATION_ORDER; k++) {
770 CCTK_REAL values[INTERPOLATION_ORDER];
771 CCTK_INT points[INTERPOLATION_ORDER];
772 for (
int i = 0; i < INTERPOLATION_ORDER; i++) {
773 values[i] = f(i0 + nodes[i], j0 + nodes[j], k0 + nodes[k], 0);
774 points[i] = i0 + nodes[i];
776 der_barycentric_cubic_1d<INTERPOLATION_ORDER>(
777 G_xyz[j][k], G_dxyz[j][k], points, w, values, x, plo[0], dx[0]);
782 CCTK_REAL H_xyz[INTERPOLATION_ORDER];
784 CCTK_REAL H_dxyz[INTERPOLATION_ORDER];
786 CCTK_REAL H_xdyz[INTERPOLATION_ORDER];
787 for (
int k = 0; k < INTERPOLATION_ORDER; k++) {
788 CCTK_REAL values[INTERPOLATION_ORDER];
789 CCTK_REAL d_values[INTERPOLATION_ORDER];
790 CCTK_INT points[INTERPOLATION_ORDER];
791 for (
int j = 0; j < INTERPOLATION_ORDER; j++) {
792 values[j] = G_xyz[j][k];
793 d_values[j] = G_dxyz[j][k];
794 points[j] = j0 + nodes[j];
796 der_barycentric_cubic_1d<INTERPOLATION_ORDER>(H_xyz[k], H_xdyz[k], points,
797 w, values, y, plo[1], dx[1]);
798 barycentric_cubic_1d<INTERPOLATION_ORDER>(H_dxyz[k], points, w, d_values, y,
802 CCTK_INT points[INTERPOLATION_ORDER];
803 for (
int k = 0; k < INTERPOLATION_ORDER; k++) {
804 points[k] = k0 + nodes[k];
808 der_barycentric_cubic_1d<INTERPOLATION_ORDER>(array, d_array[2], points, w,
809 H_xyz, z, plo[2], dx[2]);
811 barycentric_cubic_1d<INTERPOLATION_ORDER>(d_array[0], points, w, H_dxyz, z,
814 barycentric_cubic_1d<INTERPOLATION_ORDER>(d_array[1], points, w, H_xdyz, z,
Interpolators namespace.
Definition: ParticlesContainer.hxx:39
AMREX_GPU_DEVICE AMREX_GPU_HOST AMREX_FORCE_INLINE CCTK_ATTRIBUTE_ALWAYS_INLINE void der_barycentric_cubic_1d(CCTK_REAL &f_x, CCTK_REAL &d_f_x, const int(&points)[N], const CCTK_REAL *weights, const CCTK_REAL(&values)[N], const CCTK_REAL &x, const CCTK_REAL &plo, const CCTK_REAL &dx)
Do a Barycentric interpolation and its derivative in one direction.
Definition: Interpolator.hxx:245
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE CCTK_ATTRIBUTE_ALWAYS_INLINE void interpolate_array(amrex::GpuArray< CCTK_REAL, 6 > &array6, const amrex::Array4< CCTK_REAL const > &f, const long int &i0, const long int &j0, const long int &k0, const CCTK_REAL &x, const CCTK_REAL &y, const CCTK_REAL &z, const amrex::GpuArray< double, 3 > &dx, const amrex::GpuArray< double, 3 > &plo)
Do the barycentric interpolation for a 3 dimensional and symmetric matrix.
Definition: Interpolator.hxx:464
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE CCTK_ATTRIBUTE_ALWAYS_INLINE void d_interpolate_array(amrex::GpuArray< CCTK_REAL, 6 > &array6, amrex::GpuArray< amrex::GpuArray< CCTK_REAL, 6 >, 3 > &d_array6, const amrex::Array4< CCTK_REAL const > &f, const long int &i0, const long int &j0, const long int &k0, const CCTK_REAL &x, const CCTK_REAL &y, const CCTK_REAL &z, const amrex::GpuArray< double, 3 > &dx, const amrex::GpuArray< double, 3 > &plo)
Do the barycentric interpolation for a 3 dimensional and symmetric matrix and its derivatives.
Definition: Interpolator.hxx:547
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE CCTK_ATTRIBUTE_ALWAYS_INLINE void barycentric_cubic_1d(CCTK_REAL &value, const int(&points)[N], const CCTK_REAL *weights, const CCTK_REAL(&values)[N], const CCTK_REAL &x, const CCTK_REAL &plo, const CCTK_REAL &dx)
Do a Barycentric interpolation in one direction.
Definition: Interpolator.hxx:54
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE CCTK_ATTRIBUTE_ALWAYS_INLINE CCTK_REAL barycentric_cubic_3d(const amrex::Array4< CCTK_REAL const > &f, const long int &i0, const long int &j0, const long int &k0, const CCTK_REAL &x, const CCTK_REAL &y, const CCTK_REAL &z, const amrex::GpuArray< double, 3 > &dx, const amrex::GpuArray< double, 3 > &plo, const int &comp)
Do a Barycentric interpolation in three direction for a vectorial function.
Definition: Interpolator.hxx:97
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE CCTK_ATTRIBUTE_ALWAYS_INLINE void barycentric_derivative_and_interpolate(CCTK_REAL &f_xyz, CCTK_REAL &df_xyz_0, CCTK_REAL &df_xyz_1, CCTK_REAL &df_xyz_2, amrex::Array4< CCTK_REAL const > const &f, const long int &i0, const long int &j0, const long int &k0, const CCTK_REAL &x, const CCTK_REAL &y, const CCTK_REAL &z, const amrex::GpuArray< double, 3 > &dx, const amrex::GpuArray< double, 3 > &plo, const int &comp)
Do a Barycentric interpolation and its derivatives in three directions.
Definition: Interpolator.hxx:365