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

Provide terminal velocity calculations for atmospheric particles. More...

#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...
 
AMREX_GPU_HOST_DEVICE RT IceBohm (const RT a_m, const RT a_a, const RT a_c, const RT a_rhoi, const RT a_rho, const RT a_T) const noexcept
 Terminal velocity - ice particles (Bohm's theory) Ref: Shima et al., 2020, "Predicting the morphology of ice particles in deep convection using the super-droplet method: development and evaluation of SCALE-SDM 0.2.5-2.2.0, -2.2.1, and -2.2.2.", Geosci. Model Dev., 13, 4107–4157, 2020. More...
 
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE RT MeltBlendWeight (const RT a_ell) const noexcept
 Frick et al. (2013, Geosci. Model Dev. 6, Eq. 15) liquid-water-fraction weight for the fall speed of a melting (mixed) particle. Rises from 0 (dry ice) to 1 (fully melted) as the meltwater mass fraction a_ell goes 0 -> 1. More...
 
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE RT MixedPhaseVterm (const RT a_v_ice, const RT a_v_rain, const RT a_ell) const noexcept
 Terminal velocity of a melting (mixed) ice-water particle, interpolated between the dry-ice (Bohm) fall speed and the equivalent-raindrop fall speed by the meltwater mass fraction (Frick et al. 2013, Eq. 14). More...
 

Public Attributes

RT m_rho_w
 
RT m_rho_i
 

Detailed Description

template<typename RT>
struct TerminalVelocity< RT >

Provide terminal velocity calculations for atmospheric particles.

Template Parameters
RTReal-valued type.

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.

44  {
45  static const RT a = RT(3.778);
46  static const RT b = RT(0.67);
47  RT D = RT(2)*a_r*RT(1000); // meter -> mm
48  return a*(std::exp(b*std::log(D)));
49  }

◆ 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
63  {
64  RT lb4l = RT(6.62E-6); // base length[cm] for mean free path of air molecules
65  RT visb4l = RT(1.818E-4); // base dynamic viscosity[g/(cm*s)] for mean free path of air molecules
66  RT pb4l = RT(1013.25); // base pressure[hPa] for mean free path of air molecules
67  RT tb4l = RT(293.15); // base temperature[20C] for mean free path of air molecules
68 
69  RT P_hPa = a_P / RT(100.0); // [Pa] -> [hPa]
70  RT diameter_cm = RT(2.0)*std::min(a_r,RT(0.004))*RT(100.0); // [m] -> [cm]
71  RT rho_mat_cgs = m_rho_w/RT(1000.0); // [kg/m^3] -> [g/cm^3]
72  RT rho_air_cgs = a_rho/RT(1000.0); // [kg/m^3] -> [g/cm^3]
73  RT grav_cgs = CONST_GRAV * RT(100); // [m/s^2] -> [cm/s^2]
74 
75  RT gxdrow = grav_cgs * ( rho_mat_cgs - rho_air_cgs );
76  RT viscosity = viscCoeff(a_T);
77 
78  RT v_terminal = RT(0.0);
79  if (diameter_cm < RT(1.9e-3)) {
80  // small cloud droplets
81  RT sd_l = lb4l * (viscosity/visb4l) * (pb4l/P_hPa) * std::sqrt(a_T/tb4l);
82  RT c1 = gxdrow / (RT(18.0)*viscosity);
83  RT csc = RT(1.0) + RT(2.510) * (sd_l/diameter_cm);
84  v_terminal = c1 * csc * diameter_cm * diameter_cm;
85  } else if (diameter_cm < RT(1.07e-1)) {
86  // large cloud droplets and small raindrops
87  RT sd_l = lb4l * (viscosity/visb4l) * (pb4l/P_hPa) * std::sqrt(a_T/tb4l);
88  RT c2 = rho_air_cgs * (RT(4.0)*gxdrow)/(RT(three)*viscosity*viscosity);
89  RT nda = c2 * diameter_cm * diameter_cm * diameter_cm;
90  RT csc = RT(1.0) + RT(2.510) * ( sd_l / diameter_cm );
91  RT nre = csc * std::exp(vz_b_x(std::log(nda)));
92  v_terminal = (viscosity*nre)/(rho_air_cgs*diameter_cm);
93  } else {
94  // large raindrops
95  RT tau = RT(1.0) - a_T/RT(647.0960);
96  RT sigma = RT(0.2358) * std::exp( RT(1.2560)*std::log(tau) )
97  * ( RT(1.0) - RT(0.6250)*tau );
98  if( a_T<RT(267.5) ) {
99  tau = std::tanh( (a_T-RT(243.9))/RT(35.35) );
100  sigma = sigma - RT(2.854E-3) * tau + RT(1.666E-3);
101  }
102  sigma = sigma * RT(1.E+3); // N/m => g/s^2
103  RT c3 = (RT(4.0)*gxdrow)/(RT(three)*sigma);
104  RT bond = c3 * diameter_cm * diameter_cm;
105  RT npp = (rho_air_cgs*rho_air_cgs) * (sigma*sigma*sigma)
106  / (gxdrow*viscosity*viscosity*viscosity*viscosity);
107  npp = std::exp( std::log(npp)/RT(6.0) );
108  RT nre = npp * std::exp(vz_c_x(std::log(bond*npp)));
109  v_terminal = (viscosity*nre)/(rho_air_cgs*diameter_cm);
110  }
111 
112  v_terminal /= RT(100.0); // [cm/s] -> [m/s]
113  return v_terminal;
114  }
constexpr amrex::Real three
Definition: ERF_Constants.H:11
constexpr amrex::Real CONST_GRAV
Definition: ERF_Constants.H:64
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:120
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:137
RT m_rho_w
Definition: ERF_TerminalVelocity.H:15
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:20
Here is the call graph for this function:

◆ IceBohm()

template<typename RT >
AMREX_GPU_HOST_DEVICE RT TerminalVelocity< RT >::IceBohm ( const RT  a_m,
const RT  a_a,
const RT  a_c,
const RT  a_rhoi,
const RT  a_rho,
const RT  a_T 
) const
inlinenoexcept

Terminal velocity - ice particles (Bohm's theory) Ref: Shima et al., 2020, "Predicting the morphology of ice particles in deep convection using the super-droplet method: development and evaluation of SCALE-SDM 0.2.5-2.2.0, -2.2.1, and -2.2.2.", Geosci. Model Dev., 13, 4107–4157, 2020.

and

Code: https://doi.org/10.5281/zenodo.3483650 File: [...]/contrib/SDM/sdm_motion.f90 Copyright (c) 2012-2014, Team SCALE, All rights reserved.

Parameters
a_mmass
a_aice particle equatorial radius
a_cice particle polar radius
a_rhoiice particle density
a_rhodensity
a_Ttemperature
169  {
170  RT mu = RT(0.1) * viscCoeff(a_T); // viscCoeff is CGS poise; IceBohm is SI -> Pa.s
171 
172  auto phi = a_c / a_a; // aspect ratio
173  auto d = RT(2.0) * a_a; // characteristic length
174  auto q = std::exp( std::exp(-phi) * std::log(a_rhoi/m_rho_i) ); // area ratio
175 
176  RT X0 = RT(2.8e06);
177  auto t3 = RT(PI) * mu*mu * std::max(phi,RT(1.0)) * std::max(std::sqrt(std::sqrt(q)), q);
178  auto X = (RT(8.0)*a_m*RT(CONST_GRAV)*a_rho) / t3;
179  auto Xp = X * (RT(1.0) + (X/X0)*(X/X0)) / (RT(1.0) + RT(1.6)*(X/X0)*(X/X0));
180 
181  auto k = std::min( std::max(RT(0.82)+RT(0.18)*phi, RT(0.85)),
182  std::min( RT(0.37) + RT(0.63)/std::sqrt(phi),
183  RT(1.33)/(std::max(std::log(phi),RT(0.0))+RT(1.19)) ));
184 
185  auto phi_poly = RT(3.76)-RT(8.41)*phi+RT(9.18)*phi*phi-RT(3.53)*phi*phi*phi;
186  auto TVGamma = std::max( RT(1.0), std::min(RT(1.98), phi_poly) );
187 
188  auto C_DPS = std::max(RT(0.292)*k*TVGamma, RT(0.492) - RT(0.2)/std::sqrt(phi));
189  auto C_DP = std::max(RT(1.0), q*(RT(1.46)*q-RT(0.46))) * C_DPS;
190  auto C_DO = RT(4.5) * k*k * std::max(phi, RT(1.0));
191 
192  auto t2 = RT(1.0) + C_DP/(RT(6.0)*k) * std::sqrt(Xp/C_DP);
193  auto beta = std::sqrt(t2) - RT(1.0);
194  auto TVgamma = (C_DO-C_DP) / (RT(4.0)*C_DP);
195  auto t1 = RT(1.0) + (RT(2.0)*beta*std::exp(-beta*TVgamma)) / ((RT(2.0)+beta)*(RT(1.0)+beta));
196  auto N_Re = (RT(6.0)*k/C_DP) * beta*beta * t1;
197 
198  auto vterm = (mu*N_Re)/(a_rho*d);
199  return vterm;
200  }
constexpr amrex::Real PI
Definition: ERF_Constants.H:42
amrex::Real beta
Definition: ERF_InitCustomPert_DataAssimilation_ISV.H:10
@ mu
Definition: ERF_AdvanceMorrison.cpp:92
@ q
Definition: ERF_WSM6.H:184
RT m_rho_i
Definition: ERF_TerminalVelocity.H:16
Here is the call graph for this function:

◆ MeltBlendWeight()

template<typename RT >
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE RT TerminalVelocity< RT >::MeltBlendWeight ( const RT  a_ell) const
inlinenoexcept

Frick et al. (2013, Geosci. Model Dev. 6, Eq. 15) liquid-water-fraction weight for the fall speed of a melting (mixed) particle. Rises from 0 (dry ice) to 1 (fully melted) as the meltwater mass fraction a_ell goes 0 -> 1.

Parameters
a_ellmeltwater (liquid) mass fraction in [0,1]
207  {
208  return RT(0.246)*a_ell + RT(0.754)*a_ell*a_ell*a_ell*a_ell*a_ell*a_ell*a_ell;
209  }

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

Here is the caller graph for this function:

◆ MixedPhaseVterm()

template<typename RT >
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE RT TerminalVelocity< RT >::MixedPhaseVterm ( const RT  a_v_ice,
const RT  a_v_rain,
const RT  a_ell 
) const
inlinenoexcept

Terminal velocity of a melting (mixed) ice-water particle, interpolated between the dry-ice (Bohm) fall speed and the equivalent-raindrop fall speed by the meltwater mass fraction (Frick et al. 2013, Eq. 14).

Parameters
a_v_icedry-ice (Bohm) fall speed of the ice core
a_v_rainfall speed of the equivalent raindrop
a_ellmeltwater (liquid) mass fraction in [0,1]
218  {
219  return a_v_ice + (a_v_rain - a_v_ice) * MeltBlendWeight(a_ell);
220  }
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE RT MeltBlendWeight(const RT a_ell) const noexcept
Frick et al. (2013, Geosci. Model Dev. 6, Eq. 15) liquid-water-fraction weight for the fall speed of ...
Definition: ERF_TerminalVelocity.H:206
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.

36  {
37  static const RT k1 = RT(1.233e8); // m^{-1} s^{-1}
38  return (k1 * a_r * a_r);
39  }
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]
21  {
22  RT T_degC = a_T - RT(273.15); // [K] -> [deg Celsius]
23  RT viscosity = RT(0.0);
24  if (T_degC >= RT(0)) {
25  viscosity = (RT(1.7180) + RT(4.9e-3)*T_degC) * RT(1.0e-4);
26  } else {
27  viscosity = ( RT(1.7180) + RT(4.9e-3)*T_degC
28  - RT(1.2e-5)*T_degC*T_degC ) * RT(1.0e-4);
29  }
30  return viscosity;
31  }

Referenced by TerminalVelocity< RT >::CloudRainShima(), and TerminalVelocity< RT >::IceBohm().

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
121  {
122  RT x1 = a_x;
123  RT x2 = x1 * x1;
124  RT x3 = x1 * x2;
125  RT y = - RT(0.318657E+1)
126  + RT(0.9926960) * x1
127  - RT(0.153193E-2) * x2
128  - RT(0.987059E-3) * x3
129  - RT(0.578878e-3) * x2*x2
130  + RT(0.855176E-4) * x3*x2
131  - RT(0.327815E-5) * x3*x3;
132  return y;
133  }

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
138  {
139  RT x1 = a_x;
140  RT x2 = x1 * x1;
141  RT x3 = x1 * x2;
142  RT y = - RT(0.500015E+1)
143  + RT(0.523778E+1) * x1
144  - RT(0.204914E+1) * x2
145  + RT(0.47529400) * x3
146  - RT(0.542819E-1) * x2*x2
147  + RT(0.238449E-2) * x3*x2;
148  return y;
149  }

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

Here is the caller graph for this function:

Member Data Documentation

◆ m_rho_i

template<typename RT >
RT TerminalVelocity< RT >::m_rho_i

density of ice

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

◆ 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: