9 #ifndef HIPACE_ParticleUtil_H_
10 #define HIPACE_ParticleUtil_H_
21 using namespace amrex::literals;
40 int ix_part = i_part/(ny * nz);
41 int iy_part = (i_part % (ny * nz)) % ny;
42 int iz_part = (i_part % (ny * nz)) / ny;
56 int ix_part = i_part/(ny * nz);
57 int iy_part = (i_part % (ny * nz)) % ny;
58 int iz_part = (i_part % (ny * nz)) / ny;
60 r[0] = (0.5_rt + ix_part)/nx;
61 r[1] = (0.5_rt + iy_part)/ny;
62 r[2] = (0.5_rt + iz_part)/nz;
69 const int n_fine_transition_cells,
70 const int i_fine_transition_cells)
72 if (i_fine_transition_cells == 0) {
73 int nx = nppc_coarse[0];
74 int ny = nppc_coarse[1];
75 if (i_part < nx * ny) {
77 int ix_part = i_part % nx;
78 int iy_part = i_part / nx;
79 r[0] = (0.5_rt + ix_part)/nx;
80 r[1] = (0.5_rt + iy_part)/ny;
86 int nx_fine = nppc_fine[0];
87 int ny_fine = nppc_fine[1];
88 int ix_part_fine = i_part % nx_fine;
89 int iy_part_fine = i_part / nx_fine;
91 int nx_coarse = nppc_coarse[0];
92 int ny_coarse = nppc_coarse[1];
93 int ix_part_coarse = (ix_part_fine * nx_coarse) / nx_fine;
94 int iy_part_coarse = (iy_part_fine * ny_coarse) / ny_fine;
96 amrex::Real s = amrex::Real(i_fine_transition_cells) / (n_fine_transition_cells + 1);
97 s = 1.5_rt*s - 0.5_rt*s*s*s;
99 r[0] = ((0.5_rt + ix_part_coarse) / nx_coarse) * (1._rt - s) +
100 ((0.5_rt + ix_part_fine) / nx_fine) * s;
101 r[1] = ((0.5_rt + iy_part_coarse) / ny_coarse) * (1._rt - s) +
102 ((0.5_rt + iy_part_fine) / ny_fine) * s;
121 u[0] = u_mean[0] + ux_th;
122 u[1] = u_mean[1] + uy_th;
123 u[2] = u_mean[2] + uz_th;
#define AMREX_FORCE_INLINE
#define AMREX_GPU_HOST_DEVICE
Basic helper functions that can be used for both plasma and beam species.
Definition: ParticleUtil.H:20
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void get_position_unit_cell(amrex::Real *r, const amrex::IntVect &nppc, int i_part, const amrex::RandomEngine &engine, const amrex::GpuArray< int, 3 > rand)
Definition: ParticleUtil.H:34
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void get_gaussian_random_momentum(amrex::Real *u, const amrex::RealVect u_mean, const amrex::RealVect u_std, const amrex::RandomEngine &engine)
Definition: ParticleUtil.H:113
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void get_position_unit_cell_fine(amrex::Real *r, bool &do_init, int i_part, const amrex::Array< int, 2 > &nppc_coarse, const amrex::Array< int, 2 > &nppc_fine, const int n_fine_transition_cells, const int i_fine_transition_cells)
Definition: ParticleUtil.H:66
Real RandomNormal(Real mean, Real stddev)