157#if !defined(WARPX_DIM_1D_Z)
161 const double xmid = (xp - xyzmin.
x)*dinv.
x;
168 double sx_node[depos_order + 1] = {0.};
169 double sx_cell[depos_order + 1] = {0.};
172 if (jx_type[0] == NODE || jy_type[0] == NODE || jz_type[0] == NODE) {
173 j_node = compute_shape_factor(sx_node, xmid);
175 if (jx_type[0] == CELL || jy_type[0] == CELL || jz_type[0] == CELL) {
176 j_cell = compute_shape_factor(sx_cell, xmid - 0.5);
180 if (j_node==j_cell) {
shift[0] = 1; }
185 for (
int ix=0; ix<=depos_order; ix++)
192 int const j_jx = ((jx_type[0] == NODE) ? j_node : j_cell);
193 int const j_jy = ((jy_type[0] == NODE) ? j_node : j_cell);
194 int const j_jz = ((jz_type[0] == NODE) ? j_node : j_cell);
197#if defined(WARPX_DIM_3D)
200 const double ymid = (yp - xyzmin.
y)*dinv.
y;
201 double sy_node[depos_order + 1] = {0.};
202 double sy_cell[depos_order + 1] = {0.};
205 if (jx_type[1] == NODE || jy_type[1] == NODE || jz_type[1] == NODE) {
206 k_node = compute_shape_factor(sy_node, ymid);
208 if (jx_type[1] == CELL || jy_type[1] == CELL || jz_type[1] == CELL) {
209 k_cell = compute_shape_factor(sy_cell, ymid - 0.5);
213 if (k_node==k_cell) {
shift[1] = 1; }
218 for (
int iy=0; iy<=depos_order; iy++)
224 int const k_jx = ((jx_type[1] == NODE) ? k_node : k_cell);
225 int const k_jy = ((jy_type[1] == NODE) ? k_node : k_cell);
226 int const k_jz = ((jz_type[1] == NODE) ? k_node : k_cell);
229#if !defined(WARPX_DIM_RCYLINDER) && !defined(WARPX_DIM_RSPHERE)
232 constexpr int zdir = WARPX_ZINDEX;
233 const double zmid = (zp - xyzmin.
z)*dinv.
z;
234 double sz_node[depos_order + 1] = {0.};
235 double sz_cell[depos_order + 1] = {0.};
238 if (jx_type[zdir] == NODE || jy_type[zdir] == NODE || jz_type[zdir] == NODE) {
239 l_node = compute_shape_factor(sz_node, zmid);
241 if (jx_type[zdir] == CELL || jy_type[zdir] == CELL || jz_type[zdir] == CELL) {
242 l_cell = compute_shape_factor(sz_cell, zmid - 0.5);
247 for (
int iz = 0; iz <= depos_order; iz++)
253 int const l_jx = ((jx_type[zdir] == NODE) ? l_node : l_cell);
254 int const l_jy = ((jy_type[zdir] == NODE) ? l_node : l_cell);
255 int const l_jz = ((jz_type[zdir] == NODE) ? l_node : l_cell);
258 if (l_node==l_cell) {
shift[zdir] = 1; }
264 for (
int dir = 0; dir < AMREX_SPACEDIM; dir++) {
265 offset_xy[dir] = (jx_type[dir] + jy_type[dir]) % 2;
266 offset_xz[dir] = (jx_type[dir] + jz_type[dir]) % 2;
267 offset_yz[dir] = (jy_type[dir] + jz_type[dir]) % 2;
271#if defined(WARPX_DIM_1D_Z)
272 for (
int iz = 0; iz <= depos_order; iz++){
273 if constexpr (deposit_J) {
280 if constexpr (full_mass_matrices) {
281 for (
int aa = 0; aa <= depos_order; aa++){
283 const int col_base = depos_order + aa - iz;
295 Nc = col_base +
shift[0]*offset_xy[0];
297 Nc = col_base +
shift[0]*offset_xz[0];
301 Nc = col_base +
shift[0]*offset_xy[0];
303 Nc = col_base +
shift[0]*offset_yz[0];
307 Nc = col_base + 1 -
shift[0]*offset_xz[0];
309 Nc = col_base + 1 -
shift[0]*offset_yz[0];
319#elif defined(WARPX_DIM_RCYLINDER) || defined(WARPX_DIM_RSPHERE)
320 for (
int ix = 0; ix <= depos_order; ix++){
321 if constexpr (deposit_J) {
330#elif defined(WARPX_DIM_XZ) || defined(WARPX_DIM_RZ)
331 const int base_offset = 1 + 2*depos_order;
333 for (
int iz = 0; iz <= depos_order; iz++){
335 for (
int ix=0; ix<=depos_order; ix++){
341 if constexpr (deposit_J) {
348 if constexpr (full_mass_matrices) {
350 const int Ncomp0 = 1 + 2*depos_order;
352 for (
int bb = 0; bb <= depos_order; bb++){
354 const int row_base = depos_order + bb - iz;
356 for (
int aa = 0; aa <= depos_order; aa++){
357 const int col_base = depos_order + aa - ix;
366 if (col_base <= Ncomp0 - row_base) {
368 Nc = col_base + row_base*
offset;
370 &Sxx_arr(lo.
x+j_jx+ix, lo.
y+l_jx+iz, 0, Nc),
371 weight_Jx*weight_Ex*fpxx);
373 &Syy_arr(lo.
x+j_jy+ix, lo.
y+l_jy+iz, 0, Nc),
374 weight_Jy*weight_Ey*fpyy);
376 &Szz_arr(lo.
x+j_jz+ix, lo.
y+l_jz+iz, 0, Nc),
377 weight_Jz*weight_Ez*fpzz);
381 offset = base_offset + offset_xy[0];
382 Nc = col_base + 1 -
shift[0]*offset_xy[0]
385 &Sxy_arr(lo.
x+j_jx+ix, lo.
y+l_jx+iz, 0, Nc),
386 weight_Jx*weight_Ey*fpxy);
387 offset = base_offset + offset_xz[0];
388 Nc = col_base + 1 -
shift[0]*offset_xz[0]
391 &Sxz_arr(lo.
x+j_jx+ix, lo.
y+l_jx+iz, 0, Nc),
392 weight_Jx*weight_Ez*fpxz);
395 offset = base_offset + offset_xy[0];
396 Nc = col_base +
shift[0]*offset_xy[0]
399 &Syx_arr(lo.
x+j_jy+ix, lo.
y+l_jy+iz, 0, Nc),
400 weight_Jy*weight_Ex*fpyx);
401 offset = base_offset + offset_yz[0];
402 Nc = col_base +
shift[0]*offset_yz[0]
405 &Syz_arr(lo.
x+j_jy+ix, lo.
y+l_jy+iz, 0, Nc),
406 weight_Jy*weight_Ez*fpyz);
409 offset = base_offset + offset_xz[0];
410 Nc = col_base +
shift[0]*offset_xz[0]
413 &Szx_arr(lo.
x+j_jz+ix, lo.
y+l_jz+iz, 0, Nc),
414 weight_Jz*weight_Ex*fpzx);
415 offset = base_offset + offset_yz[0];
416 Nc = col_base +
shift[0]*offset_yz[0]
419 &Szy_arr(lo.
x+j_jz+ix, lo.
y+l_jz+iz, 0, Nc),
420 weight_Jz*weight_Ey*fpzy);
433#elif defined(WARPX_DIM_3D)
434 for (
int iz = 0; iz <= depos_order; iz++){
435 for (
int iy = 0; iy <= depos_order; iy++){
436 for (
int ix = 0; ix <= depos_order; ix++){
437 const amrex::Real weight_Jx = sx_jx[ix]*sy_jx[iy]*sz_jx[iz];
438 const amrex::Real weight_Jy = sx_jy[ix]*sy_jy[iy]*sz_jy[iz];
439 const amrex::Real weight_Jz = sx_jz[ix]*sy_jz[iy]*sz_jz[iz];
441 if constexpr (deposit_J) {
448 if constexpr (full_mass_matrices) {
663 [[maybe_unused]]
int max_crossings,
683#if (AMREX_SPACEDIM > 1)
689#if defined(WARPX_DIM_RZ) || defined(WARPX_DIM_RCYLINDER)
690 amrex::Real const xp_mid = (xp_new + xp_old)*0.5_rt;
691 amrex::Real const yp_mid = (yp_new + yp_old)*0.5_rt;
692 amrex::Real const rp_new = std::sqrt(xp_new*xp_new + yp_new*yp_new);
693 amrex::Real const rp_old = std::sqrt(xp_old*xp_old + yp_old*yp_old);
694 amrex::Real const rp_mid = (rp_new + rp_old)/2._rt;
695 amrex::Real const costheta_mid = (rp_mid > 0._rt ? xp_mid/rp_mid : 1._rt);
696 amrex::Real const sintheta_mid = (rp_mid > 0._rt ? yp_mid/rp_mid : 0._rt);
699 double x_new = (rp_new - xyzmin.
x)*dinv.
x;
700 double const x_old = (rp_old - xyzmin.
x)*dinv.
x;
702 amrex::Real const vy = (-uxp_mid*sintheta_mid + uyp_mid*costheta_mid)*gaminv;
703#if defined(WARPX_DIM_RCYLINDER)
706#elif defined(WARPX_DIM_RSPHERE)
707 amrex::Real const xp_mid = (xp_new + xp_old)*0.5_rt;
708 amrex::Real const yp_mid = (yp_new + yp_old)*0.5_rt;
709 amrex::Real const zp_mid = (zp_new + zp_old)*0.5_rt;
710 amrex::Real const rpxy_new = std::sqrt(xp_new*xp_new + yp_new*yp_new);
711 amrex::Real const rp_new = std::sqrt(xp_new*xp_new + yp_new*yp_new + zp_new*zp_new);
712 amrex::Real const rpxy_old = std::sqrt(xp_old*xp_old + yp_old*yp_old);
713 amrex::Real const rp_old = std::sqrt(xp_old*xp_old + yp_old*yp_old + zp_old*zp_old);
714 amrex::Real const rpxy_mid = (rpxy_new + rpxy_old)*0.5_rt;
715 amrex::Real const rp_mid = (rp_new + rp_old)*0.5_rt;
716 amrex::Real const costheta_mid = (rpxy_mid > 0._rt ? xp_mid/rpxy_mid : 1._rt);
717 amrex::Real const sintheta_mid = (rpxy_mid > 0._rt ? yp_mid/rpxy_mid : 0._rt);
718 amrex::Real const cosphi_mid = (rp_mid > 0._rt ? rpxy_mid/rp_mid : 1._rt);
719 amrex::Real const sinphi_mid = (rp_mid > 0._rt ? zp_mid/rp_mid : 0._rt);
722 double x_new = (rp_new - xyzmin.
x)*dinv.
x;
723 double const x_old = (rp_old - xyzmin.
x)*dinv.
x;
725 amrex::Real const vy = (-uxp_mid*sintheta_mid + uyp_mid*costheta_mid)*gaminv;
726 amrex::Real const vz = (-uxp_mid*costheta_mid*cosphi_mid - uyp_mid*sintheta_mid*cosphi_mid + uzp_mid*sinphi_mid)*gaminv;
727#elif defined(WARPX_DIM_XZ)
729 double x_new = (xp_new - xyzmin.
x)*dinv.
x;
730 double const x_old = (xp_old - xyzmin.
x)*dinv.
x;
733#elif defined(WARPX_DIM_1D_Z)
736#elif defined(WARPX_DIM_3D)
738 double x_new = (xp_new - xyzmin.
x)*dinv.
x;
739 double const x_old = (xp_old - xyzmin.
x)*dinv.
x;
740 double y_new = (yp_new - xyzmin.
y)*dinv.
y;
741 double const y_old = (yp_old - xyzmin.
y)*dinv.
y;
746#if !defined(WARPX_DIM_RCYLINDER) && !defined(WARPX_DIM_RSPHERE)
748 double z_new = (zp_new - xyzmin.
z)*dinv.
z;
749 double const z_old = (zp_old - xyzmin.
z)*dinv.
z;
759#if !defined(WARPX_DIM_1D_Z)
760 const double dxp = x_new - x_old;
762#if defined(WARPX_DIM_3D)
763 const double dyp = y_new - y_old;
765#if !defined(WARPX_DIM_RCYLINDER) && !defined(WARPX_DIM_RSPHERE)
766 const double dzp = z_new - z_old;
770#if defined(WARPX_DIM_3D)
772 domain_double[0][0], domain_double[0][1], do_cropping[0]);
774 domain_double[1][0], domain_double[1][1], do_cropping[1]);
776 domain_double[2][0], domain_double[2][1], do_cropping[2]);
777#elif defined(WARPX_DIM_XZ) || defined(WARPX_DIM_RZ)
779 domain_double[0][0], domain_double[0][1], do_cropping[0]);
781 domain_double[1][0], domain_double[1][1], do_cropping[1]);
782#elif defined(WARPX_DIM_1D_Z)
784#elif defined(WARPX_DIM_RCYLINDER) || defined(WARPX_DIM_RSPHERE)
794 int num_segments = 1;
796 if ( (depos_order % 2) == 0 ) {
shift = 0.5; }
798#if defined(WARPX_DIM_3D)
801 const auto i_old =
static_cast<int>(x_old-
shift);
802 const auto i_new =
static_cast<int>(x_new-
shift);
803 const int cell_crossings_x = std::abs(i_new-i_old);
804 num_segments += cell_crossings_x;
807 const auto j_old =
static_cast<int>(y_old-
shift);
808 const auto j_new =
static_cast<int>(y_new-
shift);
809 const int cell_crossings_y = std::abs(j_new-j_old);
810 num_segments += cell_crossings_y;
813 const auto k_old =
static_cast<int>(z_old-
shift);
814 const auto k_new =
static_cast<int>(z_new-
shift);
815 const int cell_crossings_z = std::abs(k_new-k_old);
816 num_segments += cell_crossings_z;
821 const auto dirX_sign =
static_cast<double>(dxp < 0. ? -1. : 1.);
822 const auto dirY_sign =
static_cast<double>(dyp < 0. ? -1. : 1.);
823 const auto dirZ_sign =
static_cast<double>(dzp < 0. ? -1. : 1.);
824 double Xcell = 0., Ycell = 0., Zcell = 0.;
825 if (num_segments > 1) {
826 Xcell =
static_cast<double>(i_old) +
shift + 0.5*(1.-dirX_sign);
827 Ycell =
static_cast<double>(j_old) +
shift + 0.5*(1.-dirY_sign);
828 Zcell =
static_cast<double>(k_old) +
shift + 0.5*(1.-dirZ_sign);
834 double dxp_seg, dyp_seg, dzp_seg;
835 double x0_new, y0_new, z0_new;
836 double x0_old = x_old;
837 double y0_old = y_old;
838 double z0_old = z_old;
840 for (
int ns=0; ns<num_segments; ns++) {
842 if (ns == num_segments-1) {
847 dxp_seg = x0_new - x0_old;
848 dyp_seg = y0_new - y0_old;
849 dzp_seg = z0_new - z0_old;
854 x0_new = Xcell + dirX_sign;
855 y0_new = Ycell + dirY_sign;
856 z0_new = Zcell + dirZ_sign;
857 dxp_seg = x0_new - x0_old;
858 dyp_seg = y0_new - y0_old;
859 dzp_seg = z0_new - z0_old;
861 if ( (dyp == 0. || std::abs(dxp_seg) < std::abs(dxp/dyp*dyp_seg))
862 && (dzp == 0. || std::abs(dxp_seg) < std::abs(dxp/dzp*dzp_seg)) ) {
864 dyp_seg = dyp/dxp*dxp_seg;
865 dzp_seg = dzp/dxp*dxp_seg;
866 y0_new = y0_old + dyp_seg;
867 z0_new = z0_old + dzp_seg;
869 else if (dzp == 0. || std::abs(dyp_seg) < std::abs(dyp/dzp*dzp_seg)) {
871 dxp_seg = dxp/dyp*dyp_seg;
872 dzp_seg = dzp/dyp*dyp_seg;
873 x0_new = x0_old + dxp_seg;
874 z0_new = z0_old + dzp_seg;
878 dxp_seg = dxp/dzp*dzp_seg;
879 dyp_seg = dyp/dzp*dzp_seg;
880 x0_new = x0_old + dxp_seg;
881 y0_new = y0_old + dyp_seg;
887 const auto seg_factor_x =
static_cast<amrex::Real>(dxp == 0. ? 1._rt : dxp_seg/dxp);
888 const auto seg_factor_y =
static_cast<amrex::Real>(dyp == 0. ? 1._rt : dyp_seg/dyp);
889 const auto seg_factor_z =
static_cast<amrex::Real>(dzp == 0. ? 1._rt : dzp_seg/dzp);
893 double sx_cell[depos_order] = {0.};
894 double sy_cell[depos_order] = {0.};
895 double sz_cell[depos_order] = {0.};
896 double const x0_bar = (x0_new + x0_old)/2.0;
897 double const y0_bar = (y0_new + y0_old)/2.0;
898 double const z0_bar = (z0_new + z0_old)/2.0;
899 const int i0_cell = compute_shape_factor_cell( sx_cell, x0_bar-0.5 );
900 const int j0_cell = compute_shape_factor_cell( sy_cell, y0_bar-0.5 );
901 const int k0_cell = compute_shape_factor_cell( sz_cell, z0_bar-0.5 );
903 if constexpr (depos_order >= 3) {
905 double sx_old_cell[depos_order] = {0.};
906 double sx_new_cell[depos_order] = {0.};
907 double sy_old_cell[depos_order] = {0.};
908 double sy_new_cell[depos_order] = {0.};
909 double sz_old_cell[depos_order] = {0.};
910 double sz_new_cell[depos_order] = {0.};
911 const int i0_cell_2 = compute_shape_factors_cell( sx_old_cell, sx_new_cell, x0_old-0.5, x0_new-0.5 );
912 const int j0_cell_2 = compute_shape_factors_cell( sy_old_cell, sy_new_cell, y0_old-0.5, y0_new-0.5 );
913 const int k0_cell_2 = compute_shape_factors_cell( sz_old_cell, sz_new_cell, z0_old-0.5, z0_new-0.5 );
915 for (
int m=0; m<depos_order; m++) {
916 sx_cell[m] = (4.0*sx_cell[m] + sx_old_cell[m] + sx_new_cell[m])/6.0;
917 sy_cell[m] = (4.0*sy_cell[m] + sy_old_cell[m] + sy_new_cell[m])/6.0;
918 sz_cell[m] = (4.0*sz_cell[m] + sz_old_cell[m] + sz_new_cell[m])/6.0;
924 double sx_old_node[depos_order+1] = {0.};
925 double sx_new_node[depos_order+1] = {0.};
926 double sy_old_node[depos_order+1] = {0.};
927 double sy_new_node[depos_order+1] = {0.};
928 double sz_old_node[depos_order+1] = {0.};
929 double sz_new_node[depos_order+1] = {0.};
930 const int i0_node = compute_shape_factors_node( sx_old_node, sx_new_node, x0_old, x0_new );
931 const int j0_node = compute_shape_factors_node( sy_old_node, sy_new_node, y0_old, y0_new );
932 const int k0_node = compute_shape_factors_node( sz_old_node, sz_new_node, z0_old, z0_new );
936 for (
int i = 0; i <= depos_order - 1; i++) {
937 for (
int j = 0; j <= depos_order; j++) {
938 for (
int k = 0; k <= depos_order; k++) {
939 weight = sx_cell[i]*( sy_old_node[j]*sz_old_node[k]*one_third
940 + sy_old_node[j]*sz_new_node[k]*one_sixth
941 + sy_new_node[j]*sz_old_node[k]*one_sixth
942 + sy_new_node[j]*sz_new_node[k]*one_third )*seg_factor_x;
943 if constexpr (deposit_J) {
952 for (
int i = 0; i <= depos_order; i++) {
953 for (
int j = 0; j <= depos_order - 1; j++) {
954 for (
int k = 0; k <= depos_order; k++) {
955 weight = sy_cell[j]*( sx_old_node[i]*sz_old_node[k]*one_third
956 + sx_old_node[i]*sz_new_node[k]*one_sixth
957 + sx_new_node[i]*sz_old_node[k]*one_sixth
958 + sx_new_node[i]*sz_new_node[k]*one_third )*seg_factor_y;
959 if constexpr (deposit_J) {
968 for (
int i = 0; i <= depos_order; i++) {
969 for (
int j = 0; j <= depos_order; j++) {
970 for (
int k = 0; k <= depos_order - 1; k++) {
971 weight = sz_cell[k]*( sx_old_node[i]*sy_old_node[j]*one_third
972 + sx_old_node[i]*sy_new_node[j]*one_sixth
973 + sx_new_node[i]*sy_old_node[j]*one_sixth
974 + sx_new_node[i]*sy_new_node[j]*one_third )*seg_factor_z;
975 if constexpr (deposit_J) {
984 if (ns < num_segments-1) {
992#elif defined(WARPX_DIM_XZ) || defined(WARPX_DIM_RZ)
995 const auto i_old =
static_cast<int>(x_old-
shift);
996 const auto i_new =
static_cast<int>(x_new-
shift);
997 const int cell_crossings_x = std::abs(i_new-i_old);
998 num_segments += cell_crossings_x;
1001 const auto k_old =
static_cast<int>(z_old-
shift);
1002 const auto k_new =
static_cast<int>(z_new-
shift);
1003 const int cell_crossings_z = std::abs(k_new-k_old);
1004 num_segments += cell_crossings_z;
1009 const auto dirX_sign =
static_cast<double>(dxp < 0. ? -1. : 1.);
1010 const auto dirZ_sign =
static_cast<double>(dzp < 0. ? -1. : 1.);
1011 double Xcell = 0., Zcell = 0.;
1012 if (num_segments > 1) {
1013 Xcell =
static_cast<double>(i_old) +
shift + 0.5*(1.-dirX_sign);
1014 Zcell =
static_cast<double>(k_old) +
shift + 0.5*(1.-dirZ_sign);
1020 double dxp_seg, dzp_seg;
1021 double x0_new, z0_new;
1022 double x0_old = x_old;
1023 double z0_old = z_old;
1025 constexpr int num_segments_max = 1 + 4*AMREX_SPACEDIM;
1027 "Error: num_segments must be less than or equal to 1 + 4*AMREX_SPACEDIM.");
1030 int i0_cell[num_segments_max];
1031 int i0_node[num_segments_max];
1032 int k0_cell[num_segments_max];
1033 int k0_node[num_segments_max];
1034 amrex::Real weight_cellX_nodeZ[num_segments_max][depos_order][depos_order+1];
1035 amrex::Real weight_nodeX_cellZ[num_segments_max][depos_order+1][depos_order];
1036 amrex::Real weight_nodeX_nodeZ[num_segments_max][depos_order+1][depos_order+1];
1038 const auto i_mid =
static_cast<int>(0.5*(x_new+x_old)-
shift);
1039 const auto k_mid =
static_cast<int>(0.5*(z_new+z_old)-
shift);
1040 int SegNumX[num_segments_max];
1041 int SegNumZ[num_segments_max];
1043 for (
int ns = 0; ns < num_segments; ns++) {
1045 if (ns == num_segments-1) {
1049 dxp_seg = x0_new - x0_old;
1050 dzp_seg = z0_new - z0_old;
1055 x0_new = Xcell + dirX_sign;
1056 z0_new = Zcell + dirZ_sign;
1057 dxp_seg = x0_new - x0_old;
1058 dzp_seg = z0_new - z0_old;
1060 if (dzp == 0. || std::abs(dxp_seg) < std::abs(dxp/dzp*dzp_seg)) {
1062 dzp_seg = dzp/dxp*dxp_seg;
1063 z0_new = z0_old + dzp_seg;
1067 dxp_seg = dxp/dzp*dzp_seg;
1068 x0_new = x0_old + dxp_seg;
1074 const auto seg_factor_x =
static_cast<amrex::Real>(dxp == 0. ? 1._rt : dxp_seg/dxp);
1075 const auto seg_factor_z =
static_cast<amrex::Real>(dzp == 0. ? 1._rt : dzp_seg/dzp);
1079 double sx_cell[depos_order] = {0.};
1080 double sz_cell[depos_order] = {0.};
1081 double const x0_bar = (x0_new + x0_old)/2.0;
1082 double const z0_bar = (z0_new + z0_old)/2.0;
1083 i0_cell[ns] = compute_shape_factor_cell( sx_cell, x0_bar-0.5 );
1084 k0_cell[ns] = compute_shape_factor_cell( sz_cell, z0_bar-0.5 );
1087 if constexpr (full_mass_matrices) {
1088 const auto i0_mid =
static_cast<int>(x0_bar-
shift);
1089 const auto k0_mid =
static_cast<int>(z0_bar-
shift);
1090 SegNumX[ns] = 1 + i0_mid - i_mid;
1091 SegNumZ[ns] = 1 + k0_mid - k_mid;
1094 if constexpr (depos_order >= 3) {
1096 double sx_old_cell[depos_order] = {0.};
1097 double sx_new_cell[depos_order] = {0.};
1098 double sz_old_cell[depos_order] = {0.};
1099 double sz_new_cell[depos_order] = {0.};
1100 const int i0_cell_2 = compute_shape_factors_cell( sx_old_cell, sx_new_cell, x0_old-0.5, x0_new-0.5 );
1101 const int k0_cell_2 = compute_shape_factors_cell( sz_old_cell, sz_new_cell, z0_old-0.5, z0_new-0.5 );
1103 for (
int m = 0; m < depos_order; m++) {
1104 sx_cell[m] = (4.0*sx_cell[m] + sx_old_cell[m] + sx_new_cell[m])/6.0;
1105 sz_cell[m] = (4.0*sz_cell[m] + sz_old_cell[m] + sz_new_cell[m])/6.0;
1111 double sx_old_node[depos_order+1] = {0.};
1112 double sx_new_node[depos_order+1] = {0.};
1113 double sz_old_node[depos_order+1] = {0.};
1114 double sz_new_node[depos_order+1] = {0.};
1115 i0_node[ns] = compute_shape_factors_node( sx_old_node, sx_new_node, x0_old, x0_new );
1116 k0_node[ns] = compute_shape_factors_node( sz_old_node, sz_new_node, z0_old, z0_new );
1120 for (
int i = 0; i <= depos_order - 1; i++) {
1121 for (
int k = 0; k <= depos_order; k++) {
1122 const int i_J = lo.
x + i0_cell[ns] + i;
1123 const int k_J = lo.
y + k0_node[ns] + k;
1124 weight = sx_cell[i]*(sz_old_node[k] + sz_new_node[k])/2.0_rt*seg_factor_x;
1125 if constexpr (deposit_J) {
1128 if constexpr (full_mass_matrices) { weight_cellX_nodeZ[ns][i][k] = weight; }
1136 const auto seg_factor_y = std::min(seg_factor_x,seg_factor_z);
1137 for (
int i = 0; i <= depos_order; i++) {
1138 for (
int k = 0; k <= depos_order; k++) {
1139 const int i_J = lo.
x + i0_node[ns] + i;
1140 const int k_J = lo.
y + k0_node[ns] + k;
1141 weight = ( sx_old_node[i]*sz_old_node[k]*one_third
1142 + sx_old_node[i]*sz_new_node[k]*one_sixth
1143 + sx_new_node[i]*sz_old_node[k]*one_sixth
1144 + sx_new_node[i]*sz_new_node[k]*one_third )*seg_factor_y;
1145 if constexpr (deposit_J) {
1148 if constexpr (full_mass_matrices) { weight_nodeX_nodeZ[ns][i][k] = weight; }
1156 for (
int i = 0; i <= depos_order; i++) {
1157 for (
int k = 0; k <= depos_order - 1; k++) {
1158 const int i_J = lo.
x + i0_node[ns] + i;
1159 const int k_J = lo.
y + k0_cell[ns] + k;
1160 weight = sz_cell[k]*(sx_old_node[i] + sx_new_node[i])/2.0_rt*seg_factor_z;
1161 if constexpr (deposit_J) {
1164 if constexpr (full_mass_matrices) { weight_nodeX_cellZ[ns][i][k] = weight; }
1172 if (ns < num_segments - 1) {
1179 if constexpr (full_mass_matrices) {
1181 const int Ncomp_base = 2*depos_order + 2*max_crossings;
1182 const int Ncomp_xx0 = Ncomp_base - 1;
1183 const int Ncomp_xz0 = Ncomp_base;
1184 const int Ncomp_zx0 = Ncomp_base;
1185 const int Ncomp_zz0 = 1 + Ncomp_base;
1186 const int Ncomp_xy0 = Ncomp_base;
1187 const int Ncomp_yx0 = Ncomp_base;
1188 const int Ncomp_yz0 = 1 + Ncomp_base;
1189 const int Ncomp_yy0 = 1 + Ncomp_base;
1190 const int Ncomp_zy0 = 1 + Ncomp_base;
1192 const int width_xx1 = depos_order + max_crossings;
1193 const int width_zz1 = width_xx1 - 1;
1194 const int width_yy1 = width_xx1;
1197 for (
int ns = 0; ns < num_segments; ns++) {
1200 for (
int i = 0; i <= depos_order - 1; i++) {
1201 for (
int k = 0; k <= depos_order; k++) {
1202 const int i_J = lo.
x + i0_cell[ns] + i;
1203 const int k_J = lo.
y + k0_node[ns] + k;
1204 const amrex::Real weight_J = weight_cellX_nodeZ[ns][i][k];
1205 for (
int ms = 0; ms < num_segments; ms++) {
1206 const int SegShiftX = max_crossings + SegNumX[ms] - SegNumX[ns];
1207 const int SegShiftZ = max_crossings + SegNumZ[ms] - SegNumZ[ns];
1209 for (
int kE = 0; kE <= depos_order; kE++) {
1210 const int row_xx = depos_order - k + kE + SegShiftZ;
1211 const int above_diag = (row_xx > width_xx1) ? 1 : 0;
1212 for (
int iE = 0; iE <= depos_order - 1; iE++) {
1213 const int col_xx = depos_order - 1 - i + iE + SegShiftX;
1214 if (col_xx > Ncomp_xx0 - row_xx - above_diag) {
break; }
1215 const int comp_xx = col_xx + Ncomp_xx0*row_xx;
1216 const amrex::Real weight_E = weight_cellX_nodeZ[ms][iE][kE];
1221 for (
int iE = 0; iE <= depos_order; iE++) {
1222 for (
int kE = 0; kE <= depos_order - 1; kE++) {
1223 const amrex::Real weight_E = weight_nodeX_cellZ[ms][iE][kE];
1224 const int comp_xz = depos_order - 1 - i + iE + SegShiftX
1225 + Ncomp_xz0*(depos_order - k + kE + SegShiftZ);
1230 for (
int iE = 0; iE <= depos_order; iE++) {
1231 for (
int kE = 0; kE <= depos_order; kE++) {
1232 const amrex::Real weight_E = weight_nodeX_nodeZ[ms][iE][kE];
1233 const int comp_xy = depos_order - 1 - i + iE + SegShiftX
1234 + Ncomp_xy0*(depos_order - k + kE + SegShiftZ);
1243 for (
int i = 0; i <= depos_order; i++) {
1244 for (
int k = 0; k <= depos_order - 1; k++) {
1245 const int i_J = lo.
x + i0_node[ns] + i;
1246 const int k_J = lo.
y + k0_cell[ns] + k;
1247 const amrex::Real weight_J = weight_nodeX_cellZ[ns][i][k];
1248 for (
int ms = 0; ms < num_segments; ms++) {
1249 const int SegShiftX = max_crossings + SegNumX[ms] - SegNumX[ns];
1250 const int SegShiftZ = max_crossings + SegNumZ[ms] - SegNumZ[ns];
1252 for (
int iE = 0; iE <= depos_order - 1; iE++) {
1253 for (
int kE = 0; kE <= depos_order; kE++) {
1254 const amrex::Real weight_E = weight_cellX_nodeZ[ms][iE][kE];
1255 const int comp_zx = depos_order - i + iE + SegShiftX
1256 + Ncomp_zx0*(depos_order-1 - k + kE + SegShiftZ);
1261 for (
int kE = 0; kE <= depos_order - 1; kE++) {
1262 const int row_zz = depos_order - 1 - k + kE + SegShiftZ;
1263 const int above_diag = (row_zz > width_zz1) ? 1 : 0;
1264 for (
int iE = 0; iE <= depos_order; iE++) {
1265 const int col_zz = depos_order - i + iE + SegShiftX;
1266 if (col_zz > Ncomp_zz0 - 2 - row_zz - above_diag) {
break; }
1267 const int comp_zz = col_zz + Ncomp_zz0*row_zz;
1268 const amrex::Real weight_E = weight_nodeX_cellZ[ms][iE][kE];
1273 for (
int iE = 0; iE <= depos_order; iE++) {
1274 for (
int kE = 0; kE <= depos_order; kE++) {
1275 const amrex::Real weight_E = weight_nodeX_nodeZ[ms][iE][kE];
1276 const int comp_zy = depos_order - i + iE + SegShiftX
1277 + Ncomp_zy0*(depos_order-1 - k + kE + SegShiftZ);
1286 for (
int i = 0; i <= depos_order; i++) {
1287 for (
int k = 0; k <= depos_order; k++) {
1288 const int i_J = lo.
x + i0_node[ns] + i;
1289 const int k_J = lo.
y + k0_node[ns] + k;
1290 const amrex::Real weight_J = weight_nodeX_nodeZ[ns][i][k];
1291 for (
int ms = 0; ms < num_segments; ms++) {
1292 const int SegShiftX = max_crossings + SegNumX[ms] - SegNumX[ns];
1293 const int SegShiftZ = max_crossings + SegNumZ[ms] - SegNumZ[ns];
1295 for (
int iE = 0; iE <= depos_order - 1; iE++) {
1296 for (
int kE = 0; kE <= depos_order; kE++) {
1297 const amrex::Real weight_E = weight_cellX_nodeZ[ms][iE][kE];
1298 const int comp_yx = depos_order - i + iE + SegShiftX
1299 + Ncomp_yx0*(depos_order - k + kE + SegShiftZ);
1304 for (
int iE = 0; iE <= depos_order; iE++) {
1305 for (
int kE = 0; kE <= depos_order - 1; kE++) {
1306 const amrex::Real weight_E = weight_nodeX_cellZ[ms][iE][kE];
1307 const int comp_yz = depos_order - i + iE + SegShiftX
1308 + Ncomp_yz0*(depos_order - k + kE + SegShiftZ);
1313 for (
int kE = 0; kE <= depos_order; kE++) {
1314 const int row_yy = depos_order - k + kE + SegShiftZ;
1315 const int above_diag = (row_yy > width_yy1) ? 1 : 0;
1316 for (
int iE = 0; iE <= depos_order; iE++) {
1317 const int col_yy = depos_order - i + iE + SegShiftX;
1318 if (col_yy > Ncomp_yy0 - 1 - row_yy - above_diag) {
break; }
1319 const int comp_yy = col_yy + Ncomp_yy0*row_yy;
1320 const amrex::Real weight_E = weight_nodeX_nodeZ[ms][iE][kE];
1333#elif defined(WARPX_DIM_RCYLINDER) || defined(WARPX_DIM_RSPHERE)
1336 const auto i_old =
static_cast<int>(x_old-
shift);
1337 const auto i_new =
static_cast<int>(x_new-
shift);
1338 const int cell_crossings_x = std::abs(i_new-i_old);
1339 num_segments += cell_crossings_x;
1343 const auto dirX_sign =
static_cast<double>(dxp < 0. ? -1. : 1.);
1344 double Xcell =
static_cast<double>(i_old) +
shift + 0.5*(1.-dirX_sign);
1351 double x0_old = x_old;
1353 for (
int ns = 0; ns < num_segments; ns++) {
1355 if (ns == num_segments-1) {
1357 dxp_seg = x0_new - x0_old;
1360 Xcell = Xcell + dirX_sign;
1362 dxp_seg = x0_new - x0_old;
1366 const auto seg_factor =
static_cast<amrex::Real>(dxp == 0. ? 1._rt : dxp_seg/dxp);
1370 double sx_cell[depos_order] = {0.};
1371 double const x0_bar = (x0_new + x0_old)/2.0;
1372 const int i0_cell = compute_shape_factor_cell( sx_cell, x0_bar-0.5 );
1374 if constexpr (depos_order >= 3) {
1376 double sx_old_cell[depos_order] = {0.};
1377 double sx_new_cell[depos_order] = {0.};
1378 const int i0_cell_2 = compute_shape_factors_cell( sx_old_cell, sx_new_cell, x0_old-0.5, x0_new-0.5 );
1380 for (
int m=0; m<depos_order; m++) {
1381 sx_cell[m] = (4.0*sx_cell[m] + sx_old_cell[m] + sx_new_cell[m])/6.0;
1387 double sx_old_node[depos_order+1] = {0.};
1388 double sx_new_node[depos_order+1] = {0.};
1389 const int i0_node = compute_shape_factors_node( sx_old_node, sx_new_node, x0_old, x0_new );
1392 for (
int i = 0; i <= depos_order; i++) {
1393 const amrex::Real weight = 0.5_rt*(sx_old_node[i] + sx_new_node[i])*seg_factor;
1394 if constexpr (deposit_J) {
1404 for (
int i = 0; i <= depos_order - 1; i++) {
1406 if constexpr (deposit_J) {
1414 if (ns < num_segments-1) {
1420#elif defined(WARPX_DIM_1D_Z)
1423 const auto k_old =
static_cast<int>(z_old-
shift);
1424 const auto k_new =
static_cast<int>(z_new-
shift);
1425 const int cell_crossings_z = std::abs(k_new-k_old);
1426 num_segments += cell_crossings_z;
1430 const auto dirZ_sign =
static_cast<double>(dzp < 0. ? -1. : 1.);
1431 double Zcell =
static_cast<double>(k_old) +
shift + 0.5*(1.-dirZ_sign);
1438 double z0_old = z_old;
1440 constexpr int num_segments_max = 1 + 4*AMREX_SPACEDIM;
1442 "Error: num_segments must be less than or equal to 1 + 4*AMREX_SPACEDIM.");
1445 int k0_cell[num_segments_max];
1446 int k0_node[num_segments_max];
1447 amrex::Real weight_cell[num_segments_max][depos_order];
1448 amrex::Real weight_node[num_segments_max][depos_order+1];
1450 const auto k_mid =
static_cast<int>(0.5*(z_new+z_old)-
shift);
1451 int SegNum[num_segments_max];
1453 for (
int ns = 0; ns < num_segments; ns++) {
1455 if (ns == num_segments-1) {
1457 dzp_seg = z0_new - z0_old;
1460 Zcell = Zcell + dirZ_sign;
1462 dzp_seg = z0_new - z0_old;
1466 const auto seg_factor =
static_cast<amrex::Real>(dzp == 0. ? 1._rt : dzp_seg/dzp);
1470 double sz_cell[depos_order] = {0.};
1471 double const z0_bar = (z0_new + z0_old)/2.0;
1472 k0_cell[ns] = compute_shape_factor_cell( sz_cell, z0_bar-0.5 );
1475 if constexpr (full_mass_matrices) {
1476 const auto k0_mid =
static_cast<int>(z0_bar-
shift);
1477 SegNum[ns] = 1 + k0_mid - k_mid;
1480 if constexpr (depos_order >= 3) {
1482 double sz_old_cell[depos_order] = {0.};
1483 double sz_new_cell[depos_order] = {0.};
1484 const int k0_cell_2 = compute_shape_factors_cell( sz_old_cell, sz_new_cell, z0_old-0.5, z0_new-0.5 );
1486 for (
int m=0; m<depos_order; m++) {
1487 sz_cell[m] = (4.0*sz_cell[m] + sz_old_cell[m] + sz_new_cell[m])/6.0;
1493 double sz_old_node[depos_order+1] = {0.};
1494 double sz_new_node[depos_order+1] = {0.};
1495 k0_node[ns] = compute_shape_factors_node( sz_old_node, sz_new_node, z0_old, z0_new );
1498 for (
int k = 0; k <= depos_order; k++) {
1499 const amrex::Real weight = 0.5_rt*(sz_old_node[k] + sz_new_node[k])*seg_factor;
1500 const int k_J = lo.
x + k0_node[ns] + k;
1501 if constexpr (deposit_J) {
1505 if constexpr (full_mass_matrices) { weight_node[ns][k] = weight; }
1513 for (
int k = 0; k <= depos_order - 1; k++) {
1515 const int k_J = lo.
x + k0_cell[ns] + k;
1516 if constexpr (deposit_J) {
1519 if constexpr (full_mass_matrices) { weight_cell[ns][k] = weight; }
1526 if (ns < num_segments-1) {
1532 if constexpr (full_mass_matrices) {
1534 const int width_zz = depos_order - 1 + max_crossings;
1535 const int width_yy = depos_order + max_crossings;
1538 for (
int ns = 0; ns < num_segments; ns++) {
1541 for (
int k = 0; k <= depos_order; k++) {
1543 const int k_J = lo.
x + k0_node[ns] + k;
1545 for (
int ms = 0; ms < num_segments; ms++) {
1546 const int SegShift = max_crossings + SegNum[ms] - SegNum[ns];
1547 for (
int kE = 0; kE <= depos_order; kE++) {
1549 const int comp_yy = depos_order - k + kE + SegShift;
1550 if (comp_yy <= width_yy) {
1557 for (
int kE = 0; kE <= depos_order - 1; kE++) {
1559 const int comp_yz = depos_order - k + kE + SegShift;
1568 for (
int k = 0; k <= depos_order - 1; k++) {
1570 const int k_J = lo.
x + k0_cell[ns] + k;
1572 for (
int ms = 0; ms < num_segments; ms++) {
1573 const int SegShift = max_crossings + SegNum[ms] - SegNum[ns];
1574 for (
int kE = 0; kE <= depos_order - 1; kE++) {
1575 const int comp_zz = depos_order - 1 - k + kE + SegShift;
1576 if (comp_zz > width_zz) {
break; }
1580 for (
int kE = 0; kE <= depos_order; kE++) {
1582 const int comp_zy = depos_order-1 - k + kE + SegShift;