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 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),
673 [[maybe_unused]]
int max_crossings,
693#if (AMREX_SPACEDIM > 1)
699#if defined(WARPX_DIM_RZ) || defined(WARPX_DIM_RCYLINDER)
700 amrex::Real const xp_mid = (xp_new + xp_old)*0.5_rt;
701 amrex::Real const yp_mid = (yp_new + yp_old)*0.5_rt;
702 amrex::Real const rp_new = std::sqrt(xp_new*xp_new + yp_new*yp_new);
703 amrex::Real const rp_old = std::sqrt(xp_old*xp_old + yp_old*yp_old);
704 amrex::Real const rp_mid = (rp_new + rp_old)/2._rt;
705 amrex::Real const costheta_mid = (rp_mid > 0._rt ? xp_mid/rp_mid : 1._rt);
706 amrex::Real const sintheta_mid = (rp_mid > 0._rt ? yp_mid/rp_mid : 0._rt);
709 double x_new = (rp_new - xyzmin.
x)*dinv.
x;
710 double const x_old = (rp_old - xyzmin.
x)*dinv.
x;
712 amrex::Real const vy = (-uxp_mid*sintheta_mid + uyp_mid*costheta_mid)*gaminv;
713#if defined(WARPX_DIM_RCYLINDER)
716#elif defined(WARPX_DIM_RSPHERE)
717 amrex::Real const xp_mid = (xp_new + xp_old)*0.5_rt;
718 amrex::Real const yp_mid = (yp_new + yp_old)*0.5_rt;
719 amrex::Real const zp_mid = (zp_new + zp_old)*0.5_rt;
720 amrex::Real const rpxy_new = std::sqrt(xp_new*xp_new + yp_new*yp_new);
721 amrex::Real const rp_new = std::sqrt(xp_new*xp_new + yp_new*yp_new + zp_new*zp_new);
722 amrex::Real const rpxy_old = std::sqrt(xp_old*xp_old + yp_old*yp_old);
723 amrex::Real const rp_old = std::sqrt(xp_old*xp_old + yp_old*yp_old + zp_old*zp_old);
724 amrex::Real const rpxy_mid = (rpxy_new + rpxy_old)*0.5_rt;
725 amrex::Real const rp_mid = (rp_new + rp_old)*0.5_rt;
726 amrex::Real const costheta_mid = (rpxy_mid > 0._rt ? xp_mid/rpxy_mid : 1._rt);
727 amrex::Real const sintheta_mid = (rpxy_mid > 0._rt ? yp_mid/rpxy_mid : 0._rt);
728 amrex::Real const cosphi_mid = (rp_mid > 0._rt ? rpxy_mid/rp_mid : 1._rt);
729 amrex::Real const sinphi_mid = (rp_mid > 0._rt ? zp_mid/rp_mid : 0._rt);
732 double x_new = (rp_new - xyzmin.
x)*dinv.
x;
733 double const x_old = (rp_old - xyzmin.
x)*dinv.
x;
735 amrex::Real const vy = (-uxp_mid*sintheta_mid + uyp_mid*costheta_mid)*gaminv;
736 amrex::Real const vz = (-uxp_mid*costheta_mid*cosphi_mid - uyp_mid*sintheta_mid*cosphi_mid + uzp_mid*sinphi_mid)*gaminv;
737#elif defined(WARPX_DIM_XZ)
739 double x_new = (xp_new - xyzmin.
x)*dinv.
x;
740 double const x_old = (xp_old - xyzmin.
x)*dinv.
x;
743#elif defined(WARPX_DIM_1D_Z)
746#elif defined(WARPX_DIM_3D)
748 double x_new = (xp_new - xyzmin.
x)*dinv.
x;
749 double const x_old = (xp_old - xyzmin.
x)*dinv.
x;
750 double y_new = (yp_new - xyzmin.
y)*dinv.
y;
751 double const y_old = (yp_old - xyzmin.
y)*dinv.
y;
756#if !defined(WARPX_DIM_RCYLINDER) && !defined(WARPX_DIM_RSPHERE)
758 double z_new = (zp_new - xyzmin.
z)*dinv.
z;
759 double const z_old = (zp_old - xyzmin.
z)*dinv.
z;
769#if !defined(WARPX_DIM_1D_Z)
770 const double dxp = x_new - x_old;
772#if defined(WARPX_DIM_3D)
773 const double dyp = y_new - y_old;
775#if !defined(WARPX_DIM_RCYLINDER) && !defined(WARPX_DIM_RSPHERE)
776 const double dzp = z_new - z_old;
780#if defined(WARPX_DIM_3D)
782 domain_double[0][0], domain_double[0][1], do_cropping[0]);
784 domain_double[1][0], domain_double[1][1], do_cropping[1]);
786 domain_double[2][0], domain_double[2][1], do_cropping[2]);
787#elif defined(WARPX_DIM_XZ) || defined(WARPX_DIM_RZ)
789 domain_double[0][0], domain_double[0][1], do_cropping[0]);
791 domain_double[1][0], domain_double[1][1], do_cropping[1]);
792#elif defined(WARPX_DIM_1D_Z)
794#elif defined(WARPX_DIM_RCYLINDER) || defined(WARPX_DIM_RSPHERE)
804 int num_segments = 1;
806 if ( (depos_order % 2) == 0 ) {
shift = 0.5; }
808#if defined(WARPX_DIM_3D)
811 const auto i_old =
static_cast<int>(x_old-
shift);
812 const auto i_new =
static_cast<int>(x_new-
shift);
813 const int cell_crossings_x = std::abs(i_new-i_old);
814 num_segments += cell_crossings_x;
817 const auto j_old =
static_cast<int>(y_old-
shift);
818 const auto j_new =
static_cast<int>(y_new-
shift);
819 const int cell_crossings_y = std::abs(j_new-j_old);
820 num_segments += cell_crossings_y;
823 const auto k_old =
static_cast<int>(z_old-
shift);
824 const auto k_new =
static_cast<int>(z_new-
shift);
825 const int cell_crossings_z = std::abs(k_new-k_old);
826 num_segments += cell_crossings_z;
831 const auto dirX_sign =
static_cast<double>(dxp < 0. ? -1. : 1.);
832 const auto dirY_sign =
static_cast<double>(dyp < 0. ? -1. : 1.);
833 const auto dirZ_sign =
static_cast<double>(dzp < 0. ? -1. : 1.);
834 double Xcell = 0., Ycell = 0., Zcell = 0.;
835 if (num_segments > 1) {
836 Xcell =
static_cast<double>(i_old) +
shift + 0.5*(1.-dirX_sign);
837 Ycell =
static_cast<double>(j_old) +
shift + 0.5*(1.-dirY_sign);
838 Zcell =
static_cast<double>(k_old) +
shift + 0.5*(1.-dirZ_sign);
844 double dxp_seg, dyp_seg, dzp_seg;
845 double x0_new, y0_new, z0_new;
846 double x0_old = x_old;
847 double y0_old = y_old;
848 double z0_old = z_old;
850 for (
int ns=0; ns<num_segments; ns++) {
852 if (ns == num_segments-1) {
857 dxp_seg = x0_new - x0_old;
858 dyp_seg = y0_new - y0_old;
859 dzp_seg = z0_new - z0_old;
864 x0_new = Xcell + dirX_sign;
865 y0_new = Ycell + dirY_sign;
866 z0_new = Zcell + dirZ_sign;
867 dxp_seg = x0_new - x0_old;
868 dyp_seg = y0_new - y0_old;
869 dzp_seg = z0_new - z0_old;
871 if ( (dyp == 0. || std::abs(dxp_seg) < std::abs(dxp/dyp*dyp_seg))
872 && (dzp == 0. || std::abs(dxp_seg) < std::abs(dxp/dzp*dzp_seg)) ) {
874 dyp_seg = dyp/dxp*dxp_seg;
875 dzp_seg = dzp/dxp*dxp_seg;
876 y0_new = y0_old + dyp_seg;
877 z0_new = z0_old + dzp_seg;
879 else if (dzp == 0. || std::abs(dyp_seg) < std::abs(dyp/dzp*dzp_seg)) {
881 dxp_seg = dxp/dyp*dyp_seg;
882 dzp_seg = dzp/dyp*dyp_seg;
883 x0_new = x0_old + dxp_seg;
884 z0_new = z0_old + dzp_seg;
888 dxp_seg = dxp/dzp*dzp_seg;
889 dyp_seg = dyp/dzp*dzp_seg;
890 x0_new = x0_old + dxp_seg;
891 y0_new = y0_old + dyp_seg;
897 const auto seg_factor_x =
static_cast<amrex::Real>(dxp == 0. ? 1._rt : dxp_seg/dxp);
898 const auto seg_factor_y =
static_cast<amrex::Real>(dyp == 0. ? 1._rt : dyp_seg/dyp);
899 const auto seg_factor_z =
static_cast<amrex::Real>(dzp == 0. ? 1._rt : dzp_seg/dzp);
903 double sx_cell[depos_order] = {0.};
904 double sy_cell[depos_order] = {0.};
905 double sz_cell[depos_order] = {0.};
906 double const x0_bar = (x0_new + x0_old)/2.0;
907 double const y0_bar = (y0_new + y0_old)/2.0;
908 double const z0_bar = (z0_new + z0_old)/2.0;
909 const int i0_cell = compute_shape_factor_cell( sx_cell, x0_bar-0.5 );
910 const int j0_cell = compute_shape_factor_cell( sy_cell, y0_bar-0.5 );
911 const int k0_cell = compute_shape_factor_cell( sz_cell, z0_bar-0.5 );
913 if constexpr (depos_order >= 3) {
915 double sx_old_cell[depos_order] = {0.};
916 double sx_new_cell[depos_order] = {0.};
917 double sy_old_cell[depos_order] = {0.};
918 double sy_new_cell[depos_order] = {0.};
919 double sz_old_cell[depos_order] = {0.};
920 double sz_new_cell[depos_order] = {0.};
921 const int i0_cell_2 = compute_shape_factors_cell( sx_old_cell, sx_new_cell, x0_old-0.5, x0_new-0.5 );
922 const int j0_cell_2 = compute_shape_factors_cell( sy_old_cell, sy_new_cell, y0_old-0.5, y0_new-0.5 );
923 const int k0_cell_2 = compute_shape_factors_cell( sz_old_cell, sz_new_cell, z0_old-0.5, z0_new-0.5 );
925 for (
int m=0; m<depos_order; m++) {
926 sx_cell[m] = (4.0*sx_cell[m] + sx_old_cell[m] + sx_new_cell[m])/6.0;
927 sy_cell[m] = (4.0*sy_cell[m] + sy_old_cell[m] + sy_new_cell[m])/6.0;
928 sz_cell[m] = (4.0*sz_cell[m] + sz_old_cell[m] + sz_new_cell[m])/6.0;
934 double sx_old_node[depos_order+1] = {0.};
935 double sx_new_node[depos_order+1] = {0.};
936 double sy_old_node[depos_order+1] = {0.};
937 double sy_new_node[depos_order+1] = {0.};
938 double sz_old_node[depos_order+1] = {0.};
939 double sz_new_node[depos_order+1] = {0.};
940 const int i0_node = compute_shape_factors_node( sx_old_node, sx_new_node, x0_old, x0_new );
941 const int j0_node = compute_shape_factors_node( sy_old_node, sy_new_node, y0_old, y0_new );
942 const int k0_node = compute_shape_factors_node( sz_old_node, sz_new_node, z0_old, z0_new );
946 for (
int i=0; i<=depos_order-1; i++) {
947 for (
int j=0; j<=depos_order; j++) {
948 for (
int k=0; k<=depos_order; k++) {
949 weight = sx_cell[i]*( sy_old_node[j]*sz_old_node[k]*one_third
950 + sy_old_node[j]*sz_new_node[k]*one_sixth
951 + sy_new_node[j]*sz_old_node[k]*one_sixth
952 + sy_new_node[j]*sz_new_node[k]*one_third )*seg_factor_x;
953 if constexpr (deposit_J) {
962 for (
int i=0; i<=depos_order; i++) {
963 for (
int j=0; j<=depos_order-1; j++) {
964 for (
int k=0; k<=depos_order; k++) {
965 weight = sy_cell[j]*( sx_old_node[i]*sz_old_node[k]*one_third
966 + sx_old_node[i]*sz_new_node[k]*one_sixth
967 + sx_new_node[i]*sz_old_node[k]*one_sixth
968 + sx_new_node[i]*sz_new_node[k]*one_third )*seg_factor_y;
969 if constexpr (deposit_J) {
978 for (
int i=0; i<=depos_order; i++) {
979 for (
int j=0; j<=depos_order; j++) {
980 for (
int k=0; k<=depos_order-1; k++) {
981 weight = sz_cell[k]*( sx_old_node[i]*sy_old_node[j]*one_third
982 + sx_old_node[i]*sy_new_node[j]*one_sixth
983 + sx_new_node[i]*sy_old_node[j]*one_sixth
984 + sx_new_node[i]*sy_new_node[j]*one_third )*seg_factor_z;
985 if constexpr (deposit_J) {
994 if (ns < num_segments-1) {
1002#elif defined(WARPX_DIM_XZ) || defined(WARPX_DIM_RZ)
1005 const auto i_old =
static_cast<int>(x_old-
shift);
1006 const auto i_new =
static_cast<int>(x_new-
shift);
1007 const int cell_crossings_x = std::abs(i_new-i_old);
1008 num_segments += cell_crossings_x;
1011 const auto k_old =
static_cast<int>(z_old-
shift);
1012 const auto k_new =
static_cast<int>(z_new-
shift);
1013 const int cell_crossings_z = std::abs(k_new-k_old);
1014 num_segments += cell_crossings_z;
1019 const auto dirX_sign =
static_cast<double>(dxp < 0. ? -1. : 1.);
1020 const auto dirZ_sign =
static_cast<double>(dzp < 0. ? -1. : 1.);
1021 double Xcell = 0., Zcell = 0.;
1022 if (num_segments > 1) {
1023 Xcell =
static_cast<double>(i_old) +
shift + 0.5*(1.-dirX_sign);
1024 Zcell =
static_cast<double>(k_old) +
shift + 0.5*(1.-dirZ_sign);
1030 double dxp_seg, dzp_seg;
1031 double x0_new, z0_new;
1032 double x0_old = x_old;
1033 double z0_old = z_old;
1035 constexpr int num_segments_max = 1 + 4*AMREX_SPACEDIM;
1037 "Error: num_segments must be less than or equal to 1 + 4*AMREX_SPACEDIM.");
1040 int i0_cell[num_segments_max];
1041 int i0_node[num_segments_max];
1042 int k0_cell[num_segments_max];
1043 int k0_node[num_segments_max];
1044 amrex::Real weight_cellX_nodeZ[num_segments_max][depos_order][depos_order+1];
1045 amrex::Real weight_nodeX_cellZ[num_segments_max][depos_order+1][depos_order];
1046 amrex::Real weight_nodeX_nodeZ[num_segments_max][depos_order+1][depos_order+1];
1048 const auto i_mid =
static_cast<int>(0.5*(x_new+x_old)-
shift);
1049 const auto k_mid =
static_cast<int>(0.5*(z_new+z_old)-
shift);
1050 int SegNumX[num_segments_max];
1051 int SegNumZ[num_segments_max];
1053 for (
int ns=0; ns<num_segments; ns++) {
1055 if (ns == num_segments-1) {
1059 dxp_seg = x0_new - x0_old;
1060 dzp_seg = z0_new - z0_old;
1065 x0_new = Xcell + dirX_sign;
1066 z0_new = Zcell + dirZ_sign;
1067 dxp_seg = x0_new - x0_old;
1068 dzp_seg = z0_new - z0_old;
1070 if (dzp == 0. || std::abs(dxp_seg) < std::abs(dxp/dzp*dzp_seg)) {
1072 dzp_seg = dzp/dxp*dxp_seg;
1073 z0_new = z0_old + dzp_seg;
1077 dxp_seg = dxp/dzp*dzp_seg;
1078 x0_new = x0_old + dxp_seg;
1084 const auto seg_factor_x =
static_cast<amrex::Real>(dxp == 0. ? 1._rt : dxp_seg/dxp);
1085 const auto seg_factor_z =
static_cast<amrex::Real>(dzp == 0. ? 1._rt : dzp_seg/dzp);
1089 double sx_cell[depos_order] = {0.};
1090 double sz_cell[depos_order] = {0.};
1091 double const x0_bar = (x0_new + x0_old)/2.0;
1092 double const z0_bar = (z0_new + z0_old)/2.0;
1093 i0_cell[ns] = compute_shape_factor_cell( sx_cell, x0_bar-0.5 );
1094 k0_cell[ns] = compute_shape_factor_cell( sz_cell, z0_bar-0.5 );
1097 if constexpr (full_mass_matrices) {
1098 const auto i0_mid =
static_cast<int>(x0_bar-
shift);
1099 const auto k0_mid =
static_cast<int>(z0_bar-
shift);
1100 SegNumX[ns] = 1 + i0_mid - i_mid;
1101 SegNumZ[ns] = 1 + k0_mid - k_mid;
1104 if constexpr (depos_order >= 3) {
1106 double sx_old_cell[depos_order] = {0.};
1107 double sx_new_cell[depos_order] = {0.};
1108 double sz_old_cell[depos_order] = {0.};
1109 double sz_new_cell[depos_order] = {0.};
1110 const int i0_cell_2 = compute_shape_factors_cell( sx_old_cell, sx_new_cell, x0_old-0.5, x0_new-0.5 );
1111 const int k0_cell_2 = compute_shape_factors_cell( sz_old_cell, sz_new_cell, z0_old-0.5, z0_new-0.5 );
1113 for (
int m=0; m<depos_order; m++) {
1114 sx_cell[m] = (4.0*sx_cell[m] + sx_old_cell[m] + sx_new_cell[m])/6.0;
1115 sz_cell[m] = (4.0*sz_cell[m] + sz_old_cell[m] + sz_new_cell[m])/6.0;
1121 double sx_old_node[depos_order+1] = {0.};
1122 double sx_new_node[depos_order+1] = {0.};
1123 double sz_old_node[depos_order+1] = {0.};
1124 double sz_new_node[depos_order+1] = {0.};
1125 i0_node[ns] = compute_shape_factors_node( sx_old_node, sx_new_node, x0_old, x0_new );
1126 k0_node[ns] = compute_shape_factors_node( sz_old_node, sz_new_node, z0_old, z0_new );
1130 for (
int i=0; i<=depos_order-1; i++) {
1131 for (
int k=0; k<=depos_order; k++) {
1132 const int i_J = lo.
x + i0_cell[ns] + i;
1133 const int k_J = lo.
y + k0_node[ns] + k;
1134 weight = sx_cell[i]*(sz_old_node[k] + sz_new_node[k])/2.0_rt*seg_factor_x;
1135 if constexpr (deposit_J) {
1138 if constexpr (full_mass_matrices) { weight_cellX_nodeZ[ns][i][k] = weight; }
1146 const auto seg_factor_y = std::min(seg_factor_x,seg_factor_z);
1147 for (
int i=0; i<=depos_order; i++) {
1148 for (
int k=0; k<=depos_order; k++) {
1149 const int i_J = lo.
x + i0_node[ns] + i;
1150 const int k_J = lo.
y + k0_node[ns] + k;
1151 weight = ( sx_old_node[i]*sz_old_node[k]*one_third
1152 + sx_old_node[i]*sz_new_node[k]*one_sixth
1153 + sx_new_node[i]*sz_old_node[k]*one_sixth
1154 + sx_new_node[i]*sz_new_node[k]*one_third )*seg_factor_y;
1155 if constexpr (deposit_J) {
1158 if constexpr (full_mass_matrices) { weight_nodeX_nodeZ[ns][i][k] = weight; }
1166 for (
int i=0; i<=depos_order; i++) {
1167 for (
int k=0; k<=depos_order-1; k++) {
1168 const int i_J = lo.
x + i0_node[ns] + i;
1169 const int k_J = lo.
y + k0_cell[ns] + k;
1170 weight = sz_cell[k]*(sx_old_node[i] + sx_new_node[i])/2.0_rt*seg_factor_z;
1171 if constexpr (deposit_J) {
1174 if constexpr (full_mass_matrices) { weight_nodeX_cellZ[ns][i][k] = weight; }
1182 if (ns < num_segments-1) {
1189 if constexpr (full_mass_matrices) {
1191 const int Ncomp_base = 2*depos_order + 2*max_crossings;
1192 const int Ncomp_xx0 = Ncomp_base - 1;
1193 const int Ncomp_xz0 = Ncomp_base;
1194 const int Ncomp_zx0 = Ncomp_base;
1195 const int Ncomp_zz0 = 1 + Ncomp_base;
1196 const int Ncomp_xy0 = Ncomp_base;
1197 const int Ncomp_yx0 = Ncomp_base;
1198 const int Ncomp_yz0 = 1 + Ncomp_base;
1199 const int Ncomp_yy0 = 1 + Ncomp_base;
1200 const int Ncomp_zy0 = 1 + Ncomp_base;
1202 const int width_xx1 = depos_order + max_crossings;
1203 const int width_zz1 = width_xx1 - 1;
1204 const int width_yy1 = width_xx1;
1207 for (
int ns=0; ns<num_segments; ns++) {
1210 for (
int i = 0; i <= depos_order - 1; i++) {
1211 for (
int k = 0; k <= depos_order; k++) {
1212 const int i_J = lo.
x + i0_cell[ns] + i;
1213 const int k_J = lo.
y + k0_node[ns] + k;
1214 const amrex::Real weight_J = weight_cellX_nodeZ[ns][i][k];
1215 for (
int ms=0; ms<num_segments; ms++) {
1216 const int SegShiftX = max_crossings + SegNumX[ms] - SegNumX[ns];
1217 const int SegShiftZ = max_crossings + SegNumZ[ms] - SegNumZ[ns];
1219 for (
int kE = 0; kE <= depos_order; kE++) {
1220 const int row_xx = depos_order - k + kE + SegShiftZ;
1221 const int above_diag = (row_xx > width_xx1) ? 1 : 0;
1222 for (
int iE = 0; iE <= depos_order - 1; iE++) {
1223 const int col_xx = depos_order - 1 - i + iE + SegShiftX;
1224 if (col_xx > Ncomp_xx0 - row_xx - above_diag) {
break; }
1225 const int comp_xx = col_xx + Ncomp_xx0*row_xx;
1226 const amrex::Real weight_E = weight_cellX_nodeZ[ms][iE][kE];
1231 for (
int iE = 0; iE <= depos_order; iE++) {
1232 for (
int kE = 0; kE <= depos_order - 1; kE++) {
1233 const amrex::Real weight_E = weight_nodeX_cellZ[ms][iE][kE];
1234 const int comp_xz = depos_order - 1 - i + iE + SegShiftX
1235 + Ncomp_xz0*(depos_order - k + kE + SegShiftZ);
1240 for (
int iE = 0; iE <= depos_order; iE++) {
1241 for (
int kE = 0; kE <= depos_order; kE++) {
1242 const amrex::Real weight_E = weight_nodeX_nodeZ[ms][iE][kE];
1243 const int comp_xy = depos_order - 1 - i + iE + SegShiftX
1244 + Ncomp_xy0*(depos_order - k + kE + SegShiftZ);
1253 for (
int i=0; i<=depos_order; i++) {
1254 for (
int k=0; k<=depos_order-1; k++) {
1255 const int i_J = lo.
x + i0_node[ns] + i;
1256 const int k_J = lo.
y + k0_cell[ns] + k;
1257 const amrex::Real weight_J = weight_nodeX_cellZ[ns][i][k];
1258 for (
int ms=0; ms<num_segments; ms++) {
1259 const int SegShiftX = max_crossings + SegNumX[ms] - SegNumX[ns];
1260 const int SegShiftZ = max_crossings + SegNumZ[ms] - SegNumZ[ns];
1262 for (
int iE=0; iE<=depos_order-1; iE++) {
1263 for (
int kE=0; kE<=depos_order; kE++) {
1264 const amrex::Real weight_E = weight_cellX_nodeZ[ms][iE][kE];
1265 const int comp_zx = depos_order - i + iE + SegShiftX
1266 + Ncomp_zx0*(depos_order-1 - k + kE + SegShiftZ);
1271 for (
int kE=0; kE<=depos_order-1; kE++) {
1272 const int row_zz = depos_order - 1 - k + kE + SegShiftZ;
1273 const int above_diag = (row_zz > width_zz1) ? 1 : 0;
1274 for (
int iE=0; iE<=depos_order; iE++) {
1275 const int col_zz = depos_order - i + iE + SegShiftX;
1276 if (col_zz > Ncomp_zz0 - 2 - row_zz - above_diag) {
break; }
1277 const int comp_zz = col_zz + Ncomp_zz0*row_zz;
1278 const amrex::Real weight_E = weight_nodeX_cellZ[ms][iE][kE];
1283 for (
int iE=0; iE<=depos_order; iE++) {
1284 for (
int kE=0; kE<=depos_order; kE++) {
1285 const amrex::Real weight_E = weight_nodeX_nodeZ[ms][iE][kE];
1286 const int comp_zy = depos_order - i + iE + SegShiftX
1287 + Ncomp_zy0*(depos_order-1 - k + kE + SegShiftZ);
1296 for (
int i=0; i<=depos_order; i++) {
1297 for (
int k=0; k<=depos_order; k++) {
1298 const int i_J = lo.
x + i0_node[ns] + i;
1299 const int k_J = lo.
y + k0_node[ns] + k;
1300 const amrex::Real weight_J = weight_nodeX_nodeZ[ns][i][k];
1301 for (
int ms=0; ms<num_segments; ms++) {
1302 const int SegShiftX = max_crossings + SegNumX[ms] - SegNumX[ns];
1303 const int SegShiftZ = max_crossings + SegNumZ[ms] - SegNumZ[ns];
1305 for (
int iE=0; iE<=depos_order-1; iE++) {
1306 for (
int kE=0; kE<=depos_order; kE++) {
1307 const amrex::Real weight_E = weight_cellX_nodeZ[ms][iE][kE];
1308 const int comp_yx = depos_order - i + iE + SegShiftX
1309 + Ncomp_yx0*(depos_order - k + kE + SegShiftZ);
1314 for (
int iE=0; iE<=depos_order; iE++) {
1315 for (
int kE=0; kE<=depos_order-1; kE++) {
1316 const amrex::Real weight_E = weight_nodeX_cellZ[ms][iE][kE];
1317 const int comp_yz = depos_order - i + iE + SegShiftX
1318 + Ncomp_yz0*(depos_order - k + kE + SegShiftZ);
1323 for (
int kE=0; kE<=depos_order; kE++) {
1324 const int row_yy = depos_order - k + kE + SegShiftZ;
1325 const int above_diag = (row_yy > width_yy1) ? 1 : 0;
1326 for (
int iE=0; iE<=depos_order; iE++) {
1327 const int col_yy = depos_order - i + iE + SegShiftX;
1328 if (col_yy > Ncomp_yy0 - 1 - row_yy - above_diag) {
break; }
1329 const int comp_yy = col_yy + Ncomp_yy0*row_yy;
1330 const amrex::Real weight_E = weight_nodeX_nodeZ[ms][iE][kE];
1343#elif defined(WARPX_DIM_RCYLINDER) || defined(WARPX_DIM_RSPHERE)
1346 const auto i_old =
static_cast<int>(x_old-
shift);
1347 const auto i_new =
static_cast<int>(x_new-
shift);
1348 const int cell_crossings_x = std::abs(i_new-i_old);
1349 num_segments += cell_crossings_x;
1353 const auto dirX_sign =
static_cast<double>(dxp < 0. ? -1. : 1.);
1354 double Xcell =
static_cast<double>(i_old) +
shift + 0.5*(1.-dirX_sign);
1361 double x0_old = x_old;
1363 for (
int ns=0; ns<num_segments; ns++) {
1365 if (ns == num_segments-1) {
1367 dxp_seg = x0_new - x0_old;
1370 Xcell = Xcell + dirX_sign;
1372 dxp_seg = x0_new - x0_old;
1376 const auto seg_factor =
static_cast<amrex::Real>(dxp == 0. ? 1._rt : dxp_seg/dxp);
1380 double sx_cell[depos_order] = {0.};
1381 double const x0_bar = (x0_new + x0_old)/2.0;
1382 const int i0_cell = compute_shape_factor_cell( sx_cell, x0_bar-0.5 );
1384 if constexpr (depos_order >= 3) {
1386 double sx_old_cell[depos_order] = {0.};
1387 double sx_new_cell[depos_order] = {0.};
1388 const int i0_cell_2 = compute_shape_factors_cell( sx_old_cell, sx_new_cell, x0_old-0.5, x0_new-0.5 );
1390 for (
int m=0; m<depos_order; m++) {
1391 sx_cell[m] = (4.0*sx_cell[m] + sx_old_cell[m] + sx_new_cell[m])/6.0;
1397 double sx_old_node[depos_order+1] = {0.};
1398 double sx_new_node[depos_order+1] = {0.};
1399 const int i0_node = compute_shape_factors_node( sx_old_node, sx_new_node, x0_old, x0_new );
1402 for (
int i=0; i<=depos_order; i++) {
1403 const amrex::Real weight = 0.5_rt*(sx_old_node[i] + sx_new_node[i])*seg_factor;
1404 if constexpr (deposit_J) {
1414 for (
int i=0; i<=depos_order-1; i++) {
1416 if constexpr (deposit_J) {
1424 if (ns < num_segments-1) {
1430#elif defined(WARPX_DIM_1D_Z)
1433 const auto k_old =
static_cast<int>(z_old-
shift);
1434 const auto k_new =
static_cast<int>(z_new-
shift);
1435 const int cell_crossings_z = std::abs(k_new-k_old);
1436 num_segments += cell_crossings_z;
1440 const auto dirZ_sign =
static_cast<double>(dzp < 0. ? -1. : 1.);
1441 double Zcell =
static_cast<double>(k_old) +
shift + 0.5*(1.-dirZ_sign);
1448 double z0_old = z_old;
1450 constexpr int num_segments_max = 1 + 4*AMREX_SPACEDIM;
1452 "Error: num_segments must be less than or equal to 1 + 4*AMREX_SPACEDIM.");
1455 int k0_cell[num_segments_max];
1456 int k0_node[num_segments_max];
1457 amrex::Real weight_cell[num_segments_max][depos_order];
1458 amrex::Real weight_node[num_segments_max][depos_order+1];
1460 const auto k_mid =
static_cast<int>(0.5*(z_new+z_old)-
shift);
1461 int SegNum[num_segments_max];
1463 for (
int ns=0; ns<num_segments; ns++) {
1465 if (ns == num_segments-1) {
1467 dzp_seg = z0_new - z0_old;
1470 Zcell = Zcell + dirZ_sign;
1472 dzp_seg = z0_new - z0_old;
1476 const auto seg_factor =
static_cast<amrex::Real>(dzp == 0. ? 1._rt : dzp_seg/dzp);
1480 double sz_cell[depos_order] = {0.};
1481 double const z0_bar = (z0_new + z0_old)/2.0;
1482 k0_cell[ns] = compute_shape_factor_cell( sz_cell, z0_bar-0.5 );
1485 if constexpr (full_mass_matrices) {
1486 const auto k0_mid =
static_cast<int>(z0_bar-
shift);
1487 SegNum[ns] = 1 + k0_mid - k_mid;
1490 if constexpr (depos_order >= 3) {
1492 double sz_old_cell[depos_order] = {0.};
1493 double sz_new_cell[depos_order] = {0.};
1494 const int k0_cell_2 = compute_shape_factors_cell( sz_old_cell, sz_new_cell, z0_old-0.5, z0_new-0.5 );
1496 for (
int m=0; m<depos_order; m++) {
1497 sz_cell[m] = (4.0*sz_cell[m] + sz_old_cell[m] + sz_new_cell[m])/6.0;
1503 double sz_old_node[depos_order+1] = {0.};
1504 double sz_new_node[depos_order+1] = {0.};
1505 k0_node[ns] = compute_shape_factors_node( sz_old_node, sz_new_node, z0_old, z0_new );
1508 for (
int k=0; k<=depos_order; k++) {
1509 const amrex::Real weight = 0.5_rt*(sz_old_node[k] + sz_new_node[k])*seg_factor;
1510 const int k_J = lo.
x + k0_node[ns] + k;
1511 if constexpr (deposit_J) {
1515 if constexpr (full_mass_matrices) { weight_node[ns][k] = weight; }
1523 for (
int k=0; k<=depos_order-1; k++) {
1525 const int k_J = lo.
x + k0_cell[ns] + k;
1526 if constexpr (deposit_J) {
1529 if constexpr (full_mass_matrices) { weight_cell[ns][k] = weight; }
1536 if (ns < num_segments-1) {
1542 if constexpr (full_mass_matrices) {
1544 const int width_zz = depos_order - 1 + max_crossings;
1545 const int width_yy = depos_order + max_crossings;
1548 for (
int ns=0; ns<num_segments; ns++) {
1551 for (
int k=0; k<=depos_order; k++) {
1553 const int k_J = lo.
x + k0_node[ns] + k;
1555 for (
int ms=0; ms<num_segments; ms++) {
1556 const int SegShift = max_crossings + SegNum[ms] - SegNum[ns];
1557 for (
int kE=0; kE<=depos_order; kE++) {
1559 const int comp_yy = depos_order - k + kE + SegShift;
1560 if (comp_yy <= width_yy) {
1567 for (
int kE=0; kE<=depos_order-1; kE++) {
1569 const int comp_yz = depos_order - k + kE + SegShift;
1578 for (
int k=0; k<=depos_order-1; k++) {
1580 const int k_J = lo.
x + k0_cell[ns] + k;
1582 for (
int ms=0; ms<num_segments; ms++) {
1583 const int SegShift = max_crossings + SegNum[ms] - SegNum[ns];
1584 for (
int kE=0; kE<=depos_order-1; kE++) {
1585 const int comp_zz = depos_order - 1 - k + kE + SegShift;
1586 if (comp_zz > width_zz) {
break; }
1590 for (
int kE=0; kE<=depos_order; kE++) {
1592 const int comp_zy = depos_order-1 - k + kE + SegShift;