@@ -92,7 +92,9 @@ MODULE module_mp_thompson
92
92
! .. scheme. In 2-moment cloud water, Nt_c represents a maximum of
93
93
! .. droplet concentration and nu_c is also variable depending on local
94
94
! .. droplet number concentration.
95
- REAL , PARAMETER :: Nt_c = 100.E6
95
+ ! REAL, PARAMETER :: Nt_c = 100.E6
96
+ REAL , PARAMETER :: Nt_c_o = 50.E6
97
+ REAL , PARAMETER :: Nt_c_l = 100.E6
96
98
REAL , PARAMETER , PRIVATE :: Nt_c_max = 1999.E6
97
99
98
100
! ..Declaration of constants for assumed CCN/IN aerosols when none in
@@ -108,7 +110,8 @@ MODULE module_mp_thompson
108
110
REAL , PARAMETER , PRIVATE :: mu_r = 0.0
109
111
REAL , PARAMETER , PRIVATE :: mu_g = 0.0
110
112
REAL , PARAMETER , PRIVATE :: mu_i = 0.0
111
- REAL , PRIVATE :: mu_c
113
+ ! REAL, PRIVATE:: mu_c
114
+ REAL , PRIVATE :: mu_c_o, mu_c_l
112
115
113
116
! ..Sum of two gamma distrib for snow (Field et al. 2005).
114
117
! .. N(D) = M2**4/M3**3 * [Kap0*exp(-M2*Lam0*D/M3)
@@ -150,7 +153,7 @@ MODULE module_mp_thompson
150
153
REAL , PARAMETER , PRIVATE :: fv_s = 100.0
151
154
REAL , PARAMETER , PRIVATE :: av_g = 442.0
152
155
REAL , PARAMETER , PRIVATE :: bv_g = 0.89
153
- REAL , PARAMETER , PRIVATE :: av_i = 1493.9
156
+ ! REAL, PARAMETER, PRIVATE:: av_i = 1493.9
154
157
REAL , PARAMETER , PRIVATE :: bv_i = 1.0
155
158
REAL , PARAMETER , PRIVATE :: av_c = 0.316946E8
156
159
REAL , PARAMETER , PRIVATE :: bv_c = 2.0
@@ -534,7 +537,9 @@ SUBROUTINE thompson_init(is_aerosol_aware_in, &
534
537
! .. disp=SQRT((mu+2)/(mu+1) - 1) so mu varies from 15 for Maritime
535
538
! .. to 2 for really dirty air. This not used in 2-moment cloud water
536
539
! .. scheme and nu_c used instead and varies from 2 to 15 (integer-only).
537
- mu_c = MIN (15 ., (1000.E6 / Nt_c + 2 .))
540
+ ! mu_c = MIN(15., (1000.E6/Nt_c + 2.))
541
+ mu_c_l = MIN (15 ., (1000.E6 / Nt_c_l + 2 .))
542
+ mu_c_o = MIN (15 ., (1000.E6 / Nt_c_o + 2 .))
538
543
539
544
! > - Compute Schmidt number to one-third used numerous times
540
545
Sc3 = Sc** (1 ./ 3 .)
@@ -889,7 +894,7 @@ SUBROUTINE thompson_init(is_aerosol_aware_in, &
889
894
890
895
if (mpirank== mpiroot) write (* ,* )' creating microphysics lookup tables ... '
891
896
if (mpirank== mpiroot) write (* ,' (a, f5.2, a, f5.2, a, f5.2, a, f5.2)' ) &
892
- ' using: mu_c =' ,mu_c ,' mu_i=' ,mu_i,' mu_r=' ,mu_r,' mu_g=' ,mu_g
897
+ ' using: mu_c_o =' ,mu_c_o ,' mu_i=' ,mu_i,' mu_r=' ,mu_r,' mu_g=' ,mu_g
893
898
894
899
! > - Call table_ccnact() to read a static file containing CCN activation of aerosols. The
895
900
! ! data were created from a parcel model by Feingold & Heymsfield with
@@ -982,7 +987,7 @@ SUBROUTINE mp_gt_driver(qv, qc, qr, qi, qs, qg, ni, nr, nc, &
982
987
nwfa , nifa , nwfa2d , nifa2d , &
983
988
tt , th , pii , &
984
989
p , w , dz , dt_in , dt_inner , &
985
- sedi_semi , decfl , &
990
+ sedi_semi , decfl , lsm , &
986
991
RAINNC , RAINNCV , &
987
992
SNOWNC , SNOWNCV , &
988
993
ICENC , ICENCV , &
@@ -1037,6 +1042,7 @@ SUBROUTINE mp_gt_driver(qv, qc, qr, qi, qs, qg, ni, nr, nc, &
1037
1042
REAL , DIMENSION (ims:ime, kms:kme, jms:jme), OPTIONAL , INTENT (INOUT ):: &
1038
1043
nc, nwfa, nifa
1039
1044
REAL , DIMENSION (ims:ime, jms:jme), OPTIONAL , INTENT (IN ):: nwfa2d, nifa2d
1045
+ INTEGER , DIMENSION (ims:ime, jms:jme), INTENT (IN ):: lsm
1040
1046
REAL , DIMENSION (ims:ime, kms:kme, jms:jme), OPTIONAL , INTENT (INOUT ):: &
1041
1047
re_cloud, re_ice, re_snow
1042
1048
REAL , DIMENSION (ims:ime, kms:kme, jms:jme), INTENT (INOUT ):: pfils, pflls
@@ -1117,6 +1123,7 @@ SUBROUTINE mp_gt_driver(qv, qc, qr, qi, qs, qg, ni, nr, nc, &
1117
1123
REAL , DIMENSION (its:ite, jts:jte):: pcp_ra, pcp_sn, pcp_gr, pcp_ic
1118
1124
REAL :: dt, pptrain, pptsnow, pptgraul, pptice
1119
1125
REAL :: qc_max, qr_max, qs_max, qi_max, qg_max, ni_max, nr_max
1126
+ INTEGER :: lsml
1120
1127
REAL :: rand1, rand2, rand3, rand_pert_max
1121
1128
INTEGER :: i, j, k, m
1122
1129
INTEGER :: imax_qc,imax_qr,imax_qi,imax_qs,imax_qg,imax_ni,imax_nr
@@ -1419,8 +1426,14 @@ SUBROUTINE mp_gt_driver(qv, qc, qr, qi, qs, qg, ni, nr, nc, &
1419
1426
nifa1d(k) = nifa(i,k,j)
1420
1427
enddo
1421
1428
else
1429
+ lsml = lsm(i,j)
1422
1430
do k = kts, kte
1423
- nc1d(k) = Nt_c/ rho(k)
1431
+ ! nc1d(k) = Nt_c/rho(k)
1432
+ if (lsml == 0 ) then
1433
+ nc1d(k) = Nt_c_o/ rho(k)
1434
+ else
1435
+ nc1d(k) = Nt_c_l/ rho(k)
1436
+ endif
1424
1437
nwfa1d(k) = 11.1E6
1425
1438
nifa1d(k) = naIN1* 0.01
1426
1439
enddo
@@ -1429,7 +1442,7 @@ SUBROUTINE mp_gt_driver(qv, qc, qr, qi, qs, qg, ni, nr, nc, &
1429
1442
! > - Call mp_thompson()
1430
1443
call mp_thompson(qv1d, qc1d, qi1d, qr1d, qs1d, qg1d, ni1d, &
1431
1444
nr1d, nc1d, nwfa1d, nifa1d, t1d, p1d, w1d, dz1d, &
1432
- pptrain, pptsnow, pptgraul, pptice, &
1445
+ lsml, pptrain, pptsnow, pptgraul, pptice, &
1433
1446
#if ( WRF_CHEM == 1 )
1434
1447
rainprod1d, evapprod1d, &
1435
1448
#endif
@@ -1698,7 +1711,7 @@ SUBROUTINE mp_gt_driver(qv, qc, qr, qi, qs, qg, ni, nr, nc, &
1698
1711
enddo
1699
1712
! > - Call calc_effectrad()
1700
1713
call calc_effectRad (t1d, p1d, qv1d, qc1d, nc1d, qi1d, ni1d, qs1d, &
1701
- re_qc1d, re_qi1d, re_qs1d, kts, kte)
1714
+ re_qc1d, re_qi1d, re_qs1d, lsml, kts, kte)
1702
1715
do k = kts, kte
1703
1716
re_cloud(i,k,j) = MAX (re_qc_min, MIN (re_qc1d(k), re_qc_max))
1704
1717
re_ice(i,k,j) = MAX (re_qi_min, MIN (re_qi1d(k), re_qi_max))
@@ -1841,7 +1854,7 @@ END SUBROUTINE thompson_finalize
1841
1854
! > @{
1842
1855
subroutine mp_thompson (qv1d , qc1d , qi1d , qr1d , qs1d , qg1d , ni1d , &
1843
1856
nr1d , nc1d , nwfa1d , nifa1d , t1d , p1d , w1d , dzq , &
1844
- pptrain , pptsnow , pptgraul , pptice , &
1857
+ lsml , pptrain , pptsnow , pptgraul , pptice , &
1845
1858
#if ( WRF_CHEM == 1 )
1846
1859
rainprod, evapprod, &
1847
1860
#endif
@@ -1879,6 +1892,7 @@ subroutine mp_thompson (qv1d, qc1d, qi1d, qr1d, qs1d, qg1d, ni1d, &
1879
1892
REAL , DIMENSION (kts:kte), INTENT (IN ):: p1d, w1d, dzq
1880
1893
REAL , INTENT (INOUT ):: pptrain, pptsnow, pptgraul, pptice
1881
1894
REAL , INTENT (IN ):: dt
1895
+ INTEGER , INTENT (IN ):: lsml
1882
1896
REAL , INTENT (IN ):: rand1, rand2, rand3
1883
1897
! Extended diagnostics, most arrays only allocated if ext_diag is true
1884
1898
LOGICAL , INTENT (IN ) :: ext_diag
@@ -1982,6 +1996,7 @@ subroutine mp_thompson (qv1d, qc1d, qi1d, qr1d, qs1d, qg1d, ni1d, &
1982
1996
REAL :: Ef_ra, Ef_sa, Ef_ga
1983
1997
REAL :: dtsave, odts, odt, odzq, hgt_agl, SR
1984
1998
REAL :: xslw1, ygra1, zans1, eva_factor
1999
+ REAL :: av_i
1985
2000
INTEGER :: i, k, k2, n, nn, nstep, k_0, kbot, IT, iexfrq
1986
2001
INTEGER , DIMENSION (5 ):: ksed1
1987
2002
INTEGER :: nir, nis, nig, nii, nic, niin
@@ -2006,6 +2021,7 @@ subroutine mp_thompson (qv1d, qc1d, qi1d, qr1d, qs1d, qg1d, ni1d, &
2006
2021
odt = 1 ./ dt
2007
2022
odts = 1 ./ dtsave
2008
2023
iexfrq = 1
2024
+ av_i = av_s * D0s ** (bv_s - bv_i)
2009
2025
2010
2026
! +---+-----------------------------------------------------------------+
2011
2027
! > - Initialize Source/sink terms. First 2 chars: "pr" represents source/sink of
@@ -2210,7 +2226,14 @@ subroutine mp_thompson (qv1d, qc1d, qi1d, qr1d, qs1d, qg1d, ni1d, &
2210
2226
endif
2211
2227
nc(k) = MIN ( DBLE (Nt_c_max), ccg(1 ,nu_c)* ocg2(nu_c)* rc(k) &
2212
2228
/ am_r* lamc** bm_r)
2213
- if (.NOT. (is_aerosol_aware .or. merra2_aerosol_aware)) nc(k) = Nt_c
2229
+ ! if (.NOT. (is_aerosol_aware .or. merra2_aerosol_aware)) nc(k) = Nt_c
2230
+ if (.NOT. (is_aerosol_aware .or. merra2_aerosol_aware)) then
2231
+ if (lsml == 0 ) then
2232
+ nc(k) = Nt_c_o
2233
+ else
2234
+ nc(k) = Nt_c_l
2235
+ endif
2236
+ endif
2214
2237
else
2215
2238
qc1d(k) = 0.0
2216
2239
nc1d(k) = 0.0
@@ -2234,7 +2257,7 @@ subroutine mp_thompson (qv1d, qc1d, qi1d, qr1d, qs1d, qg1d, ni1d, &
2234
2257
if (xDi.lt. 5.E-6 ) then
2235
2258
lami = cie(2 )/ 5.E-6
2236
2259
ni(k) = MIN (4999.D3 , cig(1 )* oig2* ri(k)/ am_i* lami** bm_i)
2237
- elseif (xDi.gt. 300 .E-6 ) then
2260
+ elseif (xDi.gt. D0s + 100 .E-6 ) then
2238
2261
lami = cie(2 )/ 300.E-6
2239
2262
ni(k) = cig(1 )* oig2* ri(k)/ am_i* lami** bm_i
2240
2263
endif
@@ -2919,13 +2942,13 @@ subroutine mp_thompson (qv1d, qc1d, qi1d, qr1d, qs1d, qg1d, ni1d, &
2919
2942
2920
2943
! > - Deposition nucleation of dust/mineral from DeMott et al (2010)
2921
2944
! ! we may need to relax the temperature and ssati constraints.
2922
- if ( (ssati(k).ge. 0.25 ) .or. (ssatw(k).gt. eps &
2945
+ if ( (ssati(k).ge. 0.15 ) .or. (ssatw(k).gt. eps &
2923
2946
.and. temp(k).lt. 253.15 ) ) then
2924
2947
if (dustyIce .AND. (is_aerosol_aware .or. merra2_aerosol_aware)) then
2925
2948
xnc = iceDeMott(tempc,qv(k),qvs(k),qvsi(k),rho(k),nifa(k))
2926
2949
xnc = xnc* (1.0 + 50 .* rand3)
2927
2950
else
2928
- xnc = MIN (250 .E3 , TNO* EXP (ATO* (T_0- temp(k))))
2951
+ xnc = MIN (1000 .E3 , TNO* EXP (ATO* (T_0- temp(k))))
2929
2952
endif
2930
2953
xni = ni(k) + (pni_rfz(k)+ pni_wfz(k))* dtsave
2931
2954
pni_inu(k) = 0.5 * (xnc- xni + abs (xnc- xni))* odts
@@ -3273,7 +3296,7 @@ subroutine mp_thompson (qv1d, qc1d, qi1d, qr1d, qs1d, qg1d, ni1d, &
3273
3296
lami = cie(2 )/ 5.E-6
3274
3297
xni = MIN (4999.D3 , cig(1 )* oig2* xri/ am_i* lami** bm_i)
3275
3298
niten(k) = (xni- ni1d(k)* rho(k))* odts* orho
3276
- elseif (xDi.gt. 300 .E-6 ) then
3299
+ elseif (xDi.gt. D0s + 100 .E-6 ) then
3277
3300
lami = cie(2 )/ 300.E-6
3278
3301
xni = cig(1 )* oig2* xri/ am_i* lami** bm_i
3279
3302
niten(k) = (xni- ni1d(k)* rho(k))* odts* orho
@@ -3389,7 +3412,13 @@ subroutine mp_thompson (qv1d, qc1d, qi1d, qr1d, qs1d, qg1d, ni1d, &
3389
3412
if ((qc1d(k) + qcten(k)* DT) .gt. R1) then
3390
3413
rc(k) = (qc1d(k) + qcten(k)* DT)* rho(k)
3391
3414
nc(k) = MAX (2 ., MIN ((nc1d(k)+ ncten(k)* DT)* rho(k), Nt_c_max))
3392
- if (.NOT. (is_aerosol_aware .or. merra2_aerosol_aware)) nc(k) = Nt_c
3415
+ if (.NOT. (is_aerosol_aware .or. merra2_aerosol_aware)) then
3416
+ if (lsml == 0 ) then
3417
+ nc(k) = Nt_c_o
3418
+ else
3419
+ nc(k) = Nt_c_l
3420
+ endif
3421
+ endif
3393
3422
L_qc(k) = .true.
3394
3423
else
3395
3424
rc(k) = R1
@@ -3560,7 +3589,11 @@ subroutine mp_thompson (qv1d, qc1d, qi1d, qr1d, qs1d, qg1d, ni1d, &
3560
3589
if (is_aerosol_aware .or. merra2_aerosol_aware) then
3561
3590
xnc = MAX (2 ., activ_ncloud(temp(k), w1d(k)+ rand3, nwfa(k)))
3562
3591
else
3563
- xnc = Nt_c
3592
+ if (lsml == 0 ) then
3593
+ xnc = Nt_c_o
3594
+ else
3595
+ xnc = Nt_c_l
3596
+ endif
3564
3597
endif
3565
3598
pnc_wcd(k) = 0.5 * (xnc- nc(k) + abs (xnc- nc(k)))* odts* orho
3566
3599
@@ -3630,7 +3663,13 @@ subroutine mp_thompson (qv1d, qc1d, qi1d, qr1d, qs1d, qg1d, ni1d, &
3630
3663
rc(k) = MAX (R1, (qc1d(k) + DT* qcten(k))* rho(k))
3631
3664
if (rc(k).eq. R1) L_qc(k) = .false.
3632
3665
nc(k) = MAX (2 ., MIN ((nc1d(k)+ ncten(k)* DT)* rho(k), Nt_c_max))
3633
- if (.NOT. (is_aerosol_aware .or. merra2_aerosol_aware)) nc(k) = Nt_c
3666
+ if (.NOT. (is_aerosol_aware .or. merra2_aerosol_aware)) then
3667
+ if (lsml == 0 ) then
3668
+ nc(k) = Nt_c_o
3669
+ else
3670
+ nc(k) = Nt_c_l
3671
+ endif
3672
+ endif
3634
3673
qv(k) = MAX (1.E-10 , qv1d(k) + DT* qvten(k))
3635
3674
temp(k) = t1d(k) + DT* tten(k)
3636
3675
rho(k) = 0.622 * pres(k)/ (R* temp(k)* (qv(k)+ 0.622 ))
@@ -4235,7 +4274,7 @@ subroutine mp_thompson (qv1d, qc1d, qi1d, qr1d, qs1d, qg1d, ni1d, &
4235
4274
xDi = (bm_i + mu_i + 1 .) * ilami
4236
4275
if (xDi.lt. 5.E-6 ) then
4237
4276
lami = cie(2 )/ 5.E-6
4238
- elseif (xDi.gt. 300 .E-6 ) then
4277
+ elseif (xDi.gt. D0s + 100 .E-6 ) then
4239
4278
lami = cie(2 )/ 300.E-6
4240
4279
endif
4241
4280
ni1d(k) = MIN (cig(1 )* oig2* qi1d(k)/ am_i* lami** bm_i, &
@@ -5749,7 +5788,7 @@ END FUNCTION delta_p
5749
5788
! ! distribution, not the second part, which is the larger sizes.
5750
5789
5751
5790
subroutine calc_effectRad (t1d , p1d , qv1d , qc1d , nc1d , qi1d , ni1d , qs1d , &
5752
- & re_qc1d , re_qi1d , re_qs1d , kts , kte )
5791
+ & re_qc1d , re_qi1d , re_qs1d , lsml , kts , kte )
5753
5792
5754
5793
IMPLICIT NONE
5755
5794
@@ -5766,6 +5805,7 @@ subroutine calc_effectRad (t1d, p1d, qv1d, qc1d, nc1d, qi1d, ni1d, qs1d, &
5766
5805
DOUBLE PRECISION :: lamc, lami
5767
5806
LOGICAL :: has_qc, has_qi, has_qs
5768
5807
INTEGER :: inu_c
5808
+ INTEGER :: lsml
5769
5809
real , dimension (15 ), parameter :: g_ratio = (/ 24 ,60 ,120 ,210 ,336 , &
5770
5810
& 504 ,720 ,990 ,1320 ,1716 ,2184 ,2730 ,3360 ,4080 ,4896 / )
5771
5811
@@ -5781,7 +5821,13 @@ subroutine calc_effectRad (t1d, p1d, qv1d, qc1d, nc1d, qi1d, ni1d, qs1d, &
5781
5821
rho(k) = 0.622 * p1d(k)/ (R* t1d(k)* (qv1d(k)+ 0.622 ))
5782
5822
rc(k) = MAX (R1, qc1d(k)* rho(k))
5783
5823
nc(k) = MAX (2 ., MIN (nc1d(k)* rho(k), Nt_c_max))
5784
- if (.NOT. (is_aerosol_aware .or. merra2_aerosol_aware)) nc(k) = Nt_c
5824
+ if (.NOT. (is_aerosol_aware .or. merra2_aerosol_aware)) then
5825
+ if ( lsml == 0 ) then
5826
+ nc(k) = Nt_c_o
5827
+ else
5828
+ nc(k) = Nt_c_l
5829
+ endif
5830
+ endif
5785
5831
if (rc(k).gt. R1 .and. nc(k).gt. R2) has_qc = .true.
5786
5832
ri(k) = MAX (R1, qi1d(k)* rho(k))
5787
5833
ni(k) = MAX (R2, ni1d(k)* rho(k))
0 commit comments