1 #ifndef ERF_TURB_STRUCT_H_
2 #define ERF_TURB_STRUCT_H_
6 AMREX_ENUM(LESType, None, Smagorinsky, Smagorinsky2D, Deardorff);
10 AMREX_ENUM(PBLType, None, MYJ, MYNN25, MYNNEDMF, YSU, MRF, SHOC, EAMXX_SHOC, NATIVE_SHOC);
17 const amrex::ParmParse&
pp,
18 const char* query_string,
23 int count =
pp.countval(query_string);
26 }
else if (count == 1) {
28 return pp.query(query_string, query_var);
29 }
else if (count >= maxlev + 1) {
33 return pp.query(query_string, query_var, lev);
40 "For parmparse variable " +
pp.prefixedName(query_string) +
41 ": if specified, specify once total or at least once for each level");
49 const amrex::ParmParse&
pp,
50 const char* query_string,
55 int count =
pp.countval(query_string);
58 }
else if (count == 1) {
60 return pp.query_enum_case_insensitive(query_string, query_var);
61 }
else if (count >= maxlev + 1) {
65 return pp.query_enum_case_insensitive(query_string, query_var, lev);
72 "For parmparse variable " +
pp.prefixedName(query_string) +
73 ": if specified, specify once total or at least once for each level");
84 void init_params (
int lev,
int max_level, std::string pp_prefix)
86 amrex::ParmParse
pp(pp_prefix);
92 if (
les_type == LESType::Smagorinsky2D) {
101 amrex::Error(
"Hybrid RANS-LES not implemented");
107 static bool warned_legacy_shoc =
false;
108 if (!warned_legacy_shoc) {
109 amrex::Warning(
"erf.pbl_type = SHOC is deprecated; use erf.pbl_type = EAMXX_SHOC");
110 warned_legacy_shoc =
true;
119 amrex::Print() <<
"Selected a PBL model and an LES model: "
120 <<
"Using PBL for vertical transport, LES for horizontal"
123 if (
les_type == LESType::Smagorinsky) {
125 amrex::Error(
"If using Smagorinsky with a PBL model, the 2-D "
126 "formulation should be used");
127 }
else if (
les_type == LESType::Deardorff) {
129 "It is not recommended to use Deardorff LES and a PBL model");
158 }
else if (
pbl_type == PBLType::YSU) {
162 pp,
"pbl_ysu_use_consistent_coriolis",
171 }
else if (
pbl_type == PBLType::MRF) {
184 #ifndef ERF_USE_EAMXX_SHOC
185 amrex::Abort(
"PBLType::EAMXX_SHOC requested, but ERF was not built with ERF_ENABLE_EAMXX_SHOC=ON");
190 #ifndef ERF_USE_NATIVE_SHOC
191 amrex::Abort(
"PBLType::NATIVE_SHOC requested, but ERF was not built with native SHOC enabled");
196 std::string zlo_bc =
"none";
197 amrex::ParmParse pp_bc(
"zlo");
198 pp_bc.get(
"type",zlo_bc);
199 if (amrex::toLower(zlo_bc) !=
"surface_layer") {
200 amrex::Abort(
"You must use the surface_layer BC at zlo with the selected PBL.");
231 if (
les_type == LESType::Deardorff) {
240 amrex::Print() <<
"Thermal stratification based on gradient of potential temperature" << std::endl;
242 amrex::Print() <<
"Thermal stratification based on gradient of virtual potential temperature" << std::endl;
244 amrex::Print() <<
"Thermal stratification based on gradient of linearized liquid-water potential temperature" << std::endl;
257 amrex::Print() <<
"Overriding default sigma_k for k-eqn RANS" << std::endl;
282 if (
les_type == LESType::Smagorinsky) {
284 amrex::Error(
"Need to specify Cs for Smagorsinky LES");
287 amrex::Print() <<
"Turning off mix_isotropic for 2-D Smagorinsky" << std::endl;
293 void check_params (amrex::GpuArray<ERF_BC, AMREX_SPACEDIM*2>& phys_bc_type)
297 phys_bc_type[amrex::Orientation(amrex::Direction::z,amrex::Orientation::low)] !=
ERF_BC::surface_layer ) {
298 amrex::Abort(
"The selected PBL model requires MOST at lower boundary");
301 (phys_bc_type[amrex::Orientation(amrex::Direction::z,amrex::Orientation::low)] !=
ERF_BC::surface_layer) &&
302 (phys_bc_type[amrex::Orientation(amrex::Direction::z,amrex::Orientation::low)] !=
ERF_BC::slip_wall) &&
303 (phys_bc_type[amrex::Orientation(amrex::Direction::z,amrex::Orientation::low)] !=
ERF_BC::no_slip_wall) )
305 amrex::Warning(
"Deardorff LES assumes wall at zlo when applying Ce_wall");
311 amrex::Print() <<
"Turbulence Settings at level " << lev << std::endl;
316 amrex::Print() <<
" Using DNS model at level " << lev << std::endl;
317 }
else if (
les_type == LESType::Smagorinsky) {
319 amrex::Print() <<
" Using 2D Smagorinsky LES model at level " << lev << std::endl;
321 amrex::Print() <<
" Using Smagorinsky LES model at level " << lev << std::endl;
324 amrex::Print() <<
" Smagorinsky uses Richardson number correction with Ri_crit = "
327 }
else if (
les_type == LESType::Deardorff) {
328 amrex::Print() <<
" Using Deardorff LES model at level " << lev << std::endl;
329 }
else if (
rans_type == RANSType::kEqn) {
331 <<
" Using Axell & Liungman one-equation RANS k model at level " << lev
333 }
else if (
pbl_type == PBLType::MYJ) {
334 amrex::Print() <<
" Using MYJ PBL model at level " << lev << std::endl;
335 }
else if (
pbl_type == PBLType::MYNN25) {
336 amrex::Print() <<
" Using MYNN2.5 PBL model at level " << lev << std::endl;
337 }
else if (
pbl_type == PBLType::MYNNEDMF) {
338 amrex::Print() <<
" Using MYNNEDMF PBL model at level " << lev << std::endl;
339 }
else if (
pbl_type == PBLType::YSU) {
340 amrex::Print() <<
" Using YSU PBL model at level " << lev << std::endl;
341 }
else if (
pbl_type == PBLType::MRF) {
342 amrex::Print() <<
" Using MRF PBL model at level " << lev << std::endl;
343 }
else if (
pbl_type == PBLType::EAMXX_SHOC) {
344 amrex::Print() <<
" Using EAMxx SHOC PBL model at level " << lev << std::endl;
345 }
else if (
pbl_type == PBLType::NATIVE_SHOC) {
346 amrex::Print() <<
" Using native SHOC PBL model at level " << lev << std::endl;
348 amrex::Error(
"Unknown turbulence model");
352 if (
les_type == LESType::Smagorinsky) {
353 amrex::Print() <<
" Cs : " <<
Cs << std::endl;
355 if (
les_type == LESType::Deardorff) {
356 amrex::Print() <<
" Ce : " <<
Ce << std::endl;
357 amrex::Print() <<
" Ce at wall : " <<
Ce_wall << std::endl;
358 amrex::Print() <<
" Ck : " <<
Ck << std::endl;
359 amrex::Print() <<
" sigma_k : " <<
sigma_k << std::endl;
363 amrex::Print() <<
" equivalent Cs : " << Cs_equiv
372 amrex::Print() <<
"Cmu0 : " <<
Cmu0 << std::endl;
373 amrex::Print() <<
"sigma_k : " <<
sigma_k << std::endl;
374 amrex::Print() <<
"Cb : " <<
Cb << std::endl;
375 amrex::Print() <<
"Rt_crit : " <<
Rt_crit << std::endl;
376 amrex::Print() <<
"Rt_min : " <<
Rt_min << std::endl;
377 amrex::Print() <<
"max_geom_lscale : " <<
l_g_max << std::endl;
381 if ((
les_type == LESType::Deardorff) ||
384 amrex::Print() <<
" reference theta : " <<
theta_ref << std::endl;
386 amrex::Print() <<
" reference theta : n/a" << std::endl;
391 amrex::Print() <<
" Pr_t : " <<
Pr_t << std::endl;
392 amrex::Print() <<
" Sc_t : " <<
Sc_t << std::endl;
396 amrex::Print() <<
" pbl_mynn_A1 : " <<
pbl_mynn.
A1 << std::endl;
397 amrex::Print() <<
" pbl_mynn_A2 : " <<
pbl_mynn.
A2 << std::endl;
398 amrex::Print() <<
" pbl_mynn_B1 : " <<
pbl_mynn.
B1 << std::endl;
399 amrex::Print() <<
" pbl_mynn_B2 : " <<
pbl_mynn.
B2 << std::endl;
400 amrex::Print() <<
" pbl_mynn_C1 : " <<
pbl_mynn.
C1 << std::endl;
401 amrex::Print() <<
" pbl_mynn_C2 : " <<
pbl_mynn.
C2 << std::endl;
402 amrex::Print() <<
" pbl_mynn_C3 : " <<
pbl_mynn.
C3 << std::endl;
403 amrex::Print() <<
" pbl_mynn_C4 : " <<
pbl_mynn.
C4 << std::endl;
404 amrex::Print() <<
" pbl_mynn_C5 : " <<
pbl_mynn.
C5 << std::endl;
405 }
else if (
pbl_type == PBLType::YSU) {
406 amrex::Print() <<
" pbl_ysu_coriolis_freq : "
408 amrex::Print() <<
" pbl_ysu_use_consistent_coriolis : "
410 amrex::Print() <<
" pbl_ysu_force_over_water : "
412 amrex::Print() <<
" pbl_ysu_land_Ribcr : "
414 amrex::Print() <<
" pbl_ysu_unst_Ribcr : "
416 }
else if (
pbl_type == PBLType::MRF) {
423 amrex::Print() <<
" pbl_mrf_sf : " <<
pbl_mrf_sf
482 return pbl_type == PBLType::EAMXX_SHOC;
487 return pbl_type == PBLType::NATIVE_SHOC;
497 return (
pbl_type == PBLType::MYNN25) ||
constexpr amrex::Real three
Definition: ERF_Constants.H:11
constexpr amrex::Real one
Definition: ERF_Constants.H:9
constexpr amrex::Real fourth
Definition: ERF_Constants.H:14
constexpr amrex::Real zero
Definition: ERF_Constants.H:8
Real T
Definition: ERF_InitCustomPert_Bubble.H:105
amrex::Real Real
Definition: ERF_ShocInterface.H:19
AMREX_ENUM(LESType, None, Smagorinsky, Smagorinsky2D, Deardorff)
int query_one_or_per_level_enum_case_insensitive(const amrex::ParmParse &pp, const char *query_string, T &query_var, const int lev, const int maxlev)
Definition: ERF_TurbStruct.H:48
int 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
Definition: ERF_MYNNStruct.H:11
amrex::Real SMmax
Definition: ERF_MYNNStruct.H:58
amrex::Real SHmax
Definition: ERF_MYNNStruct.H:60
amrex::Real SQfac
Definition: ERF_MYNNStruct.H:54
amrex::Real C4
Definition: ERF_MYNNStruct.H:50
amrex::Real C1
Definition: ERF_MYNNStruct.H:47
amrex::Real C3
Definition: ERF_MYNNStruct.H:49
amrex::Real C2
Definition: ERF_MYNNStruct.H:48
amrex::Real A2
Definition: ERF_MYNNStruct.H:44
amrex::Real SHmin
Definition: ERF_MYNNStruct.H:59
amrex::Real B1
Definition: ERF_MYNNStruct.H:45
amrex::Real B2
Definition: ERF_MYNNStruct.H:46
amrex::Real C5
Definition: ERF_MYNNStruct.H:51
amrex::Real SMmin
Definition: ERF_MYNNStruct.H:57
amrex::Real A1
Definition: ERF_MYNNStruct.H:43
bool diffuse_moistvars
Definition: ERF_MYNNStruct.H:65
Definition: ERF_MYNNStruct.H:68
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:69
Definition: ERF_TurbStruct.H:82
amrex::Real tke_min
Definition: ERF_TurbStruct.H:527
bool smag2d
Definition: ERF_TurbStruct.H:443
amrex::Real sigma_k
Definition: ERF_TurbStruct.H:459
MYNNLevel25 pbl_mynn
Definition: ERF_TurbStruct.H:509
PBLType pbl_type
Definition: ERF_TurbStruct.H:478
amrex::Real pbl_mrf_const_b
Definition: ERF_TurbStruct.H:547
bool use_pbl_tke
Definition: ERF_TurbStruct.H:517
void check_params(amrex::GpuArray< ERF_BC, AMREX_SPACEDIM *2 > &phys_bc_type)
Definition: ERF_TurbStruct.H:293
amrex::Real Sc_t_inv
Definition: ERF_TurbStruct.H:439
amrex::Real Rt_min
Definition: ERF_TurbStruct.H:454
bool use_keqn
Definition: ERF_TurbStruct.H:514
amrex::Real pbl_mrf_coriolis_freq
Definition: ERF_TurbStruct.H:545
MYNNLevel2 pbl_mynn_level2
Definition: ERF_TurbStruct.H:510
amrex::Real Ri_crit
Definition: ERF_TurbStruct.H:470
RANSType rans_type
Definition: ERF_TurbStruct.H:473
StratType strat_type
Definition: ERF_TurbStruct.H:464
bool uses_eamxx_shoc() const noexcept
Definition: ERF_TurbStruct.H:480
bool dirichlet_k
Definition: ERF_TurbStruct.H:475
amrex::Real pbl_mrf_Ribcr
Definition: ERF_TurbStruct.H:546
bool advect_tke
Definition: ERF_TurbStruct.H:552
amrex::Real Ck
Definition: ERF_TurbStruct.H:448
bool uses_shoc_family() const noexcept
Definition: ERF_TurbStruct.H:490
amrex::Real Cmu0
Definition: ERF_TurbStruct.H:451
bool pbl_ysu_use_consistent_coriolis
Definition: ERF_TurbStruct.H:534
bool uses_native_shoc() const noexcept
Definition: ERF_TurbStruct.H:485
amrex::Real Cb
Definition: ERF_TurbStruct.H:452
amrex::Real pbl_mrf_sf
Definition: ERF_TurbStruct.H:548
void init_params(int lev, int max_level, std::string pp_prefix)
Definition: ERF_TurbStruct.H:84
bool use_Ri_correction
Definition: ERF_TurbStruct.H:469
bool init_tke_from_ustar
Definition: ERF_TurbStruct.H:524
amrex::Real pbl_ysu_land_Ribcr
Definition: ERF_TurbStruct.H:540
bool mrf_moistvars
Definition: ERF_TurbStruct.H:549
bool use_tke
Definition: ERF_TurbStruct.H:519
bool diffuse_tke_3D
Definition: ERF_TurbStruct.H:554
amrex::Real Cs
Definition: ERF_TurbStruct.H:442
amrex::Real Pr_t_inv
Definition: ERF_TurbStruct.H:435
bool pbl_suppresses_microphysics_condensation() const noexcept
Definition: ERF_TurbStruct.H:504
amrex::Real Ce_wall
Definition: ERF_TurbStruct.H:447
amrex::Real Ce
Definition: ERF_TurbStruct.H:446
LESType les_type
Definition: ERF_TurbStruct.H:431
amrex::Real pbl_ysu_coriolis_freq
Definition: ERF_TurbStruct.H:531
bool pbl_ysu_force_over_water
Definition: ERF_TurbStruct.H:537
void display(int lev)
Definition: ERF_TurbStruct.H:309
amrex::Real Pr_t
Definition: ERF_TurbStruct.H:434
bool use_kturb
Definition: ERF_TurbStruct.H:513
amrex::Real theta_ref
Definition: ERF_TurbStruct.H:462
amrex::Real Sc_t
Definition: ERF_TurbStruct.H:438
amrex::Real Rt_crit
Definition: ERF_TurbStruct.H:453
amrex::Real pbl_ysu_unst_Ribcr
Definition: ERF_TurbStruct.H:542
bool mix_isotropic
Definition: ERF_TurbStruct.H:467
amrex::Real l_g_max
Definition: ERF_TurbStruct.H:455
bool pbl_requires_surface_layer() const noexcept
Definition: ERF_TurbStruct.H:495