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>
15 #ifdef ERF_USE_PARTICLES
24 using amrex::ParticleReal;
27 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
28 auto viscCoeff (
const ParticleReal a_T )
30 auto T_degC = a_T - ParticleReal(
tmelt);
31 ParticleReal visc_coeff = ParticleReal(
zero);
32 if( T_degC >= ParticleReal(
zero) ) {
33 visc_coeff = ( ParticleReal(1.7180) + ParticleReal(4.9E-3)*T_degC ) * ParticleReal(1.E-5);
35 visc_coeff = ( ParticleReal(1.7180) + ParticleReal(4.9E-3)*T_degC - ParticleReal(1.2E-5)*T_degC*T_degC ) * ParticleReal(1.E-5);
53 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
54 auto impactVelocity_RasmussenHeymsfield1985(
const ParticleReal a_Re,
55 const ParticleReal a_St )
59 if (a_St >= ParticleReal(0.1)) {
65 ParticleReal retval = ParticleReal(
zero);
66 if(a_Re < (ParticleReal(10.0)+ParticleReal(30.0))*ParticleReal(
myhalf)) {
67 if (a_St < ParticleReal(0.4)) {
68 retval = ParticleReal(
zero);
69 }
else if (a_St<ParticleReal(10.0)) {
70 retval = ParticleReal(0.1701) + ParticleReal(0.7246)*
w + ParticleReal(0.2257)*w2 - ParticleReal(1.13)*w3 + ParticleReal(0.5756)*w4;
72 retval = ParticleReal(0.57);
74 }
else if (a_Re < (ParticleReal(30.0)+ParticleReal(100.0))*ParticleReal(
myhalf)) {
75 if (a_St < ParticleReal(0.1)) {
76 retval = ParticleReal(
zero);
77 }
else if (a_St < ParticleReal(10.0)) {
78 retval = ParticleReal(0.2927) + ParticleReal(0.5085)*
w - ParticleReal(0.03453)*w2 - ParticleReal(0.2184)*w3 + ParticleReal(0.03595)*w4;
80 retval = ParticleReal(0.59);
82 }
else if (a_Re < (ParticleReal(100.0)+ParticleReal(300.0))*ParticleReal(
myhalf)) {
83 if (a_St < ParticleReal(0.1)) {
84 retval = ParticleReal(
zero);
85 }
else if (a_St < ParticleReal(10.0)) {
86 retval = ParticleReal(0.3272) + ParticleReal(0.4907)*
w - ParticleReal(0.09452)*w2 - ParticleReal(0.1906)*w3 + ParticleReal(0.07105)*w4;
88 retval = ParticleReal(0.61);
91 if (a_St < ParticleReal(0.1)) {
92 retval = ParticleReal(
zero);
93 }
else if (a_St < ParticleReal(10.0)) {
94 retval = ParticleReal(0.356) + ParticleReal(0.4738)*
w - ParticleReal(0.1233)*w2 - ParticleReal(0.1618)*w3 + ParticleReal(0.08087)*w4;
96 retval = ParticleReal(0.63);
99 retval = std::max(retval,ParticleReal(
zero));
104 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
105 ParticleReal iceSurfaceTemperature(
const ParticleReal a_T,
106 const ParticleReal a_P,
107 const ParticleReal a_qv,
108 const ParticleReal a_D,
109 const SDMassChangeUtils_SV::dMdt<ParticleReal>& a_dmdt )
113 ParticleReal qsat = ParticleReal(qsat_r);
114 auto sup_sat = a_qv/qsat - ParticleReal(
one);
115 auto drho = sup_sat / (a_D * a_dmdt.Fk_plus_Fd(a_T, ParticleReal(
erf_esati(a_T)*
Real(100.0)), a_D));
116 auto dT = (a_dmdt.L * a_D / a_dmdt.K) * drho;
135 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
136 auto rimeDensity_HeymsfieldPflaum1985(
const ParticleReal a_radius,
137 const ParticleReal a_a,
138 const ParticleReal a_c,
139 const ParticleReal a_vz_w,
140 const ParticleReal a_vz_i,
141 const ParticleReal a_rho_w,
142 const ParticleReal a_D,
143 const SDMassChangeUtils_SV::dMdt<ParticleReal>& a_dmdt,
144 const ParticleReal a_T,
145 const ParticleReal a_rhom,
146 const ParticleReal a_P,
147 const ParticleReal a_qv )
149 auto r_um = a_radius * ParticleReal(1.0e6);
150 auto mu = viscCoeff(a_T);
152 auto maxD = ParticleReal(
two) * std::max(a_a,a_c);
153 auto Re = a_rhom * maxD * std::abs(a_vz_i) /
mu;
154 auto eqr_i = std::cbrt(a_a*a_a*a_c);
155 auto St = ParticleReal(
two)*std::abs(a_vz_i)*a_radius*a_radius*a_rho_w/(ParticleReal(9.0)*
mu*eqr_i);
157 auto v_impact_ratio = impactVelocity_RasmussenHeymsfield1985(Re,St);
158 auto v_impact = std::abs(a_vz_i - a_vz_w) * v_impact_ratio;
160 auto T_surf = std::min(ParticleReal(-0.01), iceSurfaceTemperature(a_T,a_P,a_qv,a_D,a_dmdt) - ParticleReal(
tmelt));
161 auto var_Y = -r_um * v_impact/T_surf;
163 ParticleReal rho_rime = ParticleReal(
zero);
164 if ((T_surf <= ParticleReal(-5.0)) || (var_Y < ParticleReal(1.6))) {
165 rho_rime = ParticleReal(0.30) * std::pow(var_Y, ParticleReal(0.44));
167 var_Y = std::min(var_Y,ParticleReal(3.5));
168 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);
170 rho_rime = std::min(ParticleReal(0.91),std::max(rho_rime,ParticleReal(0.1))) * ParticleReal(1000.0);
constexpr amrex::Real two
Definition: ERF_Constants.H:10
constexpr amrex::Real one
Definition: ERF_Constants.H:9
constexpr amrex::Real zero
Definition: ERF_Constants.H:8
constexpr amrex::Real tmelt
Definition: ERF_Constants.H:130
constexpr amrex::Real myhalf
Definition: ERF_Constants.H:13
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real erf_esati(amrex::Real t)
Definition: ERF_MicrophysicsUtils.H:31
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void erf_qsati(amrex::Real t, amrex::Real p, amrex::Real &qsati)
Definition: ERF_MicrophysicsUtils.H:218
Real w
Definition: ERF_Plotfile2DInterpolator.cpp:22
amrex::Real Real
Definition: ERF_ShocInterface.H:19
@ mu
Definition: ERF_AdvanceMorrison.cpp:92