Skip to content

Commit b41850f

Browse files
committed
Merge branch 'MPAS-v8.0/ccpp_wsm6' into develop (PR #1061)
This merge adds the initial implementation of the CCPP-compliant version of the WSM6 microphysics scheme. The initial version of module_mp_wsm6.F is split in two separate files: mp_wsm6.F in physics_mmm contains the actual parameterization of the WSM6 cloud microphysics scheme whereas the modified version of module_mp_wsm6.F reduces to a buffer between the parameterization and the MPAS physics driver.
2 parents cd002df + 1a6aad1 commit b41850f

11 files changed

Lines changed: 3670 additions & 2679 deletions

File tree

src/core_atmosphere/physics/mpas_atmphys_constants.F

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,14 @@ module mpas_atmphys_constants
7575
real(kind=RKIND),parameter:: epsilon = 1.e-15
7676
real(kind=RKIND),parameter:: psat = 610.78
7777

78+
real(kind=RKIND),parameter:: re_qc_bg = 2.49e-6 ! effective radius of cloud water for background (m)
79+
real(kind=RKIND),parameter:: re_qi_bg = 4.99e-6 ! effective radius of cloud ice for background (m)
80+
real(kind=RKIND),parameter:: re_qs_bg = 9.99e-6 ! effective radius of snow for background (m)
81+
82+
real(kind=RKIND),parameter:: re_qc_max = 50.e-6 ! maximum effective radius of cloud water (m)
83+
real(kind=RKIND),parameter:: re_qi_max = 125.e-6 ! maximum effective radius of cloud ice (m)
84+
real(kind=RKIND),parameter:: re_qs_max = 999.e-6 ! maximum radius of snow (m)
85+
7886
!constants specific to long- and short-wave radiation codes:
7987
!real(kind=RKIND),parameter:: solcon_0 = 1365. !solar constant [W/m2]
8088
real(kind=RKIND),parameter:: solcon_0 = 1370. !solar constant [W/m2]

src/core_atmosphere/physics/mpas_atmphys_driver_microphysics.F

Lines changed: 44 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,9 @@ module mpas_atmphys_driver_microphysics
1919
!wrf physics:
2020
use module_mp_kessler
2121
use module_mp_thompson
22-
use module_mp_wsm6
22+
use module_mp_wsm6,only: wsm6
23+
use mp_wsm6,only: mp_wsm6_init,refl10cm_wsm6
24+
2325

2426
implicit none
2527
private
@@ -256,8 +258,16 @@ subroutine microphysics_init(dminfo,configs,mesh,sfc_input,diag_physics)
256258
!local pointer:
257259
character(len=StrKIND),pointer:: microp_scheme
258260

261+
!CCPP-compliant flags:
262+
character(len=StrKIND):: errmsg
263+
integer:: errflg
264+
259265
!-----------------------------------------------------------------------------------------------------------------
260266

267+
!initialization of CCPP-compliant flags:
268+
errmsg = ' '
269+
errflg = 0
270+
261271
call mpas_pool_get_config(configs,'config_microp_scheme',microp_scheme)
262272

263273
microp_select: select case(microp_scheme)
@@ -267,7 +277,8 @@ subroutine microphysics_init(dminfo,configs,mesh,sfc_input,diag_physics)
267277
call init_thompson_clouddroplets_forMPAS(mesh,sfc_input,diag_physics)
268278

269279
case("mp_wsm6")
270-
call wsm6init(rho_a,rho_r,rho_s,cliq,cpv,hail_opt,.false.)
280+
call mp_wsm6_init(den0=rho_a,denr=rho_r,dens=rho_s,cl=cliq,cpv=cpv, &
281+
hail_opt=hail_opt,errmsg=errmsg,errflg=errflg)
271282

272283
case default
273284

@@ -301,10 +312,18 @@ subroutine driver_microphysics(configs,mesh,state,time_lev,diag,diag_physics,ten
301312
!local variables and arrays:
302313
integer:: istep
303314

315+
!CCPP-compliant flags:
316+
character(len=StrKIND):: errmsg
317+
integer:: errflg
318+
304319
!-----------------------------------------------------------------------------------------------------------------
305320
!call mpas_log_write('')
306321
!call mpas_log_write('---enter subroutine driver_microphysics:')
307322

323+
!initialization of CCPP-compliant flags:
324+
errmsg = ' '
325+
errflg = 0
326+
308327
call mpas_pool_get_config(configs,'config_microp_scheme',microp_scheme)
309328

310329
!... allocation of microphysics arrays:
@@ -363,27 +382,30 @@ subroutine driver_microphysics(configs,mesh,state,time_lev,diag,diag_physics,ten
363382
call mpas_timer_stop('Thompson')
364383

365384
case ("mp_wsm6")
366-
call mpas_timer_start('WSM6')
385+
call mpas_timer_start('mp_wsm6')
367386
call wsm6( &
368-
th = th_p , q = qv_p , qc = qc_p , &
369-
qr = qr_p , qi = qi_p , qs = qs_p , &
370-
qg = qg_p , den = rho_p , pii = pi_p , &
371-
p = pres_p , delz = dz_p , delt = dt_microp , &
372-
g = gravity , cpd = cp , cpv = cpv , &
373-
rd = R_d , rv = R_v , t0c = svpt0 , &
374-
ep1 = ep_1 , ep2 = ep_2 , qmin = epsilon , &
375-
xls = xls , xlv0 = xlv , xlf0 = xlf , &
376-
den0 = rho_a , denr = rho_w , cliq = cliq , &
377-
cice = cice , psat = psat , rain = rainnc_p , &
378-
rainncv = rainncv_p , snow = snownc_p , snowncv = snowncv_p , &
379-
graupel = graupelnc_p , graupelncv = graupelncv_p , sr = sr_p , &
380-
re_cloud = recloud_p , re_ice = reice_p , re_snow = resnow_p , &
381-
has_reqc = has_reqc , has_reqi = has_reqi , has_reqs = has_reqs , &
382-
ids = ids , ide = ide , jds = jds , jde = jde , kds = kds , kde = kde , &
383-
ims = ims , ime = ime , jms = jms , jme = jme , kms = kms , kme = kme , &
384-
its = its , ite = ite , jts = jts , jte = jte , kts = kts , kte = kte &
387+
th = th_p , q = qv_p , qc = qc_p , &
388+
qr = qr_p , qi = qi_p , qs = qs_p , &
389+
qg = qg_p , den = rho_p , pii = pi_p , &
390+
p = pres_p , delz = dz_p , delt = dt_microp , &
391+
g = gravity , cpd = cp , cpv = cpv , &
392+
rd = R_d , rv = R_v , t0c = svpt0 , &
393+
ep1 = ep_1 , ep2 = ep_2 , qmin = epsilon , &
394+
xls = xls , xlv0 = xlv , xlf0 = xlf , &
395+
den0 = rho_a , denr = rho_w , cliq = cliq , &
396+
cice = cice , psat = psat , rain = rainnc_p , &
397+
rainncv = rainncv_p , snow = snownc_p , snowncv = snowncv_p , &
398+
graupel = graupelnc_p , graupelncv = graupelncv_p , sr = sr_p , &
399+
re_cloud = recloud_p , re_ice = reice_p , re_snow = resnow_p , &
400+
has_reqc = has_reqc , has_reqi = has_reqi , has_reqs = has_reqs , &
401+
re_qc_bg = re_qc_bg , re_qi_bg = re_qi_bg , re_qs_bg = re_qs_bg , &
402+
re_qc_max = re_qc_max , re_qi_max = re_qi_max , re_qs_max = re_qs_max , &
403+
errmsg = errmsg , errflg = errflg , &
404+
ids = ids , ide = ide , jds = jds , jde = jde , kds = kds , kde = kde , &
405+
ims = ims , ime = ime , jms = jms , jme = jme , kms = kms , kme = kme , &
406+
its = its , ite = ite , jts = jts , jte = jte , kts = kts , kte = kte &
385407
)
386-
call mpas_timer_stop('WSM6')
408+
call mpas_timer_stop('mp_wsm6')
387409

388410
case default
389411

@@ -640,7 +662,7 @@ subroutine compute_radar_reflectivity(configs,diag_physics,its,ite)
640662
zp(k) = z_p(i,k,j) - z_p(i,1,j)+0.5*dz_p(i,1,j) ! height AGL
641663
enddo
642664

643-
call refl10cm_wsm6(qv1d,qr1d,qs1d,qg1d,t1d,p1d,dBZ1d,kts,kte,i,j)
665+
call refl10cm_wsm6(qv1d,qr1d,qs1d,qg1d,t1d,p1d,dBZ1d,kts,kte)
644666

645667
kp = 1
646668
do k = kts,kte

src/core_atmosphere/physics/physics_mmm/Makefile

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,22 @@ OBJS = \
99
bl_gwdo.o \
1010
bl_ysu.o \
1111
cu_ntiedtke.o \
12-
sf_sfclayrev.o
12+
sf_sfclayrev.o \
13+
module_libmassv.o \
14+
mp_radar.o \
15+
mp_wsm6_effectRad.o \
16+
mp_wsm6.o
1317

1418
physics_mmm: $(OBJS)
1519
ar -ru ./../libphys.a $(OBJS)
1620

1721
# DEPENDENCIES:
22+
mp_wsm6_effectRad.o: \
23+
mp_wsm6.o
24+
25+
mp_wsm6.o: \
26+
mp_radar.o \
27+
module_libmassv.o
1828

1929
clean:
2030
$(RM) *.f90 *.o *.mod
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
!=================================================================================================================
2+
module module_libmassv
3+
4+
implicit none
5+
6+
7+
interface vrec
8+
module procedure vrec_d
9+
module procedure vrec_s
10+
end interface
11+
12+
interface vsqrt
13+
module procedure vsqrt_d
14+
module procedure vsqrt_s
15+
end interface
16+
17+
18+
contains
19+
20+
21+
!=================================================================================================================
22+
subroutine vrec_d(y,x,n)
23+
!=================================================================================================================
24+
integer,intent(in):: n
25+
real*8,dimension(*),intent(in):: x
26+
real*8,dimension(*),intent(out):: y
27+
28+
integer:: j
29+
!-----------------------------------------------------------------------------------------------------------------
30+
31+
do j=1,n
32+
y(j)=1.d0/x(j)
33+
enddo
34+
35+
end subroutine vrec_d
36+
37+
!=================================================================================================================
38+
subroutine vrec_s(y,x,n)
39+
!=================================================================================================================
40+
integer,intent(in):: n
41+
real*4,dimension(*),intent(in):: x
42+
real*4,dimension(*),intent(out):: y
43+
44+
integer:: j
45+
!-----------------------------------------------------------------------------------------------------------------
46+
47+
do j=1,n
48+
y(j)=1.e0/x(j)
49+
enddo
50+
51+
end subroutine vrec_s
52+
53+
!=================================================================================================================
54+
subroutine vsqrt_d(y,x,n)
55+
!=================================================================================================================
56+
integer,intent(in):: n
57+
real*8,dimension(*),intent(in):: x
58+
real*8,dimension(*),intent(out):: y
59+
60+
integer:: j
61+
!-----------------------------------------------------------------------------------------------------------------
62+
63+
do j=1,n
64+
y(j)=sqrt(x(j))
65+
enddo
66+
67+
end subroutine vsqrt_d
68+
69+
!=================================================================================================================
70+
subroutine vsqrt_s(y,x,n)
71+
!=================================================================================================================
72+
73+
integer,intent(in):: n
74+
real*4,dimension(*),intent(in):: x
75+
real*4,dimension(*),intent(out):: y
76+
77+
integer:: j
78+
79+
!-----------------------------------------------------------------------------------------------------------------
80+
81+
do j=1,n
82+
y(j)=sqrt(x(j))
83+
enddo
84+
85+
end subroutine vsqrt_s
86+
87+
!=================================================================================================================
88+
end module module_libmassv
89+
!=================================================================================================================

0 commit comments

Comments
 (0)