ERF
Energy Research and Forecasting: An Atmospheric Modeling Code
ERF_NativeScalarDiffusion.H File Reference
Include dependency graph for ERF_NativeScalarDiffusion.H:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

struct  NativeScalarDiffusionPolicy
 

Functions

NativeScalarDiffusionPolicy ResolveNativeScalarDiffusionPolicy (const int qty_comp, const DiffChoice &choice)
 
amrex::Vector< amrex::Real > VerticalMolecularAlphaByPrim (const DiffChoice &choice)
 

Function Documentation

◆ ResolveNativeScalarDiffusionPolicy()

NativeScalarDiffusionPolicy ResolveNativeScalarDiffusionPolicy ( const int  qty_comp,
const DiffChoice &  choice 
)
inline

Resolve conserved-state identity to ERF's native coefficient category.

27 {
29  policy.scalar_comp = qty_comp - 1;
30  policy.rhs_comp = qty_comp;
31  policy.flux_comp = 0;
32  policy.bc_comp = cons_bc_comp(qty_comp);
33  policy.is_theta = (qty_comp == RhoTheta_comp);
34  // Water identity determines molecular diffusion, independently of ownership
35  // and eligibility for the implicit turbulent vertical solve.
36  policy.is_moist = (qty_comp >= RhoQ1_comp && qty_comp < (RhoQ1_comp + choice.n_qstate_moist));
37  policy.is_q1 = (qty_comp == RhoQ1_comp);
38  policy.is_q2 = (qty_comp == RhoQ2_comp);
40  (policy.is_theta || qty_comp == RhoKE_comp || choice.implicit_q(qty_comp));
41 
42  if (policy.is_theta) {
46  policy.coefficients.molecular_coeff = choice.alpha_T;
47  } else if (choice.molec_diff_type == MolecDiffType::Constant) {
48  policy.coefficients.molecular_coeff = choice.rhoAlpha_T;
49  }
50  } else if (qty_comp == RhoKE_comp) {
53  } else if (qty_comp >= RhoScalar_comp && qty_comp < RhoScalar_comp + NSCALARS) {
57  policy.coefficients.molecular_coeff = choice.alpha_C;
58  } else if (choice.molec_diff_type == MolecDiffType::Constant) {
59  policy.coefficients.molecular_coeff = choice.rhoAlpha_C;
60  }
61  } else {
62  // Every q-state, including future appended species, uses the Q eddy
63  // category. Molecular diffusion is defined for the moisture species
64  // (number concentrations included), not for appended non-moist species.
67  if (policy.is_moist) {
69  policy.coefficients.molecular_coeff = choice.alpha_C;
70  } else if (choice.molec_diff_type == MolecDiffType::Constant) {
71  policy.coefficients.molecular_coeff = choice.rhoAlpha_C;
72  }
73  }
74  }
75  return policy;
76 }
#define RhoScalar_comp
Definition: ERF_IndexDefines.H:57
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE int cons_bc_comp(int n) noexcept
Definition: ERF_IndexDefines.H:140
#define RhoTheta_comp
Definition: ERF_IndexDefines.H:54
#define RhoQ2_comp
Definition: ERF_IndexDefines.H:67
#define NSCALARS
Definition: ERF_IndexDefines.H:26
#define RhoQ1_comp
Definition: ERF_IndexDefines.H:66
#define RhoKE_comp
Definition: ERF_IndexDefines.H:55
@ Theta_v
Definition: ERF_IndexDefines.H:290
@ Scalar_v
Definition: ERF_IndexDefines.H:292
@ Q_v
Definition: ERF_IndexDefines.H:293
@ Q_h
Definition: ERF_IndexDefines.H:288
@ Scalar_h
Definition: ERF_IndexDefines.H:287
@ KE_v
Definition: ERF_IndexDefines.H:291
@ Theta_h
Definition: ERF_IndexDefines.H:285
@ KE_h
Definition: ERF_IndexDefines.H:286
int n_qstate_moist
Number of water-related conserved components starting at RhoQ1_comp, retaining their water-species mo...
Definition: ERF_DiffStruct.H:116
MolecDiffType molec_diff_type
Selected molecular transport model.
Definition: ERF_DiffStruct.H:96
amrex::Real rhoAlpha_T
Dynamic temperature diffusion coefficient [kg/(m-s)].
Definition: ERF_DiffStruct.H:106
amrex::Real alpha_C
Kinematic scalar diffusivity [m2/s].
Definition: ERF_DiffStruct.H:100
amrex::Real alpha_T
Kinematic temperature diffusivity [m2/s].
Definition: ERF_DiffStruct.H:99
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE bool implicit_q(int n) const noexcept
Definition: ERF_DiffStruct.H:128
amrex::Real rhoAlpha_C
Dynamic scalar diffusion coefficient [kg/(m-s)].
Definition: ERF_DiffStruct.H:107
Definition: ERF_NativeScalarDiffusion.H:11
int bc_comp
Definition: ERF_NativeScalarDiffusion.H:16
bool scale_raw_vertical_flux
Definition: ERF_NativeScalarDiffusion.H:21
int rhs_comp
Definition: ERF_NativeScalarDiffusion.H:14
int scalar_comp
Definition: ERF_NativeScalarDiffusion.H:13
ScalarDiffusionCoefficients coefficients
Definition: ERF_NativeScalarDiffusion.H:12
bool is_q1
Definition: ERF_NativeScalarDiffusion.H:19
bool is_moist
Definition: ERF_NativeScalarDiffusion.H:18
bool is_theta
Definition: ERF_NativeScalarDiffusion.H:17
int flux_comp
Definition: ERF_NativeScalarDiffusion.H:15
bool is_q2
Definition: ERF_NativeScalarDiffusion.H:20
int eddy_v_comp
Definition: ERF_ScalarDiffusion.H:26
int eddy_h_comp
Definition: ERF_ScalarDiffusion.H:25
amrex::Real molecular_coeff
Definition: ERF_ScalarDiffusion.H:24

Referenced by DiffusionSrcForState_N(), DiffusionSrcForState_S(), DiffusionSrcForState_T(), if(), ImplicitDiffForStateLU_N(), ImplicitDiffForStateLU_S(), ImplicitDiffForStateLU_T(), and ImplicitVerticalFluxForReflux_T().

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

◆ VerticalMolecularAlphaByPrim()

amrex::Vector<amrex::Real> VerticalMolecularAlphaByPrim ( const DiffChoice &  choice)
inline

Molecular diffusivity by primitive component for the implicit vertical solve and the EB diffusion (ERF_SetupVertDiff.H): theta, every passive scalar (all NSCALARS of them) and the moisture species (number concentrations included); everything else – KE, and any non-moist species a scheme appends after its moisture species – is left at zero. With erf.molec_diff_type = Constant or ConstantAlpha these are the coefficients ResolveNativeScalarDiffusionPolicy() gives the explicit paths.

87 {
88  amrex::Vector<amrex::Real> alpha_eff(NPRIMVAR_max, amrex::Real(0));
89  const bool consA = (choice.molec_diff_type == MolecDiffType::ConstantAlpha);
90  const amrex::Real alpha_T_eff = consA ? choice.alpha_T : choice.rhoAlpha_T;
91  const amrex::Real alpha_C_eff = consA ? choice.alpha_C : choice.rhoAlpha_C;
92  alpha_eff[PrimTheta_comp] = alpha_T_eff;
93  for (int n = 0; n < NSCALARS; ++n) {
94  alpha_eff[PrimScalar_comp + n] = alpha_C_eff;
95  }
96  for (int i = PrimQ1_comp; i < PrimQ1_comp + choice.n_qstate_moist; ++i) {
97  alpha_eff[i] = alpha_C_eff;
98  }
99  return alpha_eff;
100 }
#define PrimQ1_comp
Definition: ERF_IndexDefines.H:82
#define NPRIMVAR_max
Definition: ERF_IndexDefines.H:50
#define PrimTheta_comp
Definition: ERF_IndexDefines.H:79
#define PrimScalar_comp
Definition: ERF_IndexDefines.H:81
amrex::Real Real
Definition: ERF_ShocInterface.H:19