9 #ifndef WARPX_VELOCITY_COINCIDENCE_THINNING_H_
10 #define WARPX_VELOCITY_COINCIDENCE_THINNING_H_
70 void swap(
int &a,
int &b)
const
78 void operator() (
int index_array[],
const int bin_array[],
const int start,
const int n)
const
81 for (
int i = 1;
i < n;
i++)
85 while (j > 0 && bin_array[index_array[j+start]] > bin_array[index_array[(j - 1)/2 + start]]) {
87 swap(index_array[j+start], index_array[(j - 1)/2 + start]);
92 for (
int i = n - 1;
i > 0;
i--)
95 swap(index_array[start], index_array[
i+start]);
103 if (
index + 1 <
i && bin_array[index_array[
index+start]] < bin_array[index_array[
index+1+start]]) {
107 if (
index <
i && bin_array[index_array[j+start]] < bin_array[index_array[
index+start]]) {
108 swap(index_array[j+start], index_array[
index+start]);
124 const amrex::ParticleReal uy[],
125 const amrex::ParticleReal uz[],
126 const unsigned int indices[],
127 int bin_array[],
int index_array[],
128 const int cell_start,
const int cell_stop )
const
130 for (
int i = cell_start;
i < cell_stop; ++
i)
133 auto u_mag = std::sqrt(
134 ux[indices[
i]]*ux[indices[
i]] +
135 uy[indices[
i]]*uy[indices[
i]] +
136 uz[indices[
i]]*uz[indices[
i]]
138 auto u_theta = std::atan2(uy[indices[
i]], ux[indices[
i]]) + MathConst::pi;
139 auto u_phi = std::acos(uz[indices[
i]]/u_mag);
141 const int ii =
static_cast<int>(u_theta /
dutheta);
142 const int jj =
static_cast<int>(u_phi /
duphi);
143 const int kk =
static_cast<int>(u_mag /
dur);
152 const amrex::ParticleReal uy[],
153 const amrex::ParticleReal uz[],
154 const unsigned int indices[],
155 int bin_array[],
int index_array[],
156 const int cell_start,
const int cell_stop )
const
158 for (
int i = cell_start;
i < cell_stop; ++
i)
160 const int ii =
static_cast<int>((ux[indices[
i]] -
ux_min) /
dux);
161 const int jj =
static_cast<int>((uy[indices[
i]] -
uy_min) /
duy);
162 const int kk =
static_cast<int>((uz[indices[
i]] -
uz_min) /
duz);
170 void operator() (
const amrex::ParticleReal ux[],
const amrex::ParticleReal uy[],
171 const amrex::ParticleReal uz[],
const unsigned int indices[],
172 int bin_array[],
int index_array[],
173 const int cell_start,
const int cell_stop)
const
177 ux, uy, uz, indices, bin_array, index_array, cell_start,
183 ux, uy, uz, indices, bin_array, index_array, cell_start,
#define AMREX_FORCE_INLINE
#define AMREX_GPU_HOST_DEVICE
This class implements a particle merging scheme wherein particles are clustered in phase space and pa...
Definition: VelocityCoincidenceThinning.H:23
VelocityGridType m_velocity_grid_type
Definition: VelocityCoincidenceThinning.H:197
amrex::ParticleReal m_delta_ur
Definition: VelocityCoincidenceThinning.H:201
VelocityCoincidenceThinning()=default
Default constructor of the VelocityCoincidenceThinning class.
amrex::Vector< amrex::ParticleReal > m_delta_u
Definition: VelocityCoincidenceThinning.H:202
int m_nphi
Definition: VelocityCoincidenceThinning.H:200
int m_min_ppc
Definition: VelocityCoincidenceThinning.H:199
VelocityGridType
Definition: VelocityCoincidenceThinning.H:38
int m_ntheta
Definition: VelocityCoincidenceThinning.H:200
void operator()(WarpXParIter &pti, int lev, WarpXParticleContainer *pc) const final
A method that performs merging for the considered species.
Definition: VelocityCoincidenceThinning.cpp:56
Definition: WarpXParticleContainer.H:53
Definition: WarpXParticleContainer.H:111
i
Definition: check_interp_points_and_weights.py:174
ii
Definition: check_interp_points_and_weights.py:148
jj
Definition: check_interp_points_and_weights.py:160
index
Definition: run_automated.py:328
An empty base class from which specific resampling algorithms are derived.
Definition: Resampling.H:23
This merging routine requires functionality to sort a GPU vector based on another GPU vector's values...
Definition: VelocityCoincidenceThinning.H:67
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void operator()(int index_array[], const int bin_array[], const int start, const int n) const
Definition: VelocityCoincidenceThinning.H:78
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void swap(int &a, int &b) const
Definition: VelocityCoincidenceThinning.H:70
Struct used to assign velocity space bin numbers to a given set of particles.
Definition: VelocityCoincidenceThinning.H:120
amrex::ParticleReal ux_min
Definition: VelocityCoincidenceThinning.H:193
amrex::ParticleReal uz_min
Definition: VelocityCoincidenceThinning.H:193
amrex::ParticleReal uy_min
Definition: VelocityCoincidenceThinning.H:193
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void labelOnSphericalVelocityGrid(const amrex::ParticleReal ux[], const amrex::ParticleReal uy[], const amrex::ParticleReal uz[], const unsigned int indices[], int bin_array[], int index_array[], const int cell_start, const int cell_stop) const
Definition: VelocityCoincidenceThinning.H:123
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void operator()(const amrex::ParticleReal ux[], const amrex::ParticleReal uy[], const amrex::ParticleReal uz[], const unsigned int indices[], int bin_array[], int index_array[], const int cell_start, const int cell_stop) const
Definition: VelocityCoincidenceThinning.H:170
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void labelOnCartesianVelocityGrid(const amrex::ParticleReal ux[], const amrex::ParticleReal uy[], const amrex::ParticleReal uz[], const unsigned int indices[], int bin_array[], int index_array[], const int cell_start, const int cell_stop) const
Definition: VelocityCoincidenceThinning.H:151
amrex::ParticleReal dutheta
Definition: VelocityCoincidenceThinning.H:191
amrex::ParticleReal duphi
Definition: VelocityCoincidenceThinning.H:191
amrex::ParticleReal duy
Definition: VelocityCoincidenceThinning.H:192
amrex::ParticleReal duz
Definition: VelocityCoincidenceThinning.H:192
amrex::ParticleReal dur
Definition: VelocityCoincidenceThinning.H:191
amrex::ParticleReal uy_max
Definition: VelocityCoincidenceThinning.H:193
int n2
Definition: VelocityCoincidenceThinning.H:190
amrex::ParticleReal dux
Definition: VelocityCoincidenceThinning.H:192
VelocityGridType velocity_grid_type
Definition: VelocityCoincidenceThinning.H:189
amrex::ParticleReal ux_max
Definition: VelocityCoincidenceThinning.H:193
int n1
Definition: VelocityCoincidenceThinning.H:190