33 subroutine mp_thompson_init(ncol, nlev, con_pi, con_t0c, con_rv, &
34 con_cp, con_rgas, con_boltz, con_amd, &
35 con_amw, con_avgd, con_hvap, con_hfus, &
36 con_g, con_rd, con_eps, &
37 con_Nt_c_l, con_Nt_c_o, con_av_i, &
38 con_xnc_max, con_ssati_min, con_Nt_i_max,&
40 restart, imp_physics, &
41 imp_physics_thompson, convert_dry_rho, &
42 spechum, qc, qr, qi, qs, qg, ni, nr, &
43 is_aerosol_aware, merra2_aerosol_aware, &
45 nwfa, nifa, tgrs, prsl, phil, area, &
46 aerfld, mpicomm, mpirank, mpiroot, &
47 threads, ext_diag, diag3d, &
48 is_initialized, errmsg, errflg)
57 integer,
intent(in ) :: ncol
58 integer,
intent(in ) :: nlev
59 real(kind_phys),
intent(in ) :: con_pi, con_t0c, con_rv, con_cp, con_rgas, &
60 con_boltz, con_amd, con_amw, con_avgd, &
61 con_hvap, con_hfus, con_g, con_rd, con_eps
62 real(kind_phys),
optional,
intent(in ) :: con_nt_c_l, con_nt_c_o, con_av_i, con_xnc_max, &
63 con_ssati_min, con_nt_i_max, con_rr_min
64 logical,
intent(in ) :: restart
65 logical,
intent(inout) :: is_initialized
66 integer,
intent(in ) :: imp_physics
67 integer,
intent(in ) :: imp_physics_thompson
69 logical,
intent(in ) :: convert_dry_rho
70 real(kind_phys),
intent(inout) :: spechum(:,:)
71 real(kind_phys),
intent(inout) :: qc(:,:)
72 real(kind_phys),
intent(inout) :: qr(:,:)
73 real(kind_phys),
intent(inout) :: qi(:,:)
74 real(kind_phys),
intent(inout) :: qs(:,:)
75 real(kind_phys),
intent(inout) :: qg(:,:)
76 real(kind_phys),
intent(inout) :: ni(:,:)
77 real(kind_phys),
intent(inout) :: nr(:,:)
79 logical,
intent(in ) :: is_aerosol_aware
80 logical,
intent(in ) :: merra2_aerosol_aware
81 real(kind_phys),
intent(inout),
optional :: nc(:,:)
82 real(kind_phys),
intent(inout),
optional :: nwfa(:,:)
83 real(kind_phys),
intent(inout),
optional :: nifa(:,:)
84 real(kind_phys),
intent(inout),
optional :: nwfa2d(:)
85 real(kind_phys),
intent(inout),
optional :: nifa2d(:)
86 real(kind_phys),
intent(in) :: aerfld(:,:,:)
88 real(kind_phys),
intent(in ) :: tgrs(:,:)
89 real(kind_phys),
intent(in ) :: prsl(:,:)
90 real(kind_phys),
intent(in ) :: phil(:,:)
91 real(kind_phys),
intent(in ) :: area(:)
93 type(mpi_comm),
intent(in ) :: mpicomm
94 integer,
intent(in ) :: mpirank
95 integer,
intent(in ) :: mpiroot
97 integer,
intent(in ) :: threads
99 logical,
intent(in ) :: ext_diag
100 real(kind_phys),
intent(in ),
optional :: diag3d(:,:,:)
102 character(len=*),
intent( out) :: errmsg
103 integer,
intent( out) :: errflg
106 real(kind_phys) :: qv(1:ncol,1:nlev)
107 real(kind_phys) :: hgt(1:ncol,1:nlev)
108 real(kind_phys) :: rho(1:ncol,1:nlev)
109 real(kind_phys) :: orho(1:ncol,1:nlev)
110 real(kind_phys) :: nc_local(1:ncol,1:nlev)
112 real (kind=kind_phys) :: h_01, z1, niin3, niccn3
119 if (is_initialized)
return
136 if (
present(con_nt_c_l)) nt_c_l = con_nt_c_l
137 if (
present(con_nt_c_o)) nt_c_o = con_nt_c_o
138 if (
present(con_av_i))
then
139 if (con_av_i > 0.)
then
142 av_i = av_s * d0s ** (bv_s - bv_i)
145 av_i = av_s * d0s ** (bv_s - bv_i)
147 if (
present(con_xnc_max)) xnc_max = con_xnc_max
148 if (
present(con_ssati_min)) ssati_min = con_ssati_min
149 if (
present(con_nt_i_max)) nt_i_max = con_nt_i_max
150 if (
present(con_rr_min)) rr_min = con_rr_min
153 if (imp_physics/=imp_physics_thompson)
then
154 write(errmsg,
'(*(a))')
"Logic error: namelist choice of microphysics is different from Thompson MP"
160 if (
size(diag3d,dim=3) /= ext_ndiag3d)
then
161 write(errmsg,
'(*(a))')
"Logic error: number of diagnostic 3d arrays from model does not match requirements"
167 if (is_aerosol_aware .and. merra2_aerosol_aware)
then
168 write(errmsg,
'(*(a))')
"Logic error: Only one Thompson aerosol option can be true, either is_aerosol_aware or merra2_aerosol_aware)"
175 merra2_aerosol_aware_in=merra2_aerosol_aware, &
176 mpicomm=mpicomm, mpirank=mpirank, mpiroot=mpiroot, &
177 threads=threads, errmsg=errmsg, errflg=errflg)
178 if (errflg /= 0)
return
182 is_initialized = .true.
190 where(spechum<0) spechum = 1.0e-10
200 if (merra2_aerosol_aware)
then
201 call get_niwfa(aerfld, nifa, nwfa, ncol, nlev)
205 qv = spechum/(1.0_kind_phys-spechum)
207 if (convert_dry_rho)
then
208 qc = qc/(1.0_kind_phys-spechum)
209 qr = qr/(1.0_kind_phys-spechum)
210 qi = qi/(1.0_kind_phys-spechum)
211 qs = qs/(1.0_kind_phys-spechum)
212 qg = qg/(1.0_kind_phys-spechum)
214 ni = ni/(1.0_kind_phys-spechum)
215 nr = nr/(1.0_kind_phys-spechum)
216 if (is_aerosol_aware .or. merra2_aerosol_aware)
then
217 nc = nc/(1.0_kind_phys-spechum)
218 nwfa = nwfa/(1.0_kind_phys-spechum)
219 nifa = nifa/(1.0_kind_phys-spechum)
224 rho = con_eps*prsl/(con_rd*tgrs*(qv+con_eps))
228 where(qi .LE. 0.0) ni=0.0
229 where(qi .GT. 0 .and. ni .LE. 0.0) ni =
make_icenumber(qi*rho, tgrs) * orho
230 where(qi .EQ. 0.0 .and. ni .GT. 0.0) ni=0.0
233 where(qr .LE. 0.0) nr=0.0
234 where(qr .GT. 0 .and. nr .LE. 0.0) nr = make_rainnumber(qr*rho, tgrs) * orho
235 where(qr .EQ. 0.0 .and. nr .GT. 0.0) nr=0.0
240 if (is_aerosol_aware)
then
243 if (maxval(nwfa) .lt. eps)
then
244 if (mpirank==mpiroot)
write(*,*)
' Apparently there are no initial CCN aerosols.'
246 if (hgt(i,1).le.1000.0)
then
248 elseif (hgt(i,1).ge.2500.0)
then
251 h_01 = 0.8*cos(hgt(i,1)*0.001 - 1.0)
253 niccn3 = -1.0*alog(naccn1/naccn0)/h_01
254 nwfa(i,1) = naccn1+naccn0*exp(-((hgt(i,2)-hgt(i,1))/1000.)*niccn3)
255 z1 = hgt(i,2)-hgt(i,1)
256 nwfa2d(i) = nwfa(i,1) * 0.000196 * (50./z1)
258 nwfa(i,k) = naccn1+naccn0*exp(-((hgt(i,k)-hgt(i,1))/1000.)*niccn3)
262 if (mpirank==mpiroot)
write(*,*)
' Apparently initial CCN aerosols are present.'
263 if (maxval(nwfa2d) .lt. eps)
then
273 if (mpirank==mpiroot)
write(*,*)
' Apparently there are no initial CCN aerosol surface emission rates.'
275 z1 = hgt(i,2)-hgt(i,1)
276 nwfa2d(i) = nwfa(i,1) * 0.000196 * (50./z1)
279 if (mpirank==mpiroot)
write(*,*)
' Apparently initial CCN aerosol surface emission rates are present.'
284 if (maxval(nifa) .lt. eps)
then
285 if (mpirank==mpiroot)
write(*,*)
' Apparently there are no initial IN aerosols.'
287 if (hgt(i,1).le.1000.0)
then
289 elseif (hgt(i,1).ge.2500.0)
then
292 h_01 = 0.8*cos(hgt(i,1)*0.001 - 1.0)
294 niin3 = -1.0*alog(nain1/nain0)/h_01
295 nifa(i,1) = nain1+nain0*exp(-((hgt(i,2)-hgt(i,1))/1000.)*niin3)
298 nifa(i,k) = nain1+nain0*exp(-((hgt(i,k)-hgt(i,1))/1000.)*niin3)
302 if (mpirank==mpiroot)
write(*,*)
' Apparently initial IN aerosols are present.'
303 if (maxval(nifa2d) .lt. eps)
then
304 if (mpirank==mpiroot)
write(*,*)
' Apparently there are no initial IN aerosol surface emission rates, set to zero.'
308 if (mpirank==mpiroot)
write(*,*)
' Apparently initial IN aerosol surface emission rates are present.'
313 where(qc .LE. 0.0) nc=0.0
314 where(qc .GT. 0 .and. nc .LE. 0.0) nc = make_dropletnumber(qc*rho, nwfa*rho) * orho
315 where(qc .EQ. 0.0 .and. nc .GT. 0.0) nc = 0.0
318 where(nwfa .LE. 0.0) nwfa = 1.1e6
319 where(nifa .LE. 0.0) nifa = nain1*0.01
324 else if (merra2_aerosol_aware)
then
327 where(qc .LE. 0.0) nc=0.0
328 where(qc .GT. 0 .and. nc .LE. 0.0) nc = make_dropletnumber(qc*rho, nwfa*rho) * orho
329 where(qc .EQ. 0.0 .and. nc .GT. 0.0) nc = 0.0
335 nc_local = nt_c_l/rho
339 if (convert_dry_rho)
then
346 ni = ni/(1.0_kind_phys+qv)
347 nr = nr/(1.0_kind_phys+qv)
348 if (is_aerosol_aware .or. merra2_aerosol_aware)
then
349 nc = nc/(1.0_kind_phys+qv)
350 nwfa = nwfa/(1.0_kind_phys+qv)
351 nifa = nifa/(1.0_kind_phys+qv)
355 is_initialized = .true.
367 con_eps, convert_dry_rho, &
368 spechum, qc, qr, qi, qs, qg, ni, nr, &
370 merra2_aerosol_aware, nc, nwfa, nifa,&
371 nwfa2d, nifa2d, aero_ind_fdb, &
372 tgrs, prsl, phii, omega, &
373 sedi_semi, decfl, islmsk, dtp, &
375 first_time_step, istep, nsteps, &
376 prcp, rain, graupel, ice, snow, sr, &
377 refl_10cm, fullradar_diag, &
379 do_radar_ref, aerfld, &
380 mpicomm, mpirank, mpiroot, &
381 ext_diag, diag3d, reset_diag3d, &
382 spp_wts_mp, spp_mp, n_var_spp, &
383 spp_prt_list, spp_var_list, &
385 cplchm, pfi_lsan, pfl_lsan, &
386 is_initialized, fs_fac_rain, fs_fac_snow, &
387 ten_q, dspechum, dqc, dqr, &
388 dqi, dqs, dqg, dni, dnr, dnc, dnwfa, &
389 dnifa, dtgrs, ten_u, ten_v, errmsg, errflg)
394 logical,
intent(inout) :: is_initialized
396 integer,
intent(in ) :: ncol
397 integer,
intent(in ) :: nlev
398 real(kind_phys),
intent(in ) :: con_g
399 real(kind_phys),
intent(in ) :: con_rd
400 real(kind_phys),
intent(in ) :: con_eps
402 logical,
intent(in ) :: convert_dry_rho
403 real(kind_phys),
intent(in ) :: spechum(:,:)
404 real(kind_phys),
intent(in ) :: qc(:,:)
405 real(kind_phys),
intent(in ) :: qr(:,:)
406 real(kind_phys),
intent(in ) :: qi(:,:)
407 real(kind_phys),
intent(in ) :: qs(:,:)
408 real(kind_phys),
intent(in ) :: qg(:,:)
409 real(kind_phys),
intent(in ) :: ni(:,:)
410 real(kind_phys),
intent(in ) :: nr(:,:)
412 logical,
intent(in) :: is_aerosol_aware, fullradar_diag
413 logical,
intent(in) :: merra2_aerosol_aware
414 real(kind_phys),
optional,
intent(in ) :: nc(:,:)
415 real(kind_phys),
optional,
intent(in ) :: nwfa(:,:)
416 real(kind_phys),
optional,
intent(in ) :: nifa(:,:)
417 real(kind_phys),
optional,
intent(in ) :: nwfa2d(:)
418 real(kind_phys),
optional,
intent(in ) :: nifa2d(:)
419 real(kind_phys),
intent(in) :: aerfld(:,:,:)
420 logical,
optional,
intent(in ) :: aero_ind_fdb
422 real(kind_phys),
intent(in ) :: tgrs(:,:)
423 real(kind_phys),
intent(in ) :: prsl(:,:)
424 real(kind_phys),
intent(in ) :: phii(:,:)
425 real(kind_phys),
intent(in ) :: omega(:,:)
426 integer,
intent(in ) :: islmsk(:)
427 real(kind_phys),
intent(in ) :: dtp
428 logical,
intent(in ) :: first_time_step
429 integer,
intent(in ) :: istep, nsteps
430 real(kind=kind_phys),
intent(in ) :: dt_inner
432 real(kind_phys),
intent(inout) :: prcp(:)
433 real(kind_phys),
intent(inout) :: rain(:)
434 real(kind_phys),
intent(inout) :: graupel(:)
435 real(kind_phys),
intent(inout) :: ice(:)
436 real(kind_phys),
intent(inout) :: snow(:)
437 real(kind_phys),
intent( out) :: sr(:)
439 real(kind_phys),
intent(inout) :: refl_10cm(:,:)
440 real(kind_phys),
intent(inout) :: max_hail_diam_sfc(:)
441 logical,
intent(in ) :: do_radar_ref
442 logical,
intent(in) :: sedi_semi
443 integer,
intent(in) :: decfl
445 type(mpi_comm),
intent(in) :: mpicomm
446 integer,
intent(in) :: mpirank
447 integer,
intent(in) :: mpiroot
449 logical,
intent(in) :: ext_diag
450 real(kind_phys),
target,
intent(inout),
optional :: diag3d(:,:,:)
451 logical,
intent(in) :: reset_diag3d
453 real(kind_phys),
intent( out) :: ten_q(:,:,:)
454 real(kind_phys),
intent( out) :: ten_u(:,:)
455 real(kind_phys),
intent( out) :: ten_v(:,:)
456 real(kind_phys),
intent( out) :: dspechum(:,:)
457 real(kind_phys),
intent( out) :: dqc(:,:)
458 real(kind_phys),
intent( out) :: dqr(:,:)
459 real(kind_phys),
intent( out) :: dqi(:,:)
460 real(kind_phys),
intent( out) :: dqs(:,:)
461 real(kind_phys),
intent( out) :: dqg(:,:)
462 real(kind_phys),
intent( out) :: dni(:,:)
463 real(kind_phys),
intent( out) :: dnr(:,:)
464 real(kind_phys),
optional,
intent( out) :: dnc(:,:)
465 real(kind_phys),
optional,
intent( out) :: dnwfa(:,:)
466 real(kind_phys),
optional,
intent( out) :: dnifa(:,:)
467 real(kind_phys),
intent( out) :: dtgrs(:,:)
470 character(len=*),
intent( out) :: errmsg
471 integer,
intent( out) :: errflg
474 integer,
intent(in) :: spp_mp
475 integer,
intent(in) :: n_var_spp
476 real(kind_phys),
intent(in),
optional :: spp_wts_mp(:,:)
477 real(kind_phys),
intent(in),
optional :: spp_prt_list(:)
478 character(len=10),
intent(in),
optional :: spp_var_list(:)
479 real(kind_phys),
intent(in),
optional :: spp_stddev_cutoff(:)
481 logical,
intent (in) :: cplchm
483 real(kind=kind_phys),
intent(inout),
dimension(:,:),
optional :: pfi_lsan
484 real(kind=kind_phys),
intent(inout),
dimension(:,:),
optional :: pfl_lsan
487 real(kind_phys),
intent(in),
optional :: fs_fac_rain, fs_fac_snow
492 real(kind_phys) :: dtstep
495 real(kind_phys) :: rho(1:ncol,1:nlev)
497 real(kind_phys) :: qv(1:ncol,1:nlev)
499 real(kind_phys) :: w(1:ncol,1:nlev)
500 real(kind_phys) :: dz(1:ncol,1:nlev)
502 real(kind_phys) :: rain_mp(1:ncol)
503 real(kind_phys) :: graupel_mp(1:ncol)
504 real(kind_phys) :: ice_mp(1:ncol)
505 real(kind_phys) :: snow_mp(1:ncol)
506 real(kind_phys) :: delta_rain_mp(1:ncol)
507 real(kind_phys) :: delta_graupel_mp(1:ncol)
508 real(kind_phys) :: delta_ice_mp(1:ncol)
509 real(kind_phys) :: delta_snow_mp(1:ncol)
511 real(kind_phys) :: new_spechum(1:ncol,1:nlev)
512 real(kind_phys) :: new_qc(1:ncol,1:nlev)
513 real(kind_phys) :: new_qr(1:ncol,1:nlev)
514 real(kind_phys) :: new_qi(1:ncol,1:nlev)
515 real(kind_phys) :: new_qs(1:ncol,1:nlev)
516 real(kind_phys) :: new_qg(1:ncol,1:nlev)
517 real(kind_phys) :: new_ni(1:ncol,1:nlev)
518 real(kind_phys) :: new_nr(1:ncol,1:nlev)
519 real(kind_phys),
allocatable :: new_nc(:,:), new_nwfa(:,:), new_nifa(:,:)
520 real(kind_phys) :: new_tgrs(1:ncol,1:nlev)
522 real(kind_phys) :: pfils(1:ncol,1:nlev,1)
523 real(kind_phys) :: pflls(1:ncol,1:nlev,1)
526 integer :: do_radar_ref_mp
528 logical,
parameter :: do_effective_radii = .false.
529 integer,
parameter :: has_reqc = 0
530 integer,
parameter :: has_reqi = 0
531 integer,
parameter :: has_reqs = 0
532 integer,
parameter :: kme_stoch = 1
533 integer :: spp_mp_opt
535 integer :: ids,ide, jds,jde, kds,kde, &
536 ims,ime, jms,jme, kms,kme, &
537 its,ite, jts,jte, kts,kte
542 real(kind_phys),
dimension(:,:,:),
pointer :: prw_vcdc => null()
543 real(kind_phys),
dimension(:,:,:),
pointer :: prw_vcde => null()
544 real(kind_phys),
dimension(:,:,:),
pointer :: tpri_inu => null()
545 real(kind_phys),
dimension(:,:,:),
pointer :: tpri_ide_d => null()
546 real(kind_phys),
dimension(:,:,:),
pointer :: tpri_ide_s => null()
547 real(kind_phys),
dimension(:,:,:),
pointer :: tprs_ide => null()
548 real(kind_phys),
dimension(:,:,:),
pointer :: tprs_sde_d => null()
549 real(kind_phys),
dimension(:,:,:),
pointer :: tprs_sde_s => null()
550 real(kind_phys),
dimension(:,:,:),
pointer :: tprg_gde_d => null()
551 real(kind_phys),
dimension(:,:,:),
pointer :: tprg_gde_s => null()
552 real(kind_phys),
dimension(:,:,:),
pointer :: tpri_iha => null()
553 real(kind_phys),
dimension(:,:,:),
pointer :: tpri_wfz => null()
554 real(kind_phys),
dimension(:,:,:),
pointer :: tpri_rfz => null()
555 real(kind_phys),
dimension(:,:,:),
pointer :: tprg_rfz => null()
556 real(kind_phys),
dimension(:,:,:),
pointer :: tprs_scw => null()
557 real(kind_phys),
dimension(:,:,:),
pointer :: tprg_scw => null()
558 real(kind_phys),
dimension(:,:,:),
pointer :: tprg_rcs => null()
559 real(kind_phys),
dimension(:,:,:),
pointer :: tprs_rcs => null()
560 real(kind_phys),
dimension(:,:,:),
pointer :: tprr_rci => null()
561 real(kind_phys),
dimension(:,:,:),
pointer :: tprg_rcg => null()
562 real(kind_phys),
dimension(:,:,:),
pointer :: tprw_vcd_c => null()
563 real(kind_phys),
dimension(:,:,:),
pointer :: tprw_vcd_e => null()
564 real(kind_phys),
dimension(:,:,:),
pointer :: tprr_sml => null()
565 real(kind_phys),
dimension(:,:,:),
pointer :: tprr_gml => null()
566 real(kind_phys),
dimension(:,:,:),
pointer :: tprr_rcg => null()
567 real(kind_phys),
dimension(:,:,:),
pointer :: tprr_rcs => null()
568 real(kind_phys),
dimension(:,:,:),
pointer :: tprv_rev => null()
569 real(kind_phys),
dimension(:,:,:),
pointer :: tten3 => null()
570 real(kind_phys),
dimension(:,:,:),
pointer :: qvten3 => null()
571 real(kind_phys),
dimension(:,:,:),
pointer :: qrten3 => null()
572 real(kind_phys),
dimension(:,:,:),
pointer :: qsten3 => null()
573 real(kind_phys),
dimension(:,:,:),
pointer :: qgten3 => null()
574 real(kind_phys),
dimension(:,:,:),
pointer :: qiten3 => null()
575 real(kind_phys),
dimension(:,:,:),
pointer :: niten3 => null()
576 real(kind_phys),
dimension(:,:,:),
pointer :: nrten3 => null()
577 real(kind_phys),
dimension(:,:,:),
pointer :: ncten3 => null()
578 real(kind_phys),
dimension(:,:,:),
pointer :: qcten3 => null()
600 new_spechum = spechum
610 if (is_aerosol_aware .or. merra2_aerosol_aware)
then
615 allocate(new_nc(ncol,nlev))
616 allocate(new_nwfa(ncol,nlev))
617 allocate(new_nifa(ncol,nlev))
623 if (first_time_step .and. istep==1)
then
625 if (.not.is_initialized)
then
626 write(errmsg, fmt=
'((a))')
'mp_thompson_run called before mp_thompson_init'
631 if (is_aerosol_aware .and. .not. (
present(nc) .and. &
632 present(nwfa) .and. &
633 present(nifa) .and. &
634 present(nwfa2d) .and. &
635 present(nifa2d) ))
then
636 write(errmsg,fmt=
'(*(a))')
'Logic error in mp_thompson_run:', &
637 ' aerosol-aware microphysics require all of the', &
638 ' following optional arguments:', &
639 ' nc, nwfa, nifa, nwfa2d, nifa2d'
642 else if (merra2_aerosol_aware .and. .not. (
present(nc) .and. &
643 present(nwfa) .and. &
644 present(nifa) ))
then
645 write(errmsg,fmt=
'(*(a))')
'Logic error in mp_thompson_run:', &
646 ' merra2 aerosol-aware microphysics require the', &
647 ' following optional arguments: nc, nwfa, nifa'
652 if (nsteps>1 .and. dt_inner < dtp)
then
653 write(errmsg,
'(*(a))')
"Logic error: Subcycling and inner loop cannot be used at the same time"
656 else if (mpirank==mpiroot .and. nsteps>1)
then
657 write(*,
'(a,i0,a,a,f6.2,a)')
'Thompson MP is using ', nsteps,
' substep(s) per time step with an ', &
658 'effective time step of ', dtp/real(nsteps, kind=kind_phys),
' seconds'
659 else if (mpirank==mpiroot .and. dt_inner < dtp)
then
660 ndt = max(nint(dtp/dt_inner),1)
661 write(*,
'(a,i0,a,a,f6.2,a)')
'Thompson MP is using ', ndt,
' inner loops per time step with an ', &
662 'effective time step of ', dtp/real(ndt, kind=kind_phys),
' seconds'
667 if ( spp_mp==7 )
then
675 dtstep = dtp/real(nsteps, kind=kind_phys)
679 if (merra2_aerosol_aware)
then
680 call get_niwfa(aerfld, new_nifa, new_nwfa, ncol, nlev)
690 qv = new_spechum/(1.0_kind_phys-new_spechum)
692 if (convert_dry_rho)
then
693 new_qc = new_qc/(1.0_kind_phys-new_spechum)
694 new_qr = new_qr/(1.0_kind_phys-new_spechum)
695 new_qi = new_qi/(1.0_kind_phys-new_spechum)
696 new_qs = new_qs/(1.0_kind_phys-new_spechum)
697 new_qg = new_qg/(1.0_kind_phys-new_spechum)
699 new_ni = new_ni/(1.0_kind_phys-new_spechum)
700 new_nr = new_nr/(1.0_kind_phys-new_spechum)
701 if (is_aerosol_aware .or. merra2_aerosol_aware)
then
702 new_nc = new_nc/(1.0_kind_phys-new_spechum)
703 new_nwfa = new_nwfa/(1.0_kind_phys-new_spechum)
704 new_nifa = new_nifa/(1.0_kind_phys-new_spechum)
710 rho = con_eps*prsl/(con_rd*new_tgrs*(qv+con_eps))
713 w = -omega/(rho*con_g)
716 dz = (phii(:,2:nlev+1) - phii(:,1:nlev)) / con_g
730 if (do_radar_ref)
then
763 set_extended_diagnostic_pointers:
if (ext_diag)
then
764 if (reset_diag3d)
then
770 prw_vcdc => diag3d(:,:,1:1)
771 prw_vcde => diag3d(:,:,2:2)
772 tpri_inu => diag3d(:,:,3:3)
773 tpri_ide_d => diag3d(:,:,4:4)
774 tpri_ide_s => diag3d(:,:,5:5)
775 tprs_ide => diag3d(:,:,6:6)
776 tprs_sde_d => diag3d(:,:,7:7)
777 tprs_sde_s => diag3d(:,:,8:8)
778 tprg_gde_d => diag3d(:,:,9:9)
779 tprg_gde_s => diag3d(:,:,10:10)
780 tpri_iha => diag3d(:,:,11:11)
781 tpri_wfz => diag3d(:,:,12:12)
782 tpri_rfz => diag3d(:,:,13:13)
783 tprg_rfz => diag3d(:,:,14:14)
784 tprs_scw => diag3d(:,:,15:15)
785 tprg_scw => diag3d(:,:,16:16)
786 tprg_rcs => diag3d(:,:,17:17)
787 tprs_rcs => diag3d(:,:,18:18)
788 tprr_rci => diag3d(:,:,19:19)
789 tprg_rcg => diag3d(:,:,20:20)
790 tprw_vcd_c => diag3d(:,:,21:21)
791 tprw_vcd_e => diag3d(:,:,22:22)
792 tprr_sml => diag3d(:,:,23:23)
793 tprr_gml => diag3d(:,:,24:24)
794 tprr_rcg => diag3d(:,:,25:25)
795 tprr_rcs => diag3d(:,:,26:26)
796 tprv_rev => diag3d(:,:,27:27)
797 tten3 => diag3d(:,:,28:28)
798 qvten3 => diag3d(:,:,29:29)
799 qrten3 => diag3d(:,:,30:30)
800 qsten3 => diag3d(:,:,31:31)
801 qgten3 => diag3d(:,:,32:32)
802 qiten3 => diag3d(:,:,33:33)
803 niten3 => diag3d(:,:,34:34)
804 nrten3 => diag3d(:,:,35:35)
805 ncten3 => diag3d(:,:,36:36)
806 qcten3 => diag3d(:,:,37:37)
807 end if set_extended_diagnostic_pointers
809 if (is_aerosol_aware)
then
810 call mp_gt_driver(qv=qv, qc=new_qc, qr=new_qr, qi=new_qi, qs=new_qs, qg=new_qg, ni=new_ni, nr=new_nr, &
811 nc=new_nc, nwfa=new_nwfa, nifa=new_nifa, nwfa2d=nwfa2d, nifa2d=nifa2d, &
812 tt=new_tgrs, p=prsl, w=w, dz=dz, dt_in=dtstep, dt_inner=dt_inner, &
813 sedi_semi=sedi_semi, decfl=decfl, lsm=islmsk, &
814 rainnc=rain_mp, rainncv=delta_rain_mp, &
815 snownc=snow_mp, snowncv=delta_snow_mp, &
816 icenc=ice_mp, icencv=delta_ice_mp, &
817 graupelnc=graupel_mp, graupelncv=delta_graupel_mp, sr=sr, &
818 refl_10cm=refl_10cm, &
819 diagflag=diagflag, do_radar_ref=do_radar_ref_mp, &
820 max_hail_diam_sfc=max_hail_diam_sfc, &
821 has_reqc=has_reqc, has_reqi=has_reqi, has_reqs=has_reqs, &
822 aero_ind_fdb=aero_ind_fdb, rand_perturb_on=spp_mp_opt, &
823 kme_stoch=kme_stoch, &
824 rand_pert=spp_wts_mp, spp_var_list=spp_var_list, &
825 spp_prt_list=spp_prt_list, n_var_spp=n_var_spp, &
826 spp_stddev_cutoff=spp_stddev_cutoff, &
827 ids=ids, ide=ide, jds=jds, jde=jde, kds=kds, kde=kde, &
828 ims=ims, ime=ime, jms=jms, jme=jme, kms=kms, kme=kme, &
829 its=its, ite=ite, jts=jts, jte=jte, kts=kts, kte=kte, &
830 fullradar_diag=fullradar_diag, istep=istep, nsteps=nsteps, &
831 first_time_step=first_time_step, errmsg=errmsg, errflg=errflg, &
836 prw_vcde=prw_vcde, tpri_inu=tpri_inu, tpri_ide_d=tpri_ide_d, &
837 tpri_ide_s=tpri_ide_s, tprs_ide=tprs_ide, &
838 tprs_sde_d=tprs_sde_d, &
839 tprs_sde_s=tprs_sde_s, tprg_gde_d=tprg_gde_d, &
840 tprg_gde_s=tprg_gde_s, tpri_iha=tpri_iha, &
841 tpri_wfz=tpri_wfz, tpri_rfz=tpri_rfz, tprg_rfz=tprg_rfz, &
842 tprs_scw=tprs_scw, tprg_scw=tprg_scw, tprg_rcs=tprg_rcs, &
844 tprr_rci=tprr_rci, tprg_rcg=tprg_rcg, tprw_vcd_c=tprw_vcd_c, &
845 tprw_vcd_e=tprw_vcd_e, tprr_sml=tprr_sml, tprr_gml=tprr_gml, &
846 tprr_rcg=tprr_rcg, tprr_rcs=tprr_rcs, &
847 tprv_rev=tprv_rev, tten3=tten3, &
848 qvten3=qvten3, qrten3=qrten3, qsten3=qsten3, qgten3=qgten3, &
849 qiten3=qiten3, niten3=niten3, nrten3=nrten3, ncten3=ncten3, &
850 qcten3=qcten3, pfils=pfils, pflls=pflls, &
851 fs_fac_rain=fs_fac_rain, fs_fac_snow=fs_fac_snow)
852 else if (merra2_aerosol_aware)
then
853 call mp_gt_driver(qv=qv, qc=new_qc, qr=new_qr, qi=new_qi, qs=new_qs, qg=new_qg, ni=new_ni, nr=new_nr, &
854 nc=new_nc, nwfa=new_nwfa, nifa=new_nifa, &
855 tt=new_tgrs, p=prsl, w=w, dz=dz, dt_in=dtstep, dt_inner=dt_inner, &
856 sedi_semi=sedi_semi, decfl=decfl, lsm=islmsk, &
857 rainnc=rain_mp, rainncv=delta_rain_mp, &
858 snownc=snow_mp, snowncv=delta_snow_mp, &
859 icenc=ice_mp, icencv=delta_ice_mp, &
860 graupelnc=graupel_mp, graupelncv=delta_graupel_mp, sr=sr, &
861 refl_10cm=refl_10cm, &
862 diagflag=diagflag, do_radar_ref=do_radar_ref_mp, &
863 max_hail_diam_sfc=max_hail_diam_sfc, &
864 has_reqc=has_reqc, has_reqi=has_reqi, has_reqs=has_reqs, &
865 aero_ind_fdb=aero_ind_fdb, rand_perturb_on=spp_mp_opt, &
866 kme_stoch=kme_stoch, &
867 rand_pert=spp_wts_mp, spp_var_list=spp_var_list, &
868 spp_prt_list=spp_prt_list, n_var_spp=n_var_spp, &
869 spp_stddev_cutoff=spp_stddev_cutoff, &
870 ids=ids, ide=ide, jds=jds, jde=jde, kds=kds, kde=kde, &
871 ims=ims, ime=ime, jms=jms, jme=jme, kms=kms, kme=kme, &
872 its=its, ite=ite, jts=jts, jte=jte, kts=kts, kte=kte, &
873 fullradar_diag=fullradar_diag, istep=istep, nsteps=nsteps, &
874 first_time_step=first_time_step, errmsg=errmsg, errflg=errflg, &
879 prw_vcde=prw_vcde, tpri_inu=tpri_inu, tpri_ide_d=tpri_ide_d, &
880 tpri_ide_s=tpri_ide_s, tprs_ide=tprs_ide, &
881 tprs_sde_d=tprs_sde_d, &
882 tprs_sde_s=tprs_sde_s, tprg_gde_d=tprg_gde_d, &
883 tprg_gde_s=tprg_gde_s, tpri_iha=tpri_iha, &
884 tpri_wfz=tpri_wfz, tpri_rfz=tpri_rfz, tprg_rfz=tprg_rfz, &
885 tprs_scw=tprs_scw, tprg_scw=tprg_scw, tprg_rcs=tprg_rcs, &
887 tprr_rci=tprr_rci, tprg_rcg=tprg_rcg, tprw_vcd_c=tprw_vcd_c, &
888 tprw_vcd_e=tprw_vcd_e, tprr_sml=tprr_sml, tprr_gml=tprr_gml, &
889 tprr_rcg=tprr_rcg, tprr_rcs=tprr_rcs, &
890 tprv_rev=tprv_rev, tten3=tten3, &
891 qvten3=qvten3, qrten3=qrten3, qsten3=qsten3, qgten3=qgten3, &
892 qiten3=qiten3, niten3=niten3, nrten3=nrten3, ncten3=ncten3, &
893 qcten3=qcten3, pfils=pfils, pflls=pflls, &
894 fs_fac_rain=fs_fac_rain, fs_fac_snow=fs_fac_snow)
896 call mp_gt_driver(qv=qv, qc=new_qc, qr=new_qr, qi=new_qi, qs=new_qs, qg=new_qg, ni=new_ni, nr=new_nr, &
897 tt=new_tgrs, p=prsl, w=w, dz=dz, dt_in=dtstep, dt_inner=dt_inner, &
898 sedi_semi=sedi_semi, decfl=decfl, lsm=islmsk, &
899 rainnc=rain_mp, rainncv=delta_rain_mp, &
900 snownc=snow_mp, snowncv=delta_snow_mp, &
901 icenc=ice_mp, icencv=delta_ice_mp, &
902 graupelnc=graupel_mp, graupelncv=delta_graupel_mp, sr=sr, &
903 refl_10cm=refl_10cm, &
904 diagflag=diagflag, do_radar_ref=do_radar_ref_mp, &
905 max_hail_diam_sfc=max_hail_diam_sfc, &
906 has_reqc=has_reqc, has_reqi=has_reqi, has_reqs=has_reqs, &
907 rand_perturb_on=spp_mp_opt, kme_stoch=kme_stoch, &
908 rand_pert=spp_wts_mp, spp_var_list=spp_var_list, &
909 spp_prt_list=spp_prt_list, n_var_spp=n_var_spp, &
910 spp_stddev_cutoff=spp_stddev_cutoff, &
911 ids=ids, ide=ide, jds=jds, jde=jde, kds=kds, kde=kde, &
912 ims=ims, ime=ime, jms=jms, jme=jme, kms=kms, kme=kme, &
913 its=its, ite=ite, jts=jts, jte=jte, kts=kts, kte=kte, &
914 fullradar_diag=fullradar_diag, istep=istep, nsteps=nsteps, &
915 first_time_step=first_time_step, errmsg=errmsg, errflg=errflg, &
920 prw_vcde=prw_vcde, tpri_inu=tpri_inu, tpri_ide_d=tpri_ide_d, &
921 tpri_ide_s=tpri_ide_s, tprs_ide=tprs_ide, &
922 tprs_sde_d=tprs_sde_d, &
923 tprs_sde_s=tprs_sde_s, tprg_gde_d=tprg_gde_d, &
924 tprg_gde_s=tprg_gde_s, tpri_iha=tpri_iha, &
925 tpri_wfz=tpri_wfz, tpri_rfz=tpri_rfz, tprg_rfz=tprg_rfz, &
926 tprs_scw=tprs_scw, tprg_scw=tprg_scw, tprg_rcs=tprg_rcs, &
928 tprr_rci=tprr_rci, tprg_rcg=tprg_rcg, tprw_vcd_c=tprw_vcd_c, &
929 tprw_vcd_e=tprw_vcd_e, tprr_sml=tprr_sml, tprr_gml=tprr_gml, &
930 tprr_rcg=tprr_rcg, tprr_rcs=tprr_rcs, &
931 tprv_rev=tprv_rev, tten3=tten3, &
932 qvten3=qvten3, qrten3=qrten3, qsten3=qsten3, qgten3=qgten3, &
933 qiten3=qiten3, niten3=niten3, nrten3=nrten3, ncten3=ncten3, &
934 qcten3=qcten3, pfils=pfils, pflls=pflls, &
935 fs_fac_rain=fs_fac_rain, fs_fac_snow=fs_fac_snow)
937 if (errflg/=0)
return
944 new_spechum = qv/(1.0_kind_phys+qv)
946 if (convert_dry_rho)
then
947 new_qc = new_qc/(1.0_kind_phys+qv)
948 new_qr = new_qr/(1.0_kind_phys+qv)
949 new_qi = new_qi/(1.0_kind_phys+qv)
950 new_qs = new_qs/(1.0_kind_phys+qv)
951 new_qg = new_qg/(1.0_kind_phys+qv)
953 new_ni = new_ni/(1.0_kind_phys+qv)
954 new_nr = new_nr/(1.0_kind_phys+qv)
955 if (is_aerosol_aware .or. merra2_aerosol_aware)
then
956 new_nc = new_nc/(1.0_kind_phys+qv)
957 new_nwfa = new_nwfa/(1.0_kind_phys+qv)
958 new_nifa = new_nifa/(1.0_kind_phys+qv)
965 prcp = prcp + max(0.0, delta_rain_mp/1000.0_kind_phys)
966 graupel = graupel + max(0.0, delta_graupel_mp/1000.0_kind_phys)
967 ice = ice + max(0.0, delta_ice_mp/1000.0_kind_phys)
968 snow = snow + max(0.0, delta_snow_mp/1000.0_kind_phys)
969 rain = rain + max(0.0, (delta_rain_mp - (delta_graupel_mp + delta_ice_mp + delta_snow_mp))/1000.0_kind_phys)
972 if (nsteps>1 .and. istep == nsteps)
then
974 sr = (snow + graupel + ice)/(rain + snow + graupel + ice +1.e-12)
979 pfi_lsan(:,:) = pfils(:,:,1)
980 pfl_lsan(:,:) = pflls(:,:,1)
983 dspechum = (new_spechum - spechum)/dtp
984 dqc = (new_qc - qc)/dtp
985 dqr = (new_qr - qr)/dtp
986 dqi = (new_qi - qi)/dtp
987 dqs = (new_qs - qs)/dtp
988 dqg = (new_qg - qg)/dtp
989 dni = (new_ni - ni)/dtp
990 dnr = (new_nr - nr)/dtp
991 dtgrs = (new_tgrs - tgrs)/dtp
992 if (is_aerosol_aware .or. merra2_aerosol_aware)
then
993 dnc = (new_nc - nc)/dtp
994 dnwfa = (new_nwfa - nwfa)/dtp
995 dnifa = (new_nifa - nifa)/dtp
997 deallocate(new_nc, new_nwfa, new_nifa)