ERF
Energy Research and Forecasting: An Atmospheric Modeling Code
ERF_MYNNStruct.H
Go to the documentation of this file.
1 #ifndef ERF_MYNN_STRUCT_H_
2 #define ERF_MYNN_STRUCT_H_
3 
4 #include "ERF_Constants.H"
5 
6 enum struct MYNNConfigType {
7  NN09 = 0, // Nakanishi & Niino 2009, J Met Soc Japan
8  CHEN2021 // Chen & Bryan 2021, JAS
9 };
10 
11 struct MYNNLevel25 {
12 
13  /*
14  * Calculate the stability functions that determine the eddy diffusivities
15  * of momentum, heat, KE, and (optionally) moisture.
16  */
17  AMREX_GPU_DEVICE
18  AMREX_FORCE_INLINE
20  amrex::Real& SH,
21  amrex::Real& SQ,
22  const amrex::Real GM,
23  const amrex::Real GH,
24  const amrex::Real alphac = one) const
25  {
26  amrex::Real alphac2 = alphac * alphac;
27 
28  // Compute non-dimensional parameters (notation follows NN09, Eqns. 33-37)
29  amrex::Real Phi1 = one - three * alphac2 * A2 * B2 * (1-C3) * GH;
30  amrex::Real Phi2 = one - amrex::Real(9.0) * alphac2 * A1 * A2 * (1-C2) * GH;
31  amrex::Real Phi3 = Phi1 + amrex::Real(9.0) * alphac2 * A2 * A2 * (1-C2) * (1-C5) * GH;
32  amrex::Real Phi4 = Phi1 - amrex::Real(12.0) * alphac2 * A1 * A2 * (1-C2) * GH;
33  amrex::Real Phi5 = amrex::Real(6.0) * alphac2 * A1 * A1 * GM;
34 
35  // Compute level amrex::Real(2.5) stability functions
36  amrex::Real D = Phi2*Phi4 + Phi5*Phi3; // NN09 Eqn. 31
37  SM = alphac * A1 * (Phi3 - 3*C1*Phi4) / D; // NN09 Eqn. 27
38  SH = alphac * A2 * (Phi2 + 3*C1*Phi5) / D; // NN09 Eqn. 28
39  SQ = SQfac * SM; // NN09 Eqn. 67
40  }
41 
42  // Closure coefficients (from Nakanishi & Niino 2009 [NN09])
52 
53  // Third-order turbulent fluxes
54  amrex::Real SQfac = three; // revised from two in NN09
55 
56  // Clipping (defaults from WRF v4.5.0 onward)
61 
63 
64  // Calculate eddy diffusivity for moisture variables
65  bool diffuse_moistvars = false;
66 };
67 
68 struct MYNNLevel2 {
69  void init_coeffs (amrex::Real A1_lvl25,
70  amrex::Real A2_lvl25,
71  amrex::Real B1,
72  amrex::Real B2,
73  amrex::Real C1,
74  amrex::Real C2,
75  amrex::Real C3,
76  amrex::Real /*C4*/,
77  amrex::Real C5)
78  {
79  A1 = A1_lvl25;
80  A2 = A2_lvl25;
81  gam2 = (two*A1*(three-two*C2) + B2*(one-C3)) / B1;
82  F1 = B1*(gam1-C1) + two*A1*(three-two*C2) + three*A2*(one-C2)*(one-C5);
83  F2 = B1*(gam1+gam2) - three*A1*(one-C2);
84  Rf1 = B1*(gam1-C1) / F1;
85  Rf2 = B1*gam1 / F2;
86  Rfc = gam1 / (gam1 + gam2);
87  Ri1 = myhalf*A2*F2/(A1*F1);
88  Ri2 = myhalf*Rf1/Ri1;
89  Ri3 = (two*Rf2-Rf1)/Ri1;
90 
91  initialized = true;
92  }
93 
94  AMREX_GPU_DEVICE
95  AMREX_FORCE_INLINE
96  amrex::Real calc_Rf (const amrex::Real GM, const amrex::Real GH) const
97  {
98  AMREX_ASSERT(initialized);
99  amrex::Real Ri = -GH/(GM + eps);
100  return Ri1*(Ri + Ri2 - std::sqrt(Ri*Ri - Ri3*Ri + Ri2*Ri2));
101  }
102 
103  AMREX_GPU_DEVICE
104  AMREX_FORCE_INLINE
105  amrex::Real calc_SH (const amrex::Real Rf) const
106  {
107  AMREX_ASSERT(initialized);
108  return three*A2*(gam1+gam2)*(Rfc-Rf)/(one-Rf);
109  }
110 
111  AMREX_GPU_DEVICE
112  AMREX_FORCE_INLINE
114  {
115  AMREX_ASSERT(initialized);
116  return A1*F1/(A2*F2) * (Rf1-Rf) / (Rf2-Rf) * calc_SH(Rf);
117  }
118 
119  bool initialized{false};
120 
121  amrex::Real A1, A2; // from Level amrex::Real(2.5)
123  const amrex::Real gam1 = amrex::Real(0.235);
127 
129 };
130 #endif
constexpr amrex::Real three
Definition: ERF_Constants.H:9
constexpr amrex::Real two
Definition: ERF_Constants.H:8
constexpr amrex::Real one
Definition: ERF_Constants.H:7
constexpr amrex::Real zero
Definition: ERF_Constants.H:6
constexpr amrex::Real myhalf
Definition: ERF_Constants.H:11
MYNNConfigType
Definition: ERF_MYNNStruct.H:6
amrex::Real Real
Definition: ERF_ShocInterface.H:19
real(c_double), parameter epsilon
Definition: ERF_module_model_constants.F90:12
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
MYNNConfigType config
Definition: ERF_MYNNStruct.H:62
amrex::Real C3
Definition: ERF_MYNNStruct.H:49
amrex::Real C2
Definition: ERF_MYNNStruct.H:48
AMREX_GPU_DEVICE AMREX_FORCE_INLINE void calc_stability_funcs(amrex::Real &SM, amrex::Real &SH, amrex::Real &SQ, const amrex::Real GM, const amrex::Real GH, const amrex::Real alphac=one) const
Definition: ERF_MYNNStruct.H:19
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
amrex::Real A2
Definition: ERF_MYNNStruct.H:121
amrex::Real F2
Definition: ERF_MYNNStruct.H:122
amrex::Real Rf1
Definition: ERF_MYNNStruct.H:125
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real calc_Rf(const amrex::Real GM, const amrex::Real GH) const
Definition: ERF_MYNNStruct.H:96
amrex::Real Rf2
Definition: ERF_MYNNStruct.H:125
const amrex::Real eps
Definition: ERF_MYNNStruct.H:128
amrex::Real Ri3
Definition: ERF_MYNNStruct.H:126
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real calc_SM(const amrex::Real Rf) const
Definition: ERF_MYNNStruct.H:113
const amrex::Real gam1
Definition: ERF_MYNNStruct.H:123
amrex::Real Ri2
Definition: ERF_MYNNStruct.H:126
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real calc_SH(const amrex::Real Rf) const
Definition: ERF_MYNNStruct.H:105
amrex::Real F1
Definition: ERF_MYNNStruct.H:122
amrex::Real Ri1
Definition: ERF_MYNNStruct.H:126
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
amrex::Real A1
Definition: ERF_MYNNStruct.H:121
bool initialized
Definition: ERF_MYNNStruct.H:119
amrex::Real Rfc
Definition: ERF_MYNNStruct.H:125
amrex::Real gam2
Definition: ERF_MYNNStruct.H:124