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)
63 
65 
66  // Calculate eddy diffusivity for moisture variables
67  bool diffuse_moistvars = false;
68 };
69 
70 struct MYNNLevel2 {
71  void init_coeffs (amrex::Real A1_lvl25,
72  amrex::Real A2_lvl25,
73  amrex::Real B1,
74  amrex::Real B2,
75  amrex::Real C1,
76  amrex::Real C2,
77  amrex::Real C3,
78  amrex::Real /*C4*/,
79  amrex::Real C5)
80  {
81  A1 = A1_lvl25;
82  A2 = A2_lvl25;
83  gam2 = (two*A1*(three-two*C2) + B2*(one-C3)) / B1;
84  F1 = B1*(gam1-C1) + two*A1*(three-two*C2) + three*A2*(one-C2)*(one-C5);
85  F2 = B1*(gam1+gam2) - three*A1*(one-C2);
86  Rf1 = B1*(gam1-C1) / F1;
87  Rf2 = B1*gam1 / F2;
88  Rfc = gam1 / (gam1 + gam2);
89  Ri1 = myhalf*A2*F2/(A1*F1);
90  Ri2 = myhalf*Rf1/Ri1;
91  Ri3 = (two*Rf2-Rf1)/Ri1;
92 
93  initialized = true;
94  }
95 
96  AMREX_GPU_DEVICE
97  AMREX_FORCE_INLINE
98  amrex::Real calc_Rf (const amrex::Real GM, const amrex::Real GH) const
99  {
100  AMREX_ASSERT(initialized);
101  amrex::Real lGM = std::copysign(std::max(std::fabs(GM),eps),GM);
102  amrex::Real Ri = -GH/lGM;
103  return Ri1*(Ri + Ri2 - std::sqrt(Ri*Ri - Ri3*Ri + Ri2*Ri2));
104  }
105 
106  AMREX_GPU_DEVICE
107  AMREX_FORCE_INLINE
108  amrex::Real calc_SH (const amrex::Real Rf) const
109  {
110  AMREX_ASSERT(initialized);
111  return three*A2*(gam1+gam2)*(Rfc-Rf)/(one-Rf);
112  }
113 
114  AMREX_GPU_DEVICE
115  AMREX_FORCE_INLINE
116  amrex::Real calc_SM (const amrex::Real Rf) const
117  {
118  AMREX_ASSERT(initialized);
119  return A1*F1/(A2*F2) * (Rf1-Rf) / (Rf2-Rf) * calc_SH(Rf);
120  }
121 
122  bool initialized{false};
123 
124  amrex::Real A1, A2; // from Level amrex::Real(2.5)
126  const amrex::Real gam1 = amrex::Real(0.235);
130 
132 };
133 #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
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:64
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 SQmin
Definition: ERF_MYNNStruct.H:61
amrex::Real A1
Definition: ERF_MYNNStruct.H:43
bool diffuse_moistvars
Definition: ERF_MYNNStruct.H:67
amrex::Real SQmax
Definition: ERF_MYNNStruct.H:62
Definition: ERF_MYNNStruct.H:70
amrex::Real A2
Definition: ERF_MYNNStruct.H:124
amrex::Real F2
Definition: ERF_MYNNStruct.H:125
amrex::Real Rf1
Definition: ERF_MYNNStruct.H:128
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real calc_Rf(const amrex::Real GM, const amrex::Real GH) const
Definition: ERF_MYNNStruct.H:98
amrex::Real Rf2
Definition: ERF_MYNNStruct.H:128
const amrex::Real eps
Definition: ERF_MYNNStruct.H:131
amrex::Real Ri3
Definition: ERF_MYNNStruct.H:129
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real calc_SM(const amrex::Real Rf) const
Definition: ERF_MYNNStruct.H:116
const amrex::Real gam1
Definition: ERF_MYNNStruct.H:126
amrex::Real Ri2
Definition: ERF_MYNNStruct.H:129
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real calc_SH(const amrex::Real Rf) const
Definition: ERF_MYNNStruct.H:108
amrex::Real F1
Definition: ERF_MYNNStruct.H:125
amrex::Real Ri1
Definition: ERF_MYNNStruct.H:129
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:71
amrex::Real A1
Definition: ERF_MYNNStruct.H:124
bool initialized
Definition: ERF_MYNNStruct.H:122
amrex::Real Rfc
Definition: ERF_MYNNStruct.H:128
amrex::Real gam2
Definition: ERF_MYNNStruct.H:127