35 using namespace amrex;
38 const auto arr_coarse_zeropad = [arr_coarse] (
const int jj,
const int kk,
const int ll)
noexcept
40 return arr_coarse.
contains(jj,kk,ll) ? arr_coarse(jj,kk,ll) : 0.0_rt;
47 const int rk = (AMREX_SPACEDIM > 1) ? rr[1] : 1;
48 const int rl = (AMREX_SPACEDIM > 2) ? rr[2] : 1;
52 const int sj = arr_stag[0];
53 const int sk = (AMREX_SPACEDIM > 1) ? arr_stag[1] : 1;
54 const int sl = (AMREX_SPACEDIM > 2) ? arr_stag[2] : 1;
58 const int nk = (AMREX_SPACEDIM > 1) ? 2 : 1;
59 const int nl = (AMREX_SPACEDIM > 2) ? 2 : 1;
67 const amrex::Real hj = (sj == 0) ? 0.5_rt : 0._rt;
68 const amrex::Real hk = (sk == 0) ? 0.5_rt : 0._rt;
69 const amrex::Real hl = (sl == 0) ? 0.5_rt : 0._rt;
71 amrex::Real res = 0.0_rt;
73 for (
int jj = 0; jj < nj; jj++) {
74 for (
int kk = 0; kk < nk; kk++) {
75 for (
int ll = 0; ll < nl; ll++) {
76 const amrex::Real wj = (rj - amrex::Math::abs(j + hj - (jc + jj + hj) * rj)) /
static_cast<amrex::Real
>(rj);
77 const amrex::Real wk = (rk - amrex::Math::abs(k + hk - (kc + kk + hk) * rk)) /
static_cast<amrex::Real
>(rk);
78 const amrex::Real wl = (rl - amrex::Math::abs(l + hl - (lc + ll + hl) * rl)) /
static_cast<amrex::Real
>(rl);
79 res += wj * wk * wl * arr_coarse_zeropad(jc+jj,kc+kk,lc+ll);
83 arr_aux(j,k,l) = arr_fine(j,k,l) + res;
113 using namespace amrex;
117 const auto arr_fine_zeropad = [arr_fine] (
const int jj,
const int kk,
const int ll)
noexcept
119 return arr_fine.
contains(jj,kk,ll) ? arr_fine(jj,kk,ll) : 0.0_rt;
121 const auto arr_coarse_zeropad = [arr_coarse] (
const int jj,
const int kk,
const int ll)
noexcept
123 return arr_coarse.
contains(jj,kk,ll) ? arr_coarse(jj,kk,ll) : 0.0_rt;
125 const auto arr_tmp_zeropad = [arr_tmp] (
const int jj,
const int kk,
const int ll)
noexcept
127 return arr_tmp.
contains(jj,kk,ll) ? arr_tmp(jj,kk,ll) : 0.0_rt;
137 const int rj = rr[0];
138 const int rk = (AMREX_SPACEDIM > 1) ? rr[1] : 1;
139 const int rl = (AMREX_SPACEDIM > 2) ? rr[2] : 1;
143 const int sj_fp = arr_fine_stag[0];
144 const int sk_fp = (AMREX_SPACEDIM > 1) ? arr_fine_stag[1] : 1;
145 const int sl_fp = (AMREX_SPACEDIM > 2) ? arr_fine_stag[2] : 1;
149 const int sj_cp = arr_coarse_stag[0];
150 const int sk_cp = (AMREX_SPACEDIM > 1) ? arr_coarse_stag[1] : 1;
151 const int sl_cp = (AMREX_SPACEDIM > 2) ? arr_coarse_stag[2] : 1;
162 amrex::Real tmp = 0.0_rt;
163 amrex::Real
fine = 0.0_rt;
164 amrex::Real coarse = 0.0_rt;
169 nk = (AMREX_SPACEDIM > 1) ? 2 : 1;
170 nl = (AMREX_SPACEDIM > 2) ? 2 : 1;
172 for (
int jj = 0; jj < nj; jj++) {
173 for (
int kk = 0; kk < nk; kk++) {
174 for (
int ll = 0; ll < nl; ll++) {
175 auto c = arr_tmp_zeropad(jc+jj,kc+kk,lc+ll);
176 c *= (rj - amrex::Math::abs(j - (jc + jj) * rj)) /
static_cast<amrex::Real
>(rj);
177#if (AMREX_SPACEDIM > 1)
178 c *= (rk - amrex::Math::abs(k - (kc + kk) * rk)) /
static_cast<amrex::Real
>(rk);
179#if (AMREX_SPACEDIM > 2)
180 c *= (rl - amrex::Math::abs(l - (lc + ll) * rl)) /
static_cast<amrex::Real
>(rl);
191 nk = (AMREX_SPACEDIM > 1) ? 2 : 1;
192 nl = (AMREX_SPACEDIM > 2) ? 2 : 1;
194 const int jn = (sj_cp == 1) ? j : j - rj / 2;
195 const int kn = (sk_cp == 1) ? k : k - rk / 2;
196 const int ln = (sl_cp == 1) ? l : l - rl / 2;
202 for (
int jj = 0; jj < nj; jj++) {
203 for (
int kk = 0; kk < nk; kk++) {
204 for (
int ll = 0; ll < nl; ll++) {
205 auto c = arr_coarse_zeropad(jc+jj,kc+kk,lc+ll);
206 c *= (rj - amrex::Math::abs(jn - (jc + jj) * rj)) /
static_cast<amrex::Real
>(rj);
207#if (AMREX_SPACEDIM > 1)
208 c *= (rk - amrex::Math::abs(kn - (kc + kk) * rk)) /
static_cast<amrex::Real
>(rk);
209#if (AMREX_SPACEDIM > 2)
210 c *= (rl - amrex::Math::abs(ln - (lc + ll) * rl)) /
static_cast<amrex::Real
>(rl);
220 nj = (sj_fp == 0) ? 2 : 1;
221 nk = (sk_fp == 0) ? 2 : 1;
222 nl = (sl_fp == 0) ? 2 : 1;
224 const int jm = (sj_fp == 0) ? j-1 : j;
225 const int km = (sk_fp == 0) ? k-1 : k;
226 const int lm = (sl_fp == 0) ? l-1 : l;
228 for (
int jj = 0; jj < nj; jj++) {
229 for (
int kk = 0; kk < nk; kk++) {
230 for (
int ll = 0; ll < nl; ll++) {
231 fine += arr_fine_zeropad(jm+jj,km+kk,lm+ll);
235 fine =
fine/
static_cast<amrex::Real
>(nj*nk*nl);
238 arr_aux(j,k,l) = tmp + (
fine - coarse);
260 using namespace amrex;
264 const auto arr_fine_zeropad = [arr_fine] (
const int jj,
const int kk,
const int ll)
noexcept
266 return arr_fine.
contains(jj,kk,ll) ? arr_fine(jj,kk,ll) : 0.0_rt;
278 const int sj_fp = arr_fine_stag[0];
279 const int sk_fp = (AMREX_SPACEDIM > 1) ? arr_fine_stag[1] : 1;
280 const int sl_fp = (AMREX_SPACEDIM > 2) ? arr_fine_stag[2] : 1;
287 amrex::Real
fine = 0.0_rt;
291 nj = (sj_fp == 0) ? 2 : 1;
292 nk = (sk_fp == 0) ? 2 : 1;
293 nl = (sl_fp == 0) ? 2 : 1;
295 int const jm = (sj_fp == 0) ? j-1 : j;
296 int const km = (sk_fp == 0) ? k-1 : k;
297 int const lm = (sl_fp == 0) ? l-1 : l;
299 for (
int jj = 0; jj < nj; jj++) {
300 for (
int kk = 0; kk < nk; kk++) {
301 for (
int ll = 0; ll < nl; ll++) {
302 fine += arr_fine_zeropad(jm+jj,km+kk,lm+ll);
306 fine =
fine/
static_cast<amrex::Real
>(nj*nk*nl);
309 arr_aux(j,k,l) =
fine;
339 [[maybe_unused]]
const int nox = 2,
340 [[maybe_unused]]
const int noy = 2,
341 [[maybe_unused]]
const int noz = 2,
342 [[maybe_unused]] amrex::Real
const* stencil_coeffs_x =
nullptr,
343 [[maybe_unused]] amrex::Real
const* stencil_coeffs_y =
nullptr,
344 [[maybe_unused]] amrex::Real
const* stencil_coeffs_z =
nullptr)
346 using namespace amrex;
350 const auto src_arr_zeropad = [src_arr] (
const int jj,
const int kk,
const int ll)
noexcept
352 return src_arr.
contains(jj,kk,ll) ? src_arr(jj,kk,ll) : 0.0_rt;
363 const int shift = (dst_nodal) ? 0 : 1;
367 const int sj = (dst_nodal) ? src_stag[0] : dst_stag[0];
368 const int sk = (AMREX_SPACEDIM > 1) ? ((dst_nodal) ? src_stag[1] : dst_stag[1]) : 1;
369 const int sl = (AMREX_SPACEDIM > 2) ? ((dst_nodal) ? src_stag[2] : dst_stag[2]) : 1;
372 const bool interp_j = (sj == 0);
373 const bool interp_k = (sk == 0);
374 const bool interp_l = (sl == 0);
381 const amrex::Real wj = (interp_j) ? 0.5_rt : 1.0_rt;
382 const amrex::Real wk = (interp_k) ? 0.5_rt : 1.0_rt;
383 const amrex::Real wl = (interp_l) ? 0.5_rt : 1.0_rt;
386 const int jmin = (interp_j) ? j - noj/2 +
shift : j;
387 const int jmax = (interp_j) ? j + noj/2 +
shift - 1 : j;
388 const int kmin = (interp_k) ? k - nok/2 +
shift : k;
389 const int kmax = (interp_k) ? k + nok/2 +
shift - 1 : k;
390 const int lmin = (interp_l) ? l - nol/2 +
shift : l;
391 const int lmax = (interp_l) ? l + nol/2 +
shift - 1 : l;
394 const int nj = jmax - jmin;
395 const int nk = kmax - kmin;
396 const int nl = lmax - lmin;
437 amrex::Real res = 0.0_rt;
439 amrex::Real
const* scj =
AMREX_D_PICK(stencil_coeffs_z, stencil_coeffs_x, stencil_coeffs_x);
440 amrex::Real
const* sck =
AMREX_D_PICK(
nullptr , stencil_coeffs_z, stencil_coeffs_y);
441 amrex::Real
const* scl =
AMREX_D_PICK(
nullptr ,
nullptr , stencil_coeffs_z);
443 for (
int ll = 0; ll <= nl; ll++)
445 const amrex::Real cl = (interp_l)? scl[ll] : 1.0_rt;
446 for (
int kk = 0; kk <= nk; kk++)
448 const amrex::Real ck = (interp_k)? sck[kk] : 1.0_rt;
449 for (
int jj = 0; jj <= nj; jj++)
451 const amrex::Real cj = (interp_j)? scj[jj] : 1.0_rt;
453 res += cj * ck * cl * src_arr_zeropad(jmin+jj,kmin+kk,lmin+ll);
458 dst_arr(j,k,l) = wj * wk * wl * res;
AMREX_GPU_DEVICE AMREX_FORCE_INLINE void warpx_interp(int j, int k, int l, amrex::Array4< amrex::Real > const &arr_aux, amrex::Array4< amrex::Real const > const &arr_fine, amrex::Array4< amrex::Real const > const &arr_coarse, const amrex::IntVect &arr_stag, const amrex::IntVect &rr)
Interpolation function called within WarpX::UpdateAuxilaryDataSameType with electromagnetic solver to...
Definition WarpXComm_K.H:28