Basics
Diagnostic equations to calculate necessary parameters for microphysics from prognostic variables.
\( \rho_{d} = \rho – \rho_{v} – \rho_{c} – \rho_{r} – \rho_{i} – \rho_{s}\) |
\(C_{pml} = (\rho_{d} \cdot 1004. + \rho_{v} \cdot 1885. + (\rho_{c}+\rho_{r}) \cdot 4186. + (\rho_{i} + \rho_{s}) \cdot 2110.\) |
\(R_{ml}= (/rho_{d} \cdot 287. + rho_{v} \cdot * 461.)\) |
\(\theta = exp(( \mu \theta + R_{ml}*log(p_{0}))/C_{pml}\) |
\(T_{s} = \frac{\mu \theta}{(C_{pml} – R_{ml})}+ \frac{1.}{C_{pml/rml} -1.} \cdot log(R_{ml})\) |
\(p_{s}= \frac{\mu \theta}{C_{pml-rml}}+\frac{1.}{(1.-R_{ml}/C_{pml})} \cdot log(R_{ml})\) |
\(T = exp^{T_{s}}\) |
temperature |
\(p = exp^{p_{s}}\) |
pressure |
\(p_{v} = T_{s} + log(461.0 \cdot \rho–{v})\) |
vaporpressure |
\(p_{vs} = 59.260894042828049 + \frac{1885.0-4186.0}{461.0} \cdot T_{s} – \frac{3128518.15}{461.0} \cdot exp^{-T_s}\) |
saturation vapor pressure |
\(L_{v} = 3128518.15 + (1885.0-4186.0) \cdot exp^{T_{s}}\) |
latent heat for condensation/evaporation |
\(L_{vi} = 3.330e+5\) |
latent heat for freezing/melting |
\(S = 100.0 \cdot (exp^{p_{v}}/exp^{p_{vs}}-1.)\) |
supersaturation in % |
\(RelCloud = 0.1\) |
relaxation parameters for smoothing |
\(RelCloud2 = 1.0\) |
Parameters for different distribution functions and particle properties for the classes cloud water, rain water, ice and snow.
p_cloud.nu = 0.333333;
p_cloud.mu = 0.666666;
p_cloud.x_max = 2.60e-10;
p_cloud.x_min = 4.20e-15;
p_cloud.a_geo = 1.24e-01;
p_cloud.b_geo = 0.333333;
p_cloud.a_vel = 3.75e+05;
p_cloud.b_vel = 0.666667;
p_cloud.a_ven = 0.780000;
p_cloud.b_ven = 0.308000;
p_cloud.cap = 2.0;
p_cloud.k_au = 0.0;
p_cloud.k_sc = 0.0;
p_cloud.k_c = 0.0;
p_cloud.k_1 = 0.0;
p_cloud.k_2 = 0.0;
p_rain.nu = -0.666666;
p_rain.mu = 0.333333;
p_rain.x_max = 3.00e-06;
p_rain.x_min = 2.60e-10;
p_rain.a_geo = 1.24e-01;
p_rain.b_geo = 0.333333;
p_rain.a_vel = 1.59e+02;
p_rain.b_vel = 0.266667;
p_rain.a_ven = 0.780000;
p_rain.b_ven = 0.308000;
p_rain.cap = 2.0;
p_rain.k_au = 0.0;
p_rain.k_sc = 0.0;
p_rain.k_c = 0.0;
p_rain.k_1 = 0.0;
p_rain.k_2 = 2.0;
// HK87 'hex plates'
p_ice.nu = -0.333333;
p_ice.mu = 0.333333;
p_ice.x_max = 1.00e-07;
p_ice.x_min = 1.00e-12;
p_ice.a_geo = 2.17e-01;
p_ice.b_geo = 0.302115;
p_ice.a_vel = 4.19e+01;
p_ice.b_vel = 0.260000;
p_ice.a_ven = 0.860000;
p_ice.b_ven = 0.280000;
p_ice.cap = 3.141593;
p_ice.k_au = 0.0;
p_ice.k_sc = 0.0;
p_ice.k_c = 0.0;
p_ice.k_1 = 0.0;
p_ice.k_2 = 2.0;
//Locatelli and Hobbs
p_snow.nu = 0.500000;
p_snow.mu = 0.50000;
p_snow.x_max = 2.00e-06;
p_snow.x_min = 1.73e-09;
p_snow.a_geo = 8.16e-00;
p_snow.b_geo = 0.526316;
p_snow.a_vel = 2.77e+01;
p_snow.b_vel = 0.215790;
p_snow.a_ven = 0.780000;
p_snow.b_ven = 0.308000;
p_snow.cap = 2.0;
p_snow.k_au = 0.0;
p_snow.k_sc = 0.0;
p_snow.k_c = 0.0;
p_snow.k_1 = 0.0;
p_snow.k_2 = 2.0;
|
further parameters needed in autoconversion and self collection kernels
p_cloud.k_c = 4.44e+9; //..long-Kernel
p_cloud.k_1 = 4.00e+2; //..parameter for Phi-function.
p_cloud.k_2 = 0.7e+0; //..parameter for Phi-function.
p_cloud.k_au = 1.99047e+19; //..parameter for autoconversion.
p_cloud.k_sc = 2.05131e+10; //..parameter for selfcollection.
|
Warm Microphysics
Nucleation
kccn = 0.462
upper cell
Tszr =mythetazr/(cpmlzr-rmlzr)+1./(cpmlzr/rmlzr-1.)*log(rmlzr);
pszr =mythetazr/(cpmlzr-rmlzr)+1./(1.-rmlzr/cpmlzr)*log(rmlzr);
pvzr =Tszr+log(461.0*rhovzr);
pvszr=59.260894042828049+(1885.0-4186.0)/461.0*Tszr-3128518.15/461.0*exp(-Tszr);
S2 =100.0*(exp(pvzr)/exp(pvszr)-1.0);
dSdzw=(S2-S)/dz*wLoc
calculate nucleation rate
if(S>0.0 && dSdzw>0.0 && exp(Ts)>233.15 && wLoc>0.0)
nuc=nv*kccn/S*dSdzw;
forcing=nuc;
limiter=nv;
dnc =RelCloud2*(forcing+limiter-sqrt(forcing*forcing+limiter*limiter));
drhoc =dnc*1e-12; // 1e-12 is smallest drop mass
drhoTh =Lv/T*drhoc+(Ts*(4186.0-1885.0)+ps*461.0)*drhoc
|
Condensation/Evaporation cloud water
forcing= rhov-(exp(pvs-Ts)/461.0);
limiter= texture2D(t1,pos).a;
drhoc = RelCloud*(forcing-limiter+sqrt(forcing*forcing+limiter*limiter));
drhoTh = Lv/T*drhoc+(Ts*(4186.0-1885.0)+ps*461.0)*drhoc
|
Autoconversion Cloudwater to Rain
x_s=p_cloud.x_max;
k_rr=7.12;
if(rhoc>1e-9)
{
x_c=min(max(rhoc/(nc+1e-33),p_cloud.x_min),p_cloud.x_max); //..mean mass in SI
au = p_cloud.k_au*rhoc*rhoc*x_c*x_c*rho0/(rho+1e-33); //..autoconversion rate (SB2000)
if(rhoc>1e-6)
{
tau=min(max(1.0-rhoc/(rhoc+rhor+1e-33),1e-33),1.0e0-1.0e-1);
phi=400.*pow(tau,0.7)*pow(1.-pow(tau,0.7),3.);
au =au*(1.0+phi/pow(1.0-tau,2.0)) } }
forcing= au/x_s;
limiter= nc;
dnr = RelCloud2*(forcing+limiter-sqrt(forcing*forcing+limiter*limiter));
forcing= au;
limiter= texture2D(t1,pos).a; //rhoc;
drhor = RelCloud2*(forcing+limiter-sqrt(forcing*forcing+limiter*limiter))
|
Selfcollection cloud droplets
sc = p_cloud.k_sc*rhoc*rhoc*rho0/(rho+1e-33);
forcing= -sc;
limiter= nc;
dnc = RelCloud2*(forcing-limiter+sqrt(forcing*forcing+limiter*limiter))
|
Selfcollection Rain
x_r=min(max(rhor/(nr+1e-33),p_rain.x_min),p_rain.x_max);
D_r=p_rain.a_geo*pow(x_r,p_rain.b_geo);
sc =k_rr*nr*rhor*sqrt(rho0/(rho+1e-33));
forcing= -sc;
limiter= nr;
dnrsc = RelCloud2*(forcing-limiter+sqrt(forcing*forcing+limiter*limiter))
|
Sedimentation Rain
a_qc=8420.0;
b_qc=0.8;
rho_qc=1000.0;
N_qc =8.0;
alf=9.65e+0;
bet=1.03e+1;
gam=6.00e+2;
if(rhor>1.0e-10)
{
xr = rhor/(nr+1e-33); //..mean mass in SI
xr = min(max(xr,p_rain.x_min),p_rain.x_max);
Dm = pow(6./(1000.0*3.14)*xr,1./3.);
mue= (p_rain.nu+1.0e0)/p_rain.b_geo - 1.0e0;
Dr = pow(pow(Dm,3.0)/((mue+3.)*(mue+2.)*(mue+1.)),1./3.);
vn = alf-bet/pow(1.0+gam*Dr,mue+1.);
vq = alf-bet/pow(1.0+gam*Dr,mue+4.);
vn = vn*pow(rho0/(rho+1e-33),0.5);
vq = vq*pow(rho0/(rho+1e-33),0.5);
vn = max(vn,1.e-1);
vq = max(vq,1.e-1);
vn = min(vn,2.e+1);
vq = min(vq,2.e+1);
Flux = min(rhor*vq/dz,rhor/2./dt);
drhor -= Flux;
drhoTh-= Ts*4186.0*Flux;
Flux = min(nr*vn/dz,nr/2./dt);
dnr -= Flux;
}
|
Subsidence
h=float(zpos)*dz;
//if(h<2260.)Subsidence=vsub/2260.*h;
Subsidence=vsub;
thetar = exp((mythetazr+rmlzr*log(p0))/cpmlzr);
thetal = exp((mythetazl+rmlzl*log(p0))/cpmlzl);
Flux = Subsidence*(thetar-thetal)/2./dz;
drhoTh+= cpml/theta*Flux;
Flux = Subsidence*(rhorzr-rhorzl)/2./dz;
drhor += Flux;
drhoTh+= Ts*4186.0*Flux;
Flux = Subsidence*(rhovzr-rhovzl)/2./dz;
drhov += Flux;
drhoTh+= (Ts*1885.0+ps*461.0)*Flux;
Flux = Subsidence*(rhoczr-rhoczl)/2./dz;
drhoc += Flux;
drhoTh+= Ts*4186.0*Flux;
Flux = Subsidence*(nczr-nczl)/2./dz;
dnc += Flux;
Flux = Subsidence*(nrzr-nrzl)/2./dz;
dnr += Flux
|
Evaporation Rain
K_T = 2.500e-2;
nu_l = 1.460e-5 ; //..kinematic viscosity of air
N_sc = 0.710; //..Schmidt-Number (PK, S.541)
n_f = 0.333; //..exponent of N_sc in ventilation coefficient (PK, S.541)
m_f = 0.500; //..exponent of N_re in ventilation coefficient (PK, S.541)
q_krit = 1.000e-9;
a_q = 0.429250753972163723;
b_q = 0.180944125457962318;
c_r = 1.0 / p_rain.cap;
if(S<0.0 && rhor>0.0)
{
D_vtp = pow(8.7602e-5*T,1.81)/p;
g_d = 4.0*3.14/(Lv*Lv/(K_T*287.0*T*T)+287.0*T/(D_vtp*exp(pvs)));
x_r = min(max(rhor/(nr+1e-10),p_rain.x_min),p_rain.x_max);
//x_r = max(5e-5*rhor,min(rain.x_min,0.05*rhor));
d_r = p_rain.a_geo * pow(x_r,p_rain.b_geo);
v_r = p_rain.a_vel * pow(x_r,p_rain.b_vel) * pow(rho0/(rho+1e-33),0.5);
N_re = v_r*d_r/nu_l;
f_v = pow(N_sc,n_f)*pow(N_re,m_f);
f_q = a_q+b_q*f_v;
eva = g_d*max(nr,1e3)*c_r*d_r*S;
eva_q = min(-5e-9,100.*f_q*eva);
eva_n = eva_q/x_r;
}
forcing= eva_q;
limiter= texture2D(t2,pos).r; //rhor;
drhor = RelCloud2*(forcing-limiter+sqrt(forcing*forcing+limiter*limiter));
drhov = -drhor; //RelCloud*(forcing+limiter-sqrt(forcing*forcing+limiter*limiter));
forcing= eva_n;
limiter= nr; //nr;
dnr = RelCloud2*(forcing-limiter+sqrt(forcing*forcing+limiter*limiter));
dnv = -dnr;
drhoTh = -Lv/T*drhov-(Ts*(4186.0-1885.0)+ps*461.0)*drhov
|
Cold Microphysics
Freezing of cloud droplets
if(T<273.15)
{
T_c=T-273.15;
facg=2.173;
if(T_c< -50.0)
{
fr_q= rhoc;
fr_n= nc;
}
else
{
x_c = min(max(rhoc/(nc+1e-33),p_cloud.x_min),p_cloud.x_max); //..mean mass
//..homogeneous freezing (Jeffrey und Austin (1997), see Cotton und Field (2001) as well)
if(T_c>-30.0)
j_hom = 1.0e6 * exp(-7.63-2.996*(T_c+30.0)); //..J in 1/(m3 s)
else
j_hom = 1.0e6 * exp(-243.4-14.75*T_c-0.307*pow(T_c,2.0)-0.00287*pow(T_c,3.0)-0.0000102*pow(T_c,4.0));
fr_q= j_tot*rhoc*x_c*facg;
fr_n= j_tot*rhoc;
}
}
forcing= fr_q;
limiter= texture2D(t1,pos).a; //rhoc;
drhoi = RelCloud*(forcing+limiter-sqrt(forcing*forcing+limiter*limiter));
forcing= fr_n;
limiter= texture2D(t3,pos).r; //nc;
dni = RelCloud*(forcing+limiter-sqrt(forcing*forcing+limiter*limiter));
drhoTh = Lvi/T*drhoi+(Ts*(2110.0-4186.0))*drhoi
|
Selfcollection ice and snow
ice_s_vel=0.25; // dispersion der fallges.
snow_s_vel=0.25; // dispersion der fallges.
delta_n=3.56212;
theta_n=0.100138;
if(rhoi>1e-9)
{
x_i = min(max(rhoi/(ni+1e-33),p_ice.x_min),p_ice.x_max);
D_i = pow(p_ice.a_geo*x_i,p_ice.b_geo); //..mean diameter
if(T>273.15) e_coll = 1.0; //..temperature dependent efficiency (Cotton et al., 1986)
else e_coll = min(pow(10.0,0.035*(T-273.15)-0.7),0.2e0); // (see Straka, 1989; S. 53)
v_i = pow(p_ice.a_vel*x_i,p_ice.b_vel)*rho0/(rho+1e-33); //..mean sedimentationvelocity
sn = 3.14*0.25e0*e_coll*ni* ni*D_i*D_i*sqrt(1.0*v_i*v_i+2.0*ice_s_vel*ice_s_vel);
sq = 3.14*0.25e0*e_coll*ni*rhoi*D_i*D_i*sqrt(1.0*v_i*v_i+2.0*ice_s_vel*ice_s_vel);
}
forcing = -sq;
limiter = texture2D(t2,pos).g; //rhoi;
drhoi = RelCloud*(forcing-limiter+sqrt(forcing*forcing+limiter*limiter));
forcing = -sn;
limiter = texture2D(t3,pos).b; //ni;
dni = RelCloud*(forcing-limiter+sqrt(forcing*forcing+limiter*limiter));
sn=0.0;
if(rhos>0.0)
{
if(T>273.15) e_coll = 1.0; //..temperature dependent efficiency (Cotton et al., 1986)
else e_coll = max(0.1e0,min(exp(0.09*(T-273.15)),1.0e0)); // (see Straka, 1989; S. 53)
x_s = min(max(rhos/(ns+1e-33),p_snow.x_min),p_snow.x_max); //..mean mass in SI
D_s = pow(p_snow.a_geo*x_s,p_snow.b_geo); //..mean diameter
v_s = pow(p_snow.a_vel*x_s,p_snow.b_vel)*rho0/(rho+1e-33); //..mean sedimentationvelocity
sn = 3.14*0.125e0*e_coll*ns*ns*delta_n*D_s*D_s*sqrt(theta_n*v_s*v_s+2.0*snow_s_vel*snow_s_vel);
}
forcing = -sn;
limiter = texture2D(t3,pos).a; //ns;
dns = RelCloud*(forcing-limiter+sqrt(forcing*forcing+limiter*limiter))
|
Melting of snow
a_melt_q=0.67625;
b_melt_q=0.293159;
if(T>273.15 && rhos>0.0)
{
e_a = 6.1078e2*exp(1.72693882e1*(T-273.15)/(T-3.586e1));
x_s = min(max(rhos/(ns+1e-33),p_snow.x_min),p_snow.x_max); //..mean mass in SI
D_s = pow(p_snow.a_geo*x_s,p_snow.b_geo); //..mean diameter
v_s = pow(p_snow.a_vel*x_s,p_snow.b_vel)*rho0/(rho+1e-33); //..mean sedimentation velocity
N_re= v_s*D_s/1.460e-5; //..mean Reynolds number
fv_q= a_melt_q + b_melt_q * pow(0.710,0.333) * pow(N_re,0.500); //..mean ventilation coefficient for water vapor
D_T = 2.5e-2/(1005.7*rho);
fh_q = D_T/3e-5*fv_q;
melt = 2.0*3.14/Lvi*D_s*ns;
melt_h = melt * 2.5e-2*(T-273.15);
melt_v = melt * 3e-5*Lv/461*(e_a/T-6.10780000e2/273.15);
melt_q = (melt_h*fh_q + melt_v*fv_q);
melt_n = min(max((melt_q-rhos)/x_s+ns,0.0e0),ns);
melt_q = min(rhos,max(melt_q,0.0e0));
melt_n = min(ns,max(melt_n,0.0e0));
if(T>283.15)
{
melt_q= rhos;
melt_n= ns;
}
}
forcing= melt_q;
limiter= texture2D(t2,pos).b; //rhos;
drhor = RelCloud*(forcing+limiter-sqrt(forcing*forcing+limiter*limiter));
forcing= melt_n;
limiter= texture2D(t3,pos).a; //ns;
dnr = RelCloud*(forcing+limiter-sqrt(forcing*forcing+limiter*limiter));
drhoTh = -Lvi/T*drhor-(Ts*(2110.0-4186.0))*drhor
|
snow evaporation
K_T = 2.500e-2;
nu_l = 1.460e-5 ; //..Kinem. Visc. von Luft
N_sc = 0.710; //..Schmidt-Zahl (PK, S.541)
n_f = 0.333; //..Exponent von N_sc im Vent-koeff. (PK, S.541)
m_f = 0.500; //..Exponent von N_re im Vent-koeff. (PK, S.541)
q_krit = 1.000e-9;
a_q = 0.429250753972163723;
b_q = 0.180944125457962318;
c_s = 1.0 / p_snow.cap;
if(S<0.0 && rhos>0.0)
{
D_vtp = pow(8.7602e-5*T,1.81)/p;
g_d = 4.0*3.14/(Lv*Lv/(K_T*287.0*T*T)+287.0*T/(D_vtp*exp(pvs)));
x_s = min(max(rhos/(ns+1e-20),p_snow.x_min),p_snow.x_max);
d_s = p_snow.a_geo * pow(x_s,p_snow.b_geo);
v_s = p_snow.a_vel * pow(x_s,p_snow.b_vel) * sqrt(rho0/(rho+1e-33)); // corr-factor missing
N_re = v_s*d_s/nu_l;
f_v = pow(N_sc,n_f)*pow(N_re,m_f);
f_q = a_q+b_q*f_v;
eva = g_d*ns*c_s*d_s*f_v*S;
eva_q = f_q*eva;
eva_n = eva_q/x_s;
}
forcing= eva_q;
limiter= texture2D(t2,pos).b; //rhos;
drhov = RelCloud*(forcing+limiter-sqrt(forcing*forcing+limiter*limiter));
forcing= eva_n;
limiter= texture2D(t3,pos).a; //ns;
dnv = RelCloud*(forcing+limiter-sqrt(forcing*forcing+limiter*limiter));
drhoTh = -2.830e+6/T*drhov-(Ts*(2110.0-1885.0)+ps*461.0)*drhov
|
Sedimentation Snow
if(rhos>1.0e-10)
{
xs = rhos/ns;
xs = min(max(xs,p_snow.x_min),p_snow.x_max);
lam= pow(0.083333*xs,p_snow.b_vel)*sqrt(rho0/(rho+1e-33));
vn = 42.7154*lam;
vq = 54.1323*lam;
vn = max(vn,0.1e+0);
vq = max(vq,0.1e+0);
vn = min(vn,3.0e+0);
vq = min(vq,3.0e+0);
Flux = min(rhos*vq/dz,rhos/2./dt);
drhos -= Flux;
drhoTh-= Ts*2110.0*Flux;
Flux = min(ns*vn/dz,ns/2./dt);
dns -= Flux;
}
|