67 [[maybe_unused]]
const int n_rz_azimuthal_modes)
75#if defined(WARPX_DIM_RZ) || defined(WARPX_DIM_RCYLINDER)
80 const amrex::Real rpmid = std::sqrt(xpmid*xpmid + ypmid*ypmid);
81 const amrex::Real costheta = (rpmid > 0._rt ? xpmid/rpmid : 1._rt);
82 const amrex::Real sintheta = (rpmid > 0._rt ? ypmid/rpmid : 0._rt);
83 const amrex::Real wqx = wq*invvol*(+vx*costheta + vy*sintheta);
84 const amrex::Real wqy = wq*invvol*(-vx*sintheta + vy*costheta);
86 #if defined(WARPX_DIM_RZ)
89#elif defined(WARPX_DIM_RSPHERE)
94 const amrex::Real rpxymid = std::sqrt(xpmid*xpmid + ypmid*ypmid);
95 const amrex::Real rpmid = std::sqrt(xpmid*xpmid + ypmid*ypmid + zpmid*zpmid);
96 const amrex::Real costheta = (rpxymid > 0._rt ? xpmid/rpxymid : 1._rt);
97 const amrex::Real sintheta = (rpxymid > 0._rt ? ypmid/rpxymid : 0._rt);
98 const amrex::Real cosphi = (rpmid > 0._rt ? rpxymid/rpmid : 1._rt);
99 const amrex::Real sinphi = (rpmid > 0._rt ? zpmid/rpmid : 0._rt);
101 const amrex::Real wqx = wq*invvol*(+vx*costheta*cosphi + vy*sintheta*cosphi +
vz*sinphi);
102 const amrex::Real wqy = wq*invvol*(-vx*sintheta + vy*costheta);
103 const amrex::Real wqz = wq*invvol*(-vx*costheta*sinphi - vy*sintheta*sinphi +
vz*cosphi);
112#if !defined(WARPX_DIM_1D_Z)
117#if defined(WARPX_DIM_RZ) || defined(WARPX_DIM_RCYLINDER) || defined(WARPX_DIM_RSPHERE)
118 const double xmid = (rpmid - xyzmin.
x)*dinv.
x;
120 const double xmid = ((xp - xyzmin.
x) + relative_time*vx)*dinv.
x;
128 double sx_node[depos_order + 1] = {0.};
129 double sx_cell[depos_order + 1] = {0.};
132 if (jx_type[0] == NODE || jy_type[0] == NODE || jz_type[0] == NODE) {
133 j_node = compute_shape_factor(sx_node, xmid);
135 if (jx_type[0] == CELL || jy_type[0] == CELL || jz_type[0] == CELL) {
136 j_cell = compute_shape_factor(sx_cell, xmid - 0.5);
142 for (
int ix=0; ix<=depos_order; ix++)
149 int const j_jx = ((jx_type[0] == NODE) ? j_node : j_cell);
150 int const j_jy = ((jy_type[0] == NODE) ? j_node : j_cell);
151 int const j_jz = ((jz_type[0] == NODE) ? j_node : j_cell);
154#if defined(WARPX_DIM_3D)
157 const double ymid = ((yp - xyzmin.
y) + relative_time*vy)*dinv.
y;
158 double sy_node[depos_order + 1] = {0.};
159 double sy_cell[depos_order + 1] = {0.};
162 if (jx_type[1] == NODE || jy_type[1] == NODE || jz_type[1] == NODE) {
163 k_node = compute_shape_factor(sy_node, ymid);
165 if (jx_type[1] == CELL || jy_type[1] == CELL || jz_type[1] == CELL) {
166 k_cell = compute_shape_factor(sy_cell, ymid - 0.5);
171 for (
int iy=0; iy<=depos_order; iy++)
177 int const k_jx = ((jx_type[1] == NODE) ? k_node : k_cell);
178 int const k_jy = ((jy_type[1] == NODE) ? k_node : k_cell);
179 int const k_jz = ((jz_type[1] == NODE) ? k_node : k_cell);
182#if !defined(WARPX_DIM_RCYLINDER) && !defined(WARPX_DIM_RSPHERE)
185 constexpr int zdir = WARPX_ZINDEX;
186 const double zmid = ((zp - xyzmin.
z) + relative_time*
vz)*dinv.
z;
187 double sz_node[depos_order + 1] = {0.};
188 double sz_cell[depos_order + 1] = {0.};
191 if (jx_type[zdir] == NODE || jy_type[zdir] == NODE || jz_type[zdir] == NODE) {
192 l_node = compute_shape_factor(sz_node, zmid);
194 if (jx_type[zdir] == CELL || jy_type[zdir] == CELL || jz_type[zdir] == CELL) {
195 l_cell = compute_shape_factor(sz_cell, zmid - 0.5);
200 for (
int iz=0; iz<=depos_order; iz++)
206 int const l_jx = ((jx_type[zdir] == NODE) ? l_node : l_cell);
207 int const l_jy = ((jy_type[zdir] == NODE) ? l_node : l_cell);
208 int const l_jz = ((jz_type[zdir] == NODE) ? l_node : l_cell);
212#if defined(WARPX_DIM_1D_Z)
213 for (
int iz=0; iz<=depos_order; iz++){
215 &jx_arr(lo.
x+l_jx+iz, 0, 0, 0),
218 &jy_arr(lo.
x+l_jy+iz, 0, 0, 0),
221 &jz_arr(lo.
x+l_jz+iz, 0, 0, 0),
224#elif defined(WARPX_DIM_RCYLINDER) || defined(WARPX_DIM_RSPHERE)
225 for (
int ix=0; ix<=depos_order; ix++){
230#elif defined(WARPX_DIM_XZ) || defined(WARPX_DIM_RZ)
231 for (
int iz=0; iz<=depos_order; iz++){
232 for (
int ix=0; ix<=depos_order; ix++){
234 &jx_arr(lo.
x+j_jx+ix, lo.
y+l_jx+iz, 0, 0),
235 sx_jx[ix]*sz_jx[iz]*wqx);
237 &jy_arr(lo.
x+j_jy+ix, lo.
y+l_jy+iz, 0, 0),
238 sx_jy[ix]*sz_jy[iz]*wqy);
240 &jz_arr(lo.
x+j_jz+ix, lo.
y+l_jz+iz, 0, 0),
241 sx_jz[ix]*sz_jz[iz]*wqz);
242#if defined(WARPX_DIM_RZ)
244 for (
int imode=1 ; imode < n_rz_azimuthal_modes ; imode++) {
257#elif defined(WARPX_DIM_3D)
258 for (
int iz=0; iz<=depos_order; iz++){
259 for (
int iy=0; iy<=depos_order; iy++){
260 for (
int ix=0; ix<=depos_order; ix++){
262 &jx_arr(lo.
x+j_jx+ix, lo.
y+k_jx+iy, lo.
z+l_jx+iz),
263 sx_jx[ix]*sy_jx[iy]*sz_jx[iz]*wqx);
265 &jy_arr(lo.
x+j_jy+ix, lo.
y+k_jy+iy, lo.
z+l_jy+iz),
266 sx_jy[ix]*sy_jy[iy]*sz_jy[iz]*wqy);
268 &jz_arr(lo.
x+j_jz+ix, lo.
y+k_jz+iy, lo.
z+l_jz+iz),
269 sx_jz[ix]*sy_jz[iy]*sz_jz[iz]*wqz);
492 int n_rz_azimuthal_modes,
497 const int threads_per_block,
502#if (defined(AMREX_USE_HIP) || defined(AMREX_USE_CUDA)) && \
503 !(defined(WARPX_DIM_RCYLINDER) || defined(WARPX_DIM_RSPHERE))
504 using namespace amrex;
515 constexpr int zdir = WARPX_ZINDEX;
522 const auto domain = geom.
Domain();
525 sample_tbox.
grow(depos_order);
533 const int nblocks = a_bins.
numBins();
536 const std::size_t shared_mem_bytes = npts*
sizeof(
amrex::Real);
539 "Tile size too big for GPU shared memory current deposition");
546 const int bin_id = blockIdx.x;
547 const unsigned int bin_start = offsets_ptr[bin_id];
548 const unsigned int bin_stop = offsets_ptr[bin_id+1];
550 if (bin_start == bin_stop) {
return; }
556 GetPosition(permutation[bin_start], xp, yp, zp);
557#if defined(WARPX_DIM_3D)
558 IntVect iv =
IntVect(
int( amrex::Math::floor((xp-plo[0]) * dxiarr[0]) ),
559 int( amrex::Math::floor((yp-plo[1]) * dxiarr[1]) ),
560 int( amrex::Math::floor((zp-plo[2]) * dxiarr[2]) ));
561#elif defined(WARPX_DIM_XZ) || defined(WARPX_DIM_RZ)
562 IntVect iv =
IntVect(
int( amrex::Math::floor((xp-plo[0]) * dxiarr[0]) ),
563 int( amrex::Math::floor((zp-plo[1]) * dxiarr[1]) ));
564#elif defined(WARPX_DIM_1D_Z)
565 IntVect iv =
IntVect(
int( amrex::Math::floor((zp-plo[0]) * dxiarr[0]) ));
566#elif defined(WARPX_DIM_RCYLINDER) || defined(WARPX_DIM_RSPHERE)
567 IntVect iv =
IntVect(
int( amrex::Math::floor((xp-plo[0]) * dxiarr[0]) ));
569 iv += domain.smallEnd();
573 buffer_box.
grow(depos_order);
590 for (
int i = threadIdx.x; i < npts; i += blockDim.x){
594 for (
unsigned int ip_orig = bin_start+threadIdx.x; ip_orig<bin_stop; ip_orig += blockDim.x)
596 const unsigned int ip = permutation[ip_orig];
597 depositComponent<depos_order>(GetPosition, wp, uxp, uyp, uzp, ion_lev, jx_buff, jx_type,
598 relative_time, dinv, xyzmin, lo, q, n_rz_azimuthal_modes,
599 ip, zdir, NODE, CELL, 0);
603 addLocalToGlobal(tbox_x, jx_arr, jx_buff);
604 for (
int i = threadIdx.x; i < npts; i += blockDim.x){
609 for (
unsigned int ip_orig = bin_start+threadIdx.x; ip_orig<bin_stop; ip_orig += blockDim.x)
611 const unsigned int ip = permutation[ip_orig];
612 depositComponent<depos_order>(GetPosition, wp, uxp, uyp, uzp, ion_lev, jy_buff, jy_type,
613 relative_time, dinv, xyzmin, lo, q, n_rz_azimuthal_modes,
614 ip, zdir, NODE, CELL, 1);
618 addLocalToGlobal(tbox_y, jy_arr, jy_buff);
619 for (
int i = threadIdx.x; i < npts; i += blockDim.x){
624 for (
unsigned int ip_orig = bin_start+threadIdx.x; ip_orig<bin_stop; ip_orig += blockDim.x)
626 const unsigned int ip = permutation[ip_orig];
627 depositComponent<depos_order>(GetPosition, wp, uxp, uyp, uzp, ion_lev, jz_buff, jz_type,
628 relative_time, dinv, xyzmin, lo, q, n_rz_azimuthal_modes,
629 ip, zdir, NODE, CELL, 2);
633 addLocalToGlobal(tbox_z, jz_arr, jz_buff);
640 GetPosition, wp, uxp, uyp, uzp, ion_lev, jx_fab, jy_fab, jz_fab,
641 np_to_deposit, relative_time, dinv, xyzmin, lo, q,
642 n_rz_azimuthal_modes, a_bins, box, geom, a_tbox_max_size,
643 threads_per_block, bin_size);
692 [[maybe_unused]]
int n_rz_azimuthal_modes,
694 bool enable_reduced_shape
697 using namespace amrex;
702 bool const do_ionization = ion_lev;
703#if !defined(WARPX_DIM_3D)
708 (1.0_rt/dt)*dinv.
x*dinv.
z,
709 (1.0_rt/dt)*dinv.
x*dinv.
y};
713#if (AMREX_SPACEDIM > 1)
714 Real constexpr one_third = 1.0_rt / 3.0_rt;
715 Real constexpr one_sixth = 1.0_rt / 6.0_rt;
721 enum eb_flags :
int { has_reduced_shape, no_reduced_shape };
722 const int reduce_shape_runtime_flag = (enable_reduced_shape && (depos_order>1))? has_reduced_shape : no_reduced_shape;
725 {reduce_shape_runtime_flag},
728 Real const gaminv = 1.0_rt/std::sqrt(1.0_rt + uxp[ip]*uxp[ip]*clightsq
729 + uyp[ip]*uyp[ip]*clightsq
730 + uzp[ip]*uzp[ip]*clightsq);
738 GetPosition(ip, xp, yp, zp);
741#if defined(WARPX_DIM_RZ) || defined(WARPX_DIM_RCYLINDER)
742 Real const xp_new = xp + (relative_time + 0.5_rt*dt)*uxp[ip]*gaminv;
743 Real const yp_new = yp + (relative_time + 0.5_rt*dt)*uyp[ip]*gaminv;
744 Real const xp_mid = xp_new - 0.5_rt*dt*uxp[ip]*gaminv;
745 Real const yp_mid = yp_new - 0.5_rt*dt*uyp[ip]*gaminv;
746 Real const xp_old = xp_new - dt*uxp[ip]*gaminv;
747 Real const yp_old = yp_new - dt*uyp[ip]*gaminv;
748 Real const rp_new = std::sqrt(xp_new*xp_new + yp_new*yp_new);
749 Real const rp_mid = std::sqrt(xp_mid*xp_mid + yp_mid*yp_mid);
750 Real const rp_old = std::sqrt(xp_old*xp_old + yp_old*yp_old);
751 const amrex::Real costheta_mid = (rp_mid > 0._rt ? xp_mid/rp_mid : 1._rt);
752 const amrex::Real sintheta_mid = (rp_mid > 0._rt ? yp_mid/rp_mid : 0._rt);
754 double x_new = (rp_new - xyzmin.
x)*dinv.
x;
755 double const x_old = (rp_old - xyzmin.
x)*dinv.
x;
756#if defined(WARPX_DIM_RZ)
757 const amrex::Real costheta_new = (rp_new > 0._rt ? xp_new/rp_new : 1._rt);
758 const amrex::Real sintheta_new = (rp_new > 0._rt ? yp_new/rp_new : 0._rt);
759 const amrex::Real costheta_old = (rp_old > 0._rt ? xp_old/rp_old : 1._rt);
760 const amrex::Real sintheta_old = (rp_old > 0._rt ? yp_old/rp_old : 0._rt);
765#elif defined(WARPX_DIM_RSPHERE)
766 Real const xp_new = xp + (relative_time + 0.5_rt*dt)*uxp[ip]*gaminv;
767 Real const yp_new = yp + (relative_time + 0.5_rt*dt)*uyp[ip]*gaminv;
768 Real const zp_new = zp + (relative_time + 0.5_rt*dt)*uzp[ip]*gaminv;
769 Real const xp_mid = xp_new - 0.5_rt*dt*uxp[ip]*gaminv;
770 Real const yp_mid = yp_new - 0.5_rt*dt*uyp[ip]*gaminv;
771 Real const zp_mid = zp_new - 0.5_rt*dt*uzp[ip]*gaminv;
772 Real const xp_old = xp_new - dt*uxp[ip]*gaminv;
773 Real const yp_old = yp_new - dt*uyp[ip]*gaminv;
774 Real const zp_old = zp_new - dt*uzp[ip]*gaminv;
775 Real const rpxy_mid = std::sqrt(xp_mid*xp_mid + yp_mid*yp_mid);
776 Real const rp_new = std::sqrt(xp_new*xp_new + yp_new*yp_new + zp_new*zp_new);
777 Real const rp_old = std::sqrt(xp_old*xp_old + yp_old*yp_old + zp_old*zp_old);
778 Real const rp_mid = (rp_new + rp_old)*0.5_rt;
780 amrex::Real const costheta_mid = (rpxy_mid > 0. ? xp_mid/rpxy_mid : 1._rt);
781 amrex::Real const sintheta_mid = (rpxy_mid > 0. ? yp_mid/rpxy_mid : 0._rt);
782 amrex::Real const cosphi_mid = (rp_mid > 0. ? rpxy_mid/rp_mid : 1._rt);
783 amrex::Real const sinphi_mid = (rp_mid > 0. ? zp_mid/rp_mid : 0._rt);
786 double x_new = (rp_new - xyzmin.
x)*dinv.
x;
787 double const x_old = (rp_old - xyzmin.
x)*dinv.
x;
789#if !defined(WARPX_DIM_1D_Z)
791 double x_new = (xp - xyzmin.
x + (relative_time + 0.5_rt*dt)*uxp[ip]*gaminv)*dinv.
x;
792 double const x_old = x_new - dt*dinv.
x*uxp[ip]*gaminv;
795#if defined(WARPX_DIM_3D)
797 double y_new = (yp - xyzmin.
y + (relative_time + 0.5_rt*dt)*uyp[ip]*gaminv)*dinv.
y;
798 double const y_old = y_new - dt*dinv.
y*uyp[ip]*gaminv;
800#if !defined(WARPX_DIM_RCYLINDER) && !defined(WARPX_DIM_RSPHERE)
802 double z_new = (zp - xyzmin.
z + (relative_time + 0.5_rt*dt)*uzp[ip]*gaminv)*dinv.
z;
803 double const z_old = z_new - dt*dinv.
z*uzp[ip]*gaminv;
807 bool reduce_shape_old, reduce_shape_new;
811 if constexpr (reduce_shape_control == has_reduced_shape) {
812#if defined(WARPX_DIM_3D)
813 reduce_shape_old = reduced_particle_shape_mask(
814 lo.
x +
int(amrex::Math::floor(x_old)),
815 lo.
y +
int(amrex::Math::floor(y_old)),
816 lo.
z +
int(amrex::Math::floor(z_old)));
817 reduce_shape_new = reduced_particle_shape_mask(
818 lo.
x +
int(amrex::Math::floor(x_new)),
819 lo.
y +
int(amrex::Math::floor(y_new)),
820 lo.
z +
int(amrex::Math::floor(z_new)));
821#elif defined(WARPX_DIM_XZ) || defined(WARPX_DIM_RZ)
822 reduce_shape_old = reduced_particle_shape_mask(
823 lo.
x +
int(amrex::Math::floor(x_old)),
824 lo.
y +
int(amrex::Math::floor(z_old)),
826 reduce_shape_new = reduced_particle_shape_mask(
827 lo.
x +
int(amrex::Math::floor(x_new)),
828 lo.
y +
int(amrex::Math::floor(z_new)),
830#elif defined(WARPX_DIM_RCYLINDER) || defined(WARPX_DIM_RSPHERE)
831 reduce_shape_old = reduced_particle_shape_mask(
832 lo.
x +
int(amrex::Math::floor(x_old)),
834 reduce_shape_new = reduced_particle_shape_mask(
835 lo.
x +
int(amrex::Math::floor(x_new)),
837#elif defined(WARPX_DIM_1D_Z)
838 reduce_shape_old = reduced_particle_shape_mask(
839 lo.
x +
int(amrex::Math::floor(z_old)),
841 reduce_shape_new = reduced_particle_shape_mask(
842 lo.
x +
int(amrex::Math::floor(z_new)),
846 reduce_shape_old =
false;
847 reduce_shape_new =
false;
850#if defined(WARPX_DIM_RZ)
851 Real const vy = (-uxp[ip]*sintheta_mid + uyp[ip]*costheta_mid)*gaminv;
852#elif defined(WARPX_DIM_XZ)
853 Real const vy = uyp[ip]*gaminv;
854#elif defined(WARPX_DIM_1D_Z)
855 Real const vx = uxp[ip]*gaminv;
856 Real const vy = uyp[ip]*gaminv;
857#elif defined(WARPX_DIM_RCYLINDER)
858 Real const vy = (-uxp[ip]*sintheta_mid + uyp[ip]*costheta_mid)*gaminv;
859 Real const vz = uzp[ip]*gaminv;
860#elif defined(WARPX_DIM_RSPHERE)
862 Real const vy = (-uxp[ip]*sintheta_mid + uyp[ip]*costheta_mid)*gaminv;
863 Real const vz = (-uxp[ip]*costheta_mid*sinphi_mid - uyp[ip]*sintheta_mid*sinphi_mid + uzp[ip]*cosphi_mid)*gaminv;
880#if !defined(WARPX_DIM_1D_Z)
881 double sx_new[depos_order + 3] = {0.};
882 double sx_old[depos_order + 3] = {0.};
883 const int i_new = compute_shape_factor(sx_new+1, x_new );
884 const int i_old = compute_shifted_shape_factor(sx_old, x_old, i_new);
886 if constexpr (reduce_shape_control == has_reduced_shape) {
887 if (reduce_shape_new) {
888 for (
int i=0; i<depos_order+3; i++) {sx_new[i] = 0.;}
889 compute_shifted_shape_factor_order1( sx_new+depos_order/2, x_new, i_new+depos_order/2 );
891 if (reduce_shape_old) {
892 for (
int i=0; i<depos_order+3; i++) {sx_old[i] = 0.;}
893 compute_shifted_shape_factor_order1( sx_old+depos_order/2, x_old, i_new+depos_order/2 );
899#if defined(WARPX_DIM_3D)
900 double sy_new[depos_order + 3] = {0.};
901 double sy_old[depos_order + 3] = {0.};
902 const int j_new = compute_shape_factor(sy_new+1, y_new);
903 const int j_old = compute_shifted_shape_factor(sy_old, y_old, j_new);
905 if constexpr (reduce_shape_control == has_reduced_shape) {
906 if (reduce_shape_new) {
907 for (
int j=0; j<depos_order+3; j++) {sy_new[j] = 0.;}
908 compute_shifted_shape_factor_order1( sy_new+depos_order/2, y_new, j_new+depos_order/2 );
910 if (reduce_shape_old) {
911 for (
int j=0; j<depos_order+3; j++) {sy_old[j] = 0.;}
912 compute_shifted_shape_factor_order1( sy_old+depos_order/2, y_old, j_new+depos_order/2 );
918#if !defined(WARPX_DIM_RCYLINDER) && !defined(WARPX_DIM_RSPHERE)
919 double sz_new[depos_order + 3] = {0.};
920 double sz_old[depos_order + 3] = {0.};
921 const int k_new = compute_shape_factor(sz_new+1, z_new );
922 const int k_old = compute_shifted_shape_factor(sz_old, z_old, k_new );
924 if constexpr (reduce_shape_control == has_reduced_shape) {
925 if (reduce_shape_new) {
926 for (
int k=0; k<depos_order+3; k++) {sz_new[k] = 0.;}
927 compute_shifted_shape_factor_order1( sz_new+depos_order/2, z_new, k_new+depos_order/2 );
929 if (reduce_shape_old) {
930 for (
int k=0; k<depos_order+3; k++) {sz_old[k] = 0.;}
931 compute_shifted_shape_factor_order1( sz_old+depos_order/2, z_old, k_new+depos_order/2 );
939#if !defined(WARPX_DIM_1D_Z)
940 int dil = 1, diu = 1;
941 if (i_old < i_new) { dil = 0; }
942 if (i_old > i_new) { diu = 0; }
944#if defined(WARPX_DIM_3D)
945 int djl = 1, dju = 1;
946 if (j_old < j_new) { djl = 0; }
947 if (j_old > j_new) { dju = 0; }
949#if !defined(WARPX_DIM_RCYLINDER) && !defined(WARPX_DIM_RSPHERE)
950 int dkl = 1, dku = 1;
951 if (k_old < k_new) { dkl = 0; }
952 if (k_old > k_new) { dku = 0; }
955#if defined(WARPX_DIM_3D)
957 for (
int k=dkl; k<=depos_order+2-dku; k++) {
958 for (
int j=djl; j<=depos_order+2-dju; j++) {
960 for (
int i=dil; i<=depos_order+1-diu; i++) {
961 sdxi += wq*invdtd.
x*(sx_old[i] - sx_new[i])*(
962 one_third*(sy_new[j]*sz_new[k] + sy_old[j]*sz_old[k])
963 +one_sixth*(sy_new[j]*sz_old[k] + sy_old[j]*sz_new[k]));
968 for (
int k=dkl; k<=depos_order+2-dku; k++) {
969 for (
int i=dil; i<=depos_order+2-diu; i++) {
971 for (
int j=djl; j<=depos_order+1-dju; j++) {
972 sdyj += wq*invdtd.
y*(sy_old[j] - sy_new[j])*(
973 one_third*(sx_new[i]*sz_new[k] + sx_old[i]*sz_old[k])
974 +one_sixth*(sx_new[i]*sz_old[k] + sx_old[i]*sz_new[k]));
979 for (
int j=djl; j<=depos_order+2-dju; j++) {
980 for (
int i=dil; i<=depos_order+2-diu; i++) {
982 for (
int k=dkl; k<=depos_order+1-dku; k++) {
983 sdzk += wq*invdtd.
z*(sz_old[k] - sz_new[k])*(
984 one_third*(sx_new[i]*sy_new[j] + sx_old[i]*sy_old[j])
985 +one_sixth*(sx_new[i]*sy_old[j] + sx_old[i]*sy_new[j]));
991#elif defined(WARPX_DIM_XZ) || defined(WARPX_DIM_RZ)
993 for (
int k=dkl; k<=depos_order+2-dku; k++) {
995 for (
int i=dil; i<=depos_order+1-diu; i++) {
996 sdxi += wq*invdtd.
x*(sx_old[i] - sx_new[i])*0.5_rt*(sz_new[k] + sz_old[k]);
998#if defined(WARPX_DIM_RZ)
1000 for (
int imode=1 ; imode < n_rz_azimuthal_modes ; imode++) {
1002 const Complex djr_cmplx = 2._rt *sdxi*xy_mid;
1005 xy_mid = xy_mid*xy_mid0;
1010 for (
int k=dkl; k<=depos_order+2-dku; k++) {
1011 for (
int i=dil; i<=depos_order+2-diu; i++) {
1012 Real const sdyj = wq*vy*invvol*(
1013 one_third*(sx_new[i]*sz_new[k] + sx_old[i]*sz_old[k])
1014 +one_sixth*(sx_new[i]*sz_old[k] + sx_old[i]*sz_new[k]));
1016#if defined(WARPX_DIM_RZ)
1022 for (
int imode=1 ; imode < n_rz_azimuthal_modes ; imode++) {
1026 *(
Complex(sx_new[i]*sz_new[k], 0._rt)*(xy_new - xy_mid)
1027 +
Complex(sx_old[i]*sz_old[k], 0._rt)*(xy_mid - xy_old));
1030 xy_new = xy_new*xy_new0;
1031 xy_mid = xy_mid*xy_mid0;
1032 xy_old = xy_old*xy_old0;
1037 for (
int i=dil; i<=depos_order+2-diu; i++) {
1039 for (
int k=dkl; k<=depos_order+1-dku; k++) {
1040 sdzk += wq*invdtd.
z*(sz_old[k] - sz_new[k])*0.5_rt*(sx_new[i] + sx_old[i]);
1042#if defined(WARPX_DIM_RZ)
1044 for (
int imode=1 ; imode < n_rz_azimuthal_modes ; imode++) {
1046 const Complex djz_cmplx = 2._rt * sdzk * xy_mid;
1049 xy_mid = xy_mid*xy_mid0;
1054#elif defined(WARPX_DIM_1D_Z)
1056 for (
int k=dkl; k<=depos_order+2-dku; k++) {
1057 amrex::Real const sdxi = wq*vx*invvol*0.5_rt*(sz_old[k] + sz_new[k]);
1060 for (
int k=dkl; k<=depos_order+2-dku; k++) {
1061 amrex::Real const sdyj = wq*vy*invvol*0.5_rt*(sz_old[k] + sz_new[k]);
1065 for (
int k=dkl; k<=depos_order+1-dku; k++) {
1066 sdzk += wq*invdtd.
z*(sz_old[k] - sz_new[k]);
1070#elif defined(WARPX_DIM_RCYLINDER) || defined(WARPX_DIM_RSPHERE)
1073 for (
int i=dil; i<=depos_order+1-diu; i++) {
1074 sdri += wq*invdtd.
x*(sx_old[i] - sx_new[i]);
1077 for (
int i=dil; i<=depos_order+2-diu; i++) {
1078 amrex::Real const sdyj = wq*vy*invvol*0.5_rt*(sx_old[i] + sx_new[i]);
1081 for (
int i=dil; i<=depos_order+2-diu; i++) {
1082 amrex::Real const sdzi = wq*
vz*invvol*0.5_rt*(sx_old[i] + sx_new[i]);
1128 const int *
const ion_lev,
1132 const long np_to_deposit,
1140 [[maybe_unused]]
const int n_rz_azimuthal_modes)
1142 using namespace amrex;
1146 bool const do_ionization = ion_lev;
1148#if !defined(WARPX_DIM_3D)
1153 (1.0_rt/dt)*dinv.
x*dinv.
z,
1154 (1.0_rt/dt)*dinv.
x*dinv.
y};
1156#if (AMREX_SPACEDIM > 1)
1157 Real constexpr one_third = 1.0_rt / 3.0_rt;
1158 Real constexpr one_sixth = 1.0_rt / 6.0_rt;
1166#if !defined(WARPX_DIM_3D)
1169 uxp_nph[ip], uyp_nph[ip], uzp_nph[ip]);
1178 GetPosition(ip, xp_nph, yp_nph, zp_nph);
1180#if !defined(WARPX_DIM_1D_Z)
1183#if defined(WARPX_DIM_3D) || defined(WARPX_DIM_RZ) || defined(WARPX_DIM_RCYLINDER) || defined(WARPX_DIM_RSPHERE)
1186#if !defined(WARPX_DIM_RCYLINDER)
1191#if defined(WARPX_DIM_RZ) || defined(WARPX_DIM_RCYLINDER)
1198 amrex::Real const rp_new = std::sqrt(xp_new*xp_new + yp_new*yp_new);
1199 amrex::Real const rp_old = std::sqrt(xp_old*xp_old + yp_old*yp_old);
1200 amrex::Real const rp_mid = (rp_new + rp_old)/2._rt;
1201 const amrex::Real costheta_mid = (rp_mid > 0._rt ? xp_mid/rp_mid : 1._rt);
1202 const amrex::Real sintheta_mid = (rp_mid > 0._rt ? yp_mid/rp_mid : 0._rt);
1204 double x_new = (rp_new - xyzmin.
x)*dinv.
x;
1205 double const x_old = (rp_old - xyzmin.
x)*dinv.
x;
1206#if defined(WARPX_DIM_RZ)
1207 const amrex::Real costheta_new = (rp_new > 0._rt ? xp_new/rp_new : 1._rt);
1208 const amrex::Real sintheta_new = (rp_new > 0._rt ? yp_new/rp_new : 0._rt);
1209 const amrex::Real costheta_old = (rp_old > 0._rt ? xp_old/rp_old : 1._rt);
1210 const amrex::Real sintheta_old = (rp_old > 0._rt ? yp_old/rp_old : 0._rt);
1215#elif defined(WARPX_DIM_RSPHERE)
1225 amrex::Real const rpxy_mid = std::sqrt(xp_mid*xp_mid + yp_mid*yp_mid);
1226 amrex::Real const rp_new = std::sqrt(xp_new*xp_new + yp_new*yp_new + zp_new*zp_new);
1227 amrex::Real const rp_old = std::sqrt(xp_old*xp_old + yp_old*yp_old + zp_old*zp_old);
1228 amrex::Real const rp_mid = (rp_new + rp_old)*0.5_rt;
1230 amrex::Real const costheta_mid = (rpxy_mid > 0. ? xp_mid/rpxy_mid : 1._rt);
1231 amrex::Real const sintheta_mid = (rpxy_mid > 0. ? yp_mid/rpxy_mid : 0._rt);
1232 amrex::Real const cosphi_mid = (rp_mid > 0. ? rpxy_mid/rp_mid : 1._rt);
1233 amrex::Real const sinphi_mid = (rp_mid > 0. ? zp_mid/rp_mid : 0._rt);
1236 double x_new = (rp_new - xyzmin.
x)*dinv.
x;
1237 double const x_old = (rp_old - xyzmin.
x)*dinv.
x;
1239#if !defined(WARPX_DIM_1D_Z)
1241 double x_new = (xp_np1 - xyzmin.
x)*dinv.
x;
1242 double const x_old = (xp_n[ip] - xyzmin.
x)*dinv.
x;
1245#if defined(WARPX_DIM_3D)
1247 double y_new = (yp_np1 - xyzmin.
y)*dinv.
y;
1248 double const y_old = (yp_n[ip] - xyzmin.
y)*dinv.
y;
1250#if !defined(WARPX_DIM_RCYLINDER) && !defined(WARPX_DIM_RSPHERE)
1252 double z_new = (zp_np1 - xyzmin.
z)*dinv.
z;
1253 double const z_old = (zp_n[ip] - xyzmin.
z)*dinv.
z;
1256#if defined(WARPX_DIM_RZ)
1257 amrex::Real const vy = (-uxp_nph[ip]*sintheta_mid + uyp_nph[ip]*costheta_mid)*gaminv;
1258#elif defined(WARPX_DIM_XZ)
1260#elif defined(WARPX_DIM_1D_Z)
1263#elif defined(WARPX_DIM_RCYLINDER)
1264 amrex::Real const vy = (-uxp_nph[ip]*sintheta_mid + uyp_nph[ip]*costheta_mid)*gaminv;
1266#elif defined(WARPX_DIM_RSPHERE)
1268 amrex::Real const vy = (-uxp_nph[ip]*sintheta_mid + uyp_nph[ip]*costheta_mid)*gaminv;
1269 amrex::Real const vz = (-uxp_nph[ip]*costheta_mid*sinphi_mid - uyp_nph[ip]*sintheta_mid*sinphi_mid + uzp_nph[ip]*cosphi_mid)*gaminv;
1275#if defined(WARPX_DIM_3D)
1277 domain_double[0][0], domain_double[0][1], do_cropping[0]);
1279 domain_double[1][0], domain_double[1][1], do_cropping[1]);
1281 domain_double[2][0], domain_double[2][1], do_cropping[2]);
1282#elif defined(WARPX_DIM_XZ) || defined(WARPX_DIM_RZ)
1284 domain_double[0][0], domain_double[0][1], do_cropping[0]);
1286 domain_double[1][0], domain_double[1][1], do_cropping[1]);
1287#elif defined(WARPX_DIM_1D_Z)
1289#elif defined(WARPX_DIM_RCYLINDER) || defined(WARPX_DIM_RSPHERE)
1304#if !defined(WARPX_DIM_1D_Z)
1305 double sx_new[depos_order + 3] = {0.};
1306 double sx_old[depos_order + 3] = {0.};
1307 const int i_new = compute_shape_factor(sx_new+1, x_new);
1308 const int i_old = compute_shifted_shape_factor(sx_old, x_old, i_new);
1310#if defined(WARPX_DIM_3D)
1311 double sy_new[depos_order + 3] = {0.};
1312 double sy_old[depos_order + 3] = {0.};
1313 const int j_new = compute_shape_factor(sy_new+1, y_new);
1314 const int j_old = compute_shifted_shape_factor(sy_old, y_old, j_new);
1316#if !defined(WARPX_DIM_RCYLINDER) && !defined(WARPX_DIM_RSPHERE)
1317 double sz_new[depos_order + 3] = {0.};
1318 double sz_old[depos_order + 3] = {0.};
1319 const int k_new = compute_shape_factor(sz_new+1, z_new);
1320 const int k_old = compute_shifted_shape_factor(sz_old, z_old, k_new);
1324#if !defined(WARPX_DIM_1D_Z)
1325 int dil = 1, diu = 1;
1326 if (i_old < i_new) { dil = 0; }
1327 if (i_old > i_new) { diu = 0; }
1329#if defined(WARPX_DIM_3D)
1330 int djl = 1, dju = 1;
1331 if (j_old < j_new) { djl = 0; }
1332 if (j_old > j_new) { dju = 0; }
1334#if !defined(WARPX_DIM_RCYLINDER) && !defined(WARPX_DIM_RSPHERE)
1335 int dkl = 1, dku = 1;
1336 if (k_old < k_new) { dkl = 0; }
1337 if (k_old > k_new) { dku = 0; }
1340#if defined(WARPX_DIM_3D)
1342 for (
int k=dkl; k<=depos_order+2-dku; k++) {
1343 for (
int j=djl; j<=depos_order+2-dju; j++) {
1345 for (
int i=dil; i<=depos_order+1-diu; i++) {
1346 sdxi += wq*invdtd.
x*(sx_old[i] - sx_new[i])*(
1347 one_third*(sy_new[j]*sz_new[k] + sy_old[j]*sz_old[k])
1348 +one_sixth*(sy_new[j]*sz_old[k] + sy_old[j]*sz_new[k]));
1353 for (
int k=dkl; k<=depos_order+2-dku; k++) {
1354 for (
int i=dil; i<=depos_order+2-diu; i++) {
1356 for (
int j=djl; j<=depos_order+1-dju; j++) {
1357 sdyj += wq*invdtd.
y*(sy_old[j] - sy_new[j])*(
1358 one_third*(sx_new[i]*sz_new[k] + sx_old[i]*sz_old[k])
1359 +one_sixth*(sx_new[i]*sz_old[k] + sx_old[i]*sz_new[k]));
1364 for (
int j=djl; j<=depos_order+2-dju; j++) {
1365 for (
int i=dil; i<=depos_order+2-diu; i++) {
1367 for (
int k=dkl; k<=depos_order+1-dku; k++) {
1368 sdzk += wq*invdtd.
z*(sz_old[k] - sz_new[k])*(
1369 one_third*(sx_new[i]*sy_new[j] + sx_old[i]*sy_old[j])
1370 +one_sixth*(sx_new[i]*sy_old[j] + sx_old[i]*sy_new[j]));
1376#elif defined(WARPX_DIM_XZ) || defined(WARPX_DIM_RZ)
1378 for (
int k=dkl; k<=depos_order+2-dku; k++) {
1380 for (
int i=dil; i<=depos_order+1-diu; i++) {
1381 sdxi += wq*invdtd.
x*(sx_old[i] - sx_new[i])*0.5_rt*(sz_new[k] + sz_old[k]);
1383#if defined(WARPX_DIM_RZ)
1385 for (
int imode=1 ; imode < n_rz_azimuthal_modes ; imode++) {
1387 const Complex djr_cmplx = 2._rt *sdxi*xy_mid;
1390 xy_mid = xy_mid*xy_mid0;
1395 for (
int k=dkl; k<=depos_order+2-dku; k++) {
1396 for (
int i=dil; i<=depos_order+2-diu; i++) {
1397 Real const sdyj = wq*vy*invvol*(
1398 one_third*(sx_new[i]*sz_new[k] + sx_old[i]*sz_old[k])
1399 +one_sixth*(sx_new[i]*sz_old[k] + sx_old[i]*sz_new[k]));
1401#if defined(WARPX_DIM_RZ)
1407 for (
int imode=1 ; imode < n_rz_azimuthal_modes ; imode++) {
1411 *(
Complex(sx_new[i]*sz_new[k], 0._rt)*(xy_new - xy_mid)
1412 +
Complex(sx_old[i]*sz_old[k], 0._rt)*(xy_mid - xy_old));
1415 xy_new = xy_new*xy_new0;
1416 xy_mid = xy_mid*xy_mid0;
1417 xy_old = xy_old*xy_old0;
1422 for (
int i=dil; i<=depos_order+2-diu; i++) {
1424 for (
int k=dkl; k<=depos_order+1-dku; k++) {
1425 sdzk += wq*invdtd.
z*(sz_old[k] - sz_new[k])*0.5_rt*(sx_new[i] + sx_old[i]);
1427#if defined(WARPX_DIM_RZ)
1429 for (
int imode=1 ; imode < n_rz_azimuthal_modes ; imode++) {
1431 const Complex djz_cmplx = 2._rt * sdzk * xy_mid;
1434 xy_mid = xy_mid*xy_mid0;
1439#elif defined(WARPX_DIM_1D_Z)
1441 for (
int k=dkl; k<=depos_order+2-dku; k++) {
1442 amrex::Real const sdxi = wq*vx*invvol*0.5_rt*(sz_old[k] + sz_new[k]);
1445 for (
int k=dkl; k<=depos_order+2-dku; k++) {
1446 amrex::Real const sdyj = wq*vy*invvol*0.5_rt*(sz_old[k] + sz_new[k]);
1450 for (
int k=dkl; k<=depos_order+1-dku; k++) {
1451 sdzk += wq*invdtd.
z*(sz_old[k] - sz_new[k]);
1455#elif defined(WARPX_DIM_RCYLINDER) || defined(WARPX_DIM_RSPHERE)
1458 for (
int i=dil; i<=depos_order+1-diu; i++) {
1459 sdri += wq*invdtd.
x*(sx_old[i] - sx_new[i]);
1462 for (
int i=dil; i<=depos_order+2-diu; i++) {
1463 amrex::Real const sdyj = wq*vy*invvol*0.5_rt*(sx_old[i] + sx_new[i]);
1466 for (
int i=dil; i<=depos_order+2-diu; i++) {
1467 amrex::Real const sdzk = wq*
vz*invvol*0.5_rt*(sx_old[i] + sx_new[i]);
1520 [[maybe_unused]]
int const n_rz_azimuthal_modes)
1525#if (AMREX_SPACEDIM > 1)
1526 amrex::Real constexpr one_third = 1.0_rt / 3.0_rt;
1527 amrex::Real constexpr one_sixth = 1.0_rt / 6.0_rt;
1531#if defined(WARPX_DIM_RZ) || defined(WARPX_DIM_RCYLINDER)
1532 amrex::Real const xp_mid = (xp_new + xp_old)*0.5_rt;
1533 amrex::Real const yp_mid = (yp_new + yp_old)*0.5_rt;
1534 amrex::Real const rp_new = std::sqrt(xp_new*xp_new + yp_new*yp_new);
1535 amrex::Real const rp_old = std::sqrt(xp_old*xp_old + yp_old*yp_old);
1536 amrex::Real const rp_mid = (rp_new + rp_old)/2._rt;
1537 amrex::Real const costheta_mid = (rp_mid > 0._rt ? xp_mid/rp_mid : 1._rt);
1538 amrex::Real const sintheta_mid = (rp_mid > 0._rt ? yp_mid/rp_mid : 0._rt);
1539#if defined(WARPX_DIM_RZ)
1544 double x_new = (rp_new - xyzmin.
x)*dinv.
x;
1545 double const x_old = (rp_old - xyzmin.
x)*dinv.
x;
1547 amrex::Real const vy = (-uxp_mid*sintheta_mid + uyp_mid*costheta_mid)*gaminv;
1548#if defined(WARPX_DIM_RCYLINDER)
1551#elif defined(WARPX_DIM_RSPHERE)
1552 amrex::Real const xp_mid = (xp_new + xp_old)*0.5_rt;
1553 amrex::Real const yp_mid = (yp_new + yp_old)*0.5_rt;
1554 amrex::Real const zp_mid = (zp_new + zp_old)*0.5_rt;
1555 amrex::Real const rpxy_mid = std::sqrt(xp_mid*xp_mid + yp_mid*yp_mid);
1556 amrex::Real const rp_new = std::sqrt(xp_new*xp_new + yp_new*yp_new + zp_new*zp_new);
1557 amrex::Real const rp_old = std::sqrt(xp_old*xp_old + yp_old*yp_old + zp_old*zp_old);
1558 amrex::Real const rp_mid = (rp_new + rp_old)*0.5_rt;
1560 amrex::Real const costheta_mid = (rpxy_mid > 0. ? xp_mid/rpxy_mid : 1._rt);
1561 amrex::Real const sintheta_mid = (rpxy_mid > 0. ? yp_mid/rpxy_mid : 0._rt);
1562 amrex::Real const cosphi_mid = (rp_mid > 0. ? rpxy_mid/rp_mid : 1._rt);
1563 amrex::Real const sinphi_mid = (rp_mid > 0. ? zp_mid/rp_mid : 0._rt);
1566 double x_new = (rp_new - xyzmin.
x)*dinv.
x;
1567 double const x_old = (rp_old - xyzmin.
x)*dinv.
x;
1570 amrex::Real const vy = (-uxp_mid*sintheta_mid + uyp_mid*costheta_mid)*gaminv;
1571 amrex::Real const vz = (-uxp_mid*costheta_mid*sinphi_mid - uyp_mid*sintheta_mid*sinphi_mid + uzp_mid*cosphi_mid)*gaminv;
1572#elif defined(WARPX_DIM_XZ)
1574 double x_new = (xp_new - xyzmin.
x)*dinv.
x;
1575 double const x_old = (xp_old - xyzmin.
x)*dinv.
x;
1578#elif defined(WARPX_DIM_1D_Z)
1581#elif defined(WARPX_DIM_3D)
1583 double x_new = (xp_new - xyzmin.
x)*dinv.
x;
1584 double const x_old = (xp_old - xyzmin.
x)*dinv.
x;
1585 double y_new = (yp_new - xyzmin.
y)*dinv.
y;
1586 double const y_old = (yp_old - xyzmin.
y)*dinv.
y;
1591#if !defined(WARPX_DIM_RCYLINDER) && !defined(WARPX_DIM_RSPHERE)
1593 double z_new = (zp_new - xyzmin.
z)*dinv.
z;
1594 double const z_old = (zp_old - xyzmin.
z)*dinv.
z;
1600#if !defined(WARPX_DIM_1D_Z)
1601 const double dxp = x_new - x_old;
1603#if defined(WARPX_DIM_3D)
1604 const double dyp = y_new - y_old;
1606#if !defined(WARPX_DIM_RCYLINDER) && !defined(WARPX_DIM_RSPHERE)
1607 const double dzp = z_new - z_old;
1610#if defined(WARPX_DIM_3D)
1612 domain_double[0][0], domain_double[0][1], do_cropping[0]);
1614 domain_double[1][0], domain_double[1][1], do_cropping[1]);
1616 domain_double[2][0], domain_double[2][1], do_cropping[2]);
1617#elif defined(WARPX_DIM_XZ) || defined(WARPX_DIM_RZ)
1619 domain_double[0][0], domain_double[0][1], do_cropping[0]);
1621 domain_double[1][0], domain_double[1][1], do_cropping[1]);
1622#elif defined(WARPX_DIM_1D_Z)
1624#elif defined(WARPX_DIM_RCYLINDER) || defined(WARPX_DIM_RSPHERE)
1639 int num_segments = 1;
1641 if ( (depos_order % 2) == 0 ) {
shift = 0.5; }
1643#if defined(WARPX_DIM_3D)
1646 const auto i_old =
static_cast<int>(x_old-
shift);
1647 const auto i_new =
static_cast<int>(x_new-
shift);
1648 const int cell_crossings_x = std::abs(i_new-i_old);
1649 num_segments += cell_crossings_x;
1652 const auto j_old =
static_cast<int>(y_old-
shift);
1653 const auto j_new =
static_cast<int>(y_new-
shift);
1654 const int cell_crossings_y = std::abs(j_new-j_old);
1655 num_segments += cell_crossings_y;
1658 const auto k_old =
static_cast<int>(z_old-
shift);
1659 const auto k_new =
static_cast<int>(z_new-
shift);
1660 const int cell_crossings_z = std::abs(k_new-k_old);
1661 num_segments += cell_crossings_z;
1668 const auto dirX_sign =
static_cast<double>(dxp < 0. ? -1. : 1.);
1669 const auto dirY_sign =
static_cast<double>(dyp < 0. ? -1. : 1.);
1670 const auto dirZ_sign =
static_cast<double>(dzp < 0. ? -1. : 1.);
1671 double Xcell = 0., Ycell = 0., Zcell = 0.;
1672 if (num_segments > 1) {
1673 Xcell =
static_cast<double>(i_old) +
shift + 0.5*(1.-dirX_sign);
1674 Ycell =
static_cast<double>(j_old) +
shift + 0.5*(1.-dirY_sign);
1675 Zcell =
static_cast<double>(k_old) +
shift + 0.5*(1.-dirZ_sign);
1681 double dxp_seg, dyp_seg, dzp_seg;
1682 double x0_new, y0_new, z0_new;
1683 double x0_old = x_old;
1684 double y0_old = y_old;
1685 double z0_old = z_old;
1687 for (
int ns=0; ns<num_segments; ns++) {
1689 if (ns == num_segments-1) {
1694 dxp_seg = x0_new - x0_old;
1695 dyp_seg = y0_new - y0_old;
1696 dzp_seg = z0_new - z0_old;
1701 x0_new = Xcell + dirX_sign;
1702 y0_new = Ycell + dirY_sign;
1703 z0_new = Zcell + dirZ_sign;
1704 dxp_seg = x0_new - x0_old;
1705 dyp_seg = y0_new - y0_old;
1706 dzp_seg = z0_new - z0_old;
1708 if ( (dyp == 0. || std::abs(dxp_seg) < std::abs(dxp/dyp*dyp_seg))
1709 && (dzp == 0. || std::abs(dxp_seg) < std::abs(dxp/dzp*dzp_seg)) ) {
1711 dyp_seg = dyp/dxp*dxp_seg;
1712 dzp_seg = dzp/dxp*dxp_seg;
1713 y0_new = y0_old + dyp_seg;
1714 z0_new = z0_old + dzp_seg;
1716 else if (dzp == 0. || std::abs(dyp_seg) < std::abs(dyp/dzp*dzp_seg)) {
1718 dxp_seg = dxp/dyp*dyp_seg;
1719 dzp_seg = dzp/dyp*dyp_seg;
1720 x0_new = x0_old + dxp_seg;
1721 z0_new = z0_old + dzp_seg;
1725 dxp_seg = dxp/dzp*dzp_seg;
1726 dyp_seg = dyp/dzp*dzp_seg;
1727 x0_new = x0_old + dxp_seg;
1728 y0_new = y0_old + dyp_seg;
1734 const auto seg_factor_x =
static_cast<double>(dxp == 0. ? 1. : dxp_seg/dxp);
1735 const auto seg_factor_y =
static_cast<double>(dyp == 0. ? 1. : dyp_seg/dyp);
1736 const auto seg_factor_z =
static_cast<double>(dzp == 0. ? 1. : dzp_seg/dzp);
1739 double sx_cell[depos_order] = {0.};
1740 double sy_cell[depos_order] = {0.};
1741 double sz_cell[depos_order] = {0.};
1742 double const x0_bar = (x0_new + x0_old)/2.0;
1743 double const y0_bar = (y0_new + y0_old)/2.0;
1744 double const z0_bar = (z0_new + z0_old)/2.0;
1745 const int i0_cell = compute_shape_factor_cell( sx_cell, x0_bar-0.5 );
1746 const int j0_cell = compute_shape_factor_cell( sy_cell, y0_bar-0.5 );
1747 const int k0_cell = compute_shape_factor_cell( sz_cell, z0_bar-0.5 );
1749 if constexpr (depos_order >= 3) {
1751 double sx_old_cell[depos_order] = {0.};
1752 double sx_new_cell[depos_order] = {0.};
1753 double sy_old_cell[depos_order] = {0.};
1754 double sy_new_cell[depos_order] = {0.};
1755 double sz_old_cell[depos_order] = {0.};
1756 double sz_new_cell[depos_order] = {0.};
1757 const int i0_cell_2 = compute_shape_factors_cell( sx_old_cell, sx_new_cell, x0_old-0.5, x0_new-0.5 );
1758 const int j0_cell_2 = compute_shape_factors_cell( sy_old_cell, sy_new_cell, y0_old-0.5, y0_new-0.5 );
1759 const int k0_cell_2 = compute_shape_factors_cell( sz_old_cell, sz_new_cell, z0_old-0.5, z0_new-0.5 );
1761 for (
int m=0; m<depos_order; m++) {
1762 sx_cell[m] = (4.0*sx_cell[m] + sx_old_cell[m] + sx_new_cell[m])/6.0;
1763 sy_cell[m] = (4.0*sy_cell[m] + sy_old_cell[m] + sy_new_cell[m])/6.0;
1764 sz_cell[m] = (4.0*sz_cell[m] + sz_old_cell[m] + sz_new_cell[m])/6.0;
1769 double sx_old_node[depos_order+1] = {0.};
1770 double sx_new_node[depos_order+1] = {0.};
1771 double sy_old_node[depos_order+1] = {0.};
1772 double sy_new_node[depos_order+1] = {0.};
1773 double sz_old_node[depos_order+1] = {0.};
1774 double sz_new_node[depos_order+1] = {0.};
1775 const int i0_node = compute_shape_factors_node( sx_old_node, sx_new_node, x0_old, x0_new );
1776 const int j0_node = compute_shape_factors_node( sy_old_node, sy_new_node, y0_old, y0_new );
1777 const int k0_node = compute_shape_factors_node( sz_old_node, sz_new_node, z0_old, z0_new );
1781 for (
int i=0; i<=depos_order-1; i++) {
1782 for (
int j=0; j<=depos_order; j++) {
1783 for (
int k=0; k<=depos_order; k++) {
1784 this_Jx = wqx*sx_cell[i]*( sy_old_node[j]*sz_old_node[k]*one_third
1785 + sy_old_node[j]*sz_new_node[k]*one_sixth
1786 + sy_new_node[j]*sz_old_node[k]*one_sixth
1787 + sy_new_node[j]*sz_new_node[k]*one_third )*seg_factor_x;
1795 for (
int i=0; i<=depos_order; i++) {
1796 for (
int j=0; j<=depos_order-1; j++) {
1797 for (
int k=0; k<=depos_order; k++) {
1798 this_Jy = wqy*sy_cell[j]*( sx_old_node[i]*sz_old_node[k]*one_third
1799 + sx_old_node[i]*sz_new_node[k]*one_sixth
1800 + sx_new_node[i]*sz_old_node[k]*one_sixth
1801 + sx_new_node[i]*sz_new_node[k]*one_third )*seg_factor_y;
1809 for (
int i=0; i<=depos_order; i++) {
1810 for (
int j=0; j<=depos_order; j++) {
1811 for (
int k=0; k<=depos_order-1; k++) {
1812 this_Jz = wqz*sz_cell[k]*( sx_old_node[i]*sy_old_node[j]*one_third
1813 + sx_old_node[i]*sy_new_node[j]*one_sixth
1814 + sx_new_node[i]*sy_old_node[j]*one_sixth
1815 + sx_new_node[i]*sy_new_node[j]*one_third )*seg_factor_z;
1822 if (ns < num_segments-1) {
1830#elif defined(WARPX_DIM_XZ) || defined(WARPX_DIM_RZ)
1833 const auto i_old =
static_cast<int>(x_old-
shift);
1834 const auto i_new =
static_cast<int>(x_new-
shift);
1835 const int cell_crossings_x = std::abs(i_new-i_old);
1836 num_segments += cell_crossings_x;
1839 const auto k_old =
static_cast<int>(z_old-
shift);
1840 const auto k_new =
static_cast<int>(z_new-
shift);
1841 const int cell_crossings_z = std::abs(k_new-k_old);
1842 num_segments += cell_crossings_z;
1849 const auto dirX_sign =
static_cast<double>(dxp < 0. ? -1. : 1.);
1850 const auto dirZ_sign =
static_cast<double>(dzp < 0. ? -1. : 1.);
1851 double Xcell = 0., Zcell = 0.;
1852 if (num_segments > 1) {
1853 Xcell =
static_cast<double>(i_old) +
shift + 0.5*(1.-dirX_sign);
1854 Zcell =
static_cast<double>(k_old) +
shift + 0.5*(1.-dirZ_sign);
1860 double dxp_seg, dzp_seg;
1861 double x0_new, z0_new;
1862 double x0_old = x_old;
1863 double z0_old = z_old;
1865 for (
int ns=0; ns<num_segments; ns++) {
1867 if (ns == num_segments-1) {
1871 dxp_seg = x0_new - x0_old;
1872 dzp_seg = z0_new - z0_old;
1877 x0_new = Xcell + dirX_sign;
1878 z0_new = Zcell + dirZ_sign;
1879 dxp_seg = x0_new - x0_old;
1880 dzp_seg = z0_new - z0_old;
1882 if (dzp == 0. || std::abs(dxp_seg) < std::abs(dxp/dzp*dzp_seg)) {
1884 dzp_seg = dzp/dxp*dxp_seg;
1885 z0_new = z0_old + dzp_seg;
1889 dxp_seg = dxp/dzp*dzp_seg;
1890 x0_new = x0_old + dxp_seg;
1896 const auto seg_factor_x =
static_cast<double>(dxp == 0. ? 1. : dxp_seg/dxp);
1897 const auto seg_factor_z =
static_cast<double>(dzp == 0. ? 1. : dzp_seg/dzp);
1900 double sx_cell[depos_order] = {0.};
1901 double sz_cell[depos_order] = {0.};
1902 double const x0_bar = (x0_new + x0_old)/2.0;
1903 double const z0_bar = (z0_new + z0_old)/2.0;
1904 const int i0_cell = compute_shape_factor_cell( sx_cell, x0_bar-0.5 );
1905 const int k0_cell = compute_shape_factor_cell( sz_cell, z0_bar-0.5 );
1907 if constexpr (depos_order >= 3) {
1909 double sx_old_cell[depos_order] = {0.};
1910 double sx_new_cell[depos_order] = {0.};
1911 double sz_old_cell[depos_order] = {0.};
1912 double sz_new_cell[depos_order] = {0.};
1913 const int i0_cell_2 = compute_shape_factors_cell( sx_old_cell, sx_new_cell, x0_old-0.5, x0_new-0.5 );
1914 const int k0_cell_2 = compute_shape_factors_cell( sz_old_cell, sz_new_cell, z0_old-0.5, z0_new-0.5 );
1916 for (
int m=0; m<depos_order; m++) {
1917 sx_cell[m] = (4.0*sx_cell[m] + sx_old_cell[m] + sx_new_cell[m])/6.0;
1918 sz_cell[m] = (4.0*sz_cell[m] + sz_old_cell[m] + sz_new_cell[m])/6.0;
1923 double sx_old_node[depos_order+1] = {0.};
1924 double sx_new_node[depos_order+1] = {0.};
1925 double sz_old_node[depos_order+1] = {0.};
1926 double sz_new_node[depos_order+1] = {0.};
1927 const int i0_node = compute_shape_factors_node( sx_old_node, sx_new_node, x0_old, x0_new );
1928 const int k0_node = compute_shape_factors_node( sz_old_node, sz_new_node, z0_old, z0_new );
1932 for (
int i=0; i<=depos_order-1; i++) {
1933 for (
int k=0; k<=depos_order; k++) {
1934 this_Jx = wqx*sx_cell[i]*(sz_old_node[k] + sz_new_node[k])/2.0_rt*seg_factor_x;
1936#if defined(WARPX_DIM_RZ)
1938 for (
int imode=1 ; imode < n_rz_azimuthal_modes ; imode++) {
1940 const Complex djr_cmplx = 2._rt*this_Jx*xy_mid;
1943 xy_mid = xy_mid*xy_mid0;
1950 const auto seg_factor_y = std::min(seg_factor_x,seg_factor_z);
1952 for (
int i=0; i<=depos_order; i++) {
1953 for (
int k=0; k<=depos_order; k++) {
1954 this_Jy = wqy*( sx_old_node[i]*sz_old_node[k]*one_third
1955 + sx_old_node[i]*sz_new_node[k]*one_sixth
1956 + sx_new_node[i]*sz_old_node[k]*one_sixth
1957 + sx_new_node[i]*sz_new_node[k]*one_third )*seg_factor_y;
1959#if defined(WARPX_DIM_RZ)
1962 for (
int imode=1 ; imode < n_rz_azimuthal_modes ; imode++) {
1964 const Complex djy_cmplx = 2._rt*this_Jy*xy_mid;
1967 xy_mid = xy_mid*xy_mid0;
1975 for (
int i=0; i<=depos_order; i++) {
1976 for (
int k=0; k<=depos_order-1; k++) {
1977 this_Jz = wqz*sz_cell[k]*(sx_old_node[i] + sx_new_node[i])/2.0_rt*seg_factor_z;
1979#if defined(WARPX_DIM_RZ)
1981 for (
int imode=1 ; imode < n_rz_azimuthal_modes ; imode++) {
1983 const Complex djz_cmplx = 2._rt*this_Jz*xy_mid;
1986 xy_mid = xy_mid*xy_mid0;
1993 if (ns < num_segments-1) {
2000#elif defined(WARPX_DIM_1D_Z)
2003 const auto k_old =
static_cast<int>(z_old-
shift);
2004 const auto k_new =
static_cast<int>(z_new-
shift);
2005 const int cell_crossings_z = std::abs(k_new-k_old);
2006 num_segments += cell_crossings_z;
2013 const auto dirZ_sign =
static_cast<double>(dzp < 0. ? -1. : 1.);
2014 double Zcell =
static_cast<double>(k_old) +
shift + 0.5*(1.-dirZ_sign);
2021 double z0_old = z_old;
2023 for (
int ns=0; ns<num_segments; ns++) {
2025 if (ns == num_segments-1) {
2027 dzp_seg = z0_new - z0_old;
2030 Zcell = Zcell + dirZ_sign;
2032 dzp_seg = z0_new - z0_old;
2036 const auto seg_factor =
static_cast<double>(dzp == 0. ? 1. : dzp_seg/dzp);
2039 double sz_cell[depos_order] = {0.};
2040 double const z0_bar = (z0_new + z0_old)/2.0;
2041 const int k0_cell = compute_shape_factor_cell( sz_cell, z0_bar-0.5 );
2043 if constexpr (depos_order >= 3) {
2045 double sz_old_cell[depos_order] = {0.};
2046 double sz_new_cell[depos_order] = {0.};
2047 const int k0_cell_2 = compute_shape_factors_cell( sz_old_cell, sz_new_cell, z0_old-0.5, z0_new-0.5 );
2049 for (
int m=0; m<depos_order; m++) {
2050 sz_cell[m] = (4.0*sz_cell[m] + sz_old_cell[m] + sz_new_cell[m])/6.0;
2055 double sz_old_node[depos_order+1] = {0.};
2056 double sz_new_node[depos_order+1] = {0.};
2057 const int k0_node = compute_shape_factors_node( sz_old_node, sz_new_node, z0_old, z0_new );
2060 for (
int k=0; k<=depos_order; k++) {
2061 const amrex::Real weight = 0.5_rt*(sz_old_node[k] + sz_new_node[k])*seg_factor;
2067 for (
int k=0; k<=depos_order-1; k++) {
2068 const amrex::Real this_Jz = wqz*sz_cell[k]*seg_factor;
2073 if (ns < num_segments-1) {
2079#elif defined(WARPX_DIM_RCYLINDER) || defined(WARPX_DIM_RSPHERE)
2082 const auto i_old =
static_cast<int>(x_old-
shift);
2083 const auto i_new =
static_cast<int>(x_new-
shift);
2084 const int cell_crossings_x = std::abs(i_new-i_old);
2085 num_segments += cell_crossings_x;
2092 const auto dirX_sign =
static_cast<double>(dxp < 0. ? -1. : 1.);
2093 double Xcell =
static_cast<double>(i_old) +
shift + 0.5*(1.-dirX_sign);
2100 double x0_old = x_old;
2102 for (
int ns=0; ns<num_segments; ns++) {
2104 if (ns == num_segments-1) {
2106 dxp_seg = x0_new - x0_old;
2109 Xcell = Xcell + dirX_sign;
2111 dxp_seg = x0_new - x0_old;
2115 const auto seg_factor =
static_cast<double>(dxp == 0. ? 1. : dxp_seg/dxp);
2118 double sx_cell[depos_order] = {0.};
2119 double const x0_bar = (x0_new + x0_old)/2.0;
2120 const int i0_cell = compute_shape_factor_cell( sx_cell, x0_bar-0.5 );
2122 if constexpr (depos_order >= 3) {
2124 double sx_old_cell[depos_order] = {0.};
2125 double sx_new_cell[depos_order] = {0.};
2126 const int i0_cell_2 = compute_shape_factors_cell( sx_old_cell, sx_new_cell, x0_old-0.5, x0_new-0.5 );
2128 for (
int m=0; m<depos_order; m++) {
2129 sx_cell[m] = (4.0*sx_cell[m] + sx_old_cell[m] + sx_new_cell[m])/6.0;
2134 double sx_old_node[depos_order+1] = {0.};
2135 double sx_new_node[depos_order+1] = {0.};
2136 const int i0_node = compute_shape_factors_node( sx_old_node, sx_new_node, x0_old, x0_new );
2139 for (
int i=0; i<=depos_order; i++) {
2140 const amrex::Real weight = 0.5_rt*(sx_old_node[i] + sx_new_node[i])*seg_factor;
2146 for (
int i=0; i<=depos_order-1; i++) {
2147 const amrex::Real this_Jx = wqx*sx_cell[i]*seg_factor;
2152 if (ns < num_segments-1) {
2390 const int*
const ion_lev,
2401 [[maybe_unused]]
int n_rz_azimuthal_modes)
2405#if defined(WARPX_DIM_RZ)
2407 wp, uxp, uyp, uzp, ion_lev, Dx_fab, Dy_fab, Dz_fab,
2408 np_to_deposit, dt, relative_time, dinv, xyzmin, lo, q);
2412#if defined(WARPX_DIM_1D_Z) || defined(WARPX_DIM_RCYLINDER) || defined(WARPX_DIM_RSPHERE)
2414 wp, uxp, uyp, uzp, ion_lev, Dx_fab, Dy_fab, Dz_fab,
2415 np_to_deposit, dt, relative_time, dinv, xyzmin, lo, q);
2419#if !(defined WARPX_DIM_RZ || defined WARPX_DIM_1D_Z || defined WARPX_DIM_RCYLINDER || defined WARPX_DIM_RSPHERE)
2422 const bool do_ionization = ion_lev;
2430#if defined(WARPX_DIM_3D)
2433#elif defined(WARPX_DIM_XZ)
2437 temp_fab.
setVal<amrex::RunOn::Device>(0._rt);
2454 if (do_ionization) { wq *= ion_lev[ip]; }
2458 GetPosition(ip, xp, yp, zp);
2466 xp += relative_time * vx;
2467 yp += relative_time * vy;
2468 zp += relative_time *
vz;
2472 double const x_new = (xp - xyzmin.
x + 0.5_rt*dt*vx) * dinv.
x;
2473 double const x_old = (xp - xyzmin.
x - 0.5_rt*dt*vx) * dinv.
x;
2474#if defined(WARPX_DIM_3D)
2476 double const y_new = (yp - xyzmin.
y + 0.5_rt*dt*vy) * dinv.
y;
2477 double const y_old = (yp - xyzmin.
y - 0.5_rt*dt*vy) * dinv.
y;
2480 double const z_new = (zp - xyzmin.
z + 0.5_rt*dt*
vz) * dinv.
z;
2481 double const z_old = (zp - xyzmin.
z - 0.5_rt*dt*
vz) * dinv.
z;
2485 double sx_new[depos_order+1] = {0.};
2486 double sx_old[depos_order+1] = {0.};
2487#if defined(WARPX_DIM_3D)
2489 double sy_new[depos_order+1] = {0.};
2490 double sy_old[depos_order+1] = {0.};
2493 double sz_new[depos_order+1] = {0.};
2494 double sz_old[depos_order+1] = {0.};
2501 const int i_new = compute_shape_factor(sx_new, x_new);
2502#if defined(WARPX_DIM_3D)
2505 const int j_new = compute_shape_factor(sy_new, y_new);
2509 const int k_new = compute_shape_factor(sz_new, z_new);
2515 const int i_old = compute_shape_factor(sx_old, x_old);
2516#if defined(WARPX_DIM_3D)
2519 const int j_old = compute_shape_factor(sy_old, y_old);
2523 const int k_old = compute_shape_factor(sz_old, z_old);
2526#if defined(WARPX_DIM_XZ)
2529 for (
int k=0; k<=depos_order; k++) {
2530 for (
int i=0; i<=depos_order; i++) {
2534 auto const sxn_szn =
static_cast<amrex::Real>(sx_new[i] * sz_new[k]);
2535 auto const sxo_szn =
static_cast<amrex::Real>(sx_old[i] * sz_new[k]);
2536 auto const sxn_szo =
static_cast<amrex::Real>(sx_new[i] * sz_old[k]);
2537 auto const sxo_szo =
static_cast<amrex::Real>(sx_old[i] * sz_old[k]);
2539 if (i_new == i_old && k_new == k_old) {
2542 wq * invvol * invdt * (sxn_szn - sxo_szo));
2545 wq * invvol * invdt * (sxn_szo - sxo_szn));
2549 wqy * 0.25_rt * (sxn_szn + sxn_szo + sxo_szn + sxo_szo));
2553 wq * invvol * invdt * sxn_szn);
2556 - wq * invvol * invdt * sxo_szo);
2559 wq * invvol * invdt * sxn_szo);
2562 - wq * invvol * invdt * sxo_szn);
2566 wqy * 0.25_rt * sxn_szn);
2569 wqy * 0.25_rt * sxn_szo);
2572 wqy * 0.25_rt * sxo_szn);
2575 wqy * 0.25_rt * sxo_szo);
2581#elif defined(WARPX_DIM_3D)
2583 for (
int k=0; k<=depos_order; k++) {
2584 for (
int j=0; j<=depos_order; j++) {
2586 auto const syn_szn =
static_cast<amrex::Real>(sy_new[j] * sz_new[k]);
2587 auto const syo_szn =
static_cast<amrex::Real>(sy_old[j] * sz_new[k]);
2588 auto const syn_szo =
static_cast<amrex::Real>(sy_new[j] * sz_old[k]);
2589 auto const syo_szo =
static_cast<amrex::Real>(sy_old[j] * sz_old[k]);
2591 for (
int i=0; i<=depos_order; i++) {
2593 auto const sxn_syn_szn =
static_cast<amrex::Real>(sx_new[i]) * syn_szn;
2594 auto const sxo_syn_szn =
static_cast<amrex::Real>(sx_old[i]) * syn_szn;
2595 auto const sxn_syo_szn =
static_cast<amrex::Real>(sx_new[i]) * syo_szn;
2596 auto const sxo_syo_szn =
static_cast<amrex::Real>(sx_old[i]) * syo_szn;
2597 auto const sxn_syn_szo =
static_cast<amrex::Real>(sx_new[i]) * syn_szo;
2598 auto const sxo_syn_szo =
static_cast<amrex::Real>(sx_old[i]) * syn_szo;
2599 auto const sxn_syo_szo =
static_cast<amrex::Real>(sx_new[i]) * syo_szo;
2600 auto const sxo_syo_szo =
static_cast<amrex::Real>(sx_old[i]) * syo_szo;
2602 if (i_new == i_old && j_new == j_old && k_new == k_old) {
2605 wq * invvol * invdt * (sxn_syn_szn - sxo_syo_szo));
2608 wq * invvol * invdt * (sxn_syn_szo - sxo_syo_szn));
2611 wq * invvol * invdt * (sxn_syo_szn - sxo_syn_szo));
2614 wq * invvol * invdt * (sxo_syn_szn - sxn_syo_szo));
2618 wq * invvol * invdt * sxn_syn_szn);
2621 - wq * invvol * invdt * sxo_syo_szo);
2624 wq * invvol * invdt * sxn_syn_szo);
2627 - wq * invvol * invdt * sxo_syo_szn);
2630 wq * invvol * invdt * sxn_syo_szn);
2633 - wq * invvol * invdt * sxo_syn_szo);
2636 wq * invvol * invdt * sxo_syn_szn);
2639 - wq * invvol * invdt * sxn_syo_szo);
2647#if defined(WARPX_DIM_3D)
2654 Dx_arr(i,j,k) += (1._rt/6._rt)*(2_rt*t_a + t_b + t_c - 2._rt*t_d);
2655 Dy_arr(i,j,k) += (1._rt/6._rt)*(2_rt*t_a + t_b - 2._rt*t_c + t_d);
2656 Dz_arr(i,j,k) += (1._rt/6._rt)*(2_rt*t_a - 2._rt*t_b + t_c + t_d);
2658#elif defined(WARPX_DIM_XZ)
2663 Dx_arr(i,j,0) += (0.5_rt)*(t_a + t_b);
2664 Dz_arr(i,j,0) += (0.5_rt)*(t_a - t_b);