ERF
Energy Research and Forecasting: An Atmospheric Modeling Code
ERF_TurbStruct.H
Go to the documentation of this file.
1 #ifndef ERF_TURB_STRUCT_H_
2 #define ERF_TURB_STRUCT_H_
3 
4 #include <ERF_MYNNStruct.H>
5 
6 AMREX_ENUM(LESType, None, Smagorinsky, Smagorinsky2D, Deardorff);
7 
8 AMREX_ENUM(RANSType, None, kEqn);
9 
10 AMREX_ENUM(PBLType, None, MYJ, MYNN25, MYNNEDMF, YSU, MRF, SHOC);
11 
12 AMREX_ENUM(StratType, theta, thetav, thetal);
13 
14 template <typename T>
15 void
17  const amrex::ParmParse& pp,
18  const char* query_string,
19  T& query_var,
20  const int lev,
21  const int maxlev)
22 {
23  int count = pp.countval(query_string);
24  if (count == 0) {
25  return; // nothing to do
26  } else if (count == 1) {
27  pp.query(query_string, query_var);
28  } else if (count == maxlev + 1) {
29  pp.query(query_string, query_var, lev);
30  } else {
31  amrex::Error(
32  "For parmparse variable " + pp.prefixedName(query_string) +
33  ": if specified, specify once total or once for each level");
34  }
35 }
36 
37 /**
38  * Container holding quantities related to turbulence parametrizations
39  */
40 struct TurbChoice
41 {
42 public:
43  void init_params (int lev, int max_level, std::string pp_prefix)
44  {
45  amrex::ParmParse pp(pp_prefix);
46 
47  // Which LES closure?
48  std::string les_type_string = "None";
49  query_one_or_per_level(pp, "les_type", les_type, lev, max_level);
50 
51  // Handle 2-D Smag
52  if (les_type == LESType::Smagorinsky2D) {
53  les_type = LESType::Smagorinsky;
54  smag2d = true;
55  }
56 
57  // Which RANS closure?
58  std::string rans_type_string = "None";
59  query_one_or_per_level(pp, "rans_type", rans_type, lev, max_level);
60 
61  if ((rans_type != RANSType::None) && (les_type != LESType::None)) {
62  amrex::Error("Hybrid RANS-LES not implemented");
63  }
64 
65  // Which PBL Closure
66  static std::string pbl_type_string = "None";
67  query_one_or_per_level(pp, "pbl_type", pbl_type, lev, max_level);
68 
69  // Do some more stuff for PBL Modeling
70  if (pbl_type != PBLType::None) {
71  // Check for compatibility between PBL, LES, Molec Transport
72  if (les_type != LESType::None) {
73  amrex::Print() << "Selected a PBL model and an LES model: "
74  << "Using PBL for vertical transport, LES for horizontal"
75  << std::endl;
76  }
77  if (les_type == LESType::Smagorinsky) {
78  if (!smag2d)
79  amrex::Error("If using Smagorinsky with a PBL model, the 2-D "
80  "formulation should be used");
81  } else if (les_type == LESType::Deardorff) {
82  amrex::Error(
83  "It is not recommended to use Deardorff LES and a PBL model");
84  }
85 
86  if (pbl_type == PBLType::MYNN25 || pbl_type == PBLType::MYNNEDMF) {
87  query_one_or_per_level(pp, "pbl_mynn_A1", pbl_mynn.A1, lev, max_level);
88  query_one_or_per_level(pp, "pbl_mynn_A2", pbl_mynn.A2, lev, max_level);
89  query_one_or_per_level(pp, "pbl_mynn_B1", pbl_mynn.B1, lev, max_level);
90  query_one_or_per_level(pp, "pbl_mynn_B2", pbl_mynn.B2, lev, max_level);
91  query_one_or_per_level(pp, "pbl_mynn_C1", pbl_mynn.C1, lev, max_level);
92  query_one_or_per_level(pp, "pbl_mynn_C2", pbl_mynn.C2, lev, max_level);
93  query_one_or_per_level(pp, "pbl_mynn_C3", pbl_mynn.C3, lev, max_level);
94  query_one_or_per_level(pp, "pbl_mynn_C4", pbl_mynn.C4, lev, max_level);
95  query_one_or_per_level(pp, "pbl_mynn_C5", pbl_mynn.C5, lev, max_level);
100  pp, "pbl_mynn_diffuse_moistvars", pbl_mynn.diffuse_moistvars, lev,
101  max_level);
103  pp, "pbl_mynn_SMmin", pbl_mynn.SMmin, lev, max_level);
105  pp, "pbl_mynn_SMmax", pbl_mynn.SMmax, lev, max_level);
107  pp, "pbl_mynn_SHmin", pbl_mynn.SHmin, lev, max_level);
109  pp, "pbl_mynn_SHmax", pbl_mynn.SHmax, lev, max_level);
111  pp, "pbl_mynn_SQfactor", pbl_mynn.SQfac, lev, max_level);
112  } else if (pbl_type == PBLType::YSU) {
114  pp, "pbl_ysu_coriolis_freq", pbl_ysu_coriolis_freq, lev, max_level);
116  pp, "pbl_ysu_use_consistent_coriolis",
117  pbl_ysu_use_consistent_coriolis, lev, max_level);
119  pp, "pbl_ysu_force_over_water", pbl_ysu_force_over_water, lev,
120  max_level);
122  pp, "pbl_ysu_land_Ribcr", pbl_ysu_land_Ribcr, lev, max_level);
124  pp, "pbl_ysu_unst_Ribcr", pbl_ysu_unst_Ribcr, lev, max_level);
125  } else if (pbl_type == PBLType::MRF) {
127  pp, "pbl_mrf_coriolis_freq", pbl_mrf_coriolis_freq, lev, max_level);
129  pp, "pbl_mrf_Ribcr", pbl_mrf_Ribcr, lev, max_level);
131  pp, "pbl_mrf_const_b", pbl_mrf_const_b, lev, max_level);
132  query_one_or_per_level(pp, "pbl_mrf_sf", pbl_mrf_sf, lev, max_level);
134  pp, "mrf_moistvars", mrf_moistvars, lev, max_level);
135  } else if (pbl_type == PBLType::SHOC) {
136 #ifndef ERF_USE_SHOC
137  amrex::Abort("You set use_shoc to true but didn't build with SHOC; you must rebuild the executable");
138 #endif
139  std::string zlo_bc = "none";
140  amrex::ParmParse pp_bc("zlo");
141  pp_bc.get("type",zlo_bc);
142  if (amrex::toLower(zlo_bc) != "surface_layer") {
143  amrex::Abort("You must use the surface_layer BC at zlo with SHOC.");
144  }
145  }
146  }
147 
148  // Flags for QKE/TKE euation
149  if (pbl_type == PBLType::MYJ || pbl_type == PBLType::MYNN25 || pbl_type == PBLType::MYNNEDMF) {
150  // Add sources/sinks to QKE/TKE? (MYJ does this inline)
151  if (pbl_type == PBLType::MYNN25 || pbl_type == PBLType::MYNNEDMF) {
152  use_pbl_tke = true;
153  }
154  // Advect QKE/TKE?
155  query_one_or_per_level(pp, "advect_tke" , advect_tke , lev, max_level);
156  // Apply numerical diffusion to QKE/TKE?
157  query_one_or_per_level(pp, "diffuse_tke_3D", diffuse_tke_3D, lev, max_level);
158  }
159 
160  // LES constants...
161  query_one_or_per_level(pp, "Cs", Cs, lev, max_level);
162 
163  query_one_or_per_level(pp, "Pr_t", Pr_t, lev, max_level);
164  query_one_or_per_level(pp, "Sc_t", Sc_t, lev, max_level);
165 
166  // Compute relevant forms of diffusion parameters
167  Pr_t_inv = amrex::Real(1.0) / Pr_t;
168  Sc_t_inv = amrex::Real(1.0) / Sc_t;
169 
170  if (les_type == LESType::Deardorff) {
171  query_one_or_per_level(pp, "Ck", Ck, lev, max_level);
172  query_one_or_per_level(pp, "Ce", Ce, lev, max_level);
173  query_one_or_per_level(pp, "Ce_wall", Ce_wall, lev, max_level);
174  }
175 
176  // To quantify atmospheric stability for subgrid modeling
177  query_one_or_per_level(pp, "thermal_stratification", strat_type, lev, max_level);
178  if (strat_type == StratType::theta) {
179  amrex::Print() << "Thermal stratification based on gradient of potential temperature" << std::endl;
180  } else if (strat_type == StratType::thetav) {
181  amrex::Print() << "Thermal stratification based on gradient of virtual potential temperature" << std::endl;
182  } else if (strat_type == StratType::thetal) {
183  amrex::Print() << "Thermal stratification based on gradient of linearized liquid-water potential temperature" << std::endl;
184  }
185 
186  // k-eqn constants
187  query_one_or_per_level(pp, "Cmu0", Cmu0, lev, max_level);
188  query_one_or_per_level(pp, "Cb", Cb, lev, max_level);
189  query_one_or_per_level(pp, "Rt_crit", Rt_crit, lev, max_level);
190  query_one_or_per_level(pp, "Rt_min", Rt_min, lev, max_level);
191  query_one_or_per_level(pp, "max_geom_lscale", l_g_max, lev, max_level);
192 
193  // Common inputs (LES or RANS)
194  query_one_or_per_level(pp, "sigma_k", sigma_k, lev, max_level);
195  query_one_or_per_level(pp, "theta_ref", theta_ref, lev, max_level);
196 
197  query_one_or_per_level(pp, "mix_isotropic", mix_isotropic, lev, max_level);
198  query_one_or_per_level(pp, "use_Ri_correction", use_Ri_correction, lev, max_level);
199  query_one_or_per_level(pp, "Ri_crit", Ri_crit, lev, max_level);
200 
201  // Set common flags
202  use_kturb =
203  ((les_type != LESType::None) || (rans_type != RANSType::None) ||
204  (pbl_type != PBLType::None));
205  use_keqn =
206  ((les_type == LESType::Deardorff) || (rans_type == RANSType::kEqn));
207  use_tke =
208  ((les_type == LESType::Deardorff) || (rans_type == RANSType::kEqn) ||
209  (pbl_type == PBLType::MYJ) || (pbl_type == PBLType::MYNN25) ||
210  (pbl_type == PBLType::MYNNEDMF) || (pbl_type == PBLType::SHOC));
211 
212  if (use_tke) {
213  query_one_or_per_level(pp, "init_tke_from_ustar", init_tke_from_ustar, lev, max_level);
214  }
215 
216  // Validate inputs
217  if (les_type == LESType::Smagorinsky) {
218  if (Cs == 0) {
219  amrex::Error("Need to specify Cs for Smagorsinky LES");
220  }
221  if (smag2d && mix_isotropic) {
222  amrex::Print() << "Turning off mix_isotropic for 2-D Smagorinsky" << std::endl;
223  mix_isotropic = false;
224  }
225  }
226  }
227 
228  void display (int lev)
229  {
230  amrex::Print() << "Turbulence Settings at level " << lev << std::endl;
231 
232  if (
233  les_type == LESType::None && rans_type == RANSType::None &&
234  pbl_type == PBLType::None) {
235  amrex::Print() << " Using DNS model at level " << lev << std::endl;
236  } else if (les_type == LESType::Smagorinsky) {
237  if (smag2d) {
238  amrex::Print() << " Using 2D Smagorinsky LES model at level " << lev << std::endl;
239  } else {
240  amrex::Print() << " Using Smagorinsky LES model at level " << lev << std::endl;
241  }
242  if (use_Ri_correction) {
243  amrex::Print() << " Smagorinsky uses Richardson number correction with Ri_crit = "
244  << Ri_crit << std::endl;
245  }
246  } else if (les_type == LESType::Deardorff) {
247  amrex::Print() << " Using Deardorff LES model at level " << lev << std::endl;
248  } else if (rans_type == RANSType::kEqn) {
249  amrex::Print()
250  << " Using Axell & Liungman one-equation RANS k model at level " << lev << std::endl;
251  } else if (pbl_type == PBLType::MYJ) {
252  amrex::Print() << " Using MYJ PBL model at level " << lev << std::endl;
253  } else if (pbl_type == PBLType::MYNN25) {
254  amrex::Print() << " Using MYNN2.5 PBL model at level " << lev << std::endl;
255  } else if (pbl_type == PBLType::MYNNEDMF) {
256  amrex::Print() << " Using MYNNEDMF PBL model at level " << lev << std::endl;
257  } else if (pbl_type == PBLType::YSU) {
258  amrex::Print() << " Using YSU PBL model at level " << lev << std::endl;
259  } else if (pbl_type == PBLType::MRF) {
260  amrex::Print() << " Using MRF PBL model at level " << lev << std::endl;
261  } else {
262  amrex::Error("Unknown turbulence model");
263  }
264 
265  if (les_type != LESType::None) {
266  if (les_type == LESType::Smagorinsky) {
267  amrex::Print() << " Cs : " << Cs << std::endl;
268  }
269  if (les_type == LESType::Deardorff) {
270  amrex::Print() << " Ce : " << Ce << std::endl;
271  amrex::Print() << " Ce at wall : " << Ce_wall << std::endl;
272  amrex::Print() << " Ck : " << Ck << std::endl;
273  amrex::Print() << " sigma_k : " << sigma_k << std::endl;
274 
275  // Sullivan et al 1994, Eqn 14
276  amrex::Real Cs_equiv = std::sqrt(Ck * std::sqrt(Ck / Ce));
277  amrex::Print() << " equivalent Cs : " << Cs_equiv
278  << std::endl;
279  }
280  amrex::Print() << " isotropic mixing : " << mix_isotropic
281  << std::endl;
282  }
283 
284  if (rans_type != RANSType::None) {
285  if (rans_type == RANSType::kEqn) {
286  amrex::Print() << "Cmu0 : " << Cmu0 << std::endl;
287  amrex::Print() << "sigma_k : " << sigma_k << std::endl;
288  amrex::Print() << "Cb : " << Cb << std::endl;
289  amrex::Print() << "Rt_crit : " << Rt_crit << std::endl;
290  amrex::Print() << "Rt_min : " << Rt_min << std::endl;
291  amrex::Print() << "max_geom_lscale : " << l_g_max << std::endl;
292  }
293  }
294 
295  if ((les_type == LESType::Deardorff) ||
296  (rans_type == RANSType::kEqn)) {
297  if (theta_ref > 0) {
298  amrex::Print() << " reference theta : " << theta_ref << std::endl;
299  } else {
300  amrex::Print() << " reference theta : n/a" << std::endl;
301  }
302  }
303 
304  if ((les_type != LESType::None) || (rans_type != RANSType::None)) {
305  amrex::Print() << " Pr_t : " << Pr_t << std::endl;
306  amrex::Print() << " Sc_t : " << Sc_t << std::endl;
307  }
308 
309  if (pbl_type == PBLType::MYNN25 || pbl_type == PBLType::MYNNEDMF) {
310  amrex::Print() << " pbl_mynn_A1 : " << pbl_mynn.A1 << std::endl;
311  amrex::Print() << " pbl_mynn_A2 : " << pbl_mynn.A2 << std::endl;
312  amrex::Print() << " pbl_mynn_B1 : " << pbl_mynn.B1 << std::endl;
313  amrex::Print() << " pbl_mynn_B2 : " << pbl_mynn.B2 << std::endl;
314  amrex::Print() << " pbl_mynn_C1 : " << pbl_mynn.C1 << std::endl;
315  amrex::Print() << " pbl_mynn_C2 : " << pbl_mynn.C2 << std::endl;
316  amrex::Print() << " pbl_mynn_C3 : " << pbl_mynn.C3 << std::endl;
317  amrex::Print() << " pbl_mynn_C4 : " << pbl_mynn.C4 << std::endl;
318  amrex::Print() << " pbl_mynn_C5 : " << pbl_mynn.C5 << std::endl;
319  } else if (pbl_type == PBLType::YSU) {
320  amrex::Print() << " pbl_ysu_coriolis_freq : "
321  << pbl_ysu_coriolis_freq << std::endl;
322  amrex::Print() << " pbl_ysu_use_consistent_coriolis : "
323  << pbl_ysu_use_consistent_coriolis << std::endl;
324  amrex::Print() << " pbl_ysu_force_over_water : "
325  << pbl_ysu_force_over_water << std::endl;
326  amrex::Print() << " pbl_ysu_land_Ribcr : "
327  << pbl_ysu_land_Ribcr << std::endl;
328  amrex::Print() << " pbl_ysu_unst_Ribcr : "
329  << pbl_ysu_unst_Ribcr << std::endl;
330  } else if (pbl_type == PBLType::MRF) {
331  amrex::Print() << " pbl_mrf_coriolis_freq : " << pbl_mrf_coriolis_freq
332  << std::endl;
333  amrex::Print() << " pbl_mrf_Ribcr : " << pbl_mrf_Ribcr
334  << std::endl;
335  amrex::Print() << " pbl_mrf_const_b : " << pbl_mrf_const_b
336  << std::endl;
337  amrex::Print() << " pbl_mrf_sf : " << pbl_mrf_sf
338  << std::endl;
339  amrex::Print() << " mrf_moistvars : " << mrf_moistvars
340  << std::endl;
341  }
342  }
343 
344  // LES model
345  LESType les_type;
346 
347  // Turbulent Prandtl number
350 
351  // Turbulent Schmidt number
354 
355  // Smagorinsky
357  bool smag2d = false;
358 
359  // Deardorff
360  amrex::Real Ce = 0.93;
361  amrex::Real Ce_wall = 0.0; // if > 0, then set Ce to this at k=0
363 
364  // k-eqn RANS coefficients (Axell & Liungman 2001)
365  amrex::Real Cmu0 = 0.5562;
366  amrex::Real Cb = 0.35;
370 
371  // Deardorff or k-eqn RANS
372  // - diffusivity of tke is 1/sigma_k times the eddy viscosity
374  // - reference potential temperature used to quantify the stratification in
375  // a stable region
377  // - how to quantify stratification effects
379 
380  // Anistropic length scales
381  bool mix_isotropic = true;
382 
383  bool use_Ri_correction = true;
385 
386  // RANS type
387  RANSType rans_type;
388 
389  // PBL model
390  PBLType pbl_type;
391 
393  MYNNLevel2 pbl_mynn_level2; // limiting in the decaying turbulence regime
394 
395  // Common Flags
396  bool use_kturb = false; // Any turbulence modeling?
397  bool use_keqn =
398  false; // Any microscale turbulence modeling (LES, RANS) with TKE closure?
399  // Then need to populate SmnSmn_lev for production term.
400  bool use_pbl_tke =
401  false; // Any mesoscale turbulence modeling (PBL) with TKE closure?
402  bool use_tke = false; // Any TKE closure (meso or microscale)?
403 
404  // Initialize TKE/QKE with linear profiles whose surface values are a
405  // function of the friction velocity calculated by the surface layer scheme
406  // (e.g., as done in MYNN-EDMF)
407  bool init_tke_from_ustar = false;
408 
409  // Model coefficients - YSU
410  // TODO: Add parmparse for all of these above
412  1.0e-4; // 1e-4 is hardcoded in WRF, we let the user specify or tske the
413  // value from ERF coriolis forcing
415  false; // ignore input pbl_ysu_coriolis_freq, take value from ERF coriolis
416  // forcing instead
418  false; // Force YSU to act as if it is over water regardless of other inputs
419  // (for testing)
421  0.25; // Critical Bulk Richardson number of Land for stable conditions
423  0.0; // Critical Bulk Richardson number for unstable conditions
424  // Model coefficients - MRF
427  0.5; // Critical Bulk Richardson number for MRF PBL model
429  7.8; // Constant b in MRF PBL model, used to compute the PBL height
431  0.1; // MRF surface flux, used to compute the PBL height
432  bool mrf_moistvars = false; // if true, adds turbulence to moisture
433  // MYNN2.5 PBL model
434  // TKE/QKE stuff
435  bool advect_tke = true; // if MYNN2.5 PBL is used default is turb transport in
436  // Z-direction only
437  bool diffuse_tke_3D = true; // if numerical diffusion is turned on
438 };
439 #endif
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real pp(amrex::Real y)
Definition: ERF_MicrophysicsUtils.H:233
amrex::Real Real
Definition: ERF_ShocInterface.H:19
AMREX_ENUM(LESType, None, Smagorinsky, Smagorinsky2D, Deardorff)
void query_one_or_per_level(const amrex::ParmParse &pp, const char *query_string, T &query_var, const int lev, const int maxlev)
Definition: ERF_TurbStruct.H:16
@ theta
Definition: ERF_MM5.H:20
@ T
Definition: ERF_IndexDefines.H:110
Definition: ERF_MYNNStruct.H:9
amrex::Real SMmax
Definition: ERF_MYNNStruct.H:56
amrex::Real SHmax
Definition: ERF_MYNNStruct.H:58
amrex::Real SQfac
Definition: ERF_MYNNStruct.H:52
amrex::Real C4
Definition: ERF_MYNNStruct.H:48
amrex::Real C1
Definition: ERF_MYNNStruct.H:45
amrex::Real C3
Definition: ERF_MYNNStruct.H:47
amrex::Real C2
Definition: ERF_MYNNStruct.H:46
amrex::Real A2
Definition: ERF_MYNNStruct.H:42
amrex::Real SHmin
Definition: ERF_MYNNStruct.H:57
amrex::Real B1
Definition: ERF_MYNNStruct.H:43
amrex::Real B2
Definition: ERF_MYNNStruct.H:44
amrex::Real C5
Definition: ERF_MYNNStruct.H:49
amrex::Real SMmin
Definition: ERF_MYNNStruct.H:55
amrex::Real A1
Definition: ERF_MYNNStruct.H:41
bool diffuse_moistvars
Definition: ERF_MYNNStruct.H:63
Definition: ERF_MYNNStruct.H:66
void init_coeffs(amrex::Real A1_lvl25, amrex::Real A2_lvl25, amrex::Real B1, amrex::Real B2, amrex::Real C1, amrex::Real C2, amrex::Real C3, amrex::Real, amrex::Real C5)
Definition: ERF_MYNNStruct.H:67
Definition: ERF_TurbStruct.H:41
bool smag2d
Definition: ERF_TurbStruct.H:357
amrex::Real sigma_k
Definition: ERF_TurbStruct.H:373
MYNNLevel25 pbl_mynn
Definition: ERF_TurbStruct.H:392
PBLType pbl_type
Definition: ERF_TurbStruct.H:390
amrex::Real pbl_mrf_const_b
Definition: ERF_TurbStruct.H:428
bool use_pbl_tke
Definition: ERF_TurbStruct.H:400
amrex::Real Sc_t_inv
Definition: ERF_TurbStruct.H:353
amrex::Real Rt_min
Definition: ERF_TurbStruct.H:368
bool use_keqn
Definition: ERF_TurbStruct.H:397
amrex::Real pbl_mrf_coriolis_freq
Definition: ERF_TurbStruct.H:425
MYNNLevel2 pbl_mynn_level2
Definition: ERF_TurbStruct.H:393
amrex::Real Ri_crit
Definition: ERF_TurbStruct.H:384
RANSType rans_type
Definition: ERF_TurbStruct.H:387
StratType strat_type
Definition: ERF_TurbStruct.H:378
amrex::Real pbl_mrf_Ribcr
Definition: ERF_TurbStruct.H:426
bool advect_tke
Definition: ERF_TurbStruct.H:435
amrex::Real Ck
Definition: ERF_TurbStruct.H:362
amrex::Real Cmu0
Definition: ERF_TurbStruct.H:365
bool pbl_ysu_use_consistent_coriolis
Definition: ERF_TurbStruct.H:414
amrex::Real Cb
Definition: ERF_TurbStruct.H:366
amrex::Real pbl_mrf_sf
Definition: ERF_TurbStruct.H:430
void init_params(int lev, int max_level, std::string pp_prefix)
Definition: ERF_TurbStruct.H:43
bool use_Ri_correction
Definition: ERF_TurbStruct.H:383
bool init_tke_from_ustar
Definition: ERF_TurbStruct.H:407
amrex::Real pbl_ysu_land_Ribcr
Definition: ERF_TurbStruct.H:420
bool mrf_moistvars
Definition: ERF_TurbStruct.H:432
bool use_tke
Definition: ERF_TurbStruct.H:402
bool diffuse_tke_3D
Definition: ERF_TurbStruct.H:437
amrex::Real Cs
Definition: ERF_TurbStruct.H:356
amrex::Real Pr_t_inv
Definition: ERF_TurbStruct.H:349
amrex::Real Ce_wall
Definition: ERF_TurbStruct.H:361
amrex::Real Ce
Definition: ERF_TurbStruct.H:360
LESType les_type
Definition: ERF_TurbStruct.H:345
amrex::Real pbl_ysu_coriolis_freq
Definition: ERF_TurbStruct.H:411
bool pbl_ysu_force_over_water
Definition: ERF_TurbStruct.H:417
void display(int lev)
Definition: ERF_TurbStruct.H:228
amrex::Real Pr_t
Definition: ERF_TurbStruct.H:348
bool use_kturb
Definition: ERF_TurbStruct.H:396
amrex::Real theta_ref
Definition: ERF_TurbStruct.H:376
amrex::Real Sc_t
Definition: ERF_TurbStruct.H:352
amrex::Real Rt_crit
Definition: ERF_TurbStruct.H:367
amrex::Real pbl_ysu_unst_Ribcr
Definition: ERF_TurbStruct.H:422
bool mix_isotropic
Definition: ERF_TurbStruct.H:381
amrex::Real l_g_max
Definition: ERF_TurbStruct.H:369