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>
35 radius_lognormal_autorange
75 SDInputs (
const std::string& a_common,
const std::string& a_block)
80 bool query (
const std::string& a_key,
T& a_val,
const bool a_record =
true)
82 bool from_inputs =
m_block.query(a_key.c_str(), a_val);
83 if (!from_inputs) { from_inputs =
m_common.query(a_key.c_str(), a_val); }
84 if (!from_inputs && a_record) {
m_block.add(a_key.c_str(), a_val); }
90 bool queryarr (
const std::string& a_key, std::vector<T>& a_val)
92 bool from_inputs =
m_block.queryarr(a_key.c_str(), a_val);
93 if (!from_inputs) { from_inputs =
m_common.queryarr(a_key.c_str(), a_val); }
94 if (!from_inputs) {
m_block.addarr(a_key.c_str(), a_val); }
101 template <
typename T>
102 void record (
const std::string& a_key,
T& a_val) {
m_block.add(a_key.c_str(), a_val); }
105 template <
typename T>
106 bool queryarr (
const std::string& a_key, std::vector<T>& a_val,
const int a_num)
108 bool from_inputs =
m_block.queryarr(a_key.c_str(), a_val, 0, a_num);
109 if (!from_inputs) { from_inputs =
m_common.queryarr(a_key.c_str(), a_val, 0, a_num); }
110 if (!from_inputs) {
m_block.addarr(a_key.c_str(), a_val); }
146 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
154 return sign * std::sqrt(std::sqrt(p1 * p1 - p2) - p1);
163 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
165 const amrex::RandomEngine& engine,
173 case SDDistributionType::mass_constant:
175 mult_contribution = u;
178 case SDDistributionType::mass_exponential: {
182 mass = std::exp(lnval);
189 mult_contribution = 0.0;
194 case SDDistributionType::radius_log_normal:
195 case SDDistributionType::radius_lognormal_autorange: {
200 dry_r = std::exp(lnval);
212 mult_contribution = 0.0;
228 using MatVec = std::vector<std::unique_ptr<MaterialProperties>>;
238 SDInitShape
m_type = SDInitShape::uniform;
303 virtual void setDefaults (
const amrex::Geometry& a_geom,
304 const MatVec& a_species_mat,
305 const MatVec& a_aerosol_mat );
315 const std::string& a_key,
316 const amrex::Geometry& a_geom,
317 const MatVec& a_species_mat,
318 const MatVec& a_aerosol_mat );
325 const MatVec& a_aerosol_mat )
const;
344 SDDistributionType a_init_type,
352 std::mt19937& a_rng )
const;
371 amrex::Vector<amrex::Real>& a_mult,
375 SDDistributionType a_init_type,
383 std::mt19937& a_rng )
const;
396 std::mt19937& a_rng )
const
422 amrex::Vector<amrex::Real>& a_mult,
427 std::mt19937& a_rng )
const
456 std::mt19937& a_rng )
const
482 amrex::Vector<amrex::Real>& a_mult,
487 std::mt19937& a_rng )
const
516 bool a_sampled_mult)
const
543 bool a_sampled_mult)
const
574 SDDistributionType a_init_type,
584 bool a_sampled_mult)
const;
591 return (
m_mult_type == SDMultiplicityType::sampled);
604 if (
m_type == SDInitShape::uniform) {
606 }
else if (
m_type == SDInitShape::bubble) {
624 [[nodiscard]]
virtual unsigned int injectSeed ()
const {
return 0; }
707 inline void updateDt (
const double a_dt,
const bool a_active)
745 const Real mult_step = par_step / num_sd;
750 }
else if (mult_step >=
one) {
761 const Real mult = num_par / num_sd;
774 if (this->
m_type == SDInitShape::uniform) {
777 for (
int dir = 0; dir < AMREX_SPACEDIM; dir++) {
783 }
else if (
m_type == SDInitShape::bubble) {
785 for (
int dir = 0; dir < AMREX_SPACEDIM; dir++) {
795 const amrex::Geometry&,
799 amrex::Abort(
"SDInjection::readInputs(): Do not use this interface");
814 const amrex::Geometry& a_geom,
815 const MatVec& a_species_mat,
816 const MatVec& a_aerosol_mat,
856 const amrex::Geometry&,
860 amrex::Abort(
"SDInjection::readInputs(): Do not use this interface");
874 const amrex::Geometry& a_geom,
875 const MatVec& a_species_mat,
876 const MatVec& a_aerosol_mat );
884 int num_sd_per_cell = 0;
888 num_sd_per_cell = this->
m_ppc;
890 return num_sd_per_cell;
898 num_par_per_cell = std::ceil(this->
m_numdens*a_dv);
900 num_par_per_cell = 1;
902 return num_par_per_cell;
Dimensionless numeric literals and pure mathematical constants.
constexpr amrex::Real one
Definition: ERF_NumericalConstants.H:37
constexpr amrex::Real zero
Definition: ERF_NumericalConstants.H:36
constexpr amrex::Real PI
Definition: ERF_NumericalConstants.H:46
constexpr amrex::Real four_thirds_pi
Definition: ERF_NumericalConstants.H:48
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:164
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:147
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:223
amrex::Real m_numdens
Definition: ERF_SDInitialization.H:241
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:392
amrex::Real volume() const
Calculate the volume of the particle domain.
Definition: ERF_SDInitialization.H:601
bool sampledMultiplicity() const
Determine whether multiplicity is sampled or constant.
Definition: ERF_SDInitialization.H:589
std::vector< amrex::Real > m_radius_aerosol_geom_std
Definition: ERF_SDInitialization.H:278
amrex::Real m_ice_app_density
Definition: ERF_SDInitialization.H:246
std::vector< amrex::Real > m_radius_species_max
Definition: ERF_SDInitialization.H:257
virtual unsigned int injectSeed() const
Reproducible seed for scattering this step's super-droplets.
Definition: ERF_SDInitialization.H:624
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:421
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:512
virtual bool perBoxInjection() const
Per-box high-multiplicity injection (false for initialization and legacy per-cell injection).
Definition: ERF_SDInitialization.H:618
SDMultiplicityType m_mult_type
Definition: ERF_SDInitialization.H:296
SDInitShape m_type
Definition: ERF_SDInitialization.H:238
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:292
int m_num_species
Definition: ERF_SDInitialization.H:283
std::vector< SDDistributionType > m_species_init_type
Definition: ERF_SDInitialization.H:263
std::vector< amrex::Real > m_mass_species_max
Definition: ERF_SDInitialization.H:251
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:579
std::vector< amrex::Real > m_radius_species_mean
Definition: ERF_SDInitialization.H:259
int m_ppc
Definition: ERF_SDInitialization.H:231
bool m_ppc_from_inputs
Definition: ERF_SDInitialization.H:235
amrex::Vector< amrex::Real > m_init_particle_p2
Definition: ERF_SDInitialization.H:293
std::vector< amrex::Real > m_radius_aerosol_min
Definition: ERF_SDInitialization.H:272
virtual int injectBoxCount() const
Number of super-droplets to inject in the whole box this step.
Definition: ERF_SDInitialization.H:620
int m_num_aerosols
Definition: ERF_SDInitialization.H:285
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:481
std::vector< amrex::Real > m_radius_aerosol_max
Definition: ERF_SDInitialization.H:274
std::vector< amrex::Real > m_radius_species_geom_std
Definition: ERF_SDInitialization.H:261
virtual ~SDInitProperties()=default
std::vector< amrex::Real > m_mass_species_min
Definition: ERF_SDInitialization.H:249
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:539
virtual int numSDPerCell(const amrex::Real) const =0
std::vector< SDDistributionType > m_aerosol_init_type
Definition: ERF_SDInitialization.H:280
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:243
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:253
std::vector< amrex::Real > m_radius_aerosol_mean
Definition: ERF_SDInitialization.H:276
std::vector< amrex::Real > m_radius_species_min
Definition: ERF_SDInitialization.H:255
virtual amrex::Real numParticlesPerCell(const amrex::Real) const =0
std::vector< amrex::Real > m_mass_aerosol_min
Definition: ERF_SDInitialization.H:266
virtual amrex::Real injectMultiplicity() const
Multiplicity of each super-droplet injected this step.
Definition: ERF_SDInitialization.H:622
std::vector< std::unique_ptr< MaterialProperties > > MatVec
Definition: ERF_SDInitialization.H:230
std::vector< amrex::Real > m_mass_aerosol_mean
Definition: ERF_SDInitialization.H:270
std::vector< amrex::Real > m_mass_aerosol_max
Definition: ERF_SDInitialization.H:268
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:288
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:452
Super-droplets initialization structure.
Definition: ERF_SDInitialization.H:845
amrex::Real m_numdens_sd_init
Definition: ERF_SDInitialization.H:851
int numSDPerCell(const amrex::Real a_dv) const override
Definition: ERF_SDInitialization.H:882
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:894
void readInputs(SDInputs &, const std::string &, const amrex::Geometry &, const MatVec &, const MatVec &) override
Definition: ERF_SDInitialization.H:854
Super-droplets initialization structure.
Definition: ERF_SDInitialization.H:629
amrex::Real m_numdens_accum
Definition: ERF_SDInitialization.H:654
unsigned int m_inject_seed
Definition: ERF_SDInitialization.H:686
int injectBoxCount() const override
Number of super-droplets to inject in the whole box this step.
Definition: ERF_SDInitialization.H:837
amrex::Real m_numdens_sd
Definition: ERF_SDInitialization.H:640
amrex::Real m_eff_sd_rate
Definition: ERF_SDInitialization.H:678
amrex::Real m_tstop
Definition: ERF_SDInitialization.H:649
amrex::Real m_inject_mult
Definition: ERF_SDInitialization.H:661
amrex::Real m_sd_inj_rate
Definition: ERF_SDInitialization.H:637
amrex::Real m_tstart
Definition: ERF_SDInitialization.H:646
void updateDt(const double a_dt, const bool a_active)
Update time-dependent quantities for particle injection.
Definition: ERF_SDInitialization.H:707
bool m_mm_specified
Definition: ERF_SDInitialization.H:676
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:831
bool m_sd_specified
Definition: ERF_SDInitialization.H:675
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:824
amrex::Real m_min_multiplicity
Definition: ERF_SDInitialization.H:666
int m_inject_num_sd
Definition: ERF_SDInitialization.H:659
amrex::Real injectMultiplicity() const override
Multiplicity of each super-droplet injected this step.
Definition: ERF_SDInitialization.H:838
bool m_ppc_specified
Definition: ERF_SDInitialization.H:674
void readInputs(SDInputs &, const std::string &, const amrex::Geometry &, const MatVec &, const MatVec &) override
Definition: ERF_SDInitialization.H:793
unsigned int injectSeed() const override
Reproducible seed for scattering this step's super-droplets.
Definition: ERF_SDInitialization.H:839
void printParameters(const MatVec &, const MatVec &) const override
Definition: ERF_SDInitialization.cpp:386
amrex::Real m_sd_accum
Definition: ERF_SDInitialization.H:682
amrex::Real m_box_volume
Definition: ERF_SDInitialization.H:680
amrex::Real m_frac_tol
Definition: ERF_SDInitialization.H:663
amrex::Real m_inj_rate
Definition: ERF_SDInitialization.H:635
unsigned int m_inject_count
Definition: ERF_SDInitialization.H:684
bool m_both_specified
Definition: ERF_SDInitialization.H:671
bool m_perbox
Definition: ERF_SDInitialization.H:669
amrex::Real m_cell_volume
Definition: ERF_SDInitialization.H:656
bool perBoxInjection() const override
Per-box high-multiplicity injection (false for initialization and legacy per-cell injection).
Definition: ERF_SDInitialization.H:836
virtual ~SDInjection()=default
std::string m_prefix
Definition: ERF_SDInitialization.H:688
amrex::Vector< amrex::Real > m_domain_vel
Definition: ERF_SDInitialization.H:643
@ T
Definition: ERF_IndexDefines.H:168
List of super-droplet initializations.
Definition: ERF_SDInitialization.H:40
const int num_aerosols_max
Definition: ERF_SDInitialization.H:45
const int num_species_max
Definition: ERF_SDInitialization.H:42
real(c_double), parameter epsilon
Definition: ERF_module_model_constants.F90:12
Definition: ERF_SDInitialization.H:120
amrex::Real numdens
Definition: ERF_SDInitialization.H:130
amrex::Real mass_mean
Definition: ERF_SDInitialization.H:124
amrex::Real sigma
Definition: ERF_SDInitialization.H:135
amrex::Real delta
Definition: ERF_SDInitialization.H:138
amrex::Real cdf_max
Definition: ERF_SDInitialization.H:134
amrex::Real radius_mean
Definition: ERF_SDInitialization.H:127
amrex::Real mass_max
Definition: ERF_SDInitialization.H:123
amrex::Real lnmin
Definition: ERF_SDInitialization.H:137
amrex::Real cell_volume
Definition: ERF_SDInitialization.H:131
amrex::Real lnrng
Definition: ERF_SDInitialization.H:136
amrex::Real radius_gstd
Definition: ERF_SDInitialization.H:128
amrex::Real density
Definition: ERF_SDInitialization.H:129
amrex::Real radius_min
Definition: ERF_SDInitialization.H:125
amrex::Real radius_max
Definition: ERF_SDInitialization.H:126
int sampled_mult
Definition: ERF_SDInitialization.H:139
SDDistributionType dist_type
Definition: ERF_SDInitialization.H:121
amrex::Real cdf_min
Definition: ERF_SDInitialization.H:133
amrex::Real mass_min
Definition: ERF_SDInitialization.H:122