156#if !defined(WARPX_DIM_1D_Z)
160 const double xmid = (xp - xyzmin.
x)*dinv.
x;
167 double sx_node[depos_order + 1] = {0.};
168 double sx_cell[depos_order + 1] = {0.};
171 if (jx_type[0] == NODE || jy_type[0] == NODE || jz_type[0] == NODE) {
172 j_node = compute_shape_factor(sx_node, xmid);
174 if (jx_type[0] == CELL || jy_type[0] == CELL || jz_type[0] == CELL) {
175 j_cell = compute_shape_factor(sx_cell, xmid - 0.5);
179 if (j_node==j_cell) {
shift[0] = 1; }
184 for (
int ix=0; ix<=depos_order; ix++)
191 int const j_jx = ((jx_type[0] == NODE) ? j_node : j_cell);
192 int const j_jy = ((jy_type[0] == NODE) ? j_node : j_cell);
193 int const j_jz = ((jz_type[0] == NODE) ? j_node : j_cell);
196#if defined(WARPX_DIM_3D)
199 const double ymid = (yp - xyzmin.
y)*dinv.
y;
200 double sy_node[depos_order + 1] = {0.};
201 double sy_cell[depos_order + 1] = {0.};
204 if (jx_type[1] == NODE || jy_type[1] == NODE || jz_type[1] == NODE) {
205 k_node = compute_shape_factor(sy_node, ymid);
207 if (jx_type[1] == CELL || jy_type[1] == CELL || jz_type[1] == CELL) {
208 k_cell = compute_shape_factor(sy_cell, ymid - 0.5);
212 if (k_node==k_cell) {
shift[1] = 1; }
217 for (
int iy=0; iy<=depos_order; iy++)
223 int const k_jx = ((jx_type[1] == NODE) ? k_node : k_cell);
224 int const k_jy = ((jy_type[1] == NODE) ? k_node : k_cell);
225 int const k_jz = ((jz_type[1] == NODE) ? k_node : k_cell);
228#if !defined(WARPX_DIM_RCYLINDER) && !defined(WARPX_DIM_RSPHERE)
231 constexpr int zdir = WARPX_ZINDEX;
232 const double zmid = (zp - xyzmin.
z)*dinv.
z;
233 double sz_node[depos_order + 1] = {0.};
234 double sz_cell[depos_order + 1] = {0.};
237 if (jx_type[zdir] == NODE || jy_type[zdir] == NODE || jz_type[zdir] == NODE) {
238 l_node = compute_shape_factor(sz_node, zmid);
240 if (jx_type[zdir] == CELL || jy_type[zdir] == CELL || jz_type[zdir] == CELL) {
241 l_cell = compute_shape_factor(sz_cell, zmid - 0.5);
246 for (
int iz=0; iz<=depos_order; iz++)
252 int const l_jx = ((jx_type[zdir] == NODE) ? l_node : l_cell);
253 int const l_jy = ((jy_type[zdir] == NODE) ? l_node : l_cell);
254 int const l_jz = ((jz_type[zdir] == NODE) ? l_node : l_cell);
257 if (l_node==l_cell) {
shift[zdir] = 1; }
263 for (
int dir=0; dir<AMREX_SPACEDIM; dir++) {
264 offset_xy[dir] = (jx_type[dir] + jy_type[dir]) % 2;
265 offset_xz[dir] = (jx_type[dir] + jz_type[dir]) % 2;
266 offset_yz[dir] = (jy_type[dir] + jz_type[dir]) % 2;
270#if defined(WARPX_DIM_1D_Z)
271 for (
int iz=0; iz<=depos_order; iz++){
272 if constexpr (deposit_J) {
279 if constexpr (full_mass_matrices) {
280 for (
int aa=0; aa<=depos_order; aa++){
282 const int col_base = depos_order + aa - iz;
289 &Sxx_arr(lo.
x+l_jx+iz, 0, 0, Nc),
290 sz_jx[iz]*sz_jx[aa]*fpxx);
292 &Syy_arr(lo.
x+l_jy+iz, 0, 0, Nc),
293 sz_jy[iz]*sz_jy[aa]*fpyy);
295 &Szz_arr(lo.
x+l_jz+iz, 0, 0, Nc),
296 sz_jz[iz]*sz_jz[aa]*fpzz);
300 Nc = col_base +
shift[0]*offset_xy[0];
302 &Sxy_arr(lo.
x+l_jx+iz, 0, 0, Nc),
303 sz_jx[iz]*sz_jy[aa]*fpxy);
304 Nc = col_base +
shift[0]*offset_xz[0];
306 &Sxz_arr(lo.
x+l_jx+iz, 0, 0, Nc),
307 sz_jx[iz]*sz_jz[aa]*fpxz);
310 Nc = col_base +
shift[0]*offset_xy[0];
312 &Syx_arr(lo.
x+l_jy+iz, 0, 0, Nc),
313 sz_jy[iz]*sz_jx[aa]*fpyx);
314 Nc = col_base +
shift[0]*offset_yz[0];
316 &Syz_arr(lo.
x+l_jy+iz, 0, 0, Nc),
317 sz_jy[iz]*sz_jz[aa]*fpyz);
320 Nc = col_base + 1 -
shift[0]*offset_xz[0];
322 &Szx_arr(lo.
x+l_jz+iz, 0, 0, Nc),
323 sz_jz[iz]*sz_jx[aa]*fpzx);
324 Nc = col_base + 1 -
shift[0]*offset_yz[0];
326 &Szy_arr(lo.
x+l_jz+iz, 0, 0, Nc),
327 sz_jz[iz]*sz_jy[aa]*fpzy);
332 &Sxx_arr(lo.
x+l_jx+iz, 0, 0, 0),
335 &Syy_arr(lo.
x+l_jy+iz, 0, 0, 0),
338 &Szz_arr(lo.
x+l_jz+iz, 0, 0, 0),
342#elif defined(WARPX_DIM_RCYLINDER) || defined(WARPX_DIM_RSPHERE)
343 for (
int ix=0; ix<=depos_order; ix++){
344 if constexpr (deposit_J) {
353#elif defined(WARPX_DIM_XZ) || defined(WARPX_DIM_RZ)
354 const int base_offset = 1 + 2*depos_order;
356 for (
int iz=0; iz<=depos_order; iz++){
358 for (
int ix=0; ix<=depos_order; ix++){
364 if constexpr (deposit_J) {
371 if constexpr (full_mass_matrices) {
373 const int Ncomp0 = 1 + 2*depos_order;
375 for (
int bb=0; bb<=depos_order; bb++){
377 const int row_base = depos_order + bb - iz;
379 for (
int aa=0; aa<=depos_order; aa++){
380 const int col_base = depos_order + aa - ix;
389 if (col_base <= Ncomp0 - row_base) {
391 Nc = col_base + row_base*
offset;
393 &Sxx_arr(lo.
x+j_jx+ix, lo.
y+l_jx+iz, 0, Nc),
394 weight_Jx*weight_Ex*fpxx);
396 &Syy_arr(lo.
x+j_jy+ix, lo.
y+l_jy+iz, 0, Nc),
397 weight_Jy*weight_Ey*fpyy);
399 &Szz_arr(lo.
x+j_jz+ix, lo.
y+l_jz+iz, 0, Nc),
400 weight_Jz*weight_Ez*fpzz);
404 offset = base_offset + offset_xy[0];
405 Nc = col_base + 1 -
shift[0]*offset_xy[0]
408 &Sxy_arr(lo.
x+j_jx+ix, lo.
y+l_jx+iz, 0, Nc),
409 weight_Jx*weight_Ey*fpxy);
410 offset = base_offset + offset_xz[0];
411 Nc = col_base + 1 -
shift[0]*offset_xz[0]
414 &Sxz_arr(lo.
x+j_jx+ix, lo.
y+l_jx+iz, 0, Nc),
415 weight_Jx*weight_Ez*fpxz);
418 offset = base_offset + offset_xy[0];
419 Nc = col_base +
shift[0]*offset_xy[0]
422 &Syx_arr(lo.
x+j_jy+ix, lo.
y+l_jy+iz, 0, Nc),
423 weight_Jy*weight_Ex*fpyx);
424 offset = base_offset + offset_yz[0];
425 Nc = col_base +
shift[0]*offset_yz[0]
428 &Syz_arr(lo.
x+j_jy+ix, lo.
y+l_jy+iz, 0, Nc),
429 weight_Jy*weight_Ez*fpyz);
432 offset = base_offset + offset_xz[0];
433 Nc = col_base +
shift[0]*offset_xz[0]
436 &Szx_arr(lo.
x+j_jz+ix, lo.
y+l_jz+iz, 0, Nc),
437 weight_Jz*weight_Ex*fpzx);
438 offset = base_offset + offset_yz[0];
439 Nc = col_base +
shift[0]*offset_yz[0]
442 &Szy_arr(lo.
x+j_jz+ix, lo.
y+l_jz+iz, 0, Nc),
443 weight_Jz*weight_Ey*fpzy);
451 &Syy_arr(lo.
x+j_jy+ix, lo.
y+l_jy+iz, 0, 0),
454 &Sxx_arr(lo.
x+j_jx+ix, lo.
y+l_jx+iz, 0, 0),
457 &Szz_arr(lo.
x+j_jz+ix, lo.
y+l_jz+iz, 0, 0),
462#elif defined(WARPX_DIM_3D)
463 for (
int iz=0; iz<=depos_order; iz++){
464 for (
int iy=0; iy<=depos_order; iy++){
465 for (
int ix=0; ix<=depos_order; ix++){
466 const amrex::Real weight_Jx = sx_jx[ix]*sy_jx[iy]*sz_jx[iz];
467 const amrex::Real weight_Jy = sx_jy[ix]*sy_jy[iy]*sz_jy[iz];
468 const amrex::Real weight_Jz = sx_jz[ix]*sy_jz[iy]*sz_jz[iz];
470 if constexpr (deposit_J) {
477 if constexpr (full_mass_matrices) {
482 &Sxx_arr(lo.
x+j_jx+ix, lo.
y+k_jx+iy, lo.
z+l_jx+iz, 0),
485 &Syy_arr(lo.
x+j_jy+ix, lo.
y+k_jy+iy, lo.
z+l_jy+iz, 0),
488 &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;
956 if constexpr (deposit_J) {
965 for (
int i=0; i<=depos_order; i++) {
966 for (
int j=0; j<=depos_order-1; j++) {
967 for (
int k=0; k<=depos_order; k++) {
968 weight = sy_cell[j]*( sx_old_node[i]*sz_old_node[k]*one_third
969 + sx_old_node[i]*sz_new_node[k]*one_sixth
970 + sx_new_node[i]*sz_old_node[k]*one_sixth
971 + sx_new_node[i]*sz_new_node[k]*one_third )*seg_factor_y;
972 if constexpr (deposit_J) {
981 for (
int i=0; i<=depos_order; i++) {
982 for (
int j=0; j<=depos_order; j++) {
983 for (
int k=0; k<=depos_order-1; k++) {
984 weight = sz_cell[k]*( sx_old_node[i]*sy_old_node[j]*one_third
985 + sx_old_node[i]*sy_new_node[j]*one_sixth
986 + sx_new_node[i]*sy_old_node[j]*one_sixth
987 + sx_new_node[i]*sy_new_node[j]*one_third )*seg_factor_z;
988 if constexpr (deposit_J) {
997 if (ns < num_segments-1) {
1005#elif defined(WARPX_DIM_XZ) || defined(WARPX_DIM_RZ)
1008 const auto i_old =
static_cast<int>(x_old-
shift);
1009 const auto i_new =
static_cast<int>(x_new-
shift);
1010 const int cell_crossings_x = std::abs(i_new-i_old);
1011 num_segments += cell_crossings_x;
1014 const auto k_old =
static_cast<int>(z_old-
shift);
1015 const auto k_new =
static_cast<int>(z_new-
shift);
1016 const int cell_crossings_z = std::abs(k_new-k_old);
1017 num_segments += cell_crossings_z;
1022 const auto dirX_sign =
static_cast<double>(dxp < 0. ? -1. : 1.);
1023 const auto dirZ_sign =
static_cast<double>(dzp < 0. ? -1. : 1.);
1024 double Xcell = 0., Zcell = 0.;
1025 if (num_segments > 1) {
1026 Xcell =
static_cast<double>(i_old) +
shift + 0.5*(1.-dirX_sign);
1027 Zcell =
static_cast<double>(k_old) +
shift + 0.5*(1.-dirZ_sign);
1033 double dxp_seg, dzp_seg;
1034 double x0_new, z0_new;
1035 double x0_old = x_old;
1036 double z0_old = z_old;
1038 constexpr int num_segments_max = 1 + 4*AMREX_SPACEDIM;
1040 "Error: num_segments must be less than or equal to 1 + 4*AMREX_SPACEDIM.");
1043 int i0_cell[num_segments_max];
1044 int i0_node[num_segments_max];
1045 int k0_cell[num_segments_max];
1046 int k0_node[num_segments_max];
1047 amrex::Real weight_cellX_nodeZ[num_segments_max][depos_order][depos_order+1];
1048 amrex::Real weight_nodeX_cellZ[num_segments_max][depos_order+1][depos_order];
1049 amrex::Real weight_nodeX_nodeZ[num_segments_max][depos_order+1][depos_order+1];
1051 const auto i_mid =
static_cast<int>(0.5*(x_new+x_old)-
shift);
1052 const auto k_mid =
static_cast<int>(0.5*(z_new+z_old)-
shift);
1053 int SegNumX[num_segments_max];
1054 int SegNumZ[num_segments_max];
1056 for (
int ns=0; ns<num_segments; ns++) {
1058 if (ns == num_segments-1) {
1062 dxp_seg = x0_new - x0_old;
1063 dzp_seg = z0_new - z0_old;
1068 x0_new = Xcell + dirX_sign;
1069 z0_new = Zcell + dirZ_sign;
1070 dxp_seg = x0_new - x0_old;
1071 dzp_seg = z0_new - z0_old;
1073 if (dzp == 0. || std::abs(dxp_seg) < std::abs(dxp/dzp*dzp_seg)) {
1075 dzp_seg = dzp/dxp*dxp_seg;
1076 z0_new = z0_old + dzp_seg;
1080 dxp_seg = dxp/dzp*dzp_seg;
1081 x0_new = x0_old + dxp_seg;
1087 const auto seg_factor_x =
static_cast<amrex::Real>(dxp == 0. ? 1._rt : dxp_seg/dxp);
1088 const auto seg_factor_z =
static_cast<amrex::Real>(dzp == 0. ? 1._rt : dzp_seg/dzp);
1092 double sx_cell[depos_order] = {0.};
1093 double sz_cell[depos_order] = {0.};
1094 double const x0_bar = (x0_new + x0_old)/2.0;
1095 double const z0_bar = (z0_new + z0_old)/2.0;
1096 i0_cell[ns] = compute_shape_factor_cell( sx_cell, x0_bar-0.5 );
1097 k0_cell[ns] = compute_shape_factor_cell( sz_cell, z0_bar-0.5 );
1100 if constexpr (full_mass_matrices) {
1101 const auto i0_mid =
static_cast<int>(x0_bar-
shift);
1102 const auto k0_mid =
static_cast<int>(z0_bar-
shift);
1103 SegNumX[ns] = 1 + i0_mid - i_mid;
1104 SegNumZ[ns] = 1 + k0_mid - k_mid;
1107 if constexpr (depos_order >= 3) {
1109 double sx_old_cell[depos_order] = {0.};
1110 double sx_new_cell[depos_order] = {0.};
1111 double sz_old_cell[depos_order] = {0.};
1112 double sz_new_cell[depos_order] = {0.};
1113 const int i0_cell_2 = compute_shape_factors_cell( sx_old_cell, sx_new_cell, x0_old-0.5, x0_new-0.5 );
1114 const int k0_cell_2 = compute_shape_factors_cell( sz_old_cell, sz_new_cell, z0_old-0.5, z0_new-0.5 );
1116 for (
int m=0; m<depos_order; m++) {
1117 sx_cell[m] = (4.0*sx_cell[m] + sx_old_cell[m] + sx_new_cell[m])/6.0;
1118 sz_cell[m] = (4.0*sz_cell[m] + sz_old_cell[m] + sz_new_cell[m])/6.0;
1124 double sx_old_node[depos_order+1] = {0.};
1125 double sx_new_node[depos_order+1] = {0.};
1126 double sz_old_node[depos_order+1] = {0.};
1127 double sz_new_node[depos_order+1] = {0.};
1128 i0_node[ns] = compute_shape_factors_node( sx_old_node, sx_new_node, x0_old, x0_new );
1129 k0_node[ns] = compute_shape_factors_node( sz_old_node, sz_new_node, z0_old, z0_new );
1133 for (
int i=0; i<=depos_order-1; i++) {
1134 for (
int k=0; k<=depos_order; k++) {
1135 const int i_J = lo.
x + i0_cell[ns] + i;
1136 const int k_J = lo.
y + k0_node[ns] + k;
1137 weight = sx_cell[i]*(sz_old_node[k] + sz_new_node[k])/2.0_rt*seg_factor_x;
1138 if constexpr (deposit_J) {
1141 if constexpr (full_mass_matrices) { weight_cellX_nodeZ[ns][i][k] = weight; }
1149 const auto seg_factor_y = std::min(seg_factor_x,seg_factor_z);
1150 for (
int i=0; i<=depos_order; i++) {
1151 for (
int k=0; k<=depos_order; k++) {
1152 const int i_J = lo.
x + i0_node[ns] + i;
1153 const int k_J = lo.
y + k0_node[ns] + k;
1154 weight = ( sx_old_node[i]*sz_old_node[k]*one_third
1155 + sx_old_node[i]*sz_new_node[k]*one_sixth
1156 + sx_new_node[i]*sz_old_node[k]*one_sixth
1157 + sx_new_node[i]*sz_new_node[k]*one_third )*seg_factor_y;
1158 if constexpr (deposit_J) {
1161 if constexpr (full_mass_matrices) { weight_nodeX_nodeZ[ns][i][k] = weight; }
1169 for (
int i=0; i<=depos_order; i++) {
1170 for (
int k=0; k<=depos_order-1; k++) {
1171 const int i_J = lo.
x + i0_node[ns] + i;
1172 const int k_J = lo.
y + k0_cell[ns] + k;
1173 weight = sz_cell[k]*(sx_old_node[i] + sx_new_node[i])/2.0_rt*seg_factor_z;
1174 if constexpr (deposit_J) {
1177 if constexpr (full_mass_matrices) { weight_nodeX_cellZ[ns][i][k] = weight; }
1185 if (ns < num_segments-1) {
1192 if constexpr (full_mass_matrices) {
1194 const int Ncomp_base = 2*depos_order + 2*max_crossings;
1195 const int Ncomp_xx0 = Ncomp_base - 1;
1196 const int Ncomp_xz0 = Ncomp_base;
1197 const int Ncomp_zx0 = Ncomp_base;
1198 const int Ncomp_zz0 = 1 + Ncomp_base;
1199 const int Ncomp_xy0 = Ncomp_base;
1200 const int Ncomp_yx0 = Ncomp_base;
1201 const int Ncomp_yz0 = 1 + Ncomp_base;
1202 const int Ncomp_yy0 = 1 + Ncomp_base;
1203 const int Ncomp_zy0 = 1 + Ncomp_base;
1205 const int width_xx1 = depos_order + max_crossings;
1206 const int width_zz1 = width_xx1 - 1;
1207 const int width_yy1 = width_xx1;
1210 for (
int ns=0; ns<num_segments; ns++) {
1213 for (
int i = 0; i <= depos_order - 1; i++) {
1214 for (
int k = 0; k <= depos_order; k++) {
1215 const int i_J = lo.
x + i0_cell[ns] + i;
1216 const int k_J = lo.
y + k0_node[ns] + k;
1217 const amrex::Real weight_J = weight_cellX_nodeZ[ns][i][k];
1218 for (
int ms=0; ms<num_segments; ms++) {
1219 const int SegShiftX = max_crossings + SegNumX[ms] - SegNumX[ns];
1220 const int SegShiftZ = max_crossings + SegNumZ[ms] - SegNumZ[ns];
1222 for (
int kE = 0; kE <= depos_order; kE++) {
1223 const int row_xx = depos_order - k + kE + SegShiftZ;
1224 const int above_diag = (row_xx > width_xx1) ? 1 : 0;
1225 for (
int iE = 0; iE <= depos_order - 1; iE++) {
1226 const int col_xx = depos_order - 1 - i + iE + SegShiftX;
1227 if (col_xx > Ncomp_xx0 - row_xx - above_diag) {
break; }
1228 const int comp_xx = col_xx + Ncomp_xx0*row_xx;
1229 const amrex::Real weight_E = weight_cellX_nodeZ[ms][iE][kE];
1234 for (
int iE = 0; iE <= depos_order; iE++) {
1235 for (
int kE = 0; kE <= depos_order - 1; kE++) {
1236 const amrex::Real weight_E = weight_nodeX_cellZ[ms][iE][kE];
1237 const int comp_xz = depos_order - 1 - i + iE + SegShiftX
1238 + Ncomp_xz0*(depos_order - k + kE + SegShiftZ);
1243 for (
int iE = 0; iE <= depos_order; iE++) {
1244 for (
int kE = 0; kE <= depos_order; kE++) {
1245 const amrex::Real weight_E = weight_nodeX_nodeZ[ms][iE][kE];
1246 const int comp_xy = depos_order - 1 - i + iE + SegShiftX
1247 + Ncomp_xy0*(depos_order - k + kE + SegShiftZ);
1256 for (
int i=0; i<=depos_order; i++) {
1257 for (
int k=0; k<=depos_order-1; k++) {
1258 const int i_J = lo.
x + i0_node[ns] + i;
1259 const int k_J = lo.
y + k0_cell[ns] + k;
1260 const amrex::Real weight_J = weight_nodeX_cellZ[ns][i][k];
1261 for (
int ms=0; ms<num_segments; ms++) {
1262 const int SegShiftX = max_crossings + SegNumX[ms] - SegNumX[ns];
1263 const int SegShiftZ = max_crossings + SegNumZ[ms] - SegNumZ[ns];
1265 for (
int iE=0; iE<=depos_order-1; iE++) {
1266 for (
int kE=0; kE<=depos_order; kE++) {
1267 const amrex::Real weight_E = weight_cellX_nodeZ[ms][iE][kE];
1268 const int comp_zx = depos_order - i + iE + SegShiftX
1269 + Ncomp_zx0*(depos_order-1 - k + kE + SegShiftZ);
1274 for (
int kE=0; kE<=depos_order-1; kE++) {
1275 const int row_zz = depos_order - 1 - k + kE + SegShiftZ;
1276 const int above_diag = (row_zz > width_zz1) ? 1 : 0;
1277 for (
int iE=0; iE<=depos_order; iE++) {
1278 const int col_zz = depos_order - i + iE + SegShiftX;
1279 if (col_zz > Ncomp_zz0 - 2 - row_zz - above_diag) {
break; }
1280 const int comp_zz = col_zz + Ncomp_zz0*row_zz;
1281 const amrex::Real weight_E = weight_nodeX_cellZ[ms][iE][kE];
1286 for (
int iE=0; iE<=depos_order; iE++) {
1287 for (
int kE=0; kE<=depos_order; kE++) {
1288 const amrex::Real weight_E = weight_nodeX_nodeZ[ms][iE][kE];
1289 const int comp_zy = depos_order - i + iE + SegShiftX
1290 + Ncomp_zy0*(depos_order-1 - k + kE + SegShiftZ);
1299 for (
int i=0; i<=depos_order; i++) {
1300 for (
int k=0; k<=depos_order; k++) {
1301 const int i_J = lo.
x + i0_node[ns] + i;
1302 const int k_J = lo.
y + k0_node[ns] + k;
1303 const amrex::Real weight_J = weight_nodeX_nodeZ[ns][i][k];
1304 for (
int ms=0; ms<num_segments; ms++) {
1305 const int SegShiftX = max_crossings + SegNumX[ms] - SegNumX[ns];
1306 const int SegShiftZ = max_crossings + SegNumZ[ms] - SegNumZ[ns];
1308 for (
int iE=0; iE<=depos_order-1; iE++) {
1309 for (
int kE=0; kE<=depos_order; kE++) {
1310 const amrex::Real weight_E = weight_cellX_nodeZ[ms][iE][kE];
1311 const int comp_yx = depos_order - i + iE + SegShiftX
1312 + Ncomp_yx0*(depos_order - k + kE + SegShiftZ);
1317 for (
int iE=0; iE<=depos_order; iE++) {
1318 for (
int kE=0; kE<=depos_order-1; kE++) {
1319 const amrex::Real weight_E = weight_nodeX_cellZ[ms][iE][kE];
1320 const int comp_yz = depos_order - i + iE + SegShiftX
1321 + Ncomp_yz0*(depos_order - k + kE + SegShiftZ);
1326 for (
int kE=0; kE<=depos_order; kE++) {
1327 const int row_yy = depos_order - k + kE + SegShiftZ;
1328 const int above_diag = (row_yy > width_yy1) ? 1 : 0;
1329 for (
int iE=0; iE<=depos_order; iE++) {
1330 const int col_yy = depos_order - i + iE + SegShiftX;
1331 if (col_yy > Ncomp_yy0 - 1 - row_yy - above_diag) {
break; }
1332 const int comp_yy = col_yy + Ncomp_yy0*row_yy;
1333 const amrex::Real weight_E = weight_nodeX_nodeZ[ms][iE][kE];
1346#elif defined(WARPX_DIM_RCYLINDER) || defined(WARPX_DIM_RSPHERE)
1349 const auto i_old =
static_cast<int>(x_old-
shift);
1350 const auto i_new =
static_cast<int>(x_new-
shift);
1351 const int cell_crossings_x = std::abs(i_new-i_old);
1352 num_segments += cell_crossings_x;
1356 const auto dirX_sign =
static_cast<double>(dxp < 0. ? -1. : 1.);
1357 double Xcell =
static_cast<double>(i_old) +
shift + 0.5*(1.-dirX_sign);
1364 double x0_old = x_old;
1366 for (
int ns=0; ns<num_segments; ns++) {
1368 if (ns == num_segments-1) {
1370 dxp_seg = x0_new - x0_old;
1373 Xcell = Xcell + dirX_sign;
1375 dxp_seg = x0_new - x0_old;
1379 const auto seg_factor =
static_cast<amrex::Real>(dxp == 0. ? 1._rt : dxp_seg/dxp);
1383 double sx_cell[depos_order] = {0.};
1384 double const x0_bar = (x0_new + x0_old)/2.0;
1385 const int i0_cell = compute_shape_factor_cell( sx_cell, x0_bar-0.5 );
1387 if constexpr (depos_order >= 3) {
1389 double sx_old_cell[depos_order] = {0.};
1390 double sx_new_cell[depos_order] = {0.};
1391 const int i0_cell_2 = compute_shape_factors_cell( sx_old_cell, sx_new_cell, x0_old-0.5, x0_new-0.5 );
1393 for (
int m=0; m<depos_order; m++) {
1394 sx_cell[m] = (4.0*sx_cell[m] + sx_old_cell[m] + sx_new_cell[m])/6.0;
1400 double sx_old_node[depos_order+1] = {0.};
1401 double sx_new_node[depos_order+1] = {0.};
1402 const int i0_node = compute_shape_factors_node( sx_old_node, sx_new_node, x0_old, x0_new );
1405 for (
int i=0; i<=depos_order; i++) {
1406 const amrex::Real weight = 0.5_rt*(sx_old_node[i] + sx_new_node[i])*seg_factor;
1407 if constexpr (deposit_J) {
1417 for (
int i=0; i<=depos_order-1; i++) {
1419 if constexpr (deposit_J) {
1427 if (ns < num_segments-1) {
1433#elif defined(WARPX_DIM_1D_Z)
1436 const auto k_old =
static_cast<int>(z_old-
shift);
1437 const auto k_new =
static_cast<int>(z_new-
shift);
1438 const int cell_crossings_z = std::abs(k_new-k_old);
1439 num_segments += cell_crossings_z;
1443 const auto dirZ_sign =
static_cast<double>(dzp < 0. ? -1. : 1.);
1444 double Zcell =
static_cast<double>(k_old) +
shift + 0.5*(1.-dirZ_sign);
1451 double z0_old = z_old;
1453 constexpr int num_segments_max = 1 + 4*AMREX_SPACEDIM;
1455 "Error: num_segments must be less than or equal to 1 + 4*AMREX_SPACEDIM.");
1458 int k0_cell[num_segments_max];
1459 int k0_node[num_segments_max];
1460 amrex::Real weight_cell[num_segments_max][depos_order];
1461 amrex::Real weight_node[num_segments_max][depos_order+1];
1463 const auto k_mid =
static_cast<int>(0.5*(z_new+z_old)-
shift);
1464 int SegNum[num_segments_max];
1466 for (
int ns=0; ns<num_segments; ns++) {
1468 if (ns == num_segments-1) {
1470 dzp_seg = z0_new - z0_old;
1473 Zcell = Zcell + dirZ_sign;
1475 dzp_seg = z0_new - z0_old;
1479 const auto seg_factor =
static_cast<amrex::Real>(dzp == 0. ? 1._rt : dzp_seg/dzp);
1483 double sz_cell[depos_order] = {0.};
1484 double const z0_bar = (z0_new + z0_old)/2.0;
1485 k0_cell[ns] = compute_shape_factor_cell( sz_cell, z0_bar-0.5 );
1488 if constexpr (full_mass_matrices) {
1489 const auto k0_mid =
static_cast<int>(z0_bar-
shift);
1490 SegNum[ns] = 1 + k0_mid - k_mid;
1493 if constexpr (depos_order >= 3) {
1495 double sz_old_cell[depos_order] = {0.};
1496 double sz_new_cell[depos_order] = {0.};
1497 const int k0_cell_2 = compute_shape_factors_cell( sz_old_cell, sz_new_cell, z0_old-0.5, z0_new-0.5 );
1499 for (
int m=0; m<depos_order; m++) {
1500 sz_cell[m] = (4.0*sz_cell[m] + sz_old_cell[m] + sz_new_cell[m])/6.0;
1506 double sz_old_node[depos_order+1] = {0.};
1507 double sz_new_node[depos_order+1] = {0.};
1508 k0_node[ns] = compute_shape_factors_node( sz_old_node, sz_new_node, z0_old, z0_new );
1511 for (
int k=0; k<=depos_order; k++) {
1512 const amrex::Real weight = 0.5_rt*(sz_old_node[k] + sz_new_node[k])*seg_factor;
1513 const int k_J = lo.
x + k0_node[ns] + k;
1514 if constexpr (deposit_J) {
1518 if constexpr (full_mass_matrices) { weight_node[ns][k] = weight; }
1526 for (
int k=0; k<=depos_order-1; k++) {
1528 const int k_J = lo.
x + k0_cell[ns] + k;
1529 if constexpr (deposit_J) {
1532 if constexpr (full_mass_matrices) { weight_cell[ns][k] = weight; }
1539 if (ns < num_segments-1) {
1545 if constexpr (full_mass_matrices) {
1547 const int width_zz = depos_order - 1 + max_crossings;
1548 const int width_yy = depos_order + max_crossings;
1551 for (
int ns=0; ns<num_segments; ns++) {
1554 for (
int k=0; k<=depos_order; k++) {
1556 const int k_J = lo.
x + k0_node[ns] + k;
1558 for (
int ms=0; ms<num_segments; ms++) {
1559 const int SegShift = max_crossings + SegNum[ms] - SegNum[ns];
1560 for (
int kE=0; kE<=depos_order; kE++) {
1562 const int comp_yy = depos_order - k + kE + SegShift;
1563 if (comp_yy <= width_yy) {
1570 for (
int kE=0; kE<=depos_order-1; kE++) {
1572 const int comp_yz = depos_order - k + kE + SegShift;
1581 for (
int k=0; k<=depos_order-1; k++) {
1583 const int k_J = lo.
x + k0_cell[ns] + k;
1585 for (
int ms=0; ms<num_segments; ms++) {
1586 const int SegShift = max_crossings + SegNum[ms] - SegNum[ns];
1587 for (
int kE=0; kE<=depos_order-1; kE++) {
1588 const int comp_zz = depos_order - 1 - k + kE + SegShift;
1589 if (comp_zz > width_zz) {
break; }
1593 for (
int kE=0; kE<=depos_order; kE++) {
1595 const int comp_zy = depos_order-1 - k + kE + SegShift;