114 [[maybe_unused]]
const amrex::ParticleReal yp,
115 [[maybe_unused]]
const amrex::ParticleReal zp,
116 const amrex::ParticleReal wqx,
117 const amrex::ParticleReal wqy,
118 const amrex::ParticleReal wqz,
119 const amrex::ParticleReal fpxx,
120 [[maybe_unused]]
const amrex::ParticleReal fpxy,
121 [[maybe_unused]]
const amrex::ParticleReal fpxz,
122 [[maybe_unused]]
const amrex::ParticleReal fpyx,
123 const amrex::ParticleReal fpyy,
124 [[maybe_unused]]
const amrex::ParticleReal fpyz,
125 [[maybe_unused]]
const amrex::ParticleReal fpzx,
126 [[maybe_unused]]
const amrex::ParticleReal fpzy,
127 const amrex::ParticleReal fpzz,
131 [[maybe_unused]]
int Sxx_nComp,
132 [[maybe_unused]]
int Syy_nComp,
133 [[maybe_unused]]
int Szz_nComp,
150 using namespace amrex::literals;
160#if !defined(WARPX_DIM_1D_Z)
164 const double xmid = (xp - xyzmin.
x)*dinv.
x;
171 double sx_node[depos_order + 1] = {0.};
172 double sx_cell[depos_order + 1] = {0.};
175 if (jx_type[0] ==
NODE || jy_type[0] ==
NODE || jz_type[0] ==
NODE) {
176 j_node = compute_shape_factor(sx_node, xmid);
178 if (jx_type[0] == CELL || jy_type[0] == CELL || jz_type[0] == CELL) {
179 j_cell = compute_shape_factor(sx_cell, xmid - 0.5);
183 if (j_node==j_cell) { shift[0] = 1; }
185 amrex::Real sx_jx[depos_order + 1] = {0._rt};
186 amrex::Real sx_jy[depos_order + 1] = {0._rt};
187 amrex::Real sx_jz[depos_order + 1] = {0._rt};
188 for (
int ix=0; ix<=depos_order; ix++)
190 sx_jx[ix] = ((jx_type[0] ==
NODE) ? amrex::Real(sx_node[ix]) : amrex::Real(sx_cell[ix]));
191 sx_jy[ix] = ((jy_type[0] ==
NODE) ? amrex::Real(sx_node[ix]) : amrex::Real(sx_cell[ix]));
192 sx_jz[ix] = ((jz_type[0] ==
NODE) ? amrex::Real(sx_node[ix]) : amrex::Real(sx_cell[ix]));
195 int const j_jx = ((jx_type[0] ==
NODE) ? j_node : j_cell);
196 int const j_jy = ((jy_type[0] ==
NODE) ? j_node : j_cell);
197 int const j_jz = ((jz_type[0] ==
NODE) ? j_node : j_cell);
200#if defined(WARPX_DIM_3D)
203 const double ymid = (yp - xyzmin.
y)*dinv.
y;
204 double sy_node[depos_order + 1] = {0.};
205 double sy_cell[depos_order + 1] = {0.};
208 if (jx_type[1] ==
NODE || jy_type[1] ==
NODE || jz_type[1] ==
NODE) {
209 k_node = compute_shape_factor(sy_node, ymid);
211 if (jx_type[1] == CELL || jy_type[1] == CELL || jz_type[1] == CELL) {
212 k_cell = compute_shape_factor(sy_cell, ymid - 0.5);
216 if (k_node==k_cell) { shift[1] = 1; }
218 amrex::Real sy_jx[depos_order + 1] = {0._rt};
219 amrex::Real sy_jy[depos_order + 1] = {0._rt};
220 amrex::Real sy_jz[depos_order + 1] = {0._rt};
221 for (
int iy=0; iy<=depos_order; iy++)
223 sy_jx[iy] = ((jx_type[1] ==
NODE) ? amrex::Real(sy_node[iy]) : amrex::Real(sy_cell[iy]));
224 sy_jy[iy] = ((jy_type[1] ==
NODE) ? amrex::Real(sy_node[iy]) : amrex::Real(sy_cell[iy]));
225 sy_jz[iy] = ((jz_type[1] ==
NODE) ? amrex::Real(sy_node[iy]) : amrex::Real(sy_cell[iy]));
227 int const k_jx = ((jx_type[1] ==
NODE) ? k_node : k_cell);
228 int const k_jy = ((jy_type[1] ==
NODE) ? k_node : k_cell);
229 int const k_jz = ((jz_type[1] ==
NODE) ? k_node : k_cell);
232#if !defined(WARPX_DIM_RCYLINDER) && !defined(WARPX_DIM_RSPHERE)
235 constexpr int zdir = WARPX_ZINDEX;
236 const double zmid = (zp - xyzmin.
z)*dinv.
z;
237 double sz_node[depos_order + 1] = {0.};
238 double sz_cell[depos_order + 1] = {0.};
241 if (jx_type[zdir] ==
NODE || jy_type[zdir] ==
NODE || jz_type[zdir] ==
NODE) {
242 l_node = compute_shape_factor(sz_node, zmid);
244 if (jx_type[zdir] == CELL || jy_type[zdir] == CELL || jz_type[zdir] == CELL) {
245 l_cell = compute_shape_factor(sz_cell, zmid - 0.5);
247 amrex::Real sz_jx[depos_order + 1] = {0._rt};
248 amrex::Real sz_jy[depos_order + 1] = {0._rt};
249 amrex::Real sz_jz[depos_order + 1] = {0._rt};
250 for (
int iz=0; iz<=depos_order; iz++)
252 sz_jx[iz] = ((jx_type[zdir] ==
NODE) ? amrex::Real(sz_node[iz]) : amrex::Real(sz_cell[iz]));
253 sz_jy[iz] = ((jy_type[zdir] ==
NODE) ? amrex::Real(sz_node[iz]) : amrex::Real(sz_cell[iz]));
254 sz_jz[iz] = ((jz_type[zdir] ==
NODE) ? amrex::Real(sz_node[iz]) : amrex::Real(sz_cell[iz]));
256 int const l_jx = ((jx_type[zdir] ==
NODE) ? l_node : l_cell);
257 int const l_jy = ((jy_type[zdir] ==
NODE) ? l_node : l_cell);
258 int const l_jz = ((jz_type[zdir] ==
NODE) ? l_node : l_cell);
261 if (l_node==l_cell) { shift[zdir] = 1; }
267 for (
int dir=0; dir<AMREX_SPACEDIM; dir++) {
268 offset_xy[dir] = (jx_type[dir] + jy_type[dir]) % 2;
269 offset_xz[dir] = (jx_type[dir] + jz_type[dir]) % 2;
270 offset_yz[dir] = (jy_type[dir] + jz_type[dir]) % 2;
274#if defined(WARPX_DIM_1D_Z)
275 for (
int iz=0; iz<=depos_order; iz++){
277 &jx_arr(lo.
x+l_jx+iz, 0, 0, 0),
280 &jy_arr(lo.
x+l_jy+iz, 0, 0, 0),
283 &jz_arr(lo.
x+l_jz+iz, 0, 0, 0),
285 for (
int aa=0; aa<=depos_order; aa++){
287 if (Sxx_nComp==1 && aa==iz) {
289 &Sxx_arr(lo.
x+l_jx+iz, 0, 0, 0),
290 sz_jx[iz]*sz_jx[aa]*fpxx);
292 else if (Sxx_nComp>1) {
293 int Nc = depos_order + aa - iz;
295 &Sxx_arr(lo.
x+l_jx+iz, 0, 0, Nc),
296 sz_jx[iz]*sz_jx[aa]*fpxx);
297 Nc = depos_order + shift[0]*offset_xy[0] + aa - iz;
299 &Sxy_arr(lo.
x+l_jx+iz, 0, 0, Nc),
300 sz_jx[iz]*sz_jy[aa]*fpxy);
301 Nc = depos_order + shift[0]*offset_xz[0] + aa - iz;
303 &Sxz_arr(lo.
x+l_jx+iz, 0, 0, Nc),
304 sz_jx[iz]*sz_jz[aa]*fpxz);
307 if (Syy_nComp==1 && aa==iz) {
309 &Syy_arr(lo.
x+l_jy+iz, 0, 0, 0),
310 sz_jy[iz]*sz_jy[aa]*fpyy);
312 else if (Syy_nComp>1) {
313 int Nc = depos_order + shift[0]*offset_xy[0] + aa - iz;
315 &Syx_arr(lo.
x+l_jy+iz, 0, 0, Nc),
316 sz_jy[iz]*sz_jx[aa]*fpyx);
317 Nc = depos_order + aa - iz;
319 &Syy_arr(lo.
x+l_jy+iz, 0, 0, Nc),
320 sz_jy[iz]*sz_jy[aa]*fpyy);
321 Nc = depos_order + shift[0]*offset_yz[0] + aa - iz;
323 &Syz_arr(lo.
x+l_jy+iz, 0, 0, Nc),
324 sz_jy[iz]*sz_jz[aa]*fpyz);
327 if (Szz_nComp==1 && aa==iz) {
329 &Szz_arr(lo.
x+l_jz+iz, 0, 0, 0),
330 sz_jz[iz]*sz_jz[aa]*fpzz);
332 else if(Szz_nComp>1) {
333 int Nc = depos_order + 1 - shift[0]*offset_xz[0] + aa - iz;
335 &Szx_arr(lo.
x+l_jz+iz, 0, 0, Nc),
336 sz_jz[iz]*sz_jx[aa]*fpzx);
337 Nc = depos_order + 1 - shift[0]*offset_yz[0] + aa - iz;
339 &Szy_arr(lo.
x+l_jz+iz, 0, 0, Nc),
340 sz_jz[iz]*sz_jy[aa]*fpzy);
341 Nc = depos_order + aa - iz;
343 &Szz_arr(lo.
x+l_jz+iz, 0, 0, Nc),
344 sz_jz[iz]*sz_jz[aa]*fpzz);
348#elif defined(WARPX_DIM_RCYLINDER) || defined(WARPX_DIM_RSPHERE)
349 for (
int ix=0; ix<=depos_order; ix++){
351 &jx_arr(lo.
x+j_jx+ix, 0, 0, 0),
354 &jy_arr(lo.
x+j_jy+ix, 0, 0, 0),
357 &jz_arr(lo.
x+j_jz+ix, 0, 0, 0),
361 &Sxx_arr(lo.
x+j_jx+ix, 0, 0, 0),
362 sx_jx[ix]*sx_jx[ix]*fpxx);
364 &Syy_arr(lo.
x+j_jy+ix, 0, 0, 0),
365 sx_jy[ix]*sx_jy[ix]*fpyy);
367 &Szz_arr(lo.
x+j_jz+ix, 0, 0, 0),
368 sx_jz[ix]*sx_jz[ix]*fpzz);
370#elif defined(WARPX_DIM_XZ) || defined(WARPX_DIM_RZ)
371 const int base_offset = 1 + 2*depos_order;
372 for (
int iz=0; iz<=depos_order; iz++){
373 for (
int ix=0; ix<=depos_order; ix++){
374 const amrex::Real weight_Jx = sx_jx[ix]*sz_jx[iz];
375 const amrex::Real weight_Jy = sx_jy[ix]*sz_jy[iz];
376 const amrex::Real weight_Jz = sx_jz[ix]*sz_jz[iz];
378 &jx_arr(lo.
x+j_jx+ix, lo.
y+l_jx+iz, 0, 0),
381 &jy_arr(lo.
x+j_jy+ix, lo.
y+l_jy+iz, 0, 0),
384 &jz_arr(lo.
x+j_jz+ix, lo.
y+l_jz+iz, 0, 0),
386 for (
int bb=0; bb<=depos_order; bb++){
387 for (
int aa=0; aa<=depos_order; aa++){
388 const amrex::Real weight_Ex = sx_jx[aa]*sz_jx[bb];
389 const amrex::Real weight_Ey = sx_jy[aa]*sz_jy[bb];
390 const amrex::Real weight_Ez = sx_jz[aa]*sz_jz[bb];
392 if (Sxx_nComp==1 && aa==ix && bb==iz) {
394 &Sxx_arr(lo.
x+j_jx+ix, lo.
y+l_jx+iz, 0, 0),
395 weight_Jx*weight_Ex*fpxx);
397 else if (Sxx_nComp>1) {
399 int Nc = depos_order + aa - ix
400 + (depos_order + bb - iz)*
offset;
402 &Sxx_arr(lo.
x+j_jx+ix, lo.
y+l_jx+iz, 0, Nc),
403 weight_Jx*weight_Ex*fpxx);
404 offset = base_offset + offset_xy[0];
405 Nc = depos_order + 1 - shift[0]*offset_xy[0] + aa - ix
406 + (depos_order + shift[1]*offset_xy[1] + bb - iz)*
offset;
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 = depos_order + 1 - shift[0]*offset_xz[0] + aa - ix
412 + (depos_order + shift[1]*offset_xz[1] + bb - iz)*
offset;
414 &Sxz_arr(lo.
x+j_jx+ix, lo.
y+l_jx+iz, 0, Nc),
415 weight_Jx*weight_Ez*fpxz);
418 if (Syy_nComp==1 && aa==ix && bb==iz) {
420 &Syy_arr(lo.
x+j_jy+ix, lo.
y+l_jy+iz, 0, 0),
421 weight_Jy*weight_Ey*fpyy);
423 else if (Syy_nComp>1) {
425 int Nc = depos_order + aa - ix
426 + (depos_order + bb - iz)*
offset;
428 &Syy_arr(lo.
x+j_jy+ix, lo.
y+l_jy+iz, 0, Nc),
429 weight_Jy*weight_Ey*fpyy);
430 offset = base_offset + offset_xy[0];
431 Nc = depos_order + shift[0]*offset_xy[0] + aa - ix
432 + (depos_order + shift[1]*offset_xy[1] + bb - iz)*
offset;
434 &Syx_arr(lo.
x+j_jy+ix, lo.
y+l_jy+iz, 0, Nc),
435 weight_Jy*weight_Ex*fpyx);
436 offset = base_offset + offset_yz[0];
437 Nc = depos_order + shift[0]*offset_yz[0] + aa - ix
438 + (depos_order + shift[1]*offset_yz[1] + bb - iz)*
offset;
440 &Syz_arr(lo.
x+j_jy+ix, lo.
y+l_jy+iz, 0, Nc),
441 weight_Jy*weight_Ez*fpyz);
444 if (Szz_nComp==1 && aa==ix && bb==iz) {
446 &Szz_arr(lo.
x+j_jz+ix, lo.
y+l_jz+iz, 0, 0),
447 weight_Jz*weight_Ez*fpzz);
449 else if (Szz_nComp>1) {
451 int Nc = depos_order + aa - ix
452 + (depos_order + bb - iz)*
offset;
454 &Szz_arr(lo.
x+j_jz+ix, lo.
y+l_jz+iz, 0, Nc),
455 weight_Jz*weight_Ez*fpzz);
456 offset = base_offset + offset_xz[0];
457 Nc = depos_order + shift[0]*offset_xz[0] + aa - ix
458 + (depos_order + 1 - shift[1]*offset_xz[1] + bb - iz)*
offset;
460 &Szx_arr(lo.
x+j_jz+ix, lo.
y+l_jz+iz, 0, Nc),
461 weight_Jz*weight_Ex*fpzx);
462 offset = base_offset + offset_yz[0];
463 Nc = depos_order + shift[0]*offset_yz[0] + aa - ix
464 + (depos_order + 1 - shift[1]*offset_yz[1] + bb - iz)*
offset;
466 &Szy_arr(lo.
x+j_jz+ix, lo.
y+l_jz+iz, 0, Nc),
467 weight_Jz*weight_Ey*fpzy);
473#elif defined(WARPX_DIM_3D)
474 for (
int iz=0; iz<=depos_order; iz++){
475 for (
int iy=0; iy<=depos_order; iy++){
476 for (
int ix=0; ix<=depos_order; ix++){
477 const amrex::Real weight_Jx = sx_jx[ix]*sy_jx[iy]*sz_jx[iz];
478 const amrex::Real weight_Jy = sx_jy[ix]*sy_jy[iy]*sz_jy[iz];
479 const amrex::Real weight_Jz = sx_jz[ix]*sy_jz[iy]*sz_jz[iz];
481 &jx_arr(lo.
x+j_jx+ix, lo.
y+k_jx+iy, lo.
z+l_jx+iz),
484 &jy_arr(lo.
x+j_jy+ix, lo.
y+k_jy+iy, lo.
z+l_jy+iz),
487 &jz_arr(lo.
x+j_jz+ix, lo.
y+k_jz+iy, lo.
z+l_jz+iz),
491 &Sxx_arr(lo.
x+j_jx+ix, lo.
y+k_jx+iy, lo.
z+l_jx+iz, 0),
492 weight_Jx*weight_Jx*fpxx);
494 &Syy_arr(lo.
x+j_jy+ix, lo.
y+k_jy+iy, lo.
z+l_jy+iz, 0),
495 weight_Jy*weight_Jy*fpyy);
497 &Szz_arr(lo.
x+j_jz+ix, lo.
y+k_jz+iy, lo.
z+l_jz+iz, 0),
498 weight_Jz*weight_Jz*fpzz);
663 [[maybe_unused]]
const amrex::ParticleReal yp_old,
664 [[maybe_unused]]
const amrex::ParticleReal zp_old,
665 [[maybe_unused]]
const amrex::ParticleReal xp_new,
666 [[maybe_unused]]
const amrex::ParticleReal yp_new,
667 [[maybe_unused]]
const amrex::ParticleReal zp_new,
668 const amrex::ParticleReal wq_invvol,
669 [[maybe_unused]]
const amrex::ParticleReal uxp_mid,
670 [[maybe_unused]]
const amrex::ParticleReal uyp_mid,
671 [[maybe_unused]]
const amrex::ParticleReal uzp_mid,
672 [[maybe_unused]]
const amrex::ParticleReal gaminv,
673 const amrex::ParticleReal fpxx,
674 [[maybe_unused]]
const amrex::ParticleReal fpxy,
675 [[maybe_unused]]
const amrex::ParticleReal fpxz,
676 [[maybe_unused]]
const amrex::ParticleReal fpyx,
677 const amrex::ParticleReal fpyy,
678 [[maybe_unused]]
const amrex::ParticleReal fpyz,
679 [[maybe_unused]]
const amrex::ParticleReal fpzx,
680 [[maybe_unused]]
const amrex::ParticleReal fpzy,
681 const amrex::ParticleReal fpzz,
685 [[maybe_unused]]
int max_crossings,
695 const amrex::Real dt,
701 using namespace amrex::literals;
703#if (AMREX_SPACEDIM > 1)
704 amrex::Real
constexpr one_third = 1.0_rt / 3.0_rt;
705 amrex::Real
constexpr one_sixth = 1.0_rt / 6.0_rt;
709#if defined(WARPX_DIM_RZ) || defined(WARPX_DIM_RCYLINDER)
710 amrex::Real
const xp_mid = (xp_new + xp_old)*0.5_rt;
711 amrex::Real
const yp_mid = (yp_new + yp_old)*0.5_rt;
712 amrex::Real
const rp_new = std::sqrt(xp_new*xp_new + yp_new*yp_new);
713 amrex::Real
const rp_old = std::sqrt(xp_old*xp_old + yp_old*yp_old);
714 amrex::Real
const rp_mid = (rp_new + rp_old)/2._rt;
715 amrex::Real
const costheta_mid = (rp_mid > 0._rt ? xp_mid/rp_mid : 1._rt);
716 amrex::Real
const sintheta_mid = (rp_mid > 0._rt ? yp_mid/rp_mid : 0._rt);
719 double const x_new = (rp_new - xyzmin.
x)*dinv.
x;
720 double const x_old = (rp_old - xyzmin.
x)*dinv.
x;
721 amrex::Real
const vx = (rp_new - rp_old)/dt;
722 amrex::Real
const vy = (-uxp_mid*sintheta_mid + uyp_mid*costheta_mid)*gaminv;
723#if defined(WARPX_DIM_RCYLINDER)
724 amrex::Real
const vz = uzp_mid*gaminv;
726#elif defined(WARPX_DIM_RSPHERE)
727 amrex::Real
const xp_mid = (xp_new + xp_old)*0.5_rt;
728 amrex::Real
const yp_mid = (yp_new + yp_old)*0.5_rt;
729 amrex::Real
const zp_mid = (zp_new + zp_old)*0.5_rt;
730 amrex::Real
const rpxy_new = std::sqrt(xp_new*xp_new + yp_new*yp_new);
731 amrex::Real
const rp_new = std::sqrt(xp_new*xp_new + yp_new*yp_new + zp_new*zp_new);
732 amrex::Real
const rpxy_old = std::sqrt(xp_old*xp_old + yp_old*yp_old);
733 amrex::Real
const rp_old = std::sqrt(xp_old*xp_old + yp_old*yp_old + zp_old*zp_old);
734 amrex::Real
const rpxy_mid = (rpxy_new + rpxy_old)*0.5_rt;
735 amrex::Real
const rp_mid = (rp_new + rp_old)*0.5_rt;
736 amrex::Real
const costheta_mid = (rpxy_mid > 0._rt ? xp_mid/rpxy_mid : 1._rt);
737 amrex::Real
const sintheta_mid = (rpxy_mid > 0._rt ? yp_mid/rpxy_mid : 0._rt);
738 amrex::Real
const cosphi_mid = (rp_mid > 0._rt ? rpxy_mid/rp_mid : 1._rt);
739 amrex::Real
const sinphi_mid = (rp_mid > 0._rt ? zp_mid/rp_mid : 0._rt);
742 double const x_new = (rp_new - xyzmin.
x)*dinv.
x;
743 double const x_old = (rp_old - xyzmin.
x)*dinv.
x;
744 amrex::Real
const vx = (rp_new - rp_old)/dt;
745 amrex::Real
const vy = (-uxp_mid*sintheta_mid + uyp_mid*costheta_mid)*gaminv;
746 amrex::Real
const vz = (-uxp_mid*costheta_mid*cosphi_mid - uyp_mid*sintheta_mid*cosphi_mid + uzp_mid*sinphi_mid)*gaminv;
747#elif defined(WARPX_DIM_XZ)
749 double const x_new = (xp_new - xyzmin.
x)*dinv.
x;
750 double const x_old = (xp_old - xyzmin.
x)*dinv.
x;
751 amrex::Real
const vx = (xp_new - xp_old)/dt;
752 amrex::Real
const vy = uyp_mid*gaminv;
753#elif defined(WARPX_DIM_1D_Z)
754 amrex::Real
const vx = uxp_mid*gaminv;
755 amrex::Real
const vy = uyp_mid*gaminv;
756#elif defined(WARPX_DIM_3D)
758 double const x_new = (xp_new - xyzmin.
x)*dinv.
x;
759 double const x_old = (xp_old - xyzmin.
x)*dinv.
x;
760 double const y_new = (yp_new - xyzmin.
y)*dinv.
y;
761 double const y_old = (yp_old - xyzmin.
y)*dinv.
y;
762 amrex::Real
const vx = (xp_new - xp_old)/dt;
763 amrex::Real
const vy = (yp_new - yp_old)/dt;
766#if !defined(WARPX_DIM_RCYLINDER) && !defined(WARPX_DIM_RSPHERE)
768 double const z_new = (zp_new - xyzmin.
z)*dinv.
z;
769 double const z_old = (zp_old - xyzmin.
z)*dinv.
z;
770 amrex::Real
const vz = (zp_new - zp_old)/dt;
774 amrex::Real
const wqx = wq_invvol*vx;
775 amrex::Real
const wqy = wq_invvol*vy;
776 amrex::Real
const wqz = wq_invvol*
vz;
784 int num_segments = 1;
786 if ( (depos_order % 2) == 0 ) { shift = 0.5; }
788#if defined(WARPX_DIM_3D)
791 const auto i_old =
static_cast<int>(x_old-shift);
792 const auto i_new =
static_cast<int>(x_new-shift);
793 const int cell_crossings_x = std::abs(i_new-i_old);
794 num_segments += cell_crossings_x;
797 const auto j_old =
static_cast<int>(y_old-shift);
798 const auto j_new =
static_cast<int>(y_new-shift);
799 const int cell_crossings_y = std::abs(j_new-j_old);
800 num_segments += cell_crossings_y;
803 const auto k_old =
static_cast<int>(z_old-shift);
804 const auto k_new =
static_cast<int>(z_new-shift);
805 const int cell_crossings_z = std::abs(k_new-k_old);
806 num_segments += cell_crossings_z;
811 const double dxp = x_new - x_old;
812 const double dyp = y_new - y_old;
813 const double dzp = z_new - z_old;
814 const auto dirX_sign =
static_cast<double>(dxp < 0. ? -1. : 1.);
815 const auto dirY_sign =
static_cast<double>(dyp < 0. ? -1. : 1.);
816 const auto dirZ_sign =
static_cast<double>(dzp < 0. ? -1. : 1.);
817 double Xcell = 0., Ycell = 0., Zcell = 0.;
818 if (num_segments > 1) {
819 Xcell =
static_cast<double>(i_old) + shift + 0.5*(1.-dirX_sign);
820 Ycell =
static_cast<double>(j_old) + shift + 0.5*(1.-dirY_sign);
821 Zcell =
static_cast<double>(k_old) + shift + 0.5*(1.-dirZ_sign);
827 double dxp_seg, dyp_seg, dzp_seg;
828 double x0_new, y0_new, z0_new;
829 double x0_old = x_old;
830 double y0_old = y_old;
831 double z0_old = z_old;
833 for (
int ns=0; ns<num_segments; ns++) {
835 if (ns == num_segments-1) {
840 dxp_seg = x0_new - x0_old;
841 dyp_seg = y0_new - y0_old;
842 dzp_seg = z0_new - z0_old;
847 x0_new = Xcell + dirX_sign;
848 y0_new = Ycell + dirY_sign;
849 z0_new = Zcell + dirZ_sign;
850 dxp_seg = x0_new - x0_old;
851 dyp_seg = y0_new - y0_old;
852 dzp_seg = z0_new - z0_old;
854 if ( (dyp == 0. || std::abs(dxp_seg) < std::abs(dxp/dyp*dyp_seg))
855 && (dzp == 0. || std::abs(dxp_seg) < std::abs(dxp/dzp*dzp_seg)) ) {
857 dyp_seg = dyp/dxp*dxp_seg;
858 dzp_seg = dzp/dxp*dxp_seg;
859 y0_new = y0_old + dyp_seg;
860 z0_new = z0_old + dzp_seg;
862 else if (dzp == 0. || std::abs(dyp_seg) < std::abs(dyp/dzp*dzp_seg)) {
864 dxp_seg = dxp/dyp*dyp_seg;
865 dzp_seg = dzp/dyp*dyp_seg;
866 x0_new = x0_old + dxp_seg;
867 z0_new = z0_old + dzp_seg;
871 dxp_seg = dxp/dzp*dzp_seg;
872 dyp_seg = dyp/dzp*dzp_seg;
873 x0_new = x0_old + dxp_seg;
874 y0_new = y0_old + dyp_seg;
880 const auto seg_factor_x =
static_cast<amrex::Real
>(dxp == 0. ? 1._rt : dxp_seg/dxp);
881 const auto seg_factor_y =
static_cast<amrex::Real
>(dyp == 0. ? 1._rt : dyp_seg/dyp);
882 const auto seg_factor_z =
static_cast<amrex::Real
>(dzp == 0. ? 1._rt : dzp_seg/dzp);
886 double sx_cell[depos_order] = {0.};
887 double sy_cell[depos_order] = {0.};
888 double sz_cell[depos_order] = {0.};
889 double const x0_bar = (x0_new + x0_old)/2.0;
890 double const y0_bar = (y0_new + y0_old)/2.0;
891 double const z0_bar = (z0_new + z0_old)/2.0;
892 const int i0_cell = compute_shape_factor_cell( sx_cell, x0_bar-0.5 );
893 const int j0_cell = compute_shape_factor_cell( sy_cell, y0_bar-0.5 );
894 const int k0_cell = compute_shape_factor_cell( sz_cell, z0_bar-0.5 );
896 if constexpr (depos_order >= 3) {
898 double sx_old_cell[depos_order] = {0.};
899 double sx_new_cell[depos_order] = {0.};
900 double sy_old_cell[depos_order] = {0.};
901 double sy_new_cell[depos_order] = {0.};
902 double sz_old_cell[depos_order] = {0.};
903 double sz_new_cell[depos_order] = {0.};
904 const int i0_cell_2 = compute_shape_factors_cell( sx_old_cell, sx_new_cell, x0_old-0.5, x0_new-0.5 );
905 const int j0_cell_2 = compute_shape_factors_cell( sy_old_cell, sy_new_cell, y0_old-0.5, y0_new-0.5 );
906 const int k0_cell_2 = compute_shape_factors_cell( sz_old_cell, sz_new_cell, z0_old-0.5, z0_new-0.5 );
908 for (
int m=0; m<depos_order; m++) {
909 sx_cell[m] = (4.0*sx_cell[m] + sx_old_cell[m] + sx_new_cell[m])/6.0;
910 sy_cell[m] = (4.0*sy_cell[m] + sy_old_cell[m] + sy_new_cell[m])/6.0;
911 sz_cell[m] = (4.0*sz_cell[m] + sz_old_cell[m] + sz_new_cell[m])/6.0;
917 double sx_old_node[depos_order+1] = {0.};
918 double sx_new_node[depos_order+1] = {0.};
919 double sy_old_node[depos_order+1] = {0.};
920 double sy_new_node[depos_order+1] = {0.};
921 double sz_old_node[depos_order+1] = {0.};
922 double sz_new_node[depos_order+1] = {0.};
923 const int i0_node = compute_shape_factors_node( sx_old_node, sx_new_node, x0_old, x0_new );
924 const int j0_node = compute_shape_factors_node( sy_old_node, sy_new_node, y0_old, y0_new );
925 const int k0_node = compute_shape_factors_node( sz_old_node, sz_new_node, z0_old, z0_new );
929 for (
int i=0; i<=depos_order-1; i++) {
930 for (
int j=0; j<=depos_order; j++) {
931 for (
int k=0; k<=depos_order; k++) {
932 weight = sx_cell[i]*( sy_old_node[j]*sz_old_node[k]*one_third
933 + sy_old_node[j]*sz_new_node[k]*one_sixth
934 + sy_new_node[j]*sz_old_node[k]*one_sixth
935 + sy_new_node[j]*sz_new_node[k]*one_third )*seg_factor_x;
943 for (
int i=0; i<=depos_order; i++) {
944 for (
int j=0; j<=depos_order-1; j++) {
945 for (
int k=0; k<=depos_order; k++) {
946 weight = sy_cell[j]*( sx_old_node[i]*sz_old_node[k]*one_third
947 + sx_old_node[i]*sz_new_node[k]*one_sixth
948 + sx_new_node[i]*sz_old_node[k]*one_sixth
949 + sx_new_node[i]*sz_new_node[k]*one_third )*seg_factor_y;
957 for (
int i=0; i<=depos_order; i++) {
958 for (
int j=0; j<=depos_order; j++) {
959 for (
int k=0; k<=depos_order-1; k++) {
960 weight = sz_cell[k]*( sx_old_node[i]*sy_old_node[j]*one_third
961 + sx_old_node[i]*sy_new_node[j]*one_sixth
962 + sx_new_node[i]*sy_old_node[j]*one_sixth
963 + sx_new_node[i]*sy_new_node[j]*one_third )*seg_factor_z;
971 if (ns < num_segments-1) {
979#elif defined(WARPX_DIM_XZ) || defined(WARPX_DIM_RZ)
982 const auto i_old =
static_cast<int>(x_old-shift);
983 const auto i_new =
static_cast<int>(x_new-shift);
984 const int cell_crossings_x = std::abs(i_new-i_old);
985 num_segments += cell_crossings_x;
988 const auto k_old =
static_cast<int>(z_old-shift);
989 const auto k_new =
static_cast<int>(z_new-shift);
990 const int cell_crossings_z = std::abs(k_new-k_old);
991 num_segments += cell_crossings_z;
996 const double dxp = x_new - x_old;
997 const double dzp = z_new - z_old;
998 const auto dirX_sign =
static_cast<double>(dxp < 0. ? -1. : 1.);
999 const auto dirZ_sign =
static_cast<double>(dzp < 0. ? -1. : 1.);
1000 double Xcell = 0., Zcell = 0.;
1001 if (num_segments > 1) {
1002 Xcell =
static_cast<double>(i_old) + shift + 0.5*(1.-dirX_sign);
1003 Zcell =
static_cast<double>(k_old) + shift + 0.5*(1.-dirZ_sign);
1009 double dxp_seg, dzp_seg;
1010 double x0_new, z0_new;
1011 double x0_old = x_old;
1012 double z0_old = z_old;
1014 constexpr int num_segments_max = 1 + 4*AMREX_SPACEDIM;
1016 "Error: num_segments must be less than or equal to 1 + 4*AMREX_SPACEDIM.");
1019 int i0_cell[num_segments_max];
1020 int i0_node[num_segments_max];
1021 int k0_cell[num_segments_max];
1022 int k0_node[num_segments_max];
1023 amrex::Real weight_cellX_nodeZ[num_segments_max][depos_order][depos_order+1];
1024 amrex::Real weight_nodeX_cellZ[num_segments_max][depos_order+1][depos_order];
1025 amrex::Real weight_nodeX_nodeZ[num_segments_max][depos_order+1][depos_order+1];
1027 const auto i_mid =
static_cast<int>(0.5*(x_new+x_old)-shift);
1028 const auto k_mid =
static_cast<int>(0.5*(z_new+z_old)-shift);
1029 int SegNumX[num_segments_max];
1030 int SegNumZ[num_segments_max];
1032 for (
int ns=0; ns<num_segments; ns++) {
1034 if (ns == num_segments-1) {
1038 dxp_seg = x0_new - x0_old;
1039 dzp_seg = z0_new - z0_old;
1044 x0_new = Xcell + dirX_sign;
1045 z0_new = Zcell + dirZ_sign;
1046 dxp_seg = x0_new - x0_old;
1047 dzp_seg = z0_new - z0_old;
1049 if (dzp == 0. || std::abs(dxp_seg) < std::abs(dxp/dzp*dzp_seg)) {
1051 dzp_seg = dzp/dxp*dxp_seg;
1052 z0_new = z0_old + dzp_seg;
1056 dxp_seg = dxp/dzp*dzp_seg;
1057 x0_new = x0_old + dxp_seg;
1063 const auto seg_factor_x =
static_cast<amrex::Real
>(dxp == 0. ? 1._rt : dxp_seg/dxp);
1064 const auto seg_factor_z =
static_cast<amrex::Real
>(dzp == 0. ? 1._rt : dzp_seg/dzp);
1068 double sx_cell[depos_order] = {0.};
1069 double sz_cell[depos_order] = {0.};
1070 double const x0_bar = (x0_new + x0_old)/2.0;
1071 double const z0_bar = (z0_new + z0_old)/2.0;
1072 i0_cell[ns] = compute_shape_factor_cell( sx_cell, x0_bar-0.5 );
1073 k0_cell[ns] = compute_shape_factor_cell( sz_cell, z0_bar-0.5 );
1076 if constexpr (full_mass_matrices) {
1077 const auto i0_mid =
static_cast<int>(x0_bar-shift);
1078 const auto k0_mid =
static_cast<int>(z0_bar-shift);
1079 SegNumX[ns] = 1 + i0_mid - i_mid;
1080 SegNumZ[ns] = 1 + k0_mid - k_mid;
1083 if constexpr (depos_order >= 3) {
1085 double sx_old_cell[depos_order] = {0.};
1086 double sx_new_cell[depos_order] = {0.};
1087 double sz_old_cell[depos_order] = {0.};
1088 double sz_new_cell[depos_order] = {0.};
1089 const int i0_cell_2 = compute_shape_factors_cell( sx_old_cell, sx_new_cell, x0_old-0.5, x0_new-0.5 );
1090 const int k0_cell_2 = compute_shape_factors_cell( sz_old_cell, sz_new_cell, z0_old-0.5, z0_new-0.5 );
1092 for (
int m=0; m<depos_order; m++) {
1093 sx_cell[m] = (4.0*sx_cell[m] + sx_old_cell[m] + sx_new_cell[m])/6.0;
1094 sz_cell[m] = (4.0*sz_cell[m] + sz_old_cell[m] + sz_new_cell[m])/6.0;
1100 double sx_old_node[depos_order+1] = {0.};
1101 double sx_new_node[depos_order+1] = {0.};
1102 double sz_old_node[depos_order+1] = {0.};
1103 double sz_new_node[depos_order+1] = {0.};
1104 i0_node[ns] = compute_shape_factors_node( sx_old_node, sx_new_node, x0_old, x0_new );
1105 k0_node[ns] = compute_shape_factors_node( sz_old_node, sz_new_node, z0_old, z0_new );
1109 for (
int i=0; i<=depos_order-1; i++) {
1110 for (
int k=0; k<=depos_order; k++) {
1111 const int i_J = lo.
x + i0_cell[ns] + i;
1112 const int k_J = lo.
y + k0_node[ns] + k;
1113 weight = sx_cell[i]*(sz_old_node[k] + sz_new_node[k])/2.0_rt*seg_factor_x;
1115 if constexpr (full_mass_matrices) { weight_cellX_nodeZ[ns][i][k] = weight; }
1123 const auto seg_factor_y = std::min(seg_factor_x,seg_factor_z);
1124 for (
int i=0; i<=depos_order; i++) {
1125 for (
int k=0; k<=depos_order; k++) {
1126 const int i_J = lo.
x + i0_node[ns] + i;
1127 const int k_J = lo.
y + k0_node[ns] + k;
1128 weight = ( sx_old_node[i]*sz_old_node[k]*one_third
1129 + sx_old_node[i]*sz_new_node[k]*one_sixth
1130 + sx_new_node[i]*sz_old_node[k]*one_sixth
1131 + sx_new_node[i]*sz_new_node[k]*one_third )*seg_factor_y;
1133 if constexpr (full_mass_matrices) { weight_nodeX_nodeZ[ns][i][k] = weight; }
1141 for (
int i=0; i<=depos_order; i++) {
1142 for (
int k=0; k<=depos_order-1; k++) {
1143 const int i_J = lo.
x + i0_node[ns] + i;
1144 const int k_J = lo.
y + k0_cell[ns] + k;
1145 weight = sz_cell[k]*(sx_old_node[i] + sx_new_node[i])/2.0_rt*seg_factor_z;
1147 if constexpr (full_mass_matrices) { weight_nodeX_cellZ[ns][i][k] = weight; }
1155 if (ns < num_segments-1) {
1162 if constexpr (full_mass_matrices) {
1165 for (
int ns=0; ns<num_segments; ns++) {
1168 for (
int i=0; i<=depos_order-1; i++) {
1169 for (
int k=0; k<=depos_order; k++) {
1170 const int i_J = lo.
x + i0_cell[ns] + i;
1171 const int k_J = lo.
y + k0_node[ns] + k;
1172 const amrex::Real weight_J = weight_cellX_nodeZ[ns][i][k];
1173 for (
int ms=0; ms<num_segments; ms++) {
1174 const int SegShiftX = max_crossings + SegNumX[ms] - SegNumX[ns];
1175 const int SegShiftZ = max_crossings + SegNumZ[ms] - SegNumZ[ns];
1177 const int Ncomp_xx0 = 1 + 2*(depos_order-1) + 2*max_crossings;
1178 for (
int iE=0; iE<=depos_order-1; iE++) {
1179 for (
int kE=0; kE<=depos_order; kE++) {
1180 const amrex::Real weight_E = weight_cellX_nodeZ[ms][iE][kE];
1181 const int comp_xx = depos_order-1 - i + iE + SegShiftX
1182 + Ncomp_xx0*(depos_order - k + kE + SegShiftZ);
1187 const int Ncomp_xz0 = 2*depos_order + 2*max_crossings;
1188 for (
int iE=0; iE<=depos_order; iE++) {
1189 for (
int kE=0; kE<=depos_order-1; kE++) {
1190 const amrex::Real weight_E = weight_nodeX_cellZ[ms][iE][kE];
1191 const int comp_xz = depos_order-1 - i + iE + SegShiftX
1192 + Ncomp_xz0*(depos_order - k + kE + SegShiftZ);
1197 const int Ncomp_xy0 = 2*depos_order + 2*max_crossings;
1198 for (
int iE=0; iE<=depos_order; iE++) {
1199 for (
int kE=0; kE<=depos_order; kE++) {
1200 const amrex::Real weight_E = weight_nodeX_nodeZ[ms][iE][kE];
1201 const int comp_xy = depos_order-1 - i + iE + SegShiftX
1202 + Ncomp_xy0*(depos_order - k + kE + SegShiftZ);
1212 for (
int i=0; i<=depos_order; i++) {
1213 for (
int k=0; k<=depos_order-1; k++) {
1214 const int i_J = lo.
x + i0_node[ns] + i;
1215 const int k_J = lo.
y + k0_cell[ns] + k;
1216 const amrex::Real weight_J = weight_nodeX_cellZ[ns][i][k];
1217 for (
int ms=0; ms<num_segments; ms++) {
1218 const int SegShiftX = max_crossings + SegNumX[ms] - SegNumX[ns];
1219 const int SegShiftZ = max_crossings + SegNumZ[ms] - SegNumZ[ns];
1221 const int Ncomp_zx0 = 2*depos_order + 2*max_crossings;
1222 for (
int iE=0; iE<=depos_order-1; iE++) {
1223 for (
int kE=0; kE<=depos_order; kE++) {
1224 const amrex::Real weight_E = weight_cellX_nodeZ[ms][iE][kE];
1225 const int comp_zx = depos_order - i + iE + SegShiftX
1226 + Ncomp_zx0*(depos_order-1 - k + kE + SegShiftZ);
1231 const int Ncomp_zz0 = 1 + 2*depos_order + 2*max_crossings;
1232 for (
int iE=0; iE<=depos_order; iE++) {
1233 for (
int kE=0; kE<=depos_order-1; kE++) {
1234 const amrex::Real weight_E = weight_nodeX_cellZ[ms][iE][kE];
1235 const int comp_zz = depos_order - i + iE + SegShiftX
1236 + Ncomp_zz0*(depos_order-1 - k + kE + SegShiftZ);
1241 const int Ncomp_zy0 = 1 + 2*depos_order + 2*max_crossings;
1242 for (
int iE=0; iE<=depos_order; iE++) {
1243 for (
int kE=0; kE<=depos_order; kE++) {
1244 const amrex::Real weight_E = weight_nodeX_nodeZ[ms][iE][kE];
1245 const int comp_zy = depos_order - i + iE + SegShiftX
1246 + Ncomp_zy0*(depos_order-1 - k + kE + SegShiftZ);
1256 for (
int i=0; i<=depos_order; i++) {
1257 for (
int k=0; k<=depos_order; k++) {
1258 const int i_J = lo.
x + i0_node[ns] + i;
1259 const int k_J = lo.
y + k0_node[ns] + k;
1260 const amrex::Real weight_J = weight_nodeX_nodeZ[ns][i][k];
1261 for (
int ms=0; ms<num_segments; ms++) {
1262 const int SegShiftX = max_crossings + SegNumX[ms] - SegNumX[ns];
1263 const int SegShiftZ = max_crossings + SegNumZ[ms] - SegNumZ[ns];
1265 const int Ncomp_yx0 = 2*depos_order + 2*max_crossings;
1266 for (
int iE=0; iE<=depos_order-1; iE++) {
1267 for (
int kE=0; kE<=depos_order; kE++) {
1268 const amrex::Real weight_E = weight_cellX_nodeZ[ms][iE][kE];
1269 const int comp_yx = depos_order - i + iE + SegShiftX
1270 + Ncomp_yx0*(depos_order - k + kE + SegShiftZ);
1275 const int Ncomp_yz0 = 1 + 2*depos_order + 2*max_crossings;
1276 for (
int iE=0; iE<=depos_order; iE++) {
1277 for (
int kE=0; kE<=depos_order-1; kE++) {
1278 const amrex::Real weight_E = weight_nodeX_cellZ[ms][iE][kE];
1279 const int comp_yz = depos_order - i + iE + SegShiftX
1280 + Ncomp_yz0*(depos_order - k + kE + SegShiftZ);
1285 const int Ncomp_yy0 = 1 + 2*depos_order + 2*max_crossings;
1286 for (
int iE=0; iE<=depos_order; iE++) {
1287 for (
int kE=0; kE<=depos_order; kE++) {
1288 const amrex::Real weight_E = weight_nodeX_nodeZ[ms][iE][kE];
1289 const int comp_yy = depos_order - i + iE + SegShiftX
1290 + Ncomp_yy0*(depos_order - k + kE + SegShiftZ);
1303#elif defined(WARPX_DIM_RCYLINDER) || defined(WARPX_DIM_RSPHERE)
1306 const auto i_old =
static_cast<int>(x_old-shift);
1307 const auto i_new =
static_cast<int>(x_new-shift);
1308 const int cell_crossings_x = std::abs(i_new-i_old);
1309 num_segments += cell_crossings_x;
1313 double const dxp = x_new - x_old;
1314 const auto dirX_sign =
static_cast<double>(dxp < 0. ? -1. : 1.);
1315 double Xcell =
static_cast<double>(i_old) + shift + 0.5*(1.-dirX_sign);
1322 double x0_old = x_old;
1324 for (
int ns=0; ns<num_segments; ns++) {
1326 if (ns == num_segments-1) {
1328 dxp_seg = x0_new - x0_old;
1331 Xcell = Xcell + dirX_sign;
1333 dxp_seg = x0_new - x0_old;
1337 const auto seg_factor =
static_cast<amrex::Real
>(dxp == 0. ? 1._rt : dxp_seg/dxp);
1341 double sx_cell[depos_order] = {0.};
1342 double const x0_bar = (x0_new + x0_old)/2.0;
1343 const int i0_cell = compute_shape_factor_cell( sx_cell, x0_bar-0.5 );
1345 if constexpr (depos_order >= 3) {
1347 double sx_old_cell[depos_order] = {0.};
1348 double sx_new_cell[depos_order] = {0.};
1349 const int i0_cell_2 = compute_shape_factors_cell( sx_old_cell, sx_new_cell, x0_old-0.5, x0_new-0.5 );
1351 for (
int m=0; m<depos_order; m++) {
1352 sx_cell[m] = (4.0*sx_cell[m] + sx_old_cell[m] + sx_new_cell[m])/6.0;
1358 double sx_old_node[depos_order+1] = {0.};
1359 double sx_new_node[depos_order+1] = {0.};
1360 const int i0_node = compute_shape_factors_node( sx_old_node, sx_new_node, x0_old, x0_new );
1363 for (
int i=0; i<=depos_order; i++) {
1364 const amrex::Real weight = 0.5_rt*(sx_old_node[i] + sx_new_node[i])*seg_factor;
1373 for (
int i=0; i<=depos_order-1; i++) {
1374 const amrex::Real weight = sx_cell[i]*seg_factor;
1381 if (ns < num_segments-1) {
1387#elif defined(WARPX_DIM_1D_Z)
1390 const auto k_old =
static_cast<int>(z_old-shift);
1391 const auto k_new =
static_cast<int>(z_new-shift);
1392 const int cell_crossings_z = std::abs(k_new-k_old);
1393 num_segments += cell_crossings_z;
1397 double const dzp = z_new - z_old;
1398 const auto dirZ_sign =
static_cast<double>(dzp < 0. ? -1. : 1.);
1399 double Zcell =
static_cast<double>(k_old) + shift + 0.5*(1.-dirZ_sign);
1406 double z0_old = z_old;
1408 constexpr int num_segments_max = 1 + 4*AMREX_SPACEDIM;
1410 "Error: num_segments must be less than or equal to 1 + 4*AMREX_SPACEDIM.");
1413 int k0_cell[num_segments_max];
1414 int k0_node[num_segments_max];
1415 amrex::Real weight_cell[num_segments_max][depos_order];
1416 amrex::Real weight_node[num_segments_max][depos_order+1];
1418 const auto k_mid =
static_cast<int>(0.5*(z_new+z_old)-shift);
1419 int SegNum[num_segments_max];
1421 for (
int ns=0; ns<num_segments; ns++) {
1423 if (ns == num_segments-1) {
1425 dzp_seg = z0_new - z0_old;
1428 Zcell = Zcell + dirZ_sign;
1430 dzp_seg = z0_new - z0_old;
1434 const auto seg_factor =
static_cast<amrex::Real
>(dzp == 0. ? 1._rt : dzp_seg/dzp);
1438 double sz_cell[depos_order] = {0.};
1439 double const z0_bar = (z0_new + z0_old)/2.0;
1440 k0_cell[ns] = compute_shape_factor_cell( sz_cell, z0_bar-0.5 );
1443 if constexpr (full_mass_matrices) {
1444 const auto k0_mid =
static_cast<int>(z0_bar-shift);
1445 SegNum[ns] = 1 + k0_mid - k_mid;
1448 if constexpr (depos_order >= 3) {
1450 double sz_old_cell[depos_order] = {0.};
1451 double sz_new_cell[depos_order] = {0.};
1452 const int k0_cell_2 = compute_shape_factors_cell( sz_old_cell, sz_new_cell, z0_old-0.5, z0_new-0.5 );
1454 for (
int m=0; m<depos_order; m++) {
1455 sz_cell[m] = (4.0*sz_cell[m] + sz_old_cell[m] + sz_new_cell[m])/6.0;
1461 double sz_old_node[depos_order+1] = {0.};
1462 double sz_new_node[depos_order+1] = {0.};
1463 k0_node[ns] = compute_shape_factors_node( sz_old_node, sz_new_node, z0_old, z0_new );
1466 for (
int k=0; k<=depos_order; k++) {
1467 const amrex::Real weight = 0.5_rt*(sz_old_node[k] + sz_new_node[k])*seg_factor;
1468 const int k_J = lo.
x + k0_node[ns] + k;
1471 if constexpr (full_mass_matrices) { weight_node[ns][k] = weight; }
1479 for (
int k=0; k<=depos_order-1; k++) {
1480 const amrex::Real weight = sz_cell[k]*seg_factor;
1481 const int k_J = lo.
x + k0_cell[ns] + k;
1483 if constexpr (full_mass_matrices) { weight_cell[ns][k] = weight; }
1490 if (ns < num_segments-1) {
1496 if constexpr (full_mass_matrices) {
1499 for (
int ns=0; ns<num_segments; ns++) {
1502 for (
int k=0; k<=depos_order; k++) {
1504 const int k_J = lo.
x + k0_node[ns] + k;
1505 const amrex::Real weight_J = weight_node[ns][k];
1506 for (
int ms=0; ms<num_segments; ms++) {
1507 const int SegShift = max_crossings + SegNum[ms] - SegNum[ns];
1508 for (
int kE=0; kE<=depos_order; kE++) {
1509 const amrex::Real weight_E = weight_node[ms][kE];
1510 const int comp_yy = depos_order - k + kE + SegShift;
1516 for (
int kE=0; kE<=depos_order-1; kE++) {
1517 const amrex::Real weight_E = weight_cell[ms][kE];
1518 const int comp_yz = depos_order - k + kE + SegShift;
1527 for (
int k=0; k<=depos_order-1; k++) {
1529 const int k_J = lo.
x + k0_cell[ns] + k;
1530 const amrex::Real weight_J = weight_cell[ns][k];
1531 for (
int ms=0; ms<num_segments; ms++) {
1532 const int SegShift = max_crossings + SegNum[ms] - SegNum[ns];
1533 for (
int kE=0; kE<=depos_order-1; kE++) {
1534 const amrex::Real weight_E = weight_cell[ms][kE];
1535 const int comp_zz = depos_order-1 - k + kE + SegShift;
1538 for (
int kE=0; kE<=depos_order; kE++) {
1539 const amrex::Real weight_E = weight_node[ms][kE];
1540 const int comp_zy = depos_order-1 - k + kE + SegShift;