7 #ifndef WARPX_COMM_K_H_
8 #define WARPX_COMM_K_H_
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) ? 1 : rr[1];
48 const int rl = (AMREX_SPACEDIM <= 2) ? 1 : rr[2];
51 const int sj = arr_stag[0];
52 const int sk = (AMREX_SPACEDIM == 1) ? 0 : arr_stag[1];
53 const int sl = (AMREX_SPACEDIM <= 2) ? 0 : arr_stag[2];
66 const amrex::Real hj = (sj == 0) ? 0.5_rt : 0._rt;
67 const amrex::Real hk = (sk == 0) ? 0.5_rt : 0._rt;
68 const amrex::Real hl = (sl == 0) ? 0.5_rt : 0._rt;
70 amrex::Real res = 0.0_rt;
72 for (
int jj = 0;
jj < nj;
jj++) {
73 for (
int kk = 0; kk < nk; kk++) {
74 for (
int ll = 0; ll < nl; ll++) {
75 const amrex::Real wj = (rj - amrex::Math::abs(j + hj - (jc +
jj + hj) * rj)) /
static_cast<amrex::Real
>(rj);
76 const amrex::Real wk = (rk - amrex::Math::abs(k + hk - (kc + kk + hk) * rk)) /
static_cast<amrex::Real
>(rk);
77 const amrex::Real wl = (rl - amrex::Math::abs(l + hl - (lc + ll + hl) * rl)) /
static_cast<amrex::Real
>(rl);
78 res += wj * wk * wl * arr_coarse_zeropad(jc+
jj,kc+kk,lc+ll);
82 arr_aux(j,k,l) = arr_fine(j,k,l) + res;
111 using namespace amrex;
115 const auto arr_fine_zeropad = [arr_fine] (
const int jj,
const int kk,
const int ll) noexcept
117 return arr_fine.
contains(
jj,kk,ll) ? arr_fine(
jj,kk,ll) : 0.0_rt;
119 const auto arr_coarse_zeropad = [arr_coarse] (
const int jj,
const int kk,
const int ll) noexcept
121 return arr_coarse.
contains(
jj,kk,ll) ? arr_coarse(
jj,kk,ll) : 0.0_rt;
123 const auto arr_tmp_zeropad = [arr_tmp] (
const int jj,
const int kk,
const int ll) noexcept
125 return arr_tmp.
contains(
jj,kk,ll) ? arr_tmp(
jj,kk,ll) : 0.0_rt;
135 const int rj = rr[0];
136 #if defined(WARPX_DIM_1D_Z)
137 constexpr
int rk = 1;
138 constexpr
int rl = 1;
139 #elif defined(WARPX_DIM_XZ) || defined(WARPX_DIM_RZ)
140 const int rk = rr[1];
141 constexpr
int rl = 1;
143 const int rk = rr[1];
144 const int rl = rr[2];
148 const int sj_fp = arr_fine_stag[0];
149 #if defined(WARPX_DIM_XZ) || defined(WARPX_DIM_RZ)
150 const int sk_fp = arr_fine_stag[1];
151 #elif defined(WARPX_DIM_3D)
152 const int sk_fp = arr_fine_stag[1];
153 const int sl_fp = arr_fine_stag[2];
157 const int sj_cp = arr_coarse_stag[0];
158 #if defined(WARPX_DIM_1D_Z)
159 constexpr
int sk_cp = 0;
160 constexpr
int sl_cp = 0;
161 #elif defined(WARPX_DIM_XZ) || defined(WARPX_DIM_RZ)
162 const int sk_cp = arr_coarse_stag[1];
163 constexpr
int sl_cp = 0;
165 const int sk_cp = arr_coarse_stag[1];
166 const int sl_cp = arr_coarse_stag[2];
178 amrex::Real tmp = 0.0_rt;
179 amrex::Real
fine = 0.0_rt;
180 amrex::Real coarse = 0.0_rt;
185 #if defined(WARPX_DIM_1D_Z)
188 #elif defined(WARPX_DIM_XZ) || defined(WARPX_DIM_RZ)
196 for (
int jj = 0;
jj < nj;
jj++) {
197 for (
int kk = 0; kk < nk; kk++) {
198 for (
int ll = 0; ll < nl; ll++) {
199 auto c = arr_tmp_zeropad(jc+
jj,kc+kk,lc+ll);
200 c *= (rj - amrex::Math::abs(j - (jc +
jj) * rj)) /
static_cast<amrex::Real
>(rj);
201 #if (AMREX_SPACEDIM >= 2)
202 c *= (rk - amrex::Math::abs(k - (kc + kk) * rk)) /
static_cast<amrex::Real
>(rk);
204 #if (AMREX_SPACEDIM == 3)
205 c *= (rl - amrex::Math::abs(l - (lc + ll) * rl)) /
static_cast<amrex::Real
>(rl);
215 #if defined(WARPX_DIM_1D_Z)
218 #elif defined(WARPX_DIM_XZ) || defined(WARPX_DIM_RZ)
226 const int jn = (sj_cp == 1) ? j : j - rj / 2;
227 const int kn = (sk_cp == 1) ? k : k - rk / 2;
228 const int ln = (sl_cp == 1) ? l : l - rl / 2;
234 for (
int jj = 0;
jj < nj;
jj++) {
235 for (
int kk = 0; kk < nk; kk++) {
236 for (
int ll = 0; ll < nl; ll++) {
237 auto c = arr_coarse_zeropad(jc+
jj,kc+kk,lc+ll);
238 c *= (rj - amrex::Math::abs(jn - (jc +
jj) * rj)) /
static_cast<amrex::Real
>(rj);
239 #if (AMREX_SPACEDIM >= 2)
240 c *= (rk - amrex::Math::abs(kn - (kc + kk) * rk)) /
static_cast<amrex::Real
>(rk);
242 #if (AMREX_SPACEDIM == 3)
243 c *= (rl - amrex::Math::abs(ln - (lc + ll) * rl)) /
static_cast<amrex::Real
>(rl);
252 nj = (sj_fp == 0) ? 2 : 1;
253 #if defined(WARPX_DIM_1D_Z)
256 #elif defined(WARPX_DIM_XZ) || defined(WARPX_DIM_RZ)
257 nk = (sk_fp == 0) ? 2 : 1;
260 nk = (sk_fp == 0) ? 2 : 1;
261 nl = (sl_fp == 0) ? 2 : 1;
264 const int jm = (sj_fp == 0) ? j-1 : j;
265 #if defined(WARPX_DIM_1D_Z)
268 #elif defined(WARPX_DIM_XZ) || defined(WARPX_DIM_RZ)
269 const int km = (sk_fp == 0) ? k-1 : k;
272 const int km = (sk_fp == 0) ? k-1 : k;
273 const int lm = (sl_fp == 0) ? l-1 : l;
276 for (
int jj = 0;
jj < nj;
jj++) {
277 for (
int kk = 0; kk < nk; kk++) {
278 for (
int ll = 0; ll < nl; ll++) {
279 fine += arr_fine_zeropad(jm+
jj,km+kk,lm+ll);
283 fine =
fine/
static_cast<amrex::Real
>(nj*nk*nl);
286 arr_aux(j,k,l) = tmp + (
fine - coarse);
307 using namespace amrex;
311 const auto arr_fine_zeropad = [arr_fine] (
const int jj,
const int kk,
const int ll) noexcept
313 return arr_fine.
contains(
jj,kk,ll) ? arr_fine(
jj,kk,ll) : 0.0_rt;
323 const int sj_fp = arr_fine_stag[0];
324 #if defined(WARPX_DIM_XZ) || defined(WARPX_DIM_RZ)
325 const int sk_fp = arr_fine_stag[1];
326 #elif defined(WARPX_DIM_3D)
327 const int sk_fp = arr_fine_stag[1];
328 const int sl_fp = arr_fine_stag[2];
336 amrex::Real
fine = 0.0_rt;
340 nj = (sj_fp == 0) ? 2 : 1;
341 #if defined(WARPX_DIM_1D_Z)
344 #elif defined(WARPX_DIM_XZ) || defined(WARPX_DIM_RZ)
345 nk = (sk_fp == 0) ? 2 : 1;
348 nk = (sk_fp == 0) ? 2 : 1;
349 nl = (sl_fp == 0) ? 2 : 1;
352 const int jm = (sj_fp == 0) ? j-1 : j;
353 #if defined(WARPX_DIM_1D_Z)
356 #elif defined(WARPX_DIM_XZ) || defined(WARPX_DIM_RZ)
357 const int km = (sk_fp == 0) ? k-1 : k;
360 const int km = (sk_fp == 0) ? k-1 : k;
361 const int lm = (sl_fp == 0) ? l-1 : l;
364 for (
int jj = 0;
jj < nj;
jj++) {
365 for (
int kk = 0; kk < nk; kk++) {
366 for (
int ll = 0; ll < nl; ll++) {
367 fine += arr_fine_zeropad(jm+
jj,km+kk,lm+ll);
371 fine =
fine/
static_cast<amrex::Real
>(nj*nk*nl);
374 arr_aux(j,k,l) =
fine;
407 amrex::Real
const* stencil_coeffs_x =
nullptr,
408 amrex::Real
const* stencil_coeffs_y =
nullptr,
409 amrex::Real
const* stencil_coeffs_z =
nullptr)
411 using namespace amrex;
415 const auto src_arr_zeropad = [src_arr] (
const int jj,
const int kk,
const int ll) noexcept
417 return src_arr.
contains(
jj,kk,ll) ? src_arr(
jj,kk,ll) : 0.0_rt;
421 #if defined(WARPX_DIM_1D_Z)
423 #elif defined(WARPX_DIM_XZ) || defined(WARPX_DIM_RZ)
432 const int shift = (dst_nodal) ? 0 : 1;
435 const int sj = (dst_nodal) ? src_stag[0] : dst_stag[0];
436 #if (AMREX_SPACEDIM >= 2)
437 const int sk = (dst_nodal) ? src_stag[1] : dst_stag[1];
439 #if defined(WARPX_DIM_3D)
440 const int sl = (dst_nodal) ? src_stag[2] : dst_stag[2];
444 const bool interp_j = (sj == 0);
445 #if (AMREX_SPACEDIM >= 2)
446 const bool interp_k = (sk == 0);
448 #if defined(WARPX_DIM_3D)
449 const bool interp_l = (sl == 0);
452 #if defined(WARPX_DIM_1D_Z)
454 #elif defined(WARPX_DIM_XZ) || defined(WARPX_DIM_RZ)
457 #elif defined(WARPX_DIM_3D)
464 const amrex::Real wj = (interp_j) ? 0.5_rt : 1.0_rt;
465 #if defined(WARPX_DIM_1D_Z)
466 constexpr amrex::Real wk = 1.0_rt;
467 constexpr amrex::Real wl = 1.0_rt;
468 #elif defined(WARPX_DIM_XZ) || defined(WARPX_DIM_RZ)
469 const amrex::Real wk = (interp_k) ? 0.5_rt : 1.0_rt;
470 constexpr amrex::Real wl = 1.0_rt;
471 #elif defined(WARPX_DIM_3D)
472 const amrex::Real wk = (interp_k) ? 0.5_rt : 1.0_rt;
473 const amrex::Real wl = (interp_l) ? 0.5_rt : 1.0_rt;
477 const int jmin = (interp_j) ? j - noj/2 +
shift : j;
478 const int jmax = (interp_j) ? j + noj/2 +
shift - 1 : j;
481 #if defined(WARPX_DIM_1D_Z)
486 const int kmin = (interp_k) ? k - nok/2 +
shift : k;
487 const int kmax = (interp_k) ? k + nok/2 +
shift - 1 : k;
491 #if (AMREX_SPACEDIM <= 2)
495 #elif defined(WARPX_DIM_3D)
496 const int lmin = (interp_l) ? l - nol/2 +
shift : l;
497 const int lmax = (interp_l) ? l + nol/2 +
shift - 1 : l;
501 const int nj = jmax - jmin;
502 const int nk = kmax - kmin;
503 const int nl = lmax - lmin;
544 amrex::Real res = 0.0_rt;
546 #if defined(WARPX_DIM_1D_Z)
547 amrex::Real
const* scj = stencil_coeffs_z;
548 #elif defined(WARPX_DIM_XZ) || defined(WARPX_DIM_RZ)
549 amrex::Real
const* scj = stencil_coeffs_x;
550 amrex::Real
const* sck = stencil_coeffs_z;
551 #elif defined(WARPX_DIM_3D)
552 amrex::Real
const* scj = stencil_coeffs_x;
553 amrex::Real
const* sck = stencil_coeffs_y;
554 amrex::Real
const* scl = stencil_coeffs_z;
557 for (
int ll = 0; ll <= nl; ll++)
559 #if defined(WARPX_DIM_3D)
560 const amrex::Real cl = (interp_l)? scl[ll] : 1.0_rt;
562 const amrex::Real cl = 1.0_rt;
564 for (
int kk = 0; kk <= nk; kk++)
566 #if (AMREX_SPACEDIM >= 2)
567 const amrex::Real ck = (interp_k)? sck[kk] : 1.0_rt;
569 const amrex::Real ck = 1.0_rt;
571 for (
int jj = 0;
jj <= nj;
jj++)
573 const amrex::Real cj = (interp_j)? scj[
jj] : 1.0_rt;
575 res += cj * ck * cl * src_arr_zeropad(jmin+
jj,kmin+kk,lmin+ll);
580 dst_arr(j,k,l) = wj * wk * wl * res;
#define AMREX_FORCE_INLINE
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
AMREX_GPU_HOST_DEVICE static constexpr AMREX_FORCE_INLINE IntVectND< dim > TheNodeVector() noexcept
static constexpr auto c
vacuum speed of light [m/s]
Definition: constant.H:44
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE BoxND< dim > shift(const BoxND< dim > &b, int dir, int nzones) noexcept
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void ignore_unused(const Ts &...)
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE BoxND< dim > coarsen(const BoxND< dim > &b, int ref_ratio) noexcept
jj
Definition: check_interp_points_and_weights.py:160
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE bool contains(int i, int j, int k) const noexcept