1#ifndef AMREX_INTERP_C_H_
2#define AMREX_INTERP_C_H_
3#include <AMReX_Config.H>
5#if (AMREX_SPACEDIM == 1)
7#elif (AMREX_SPACEDIM == 2)
28 if (ci*ratio[0] == fi) {
29#if (AMREX_SPACEDIM >= 2)
34#if (AMREX_SPACEDIM == 3)
42 fine(fi, fj, fk, n) =
crse(ci, cj, ck, n);
54 if (cj*ratio[1] == fj) {
56#if (AMREX_SPACEDIM == 3)
64 fine(fi, fj, fk, n) =
crse(ci, cj, ck, n);
76 if (ck*ratio[2] == fk) {
82 fine(fi, fj, fk, n) =
crse(ci, cj, ck, n);
96 IntVect const& ratio,
Box const& per_grown_domain,
int dim)
noexcept
100#if (AMREX_SPACEDIM == 1)
107#if (AMREX_SPACEDIM == 3)
113 if (dim == 0 && ci*ratio[0] == i) {
116 fine(i, j, k, n) =
crse(ci, cj, ck, n);
117#if (AMREX_SPACEDIM >= 2)
118 if (cj > per_grown_domain.smallEnd(1) && cj < per_grown_domain.bigEnd(1) && ratio[1] > 1) {
126 if (dc !=
Real(0.0)) {
133#if (AMREX_SPACEDIM == 3)
134 if (ck > per_grown_domain.smallEnd(2) && ck < per_grown_domain.bigEnd(2) && ratio[2] > 1) {
142 if (dc !=
Real(0.0)) {
154#if (AMREX_SPACEDIM >= 2)
155 if (dim == 1 && cj*ratio[1] == j) {
158 fine(i, j, k, n) =
crse(ci, cj, ck, n);
159 if (ci > per_grown_domain.smallEnd(0) && ci < per_grown_domain.bigEnd(0) && ratio[0] > 1) {
167 if (dc !=
Real(0.0)) {
174#if (AMREX_SPACEDIM == 3)
175 if (ck > per_grown_domain.smallEnd(2) && ck < per_grown_domain.bigEnd(2) && ratio[2] > 1) {
183 if (dc !=
Real(0.0)) {
195#if (AMREX_SPACEDIM == 3)
196 if (dim == 2 && ck*ratio[2] == k) {
199 fine(i, j, k, n) =
crse(ci, cj, ck, n);
200 if (ci > per_grown_domain.smallEnd(0) && ci < per_grown_domain.bigEnd(0) && ratio[0] > 1) {
208 if (dc !=
Real(0.0)) {
215 if (cj > per_grown_domain.smallEnd(1) && cj < per_grown_domain.bigEnd(1) && ratio[1] > 1) {
223 if (dc !=
Real(0.0)) {
246 if (i-ci*ratio[0] != 0)
248 Real const w =
static_cast<Real>(i-ci*ratio[0]) * (
Real(1.)/
Real(ratio[0]));
249 int i1 = ci*ratio[0];
250 int i2 = (ci+1)*ratio[0];
261 if (j-cj*ratio[1] != 0)
263 Real const w =
static_cast<Real>(j-cj*ratio[1]) * (
Real(1.)/
Real(ratio[1]));
264 int j1 = cj*ratio[1];
265 int j2 = (cj+1)*ratio[1];
277 if (k-ck*ratio[2] != 0)
279 Real const w =
static_cast<Real>(k-ck*ratio[2]) * (
Real(1.)/
Real(ratio[2]));
280 int k1 = ck*ratio[2];
281 int k2 = (ck+1)*ratio[2];
293 if (i-ci*ratio[0] != 0)
295 Real const w =
static_cast<Real>(i-ci*ratio[0]) * (
Real(1.)/
Real(ratio[0]));
296 int i1 = ci*ratio[0];
297 int i2 = (ci+1)*ratio[0];
298 return (
Real(1.)-w) *
fine(i1,j,k,n) + w *
fine(i2,j,k,n);
300 return fine(i,j,k,n);
311 if (j-cj*ratio[1] != 0)
313 Real const w =
static_cast<Real>(j-cj*ratio[1]) * (
Real(1.)/
Real(ratio[1]));
314 int j1 = cj*ratio[1];
315 int j2 = (cj+1)*ratio[1];
316 return (
Real(1.)-w) *
fine(i,j1,k,n) + w *
fine(i,j2,k,n);
318 return fine(i,j,k,n);
329 if (k-ck*ratio[2] != 0)
331 Real const w =
static_cast<Real>(k-ck*ratio[2]) * (
Real(1.)/
Real(ratio[2]));
332 int k1 = ck*ratio[2];
333 int k2 = (ck+1)*ratio[2];
334 return (
Real(1.)-w) *
fine(i,j,k1,n) + w *
fine(i,j,k2,n);
336 return fine(i,j,k,n);
348 int s = 2*(i-ii*2) - 1;
349 fine(i,j,k,n) = c(-2*s)*
crse(ii-2,j,k,n)
350 + c( -s)*
crse(ii-1,j,k,n)
351 + c( 0)*
crse(ii ,j,k,n)
352 + c( s)*
crse(ii+1,j,k,n)
353 + c( 2*s)*
crse(ii+2,j,k,n);
364 int s = 2*(j-jj*2) - 1;
365 fine(i,j,k,n) = c(-2*s)*
crse(i,jj-2,k,n)
366 + c( -s)*
crse(i,jj-1,k,n)
367 + c( 0)*
crse(i,jj ,k,n)
368 + c( s)*
crse(i,jj+1,k,n)
369 + c( 2*s)*
crse(i,jj+2,k,n);
380 int s = 2*(k-kk*2) - 1;
381 fine(i,j,k,n) = c(-2*s)*
crse(i,j,kk-2,n)
382 + c( -s)*
crse(i,j,kk-1,n)
383 + c( 0)*
crse(i,j,kk ,n)
384 + c( s)*
crse(i,j,kk+1,n)
385 + c( 2*s)*
crse(i,j,kk+2,n);
#define AMREX_FORCE_INLINE
Definition AMReX_Extension.H:119
#define AMREX_GPU_HOST_DEVICE
Definition AMReX_GpuQualifiers.H:20
Array4< Real > fine
Definition AMReX_InterpFaceRegister.cpp:90
Array4< int const > mask
Definition AMReX_InterpFaceRegister.cpp:93
Array4< Real > slope
Definition AMReX_InterpFaceRegister.cpp:91
Array4< Real const > crse
Definition AMReX_InterpFaceRegister.cpp:92
amrex_real Real
Floating Point Type for Fields.
Definition AMReX_REAL.H:79
__host__ __device__ BoxND< dim > coarsen(const BoxND< dim > &b, int ref_ratio) noexcept
Coarsen BoxND by given (positive) coarsening ratio.
Definition AMReX_Box.H:1409
Definition AMReX_Amr.cpp:49
__host__ __device__ void ignore_unused(const Ts &...)
This shuts up the compiler about unused variables.
Definition AMReX.H:138
__host__ __device__ void face_linear_face_interp_x(int fi, int fj, int fk, int n, Array4< T > const &fine, Array4< T const > const &crse, Array4< int const > const &mask, IntVect const &ratio) noexcept
Definition AMReX_Interp_C.H:23
__host__ __device__ void cell_quartic_interp_x(int i, int j, int k, int n, Array4< Real > const &fine, Array4< Real const > const &crse) noexcept
Definition AMReX_Interp_C.H:341
__host__ __device__ void cell_quartic_interp_y(int i, int j, int k, int n, Array4< Real > const &fine, Array4< Real const > const &crse) noexcept
Definition AMReX_Interp_C.H:357
__host__ __device__ constexpr const T & min(const T &a, const T &b) noexcept
Definition AMReX_Algorithm.H:21
__host__ __device__ void face_linear_interp_x(int i, int, int, int n, Array4< T > const &fine, Array4< T const > const &crse, IntVect const &ratio) noexcept
Definition AMReX_Interp_1D_C.H:97
__host__ __device__ void cell_quartic_interp_z(int i, int j, int k, int n, Array4< Real > const &fine, Array4< Real const > const &crse) noexcept
Definition AMReX_Interp_C.H:373
__host__ __device__ Real face_linear_interp_safe_y(int i, int j, int k, int n, amrex::Array4< amrex::Real > const &fine, IntVect const &ratio) noexcept
Definition AMReX_Interp_C.H:305
__host__ __device__ void face_linear_face_interp_z(int fi, int fj, int fk, int n, Array4< T > const &fine, Array4< T const > const &crse, Array4< int const > const &mask, IntVect const &ratio) noexcept
Definition AMReX_Interp_C.H:71
__host__ __device__ void face_linear_interp_y(int i, int j, int, int n, Array4< T > const &fine, Array4< T const > const &crse, IntVect const &ratio) noexcept
Definition AMReX_Interp_2D_C.H:191
__host__ __device__ Real face_linear_interp_safe_x(int i, int j, int k, int n, amrex::Array4< amrex::Real > const &fine, IntVect const &ratio) noexcept
Definition AMReX_Interp_C.H:287
__host__ __device__ void face_cons_linear_face_interp(int i, int j, int k, int n, Array4< T > const &fine, Array4< T const > const &crse, Array4< int const > const &mask, IntVect const &ratio, Box const &per_grown_domain, int dim) noexcept
Definition AMReX_Interp_C.H:94
__host__ __device__ Real face_linear_interp_safe_z(int i, int j, int k, int n, amrex::Array4< amrex::Real > const &fine, IntVect const &ratio) noexcept
Definition AMReX_Interp_C.H:323
__host__ __device__ void face_linear_interp_z(int i, int j, int k, int n, Array4< T > const &fine, Array4< T const > const &crse, IntVect const &ratio) noexcept
Definition AMReX_Interp_3D_C.H:376
__host__ __device__ void face_linear_face_interp_y(int fi, int fj, int fk, int n, Array4< T > const &fine, Array4< T const > const &crse, Array4< int const > const &mask, IntVect const &ratio) noexcept
Definition AMReX_Interp_C.H:49
Definition AMReX_Array.H:199
Definition AMReX_Array4.H:61