ERF
Energy Research and Forecasting: An Atmospheric Modeling Code
ERF_RANSClosure.H
Go to the documentation of this file.
1 /** \file ERF_RANSClosure.H
2  *
3  * Closure relations of the one-equation k RANS model of
4  * Axell & Liungman (2001), Environ. Fluid Mech. 1, 71-106 (AL01), as
5  * device-inline functions so that ComputeTurbulentViscosityRANS and the
6  * unit tests evaluate exactly the same expressions.
7  */
8 #ifndef ERF_RANS_CLOSURE_H_
9 #define ERF_RANS_CLOSURE_H_
10 
11 #include <cmath>
12 #include <AMReX_REAL.H>
13 #include <AMReX_GpuQualifiers.H>
14 #include <AMReX_Algorithm.H>
15 #include "ERF_NumericalConstants.H"
16 
17 namespace AL01 {
18 
19 /** Geometric length scale with the harmonic cap (AL01 Eq. 22 plus limiter).
20  * @param l_g_raw kappa times (wall distance + z0)
21  * @param l_g_max upper bound, about kappa times 0.1 zi
22  */
23 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
25 {
26  return l_g_max * l_g_raw / (l_g_max + l_g_raw);
27 }
28 
29 /** Burchard & Petersen smoothing of Rt below Rt_crit, which maps
30  * (-inf, Rt_crit) onto (Rt_min, Rt_crit) so the stability functions stay
31  * finite in strongly unstable air:
32  * Rt_s = Rt - (Rt - Rt_crit)^2 / (Rt + Rt_min - 2 Rt_crit).
33  * Written with x = Rt - Rt_crit and a = Rt_min - Rt_crit as
34  * Rt_s = Rt_crit + a x / (x + a),
35  * which is the same function without the cancellation of two O(|Rt|)
36  * terms that returned garbage for |Rt| beyond about 1e15 (tiny k under a
37  * strong unstable N^2). Limits: Rt_crit as x -> 0, Rt_min as x -> -inf. */
38 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
40 {
41  if (Rt >= Rt_crit) { return Rt; }
42  const amrex::Real x = Rt - Rt_crit; // < 0
43  const amrex::Real a = Rt_min - Rt_crit; // < 0 by input validation
44  return Rt_crit + a * x / (x + a);
45 }
46 
47 /** Turbulent length scale: neutral (l_g), stable (Eq. 26) or unstable
48  * (Eq. 28).
49  *
50  * Unstable: Eq. 28 is Eq. 26 rewritten with the dissipation of Eq. 19 on
51  * the right-hand side. Iterating it (dissipation from the new length,
52  * length from the new Rt) is the fixed-point map of Eq. 26 with N^2 < 0,
53  * which has no fixed point once l_g^2 |N^2| exceeds Cb^2 k (AL01, p. 78),
54  * so the length grows without bound in strongly convective, weakly
55  * turbulent air. Here Eq. 28 is evaluated once with the dissipation of the
56  * geometric length and the Burchard & Petersen smoothed Rt, as in the
57  * Kynema KLAxell implementation, which bounds the unstable length by
58  * l_g sqrt(1 + Cmu0^6 |Rt_min| / Cb^2), about 1.31 l_g for the defaults.
59  *
60  * @param l_g capped geometric length
61  * @param N2 Brunt-Vaisala frequency squared
62  * @param tke turbulent kinetic energy (floored, > 0)
63  * @param Cmu0_pow3 Cmu0 cubed
64  * @param inv_Cb_sq one over Cb squared
65  * @param Rt_crit, Rt_min smoothing parameters
66  * @param eps threshold below which N2 counts as neutral
67  */
68 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
70  amrex::Real Cmu0_pow3, amrex::Real inv_Cb_sq,
71  amrex::Real Rt_crit, amrex::Real Rt_min,
72  amrex::Real eps)
73 {
75  if (std::abs(N2) <= eps) {
76  length = l_g;
77  } else if (N2 > eps) {
78  // Stable (AL01, Eqn. 26)
79  length = std::sqrt(one /
80  (one / (l_g * l_g) + inv_Cb_sq * N2 / tke));
81  } else {
82  // Unstable (AL01, Eqn. 28) with Rt from the geometric length
83  // (Eq. 29 with Eq. 19: Rt = l_g^2 N^2 / (k Cmu0^6)), smoothed
84  const amrex::Real Rt = smooth_Rt(l_g*l_g * N2 / (tke * Cmu0_pow3 * Cmu0_pow3),
85  Rt_crit, Rt_min);
86  length = l_g * std::sqrt(one - Cmu0_pow3*Cmu0_pow3 * inv_Cb_sq * Rt);
87  }
88  return length;
89 }
90 
91 /** Upper bound of the unstable length for given smoothing parameters. */
92 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
94  amrex::Real inv_Cb_sq, amrex::Real Rt_min)
95 {
96  return l_g * std::sqrt(one - Cmu0_pow3*Cmu0_pow3 * inv_Cb_sq * Rt_min);
97 }
98 
99 /** Dissipation rate per unit volume, rho Cmu0^3 k^1.5 / L (AL01 Eq. 19). */
100 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
103 {
104  return rho * Cmu0_pow3 * std::pow(tke,amrex::Real(1.5)) / length;
105 }
106 
107 /** Turbulent Richardson number, Eq. 29 combined with Eq. 19:
108  * Rt = k^2 N^2 / eps^2 = L^2 N^2 / (k Cmu0^6). */
109 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
111  amrex::Real Cmu0_pow3)
112 {
113  return length*length * N2 / (tke * Cmu0_pow3 * Cmu0_pow3);
114 }
115 
116 
117 /** Momentum stability function (AL01 Eq. 31). */
118 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
120 {
121  return (Cmu0 + amrex::Real(0.108)*Rt)
122  / (one + amrex::Real(0.308)*Rt + amrex::Real(0.00837)*Rt*Rt);
123 }
124 
125 /** Scalar stability function (AL01 Eq. 32). */
126 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
128 {
129  return Cmu0 / (1 + amrex::Real(0.277)*Rt);
130 }
131 
132 /** Lowest admissible Rt_min: the poles of cmu' (Rt = -1/0.277) and of cmu
133  * (larger root of 1 + 0.308 Rt + 0.00837 Rt^2) both sit near -3.6. */
135 
136 } // namespace AL01
137 
138 #endif
const Real length
Definition: ERF_InitCustomPert_AnelasticWallDiffusion.H:14
Dimensionless numeric literals and pure mathematical constants.
constexpr amrex::Real one
Definition: ERF_NumericalConstants.H:30
amrex::Real Real
Definition: ERF_ShocInterface.H:19
Definition: ERF_RANSClosure.H:17
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real cmu_prime(amrex::Real Rt, amrex::Real Cmu0)
Definition: ERF_RANSClosure.H:127
constexpr amrex::Real Rt_min_lower_bound
Definition: ERF_RANSClosure.H:134
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real turb_length(amrex::Real l_g, amrex::Real N2, amrex::Real tke, amrex::Real Cmu0_pow3, amrex::Real inv_Cb_sq, amrex::Real Rt_crit, amrex::Real Rt_min, amrex::Real eps)
Definition: ERF_RANSClosure.H:69
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real richardson(amrex::Real length, amrex::Real N2, amrex::Real tke, amrex::Real Cmu0_pow3)
Definition: ERF_RANSClosure.H:110
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real cmu(amrex::Real Rt, amrex::Real Cmu0)
Definition: ERF_RANSClosure.H:119
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real smooth_Rt(amrex::Real Rt, amrex::Real Rt_crit, amrex::Real Rt_min)
Definition: ERF_RANSClosure.H:39
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real geom_length(amrex::Real l_g_raw, amrex::Real l_g_max)
Definition: ERF_RANSClosure.H:24
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real unstable_length_bound(amrex::Real l_g, amrex::Real Cmu0_pow3, amrex::Real inv_Cb_sq, amrex::Real Rt_min)
Definition: ERF_RANSClosure.H:93
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real dissipation(amrex::Real rho, amrex::Real Cmu0_pow3, amrex::Real tke, amrex::Real length)
Definition: ERF_RANSClosure.H:101
@ rho
Definition: ERF_Kessler.H:25