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 <AMReX_Enum.H>
5 
6 #include "ERF_Constants.H"
7 
8 // NN09 : Nakanishi & Niino 2009, J Met Soc Japan -- Lt_alpha = 0.23
9 // Chen2021 : Chen & Bryan 2021, JAS -- Lt_alpha = 0.10, and
10 // the master length scale is the inverse-square (rather than
11 // inverse) sum of l_S, l_T and l_B.
12 // NN09 must stay first so that the zero value remains the default.
13 AMREX_ENUM(MYNNConfigType, NN09, Chen2021);
14 
15 /**
16  * @brief Coefficients and stability functions for the Level 2.5 MYNN closure.
17  */
18 struct MYNNLevel25 {
19 
20  /*
21  * Calculate the stability functions that determine the eddy diffusivities
22  * of momentum, heat, KE, and (optionally) moisture.
23  */
24  AMREX_GPU_DEVICE
25  AMREX_FORCE_INLINE
27  amrex::Real& SH,
28  amrex::Real& SQ,
29  const amrex::Real GM,
30  const amrex::Real GH,
31  const amrex::Real alphac = one) const
32  {
33  amrex::Real alphac2 = alphac * alphac;
34 
35  // Compute non-dimensional parameters (notation follows NN09, Eqns. 33-37)
36  amrex::Real Phi1 = one - three * alphac2 * A2 * B2 * (1-C3) * GH;
37  amrex::Real Phi2 = one - amrex::Real(9.0) * alphac2 * A1 * A2 * (1-C2) * GH;
38  amrex::Real Phi3 = Phi1 + amrex::Real(9.0) * alphac2 * A2 * A2 * (1-C2) * (1-C5) * GH;
39  amrex::Real Phi4 = Phi1 - amrex::Real(12.0) * alphac2 * A1 * A2 * (1-C2) * GH;
40  amrex::Real Phi5 = amrex::Real(6.0) * alphac2 * A1 * A1 * GM;
41 
42  // Compute level amrex::Real(2.5) stability functions
43  amrex::Real D = Phi2*Phi4 + Phi5*Phi3; // NN09 Eqn. 31
44  SM = alphac * A1 * (Phi3 - 3*C1*Phi4) / D; // NN09 Eqn. 27
45  SH = alphac * A2 * (Phi2 + 3*C1*Phi5) / D; // NN09 Eqn. 28
46  SQ = SQfac * SM; // NN09 Eqn. 67
47  }
48 
49  // Closure coefficients (from Nakanishi & Niino 2009 [NN09])
59 
60  // Third-order turbulent fluxes
61  amrex::Real SQfac = three; // revised from two in NN09
62 
63  // Clipping (defaults from WRF v4.5.0 onward)
70 
71  MYNNConfigType config = MYNNConfigType::NN09;
72 
73  // Coefficient on the ABL-depth length scale, l_T = Lt_alpha*<zq>/<q>
74  // (NN09, Eqn. 54). Set from `config` in TurbChoice::init_params -- 0.23
75  // for NN09, 0.10 for Chen2021 -- and then overridable on its own with
76  // erf.pbl_mynn_Lt_alpha. Mellor-Yamada 1982, which COAMPS uses, takes 0.1.
78 
79  // Optional taper of the ABL-depth length scale toward the top of the
80  // boundary layer: l_T -> l_T * (1 - z/h)^Lt_taper_exp, with h the
81  // diagnosed PBL height. Zero (the default) disables it and recovers the
82  // untapered NN09 form exactly.
83  //
84  // l_T (NN09 Eqn. 54) is a single number for the whole column, so once
85  // kappa*z exceeds it the master length scale saturates and stays flat all
86  // the way to the inversion. l_S only grows with height and l_B only bites
87  // once the layer is stably stratified, so in a mixed layer that is neutral
88  // or slightly unstable nothing brings the length scale back down.
90 };
91 
92 /**
93  * @brief Coefficients and stability functions for the Level 2 MYNN closure.
94  */
95 struct MYNNLevel2 {
96  /**
97  * @brief Initialize Level 2 closure coefficients from Level 2.5 coefficients.
98  * @param[in] A1_lvl25 Level 2.5 coefficient A1.
99  * @param[in] A2_lvl25 Level 2.5 coefficient A2.
100  * @param[in] B1 Closure coefficient B1.
101  * @param[in] B2 Closure coefficient B2.
102  * @param[in] C1 Closure coefficient C1.
103  * @param[in] C2 Closure coefficient C2.
104  * @param[in] C3 Closure coefficient C3.
105  * @param[in] C5 Closure coefficient C5.
106  */
107  void init_coeffs (amrex::Real A1_lvl25,
108  amrex::Real A2_lvl25,
109  amrex::Real B1,
110  amrex::Real B2,
111  amrex::Real C1,
112  amrex::Real C2,
113  amrex::Real C3,
114  amrex::Real /*C4*/,
115  amrex::Real C5)
116  {
117  A1 = A1_lvl25;
118  A2 = A2_lvl25;
119  gam2 = (two*A1*(three-two*C2) + B2*(one-C3)) / B1;
120  F1 = B1*(gam1-C1) + two*A1*(three-two*C2) + three*A2*(one-C2)*(one-C5);
121  F2 = B1*(gam1+gam2) - three*A1*(one-C2);
122  Rf1 = B1*(gam1-C1) / F1;
123  Rf2 = B1*gam1 / F2;
124  Rfc = gam1 / (gam1 + gam2);
125  Ri1 = myhalf*A2*F2/(A1*F1);
126  Ri2 = myhalf*Rf1/Ri1;
127  Ri3 = (two*Rf2-Rf1)/Ri1;
128 
129  initialized = true;
130  }
131 
132  /**
133  * @brief Calculate the reduced Richardson number.
134  * @param[in] GM Momentum gradient.
135  * @param[in] GH Heat gradient.
136  * @return Reduced Richardson number.
137  */
138  AMREX_GPU_DEVICE
139  AMREX_FORCE_INLINE
140  amrex::Real calc_Rf (const amrex::Real GM, const amrex::Real GH) const
141  {
142  AMREX_ASSERT(initialized);
143  amrex::Real lGM = std::copysign(std::max(std::fabs(GM),eps),GM);
144  amrex::Real Ri = -GH/lGM;
145  return Ri1*(Ri + Ri2 - std::sqrt(Ri*Ri - Ri3*Ri + Ri2*Ri2));
146  }
147 
148  /**
149  * @brief Calculate the heat stability function.
150  * @param[in] Rf Reduced Richardson number.
151  * @return Heat stability function.
152  */
153  AMREX_GPU_DEVICE
154  AMREX_FORCE_INLINE
155  amrex::Real calc_SH (const amrex::Real Rf) const
156  {
157  AMREX_ASSERT(initialized);
158  return three*A2*(gam1+gam2)*(Rfc-Rf)/(one-Rf);
159  }
160 
161  /**
162  * @brief Calculate the momentum stability function.
163  * @param[in] Rf Reduced Richardson number.
164  * @return Momentum stability function.
165  */
166  AMREX_GPU_DEVICE
167  AMREX_FORCE_INLINE
168  amrex::Real calc_SM (const amrex::Real Rf) const
169  {
170  AMREX_ASSERT(initialized);
171  return A1*F1/(A2*F2) * (Rf1-Rf) / (Rf2-Rf) * calc_SH(Rf);
172  }
173 
174  bool initialized{false};
175 
176  amrex::Real A1, A2; // from Level amrex::Real(2.5)
178  const amrex::Real gam1 = amrex::Real(0.235);
182 
184 };
185 #endif
constexpr amrex::Real bogus_large_value
Definition: ERF_Constants.H:19
AMREX_ENUM(MYNNConfigType, NN09, Chen2021)
constexpr amrex::Real three
Definition: ERF_NumericalConstants.H:39
constexpr amrex::Real two
Definition: ERF_NumericalConstants.H:38
constexpr amrex::Real one
Definition: ERF_NumericalConstants.H:37
constexpr amrex::Real zero
Definition: ERF_NumericalConstants.H:36
constexpr amrex::Real myhalf
Definition: ERF_NumericalConstants.H:41
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:18
amrex::Real SMmax
Definition: ERF_MYNNStruct.H:65
amrex::Real SHmax
Definition: ERF_MYNNStruct.H:67
amrex::Real Lt_alpha
Definition: ERF_MYNNStruct.H:77
amrex::Real SQfac
Definition: ERF_MYNNStruct.H:61
amrex::Real C4
Definition: ERF_MYNNStruct.H:57
amrex::Real C1
Definition: ERF_MYNNStruct.H:54
MYNNConfigType config
Definition: ERF_MYNNStruct.H:71
amrex::Real C3
Definition: ERF_MYNNStruct.H:56
amrex::Real C2
Definition: ERF_MYNNStruct.H:55
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:26
amrex::Real A2
Definition: ERF_MYNNStruct.H:51
amrex::Real SHmin
Definition: ERF_MYNNStruct.H:66
amrex::Real B1
Definition: ERF_MYNNStruct.H:52
amrex::Real Lt_taper_exp
Definition: ERF_MYNNStruct.H:89
amrex::Real B2
Definition: ERF_MYNNStruct.H:53
amrex::Real C5
Definition: ERF_MYNNStruct.H:58
amrex::Real SMmin
Definition: ERF_MYNNStruct.H:64
amrex::Real SQmin
Definition: ERF_MYNNStruct.H:68
amrex::Real A1
Definition: ERF_MYNNStruct.H:50
amrex::Real SQmax
Definition: ERF_MYNNStruct.H:69
Coefficients and stability functions for the Level 2 MYNN closure.
Definition: ERF_MYNNStruct.H:95
amrex::Real A2
Definition: ERF_MYNNStruct.H:176
amrex::Real F2
Definition: ERF_MYNNStruct.H:177
amrex::Real Rf1
Definition: ERF_MYNNStruct.H:180
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:140
amrex::Real Rf2
Definition: ERF_MYNNStruct.H:180
const amrex::Real eps
Definition: ERF_MYNNStruct.H:183
amrex::Real Ri3
Definition: ERF_MYNNStruct.H:181
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real calc_SM(const amrex::Real Rf) const
Calculate the momentum stability function.
Definition: ERF_MYNNStruct.H:168
const amrex::Real gam1
Definition: ERF_MYNNStruct.H:178
amrex::Real Ri2
Definition: ERF_MYNNStruct.H:181
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real calc_SH(const amrex::Real Rf) const
Calculate the heat stability function.
Definition: ERF_MYNNStruct.H:155
amrex::Real F1
Definition: ERF_MYNNStruct.H:177
amrex::Real Ri1
Definition: ERF_MYNNStruct.H:181
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:107
amrex::Real A1
Definition: ERF_MYNNStruct.H:176
bool initialized
Definition: ERF_MYNNStruct.H:174
amrex::Real Rfc
Definition: ERF_MYNNStruct.H:180
amrex::Real gam2
Definition: ERF_MYNNStruct.H:179