4module gfdl_cloud_microphys_v3
6 use gfdl_cloud_microphys_v3_mod,
only: gfdl_cloud_microphys_v3_mod_init, &
7 gfdl_cloud_microphys_v3_mod_driver, &
8 gfdl_cloud_microphys_v3_mod_end, &
15 public gfdl_cloud_microphys_v3_run, gfdl_cloud_microphys_v3_init, gfdl_cloud_microphys_v3_final
17 logical :: is_initialized = .false.
32 subroutine gfdl_cloud_microphys_v3_init (me, master, nlunit, input_nml_file, logunit, &
33 fn_nml, imp_physics, imp_physics_gfdl, do_shoc, &
34 hydrostatic, errmsg, errflg)
38 integer,
intent (in) :: me
39 integer,
intent (in) :: master
40 integer,
intent (in) :: nlunit
41 integer,
intent (in) :: logunit
42 character(len=*),
intent (in) :: fn_nml
43 character(len=*),
intent (in) :: input_nml_file(:)
44 integer,
intent( in) :: imp_physics
45 integer,
intent( in) :: imp_physics_gfdl
46 logical,
intent( in) :: do_shoc
47 logical,
intent( in) :: hydrostatic
48 character(len=*),
intent(out) :: errmsg
49 integer,
intent(out) :: errflg
55 if (is_initialized)
return
57 if (imp_physics/=imp_physics_gfdl)
then
58 write(errmsg,
'(*(a))')
'Namelist option for microphysics does not match choice in suite definition file'
64 write(errmsg,
'(*(a))')
'SHOC is not currently compatible with GFDL MP v3'
69 call gfdl_cloud_microphys_v3_mod_init(me, master, nlunit, input_nml_file, logunit, fn_nml, hydrostatic, errmsg, errflg)
71 is_initialized = .true.
73 end subroutine gfdl_cloud_microphys_v3_init
83 subroutine gfdl_cloud_microphys_v3_final(errmsg, errflg)
87 character(len=*),
intent(out) :: errmsg
88 integer,
intent(out) :: errflg
94 if (.not.is_initialized)
return
96 call gfdl_cloud_microphys_v3_mod_end()
98 is_initialized = .false.
100 end subroutine gfdl_cloud_microphys_v3_final
118 subroutine gfdl_cloud_microphys_v3_run(fast_mp_consv, &
119 levs, im, rainmin, con_g, con_fvirt, con_rd, con_eps, garea, slmsk, snowd, &
120 gq0, gq0_ntcw, gq0_ntrw, gq0_ntiw, gq0_ntsw, gq0_ntgl, gq0_ntclamt, aerfld, &
121 gt0, gu0, gv0, vvl, prsl, phii, del, &
122 rain0, ice0, snow0, graupel0, prcp0, sr, oro, &
123 dtp, hydrostatic, lradar, refl_10cm, &
124 reset, effr_in, rew, rei, rer, res, reg, &
125 cplchm, pfi_lsan, pfl_lsan, con_one, con_p001, con_secinday, ten_t, ten_u, &
126 ten_v, ten_qv, ten_ql, ten_qr, ten_qi, ten_qs, ten_qg, ten_cldfrc, ten_q, &
129 use machine,
only: kind_phys, kind_dyn, kind_dbl_prec
134 integer,
intent(in ) :: levs, im
135 real(kind=kind_phys),
intent(in ) :: con_g, con_fvirt, con_rd, con_eps, rainmin
136 real(kind=kind_phys),
intent(in ) :: con_one, con_p001, con_secinday
137 real(kind=kind_phys),
intent(in ),
dimension(:) :: garea, slmsk, snowd, oro
138 real(kind=kind_phys),
intent(in ),
dimension(:,:) :: gq0, gq0_ntcw, gq0_ntrw, gq0_ntiw, &
139 gq0_ntsw, gq0_ntgl, gq0_ntclamt
140 real(kind_phys),
intent(in ),
dimension(:,:,:) :: aerfld
141 real(kind=kind_phys),
intent(in ),
dimension(:,:) :: gt0, gu0, gv0
142 real(kind=kind_phys),
intent(in ),
dimension(:,:) :: vvl, prsl, del
143 real(kind=kind_phys),
intent(in ),
dimension(:,:) :: phii
147 real(kind_phys),
intent(out ),
dimension(:),
optional :: rain0
148 real(kind_phys),
intent(out ),
dimension(:),
optional :: snow0
149 real(kind_phys),
intent(out ),
dimension(:),
optional :: ice0
150 real(kind_phys),
intent(out ),
dimension(:),
optional :: graupel0
151 real(kind_phys),
intent(out ),
dimension(:) :: prcp0
152 real(kind_phys),
intent(out ),
dimension(:) :: sr
154 real(kind_phys),
intent(out ),
dimension(:,:) :: ten_t, ten_u, ten_v, ten_qv, ten_ql, ten_qr, ten_qi, ten_qs, ten_qg, ten_cldfrc
155 real(kind_phys),
intent(out ),
dimension(:,:,:) :: ten_q
157 real(kind_phys),
intent(in) :: dtp
158 logical,
intent (in) :: hydrostatic, fast_mp_consv
160 logical,
intent (in) :: lradar
161 real(kind=kind_phys),
intent(inout),
dimension(:,:) :: refl_10cm
162 logical,
intent (in) :: reset, effr_in
163 real(kind=kind_phys),
intent(inout),
dimension(:,:),
optional :: rew, rei, rer, res, reg
164 logical,
intent (in) :: cplchm
166 real(kind=kind_phys),
intent(inout),
dimension(:,:),
optional :: pfi_lsan, pfl_lsan
168 character(len=*),
intent(out) :: errmsg
169 integer,
intent(out) :: errflg
172 integer :: iis, iie, jjs, jje, kks, kke, kbot, ktop
174 real(kind=kind_phys),
dimension(1:im,1:levs) :: delp, dz, uin, vin, pt, qv1, ql1, qi1, qr1, qs1, qg1, &
175 qa1, qnl, qni, w, p123, refl
176 real(kind=kind_phys),
dimension(1:im,1:levs) :: q_con, cappa
177 real(kind=kind_phys),
dimension(1:im,1,1:levs) :: pfils, pflls
178 real(kind=kind_phys),
dimension(1:im,1,1:levs) :: adj_vmr, te
179 real(kind=kind_phys),
dimension(1:im,1:levs) :: prefluxw, prefluxr, prefluxi, prefluxs, prefluxg
180 real(kind=kind_phys),
dimension(1:im) :: hs, gsize
181 real(kind=kind_dbl_prec),
dimension(1:im) :: dte
183 real(kind=kind_phys),
dimension(1:im) :: water0
184 real(kind=kind_phys) :: onebg
185 real(kind=kind_phys) :: tem
186 logical last_step, do_inline_mp
187 real(kind=kind_phys),
dimension(:,:),
allocatable :: new_qv, new_ql, new_qi, new_qr, new_qs, new_qg, new_qa, new_t
215 onebg = con_one/con_g
220 qnl(i,k) = aerfld(i,kk,11)
229 ql1(i,k) = gq0_ntcw(i,kk)
230 qr1(i,k) = gq0_ntrw(i,kk)
231 qi1(i,k) = gq0_ntiw(i,kk)
232 qs1(i,k) = gq0_ntsw(i,kk)
233 qg1(i,k) = gq0_ntgl(i,kk)
234 qa1(i,k) = gq0_ntclamt(i,kk)
236 w(i,k) = -vvl(i,kk) * (con_one+con_fvirt * gq0(i,kk)) &
237 * gt0(i,kk) / prsl(i,kk) * (con_rd*onebg)
240 delp(i,k) = del(i,kk)
241 dz(i,k) = (phii(i,kk)-phii(i,kk+1))*onebg
242 p123(i,k) = prsl(i,kk)
258 do_inline_mp = .false.
260 gsize = sqrt(garea(:))
262 call gfdl_cloud_microphys_v3_mod_driver( qv1, ql1, qr1, qi1, qs1, qg1, qa1, qnl, qni, pt, w,&
263 uin, vin, dz, delp, gsize, dtp, hs, water0, rain0, &
264 ice0, snow0, graupel0, hydrostatic, iis, iie, kks, kke, q_con, cappa, &
265 fast_mp_consv, adj_vmr, te, dte, prefluxw, prefluxr, prefluxi, prefluxs, &
266 prefluxg, last_step, do_inline_mp )
267 tem = dtp*con_p001/con_secinday
275 if(water0(i)*tem < rainmin)
then
278 if(rain0(i)*tem < rainmin)
then
281 if(ice0(i)*tem < rainmin)
then
284 if(snow0(i)*tem < rainmin)
then
287 if(graupel0(i)*tem < rainmin)
then
295 prcp0(i) = (rain0(i)+snow0(i)+ice0(i)+graupel0(i)) * tem
296 if ( prcp0(i) > rainmin )
then
297 sr(i) = (snow0(i) + ice0(i) + graupel0(i)) &
298 / (rain0(i) + snow0(i) + ice0(i) + graupel0(i))
309 graupel0 = graupel0*tem
315 ten_qv(i,k) = (qv1(i,kk) - gq0(i,k))/dtp
316 ten_ql(i,k) = (ql1(i,kk) - gq0_ntcw(i,k))/dtp
317 ten_qr(i,k) = (qr1(i,kk) - gq0_ntrw(i,k))/dtp
318 ten_qi(i,k) = (qi1(i,kk) - gq0_ntiw(i,k))/dtp
319 ten_qs(i,k) = (qs1(i,kk) - gq0_ntsw(i,k))/dtp
320 ten_qg(i,k) = (qg1(i,kk) - gq0_ntgl(i,k))/dtp
321 ten_cldfrc(i,k) = (qa1(i,kk) - gq0_ntclamt(i,k))/dtp
322 ten_t(i,k) = (pt(i,kk) - gt0(i,k))/dtp
323 ten_u(i,k) = (uin(i,kk) - gu0(i,k))/dtp
324 ten_v(i,k) = (vin(i,kk) - gv0(i,k))/dtp
325 refl_10cm(i,k) = refl(i,kk)
334 pfi_lsan(i,k) = prefluxi(i,kk) + prefluxs(i,kk) + prefluxg(i,kk)
335 pfl_lsan(i,k) = prefluxr(i,kk)
341 allocate(new_qv(im,levs), new_ql(im,levs), new_qi(im,levs), new_qr(im,levs), new_qs(im,levs), new_qg(im,levs), new_qa(im,levs), new_t(im,levs))
345 new_qv(i,k) = qv1(i,kk)
346 new_ql(i,k) = ql1(i,kk)
347 new_qr(i,k) = qr1(i,kk)
348 new_qi(i,k) = qi1(i,kk)
349 new_qs(i,k) = qs1(i,kk)
350 new_qg(i,k) = qg1(i,kk)
351 new_qa(i,k) = qa1(i,kk)
352 new_t(i,k) = pt(i,kk)
356 call cld_eff_rad (1, im, 1, levs, slmsk(1:im), &
357 prsl(1:im,1:levs), del(1:im,1:levs), &
358 new_t(1:im,1:levs), new_qv(1:im,1:levs), &
359 new_ql(1:im,1:levs), new_qi(1:im,1:levs), &
360 new_qr(1:im,1:levs), new_qs(1:im,1:levs), &
361 new_qg(1:im,1:levs), new_qa(1:im,1:levs), &
362 rew(1:im,1:levs), rei(1:im,1:levs), rer(1:im,1:levs),&
363 res(1:im,1:levs), reg(1:im,1:levs),snowd(1:im))
367 call rad_ref (1, im, 1, 1, qv1(1:im,1:levs), qr1(1:im,1:levs), &
368 qs1(1:im,1:levs),qg1(1:im,1:levs),pt(1:im,1:levs), &
369 delp(1:im,1:levs), dz(1:im,1:levs), refl(1:im,1:levs), levs, hydrostatic, &
375 refl_10cm(i,k) = max(-35.,refl(i,kk))
381 deallocate(new_qv, new_ql, new_qi, new_qr, new_qs, new_qg, new_qa, new_t)
384 end subroutine gfdl_cloud_microphys_v3_run
386end module gfdl_cloud_microphys_v3