ERF
Energy Research and Forecasting: An Atmospheric Modeling Code
erf_auxiliary Namespace Reference

Classes

class  AuxiliaryInertTracer
 
struct  MappedFaceFluxRateTag
 
struct  IntegratedMappedFaceFluxTag
 
class  MappedFaceField
 
struct  ProjectionRule
 
struct  ProjectionValidation
 
class  AuxiliaryProjection
 
struct  ConstTimedFieldView
 
struct  MutableTimedFieldView
 
struct  HostCarrierFluxView
 
struct  AuxiliaryStageRecipe
 
struct  AuxiliaryStageContext
 
class  CompletedStepFluxLedger
 
struct  ComponentDescriptor
 
class  AuxiliaryStateLayout
 

Typedefs

using MappedFaceFluxRate = MappedFaceField< MappedFaceFluxRateTag >
 
using IntegratedMappedFaceFlux = MappedFaceField< IntegratedMappedFaceFluxTag >
 

Enumerations

enum class  ProjectionTargetKind { BulkCoupling , Vapor , Number , AttachedMaterial }
 
enum class  ProjectionSourceKind { AuxiliaryMass , AuxiliaryNumber , AttachedMaterial }
 
enum class  HostIntegrator { CompressibleRK3 , AnelasticHeun , AnelasticMidPoint }
 
enum class  LimiterTrialBase { Anchor , Input }
 
enum class  AuxiliaryFieldValidationPolicy { Global , AssumeValid }
 

Functions

bool SameCellLayout (const amrex::MultiFab &lhs, const amrex::MultiFab &rhs)
 
bool BuildMappedCellMeasure (amrex::MultiFab &omega, const amrex::MultiFab &detJ, const amrex::MultiFab &mx, const amrex::MultiFab &my, std::string &diagnostic)
 
bool BuildMappedDryAirCarrierFluxRate (MappedFaceFluxRate &rate, const amrex::MultiFab &rho_u, const amrex::MultiFab &rho_v, const amrex::MultiFab &omega, const amrex::MultiFab &ax, const amrex::MultiFab &ay, const amrex::MultiFab &az, const amrex::MultiFab &mf_uy, const amrex::MultiFab &mf_vx, const amrex::MultiFab &mx, const amrex::MultiFab &my, std::string &diagnostic)
 
bool CopyNativeMappedDryAirCarrierFluxRate (MappedFaceFluxRate &rate, const amrex::MultiFab &rho_u, const amrex::MultiFab &rho_v, const amrex::MultiFab &rho_w, std::string &diagnostic)
 
bool ComputeMaxMappedOutgoingRate (const MappedFaceFluxRate &rate, const amrex::MultiFab &measure, const amrex::MultiFab &conserved, const int density_component, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &dx_inv, amrex::Real &max_rate, std::string &diagnostic)
 
bool FixedDtExceedsMappedDonorLimit (const double fixed_dt, const amrex::Real max_outgoing_rate, double &hard_limit) noexcept
 
bool ValidatePositiveFiniteComponent (const amrex::MultiFab &field, const int component, std::string &diagnostic)
 
bool ValidateFiniteComponent (const amrex::MultiFab &field, const int component, std::string &diagnostic)
 
amrex::Real MaxFaceFieldDifference (const MappedFaceFluxRate &lhs, const int lhs_comp, const MappedFaceFluxRate &rhs, const int rhs_comp)
 
void AccumulateIntegratedFaceFlux (IntegratedMappedFaceFlux &ledger, const MappedFaceFluxRate &rate, const amrex::Real weight)
 
template<typename Tag >
bool MappedFaceLayoutMatchesCellLayout (const MappedFaceField< Tag > &faces, const amrex::BoxArray &cell_ba, const amrex::DistributionMapping &dm)
 
template<typename Tag >
bool MappedFaceLayoutMatchesCellLayout (const MappedFaceField< Tag > &faces, const amrex::MultiFab &cell)
 
template<typename LhsTag , typename RhsTag >
bool SameMappedFaceLayout (const MappedFaceField< LhsTag > &lhs, const MappedFaceField< RhsTag > &rhs)
 
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real ComputationalMappedDivergence (const amrex::Real fx_hi, const amrex::Real fx_lo, const amrex::Real fy_hi, const amrex::Real fy_lo, const amrex::Real fz_hi, const amrex::Real fz_lo, const amrex::Real dx_inv, const amrex::Real dy_inv, const amrex::Real dzeta_inv) noexcept
 
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real MappedOutgoingDemandRate (const amrex::Real fx_hi, const amrex::Real fx_lo, const amrex::Real fy_hi, const amrex::Real fy_lo, const amrex::Real fz_hi, const amrex::Real fz_lo, const amrex::Real measure, const amrex::Real density, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &dx_inv) noexcept
 
template<typename Tag >
void ApplyMappedFluxTendency (const MappedFaceField< Tag > &flux, const int flux_comp, const amrex::MultiFab &omega, const int omega_comp, amrex::MultiFab &tendency, const int tendency_comp, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &dx_inv)
 
const char * HostIntegratorName (const HostIntegrator method) noexcept
 
bool MakeAuxiliaryStageRecipe (const HostIntegrator method, const int stage, const double host_stage_interval, AuxiliaryStageRecipe &recipe, std::string &diagnostic)
 
bool BuildAuxiliaryIntensiveState (const ConstTimedFieldView &state_input, const ConstTimedFieldView &rho_input, const double input_time, amrex::MultiFab &intensive, const AuxiliaryFieldValidationPolicy validation, std::string &diagnostic)
 
bool AuxiliaryStageTargetIsDisjoint (const AuxiliaryStageContext &context)
 
void ApplyAuxiliaryMappedStage (const AuxiliaryStageContext &context, const MappedFaceFluxRate &rate, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &dx_inv, const int rate_component)
 

Typedef Documentation

◆ IntegratedMappedFaceFlux

◆ MappedFaceFluxRate

Enumeration Type Documentation

◆ AuxiliaryFieldValidationPolicy

Enumerator
Global 

Perform global positive-density and finite-result validation.

AssumeValid 

Skip global checks. The caller guarantees every input state value is finite, density is finite and strictly positive, and each state/density quotient is finite and representable in amrex::Real. No global reduction is performed by this policy.

50  {
51  /** Perform global positive-density and finite-result validation. */
52  Global,
53  /**
54  * Skip global checks. The caller guarantees every input state value is
55  * finite, density is finite and strictly positive, and each state/density
56  * quotient is finite and representable in amrex::Real. No global
57  * reduction is performed by this policy.
58  */
60 };

◆ HostIntegrator

Enumerator
CompressibleRK3 
AnelasticHeun 
AnelasticMidPoint 

◆ LimiterTrialBase

State view that bounds the low-order limiter trial for this host stage.

Enumerator
Anchor 
Input 

◆ ProjectionSourceKind

◆ ProjectionTargetKind

Function Documentation

◆ AccumulateIntegratedFaceFlux()

void erf_auxiliary::AccumulateIntegratedFaceFlux ( IntegratedMappedFaceFlux &  ledger,
const MappedFaceFluxRate &  rate,
amrex::Real  weight 
)

Scale every component and direction of a flux rate into an integrated ledger.

381 {
382  AMREX_ALWAYS_ASSERT(ledger.is_defined() && rate.is_defined());
383  AMREX_ALWAYS_ASSERT(ledger.nComp() == rate.nComp());
385  AMREX_ALWAYS_ASSERT(std::isfinite(weight) && weight >= amrex::Real(0.0));
386  for (int dir = 0; dir < AMREX_SPACEDIM; ++dir) {
387  amrex::MultiFab::Saxpy(ledger.dir(dir), weight, rate.dir(dir),
388  0, 0, ledger.nComp(), 0);
389  }
390 }
AMREX_ALWAYS_ASSERT(bx.length()[2]==khi+1)
amrex::Real Real
Definition: ERF_ShocInterface.H:19
bool SameMappedFaceLayout(const MappedFaceField< LhsTag > &lhs, const MappedFaceField< RhsTag > &rhs)
Definition: ERF_AuxiliaryMappedTransport.H:104
Here is the call graph for this function:

◆ ApplyAuxiliaryMappedStage()

void erf_auxiliary::ApplyAuxiliaryMappedStage ( const AuxiliaryStageContext &  context,
const MappedFaceFluxRate &  rate,
const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &  dx_inv,
int  rate_component = 0 
)

Apply H_target = a H_anchor + b H_input - c D_xi(F_rate).

173 {
174  AMREX_ALWAYS_ASSERT(context.level >= 0 && context.stage >= 0);
175  AMREX_ALWAYS_ASSERT(std::isfinite(context.step_old_time));
176  AMREX_ALWAYS_ASSERT(std::isfinite(context.input_time));
177  AMREX_ALWAYS_ASSERT(std::isfinite(context.target_time));
178  AMREX_ALWAYS_ASSERT(valid_const_view(context.state_anchor, context.step_old_time));
179  AMREX_ALWAYS_ASSERT(valid_const_view(context.state_input, context.input_time));
180  AMREX_ALWAYS_ASSERT(context.state_target.field != nullptr);
181  AMREX_ALWAYS_ASSERT(context.state_target.component >= 0 &&
182  context.state_target.component < context.state_target.field->nComp());
183  AMREX_ALWAYS_ASSERT(std::isfinite(context.state_target.time) &&
184  context.state_target.time == context.target_time);
185  AMREX_ALWAYS_ASSERT(valid_const_view(context.rho_anchor, context.step_old_time));
186  AMREX_ALWAYS_ASSERT(valid_const_view(context.rho_input, context.input_time));
187  AMREX_ALWAYS_ASSERT(valid_const_view(context.rho_target, context.target_time));
188  AMREX_ALWAYS_ASSERT(valid_const_view(context.measure_anchor, context.step_old_time));
189  AMREX_ALWAYS_ASSERT(valid_const_view(context.measure_input, context.input_time));
190  AMREX_ALWAYS_ASSERT(valid_const_view(context.measure_target, context.target_time));
191  AMREX_ALWAYS_ASSERT(context.carrier.x != nullptr && context.carrier.y != nullptr &&
192  context.carrier.z != nullptr);
193  AMREX_ALWAYS_ASSERT(rate.is_defined() && rate_component >= 0 &&
194  rate_component < rate.nComp());
196 
197  const auto& target = *context.state_target.field;
198  const auto& anchor = *context.state_anchor.field;
199  const auto& input = *context.state_input.field;
200  const auto& omega_anchor = *context.measure_anchor.field;
201  const auto& omega_input = *context.measure_input.field;
202  const auto& omega_target = *context.measure_target.field;
203  AMREX_ALWAYS_ASSERT(SameCellLayout(target, anchor));
204  AMREX_ALWAYS_ASSERT(SameCellLayout(target, input));
205  AMREX_ALWAYS_ASSERT(SameCellLayout(target, *context.rho_anchor.field));
206  AMREX_ALWAYS_ASSERT(SameCellLayout(target, *context.rho_input.field));
207  AMREX_ALWAYS_ASSERT(SameCellLayout(target, *context.rho_target.field));
208  AMREX_ALWAYS_ASSERT(SameCellLayout(target, omega_anchor));
209  AMREX_ALWAYS_ASSERT(SameCellLayout(target, omega_input));
210  AMREX_ALWAYS_ASSERT(SameCellLayout(target, omega_target));
212 
213  const amrex::Real anchor_weight = static_cast<amrex::Real>(context.recurrence.anchor_weight);
214  const amrex::Real input_weight = static_cast<amrex::Real>(context.recurrence.input_weight);
215  const amrex::Real face_weight =
216  static_cast<amrex::Real>(context.recurrence.face_rate_time_coefficient);
217  const amrex::Real dx = dx_inv[0];
218  const amrex::Real dy = dx_inv[1];
219  const amrex::Real dz = dx_inv[2];
220 
221  for (amrex::MFIter mfi(target, amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi) {
222  const amrex::Box bx = mfi.tilebox();
223  const auto ua = anchor.const_array(mfi);
224  const auto ui = input.const_array(mfi);
225  const auto ut = context.state_target.field->array(mfi);
226  const auto oa = omega_anchor.const_array(mfi);
227  const auto oi = omega_input.const_array(mfi);
228  const auto omega_target_array = omega_target.const_array(mfi);
229  const auto fx = rate.dir(0).const_array(mfi);
230  const auto fy = rate.dir(1).const_array(mfi);
231  const auto fz = rate.dir(2).const_array(mfi);
232  const int ua_comp = context.state_anchor.component;
233  const int ui_comp = context.state_input.component;
234  const int ut_comp = context.state_target.component;
235  const int oa_comp = context.measure_anchor.component;
236  const int oi_comp = context.measure_input.component;
237  const int omega_target_component = context.measure_target.component;
238  amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(int i, int j, int k) noexcept {
240  fx(i + 1, j, k, rate_component), fx(i, j, k, rate_component),
241  fy(i, j + 1, k, rate_component), fy(i, j, k, rate_component),
242  fz(i, j, k + 1, rate_component), fz(i, j, k, rate_component),
243  dx, dy, dz);
244  const amrex::Real h_target =
245  anchor_weight * oa(i, j, k, oa_comp) * ua(i, j, k, ua_comp) +
246  input_weight * oi(i, j, k, oi_comp) * ui(i, j, k, ui_comp) -
247  face_weight * div;
248  ut(i, j, k, ut_comp) = h_target /
249  omega_target_array(i, j, k, omega_target_component);
250  });
251  }
252 }
const Real dy
Definition: ERF_InitCustomPert_ABL.H:45
const Real dx
Definition: ERF_InitCustomPert_ABL.H:44
ParallelFor(fab_box, [=] AMREX_GPU_DEVICE(int i, int j, int k) { qrcuten_arr(i, j, k)=Real(0);qscuten_arr(i, j, k)=Real(0);qicuten_arr(i, j, k)=Real(0);})
@ dz
Definition: ERF_AdvanceWDM6.cpp:272
bool AuxiliaryStageTargetIsDisjoint(const AuxiliaryStageContext &context)
Definition: ERF_AuxiliaryStage.cpp:160
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real ComputationalMappedDivergence(const amrex::Real fx_hi, const amrex::Real fx_lo, const amrex::Real fy_hi, const amrex::Real fy_lo, const amrex::Real fz_hi, const amrex::Real fz_lo, const amrex::Real dx_inv, const amrex::Real dy_inv, const amrex::Real dzeta_inv) noexcept
Definition: ERF_AuxiliaryMappedTransport.H:119
bool MappedFaceLayoutMatchesCellLayout(const MappedFaceField< Tag > &faces, const amrex::BoxArray &cell_ba, const amrex::DistributionMapping &dm)
Definition: ERF_AuxiliaryMappedTransport.H:79
bool SameCellLayout(const amrex::MultiFab &lhs, const amrex::MultiFab &rhs)
Definition: ERF_AuxiliaryMappedTransport.cpp:36

Referenced by erf_sbm::SBMTransport::advance_stage(), and erf_auxiliary::AuxiliaryInertTracer::advance_stage().

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

◆ ApplyMappedFluxTendency()

template<typename Tag >
void erf_auxiliary::ApplyMappedFluxTendency ( const MappedFaceField< Tag > &  flux,
const int  flux_comp,
const amrex::MultiFab &  omega,
const int  omega_comp,
amrex::MultiFab &  tendency,
const int  tendency_comp,
const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &  dx_inv 
)

Apply -D_xi(flux)/omega into one selected output component. The supplied face values are already in ERF's mapped coordinate convention.

224 {
225  AMREX_ALWAYS_ASSERT(flux.is_defined());
226  AMREX_ALWAYS_ASSERT(flux_comp >= 0 && flux_comp < flux.nComp());
227  AMREX_ALWAYS_ASSERT(omega_comp >= 0 && omega_comp < omega.nComp());
228  AMREX_ALWAYS_ASSERT(tendency_comp >= 0 && tendency_comp < tendency.nComp());
231 
232  for (amrex::MFIter mfi(tendency, amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi) {
233  const amrex::Box bx = mfi.tilebox();
234  const auto fx = flux.dir(0).const_array(mfi);
235  const auto fy = flux.dir(1).const_array(mfi);
236  const auto fz = flux.dir(2).const_array(mfi);
237  const auto measure = omega.const_array(mfi);
238  const auto out = tendency.array(mfi);
239  const auto dx = dx_inv[0];
240  const auto dy = dx_inv[1];
241  const auto dz = dx_inv[2];
242 
243  amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(int i, int j, int k) noexcept {
245  fx(i + 1, j, k, flux_comp), fx(i, j, k, flux_comp),
246  fy(i, j + 1, k, flux_comp), fy(i, j, k, flux_comp),
247  fz(i, j, k + 1, flux_comp), fz(i, j, k, flux_comp),
248  dx, dy, dz);
249  out(i, j, k, tendency_comp) = -div / measure(i, j, k, omega_comp);
250  });
251  }
252 }
@ omega
Definition: ERF_Morrison.H:55
bool MappedFaceLayoutMatchesCellLayout(const MappedFaceField< Tag > &faces, const amrex::MultiFab &cell)
Definition: ERF_AuxiliaryMappedTransport.H:96
Here is the call graph for this function:

◆ AuxiliaryStageTargetIsDisjoint()

bool erf_auxiliary::AuxiliaryStageTargetIsDisjoint ( const AuxiliaryStageContext &  context)

Whether the mutable stage target is a distinct MultiFab from both inputs.

161 {
162  return context.state_target.field != nullptr &&
163  (context.state_anchor.field == nullptr ||
164  !storage_overlaps(*context.state_target.field, *context.state_anchor.field)) &&
165  (context.state_input.field == nullptr ||
166  !storage_overlaps(*context.state_target.field, *context.state_input.field));
167 }

Referenced by ApplyAuxiliaryMappedStage().

Here is the caller graph for this function:

◆ BuildAuxiliaryIntensiveState()

bool erf_auxiliary::BuildAuxiliaryIntensiveState ( const ConstTimedFieldView &  state_input,
const ConstTimedFieldView &  rho_input,
double  input_time,
amrex::MultiFab &  intensive,
AuxiliaryFieldValidationPolicy  validation,
std::string &  diagnostic 
)

Form z=U_input/rho_input from the explicit input-time views.

119 {
120  diagnostic.clear();
121  if (!std::isfinite(input_time) ||
122  !valid_const_view(state_input, input_time) ||
123  !valid_const_view(rho_input, input_time)) {
124  diagnostic = "auxiliary intensive state requires state and density views at input_time";
125  return false;
126  }
127  if (!SameCellLayout(intensive, *state_input.field) ||
128  !SameCellLayout(intensive, *rho_input.field) ||
129  intensive.nComp() < 1) {
130  diagnostic = "auxiliary intensive state fields must share a cell layout";
131  return false;
132  }
133  if (validation == AuxiliaryFieldValidationPolicy::Global) {
134  if (!ValidatePositiveFiniteComponent(*rho_input.field, rho_input.component, diagnostic)) {
135  return false;
136  }
137  } else if (validation != AuxiliaryFieldValidationPolicy::AssumeValid) {
138  diagnostic = "auxiliary intensive state received an unknown validation policy";
139  return false;
140  }
141  for (amrex::MFIter mfi(intensive, amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi) {
142  const amrex::Box bx = mfi.tilebox();
143  const auto state = state_input.field->const_array(mfi);
144  const auto rho = rho_input.field->const_array(mfi);
145  const auto out = intensive.array(mfi);
146  const int state_comp = state_input.component;
147  const int rho_comp = rho_input.component;
148  amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(int i, int j, int k) noexcept {
149  out(i, j, k, 0) = state(i, j, k, state_comp) / rho(i, j, k, rho_comp);
150  });
151  }
152  if (validation == AuxiliaryFieldValidationPolicy::Global) {
153  if (!ValidateFiniteComponent(intensive, 0, diagnostic)) {
154  return false;
155  }
156  }
157  return true;
158 }
@ rho
Definition: ERF_Kessler.H:25
bool ValidateFiniteComponent(const amrex::MultiFab &field, const int component, std::string &diagnostic)
Definition: ERF_AuxiliaryMappedTransport.cpp:322
bool ValidatePositiveFiniteComponent(const amrex::MultiFab &field, const int component, std::string &diagnostic)
Definition: ERF_AuxiliaryMappedTransport.cpp:294

Referenced by erf_auxiliary::AuxiliaryInertTracer::advance_stage().

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

◆ BuildMappedCellMeasure()

bool erf_auxiliary::BuildMappedCellMeasure ( amrex::MultiFab &  omega,
const amrex::MultiFab &  detJ,
const amrex::MultiFab &  mx,
const amrex::MultiFab &  my,
std::string &  diagnostic 
)

Build omega=detJ/(mx*my), returning false and a diagnostic on invalid cells.

47 {
48  diagnostic.clear();
49  if (omega.nComp() != 1 || detJ.nComp() < 1 || mx.nComp() < 1 || my.nComp() < 1 ||
50  !SameCellLayout(omega, detJ) || !same_horizontal_layout(omega, mx) ||
51  !same_horizontal_layout(omega, my) ||
52  mx.boxArray() != my.boxArray() || mx.DistributionMap() != my.DistributionMap()) {
53  diagnostic = "mapped measure requires a cell-centered Jacobian, matching horizontal map-factor layouts, and one output component";
54  return false;
55  }
56 
57  amrex::MultiFab invalid(omega.boxArray(), omega.DistributionMap(), 1, 0);
58  invalid.setVal(amrex::Real(0.0));
59  for (amrex::MFIter mfi(omega, amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi) {
60  const amrex::Box bx = mfi.tilebox();
61  const auto det = detJ.const_array(mfi);
62  const auto map_x = mx.const_array(mfi);
63  const auto map_y = my.const_array(mfi);
64  const auto out = omega.array(mfi);
65  const auto bad = invalid.array(mfi);
66  amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(int i, int j, int k) noexcept {
67  const amrex::Real d = det(i, j, k, 0);
68  // ERF's horizontal map factors are vertically invariant and all
69  // native mapped divergence paths read them from k=0.
70  const amrex::Real x = map_x(i, j, 0, 0);
71  const amrex::Real y = map_y(i, j, 0, 0);
72  const amrex::Real measure = d / (x * y);
73  const bool valid = amrex::Math::isfinite(d) && d > amrex::Real(0.0) &&
74  amrex::Math::isfinite(x) && x > amrex::Real(0.0) &&
75  amrex::Math::isfinite(y) && y > amrex::Real(0.0) &&
76  amrex::Math::isfinite(measure) && measure > amrex::Real(0.0);
77  out(i, j, k, 0) = valid ? measure : amrex::Real(0.0);
78  bad(i, j, k, 0) = valid ? amrex::Real(0.0) : amrex::Real(1.0);
79  });
80  }
81 
82  const amrex::Real invalid_count = invalid.sum(0);
83  if (invalid_count != amrex::Real(0.0)) {
84  diagnostic = "detJ, horizontal map factors, and mapped measure must be finite and positive";
85  return false;
86  }
87  return true;
88 }
Definition: ERF_ConsoleIO.cpp:17

Referenced by erf_auxiliary::AuxiliaryInertTracer::rebuild_static_measure(), and erf_sbm::SBMTransport::rebuild_static_measure().

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

◆ BuildMappedDryAirCarrierFluxRate()

bool erf_auxiliary::BuildMappedDryAirCarrierFluxRate ( MappedFaceFluxRate &  rate,
const amrex::MultiFab &  rho_u,
const amrex::MultiFab &  rho_v,
const amrex::MultiFab &  omega,
const amrex::MultiFab &  ax,
const amrex::MultiFab &  ay,
const amrex::MultiFab &  az,
const amrex::MultiFab &  mf_uy,
const amrex::MultiFab &  mf_vx,
const amrex::MultiFab &  mx,
const amrex::MultiFab &  my,
std::string &  diagnostic 
)

Build the production mapped dry-air face rates from face momentum and metrics.

103 {
104  diagnostic.clear();
105  if (!rate.is_defined() || rate.nComp() != 1 || rho_u.nComp() < 1 ||
106  rho_v.nComp() < 1 || omega.nComp() < 1 || ax.nComp() < 1 ||
107  ay.nComp() < 1 || az.nComp() < 1 || mf_uy.nComp() < 1 ||
108  mf_vx.nComp() < 1 || mx.nComp() < 1 || my.nComp() < 1 ||
109  rho_u.boxArray() != rate.dir(0).boxArray() ||
110  rho_u.DistributionMap() != rate.dir(0).DistributionMap() ||
111  ax.boxArray() != rate.dir(0).boxArray() ||
112  ax.DistributionMap() != rate.dir(0).DistributionMap() ||
113  rho_v.boxArray() != rate.dir(1).boxArray() ||
114  rho_v.DistributionMap() != rate.dir(1).DistributionMap() ||
115  ay.boxArray() != rate.dir(1).boxArray() ||
116  ay.DistributionMap() != rate.dir(1).DistributionMap() ||
117  omega.boxArray() != rate.dir(2).boxArray() ||
118  omega.DistributionMap() != rate.dir(2).DistributionMap() ||
119  az.boxArray() != rate.dir(2).boxArray() ||
120  az.DistributionMap() != rate.dir(2).DistributionMap() ||
121  !same_horizontal_layout(rate.dir(0), mf_uy) ||
122  !same_horizontal_layout(rate.dir(1), mf_vx) ||
123  mx.boxArray() != my.boxArray() ||
124  mx.DistributionMap() != my.DistributionMap() ||
125  !same_horizontal_layout(rate.dir(2), mx) ||
126  !same_horizontal_layout(rate.dir(2), my)) {
127  diagnostic = "mapped dry-air carrier rates require matching staggered momentum, area, map-factor, and output layouts";
128  return false;
129  }
130 
131  for (amrex::MFIter mfi(rate.dir(0), amrex::TilingIfNotGPU());
132  mfi.isValid(); ++mfi) {
133  const amrex::Box bx = mfi.tilebox();
134  const auto momentum = rho_u.const_array(mfi);
135  const auto area = ax.const_array(mfi);
136  const auto map = mf_uy.const_array(mfi);
137  const auto out = rate.dir(0).array(mfi);
138  amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(int i, int j, int k) noexcept {
139  out(i, j, k, 0) = area(i, j, k, 0) * momentum(i, j, k, 0) /
140  map(i, j, 0, 0);
141  });
142  }
143  for (amrex::MFIter mfi(rate.dir(1), amrex::TilingIfNotGPU());
144  mfi.isValid(); ++mfi) {
145  const amrex::Box bx = mfi.tilebox();
146  const auto momentum = rho_v.const_array(mfi);
147  const auto area = ay.const_array(mfi);
148  const auto map = mf_vx.const_array(mfi);
149  const auto out = rate.dir(1).array(mfi);
150  amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(int i, int j, int k) noexcept {
151  out(i, j, k, 0) = area(i, j, k, 0) * momentum(i, j, k, 0) /
152  map(i, j, 0, 0);
153  });
154  }
155  for (amrex::MFIter mfi(rate.dir(2), amrex::TilingIfNotGPU());
156  mfi.isValid(); ++mfi) {
157  const amrex::Box bx = mfi.tilebox();
158  const auto contravariant_momentum = omega.const_array(mfi);
159  const auto area = az.const_array(mfi);
160  const auto map_x = mx.const_array(mfi);
161  const auto map_y = my.const_array(mfi);
162  const auto out = rate.dir(2).array(mfi);
163  amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(int i, int j, int k) noexcept {
164  out(i, j, k, 0) = area(i, j, k, 0) *
165  contravariant_momentum(i, j, k, 0) /
166  (map_x(i, j, 0, 0) * map_y(i, j, 0, 0));
167  });
168  }
169 
170  if (!rate.dir(0).is_finite(0, 1, 0) ||
171  !rate.dir(1).is_finite(0, 1, 0) ||
172  !rate.dir(2).is_finite(0, 1, 0)) {
173  diagnostic = "mapped dry-air carrier face rates are nonfinite";
174  return false;
175  }
176  return true;
177 }
real(c_double), private map
Definition: ERF_module_mp_morr_two_moment.F90:222

Referenced by ERF::estTimeStep().

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

◆ ComputationalMappedDivergence()

AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real erf_auxiliary::ComputationalMappedDivergence ( const amrex::Real  fx_hi,
const amrex::Real  fx_lo,
const amrex::Real  fy_hi,
const amrex::Real  fy_lo,
const amrex::Real  fz_hi,
const amrex::Real  fz_lo,
const amrex::Real  dx_inv,
const amrex::Real  dy_inv,
const amrex::Real  dzeta_inv 
)
noexcept

Computational-coordinate divergence only: no metric or physical face area.

128 {
129  return (fx_hi - fx_lo) * dx_inv +
130  (fy_hi - fy_lo) * dy_inv +
131  (fz_hi - fz_lo) * dzeta_inv;
132 }

Referenced by erf_sbm::SBMTransport::advance_stage(), erf_auxiliary::AuxiliaryInertTracer::advance_stage(), ApplyAuxiliaryMappedStage(), and ApplyMappedFluxTendency().

Here is the caller graph for this function:

◆ ComputeMaxMappedOutgoingRate()

bool erf_auxiliary::ComputeMaxMappedOutgoingRate ( const MappedFaceFluxRate &  rate,
const amrex::MultiFab &  measure,
const amrex::MultiFab &  conserved,
int  density_component,
const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &  dx_inv,
amrex::Real &  max_rate,
std::string &  diagnostic 
)

Reduce the largest mapped donor outgoing rate over a cell-centered domain.

226 {
227  diagnostic.clear();
228  max_rate = amrex::Real(0.0);
229  if (!rate.is_defined() || rate.nComp() != 1 ||
230  !MappedFaceLayoutMatchesCellLayout(rate, measure) ||
231  !SameCellLayout(measure, conserved) || measure.nComp() < 1) {
232  diagnostic = "mapped donor-rate reduction received incompatible cell or face layouts";
233  return false;
234  }
235  if (!ValidatePositiveFiniteComponent(measure, 0, diagnostic)) return false;
236  if (!ValidatePositiveFiniteComponent(conserved, density_component,
237  diagnostic)) return false;
238 
239  amrex::MultiFab cell_rate(measure.boxArray(), measure.DistributionMap(), 1,
240  0);
241  for (amrex::MFIter mfi(cell_rate, amrex::TilingIfNotGPU()); mfi.isValid();
242  ++mfi) {
243  const amrex::Box bx = mfi.tilebox();
244  const auto fx = rate.dir(0).const_array(mfi);
245  const auto fy = rate.dir(1).const_array(mfi);
246  const auto fz = rate.dir(2).const_array(mfi);
247  const auto omega = measure.const_array(mfi);
248  const auto rho = conserved.const_array(mfi);
249  const auto out = cell_rate.array(mfi);
250  const int rho_comp = density_component;
251  const auto inv = dx_inv;
252  amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(int i, int j, int k) noexcept {
253  out(i, j, k, 0) = MappedOutgoingDemandRate(
254  fx(i + 1, j, k, 0), fx(i, j, k, 0),
255  fy(i, j + 1, k, 0), fy(i, j, k, 0),
256  fz(i, j, k + 1, 0), fz(i, j, k, 0),
257  omega(i, j, k, 0), rho(i, j, k, rho_comp), inv);
258  });
259  }
260  max_rate = cell_rate.max(0);
261  if (!std::isfinite(max_rate) || max_rate < amrex::Real(0.0)) {
262  diagnostic = "mapped donor outgoing-rate maximum is nonfinite or negative";
263  return false;
264  }
265  return true;
266 }
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real MappedOutgoingDemandRate(const amrex::Real fx_hi, const amrex::Real fx_lo, const amrex::Real fy_hi, const amrex::Real fy_lo, const amrex::Real fz_hi, const amrex::Real fz_lo, const amrex::Real measure, const amrex::Real density, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &dx_inv) noexcept
Definition: ERF_AuxiliaryMappedTransport.H:136

Referenced by ERF::estTimeStep().

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

◆ CopyNativeMappedDryAirCarrierFluxRate()

bool erf_auxiliary::CopyNativeMappedDryAirCarrierFluxRate ( MappedFaceFluxRate &  rate,
const amrex::MultiFab &  rho_u,
const amrex::MultiFab &  rho_v,
const amrex::MultiFab &  rho_w,
std::string &  diagnostic 
)

Copy face fields that are already in ERF's native mapped carrier convention.

185 {
186  diagnostic.clear();
187  if (AMREX_SPACEDIM != 3 || !rate.is_defined() || rate.nComp() != 1 ||
188  rho_u.nComp() < 1 || rho_v.nComp() < 1 || rho_w.nComp() < 1) {
189  diagnostic = "native mapped dry-air carrier requires three dimensions, "
190  "one output component, and one component per input face";
191  return false;
192  }
193 
194  const amrex::MultiFab* input_faces[3] = {&rho_u, &rho_v, &rho_w};
195  for (int dir = 0; dir < 3; ++dir) {
196  const auto& output = rate.dir(dir);
197  const auto& input = *input_faces[dir];
198  if (output.boxArray() != input.boxArray() ||
199  output.DistributionMap() != input.DistributionMap()) {
200  diagnostic = "native mapped dry-air carrier input must match the "
201  "output's x/y/z face staggering and distribution map";
202  return false;
203  }
204  }
205 
206  for (int dir = 0; dir < 3; ++dir) {
207  amrex::MultiFab::Copy(rate.dir(dir), *input_faces[dir], 0, 0, 1, 0);
208  }
209  if (!rate.dir(0).is_finite(0, 1, 0) ||
210  !rate.dir(1).is_finite(0, 1, 0) ||
211  !rate.dir(2).is_finite(0, 1, 0)) {
212  diagnostic = "native mapped dry-air carrier face values are nonfinite";
213  return false;
214  }
215  return true;
216 }

Referenced by ERF::estTimeStep().

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

◆ FixedDtExceedsMappedDonorLimit()

bool erf_auxiliary::FixedDtExceedsMappedDonorLimit ( double  fixed_dt,
amrex::Real  max_outgoing_rate,
double &  hard_limit 
)
noexcept

Test a fixed interval against the hard mapped donor-positivity bound.

271 {
272  hard_limit = std::numeric_limits<double>::infinity();
273  if (std::isfinite(max_outgoing_rate) &&
274  max_outgoing_rate > amrex::Real(0.0)) {
275  hard_limit = 1.0 / static_cast<double>(max_outgoing_rate);
276  }
277  if (max_outgoing_rate == amrex::Real(0.0) || fixed_dt <= 0.0)
278  return false;
279  if (!std::isfinite(fixed_dt) ||
280  !std::isfinite(max_outgoing_rate) ||
281  max_outgoing_rate < amrex::Real(0.0)) {
282  hard_limit = 0.0;
283  return true;
284  }
285 
286  if (!std::isfinite(hard_limit)) return false;
287  const double scale = std::max(std::abs(fixed_dt), std::abs(hard_limit));
288  const double tolerance = 64.0 *
289  static_cast<double>(std::numeric_limits<amrex::Real>::epsilon()) *
290  scale;
291  return fixed_dt - hard_limit > tolerance;
292 }
real(c_double), parameter epsilon
Definition: ERF_module_model_constants.F90:12

Referenced by ERF::estTimeStep().

Here is the caller graph for this function:

◆ HostIntegratorName()

const char * erf_auxiliary::HostIntegratorName ( const HostIntegrator  method)
noexcept
58 {
59  switch (method) {
60  case HostIntegrator::CompressibleRK3: return "CompressibleRK3";
61  case HostIntegrator::AnelasticHeun: return "AnelasticHeun";
62  case HostIntegrator::AnelasticMidPoint: return "AnelasticMidPoint";
63  }
64  return "Unknown";
65 }

Referenced by erf_auxiliary::AuxiliaryInertTracer::advance_stage().

Here is the caller graph for this function:

◆ MakeAuxiliaryStageRecipe()

bool erf_auxiliary::MakeAuxiliaryStageRecipe ( HostIntegrator  method,
int  stage,
double  host_stage_interval,
AuxiliaryStageRecipe &  recipe,
std::string &  diagnostic 
)

Return the explicit ERF recurrence recipe for one supported host stage.

72 {
73  diagnostic.clear();
74  recipe = {};
75  if (!std::isfinite(host_stage_interval) || !(host_stage_interval > 0.0)) {
76  diagnostic = "host stage interval must be finite and positive";
77  return false;
78  }
79  if (method == HostIntegrator::AnelasticMidPoint) {
80  diagnostic = "AnelasticMidPoint is represented but is not qualified by the M2 fixture";
81  return false;
82  }
83  if (stage < 0 || stage >= stage_count(method)) {
84  diagnostic = "stage index is outside the selected host integrator sequence";
85  return false;
86  }
87 
88  if (method == HostIntegrator::CompressibleRK3) {
89  recipe.limiter_trial_base = LimiterTrialBase::Anchor;
90  recipe.anchor_weight = 1.0;
91  recipe.limiter_trial_interval = host_stage_interval;
92  recipe.face_rate_time_coefficient = host_stage_interval;
93  if (stage == 2) { recipe.completed_ledger_time = host_stage_interval; }
94  } else if (method == HostIntegrator::AnelasticHeun) {
95  if (stage == 0) {
96  recipe.limiter_trial_base = LimiterTrialBase::Anchor;
97  recipe.anchor_weight = 1.0;
98  recipe.limiter_trial_interval = host_stage_interval;
99  recipe.face_rate_time_coefficient = host_stage_interval;
100  recipe.completed_ledger_time = 0.5 * host_stage_interval;
101  } else {
102  recipe.limiter_trial_base = LimiterTrialBase::Input;
103  recipe.anchor_weight = 0.5;
104  recipe.input_weight = 0.5;
105  recipe.limiter_trial_interval = host_stage_interval;
106  recipe.face_rate_time_coefficient = 0.5 * host_stage_interval;
107  recipe.completed_ledger_time = 0.5 * host_stage_interval;
108  }
109  }
110  return true;
111 }

Referenced by erf_sbm::SBMTransport::advance_stage(), and erf_auxiliary::AuxiliaryInertTracer::advance_stage().

Here is the caller graph for this function:

◆ MappedFaceLayoutMatchesCellLayout() [1/2]

template<typename Tag >
bool erf_auxiliary::MappedFaceLayoutMatchesCellLayout ( const MappedFaceField< Tag > &  faces,
const amrex::BoxArray &  cell_ba,
const amrex::DistributionMapping &  dm 
)

Check directional face staggering and ownership against a cell layout.

82 {
83  if (!faces.is_defined()) { return false; }
84  for (int dir = 0; dir < AMREX_SPACEDIM; ++dir) {
85  const auto& face = faces.dir(dir);
86  if (face.boxArray() !=
87  amrex::convert(cell_ba, amrex::IntVect::TheDimensionVector(dir)) ||
88  face.DistributionMap() != dm) {
89  return false;
90  }
91  }
92  return true;
93 }

Referenced by ApplyAuxiliaryMappedStage(), ApplyMappedFluxTendency(), ComputeMaxMappedOutgoingRate(), and MappedFaceLayoutMatchesCellLayout().

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

◆ MappedFaceLayoutMatchesCellLayout() [2/2]

template<typename Tag >
bool erf_auxiliary::MappedFaceLayoutMatchesCellLayout ( const MappedFaceField< Tag > &  faces,
const amrex::MultiFab &  cell 
)
98 {
99  return MappedFaceLayoutMatchesCellLayout(faces, cell.boxArray(), cell.DistributionMap());
100 }
Here is the call graph for this function:

◆ MappedOutgoingDemandRate()

AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real erf_auxiliary::MappedOutgoingDemandRate ( const amrex::Real  fx_hi,
const amrex::Real  fx_lo,
const amrex::Real  fy_hi,
const amrex::Real  fy_lo,
const amrex::Real  fz_hi,
const amrex::Real  fz_lo,
const amrex::Real  measure,
const amrex::Real  density,
const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &  dx_inv 
)
noexcept

Outgoing donor rate for one cell in mapped coordinates.

145 {
146  const amrex::Real outward =
147  (amrex::max(fx_hi, amrex::Real(0.0)) +
148  amrex::max(-fx_lo, amrex::Real(0.0))) * dx_inv[0] +
149  (amrex::max(fy_hi, amrex::Real(0.0)) +
150  amrex::max(-fy_lo, amrex::Real(0.0))) * dx_inv[1] +
151  (amrex::max(fz_hi, amrex::Real(0.0)) +
152  amrex::max(-fz_lo, amrex::Real(0.0))) * dx_inv[2];
153  return outward / (measure * density);
154 }

Referenced by erf_sbm::SBMTransport::advance_stage(), and ComputeMaxMappedOutgoingRate().

Here is the caller graph for this function:

◆ MaxFaceFieldDifference()

amrex::Real erf_auxiliary::MaxFaceFieldDifference ( const MappedFaceFluxRate &  lhs,
int  lhs_comp,
const MappedFaceFluxRate &  rhs,
int  rhs_comp 
)

Return the max absolute difference between two component-selected face fields.

353 {
354  AMREX_ALWAYS_ASSERT(lhs.is_defined() && rhs.is_defined());
355  AMREX_ALWAYS_ASSERT(lhs_comp >= 0 && lhs_comp < lhs.nComp());
356  AMREX_ALWAYS_ASSERT(rhs_comp >= 0 && rhs_comp < rhs.nComp());
358  amrex::Real maximum = amrex::Real(0.0);
359  for (int dir = 0; dir < AMREX_SPACEDIM; ++dir) {
360  const auto& a = lhs.dir(dir);
361  const auto& b = rhs.dir(dir);
362  amrex::MultiFab difference(a.boxArray(), a.DistributionMap(), 1, 0);
363  for (amrex::MFIter mfi(difference, amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi) {
364  const amrex::Box bx = mfi.tilebox();
365  const auto av = a.const_array(mfi);
366  const auto bv = b.const_array(mfi);
367  const auto out = difference.array(mfi);
368  amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(int i, int j, int k) noexcept {
369  out(i, j, k, 0) = amrex::Math::abs(av(i, j, k, lhs_comp) -
370  bv(i, j, k, rhs_comp));
371  });
372  }
373  maximum = amrex::max(maximum, difference.norm0(0));
374  }
375  return maximum;
376 }

Referenced by erf_auxiliary::AuxiliaryInertTracer::advance_stage().

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

◆ SameCellLayout()

bool erf_auxiliary::SameCellLayout ( const amrex::MultiFab &  lhs,
const amrex::MultiFab &  rhs 
)

Exact cell-centered BoxArray and DistributionMapping identity.

37 {
38  return lhs.boxArray() == rhs.boxArray() &&
39  lhs.DistributionMap() == rhs.DistributionMap();
40 }

Referenced by erf_sbm::SBMTransport::advance_stage(), ApplyAuxiliaryMappedStage(), ApplyMappedFluxTendency(), BuildAuxiliaryIntensiveState(), BuildMappedCellMeasure(), ComputeMaxMappedOutgoingRate(), erf_sbm::ProlongCarrierRelativeSpectrum(), and erf_sbm::RestrictMappedSpectrum().

Here is the caller graph for this function:

◆ SameMappedFaceLayout()

template<typename LhsTag , typename RhsTag >
bool erf_auxiliary::SameMappedFaceLayout ( const MappedFaceField< LhsTag > &  lhs,
const MappedFaceField< RhsTag > &  rhs 
)

Check that two semantically tagged face fields have identical face layouts.

106 {
107  if (!lhs.is_defined() || !rhs.is_defined()) { return false; }
108  for (int dir = 0; dir < AMREX_SPACEDIM; ++dir) {
109  if (lhs.dir(dir).boxArray() != rhs.dir(dir).boxArray() ||
110  lhs.dir(dir).DistributionMap() != rhs.dir(dir).DistributionMap()) {
111  return false;
112  }
113  }
114  return true;
115 }

Referenced by erf_auxiliary::CompletedStepFluxLedger::accept_stage(), erf_auxiliary::CompletedStepFluxLedger::accumulate_stage_component(), AccumulateIntegratedFaceFlux(), and MaxFaceFieldDifference().

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

◆ ValidateFiniteComponent()

bool erf_auxiliary::ValidateFiniteComponent ( const amrex::MultiFab &  field,
int  component,
std::string &  diagnostic 
)

Check that a selected cell-centered component is finite.

325 {
326  diagnostic.clear();
327  if (component < 0 || component >= field.nComp()) {
328  diagnostic = "finite field validation received an invalid component";
329  return false;
330  }
331  amrex::MultiFab invalid(field.boxArray(), field.DistributionMap(), 1, 0);
332  invalid.setVal(amrex::Real(0.0));
333  for (amrex::MFIter mfi(field, amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi) {
334  const amrex::Box bx = mfi.tilebox();
335  const auto values = field.const_array(mfi);
336  const auto bad = invalid.array(mfi);
337  amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(int i, int j, int k) noexcept {
338  bad(i, j, k, 0) = amrex::Math::isfinite(values(i, j, k, component)) ?
339  amrex::Real(0.0) : amrex::Real(1.0);
340  });
341  }
342  if (invalid.sum(0) != amrex::Real(0.0)) {
343  diagnostic = "selected field component must be finite in every valid cell";
344  return false;
345  }
346  return true;
347 }

Referenced by erf_auxiliary::AuxiliaryInertTracer::advance_stage(), BuildAuxiliaryIntensiveState(), and erf_auxiliary::AuxiliaryInertTracer::initialize().

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

◆ ValidatePositiveFiniteComponent()

bool erf_auxiliary::ValidatePositiveFiniteComponent ( const amrex::MultiFab &  field,
int  component,
std::string &  diagnostic 
)

Check that a selected cell-centered component is finite and strictly positive.

297 {
298  diagnostic.clear();
299  if (component < 0 || component >= field.nComp()) {
300  diagnostic = "positive finite field validation received an invalid component";
301  return false;
302  }
303  amrex::MultiFab invalid(field.boxArray(), field.DistributionMap(), 1, 0);
304  invalid.setVal(amrex::Real(0.0));
305  for (amrex::MFIter mfi(field, amrex::TilingIfNotGPU()); mfi.isValid(); ++mfi) {
306  const amrex::Box bx = mfi.tilebox();
307  const auto values = field.const_array(mfi);
308  const auto bad = invalid.array(mfi);
309  amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(int i, int j, int k) noexcept {
310  const amrex::Real value = values(i, j, k, component);
311  const bool valid = amrex::Math::isfinite(value) && value > amrex::Real(0.0);
312  bad(i, j, k, 0) = valid ? amrex::Real(0.0) : amrex::Real(1.0);
313  });
314  }
315  if (invalid.sum(0) != amrex::Real(0.0)) {
316  diagnostic = "selected field component must be finite and positive in every valid cell";
317  return false;
318  }
319  return true;
320 }

Referenced by erf_sbm::SBMTransport::advance_stage(), erf_auxiliary::AuxiliaryInertTracer::advance_stage(), BuildAuxiliaryIntensiveState(), ComputeMaxMappedOutgoingRate(), and erf_auxiliary::AuxiliaryInertTracer::initialize().

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