ERF
Energy Research and Forecasting: An Atmospheric Modeling Code
TerminalVelocity< RT > Struct Template Reference

#include <ERF_TerminalVelocity.H>

Collaboration diagram for TerminalVelocity< RT >:

Public Member Functions

AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE auto viscCoeff (const RT a_T) const noexcept
 Compute viscosity coefficient - Pruppacher & Klett, 1997. More...
 
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE RT RogersYau (const RT a_r) const noexcept
 Terminal velocity - Rogers & Yau, 1989. More...
 
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE RT AtlasUlbrich (const RT a_r) const noexcept
 Terminal velocity - Atlas & Ulbrich, 1977. More...
 
AMREX_GPU_HOST_DEVICE RT CloudRainShima (const RT a_r, const RT a_rho, const RT a_P, const RT a_T) const noexcept
 Terminal velocity - cloud/rain droplets Shima et al., 2009, "The super-droplet method for the numerical simulation of clouds and precipitation: A particle-based and probabilistic microphysics model coupled with a non- hydrostatic model." Quart. J. Roy. Meteorol. Soc., 135: 1307-1320 https://github.com/Shima-Lab/SCALE-SDM_BOMEX_Sato2018/blob/master/contrib/SDM/sdm_motion.f90. More...
 
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE RT vz_b_x (const RT a_x) const noexcept
 Compute vz_b(x) More...
 
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE RT vz_c_x (const RT a_x) const noexcept
 Compute vc_b(x) More...
 

Public Attributes

RT m_rho_w
 

Member Function Documentation

◆ AtlasUlbrich()

template<typename RT >
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE RT TerminalVelocity< RT >::AtlasUlbrich ( const RT  a_r) const
inlinenoexcept

Terminal velocity - Atlas & Ulbrich, 1977.

39  {
40  static const RT a = RT(3.778);
41  static const RT b = RT(0.67);
42  RT D = RT(2)*a_r*RT(1000); // meter -> mm
43  return a*(std::exp(b*std::log(D)));
44  }

◆ CloudRainShima()

template<typename RT >
AMREX_GPU_HOST_DEVICE RT TerminalVelocity< RT >::CloudRainShima ( const RT  a_r,
const RT  a_rho,
const RT  a_P,
const RT  a_T 
) const
inlinenoexcept

Terminal velocity - cloud/rain droplets Shima et al., 2009, "The super-droplet method for the numerical simulation of clouds and precipitation: A particle-based and probabilistic microphysics model coupled with a non- hydrostatic model." Quart. J. Roy. Meteorol. Soc., 135: 1307-1320 https://github.com/Shima-Lab/SCALE-SDM_BOMEX_Sato2018/blob/master/contrib/SDM/sdm_motion.f90.

Parameters
a_rradius
a_rhodensity
a_Ppressure
a_Ttemperature
58  {
59  RT lb4l = RT(6.62E-6); // base length[cm] for mean free path of air molecules
60  RT visb4l = RT(1.818E-4); // base dynamic viscosity[g/(cm*s)] for mean free path of air molecules
61  RT pb4l = RT(1013.25); // base pressure[hPa] for mean free path of air molecules
62  RT tb4l = RT(293.15); // base temperature[20C] for mean free path of air molecules
63 
64  RT P_hPa = a_P / RT(100.0); // [Pa] -> [hPa]
65  RT diameter_cm = RT(2.0)*a_r*RT(100.0); // [m] -> [cm]
66  RT rho_mat_cgs = m_rho_w/RT(1000.0); // [kg/m^3] -> [g/cm^3]
67  RT rho_air_cgs = a_rho/RT(1000.0); // [kg/m^3] -> [g/cm^3]
68  RT grav_cgs = CONST_GRAV * RT(100); // [m/s^2] -> [cm/s^2]
69 
70  RT gxdrow = grav_cgs * ( rho_mat_cgs - rho_air_cgs );
71 
72  RT viscosity = viscCoeff(a_T);
73 
74  RT v_terminal = RT(0.0);
75  if (diameter_cm < RT(1.9e-3)) {
76  // small cloud droplets
77  RT sd_l = lb4l * (viscosity/visb4l) * (pb4l/P_hPa) * std::sqrt(a_T/tb4l);
78  RT c1 = gxdrow / (RT(18.0)*viscosity);
79  RT csc = RT(1.0) + RT(2.510) * (sd_l/diameter_cm);
80  v_terminal = c1 * csc * diameter_cm * diameter_cm;
81  } else if (diameter_cm < RT(1.07e-1)) {
82  // large cloud droplets and small raindrops
83  RT sd_l = lb4l * (viscosity/visb4l) * (pb4l/P_hPa) * std::sqrt(a_T/tb4l);
84  RT c2 = rho_air_cgs * (RT(4.0)*gxdrow)/(RT(three)*viscosity*viscosity);
85  RT nda = c2 * diameter_cm * diameter_cm * diameter_cm;
86  RT csc = RT(1.0) + RT(2.510) * ( sd_l / diameter_cm );
87  RT nre = csc * std::exp(vz_b_x(std::log(nda)));
88  v_terminal = (viscosity*nre)/(rho_air_cgs*diameter_cm);
89  } else {
90  // large raindrops
91  RT tau = RT(1.0) - a_T/RT(647.0960);
92  RT sigma = RT(0.2358) * std::exp( RT(1.2560)*std::log(tau) )
93  * ( RT(1.0) - RT(0.6250)*tau );
94  if( a_T<RT(267.5) ) {
95  tau = std::tanh( (a_T-RT(243.9))/RT(35.35) );
96  sigma = sigma - RT(2.854E-3) * tau + RT(1.666E-3);
97  }
98  sigma = sigma * RT(1.E+3); // N/m => g/s^2
99  RT c3 = (RT(4.0)*gxdrow)/(RT(three)*sigma);
100  RT bond = c3 * diameter_cm * diameter_cm;
101  RT npp = (rho_air_cgs*rho_air_cgs) * (sigma*sigma*sigma)
102  / (gxdrow*viscosity*viscosity*viscosity*viscosity);
103  npp = std::exp( std::log(npp)/RT(6.0) );
104  RT nre = npp * std::exp(vz_c_x(std::log(bond*npp)));
105  v_terminal = (viscosity*nre)/(rho_air_cgs*diameter_cm);
106  }
107 
108  v_terminal /= RT(100.0); // [cm/s] -> [m/s]
109  return v_terminal;
110  }
constexpr amrex::Real three
Definition: ERF_Constants.H:9
constexpr amrex::Real CONST_GRAV
Definition: ERF_Constants.H:32
amrex::Real sigma
Definition: ERF_InitCustomPert_DataAssimilation_ISV.H:11
real(c_double), parameter c2
Definition: ERF_module_model_constants.F90:35
real(c_double), private c1
Definition: ERF_module_mp_morr_two_moment.F90:212
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE RT vz_b_x(const RT a_x) const noexcept
Compute vz_b(x)
Definition: ERF_TerminalVelocity.H:116
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE RT vz_c_x(const RT a_x) const noexcept
Compute vc_b(x)
Definition: ERF_TerminalVelocity.H:133
RT m_rho_w
Definition: ERF_TerminalVelocity.H:11
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE auto viscCoeff(const RT a_T) const noexcept
Compute viscosity coefficient - Pruppacher & Klett, 1997.
Definition: ERF_TerminalVelocity.H:15
Here is the call graph for this function:

◆ RogersYau()

template<typename RT >
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE RT TerminalVelocity< RT >::RogersYau ( const RT  a_r) const
inlinenoexcept

Terminal velocity - Rogers & Yau, 1989.

31  {
32  static const RT k1 = RT(1.233e8); // m^{-1} s^{-1}
33  return (k1 * a_r * a_r);
34  }
real(c_double), private k1
Definition: ERF_module_mp_morr_two_moment.F90:213

◆ viscCoeff()

template<typename RT >
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE auto TerminalVelocity< RT >::viscCoeff ( const RT  a_T) const
inlinenoexcept

Compute viscosity coefficient - Pruppacher & Klett, 1997.

Parameters
a_Ttemperature [K]
16  {
17  RT T_degC = a_T - RT(273.15); // [K] -> [deg Celsius]
18  RT viscosity = RT(0.0);
19  if (T_degC >= RT(0)) {
20  viscosity = (RT(1.7180) + RT(4.9e-3)*T_degC) * RT(1.0e-4);
21  } else {
22  viscosity = ( RT(1.7180) + RT(4.9e-3)*T_degC
23  - RT(1.2e-5)*T_degC*T_degC ) * RT(1.0e-4);
24  }
25  return viscosity;
26  }

Referenced by TerminalVelocity< RT >::CloudRainShima().

Here is the caller graph for this function:

◆ vz_b_x()

template<typename RT >
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE RT TerminalVelocity< RT >::vz_b_x ( const RT  a_x) const
inlinenoexcept

Compute vz_b(x)

Parameters
a_xx
117  {
118  RT x1 = a_x;
119  RT x2 = x1 * x1;
120  RT x3 = x1 * x2;
121  RT y = - RT(0.318657E+1)
122  + RT(0.9926960) * x1
123  - RT(0.153193E-2) * x2
124  - RT(0.987059E-3) * x3
125  - RT(0.578878e-3) * x2*x2
126  + RT(0.855176E-4) * x3*x2
127  - RT(0.327815E-5) * x3*x3;
128  return y;
129  }

Referenced by TerminalVelocity< RT >::CloudRainShima().

Here is the caller graph for this function:

◆ vz_c_x()

template<typename RT >
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE RT TerminalVelocity< RT >::vz_c_x ( const RT  a_x) const
inlinenoexcept

Compute vc_b(x)

Parameters
a_xx
134  {
135  RT x1 = a_x;
136  RT x2 = x1 * x1;
137  RT x3 = x1 * x2;
138  RT y = - RT(0.500015E+1)
139  + RT(0.523778E+1) * x1
140  - RT(0.204914E+1) * x2
141  + RT(0.47529400) * x3
142  - RT(0.542819E-1) * x2*x2
143  + RT(0.238449E-2) * x3*x2;
144  return y;
145  }

Referenced by TerminalVelocity< RT >::CloudRainShima().

Here is the caller graph for this function:

Member Data Documentation

◆ m_rho_w

template<typename RT >
RT TerminalVelocity< RT >::m_rho_w

density of water

Referenced by TerminalVelocity< RT >::CloudRainShima().


The documentation for this struct was generated from the following file: