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 double a_dt, const bool a_active)
 Update time-dependent quantities for particle injection. More...
 
void readInputs (SDInputs &, const std::string &, const amrex::Geometry &, const MatVec &, const MatVec &) override
 
void readInputs (SDInputs &a_in, const amrex::Geometry &a_geom, const MatVec &a_species_mat, const MatVec &a_aerosol_mat, const double a_dt)
 Read super-droplet injection parameters from input file. More...
 
void printParameters (const MatVec &, const MatVec &) const override
 
int numSDPerCell (const amrex::Real) const override
 Number of super-droplets to inject per cell this step. Decided in updateDt() from the accumulated count (0 = inject nothing). More...
 
amrex::Real numParticlesPerCell (const amrex::Real) const override
 Number of physical particles to inject per cell this step. Equals num_sd * integer-multiplicity, decided in updateDt(). More...
 
bool perBoxInjection () const override
 Per-box high-multiplicity injection (false for initialization and legacy per-cell injection). More...
 
int injectBoxCount () const override
 Number of super-droplets to inject in the whole box this step. More...
 
amrex::Real injectMultiplicity () const override
 Multiplicity of each super-droplet injected this step. More...
 
unsigned int injectSeed () const override
 Reproducible seed for scattering this step's super-droplets. More...
 
- Public Member Functions inherited from SDInitProperties
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...
 
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)
 
amrex::Real m_numdens_accum = zero
 
amrex::Real m_cell_volume = -1
 
int m_inject_num_sd = 0
 
amrex::Real m_inject_mult = zero
 
amrex::Real m_frac_tol = amrex::Real(1.0e-3)
 
amrex::Real m_min_multiplicity = 100
 
bool m_perbox = false
 
bool m_both_specified = false
 
bool m_ppc_specified = false
 
bool m_sd_specified = false
 
bool m_mm_specified = false
 
amrex::Real m_eff_sd_rate = -1
 
amrex::Real m_box_volume = -1
 
amrex::Real m_sd_accum = zero
 
unsigned int m_inject_count = 0
 
unsigned int m_inject_seed = 0
 
std::string m_prefix
 
- Public Attributes inherited from SDInitProperties
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
 

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

◆ injectBoxCount()

int SDInjection::injectBoxCount ( ) const
inlineoverridevirtual

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

Reimplemented from SDInitProperties.

834 { return m_inject_num_sd; }
int m_inject_num_sd
Definition: ERF_SDInitialization.H:656

◆ injectMultiplicity()

amrex::Real SDInjection::injectMultiplicity ( ) const
inlineoverridevirtual

Multiplicity of each super-droplet injected this step.

Reimplemented from SDInitProperties.

835 { return m_inject_mult; }
amrex::Real m_inject_mult
Definition: ERF_SDInitialization.H:658

◆ injectSeed()

unsigned int SDInjection::injectSeed ( ) const
inlineoverridevirtual

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

Reimplemented from SDInitProperties.

836 { return m_inject_seed; }
unsigned int m_inject_seed
Definition: ERF_SDInitialization.H:683

◆ numParticlesPerCell()

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

Number of physical particles to inject per cell this step. Equals num_sd * integer-multiplicity, decided in updateDt().

Implements SDInitProperties.

829  {
831  }
amrex::Real Real
Definition: ERF_ShocInterface.H:19

◆ numSDPerCell()

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

Number of super-droplets to inject per cell this step. Decided in updateDt() from the accumulated count (0 = inject nothing).

Implements SDInitProperties.

822  {
823  return m_inject_num_sd;
824  }

◆ perBoxInjection()

bool SDInjection::perBoxInjection ( ) const
inlineoverridevirtual

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

Reimplemented from SDInitProperties.

833 { return m_perbox; }
bool m_perbox
Definition: ERF_SDInitialization.H:666

◆ 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.

388 {
389  using namespace amrex;
390  Print() << " Injection rate (# m^{-3} s^{-1}): " << m_inj_rate << "\n"
391  << " Injection domain velocity [m/s]: "
392  << m_domain_vel[0] << ","
393  << m_domain_vel[1] << ","
394  << m_domain_vel[2] << "\n"
395  << " Time (start, stop) [s]: " << m_tstart << ", " << m_tstop << "\n";
396  if (m_perbox) {
397  if (m_both_specified) {
398  Print() << " Warning: sd_rate and min_multiplicity both specified for "
399  << m_prefix << "\n";
400  }
401  Print() << " Injection mode: per-box high-multiplicity\n"
402  << " SD injection rate (specified): " << m_sd_inj_rate << "\n"
403  << " Minimum multiplicity: " << m_min_multiplicity << "\n"
404  << " Effective SD injection rate (# m^{-3} s^{-1}): " << m_eff_sd_rate << "\n"
405  << " Implied multiplicity: "
406  << (m_eff_sd_rate > zero ? m_inj_rate / m_eff_sd_rate : zero) << "\n";
407  } else {
408  Print() << " Injection mode: per-cell (particles_per_cell)\n"
409  << " SD injection rate: " << m_sd_inj_rate << "\n";
410  }
411  Print() << " Fractional-accumulation tolerance: " << m_frac_tol << "\n";
412  SDInitProperties::printParameters(a_species_mat, a_aerosol_mat);
413 }
constexpr amrex::Real zero
Definition: ERF_Constants.H:8
virtual void printParameters(const MatVec &a_species_mat, const MatVec &a_aerosol_mat) const
Print super-droplets initialization parameters to screen.
Definition: ERF_SDInitialization.cpp:285
amrex::Real m_eff_sd_rate
Definition: ERF_SDInitialization.H:675
amrex::Real m_tstop
Definition: ERF_SDInitialization.H:646
amrex::Real m_sd_inj_rate
Definition: ERF_SDInitialization.H:634
amrex::Real m_tstart
Definition: ERF_SDInitialization.H:643
amrex::Real m_min_multiplicity
Definition: ERF_SDInitialization.H:663
amrex::Real m_frac_tol
Definition: ERF_SDInitialization.H:660
amrex::Real m_inj_rate
Definition: ERF_SDInitialization.H:632
bool m_both_specified
Definition: ERF_SDInitialization.H:668
std::string m_prefix
Definition: ERF_SDInitialization.H:685
amrex::Vector< amrex::Real > m_domain_vel
Definition: ERF_SDInitialization.H:640
Definition: ERF_ConsoleIO.cpp:15
Here is the call graph for this function:

◆ readInputs() [1/2]

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

read super-droplets injection parameters

Reimplemented from SDInitProperties.

795  {
796  amrex::Abort("SDInjection::readInputs(): Do not use this interface");
797  }

◆ readInputs() [2/2]

void SDInjection::readInputs ( SDInputs a_in,
const amrex::Geometry &  a_geom,
const MatVec a_species_mat,
const MatVec a_aerosol_mat,
const double  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_inTwo-tier input resolver
[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
240 {
241  BL_PROFILE("SDInjection::readInputs");
242 
243  SDInitProperties::readInputs( a_in, "", a_geom, a_species_mat, a_aerosol_mat);
244 
245  amrex::ignore_unused(a_dt);
246  using namespace amrex;
247 
248  m_prefix = a_in.m_block_name;
249  a_in.query("rate", m_inj_rate);
250  m_sd_specified = a_in.query("sd_rate", m_sd_inj_rate);
251  m_mm_specified = a_in.query("min_multiplicity", m_min_multiplicity);
252  a_in.query("t_start", m_tstart);
253  a_in.query("t_stop", m_tstop);
254  a_in.queryarr("domain_velocity", m_domain_vel);
255  a_in.query("fractional_tol", m_frac_tol);
256 
257  // Cell volume of the injection level, used to accumulate the per-cell count.
258  const auto dx = a_geom.CellSize();
259  m_cell_volume = dx[0]*dx[1]*dx[2];
260  m_box_volume = this->volume();
261 
262  // Injection mode: an explicit particles_per_cell selects the legacy per-cell
263  // path; otherwise inject in per-box high-multiplicity mode. The effective SD
264  // injection rate is taken from sd_rate or rate/min_multiplicity; if both are
265  // specified, the one giving fewer super-droplets (lower SD rate) is used.
266  // SDInitProperties::readInputs already read this key and published whether it
267  // came from the input file; reading it again here would find the default that
268  // read recorded and report it as user-specified.
271  if (m_perbox) {
274  m_both_specified = true;
275  } else if (m_sd_specified) {
277  m_both_specified = false;
278  } else {
280  m_both_specified = false;
281  }
282  }
283 }
const Real dx
Definition: ERF_InitCustomPert_ABL.H:44
amrex::Real volume() const
Calculate the volume of the particle domain.
Definition: ERF_SDInitialization.H:598
bool m_ppc_from_inputs
Definition: ERF_SDInitialization.H:232
virtual void readInputs(SDInputs &a_in, const std::string &a_key, const amrex::Geometry &a_geom, const MatVec &a_species_mat, const MatVec &a_aerosol_mat)
Read super-droplets initialization parameters from input file.
Definition: ERF_SDInitialization.cpp:76
bool m_mm_specified
Definition: ERF_SDInitialization.H:673
bool m_sd_specified
Definition: ERF_SDInitialization.H:672
bool m_ppc_specified
Definition: ERF_SDInitialization.H:671
amrex::Real m_box_volume
Definition: ERF_SDInitialization.H:677
amrex::Real m_cell_volume
Definition: ERF_SDInitialization.H:653
std::string m_block_name
Definition: ERF_SDInitialization.H:115
bool queryarr(const std::string &a_key, std::vector< T > &a_val)
Definition: ERF_SDInitialization.H:88
bool query(const std::string &a_key, T &a_val, const bool a_record=true)
Definition: ERF_SDInitialization.H:78
Here is the call graph for this function:

◆ updateDt()

void SDInjection::updateDt ( const double  a_dt,
const bool  a_active 
)
inline

Update time-dependent quantities for particle injection.

This function updates:

  1. The accumulated physical-particle count, and the integer number of super-droplets and their integer multiplicity to inject this step
  2. Position of the injection domain based on domain velocity

The number of super-droplets per cell is the specified count (m_ppc, or derived from the SD rate). The physical-particle count accumulates from the injection rate; a step injects only once each of those super-droplets would carry at least unit multiplicity, with integer multiplicity max(round(num_par/num_sd), 1). This lets sub-unity per-step injection rates be honored automatically, with no separate opt-in.

Parameters
[in]a_dtTimestep size in seconds
[in]a_activeTrue while the injection time window is open
705  {
706  using amrex::Real;
707 
708  if (m_perbox) {
709  // Per-box high-multiplicity injection: accumulate the box-level
710  // super-droplet and physical-particle counts. Inject floor(SD
711  // count) super-droplets at the implied multiplicity (= rate /
712  // eff_sd_rate) once at least one super-droplet is owed. This
713  // decouples the super-droplet count from the grid and bounds the
714  // population at physical/multiplicity.
715  if (a_active) {
717  m_numdens_accum += m_inj_rate * a_dt * m_box_volume; // physical count in box
718  }
719  if (a_active && m_sd_accum >= one - m_frac_tol) {
720  const int N = std::max(static_cast<int>(std::floor(m_sd_accum + m_frac_tol)), 1);
721  m_inject_mult = std::max(std::round(m_numdens_accum / N), one);
722  m_inject_num_sd = N;
723  m_sd_accum -= N;
726  } else {
727  m_inject_num_sd = 0;
729  }
730  } else {
731 
732  // Specified number of super-droplets per cell (m_ppc) or from the SD rate.
733  Real num_sd;
734  if (m_sd_inj_rate > 0) {
735  num_sd = std::max(Real(std::round(m_sd_inj_rate * a_dt * m_cell_volume)), one);
736  } else {
737  num_sd = std::max(Real(m_ppc), one);
738  }
739 
740  // Physical particles this step (per cell) and the resulting multiplicity.
741  const Real par_step = m_inj_rate * a_dt * m_cell_volume;
742  const Real mult_step = par_step / num_sd;
743 
744  if (!a_active) {
745  m_inject_num_sd = 0;
747  } else if (mult_step >= one) {
748  // Each super-droplet already carries at least unit multiplicity:
749  // inject the specified count every step (no accumulation).
750  m_inject_num_sd = static_cast<int>(num_sd);
751  m_inject_mult = std::max(std::round(mult_step), one);
753  } else {
754  // Sub-unity per-step multiplicity: accumulate the physical-particle
755  // count and inject only once it amounts to >= 1 multiplicity.
756  m_numdens_accum += m_inj_rate * a_dt;
757  const Real num_par = m_numdens_accum * m_cell_volume;
758  const Real mult = num_par / num_sd;
759  if (mult >= one - m_frac_tol) {
760  m_inject_mult = std::max(std::round(mult), one); // integer multiplicity
761  m_inject_num_sd = static_cast<int>(num_sd);
762  m_numdens_accum -= (num_sd * m_inject_mult) / m_cell_volume; // carry remainder
763  } else {
764  m_inject_num_sd = 0;
766  }
767  }
768 
769  }
770 
771  if (this->m_type == SDInitShape::uniform) {
772  amrex::Vector<amrex::Real> lo = {zero, zero, zero};
773  amrex::Vector<amrex::Real> hi = {zero, zero, zero};
774  for (int dir = 0; dir < AMREX_SPACEDIM; dir++) {
775  lo[dir] = this->m_particle_domain.lo(dir) + m_domain_vel[dir] * a_dt;
776  hi[dir] = this->m_particle_domain.hi(dir) + m_domain_vel[dir] * a_dt;
777  }
778  this->m_particle_domain.setLo(lo);
779  this->m_particle_domain.setHi(hi);
780  } else if (m_type == SDInitShape::bubble) {
781  amrex::Vector<amrex::Real> center = {zero, zero, zero};
782  for (int dir = 0; dir < AMREX_SPACEDIM; dir++) {
783  center[dir] = this->m_particle_domain.lo(dir) + m_domain_vel[dir] * a_dt;
784  }
785  this->m_particle_domain.setLo(center);
786  }
787  }
constexpr amrex::Real one
Definition: ERF_Constants.H:9
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
amrex::Real m_numdens_accum
Definition: ERF_SDInitialization.H:651
amrex::Real m_sd_accum
Definition: ERF_SDInitialization.H:679
unsigned int m_inject_count
Definition: ERF_SDInitialization.H:681

Member Data Documentation

◆ m_both_specified

bool SDInjection::m_both_specified = false

Whether each knob was specified in any readInputs call (the resolver reports this exactly, in a single pass).

◆ m_box_volume

amrex::Real SDInjection::m_box_volume = -1

Accumulated super-droplet count owed to the box (per-box mode)

Referenced by updateDt().

◆ m_cell_volume

amrex::Real SDInjection::m_cell_volume = -1

Number of super-droplets to inject this step (0 = none). Per cell in legacy mode; per box in per-box high-multiplicity mode.

Referenced by updateDt().

◆ m_domain_vel

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

Start time for injection

Referenced by updateDt().

◆ m_eff_sd_rate

amrex::Real SDInjection::m_eff_sd_rate = -1

Injection-box volume [m^3], set from the box at read time

Referenced by updateDt().

◆ m_frac_tol

amrex::Real SDInjection::m_frac_tol = amrex::Real(1.0e-3)

Minimum multiplicity for per-box injection (default 100)

Referenced by updateDt().

◆ m_inj_rate

amrex::Real SDInjection::m_inj_rate = 0

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

Referenced by updateDt().

◆ m_inject_count

unsigned int SDInjection::m_inject_count = 0

Reproducible seed for scattering this step's super-droplets

Referenced by updateDt().

◆ m_inject_mult

amrex::Real SDInjection::m_inject_mult = zero

Tolerance below 1 at which an accumulated injection fires

Referenced by injectMultiplicity(), numParticlesPerCell(), and updateDt().

◆ m_inject_num_sd

int SDInjection::m_inject_num_sd = 0

Integer multiplicity of each super-droplet injected this step

Referenced by injectBoxCount(), numParticlesPerCell(), numSDPerCell(), and updateDt().

◆ m_inject_seed

unsigned int SDInjection::m_inject_seed = 0

Input prefix (e.g. injection.0) for diagnostic messages

Referenced by injectSeed(), and updateDt().

◆ m_min_multiplicity

amrex::Real SDInjection::m_min_multiplicity = 100

Per-box high-multiplicity injection mode (set when particles_per_cell is not specified)

◆ m_mm_specified

bool SDInjection::m_mm_specified = false

Effective SD injection rate [# m^-3 s^-1] used in per-box mode

◆ m_numdens_accum

amrex::Real SDInjection::m_numdens_accum = zero

Injection-level cell volume [m^3], set from geometry at read time

Referenced by updateDt().

◆ m_numdens_sd

amrex::Real SDInjection::m_numdens_sd = -1

Injection domain velocity

◆ m_perbox

bool SDInjection::m_perbox = false

True when both sd_rate and min_multiplicity are explicitly specified

Referenced by perBoxInjection(), and updateDt().

◆ m_ppc_specified

bool SDInjection::m_ppc_specified = false

◆ m_prefix

std::string SDInjection::m_prefix

◆ m_sd_accum

amrex::Real SDInjection::m_sd_accum = zero

Count of injection events so far, used as a reproducible scatter seed

Referenced by updateDt().

◆ m_sd_inj_rate

amrex::Real SDInjection::m_sd_inj_rate = 0

Initial number density of super-droplets

Referenced by updateDt().

◆ m_sd_specified

bool SDInjection::m_sd_specified = false

◆ m_tstart

amrex::Real SDInjection::m_tstart = zero

Stop time for injection

◆ m_tstop

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

Accumulated physical-particle number density [m^-3]. When the per-cell injection rate is sub-unity, the fractional part is carried here until it amounts to at least one super-droplet of unit multiplicity.


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