ERF
Energy Research and Forecasting: An Atmospheric Modeling Code
ERF_SDInitialization.H File Reference
#include <string>
#include <vector>
#include <random>
#include <AMReX_ParmParse.H>
#include <AMReX_Enum.H>
#include <AMReX_REAL.H>
#include <AMReX_RealBox.H>
#include <AMReX_Geometry.H>
#include <AMReX_Random.H>
#include <AMReX_GpuContainers.H>
#include "ERF_Constants.H"
#include "ERF_MaterialProperties.H"
Include dependency graph for ERF_SDInitialization.H:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

struct  SDDistributionParams
 GPU-compatible structure holding distribution parameters. More...
 
class  SDInitProperties
 Super-droplets initial properties. More...
 
class  SDInjection
 Super-droplets initialization structure. More...
 
class  SDInitialization
 Super-droplets initialization structure. More...
 

Namespaces

 SupDropInit
 List of super-droplet initializations.
 

Functions

 AMREX_ENUM (SDInitShape, uniform, bubble, null)
 
 AMREX_ENUM (SDDistributionType, mass_constant, mass_exponential, radius_log_normal, radius_lognormal_autorange)
 Distribution type enum for GPU compatibility. More...
 
 AMREX_ENUM (SDMultiplicityType, constant, sampled)
 
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real SD_erfinv_gpu (const amrex::Real x)
 Inverse error function approximation for GPU. More...
 
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real SD_sample_mass_gpu (const SDDistributionParams &params, const amrex::RandomEngine &engine, amrex::Real &mult_contribution)
 Generate mass from distribution parameters on GPU. More...
 

Variables

const int SupDropInit::num_species_max = 10
 
const int SupDropInit::num_aerosols_max = 8
 

Function Documentation

◆ AMREX_ENUM() [1/3]

AMREX_ENUM ( SDDistributionType  ,
mass_constant  ,
mass_exponential  ,
radius_log_normal  ,
radius_lognormal_autorange   
)

Distribution type enum for GPU compatibility.

◆ AMREX_ENUM() [2/3]

AMREX_ENUM ( SDInitShape  ,
uniform  ,
bubble  ,
null   
)

◆ AMREX_ENUM() [3/3]

AMREX_ENUM ( SDMultiplicityType  ,
constant  ,
sampled   
)

◆ SD_erfinv_gpu()

AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real SD_erfinv_gpu ( const amrex::Real  x)

Inverse error function approximation for GPU.

Parameters
[in]xInput value in (-1, 1)
Returns
Approximate inverse error function value
75  {
76  amrex::Real a = 0.147;
78  amrex::Real term = std::log(1 - x * x + eps);
79  amrex::Real p1 = 2 / (PI * a) + term / 2.0;
80  amrex::Real p2 = term / a;
81  amrex::Real sign = (x >= 0) ? 1.0 : -1.0;
82  return sign * std::sqrt(std::sqrt(p1 * p1 - p2) - p1);
83 }
constexpr amrex::Real PI
Definition: ERF_Constants.H:16
amrex::Real Real
Definition: ERF_ShocInterface.H:19
real(c_double), parameter epsilon
Definition: ERF_module_model_constants.F90:12

Referenced by SD_sample_mass_gpu().

Here is the caller graph for this function:

◆ SD_sample_mass_gpu()

AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real SD_sample_mass_gpu ( const SDDistributionParams params,
const amrex::RandomEngine &  engine,
amrex::Real mult_contribution 
)

Generate mass from distribution parameters on GPU.

Parameters
[in]paramsDistribution parameters
[in]engineRandom engine
[out]mult_contributionContribution to multiplicity (added, not set)
Returns
Generated mass value
95 {
96  using amrex::Random;
97  amrex::Real mass = 0.0;
98  amrex::Real u = Random(engine);
99 
100  switch (params.dist_type) {
101  case SDDistributionType::mass_constant:
102  mass = params.mass_mean;
103  mult_contribution = u; // Random [0,1] for later rescaling
104  break;
105 
106  case SDDistributionType::mass_exponential: {
107  if (params.sampled_mult) {
108  // Sampled multiplicity: sample uniformly in log-space, weight by exponential PDF
109  amrex::Real lnval = params.lnmin + u * params.lnrng;
110  mass = std::exp(lnval);
111  mult_contribution = (params.numdens * params.cell_volume) * std::exp(-mass / params.delta);
112  } else {
113  // Constant multiplicity: true exponential distribution via inverse transform
114  // If U ~ Uniform(0,1), then -delta*ln(U) ~ Exponential(1/delta)
115  mass = -params.delta * std::log(u) + params.mass_min;
116  mult_contribution = 0.0; // Not used for constant multiplicity
117  }
118  break;
119  }
120 
121  case SDDistributionType::radius_log_normal:
122  case SDDistributionType::radius_lognormal_autorange: {
123  amrex::Real dry_r;
124  if (params.sampled_mult) {
125  // Sampled multiplicity: sample uniformly in log-space, weight by log-normal PDF
126  amrex::Real lnval = params.lnmin + u * params.lnrng;
127  dry_r = std::exp(lnval);
128  // Log-normal PDF contribution for multiplicity weighting
129  amrex::Real term = std::exp(-std::log(dry_r/params.radius_mean)*std::log(dry_r/params.radius_mean)
130  /(2.0*params.sigma*params.sigma));
131  mult_contribution = (params.numdens * params.cell_volume) / (params.sigma * std::sqrt(2.0*PI)) * term;
132  } else {
133  // Constant multiplicity: true log-normal via inverse CDF
134  // Map u from [0,1] to [cdf_min, cdf_max] for truncated distribution
135  amrex::Real u_trunc = params.cdf_min + u * (params.cdf_max - params.cdf_min);
136  // Inverse CDF: r = mu * exp(sigma * sqrt(2) * erfinv(2*u - 1))
137  amrex::Real z = SD_erfinv_gpu(2.0 * u_trunc - 1.0) * std::sqrt(2.0);
138  dry_r = params.radius_mean * std::exp(params.sigma * z);
139  mult_contribution = 0.0; // Not used for constant multiplicity
140  }
141  mass = four_thirds_pi * dry_r * dry_r * dry_r * params.density;
142  break;
143  }
144  }
145  return mass;
146 }
constexpr amrex::Real four_thirds_pi
Definition: ERF_Constants.H:18
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real SD_erfinv_gpu(const amrex::Real x)
Inverse error function approximation for GPU.
Definition: ERF_SDInitialization.H:75
amrex::Real numdens
Definition: ERF_SDInitialization.H:58
amrex::Real mass_mean
Definition: ERF_SDInitialization.H:52
amrex::Real sigma
Definition: ERF_SDInitialization.H:63
amrex::Real delta
Definition: ERF_SDInitialization.H:66
amrex::Real cdf_max
Definition: ERF_SDInitialization.H:62
amrex::Real radius_mean
Definition: ERF_SDInitialization.H:55
amrex::Real lnmin
Definition: ERF_SDInitialization.H:65
amrex::Real cell_volume
Definition: ERF_SDInitialization.H:59
amrex::Real lnrng
Definition: ERF_SDInitialization.H:64
amrex::Real density
Definition: ERF_SDInitialization.H:57
int sampled_mult
Definition: ERF_SDInitialization.H:67
SDDistributionType dist_type
Definition: ERF_SDInitialization.H:49
amrex::Real cdf_min
Definition: ERF_SDInitialization.H:61
amrex::Real mass_min
Definition: ERF_SDInitialization.H:50
Here is the call graph for this function: