@@ -347,7 +347,8 @@ end subroutine micro_mg_init
347347!microphysics routine for each timestep goes here...
348348
349349subroutine 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 !===================================================================
0 commit comments