155#if !defined(WARPX_DIM_1D_Z)
159 const double xmid = (xp - xyzmin.
x)*dinv.
x;
166 double sx_node[depos_order + 1] = {0.};
167 double sx_cell[depos_order + 1] = {0.};
170 if (jx_type[0] == NODE || jy_type[0] == NODE || jz_type[0] == NODE) {
171 j_node = compute_shape_factor(sx_node, xmid);
173 if (jx_type[0] == CELL || jy_type[0] == CELL || jz_type[0] == CELL) {
174 j_cell = compute_shape_factor(sx_cell, xmid - 0.5);
178 if (j_node==j_cell) {
shift[0] = 1; }
183 for (
int ix=0; ix<=depos_order; ix++)
190 int const j_jx = ((jx_type[0] == NODE) ? j_node : j_cell);
191 int const j_jy = ((jy_type[0] == NODE) ? j_node : j_cell);
192 int const j_jz = ((jz_type[0] == NODE) ? j_node : j_cell);
195#if defined(WARPX_DIM_3D)
198 const double ymid = (yp - xyzmin.
y)*dinv.
y;
199 double sy_node[depos_order + 1] = {0.};
200 double sy_cell[depos_order + 1] = {0.};
203 if (jx_type[1] == NODE || jy_type[1] == NODE || jz_type[1] == NODE) {
204 k_node = compute_shape_factor(sy_node, ymid);
206 if (jx_type[1] == CELL || jy_type[1] == CELL || jz_type[1] == CELL) {
207 k_cell = compute_shape_factor(sy_cell, ymid - 0.5);
211 if (k_node==k_cell) {
shift[1] = 1; }
216 for (
int iy=0; iy<=depos_order; iy++)
222 int const k_jx = ((jx_type[1] == NODE) ? k_node : k_cell);
223 int const k_jy = ((jy_type[1] == NODE) ? k_node : k_cell);
224 int const k_jz = ((jz_type[1] == NODE) ? k_node : k_cell);
227#if !defined(WARPX_DIM_RCYLINDER) && !defined(WARPX_DIM_RSPHERE)
230 constexpr int zdir = WARPX_ZINDEX;
231 const double zmid = (zp - xyzmin.
z)*dinv.
z;
232 double sz_node[depos_order + 1] = {0.};
233 double sz_cell[depos_order + 1] = {0.};
236 if (jx_type[zdir] == NODE || jy_type[zdir] == NODE || jz_type[zdir] == NODE) {
237 l_node = compute_shape_factor(sz_node, zmid);
239 if (jx_type[zdir] == CELL || jy_type[zdir] == CELL || jz_type[zdir] == CELL) {
240 l_cell = compute_shape_factor(sz_cell, zmid - 0.5);
245 for (
int iz=0; iz<=depos_order; iz++)
251 int const l_jx = ((jx_type[zdir] == NODE) ? l_node : l_cell);
252 int const l_jy = ((jy_type[zdir] == NODE) ? l_node : l_cell);
253 int const l_jz = ((jz_type[zdir] == NODE) ? l_node : l_cell);
256 if (l_node==l_cell) {
shift[zdir] = 1; }
262 for (
int dir=0; dir<AMREX_SPACEDIM; dir++) {
263 offset_xy[dir] = (jx_type[dir] + jy_type[dir]) % 2;
264 offset_xz[dir] = (jx_type[dir] + jz_type[dir]) % 2;
265 offset_yz[dir] = (jy_type[dir] + jz_type[dir]) % 2;
269#if defined(WARPX_DIM_1D_Z)
270 for (
int iz=0; iz<=depos_order; iz++){
272 &jx_arr(lo.
x+l_jx+iz, 0, 0, 0),
275 &jy_arr(lo.
x+l_jy+iz, 0, 0, 0),
278 &jz_arr(lo.
x+l_jz+iz, 0, 0, 0),
282 if constexpr (full_mass_matrices) {
283 for (
int aa=0; aa<=depos_order; aa++){
285 int Nc = depos_order + aa - iz;
287 &Sxx_arr(lo.
x+l_jx+iz, 0, 0, Nc),
288 sz_jx[iz]*sz_jx[aa]*fpxx);
289 Nc = depos_order +
shift[0]*offset_xy[0] + aa - iz;
291 &Sxy_arr(lo.
x+l_jx+iz, 0, 0, Nc),
292 sz_jx[iz]*sz_jy[aa]*fpxy);
293 Nc = depos_order +
shift[0]*offset_xz[0] + aa - iz;
295 &Sxz_arr(lo.
x+l_jx+iz, 0, 0, Nc),
296 sz_jx[iz]*sz_jz[aa]*fpxz);
299 Nc = depos_order +
shift[0]*offset_xy[0] + aa - iz;
301 &Syx_arr(lo.
x+l_jy+iz, 0, 0, Nc),
302 sz_jy[iz]*sz_jx[aa]*fpyx);
303 Nc = depos_order + aa - iz;
305 &Syy_arr(lo.
x+l_jy+iz, 0, 0, Nc),
306 sz_jy[iz]*sz_jy[aa]*fpyy);
307 Nc = depos_order +
shift[0]*offset_yz[0] + aa - iz;
309 &Syz_arr(lo.
x+l_jy+iz, 0, 0, Nc),
310 sz_jy[iz]*sz_jz[aa]*fpyz);
313 Nc = depos_order + 1 -
shift[0]*offset_xz[0] + aa - iz;
315 &Szx_arr(lo.
x+l_jz+iz, 0, 0, Nc),
316 sz_jz[iz]*sz_jx[aa]*fpzx);
317 Nc = depos_order + 1 -
shift[0]*offset_yz[0] + aa - iz;
319 &Szy_arr(lo.
x+l_jz+iz, 0, 0, Nc),
320 sz_jz[iz]*sz_jy[aa]*fpzy);
321 Nc = depos_order + aa - iz;
323 &Szz_arr(lo.
x+l_jz+iz, 0, 0, Nc),
324 sz_jz[iz]*sz_jz[aa]*fpzz);
329 &Sxx_arr(lo.
x+l_jx+iz, 0, 0, 0),
332 &Syy_arr(lo.
x+l_jy+iz, 0, 0, 0),
335 &Szz_arr(lo.
x+l_jz+iz, 0, 0, 0),
339#elif defined(WARPX_DIM_RCYLINDER) || defined(WARPX_DIM_RSPHERE)
340 for (
int ix=0; ix<=depos_order; ix++){
342 &jx_arr(lo.
x+j_jx+ix, 0, 0, 0),
345 &jy_arr(lo.
x+j_jy+ix, 0, 0, 0),
348 &jz_arr(lo.
x+j_jz+ix, 0, 0, 0),
352 &Sxx_arr(lo.
x+j_jx+ix, 0, 0, 0),
353 sx_jx[ix]*sx_jx[ix]*fpxx);
355 &Syy_arr(lo.
x+j_jy+ix, 0, 0, 0),
356 sx_jy[ix]*sx_jy[ix]*fpyy);
358 &Szz_arr(lo.
x+j_jz+ix, 0, 0, 0),
359 sx_jz[ix]*sx_jz[ix]*fpzz);
361#elif defined(WARPX_DIM_XZ) || defined(WARPX_DIM_RZ)
362 const int base_offset = 1 + 2*depos_order;
363 for (
int iz=0; iz<=depos_order; iz++){
364 for (
int ix=0; ix<=depos_order; ix++){
369 &jx_arr(lo.
x+j_jx+ix, lo.
y+l_jx+iz, 0, 0),
372 &jy_arr(lo.
x+j_jy+ix, lo.
y+l_jy+iz, 0, 0),
375 &jz_arr(lo.
x+j_jz+ix, lo.
y+l_jz+iz, 0, 0),
379 if constexpr (full_mass_matrices) {
380 for (
int bb=0; bb<=depos_order; bb++){
381 for (
int aa=0; aa<=depos_order; aa++){
388 int Nc = depos_order + aa - ix
389 + (depos_order + bb - iz)*
offset;
391 &Sxx_arr(lo.
x+j_jx+ix, lo.
y+l_jx+iz, 0, Nc),
392 weight_Jx*weight_Ex*fpxx);
393 offset = base_offset + offset_xy[0];
394 Nc = depos_order + 1 -
shift[0]*offset_xy[0] + aa - ix
395 + (depos_order +
shift[1]*offset_xy[1] + bb - iz)*
offset;
397 &Sxy_arr(lo.
x+j_jx+ix, lo.
y+l_jx+iz, 0, Nc),
398 weight_Jx*weight_Ey*fpxy);
399 offset = base_offset + offset_xz[0];
400 Nc = depos_order + 1 -
shift[0]*offset_xz[0] + aa - ix
401 + (depos_order +
shift[1]*offset_xz[1] + bb - iz)*
offset;
403 &Sxz_arr(lo.
x+j_jx+ix, lo.
y+l_jx+iz, 0, Nc),
404 weight_Jx*weight_Ez*fpxz);
408 Nc = depos_order + aa - ix
409 + (depos_order + bb - iz)*
offset;
411 &Syy_arr(lo.
x+j_jy+ix, lo.
y+l_jy+iz, 0, Nc),
412 weight_Jy*weight_Ey*fpyy);
413 offset = base_offset + offset_xy[0];
414 Nc = depos_order +
shift[0]*offset_xy[0] + aa - ix
415 + (depos_order +
shift[1]*offset_xy[1] + bb - iz)*
offset;
417 &Syx_arr(lo.
x+j_jy+ix, lo.
y+l_jy+iz, 0, Nc),
418 weight_Jy*weight_Ex*fpyx);
419 offset = base_offset + offset_yz[0];
420 Nc = depos_order +
shift[0]*offset_yz[0] + aa - ix
421 + (depos_order +
shift[1]*offset_yz[1] + bb - iz)*
offset;
423 &Syz_arr(lo.
x+j_jy+ix, lo.
y+l_jy+iz, 0, Nc),
424 weight_Jy*weight_Ez*fpyz);
428 Nc = depos_order + aa - ix
429 + (depos_order + bb - iz)*
offset;
431 &Szz_arr(lo.
x+j_jz+ix, lo.
y+l_jz+iz, 0, Nc),
432 weight_Jz*weight_Ez*fpzz);
433 offset = base_offset + offset_xz[0];
434 Nc = depos_order +
shift[0]*offset_xz[0] + aa - ix
435 + (depos_order + 1 -
shift[1]*offset_xz[1] + bb - iz)*
offset;
437 &Szx_arr(lo.
x+j_jz+ix, lo.
y+l_jz+iz, 0, Nc),
438 weight_Jz*weight_Ex*fpzx);
439 offset = base_offset + offset_yz[0];
440 Nc = depos_order +
shift[0]*offset_yz[0] + aa - ix
441 + (depos_order + 1 -
shift[1]*offset_yz[1] + bb - iz)*
offset;
443 &Szy_arr(lo.
x+j_jz+ix, lo.
y+l_jz+iz, 0, Nc),
444 weight_Jz*weight_Ey*fpzy);
450 &Syy_arr(lo.
x+j_jy+ix, lo.
y+l_jy+iz, 0, 0),
453 &Sxx_arr(lo.
x+j_jx+ix, lo.
y+l_jx+iz, 0, 0),
456 &Szz_arr(lo.
x+j_jz+ix, lo.
y+l_jz+iz, 0, 0),
461#elif defined(WARPX_DIM_3D)
462 for (
int iz=0; iz<=depos_order; iz++){
463 for (
int iy=0; iy<=depos_order; iy++){
464 for (
int ix=0; ix<=depos_order; ix++){
465 const amrex::Real weight_Jx = sx_jx[ix]*sy_jx[iy]*sz_jx[iz];
466 const amrex::Real weight_Jy = sx_jy[ix]*sy_jy[iy]*sz_jy[iz];
467 const amrex::Real weight_Jz = sx_jz[ix]*sy_jz[iy]*sz_jz[iz];
469 &jx_arr(lo.
x+j_jx+ix, lo.
y+k_jx+iy, lo.
z+l_jx+iz),
472 &jy_arr(lo.
x+j_jy+ix, lo.
y+k_jy+iy, lo.
z+l_jy+iz),
475 &jz_arr(lo.
x+j_jz+ix, lo.
y+k_jz+iy, lo.
z+l_jz+iz),
479 if constexpr (full_mass_matrices) {
484 &Sxx_arr(lo.
x+j_jx+ix, lo.
y+k_jx+iy, lo.
z+l_jx+iz, 0),
487 &Syy_arr(lo.
x+j_jy+ix, lo.
y+k_jy+iy, lo.
z+l_jy+iz, 0),
490 &Szz_arr(lo.
x+j_jz+ix, lo.
y+k_jz+iy, lo.
z+l_jz+iz, 0),
676 [[maybe_unused]]
int max_crossings,
696#if (AMREX_SPACEDIM > 1)
702#if defined(WARPX_DIM_RZ) || defined(WARPX_DIM_RCYLINDER)
703 amrex::Real const xp_mid = (xp_new + xp_old)*0.5_rt;
704 amrex::Real const yp_mid = (yp_new + yp_old)*0.5_rt;
705 amrex::Real const rp_new = std::sqrt(xp_new*xp_new + yp_new*yp_new);
706 amrex::Real const rp_old = std::sqrt(xp_old*xp_old + yp_old*yp_old);
707 amrex::Real const rp_mid = (rp_new + rp_old)/2._rt;
708 amrex::Real const costheta_mid = (rp_mid > 0._rt ? xp_mid/rp_mid : 1._rt);
709 amrex::Real const sintheta_mid = (rp_mid > 0._rt ? yp_mid/rp_mid : 0._rt);
712 double x_new = (rp_new - xyzmin.
x)*dinv.
x;
713 double const x_old = (rp_old - xyzmin.
x)*dinv.
x;
715 amrex::Real const vy = (-uxp_mid*sintheta_mid + uyp_mid*costheta_mid)*gaminv;
716#if defined(WARPX_DIM_RCYLINDER)
719#elif defined(WARPX_DIM_RSPHERE)
720 amrex::Real const xp_mid = (xp_new + xp_old)*0.5_rt;
721 amrex::Real const yp_mid = (yp_new + yp_old)*0.5_rt;
722 amrex::Real const zp_mid = (zp_new + zp_old)*0.5_rt;
723 amrex::Real const rpxy_new = std::sqrt(xp_new*xp_new + yp_new*yp_new);
724 amrex::Real const rp_new = std::sqrt(xp_new*xp_new + yp_new*yp_new + zp_new*zp_new);
725 amrex::Real const rpxy_old = std::sqrt(xp_old*xp_old + yp_old*yp_old);
726 amrex::Real const rp_old = std::sqrt(xp_old*xp_old + yp_old*yp_old + zp_old*zp_old);
727 amrex::Real const rpxy_mid = (rpxy_new + rpxy_old)*0.5_rt;
728 amrex::Real const rp_mid = (rp_new + rp_old)*0.5_rt;
729 amrex::Real const costheta_mid = (rpxy_mid > 0._rt ? xp_mid/rpxy_mid : 1._rt);
730 amrex::Real const sintheta_mid = (rpxy_mid > 0._rt ? yp_mid/rpxy_mid : 0._rt);
731 amrex::Real const cosphi_mid = (rp_mid > 0._rt ? rpxy_mid/rp_mid : 1._rt);
732 amrex::Real const sinphi_mid = (rp_mid > 0._rt ? zp_mid/rp_mid : 0._rt);
735 double x_new = (rp_new - xyzmin.
x)*dinv.
x;
736 double const x_old = (rp_old - xyzmin.
x)*dinv.
x;
738 amrex::Real const vy = (-uxp_mid*sintheta_mid + uyp_mid*costheta_mid)*gaminv;
739 amrex::Real const vz = (-uxp_mid*costheta_mid*cosphi_mid - uyp_mid*sintheta_mid*cosphi_mid + uzp_mid*sinphi_mid)*gaminv;
740#elif defined(WARPX_DIM_XZ)
742 double x_new = (xp_new - xyzmin.
x)*dinv.
x;
743 double const x_old = (xp_old - xyzmin.
x)*dinv.
x;
746#elif defined(WARPX_DIM_1D_Z)
749#elif defined(WARPX_DIM_3D)
751 double x_new = (xp_new - xyzmin.
x)*dinv.
x;
752 double const x_old = (xp_old - xyzmin.
x)*dinv.
x;
753 double y_new = (yp_new - xyzmin.
y)*dinv.
y;
754 double const y_old = (yp_old - xyzmin.
y)*dinv.
y;
759#if !defined(WARPX_DIM_RCYLINDER) && !defined(WARPX_DIM_RSPHERE)
761 double z_new = (zp_new - xyzmin.
z)*dinv.
z;
762 double const z_old = (zp_old - xyzmin.
z)*dinv.
z;
772#if !defined(WARPX_DIM_1D_Z)
773 const double dxp = x_new - x_old;
775#if defined(WARPX_DIM_3D)
776 const double dyp = y_new - y_old;
778#if !defined(WARPX_DIM_RCYLINDER) && !defined(WARPX_DIM_RSPHERE)
779 const double dzp = z_new - z_old;
783#if defined(WARPX_DIM_3D)
785 domain_double[0][0], domain_double[0][1], do_cropping[0]);
787 domain_double[1][0], domain_double[1][1], do_cropping[1]);
789 domain_double[2][0], domain_double[2][1], do_cropping[2]);
790#elif defined(WARPX_DIM_XZ) || defined(WARPX_DIM_RZ)
792 domain_double[0][0], domain_double[0][1], do_cropping[0]);
794 domain_double[1][0], domain_double[1][1], do_cropping[1]);
795#elif defined(WARPX_DIM_1D_Z)
797#elif defined(WARPX_DIM_RCYLINDER) || defined(WARPX_DIM_RSPHERE)
807 int num_segments = 1;
809 if ( (depos_order % 2) == 0 ) {
shift = 0.5; }
811#if defined(WARPX_DIM_3D)
814 const auto i_old =
static_cast<int>(x_old-
shift);
815 const auto i_new =
static_cast<int>(x_new-
shift);
816 const int cell_crossings_x = std::abs(i_new-i_old);
817 num_segments += cell_crossings_x;
820 const auto j_old =
static_cast<int>(y_old-
shift);
821 const auto j_new =
static_cast<int>(y_new-
shift);
822 const int cell_crossings_y = std::abs(j_new-j_old);
823 num_segments += cell_crossings_y;
826 const auto k_old =
static_cast<int>(z_old-
shift);
827 const auto k_new =
static_cast<int>(z_new-
shift);
828 const int cell_crossings_z = std::abs(k_new-k_old);
829 num_segments += cell_crossings_z;
834 const auto dirX_sign =
static_cast<double>(dxp < 0. ? -1. : 1.);
835 const auto dirY_sign =
static_cast<double>(dyp < 0. ? -1. : 1.);
836 const auto dirZ_sign =
static_cast<double>(dzp < 0. ? -1. : 1.);
837 double Xcell = 0., Ycell = 0., Zcell = 0.;
838 if (num_segments > 1) {
839 Xcell =
static_cast<double>(i_old) +
shift + 0.5*(1.-dirX_sign);
840 Ycell =
static_cast<double>(j_old) +
shift + 0.5*(1.-dirY_sign);
841 Zcell =
static_cast<double>(k_old) +
shift + 0.5*(1.-dirZ_sign);
847 double dxp_seg, dyp_seg, dzp_seg;
848 double x0_new, y0_new, z0_new;
849 double x0_old = x_old;
850 double y0_old = y_old;
851 double z0_old = z_old;
853 for (
int ns=0; ns<num_segments; ns++) {
855 if (ns == num_segments-1) {
860 dxp_seg = x0_new - x0_old;
861 dyp_seg = y0_new - y0_old;
862 dzp_seg = z0_new - z0_old;
867 x0_new = Xcell + dirX_sign;
868 y0_new = Ycell + dirY_sign;
869 z0_new = Zcell + dirZ_sign;
870 dxp_seg = x0_new - x0_old;
871 dyp_seg = y0_new - y0_old;
872 dzp_seg = z0_new - z0_old;
874 if ( (dyp == 0. || std::abs(dxp_seg) < std::abs(dxp/dyp*dyp_seg))
875 && (dzp == 0. || std::abs(dxp_seg) < std::abs(dxp/dzp*dzp_seg)) ) {
877 dyp_seg = dyp/dxp*dxp_seg;
878 dzp_seg = dzp/dxp*dxp_seg;
879 y0_new = y0_old + dyp_seg;
880 z0_new = z0_old + dzp_seg;
882 else if (dzp == 0. || std::abs(dyp_seg) < std::abs(dyp/dzp*dzp_seg)) {
884 dxp_seg = dxp/dyp*dyp_seg;
885 dzp_seg = dzp/dyp*dyp_seg;
886 x0_new = x0_old + dxp_seg;
887 z0_new = z0_old + dzp_seg;
891 dxp_seg = dxp/dzp*dzp_seg;
892 dyp_seg = dyp/dzp*dzp_seg;
893 x0_new = x0_old + dxp_seg;
894 y0_new = y0_old + dyp_seg;
900 const auto seg_factor_x =
static_cast<amrex::Real>(dxp == 0. ? 1._rt : dxp_seg/dxp);
901 const auto seg_factor_y =
static_cast<amrex::Real>(dyp == 0. ? 1._rt : dyp_seg/dyp);
902 const auto seg_factor_z =
static_cast<amrex::Real>(dzp == 0. ? 1._rt : dzp_seg/dzp);
906 double sx_cell[depos_order] = {0.};
907 double sy_cell[depos_order] = {0.};
908 double sz_cell[depos_order] = {0.};
909 double const x0_bar = (x0_new + x0_old)/2.0;
910 double const y0_bar = (y0_new + y0_old)/2.0;
911 double const z0_bar = (z0_new + z0_old)/2.0;
912 const int i0_cell = compute_shape_factor_cell( sx_cell, x0_bar-0.5 );
913 const int j0_cell = compute_shape_factor_cell( sy_cell, y0_bar-0.5 );
914 const int k0_cell = compute_shape_factor_cell( sz_cell, z0_bar-0.5 );
916 if constexpr (depos_order >= 3) {
918 double sx_old_cell[depos_order] = {0.};
919 double sx_new_cell[depos_order] = {0.};
920 double sy_old_cell[depos_order] = {0.};
921 double sy_new_cell[depos_order] = {0.};
922 double sz_old_cell[depos_order] = {0.};
923 double sz_new_cell[depos_order] = {0.};
924 const int i0_cell_2 = compute_shape_factors_cell( sx_old_cell, sx_new_cell, x0_old-0.5, x0_new-0.5 );
925 const int j0_cell_2 = compute_shape_factors_cell( sy_old_cell, sy_new_cell, y0_old-0.5, y0_new-0.5 );
926 const int k0_cell_2 = compute_shape_factors_cell( sz_old_cell, sz_new_cell, z0_old-0.5, z0_new-0.5 );
928 for (
int m=0; m<depos_order; m++) {
929 sx_cell[m] = (4.0*sx_cell[m] + sx_old_cell[m] + sx_new_cell[m])/6.0;
930 sy_cell[m] = (4.0*sy_cell[m] + sy_old_cell[m] + sy_new_cell[m])/6.0;
931 sz_cell[m] = (4.0*sz_cell[m] + sz_old_cell[m] + sz_new_cell[m])/6.0;
937 double sx_old_node[depos_order+1] = {0.};
938 double sx_new_node[depos_order+1] = {0.};
939 double sy_old_node[depos_order+1] = {0.};
940 double sy_new_node[depos_order+1] = {0.};
941 double sz_old_node[depos_order+1] = {0.};
942 double sz_new_node[depos_order+1] = {0.};
943 const int i0_node = compute_shape_factors_node( sx_old_node, sx_new_node, x0_old, x0_new );
944 const int j0_node = compute_shape_factors_node( sy_old_node, sy_new_node, y0_old, y0_new );
945 const int k0_node = compute_shape_factors_node( sz_old_node, sz_new_node, z0_old, z0_new );
949 for (
int i=0; i<=depos_order-1; i++) {
950 for (
int j=0; j<=depos_order; j++) {
951 for (
int k=0; k<=depos_order; k++) {
952 weight = sx_cell[i]*( sy_old_node[j]*sz_old_node[k]*one_third
953 + sy_old_node[j]*sz_new_node[k]*one_sixth
954 + sy_new_node[j]*sz_old_node[k]*one_sixth
955 + sy_new_node[j]*sz_new_node[k]*one_third )*seg_factor_x;
963 for (
int i=0; i<=depos_order; i++) {
964 for (
int j=0; j<=depos_order-1; j++) {
965 for (
int k=0; k<=depos_order; k++) {
966 weight = sy_cell[j]*( sx_old_node[i]*sz_old_node[k]*one_third
967 + sx_old_node[i]*sz_new_node[k]*one_sixth
968 + sx_new_node[i]*sz_old_node[k]*one_sixth
969 + sx_new_node[i]*sz_new_node[k]*one_third )*seg_factor_y;
977 for (
int i=0; i<=depos_order; i++) {
978 for (
int j=0; j<=depos_order; j++) {
979 for (
int k=0; k<=depos_order-1; k++) {
980 weight = sz_cell[k]*( sx_old_node[i]*sy_old_node[j]*one_third
981 + sx_old_node[i]*sy_new_node[j]*one_sixth
982 + sx_new_node[i]*sy_old_node[j]*one_sixth
983 + sx_new_node[i]*sy_new_node[j]*one_third )*seg_factor_z;
991 if (ns < num_segments-1) {
999#elif defined(WARPX_DIM_XZ) || defined(WARPX_DIM_RZ)
1002 const auto i_old =
static_cast<int>(x_old-
shift);
1003 const auto i_new =
static_cast<int>(x_new-
shift);
1004 const int cell_crossings_x = std::abs(i_new-i_old);
1005 num_segments += cell_crossings_x;
1008 const auto k_old =
static_cast<int>(z_old-
shift);
1009 const auto k_new =
static_cast<int>(z_new-
shift);
1010 const int cell_crossings_z = std::abs(k_new-k_old);
1011 num_segments += cell_crossings_z;
1016 const auto dirX_sign =
static_cast<double>(dxp < 0. ? -1. : 1.);
1017 const auto dirZ_sign =
static_cast<double>(dzp < 0. ? -1. : 1.);
1018 double Xcell = 0., Zcell = 0.;
1019 if (num_segments > 1) {
1020 Xcell =
static_cast<double>(i_old) +
shift + 0.5*(1.-dirX_sign);
1021 Zcell =
static_cast<double>(k_old) +
shift + 0.5*(1.-dirZ_sign);
1027 double dxp_seg, dzp_seg;
1028 double x0_new, z0_new;
1029 double x0_old = x_old;
1030 double z0_old = z_old;
1032 constexpr int num_segments_max = 1 + 4*AMREX_SPACEDIM;
1034 "Error: num_segments must be less than or equal to 1 + 4*AMREX_SPACEDIM.");
1037 int i0_cell[num_segments_max];
1038 int i0_node[num_segments_max];
1039 int k0_cell[num_segments_max];
1040 int k0_node[num_segments_max];
1041 amrex::Real weight_cellX_nodeZ[num_segments_max][depos_order][depos_order+1];
1042 amrex::Real weight_nodeX_cellZ[num_segments_max][depos_order+1][depos_order];
1043 amrex::Real weight_nodeX_nodeZ[num_segments_max][depos_order+1][depos_order+1];
1045 const auto i_mid =
static_cast<int>(0.5*(x_new+x_old)-
shift);
1046 const auto k_mid =
static_cast<int>(0.5*(z_new+z_old)-
shift);
1047 int SegNumX[num_segments_max];
1048 int SegNumZ[num_segments_max];
1050 for (
int ns=0; ns<num_segments; ns++) {
1052 if (ns == num_segments-1) {
1056 dxp_seg = x0_new - x0_old;
1057 dzp_seg = z0_new - z0_old;
1062 x0_new = Xcell + dirX_sign;
1063 z0_new = Zcell + dirZ_sign;
1064 dxp_seg = x0_new - x0_old;
1065 dzp_seg = z0_new - z0_old;
1067 if (dzp == 0. || std::abs(dxp_seg) < std::abs(dxp/dzp*dzp_seg)) {
1069 dzp_seg = dzp/dxp*dxp_seg;
1070 z0_new = z0_old + dzp_seg;
1074 dxp_seg = dxp/dzp*dzp_seg;
1075 x0_new = x0_old + dxp_seg;
1081 const auto seg_factor_x =
static_cast<amrex::Real>(dxp == 0. ? 1._rt : dxp_seg/dxp);
1082 const auto seg_factor_z =
static_cast<amrex::Real>(dzp == 0. ? 1._rt : dzp_seg/dzp);
1086 double sx_cell[depos_order] = {0.};
1087 double sz_cell[depos_order] = {0.};
1088 double const x0_bar = (x0_new + x0_old)/2.0;
1089 double const z0_bar = (z0_new + z0_old)/2.0;
1090 i0_cell[ns] = compute_shape_factor_cell( sx_cell, x0_bar-0.5 );
1091 k0_cell[ns] = compute_shape_factor_cell( sz_cell, z0_bar-0.5 );
1094 if constexpr (full_mass_matrices) {
1095 const auto i0_mid =
static_cast<int>(x0_bar-
shift);
1096 const auto k0_mid =
static_cast<int>(z0_bar-
shift);
1097 SegNumX[ns] = 1 + i0_mid - i_mid;
1098 SegNumZ[ns] = 1 + k0_mid - k_mid;
1101 if constexpr (depos_order >= 3) {
1103 double sx_old_cell[depos_order] = {0.};
1104 double sx_new_cell[depos_order] = {0.};
1105 double sz_old_cell[depos_order] = {0.};
1106 double sz_new_cell[depos_order] = {0.};
1107 const int i0_cell_2 = compute_shape_factors_cell( sx_old_cell, sx_new_cell, x0_old-0.5, x0_new-0.5 );
1108 const int k0_cell_2 = compute_shape_factors_cell( sz_old_cell, sz_new_cell, z0_old-0.5, z0_new-0.5 );
1110 for (
int m=0; m<depos_order; m++) {
1111 sx_cell[m] = (4.0*sx_cell[m] + sx_old_cell[m] + sx_new_cell[m])/6.0;
1112 sz_cell[m] = (4.0*sz_cell[m] + sz_old_cell[m] + sz_new_cell[m])/6.0;
1118 double sx_old_node[depos_order+1] = {0.};
1119 double sx_new_node[depos_order+1] = {0.};
1120 double sz_old_node[depos_order+1] = {0.};
1121 double sz_new_node[depos_order+1] = {0.};
1122 i0_node[ns] = compute_shape_factors_node( sx_old_node, sx_new_node, x0_old, x0_new );
1123 k0_node[ns] = compute_shape_factors_node( sz_old_node, sz_new_node, z0_old, z0_new );
1127 for (
int i=0; i<=depos_order-1; i++) {
1128 for (
int k=0; k<=depos_order; k++) {
1129 const int i_J = lo.
x + i0_cell[ns] + i;
1130 const int k_J = lo.
y + k0_node[ns] + k;
1131 weight = sx_cell[i]*(sz_old_node[k] + sz_new_node[k])/2.0_rt*seg_factor_x;
1133 if constexpr (full_mass_matrices) { weight_cellX_nodeZ[ns][i][k] = weight; }
1141 const auto seg_factor_y = std::min(seg_factor_x,seg_factor_z);
1142 for (
int i=0; i<=depos_order; i++) {
1143 for (
int k=0; k<=depos_order; k++) {
1144 const int i_J = lo.
x + i0_node[ns] + i;
1145 const int k_J = lo.
y + k0_node[ns] + k;
1146 weight = ( sx_old_node[i]*sz_old_node[k]*one_third
1147 + sx_old_node[i]*sz_new_node[k]*one_sixth
1148 + sx_new_node[i]*sz_old_node[k]*one_sixth
1149 + sx_new_node[i]*sz_new_node[k]*one_third )*seg_factor_y;
1151 if constexpr (full_mass_matrices) { weight_nodeX_nodeZ[ns][i][k] = weight; }
1159 for (
int i=0; i<=depos_order; i++) {
1160 for (
int k=0; k<=depos_order-1; k++) {
1161 const int i_J = lo.
x + i0_node[ns] + i;
1162 const int k_J = lo.
y + k0_cell[ns] + k;
1163 weight = sz_cell[k]*(sx_old_node[i] + sx_new_node[i])/2.0_rt*seg_factor_z;
1165 if constexpr (full_mass_matrices) { weight_nodeX_cellZ[ns][i][k] = weight; }
1173 if (ns < num_segments-1) {
1180 if constexpr (full_mass_matrices) {
1183 for (
int ns=0; ns<num_segments; ns++) {
1186 for (
int i=0; i<=depos_order-1; i++) {
1187 for (
int k=0; k<=depos_order; k++) {
1188 const int i_J = lo.
x + i0_cell[ns] + i;
1189 const int k_J = lo.
y + k0_node[ns] + k;
1190 const amrex::Real weight_J = weight_cellX_nodeZ[ns][i][k];
1191 for (
int ms=0; ms<num_segments; ms++) {
1192 const int SegShiftX = max_crossings + SegNumX[ms] - SegNumX[ns];
1193 const int SegShiftZ = max_crossings + SegNumZ[ms] - SegNumZ[ns];
1195 const int Ncomp_xx0 = 1 + 2*(depos_order-1) + 2*max_crossings;
1196 for (
int iE=0; iE<=depos_order-1; iE++) {
1197 for (
int kE=0; kE<=depos_order; kE++) {
1198 const amrex::Real weight_E = weight_cellX_nodeZ[ms][iE][kE];
1199 const int comp_xx = depos_order-1 - i + iE + SegShiftX
1200 + Ncomp_xx0*(depos_order - k + kE + SegShiftZ);
1205 const int Ncomp_xz0 = 2*depos_order + 2*max_crossings;
1206 for (
int iE=0; iE<=depos_order; iE++) {
1207 for (
int kE=0; kE<=depos_order-1; kE++) {
1208 const amrex::Real weight_E = weight_nodeX_cellZ[ms][iE][kE];
1209 const int comp_xz = depos_order-1 - i + iE + SegShiftX
1210 + Ncomp_xz0*(depos_order - k + kE + SegShiftZ);
1215 const int Ncomp_xy0 = 2*depos_order + 2*max_crossings;
1216 for (
int iE=0; iE<=depos_order; iE++) {
1217 for (
int kE=0; kE<=depos_order; kE++) {
1218 const amrex::Real weight_E = weight_nodeX_nodeZ[ms][iE][kE];
1219 const int comp_xy = depos_order-1 - i + iE + SegShiftX
1220 + Ncomp_xy0*(depos_order - k + kE + SegShiftZ);
1230 for (
int i=0; i<=depos_order; i++) {
1231 for (
int k=0; k<=depos_order-1; k++) {
1232 const int i_J = lo.
x + i0_node[ns] + i;
1233 const int k_J = lo.
y + k0_cell[ns] + k;
1234 const amrex::Real weight_J = weight_nodeX_cellZ[ns][i][k];
1235 for (
int ms=0; ms<num_segments; ms++) {
1236 const int SegShiftX = max_crossings + SegNumX[ms] - SegNumX[ns];
1237 const int SegShiftZ = max_crossings + SegNumZ[ms] - SegNumZ[ns];
1239 const int Ncomp_zx0 = 2*depos_order + 2*max_crossings;
1240 for (
int iE=0; iE<=depos_order-1; iE++) {
1241 for (
int kE=0; kE<=depos_order; kE++) {
1242 const amrex::Real weight_E = weight_cellX_nodeZ[ms][iE][kE];
1243 const int comp_zx = depos_order - i + iE + SegShiftX
1244 + Ncomp_zx0*(depos_order-1 - k + kE + SegShiftZ);
1249 const int Ncomp_zz0 = 1 + 2*depos_order + 2*max_crossings;
1250 for (
int iE=0; iE<=depos_order; iE++) {
1251 for (
int kE=0; kE<=depos_order-1; kE++) {
1252 const amrex::Real weight_E = weight_nodeX_cellZ[ms][iE][kE];
1253 const int comp_zz = depos_order - i + iE + SegShiftX
1254 + Ncomp_zz0*(depos_order-1 - k + kE + SegShiftZ);
1259 const int Ncomp_zy0 = 1 + 2*depos_order + 2*max_crossings;
1260 for (
int iE=0; iE<=depos_order; iE++) {
1261 for (
int kE=0; kE<=depos_order; kE++) {
1262 const amrex::Real weight_E = weight_nodeX_nodeZ[ms][iE][kE];
1263 const int comp_zy = depos_order - i + iE + SegShiftX
1264 + Ncomp_zy0*(depos_order-1 - k + kE + SegShiftZ);
1274 for (
int i=0; i<=depos_order; i++) {
1275 for (
int k=0; k<=depos_order; k++) {
1276 const int i_J = lo.
x + i0_node[ns] + i;
1277 const int k_J = lo.
y + k0_node[ns] + k;
1278 const amrex::Real weight_J = weight_nodeX_nodeZ[ns][i][k];
1279 for (
int ms=0; ms<num_segments; ms++) {
1280 const int SegShiftX = max_crossings + SegNumX[ms] - SegNumX[ns];
1281 const int SegShiftZ = max_crossings + SegNumZ[ms] - SegNumZ[ns];
1283 const int Ncomp_yx0 = 2*depos_order + 2*max_crossings;
1284 for (
int iE=0; iE<=depos_order-1; iE++) {
1285 for (
int kE=0; kE<=depos_order; kE++) {
1286 const amrex::Real weight_E = weight_cellX_nodeZ[ms][iE][kE];
1287 const int comp_yx = depos_order - i + iE + SegShiftX
1288 + Ncomp_yx0*(depos_order - k + kE + SegShiftZ);
1293 const int Ncomp_yz0 = 1 + 2*depos_order + 2*max_crossings;
1294 for (
int iE=0; iE<=depos_order; iE++) {
1295 for (
int kE=0; kE<=depos_order-1; kE++) {
1296 const amrex::Real weight_E = weight_nodeX_cellZ[ms][iE][kE];
1297 const int comp_yz = depos_order - i + iE + SegShiftX
1298 + Ncomp_yz0*(depos_order - k + kE + SegShiftZ);
1303 const int Ncomp_yy0 = 1 + 2*depos_order + 2*max_crossings;
1304 for (
int iE=0; iE<=depos_order; iE++) {
1305 for (
int kE=0; kE<=depos_order; kE++) {
1306 const amrex::Real weight_E = weight_nodeX_nodeZ[ms][iE][kE];
1307 const int comp_yy = depos_order - i + iE + SegShiftX
1308 + Ncomp_yy0*(depos_order - k + kE + SegShiftZ);
1321#elif defined(WARPX_DIM_RCYLINDER) || defined(WARPX_DIM_RSPHERE)
1324 const auto i_old =
static_cast<int>(x_old-
shift);
1325 const auto i_new =
static_cast<int>(x_new-
shift);
1326 const int cell_crossings_x = std::abs(i_new-i_old);
1327 num_segments += cell_crossings_x;
1331 const auto dirX_sign =
static_cast<double>(dxp < 0. ? -1. : 1.);
1332 double Xcell =
static_cast<double>(i_old) +
shift + 0.5*(1.-dirX_sign);
1339 double x0_old = x_old;
1341 for (
int ns=0; ns<num_segments; ns++) {
1343 if (ns == num_segments-1) {
1345 dxp_seg = x0_new - x0_old;
1348 Xcell = Xcell + dirX_sign;
1350 dxp_seg = x0_new - x0_old;
1354 const auto seg_factor =
static_cast<amrex::Real>(dxp == 0. ? 1._rt : dxp_seg/dxp);
1358 double sx_cell[depos_order] = {0.};
1359 double const x0_bar = (x0_new + x0_old)/2.0;
1360 const int i0_cell = compute_shape_factor_cell( sx_cell, x0_bar-0.5 );
1362 if constexpr (depos_order >= 3) {
1364 double sx_old_cell[depos_order] = {0.};
1365 double sx_new_cell[depos_order] = {0.};
1366 const int i0_cell_2 = compute_shape_factors_cell( sx_old_cell, sx_new_cell, x0_old-0.5, x0_new-0.5 );
1368 for (
int m=0; m<depos_order; m++) {
1369 sx_cell[m] = (4.0*sx_cell[m] + sx_old_cell[m] + sx_new_cell[m])/6.0;
1375 double sx_old_node[depos_order+1] = {0.};
1376 double sx_new_node[depos_order+1] = {0.};
1377 const int i0_node = compute_shape_factors_node( sx_old_node, sx_new_node, x0_old, x0_new );
1380 for (
int i=0; i<=depos_order; i++) {
1381 const amrex::Real weight = 0.5_rt*(sx_old_node[i] + sx_new_node[i])*seg_factor;
1390 for (
int i=0; i<=depos_order-1; i++) {
1398 if (ns < num_segments-1) {
1404#elif defined(WARPX_DIM_1D_Z)
1407 const auto k_old =
static_cast<int>(z_old-
shift);
1408 const auto k_new =
static_cast<int>(z_new-
shift);
1409 const int cell_crossings_z = std::abs(k_new-k_old);
1410 num_segments += cell_crossings_z;
1414 const auto dirZ_sign =
static_cast<double>(dzp < 0. ? -1. : 1.);
1415 double Zcell =
static_cast<double>(k_old) +
shift + 0.5*(1.-dirZ_sign);
1422 double z0_old = z_old;
1424 constexpr int num_segments_max = 1 + 4*AMREX_SPACEDIM;
1426 "Error: num_segments must be less than or equal to 1 + 4*AMREX_SPACEDIM.");
1429 int k0_cell[num_segments_max];
1430 int k0_node[num_segments_max];
1431 amrex::Real weight_cell[num_segments_max][depos_order];
1432 amrex::Real weight_node[num_segments_max][depos_order+1];
1434 const auto k_mid =
static_cast<int>(0.5*(z_new+z_old)-
shift);
1435 int SegNum[num_segments_max];
1437 for (
int ns=0; ns<num_segments; ns++) {
1439 if (ns == num_segments-1) {
1441 dzp_seg = z0_new - z0_old;
1444 Zcell = Zcell + dirZ_sign;
1446 dzp_seg = z0_new - z0_old;
1450 const auto seg_factor =
static_cast<amrex::Real>(dzp == 0. ? 1._rt : dzp_seg/dzp);
1454 double sz_cell[depos_order] = {0.};
1455 double const z0_bar = (z0_new + z0_old)/2.0;
1456 k0_cell[ns] = compute_shape_factor_cell( sz_cell, z0_bar-0.5 );
1459 if constexpr (full_mass_matrices) {
1460 const auto k0_mid =
static_cast<int>(z0_bar-
shift);
1461 SegNum[ns] = 1 + k0_mid - k_mid;
1464 if constexpr (depos_order >= 3) {
1466 double sz_old_cell[depos_order] = {0.};
1467 double sz_new_cell[depos_order] = {0.};
1468 const int k0_cell_2 = compute_shape_factors_cell( sz_old_cell, sz_new_cell, z0_old-0.5, z0_new-0.5 );
1470 for (
int m=0; m<depos_order; m++) {
1471 sz_cell[m] = (4.0*sz_cell[m] + sz_old_cell[m] + sz_new_cell[m])/6.0;
1477 double sz_old_node[depos_order+1] = {0.};
1478 double sz_new_node[depos_order+1] = {0.};
1479 k0_node[ns] = compute_shape_factors_node( sz_old_node, sz_new_node, z0_old, z0_new );
1482 for (
int k=0; k<=depos_order; k++) {
1483 const amrex::Real weight = 0.5_rt*(sz_old_node[k] + sz_new_node[k])*seg_factor;
1484 const int k_J = lo.
x + k0_node[ns] + k;
1487 if constexpr (full_mass_matrices) { weight_node[ns][k] = weight; }
1495 for (
int k=0; k<=depos_order-1; k++) {
1497 const int k_J = lo.
x + k0_cell[ns] + k;
1499 if constexpr (full_mass_matrices) { weight_cell[ns][k] = weight; }
1506 if (ns < num_segments-1) {
1512 if constexpr (full_mass_matrices) {
1515 for (
int ns=0; ns<num_segments; ns++) {
1518 for (
int k=0; k<=depos_order; k++) {
1520 const int k_J = lo.
x + k0_node[ns] + k;
1522 for (
int ms=0; ms<num_segments; ms++) {
1523 const int SegShift = max_crossings + SegNum[ms] - SegNum[ns];
1524 for (
int kE=0; kE<=depos_order; kE++) {
1526 const int comp_yy = depos_order - k + kE + SegShift;
1532 for (
int kE=0; kE<=depos_order-1; kE++) {
1534 const int comp_yz = depos_order - k + kE + SegShift;
1543 for (
int k=0; k<=depos_order-1; k++) {
1545 const int k_J = lo.
x + k0_cell[ns] + k;
1547 for (
int ms=0; ms<num_segments; ms++) {
1548 const int SegShift = max_crossings + SegNum[ms] - SegNum[ns];
1549 for (
int kE=0; kE<=depos_order-1; kE++) {
1551 const int comp_zz = depos_order-1 - k + kE + SegShift;
1554 for (
int kE=0; kE<=depos_order; kE++) {
1556 const int comp_zy = depos_order-1 - k + kE + SegShift;