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>
33 radius_lognormal_autorange
73 SDInputs (
const std::string& a_common,
const std::string& a_block)
78 bool query (
const std::string& a_key,
T& a_val,
const bool a_record =
true)
80 bool from_inputs =
m_block.query(a_key.c_str(), a_val);
81 if (!from_inputs) { from_inputs =
m_common.query(a_key.c_str(), a_val); }
82 if (!from_inputs && a_record) {
m_block.add(a_key.c_str(), a_val); }
88 bool queryarr (
const std::string& a_key, std::vector<T>& a_val)
90 bool from_inputs =
m_block.queryarr(a_key.c_str(), a_val);
91 if (!from_inputs) { from_inputs =
m_common.queryarr(a_key.c_str(), a_val); }
92 if (!from_inputs) {
m_block.addarr(a_key.c_str(), a_val); }
100 void record (
const std::string& a_key,
T& a_val) {
m_block.add(a_key.c_str(), a_val); }
103 template <
typename T>
104 bool queryarr (
const std::string& a_key, std::vector<T>& a_val,
const int a_num)
106 bool from_inputs =
m_block.queryarr(a_key.c_str(), a_val, 0, a_num);
107 if (!from_inputs) { from_inputs =
m_common.queryarr(a_key.c_str(), a_val, 0, a_num); }
108 if (!from_inputs) {
m_block.addarr(a_key.c_str(), a_val); }
144 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
152 return sign * std::sqrt(std::sqrt(p1 * p1 - p2) - p1);
161 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
163 const amrex::RandomEngine& engine,
171 case SDDistributionType::mass_constant:
173 mult_contribution = u;
176 case SDDistributionType::mass_exponential: {
180 mass = std::exp(lnval);
186 mult_contribution = 0.0;
191 case SDDistributionType::radius_log_normal:
192 case SDDistributionType::radius_lognormal_autorange: {
197 dry_r = std::exp(lnval);
209 mult_contribution = 0.0;
225 using MatVec = std::vector<std::unique_ptr<MaterialProperties>>;
235 SDInitShape
m_type = SDInitShape::uniform;
300 virtual void setDefaults (
const amrex::Geometry& a_geom,
301 const MatVec& a_species_mat,
302 const MatVec& a_aerosol_mat );
312 const std::string& a_key,
313 const amrex::Geometry& a_geom,
314 const MatVec& a_species_mat,
315 const MatVec& a_aerosol_mat );
322 const MatVec& a_aerosol_mat )
const;
341 SDDistributionType a_init_type,
349 std::mt19937& a_rng )
const;
368 amrex::Vector<amrex::Real>& a_mult,
372 SDDistributionType a_init_type,
380 std::mt19937& a_rng )
const;
393 std::mt19937& a_rng )
const
419 amrex::Vector<amrex::Real>& a_mult,
424 std::mt19937& a_rng )
const
453 std::mt19937& a_rng )
const
479 amrex::Vector<amrex::Real>& a_mult,
484 std::mt19937& a_rng )
const
513 bool a_sampled_mult)
const
540 bool a_sampled_mult)
const
571 SDDistributionType a_init_type,
581 bool a_sampled_mult)
const;
588 return (
m_mult_type == SDMultiplicityType::sampled);
601 if (
m_type == SDInitShape::uniform) {
603 }
else if (
m_type == SDInitShape::bubble) {
621 [[nodiscard]]
virtual unsigned int injectSeed ()
const {
return 0; }
704 inline void updateDt (
const double a_dt,
const bool a_active)
742 const Real mult_step = par_step / num_sd;
747 }
else if (mult_step >=
one) {
758 const Real mult = num_par / num_sd;
771 if (this->
m_type == SDInitShape::uniform) {
774 for (
int dir = 0; dir < AMREX_SPACEDIM; dir++) {
780 }
else if (
m_type == SDInitShape::bubble) {
782 for (
int dir = 0; dir < AMREX_SPACEDIM; dir++) {
792 const amrex::Geometry&,
796 amrex::Abort(
"SDInjection::readInputs(): Do not use this interface");
811 const amrex::Geometry& a_geom,
812 const MatVec& a_species_mat,
813 const MatVec& a_aerosol_mat,
853 const amrex::Geometry&,
857 amrex::Abort(
"SDInjection::readInputs(): Do not use this interface");
871 const amrex::Geometry& a_geom,
872 const MatVec& a_species_mat,
873 const MatVec& a_aerosol_mat );
881 int num_sd_per_cell = 0;
885 num_sd_per_cell = this->
m_ppc;
887 return num_sd_per_cell;
895 num_par_per_cell = std::ceil(this->
m_numdens*a_dv);
897 num_par_per_cell = 1;
899 return num_par_per_cell;
constexpr amrex::Real one
Definition: ERF_Constants.H:9
constexpr amrex::Real zero
Definition: ERF_Constants.H:8
constexpr amrex::Real PI
Definition: ERF_Constants.H:42
constexpr amrex::Real four_thirds_pi
Definition: ERF_Constants.H:44
AMREX_ENUM(SDInitShape, uniform, bubble, null)
Initial distribution shape for super-droplets.
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:162
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:145
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:220
amrex::Real m_numdens
Definition: ERF_SDInitialization.H:238
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:389
amrex::Real volume() const
Calculate the volume of the particle domain.
Definition: ERF_SDInitialization.H:598
bool sampledMultiplicity() const
Determine whether multiplicity is sampled or constant.
Definition: ERF_SDInitialization.H:586
std::vector< amrex::Real > m_radius_aerosol_geom_std
Definition: ERF_SDInitialization.H:275
amrex::Real m_ice_app_density
Definition: ERF_SDInitialization.H:243
std::vector< amrex::Real > m_radius_species_max
Definition: ERF_SDInitialization.H:254
virtual unsigned int injectSeed() const
Reproducible seed for scattering this step's super-droplets.
Definition: ERF_SDInitialization.H:621
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:418
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:509
virtual bool perBoxInjection() const
Per-box high-multiplicity injection (false for initialization and legacy per-cell injection).
Definition: ERF_SDInitialization.H:615
SDMultiplicityType m_mult_type
Definition: ERF_SDInitialization.H:293
SDInitShape m_type
Definition: ERF_SDInitialization.H:235
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:285
amrex::Vector< amrex::Real > m_init_particle_p1
Definition: ERF_SDInitialization.H:289
int m_num_species
Definition: ERF_SDInitialization.H:280
std::vector< SDDistributionType > m_species_init_type
Definition: ERF_SDInitialization.H:260
std::vector< amrex::Real > m_mass_species_max
Definition: ERF_SDInitialization.H:248
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:578
std::vector< amrex::Real > m_radius_species_mean
Definition: ERF_SDInitialization.H:256
int m_ppc
Definition: ERF_SDInitialization.H:228
bool m_ppc_from_inputs
Definition: ERF_SDInitialization.H:232
amrex::Vector< amrex::Real > m_init_particle_p2
Definition: ERF_SDInitialization.H:290
std::vector< amrex::Real > m_radius_aerosol_min
Definition: ERF_SDInitialization.H:269
virtual int injectBoxCount() const
Number of super-droplets to inject in the whole box this step.
Definition: ERF_SDInitialization.H:617
int m_num_aerosols
Definition: ERF_SDInitialization.H:282
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:478
std::vector< amrex::Real > m_radius_aerosol_max
Definition: ERF_SDInitialization.H:271
std::vector< amrex::Real > m_radius_species_geom_std
Definition: ERF_SDInitialization.H:258
virtual ~SDInitProperties()=default
std::vector< amrex::Real > m_mass_species_min
Definition: ERF_SDInitialization.H:246
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:536
virtual int numSDPerCell(const amrex::Real) const =0
std::vector< SDDistributionType > m_aerosol_init_type
Definition: ERF_SDInitialization.H:277
virtual void readInputs(SDInputs &a_in, 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
amrex::Real m_max_multiplicity
Definition: ERF_SDInitialization.H:240
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:250
std::vector< amrex::Real > m_radius_aerosol_mean
Definition: ERF_SDInitialization.H:273
std::vector< amrex::Real > m_radius_species_min
Definition: ERF_SDInitialization.H:252
virtual amrex::Real numParticlesPerCell(const amrex::Real) const =0
std::vector< amrex::Real > m_mass_aerosol_min
Definition: ERF_SDInitialization.H:263
virtual amrex::Real injectMultiplicity() const
Multiplicity of each super-droplet injected this step.
Definition: ERF_SDInitialization.H:619
std::vector< std::unique_ptr< MaterialProperties > > MatVec
Definition: ERF_SDInitialization.H:227
std::vector< amrex::Real > m_mass_aerosol_mean
Definition: ERF_SDInitialization.H:267
std::vector< amrex::Real > m_mass_aerosol_max
Definition: ERF_SDInitialization.H:265
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:415
amrex::RealBox m_particle_domain
Definition: ERF_SDInitialization.H:285
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:449
Super-droplets initialization structure.
Definition: ERF_SDInitialization.H:842
amrex::Real m_numdens_sd_init
Definition: ERF_SDInitialization.H:848
int numSDPerCell(const amrex::Real a_dv) const override
Definition: ERF_SDInitialization.H:879
void printParameters(const MatVec &, const MatVec &) const override
Definition: ERF_SDInitialization.cpp:377
virtual ~SDInitialization()=default
amrex::Real numParticlesPerCell(const amrex::Real a_dv) const override
Definition: ERF_SDInitialization.H:891
void readInputs(SDInputs &, const std::string &, const amrex::Geometry &, const MatVec &, const MatVec &) override
Definition: ERF_SDInitialization.H:851
Super-droplets initialization structure.
Definition: ERF_SDInitialization.H:626
amrex::Real m_numdens_accum
Definition: ERF_SDInitialization.H:651
unsigned int m_inject_seed
Definition: ERF_SDInitialization.H:683
int injectBoxCount() const override
Number of super-droplets to inject in the whole box this step.
Definition: ERF_SDInitialization.H:834
amrex::Real m_numdens_sd
Definition: ERF_SDInitialization.H:637
amrex::Real m_eff_sd_rate
Definition: ERF_SDInitialization.H:675
amrex::Real m_tstop
Definition: ERF_SDInitialization.H:646
amrex::Real m_inject_mult
Definition: ERF_SDInitialization.H:658
amrex::Real m_sd_inj_rate
Definition: ERF_SDInitialization.H:634
amrex::Real m_tstart
Definition: ERF_SDInitialization.H:643
void updateDt(const double a_dt, const bool a_active)
Update time-dependent quantities for particle injection.
Definition: ERF_SDInitialization.H:704
bool m_mm_specified
Definition: ERF_SDInitialization.H:673
amrex::Real numParticlesPerCell(const amrex::Real) const override
Number of physical particles to inject per cell this step. Equals num_sd * integer-multiplicity,...
Definition: ERF_SDInitialization.H:828
bool m_sd_specified
Definition: ERF_SDInitialization.H:672
int numSDPerCell(const amrex::Real) const override
Number of super-droplets to inject per cell this step. Decided in updateDt() from the accumulated cou...
Definition: ERF_SDInitialization.H:821
amrex::Real m_min_multiplicity
Definition: ERF_SDInitialization.H:663
int m_inject_num_sd
Definition: ERF_SDInitialization.H:656
amrex::Real injectMultiplicity() const override
Multiplicity of each super-droplet injected this step.
Definition: ERF_SDInitialization.H:835
bool m_ppc_specified
Definition: ERF_SDInitialization.H:671
void readInputs(SDInputs &, const std::string &, const amrex::Geometry &, const MatVec &, const MatVec &) override
Definition: ERF_SDInitialization.H:790
unsigned int injectSeed() const override
Reproducible seed for scattering this step's super-droplets.
Definition: ERF_SDInitialization.H:836
void printParameters(const MatVec &, const MatVec &) const override
Definition: ERF_SDInitialization.cpp:386
amrex::Real m_sd_accum
Definition: ERF_SDInitialization.H:679
amrex::Real m_box_volume
Definition: ERF_SDInitialization.H:677
amrex::Real m_frac_tol
Definition: ERF_SDInitialization.H:660
amrex::Real m_inj_rate
Definition: ERF_SDInitialization.H:632
unsigned int m_inject_count
Definition: ERF_SDInitialization.H:681
bool m_both_specified
Definition: ERF_SDInitialization.H:668
bool m_perbox
Definition: ERF_SDInitialization.H:666
amrex::Real m_cell_volume
Definition: ERF_SDInitialization.H:653
bool perBoxInjection() const override
Per-box high-multiplicity injection (false for initialization and legacy per-cell injection).
Definition: ERF_SDInitialization.H:833
virtual ~SDInjection()=default
std::string m_prefix
Definition: ERF_SDInitialization.H:685
amrex::Vector< amrex::Real > m_domain_vel
Definition: ERF_SDInitialization.H:640
@ T
Definition: ERF_IndexDefines.H:128
List of super-droplet initializations.
Definition: ERF_SDInitialization.H:38
const int num_aerosols_max
Definition: ERF_SDInitialization.H:43
const int num_species_max
Definition: ERF_SDInitialization.H:40
real(c_double), parameter epsilon
Definition: ERF_module_model_constants.F90:12
Definition: ERF_SDInitialization.H:118
amrex::Real numdens
Definition: ERF_SDInitialization.H:128
amrex::Real mass_mean
Definition: ERF_SDInitialization.H:122
amrex::Real sigma
Definition: ERF_SDInitialization.H:133
amrex::Real delta
Definition: ERF_SDInitialization.H:136
amrex::Real cdf_max
Definition: ERF_SDInitialization.H:132
amrex::Real radius_mean
Definition: ERF_SDInitialization.H:125
amrex::Real mass_max
Definition: ERF_SDInitialization.H:121
amrex::Real lnmin
Definition: ERF_SDInitialization.H:135
amrex::Real cell_volume
Definition: ERF_SDInitialization.H:129
amrex::Real lnrng
Definition: ERF_SDInitialization.H:134
amrex::Real radius_gstd
Definition: ERF_SDInitialization.H:126
amrex::Real density
Definition: ERF_SDInitialization.H:127
amrex::Real radius_min
Definition: ERF_SDInitialization.H:123
amrex::Real radius_max
Definition: ERF_SDInitialization.H:124
int sampled_mult
Definition: ERF_SDInitialization.H:137
SDDistributionType dist_type
Definition: ERF_SDInitialization.H:119
amrex::Real cdf_min
Definition: ERF_SDInitialization.H:131
amrex::Real mass_min
Definition: ERF_SDInitialization.H:120