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::Real > m_mass_species_min
 
std::vector< amrex::Real > m_mass_species_max
 
std::vector< amrex::Real > m_mass_species_mean
 
std::vector< amrex::Real > m_radius_species_min
 
std::vector< amrex::Real > m_radius_species_max
 
std::vector< amrex::Real > m_radius_species_mean
 
std::vector< amrex::Real > m_radius_species_geom_std
 
std::vector< SDDistributionType > m_species_init_type
 
std::vector< amrex::Real > m_mass_aerosol_min
 
std::vector< amrex::Real > m_mass_aerosol_max
 
std::vector< amrex::Real > m_mass_aerosol_mean
 
std::vector< amrex::Real > m_radius_aerosol_min
 
std::vector< amrex::Real > m_radius_aerosol_max
 
std::vector< amrex::Real > m_radius_aerosol_mean
 
std::vector< amrex::Real > m_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::Real > m_init_particle_p1
 
amrex::Vector< amrex::Real > m_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
544  {
545  return makeDistributionParams(
546  m_aerosol_init_type[a_idx],
547  m_mass_aerosol_min[a_idx],
548  m_mass_aerosol_max[a_idx],
549  m_mass_aerosol_mean[a_idx],
550  m_radius_aerosol_min[a_idx],
551  m_radius_aerosol_max[a_idx],
552  m_radius_aerosol_mean[a_idx],
554  a_density,
555  a_cell_volume,
556  a_sampled_mult);
557  }
std::vector< amrex::Real > m_radius_aerosol_geom_std
Definition: ERF_SDInitialization.H:278
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_aerosol_min
Definition: ERF_SDInitialization.H:272
std::vector< amrex::Real > m_radius_aerosol_max
Definition: ERF_SDInitialization.H:274
std::vector< SDDistributionType > m_aerosol_init_type
Definition: ERF_SDInitialization.H:280
std::vector< amrex::Real > m_radius_aerosol_mean
Definition: ERF_SDInitialization.H:276
std::vector< amrex::Real > m_mass_aerosol_min
Definition: ERF_SDInitialization.H:266
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
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
428  {
429  getDistribution( a_mass,
430  a_mult,
431  a_dV,
432  a_np,
433  a_density,
434  m_aerosol_init_type[a_idx],
435  m_mass_aerosol_min[a_idx],
436  m_mass_aerosol_max[a_idx],
437  m_mass_aerosol_mean[a_idx],
438  m_radius_aerosol_min[a_idx],
439  m_radius_aerosol_max[a_idx],
440  m_radius_aerosol_mean[a_idx],
442  a_rng);
443  }
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
397  {
398  getDistribution( a_mass,
399  a_np,
400  a_density,
401  m_aerosol_init_type[a_idx],
402  m_mass_aerosol_min[a_idx],
403  m_mass_aerosol_max[a_idx],
404  m_mass_aerosol_mean[a_idx],
405  m_radius_aerosol_min[a_idx],
406  m_radius_aerosol_max[a_idx],
407  m_radius_aerosol_mean[a_idx],
409  a_rng);
410  }
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) * (a_mass[n] / delta)
501  * std::exp(-(a_mass[n] - a_mass_min) / delta);
502  }
503  } else if (a_init_type == SDDistributionType::radius_log_normal) {
504  std::uniform_real_distribution<amrex::Real> urd(zero, one);
505  auto sigma = std::log(a_radius_gstd);
506  auto mu = a_radius_mean;
507  auto lnrng = std::log(a_radius_max) - std::log(a_radius_min);
508  auto lnmin = std::log(a_radius_min);
509  for (int n = 0; n < a_np; n++) {
510  auto tmp = lnmin + urd(a_rng) * lnrng;
511  auto dry_r = std::exp(tmp);
512  a_mass[n] = four_thirds_pi * dry_r * dry_r * dry_r * a_density;
513  auto term = std::exp(-std::log(dry_r/mu)*std::log(dry_r/mu)/(two*sigma*sigma));
514  a_mult[n] += ( m_numdens * a_dV ) / (sigma*std::sqrt(amrex::Real(2)*PI)) * term;
515  }
516  } else if (a_init_type == SDDistributionType::radius_lognormal_autorange) {
517  std::uniform_real_distribution<amrex::Real> urd(zero, one);
518  auto sigma = std::log(a_radius_gstd);
519  auto mu = a_radius_mean;
520  // automatically find the min and max radius of superdroplets, using Dziekan & Pawlowska 2017
521  auto rmin = amrex::Real(1e-9);
522  auto rmax = one;
523  auto dlnr = (std::log(rmax) - std::log(rmin)) / a_np;
524  auto P_min = zero;
525  auto P_max = one;
526  auto tol = one / (m_numdens * a_dV);
527  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
528  amrex::Vector<amrex::Real> tmp_mass(a_np);
529  amrex::Vector<amrex::Real> tmp_mult(a_np);
530  amrex::Print() << "Finding aerosol radius sampling range\n";
531  while ((P_max >= one - tol) || (P_min <= tol)) {
532  if (P_max >= one - tol) {
533  rmax = rmax * amrex::Real(0.99);
534  }
535  if (P_min <= tol) {
536  rmin = rmin * amrex::Real(1.01);
537  }
538  P_min = (one + std::erf((std::log(rmin / mu)) / sigma / std::sqrt(amrex::Real(2)))) / amrex::Real(2);
539  P_max = (one + std::erf((std::log(rmax / mu)) / sigma / std::sqrt(amrex::Real(2)))) / amrex::Real(2);
540  }
541  dlnr = (std::log(rmax) - std::log(rmin));
542  amrex::Print() << "Range: rmin =" << rmin << ", rmax = " << rmax << ", dlnr = " << dlnr << "\n";
543 
544  // initialize the main distribution
545  amrex::Print() << "Initializing radii\n";
546  auto lnrmin = std::log(rmin);
547  for (int n = 0; n < a_np; n++) {
548  auto tmp = lnrmin + urd(a_rng)*dlnr;
549  auto dry_r = std::exp(tmp);
550  tmp_mass[n] = four_thirds_pi * dry_r * dry_r * dry_r * a_density;
551  auto term = std::exp(-std::log(dry_r/mu)*std::log(dry_r/mu)/(two*sigma*sigma));
552  tmp_mult[n] = (m_numdens * a_dV)/ (sigma*std::sqrt(amrex::Real(2)*PI)) * term;
553  }
554 
555  // initialize the tail using approximate erfinv
556  amrex::Print() << "Initializing tail: " << a_np_tail << " particles\n";
557  auto tail_mult = std::exp(-std::log(rmax/mu)*std::log(rmax/mu)/(two*sigma*sigma)) / (sigma*std::sqrt(amrex::Real(2)*PI));
558  for (int n = 0; n < a_np_tail; n++) {
559  int sd_id = amrex::min(static_cast<int>(std::round(urd(a_rng) * a_np)), a_np-1);
560  AMREX_ASSERT(sd_id >= 0 && sd_id < a_np);
561  auto tmp = P_max + (one - P_max) * urd(a_rng);
562  auto tmp2 = SD_erfinv(amrex::Real(2) * tmp - amrex::Real(1));
563  auto dry_r = mu * std::exp(sigma * std::sqrt(amrex::Real(2)) * tmp2);
564  tmp_mass[sd_id] = four_thirds_pi * dry_r * dry_r * dry_r * a_density;
565  // set the multiplicity to the same as for the 99th percentile aerosol
566  tmp_mult[sd_id] = (m_numdens * a_dV) * tail_mult;
567  }
568  // Update SD multiplicity and mass with the initialized main + tail distribution
569  for (int n = 0; n < a_np; n++) {
570  a_mult[n] += tmp_mult[n];
571  a_mass[n] = tmp_mass[n];
572  }
573  amrex::Print() << "Done sampling\n";
574  } else {
575  amrex::Abort("Unknown m_init_type!");
576  }
577 }
AMREX_ALWAYS_ASSERT(bx.length()[2]==khi+1)
amrex::Real sigma
Definition: ERF_InitCustomPert_DataAssimilation_ISV.H:11
constexpr amrex::Real two
Definition: ERF_NumericalConstants.H:38
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_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:241
@ mu
Definition: ERF_AdvanceMorrison.cpp:94
@ tmp
Definition: ERF_AdvanceWSM6.cpp:116
@ tmp2
Definition: ERF_AdvanceWSM6.cpp:118
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
517  {
518  return makeDistributionParams(
519  m_species_init_type[a_idx],
520  m_mass_species_min[a_idx],
521  m_mass_species_max[a_idx],
522  m_mass_species_mean[a_idx],
523  m_radius_species_min[a_idx],
524  m_radius_species_max[a_idx],
525  m_radius_species_mean[a_idx],
527  a_density,
528  a_cell_volume,
529  a_sampled_mult);
530  }
std::vector< amrex::Real > m_radius_species_max
Definition: ERF_SDInitialization.H:257
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
std::vector< amrex::Real > m_radius_species_mean
Definition: ERF_SDInitialization.H:259
std::vector< amrex::Real > m_radius_species_geom_std
Definition: ERF_SDInitialization.H:261
std::vector< amrex::Real > m_mass_species_min
Definition: ERF_SDInitialization.H:249
std::vector< amrex::Real > m_mass_species_mean
Definition: ERF_SDInitialization.H:253
std::vector< amrex::Real > m_radius_species_min
Definition: ERF_SDInitialization.H:255
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
488  {
489  getDistribution( a_mass,
490  a_mult,
491  a_dV,
492  a_np,
493  a_density,
494  m_species_init_type[a_idx],
495  m_mass_species_min[a_idx],
496  m_mass_species_max[a_idx],
497  m_mass_species_mean[a_idx],
498  m_radius_species_min[a_idx],
499  m_radius_species_max[a_idx],
500  m_radius_species_mean[a_idx],
502  a_rng);
503  }
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
457  {
458  getDistribution( a_mass,
459  a_np,
460  a_density,
461  m_species_init_type[a_idx],
462  m_mass_species_min[a_idx],
463  m_mass_species_max[a_idx],
464  m_mass_species_mean[a_idx],
465  m_radius_species_min[a_idx],
466  m_radius_species_max[a_idx],
467  m_radius_species_mean[a_idx],
469  a_rng);
470  }
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.

620 { return 0; }

◆ injectMultiplicity()

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

Multiplicity of each super-droplet injected this step.

Reimplemented in SDInjection.

622 { return zero; }

◆ injectSeed()

virtual unsigned int SDInitProperties::injectSeed ( ) const
inlinevirtual

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

Reimplemented in SDInjection.

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

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.

618 { 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:296
SDInitShape m_type
Definition: ERF_SDInitialization.H:238
int m_ppc
Definition: ERF_SDInitialization.H:231
amrex::RealBox m_particle_domain
Definition: ERF_SDInitialization.H:288
Definition: ERF_ConsoleIO.cpp:17

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:246
amrex::Vector< amrex::Real > m_init_particle_p1
Definition: ERF_SDInitialization.H:292
int m_num_species
Definition: ERF_SDInitialization.H:283
bool m_ppc_from_inputs
Definition: ERF_SDInitialization.H:235
amrex::Vector< amrex::Real > m_init_particle_p2
Definition: ERF_SDInitialization.H:293
int m_num_aerosols
Definition: ERF_SDInitialization.H:285
amrex::Real m_max_multiplicity
Definition: ERF_SDInitialization.H:243
bool queryarr(const std::string &a_key, std::vector< T > &a_val)
Definition: ERF_SDInitialization.H:90
void record(const std::string &a_key, T &a_val)
Definition: ERF_SDInitialization.H:102
bool query(const std::string &a_key, T &a_val, const bool a_record=true)
Definition: ERF_SDInitialization.H:80

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
590  {
591  return (m_mult_type == SDMultiplicityType::sampled);
592  }

◆ 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
602  {
603  amrex::Real vol = zero;
604  if (m_type == SDInitShape::uniform) {
605  vol = m_particle_domain.volume();
606  } else if (m_type == SDInitShape::bubble) {
607  const auto& radius = m_particle_domain.hi();
608  vol = four_thirds_pi*radius[0]*radius[1]*radius[2];
609  }
610  return vol;
611  }

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: