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 /**
12  * @brief Coefficients and stability functions for the Level 2.5 MYNN closure.
13  */
14 struct MYNNLevel25 {
15 
16  /*
17  * Calculate the stability functions that determine the eddy diffusivities
18  * of momentum, heat, KE, and (optionally) moisture.
19  */
20  AMREX_GPU_DEVICE
21  AMREX_FORCE_INLINE
23  amrex::Real& SH,
24  amrex::Real& SQ,
25  const amrex::Real GM,
26  const amrex::Real GH,
27  const amrex::Real alphac = one) const
28  {
29  amrex::Real alphac2 = alphac * alphac;
30 
31  // Compute non-dimensional parameters (notation follows NN09, Eqns. 33-37)
32  amrex::Real Phi1 = one - three * alphac2 * A2 * B2 * (1-C3) * GH;
33  amrex::Real Phi2 = one - amrex::Real(9.0) * alphac2 * A1 * A2 * (1-C2) * GH;
34  amrex::Real Phi3 = Phi1 + amrex::Real(9.0) * alphac2 * A2 * A2 * (1-C2) * (1-C5) * GH;
35  amrex::Real Phi4 = Phi1 - amrex::Real(12.0) * alphac2 * A1 * A2 * (1-C2) * GH;
36  amrex::Real Phi5 = amrex::Real(6.0) * alphac2 * A1 * A1 * GM;
37 
38  // Compute level amrex::Real(2.5) stability functions
39  amrex::Real D = Phi2*Phi4 + Phi5*Phi3; // NN09 Eqn. 31
40  SM = alphac * A1 * (Phi3 - 3*C1*Phi4) / D; // NN09 Eqn. 27
41  SH = alphac * A2 * (Phi2 + 3*C1*Phi5) / D; // NN09 Eqn. 28
42  SQ = SQfac * SM; // NN09 Eqn. 67
43  }
44 
45  // Closure coefficients (from Nakanishi & Niino 2009 [NN09])
55 
56  // Third-order turbulent fluxes
57  amrex::Real SQfac = three; // revised from two in NN09
58 
59  // Clipping (defaults from WRF v4.5.0 onward)
66 
68 
69  // Calculate eddy diffusivity for moisture variables
70  bool diffuse_moistvars = false;
71 };
72 
73 /**
74  * @brief Coefficients and stability functions for the Level 2 MYNN closure.
75  */
76 struct MYNNLevel2 {
77  /**
78  * @brief Initialize Level 2 closure coefficients from Level 2.5 coefficients.
79  * @param[in] A1_lvl25 Level 2.5 coefficient A1.
80  * @param[in] A2_lvl25 Level 2.5 coefficient A2.
81  * @param[in] B1 Closure coefficient B1.
82  * @param[in] B2 Closure coefficient B2.
83  * @param[in] C1 Closure coefficient C1.
84  * @param[in] C2 Closure coefficient C2.
85  * @param[in] C3 Closure coefficient C3.
86  * @param[in] C5 Closure coefficient C5.
87  */
88  void init_coeffs (amrex::Real A1_lvl25,
89  amrex::Real A2_lvl25,
90  amrex::Real B1,
91  amrex::Real B2,
92  amrex::Real C1,
93  amrex::Real C2,
94  amrex::Real C3,
95  amrex::Real /*C4*/,
96  amrex::Real C5)
97  {
98  A1 = A1_lvl25;
99  A2 = A2_lvl25;
100  gam2 = (two*A1*(three-two*C2) + B2*(one-C3)) / B1;
101  F1 = B1*(gam1-C1) + two*A1*(three-two*C2) + three*A2*(one-C2)*(one-C5);
102  F2 = B1*(gam1+gam2) - three*A1*(one-C2);
103  Rf1 = B1*(gam1-C1) / F1;
104  Rf2 = B1*gam1 / F2;
105  Rfc = gam1 / (gam1 + gam2);
106  Ri1 = myhalf*A2*F2/(A1*F1);
107  Ri2 = myhalf*Rf1/Ri1;
108  Ri3 = (two*Rf2-Rf1)/Ri1;
109 
110  initialized = true;
111  }
112 
113  /**
114  * @brief Calculate the reduced Richardson number.
115  * @param[in] GM Momentum gradient.
116  * @param[in] GH Heat gradient.
117  * @return Reduced Richardson number.
118  */
119  AMREX_GPU_DEVICE
120  AMREX_FORCE_INLINE
121  amrex::Real calc_Rf (const amrex::Real GM, const amrex::Real GH) const
122  {
123  AMREX_ASSERT(initialized);
124  amrex::Real lGM = std::copysign(std::max(std::fabs(GM),eps),GM);
125  amrex::Real Ri = -GH/lGM;
126  return Ri1*(Ri + Ri2 - std::sqrt(Ri*Ri - Ri3*Ri + Ri2*Ri2));
127  }
128 
129  /**
130  * @brief Calculate the heat stability function.
131  * @param[in] Rf Reduced Richardson number.
132  * @return Heat stability function.
133  */
134  AMREX_GPU_DEVICE
135  AMREX_FORCE_INLINE
136  amrex::Real calc_SH (const amrex::Real Rf) const
137  {
138  AMREX_ASSERT(initialized);
139  return three*A2*(gam1+gam2)*(Rfc-Rf)/(one-Rf);
140  }
141 
142  /**
143  * @brief Calculate the momentum stability function.
144  * @param[in] Rf Reduced Richardson number.
145  * @return Momentum stability function.
146  */
147  AMREX_GPU_DEVICE
148  AMREX_FORCE_INLINE
149  amrex::Real calc_SM (const amrex::Real Rf) const
150  {
151  AMREX_ASSERT(initialized);
152  return A1*F1/(A2*F2) * (Rf1-Rf) / (Rf2-Rf) * calc_SH(Rf);
153  }
154 
155  bool initialized{false};
156 
157  amrex::Real A1, A2; // from Level amrex::Real(2.5)
159  const amrex::Real gam1 = amrex::Real(0.235);
163 
165 };
166 #endif
constexpr amrex::Real three
Definition: ERF_Constants.H:11
constexpr amrex::Real two
Definition: ERF_Constants.H:10
constexpr amrex::Real bogus_large_value
Definition: ERF_Constants.H:26
constexpr amrex::Real one
Definition: ERF_Constants.H:9
constexpr amrex::Real zero
Definition: ERF_Constants.H:8
constexpr amrex::Real myhalf
Definition: ERF_Constants.H:13
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
Coefficients and stability functions for the Level 2.5 MYNN closure.
Definition: ERF_MYNNStruct.H:14
amrex::Real SMmax
Definition: ERF_MYNNStruct.H:61
amrex::Real SHmax
Definition: ERF_MYNNStruct.H:63
amrex::Real SQfac
Definition: ERF_MYNNStruct.H:57
amrex::Real C4
Definition: ERF_MYNNStruct.H:53
amrex::Real C1
Definition: ERF_MYNNStruct.H:50
MYNNConfigType config
Definition: ERF_MYNNStruct.H:67
amrex::Real C3
Definition: ERF_MYNNStruct.H:52
amrex::Real C2
Definition: ERF_MYNNStruct.H:51
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:22
amrex::Real A2
Definition: ERF_MYNNStruct.H:47
amrex::Real SHmin
Definition: ERF_MYNNStruct.H:62
amrex::Real B1
Definition: ERF_MYNNStruct.H:48
amrex::Real B2
Definition: ERF_MYNNStruct.H:49
amrex::Real C5
Definition: ERF_MYNNStruct.H:54
amrex::Real SMmin
Definition: ERF_MYNNStruct.H:60
amrex::Real SQmin
Definition: ERF_MYNNStruct.H:64
amrex::Real A1
Definition: ERF_MYNNStruct.H:46
bool diffuse_moistvars
Definition: ERF_MYNNStruct.H:70
amrex::Real SQmax
Definition: ERF_MYNNStruct.H:65
Coefficients and stability functions for the Level 2 MYNN closure.
Definition: ERF_MYNNStruct.H:76
amrex::Real A2
Definition: ERF_MYNNStruct.H:157
amrex::Real F2
Definition: ERF_MYNNStruct.H:158
amrex::Real Rf1
Definition: ERF_MYNNStruct.H:161
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real calc_Rf(const amrex::Real GM, const amrex::Real GH) const
Calculate the reduced Richardson number.
Definition: ERF_MYNNStruct.H:121
amrex::Real Rf2
Definition: ERF_MYNNStruct.H:161
const amrex::Real eps
Definition: ERF_MYNNStruct.H:164
amrex::Real Ri3
Definition: ERF_MYNNStruct.H:162
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real calc_SM(const amrex::Real Rf) const
Calculate the momentum stability function.
Definition: ERF_MYNNStruct.H:149
const amrex::Real gam1
Definition: ERF_MYNNStruct.H:159
amrex::Real Ri2
Definition: ERF_MYNNStruct.H:162
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real calc_SH(const amrex::Real Rf) const
Calculate the heat stability function.
Definition: ERF_MYNNStruct.H:136
amrex::Real F1
Definition: ERF_MYNNStruct.H:158
amrex::Real Ri1
Definition: ERF_MYNNStruct.H:162
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)
Initialize Level 2 closure coefficients from Level 2.5 coefficients.
Definition: ERF_MYNNStruct.H:88
amrex::Real A1
Definition: ERF_MYNNStruct.H:157
bool initialized
Definition: ERF_MYNNStruct.H:155
amrex::Real Rfc
Definition: ERF_MYNNStruct.H:161
amrex::Real gam2
Definition: ERF_MYNNStruct.H:160