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);
319 amrex::Real
const* stencil_coeffs_x =
nullptr,
320 amrex::Real
const* stencil_coeffs_y =
nullptr,
321 amrex::Real
const* stencil_coeffs_z =
nullptr)
323 using namespace amrex;
327 const auto src_arr_zeropad = [src_arr] (
const int jj,
const int kk,
const int ll) noexcept
329 return src_arr.
contains(
jj,kk,ll) ? src_arr(
jj,kk,ll) : 0.0_rt;
333 #if defined(WARPX_DIM_1D_Z)
335 #elif defined(WARPX_DIM_XZ) || defined(WARPX_DIM_RZ)
344 const int shift = (dst_nodal) ? 0 : 1;
347 const int sj = (dst_nodal) ? src_stag[0] : dst_stag[0];
348 #if (AMREX_SPACEDIM >= 2)
349 const int sk = (dst_nodal) ? src_stag[1] : dst_stag[1];
351 #if defined(WARPX_DIM_3D)
352 const int sl = (dst_nodal) ? src_stag[2] : dst_stag[2];
356 const bool interp_j = (sj == 0);
357 #if (AMREX_SPACEDIM >= 2)
358 const bool interp_k = (sk == 0);
360 #if defined(WARPX_DIM_3D)
361 const bool interp_l = (sl == 0);
364 #if defined(WARPX_DIM_1D_Z)
366 #elif defined(WARPX_DIM_XZ) || defined(WARPX_DIM_RZ)
369 #elif defined(WARPX_DIM_3D)
376 const amrex::Real wj = (interp_j) ? 0.5_rt : 1.0_rt;
377 #if defined(WARPX_DIM_1D_Z)
378 constexpr amrex::Real wk = 1.0_rt;
379 constexpr amrex::Real wl = 1.0_rt;
380 #elif defined(WARPX_DIM_XZ) || defined(WARPX_DIM_RZ)
381 const amrex::Real wk = (interp_k) ? 0.5_rt : 1.0_rt;
382 constexpr amrex::Real wl = 1.0_rt;
383 #elif defined(WARPX_DIM_3D)
384 const amrex::Real wk = (interp_k) ? 0.5_rt : 1.0_rt;
385 const amrex::Real wl = (interp_l) ? 0.5_rt : 1.0_rt;
389 const int jmin = (interp_j) ? j - noj/2 +
shift : j;
390 const int jmax = (interp_j) ? j + noj/2 +
shift - 1 : j;
393 #if defined(WARPX_DIM_1D_Z)
398 const int kmin = (interp_k) ? k - nok/2 +
shift : k;
399 const int kmax = (interp_k) ? k + nok/2 +
shift - 1 : k;
403 #if (AMREX_SPACEDIM <= 2)
407 #elif defined(WARPX_DIM_3D)
408 const int lmin = (interp_l) ? l - nol/2 +
shift : l;
409 const int lmax = (interp_l) ? l + nol/2 +
shift - 1 : l;
413 const int nj = jmax - jmin;
414 const int nk = kmax - kmin;
415 const int nl = lmax - lmin;
456 amrex::Real res = 0.0_rt;
458 #if defined(WARPX_DIM_1D_Z)
459 amrex::Real
const* scj = stencil_coeffs_z;
460 #elif defined(WARPX_DIM_XZ) || defined(WARPX_DIM_RZ)
461 amrex::Real
const* scj = stencil_coeffs_x;
462 amrex::Real
const* sck = stencil_coeffs_z;
463 #elif defined(WARPX_DIM_3D)
464 amrex::Real
const* scj = stencil_coeffs_x;
465 amrex::Real
const* sck = stencil_coeffs_y;
466 amrex::Real
const* scl = stencil_coeffs_z;
469 for (
int ll = 0; ll <= nl; ll++)
471 #if defined(WARPX_DIM_3D)
472 const amrex::Real cl = (interp_l)? scl[ll] : 1.0_rt;
474 const amrex::Real cl = 1.0_rt;
476 for (
int kk = 0; kk <= nk; kk++)
478 #if (AMREX_SPACEDIM >= 2)
479 const amrex::Real ck = (interp_k)? sck[kk] : 1.0_rt;
481 const amrex::Real ck = 1.0_rt;
483 for (
int jj = 0;
jj <= nj;
jj++)
485 const amrex::Real cj = (interp_j)? scj[
jj] : 1.0_rt;
487 res += cj * ck * cl * src_arr_zeropad(jmin+
jj,kmin+kk,lmin+ll);
492 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 to interpolate data from the c...
Definition: WarpXComm_K.H:28
AMREX_GPU_HOST_DEVICE static constexpr AMREX_FORCE_INLINE IntVect TheNodeVector() noexcept
static constexpr auto c
vacuum speed of light [m/s]
Definition: constant.H:44
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void ignore_unused(const Ts &...)
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE Box coarsen(const Box &b, int ref_ratio) noexcept
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE Box shift(const Box &b, int dir, int nzones) 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