ERF
Energy Research and Forecasting: An Atmospheric Modeling Code
SDInitProperties Class Referenceabstract

Super-droplets initial properties. More...

#include <ERF_SDInitialization.H>

Inheritance diagram for SDInitProperties:
Collaboration diagram for SDInitProperties:

Public Types

using MatVec = std::vector< std::unique_ptr< MaterialProperties > >
 

Public Member Functions

virtual ~SDInitProperties ()=default
 
virtual void setDefaults (const amrex::Geometry &a_geom, const MatVec &a_species_mat, const MatVec &a_aerosol_mat)
 Set default values for initialization parameters. More...
 
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. More...
 
virtual void printParameters (const MatVec &a_species_mat, const MatVec &a_aerosol_mat) const
 Print super-droplets initialization parameters to screen. More...
 
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. More...
 
void getDistribution (amrex::Vector< amrex::Real > &a_mass, amrex::Vector< amrex::Real > &a_mult, amrex::Real a_dV, 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 sampled multiplicity. More...
 
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. More...
 
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. More...
 
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. More...
 
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. More...
 
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. More...
 
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. More...
 
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. More...
 
bool sampledMultiplicity () const
 Determine whether multiplicity is sampled or constant. More...
 
amrex::Real volume () const
 Calculate the volume of the particle domain. More...
 
virtual int numSDPerCell (const amrex::Real) const =0
 
virtual amrex::Real numParticlesPerCell (const amrex::Real) const =0
 
virtual bool perBoxInjection () const
 Per-box high-multiplicity injection (false for initialization and legacy per-cell injection). More...
 
virtual int injectBoxCount () const
 Number of super-droplets to inject in the whole box this step. More...
 
virtual amrex::Real injectMultiplicity () const
 Multiplicity of each super-droplet injected this step. More...
 
virtual unsigned int injectSeed () const
 Reproducible seed for scattering this step's super-droplets. More...
 

Public Attributes

int m_ppc = 1
 
bool m_ppc_from_inputs = false
 
SDInitShape m_type = SDInitShape::uniform
 
amrex::Real m_numdens = -1
 
amrex::Real m_max_multiplicity = 1000000
 
amrex::Real m_ice_app_density = -1
 
std::vector< amrex::Realm_mass_species_min
 
std::vector< amrex::Realm_mass_species_max
 
std::vector< amrex::Realm_mass_species_mean
 
std::vector< amrex::Realm_radius_species_min
 
std::vector< amrex::Realm_radius_species_max
 
std::vector< amrex::Realm_radius_species_mean
 
std::vector< amrex::Realm_radius_species_geom_std
 
std::vector< SDDistributionType > m_species_init_type
 
std::vector< amrex::Realm_mass_aerosol_min
 
std::vector< amrex::Realm_mass_aerosol_max
 
std::vector< amrex::Realm_mass_aerosol_mean
 
std::vector< amrex::Realm_radius_aerosol_min
 
std::vector< amrex::Realm_radius_aerosol_max
 
std::vector< amrex::Realm_radius_aerosol_mean
 
std::vector< amrex::Realm_radius_aerosol_geom_std
 
std::vector< SDDistributionType > m_aerosol_init_type
 
int m_num_species = 0
 
int m_num_aerosols = 0
 
amrex::RealBox m_particle_domain
 
amrex::Vector< amrex::Realm_init_particle_p1
 
amrex::Vector< amrex::Realm_init_particle_p2
 
SDMultiplicityType m_mult_type
 

Detailed Description

Super-droplets initial properties.

Member Typedef Documentation

◆ MatVec

using SDInitProperties::MatVec = std::vector<std::unique_ptr<MaterialProperties> >

Initial number of super-droplets per cell

Constructor & Destructor Documentation

◆ ~SDInitProperties()

virtual SDInitProperties::~SDInitProperties ( )
virtualdefault

Member Function Documentation

◆ getAerosolDistParams()

SDDistributionParams SDInitProperties::getAerosolDistParams ( int  a_idx,
amrex::Real  a_density,
amrex::Real  a_cell_volume,
bool  a_sampled_mult 
) const
inline

Get GPU-compatible distribution parameters for an aerosol.

Parameters
[in]a_idxAerosol species index
[in]a_densityDensity of the aerosol material
[in]a_cell_volumeCell volume for multiplicity scaling
[in]a_sampled_multWhether using sampled multiplicity mode
Returns
SDDistributionParams structure for GPU use
541  {
542  return makeDistributionParams(
543  m_aerosol_init_type[a_idx],
544  m_mass_aerosol_min[a_idx],
545  m_mass_aerosol_max[a_idx],
546  m_mass_aerosol_mean[a_idx],
547  m_radius_aerosol_min[a_idx],
548  m_radius_aerosol_max[a_idx],
549  m_radius_aerosol_mean[a_idx],
551  a_density,
552  a_cell_volume,
553  a_sampled_mult);
554  }
std::vector< amrex::Real > m_radius_aerosol_geom_std
Definition: ERF_SDInitialization.H:275
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_aerosol_min
Definition: ERF_SDInitialization.H:269
std::vector< amrex::Real > m_radius_aerosol_max
Definition: ERF_SDInitialization.H:271
std::vector< SDDistributionType > m_aerosol_init_type
Definition: ERF_SDInitialization.H:277
std::vector< amrex::Real > m_radius_aerosol_mean
Definition: ERF_SDInitialization.H:273
std::vector< amrex::Real > m_mass_aerosol_min
Definition: ERF_SDInitialization.H:263
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
Here is the call graph for this function:

◆ getAerosolDistribution() [1/2]

void SDInitProperties::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
inline

Compute the aerosol mass distribution with sampled multiplicity.

Parameters
[out]a_massOutput vector of aerosol masses
[out]a_multOutput vector of particle multiplicities
[in]a_dVCell volume for scaling multiplicity
[in]a_idxAerosol species index
[in]a_npNumber of particles to generate
[in]a_densityDensity of the aerosol material
[in,out]a_rngRandom number generator
425  {
426  getDistribution( a_mass,
427  a_mult,
428  a_dV,
429  a_np,
430  a_density,
431  m_aerosol_init_type[a_idx],
432  m_mass_aerosol_min[a_idx],
433  m_mass_aerosol_max[a_idx],
434  m_mass_aerosol_mean[a_idx],
435  m_radius_aerosol_min[a_idx],
436  m_radius_aerosol_max[a_idx],
437  m_radius_aerosol_mean[a_idx],
439  a_rng);
440  }
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
Here is the call graph for this function:

◆ getAerosolDistribution() [2/2]

void SDInitProperties::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
inline

Compute the aerosol mass distribution.

Parameters
[out]a_massOutput vector of aerosol masses
[in]a_idxAerosol species index
[in]a_npNumber of particles
[in]a_densityDensity of the aerosol material
[in,out]a_rngRandom number generator
394  {
395  getDistribution( a_mass,
396  a_np,
397  a_density,
398  m_aerosol_init_type[a_idx],
399  m_mass_aerosol_min[a_idx],
400  m_mass_aerosol_max[a_idx],
401  m_mass_aerosol_mean[a_idx],
402  m_radius_aerosol_min[a_idx],
403  m_radius_aerosol_max[a_idx],
404  m_radius_aerosol_mean[a_idx],
406  a_rng);
407  }
Here is the call graph for this function:

◆ getDistribution() [1/2]

void SDInitProperties::getDistribution ( amrex::Vector< amrex::Real > &  a_mass,
amrex::Vector< amrex::Real > &  a_mult,
amrex::Real  a_dV,
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 sampled multiplicity.

Parameters
[out]a_massOutput vector of particle masses
[out]a_multOutput vector of particle multiplicities
[in]a_dVCell volume
[in]a_npNumber of particles
[in]a_densityDensity of the particle material
[in]a_init_typeType of initialization distribution
[in]a_mass_minMinimum mass value
[in]a_mass_maxMaximum mass value
[in]a_mass_meanMean mass value
[in]a_radius_minMinimum radius value
[in]a_radius_maxMaximum radius value
[in]a_radius_meanMean radius value
[in]a_radius_gstdGeometric standard deviation for radius
[in,out]a_rngRandom number generator
483 {
484  a_mass.resize(a_np);
485  AMREX_ALWAYS_ASSERT(static_cast<amrex::Long>(a_mult.size()) == a_np);
486  if (a_init_type == SDDistributionType::mass_constant) {
487  std::uniform_real_distribution<amrex::Real> urd(zero, one);
488  for (int n = 0; n < a_np; n++) {
489  a_mass[n] = a_mass_mean;
490  a_mult[n] += urd(a_rng); // initially this will be a non-integer; later we will rescale to an integer.
491  }
492  } else if (a_init_type == SDDistributionType::mass_exponential) {
493  std::uniform_real_distribution<amrex::Real> urd(zero, one);
494  auto delta = a_mass_mean - a_mass_min;
495  auto lnrng = std::log(a_mass_max) - std::log(a_mass_min);
496  auto lnmin = std::log(a_mass_min);
497  for (int n = 0; n < a_np; n++) {
498  auto tmp = lnmin + urd(a_rng) * lnrng;
499  a_mass[n] = std::exp(tmp);
500  a_mult[n] += (m_numdens * a_dV) * std::exp(-a_mass[n] / delta);
501  }
502  } else if (a_init_type == SDDistributionType::radius_log_normal) {
503  std::uniform_real_distribution<amrex::Real> urd(zero, one);
504  auto sigma = std::log(a_radius_gstd);
505  auto mu = a_radius_mean;
506  auto lnrng = std::log(a_radius_max) - std::log(a_radius_min);
507  auto lnmin = std::log(a_radius_min);
508  for (int n = 0; n < a_np; n++) {
509  auto tmp = lnmin + urd(a_rng) * lnrng;
510  auto dry_r = std::exp(tmp);
511  a_mass[n] = four_thirds_pi * dry_r * dry_r * dry_r * a_density;
512  auto term = std::exp(-std::log(dry_r/mu)*std::log(dry_r/mu)/(two*sigma*sigma));
513  a_mult[n] += ( m_numdens * a_dV ) / (sigma*std::sqrt(amrex::Real(2)*PI)) * term;
514  }
515  } else if (a_init_type == SDDistributionType::radius_lognormal_autorange) {
516  std::uniform_real_distribution<amrex::Real> urd(zero, one);
517  auto sigma = std::log(a_radius_gstd);
518  auto mu = a_radius_mean;
519  // automatically find the min and max radius of superdroplets, using Dziekan & Pawlowska 2017
520  auto rmin = amrex::Real(1e-9);
521  auto rmax = one;
522  auto dlnr = (std::log(rmax) - std::log(rmin)) / a_np;
523  auto P_min = zero;
524  auto P_max = one;
525  auto tol = one / (m_numdens * a_dV);
526  int a_np_tail = static_cast<int>(std::ceil(amrex::Real(0.01)*a_np)); // this is an approximation for now; saves 1% of SDs for the tail
527  amrex::Vector<amrex::Real> tmp_mass(a_np);
528  amrex::Vector<amrex::Real> tmp_mult(a_np);
529  amrex::Print() << "Finding aerosol radius sampling range\n";
530  while ((P_max >= one - tol) || (P_min <= tol)) {
531  if (P_max >= one - tol) {
532  rmax = rmax * amrex::Real(0.99);
533  }
534  if (P_min <= tol) {
535  rmin = rmin * amrex::Real(1.01);
536  }
537  P_min = (one + std::erf((std::log(rmin / mu)) / sigma / std::sqrt(amrex::Real(2)))) / amrex::Real(2);
538  P_max = (one + std::erf((std::log(rmax / mu)) / sigma / std::sqrt(amrex::Real(2)))) / amrex::Real(2);
539  }
540  dlnr = (std::log(rmax) - std::log(rmin));
541  amrex::Print() << "Range: rmin =" << rmin << ", rmax = " << rmax << ", dlnr = " << dlnr << "\n";
542 
543  // initialize the main distribution
544  amrex::Print() << "Initializing radii\n";
545  auto lnrmin = std::log(rmin);
546  for (int n = 0; n < a_np; n++) {
547  auto tmp = lnrmin + urd(a_rng)*dlnr;
548  auto dry_r = std::exp(tmp);
549  tmp_mass[n] = four_thirds_pi * dry_r * dry_r * dry_r * a_density;
550  auto term = std::exp(-std::log(dry_r/mu)*std::log(dry_r/mu)/(two*sigma*sigma));
551  tmp_mult[n] = (m_numdens * a_dV)/ (sigma*std::sqrt(amrex::Real(2)*PI)) * term;
552  }
553 
554  // initialize the tail using approximate erfinv
555  amrex::Print() << "Initializing tail: " << a_np_tail << " particles\n";
556  auto tail_mult = std::exp(-std::log(rmax/mu)*std::log(rmax/mu)/(two*sigma*sigma)) / (sigma*std::sqrt(amrex::Real(2)*PI));
557  for (int n = 0; n < a_np_tail; n++) {
558  int sd_id = amrex::min(static_cast<int>(std::round(urd(a_rng) * a_np)), a_np-1);
559  AMREX_ASSERT(sd_id >= 0 && sd_id < a_np);
560  auto tmp = P_max + (one - P_max) * urd(a_rng);
561  auto tmp2 = SD_erfinv(amrex::Real(2) * tmp - amrex::Real(1));
562  auto dry_r = mu * std::exp(sigma * std::sqrt(amrex::Real(2)) * tmp2);
563  tmp_mass[sd_id] = four_thirds_pi * dry_r * dry_r * dry_r * a_density;
564  // set the multiplicity to the same as for the 99th percentile aerosol
565  tmp_mult[sd_id] = (m_numdens * a_dV) * tail_mult;
566  }
567  // Update SD multiplicity and mass with the initialized main + tail distribution
568  for (int n = 0; n < a_np; n++) {
569  a_mult[n] += tmp_mult[n];
570  a_mass[n] += tmp_mass[n];
571  }
572  amrex::Print() << "Done sampling\n";
573  } else {
574  amrex::Abort("Unknown m_init_type!");
575  }
576 }
constexpr amrex::Real two
Definition: ERF_Constants.H:10
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_ALWAYS_ASSERT(bx.length()[2]==khi+1)
amrex::Real sigma
Definition: ERF_InitCustomPert_DataAssimilation_ISV.H:11
AMREX_GPU_HOST_DEVICE static AMREX_FORCE_INLINE amrex::Real SD_erfinv(const amrex::Real x)
Definition: ERF_SDInitialization.cpp:460
amrex::Real Real
Definition: ERF_ShocInterface.H:19
amrex::Real m_numdens
Definition: ERF_SDInitialization.H:238
@ mu
Definition: ERF_AdvanceMorrison.cpp:92
@ tmp
Definition: ERF_AdvanceWSM6.cpp:114
@ tmp2
Definition: ERF_AdvanceWSM6.cpp:116
Here is the call graph for this function:

◆ getDistribution() [2/2]

void SDInitProperties::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.

Parameters
[out]a_massOutput vector of particle masses
[in]a_npNumber of particles
[in]a_densityDensity of the particle material
[in]a_init_typeType of initialization distribution
[in]a_mass_minMinimum mass value
[in]a_mass_maxMaximum mass value
[in]a_mass_meanMean mass value
[in]a_radius_minMinimum radius value
[in]a_radius_maxMaximum radius value
[in]a_radius_meanMean radius value
[in]a_radius_gstdGeometric standard deviation for radius
[in,out]a_rngRandom number generator
427 {
428  a_mass.resize(a_np);
429  if (a_init_type == SDDistributionType::mass_constant) {
430  for (int n = 0; n < a_np; n++) {
431  a_mass[n] = a_mass_mean;
432  }
433  } else if (a_init_type == SDDistributionType::mass_exponential) {
434  auto delta = a_mass_mean - a_mass_min;
435  std::exponential_distribution<amrex::Real> ed(one/delta);
436  for (int n = 0; n < a_np; n++) {
437  a_mass[n] = ed(a_rng) + a_mass_min;
438  }
439  } else if (a_init_type == SDDistributionType::radius_log_normal) {
440  std::normal_distribution<amrex::Real> nrd(std::log(a_radius_mean),
441  std::log(a_radius_gstd));
442  for (int n = 0; n < a_np; n++) {
443  auto dry_r = std::exp(nrd(a_rng));
444  int count = 0;
445  while ((dry_r < a_radius_min) || (dry_r > a_radius_max)) {
446  dry_r = std::exp(nrd(a_rng));
447  count++;
448  if (count > 100) { break; }
449  }
450  a_mass[n] = four_thirds_pi
451  * dry_r * dry_r * dry_r
452  * a_density;
453  }
454  } else {
455  amrex::Abort("Unknown a_init_type!");
456  }
457 }

Referenced by getAerosolDistribution(), and getSpeciesDistribution().

Here is the caller graph for this function:

◆ getSpeciesDistParams()

SDDistributionParams SDInitProperties::getSpeciesDistParams ( int  a_idx,
amrex::Real  a_density,
amrex::Real  a_cell_volume,
bool  a_sampled_mult 
) const
inline

Get GPU-compatible distribution parameters for a species.

Parameters
[in]a_idxSpecies index
[in]a_densityDensity of the species material
[in]a_cell_volumeCell volume for multiplicity scaling
[in]a_sampled_multWhether using sampled multiplicity mode
Returns
SDDistributionParams structure for GPU use
514  {
515  return makeDistributionParams(
516  m_species_init_type[a_idx],
517  m_mass_species_min[a_idx],
518  m_mass_species_max[a_idx],
519  m_mass_species_mean[a_idx],
520  m_radius_species_min[a_idx],
521  m_radius_species_max[a_idx],
522  m_radius_species_mean[a_idx],
524  a_density,
525  a_cell_volume,
526  a_sampled_mult);
527  }
std::vector< amrex::Real > m_radius_species_max
Definition: ERF_SDInitialization.H:254
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
std::vector< amrex::Real > m_radius_species_mean
Definition: ERF_SDInitialization.H:256
std::vector< amrex::Real > m_radius_species_geom_std
Definition: ERF_SDInitialization.H:258
std::vector< amrex::Real > m_mass_species_min
Definition: ERF_SDInitialization.H:246
std::vector< amrex::Real > m_mass_species_mean
Definition: ERF_SDInitialization.H:250
std::vector< amrex::Real > m_radius_species_min
Definition: ERF_SDInitialization.H:252
Here is the call graph for this function:

◆ getSpeciesDistribution() [1/2]

void SDInitProperties::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
inline

Compute the species mass distribution with sampled multiplicity.

Parameters
[out]a_massOutput vector of species masses
[out]a_multOutput vector of particle multiplicities
[in]a_dVCell volume for scaling multiplicity
[in]a_idxSpecies index
[in]a_npNumber of particles to generate
[in]a_densityDensity of the species material
[in,out]a_rngRandom number generator
485  {
486  getDistribution( a_mass,
487  a_mult,
488  a_dV,
489  a_np,
490  a_density,
491  m_species_init_type[a_idx],
492  m_mass_species_min[a_idx],
493  m_mass_species_max[a_idx],
494  m_mass_species_mean[a_idx],
495  m_radius_species_min[a_idx],
496  m_radius_species_max[a_idx],
497  m_radius_species_mean[a_idx],
499  a_rng);
500  }
Here is the call graph for this function:

◆ getSpeciesDistribution() [2/2]

void SDInitProperties::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
inline

Compute the species mass distribution with constant multiplicity.

Parameters
[out]a_massOutput vector of species masses
[in]a_idxSpecies index
[in]a_npNumber of particles to generate
[in]a_densityDensity of the species material
[in,out]a_rngRandom number generator
454  {
455  getDistribution( a_mass,
456  a_np,
457  a_density,
458  m_species_init_type[a_idx],
459  m_mass_species_min[a_idx],
460  m_mass_species_max[a_idx],
461  m_mass_species_mean[a_idx],
462  m_radius_species_min[a_idx],
463  m_radius_species_max[a_idx],
464  m_radius_species_mean[a_idx],
466  a_rng);
467  }
Here is the call graph for this function:

◆ injectBoxCount()

virtual int SDInitProperties::injectBoxCount ( ) const
inlinevirtual

Number of super-droplets to inject in the whole box this step.

Reimplemented in SDInjection.

617 { return 0; }

◆ injectMultiplicity()

virtual amrex::Real SDInitProperties::injectMultiplicity ( ) const
inlinevirtual

Multiplicity of each super-droplet injected this step.

Reimplemented in SDInjection.

619 { return zero; }

◆ injectSeed()

virtual unsigned int SDInitProperties::injectSeed ( ) const
inlinevirtual

Reproducible seed for scattering this step's super-droplets.

Reimplemented in SDInjection.

621 { return 0; }

◆ makeDistributionParams()

SDDistributionParams SDInitProperties::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.

Parameters
[in]a_init_typeDistribution type
[in]a_mass_minMinimum mass
[in]a_mass_maxMaximum mass
[in]a_mass_meanMean mass
[in]a_radius_minMinimum radius
[in]a_radius_maxMaximum radius
[in]a_radius_meanMean radius
[in]a_radius_gstdGeometric standard deviation
[in]a_densityMaterial density
[in]a_cell_volumeCell volume
[in]a_sampled_multWhether using sampled multiplicity mode
Returns
SDDistributionParams structure
590 {
591  SDDistributionParams params;
592  params.dist_type = a_init_type;
593  params.mass_min = a_mass_min;
594  params.mass_max = a_mass_max;
595  params.mass_mean = a_mass_mean;
596  params.radius_min = a_radius_min;
597  params.radius_max = a_radius_max;
598  params.radius_mean = a_radius_mean;
599  params.radius_gstd = a_radius_gstd;
600  params.density = a_density;
601  params.numdens = m_numdens;
602  params.cell_volume = a_cell_volume;
603  params.delta = a_mass_mean - a_mass_min;
604  params.sampled_mult = a_sampled_mult ? 1 : 0;
605 
606  // Pre-compute values for log-normal distribution
607  params.sigma = std::log(a_radius_gstd);
608 
609  if (params.dist_type == SDDistributionType::mass_exponential) {
610  // For exponential with sampled multiplicity, we sample in log-space
611  // For constant multiplicity, we use inverse transform sampling
612  params.lnmin = std::log(a_mass_min);
613  params.lnrng = std::log(a_mass_max) - params.lnmin;
614  params.cdf_min = zero;
615  params.cdf_max = one;
616  } else if (params.dist_type == SDDistributionType::radius_log_normal ||
617  params.dist_type == SDDistributionType::radius_lognormal_autorange) {
618  // For log-normal, compute CDF bounds for truncated sampling
619  // CDF of log-normal: Phi((ln(x) - ln(mu)) / sigma)
620  // where Phi is the standard normal CDF: Phi(z) = 0.5 * (1 + erf(z/sqrt(2)))
621  amrex::Real rmin = a_radius_min;
622  amrex::Real rmax = a_radius_max;
623  amrex::Real mu = a_radius_mean;
624  amrex::Real sigma = params.sigma;
625 
626  // For LogNormalAuto, find appropriate bounds iteratively
627  if (params.dist_type == SDDistributionType::radius_lognormal_autorange) {
628  rmin = amrex::Real(1e-9);
629  rmax = one;
630  amrex::Real tol = (m_numdens > 0 && a_cell_volume > 0) ?
631  one / (m_numdens * a_cell_volume) : amrex::Real(1e-6);
632  amrex::Real P_min = zero;
633  amrex::Real P_max = one;
634  while ((P_max >= one - tol) || (P_min <= tol)) {
635  if (P_max >= one - tol) rmax *= amrex::Real(0.99);
636  if (P_min <= tol) rmin *= amrex::Real(1.01);
637  P_min = myhalf * (one + std::erf(std::log(rmin / mu) / (sigma * std::sqrt(two))));
638  P_max = myhalf * (one + std::erf(std::log(rmax / mu) / (sigma * std::sqrt(two))));
639  }
640  // Update the params with computed bounds
641  params.radius_min = rmin;
642  params.radius_max = rmax;
643  }
644 
645  params.cdf_min = myhalf * (one + std::erf(std::log(rmin / mu) / (sigma * std::sqrt(two))));
646  params.cdf_max = myhalf * (one + std::erf(std::log(rmax / mu) / (sigma * std::sqrt(two))));
647  params.lnmin = std::log(rmin);
648  params.lnrng = std::log(rmax) - params.lnmin;
649  } else {
650  // Constant distribution - no special pre-computation needed
651  params.cdf_min = zero;
652  params.cdf_max = one;
653  params.lnmin = zero;
654  params.lnrng = zero;
655  }
656 
657  return params;
658 }
constexpr amrex::Real myhalf
Definition: ERF_Constants.H:13
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

Referenced by getAerosolDistParams(), and getSpeciesDistParams().

Here is the caller graph for this function:

◆ numParticlesPerCell()

virtual amrex::Real SDInitProperties::numParticlesPerCell ( const amrex::Real  ) const
pure virtual

Implemented in SDInjection, and SDInitialization.

◆ numSDPerCell()

virtual int SDInitProperties::numSDPerCell ( const amrex::Real  ) const
pure virtual

Implemented in SDInjection, and SDInitialization.

◆ perBoxInjection()

virtual bool SDInitProperties::perBoxInjection ( ) const
inlinevirtual

Per-box high-multiplicity injection (false for initialization and legacy per-cell injection).

Reimplemented in SDInjection.

615 { return false; }

◆ printParameters()

void SDInitProperties::printParameters ( const MatVec a_species_mat,
const MatVec a_aerosol_mat 
) const
virtual

Print super-droplets initialization parameters to screen.

Parameters
[in]a_species_matVector of species material properties
[in]a_aerosol_matVector of aerosol material properties

Reimplemented in SDInitialization, and SDInjection.

287 {
288  using namespace amrex;
289  if (m_type == SDInitShape::uniform) {
290  Print() << " Particle box: " << m_particle_domain << "\n";
291  } else if (m_type == SDInitShape::bubble) {
292  Print() << " Particle bubble (radius, center): " << m_particle_domain << "\n";
293  }
294  Print() << " Multiplicity type: " << amrex::getEnumNameString(m_mult_type) << "\n";
295  Print() << " Particles per cell: " << m_ppc << "\n";
296 
297  Print() << " Vapour/Condensate Species material:\n";
298  for (unsigned long i=0; i < a_species_mat.size(); i++) {
299  Print() << " "
300  << getEnumNameString(a_species_mat[i]->m_name)
301  << " (distribution: " << getEnumNameString(m_species_init_type[i]);
302  if (m_species_init_type[i] == SDDistributionType::mass_constant) {
303  Print() << ", value=" << m_mass_species_mean[i];
304  } else if (m_species_init_type[i] == SDDistributionType::mass_exponential) {
305  Print() << ", min=" << m_mass_species_min[i]
306  << ", mean=" << m_mass_species_mean[i]
307  << ", max=" << m_mass_species_max[i];
311  && (m_mass_species_mean[i] <= m_mass_species_max[i]) );
312  } else if (m_species_init_type[i] == SDDistributionType::radius_log_normal) {
313  Print() << ", min=" << m_radius_species_min[i]
314  << ", max=" << m_radius_species_max[i]
315  << ", mean=" << m_radius_species_mean[i]
316  << ", std=" << m_radius_species_geom_std[i];
321  } else if (m_species_init_type[i] == SDDistributionType::radius_lognormal_autorange) {
322  Print() << ", mean=" << m_radius_species_mean[i]
323  << ", std=" << m_radius_species_geom_std[i];
325  }
326  Print() << ")" << "\n";
327  }
328 
329  if (a_aerosol_mat.size() > 0) {
330  Print() << " Aerosols material:\n";
331  for (unsigned long i=0; i < a_aerosol_mat.size(); i++) {
332  Print() << " "
333  << getEnumNameString(a_aerosol_mat[i]->m_name)
334  << " (distribution: " << getEnumNameString(m_aerosol_init_type[i]);
335  if (m_aerosol_init_type[i] == SDDistributionType::mass_constant) {
336  Print() << ", value=" << m_mass_aerosol_mean[i];
338  } else if (m_aerosol_init_type[i] == SDDistributionType::mass_exponential) {
339  Print() << ", min=" << m_mass_aerosol_min[i]
340  << ", mean=" << m_mass_aerosol_mean[i]
341  << ", max=" << m_mass_aerosol_max[i];
345  && (m_mass_aerosol_mean[i] <= m_mass_aerosol_max[i]) );
346  } else if (m_aerosol_init_type[i] == SDDistributionType::radius_log_normal) {
347  Print() << ", min=" << m_radius_aerosol_min[i]
348  << ", max=" << m_radius_aerosol_max[i]
349  << ", mean=" << m_radius_aerosol_mean[i]
350  << ", std=" << m_radius_aerosol_geom_std[i];
355  } else if (m_aerosol_init_type[i] == SDDistributionType::radius_lognormal_autorange) {
356  Print() << ", mean=" << m_radius_aerosol_mean[i]
357  << ", std=" << m_radius_aerosol_geom_std[i];
359  }
360  Print() << ")" << "\n";
361  }
362 
363  // At least one aerosol must carry non-zero dry mass; individual aerosols
364  // may be empty (e.g. a pure-CCN mode with no dust core).
365  bool any_aerosol_nonzero = false;
366  for (unsigned long i=0; i < a_aerosol_mat.size(); i++) {
367  if (m_aerosol_init_type[i] == SDDistributionType::mass_constant) {
368  if (m_mass_aerosol_mean[i] > zero) { any_aerosol_nonzero = true; }
369  } else {
370  any_aerosol_nonzero = true;
371  }
372  }
373  AMREX_ALWAYS_ASSERT(any_aerosol_nonzero);
374  }
375 }
SDMultiplicityType m_mult_type
Definition: ERF_SDInitialization.H:293
SDInitShape m_type
Definition: ERF_SDInitialization.H:235
int m_ppc
Definition: ERF_SDInitialization.H:228
amrex::RealBox m_particle_domain
Definition: ERF_SDInitialization.H:285
Definition: ERF_ConsoleIO.cpp:15

Referenced by SDInjection::printParameters(), and SDInitialization::printParameters().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ readInputs()

void SDInitProperties::readInputs ( SDInputs a_in,
const std::string &  a_key,
const amrex::Geometry &  a_geom,
const MatVec a_species_mat,
const MatVec a_aerosol_mat 
)
virtual

Read super-droplets initialization parameters from input file.

Parameters
[in]a_inTwo-tier input resolver
[in]a_keyKey identifier for initialization parameters
[in]a_geomSimulation geometry information
[in]a_species_matVector of species material properties
[in]a_aerosol_matVector of aerosol material properties

Reimplemented in SDInitialization, and SDInjection.

81 {
82  BL_PROFILE("SDInitProperties::readInputs");
83  amrex::ignore_unused(a_geom);
84  using namespace amrex;
85 
86  a_in.query(std::string(a_key+"distribution_type").c_str(), m_type);
87  a_in.query("maximum_multiplicity", m_max_multiplicity);
88  a_in.query("multiplicity_type", m_mult_type);
89  a_in.query("ice_apparent_density", m_ice_app_density);
90 
91  m_ppc_from_inputs = a_in.query(std::string(a_key+"particles_per_cell").c_str(), m_ppc);
92 
93  if (m_type == SDInitShape::uniform) {
94 
95  a_in.queryarr("particle_box_lo", m_init_particle_p1, AMREX_SPACEDIM);
96  AMREX_ASSERT(m_init_particle_p1.size() == AMREX_SPACEDIM);
97 
98  a_in.queryarr("particle_box_hi", m_init_particle_p2, AMREX_SPACEDIM);
99  AMREX_ASSERT(m_init_particle_p2.size() == AMREX_SPACEDIM);
100 
103  } else if (m_type == SDInitShape::bubble){
104 
105  a_in.queryarr("particle_bubble_center", m_init_particle_p1, AMREX_SPACEDIM);
106  AMREX_ASSERT(m_init_particle_p1.size() == AMREX_SPACEDIM);
107 
108  a_in.queryarr("particle_bubble_radius", m_init_particle_p2, AMREX_SPACEDIM);
109  AMREX_ASSERT(m_init_particle_p2.size() == AMREX_SPACEDIM);
110 
113  }
114 
115  for (int i = 0; i < m_num_species; i++) {
116  {
117  std::string key = a_key+"species_distribution_type_"+getEnumNameString(a_species_mat[i]->m_name);
118  a_in.query(key.c_str(), m_species_init_type[i]);
119  }
120  {
121  std::string key = a_key+"species_min_mass_" + getEnumNameString(a_species_mat[i]->m_name);
122  a_in.query(key.c_str(), m_mass_species_min[i]);
123  }
124  {
125  std::string key = a_key+"species_mean_mass_" + getEnumNameString(a_species_mat[i]->m_name);
126  a_in.query(key.c_str(), m_mass_species_mean[i]);
127  }
128  {
129  m_mass_species_max[i] = 5 * m_mass_species_mean[i]; // default
130  std::string key = a_key+"species_max_mass_" + getEnumNameString(a_species_mat[i]->m_name);
131  a_in.query(key.c_str(), m_mass_species_max[i]);
132  }
133  {
134  std::string key = a_key+"species_min_radius_" + getEnumNameString(a_species_mat[i]->m_name);
135  a_in.query(key.c_str(), m_radius_species_min[i]);
136  }
137  {
138  std::string key = a_key+"species_max_radius_" + getEnumNameString(a_species_mat[i]->m_name);
139  a_in.query(key.c_str(), m_radius_species_max[i]);
140  }
141  {
142  std::string key = a_key+"species_mean_radius_" + getEnumNameString(a_species_mat[i]->m_name);
143  a_in.query(key.c_str(), m_radius_species_mean[i]);
144  }
145  {
146  std::string key_std = a_key+"species_std_radius_" + getEnumNameString(a_species_mat[i]->m_name);
147  std::string key_gstd = a_key+"species_geomstd_radius_" + getEnumNameString(a_species_mat[i]->m_name);
148 
149  // The two spellings are alternatives: std_radius is the log of the
150  // geometric std, geomstd_radius is the geometric std itself. Ask the
151  // resolver whether each came from the input file rather than whether the
152  // name is present in the table, so a recorded default cannot masquerade
153  // as a user setting.
154  amrex::Real std_val = amrex::Real(0.0);
156  const bool has_std = a_in.query(key_std, std_val, false);
157  const bool has_gstd = a_in.query(key_gstd, gstd_val, false);
158  if (has_std && has_gstd) {
159  amrex::Abort("Cannot specify BOTH "+key_std+" and "+key_gstd);
160  }
161  m_radius_species_geom_std[i] = has_std ? std::exp(std_val) : gstd_val;
162  if (!has_std && !has_gstd) { a_in.record(key_gstd, m_radius_species_geom_std[i]); }
163  }
164  }
165 
166  for (int i = 0; i < m_num_aerosols; i++) {
167  {
168  std::string key = a_key+"aerosol_distribution_type_"+getEnumNameString(a_aerosol_mat[i]->m_name);
169  a_in.query(key.c_str(), m_aerosol_init_type[i]);
170  }
171  {
172  std::string key = a_key+"aerosol_min_mass_" + getEnumNameString(a_aerosol_mat[i]->m_name);
173  a_in.query(key.c_str(), m_mass_aerosol_min[i]);
174  }
175  {
176  std::string key = a_key+"aerosol_mean_mass_" + getEnumNameString(a_aerosol_mat[i]->m_name);
177  a_in.query(key.c_str(), m_mass_aerosol_mean[i]);
178  }
179  {
180  m_mass_aerosol_max[i] = 5 * m_mass_aerosol_mean[i]; // default
181  std::string key = a_key+"aerosol_max_mass_" + getEnumNameString(a_aerosol_mat[i]->m_name);
182  a_in.query(key.c_str(), m_mass_aerosol_max[i]);
183  }
184  {
185  std::string key = a_key+"aerosol_min_radius_" + getEnumNameString(a_aerosol_mat[i]->m_name);
186  a_in.query(key.c_str(), m_radius_aerosol_min[i]);
187  }
188  {
189  std::string key = a_key+"aerosol_max_radius_" + getEnumNameString(a_aerosol_mat[i]->m_name);
190  a_in.query(key.c_str(), m_radius_aerosol_max[i]);
191  }
192  {
193  std::string key = a_key+"aerosol_mean_radius_" + getEnumNameString(a_aerosol_mat[i]->m_name);
194  a_in.query(key.c_str(), m_radius_aerosol_mean[i]);
195  }
196  {
197  std::string key_std = a_key+"aerosol_std_radius_" + getEnumNameString(a_aerosol_mat[i]->m_name);
198  std::string key_gstd = a_key+"aerosol_geomstd_radius_" + getEnumNameString(a_aerosol_mat[i]->m_name);
199 
200  // The two spellings are alternatives: std_radius is the log of the
201  // geometric std, geomstd_radius is the geometric std itself. Ask the
202  // resolver whether each came from the input file rather than whether the
203  // name is present in the table, so a recorded default cannot masquerade
204  // as a user setting.
205  amrex::Real std_val = amrex::Real(0.0);
207  const bool has_std = a_in.query(key_std, std_val, false);
208  const bool has_gstd = a_in.query(key_gstd, gstd_val, false);
209  if (has_std && has_gstd) {
210  amrex::Abort("Cannot specify BOTH "+key_std+" and "+key_gstd);
211  }
212  m_radius_aerosol_geom_std[i] = has_std ? std::exp(std_val) : gstd_val;
213  if (!has_std && !has_gstd) { a_in.record(key_gstd, m_radius_aerosol_geom_std[i]); }
214  }
215  }
216 
217 }
amrex::Real m_ice_app_density
Definition: ERF_SDInitialization.H:243
amrex::Vector< amrex::Real > m_init_particle_p1
Definition: ERF_SDInitialization.H:289
int m_num_species
Definition: ERF_SDInitialization.H:280
bool m_ppc_from_inputs
Definition: ERF_SDInitialization.H:232
amrex::Vector< amrex::Real > m_init_particle_p2
Definition: ERF_SDInitialization.H:290
int m_num_aerosols
Definition: ERF_SDInitialization.H:282
amrex::Real m_max_multiplicity
Definition: ERF_SDInitialization.H:240
bool queryarr(const std::string &a_key, std::vector< T > &a_val)
Definition: ERF_SDInitialization.H:88
void record(const std::string &a_key, T &a_val)
Definition: ERF_SDInitialization.H:100
bool query(const std::string &a_key, T &a_val, const bool a_record=true)
Definition: ERF_SDInitialization.H:78

Referenced by SDInitialization::readInputs(), and SDInjection::readInputs().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ sampledMultiplicity()

bool SDInitProperties::sampledMultiplicity ( ) const
inline

Determine whether multiplicity is sampled or constant.

Returns
True if multiplicity is sampled, false if constant
587  {
588  return (m_mult_type == SDMultiplicityType::sampled);
589  }

◆ setDefaults()

void SDInitProperties::setDefaults ( const amrex::Geometry &  a_geom,
const MatVec a_species_mat,
const MatVec a_aerosol_mat 
)
virtual

Set default values for initialization parameters.

Parameters
[in]a_geomSimulation geometry information
[in]a_species_matVector of species material properties
[in]a_aerosol_matVector of aerosol material properties
9 {
10  BL_PROFILE("SDInitProperties::setDefaults");
11 
12  // Default
13  m_init_particle_p1.resize(AMREX_SPACEDIM);
14  m_init_particle_p2.resize(AMREX_SPACEDIM);
15  for (int i = 0; i < AMREX_SPACEDIM; i++) {
16  m_init_particle_p1[i] = a_geom.ProbLo(i);
17  m_init_particle_p2[i] = a_geom.ProbHi(i);
18  }
19 
20  m_num_species = static_cast<int>(a_species_mat.size());
29 
30  for (int i = 0; i < m_num_species; i++) {
31  // default values
32  m_species_init_type[i] = SDDistributionType::mass_constant;
33  if (a_species_mat[i]->m_is_water) {
34  m_mass_species_min[i] = amrex::Real(4.1887902e-42);
35  m_mass_species_max[i] = amrex::Real(4.1887902e-42);
36  m_mass_species_mean[i] = amrex::Real(4.1887902e-42);
37  m_radius_species_min[i] = amrex::Real(1.0e-15);
38  m_radius_species_max[i] = amrex::Real(1.0e-15);
39  m_radius_species_mean[i] = amrex::Real(1.0e-15);
40  } else {
47  }
49  }
50 
51  m_num_aerosols = static_cast<int>(a_aerosol_mat.size());
60 
61  for (int i = 0; i < m_num_aerosols; i++) {
62  // default values
63  m_aerosol_init_type[i] = SDDistributionType::mass_constant;
67  m_radius_aerosol_min[i] = amrex::Real(1.0e-9);
68  m_radius_aerosol_max[i] = amrex::Real(1.0e-6);
69  m_radius_aerosol_mean[i] = amrex::Real(1.0e-40);
71  }
72 
73  m_mult_type = SDMultiplicityType::sampled;
74 }

◆ volume()

amrex::Real SDInitProperties::volume ( ) const
inline

Calculate the volume of the particle domain.

For uniform distribution type, returns the box volume. For bubble distribution type, returns the volume of the bubble.

Returns
Volume of the particle domain in cubic meters
599  {
600  amrex::Real vol = zero;
601  if (m_type == SDInitShape::uniform) {
602  vol = m_particle_domain.volume();
603  } else if (m_type == SDInitShape::bubble) {
604  const auto& radius = m_particle_domain.hi();
605  vol = four_thirds_pi*radius[0]*radius[1]*radius[2];
606  }
607  return vol;
608  }

Referenced by SDInjection::readInputs().

Here is the caller graph for this function:

Member Data Documentation

◆ m_aerosol_init_type

std::vector<SDDistributionType> SDInitProperties::m_aerosol_init_type

Initial distribution type for aerosol

Referenced by getAerosolDistParams(), getAerosolDistribution(), printParameters(), readInputs(), and setDefaults().

◆ m_ice_app_density

amrex::Real SDInitProperties::m_ice_app_density = -1

Referenced by readInputs().

◆ m_init_particle_p1

amrex::Vector<amrex::Real> SDInitProperties::m_init_particle_p1

Particle distribution shape parameters Box shape, p1 -> lo end, p2 -> hi end Bubble shape, p1 -> center, p2 -> radius

Referenced by readInputs(), and setDefaults().

◆ m_init_particle_p2

amrex::Vector<amrex::Real> SDInitProperties::m_init_particle_p2

Referenced by readInputs(), and setDefaults().

◆ m_mass_aerosol_max

std::vector<amrex::Real> SDInitProperties::m_mass_aerosol_max

◆ m_mass_aerosol_mean

std::vector<amrex::Real> SDInitProperties::m_mass_aerosol_mean

◆ m_mass_aerosol_min

std::vector<amrex::Real> SDInitProperties::m_mass_aerosol_min

◆ m_mass_species_max

std::vector<amrex::Real> SDInitProperties::m_mass_species_max

◆ m_mass_species_mean

std::vector<amrex::Real> SDInitProperties::m_mass_species_mean

◆ m_mass_species_min

std::vector<amrex::Real> SDInitProperties::m_mass_species_min

◆ m_max_multiplicity

amrex::Real SDInitProperties::m_max_multiplicity = 1000000

Apparent (bulk) density of initialized ice particles [kg m^-3]; <= 0 means use the solid-ice material density (a solid sphere)

Referenced by readInputs().

◆ m_mult_type

SDMultiplicityType SDInitProperties::m_mult_type

multiplicity type

Referenced by printParameters(), readInputs(), sampledMultiplicity(), and setDefaults().

◆ m_num_aerosols

int SDInitProperties::m_num_aerosols = 0

Number of aerosols

Referenced by readInputs(), and setDefaults().

◆ m_num_species

int SDInitProperties::m_num_species = 0

Number of species

Referenced by readInputs(), and setDefaults().

◆ m_numdens

◆ m_particle_domain

amrex::RealBox SDInitProperties::m_particle_domain

box within which to place particles

Referenced by printParameters(), readInputs(), SDInjection::updateDt(), and volume().

◆ m_ppc

int SDInitProperties::m_ppc = 1

Whether particles_per_cell came from the input file. Published by readInputs so callers do not have to read the key a second time – a second read would find the default this one recorded.

Referenced by SDInitialization::numSDPerCell(), printParameters(), readInputs(), and SDInjection::updateDt().

◆ m_ppc_from_inputs

bool SDInitProperties::m_ppc_from_inputs = false

◆ m_radius_aerosol_geom_std

std::vector<amrex::Real> SDInitProperties::m_radius_aerosol_geom_std

Standard deviation of aerosol dry radius

Referenced by getAerosolDistParams(), getAerosolDistribution(), printParameters(), readInputs(), and setDefaults().

◆ m_radius_aerosol_max

std::vector<amrex::Real> SDInitProperties::m_radius_aerosol_max

◆ m_radius_aerosol_mean

std::vector<amrex::Real> SDInitProperties::m_radius_aerosol_mean

◆ m_radius_aerosol_min

std::vector<amrex::Real> SDInitProperties::m_radius_aerosol_min

◆ m_radius_species_geom_std

std::vector<amrex::Real> SDInitProperties::m_radius_species_geom_std

Standard deviation of species dry radius

Referenced by getSpeciesDistParams(), getSpeciesDistribution(), printParameters(), readInputs(), and setDefaults().

◆ m_radius_species_max

std::vector<amrex::Real> SDInitProperties::m_radius_species_max

◆ m_radius_species_mean

std::vector<amrex::Real> SDInitProperties::m_radius_species_mean

◆ m_radius_species_min

std::vector<amrex::Real> SDInitProperties::m_radius_species_min

◆ m_species_init_type

std::vector<SDDistributionType> SDInitProperties::m_species_init_type

Initial distribution type for species

Referenced by getSpeciesDistParams(), getSpeciesDistribution(), printParameters(), readInputs(), and setDefaults().

◆ m_type

SDInitShape SDInitProperties::m_type = SDInitShape::uniform

Initial distribution type Initial number density (m^{-3}) of physical particles

Referenced by printParameters(), readInputs(), SDInjection::updateDt(), and volume().


The documentation for this class was generated from the following files: