ERF
Energy Research and Forecasting: An Atmospheric Modeling Code
ERF_SAM.H
Go to the documentation of this file.
1 /*
2  * Implementation 1-moment microphysics model
3  * NOTE: this model is based on the SAM code, and the Klemp's paper
4  * 1): Joseph, Klemp, the simulation of three-dimensional convective storm dynamics,
5  * Journal of the atmospheric sciences, vol35, p1070
6  * 2): Marat Khairoutdinov and David Randall, cloud resolving modeling of the ARM summer 1997 IOP:
7  * model formulation, results, uncertainties, and sensitivities, Journal of the atmospheric sciences, vol60, p607
8  */
9 #ifndef ERF_SAM_H
10 #define ERF_SAM_H
11 
12 #include <string>
13 #include <vector>
14 #include <memory>
15 
16 #include <AMReX_FArrayBox.H>
17 #include <AMReX_Geometry.H>
18 #include <AMReX_TableData.H>
19 #include <AMReX_MultiFabUtil.H>
20 
21 #include "ERF_Constants.H"
23 #include "ERF_MicrophysicsUtils.H"
24 #include "ERF_IndexDefines.H"
25 #include "ERF_DataStruct.H"
26 #include "ERF_NullMoist.H"
27 #include "ERF_SAMUtils.H"
29 
30 namespace MicVar {
31  enum {
32  // independent variables
33  rho=0, // density
34  theta, // liquid/ice water potential temperature
35  tabs, // temperature
36  pres, // pressure
37  // non-precipitating vars
38  qt, // total cloud
39  qn, // cloud condensate (liquid + ice)
40  qv, // cloud vapor
41  qcl, // cloud water
42  qci, // cloud ice
43  // precipitating vars
44  qp, // total precip
45  qpr, // precip rain
46  qps, // precip ice
47  qpg, // graupel
48  // derived vars
52  NumVars
53  };
54 }
55 
56 class SAM : public NullMoist {
57 
58  using FabPtr = std::shared_ptr<amrex::MultiFab>;
59 
60 public:
61  // constructor
62  SAM () {}
63 
64  // destructor
65  virtual ~SAM () = default;
66 
67  // cloud physics
68  void Cloud (const SolverChoice& sc);
69 
70  // ice physics
71  void IceFall (const SolverChoice& sc);
72 
73  // precip
74  void Precip (const SolverChoice& sc);
75 
76  // precip fall
77  void PrecipFall (const SolverChoice& sc);
78 
79  // Set up for first time
80  void
81  Define (SolverChoice& sc) override
82  {
84  m_fac_cond = lcond / sc.c_p;
85  m_fac_fus = lfus / sc.c_p;
86  m_fac_sub = lsub / sc.c_p;
87  m_axis = sc.ave_plane;
88  m_rdOcp = sc.rdOcp;
89  m_do_cond = (!sc.uses_shoc_family());
91  }
92 
93  // init
94  void
95  Init (const amrex::MultiFab& cons_in,
96  const amrex::BoxArray& grids,
97  const amrex::Geometry& geom,
98  const amrex::Real& dt_advance,
99  std::unique_ptr<amrex::MultiFab>& z_phys_nd,
100  std::unique_ptr<amrex::MultiFab>& detJ_cc) override;
101 
102  // Import minimum dz at this level
103  void
104  Set_dzmin (const amrex::Real dz_min) override
105  {
106  m_dzmin = dz_min;
107  }
108 
109  // Copy state into micro vars
110  void
111  Copy_State_to_Micro (const amrex::MultiFab& cons_in) override;
112 
113  void
114  Copy_State_to_Micro (const amrex::MultiFab& cons_in,
115  const amrex::MultiFab* base_state);
116 
117  void
118  Update_Micro_Vars (amrex::MultiFab& cons_in,
119  const amrex::MultiFab* base_state) override;
120 
121  // Copy state into micro vars
122  void
123  Copy_Micro_to_State (amrex::MultiFab& cons_in) override;
124 
125  void
126  Update_Micro_Vars (amrex::MultiFab& cons_in) override
127  {
128  this->Copy_State_to_Micro(cons_in);
130  }
131 
132  void
133  Update_State_Vars (amrex::MultiFab& cons_in,
134  const amrex::MultiFab& /*z_phys_nd*/) override
135  {
136  this->Copy_Micro_to_State(cons_in);
137  }
138 
139  // wrapper to do all the updating
140  void
141  Advance (const amrex::Real& dt_advance,
142  const SolverChoice& sc) override
143  {
144  dt = dt_advance;
145 
146  this->Cloud(sc);
147  this->IceFall(sc);
148  this->Precip(sc);
149  this->PrecipFall(sc);
150  }
151 
152  amrex::MultiFab*
153  Qmoist_Ptr (const int& varIdx) override
154  {
156  return mic_fab_vars[MicVarMap[varIdx]].get();
157  }
158 
159  const amrex::MultiFab*
160  Qmoist_Ptr (const int& varIdx) const
161  {
163  return mic_fab_vars[MicVarMap[varIdx]].get();
164  }
165 
166  void
167  Compute_Coefficients (bool use_anelastic_reference_pressure = false);
168 
170  CoefficientRowAt (int k) const;
171 
172  int
173  Qmoist_Size () override { return SAM::m_qmoist_size; }
174 
175  int
177 
178  int
180 
181  void
183  std::vector<int>& a_idx,
184  std::vector<std::string>& a_names) const override
185  {
186  a_idx.clear();
187  a_names.clear();
188 
189  // NOTE: These are the indices to access into qmoist (not mic_fab_vars)
190  a_idx.push_back(0); a_names.push_back("RainAccum");
191  a_idx.push_back(1); a_names.push_back("SnowAccum");
192  a_idx.push_back(2); a_names.push_back("GraupAccum");
193  }
194 
196  Get_Surface_Precip_Accumulation_Ptrs (const int&) const override
197  {
198  if (m_moisture_type == MoistureType::SAM_NoPrecip_NoIce) {
199  return {};
200  }
201 
203  sources.rain = {mic_fab_vars[MicVar::rain_accum].get(), rhor / amrex::Real(1000.0)};
204 
205  if (m_moisture_type == MoistureType::SAM) {
206  sources.snow = {mic_fab_vars[MicVar::snow_accum].get(), rhos / amrex::Real(1000.0)};
207  sources.graupel = {mic_fab_vars[MicVar::graup_accum].get(), rhog / amrex::Real(1000.0)};
208  }
209 
210  return sources;
211  }
212 
213  AMREX_GPU_HOST_DEVICE
214  AMREX_FORCE_INLINE
215  static amrex::Real
216  NewtonIterSat (int& i, int& j, int& k,
217  const int& SAM_moisture_type,
218  const amrex::Real& fac_cond,
219  const amrex::Real& fac_fus,
220  const amrex::Real& /*fac_sub*/,
221  const amrex::Real& an,
222  const amrex::Real& bn,
223  const amrex::Array4<amrex::Real>& tabs_array,
224  const amrex::Array4<amrex::Real>& pres_array,
225  const amrex::Array4<amrex::Real>& qv_array,
226  const amrex::Array4<amrex::Real>& qc_array,
227  const amrex::Array4<amrex::Real>& qi_array,
228  const amrex::Array4<amrex::Real>& qn_array,
229  const amrex::Array4<amrex::Real>& qt_array)
230  {
231  // Solution tolerance
232 #ifdef AMREX_USE_FLOAT
233  constexpr amrex::Real tol = amrex::Real(1.e-4);
234 #else
235  constexpr amrex::Real tol = amrex::Real(1.e-8);
236 #endif
237  constexpr int max_iter = 20;
238 
239  // Saturation moisture fractions
240  amrex::Real omn, domn;
241  amrex::Real qsatm, dqsatm;
242  amrex::Real qsatw, dqsatw;
243  amrex::Real qsati, dqsati;
244  amrex::Real qn, qif, dqif;
245 
246  // Newton iteration vars
247  int niter = 0;
248  amrex::Real F, dFdT;
249 
250  //=======================================================================
251  // Mixed-phase Newton iteration to qv=qsat (cloud phase only)
252  //=======================================================================
253 
254  // Initial guess for temperature & pressure
255  amrex::Real tabs = tabs_array(i,j,k);
256  amrex::Real pres = pres_array(i,j,k);
257 
258  // Mixed saturation moisture fractions
261  omn = sam_cloud_liquid_fraction(SAM_moisture_type, tabs, an, bn);
262  qsatm = sam_mixed_qsat(omn, qsatw, qsati);
263 
264  // Saturation derivative WRT temperature
265  domn = zero;
266  if ( (SAM_moisture_type == 1) &&
267  (tabs < tbgmax) && (tabs > tbgmin) ) {
268  domn = an;
269  }
270  erf_dtqsatw(tabs, pres, dqsatw);
271  erf_dtqsati(tabs, pres, dqsati);
272  dqsatm = sam_mixed_dqsat_dT(omn, domn, qsatw, qsati, dqsatw, dqsati);
273 
274  // Enforce omega splitting
275  qn = (qt_array(i,j,k) - qsatm);
276  qif = qn * (one - omn);
277  dqif = sam_mixed_dqif_dT(omn, domn, qn, dqsatm);
278 
279  // Function for root finding (conserve latent proxy):
280  // 0 = -T_new + T_old + L_v/C_p * (qv,0 - qs,m) - L_f/C_p * (qi,0 - qi,f)
281  F = sam_newton_residual(tabs, tabs_array(i,j,k),
282  fac_cond, qv_array(i,j,k), qsatm,
283  fac_fus , qi_array(i,j,k), qif );
284  while (std::abs(F) > tol && niter < max_iter) {
285  // Derivative of function (T_new iterated on)
286  dFdT = sam_newton_residual_derivative(fac_cond, fac_fus, dqsatm, dqif);
287 
288  // Update the temperature
289  tabs -= F/dFdT;
290 
291  // Mixed saturation moisture fractions
294  omn = sam_cloud_liquid_fraction(SAM_moisture_type, tabs, an, bn);
295  qsatm = sam_mixed_qsat(omn, qsatw, qsati);
296 
297  // Saturation derivative WRT temperature
298  domn = zero;
299  if ( (SAM_moisture_type == 1) &&
300  (tabs < tbgmax) && (tabs > tbgmin) ) {
301  domn = an;
302  }
303  erf_dtqsatw(tabs, pres, dqsatw);
304  erf_dtqsati(tabs, pres, dqsati);
305  dqsatm = sam_mixed_dqsat_dT(omn, domn, qsatw, qsati, dqsatw, dqsati);
306 
307  // Enforce omega splitting
308  qn = (qt_array(i,j,k) - qsatm);
309  qif = qn * (one - omn);
310  dqif = sam_mixed_dqif_dT(omn, domn, qn, dqsatm);
311 
312  // Function for root finding (conserve latent proxy):
313  // 0 = -T_new + T_old + L_v/C_p * (qv,0 - qs,m) - L_f/C_p * (qi,0 - qi,f)
314  F = sam_newton_residual(tabs, tabs_array(i,j,k),
315  fac_cond, qv_array(i,j,k), qsatm,
316  fac_fus , qi_array(i,j,k), qif );
317 
318  // Update iteration
319  ++niter;
320  }
321 
322  // NOTE: the while loop already enforces the iteration limit, so the
323  // residual alone determines whether we found a valid root; testing
324  // niter < max_iter here would spuriously fail a solve that
325  // converged on exactly the last allowed iteration.
326  bool valid_solution = (std::abs(F) <= tol);
327  AMREX_ALWAYS_ASSERT_WITH_MESSAGE(valid_solution, "SAM mixed phase saturation adjustment failed to converge.");
328 
329  // Partition the change in non-precipitating q
330  qv_array(i,j,k) = qsatm;
331  qc_array(i,j,k) = qn * omn;
332  qi_array(i,j,k) = qn * (one - omn);
333  qn_array(i,j,k) = qn;
334  qt_array(i,j,k) = qv_array(i,j,k) + qn_array(i,j,k);
335 
336  // Return to temperature
337  return tabs;
338  }
339 
340 private:
341  // Number of qmoist variables (rain_accum, snow_accum, graup_accum)
342  int m_qmoist_size = 3;
343 
344  // Number of qstate variables
346 
347  // Number of qstate variables that are number concentrations
349 
350  // CFL MAX for vertical advection
351  static constexpr amrex::Real CFL_MAX = myhalf;
352 
353  // MicVar map (Qmoist indices -> MicVar enum)
354  amrex::Vector<int> MicVarMap;
355 
356  // geometry
357  amrex::Geometry m_geom;
358 
359  // timestep
361 
362  // number of vertical levels
363  int nlev, zlo, zhi;
364 
365  // plane average axis
366  int m_axis;
367 
368  // constants
373  bool m_do_cond;
374  MoistureType m_moisture_type = MoistureType::None;
375 
376  // Minimum dz at this level
377  amrex::Real m_dzmin{0.0}; // set by Set_dzmin; the fall routines assert it is positive
378 
379  // Pointer to terrain data
380  amrex::MultiFab* m_z_phys_nd;
381  amrex::MultiFab* m_detJ_cc;
382 
383  // independent variables
384  amrex::Array<FabPtr, MicVar::NumVars> mic_fab_vars;
385 
386  // microphysics parameters/coefficients
387  amrex::TableData<amrex::Real, 1> accrrc;
388  amrex::TableData<amrex::Real, 1> accrsi;
389  amrex::TableData<amrex::Real, 1> accrsc;
390  amrex::TableData<amrex::Real, 1> coefice;
391  amrex::TableData<amrex::Real, 1> evaps1;
392  amrex::TableData<amrex::Real, 1> evaps2;
393  amrex::TableData<amrex::Real, 1> accrgi;
394  amrex::TableData<amrex::Real, 1> accrgc;
395  amrex::TableData<amrex::Real, 1> evapg1;
396  amrex::TableData<amrex::Real, 1> evapg2;
397  amrex::TableData<amrex::Real, 1> evapr1;
398  amrex::TableData<amrex::Real, 1> evapr2;
399 
400  // vertical plane average data
401  amrex::TableData<amrex::Real, 1> rho1d;
402  amrex::TableData<amrex::Real, 1> pres1d;
403  amrex::TableData<amrex::Real, 1> tabs1d;
404  amrex::TableData<amrex::Real, 1> qt1d;
405  amrex::TableData<amrex::Real, 1> qv1d;
406  amrex::TableData<amrex::Real, 1> qn1d;
407 };
408 #endif
constexpr amrex::Real RdoCp
Definition: ERF_Constants.H:41
AMREX_ALWAYS_ASSERT(bx.length()[2]==khi+1)
AMREX_ALWAYS_ASSERT_WITH_MESSAGE(m_cloud_chamber_config.active, "Cloud Chamber: initializer reached without a parsed configuration")
Physical constants and tuning parameters used only by the moisture and cloud-physics code.
constexpr amrex::Real rhog
Definition: ERF_MicrophysicsConstants.H:41
constexpr amrex::Real lfus
Definition: ERF_MicrophysicsConstants.H:110
constexpr amrex::Real tbgmax
Definition: ERF_MicrophysicsConstants.H:49
constexpr amrex::Real lsub
Definition: ERF_MicrophysicsConstants.H:111
constexpr amrex::Real lcond
Definition: ERF_MicrophysicsConstants.H:109
constexpr amrex::Real tbgmin
Definition: ERF_MicrophysicsConstants.H:48
constexpr amrex::Real rhos
Definition: ERF_MicrophysicsConstants.H:40
constexpr amrex::Real rhor
Definition: ERF_MicrophysicsConstants.H:39
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void erf_dtqsatw(amrex::Real t, amrex::Real p, amrex::Real &dtqsatw)
Definition: ERF_MicrophysicsUtils.H:280
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void erf_dtqsati(amrex::Real t, amrex::Real p, amrex::Real &dtqsati)
Definition: ERF_MicrophysicsUtils.H:271
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void erf_qsatw(amrex::Real t, amrex::Real p, amrex::Real &qsatw)
Definition: ERF_MicrophysicsUtils.H:264
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void erf_qsati(amrex::Real t, amrex::Real p, amrex::Real &qsati)
Definition: ERF_MicrophysicsUtils.H:254
constexpr amrex::Real one
Definition: ERF_NumericalConstants.H:30
constexpr amrex::Real zero
Definition: ERF_NumericalConstants.H:29
constexpr amrex::Real myhalf
Definition: ERF_NumericalConstants.H:34
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real sam_newton_residual(const amrex::Real &tabs_new, const amrex::Real &tabs_old, const amrex::Real fcond, const amrex::Real &qv, const amrex::Real &qsatm, const amrex::Real ffus, const amrex::Real &qi, const amrex::Real &qif) noexcept
Definition: ERF_SAMUtils.H:477
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real sam_mixed_dqif_dT(const amrex::Real &omn, const amrex::Real &domn, const amrex::Real &qn, const amrex::Real &dqsatm) noexcept
Definition: ERF_SAMUtils.H:467
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real sam_newton_residual_derivative(const amrex::Real fcond, const amrex::Real ffus, const amrex::Real &dqsatm, const amrex::Real &dqif) noexcept
Definition: ERF_SAMUtils.H:491
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real sam_cloud_liquid_fraction(const int &SAM_moisture_type, const amrex::Real &tabs, const amrex::Real an, const amrex::Real bn) noexcept
Definition: ERF_SAMUtils.H:346
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real sam_mixed_qsat(const amrex::Real &omn, const amrex::Real &qsatw, const amrex::Real &qsati) noexcept
Definition: ERF_SAMUtils.H:445
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real sam_mixed_dqsat_dT(const amrex::Real &omn, const amrex::Real &domn, const amrex::Real &qsatw, const amrex::Real &qsati, const amrex::Real &dqsatw, const amrex::Real &dqsati) noexcept
Definition: ERF_SAMUtils.H:454
amrex::Real Real
Definition: ERF_ShocInterface.H:19
Definition: ERF_NullMoist.H:10
void set_anelastic_reference_pressure_mode(const SolverChoice &sc)
Definition: ERF_NullMoist.H:155
bool m_use_anelastic_reference_pressure
Definition: ERF_NullMoist.H:175
Definition: ERF_SAM.H:56
void Copy_Micro_to_State(amrex::MultiFab &cons_in) override
Definition: ERF_UpdateSAM.cpp:15
void Advance(const amrex::Real &dt_advance, const SolverChoice &sc) override
Definition: ERF_SAM.H:141
int zlo
Definition: ERF_SAM.H:363
void Precip(const SolverChoice &sc)
Definition: ERF_Precip.cpp:12
amrex::TableData< amrex::Real, 1 > rho1d
Definition: ERF_SAM.H:401
amrex::TableData< amrex::Real, 1 > evapr2
Definition: ERF_SAM.H:398
SAM()
Definition: ERF_SAM.H:62
amrex::MultiFab * m_detJ_cc
Definition: ERF_SAM.H:381
void Copy_State_to_Micro(const amrex::MultiFab &cons_in) override
int n_qstate_moist_numconc_size
Definition: ERF_SAM.H:348
void Update_State_Vars(amrex::MultiFab &cons_in, const amrex::MultiFab &) override
Definition: ERF_SAM.H:133
amrex::TableData< amrex::Real, 1 > evapg1
Definition: ERF_SAM.H:395
SurfacePrecipAccumulationSources Get_Surface_Precip_Accumulation_Ptrs(const int &) const override
Definition: ERF_SAM.H:196
void Update_Micro_Vars(amrex::MultiFab &cons_in) override
Definition: ERF_SAM.H:126
amrex::TableData< amrex::Real, 1 > accrgi
Definition: ERF_SAM.H:393
std::shared_ptr< amrex::MultiFab > FabPtr
Definition: ERF_SAM.H:58
virtual ~SAM()=default
amrex::TableData< amrex::Real, 1 > evapg2
Definition: ERF_SAM.H:396
void IceFall(const SolverChoice &sc)
Definition: ERF_IceFall.cpp:13
amrex::Array< FabPtr, MicVar::NumVars > mic_fab_vars
Definition: ERF_SAM.H:384
int m_axis
Definition: ERF_SAM.H:366
void Compute_Coefficients(bool use_anelastic_reference_pressure=false)
Definition: ERF_InitSAM.cpp:154
amrex::Real m_rdOcp
Definition: ERF_SAM.H:372
MoistureType m_moisture_type
Definition: ERF_SAM.H:374
void Cloud(const SolverChoice &sc)
Definition: ERF_CloudSAM.cpp:14
int m_qmoist_size
Definition: ERF_SAM.H:342
amrex::MultiFab * m_z_phys_nd
Definition: ERF_SAM.H:380
amrex::Real m_fac_fus
Definition: ERF_SAM.H:370
amrex::TableData< amrex::Real, 1 > evaps1
Definition: ERF_SAM.H:391
void Update_Micro_Vars(amrex::MultiFab &cons_in, const amrex::MultiFab *base_state) override
amrex::Vector< int > MicVarMap
Definition: ERF_SAM.H:354
bool m_do_cond
Definition: ERF_SAM.H:373
amrex::TableData< amrex::Real, 1 > qv1d
Definition: ERF_SAM.H:405
amrex::Real m_fac_cond
Definition: ERF_SAM.H:369
AMREX_GPU_HOST_DEVICE static AMREX_FORCE_INLINE amrex::Real NewtonIterSat(int &i, int &j, int &k, const int &SAM_moisture_type, const amrex::Real &fac_cond, const amrex::Real &fac_fus, const amrex::Real &, const amrex::Real &an, const amrex::Real &bn, const amrex::Array4< amrex::Real > &tabs_array, const amrex::Array4< amrex::Real > &pres_array, const amrex::Array4< amrex::Real > &qv_array, const amrex::Array4< amrex::Real > &qc_array, const amrex::Array4< amrex::Real > &qi_array, const amrex::Array4< amrex::Real > &qn_array, const amrex::Array4< amrex::Real > &qt_array)
Definition: ERF_SAM.H:216
const amrex::MultiFab * Qmoist_Ptr(const int &varIdx) const
Definition: ERF_SAM.H:160
amrex::TableData< amrex::Real, 1 > accrsi
Definition: ERF_SAM.H:388
amrex::TableData< amrex::Real, 1 > accrrc
Definition: ERF_SAM.H:387
amrex::TableData< amrex::Real, 1 > pres1d
Definition: ERF_SAM.H:402
int nlev
Definition: ERF_SAM.H:363
int Qstate_Moist_Size() override
Definition: ERF_SAM.H:176
amrex::Geometry m_geom
Definition: ERF_SAM.H:357
amrex::TableData< amrex::Real, 1 > evapr1
Definition: ERF_SAM.H:397
amrex::Real m_fac_sub
Definition: ERF_SAM.H:371
void Copy_State_to_Micro(const amrex::MultiFab &cons_in, const amrex::MultiFab *base_state)
amrex::TableData< amrex::Real, 1 > evaps2
Definition: ERF_SAM.H:392
void Init(const amrex::MultiFab &cons_in, const amrex::BoxArray &grids, const amrex::Geometry &geom, const amrex::Real &dt_advance, std::unique_ptr< amrex::MultiFab > &z_phys_nd, std::unique_ptr< amrex::MultiFab > &detJ_cc) override
Definition: ERF_InitSAM.cpp:38
void Set_dzmin(const amrex::Real dz_min) override
Definition: ERF_SAM.H:104
amrex::TableData< amrex::Real, 1 > qn1d
Definition: ERF_SAM.H:406
amrex::TableData< amrex::Real, 1 > accrgc
Definition: ERF_SAM.H:394
amrex::TableData< amrex::Real, 1 > accrsc
Definition: ERF_SAM.H:389
int n_qstate_moist_size
Definition: ERF_SAM.H:345
amrex::TableData< amrex::Real, 1 > qt1d
Definition: ERF_SAM.H:404
amrex::TableData< amrex::Real, 1 > coefice
Definition: ERF_SAM.H:390
int zhi
Definition: ERF_SAM.H:363
static constexpr amrex::Real CFL_MAX
Definition: ERF_SAM.H:351
void Define(SolverChoice &sc) override
Definition: ERF_SAM.H:81
void Qmoist_Restart_Vars(const SolverChoice &, std::vector< int > &a_idx, std::vector< std::string > &a_names) const override
Definition: ERF_SAM.H:182
int Qmoist_Size() override
Definition: ERF_SAM.H:173
SAMCoefficientRow CoefficientRowAt(int k) const
Definition: ERF_InitSAM.cpp:273
void PrecipFall(const SolverChoice &sc)
Definition: ERF_PrecipFall.cpp:19
amrex::TableData< amrex::Real, 1 > tabs1d
Definition: ERF_SAM.H:403
amrex::MultiFab * Qmoist_Ptr(const int &varIdx) override
Definition: ERF_SAM.H:153
int Qstate_Moist_NumConc_Size() override
Definition: ERF_SAM.H:179
amrex::Real dt
Definition: ERF_SAM.H:360
amrex::Real m_dzmin
Definition: ERF_SAM.H:377
Definition: ERF_SAM.H:30
@ NumVars
Definition: ERF_SAM.H:52
@ pres
Definition: ERF_SAM.H:36
@ qpr
Definition: ERF_SAM.H:45
@ qci
Definition: ERF_SAM.H:42
@ qv
Definition: ERF_SAM.H:40
@ rho
Definition: ERF_SAM.H:33
@ snow_accum
Definition: ERF_SAM.H:50
@ qpg
Definition: ERF_SAM.H:47
@ qt
Definition: ERF_SAM.H:38
@ qn
Definition: ERF_SAM.H:39
@ rain_accum
Definition: ERF_SAM.H:49
@ theta
Definition: ERF_SAM.H:34
@ qcl
Definition: ERF_SAM.H:41
@ graup_accum
Definition: ERF_SAM.H:51
@ tabs
Definition: ERF_SAM.H:35
@ qps
Definition: ERF_SAM.H:46
@ qp
Definition: ERF_SAM.H:44
@ qsatw
Definition: ERF_WSM6.H:340
@ qsati
Definition: ERF_WSM6.H:340
Definition: ERF_SAMUtils.H:99
Definition: ERF_DataStruct.H:662
MoistureType moisture_type
Moisture or microphysics model.
Definition: ERF_DataStruct.H:2237
int ave_plane
Averaging plane index used by diagnostics.
Definition: ERF_DataStruct.H:2260
amrex::Real rdOcp
Ratio of dry-air gas constant to c_p.
Definition: ERF_DataStruct.H:2062
bool uses_shoc_family() const noexcept
Query whether any SHOC-family PBL scheme is active.
Definition: ERF_DataStruct.H:2177
amrex::Real c_p
Specific heat at constant pressure for dry air [J/(kg-K)].
Definition: ERF_DataStruct.H:2061
Definition: ERF_SurfacePrecipitation.H:34
SurfacePrecipAccumulationSource rain
Definition: ERF_SurfacePrecipitation.H:36
SurfacePrecipAccumulationSource snow
Definition: ERF_SurfacePrecipitation.H:37
SurfacePrecipAccumulationSource graupel
Definition: ERF_SurfacePrecipitation.H:38