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