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
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
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, blkno, &
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, errmsg, errflg)
391 logical,
intent(inout) :: is_initialized
393 integer,
intent(in ) :: ncol
394 integer,
intent(in ) :: nlev
395 real(kind_phys),
intent(in ) :: con_g
396 real(kind_phys),
intent(in ) :: con_rd
397 real(kind_phys),
intent(in ) :: con_eps
399 logical,
intent(in ) :: convert_dry_rho
400 real(kind_phys),
intent(inout) :: spechum(:,:)
401 real(kind_phys),
intent(inout) :: qc(:,:)
402 real(kind_phys),
intent(inout) :: qr(:,:)
403 real(kind_phys),
intent(inout) :: qi(:,:)
404 real(kind_phys),
intent(inout) :: qs(:,:)
405 real(kind_phys),
intent(inout) :: qg(:,:)
406 real(kind_phys),
intent(inout) :: ni(:,:)
407 real(kind_phys),
intent(inout) :: nr(:,:)
409 logical,
intent(in) :: is_aerosol_aware, fullradar_diag
410 logical,
intent(in) :: merra2_aerosol_aware
411 real(kind_phys),
optional,
intent(inout) :: nc(:,:)
412 real(kind_phys),
optional,
intent(inout) :: nwfa(:,:)
413 real(kind_phys),
optional,
intent(inout) :: nifa(:,:)
414 real(kind_phys),
optional,
intent(in ) :: nwfa2d(:)
415 real(kind_phys),
optional,
intent(in ) :: nifa2d(:)
416 real(kind_phys),
intent(in) :: aerfld(:,:,:)
417 logical,
optional,
intent(in ) :: aero_ind_fdb
419 real(kind_phys),
intent(inout) :: tgrs(:,:)
420 real(kind_phys),
intent(in ) :: prsl(:,:)
421 real(kind_phys),
intent(in ) :: phii(:,:)
422 real(kind_phys),
intent(in ) :: omega(:,:)
423 integer,
intent(in ) :: islmsk(:)
424 real(kind_phys),
intent(in ) :: dtp
425 logical,
intent(in ) :: first_time_step
426 integer,
intent(in ) :: istep, nsteps
427 real,
intent(in ) :: dt_inner
429 real(kind_phys),
intent(inout) :: prcp(:)
430 real(kind_phys),
intent(inout) :: rain(:)
431 real(kind_phys),
intent(inout) :: graupel(:)
432 real(kind_phys),
intent(inout) :: ice(:)
433 real(kind_phys),
intent(inout) :: snow(:)
434 real(kind_phys),
intent( out) :: sr(:)
436 real(kind_phys),
intent(inout) :: refl_10cm(:,:)
437 real(kind_phys),
intent(inout) :: max_hail_diam_sfc(:)
438 logical,
intent(in ) :: do_radar_ref
439 logical,
intent(in) :: sedi_semi
440 integer,
intent(in) :: decfl
442 integer,
intent(in) :: blkno
443 type(mpi_comm),
intent(in) :: mpicomm
444 integer,
intent(in) :: mpirank
445 integer,
intent(in) :: mpiroot
447 logical,
intent(in) :: ext_diag
448 real(kind_phys),
target,
intent(inout),
optional :: diag3d(:,:,:)
449 logical,
intent(in) :: reset_diag3d
452 character(len=*),
intent( out) :: errmsg
453 integer,
intent( out) :: errflg
456 integer,
intent(in) :: spp_mp
457 integer,
intent(in) :: n_var_spp
458 real(kind_phys),
intent(in),
optional :: spp_wts_mp(:,:)
459 real(kind_phys),
intent(in),
optional :: spp_prt_list(:)
460 character(len=10),
intent(in),
optional :: spp_var_list(:)
461 real(kind_phys),
intent(in),
optional :: spp_stddev_cutoff(:)
463 logical,
intent (in) :: cplchm
465 real(kind=kind_phys),
intent(inout),
dimension(:,:),
optional :: pfi_lsan
466 real(kind=kind_phys),
intent(inout),
dimension(:,:),
optional :: pfl_lsan
471 real(kind_phys) :: dtstep
474 real(kind_phys) :: rho(1:ncol,1:nlev)
476 real(kind_phys) :: qv(1:ncol,1:nlev)
478 real(kind_phys) :: w(1:ncol,1:nlev)
479 real(kind_phys) :: dz(1:ncol,1:nlev)
481 real(kind_phys) :: rain_mp(1:ncol)
482 real(kind_phys) :: graupel_mp(1:ncol)
483 real(kind_phys) :: ice_mp(1:ncol)
484 real(kind_phys) :: snow_mp(1:ncol)
485 real(kind_phys) :: delta_rain_mp(1:ncol)
486 real(kind_phys) :: delta_graupel_mp(1:ncol)
487 real(kind_phys) :: delta_ice_mp(1:ncol)
488 real(kind_phys) :: delta_snow_mp(1:ncol)
490 real(kind_phys) :: pfils(1:ncol,1:nlev,1)
491 real(kind_phys) :: pflls(1:ncol,1:nlev,1)
494 integer :: do_radar_ref_mp
496 logical,
parameter :: do_effective_radii = .false.
497 integer,
parameter :: has_reqc = 0
498 integer,
parameter :: has_reqi = 0
499 integer,
parameter :: has_reqs = 0
500 integer,
parameter :: kme_stoch = 1
501 integer :: spp_mp_opt
503 integer :: ids,ide, jds,jde, kds,kde, &
504 ims,ime, jms,jme, kms,kme, &
505 its,ite, jts,jte, kts,kte
510 real(kind_phys),
dimension(:,:,:),
pointer :: prw_vcdc => null()
511 real(kind_phys),
dimension(:,:,:),
pointer :: prw_vcde => null()
512 real(kind_phys),
dimension(:,:,:),
pointer :: tpri_inu => null()
513 real(kind_phys),
dimension(:,:,:),
pointer :: tpri_ide_d => null()
514 real(kind_phys),
dimension(:,:,:),
pointer :: tpri_ide_s => null()
515 real(kind_phys),
dimension(:,:,:),
pointer :: tprs_ide => null()
516 real(kind_phys),
dimension(:,:,:),
pointer :: tprs_sde_d => null()
517 real(kind_phys),
dimension(:,:,:),
pointer :: tprs_sde_s => null()
518 real(kind_phys),
dimension(:,:,:),
pointer :: tprg_gde_d => null()
519 real(kind_phys),
dimension(:,:,:),
pointer :: tprg_gde_s => null()
520 real(kind_phys),
dimension(:,:,:),
pointer :: tpri_iha => null()
521 real(kind_phys),
dimension(:,:,:),
pointer :: tpri_wfz => null()
522 real(kind_phys),
dimension(:,:,:),
pointer :: tpri_rfz => null()
523 real(kind_phys),
dimension(:,:,:),
pointer :: tprg_rfz => null()
524 real(kind_phys),
dimension(:,:,:),
pointer :: tprs_scw => null()
525 real(kind_phys),
dimension(:,:,:),
pointer :: tprg_scw => null()
526 real(kind_phys),
dimension(:,:,:),
pointer :: tprg_rcs => null()
527 real(kind_phys),
dimension(:,:,:),
pointer :: tprs_rcs => null()
528 real(kind_phys),
dimension(:,:,:),
pointer :: tprr_rci => null()
529 real(kind_phys),
dimension(:,:,:),
pointer :: tprg_rcg => null()
530 real(kind_phys),
dimension(:,:,:),
pointer :: tprw_vcd_c => null()
531 real(kind_phys),
dimension(:,:,:),
pointer :: tprw_vcd_e => null()
532 real(kind_phys),
dimension(:,:,:),
pointer :: tprr_sml => null()
533 real(kind_phys),
dimension(:,:,:),
pointer :: tprr_gml => null()
534 real(kind_phys),
dimension(:,:,:),
pointer :: tprr_rcg => null()
535 real(kind_phys),
dimension(:,:,:),
pointer :: tprr_rcs => null()
536 real(kind_phys),
dimension(:,:,:),
pointer :: tprv_rev => null()
537 real(kind_phys),
dimension(:,:,:),
pointer :: tten3 => null()
538 real(kind_phys),
dimension(:,:,:),
pointer :: qvten3 => null()
539 real(kind_phys),
dimension(:,:,:),
pointer :: qrten3 => null()
540 real(kind_phys),
dimension(:,:,:),
pointer :: qsten3 => null()
541 real(kind_phys),
dimension(:,:,:),
pointer :: qgten3 => null()
542 real(kind_phys),
dimension(:,:,:),
pointer :: qiten3 => null()
543 real(kind_phys),
dimension(:,:,:),
pointer :: niten3 => null()
544 real(kind_phys),
dimension(:,:,:),
pointer :: nrten3 => null()
545 real(kind_phys),
dimension(:,:,:),
pointer :: ncten3 => null()
546 real(kind_phys),
dimension(:,:,:),
pointer :: qcten3 => null()
552 if (first_time_step .and. istep==1 .and. blkno==1)
then
554 if (.not.is_initialized)
then
555 write(errmsg, fmt=
'((a))')
'mp_thompson_run called before mp_thompson_init'
560 if (is_aerosol_aware .and. .not. (
present(nc) .and. &
561 present(nwfa) .and. &
562 present(nifa) .and. &
563 present(nwfa2d) .and. &
564 present(nifa2d) ))
then
565 write(errmsg,fmt=
'(*(a))')
'Logic error in mp_thompson_run:', &
566 ' aerosol-aware microphysics require all of the', &
567 ' following optional arguments:', &
568 ' nc, nwfa, nifa, nwfa2d, nifa2d'
571 else if (merra2_aerosol_aware .and. .not. (
present(nc) .and. &
572 present(nwfa) .and. &
573 present(nifa) ))
then
574 write(errmsg,fmt=
'(*(a))')
'Logic error in mp_thompson_run:', &
575 ' merra2 aerosol-aware microphysics require the', &
576 ' following optional arguments: nc, nwfa, nifa'
581 if (nsteps>1 .and. dt_inner < dtp)
then
582 write(errmsg,
'(*(a))')
"Logic error: Subcycling and inner loop cannot be used at the same time"
585 else if (mpirank==mpiroot .and. nsteps>1)
then
586 write(*,
'(a,i0,a,a,f6.2,a)')
'Thompson MP is using ', nsteps,
' substep(s) per time step with an ', &
587 'effective time step of ', dtp/real(nsteps, kind=kind_phys),
' seconds'
588 else if (mpirank==mpiroot .and. dt_inner < dtp)
then
589 ndt = max(nint(dtp/dt_inner),1)
590 write(*,
'(a,i0,a,a,f6.2,a)')
'Thompson MP is using ', ndt,
' inner loops per time step with an ', &
591 'effective time step of ', dtp/real(ndt, kind=kind_phys),
' seconds'
596 if ( spp_mp==7 )
then
604 dtstep = dtp/real(nsteps, kind=kind_phys)
608 if (merra2_aerosol_aware)
then
609 call get_niwfa(aerfld, nifa, nwfa, ncol, nlev)
619 qv = spechum/(1.0_kind_phys-spechum)
621 if (convert_dry_rho)
then
622 qc = qc/(1.0_kind_phys-spechum)
623 qr = qr/(1.0_kind_phys-spechum)
624 qi = qi/(1.0_kind_phys-spechum)
625 qs = qs/(1.0_kind_phys-spechum)
626 qg = qg/(1.0_kind_phys-spechum)
628 ni = ni/(1.0_kind_phys-spechum)
629 nr = nr/(1.0_kind_phys-spechum)
630 if (is_aerosol_aware .or. merra2_aerosol_aware)
then
631 nc = nc/(1.0_kind_phys-spechum)
632 nwfa = nwfa/(1.0_kind_phys-spechum)
633 nifa = nifa/(1.0_kind_phys-spechum)
639 rho = con_eps*prsl/(con_rd*tgrs*(qv+con_eps))
642 w = -omega/(rho*con_g)
645 dz = (phii(:,2:nlev+1) - phii(:,1:nlev)) / con_g
659 if (do_radar_ref)
then
692 set_extended_diagnostic_pointers:
if (ext_diag)
then
693 if (reset_diag3d)
then
699 prw_vcdc => diag3d(:,:,1:1)
700 prw_vcde => diag3d(:,:,2:2)
701 tpri_inu => diag3d(:,:,3:3)
702 tpri_ide_d => diag3d(:,:,4:4)
703 tpri_ide_s => diag3d(:,:,5:5)
704 tprs_ide => diag3d(:,:,6:6)
705 tprs_sde_d => diag3d(:,:,7:7)
706 tprs_sde_s => diag3d(:,:,8:8)
707 tprg_gde_d => diag3d(:,:,9:9)
708 tprg_gde_s => diag3d(:,:,10:10)
709 tpri_iha => diag3d(:,:,11:11)
710 tpri_wfz => diag3d(:,:,12:12)
711 tpri_rfz => diag3d(:,:,13:13)
712 tprg_rfz => diag3d(:,:,14:14)
713 tprs_scw => diag3d(:,:,15:15)
714 tprg_scw => diag3d(:,:,16:16)
715 tprg_rcs => diag3d(:,:,17:17)
716 tprs_rcs => diag3d(:,:,18:18)
717 tprr_rci => diag3d(:,:,19:19)
718 tprg_rcg => diag3d(:,:,20:20)
719 tprw_vcd_c => diag3d(:,:,21:21)
720 tprw_vcd_e => diag3d(:,:,22:22)
721 tprr_sml => diag3d(:,:,23:23)
722 tprr_gml => diag3d(:,:,24:24)
723 tprr_rcg => diag3d(:,:,25:25)
724 tprr_rcs => diag3d(:,:,26:26)
725 tprv_rev => diag3d(:,:,27:27)
726 tten3 => diag3d(:,:,28:28)
727 qvten3 => diag3d(:,:,29:29)
728 qrten3 => diag3d(:,:,30:30)
729 qsten3 => diag3d(:,:,31:31)
730 qgten3 => diag3d(:,:,32:32)
731 qiten3 => diag3d(:,:,33:33)
732 niten3 => diag3d(:,:,34:34)
733 nrten3 => diag3d(:,:,35:35)
734 ncten3 => diag3d(:,:,36:36)
735 qcten3 => diag3d(:,:,37:37)
736 end if set_extended_diagnostic_pointers
738 if (is_aerosol_aware)
then
739 call mp_gt_driver(qv=qv, qc=qc, qr=qr, qi=qi, qs=qs, qg=qg, ni=ni, nr=nr, &
740 nc=nc, nwfa=nwfa, nifa=nifa, nwfa2d=nwfa2d, nifa2d=nifa2d, &
741 tt=tgrs, p=prsl, w=w, dz=dz, dt_in=dtstep, dt_inner=dt_inner, &
742 sedi_semi=sedi_semi, decfl=decfl, lsm=islmsk, &
743 rainnc=rain_mp, rainncv=delta_rain_mp, &
744 snownc=snow_mp, snowncv=delta_snow_mp, &
745 icenc=ice_mp, icencv=delta_ice_mp, &
746 graupelnc=graupel_mp, graupelncv=delta_graupel_mp, sr=sr, &
747 refl_10cm=refl_10cm, &
748 diagflag=diagflag, do_radar_ref=do_radar_ref_mp, &
749 max_hail_diam_sfc=max_hail_diam_sfc, &
750 has_reqc=has_reqc, has_reqi=has_reqi, has_reqs=has_reqs, &
751 aero_ind_fdb=aero_ind_fdb, rand_perturb_on=spp_mp_opt, &
752 kme_stoch=kme_stoch, &
753 rand_pert=spp_wts_mp, spp_var_list=spp_var_list, &
754 spp_prt_list=spp_prt_list, n_var_spp=n_var_spp, &
755 spp_stddev_cutoff=spp_stddev_cutoff, &
756 ids=ids, ide=ide, jds=jds, jde=jde, kds=kds, kde=kde, &
757 ims=ims, ime=ime, jms=jms, jme=jme, kms=kms, kme=kme, &
758 its=its, ite=ite, jts=jts, jte=jte, kts=kts, kte=kte, &
759 fullradar_diag=fullradar_diag, istep=istep, nsteps=nsteps, &
760 first_time_step=first_time_step, errmsg=errmsg, errflg=errflg, &
765 prw_vcde=prw_vcde, tpri_inu=tpri_inu, tpri_ide_d=tpri_ide_d, &
766 tpri_ide_s=tpri_ide_s, tprs_ide=tprs_ide, &
767 tprs_sde_d=tprs_sde_d, &
768 tprs_sde_s=tprs_sde_s, tprg_gde_d=tprg_gde_d, &
769 tprg_gde_s=tprg_gde_s, tpri_iha=tpri_iha, &
770 tpri_wfz=tpri_wfz, tpri_rfz=tpri_rfz, tprg_rfz=tprg_rfz, &
771 tprs_scw=tprs_scw, tprg_scw=tprg_scw, tprg_rcs=tprg_rcs, &
773 tprr_rci=tprr_rci, tprg_rcg=tprg_rcg, tprw_vcd_c=tprw_vcd_c, &
774 tprw_vcd_e=tprw_vcd_e, tprr_sml=tprr_sml, tprr_gml=tprr_gml, &
775 tprr_rcg=tprr_rcg, tprr_rcs=tprr_rcs, &
776 tprv_rev=tprv_rev, tten3=tten3, &
777 qvten3=qvten3, qrten3=qrten3, qsten3=qsten3, qgten3=qgten3, &
778 qiten3=qiten3, niten3=niten3, nrten3=nrten3, ncten3=ncten3, &
779 qcten3=qcten3, pfils=pfils, pflls=pflls)
780 else if (merra2_aerosol_aware)
then
781 call mp_gt_driver(qv=qv, qc=qc, qr=qr, qi=qi, qs=qs, qg=qg, ni=ni, nr=nr, &
782 nc=nc, nwfa=nwfa, nifa=nifa, &
783 tt=tgrs, p=prsl, w=w, dz=dz, dt_in=dtstep, dt_inner=dt_inner, &
784 sedi_semi=sedi_semi, decfl=decfl, lsm=islmsk, &
785 rainnc=rain_mp, rainncv=delta_rain_mp, &
786 snownc=snow_mp, snowncv=delta_snow_mp, &
787 icenc=ice_mp, icencv=delta_ice_mp, &
788 graupelnc=graupel_mp, graupelncv=delta_graupel_mp, sr=sr, &
789 refl_10cm=refl_10cm, &
790 diagflag=diagflag, do_radar_ref=do_radar_ref_mp, &
791 max_hail_diam_sfc=max_hail_diam_sfc, &
792 has_reqc=has_reqc, has_reqi=has_reqi, has_reqs=has_reqs, &
793 aero_ind_fdb=aero_ind_fdb, rand_perturb_on=spp_mp_opt, &
794 kme_stoch=kme_stoch, &
795 rand_pert=spp_wts_mp, spp_var_list=spp_var_list, &
796 spp_prt_list=spp_prt_list, n_var_spp=n_var_spp, &
797 spp_stddev_cutoff=spp_stddev_cutoff, &
798 ids=ids, ide=ide, jds=jds, jde=jde, kds=kds, kde=kde, &
799 ims=ims, ime=ime, jms=jms, jme=jme, kms=kms, kme=kme, &
800 its=its, ite=ite, jts=jts, jte=jte, kts=kts, kte=kte, &
801 fullradar_diag=fullradar_diag, istep=istep, nsteps=nsteps, &
802 first_time_step=first_time_step, errmsg=errmsg, errflg=errflg, &
807 prw_vcde=prw_vcde, tpri_inu=tpri_inu, tpri_ide_d=tpri_ide_d, &
808 tpri_ide_s=tpri_ide_s, tprs_ide=tprs_ide, &
809 tprs_sde_d=tprs_sde_d, &
810 tprs_sde_s=tprs_sde_s, tprg_gde_d=tprg_gde_d, &
811 tprg_gde_s=tprg_gde_s, tpri_iha=tpri_iha, &
812 tpri_wfz=tpri_wfz, tpri_rfz=tpri_rfz, tprg_rfz=tprg_rfz, &
813 tprs_scw=tprs_scw, tprg_scw=tprg_scw, tprg_rcs=tprg_rcs, &
815 tprr_rci=tprr_rci, tprg_rcg=tprg_rcg, tprw_vcd_c=tprw_vcd_c, &
816 tprw_vcd_e=tprw_vcd_e, tprr_sml=tprr_sml, tprr_gml=tprr_gml, &
817 tprr_rcg=tprr_rcg, tprr_rcs=tprr_rcs, &
818 tprv_rev=tprv_rev, tten3=tten3, &
819 qvten3=qvten3, qrten3=qrten3, qsten3=qsten3, qgten3=qgten3, &
820 qiten3=qiten3, niten3=niten3, nrten3=nrten3, ncten3=ncten3, &
821 qcten3=qcten3, pfils=pfils, pflls=pflls)
823 call mp_gt_driver(qv=qv, qc=qc, qr=qr, qi=qi, qs=qs, qg=qg, ni=ni, nr=nr, &
824 tt=tgrs, p=prsl, w=w, dz=dz, dt_in=dtstep, dt_inner=dt_inner, &
825 sedi_semi=sedi_semi, decfl=decfl, lsm=islmsk, &
826 rainnc=rain_mp, rainncv=delta_rain_mp, &
827 snownc=snow_mp, snowncv=delta_snow_mp, &
828 icenc=ice_mp, icencv=delta_ice_mp, &
829 graupelnc=graupel_mp, graupelncv=delta_graupel_mp, sr=sr, &
830 refl_10cm=refl_10cm, &
831 diagflag=diagflag, do_radar_ref=do_radar_ref_mp, &
832 max_hail_diam_sfc=max_hail_diam_sfc, &
833 has_reqc=has_reqc, has_reqi=has_reqi, has_reqs=has_reqs, &
834 rand_perturb_on=spp_mp_opt, kme_stoch=kme_stoch, &
835 rand_pert=spp_wts_mp, spp_var_list=spp_var_list, &
836 spp_prt_list=spp_prt_list, n_var_spp=n_var_spp, &
837 spp_stddev_cutoff=spp_stddev_cutoff, &
838 ids=ids, ide=ide, jds=jds, jde=jde, kds=kds, kde=kde, &
839 ims=ims, ime=ime, jms=jms, jme=jme, kms=kms, kme=kme, &
840 its=its, ite=ite, jts=jts, jte=jte, kts=kts, kte=kte, &
841 fullradar_diag=fullradar_diag, istep=istep, nsteps=nsteps, &
842 first_time_step=first_time_step, errmsg=errmsg, errflg=errflg, &
847 prw_vcde=prw_vcde, tpri_inu=tpri_inu, tpri_ide_d=tpri_ide_d, &
848 tpri_ide_s=tpri_ide_s, tprs_ide=tprs_ide, &
849 tprs_sde_d=tprs_sde_d, &
850 tprs_sde_s=tprs_sde_s, tprg_gde_d=tprg_gde_d, &
851 tprg_gde_s=tprg_gde_s, tpri_iha=tpri_iha, &
852 tpri_wfz=tpri_wfz, tpri_rfz=tpri_rfz, tprg_rfz=tprg_rfz, &
853 tprs_scw=tprs_scw, tprg_scw=tprg_scw, tprg_rcs=tprg_rcs, &
855 tprr_rci=tprr_rci, tprg_rcg=tprg_rcg, tprw_vcd_c=tprw_vcd_c, &
856 tprw_vcd_e=tprw_vcd_e, tprr_sml=tprr_sml, tprr_gml=tprr_gml, &
857 tprr_rcg=tprr_rcg, tprr_rcs=tprr_rcs, &
858 tprv_rev=tprv_rev, tten3=tten3, &
859 qvten3=qvten3, qrten3=qrten3, qsten3=qsten3, qgten3=qgten3, &
860 qiten3=qiten3, niten3=niten3, nrten3=nrten3, ncten3=ncten3, &
861 qcten3=qcten3, pfils=pfils, pflls=pflls)
863 if (errflg/=0)
return
870 spechum = qv/(1.0_kind_phys+qv)
872 if (convert_dry_rho)
then
873 qc = qc/(1.0_kind_phys+qv)
874 qr = qr/(1.0_kind_phys+qv)
875 qi = qi/(1.0_kind_phys+qv)
876 qs = qs/(1.0_kind_phys+qv)
877 qg = qg/(1.0_kind_phys+qv)
879 ni = ni/(1.0_kind_phys+qv)
880 nr = nr/(1.0_kind_phys+qv)
881 if (is_aerosol_aware .or. merra2_aerosol_aware)
then
882 nc = nc/(1.0_kind_phys+qv)
883 nwfa = nwfa/(1.0_kind_phys+qv)
884 nifa = nifa/(1.0_kind_phys+qv)
891 prcp = prcp + max(0.0, delta_rain_mp/1000.0_kind_phys)
892 graupel = graupel + max(0.0, delta_graupel_mp/1000.0_kind_phys)
893 ice = ice + max(0.0, delta_ice_mp/1000.0_kind_phys)
894 snow = snow + max(0.0, delta_snow_mp/1000.0_kind_phys)
895 rain = rain + max(0.0, (delta_rain_mp - (delta_graupel_mp + delta_ice_mp + delta_snow_mp))/1000.0_kind_phys)
898 if (nsteps>1 .and. istep == nsteps)
then
900 sr = (snow + graupel + ice)/(rain + snow + graupel + ice +1.e-12)
905 pfi_lsan(:,:) = pfils(:,:,1)
906 pfl_lsan(:,:) = pflls(:,:,1)