ERF
Energy Research and Forecasting: An Atmospheric Modeling Code
SDInjection Class Reference

Super-droplets initialization structure. More...

#include <ERF_SDInitialization.H>

Inheritance diagram for SDInjection:
Collaboration diagram for SDInjection:

Public Member Functions

virtual ~SDInjection ()=default
 
void updateDt (const amrex::Real a_dt)
 Update time-dependent quantities for particle injection. More...
 
void readInputs (const std::string &, const std::string &, const amrex::Geometry &, const MatVec &, const MatVec &) override
 
void readInputs (const std::string &a_prefix, const amrex::Geometry &a_geom, const MatVec &a_species_mat, const MatVec &a_aerosol_mat, const amrex::Real a_dt)
 Read super-droplet injection parameters from input file. More...
 
void printParameters (const MatVec &, const MatVec &) const override
 
int numSDPerCell (const amrex::Real a_dv) const override
 Compute number of super-droplets to inject per grid cell. More...
 
amrex::Real numParticlesPerCell (const amrex::Real a_dv) const override
 
- Public Member Functions inherited from SDInitProperties
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...
 
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...
 

Public Attributes

amrex::Real m_inj_rate = 0
 
amrex::Real m_sd_inj_rate = 0
 
amrex::Real m_numdens_sd = -1
 
amrex::Vector< amrex::Realm_domain_vel = {zero,zero,zero}
 
amrex::Real m_tstart = zero
 
amrex::Real m_tstop = amrex::Real(1.0e17)
 
- Public Attributes inherited from SDInitProperties
int m_ppc = 1
 
SDInitShape m_type = SDInitShape::uniform
 
amrex::Real m_numdens = -1
 
amrex::Real m_max_multiplicity = 1000000
 
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
 

Additional Inherited Members

- Public Types inherited from SDInitProperties
using MatVec = std::vector< std::unique_ptr< MaterialProperties > >
 

Detailed Description

Super-droplets initialization structure.

Constructor & Destructor Documentation

◆ ~SDInjection()

virtual SDInjection::~SDInjection ( )
virtualdefault

Injection rate (number of physical particles per meter^3 second)

Member Function Documentation

◆ numParticlesPerCell()

amrex::Real SDInjection::numParticlesPerCell ( const amrex::Real  a_dv) const
inlineoverridevirtual

Compute number of physical particles per grid cell

Implements SDInitProperties.

643  {
644  amrex::Real num_par_per_cell = zero;
645  if (this->m_numdens >= 0) {
646  num_par_per_cell = std::ceil(this->m_numdens*a_dv);
647  } else {
648  num_par_per_cell = 1;
649  }
650  return num_par_per_cell;
651  }
constexpr amrex::Real zero
Definition: ERF_Constants.H:6
amrex::Real Real
Definition: ERF_ShocInterface.H:19
amrex::Real m_numdens
Definition: ERF_SDInitialization.H:162

◆ numSDPerCell()

int SDInjection::numSDPerCell ( const amrex::Real  a_dv) const
inlineoverridevirtual

Compute number of super-droplets to inject per grid cell.

Determines the number of super-droplets to inject based on either:

  1. The super-droplet number density and cell volume, or
  2. A constant number per cell (m_ppc) if number density is not set
Parameters
[in]a_dvVolume of the grid cell
Returns
Number of super-droplets to inject in this cell

Implements SDInitProperties.

631  {
632  int num_sd_per_cell = 0;
633  if (m_numdens_sd >= 0) {
634  num_sd_per_cell = static_cast<int>(std::ceil(m_numdens_sd*a_dv));
635  } else {
636  num_sd_per_cell = this->m_ppc;
637  }
638  return num_sd_per_cell;
639  }
int m_ppc
Definition: ERF_SDInitialization.H:156
amrex::Real m_numdens_sd
Definition: ERF_SDInitialization.H:548

◆ printParameters()

void SDInjection::printParameters ( const MatVec a_species_mat,
const MatVec a_aerosol_mat 
) const
overridevirtual

print super-droplets injection parameters to screen

Reimplemented from SDInitProperties.

339 {
340  using namespace amrex;
341  Print() << " Injection rate (# m^{-3} s^{-1}): " << m_inj_rate << "\n"
342  << " Injection domain velocity [m/s]: "
343  << m_domain_vel[0] << ","
344  << m_domain_vel[1] << ","
345  << m_domain_vel[2] << "\n"
346  << " Time (start, stop) [s]: " << m_tstart << ", " << m_tstop << "\n"
347  << " SD injection rate: " << m_sd_inj_rate << "\n";
348  SDInitProperties::printParameters(a_species_mat, a_aerosol_mat);
349 }
virtual void printParameters(const MatVec &a_species_mat, const MatVec &a_aerosol_mat) const
Print super-droplets initialization parameters to screen.
Definition: ERF_SDInitialization.cpp:248
amrex::Real m_tstop
Definition: ERF_SDInitialization.H:557
amrex::Real m_sd_inj_rate
Definition: ERF_SDInitialization.H:545
amrex::Real m_tstart
Definition: ERF_SDInitialization.H:554
amrex::Real m_inj_rate
Definition: ERF_SDInitialization.H:543
amrex::Vector< amrex::Real > m_domain_vel
Definition: ERF_SDInitialization.H:551
Definition: ERF_ConsoleIO.cpp:12
Here is the call graph for this function:

◆ readInputs() [1/2]

void SDInjection::readInputs ( const std::string &  ,
const std::string &  ,
const amrex::Geometry &  ,
const MatVec ,
const MatVec  
)
inlineoverridevirtual

read super-droplets injection parameters

Reimplemented from SDInitProperties.

597  {
598  amrex::Abort("SDInjection::readInputs(): Do not use this interface");
599  }

◆ readInputs() [2/2]

void SDInjection::readInputs ( const std::string &  a_prefix,
const amrex::Geometry &  a_geom,
const MatVec a_species_mat,
const MatVec a_aerosol_mat,
const amrex::Real  a_dt 
)

Read super-droplet injection parameters from input file.

This function reads injection-specific parameters like injection rate, timing parameters, and domain velocity.

Parameters
[in]a_prefixPrefix for parameter parser
[in]a_geomSimulation geometry information
[in]a_species_matVector of species material properties
[in]a_aerosol_matVector of aerosol material properties
[in]a_dtCurrent timestep size
229 {
230  BL_PROFILE("SDInjection::readInputs");
231 
232  SDInitProperties::readInputs( a_prefix, "", a_geom, a_species_mat, a_aerosol_mat);
233 
234  amrex::ignore_unused(a_geom);
235  using namespace amrex;
236 
237  amrex::ParmParse pp(a_prefix);
238  pp.query("rate", m_inj_rate);
239  pp.query("sd_rate", m_sd_inj_rate);
240  pp.query("t_start", m_tstart);
241  pp.query("t_stop", m_tstop);
242  pp.queryarr("domain_velocity", m_domain_vel);
243 
244  this->m_numdens = m_inj_rate * a_dt;
245  m_numdens_sd = (m_sd_inj_rate > 0 ? std::max(m_sd_inj_rate*a_dt, one) : -1);
246 }
constexpr amrex::Real one
Definition: ERF_Constants.H:7
ParmParse pp("prob")
virtual void readInputs(const std::string &a_prefix, const std::string &a_key, const amrex::Geometry &a_geom, const MatVec &a_species_mat, const MatVec &a_aerosol_mat)
Read super-droplets initialization parameters from input file.
Definition: ERF_SDInitialization.cpp:76
Here is the call graph for this function:

◆ updateDt()

void SDInjection::updateDt ( const amrex::Real  a_dt)
inline

Update time-dependent quantities for particle injection.

This function updates:

  1. Number density based on injection rate and timestep
  2. Super-droplet number density based on SD injection rate
  3. Position of the injection domain based on domain velocity
Parameters
[in]a_dtTimestep size in seconds
569  {
570  this->m_numdens = m_inj_rate * a_dt;
571  m_numdens_sd = (m_sd_inj_rate>0 ? std::max(m_sd_inj_rate*a_dt, one) : -1);
572 
573  if (this->m_type == SDInitShape::uniform) {
574  amrex::Vector<amrex::Real> lo = {zero, zero, zero};
575  amrex::Vector<amrex::Real> hi = {zero, zero, zero};
576  for (int dir = 0; dir < AMREX_SPACEDIM; dir++) {
577  lo[dir] = this->m_particle_domain.lo(dir) + m_domain_vel[dir] * a_dt;
578  hi[dir] = this->m_particle_domain.hi(dir) + m_domain_vel[dir] * a_dt;
579  }
580  this->m_particle_domain.setLo(lo);
581  this->m_particle_domain.setHi(hi);
582  } else if (m_type == SDInitShape::bubble) {
583  amrex::Vector<amrex::Real> center = {zero, zero, zero};
584  for (int dir = 0; dir < AMREX_SPACEDIM; dir++) {
585  center[dir] = this->m_particle_domain.lo(dir) + m_domain_vel[dir] * a_dt;
586  }
587  this->m_particle_domain.setLo(center);
588  }
589  }
SDInitShape m_type
Definition: ERF_SDInitialization.H:159
amrex::RealBox m_particle_domain
Definition: ERF_SDInitialization.H:206

Member Data Documentation

◆ m_domain_vel

amrex::Vector<amrex::Real> SDInjection::m_domain_vel = {zero,zero,zero}

Start time for injection

Referenced by updateDt().

◆ m_inj_rate

amrex::Real SDInjection::m_inj_rate = 0

Injection rate (number of SDs per meter^3 second)

◆ m_numdens_sd

amrex::Real SDInjection::m_numdens_sd = -1

Injection domain velocity

Referenced by numSDPerCell(), and updateDt().

◆ m_sd_inj_rate

amrex::Real SDInjection::m_sd_inj_rate = 0

Initial number density of super-droplets

Referenced by updateDt().

◆ m_tstart

amrex::Real SDInjection::m_tstart = zero

Stop time for injection

◆ m_tstop

amrex::Real SDInjection::m_tstop = amrex::Real(1.0e17)

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