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);
188 mult_contribution = 0.0;
193 case SDDistributionType::radius_log_normal:
194 case SDDistributionType::radius_lognormal_autorange: {
199 dry_r = std::exp(lnval);
211 mult_contribution = 0.0;
227 using MatVec = std::vector<std::unique_ptr<MaterialProperties>>;
237 SDInitShape
m_type = SDInitShape::uniform;
302 virtual void setDefaults (
const amrex::Geometry& a_geom,
303 const MatVec& a_species_mat,
304 const MatVec& a_aerosol_mat );
314 const std::string& a_key,
315 const amrex::Geometry& a_geom,
316 const MatVec& a_species_mat,
317 const MatVec& a_aerosol_mat );
324 const MatVec& a_aerosol_mat )
const;
343 SDDistributionType a_init_type,
351 std::mt19937& a_rng )
const;
370 amrex::Vector<amrex::Real>& a_mult,
374 SDDistributionType a_init_type,
382 std::mt19937& a_rng )
const;
395 std::mt19937& a_rng )
const
421 amrex::Vector<amrex::Real>& a_mult,
426 std::mt19937& a_rng )
const
455 std::mt19937& a_rng )
const
481 amrex::Vector<amrex::Real>& a_mult,
486 std::mt19937& a_rng )
const
515 bool a_sampled_mult)
const
542 bool a_sampled_mult)
const
573 SDDistributionType a_init_type,
583 bool a_sampled_mult)
const;
590 return (
m_mult_type == SDMultiplicityType::sampled);
603 if (
m_type == SDInitShape::uniform) {
605 }
else if (
m_type == SDInitShape::bubble) {
623 [[nodiscard]]
virtual unsigned int injectSeed ()
const {
return 0; }
706 inline void updateDt (
const double a_dt,
const bool a_active)
744 const Real mult_step = par_step / num_sd;
749 }
else if (mult_step >=
one) {
760 const Real mult = num_par / num_sd;
773 if (this->
m_type == SDInitShape::uniform) {
776 for (
int dir = 0; dir < AMREX_SPACEDIM; dir++) {
782 }
else if (
m_type == SDInitShape::bubble) {
784 for (
int dir = 0; dir < AMREX_SPACEDIM; dir++) {
794 const amrex::Geometry&,
798 amrex::Abort(
"SDInjection::readInputs(): Do not use this interface");
813 const amrex::Geometry& a_geom,
814 const MatVec& a_species_mat,
815 const MatVec& a_aerosol_mat,
855 const amrex::Geometry&,
859 amrex::Abort(
"SDInjection::readInputs(): Do not use this interface");
873 const amrex::Geometry& a_geom,
874 const MatVec& a_species_mat,
875 const MatVec& a_aerosol_mat );
883 int num_sd_per_cell = 0;
887 num_sd_per_cell = this->
m_ppc;
889 return num_sd_per_cell;
897 num_par_per_cell = std::ceil(this->
m_numdens*a_dv);
899 num_par_per_cell = 1;
901 return num_par_per_cell;
Dimensionless numeric literals and pure mathematical constants.
constexpr amrex::Real one
Definition: ERF_NumericalConstants.H:30
constexpr amrex::Real zero
Definition: ERF_NumericalConstants.H:29
constexpr amrex::Real PI
Definition: ERF_NumericalConstants.H:39
constexpr amrex::Real four_thirds_pi
Definition: ERF_NumericalConstants.H:41
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:222
amrex::Real m_numdens
Definition: ERF_SDInitialization.H:240
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:391
amrex::Real volume() const
Calculate the volume of the particle domain.
Definition: ERF_SDInitialization.H:600
bool sampledMultiplicity() const
Determine whether multiplicity is sampled or constant.
Definition: ERF_SDInitialization.H:588
std::vector< amrex::Real > m_radius_aerosol_geom_std
Definition: ERF_SDInitialization.H:277
amrex::Real m_ice_app_density
Definition: ERF_SDInitialization.H:245
std::vector< amrex::Real > m_radius_species_max
Definition: ERF_SDInitialization.H:256
virtual unsigned int injectSeed() const
Reproducible seed for scattering this step's super-droplets.
Definition: ERF_SDInitialization.H:623
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:420
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:511
virtual bool perBoxInjection() const
Per-box high-multiplicity injection (false for initialization and legacy per-cell injection).
Definition: ERF_SDInitialization.H:617
SDMultiplicityType m_mult_type
Definition: ERF_SDInitialization.H:295
SDInitShape m_type
Definition: ERF_SDInitialization.H:237
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:291
int m_num_species
Definition: ERF_SDInitialization.H:282
std::vector< SDDistributionType > m_species_init_type
Definition: ERF_SDInitialization.H:262
std::vector< amrex::Real > m_mass_species_max
Definition: ERF_SDInitialization.H:250
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:258
int m_ppc
Definition: ERF_SDInitialization.H:230
bool m_ppc_from_inputs
Definition: ERF_SDInitialization.H:234
amrex::Vector< amrex::Real > m_init_particle_p2
Definition: ERF_SDInitialization.H:292
std::vector< amrex::Real > m_radius_aerosol_min
Definition: ERF_SDInitialization.H:271
virtual int injectBoxCount() const
Number of super-droplets to inject in the whole box this step.
Definition: ERF_SDInitialization.H:619
int m_num_aerosols
Definition: ERF_SDInitialization.H:284
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:480
std::vector< amrex::Real > m_radius_aerosol_max
Definition: ERF_SDInitialization.H:273
std::vector< amrex::Real > m_radius_species_geom_std
Definition: ERF_SDInitialization.H:260
virtual ~SDInitProperties()=default
std::vector< amrex::Real > m_mass_species_min
Definition: ERF_SDInitialization.H:248
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:538
virtual int numSDPerCell(const amrex::Real) const =0
std::vector< SDDistributionType > m_aerosol_init_type
Definition: ERF_SDInitialization.H:279
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:242
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:252
std::vector< amrex::Real > m_radius_aerosol_mean
Definition: ERF_SDInitialization.H:275
std::vector< amrex::Real > m_radius_species_min
Definition: ERF_SDInitialization.H:254
virtual amrex::Real numParticlesPerCell(const amrex::Real) const =0
std::vector< amrex::Real > m_mass_aerosol_min
Definition: ERF_SDInitialization.H:265
virtual amrex::Real injectMultiplicity() const
Multiplicity of each super-droplet injected this step.
Definition: ERF_SDInitialization.H:621
std::vector< std::unique_ptr< MaterialProperties > > MatVec
Definition: ERF_SDInitialization.H:229
std::vector< amrex::Real > m_mass_aerosol_mean
Definition: ERF_SDInitialization.H:269
std::vector< amrex::Real > m_mass_aerosol_max
Definition: ERF_SDInitialization.H:267
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:287
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:451
Super-droplets initialization structure.
Definition: ERF_SDInitialization.H:844
amrex::Real m_numdens_sd_init
Definition: ERF_SDInitialization.H:850
int numSDPerCell(const amrex::Real a_dv) const override
Definition: ERF_SDInitialization.H:881
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:893
void readInputs(SDInputs &, const std::string &, const amrex::Geometry &, const MatVec &, const MatVec &) override
Definition: ERF_SDInitialization.H:853
Super-droplets initialization structure.
Definition: ERF_SDInitialization.H:628
amrex::Real m_numdens_accum
Definition: ERF_SDInitialization.H:653
unsigned int m_inject_seed
Definition: ERF_SDInitialization.H:685
int injectBoxCount() const override
Number of super-droplets to inject in the whole box this step.
Definition: ERF_SDInitialization.H:836
amrex::Real m_numdens_sd
Definition: ERF_SDInitialization.H:639
amrex::Real m_eff_sd_rate
Definition: ERF_SDInitialization.H:677
amrex::Real m_tstop
Definition: ERF_SDInitialization.H:648
amrex::Real m_inject_mult
Definition: ERF_SDInitialization.H:660
amrex::Real m_sd_inj_rate
Definition: ERF_SDInitialization.H:636
amrex::Real m_tstart
Definition: ERF_SDInitialization.H:645
void updateDt(const double a_dt, const bool a_active)
Update time-dependent quantities for particle injection.
Definition: ERF_SDInitialization.H:706
bool m_mm_specified
Definition: ERF_SDInitialization.H:675
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:830
bool m_sd_specified
Definition: ERF_SDInitialization.H:674
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:823
amrex::Real m_min_multiplicity
Definition: ERF_SDInitialization.H:665
int m_inject_num_sd
Definition: ERF_SDInitialization.H:658
amrex::Real injectMultiplicity() const override
Multiplicity of each super-droplet injected this step.
Definition: ERF_SDInitialization.H:837
bool m_ppc_specified
Definition: ERF_SDInitialization.H:673
void readInputs(SDInputs &, const std::string &, const amrex::Geometry &, const MatVec &, const MatVec &) override
Definition: ERF_SDInitialization.H:792
unsigned int injectSeed() const override
Reproducible seed for scattering this step's super-droplets.
Definition: ERF_SDInitialization.H:838
void printParameters(const MatVec &, const MatVec &) const override
Definition: ERF_SDInitialization.cpp:386
amrex::Real m_sd_accum
Definition: ERF_SDInitialization.H:681
amrex::Real m_box_volume
Definition: ERF_SDInitialization.H:679
amrex::Real m_frac_tol
Definition: ERF_SDInitialization.H:662
amrex::Real m_inj_rate
Definition: ERF_SDInitialization.H:634
unsigned int m_inject_count
Definition: ERF_SDInitialization.H:683
bool m_both_specified
Definition: ERF_SDInitialization.H:670
bool m_perbox
Definition: ERF_SDInitialization.H:668
amrex::Real m_cell_volume
Definition: ERF_SDInitialization.H:655
bool perBoxInjection() const override
Per-box high-multiplicity injection (false for initialization and legacy per-cell injection).
Definition: ERF_SDInitialization.H:835
virtual ~SDInjection()=default
std::string m_prefix
Definition: ERF_SDInitialization.H:687
amrex::Vector< amrex::Real > m_domain_vel
Definition: ERF_SDInitialization.H:642
@ T
Definition: ERF_IndexDefines.H:128
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