9#ifndef WARPX_VELOCITY_COINCIDENCE_THINNING_H_
10#define WARPX_VELOCITY_COINCIDENCE_THINNING_H_
77 void operator() (
int index_array[],
const int bin_array[],
const int start,
const int n)
const
80 for (
int i = 1; i < n; i++)
84 while (j > 0 && bin_array[index_array[j+start]] > bin_array[index_array[(j - 1)/2 + start]]) {
86 amrex::Swap(index_array[j+start], index_array[(j - 1)/2 + start]);
91 for (
int i = n - 1; i > 0; i--)
94 amrex::Swap(index_array[start], index_array[i+start]);
102 if (index + 1 < i && bin_array[index_array[index+start]] < bin_array[index_array[index+1+start]]) {
106 if (index < i && bin_array[index_array[j+start]] < bin_array[index_array[index+start]]) {
107 amrex::Swap(index_array[j+start], index_array[index+start]);
123 const amrex::ParticleReal uy[],
124 const amrex::ParticleReal uz[],
126 int bin_array[],
int index_array[],
127 const int cell_start,
const int cell_stop )
const
129 for (
int i = cell_start; i < cell_stop; ++i)
132 auto u_mag = std::sqrt(
133 ux[indices[i]]*ux[indices[i]] +
134 uy[indices[i]]*uy[indices[i]] +
135 uz[indices[i]]*uz[indices[i]]
137 auto u_theta = std::atan2(uy[indices[i]], ux[indices[i]]) +
MathConst::pi;
138 auto u_phi = std::acos(uz[indices[i]]/u_mag);
140 const int ii =
static_cast<int>(u_theta /
dutheta);
141 const int jj =
static_cast<int>(u_phi /
duphi);
142 const int kk =
static_cast<int>(u_mag /
dur);
144 bin_array[i] = ii + jj *
n1 + kk *
n1 *
n2;
151 const amrex::ParticleReal uy[],
152 const amrex::ParticleReal uz[],
154 int bin_array[],
int index_array[],
155 const int cell_start,
const int cell_stop )
const
157 for (
int i = cell_start; i < cell_stop; ++i)
159 const int ii =
static_cast<int>((ux[indices[i]] -
ux_min) /
dux);
160 const int jj =
static_cast<int>((uy[indices[i]] -
uy_min) /
duy);
161 const int kk =
static_cast<int>((uz[indices[i]] -
uz_min) /
duz);
163 bin_array[i] = ii + jj *
n1 + kk *
n1 *
n2;
169 void operator() (
const amrex::ParticleReal ux[],
const amrex::ParticleReal uy[],
170 const amrex::ParticleReal uz[],
const int indices[],
171 int bin_array[],
int index_array[],
172 const int cell_start,
const int cell_stop)
const
176 ux, uy, uz, indices, bin_array, index_array, cell_start,
182 ux, uy, uz, indices, bin_array, index_array, cell_start,
#define AMREX_FORCE_INLINE
#define AMREX_GPU_HOST_DEVICE
VelocityGridType m_velocity_grid_type
Definition VelocityCoincidenceThinning.H:196
amrex::ParticleReal m_delta_ur
Definition VelocityCoincidenceThinning.H:200
VelocityCoincidenceThinning()=default
Default constructor of the VelocityCoincidenceThinning class.
amrex::Vector< amrex::ParticleReal > m_delta_u
Definition VelocityCoincidenceThinning.H:201
int m_nphi
Definition VelocityCoincidenceThinning.H:199
int m_min_ppc
Definition VelocityCoincidenceThinning.H:198
VelocityGridType
Definition VelocityCoincidenceThinning.H:42
@ Spherical
Definition VelocityCoincidenceThinning.H:43
@ Cartesian
Definition VelocityCoincidenceThinning.H:44
amrex::ParticleReal m_cluster_weight
Definition VelocityCoincidenceThinning.H:202
void operator()(const amrex::Geometry &geom_lev, WarpXParIter &pti, int lev, WarpXParticleContainer *pc) const final
A method that performs merging for the considered species.
Definition VelocityCoincidenceThinning.cpp:64
int m_ntheta
Definition VelocityCoincidenceThinning.H:199
Definition WarpXParticleContainer.H:112
Definition WarpXParticleContainer.H:195
constexpr auto pi
ratio of a circle's circumference to its diameter
Definition constant.H:29
__host__ __device__ void Swap(T &t1, T &t2) noexcept
ResamplingAlgorithm()=default
This merging routine requires functionality to sort a GPU vector based on another GPU vector's values...
Definition VelocityCoincidenceThinning.H:74
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:77
Struct used to assign velocity space bin numbers to a given set of particles.
Definition VelocityCoincidenceThinning.H:119
amrex::ParticleReal ux_min
Definition VelocityCoincidenceThinning.H:192
amrex::ParticleReal uz_min
Definition VelocityCoincidenceThinning.H:192
amrex::ParticleReal uy_min
Definition VelocityCoincidenceThinning.H:192
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void labelOnCartesianVelocityGrid(const amrex::ParticleReal ux[], const amrex::ParticleReal uy[], const amrex::ParticleReal uz[], const int indices[], int bin_array[], int index_array[], const int cell_start, const int cell_stop) const
Definition VelocityCoincidenceThinning.H:150
amrex::ParticleReal dutheta
Definition VelocityCoincidenceThinning.H:190
amrex::ParticleReal duphi
Definition VelocityCoincidenceThinning.H:190
amrex::ParticleReal duy
Definition VelocityCoincidenceThinning.H:191
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void operator()(const amrex::ParticleReal ux[], const amrex::ParticleReal uy[], const amrex::ParticleReal uz[], const int indices[], int bin_array[], int index_array[], const int cell_start, const int cell_stop) const
Definition VelocityCoincidenceThinning.H:169
amrex::ParticleReal duz
Definition VelocityCoincidenceThinning.H:191
amrex::ParticleReal dur
Definition VelocityCoincidenceThinning.H:190
amrex::ParticleReal uy_max
Definition VelocityCoincidenceThinning.H:192
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void labelOnSphericalVelocityGrid(const amrex::ParticleReal ux[], const amrex::ParticleReal uy[], const amrex::ParticleReal uz[], const int indices[], int bin_array[], int index_array[], const int cell_start, const int cell_stop) const
Definition VelocityCoincidenceThinning.H:122
int n2
Definition VelocityCoincidenceThinning.H:189
amrex::ParticleReal dux
Definition VelocityCoincidenceThinning.H:191
VelocityGridType velocity_grid_type
Definition VelocityCoincidenceThinning.H:188
amrex::ParticleReal ux_max
Definition VelocityCoincidenceThinning.H:192
int n1
Definition VelocityCoincidenceThinning.H:189