197#if defined(WARPX_DIM_RZ) || defined(WARPX_DIM_RCYLINDER)
200 const amrex::Real rpmid = std::sqrt(xp*xp + yp*yp);
201 const amrex::Real costheta = (rpmid > 0._rt ? xp/rpmid : 1._rt);
202 const amrex::Real sintheta = (rpmid > 0._rt ? yp/rpmid : 0._rt);
203 const amrex::Real wqx = wq_invvol*(+vx*costheta + vy*sintheta);
204 const amrex::Real wqy = wq_invvol*(-vx*sintheta + vy*costheta);
206#elif defined(WARPX_DIM_RSPHERE)
208 const amrex::Real rpxymid = std::sqrt(xp*xp + yp*yp);
209 const amrex::Real rpmid = std::sqrt(xp*xp + yp*yp + zp*zp);
210 const amrex::Real costheta = (rpxymid > 0._rt ? xp/rpxymid : 1._rt);
211 const amrex::Real sintheta = (rpxymid > 0._rt ? yp/rpxymid : 0._rt);
212 const amrex::Real cosphi = (rpmid > 0._rt ? rpxymid/rpmid : 1._rt);
213 const amrex::Real sinphi = (rpmid > 0._rt ? zp/rpmid : 0._rt);
215 const amrex::Real wqx = wq_invvol*(+vx*costheta*cosphi + vy*sintheta*cosphi +
vz*sinphi);
216 const amrex::Real wqy = wq_invvol*(-vx*sintheta + vy*costheta);
217 const amrex::Real wqz = wq_invvol*(-vx*costheta*sinphi - vy*sintheta*sinphi +
vz*cosphi);
226#if !defined(WARPX_DIM_1D_Z)
230#if defined(WARPX_DIM_RZ) || defined(WARPX_DIM_RCYLINDER) || defined(WARPX_DIM_RSPHERE)
231 const double xmid = (rpmid - xyzmin.
x)*dinv.
x;
233 const double xmid = (xp - xyzmin.
x)*dinv.
x;
241 double sx_node[depos_order + 1] = {0.};
242 double sx_cell[depos_order + 1] = {0.};
245 if (jx_type[0] == NODE || jy_type[0] == NODE || jz_type[0] == NODE) {
246 j_node = compute_shape_factor(sx_node, xmid);
248 if (jx_type[0] == CELL || jy_type[0] == CELL || jz_type[0] == CELL) {
249 j_cell = compute_shape_factor(sx_cell, xmid - 0.5);
253 if (j_node == j_cell) {
shift[0] = 1; }
258 for (
int ix = 0; ix <= depos_order; ix++)
265 int const j_jx = ((jx_type[0] == NODE) ? j_node : j_cell);
266 int const j_jy = ((jy_type[0] == NODE) ? j_node : j_cell);
267 int const j_jz = ((jz_type[0] == NODE) ? j_node : j_cell);
270#if defined(WARPX_DIM_3D)
273 const double ymid = (yp - xyzmin.
y)*dinv.
y;
274 double sy_node[depos_order + 1] = {0.};
275 double sy_cell[depos_order + 1] = {0.};
278 if (jx_type[1] == NODE || jy_type[1] == NODE || jz_type[1] == NODE) {
279 k_node = compute_shape_factor(sy_node, ymid);
281 if (jx_type[1] == CELL || jy_type[1] == CELL || jz_type[1] == CELL) {
282 k_cell = compute_shape_factor(sy_cell, ymid - 0.5);
286 if (k_node == k_cell) {
shift[1] = 1; }
291 for (
int iy = 0; iy <= depos_order; iy++)
297 int const k_jx = ((jx_type[1] == NODE) ? k_node : k_cell);
298 int const k_jy = ((jy_type[1] == NODE) ? k_node : k_cell);
299 int const k_jz = ((jz_type[1] == NODE) ? k_node : k_cell);
302#if !defined(WARPX_DIM_RCYLINDER) && !defined(WARPX_DIM_RSPHERE)
305 constexpr int zdir = WARPX_ZINDEX;
306 const double zmid = (zp - xyzmin.
z)*dinv.
z;
307 double sz_node[depos_order + 1] = {0.};
308 double sz_cell[depos_order + 1] = {0.};
311 if (jx_type[zdir] == NODE || jy_type[zdir] == NODE || jz_type[zdir] == NODE) {
312 l_node = compute_shape_factor(sz_node, zmid);
314 if (jx_type[zdir] == CELL || jy_type[zdir] == CELL || jz_type[zdir] == CELL) {
315 l_cell = compute_shape_factor(sz_cell, zmid - 0.5);
320 for (
int iz = 0; iz <= depos_order; iz++)
326 int const l_jx = ((jx_type[zdir] == NODE) ? l_node : l_cell);
327 int const l_jy = ((jy_type[zdir] == NODE) ? l_node : l_cell);
328 int const l_jz = ((jz_type[zdir] == NODE) ? l_node : l_cell);
331 if (l_node==l_cell) {
shift[zdir] = 1; }
337 for (
int dir = 0; dir < AMREX_SPACEDIM; dir++) {
338 offset_xy[dir] = (jx_type[dir] + jy_type[dir]) % 2;
339 offset_xz[dir] = (jx_type[dir] + jz_type[dir]) % 2;
340 offset_yz[dir] = (jy_type[dir] + jz_type[dir]) % 2;
344#if defined(WARPX_DIM_1D_Z)
345 for (
int iz = 0; iz <= depos_order; iz++){
346 if constexpr (deposit_J) {
353 if constexpr (full_mass_matrices) {
354 for (
int aa = 0; aa <= depos_order; aa++){
356 const int col_base = depos_order + aa - iz;
368 Nc = col_base +
shift[0]*offset_xy[0];
370 Nc = col_base +
shift[0]*offset_xz[0];
374 Nc = col_base +
shift[0]*offset_xy[0];
376 Nc = col_base +
shift[0]*offset_yz[0];
380 Nc = col_base + 1 -
shift[0]*offset_xz[0];
382 Nc = col_base + 1 -
shift[0]*offset_yz[0];
392#elif defined(WARPX_DIM_RCYLINDER) || defined(WARPX_DIM_RSPHERE)
393 for (
int ix = 0; ix <= depos_order; ix++){
394 if constexpr (deposit_J) {
400 if constexpr (full_mass_matrices) {
401 for (
int aa = 0; aa <= depos_order; aa++) {
403 int col_base = depos_order + aa - ix;
415 Nc = col_base + 1 -
shift[0]*offset_xy[0];
417 Nc = col_base + 1 -
shift[0]*offset_xz[0];
421 Nc = col_base +
shift[0]*offset_xy[0];
423 Nc = col_base +
shift[0]*offset_yz[0];
427 Nc = col_base +
shift[0]*offset_xz[0];
429 Nc = col_base +
shift[0]*offset_yz[0];
440#elif defined(WARPX_DIM_XZ) || defined(WARPX_DIM_RZ)
441 const int base_offset = 1 + 2*depos_order;
443 for (
int iz = 0; iz <= depos_order; iz++){
445 for (
int ix = 0; ix <= depos_order; ix++){
451 if constexpr (deposit_J) {
458 if constexpr (full_mass_matrices) {
460 const int Ncomp0 = 1 + 2*depos_order;
462 for (
int bb = 0; bb <= depos_order; bb++){
464 const int row_base = depos_order + bb - iz;
466 for (
int aa = 0; aa <= depos_order; aa++){
467 const int col_base = depos_order + aa - ix;
476 if (col_base <= Ncomp0 - row_base) {
478 Nc = col_base + row_base*
offset;
480 &Sxx_arr(lo.
x+j_jx+ix, lo.
y+l_jx+iz, 0, Nc),
481 weight_Jx*weight_Ex*fpxx);
483 &Syy_arr(lo.
x+j_jy+ix, lo.
y+l_jy+iz, 0, Nc),
484 weight_Jy*weight_Ey*fpyy);
486 &Szz_arr(lo.
x+j_jz+ix, lo.
y+l_jz+iz, 0, Nc),
487 weight_Jz*weight_Ez*fpzz);
491 offset = base_offset + offset_xy[0];
492 Nc = col_base + 1 -
shift[0]*offset_xy[0]
495 &Sxy_arr(lo.
x+j_jx+ix, lo.
y+l_jx+iz, 0, Nc),
496 weight_Jx*weight_Ey*fpxy);
497 offset = base_offset + offset_xz[0];
498 Nc = col_base + 1 -
shift[0]*offset_xz[0]
501 &Sxz_arr(lo.
x+j_jx+ix, lo.
y+l_jx+iz, 0, Nc),
502 weight_Jx*weight_Ez*fpxz);
505 offset = base_offset + offset_xy[0];
506 Nc = col_base +
shift[0]*offset_xy[0]
509 &Syx_arr(lo.
x+j_jy+ix, lo.
y+l_jy+iz, 0, Nc),
510 weight_Jy*weight_Ex*fpyx);
511 offset = base_offset + offset_yz[0];
512 Nc = col_base +
shift[0]*offset_yz[0]
515 &Syz_arr(lo.
x+j_jy+ix, lo.
y+l_jy+iz, 0, Nc),
516 weight_Jy*weight_Ez*fpyz);
519 offset = base_offset + offset_xz[0];
520 Nc = col_base +
shift[0]*offset_xz[0]
523 &Szx_arr(lo.
x+j_jz+ix, lo.
y+l_jz+iz, 0, Nc),
524 weight_Jz*weight_Ex*fpzx);
525 offset = base_offset + offset_yz[0];
526 Nc = col_base +
shift[0]*offset_yz[0]
529 &Szy_arr(lo.
x+j_jz+ix, lo.
y+l_jz+iz, 0, Nc),
530 weight_Jz*weight_Ey*fpzy);
543#elif defined(WARPX_DIM_3D)
544 for (
int iz = 0; iz <= depos_order; iz++){
545 for (
int iy = 0; iy <= depos_order; iy++){
546 for (
int ix = 0; ix <= depos_order; ix++){
547 const amrex::Real weight_Jx = sx_jx[ix]*sy_jx[iy]*sz_jx[iz];
548 const amrex::Real weight_Jy = sx_jy[ix]*sy_jy[iy]*sz_jy[iz];
549 const amrex::Real weight_Jz = sx_jz[ix]*sy_jz[iy]*sz_jz[iz];
551 if constexpr (deposit_J) {
558 if constexpr (full_mass_matrices) {
783 [[maybe_unused]]
int max_crossings,
803#if (AMREX_SPACEDIM > 1)
809#if defined(WARPX_DIM_RZ) || defined(WARPX_DIM_RCYLINDER)
810 amrex::Real const rp_new = std::sqrt(xp_new*xp_new + yp_new*yp_new);
811 amrex::Real const rp_old = std::sqrt(xp_old*xp_old + yp_old*yp_old);
814 double x_new = (rp_new - xyzmin.
x)*dinv.
x;
815 double const x_old = (rp_old - xyzmin.
x)*dinv.
x;
817 amrex::Real const xp_mid = (xp_new + xp_old)*0.5_rt;
818 amrex::Real const yp_mid = (yp_new + yp_old)*0.5_rt;
819 amrex::Real const rp_mid = (rp_new + rp_old)/2._rt;
820 amrex::Real const costheta_mid = (rp_mid > 0._rt ? xp_mid/rp_mid : 1._rt);
821 amrex::Real const sintheta_mid = (rp_mid > 0._rt ? yp_mid/rp_mid : 0._rt);
822 amrex::Real const vy = (-uxp_mid*sintheta_mid + uyp_mid*costheta_mid)*gaminv;
823#if defined(WARPX_DIM_RCYLINDER)
826#elif defined(WARPX_DIM_RSPHERE)
827 amrex::Real const xp_mid = (xp_new + xp_old)*0.5_rt;
828 amrex::Real const yp_mid = (yp_new + yp_old)*0.5_rt;
829 amrex::Real const zp_mid = (zp_new + zp_old)*0.5_rt;
830 amrex::Real const rpxy_new = std::sqrt(xp_new*xp_new + yp_new*yp_new);
831 amrex::Real const rp_new = std::sqrt(xp_new*xp_new + yp_new*yp_new + zp_new*zp_new);
832 amrex::Real const rpxy_old = std::sqrt(xp_old*xp_old + yp_old*yp_old);
833 amrex::Real const rp_old = std::sqrt(xp_old*xp_old + yp_old*yp_old + zp_old*zp_old);
834 amrex::Real const rpxy_mid = (rpxy_new + rpxy_old)*0.5_rt;
835 amrex::Real const rp_mid = (rp_new + rp_old)*0.5_rt;
836 amrex::Real const costheta_mid = (rpxy_mid > 0._rt ? xp_mid/rpxy_mid : 1._rt);
837 amrex::Real const sintheta_mid = (rpxy_mid > 0._rt ? yp_mid/rpxy_mid : 0._rt);
838 amrex::Real const cosphi_mid = (rp_mid > 0._rt ? rpxy_mid/rp_mid : 1._rt);
839 amrex::Real const sinphi_mid = (rp_mid > 0._rt ? zp_mid/rp_mid : 0._rt);
842 double x_new = (rp_new - xyzmin.
x)*dinv.
x;
843 double const x_old = (rp_old - xyzmin.
x)*dinv.
x;
845 amrex::Real const vy = (-uxp_mid*sintheta_mid + uyp_mid*costheta_mid)*gaminv;
846 amrex::Real const vz = (-uxp_mid*costheta_mid*cosphi_mid - uyp_mid*sintheta_mid*cosphi_mid + uzp_mid*sinphi_mid)*gaminv;
847#elif defined(WARPX_DIM_XZ)
849 double x_new = (xp_new - xyzmin.
x)*dinv.
x;
850 double const x_old = (xp_old - xyzmin.
x)*dinv.
x;
853#elif defined(WARPX_DIM_1D_Z)
856#elif defined(WARPX_DIM_3D)
858 double x_new = (xp_new - xyzmin.
x)*dinv.
x;
859 double const x_old = (xp_old - xyzmin.
x)*dinv.
x;
860 double y_new = (yp_new - xyzmin.
y)*dinv.
y;
861 double const y_old = (yp_old - xyzmin.
y)*dinv.
y;
866#if !defined(WARPX_DIM_RCYLINDER) && !defined(WARPX_DIM_RSPHERE)
868 double z_new = (zp_new - xyzmin.
z)*dinv.
z;
869 double const z_old = (zp_old - xyzmin.
z)*dinv.
z;
879#if !defined(WARPX_DIM_1D_Z)
880 const double dxp = x_new - x_old;
882#if defined(WARPX_DIM_3D)
883 const double dyp = y_new - y_old;
885#if !defined(WARPX_DIM_RCYLINDER) && !defined(WARPX_DIM_RSPHERE)
886 const double dzp = z_new - z_old;
890#if defined(WARPX_DIM_3D)
892 domain_double[0][0], domain_double[0][1], do_cropping[0]);
894 domain_double[1][0], domain_double[1][1], do_cropping[1]);
896 domain_double[2][0], domain_double[2][1], do_cropping[2]);
897#elif defined(WARPX_DIM_XZ) || defined(WARPX_DIM_RZ)
899 domain_double[0][0], domain_double[0][1], do_cropping[0]);
901 domain_double[1][0], domain_double[1][1], do_cropping[1]);
902#elif defined(WARPX_DIM_1D_Z)
904#elif defined(WARPX_DIM_RCYLINDER) || defined(WARPX_DIM_RSPHERE)
914 int num_segments = 1;
916 if ( (depos_order % 2) == 0 ) {
shift = 0.5; }
918#if defined(WARPX_DIM_3D)
921 const auto i_old =
static_cast<int>(x_old-
shift);
922 const auto i_new =
static_cast<int>(x_new-
shift);
923 const int cell_crossings_x = std::abs(i_new-i_old);
924 num_segments += cell_crossings_x;
927 const auto j_old =
static_cast<int>(y_old-
shift);
928 const auto j_new =
static_cast<int>(y_new-
shift);
929 const int cell_crossings_y = std::abs(j_new-j_old);
930 num_segments += cell_crossings_y;
933 const auto k_old =
static_cast<int>(z_old-
shift);
934 const auto k_new =
static_cast<int>(z_new-
shift);
935 const int cell_crossings_z = std::abs(k_new-k_old);
936 num_segments += cell_crossings_z;
941 const auto dirX_sign =
static_cast<double>(dxp < 0. ? -1. : 1.);
942 const auto dirY_sign =
static_cast<double>(dyp < 0. ? -1. : 1.);
943 const auto dirZ_sign =
static_cast<double>(dzp < 0. ? -1. : 1.);
944 double Xcell = 0., Ycell = 0., Zcell = 0.;
945 if (num_segments > 1) {
946 Xcell =
static_cast<double>(i_old) +
shift + 0.5*(1.-dirX_sign);
947 Ycell =
static_cast<double>(j_old) +
shift + 0.5*(1.-dirY_sign);
948 Zcell =
static_cast<double>(k_old) +
shift + 0.5*(1.-dirZ_sign);
954 double dxp_seg, dyp_seg, dzp_seg;
955 double x0_new, y0_new, z0_new;
956 double x0_old = x_old;
957 double y0_old = y_old;
958 double z0_old = z_old;
960 for (
int ns = 0; ns < num_segments; ns++) {
962 if (ns == num_segments-1) {
967 dxp_seg = x0_new - x0_old;
968 dyp_seg = y0_new - y0_old;
969 dzp_seg = z0_new - z0_old;
974 x0_new = Xcell + dirX_sign;
975 y0_new = Ycell + dirY_sign;
976 z0_new = Zcell + dirZ_sign;
977 dxp_seg = x0_new - x0_old;
978 dyp_seg = y0_new - y0_old;
979 dzp_seg = z0_new - z0_old;
981 if ( (dyp == 0. || std::abs(dxp_seg) < std::abs(dxp/dyp*dyp_seg))
982 && (dzp == 0. || std::abs(dxp_seg) < std::abs(dxp/dzp*dzp_seg)) ) {
984 dyp_seg = dyp/dxp*dxp_seg;
985 dzp_seg = dzp/dxp*dxp_seg;
986 y0_new = y0_old + dyp_seg;
987 z0_new = z0_old + dzp_seg;
989 else if (dzp == 0. || std::abs(dyp_seg) < std::abs(dyp/dzp*dzp_seg)) {
991 dxp_seg = dxp/dyp*dyp_seg;
992 dzp_seg = dzp/dyp*dyp_seg;
993 x0_new = x0_old + dxp_seg;
994 z0_new = z0_old + dzp_seg;
998 dxp_seg = dxp/dzp*dzp_seg;
999 dyp_seg = dyp/dzp*dzp_seg;
1000 x0_new = x0_old + dxp_seg;
1001 y0_new = y0_old + dyp_seg;
1007 const auto seg_factor_x =
static_cast<amrex::Real>(dxp == 0. ? 1._rt : dxp_seg/dxp);
1008 const auto seg_factor_y =
static_cast<amrex::Real>(dyp == 0. ? 1._rt : dyp_seg/dyp);
1009 const auto seg_factor_z =
static_cast<amrex::Real>(dzp == 0. ? 1._rt : dzp_seg/dzp);
1013 double sx_cell[depos_order] = {0.};
1014 double sy_cell[depos_order] = {0.};
1015 double sz_cell[depos_order] = {0.};
1016 double const x0_bar = (x0_new + x0_old)/2.0;
1017 double const y0_bar = (y0_new + y0_old)/2.0;
1018 double const z0_bar = (z0_new + z0_old)/2.0;
1019 const int i0_cell = compute_shape_factor_cell( sx_cell, x0_bar-0.5 );
1020 const int j0_cell = compute_shape_factor_cell( sy_cell, y0_bar-0.5 );
1021 const int k0_cell = compute_shape_factor_cell( sz_cell, z0_bar-0.5 );
1023 if constexpr (depos_order >= 3) {
1025 double sx_old_cell[depos_order] = {0.};
1026 double sx_new_cell[depos_order] = {0.};
1027 double sy_old_cell[depos_order] = {0.};
1028 double sy_new_cell[depos_order] = {0.};
1029 double sz_old_cell[depos_order] = {0.};
1030 double sz_new_cell[depos_order] = {0.};
1031 const int i0_cell_2 = compute_shape_factors_cell( sx_old_cell, sx_new_cell, x0_old-0.5, x0_new-0.5 );
1032 const int j0_cell_2 = compute_shape_factors_cell( sy_old_cell, sy_new_cell, y0_old-0.5, y0_new-0.5 );
1033 const int k0_cell_2 = compute_shape_factors_cell( sz_old_cell, sz_new_cell, z0_old-0.5, z0_new-0.5 );
1035 for (
int m = 0; m < depos_order; m++) {
1036 sx_cell[m] = (4.0*sx_cell[m] + sx_old_cell[m] + sx_new_cell[m])/6.0;
1037 sy_cell[m] = (4.0*sy_cell[m] + sy_old_cell[m] + sy_new_cell[m])/6.0;
1038 sz_cell[m] = (4.0*sz_cell[m] + sz_old_cell[m] + sz_new_cell[m])/6.0;
1044 double sx_old_node[depos_order+1] = {0.};
1045 double sx_new_node[depos_order+1] = {0.};
1046 double sy_old_node[depos_order+1] = {0.};
1047 double sy_new_node[depos_order+1] = {0.};
1048 double sz_old_node[depos_order+1] = {0.};
1049 double sz_new_node[depos_order+1] = {0.};
1050 const int i0_node = compute_shape_factors_node( sx_old_node, sx_new_node, x0_old, x0_new );
1051 const int j0_node = compute_shape_factors_node( sy_old_node, sy_new_node, y0_old, y0_new );
1052 const int k0_node = compute_shape_factors_node( sz_old_node, sz_new_node, z0_old, z0_new );
1056 for (
int i = 0; i <= depos_order - 1; i++) {
1057 for (
int j = 0; j <= depos_order; j++) {
1058 for (
int k = 0; k <= depos_order; k++) {
1059 weight = sx_cell[i]*( sy_old_node[j]*sz_old_node[k]*one_third
1060 + sy_old_node[j]*sz_new_node[k]*one_sixth
1061 + sy_new_node[j]*sz_old_node[k]*one_sixth
1062 + sy_new_node[j]*sz_new_node[k]*one_third )*seg_factor_x;
1063 if constexpr (deposit_J) {
1072 for (
int i = 0; i <= depos_order; i++) {
1073 for (
int j = 0; j <= depos_order - 1; j++) {
1074 for (
int k = 0; k <= depos_order; k++) {
1075 weight = sy_cell[j]*( sx_old_node[i]*sz_old_node[k]*one_third
1076 + sx_old_node[i]*sz_new_node[k]*one_sixth
1077 + sx_new_node[i]*sz_old_node[k]*one_sixth
1078 + sx_new_node[i]*sz_new_node[k]*one_third )*seg_factor_y;
1079 if constexpr (deposit_J) {
1088 for (
int i = 0; i <= depos_order; i++) {
1089 for (
int j = 0; j <= depos_order; j++) {
1090 for (
int k = 0; k <= depos_order - 1; k++) {
1091 weight = sz_cell[k]*( sx_old_node[i]*sy_old_node[j]*one_third
1092 + sx_old_node[i]*sy_new_node[j]*one_sixth
1093 + sx_new_node[i]*sy_old_node[j]*one_sixth
1094 + sx_new_node[i]*sy_new_node[j]*one_third )*seg_factor_z;
1095 if constexpr (deposit_J) {
1104 if (ns < num_segments-1) {
1112#elif defined(WARPX_DIM_XZ) || defined(WARPX_DIM_RZ)
1115 const auto i_old =
static_cast<int>(x_old-
shift);
1116 const auto i_new =
static_cast<int>(x_new-
shift);
1117 const int cell_crossings_x = std::abs(i_new-i_old);
1118 num_segments += cell_crossings_x;
1121 const auto k_old =
static_cast<int>(z_old-
shift);
1122 const auto k_new =
static_cast<int>(z_new-
shift);
1123 const int cell_crossings_z = std::abs(k_new-k_old);
1124 num_segments += cell_crossings_z;
1129 const auto dirX_sign =
static_cast<double>(dxp < 0. ? -1. : 1.);
1130 const auto dirZ_sign =
static_cast<double>(dzp < 0. ? -1. : 1.);
1131 double Xcell = 0., Zcell = 0.;
1132 if (num_segments > 1) {
1133 Xcell =
static_cast<double>(i_old) +
shift + 0.5*(1.-dirX_sign);
1134 Zcell =
static_cast<double>(k_old) +
shift + 0.5*(1.-dirZ_sign);
1140 double dxp_seg, dzp_seg;
1141 double x0_new, z0_new;
1142 double x0_old = x_old;
1143 double z0_old = z_old;
1145 constexpr int num_segments_max = 1 + 4*AMREX_SPACEDIM;
1147 "Error: num_segments must be less than or equal to 1 + 4*AMREX_SPACEDIM.");
1150 int i0_cell[num_segments_max];
1151 int i0_node[num_segments_max];
1152 int k0_cell[num_segments_max];
1153 int k0_node[num_segments_max];
1154 amrex::Real weight_cellX_nodeZ[num_segments_max][depos_order][depos_order+1];
1155 amrex::Real weight_nodeX_cellZ[num_segments_max][depos_order+1][depos_order];
1156 amrex::Real weight_nodeX_nodeZ[num_segments_max][depos_order+1][depos_order+1];
1158 const auto i_mid =
static_cast<int>(0.5*(x_new+x_old)-
shift);
1159 const auto k_mid =
static_cast<int>(0.5*(z_new+z_old)-
shift);
1160 int SegNumX[num_segments_max];
1161 int SegNumZ[num_segments_max];
1163 for (
int ns = 0; ns < num_segments; ns++) {
1165 if (ns == num_segments-1) {
1169 dxp_seg = x0_new - x0_old;
1170 dzp_seg = z0_new - z0_old;
1175 x0_new = Xcell + dirX_sign;
1176 z0_new = Zcell + dirZ_sign;
1177 dxp_seg = x0_new - x0_old;
1178 dzp_seg = z0_new - z0_old;
1180 if (dzp == 0. || std::abs(dxp_seg) < std::abs(dxp/dzp*dzp_seg)) {
1182 dzp_seg = dzp/dxp*dxp_seg;
1183 z0_new = z0_old + dzp_seg;
1187 dxp_seg = dxp/dzp*dzp_seg;
1188 x0_new = x0_old + dxp_seg;
1194 const auto seg_factor_x =
static_cast<amrex::Real>(dxp == 0. ? 1._rt : dxp_seg/dxp);
1195 const auto seg_factor_z =
static_cast<amrex::Real>(dzp == 0. ? 1._rt : dzp_seg/dzp);
1199 double sx_cell[depos_order] = {0.};
1200 double sz_cell[depos_order] = {0.};
1201 double const x0_bar = (x0_new + x0_old)/2.0;
1202 double const z0_bar = (z0_new + z0_old)/2.0;
1203 i0_cell[ns] = compute_shape_factor_cell( sx_cell, x0_bar-0.5 );
1204 k0_cell[ns] = compute_shape_factor_cell( sz_cell, z0_bar-0.5 );
1207 if constexpr (full_mass_matrices) {
1208 const auto i0_mid =
static_cast<int>(x0_bar-
shift);
1209 const auto k0_mid =
static_cast<int>(z0_bar-
shift);
1210 SegNumX[ns] = 1 + i0_mid - i_mid;
1211 SegNumZ[ns] = 1 + k0_mid - k_mid;
1214 if constexpr (depos_order >= 3) {
1216 double sx_old_cell[depos_order] = {0.};
1217 double sx_new_cell[depos_order] = {0.};
1218 double sz_old_cell[depos_order] = {0.};
1219 double sz_new_cell[depos_order] = {0.};
1220 const int i0_cell_2 = compute_shape_factors_cell( sx_old_cell, sx_new_cell, x0_old-0.5, x0_new-0.5 );
1221 const int k0_cell_2 = compute_shape_factors_cell( sz_old_cell, sz_new_cell, z0_old-0.5, z0_new-0.5 );
1223 for (
int m = 0; m < depos_order; m++) {
1224 sx_cell[m] = (4.0*sx_cell[m] + sx_old_cell[m] + sx_new_cell[m])/6.0;
1225 sz_cell[m] = (4.0*sz_cell[m] + sz_old_cell[m] + sz_new_cell[m])/6.0;
1231 double sx_old_node[depos_order+1] = {0.};
1232 double sx_new_node[depos_order+1] = {0.};
1233 double sz_old_node[depos_order+1] = {0.};
1234 double sz_new_node[depos_order+1] = {0.};
1235 i0_node[ns] = compute_shape_factors_node( sx_old_node, sx_new_node, x0_old, x0_new );
1236 k0_node[ns] = compute_shape_factors_node( sz_old_node, sz_new_node, z0_old, z0_new );
1240 for (
int i = 0; i <= depos_order - 1; i++) {
1241 for (
int k = 0; k <= depos_order; k++) {
1242 const int i_J = lo.
x + i0_cell[ns] + i;
1243 const int k_J = lo.
y + k0_node[ns] + k;
1244 weight = sx_cell[i]*(sz_old_node[k] + sz_new_node[k])/2.0_rt*seg_factor_x;
1245 if constexpr (deposit_J) {
1248 if constexpr (full_mass_matrices) { weight_cellX_nodeZ[ns][i][k] = weight; }
1256 const auto seg_factor_y = std::min(seg_factor_x,seg_factor_z);
1257 for (
int i = 0; i <= depos_order; i++) {
1258 for (
int k = 0; k <= depos_order; k++) {
1259 const int i_J = lo.
x + i0_node[ns] + i;
1260 const int k_J = lo.
y + k0_node[ns] + k;
1261 weight = ( sx_old_node[i]*sz_old_node[k]*one_third
1262 + sx_old_node[i]*sz_new_node[k]*one_sixth
1263 + sx_new_node[i]*sz_old_node[k]*one_sixth
1264 + sx_new_node[i]*sz_new_node[k]*one_third )*seg_factor_y;
1265 if constexpr (deposit_J) {
1268 if constexpr (full_mass_matrices) { weight_nodeX_nodeZ[ns][i][k] = weight; }
1276 for (
int i = 0; i <= depos_order; i++) {
1277 for (
int k = 0; k <= depos_order - 1; k++) {
1278 const int i_J = lo.
x + i0_node[ns] + i;
1279 const int k_J = lo.
y + k0_cell[ns] + k;
1280 weight = sz_cell[k]*(sx_old_node[i] + sx_new_node[i])/2.0_rt*seg_factor_z;
1281 if constexpr (deposit_J) {
1284 if constexpr (full_mass_matrices) { weight_nodeX_cellZ[ns][i][k] = weight; }
1292 if (ns < num_segments - 1) {
1299 if constexpr (full_mass_matrices) {
1301 const int Ncomp_base = 2*depos_order + 2*max_crossings;
1302 const int Ncomp_xx0 = Ncomp_base - 1;
1303 const int Ncomp_xy0 = Ncomp_base;
1304 const int Ncomp_xz0 = Ncomp_base;
1305 const int Ncomp_yx0 = Ncomp_base;
1306 const int Ncomp_yy0 = 1 + Ncomp_base;
1307 const int Ncomp_yz0 = 1 + Ncomp_base;
1308 const int Ncomp_zx0 = Ncomp_base;
1309 const int Ncomp_zy0 = 1 + Ncomp_base;
1310 const int Ncomp_zz0 = 1 + Ncomp_base;
1312 const int width_xx1 = depos_order + max_crossings;
1313 const int width_yy1 = width_xx1;
1314 const int width_zz1 = width_xx1 - 1;
1317 for (
int ns = 0; ns < num_segments; ns++) {
1320 for (
int i = 0; i <= depos_order - 1; i++) {
1321 for (
int k = 0; k <= depos_order; k++) {
1322 const int i_J = lo.
x + i0_cell[ns] + i;
1323 const int k_J = lo.
y + k0_node[ns] + k;
1324 const amrex::Real weight_J = weight_cellX_nodeZ[ns][i][k];
1325 for (
int ms = 0; ms < num_segments; ms++) {
1326 const int SegShiftX = max_crossings + SegNumX[ms] - SegNumX[ns];
1327 const int SegShiftZ = max_crossings + SegNumZ[ms] - SegNumZ[ns];
1329 for (
int kE = 0; kE <= depos_order; kE++) {
1330 const int row_xx = depos_order - k + kE + SegShiftZ;
1331 const int above_diag = (row_xx > width_xx1) ? 1 : 0;
1332 for (
int iE = 0; iE <= depos_order - 1; iE++) {
1333 const int col_xx = depos_order - 1 - i + iE + SegShiftX;
1334 if (col_xx > Ncomp_xx0 - row_xx - above_diag) {
break; }
1335 const int comp_xx = col_xx + Ncomp_xx0*row_xx;
1336 const amrex::Real weight_E = weight_cellX_nodeZ[ms][iE][kE];
1341 for (
int iE = 0; iE <= depos_order; iE++) {
1342 for (
int kE = 0; kE <= depos_order - 1; kE++) {
1343 const amrex::Real weight_E = weight_nodeX_cellZ[ms][iE][kE];
1344 const int comp_xz = depos_order - 1 - i + iE + SegShiftX
1345 + Ncomp_xz0*(depos_order - k + kE + SegShiftZ);
1350 for (
int iE = 0; iE <= depos_order; iE++) {
1351 for (
int kE = 0; kE <= depos_order; kE++) {
1352 const amrex::Real weight_E = weight_nodeX_nodeZ[ms][iE][kE];
1353 const int comp_xy = depos_order - 1 - i + iE + SegShiftX
1354 + Ncomp_xy0*(depos_order - k + kE + SegShiftZ);
1363 for (
int i = 0; i <= depos_order; i++) {
1364 for (
int k = 0; k <= depos_order - 1; k++) {
1365 const int i_J = lo.
x + i0_node[ns] + i;
1366 const int k_J = lo.
y + k0_cell[ns] + k;
1367 const amrex::Real weight_J = weight_nodeX_cellZ[ns][i][k];
1368 for (
int ms = 0; ms < num_segments; ms++) {
1369 const int SegShiftX = max_crossings + SegNumX[ms] - SegNumX[ns];
1370 const int SegShiftZ = max_crossings + SegNumZ[ms] - SegNumZ[ns];
1372 for (
int iE = 0; iE <= depos_order - 1; iE++) {
1373 for (
int kE = 0; kE <= depos_order; kE++) {
1374 const amrex::Real weight_E = weight_cellX_nodeZ[ms][iE][kE];
1375 const int comp_zx = depos_order - i + iE + SegShiftX
1376 + Ncomp_zx0*(depos_order-1 - k + kE + SegShiftZ);
1381 for (
int kE = 0; kE <= depos_order - 1; kE++) {
1382 const int row_zz = depos_order - 1 - k + kE + SegShiftZ;
1383 const int above_diag = (row_zz > width_zz1) ? 1 : 0;
1384 for (
int iE = 0; iE <= depos_order; iE++) {
1385 const int col_zz = depos_order - i + iE + SegShiftX;
1386 if (col_zz > Ncomp_zz0 - 2 - row_zz - above_diag) {
break; }
1387 const int comp_zz = col_zz + Ncomp_zz0*row_zz;
1388 const amrex::Real weight_E = weight_nodeX_cellZ[ms][iE][kE];
1393 for (
int iE = 0; iE <= depos_order; iE++) {
1394 for (
int kE = 0; kE <= depos_order; kE++) {
1395 const amrex::Real weight_E = weight_nodeX_nodeZ[ms][iE][kE];
1396 const int comp_zy = depos_order - i + iE + SegShiftX
1397 + Ncomp_zy0*(depos_order-1 - k + kE + SegShiftZ);
1406 for (
int i = 0; i <= depos_order; i++) {
1407 for (
int k = 0; k <= depos_order; k++) {
1408 const int i_J = lo.
x + i0_node[ns] + i;
1409 const int k_J = lo.
y + k0_node[ns] + k;
1410 const amrex::Real weight_J = weight_nodeX_nodeZ[ns][i][k];
1411 for (
int ms = 0; ms < num_segments; ms++) {
1412 const int SegShiftX = max_crossings + SegNumX[ms] - SegNumX[ns];
1413 const int SegShiftZ = max_crossings + SegNumZ[ms] - SegNumZ[ns];
1415 for (
int iE = 0; iE <= depos_order - 1; iE++) {
1416 for (
int kE = 0; kE <= depos_order; kE++) {
1417 const amrex::Real weight_E = weight_cellX_nodeZ[ms][iE][kE];
1418 const int comp_yx = depos_order - i + iE + SegShiftX
1419 + Ncomp_yx0*(depos_order - k + kE + SegShiftZ);
1424 for (
int iE = 0; iE <= depos_order; iE++) {
1425 for (
int kE = 0; kE <= depos_order - 1; kE++) {
1426 const amrex::Real weight_E = weight_nodeX_cellZ[ms][iE][kE];
1427 const int comp_yz = depos_order - i + iE + SegShiftX
1428 + Ncomp_yz0*(depos_order - k + kE + SegShiftZ);
1433 for (
int kE = 0; kE <= depos_order; kE++) {
1434 const int row_yy = depos_order - k + kE + SegShiftZ;
1435 const int above_diag = (row_yy > width_yy1) ? 1 : 0;
1436 for (
int iE = 0; iE <= depos_order; iE++) {
1437 const int col_yy = depos_order - i + iE + SegShiftX;
1438 if (col_yy > Ncomp_yy0 - 1 - row_yy - above_diag) {
break; }
1439 const int comp_yy = col_yy + Ncomp_yy0*row_yy;
1440 const amrex::Real weight_E = weight_nodeX_nodeZ[ms][iE][kE];
1453#elif defined(WARPX_DIM_RCYLINDER) || defined(WARPX_DIM_RSPHERE)
1456 const auto i_old =
static_cast<int>(x_old-
shift);
1457 const auto i_new =
static_cast<int>(x_new-
shift);
1458 const int cell_crossings_x = std::abs(i_new-i_old);
1459 num_segments += cell_crossings_x;
1463 const auto dirX_sign =
static_cast<double>(dxp < 0. ? -1. : 1.);
1464 double Xcell =
static_cast<double>(i_old) +
shift + 0.5*(1.-dirX_sign);
1471 double x0_old = x_old;
1473 constexpr int num_segments_max = 1 + 4*AMREX_SPACEDIM;
1475 "Error: num_segments must be less than or equal to 1 + 4*AMREX_SPACEDIM.");
1478 int i0_cell[num_segments_max];
1479 int i0_node[num_segments_max];
1480 amrex::Real weight_cell[num_segments_max][depos_order];
1481 amrex::Real weight_node[num_segments_max][depos_order+1];
1483 const auto i_mid =
static_cast<int>(0.5*(x_new+x_old)-
shift);
1484 int SegNum[num_segments_max];
1486 for (
int ns = 0; ns < num_segments; ns++) {
1488 if (ns == num_segments-1) {
1490 dxp_seg = x0_new - x0_old;
1493 Xcell = Xcell + dirX_sign;
1495 dxp_seg = x0_new - x0_old;
1499 const auto seg_factor =
static_cast<amrex::Real>(dxp == 0. ? 1._rt : dxp_seg/dxp);
1503 double sx_cell[depos_order] = {0.};
1504 double const x0_bar = (x0_new + x0_old)/2.0;
1505 i0_cell[ns] = compute_shape_factor_cell( sx_cell, x0_bar-0.5 );
1508 if constexpr (full_mass_matrices) {
1509 const auto i0_mid =
static_cast<int>(x0_bar-
shift);
1510 SegNum[ns] = 1 + i0_mid - i_mid;
1513 if constexpr (depos_order >= 3) {
1515 double sx_old_cell[depos_order] = {0.};
1516 double sx_new_cell[depos_order] = {0.};
1517 const int i0_cell_2 = compute_shape_factors_cell( sx_old_cell, sx_new_cell, x0_old-0.5, x0_new-0.5 );
1519 for (
int m=0; m<depos_order; m++) {
1520 sx_cell[m] = (4.0*sx_cell[m] + sx_old_cell[m] + sx_new_cell[m])/6.0;
1526 double sx_old_node[depos_order+1] = {0.};
1527 double sx_new_node[depos_order+1] = {0.};
1528 i0_node[ns] = compute_shape_factors_node( sx_old_node, sx_new_node, x0_old, x0_new );
1531 for (
int i = 0; i <= depos_order; i++) {
1532 const amrex::Real weight = 0.5_rt*(sx_old_node[i] + sx_new_node[i])*seg_factor;
1533 const int i_J = lo.
x + i0_node[ns] + i;
1534 if constexpr (deposit_J) {
1539 if constexpr (full_mass_matrices) { weight_node[ns][i] = weight; }
1547 for (
int i = 0; i <= depos_order - 1; i++) {
1549 const int i_J = lo.
x + i0_cell[ns] + i;
1550 if constexpr (deposit_J) {
1553 if constexpr (full_mass_matrices) { weight_cell[ns][i] = weight; }
1560 if (ns < num_segments-1) {
1566 if constexpr (full_mass_matrices) {
1568 const int width_xx = depos_order - 1 + max_crossings;
1569 const int width_yy = depos_order + max_crossings;
1572 for (
int ns = 0; ns < num_segments; ns++) {
1575 for (
int i = 0; i <= depos_order - 1; i++) {
1577 const int i_J = lo.
x + i0_cell[ns] + i;
1579 for (
int ms = 0; ms < num_segments; ms++) {
1580 const int SegShift = max_crossings + SegNum[ms] - SegNum[ns];
1581 for (
int iE = 0; iE <= depos_order - 1; iE++) {
1582 const int comp_xx = depos_order - 1 - i + iE + SegShift;
1583 if (comp_xx > width_xx) {
break; }
1587 for (
int iE = 0; iE <= depos_order; iE++) {
1589 const int comp_xy = depos_order - 1 - i + iE + SegShift;
1598 for (
int i = 0; i <= depos_order; i++) {
1600 const int i_J = lo.
x + i0_node[ns] + i;
1602 for (
int ms = 0; ms < num_segments; ms++) {
1603 const int SegShift = max_crossings + SegNum[ms] - SegNum[ns];
1604 for (
int iE = 0; iE <= depos_order; iE++) {
1606 const int comp_yy = depos_order - i + iE + SegShift;
1607 if (comp_yy <= width_yy) {
1614 for (
int iE = 0; iE <= depos_order - 1; iE++) {
1616 const int comp_yx = depos_order - i + iE + SegShift;
1628#elif defined(WARPX_DIM_1D_Z)
1631 const auto k_old =
static_cast<int>(z_old-
shift);
1632 const auto k_new =
static_cast<int>(z_new-
shift);
1633 const int cell_crossings_z = std::abs(k_new-k_old);
1634 num_segments += cell_crossings_z;
1638 const auto dirZ_sign =
static_cast<double>(dzp < 0. ? -1. : 1.);
1639 double Zcell =
static_cast<double>(k_old) +
shift + 0.5*(1.-dirZ_sign);
1646 double z0_old = z_old;
1648 constexpr int num_segments_max = 1 + 4*AMREX_SPACEDIM;
1650 "Error: num_segments must be less than or equal to 1 + 4*AMREX_SPACEDIM.");
1653 int k0_cell[num_segments_max];
1654 int k0_node[num_segments_max];
1655 amrex::Real weight_cell[num_segments_max][depos_order];
1656 amrex::Real weight_node[num_segments_max][depos_order+1];
1658 const auto k_mid =
static_cast<int>(0.5*(z_new+z_old)-
shift);
1659 int SegNum[num_segments_max];
1661 for (
int ns = 0; ns < num_segments; ns++) {
1663 if (ns == num_segments-1) {
1665 dzp_seg = z0_new - z0_old;
1668 Zcell = Zcell + dirZ_sign;
1670 dzp_seg = z0_new - z0_old;
1674 const auto seg_factor =
static_cast<amrex::Real>(dzp == 0. ? 1._rt : dzp_seg/dzp);
1678 double sz_cell[depos_order] = {0.};
1679 double const z0_bar = (z0_new + z0_old)/2.0;
1680 k0_cell[ns] = compute_shape_factor_cell( sz_cell, z0_bar-0.5 );
1683 if constexpr (full_mass_matrices) {
1684 const auto k0_mid =
static_cast<int>(z0_bar-
shift);
1685 SegNum[ns] = 1 + k0_mid - k_mid;
1688 if constexpr (depos_order >= 3) {
1690 double sz_old_cell[depos_order] = {0.};
1691 double sz_new_cell[depos_order] = {0.};
1692 const int k0_cell_2 = compute_shape_factors_cell( sz_old_cell, sz_new_cell, z0_old-0.5, z0_new-0.5 );
1694 for (
int m = 0; m < depos_order; m++) {
1695 sz_cell[m] = (4.0*sz_cell[m] + sz_old_cell[m] + sz_new_cell[m])/6.0;
1701 double sz_old_node[depos_order+1] = {0.};
1702 double sz_new_node[depos_order+1] = {0.};
1703 k0_node[ns] = compute_shape_factors_node( sz_old_node, sz_new_node, z0_old, z0_new );
1706 for (
int k = 0; k <= depos_order; k++) {
1707 const amrex::Real weight = 0.5_rt*(sz_old_node[k] + sz_new_node[k])*seg_factor;
1708 const int k_J = lo.
x + k0_node[ns] + k;
1709 if constexpr (deposit_J) {
1713 if constexpr (full_mass_matrices) { weight_node[ns][k] = weight; }
1721 for (
int k = 0; k <= depos_order - 1; k++) {
1723 const int k_J = lo.
x + k0_cell[ns] + k;
1724 if constexpr (deposit_J) {
1727 if constexpr (full_mass_matrices) { weight_cell[ns][k] = weight; }
1734 if (ns < num_segments-1) {
1740 if constexpr (full_mass_matrices) {
1742 const int width_zz = depos_order - 1 + max_crossings;
1743 const int width_yy = depos_order + max_crossings;
1746 for (
int ns = 0; ns < num_segments; ns++) {
1749 for (
int k = 0; k <= depos_order; k++) {
1751 const int k_J = lo.
x + k0_node[ns] + k;
1753 for (
int ms = 0; ms < num_segments; ms++) {
1754 const int SegShift = max_crossings + SegNum[ms] - SegNum[ns];
1755 for (
int kE = 0; kE <= depos_order; kE++) {
1757 const int comp_yy = depos_order - k + kE + SegShift;
1758 if (comp_yy <= width_yy) {
1765 for (
int kE = 0; kE <= depos_order - 1; kE++) {
1767 const int comp_yz = depos_order - k + kE + SegShift;
1776 for (
int k = 0; k <= depos_order - 1; k++) {
1778 const int k_J = lo.
x + k0_cell[ns] + k;
1780 for (
int ms = 0; ms < num_segments; ms++) {
1781 const int SegShift = max_crossings + SegNum[ms] - SegNum[ns];
1782 for (
int kE = 0; kE <= depos_order - 1; kE++) {
1783 const int comp_zz = depos_order - 1 - k + kE + SegShift;
1784 if (comp_zz > width_zz) {
break; }
1788 for (
int kE = 0; kE <= depos_order; kE++) {
1790 const int comp_zy = depos_order-1 - k + kE + SegShift;