ERF
Energy Research and Forecasting: An Atmospheric Modeling Code
ERF_StormDiagnostics.H File Reference
#include "ERF_DataStruct.H"
Include dependency graph for ERF_StormDiagnostics.H:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Functions

AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real compute_max_reflectivity_dbz (amrex::Real rho_air, amrex::Real tmk, amrex::Real qra, amrex::Real qsn, amrex::Real qgr, int in0r, int in0s, int in0g, int iliqskin)
 

Function Documentation

◆ compute_max_reflectivity_dbz()

AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real compute_max_reflectivity_dbz ( amrex::Real  rho_air,
amrex::Real  tmk,
amrex::Real  qra,
amrex::Real  qsn,
amrex::Real  qgr,
int  in0r,
int  in0s,
int  in0g,
int  iliqskin 
)

Routines to compute strom diagnostics

16 {
17  using namespace amrex;
18 
19 
20  // ----------------------------------------------------------------
21  // Constants
22  // ----------------------------------------------------------------
23  constexpr amrex::Real pi = 3.14159265358979323846;
24  constexpr amrex::Real rhowat = 1000.0; // liquid water density [kg/m^3]
25  constexpr amrex::Real rho_r = 1000.0; // rain
26  constexpr amrex::Real rho_s = 100.0; // snow
27  constexpr amrex::Real rho_g = 400.0; // graupel
28  constexpr amrex::Real celkel = 273.15; // 0°C in Kelvin
29  constexpr amrex::Real alpha = 0.224;
30  constexpr amrex::Real gamma_seven = 720.0;
31 
32  // Constant intercepts
33  constexpr amrex::Real rn0_r = 8.e6;
34  constexpr amrex::Real rn0_s = 2.e7;
35  constexpr amrex::Real rn0_g = 4.e6;
36 
37  // Variable intercept constants
38  constexpr amrex::Real r1 = 1.e-15;
39  constexpr amrex::Real ron2 = 1.e10;
40  constexpr amrex::Real gon = 5.e7;
41  constexpr amrex::Real ron_min = 8.e6;
42  constexpr amrex::Real ron_qr0 = 1.0e-4;
43  constexpr amrex::Real ron_delqr0 = 0.25 * ron_qr0;
44  constexpr amrex::Real ron_const1r = (ron2 - ron_min) * 0.5;
45  constexpr amrex::Real ron_const2r = (ron2 + ron_min) * 0.5;
46 
47  // Precompute factors
48  const amrex::Real factor_r = gamma_seven * 1.e18 * std::pow(1.0 / (pi * rho_r), 1.75);
49  const amrex::Real factor_s = gamma_seven * 1.e18 * std::pow(1.0 / (pi * rho_s), 1.75)
50  * std::pow(rho_s / rhowat, 2.0) * alpha;
51  const amrex::Real factor_g = gamma_seven * 1.e18 * std::pow(1.0 / (pi * rho_g), 1.75)
52  * std::pow(rho_g / rhowat, 2.0) * alpha;
53 
54  // ----------------------------------------------------------------
55  // Adjust for bright band (liquid skin on frozen particles)
56  // ----------------------------------------------------------------
57  amrex::Real factorb_s = factor_s;
58  amrex::Real factorb_g = factor_g;
59  if (iliqskin == 1 && tmk > celkel) {
60  factorb_s = factor_s / alpha;
61  factorb_g = factor_g / alpha;
62  }
63 
64  // ----------------------------------------------------------------
65  // Variable intercepts
66  // ----------------------------------------------------------------
67  amrex::Real sonv = rn0_s;
68  if (in0s == 1) { // Thompson for snow
69  amrex::Real temp_c = std::min(-0.001, tmk - celkel);
70  sonv = std::min(2.0e8, 2.0e6 * std::exp(-0.12 * temp_c));
71  }
72 
73  amrex::Real gonv = rn0_g;
74  if (in0g == 1) { // Thompson for graupel
75  if (qgr > r1) {
76  gonv = 2.38 * std::pow(pi * rho_g / (rho_air * qgr), 0.92);
77  gonv = std::max(1.e4, std::min(gonv, gon));
78  }
79  }
80 
81  amrex::Real ronv = rn0_r;
82  if (in0r == 1) { // Thompson for rain
83  ronv = ron2;
84  if (qra > r1) {
85  ronv = ron_const1r * std::tanh((ron_qr0 - qra) / ron_delqr0) + ron_const2r;
86  }
87  }
88 
89  // ----------------------------------------------------------------
90  // Equivalent reflectivity factor Z_e [mm^6 m^-3]
91  // ----------------------------------------------------------------
92  amrex::Real z_e = factor_r * std::pow(rho_air * qra, 1.75) / std::pow(ronv, 0.75)
93  + factorb_s * std::pow(rho_air * qsn, 1.75) / std::pow(sonv, 0.75)
94  + factorb_g * std::pow(rho_air * qgr, 1.75) / std::pow(gonv, 0.75);
95 
96  // Clamp small values
97  z_e = std::max(z_e, 0.01);
98 
99  // ----------------------------------------------------------------
100  // Convert to dBZ
101  // ----------------------------------------------------------------
102  return 10.0 * std::log10(z_e);
103 }
amrex::Real Real
Definition: ERF_ShocInterface.H:16
Definition: ERF_ConsoleIO.cpp:12
real(c_double), parameter, private pi
Definition: ERF_module_mp_morr_two_moment.F90:100

Referenced by ERF::Write3DPlotFile().

Here is the caller graph for this function: