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;
155 using MatVec = std::vector<std::unique_ptr<MaterialProperties>>;
161 SDInitShape
m_type = SDInitShape::uniform;
223 virtual void setDefaults (
const amrex::Geometry& a_geom,
224 const MatVec& a_species_mat,
225 const MatVec& a_aerosol_mat );
234 virtual void readInputs (
const std::string& a_prefix,
235 const std::string& a_key,
236 const amrex::Geometry& a_geom,
237 const MatVec& a_species_mat,
238 const MatVec& a_aerosol_mat );
245 const MatVec& a_aerosol_mat )
const;
264 SDDistributionType a_init_type,
272 std::mt19937& a_rng )
const;
291 amrex::Vector<amrex::Real>& a_mult,
295 SDDistributionType a_init_type,
303 std::mt19937& a_rng )
const;
316 std::mt19937& a_rng )
const
342 amrex::Vector<amrex::Real>& a_mult,
347 std::mt19937& a_rng )
const
376 std::mt19937& a_rng )
const
402 amrex::Vector<amrex::Real>& a_mult,
407 std::mt19937& a_rng )
const
436 bool a_sampled_mult)
const
463 bool a_sampled_mult)
const
494 SDDistributionType a_init_type,
504 bool a_sampled_mult)
const;
511 return (
m_mult_type == SDMultiplicityType::sampled);
524 if (
m_type == SDInitShape::uniform) {
526 }
else if (
m_type == SDInitShape::bubble) {
575 if (this->
m_type == SDInitShape::uniform) {
578 for (
int dir = 0; dir < AMREX_SPACEDIM; dir++) {
584 }
else if (
m_type == SDInitShape::bubble) {
586 for (
int dir = 0; dir < AMREX_SPACEDIM; dir++) {
596 const amrex::Geometry&,
600 amrex::Abort(
"SDInjection::readInputs(): Do not use this interface");
614 void readInputs (
const std::string& a_prefix,
615 const amrex::Geometry& a_geom,
616 const MatVec& a_species_mat,
617 const MatVec& a_aerosol_mat,
634 int num_sd_per_cell = 0;
636 num_sd_per_cell =
static_cast<int>(std::ceil(
m_numdens_sd*a_dv));
638 num_sd_per_cell = this->
m_ppc;
640 return num_sd_per_cell;
648 num_par_per_cell = std::ceil(this->
m_numdens*a_dv);
650 num_par_per_cell = 1;
652 return num_par_per_cell;
670 const amrex::Geometry&,
674 amrex::Abort(
"SDInjection::readInputs(): Do not use this interface");
687 void readInputs (
const std::string& a_prefix,
688 const amrex::Geometry& a_geom,
689 const MatVec& a_species_mat,
690 const MatVec& a_aerosol_mat );
698 int num_sd_per_cell = 0;
702 num_sd_per_cell = this->
m_ppc;
704 return num_sd_per_cell;
712 num_par_per_cell = std::ceil(this->
m_numdens*a_dv);
714 num_par_per_cell = 1;
716 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:37
constexpr amrex::Real four_thirds_pi
Definition: ERF_Constants.H:39
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:164
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:312
amrex::Real volume() const
Calculate the volume of the particle domain.
Definition: ERF_SDInitialization.H:521
bool sampledMultiplicity() const
Determine whether multiplicity is sampled or constant.
Definition: ERF_SDInitialization.H:509
std::vector< amrex::Real > m_radius_aerosol_geom_std
Definition: ERF_SDInitialization.H:198
std::vector< amrex::Real > m_radius_species_max
Definition: ERF_SDInitialization.H:177
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:341
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:432
SDMultiplicityType m_mult_type
Definition: ERF_SDInitialization.H:216
SDInitShape m_type
Definition: ERF_SDInitialization.H:161
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:212
int m_num_species
Definition: ERF_SDInitialization.H:203
std::vector< SDDistributionType > m_species_init_type
Definition: ERF_SDInitialization.H:183
std::vector< amrex::Real > m_mass_species_max
Definition: ERF_SDInitialization.H:171
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:179
int m_ppc
Definition: ERF_SDInitialization.H:158
amrex::Vector< amrex::Real > m_init_particle_p2
Definition: ERF_SDInitialization.H:213
std::vector< amrex::Real > m_radius_aerosol_min
Definition: ERF_SDInitialization.H:192
int m_num_aerosols
Definition: ERF_SDInitialization.H:205
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:401
std::vector< amrex::Real > m_radius_aerosol_max
Definition: ERF_SDInitialization.H:194
std::vector< amrex::Real > m_radius_species_geom_std
Definition: ERF_SDInitialization.H:181
virtual ~SDInitProperties()=default
std::vector< amrex::Real > m_mass_species_min
Definition: ERF_SDInitialization.H:169
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:459
virtual int numSDPerCell(const amrex::Real) const =0
std::vector< SDDistributionType > m_aerosol_init_type
Definition: ERF_SDInitialization.H:200
amrex::Real m_max_multiplicity
Definition: ERF_SDInitialization.H:166
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:173
std::vector< amrex::Real > m_radius_aerosol_mean
Definition: ERF_SDInitialization.H:196
std::vector< amrex::Real > m_radius_species_min
Definition: ERF_SDInitialization.H:175
virtual amrex::Real numParticlesPerCell(const amrex::Real) const =0
std::vector< amrex::Real > m_mass_aerosol_min
Definition: ERF_SDInitialization.H:186
std::vector< std::unique_ptr< MaterialProperties > > MatVec
Definition: ERF_SDInitialization.H:157
std::vector< amrex::Real > m_mass_aerosol_mean
Definition: ERF_SDInitialization.H:190
std::vector< amrex::Real > m_mass_aerosol_max
Definition: ERF_SDInitialization.H:188
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:208
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:372
Super-droplets initialization structure.
Definition: ERF_SDInitialization.H:659
amrex::Real m_numdens_sd_init
Definition: ERF_SDInitialization.H:665
int numSDPerCell(const amrex::Real a_dv) const override
Definition: ERF_SDInitialization.H:696
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:668
amrex::Real numParticlesPerCell(const amrex::Real a_dv) const override
Definition: ERF_SDInitialization.H:708
Super-droplets initialization structure.
Definition: ERF_SDInitialization.H:539
amrex::Real m_numdens_sd
Definition: ERF_SDInitialization.H:550
amrex::Real m_tstop
Definition: ERF_SDInitialization.H:559
amrex::Real m_sd_inj_rate
Definition: ERF_SDInitialization.H:547
amrex::Real m_tstart
Definition: ERF_SDInitialization.H:556
void updateDt(const amrex::Real a_dt)
Update time-dependent quantities for particle injection.
Definition: ERF_SDInitialization.H:570
void readInputs(const std::string &, const std::string &, const amrex::Geometry &, const MatVec &, const MatVec &) override
Definition: ERF_SDInitialization.H:594
void printParameters(const MatVec &, const MatVec &) const override
Definition: ERF_SDInitialization.cpp:337
amrex::Real m_inj_rate
Definition: ERF_SDInitialization.H:545
int numSDPerCell(const amrex::Real a_dv) const override
Compute number of super-droplets to inject per grid cell.
Definition: ERF_SDInitialization.H:632
virtual ~SDInjection()=default
amrex::Real numParticlesPerCell(const amrex::Real a_dv) const override
Definition: ERF_SDInitialization.H:644
amrex::Vector< amrex::Real > m_domain_vel
Definition: ERF_SDInitialization.H:553
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