49 [[maybe_unused]]
const amrex::ParticleReal yp,
50 [[maybe_unused]]
const amrex::ParticleReal zp,
51 const amrex::ParticleReal wq,
52 const amrex::ParticleReal vx,
53 const amrex::ParticleReal vy,
54 const amrex::ParticleReal
vz,
61 const amrex::Real relative_time,
64 const amrex::Real invvol,
66 [[maybe_unused]]
const int n_rz_azimuthal_modes)
68 using namespace amrex::literals;
74#if defined(WARPX_DIM_RZ) || defined(WARPX_DIM_RCYLINDER)
77 const amrex::Real xpmid = xp + relative_time*vx;
78 const amrex::Real ypmid = yp + relative_time*vy;
79 const amrex::Real rpmid = std::sqrt(xpmid*xpmid + ypmid*ypmid);
80 const amrex::Real costheta = (rpmid > 0._rt ? xpmid/rpmid : 1._rt);
81 const amrex::Real sintheta = (rpmid > 0._rt ? ypmid/rpmid : 0._rt);
82 const amrex::Real wqx = wq*invvol*(+vx*costheta + vy*sintheta);
83 const amrex::Real wqy = wq*invvol*(-vx*sintheta + vy*costheta);
84 const amrex::Real wqz = wq*invvol*
vz;
85 #if defined(WARPX_DIM_RZ)
88#elif defined(WARPX_DIM_RSPHERE)
90 const amrex::Real xpmid = xp + relative_time*vx;
91 const amrex::Real ypmid = yp + relative_time*vy;
92 const amrex::Real zpmid = zp + relative_time*
vz;
93 const amrex::Real rpxymid = std::sqrt(xpmid*xpmid + ypmid*ypmid);
94 const amrex::Real rpmid = std::sqrt(xpmid*xpmid + ypmid*ypmid + zpmid*zpmid);
95 const amrex::Real costheta = (rpxymid > 0._rt ? xpmid/rpxymid : 1._rt);
96 const amrex::Real sintheta = (rpxymid > 0._rt ? ypmid/rpxymid : 0._rt);
97 const amrex::Real cosphi = (rpmid > 0._rt ? rpxymid/rpmid : 1._rt);
98 const amrex::Real sinphi = (rpmid > 0._rt ? zpmid/rpmid : 0._rt);
100 const amrex::Real wqx = wq*invvol*(+vx*costheta*cosphi + vy*sintheta*cosphi +
vz*sinphi);
101 const amrex::Real wqy = wq*invvol*(-vx*sintheta + vy*costheta);
102 const amrex::Real wqz = wq*invvol*(-vx*costheta*sinphi - vy*sintheta*sinphi +
vz*cosphi);
104 const amrex::Real wqx = wq*invvol*vx;
105 const amrex::Real wqy = wq*invvol*vy;
106 const amrex::Real wqz = wq*invvol*
vz;
111#if !defined(WARPX_DIM_1D_Z)
116#if defined(WARPX_DIM_RZ) || defined(WARPX_DIM_RCYLINDER) || defined(WARPX_DIM_RSPHERE)
117 const double xmid = (rpmid - xyzmin.
x)*dinv.
x;
119 const double xmid = ((xp - xyzmin.
x) + relative_time*vx)*dinv.
x;
127 double sx_node[depos_order + 1] = {0.};
128 double sx_cell[depos_order + 1] = {0.};
131 if (jx_type[0] ==
NODE || jy_type[0] ==
NODE || jz_type[0] ==
NODE) {
132 j_node = compute_shape_factor(sx_node, xmid);
134 if (jx_type[0] == CELL || jy_type[0] == CELL || jz_type[0] == CELL) {
135 j_cell = compute_shape_factor(sx_cell, xmid - 0.5);
138 amrex::Real sx_jx[depos_order + 1] = {0._rt};
139 amrex::Real sx_jy[depos_order + 1] = {0._rt};
140 amrex::Real sx_jz[depos_order + 1] = {0._rt};
141 for (
int ix=0; ix<=depos_order; ix++)
143 sx_jx[ix] = ((jx_type[0] ==
NODE) ? amrex::Real(sx_node[ix]) : amrex::Real(sx_cell[ix]));
144 sx_jy[ix] = ((jy_type[0] ==
NODE) ? amrex::Real(sx_node[ix]) : amrex::Real(sx_cell[ix]));
145 sx_jz[ix] = ((jz_type[0] ==
NODE) ? amrex::Real(sx_node[ix]) : amrex::Real(sx_cell[ix]));
148 int const j_jx = ((jx_type[0] ==
NODE) ? j_node : j_cell);
149 int const j_jy = ((jy_type[0] ==
NODE) ? j_node : j_cell);
150 int const j_jz = ((jz_type[0] ==
NODE) ? j_node : j_cell);
153#if defined(WARPX_DIM_3D)
156 const double ymid = ((yp - xyzmin.
y) + relative_time*vy)*dinv.
y;
157 double sy_node[depos_order + 1] = {0.};
158 double sy_cell[depos_order + 1] = {0.};
161 if (jx_type[1] ==
NODE || jy_type[1] ==
NODE || jz_type[1] ==
NODE) {
162 k_node = compute_shape_factor(sy_node, ymid);
164 if (jx_type[1] == CELL || jy_type[1] == CELL || jz_type[1] == CELL) {
165 k_cell = compute_shape_factor(sy_cell, ymid - 0.5);
167 amrex::Real sy_jx[depos_order + 1] = {0._rt};
168 amrex::Real sy_jy[depos_order + 1] = {0._rt};
169 amrex::Real sy_jz[depos_order + 1] = {0._rt};
170 for (
int iy=0; iy<=depos_order; iy++)
172 sy_jx[iy] = ((jx_type[1] ==
NODE) ? amrex::Real(sy_node[iy]) : amrex::Real(sy_cell[iy]));
173 sy_jy[iy] = ((jy_type[1] ==
NODE) ? amrex::Real(sy_node[iy]) : amrex::Real(sy_cell[iy]));
174 sy_jz[iy] = ((jz_type[1] ==
NODE) ? amrex::Real(sy_node[iy]) : amrex::Real(sy_cell[iy]));
176 int const k_jx = ((jx_type[1] ==
NODE) ? k_node : k_cell);
177 int const k_jy = ((jy_type[1] ==
NODE) ? k_node : k_cell);
178 int const k_jz = ((jz_type[1] ==
NODE) ? k_node : k_cell);
181#if !defined(WARPX_DIM_RCYLINDER) && !defined(WARPX_DIM_RSPHERE)
184 constexpr int zdir = WARPX_ZINDEX;
185 const double zmid = ((zp - xyzmin.
z) + relative_time*
vz)*dinv.
z;
186 double sz_node[depos_order + 1] = {0.};
187 double sz_cell[depos_order + 1] = {0.};
190 if (jx_type[zdir] ==
NODE || jy_type[zdir] ==
NODE || jz_type[zdir] ==
NODE) {
191 l_node = compute_shape_factor(sz_node, zmid);
193 if (jx_type[zdir] == CELL || jy_type[zdir] == CELL || jz_type[zdir] == CELL) {
194 l_cell = compute_shape_factor(sz_cell, zmid - 0.5);
196 amrex::Real sz_jx[depos_order + 1] = {0._rt};
197 amrex::Real sz_jy[depos_order + 1] = {0._rt};
198 amrex::Real sz_jz[depos_order + 1] = {0._rt};
199 for (
int iz=0; iz<=depos_order; iz++)
201 sz_jx[iz] = ((jx_type[zdir] ==
NODE) ? amrex::Real(sz_node[iz]) : amrex::Real(sz_cell[iz]));
202 sz_jy[iz] = ((jy_type[zdir] ==
NODE) ? amrex::Real(sz_node[iz]) : amrex::Real(sz_cell[iz]));
203 sz_jz[iz] = ((jz_type[zdir] ==
NODE) ? amrex::Real(sz_node[iz]) : amrex::Real(sz_cell[iz]));
205 int const l_jx = ((jx_type[zdir] ==
NODE) ? l_node : l_cell);
206 int const l_jy = ((jy_type[zdir] ==
NODE) ? l_node : l_cell);
207 int const l_jz = ((jz_type[zdir] ==
NODE) ? l_node : l_cell);
211#if defined(WARPX_DIM_1D_Z)
212 for (
int iz=0; iz<=depos_order; iz++){
214 &jx_arr(lo.
x+l_jx+iz, 0, 0, 0),
217 &jy_arr(lo.
x+l_jy+iz, 0, 0, 0),
220 &jz_arr(lo.
x+l_jz+iz, 0, 0, 0),
223#elif defined(WARPX_DIM_RCYLINDER) || defined(WARPX_DIM_RSPHERE)
224 for (
int ix=0; ix<=depos_order; ix++){
229#elif defined(WARPX_DIM_XZ) || defined(WARPX_DIM_RZ)
230 for (
int iz=0; iz<=depos_order; iz++){
231 for (
int ix=0; ix<=depos_order; ix++){
233 &jx_arr(lo.
x+j_jx+ix, lo.
y+l_jx+iz, 0, 0),
234 sx_jx[ix]*sz_jx[iz]*wqx);
236 &jy_arr(lo.
x+j_jy+ix, lo.
y+l_jy+iz, 0, 0),
237 sx_jy[ix]*sz_jy[iz]*wqy);
239 &jz_arr(lo.
x+j_jz+ix, lo.
y+l_jz+iz, 0, 0),
240 sx_jz[ix]*sz_jz[iz]*wqz);
241#if defined(WARPX_DIM_RZ)
243 for (
int imode=1 ; imode < n_rz_azimuthal_modes ; imode++) {
256#elif defined(WARPX_DIM_3D)
257 for (
int iz=0; iz<=depos_order; iz++){
258 for (
int iy=0; iy<=depos_order; iy++){
259 for (
int ix=0; ix<=depos_order; ix++){
261 &jx_arr(lo.
x+j_jx+ix, lo.
y+k_jx+iy, lo.
z+l_jx+iz),
262 sx_jx[ix]*sy_jx[iy]*sz_jx[iz]*wqx);
264 &jy_arr(lo.
x+j_jy+ix, lo.
y+k_jy+iy, lo.
z+l_jy+iz),
265 sx_jy[ix]*sy_jy[iy]*sz_jy[iz]*wqy);
267 &jz_arr(lo.
x+j_jz+ix, lo.
y+k_jz+iy, lo.
z+l_jz+iz),
268 sx_jz[ix]*sy_jz[iy]*sz_jz[iz]*wqz);
477 const amrex::ParticleReal *
const wp,
478 const amrex::ParticleReal *
const uxp,
479 const amrex::ParticleReal *
const uyp,
480 const amrex::ParticleReal *
const uzp,
486 const amrex::Real relative_time,
491 int n_rz_azimuthal_modes,
496 const int threads_per_block,
499 using namespace amrex::literals;
501#if (defined(AMREX_USE_HIP) || defined(AMREX_USE_CUDA)) && \
502 !(defined(WARPX_DIM_RCYLINDER) || defined(WARPX_DIM_RSPHERE))
503 using namespace amrex;
514 constexpr int zdir = WARPX_ZINDEX;
521 const auto domain = geom.
Domain();
524 sample_tbox.
grow(depos_order);
532 const int nblocks = a_bins.
numBins();
535 const std::size_t shared_mem_bytes = npts*
sizeof(amrex::Real);
538 "Tile size too big for GPU shared memory current deposition");
545 const int bin_id = blockIdx.x;
546 const unsigned int bin_start = offsets_ptr[bin_id];
547 const unsigned int bin_stop = offsets_ptr[bin_id+1];
549 if (bin_start == bin_stop) {
return; }
554 ParticleReal xp, yp, zp;
555 GetPosition(permutation[bin_start], xp, yp, zp);
556#if defined(WARPX_DIM_3D)
557 IntVect iv =
IntVect(
int( amrex::Math::floor((xp-plo[0]) * dxiarr[0]) ),
558 int( amrex::Math::floor((yp-plo[1]) * dxiarr[1]) ),
559 int( amrex::Math::floor((zp-plo[2]) * dxiarr[2]) ));
560#elif defined(WARPX_DIM_XZ) || defined(WARPX_DIM_RZ)
561 IntVect iv =
IntVect(
int( amrex::Math::floor((xp-plo[0]) * dxiarr[0]) ),
562 int( amrex::Math::floor((zp-plo[1]) * dxiarr[1]) ));
563#elif defined(WARPX_DIM_1D_Z)
564 IntVect iv =
IntVect(
int( amrex::Math::floor((zp-plo[0]) * dxiarr[0]) ));
565#elif defined(WARPX_DIM_RCYLINDER) || defined(WARPX_DIM_RSPHERE)
566 IntVect iv =
IntVect(
int( amrex::Math::floor((xp-plo[0]) * dxiarr[0]) ));
568 iv += domain.smallEnd();
572 buffer_box.
grow(depos_order);
578 amrex::Real*
const shared = gsm.
dataPtr();
588 volatile amrex::Real* vs = shared;
589 for (
int i = threadIdx.x; i < npts; i += blockDim.x){
593 for (
unsigned int ip_orig = bin_start+threadIdx.x; ip_orig<bin_stop; ip_orig += blockDim.x)
595 const unsigned int ip = permutation[ip_orig];
596 depositComponent<depos_order>(GetPosition, wp, uxp, uyp, uzp, ion_lev, jx_buff, jx_type,
597 relative_time, dinv, xyzmin, lo, q, n_rz_azimuthal_modes,
598 ip, zdir,
NODE, CELL, 0);
602 addLocalToGlobal(tbox_x, jx_arr, jx_buff);
603 for (
int i = threadIdx.x; i < npts; i += blockDim.x){
608 for (
unsigned int ip_orig = bin_start+threadIdx.x; ip_orig<bin_stop; ip_orig += blockDim.x)
610 const unsigned int ip = permutation[ip_orig];
611 depositComponent<depos_order>(GetPosition, wp, uxp, uyp, uzp, ion_lev, jy_buff, jy_type,
612 relative_time, dinv, xyzmin, lo, q, n_rz_azimuthal_modes,
613 ip, zdir,
NODE, CELL, 1);
617 addLocalToGlobal(tbox_y, jy_arr, jy_buff);
618 for (
int i = threadIdx.x; i < npts; i += blockDim.x){
623 for (
unsigned int ip_orig = bin_start+threadIdx.x; ip_orig<bin_stop; ip_orig += blockDim.x)
625 const unsigned int ip = permutation[ip_orig];
626 depositComponent<depos_order>(GetPosition, wp, uxp, uyp, uzp, ion_lev, jz_buff, jz_type,
627 relative_time, dinv, xyzmin, lo, q, n_rz_azimuthal_modes,
628 ip, zdir,
NODE, CELL, 2);
632 addLocalToGlobal(tbox_z, jz_arr, jz_buff);
639 GetPosition, wp, uxp, uyp, uzp, ion_lev, jx_fab, jy_fab, jz_fab,
640 np_to_deposit, relative_time, dinv, xyzmin, lo, q,
641 n_rz_azimuthal_modes, a_bins, box, geom, a_tbox_max_size,
642 threads_per_block, bin_size);
676 const amrex::ParticleReal *
const wp,
677 const amrex::ParticleReal *
const uxp,
678 const amrex::ParticleReal *
const uyp,
679 const amrex::ParticleReal *
const uzp,
686 amrex::Real relative_time,
691 [[maybe_unused]]
int n_rz_azimuthal_modes,
693 bool enable_reduced_shape
696 using namespace amrex;
697 using namespace amrex::literals;
701 bool const do_ionization = ion_lev;
702#if !defined(WARPX_DIM_3D)
703 const amrex::Real invvol = dinv.
x*dinv.
y*dinv.
z;
707 (1.0_rt/dt)*dinv.
x*dinv.
z,
708 (1.0_rt/dt)*dinv.
x*dinv.
y};
712#if (AMREX_SPACEDIM > 1)
713 Real
constexpr one_third = 1.0_rt / 3.0_rt;
714 Real
constexpr one_sixth = 1.0_rt / 6.0_rt;
720 enum eb_flags :
int { has_reduced_shape, no_reduced_shape };
721 const int reduce_shape_runtime_flag = (enable_reduced_shape && (depos_order>1))? has_reduced_shape : no_reduced_shape;
724 {reduce_shape_runtime_flag},
727 Real
const gaminv = 1.0_rt/std::sqrt(1.0_rt + uxp[ip]*uxp[ip]*clightsq
728 + uyp[ip]*uyp[ip]*clightsq
729 + uzp[ip]*uzp[ip]*clightsq);
736 ParticleReal xp, yp, zp;
737 GetPosition(ip, xp, yp, zp);
740#if defined(WARPX_DIM_RZ) || defined(WARPX_DIM_RCYLINDER)
741 Real
const xp_new = xp + (relative_time + 0.5_rt*dt)*uxp[ip]*gaminv;
742 Real
const yp_new = yp + (relative_time + 0.5_rt*dt)*uyp[ip]*gaminv;
743 Real
const xp_mid = xp_new - 0.5_rt*dt*uxp[ip]*gaminv;
744 Real
const yp_mid = yp_new - 0.5_rt*dt*uyp[ip]*gaminv;
745 Real
const xp_old = xp_new - dt*uxp[ip]*gaminv;
746 Real
const yp_old = yp_new - dt*uyp[ip]*gaminv;
747 Real
const rp_new = std::sqrt(xp_new*xp_new + yp_new*yp_new);
748 Real
const rp_mid = std::sqrt(xp_mid*xp_mid + yp_mid*yp_mid);
749 Real
const rp_old = std::sqrt(xp_old*xp_old + yp_old*yp_old);
750 const amrex::Real costheta_mid = (rp_mid > 0._rt ? xp_mid/rp_mid : 1._rt);
751 const amrex::Real sintheta_mid = (rp_mid > 0._rt ? yp_mid/rp_mid : 0._rt);
753 double const x_new = (rp_new - xyzmin.
x)*dinv.
x;
754 double const x_old = (rp_old - xyzmin.
x)*dinv.
x;
755#if defined(WARPX_DIM_RZ)
756 const amrex::Real costheta_new = (rp_new > 0._rt ? xp_new/rp_new : 1._rt);
757 const amrex::Real sintheta_new = (rp_new > 0._rt ? yp_new/rp_new : 0._rt);
758 const amrex::Real costheta_old = (rp_old > 0._rt ? xp_old/rp_old : 1._rt);
759 const amrex::Real sintheta_old = (rp_old > 0._rt ? yp_old/rp_old : 0._rt);
764#elif defined(WARPX_DIM_RSPHERE)
765 Real
const xp_new = xp + (relative_time + 0.5_rt*dt)*uxp[ip]*gaminv;
766 Real
const yp_new = yp + (relative_time + 0.5_rt*dt)*uyp[ip]*gaminv;
767 Real
const zp_new = zp + (relative_time + 0.5_rt*dt)*uzp[ip]*gaminv;
768 Real
const xp_mid = xp_new - 0.5_rt*dt*uxp[ip]*gaminv;
769 Real
const yp_mid = yp_new - 0.5_rt*dt*uyp[ip]*gaminv;
770 Real
const zp_mid = zp_new - 0.5_rt*dt*uzp[ip]*gaminv;
771 Real
const xp_old = xp_new - dt*uxp[ip]*gaminv;
772 Real
const yp_old = yp_new - dt*uyp[ip]*gaminv;
773 Real
const zp_old = zp_new - dt*uzp[ip]*gaminv;
774 Real
const rpxy_mid = std::sqrt(xp_mid*xp_mid + yp_mid*yp_mid);
775 Real
const rp_new = std::sqrt(xp_new*xp_new + yp_new*yp_new + zp_new*zp_new);
776 Real
const rp_old = std::sqrt(xp_old*xp_old + yp_old*yp_old + zp_old*zp_old);
777 Real
const rp_mid = (rp_new + rp_old)*0.5_rt;
779 amrex::Real
const costheta_mid = (rpxy_mid > 0. ? xp_mid/rpxy_mid : 1._rt);
780 amrex::Real
const sintheta_mid = (rpxy_mid > 0. ? yp_mid/rpxy_mid : 0._rt);
781 amrex::Real
const cosphi_mid = (rp_mid > 0. ? rpxy_mid/rp_mid : 1._rt);
782 amrex::Real
const sinphi_mid = (rp_mid > 0. ? zp_mid/rp_mid : 0._rt);
785 double const x_new = (rp_new - xyzmin.
x)*dinv.
x;
786 double const x_old = (rp_old - xyzmin.
x)*dinv.
x;
788#if !defined(WARPX_DIM_1D_Z)
790 double const x_new = (xp - xyzmin.
x + (relative_time + 0.5_rt*dt)*uxp[ip]*gaminv)*dinv.
x;
791 double const x_old = x_new - dt*dinv.
x*uxp[ip]*gaminv;
794#if defined(WARPX_DIM_3D)
796 double const y_new = (yp - xyzmin.
y + (relative_time + 0.5_rt*dt)*uyp[ip]*gaminv)*dinv.
y;
797 double const y_old = y_new - dt*dinv.
y*uyp[ip]*gaminv;
799#if !defined(WARPX_DIM_RCYLINDER) && !defined(WARPX_DIM_RSPHERE)
801 double const z_new = (zp - xyzmin.
z + (relative_time + 0.5_rt*dt)*uzp[ip]*gaminv)*dinv.
z;
802 double const z_old = z_new - dt*dinv.
z*uzp[ip]*gaminv;
806 bool reduce_shape_old, reduce_shape_new;
810 if constexpr (reduce_shape_control == has_reduced_shape) {
811#if defined(WARPX_DIM_3D)
812 reduce_shape_old = reduced_particle_shape_mask(
813 lo.
x +
int(amrex::Math::floor(x_old)),
814 lo.
y +
int(amrex::Math::floor(y_old)),
815 lo.
z +
int(amrex::Math::floor(z_old)));
816 reduce_shape_new = reduced_particle_shape_mask(
817 lo.
x +
int(amrex::Math::floor(x_new)),
818 lo.
y +
int(amrex::Math::floor(y_new)),
819 lo.
z +
int(amrex::Math::floor(z_new)));
820#elif defined(WARPX_DIM_XZ) || defined(WARPX_DIM_RZ)
821 reduce_shape_old = reduced_particle_shape_mask(
822 lo.
x +
int(amrex::Math::floor(x_old)),
823 lo.
y +
int(amrex::Math::floor(z_old)),
825 reduce_shape_new = reduced_particle_shape_mask(
826 lo.
x +
int(amrex::Math::floor(x_new)),
827 lo.
y +
int(amrex::Math::floor(z_new)),
829#elif defined(WARPX_DIM_RCYLINDER) || defined(WARPX_DIM_RSPHERE)
830 reduce_shape_old = reduced_particle_shape_mask(
831 lo.
x +
int(amrex::Math::floor(x_old)),
833 reduce_shape_new = reduced_particle_shape_mask(
834 lo.
x +
int(amrex::Math::floor(x_new)),
836#elif defined(WARPX_DIM_1D_Z)
837 reduce_shape_old = reduced_particle_shape_mask(
838 lo.
x +
int(amrex::Math::floor(z_old)),
840 reduce_shape_new = reduced_particle_shape_mask(
841 lo.
x +
int(amrex::Math::floor(z_new)),
845 reduce_shape_old =
false;
846 reduce_shape_new =
false;
849#if defined(WARPX_DIM_RZ)
850 Real
const vy = (-uxp[ip]*sintheta_mid + uyp[ip]*costheta_mid)*gaminv;
851#elif defined(WARPX_DIM_XZ)
852 Real
const vy = uyp[ip]*gaminv;
853#elif defined(WARPX_DIM_1D_Z)
854 Real
const vx = uxp[ip]*gaminv;
855 Real
const vy = uyp[ip]*gaminv;
856#elif defined(WARPX_DIM_RCYLINDER)
857 Real
const vy = (-uxp[ip]*sintheta_mid + uyp[ip]*costheta_mid)*gaminv;
858 Real
const vz = uzp[ip]*gaminv;
859#elif defined(WARPX_DIM_RSPHERE)
861 Real
const vy = (-uxp[ip]*sintheta_mid + uyp[ip]*costheta_mid)*gaminv;
862 Real
const vz = (-uxp[ip]*costheta_mid*sinphi_mid - uyp[ip]*sintheta_mid*sinphi_mid + uzp[ip]*cosphi_mid)*gaminv;
879#if !defined(WARPX_DIM_1D_Z)
880 double sx_new[depos_order + 3] = {0.};
881 double sx_old[depos_order + 3] = {0.};
882 const int i_new = compute_shape_factor(sx_new+1, x_new );
883 const int i_old = compute_shifted_shape_factor(sx_old, x_old, i_new);
885 if constexpr (reduce_shape_control == has_reduced_shape) {
886 if (reduce_shape_new) {
887 for (
int i=0; i<depos_order+3; i++) {sx_new[i] = 0.;}
888 compute_shifted_shape_factor_order1( sx_new+depos_order/2, x_new, i_new+depos_order/2 );
890 if (reduce_shape_old) {
891 for (
int i=0; i<depos_order+3; i++) {sx_old[i] = 0.;}
892 compute_shifted_shape_factor_order1( sx_old+depos_order/2, x_old, i_new+depos_order/2 );
898#if defined(WARPX_DIM_3D)
899 double sy_new[depos_order + 3] = {0.};
900 double sy_old[depos_order + 3] = {0.};
901 const int j_new = compute_shape_factor(sy_new+1, y_new);
902 const int j_old = compute_shifted_shape_factor(sy_old, y_old, j_new);
904 if constexpr (reduce_shape_control == has_reduced_shape) {
905 if (reduce_shape_new) {
906 for (
int j=0; j<depos_order+3; j++) {sy_new[j] = 0.;}
907 compute_shifted_shape_factor_order1( sy_new+depos_order/2, y_new, j_new+depos_order/2 );
909 if (reduce_shape_old) {
910 for (
int j=0; j<depos_order+3; j++) {sy_old[j] = 0.;}
911 compute_shifted_shape_factor_order1( sy_old+depos_order/2, y_old, j_new+depos_order/2 );
917#if !defined(WARPX_DIM_RCYLINDER) && !defined(WARPX_DIM_RSPHERE)
918 double sz_new[depos_order + 3] = {0.};
919 double sz_old[depos_order + 3] = {0.};
920 const int k_new = compute_shape_factor(sz_new+1, z_new );
921 const int k_old = compute_shifted_shape_factor(sz_old, z_old, k_new );
923 if constexpr (reduce_shape_control == has_reduced_shape) {
924 if (reduce_shape_new) {
925 for (
int k=0; k<depos_order+3; k++) {sz_new[k] = 0.;}
926 compute_shifted_shape_factor_order1( sz_new+depos_order/2, z_new, k_new+depos_order/2 );
928 if (reduce_shape_old) {
929 for (
int k=0; k<depos_order+3; k++) {sz_old[k] = 0.;}
930 compute_shifted_shape_factor_order1( sz_old+depos_order/2, z_old, k_new+depos_order/2 );
938#if !defined(WARPX_DIM_1D_Z)
939 int dil = 1, diu = 1;
940 if (i_old < i_new) { dil = 0; }
941 if (i_old > i_new) { diu = 0; }
943#if defined(WARPX_DIM_3D)
944 int djl = 1, dju = 1;
945 if (j_old < j_new) { djl = 0; }
946 if (j_old > j_new) { dju = 0; }
948#if !defined(WARPX_DIM_RCYLINDER) && !defined(WARPX_DIM_RSPHERE)
949 int dkl = 1, dku = 1;
950 if (k_old < k_new) { dkl = 0; }
951 if (k_old > k_new) { dku = 0; }
954#if defined(WARPX_DIM_3D)
956 for (
int k=dkl; k<=depos_order+2-dku; k++) {
957 for (
int j=djl; j<=depos_order+2-dju; j++) {
958 amrex::Real sdxi = 0._rt;
959 for (
int i=dil; i<=depos_order+1-diu; i++) {
960 sdxi += wq*invdtd.
x*(sx_old[i] - sx_new[i])*(
961 one_third*(sy_new[j]*sz_new[k] + sy_old[j]*sz_old[k])
962 +one_sixth*(sy_new[j]*sz_old[k] + sy_old[j]*sz_new[k]));
967 for (
int k=dkl; k<=depos_order+2-dku; k++) {
968 for (
int i=dil; i<=depos_order+2-diu; i++) {
969 amrex::Real sdyj = 0._rt;
970 for (
int j=djl; j<=depos_order+1-dju; j++) {
971 sdyj += wq*invdtd.
y*(sy_old[j] - sy_new[j])*(
972 one_third*(sx_new[i]*sz_new[k] + sx_old[i]*sz_old[k])
973 +one_sixth*(sx_new[i]*sz_old[k] + sx_old[i]*sz_new[k]));
978 for (
int j=djl; j<=depos_order+2-dju; j++) {
979 for (
int i=dil; i<=depos_order+2-diu; i++) {
980 amrex::Real sdzk = 0._rt;
981 for (
int k=dkl; k<=depos_order+1-dku; k++) {
982 sdzk += wq*invdtd.
z*(sz_old[k] - sz_new[k])*(
983 one_third*(sx_new[i]*sy_new[j] + sx_old[i]*sy_old[j])
984 +one_sixth*(sx_new[i]*sy_old[j] + sx_old[i]*sy_new[j]));
990#elif defined(WARPX_DIM_XZ) || defined(WARPX_DIM_RZ)
992 for (
int k=dkl; k<=depos_order+2-dku; k++) {
993 amrex::Real sdxi = 0._rt;
994 for (
int i=dil; i<=depos_order+1-diu; i++) {
995 sdxi += wq*invdtd.
x*(sx_old[i] - sx_new[i])*0.5_rt*(sz_new[k] + sz_old[k]);
997#if defined(WARPX_DIM_RZ)
999 for (
int imode=1 ; imode < n_rz_azimuthal_modes ; imode++) {
1001 const Complex djr_cmplx = 2._rt *sdxi*xy_mid;
1004 xy_mid = xy_mid*xy_mid0;
1009 for (
int k=dkl; k<=depos_order+2-dku; k++) {
1010 for (
int i=dil; i<=depos_order+2-diu; i++) {
1011 Real
const sdyj = wq*vy*invvol*(
1012 one_third*(sx_new[i]*sz_new[k] + sx_old[i]*sz_old[k])
1013 +one_sixth*(sx_new[i]*sz_old[k] + sx_old[i]*sz_new[k]));
1015#if defined(WARPX_DIM_RZ)
1021 for (
int imode=1 ; imode < n_rz_azimuthal_modes ; imode++) {
1024 const Complex djt_cmplx = -2._rt * I*(i_new-1 + i + xyzmin.
x*dinv.
x)*wq*invdtd.
x/(amrex::Real)imode
1025 *(
Complex(sx_new[i]*sz_new[k], 0._rt)*(xy_new - xy_mid)
1026 +
Complex(sx_old[i]*sz_old[k], 0._rt)*(xy_mid - xy_old));
1029 xy_new = xy_new*xy_new0;
1030 xy_mid = xy_mid*xy_mid0;
1031 xy_old = xy_old*xy_old0;
1036 for (
int i=dil; i<=depos_order+2-diu; i++) {
1038 for (
int k=dkl; k<=depos_order+1-dku; k++) {
1039 sdzk += wq*invdtd.
z*(sz_old[k] - sz_new[k])*0.5_rt*(sx_new[i] + sx_old[i]);
1041#if defined(WARPX_DIM_RZ)
1043 for (
int imode=1 ; imode < n_rz_azimuthal_modes ; imode++) {
1045 const Complex djz_cmplx = 2._rt * sdzk * xy_mid;
1048 xy_mid = xy_mid*xy_mid0;
1053#elif defined(WARPX_DIM_1D_Z)
1055 for (
int k=dkl; k<=depos_order+2-dku; k++) {
1056 amrex::Real
const sdxi = wq*vx*invvol*0.5_rt*(sz_old[k] + sz_new[k]);
1059 for (
int k=dkl; k<=depos_order+2-dku; k++) {
1060 amrex::Real
const sdyj = wq*vy*invvol*0.5_rt*(sz_old[k] + sz_new[k]);
1063 amrex::Real sdzk = 0._rt;
1064 for (
int k=dkl; k<=depos_order+1-dku; k++) {
1065 sdzk += wq*invdtd.
z*(sz_old[k] - sz_new[k]);
1069#elif defined(WARPX_DIM_RCYLINDER) || defined(WARPX_DIM_RSPHERE)
1071 amrex::Real sdri = 0._rt;
1072 for (
int i=dil; i<=depos_order+1-diu; i++) {
1073 sdri += wq*invdtd.
x*(sx_old[i] - sx_new[i]);
1076 for (
int i=dil; i<=depos_order+2-diu; i++) {
1077 amrex::Real
const sdyj = wq*vy*invvol*0.5_rt*(sx_old[i] + sx_new[i]);
1080 for (
int i=dil; i<=depos_order+2-diu; i++) {
1081 amrex::Real
const sdzi = wq*
vz*invvol*0.5_rt*(sx_old[i] + sx_new[i]);
1115 [[maybe_unused]]
const amrex::ParticleReal *
const yp_n,
1116 [[maybe_unused]]
const amrex::ParticleReal *
const zp_n,
1118 const amrex::ParticleReal *
const wp,
1119 [[maybe_unused]]
const amrex::ParticleReal *
const uxp_n,
1120 [[maybe_unused]]
const amrex::ParticleReal *
const uyp_n,
1121 [[maybe_unused]]
const amrex::ParticleReal *
const uzp_n,
1122 [[maybe_unused]]
const amrex::ParticleReal *
const uxp_nph,
1123 [[maybe_unused]]
const amrex::ParticleReal *
const uyp_nph,
1124 [[maybe_unused]]
const amrex::ParticleReal *
const uzp_nph,
1125 const int *
const ion_lev,
1129 const long np_to_deposit,
1130 const amrex::Real dt,
1134 const amrex::Real q,
1135 [[maybe_unused]]
const int n_rz_azimuthal_modes)
1137 using namespace amrex;
1141 bool const do_ionization = ion_lev;
1143#if !defined(WARPX_DIM_3D)
1144 const amrex::Real invvol = dinv.
x*dinv.
y*dinv.
z;
1148 (1.0_rt/dt)*dinv.
x*dinv.
z,
1149 (1.0_rt/dt)*dinv.
x*dinv.
y};
1151#if (AMREX_SPACEDIM > 1)
1152 Real
constexpr one_third = 1.0_rt / 3.0_rt;
1153 Real
constexpr one_sixth = 1.0_rt / 6.0_rt;
1161#if !defined(WARPX_DIM_3D)
1164 uxp_nph[ip], uyp_nph[ip], uzp_nph[ip]);
1172 ParticleReal xp_nph, yp_nph, zp_nph;
1173 GetPosition(ip, xp_nph, yp_nph, zp_nph);
1175#if !defined(WARPX_DIM_1D_Z)
1176 ParticleReal
const xp_np1 = 2._prt*xp_nph - xp_n[ip];
1178#if defined(WARPX_DIM_3D) || defined(WARPX_DIM_RZ) || defined(WARPX_DIM_RCYLINDER) || defined(WARPX_DIM_RSPHERE)
1179 ParticleReal
const yp_np1 = 2._prt*yp_nph - yp_n[ip];
1181#if !defined(WARPX_DIM_RCYLINDER)
1182 ParticleReal
const zp_np1 = 2._prt*zp_nph - zp_n[ip];
1186#if defined(WARPX_DIM_RZ) || defined(WARPX_DIM_RCYLINDER)
1187 amrex::Real
const xp_new = xp_np1;
1188 amrex::Real
const yp_new = yp_np1;
1189 amrex::Real
const xp_mid = xp_nph;
1190 amrex::Real
const yp_mid = yp_nph;
1191 amrex::Real
const xp_old = xp_n[ip];
1192 amrex::Real
const yp_old = yp_n[ip];
1193 amrex::Real
const rp_new = std::sqrt(xp_new*xp_new + yp_new*yp_new);
1194 amrex::Real
const rp_old = std::sqrt(xp_old*xp_old + yp_old*yp_old);
1195 amrex::Real
const rp_mid = (rp_new + rp_old)/2._rt;
1196 const amrex::Real costheta_mid = (rp_mid > 0._rt ? xp_mid/rp_mid : 1._rt);
1197 const amrex::Real sintheta_mid = (rp_mid > 0._rt ? yp_mid/rp_mid : 0._rt);
1199 double const x_new = (rp_new - xyzmin.
x)*dinv.
x;
1200 double const x_old = (rp_old - xyzmin.
x)*dinv.
x;
1201#if defined(WARPX_DIM_RZ)
1202 const amrex::Real costheta_new = (rp_new > 0._rt ? xp_new/rp_new : 1._rt);
1203 const amrex::Real sintheta_new = (rp_new > 0._rt ? yp_new/rp_new : 0._rt);
1204 const amrex::Real costheta_old = (rp_old > 0._rt ? xp_old/rp_old : 1._rt);
1205 const amrex::Real sintheta_old = (rp_old > 0._rt ? yp_old/rp_old : 0._rt);
1210#elif defined(WARPX_DIM_RSPHERE)
1211 amrex::Real
const xp_new = xp_np1;
1212 amrex::Real
const yp_new = yp_np1;
1213 amrex::Real
const zp_new = zp_np1;
1214 amrex::Real
const xp_mid = xp_nph;
1215 amrex::Real
const yp_mid = yp_nph;
1216 amrex::Real
const zp_mid = zp_nph;
1217 amrex::Real
const xp_old = xp_n[ip];
1218 amrex::Real
const yp_old = yp_n[ip];
1219 amrex::Real
const zp_old = zp_n[ip];
1220 amrex::Real
const rpxy_mid = std::sqrt(xp_mid*xp_mid + yp_mid*yp_mid);
1221 amrex::Real
const rp_new = std::sqrt(xp_new*xp_new + yp_new*yp_new + zp_new*zp_new);
1222 amrex::Real
const rp_old = std::sqrt(xp_old*xp_old + yp_old*yp_old + zp_old*zp_old);
1223 amrex::Real
const rp_mid = (rp_new + rp_old)*0.5_rt;
1225 amrex::Real
const costheta_mid = (rpxy_mid > 0. ? xp_mid/rpxy_mid : 1._rt);
1226 amrex::Real
const sintheta_mid = (rpxy_mid > 0. ? yp_mid/rpxy_mid : 0._rt);
1227 amrex::Real
const cosphi_mid = (rp_mid > 0. ? rpxy_mid/rp_mid : 1._rt);
1228 amrex::Real
const sinphi_mid = (rp_mid > 0. ? zp_mid/rp_mid : 0._rt);
1231 double const x_new = (rp_new - xyzmin.
x)*dinv.
x;
1232 double const x_old = (rp_old - xyzmin.
x)*dinv.
x;
1234#if !defined(WARPX_DIM_1D_Z)
1236 double const x_new = (xp_np1 - xyzmin.
x)*dinv.
x;
1237 double const x_old = (xp_n[ip] - xyzmin.
x)*dinv.
x;
1240#if defined(WARPX_DIM_3D)
1242 double const y_new = (yp_np1 - xyzmin.
y)*dinv.
y;
1243 double const y_old = (yp_n[ip] - xyzmin.
y)*dinv.
y;
1245#if !defined(WARPX_DIM_RCYLINDER) && !defined(WARPX_DIM_RSPHERE)
1247 double const z_new = (zp_np1 - xyzmin.
z)*dinv.
z;
1248 double const z_old = (zp_n[ip] - xyzmin.
z)*dinv.
z;
1251#if defined(WARPX_DIM_RZ)
1252 amrex::Real
const vy = (-uxp_nph[ip]*sintheta_mid + uyp_nph[ip]*costheta_mid)*gaminv;
1253#elif defined(WARPX_DIM_XZ)
1254 amrex::Real
const vy = uyp_nph[ip]*gaminv;
1255#elif defined(WARPX_DIM_1D_Z)
1256 amrex::Real
const vx = uxp_nph[ip]*gaminv;
1257 amrex::Real
const vy = uyp_nph[ip]*gaminv;
1258#elif defined(WARPX_DIM_RCYLINDER)
1259 amrex::Real
const vy = (-uxp_nph[ip]*sintheta_mid + uyp_nph[ip]*costheta_mid)*gaminv;
1260 amrex::Real
const vz = uzp_nph[ip]*gaminv;
1261#elif defined(WARPX_DIM_RSPHERE)
1263 amrex::Real
const vy = (-uxp_nph[ip]*sintheta_mid + uyp_nph[ip]*costheta_mid)*gaminv;
1264 amrex::Real
const vz = (-uxp_nph[ip]*costheta_mid*sinphi_mid - uyp_nph[ip]*sintheta_mid*sinphi_mid + uzp_nph[ip]*cosphi_mid)*gaminv;
1278#if !defined(WARPX_DIM_1D_Z)
1279 double sx_new[depos_order + 3] = {0.};
1280 double sx_old[depos_order + 3] = {0.};
1281 const int i_new = compute_shape_factor(sx_new+1, x_new);
1282 const int i_old = compute_shifted_shape_factor(sx_old, x_old, i_new);
1284#if defined(WARPX_DIM_3D)
1285 double sy_new[depos_order + 3] = {0.};
1286 double sy_old[depos_order + 3] = {0.};
1287 const int j_new = compute_shape_factor(sy_new+1, y_new);
1288 const int j_old = compute_shifted_shape_factor(sy_old, y_old, j_new);
1290#if !defined(WARPX_DIM_RCYLINDER) && !defined(WARPX_DIM_RSPHERE)
1291 double sz_new[depos_order + 3] = {0.};
1292 double sz_old[depos_order + 3] = {0.};
1293 const int k_new = compute_shape_factor(sz_new+1, z_new);
1294 const int k_old = compute_shifted_shape_factor(sz_old, z_old, k_new);
1298#if !defined(WARPX_DIM_1D_Z)
1299 int dil = 1, diu = 1;
1300 if (i_old < i_new) { dil = 0; }
1301 if (i_old > i_new) { diu = 0; }
1303#if defined(WARPX_DIM_3D)
1304 int djl = 1, dju = 1;
1305 if (j_old < j_new) { djl = 0; }
1306 if (j_old > j_new) { dju = 0; }
1308#if !defined(WARPX_DIM_RCYLINDER) && !defined(WARPX_DIM_RSPHERE)
1309 int dkl = 1, dku = 1;
1310 if (k_old < k_new) { dkl = 0; }
1311 if (k_old > k_new) { dku = 0; }
1314#if defined(WARPX_DIM_3D)
1316 for (
int k=dkl; k<=depos_order+2-dku; k++) {
1317 for (
int j=djl; j<=depos_order+2-dju; j++) {
1318 amrex::Real sdxi = 0._rt;
1319 for (
int i=dil; i<=depos_order+1-diu; i++) {
1320 sdxi += wq*invdtd.
x*(sx_old[i] - sx_new[i])*(
1321 one_third*(sy_new[j]*sz_new[k] + sy_old[j]*sz_old[k])
1322 +one_sixth*(sy_new[j]*sz_old[k] + sy_old[j]*sz_new[k]));
1327 for (
int k=dkl; k<=depos_order+2-dku; k++) {
1328 for (
int i=dil; i<=depos_order+2-diu; i++) {
1329 amrex::Real sdyj = 0._rt;
1330 for (
int j=djl; j<=depos_order+1-dju; j++) {
1331 sdyj += wq*invdtd.
y*(sy_old[j] - sy_new[j])*(
1332 one_third*(sx_new[i]*sz_new[k] + sx_old[i]*sz_old[k])
1333 +one_sixth*(sx_new[i]*sz_old[k] + sx_old[i]*sz_new[k]));
1338 for (
int j=djl; j<=depos_order+2-dju; j++) {
1339 for (
int i=dil; i<=depos_order+2-diu; i++) {
1340 amrex::Real sdzk = 0._rt;
1341 for (
int k=dkl; k<=depos_order+1-dku; k++) {
1342 sdzk += wq*invdtd.
z*(sz_old[k] - sz_new[k])*(
1343 one_third*(sx_new[i]*sy_new[j] + sx_old[i]*sy_old[j])
1344 +one_sixth*(sx_new[i]*sy_old[j] + sx_old[i]*sy_new[j]));
1350#elif defined(WARPX_DIM_XZ) || defined(WARPX_DIM_RZ)
1352 for (
int k=dkl; k<=depos_order+2-dku; k++) {
1353 amrex::Real sdxi = 0._rt;
1354 for (
int i=dil; i<=depos_order+1-diu; i++) {
1355 sdxi += wq*invdtd.
x*(sx_old[i] - sx_new[i])*0.5_rt*(sz_new[k] + sz_old[k]);
1357#if defined(WARPX_DIM_RZ)
1359 for (
int imode=1 ; imode < n_rz_azimuthal_modes ; imode++) {
1361 const Complex djr_cmplx = 2._rt *sdxi*xy_mid;
1364 xy_mid = xy_mid*xy_mid0;
1369 for (
int k=dkl; k<=depos_order+2-dku; k++) {
1370 for (
int i=dil; i<=depos_order+2-diu; i++) {
1371 Real
const sdyj = wq*vy*invvol*(
1372 one_third*(sx_new[i]*sz_new[k] + sx_old[i]*sz_old[k])
1373 +one_sixth*(sx_new[i]*sz_old[k] + sx_old[i]*sz_new[k]));
1375#if defined(WARPX_DIM_RZ)
1381 for (
int imode=1 ; imode < n_rz_azimuthal_modes ; imode++) {
1384 const Complex djt_cmplx = -2._rt * I*(i_new-1 + i + xyzmin.
x*dinv.
x)*wq*invdtd.
x/(amrex::Real)imode
1385 *(
Complex(sx_new[i]*sz_new[k], 0._rt)*(xy_new - xy_mid)
1386 +
Complex(sx_old[i]*sz_old[k], 0._rt)*(xy_mid - xy_old));
1389 xy_new = xy_new*xy_new0;
1390 xy_mid = xy_mid*xy_mid0;
1391 xy_old = xy_old*xy_old0;
1396 for (
int i=dil; i<=depos_order+2-diu; i++) {
1398 for (
int k=dkl; k<=depos_order+1-dku; k++) {
1399 sdzk += wq*invdtd.
z*(sz_old[k] - sz_new[k])*0.5_rt*(sx_new[i] + sx_old[i]);
1401#if defined(WARPX_DIM_RZ)
1403 for (
int imode=1 ; imode < n_rz_azimuthal_modes ; imode++) {
1405 const Complex djz_cmplx = 2._rt * sdzk * xy_mid;
1408 xy_mid = xy_mid*xy_mid0;
1413#elif defined(WARPX_DIM_1D_Z)
1415 for (
int k=dkl; k<=depos_order+2-dku; k++) {
1416 amrex::Real
const sdxi = wq*vx*invvol*0.5_rt*(sz_old[k] + sz_new[k]);
1419 for (
int k=dkl; k<=depos_order+2-dku; k++) {
1420 amrex::Real
const sdyj = wq*vy*invvol*0.5_rt*(sz_old[k] + sz_new[k]);
1423 amrex::Real sdzk = 0._rt;
1424 for (
int k=dkl; k<=depos_order+1-dku; k++) {
1425 sdzk += wq*invdtd.
z*(sz_old[k] - sz_new[k]);
1429#elif defined(WARPX_DIM_RCYLINDER) || defined(WARPX_DIM_RSPHERE)
1431 amrex::Real sdri = 0._rt;
1432 for (
int i=dil; i<=depos_order+1-diu; i++) {
1433 sdri += wq*invdtd.
x*(sx_old[i] - sx_new[i]);
1436 for (
int i=dil; i<=depos_order+2-diu; i++) {
1437 amrex::Real
const sdyj = wq*vy*invvol*0.5_rt*(sx_old[i] + sx_new[i]);
1440 for (
int i=dil; i<=depos_order+2-diu; i++) {
1441 amrex::Real
const sdzk = wq*
vz*invvol*0.5_rt*(sx_old[i] + sx_new[i]);
1472 [[maybe_unused]]amrex::ParticleReal
const yp_old,
1473 [[maybe_unused]]amrex::ParticleReal
const zp_old,
1474 [[maybe_unused]]amrex::ParticleReal
const xp_new,
1475 [[maybe_unused]]amrex::ParticleReal
const yp_new,
1476 [[maybe_unused]]amrex::ParticleReal
const zp_new,
1477 amrex::ParticleReal
const wq,
1478 [[maybe_unused]]amrex::ParticleReal
const uxp_mid,
1479 [[maybe_unused]]amrex::ParticleReal
const uyp_mid,
1480 [[maybe_unused]]amrex::ParticleReal
const uzp_mid,
1481 [[maybe_unused]]amrex::ParticleReal
const gaminv,
1485 amrex::Real
const dt,
1489 amrex::Real
const invvol,
1490 [[maybe_unused]]
int const n_rz_azimuthal_modes)
1493 using namespace amrex::literals;
1495#if (AMREX_SPACEDIM > 1)
1496 amrex::Real
constexpr one_third = 1.0_rt / 3.0_rt;
1497 amrex::Real
constexpr one_sixth = 1.0_rt / 6.0_rt;
1501#if defined(WARPX_DIM_RZ) || defined(WARPX_DIM_RCYLINDER)
1502 amrex::Real
const xp_mid = (xp_new + xp_old)*0.5_rt;
1503 amrex::Real
const yp_mid = (yp_new + yp_old)*0.5_rt;
1504 amrex::Real
const rp_new = std::sqrt(xp_new*xp_new + yp_new*yp_new);
1505 amrex::Real
const rp_old = std::sqrt(xp_old*xp_old + yp_old*yp_old);
1506 amrex::Real
const rp_mid = (rp_new + rp_old)/2._rt;
1507 amrex::Real
const costheta_mid = (rp_mid > 0._rt ? xp_mid/rp_mid : 1._rt);
1508 amrex::Real
const sintheta_mid = (rp_mid > 0._rt ? yp_mid/rp_mid : 0._rt);
1509#if defined(WARPX_DIM_RZ)
1514 double const x_new = (rp_new - xyzmin.
x)*dinv.
x;
1515 double const x_old = (rp_old - xyzmin.
x)*dinv.
x;
1516 amrex::Real
const vx = (rp_new - rp_old)/dt;
1517 amrex::Real
const vy = (-uxp_mid*sintheta_mid + uyp_mid*costheta_mid)*gaminv;
1518#if defined(WARPX_DIM_RCYLINDER)
1519 amrex::Real
const vz = uzp_mid*gaminv;
1521#elif defined(WARPX_DIM_RSPHERE)
1522 amrex::Real
const xp_mid = (xp_new + xp_old)*0.5_rt;
1523 amrex::Real
const yp_mid = (yp_new + yp_old)*0.5_rt;
1524 amrex::Real
const zp_mid = (zp_new + zp_old)*0.5_rt;
1525 amrex::Real
const rpxy_mid = std::sqrt(xp_mid*xp_mid + yp_mid*yp_mid);
1526 amrex::Real
const rp_new = std::sqrt(xp_new*xp_new + yp_new*yp_new + zp_new*zp_new);
1527 amrex::Real
const rp_old = std::sqrt(xp_old*xp_old + yp_old*yp_old + zp_old*zp_old);
1528 amrex::Real
const rp_mid = (rp_new + rp_old)*0.5_rt;
1530 amrex::Real
const costheta_mid = (rpxy_mid > 0. ? xp_mid/rpxy_mid : 1._rt);
1531 amrex::Real
const sintheta_mid = (rpxy_mid > 0. ? yp_mid/rpxy_mid : 0._rt);
1532 amrex::Real
const cosphi_mid = (rp_mid > 0. ? rpxy_mid/rp_mid : 1._rt);
1533 amrex::Real
const sinphi_mid = (rp_mid > 0. ? zp_mid/rp_mid : 0._rt);
1536 double const x_new = (rp_new - xyzmin.
x)*dinv.
x;
1537 double const x_old = (rp_old - xyzmin.
x)*dinv.
x;
1538 amrex::Real
const vx = (rp_new - rp_old)/dt;
1540 amrex::Real
const vy = (-uxp_mid*sintheta_mid + uyp_mid*costheta_mid)*gaminv;
1541 amrex::Real
const vz = (-uxp_mid*costheta_mid*sinphi_mid - uyp_mid*sintheta_mid*sinphi_mid + uzp_mid*cosphi_mid)*gaminv;
1542#elif defined(WARPX_DIM_XZ)
1544 double const x_new = (xp_new - xyzmin.
x)*dinv.
x;
1545 double const x_old = (xp_old - xyzmin.
x)*dinv.
x;
1546 amrex::Real
const vx = (xp_new - xp_old)/dt;
1547 amrex::Real
const vy = uyp_mid*gaminv;
1548#elif defined(WARPX_DIM_1D_Z)
1549 amrex::Real
const vx = uxp_mid*gaminv;
1550 amrex::Real
const vy = uyp_mid*gaminv;
1551#elif defined(WARPX_DIM_3D)
1553 double const x_new = (xp_new - xyzmin.
x)*dinv.
x;
1554 double const x_old = (xp_old - xyzmin.
x)*dinv.
x;
1555 double const y_new = (yp_new - xyzmin.
y)*dinv.
y;
1556 double const y_old = (yp_old - xyzmin.
y)*dinv.
y;
1557 amrex::Real
const vx = (xp_new - xp_old)/dt;
1558 amrex::Real
const vy = (yp_new - yp_old)/dt;
1561#if !defined(WARPX_DIM_RCYLINDER) && !defined(WARPX_DIM_RSPHERE)
1563 double const z_new = (zp_new - xyzmin.
z)*dinv.
z;
1564 double const z_old = (zp_old - xyzmin.
z)*dinv.
z;
1565 amrex::Real
const vz = (zp_new - zp_old)/dt;
1569 amrex::Real
const wqx = wq*vx*invvol;
1570 amrex::Real
const wqy = wq*vy*invvol;
1571 amrex::Real
const wqz = wq*
vz*invvol;
1579 int num_segments = 1;
1581 if ( (depos_order % 2) == 0 ) {
shift = 0.5; }
1583#if defined(WARPX_DIM_3D)
1586 const auto i_old =
static_cast<int>(x_old-
shift);
1587 const auto i_new =
static_cast<int>(x_new-
shift);
1588 const int cell_crossings_x = std::abs(i_new-i_old);
1589 num_segments += cell_crossings_x;
1592 const auto j_old =
static_cast<int>(y_old-
shift);
1593 const auto j_new =
static_cast<int>(y_new-
shift);
1594 const int cell_crossings_y = std::abs(j_new-j_old);
1595 num_segments += cell_crossings_y;
1598 const auto k_old =
static_cast<int>(z_old-
shift);
1599 const auto k_new =
static_cast<int>(z_new-
shift);
1600 const int cell_crossings_z = std::abs(k_new-k_old);
1601 num_segments += cell_crossings_z;
1609 const double dxp = x_new - x_old;
1610 const double dyp = y_new - y_old;
1611 const double dzp = z_new - z_old;
1612 const auto dirX_sign =
static_cast<double>(dxp < 0. ? -1. : 1.);
1613 const auto dirY_sign =
static_cast<double>(dyp < 0. ? -1. : 1.);
1614 const auto dirZ_sign =
static_cast<double>(dzp < 0. ? -1. : 1.);
1615 double Xcell = 0., Ycell = 0., Zcell = 0.;
1616 if (num_segments > 1) {
1617 Xcell =
static_cast<double>(i_old) +
shift + 0.5*(1.-dirX_sign);
1618 Ycell =
static_cast<double>(j_old) +
shift + 0.5*(1.-dirY_sign);
1619 Zcell =
static_cast<double>(k_old) +
shift + 0.5*(1.-dirZ_sign);
1625 double dxp_seg, dyp_seg, dzp_seg;
1626 double x0_new, y0_new, z0_new;
1627 double x0_old = x_old;
1628 double y0_old = y_old;
1629 double z0_old = z_old;
1631 for (
int ns=0; ns<num_segments; ns++) {
1633 if (ns == num_segments-1) {
1638 dxp_seg = x0_new - x0_old;
1639 dyp_seg = y0_new - y0_old;
1640 dzp_seg = z0_new - z0_old;
1645 x0_new = Xcell + dirX_sign;
1646 y0_new = Ycell + dirY_sign;
1647 z0_new = Zcell + dirZ_sign;
1648 dxp_seg = x0_new - x0_old;
1649 dyp_seg = y0_new - y0_old;
1650 dzp_seg = z0_new - z0_old;
1652 if ( (dyp == 0. || std::abs(dxp_seg) < std::abs(dxp/dyp*dyp_seg))
1653 && (dzp == 0. || std::abs(dxp_seg) < std::abs(dxp/dzp*dzp_seg)) ) {
1655 dyp_seg = dyp/dxp*dxp_seg;
1656 dzp_seg = dzp/dxp*dxp_seg;
1657 y0_new = y0_old + dyp_seg;
1658 z0_new = z0_old + dzp_seg;
1660 else if (dzp == 0. || std::abs(dyp_seg) < std::abs(dyp/dzp*dzp_seg)) {
1662 dxp_seg = dxp/dyp*dyp_seg;
1663 dzp_seg = dzp/dyp*dyp_seg;
1664 x0_new = x0_old + dxp_seg;
1665 z0_new = z0_old + dzp_seg;
1669 dxp_seg = dxp/dzp*dzp_seg;
1670 dyp_seg = dyp/dzp*dzp_seg;
1671 x0_new = x0_old + dxp_seg;
1672 y0_new = y0_old + dyp_seg;
1678 const auto seg_factor_x =
static_cast<double>(dxp == 0. ? 1. : dxp_seg/dxp);
1679 const auto seg_factor_y =
static_cast<double>(dyp == 0. ? 1. : dyp_seg/dyp);
1680 const auto seg_factor_z =
static_cast<double>(dzp == 0. ? 1. : dzp_seg/dzp);
1683 double sx_cell[depos_order] = {0.};
1684 double sy_cell[depos_order] = {0.};
1685 double sz_cell[depos_order] = {0.};
1686 double const x0_bar = (x0_new + x0_old)/2.0;
1687 double const y0_bar = (y0_new + y0_old)/2.0;
1688 double const z0_bar = (z0_new + z0_old)/2.0;
1689 const int i0_cell = compute_shape_factor_cell( sx_cell, x0_bar-0.5 );
1690 const int j0_cell = compute_shape_factor_cell( sy_cell, y0_bar-0.5 );
1691 const int k0_cell = compute_shape_factor_cell( sz_cell, z0_bar-0.5 );
1693 if constexpr (depos_order >= 3) {
1695 double sx_old_cell[depos_order] = {0.};
1696 double sx_new_cell[depos_order] = {0.};
1697 double sy_old_cell[depos_order] = {0.};
1698 double sy_new_cell[depos_order] = {0.};
1699 double sz_old_cell[depos_order] = {0.};
1700 double sz_new_cell[depos_order] = {0.};
1701 const int i0_cell_2 = compute_shape_factors_cell( sx_old_cell, sx_new_cell, x0_old-0.5, x0_new-0.5 );
1702 const int j0_cell_2 = compute_shape_factors_cell( sy_old_cell, sy_new_cell, y0_old-0.5, y0_new-0.5 );
1703 const int k0_cell_2 = compute_shape_factors_cell( sz_old_cell, sz_new_cell, z0_old-0.5, z0_new-0.5 );
1705 for (
int m=0; m<depos_order; m++) {
1706 sx_cell[m] = (4.0*sx_cell[m] + sx_old_cell[m] + sx_new_cell[m])/6.0;
1707 sy_cell[m] = (4.0*sy_cell[m] + sy_old_cell[m] + sy_new_cell[m])/6.0;
1708 sz_cell[m] = (4.0*sz_cell[m] + sz_old_cell[m] + sz_new_cell[m])/6.0;
1713 double sx_old_node[depos_order+1] = {0.};
1714 double sx_new_node[depos_order+1] = {0.};
1715 double sy_old_node[depos_order+1] = {0.};
1716 double sy_new_node[depos_order+1] = {0.};
1717 double sz_old_node[depos_order+1] = {0.};
1718 double sz_new_node[depos_order+1] = {0.};
1719 const int i0_node = compute_shape_factors_node( sx_old_node, sx_new_node, x0_old, x0_new );
1720 const int j0_node = compute_shape_factors_node( sy_old_node, sy_new_node, y0_old, y0_new );
1721 const int k0_node = compute_shape_factors_node( sz_old_node, sz_new_node, z0_old, z0_new );
1724 amrex::Real this_Jx;
1725 for (
int i=0; i<=depos_order-1; i++) {
1726 for (
int j=0; j<=depos_order; j++) {
1727 for (
int k=0; k<=depos_order; k++) {
1728 this_Jx = wqx*sx_cell[i]*( sy_old_node[j]*sz_old_node[k]*one_third
1729 + sy_old_node[j]*sz_new_node[k]*one_sixth
1730 + sy_new_node[j]*sz_old_node[k]*one_sixth
1731 + sy_new_node[j]*sz_new_node[k]*one_third )*seg_factor_x;
1738 amrex::Real this_Jy;
1739 for (
int i=0; i<=depos_order; i++) {
1740 for (
int j=0; j<=depos_order-1; j++) {
1741 for (
int k=0; k<=depos_order; k++) {
1742 this_Jy = wqy*sy_cell[j]*( sx_old_node[i]*sz_old_node[k]*one_third
1743 + sx_old_node[i]*sz_new_node[k]*one_sixth
1744 + sx_new_node[i]*sz_old_node[k]*one_sixth
1745 + sx_new_node[i]*sz_new_node[k]*one_third )*seg_factor_y;
1752 amrex::Real this_Jz;
1753 for (
int i=0; i<=depos_order; i++) {
1754 for (
int j=0; j<=depos_order; j++) {
1755 for (
int k=0; k<=depos_order-1; k++) {
1756 this_Jz = wqz*sz_cell[k]*( sx_old_node[i]*sy_old_node[j]*one_third
1757 + sx_old_node[i]*sy_new_node[j]*one_sixth
1758 + sx_new_node[i]*sy_old_node[j]*one_sixth
1759 + sx_new_node[i]*sy_new_node[j]*one_third )*seg_factor_z;
1766 if (ns < num_segments-1) {
1774#elif defined(WARPX_DIM_XZ) || defined(WARPX_DIM_RZ)
1777 const auto i_old =
static_cast<int>(x_old-
shift);
1778 const auto i_new =
static_cast<int>(x_new-
shift);
1779 const int cell_crossings_x = std::abs(i_new-i_old);
1780 num_segments += cell_crossings_x;
1783 const auto k_old =
static_cast<int>(z_old-
shift);
1784 const auto k_new =
static_cast<int>(z_new-
shift);
1785 const int cell_crossings_z = std::abs(k_new-k_old);
1786 num_segments += cell_crossings_z;
1794 const double dxp = x_new - x_old;
1795 const double dzp = z_new - z_old;
1796 const auto dirX_sign =
static_cast<double>(dxp < 0. ? -1. : 1.);
1797 const auto dirZ_sign =
static_cast<double>(dzp < 0. ? -1. : 1.);
1798 double Xcell = 0., Zcell = 0.;
1799 if (num_segments > 1) {
1800 Xcell =
static_cast<double>(i_old) +
shift + 0.5*(1.-dirX_sign);
1801 Zcell =
static_cast<double>(k_old) +
shift + 0.5*(1.-dirZ_sign);
1807 double dxp_seg, dzp_seg;
1808 double x0_new, z0_new;
1809 double x0_old = x_old;
1810 double z0_old = z_old;
1812 for (
int ns=0; ns<num_segments; ns++) {
1814 if (ns == num_segments-1) {
1818 dxp_seg = x0_new - x0_old;
1819 dzp_seg = z0_new - z0_old;
1824 x0_new = Xcell + dirX_sign;
1825 z0_new = Zcell + dirZ_sign;
1826 dxp_seg = x0_new - x0_old;
1827 dzp_seg = z0_new - z0_old;
1829 if (dzp == 0. || std::abs(dxp_seg) < std::abs(dxp/dzp*dzp_seg)) {
1831 dzp_seg = dzp/dxp*dxp_seg;
1832 z0_new = z0_old + dzp_seg;
1836 dxp_seg = dxp/dzp*dzp_seg;
1837 x0_new = x0_old + dxp_seg;
1843 const auto seg_factor_x =
static_cast<double>(dxp == 0. ? 1. : dxp_seg/dxp);
1844 const auto seg_factor_z =
static_cast<double>(dzp == 0. ? 1. : dzp_seg/dzp);
1847 double sx_cell[depos_order] = {0.};
1848 double sz_cell[depos_order] = {0.};
1849 double const x0_bar = (x0_new + x0_old)/2.0;
1850 double const z0_bar = (z0_new + z0_old)/2.0;
1851 const int i0_cell = compute_shape_factor_cell( sx_cell, x0_bar-0.5 );
1852 const int k0_cell = compute_shape_factor_cell( sz_cell, z0_bar-0.5 );
1854 if constexpr (depos_order >= 3) {
1856 double sx_old_cell[depos_order] = {0.};
1857 double sx_new_cell[depos_order] = {0.};
1858 double sz_old_cell[depos_order] = {0.};
1859 double sz_new_cell[depos_order] = {0.};
1860 const int i0_cell_2 = compute_shape_factors_cell( sx_old_cell, sx_new_cell, x0_old-0.5, x0_new-0.5 );
1861 const int k0_cell_2 = compute_shape_factors_cell( sz_old_cell, sz_new_cell, z0_old-0.5, z0_new-0.5 );
1863 for (
int m=0; m<depos_order; m++) {
1864 sx_cell[m] = (4.0*sx_cell[m] + sx_old_cell[m] + sx_new_cell[m])/6.0;
1865 sz_cell[m] = (4.0*sz_cell[m] + sz_old_cell[m] + sz_new_cell[m])/6.0;
1870 double sx_old_node[depos_order+1] = {0.};
1871 double sx_new_node[depos_order+1] = {0.};
1872 double sz_old_node[depos_order+1] = {0.};
1873 double sz_new_node[depos_order+1] = {0.};
1874 const int i0_node = compute_shape_factors_node( sx_old_node, sx_new_node, x0_old, x0_new );
1875 const int k0_node = compute_shape_factors_node( sz_old_node, sz_new_node, z0_old, z0_new );
1878 amrex::Real this_Jx;
1879 for (
int i=0; i<=depos_order-1; i++) {
1880 for (
int k=0; k<=depos_order; k++) {
1881 this_Jx = wqx*sx_cell[i]*(sz_old_node[k] + sz_new_node[k])/2.0_rt*seg_factor_x;
1883#if defined(WARPX_DIM_RZ)
1885 for (
int imode=1 ; imode < n_rz_azimuthal_modes ; imode++) {
1887 const Complex djr_cmplx = 2._rt*this_Jx*xy_mid;
1890 xy_mid = xy_mid*xy_mid0;
1897 const auto seg_factor_y = std::min(seg_factor_x,seg_factor_z);
1898 amrex::Real this_Jy;
1899 for (
int i=0; i<=depos_order; i++) {
1900 for (
int k=0; k<=depos_order; k++) {
1901 this_Jy = wqy*( sx_old_node[i]*sz_old_node[k]*one_third
1902 + sx_old_node[i]*sz_new_node[k]*one_sixth
1903 + sx_new_node[i]*sz_old_node[k]*one_sixth
1904 + sx_new_node[i]*sz_new_node[k]*one_third )*seg_factor_y;
1906#if defined(WARPX_DIM_RZ)
1909 for (
int imode=1 ; imode < n_rz_azimuthal_modes ; imode++) {
1911 const Complex djy_cmplx = 2._rt*this_Jy*xy_mid;
1914 xy_mid = xy_mid*xy_mid0;
1921 amrex::Real this_Jz;
1922 for (
int i=0; i<=depos_order; i++) {
1923 for (
int k=0; k<=depos_order-1; k++) {
1924 this_Jz = wqz*sz_cell[k]*(sx_old_node[i] + sx_new_node[i])/2.0_rt*seg_factor_z;
1926#if defined(WARPX_DIM_RZ)
1928 for (
int imode=1 ; imode < n_rz_azimuthal_modes ; imode++) {
1930 const Complex djz_cmplx = 2._rt*this_Jz*xy_mid;
1933 xy_mid = xy_mid*xy_mid0;
1940 if (ns < num_segments-1) {
1947#elif defined(WARPX_DIM_1D_Z)
1950 const auto k_old =
static_cast<int>(z_old-
shift);
1951 const auto k_new =
static_cast<int>(z_new-
shift);
1952 const int cell_crossings_z = std::abs(k_new-k_old);
1953 num_segments += cell_crossings_z;
1960 double const dzp = z_new - z_old;
1961 const auto dirZ_sign =
static_cast<double>(dzp < 0. ? -1. : 1.);
1962 double Zcell =
static_cast<double>(k_old) +
shift + 0.5*(1.-dirZ_sign);
1969 double z0_old = z_old;
1971 for (
int ns=0; ns<num_segments; ns++) {
1973 if (ns == num_segments-1) {
1975 dzp_seg = z0_new - z0_old;
1978 Zcell = Zcell + dirZ_sign;
1980 dzp_seg = z0_new - z0_old;
1984 const auto seg_factor =
static_cast<double>(dzp == 0. ? 1. : dzp_seg/dzp);
1987 double sz_cell[depos_order] = {0.};
1988 double const z0_bar = (z0_new + z0_old)/2.0;
1989 const int k0_cell = compute_shape_factor_cell( sz_cell, z0_bar-0.5 );
1991 if constexpr (depos_order >= 3) {
1993 double sz_old_cell[depos_order] = {0.};
1994 double sz_new_cell[depos_order] = {0.};
1995 const int k0_cell_2 = compute_shape_factors_cell( sz_old_cell, sz_new_cell, z0_old-0.5, z0_new-0.5 );
1997 for (
int m=0; m<depos_order; m++) {
1998 sz_cell[m] = (4.0*sz_cell[m] + sz_old_cell[m] + sz_new_cell[m])/6.0;
2003 double sz_old_node[depos_order+1] = {0.};
2004 double sz_new_node[depos_order+1] = {0.};
2005 const int k0_node = compute_shape_factors_node( sz_old_node, sz_new_node, z0_old, z0_new );
2008 for (
int k=0; k<=depos_order; k++) {
2009 const amrex::Real weight = 0.5_rt*(sz_old_node[k] + sz_new_node[k])*seg_factor;
2015 for (
int k=0; k<=depos_order-1; k++) {
2016 const amrex::Real this_Jz = wqz*sz_cell[k]*seg_factor;
2021 if (ns < num_segments-1) {
2027#elif defined(WARPX_DIM_RCYLINDER) || defined(WARPX_DIM_RSPHERE)
2030 const auto i_old =
static_cast<int>(x_old-
shift);
2031 const auto i_new =
static_cast<int>(x_new-
shift);
2032 const int cell_crossings_x = std::abs(i_new-i_old);
2033 num_segments += cell_crossings_x;
2040 double const dxp = x_new - x_old;
2041 const auto dirX_sign =
static_cast<double>(dxp < 0. ? -1. : 1.);
2042 double Xcell =
static_cast<double>(i_old) +
shift + 0.5*(1.-dirX_sign);
2049 double x0_old = x_old;
2051 for (
int ns=0; ns<num_segments; ns++) {
2053 if (ns == num_segments-1) {
2055 dxp_seg = x0_new - x0_old;
2058 Xcell = Xcell + dirX_sign;
2060 dxp_seg = x0_new - x0_old;
2064 const auto seg_factor =
static_cast<double>(dxp == 0. ? 1. : dxp_seg/dxp);
2067 double sx_cell[depos_order] = {0.};
2068 double const x0_bar = (x0_new + x0_old)/2.0;
2069 const int i0_cell = compute_shape_factor_cell( sx_cell, x0_bar-0.5 );
2071 if constexpr (depos_order >= 3) {
2073 double sx_old_cell[depos_order] = {0.};
2074 double sx_new_cell[depos_order] = {0.};
2075 const int i0_cell_2 = compute_shape_factors_cell( sx_old_cell, sx_new_cell, x0_old-0.5, x0_new-0.5 );
2077 for (
int m=0; m<depos_order; m++) {
2078 sx_cell[m] = (4.0*sx_cell[m] + sx_old_cell[m] + sx_new_cell[m])/6.0;
2083 double sx_old_node[depos_order+1] = {0.};
2084 double sx_new_node[depos_order+1] = {0.};
2085 const int i0_node = compute_shape_factors_node( sx_old_node, sx_new_node, x0_old, x0_new );
2088 for (
int i=0; i<=depos_order; i++) {
2089 const amrex::Real weight = 0.5_rt*(sx_old_node[i] + sx_new_node[i])*seg_factor;
2095 for (
int i=0; i<=depos_order-1; i++) {
2096 const amrex::Real this_Jx = wqx*sx_cell[i]*seg_factor;
2101 if (ns < num_segments-1) {
2325 const amrex::ParticleReal*
const wp,
2326 const amrex::ParticleReal*
const uxp,
2327 const amrex::ParticleReal*
const uyp,
2328 const amrex::ParticleReal*
const uzp,
2329 const int*
const ion_lev,
2335 amrex::Real relative_time,
2340 [[maybe_unused]]
int n_rz_azimuthal_modes)
2342 using namespace amrex::literals;
2344#if defined(WARPX_DIM_RZ)
2346 wp, uxp, uyp, uzp, ion_lev, Dx_fab, Dy_fab, Dz_fab,
2347 np_to_deposit, dt, relative_time, dinv, xyzmin, lo, q);
2351#if defined(WARPX_DIM_1D_Z) || defined(WARPX_DIM_RCYLINDER) || defined(WARPX_DIM_RSPHERE)
2353 wp, uxp, uyp, uzp, ion_lev, Dx_fab, Dy_fab, Dz_fab,
2354 np_to_deposit, dt, relative_time, dinv, xyzmin, lo, q);
2358#if !(defined WARPX_DIM_RZ || defined WARPX_DIM_1D_Z || defined WARPX_DIM_RCYLINDER || defined WARPX_DIM_RSPHERE)
2361 const bool do_ionization = ion_lev;
2364 const amrex::Real invdt = 1._rt / dt;
2366 const amrex::Real invvol = dinv.
x*dinv.
y*dinv.
z;
2369#if defined(WARPX_DIM_3D)
2372#elif defined(WARPX_DIM_XZ)
2376 temp_fab.
setVal<amrex::RunOn::Device>(0._rt);
2388 const amrex::Real invgam = 1._rt / std::sqrt(1._rt + uxp[ip] * uxp[ip] *
PhysConst::inv_c2
2392 amrex::Real wq = q * wp[ip];
2393 if (do_ionization) { wq *= ion_lev[ip]; }
2396 amrex::ParticleReal xp, yp, zp;
2397 GetPosition(ip, xp, yp, zp);
2400 const amrex::Real vx = uxp[ip] * invgam;
2401 const amrex::Real vy = uyp[ip] * invgam;
2402 const amrex::Real
vz = uzp[ip] * invgam;
2405 xp += relative_time * vx;
2406 yp += relative_time * vy;
2407 zp += relative_time *
vz;
2411 double const x_new = (xp - xyzmin.
x + 0.5_rt*dt*vx) * dinv.
x;
2412 double const x_old = (xp - xyzmin.
x - 0.5_rt*dt*vx) * dinv.
x;
2413#if defined(WARPX_DIM_3D)
2415 double const y_new = (yp - xyzmin.
y + 0.5_rt*dt*vy) * dinv.
y;
2416 double const y_old = (yp - xyzmin.
y - 0.5_rt*dt*vy) * dinv.
y;
2419 double const z_new = (zp - xyzmin.
z + 0.5_rt*dt*
vz) * dinv.
z;
2420 double const z_old = (zp - xyzmin.
z - 0.5_rt*dt*
vz) * dinv.
z;
2424 double sx_new[depos_order+1] = {0.};
2425 double sx_old[depos_order+1] = {0.};
2426#if defined(WARPX_DIM_3D)
2428 double sy_new[depos_order+1] = {0.};
2429 double sy_old[depos_order+1] = {0.};
2432 double sz_new[depos_order+1] = {0.};
2433 double sz_old[depos_order+1] = {0.};
2440 const int i_new = compute_shape_factor(sx_new, x_new);
2441#if defined(WARPX_DIM_3D)
2444 const int j_new = compute_shape_factor(sy_new, y_new);
2448 const int k_new = compute_shape_factor(sz_new, z_new);
2454 const int i_old = compute_shape_factor(sx_old, x_old);
2455#if defined(WARPX_DIM_3D)
2458 const int j_old = compute_shape_factor(sy_old, y_old);
2462 const int k_old = compute_shape_factor(sz_old, z_old);
2465#if defined(WARPX_DIM_XZ)
2467 const amrex::Real wqy = wq * vy * invvol;
2468 for (
int k=0; k<=depos_order; k++) {
2469 for (
int i=0; i<=depos_order; i++) {
2473 auto const sxn_szn =
static_cast<amrex::Real
>(sx_new[i] * sz_new[k]);
2474 auto const sxo_szn =
static_cast<amrex::Real
>(sx_old[i] * sz_new[k]);
2475 auto const sxn_szo =
static_cast<amrex::Real
>(sx_new[i] * sz_old[k]);
2476 auto const sxo_szo =
static_cast<amrex::Real
>(sx_old[i] * sz_old[k]);
2478 if (i_new == i_old && k_new == k_old) {
2481 wq * invvol * invdt * (sxn_szn - sxo_szo));
2484 wq * invvol * invdt * (sxn_szo - sxo_szn));
2488 wqy * 0.25_rt * (sxn_szn + sxn_szo + sxo_szn + sxo_szo));
2492 wq * invvol * invdt * sxn_szn);
2495 - wq * invvol * invdt * sxo_szo);
2498 wq * invvol * invdt * sxn_szo);
2501 - wq * invvol * invdt * sxo_szn);
2505 wqy * 0.25_rt * sxn_szn);
2508 wqy * 0.25_rt * sxn_szo);
2511 wqy * 0.25_rt * sxo_szn);
2514 wqy * 0.25_rt * sxo_szo);
2520#elif defined(WARPX_DIM_3D)
2522 for (
int k=0; k<=depos_order; k++) {
2523 for (
int j=0; j<=depos_order; j++) {
2525 auto const syn_szn =
static_cast<amrex::Real
>(sy_new[j] * sz_new[k]);
2526 auto const syo_szn =
static_cast<amrex::Real
>(sy_old[j] * sz_new[k]);
2527 auto const syn_szo =
static_cast<amrex::Real
>(sy_new[j] * sz_old[k]);
2528 auto const syo_szo =
static_cast<amrex::Real
>(sy_old[j] * sz_old[k]);
2530 for (
int i=0; i<=depos_order; i++) {
2532 auto const sxn_syn_szn =
static_cast<amrex::Real
>(sx_new[i]) * syn_szn;
2533 auto const sxo_syn_szn =
static_cast<amrex::Real
>(sx_old[i]) * syn_szn;
2534 auto const sxn_syo_szn =
static_cast<amrex::Real
>(sx_new[i]) * syo_szn;
2535 auto const sxo_syo_szn =
static_cast<amrex::Real
>(sx_old[i]) * syo_szn;
2536 auto const sxn_syn_szo =
static_cast<amrex::Real
>(sx_new[i]) * syn_szo;
2537 auto const sxo_syn_szo =
static_cast<amrex::Real
>(sx_old[i]) * syn_szo;
2538 auto const sxn_syo_szo =
static_cast<amrex::Real
>(sx_new[i]) * syo_szo;
2539 auto const sxo_syo_szo =
static_cast<amrex::Real
>(sx_old[i]) * syo_szo;
2541 if (i_new == i_old && j_new == j_old && k_new == k_old) {
2544 wq * invvol * invdt * (sxn_syn_szn - sxo_syo_szo));
2547 wq * invvol * invdt * (sxn_syn_szo - sxo_syo_szn));
2550 wq * invvol * invdt * (sxn_syo_szn - sxo_syn_szo));
2553 wq * invvol * invdt * (sxo_syn_szn - sxn_syo_szo));
2557 wq * invvol * invdt * sxn_syn_szn);
2560 - wq * invvol * invdt * sxo_syo_szo);
2563 wq * invvol * invdt * sxn_syn_szo);
2566 - wq * invvol * invdt * sxo_syo_szn);
2569 wq * invvol * invdt * sxn_syo_szn);
2572 - wq * invvol * invdt * sxo_syn_szo);
2575 wq * invvol * invdt * sxo_syn_szn);
2578 - wq * invvol * invdt * sxn_syo_szo);
2586#if defined(WARPX_DIM_3D)
2589 const amrex::Real t_a = temp_arr(i,j,k,0);
2590 const amrex::Real t_b = temp_arr(i,j,k,1);
2591 const amrex::Real t_c = temp_arr(i,j,k,2);
2592 const amrex::Real t_d = temp_arr(i,j,k,3);
2593 Dx_arr(i,j,k) += (1._rt/6._rt)*(2_rt*t_a + t_b + t_c - 2._rt*t_d);
2594 Dy_arr(i,j,k) += (1._rt/6._rt)*(2_rt*t_a + t_b - 2._rt*t_c + t_d);
2595 Dz_arr(i,j,k) += (1._rt/6._rt)*(2_rt*t_a - 2._rt*t_b + t_c + t_d);
2597#elif defined(WARPX_DIM_XZ)
2600 const amrex::Real t_a = temp_arr(i,j,0,0);
2601 const amrex::Real t_b = temp_arr(i,j,0,1);
2602 Dx_arr(i,j,0) += (0.5_rt)*(t_a + t_b);
2603 Dz_arr(i,j,0) += (0.5_rt)*(t_a - t_b);