Skip to content

Commit b9f29f5

Browse files
committed
Progress on substep_compare.
1 parent fe69a31 commit b9f29f5

4 files changed

Lines changed: 578 additions & 28 deletions

File tree

build_micro.csh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ set FILES="${DIR}/wv_sat_methods.F90 ${DIR}/micro_mg_utils.F90 ${DIR}/micro_mg2_
4646
#are separated by spaces - the code still compiles if commas are used instead,
4747
#but it crashes when you try to load it into python.
4848

49-
set PUB_FNS='wv_sat_methods_init wv_sat_svp_water wv_sat_svp_ice wv_sat_svp_to_qsat wv_sat_qsat_water wv_sat_qsat_ice micro_mg_init micro_mg_tend calc_precip_frac micro_mg_utils_init ice_deposition_sublimation kk2000_liq_autoconversion ice_autoconversion immersion_freezing contact_freezing snow_self_aggregation accrete_cloud_water_snow secondary_ice_production accrete_rain_snow heterogeneous_rain_freezing accrete_cloud_water_rain self_collection_rain accrete_cloud_ice_snow evaporate_sublimate_precip bergeron_process_snow sedimentation avg_diameter rain_fall_speeds'
49+
set PUB_FNS='wv_sat_methods_init wv_sat_svp_water wv_sat_svp_ice wv_sat_svp_to_qsat wv_sat_qsat_water wv_sat_qsat_ice micro_mg_init micro_mg_tend calc_precip_frac micro_mg_utils_init ice_deposition_sublimation kk2000_liq_autoconversion ice_autoconversion immersion_freezing contact_freezing snow_self_aggregation accrete_cloud_water_snow secondary_ice_production accrete_rain_snow heterogeneous_rain_freezing accrete_cloud_water_rain self_collection_rain accrete_cloud_ice_snow evaporate_rain sublimate_snow bergeron_process_snow sedimentation avg_diameter rain_fall_speeds'
5050

5151
#CREATE .pyf FILE WITH INTERFACES TO PYTHON:
5252
#=================

micro_mg2_0.F90

Lines changed: 72 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -347,7 +347,8 @@ end subroutine micro_mg_init
347347
!microphysics routine for each timestep goes here...
348348

349349
subroutine micro_mg_tend ( &
350-
mgncol, nlev, deltatin, &
350+
mgncol, nlev, evap_col_steps, &
351+
evap_steps, col_steps, deltatin, &
351352
t, q, &
352353
qcn, qin, &
353354
ncn, nin, &
@@ -442,7 +443,8 @@ subroutine micro_mg_tend ( &
442443
accrete_cloud_water_rain, &
443444
self_collection_rain, &
444445
accrete_cloud_ice_snow, &
445-
evaporate_sublimate_precip, &
446+
evaporate_rain, &
447+
sublimate_snow, &
446448
bergeron_process_snow, &
447449
sedimentation
448450

@@ -452,6 +454,9 @@ subroutine micro_mg_tend ( &
452454
! input arguments
453455
integer, intent(in) :: mgncol ! number of microphysics columns
454456
integer, intent(in) :: nlev ! number of layers
457+
integer, intent(in) :: evap_col_steps ! Evap/collection substeps per MG2 steps
458+
integer, intent(in) :: evap_steps ! Rain evaporation substeps per evap/col step
459+
integer, intent(in) :: col_steps ! Self-collection substeps per evap/col step
455460
real(r8), intent(in) :: deltatin ! time step (s)
456461
real(r8), intent(in) :: t(mgncol,nlev) ! input temperature (K)
457462
real(r8), intent(in) :: q(mgncol,nlev) ! input h20 vapor mixing ratio (kg/kg)
@@ -842,13 +847,17 @@ subroutine micro_mg_tend ( &
842847
! of sedimentation to MG2 timestep, respectively.
843848
real(r8) :: sed_deltat, sed_time, sed_step_ratio
844849

850+
real(r8) :: dumt(mgncol), dumq(mgncol), dumrho(mgncol), dumqvl(mgncol)
851+
real(r8) :: dumlamr(mgncol), dumn0r(mgncol), dumarn(mgncol), dumr2(mgncol), dumnr2(mgncol)
852+
real(r8) :: dumnragg(mgncol), dumnragg2(mgncol), dumpre(mgncol)
853+
845854
! Processes that can be disabled.
846855
logical :: do_sed_loc, do_inst_loc
847856

848857
! loop array variables
849858
! "i" and "k" are column/level iterators for internal (MG) variables
850-
! "n" is used for other looping (currently just sedimentation)
851-
integer i, k, n
859+
! "m" and "n" are used for other looping
860+
integer i, k, m, n
852861

853862
! number of sub-steps for loops over "n" (for sedimentation)
854863
integer nstep
@@ -1534,8 +1543,6 @@ subroutine micro_mg_tend ( &
15341543
call accrete_cloud_water_rain(microp_uniform, qric(:,k), qcic(:,k), &
15351544
ncic(:,k), relvar(:,k), accre_enhan(:,k), pra(:,k), npra(:,k))
15361545

1537-
call self_collection_rain(rho(:,k), qric(:,k), nric(:,k), nragg(:,k))
1538-
15391546
if (do_cldice) then
15401547
call accrete_cloud_ice_snow(t(:,k), rho(:,k), asn(:,k), qiic(:,k), niic(:,k), &
15411548
qsic(:,k), lams(:,k), n0s(:,k), prai(:,k), nprai(:,k))
@@ -1544,11 +1551,10 @@ subroutine micro_mg_tend ( &
15441551
nprai(:,k) = 0._r8
15451552
end if
15461553

1547-
call evaporate_sublimate_precip(t(:,k), rho(:,k), &
1554+
call sublimate_snow(t(:,k), rho(:,k), &
15481555
dv(:,k), mu(:,k), sc(:,k), q(:,k), qvl(:,k), qvi(:,k), &
1549-
lcldm(:,k), precip_frac(:,k), arn(:,k), asn(:,k), qcic(:,k), qiic(:,k), &
1550-
qric(:,k), qsic(:,k), lamr(:,k), n0r(:,k), lams(:,k), n0s(:,k), &
1551-
pre(:,k), prds(:,k))
1556+
lcldm(:,k), precip_frac(:,k), asn(:,k), qcic(:,k), qiic(:,k), &
1557+
qsic(:,k), lams(:,k), n0s(:,k), prds(:,k))
15521558

15531559
call bergeron_process_snow(t(:,k), rho(:,k), dv(:,k), mu(:,k), sc(:,k), &
15541560
qvl(:,k), qvi(:,k), asn(:,k), qcic(:,k), qsic(:,k), lams(:,k), n0s(:,k), &
@@ -1649,6 +1655,62 @@ subroutine micro_mg_tend ( &
16491655

16501656
end do
16511657

1658+
dumr(:,k) = qric(:,k)
1659+
dumnr(:,k) = nric(:,k)
1660+
dumt = t(:,k)
1661+
dumq = q(:,k)
1662+
nragg(:,k) = 0._r8
1663+
pre(:,k) = 0._r8
1664+
do m = 1, evap_col_steps
1665+
dumrho = p(:,k)/(r*dumt)
1666+
1667+
! Need separate temporary nr for the two loops because they have to jointly
1668+
! conserve rain number.
1669+
dumnr2 = dumnr(:,k)
1670+
dumnragg2 = 0._r8
1671+
do n = 1, col_steps
1672+
call self_collection_rain(dumrho, dumr(:,k), dumnr2, dumnragg)
1673+
dumnragg = max(dumnragg, -dumnr2*col_steps*evap_col_steps/deltat)
1674+
nragg(:,k) = nragg(:,k) + dumnragg / col_steps
1675+
dumnragg2 = dumnragg2 + dumnragg / col_steps
1676+
dumnr2 = max(dumnr2 + dumnragg*deltat/(col_steps*evap_col_steps), 0._r8)
1677+
end do
1678+
1679+
dumnr2 = dumnr(:,k)
1680+
do n = 1, evap_steps
1681+
dumrho = p(:,k)/(r*dumt)
1682+
dumarn = ar*(rhosu/dumrho)**0.54_r8
1683+
do i = 1, mgncol
1684+
call qsat_water(dumt(i), p(i,k), dum, dumqvl(i))
1685+
end do
1686+
call size_dist_param_basic(mg_rain_props, dumr(:,k), dumnr2, &
1687+
dumlamr, dumn0r)
1688+
call evaporate_rain(dumt, dumrho, p(:,k), dumq, dumqvl, &
1689+
lcldm(:,k), precip_frac(:,k), dumarn, qcic(:,k), qiic(:,k), &
1690+
dumr(:,k), dumlamr, dumn0r, dumpre)
1691+
dumpre = max(dumpre, -dumr(:,k)*evap_steps*evap_col_steps/deltat)
1692+
pre(:,k) = pre(:,k) + dumpre / evap_steps
1693+
dumnr2 = max(dumnr2 + (dumnr2/dumr(:,k))*dumpre*deltat/(evap_steps*evap_col_steps), 0._r8)
1694+
dumr(:,k) = max(dumr(:,k) + dumpre*deltat/(evap_steps*evap_col_steps), 0._r8)
1695+
! Not that dumq and dumt are grid-mean, not in-precip quantities.
1696+
dumq = dumq - precip_frac(:,k)*dumpre*deltat/(evap_steps*evap_col_steps)
1697+
dumt = dumt + xxlv*precip_frac(:,k)*dumpre*deltat/(evap_steps*evap_col_steps)
1698+
end do
1699+
1700+
! Joint conservation of rain number; adjust self-collection only for
1701+
! consistency with existing checks, and since evaporation should not be
1702+
! limited by number directly anyway.
1703+
where (-dumnragg2*deltat/evap_col_steps > dumnr2)
1704+
dumnragg = dumnragg2
1705+
dumnragg2 = -dumnr2 * evap_col_steps / deltat
1706+
nragg(:,k) = nragg(:,k) + dumnragg2 - dumnragg
1707+
! Note: might be better to use size_dist_param_basic to set min here.
1708+
dumnr(:,k) = 0._r8
1709+
elsewhere
1710+
dumnr(:,k) = dumnr2 + dumnragg2*deltat/evap_col_steps
1711+
end where
1712+
end do
1713+
16521714
do i=1,mgncol
16531715

16541716
!===================================================================

micro_mg_utils.F90

Lines changed: 78 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,8 @@ module micro_mg_utils
6666
accrete_cloud_water_rain, &
6767
self_collection_rain, &
6868
accrete_cloud_ice_snow, &
69-
evaporate_sublimate_precip, &
69+
evaporate_rain, &
70+
sublimate_snow, &
7071
bergeron_process_snow, &
7172
sedimentation
7273

@@ -1242,46 +1243,39 @@ end subroutine accrete_cloud_ice_snow
12421243
! in-cloud condensation/deposition of rain and snow is neglected
12431244
! except for transfer of cloud water to snow through bergeron process
12441245

1245-
elemental subroutine evaporate_sublimate_precip(t, rho, dv, mu, sc, q, qvl, qvi, &
1246-
lcldm, precip_frac, arn, asn, qcic, qiic, qric, qsic, lamr, n0r, lams, n0s, &
1247-
pre, prds)
1246+
elemental subroutine evaporate_rain(t, rho, p, q, qvl, &
1247+
lcldm, precip_frac, arn, qcic, qiic, qric, lamr, n0r, pre)
12481248

12491249
real(r8), intent(in) :: t ! temperature
12501250
real(r8), intent(in) :: rho ! air density
1251-
real(r8), intent(in) :: dv ! water vapor diffusivity
1252-
real(r8), intent(in) :: mu ! viscosity
1253-
real(r8), intent(in) :: sc ! schmidt number
1251+
real(r8), intent(in) :: p ! pressure
12541252
real(r8), intent(in) :: q ! humidity
12551253
real(r8), intent(in) :: qvl ! saturation humidity (water)
1256-
real(r8), intent(in) :: qvi ! saturation humidity (ice)
12571254
real(r8), intent(in) :: lcldm ! liquid cloud fraction
12581255
real(r8), intent(in) :: precip_frac ! precipitation fraction (maximum overlap)
12591256

12601257
! fallspeed parameters
12611258
real(r8), intent(in) :: arn ! rain
1262-
real(r8), intent(in) :: asn ! snow
12631259

12641260
! In-cloud MMRs
12651261
real(r8), intent(in) :: qcic ! cloud liquid
12661262
real(r8), intent(in) :: qiic ! cloud ice
12671263
real(r8), intent(in) :: qric ! rain
1268-
real(r8), intent(in) :: qsic ! snow
12691264

12701265
! Size parameters
12711266
! rain
12721267
real(r8), intent(in) :: lamr
12731268
real(r8), intent(in) :: n0r
1274-
! snow
1275-
real(r8), intent(in) :: lams
1276-
real(r8), intent(in) :: n0s
12771269

12781270
! Output tendencies
12791271
real(r8), intent(out) :: pre
1280-
real(r8), intent(out) :: prds
1281-
1272+
12821273
real(r8) :: qclr ! water vapor mixing ratio in clear air
12831274
real(r8) :: ab ! correction to account for latent heat
12841275
real(r8) :: eps ! 1/ sat relaxation timescale
1276+
real(r8) :: dv ! water vapor diffusivity
1277+
real(r8) :: mu ! viscosity
1278+
real(r8) :: sc ! schmidt number
12851279

12861280
real(r8) :: dum
12871281

@@ -1304,6 +1298,10 @@ elemental subroutine evaporate_sublimate_precip(t, rho, dv, mu, sc, q, qvl, qvi,
13041298
! evaporation of rain
13051299
if (qric >= qsmall) then
13061300

1301+
dv = 8.794E-5_r8 * t**1.81_r8 / p
1302+
mu = 1.496E-6_r8 * t**1.5_r8 / (t + 120._r8)
1303+
sc = mu/(rho*dv)
1304+
13071305
ab = calc_ab(t, qvl, xxlv)
13081306
eps = 2._r8*pi*n0r*rho*Dv* &
13091307
(f1r/(lamr*lamr)+ &
@@ -1321,6 +1319,70 @@ elemental subroutine evaporate_sublimate_precip(t, rho, dv, mu, sc, q, qvl, qvi,
13211319
pre = 0._r8
13221320
end if
13231321

1322+
else
1323+
pre = 0._r8
1324+
end if
1325+
1326+
end subroutine evaporate_rain
1327+
1328+
! calculate evaporation/sublimation of rain and snow
1329+
!===================================================================
1330+
! note: evaporation/sublimation occurs only in cloud-free portion of grid cell
1331+
! in-cloud condensation/deposition of rain and snow is neglected
1332+
! except for transfer of cloud water to snow through bergeron process
1333+
1334+
elemental subroutine sublimate_snow(t, rho, dv, mu, sc, q, qvl, qvi, &
1335+
lcldm, precip_frac, asn, qcic, qiic, qsic, lams, n0s, prds)
1336+
1337+
real(r8), intent(in) :: t ! temperature
1338+
real(r8), intent(in) :: rho ! air density
1339+
real(r8), intent(in) :: dv ! water vapor diffusivity
1340+
real(r8), intent(in) :: mu ! viscosity
1341+
real(r8), intent(in) :: sc ! schmidt number
1342+
real(r8), intent(in) :: q ! humidity
1343+
real(r8), intent(in) :: qvl ! saturation humidity (water)
1344+
real(r8), intent(in) :: qvi ! saturation humidity (ice)
1345+
real(r8), intent(in) :: lcldm ! liquid cloud fraction
1346+
real(r8), intent(in) :: precip_frac ! precipitation fraction (maximum overlap)
1347+
1348+
! fallspeed parameters
1349+
real(r8), intent(in) :: asn ! snow
1350+
1351+
! In-cloud MMRs
1352+
real(r8), intent(in) :: qcic ! cloud liquid
1353+
real(r8), intent(in) :: qiic ! cloud ice
1354+
real(r8), intent(in) :: qsic ! snow
1355+
1356+
! Size parameters
1357+
! snow
1358+
real(r8), intent(in) :: lams
1359+
real(r8), intent(in) :: n0s
1360+
1361+
! Output tendencies
1362+
real(r8), intent(out) :: prds
1363+
1364+
real(r8) :: qclr ! water vapor mixing ratio in clear air
1365+
real(r8) :: ab ! correction to account for latent heat
1366+
real(r8) :: eps ! 1/ sat relaxation timescale
1367+
1368+
real(r8) :: dum
1369+
1370+
! set temporary cloud fraction to zero if cloud water + ice is very small
1371+
! this will ensure that evaporation/sublimation of precip occurs over
1372+
! entire grid cell, since min cloud fraction is specified otherwise
1373+
if (qcic+qiic < 1.e-6_r8) then
1374+
dum = 0._r8
1375+
else
1376+
dum = lcldm
1377+
end if
1378+
1379+
! only calculate if there is some precip fraction > cloud fraction
1380+
1381+
if (precip_frac > dum) then
1382+
1383+
! calculate q for out-of-cloud region
1384+
qclr=(q-dum*qvl)/(1._r8-dum)
1385+
13241386
! sublimation of snow
13251387
if (qsic >= qsmall) then
13261388
ab = calc_ab(t, qvi, xxls)
@@ -1340,10 +1402,9 @@ elemental subroutine evaporate_sublimate_precip(t, rho, dv, mu, sc, q, qvl, qvi,
13401402

13411403
else
13421404
prds = 0._r8
1343-
pre = 0._r8
13441405
end if
13451406

1346-
end subroutine evaporate_sublimate_precip
1407+
end subroutine sublimate_snow
13471408

13481409
! bergeron process - evaporation of droplets and deposition onto snow
13491410
!===================================================================

0 commit comments

Comments
 (0)