1 #ifndef SUPERDROPLET_PC_RIMING_H_
2 #define SUPERDROPLET_PC_RIMING_H_
7 #include <AMReX_REAL.H>
8 #include <AMReX_GpuQualifiers.H>
9 #include <AMReX_Math.H>
16 #ifdef ERF_USE_PARTICLES
25 using amrex::ParticleReal;
28 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
29 auto viscCoeff (
const ParticleReal a_T )
31 auto T_degC = a_T - ParticleReal(
tmelt);
32 ParticleReal visc_coeff = ParticleReal(
zero);
33 if( T_degC >= ParticleReal(
zero) ) {
34 visc_coeff = ( ParticleReal(1.7180) + ParticleReal(4.9E-3)*T_degC ) * ParticleReal(1.E-5);
36 visc_coeff = ( ParticleReal(1.7180) + ParticleReal(4.9E-3)*T_degC - ParticleReal(1.2E-5)*T_degC*T_degC ) * ParticleReal(1.E-5);
54 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
55 auto impactVelocity_RasmussenHeymsfield1985(
const ParticleReal a_Re,
56 const ParticleReal a_St )
60 if (a_St >= ParticleReal(0.1)) {
66 ParticleReal retval = ParticleReal(
zero);
67 if(a_Re < (ParticleReal(10.0)+ParticleReal(30.0))*ParticleReal(
myhalf)) {
68 if (a_St < ParticleReal(0.4)) {
69 retval = ParticleReal(
zero);
70 }
else if (a_St<ParticleReal(10.0)) {
71 retval = ParticleReal(0.1701) + ParticleReal(0.7246)*
w + ParticleReal(0.2257)*w2 - ParticleReal(1.13)*w3 + ParticleReal(0.5756)*w4;
73 retval = ParticleReal(0.57);
75 }
else if (a_Re < (ParticleReal(30.0)+ParticleReal(100.0))*ParticleReal(
myhalf)) {
76 if (a_St < ParticleReal(0.1)) {
77 retval = ParticleReal(
zero);
78 }
else if (a_St < ParticleReal(10.0)) {
79 retval = ParticleReal(0.2927) + ParticleReal(0.5085)*
w - ParticleReal(0.03453)*w2 - ParticleReal(0.2184)*w3 + ParticleReal(0.03595)*w4;
81 retval = ParticleReal(0.59);
83 }
else if (a_Re < (ParticleReal(100.0)+ParticleReal(300.0))*ParticleReal(
myhalf)) {
84 if (a_St < ParticleReal(0.1)) {
85 retval = ParticleReal(
zero);
86 }
else if (a_St < ParticleReal(10.0)) {
87 retval = ParticleReal(0.3272) + ParticleReal(0.4907)*
w - ParticleReal(0.09452)*w2 - ParticleReal(0.1906)*w3 + ParticleReal(0.07105)*w4;
89 retval = ParticleReal(0.61);
92 if (a_St < ParticleReal(0.1)) {
93 retval = ParticleReal(
zero);
94 }
else if (a_St < ParticleReal(10.0)) {
95 retval = ParticleReal(0.356) + ParticleReal(0.4738)*
w - ParticleReal(0.1233)*w2 - ParticleReal(0.1618)*w3 + ParticleReal(0.08087)*w4;
97 retval = ParticleReal(0.63);
100 retval = std::max(retval,ParticleReal(
zero));
105 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
106 ParticleReal iceSurfaceTemperature(
const ParticleReal a_T,
107 const ParticleReal a_P,
108 const ParticleReal a_qv,
109 const ParticleReal a_D,
110 const SDMassChangeUtils_SV::dMdt<ParticleReal>& a_dmdt )
114 ParticleReal qsat = ParticleReal(qsat_r);
115 auto sup_sat = a_qv/qsat - ParticleReal(
one);
116 auto drho = sup_sat / (a_D * a_dmdt.Fk_plus_Fd(a_T, ParticleReal(
erf_esati(a_T)*
Real(100.0)), a_D));
117 auto dT = (a_dmdt.L * a_D / a_dmdt.K) * drho;
136 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
137 auto rimeDensity_HeymsfieldPflaum1985(
const ParticleReal a_radius,
138 const ParticleReal a_a,
139 const ParticleReal a_c,
140 const ParticleReal a_vz_w,
141 const ParticleReal a_vz_i,
142 const ParticleReal a_rho_w,
143 const ParticleReal a_D,
144 const SDMassChangeUtils_SV::dMdt<ParticleReal>& a_dmdt,
145 const ParticleReal a_T,
146 const ParticleReal a_rhom,
147 const ParticleReal a_P,
148 const ParticleReal a_qv )
150 auto r_um = a_radius * ParticleReal(1.0e6);
151 auto mu = viscCoeff(a_T);
153 auto maxD = ParticleReal(
two) * std::max(a_a,a_c);
154 auto Re = a_rhom * maxD * std::abs(a_vz_i) /
mu;
155 auto eqr_i = std::cbrt(a_a*a_a*a_c);
156 auto St = ParticleReal(
two)*std::abs(a_vz_i)*a_radius*a_radius*a_rho_w/(ParticleReal(9.0)*
mu*eqr_i);
158 auto v_impact_ratio = impactVelocity_RasmussenHeymsfield1985(Re,St);
159 auto v_impact = std::abs(a_vz_i - a_vz_w) * v_impact_ratio;
161 auto T_surf = std::min(ParticleReal(-0.01), iceSurfaceTemperature(a_T,a_P,a_qv,a_D,a_dmdt) - ParticleReal(
tmelt));
162 auto var_Y = -r_um * v_impact/T_surf;
164 ParticleReal rho_rime = ParticleReal(
zero);
165 if ((T_surf <= ParticleReal(-5.0)) || (var_Y < ParticleReal(1.6))) {
166 rho_rime = ParticleReal(0.30) * std::pow(var_Y, ParticleReal(0.44));
168 var_Y = std::min(var_Y,ParticleReal(3.5));
169 rho_rime = std::exp(ParticleReal(-0.03115) - ParticleReal(1.7030)*var_Y + ParticleReal(0.9116)*var_Y*var_Y - ParticleReal(0.1224)*var_Y*var_Y*var_Y);
171 rho_rime = std::min(ParticleReal(0.91),std::max(rho_rime,ParticleReal(0.1))) * ParticleReal(1000.0);
Physical constants and tuning parameters used only by the moisture and cloud-physics code.
constexpr amrex::Real tmelt
Definition: ERF_MicrophysicsConstants.H:122
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real erf_esati(amrex::Real t)
Definition: ERF_MicrophysicsUtils.H:67
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void erf_qsati(amrex::Real t, amrex::Real p, amrex::Real &qsati)
Definition: ERF_MicrophysicsUtils.H:254
Dimensionless numeric literals and pure mathematical constants.
constexpr amrex::Real two
Definition: ERF_NumericalConstants.H:31
constexpr amrex::Real one
Definition: ERF_NumericalConstants.H:30
constexpr amrex::Real zero
Definition: ERF_NumericalConstants.H:29
constexpr amrex::Real myhalf
Definition: ERF_NumericalConstants.H:34
Real w
Definition: ERF_Plotfile2DInterpolator.cpp:22
amrex::Real Real
Definition: ERF_ShocInterface.H:19
@ mu
Definition: ERF_AdvanceMorrison.cpp:92