8 #include <AMReX_ParmParse.H>
9 #include <AMReX_Enum.H>
10 #include <AMReX_REAL.H>
11 #include <AMReX_RealBox.H>
12 #include <AMReX_Geometry.H>
13 #include <AMReX_Random.H>
14 #include <AMReX_GpuContainers.H>
30 radius_lognormal_autorange
74 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
82 return sign * std::sqrt(std::sqrt(p1 * p1 - p2) - p1);
91 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
93 const amrex::RandomEngine& engine,
101 case SDDistributionType::mass_constant:
103 mult_contribution = u;
106 case SDDistributionType::mass_exponential: {
110 mass = std::exp(lnval);
116 mult_contribution = 0.0;
121 case SDDistributionType::radius_log_normal:
122 case SDDistributionType::radius_lognormal_autorange: {
127 dry_r = std::exp(lnval);
139 mult_contribution = 0.0;
153 using MatVec = std::vector<std::unique_ptr<MaterialProperties>>;
159 SDInitShape
m_type = SDInitShape::uniform;
221 virtual void setDefaults (
const amrex::Geometry& a_geom,
222 const MatVec& a_species_mat,
223 const MatVec& a_aerosol_mat );
232 virtual void readInputs (
const std::string& a_prefix,
233 const std::string& a_key,
234 const amrex::Geometry& a_geom,
235 const MatVec& a_species_mat,
236 const MatVec& a_aerosol_mat );
243 const MatVec& a_aerosol_mat )
const;
262 SDDistributionType a_init_type,
270 std::mt19937& a_rng )
const;
289 amrex::Vector<amrex::Real>& a_mult,
293 SDDistributionType a_init_type,
301 std::mt19937& a_rng )
const;
314 std::mt19937& a_rng )
const
340 amrex::Vector<amrex::Real>& a_mult,
345 std::mt19937& a_rng )
const
374 std::mt19937& a_rng )
const
400 amrex::Vector<amrex::Real>& a_mult,
405 std::mt19937& a_rng )
const
434 bool a_sampled_mult)
const
461 bool a_sampled_mult)
const
492 SDDistributionType a_init_type,
502 bool a_sampled_mult)
const;
509 return (
m_mult_type == SDMultiplicityType::sampled);
522 if (
m_type == SDInitShape::uniform) {
524 }
else if (
m_type == SDInitShape::bubble) {
573 if (this->
m_type == SDInitShape::uniform) {
576 for (
int dir = 0; dir < AMREX_SPACEDIM; dir++) {
582 }
else if (
m_type == SDInitShape::bubble) {
584 for (
int dir = 0; dir < AMREX_SPACEDIM; dir++) {
594 const amrex::Geometry&,
598 amrex::Abort(
"SDInjection::readInputs(): Do not use this interface");
612 void readInputs (
const std::string& a_prefix,
613 const amrex::Geometry& a_geom,
614 const MatVec& a_species_mat,
615 const MatVec& a_aerosol_mat,
632 int num_sd_per_cell = 0;
634 num_sd_per_cell =
static_cast<int>(std::ceil(
m_numdens_sd*a_dv));
636 num_sd_per_cell = this->
m_ppc;
638 return num_sd_per_cell;
646 num_par_per_cell = std::ceil(this->
m_numdens*a_dv);
648 num_par_per_cell = 1;
650 return num_par_per_cell;
668 const amrex::Geometry&,
672 amrex::Abort(
"SDInjection::readInputs(): Do not use this interface");
685 void readInputs (
const std::string& a_prefix,
686 const amrex::Geometry& a_geom,
687 const MatVec& a_species_mat,
688 const MatVec& a_aerosol_mat );
696 int num_sd_per_cell = 0;
700 num_sd_per_cell = this->
m_ppc;
702 return num_sd_per_cell;
710 num_par_per_cell = std::ceil(this->
m_numdens*a_dv);
712 num_par_per_cell = 1;
714 return num_par_per_cell;
constexpr amrex::Real one
Definition: ERF_Constants.H:7
constexpr amrex::Real zero
Definition: ERF_Constants.H:6
constexpr amrex::Real PI
Definition: ERF_Constants.H:16
constexpr amrex::Real four_thirds_pi
Definition: ERF_Constants.H:18
AMREX_ENUM(SDInitShape, uniform, bubble, null)
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real SD_sample_mass_gpu(const SDDistributionParams ¶ms, const amrex::RandomEngine &engine, amrex::Real &mult_contribution)
Generate mass from distribution parameters on GPU.
Definition: ERF_SDInitialization.H:92
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real SD_erfinv_gpu(const amrex::Real x)
Inverse error function approximation for GPU.
Definition: ERF_SDInitialization.H:75
std::vector< std::unique_ptr< MaterialProperties > > MatVec
Definition: ERF_SDInitialization.cpp:4
amrex::Real Real
Definition: ERF_ShocInterface.H:19
Super-droplets initial properties.
Definition: ERF_SDInitialization.H:150
amrex::Real m_numdens
Definition: ERF_SDInitialization.H:162
void getAerosolDistribution(amrex::Vector< amrex::Real > &a_mass, const int a_idx, const int a_np, const amrex::Real a_density, std::mt19937 &a_rng) const
Compute the aerosol mass distribution.
Definition: ERF_SDInitialization.H:310
amrex::Real volume() const
Calculate the volume of the particle domain.
Definition: ERF_SDInitialization.H:519
bool sampledMultiplicity() const
Determine whether multiplicity is sampled or constant.
Definition: ERF_SDInitialization.H:507
std::vector< amrex::Real > m_radius_aerosol_geom_std
Definition: ERF_SDInitialization.H:196
std::vector< amrex::Real > m_radius_species_max
Definition: ERF_SDInitialization.H:175
virtual void readInputs(const std::string &a_prefix, const std::string &a_key, const amrex::Geometry &a_geom, const MatVec &a_species_mat, const MatVec &a_aerosol_mat)
Read super-droplets initialization parameters from input file.
Definition: ERF_SDInitialization.cpp:76
void getAerosolDistribution(amrex::Vector< amrex::Real > &a_mass, amrex::Vector< amrex::Real > &a_mult, amrex::Real a_dV, int a_idx, int a_np, amrex::Real a_density, std::mt19937 &a_rng) const
Compute the aerosol mass distribution with sampled multiplicity.
Definition: ERF_SDInitialization.H:339
SDDistributionParams getSpeciesDistParams(int a_idx, amrex::Real a_density, amrex::Real a_cell_volume, bool a_sampled_mult) const
Get GPU-compatible distribution parameters for a species.
Definition: ERF_SDInitialization.H:430
SDMultiplicityType m_mult_type
Definition: ERF_SDInitialization.H:214
SDInitShape m_type
Definition: ERF_SDInitialization.H:159
virtual void printParameters(const MatVec &a_species_mat, const MatVec &a_aerosol_mat) const
Print super-droplets initialization parameters to screen.
Definition: ERF_SDInitialization.cpp:248
amrex::Vector< amrex::Real > m_init_particle_p1
Definition: ERF_SDInitialization.H:210
int m_num_species
Definition: ERF_SDInitialization.H:201
std::vector< SDDistributionType > m_species_init_type
Definition: ERF_SDInitialization.H:181
std::vector< amrex::Real > m_mass_species_max
Definition: ERF_SDInitialization.H:169
SDDistributionParams makeDistributionParams(SDDistributionType a_init_type, amrex::Real a_mass_min, amrex::Real a_mass_max, amrex::Real a_mass_mean, amrex::Real a_radius_min, amrex::Real a_radius_max, amrex::Real a_radius_mean, amrex::Real a_radius_gstd, amrex::Real a_density, amrex::Real a_cell_volume, bool a_sampled_mult) const
Create GPU-compatible distribution parameters structure.
Definition: ERF_SDInitialization.cpp:513
std::vector< amrex::Real > m_radius_species_mean
Definition: ERF_SDInitialization.H:177
int m_ppc
Definition: ERF_SDInitialization.H:156
amrex::Vector< amrex::Real > m_init_particle_p2
Definition: ERF_SDInitialization.H:211
std::vector< amrex::Real > m_radius_aerosol_min
Definition: ERF_SDInitialization.H:190
int m_num_aerosols
Definition: ERF_SDInitialization.H:203
void getSpeciesDistribution(amrex::Vector< amrex::Real > &a_mass, amrex::Vector< amrex::Real > &a_mult, amrex::Real a_dV, int a_idx, int a_np, amrex::Real a_density, std::mt19937 &a_rng) const
Compute the species mass distribution with sampled multiplicity.
Definition: ERF_SDInitialization.H:399
std::vector< amrex::Real > m_radius_aerosol_max
Definition: ERF_SDInitialization.H:192
std::vector< amrex::Real > m_radius_species_geom_std
Definition: ERF_SDInitialization.H:179
std::vector< amrex::Real > m_mass_species_min
Definition: ERF_SDInitialization.H:167
SDDistributionParams getAerosolDistParams(int a_idx, amrex::Real a_density, amrex::Real a_cell_volume, bool a_sampled_mult) const
Get GPU-compatible distribution parameters for an aerosol.
Definition: ERF_SDInitialization.H:457
virtual int numSDPerCell(const amrex::Real) const =0
std::vector< SDDistributionType > m_aerosol_init_type
Definition: ERF_SDInitialization.H:198
amrex::Real m_max_multiplicity
Definition: ERF_SDInitialization.H:164
virtual void setDefaults(const amrex::Geometry &a_geom, const MatVec &a_species_mat, const MatVec &a_aerosol_mat)
Set default values for initialization parameters.
Definition: ERF_SDInitialization.cpp:6
std::vector< amrex::Real > m_mass_species_mean
Definition: ERF_SDInitialization.H:171
std::vector< amrex::Real > m_radius_aerosol_mean
Definition: ERF_SDInitialization.H:194
std::vector< amrex::Real > m_radius_species_min
Definition: ERF_SDInitialization.H:173
virtual amrex::Real numParticlesPerCell(const amrex::Real) const =0
std::vector< amrex::Real > m_mass_aerosol_min
Definition: ERF_SDInitialization.H:184
std::vector< std::unique_ptr< MaterialProperties > > MatVec
Definition: ERF_SDInitialization.H:155
std::vector< amrex::Real > m_mass_aerosol_mean
Definition: ERF_SDInitialization.H:188
std::vector< amrex::Real > m_mass_aerosol_max
Definition: ERF_SDInitialization.H:186
void getDistribution(amrex::Vector< amrex::Real > &a_mass, int a_np, amrex::Real a_density, SDDistributionType a_init_type, amrex::Real a_mass_min, amrex::Real a_mass_max, amrex::Real a_mass_mean, amrex::Real a_radius_min, amrex::Real a_radius_max, amrex::Real a_radius_mean, amrex::Real a_radius_gstd, std::mt19937 &a_rng) const
Get a distribution with constant multiplicity.
Definition: ERF_SDInitialization.cpp:351
amrex::RealBox m_particle_domain
Definition: ERF_SDInitialization.H:206
void getSpeciesDistribution(amrex::Vector< amrex::Real > &a_mass, const int a_idx, const int a_np, const amrex::Real a_density, std::mt19937 &a_rng) const
Compute the species mass distribution with constant multiplicity.
Definition: ERF_SDInitialization.H:370
Super-droplets initialization structure.
Definition: ERF_SDInitialization.H:657
amrex::Real m_numdens_sd_init
Definition: ERF_SDInitialization.H:663
int numSDPerCell(const amrex::Real a_dv) const override
Definition: ERF_SDInitialization.H:694
void printParameters(const MatVec &, const MatVec &) const override
Definition: ERF_SDInitialization.cpp:328
virtual ~SDInitialization()=default
void readInputs(const std::string &, const std::string &, const amrex::Geometry &, const MatVec &, const MatVec &) override
Definition: ERF_SDInitialization.H:666
amrex::Real numParticlesPerCell(const amrex::Real a_dv) const override
Definition: ERF_SDInitialization.H:706
Super-droplets initialization structure.
Definition: ERF_SDInitialization.H:537
amrex::Real m_numdens_sd
Definition: ERF_SDInitialization.H:548
amrex::Real m_tstop
Definition: ERF_SDInitialization.H:557
amrex::Real m_sd_inj_rate
Definition: ERF_SDInitialization.H:545
amrex::Real m_tstart
Definition: ERF_SDInitialization.H:554
void updateDt(const amrex::Real a_dt)
Update time-dependent quantities for particle injection.
Definition: ERF_SDInitialization.H:568
void readInputs(const std::string &, const std::string &, const amrex::Geometry &, const MatVec &, const MatVec &) override
Definition: ERF_SDInitialization.H:592
void printParameters(const MatVec &, const MatVec &) const override
Definition: ERF_SDInitialization.cpp:337
amrex::Real m_inj_rate
Definition: ERF_SDInitialization.H:543
int numSDPerCell(const amrex::Real a_dv) const override
Compute number of super-droplets to inject per grid cell.
Definition: ERF_SDInitialization.H:630
virtual ~SDInjection()=default
amrex::Real numParticlesPerCell(const amrex::Real a_dv) const override
Definition: ERF_SDInitialization.H:642
amrex::Vector< amrex::Real > m_domain_vel
Definition: ERF_SDInitialization.H:551
List of super-droplet initializations.
Definition: ERF_SDInitialization.H:35
const int num_aerosols_max
Definition: ERF_SDInitialization.H:40
const int num_species_max
Definition: ERF_SDInitialization.H:37
real(c_double), parameter epsilon
Definition: ERF_module_model_constants.F90:12
GPU-compatible structure holding distribution parameters.
Definition: ERF_SDInitialization.H:48
amrex::Real numdens
Definition: ERF_SDInitialization.H:58
amrex::Real mass_mean
Definition: ERF_SDInitialization.H:52
amrex::Real sigma
Definition: ERF_SDInitialization.H:63
amrex::Real delta
Definition: ERF_SDInitialization.H:66
amrex::Real cdf_max
Definition: ERF_SDInitialization.H:62
amrex::Real radius_mean
Definition: ERF_SDInitialization.H:55
amrex::Real mass_max
Definition: ERF_SDInitialization.H:51
amrex::Real lnmin
Definition: ERF_SDInitialization.H:65
amrex::Real cell_volume
Definition: ERF_SDInitialization.H:59
amrex::Real lnrng
Definition: ERF_SDInitialization.H:64
amrex::Real radius_gstd
Definition: ERF_SDInitialization.H:56
amrex::Real density
Definition: ERF_SDInitialization.H:57
amrex::Real radius_min
Definition: ERF_SDInitialization.H:53
amrex::Real radius_max
Definition: ERF_SDInitialization.H:54
int sampled_mult
Definition: ERF_SDInitialization.H:67
SDDistributionType dist_type
Definition: ERF_SDInitialization.H:49
amrex::Real cdf_min
Definition: ERF_SDInitialization.H:61
amrex::Real mass_min
Definition: ERF_SDInitialization.H:50