15 subroutine mynnedmf_wrapper_init ( &
16 & con_cp, con_grav, con_rd, con_rv, &
17 & con_cpv, con_cliq, con_cice, con_rcp, &
18 & con_XLV, con_XLF, con_p608, con_ep2, &
19 & con_karman, con_t0c, &
23 use machine,
only : kind_phys
28 logical,
intent(in) :: do_mynnedmf
29 character(len=*),
intent(out):: errmsg
30 integer,
intent(out) :: errflg
32 real(kind_phys),
intent(in) :: con_xlv
33 real(kind_phys),
intent(in) :: con_xlf
34 real(kind_phys),
intent(in) :: con_rv
35 real(kind_phys),
intent(in) :: con_rd
36 real(kind_phys),
intent(in) :: con_ep2
37 real(kind_phys),
intent(in) :: con_grav
38 real(kind_phys),
intent(in) :: con_cp
39 real(kind_phys),
intent(in) :: con_cpv
40 real(kind_phys),
intent(in) :: con_rcp
41 real(kind_phys),
intent(in) :: con_p608
42 real(kind_phys),
intent(in) :: con_cliq
43 real(kind_phys),
intent(in) :: con_cice
44 real(kind_phys),
intent(in) :: con_karman
45 real(kind_phys),
intent(in) :: con_t0c
78 if (.not. do_mynnedmf)
then
79 errmsg =
'Logic error: do_mynnedmf = .false.'
84 end subroutine mynnedmf_wrapper_init
91SUBROUTINE mynnedmf_wrapper_run( &
93 & flag_init,flag_restart, &
94 & lssav, ldiag3d, qdiag3d, &
97 & phii,u,v,omega,t3d, &
99 & qgrs_liquid_cloud, &
102 & qgrs_cloud_droplet_num_conc, &
103 & qgrs_cloud_ice_num_conc, &
105 & qgrs_water_aer_num_conc, &
106 & qgrs_ice_aer_num_conc, &
109 & slmsk,tsurf,qsfc,ps, &
110 & ust,ch,hflx,qflx,wspd,rb, &
113 & dusfci_diag,dvsfci_diag, &
114 & dtsfci_diag,dqsfci_diag, &
115 & dusfc_diag,dvsfc_diag, &
116 & dtsfc_diag,dqsfc_diag, &
117 & dusfc_cice,dvsfc_cice, &
118 & dtsfc_cice,dqsfc_cice, &
119 & hflx_wat,qflx_wat,stress_wat, &
120 & oceanfrac,fice,wet,icy,dry, &
121 & dusfci_cpl,dvsfci_cpl, &
122 & dtsfci_cpl,dqsfci_cpl, &
123 & dusfc_cpl,dvsfc_cpl, &
124 & dtsfc_cpl,dqsfc_cpl, &
126 & qke,qke_adv,Tsq,Qsq,Cov, &
127 & el_pbl,sh3d,sm3d,exch_h,exch_m, &
128 & dqke,qwt,qshear,qbuoy,qdiss, &
130 & qc_bl,qi_bl,cldfra_bl, &
131 & edmf_a,edmf_w,edmf_qt, &
132 & edmf_thl,edmf_ent,edmf_qc, &
133 & sub_thl,sub_sqv,det_thl,det_sqv,&
134 & maxwidth,maxMF,ztop_plume, &
136 & dudt, dvdt, dtdt, dqdt_all, &
137 & dqdt_water_vapor, dqdt_liquid_cloud, & ! <=== ntqv, ntcw
138 & dqdt_ice, dqdt_snow, & ! <=== ntiw, ntsw
139 & dqdt_ozone, & ! <=== ntoz
140 & dqdt_cloud_droplet_num_conc, dqdt_ice_num_conc, & ! <=== ntlnc, ntinc
141 & dqdt_water_aer_num_conc, dqdt_ice_aer_num_conc,& ! <=== ntwa, ntia
142 & dqdt_cccn, & ! <=== ntccn
143 & tmf, flag_for_pbl_generic_tend, &
144 & dtend, dtidx, index_of_temperature, &
145 & index_of_x_wind, index_of_y_wind, ntke, &
146 & ntqv, ntcw, ntiw, ntsw, &
147 & ntoz, ntlnc, ntinc, ntwa, ntia, &
148 & index_of_process_pbl, htrsw, htrlw, xmu, &
149 & tke_budget, bl_mynn_tkeadvect, &
150 & bl_mynn_cloudpdf, bl_mynn_mixlength, &
152 & bl_mynn_edmf_mom, bl_mynn_edmf_tke, &
153 & bl_mynn_cloudmix, bl_mynn_mixqt, &
154 & bl_mynn_output, bl_mynn_closure, &
155 & icloud_bl, do_mynnsfclay, &
156 & imp_physics, imp_physics_gfdl, &
157 & imp_physics_thompson, imp_physics_wsm6, &
158 & imp_physics_fa, imfdeepcnv, imfdeepcnv_c3, &
159 & imp_physics_tempo, &
161 & chem3d, frp, mix_chem, rrfs_sd, enh_mix, &
162 & nchem, ndvel, vdep, smoke_dbg, &
163 & imp_physics_nssl, nssl_ccn_on, &
164 & ltaerosol, mraerosol, spp_wts_pbl, spp_pbl, &
165 & lprnt, huge, errmsg, errflg )
168 use machine,
only: kind_phys
170 xlv, xlvcp, xlscp, p608
177 real(kind_phys),
intent(in) :: huge
178 character(len=*),
intent(out) :: errmsg
179 integer,
intent(out) :: errflg
181 logical,
intent(in) :: lssav, ldiag3d, lsidea, qdiag3d
182 logical,
intent(in) :: cplflx
185 integer,
intent(in) :: nchem, ndvel
186 integer,
parameter :: kdvel=1
187 logical,
intent(in) :: smoke_dbg
190 logical,
intent(in) :: &
191 & bl_mynn_tkeadvect, &
196 & flag_for_pbl_generic_tend, &
198 integer,
intent(in) :: &
199 & bl_mynn_cloudpdf, &
200 & bl_mynn_mixlength, &
203 & bl_mynn_edmf_mom, &
204 & bl_mynn_edmf_tke, &
205 & bl_mynn_cloudmix, &
208 & imp_physics, imp_physics_wsm6, &
209 & imp_physics_thompson, imp_physics_gfdl, &
210 & imp_physics_tempo, &
211 & imp_physics_nssl, imp_physics_fa, imfdeepcnv, &
212 & imfdeepcnv_c3, imfdeepcnv_samf, &
215 real(kind_phys),
intent(in) :: &
219 real(kind_phys),
intent(inout),
optional :: dtend(:,:,:)
220 integer,
intent(in) :: dtidx(:,:)
221 integer,
intent(in) :: index_of_temperature, index_of_x_wind
222 integer,
intent(in) :: index_of_y_wind, index_of_process_pbl
223 integer,
intent(in) :: ntoz, ntqv, ntcw, ntiw, ntsw, ntlnc
224 integer,
intent(in) :: ntinc, ntwa, ntia, ntke
227 INTEGER,
PARAMETER :: &
228 & bl_mynn_mixscalars=1
230 & FLAG_QI, FLAG_QNI, FLAG_QC, FLAG_QS, FLAG_QNC, &
231 & FLAG_QNWFA, FLAG_QNIFA, FLAG_QNBCA, FLAG_OZONE
233 LOGICAL,
PARAMETER :: cycling = .false.
236 REAL(kind_phys),
intent(in) :: delt, dtf
237 INTEGER,
intent(in) :: im, levs
238 LOGICAL,
intent(in) :: flag_init, flag_restart
239 INTEGER :: initflag, k, i
240 INTEGER :: IDS,IDE,JDS,JDE,KDS,KDE, &
241 & IMS,IME,JMS,JME,KMS,KME, &
242 & ITS,ITE,JTS,JTE,KTS,KTE
244 REAL(kind_phys) :: tem
247 real(kind_phys),
dimension(:,:),
intent(in) :: phii
248 real(kind_phys),
dimension(:,:),
intent(out) :: &
249 & dtdt, dudt, dvdt, dqdt_water_vapor, dqdt_liquid_cloud, &
250 & dqdt_ice, dqdt_snow, dqdt_ozone
251 real(kind_phys),
dimension(:,:,:),
intent(out) :: dqdt_all
252 real(kind_phys),
dimension(:,:),
intent(out),
optional :: &
253 & dqdt_cloud_droplet_num_conc, dqdt_ice_num_conc, &
254 & dqdt_water_aer_num_conc, dqdt_ice_aer_num_conc, dqdt_cccn
255 real(kind_phys),
dimension(:,:),
intent(inout) :: qke, &
256 & EL_PBL, Sh3D, Sm3D, qc_bl, qi_bl, cldfra_bl
257 real(kind_phys),
dimension(:,:),
intent(inout) :: &
259 real(kind_phys),
dimension(:,:,:),
intent(out) :: tmf
261 real(kind_phys),
dimension(:,:),
intent(inout),
optional :: &
262 & edmf_a,edmf_w,edmf_qt, &
263 & edmf_thl,edmf_ent,edmf_qc, &
264 & sub_thl,sub_sqv,det_thl,det_sqv
265 real(kind_phys),
dimension(:,:),
intent(in) :: &
266 & t3d,qgrs_water_vapor, qgrs_liquid_cloud, qgrs_ice, &
268 real(kind_phys),
dimension(:,:),
intent(in) :: &
269 & qgrs_cloud_ice_num_conc, &
273 real(kind_phys),
dimension(:,:),
intent(in),
optional :: &
274 & qgrs_water_aer_num_conc, &
275 & qgrs_cloud_droplet_num_conc, &
276 & qgrs_ice_aer_num_conc
277 real(kind_phys),
dimension(:,:),
intent(in),
optional :: qgrs_cccn
278 real(kind_phys),
dimension(:,:),
intent(out) :: &
279 & Tsq, Qsq, Cov, exch_h, exch_m
280 real(kind_phys),
dimension(:,:),
intent(out),
optional :: &
281 & dqke, qWT, qSHEAR, qBUOY, qDISS
282 real(kind_phys),
dimension(:),
intent(in) :: xmu
283 real(kind_phys),
dimension(:,:),
intent(in) :: htrsw, htrlw
285 real(kind_phys),
dimension(:,:),
intent(in),
optional :: spp_wts_pbl
288 real(kind_phys),
dimension(im,levs) :: &
289 & sqv,sqc,sqi,sqs,qnc,qni,ozone,qnwfa,qnifa,qnbca, &
290 & dz, w, p, rho, th, qv, delp, &
291 & RUBLTEN, RVBLTEN, RTHBLTEN, RQVBLTEN, &
292 & RQCBLTEN, RQNCBLTEN, RQIBLTEN, RQNIBLTEN, RQSBLTEN, &
293 & RQNWFABLTEN, RQNIFABLTEN, RQNBCABLTEN, adj_t
296 real(kind_phys),
dimension(:),
intent(inout),
optional :: frp
297 logical,
intent(in) :: mix_chem, enh_mix, rrfs_sd
298 real(kind_phys),
dimension(:,:,:),
intent(inout),
optional :: chem3d
299 real(kind_phys),
dimension(:,: ),
intent(in),
optional :: vdep
300 real(kind_phys),
dimension(im) :: emis_ant_no
303 real(kind_phys),
dimension(:),
intent(in) :: &
304 & dx,zorl,slmsk,tsurf,qsfc,ps, &
305 & hflx,qflx,ust,wspd,rb,recmol
307 real(kind_phys),
dimension(:),
intent(in),
optional :: &
308 & dusfc_cice,dvsfc_cice,dtsfc_cice,dqsfc_cice
309 real(kind_phys),
dimension(:),
intent(in) :: &
310 & stress_wat,hflx_wat,qflx_wat, &
313 logical,
dimension(:),
intent(in) :: &
316 real(kind_phys),
dimension(:),
intent(inout) :: &
317 & pblh,dusfc_diag,dvsfc_diag,dtsfc_diag,dqsfc_diag
318 real(kind_phys),
dimension(:),
intent(out) :: &
319 & ch,dtsfc1,dqsfc1,dusfc1,dvsfc1, &
320 & dtsfci_diag,dqsfci_diag,dusfci_diag,dvsfci_diag
321 real(kind_phys),
dimension(:),
intent(out) :: &
322 & maxMF,maxwidth,ztop_plume
323 integer,
dimension(:),
intent(inout) :: &
325 integer,
dimension(:),
intent(inout) :: &
328 real(kind_phys),
dimension(:),
intent(inout),
optional :: &
329 & dusfc_cpl,dvsfc_cpl,dtsfc_cpl,dqsfc_cpl
330 real(kind_phys),
dimension(:),
intent(inout),
optional :: &
331 & dusfci_cpl,dvsfci_cpl,dtsfci_cpl,dqsfci_cpl
334 real(kind_phys),
dimension(im) :: &
335 & hfx,qfx,rmol,xland,uoce,voce,znt,ts
337 real(kind_phys),
dimension(im) :: dusfci1,dvsfci1,dtsfci1,dqsfci1
338 real(kind_phys),
allocatable :: save_qke_adv(:,:)
339 real(kind_phys),
dimension(levs) :: kzero
349 dqdt_water_vapor = 0.0
350 dqdt_liquid_cloud = 0.0
354 if (imp_physics == imp_physics_thompson)
then
355 if (ltaerosol .or. mraerosol)
then
357 dqdt_water_aer_num_conc = 0.0
358 dqdt_ice_aer_num_conc = 0.0
360 dqdt_cloud_droplet_num_conc = 0.0
362 dqdt_ice_num_conc = 0.0
364 if (imp_physics == imp_physics_nssl)
then
365 dqdt_cloud_droplet_num_conc = 0.0
366 dqdt_ice_num_conc = 0.0
367 if (nssl_ccn_on) dqdt_cccn = 0.0
373 write(0,*)
"=============================================="
374 write(0,*)
"in mynn wrapper..."
375 write(0,*)
"flag_init=",flag_init
376 write(0,*)
"flag_restart=",flag_restart
379 if (.not. flag_for_pbl_generic_tend .and. ldiag3d)
then
380 idtend = dtidx(ntke+100,index_of_process_pbl)
382 allocate(save_qke_adv(im,levs))
404 if (imp_physics == imp_physics_wsm6 .or. imp_physics == imp_physics_fa)
then
416 sqv(i,k) = qgrs_water_vapor(i,k)
417 sqc(i,k) = qgrs_liquid_cloud(i,k)
418 sqi(i,k) = qgrs_ice(i,k)
420 ozone(i,k) = qgrs_ozone(i,k)
428 elseif (imp_physics == imp_physics_nssl )
then
435 flag_qnwfa= nssl_ccn_on
440 sqv(i,k) = qgrs_water_vapor(i,k)
441 sqc(i,k) = qgrs_liquid_cloud(i,k)
442 sqi(i,k) = qgrs_ice(i,k)
443 sqs(i,k) = qgrs_snow(i,k)
444 ozone(i,k) = qgrs_ozone(i,k)
445 qnc(i,k) = qgrs_cloud_droplet_num_conc(i,k)
446 qni(i,k) = qgrs_cloud_ice_num_conc(i,k)
448 IF ( nssl_ccn_on )
THEN
449 qnwfa(i,k) = qgrs_cccn(i,k)
455 elseif (imp_physics == imp_physics_thompson .or. imp_physics == imp_physics_tempo)
then
468 sqv(i,k) = qgrs_water_vapor(i,k)
469 sqc(i,k) = qgrs_liquid_cloud(i,k)
470 sqi(i,k) = qgrs_ice(i,k)
471 sqs(i,k) = qgrs_snow(i,k)
472 qnc(i,k) = qgrs_cloud_droplet_num_conc(i,k)
473 qni(i,k) = qgrs_cloud_ice_num_conc(i,k)
474 ozone(i,k) = qgrs_ozone(i,k)
475 qnwfa(i,k) = qgrs_water_aer_num_conc(i,k)
476 qnifa(i,k) = qgrs_ice_aer_num_conc(i,k)
480 else if(mraerosol .and. imp_physics == imp_physics_thompson)
then
491 sqv(i,k) = qgrs_water_vapor(i,k)
492 sqc(i,k) = qgrs_liquid_cloud(i,k)
493 sqi(i,k) = qgrs_ice(i,k)
494 sqs(i,k) = qgrs_snow(i,k)
495 qnc(i,k) = qgrs_cloud_droplet_num_conc(i,k)
496 qni(i,k) = qgrs_cloud_ice_num_conc(i,k)
497 ozone(i,k) = qgrs_ozone(i,k)
514 sqv(i,k) = qgrs_water_vapor(i,k)
515 sqc(i,k) = qgrs_liquid_cloud(i,k)
516 sqi(i,k) = qgrs_ice(i,k)
517 sqs(i,k) = qgrs_snow(i,k)
519 qni(i,k) = qgrs_cloud_ice_num_conc(i,k)
520 ozone(i,k) = qgrs_ozone(i,k)
527 elseif (imp_physics == imp_physics_gfdl)
then
539 sqv(i,k) = qgrs_water_vapor(i,k)
540 sqc(i,k) = qgrs_liquid_cloud(i,k)
541 sqi(i,k) = qgrs_ice(i,k)
548 ozone(i,k) = qgrs_ozone(i,k)
552 print*,
"In MYNN wrapper. Unknown microphysics scheme, imp_physics=",imp_physics
553 print*,
"Defaulting to qc and qv species only..."
564 sqv(i,k) = qgrs_water_vapor(i,k)
565 sqc(i,k) = qgrs_liquid_cloud(i,k)
573 ozone(i,k) = qgrs_ozone(i,k)
589 dz(i,k)=(phii(i,k+1) - phii(i,k))*g_inv
595 delp(i,k) = prsi(i,k) - prsi(i,k+1)
600 call moisture_check2(levs, delt, &
601 delp(i,:), exner(i,:), &
602 sqv(i,:), sqc(i,:), &
603 sqi(i,:), kzero(:), &
609 th(i,k)=adj_t(i,k)/exner(i,k)
610 rho(i,k)=prsl(i,k)/(r_d*adj_t(i,k)*(1.+p608*max(sqv(i,k),1e-8)))
611 w(i,k) = -omega(i,k)/(rho(i,k)*grav)
617 if (slmsk(i)==1. .or. slmsk(i)==2.)
then
626 hfx(i)=hflx(i)*rho(i,1)*cp
627 qfx(i)=qflx(i)*rho(i,1)
629 if (hfx(i) > 1200.)hfx(i) = 1200.
630 if (hfx(i) < -500.)hfx(i) = -500.
631 if (qfx(i) > .0005)qfx(i) = 0.0005
632 if (qfx(i) < -.0002)qfx(i) = -0.0002
635 dqsfc1(i) = qfx(i)*xlv
636 dusfc1(i) = -1.*rho(i,1)*ust(i)*ust(i)*u(i,1)/wspd(i)
637 dvsfc1(i) = -1.*rho(i,1)*ust(i)*ust(i)*v(i,1)/wspd(i)
640 dtsfci_diag(i) = dtsfc1(i)
641 dqsfci_diag(i) = dqsfc1(i)
642 dtsfc_diag(i) = dtsfc_diag(i) + dtsfc1(i)*delt
643 dqsfc_diag(i) = dqsfc_diag(i) + dqsfc1(i)*delt
644 dusfci_diag(i) = dusfc1(i)
645 dvsfci_diag(i) = dvsfc1(i)
646 dusfc_diag(i) = dusfc_diag(i) + dusfci_diag(i)*delt
647 dvsfc_diag(i) = dvsfc_diag(i) + dvsfci_diag(i)*delt
650 if (do_mynnsfclay)
then
653 if (hfx(i) .ge. 0.)
then
654 rmol(i)=-hfx(i)/(200.*dz(i,1)*0.5)
656 rmol(i)=abs(rb(i))*1./(dz(i,1)*0.5)
659 ts(i)=tsurf(i)/exner(i,1)
668 if (oceanfrac(i) > zero)
then
669 if ( .not. wet(i))
then
670 dusfci_cpl(i) = dusfc_cice(i)
671 dvsfci_cpl(i) = dvsfc_cice(i)
672 dtsfci_cpl(i) = dtsfc_cice(i)
673 dqsfci_cpl(i) = dqsfc_cice(i)
674 elseif (icy(i) .or. dry(i))
then
675 if (wspd(i) > zero)
then
676 dusfci_cpl(i) = -1.*rho(i,1)*stress_wat(i)*u(i,1)/wspd(i)
677 dvsfci_cpl(i) = -1.*rho(i,1)*stress_wat(i)*v(i,1)/wspd(i)
682 dtsfci_cpl(i) = cp*rho(i,1)*hflx_wat(i)
683 dqsfci_cpl(i) = xlv*rho(i,1)*qflx_wat(i)
685 dusfci_cpl(i) = dusfci_diag(i)
686 dvsfci_cpl(i) = dvsfci_diag(i)
687 dtsfci_cpl(i) = dtsfci_diag(i)
688 dqsfci_cpl(i) = dqsfci_diag(i)
691 dusfc_cpl(i) = dusfc_cpl(i) + dusfci_cpl(i) * delt
692 dvsfc_cpl(i) = dvsfc_cpl(i) + dvsfci_cpl(i) * delt
693 dtsfc_cpl(i) = dtsfc_cpl(i) + dtsfci_cpl(i) * delt
694 dqsfc_cpl(i) = dqsfc_cpl(i) + dqsfci_cpl(i) * delt
706 write(0,*)
"===CALLING mynn_bl_driver; input:"
707 print*,
"tke_budget=",tke_budget,
" bl_mynn_tkeadvect=",bl_mynn_tkeadvect
708 print*,
"bl_mynn_cloudpdf=",bl_mynn_cloudpdf,
" bl_mynn_mixlength=",bl_mynn_mixlength
709 print*,
"bl_mynn_edmf=",bl_mynn_edmf,
" bl_mynn_edmf_mom=",bl_mynn_edmf_mom
710 print*,
"bl_mynn_edmf_tke=",bl_mynn_edmf_tke
711 print*,
"bl_mynn_cloudmix=",bl_mynn_cloudmix,
" bl_mynn_mixqt=",bl_mynn_mixqt
712 print*,
"icloud_bl=",icloud_bl
713 print*,
"T:",adj_t(1,1),adj_t(1,2),adj_t(1,levs)
714 print*,
"TH:",th(1,1),th(1,2),th(1,levs)
715 print*,
"rho:",rho(1,1),rho(1,2),rho(1,levs)
716 print*,
"exner:",exner(1,1),exner(1,2),exner(1,levs)
717 print*,
"prsl:",prsl(1,1),prsl(1,2),prsl(1,levs)
718 print*,
"dz:",dz(1,1),dz(1,2),dz(1,levs)
719 print*,
"u:",u(1,1),u(1,2),u(1,levs)
720 print*,
"v:",v(1,1),v(1,2),v(1,levs)
721 print*,
"sqv:",sqv(1,1),sqv(1,2),sqv(1,levs)
722 print*,
"sqc:",sqc(1,1),sqc(1,2),sqc(1,levs)
723 print*,
"sqi:",sqi(1,1),sqi(1,2),sqi(1,levs)
724 print*,
"rmol:",rmol(1),
" ust:",ust(1)
725 print*,
" dx=",dx(1),
"initflag=",initflag
726 print*,
"Tsurf:",tsurf(1),
" Thetasurf:",ts(1)
727 print*,
"HFX:",hfx(1),
" qfx",qfx(1)
728 print*,
"qsfc:",qsfc(1),
" ps:",ps(1)
729 print*,
"wspd:",wspd(1),
" rb=",rb(1)
730 print*,
"znt:",znt(1),
" delt=",delt
731 print*,
"im=",im,
" levs=",levs
732 print*,
"PBLH=",pblh(1),
" KPBL=",kpbl(1),
" xland=",xland(1)
735 print*,
"qke:",qke(1,1),qke(1,2),qke(1,levs)
736 print*,
"el_pbl:",el_pbl(1,1),el_pbl(1,2),el_pbl(1,levs)
737 print*,
"Sh3d:",sh3d(1,1),sh3d(1,2),sh3d(1,levs)
740 print*,
"max cf_bl:",maxval(cldfra_bl(1,:))
745 & initflag=initflag,restart=flag_restart, &
747 & delt=delt,dz=dz,dx=dx,znt=znt, &
748 & u=u,v=v,w=w,th=th,sqv3d=sqv,sqc3d=sqc, &
749 & sqi3d=sqi,sqs3d=sqs,qnc=qnc,qni=qni, &
750 & qnwfa=qnwfa,qnifa=qnifa,qnbca=qnbca,ozone=ozone, &
751 & p=prsl,exner=exner,rho=rho,t3d=adj_t, &
752 & xland=xland,ts=ts,qsfc=qsfc,ps=ps, &
753 & ust=ust,ch=ch,hfx=hfx,qfx=qfx,rmol=rmol, &
754 & wspd=wspd,uoce=uoce,voce=voce, &
755 & qke=qke,qke_adv=qke_adv, &
756 & sh3d=sh3d,sm3d=sm3d, &
758 & nchem=nchem,kdvel=kdvel,ndvel=ndvel, &
759 & chem3d=chem3d,vdep=vdep,smoke_dbg=smoke_dbg, &
760 & frp=frp,emis_ant_no=emis_ant_no, &
761 & mix_chem=mix_chem,enh_mix=enh_mix, &
764 & tsq=tsq,qsq=qsq,cov=cov, &
765 & rublten=rublten,rvblten=rvblten,rthblten=rthblten, &
766 & rqvblten=rqvblten,rqcblten=rqcblten, &
767 & rqiblten=rqiblten,rqncblten=rqncblten, &
768 & rqsblten=rqsblten, &
769 & rqniblten=rqniblten,rqnwfablten=rqnwfablten, &
770 & rqnifablten=rqnifablten,rqnbcablten=rqnbcablten, &
771 & dozone=dqdt_ozone, &
772 & exch_h=exch_h,exch_m=exch_m, &
773 & pblh=pblh,kpbl=kpbl, &
776 & qwt=qwt,qshear=qshear,qbuoy=qbuoy,qdiss=qdiss, &
777 & bl_mynn_tkeadvect=bl_mynn_tkeadvect, &
778 & tke_budget=tke_budget, &
779 & bl_mynn_cloudpdf=bl_mynn_cloudpdf, &
780 & bl_mynn_mixlength=bl_mynn_mixlength, &
781 & icloud_bl=icloud_bl, &
782 & qc_bl=qc_bl,qi_bl=qi_bl,cldfra_bl=cldfra_bl, &
783 & closure=bl_mynn_closure,bl_mynn_edmf=bl_mynn_edmf, &
784 & bl_mynn_edmf_mom=bl_mynn_edmf_mom, &
785 & bl_mynn_edmf_tke=bl_mynn_edmf_tke, &
786 & bl_mynn_mixscalars=bl_mynn_mixscalars, &
787 & bl_mynn_output=bl_mynn_output, &
788 & bl_mynn_cloudmix=bl_mynn_cloudmix, &
789 & bl_mynn_mixqt=bl_mynn_mixqt, &
790 & edmf_a=edmf_a,edmf_w=edmf_w,edmf_qt=edmf_qt, &
791 & edmf_thl=edmf_thl,edmf_ent=edmf_ent,edmf_qc=edmf_qc,&
792 & sub_thl3d=sub_thl,sub_sqv3d=sub_sqv, &
793 & det_thl3d=det_thl,det_sqv3d=det_sqv, &
794 & maxwidth=maxwidth,maxmf=maxmf,ztop_plume=ztop_plume,&
795 & ktop_plume=ktop_plume, &
796 & spp_pbl=spp_pbl,pattern_spp_pbl=spp_wts_pbl, &
798 & flag_qi=flag_qi,flag_qni=flag_qni, &
799 & flag_qc=flag_qc,flag_qnc=flag_qnc,flag_qs=flag_qs, &
800 & flag_qnwfa=flag_qnwfa,flag_qnifa=flag_qnifa, &
801 & flag_qnbca=flag_qnbca,flag_ozone=flag_ozone, &
802 & ids=1,ide=im,jds=1,jde=1,kds=1,kde=levs, &
803 & ims=1,ime=im,jms=1,jme=1,kms=1,kme=levs, &
804 & its=1,ite=im,jts=1,jte=1,kts=1,kte=levs )
817 dtdt(i,k) = rthblten(i,k)*exner(i,k)
818 dudt(i,k) = rublten(i,k)
819 dvdt(i,k) = rvblten(i,k)
822 accum_duvt3dt:
if(ldiag3d .or. lsidea)
then
823 call dtend_helper(index_of_x_wind,dudt)
824 call dtend_helper(index_of_y_wind,dvdt)
825 call dtend_helper(index_of_temperature,dtdt)
827 call dtend_helper(100+ntoz,dqdt_ozone)
840 if (imp_physics == imp_physics_wsm6 .or. imp_physics == imp_physics_fa)
then
844 dqdt_water_vapor(i,k) = rqvblten(i,k)
845 dqdt_liquid_cloud(i,k) = rqcblten(i,k)
846 dqdt_ice(i,k) = rqiblten(i,k)
847 dqdt_snow(i,k) = rqsblten(i,k)
851 if(ldiag3d .and. .not. flag_for_pbl_generic_tend)
then
852 call dtend_helper(100+ntqv,rqvblten)
853 call dtend_helper(100+ntcw,rqcblten)
854 call dtend_helper(100+ntiw,rqiblten)
865 elseif (imp_physics == imp_physics_thompson .or. imp_physics == imp_physics_tempo)
then
870 dqdt_water_vapor(i,k) = rqvblten(i,k)
871 dqdt_liquid_cloud(i,k) = rqcblten(i,k)
872 dqdt_cloud_droplet_num_conc(i,k) = rqncblten(i,k)
873 dqdt_ice(i,k) = rqiblten(i,k)
874 dqdt_ice_num_conc(i,k) = rqniblten(i,k)
875 dqdt_snow(i,k) = rqsblten(i,k)
877 dqdt_water_aer_num_conc(i,k) = rqnwfablten(i,k)
878 dqdt_ice_aer_num_conc(i,k) = rqnifablten(i,k)
881 if(ldiag3d .and. .not. flag_for_pbl_generic_tend)
then
882 call dtend_helper(100+ntqv,rqvblten)
883 call dtend_helper(100+ntcw,rqcblten)
884 call dtend_helper(100+ntlnc,rqncblten)
885 call dtend_helper(100+ntiw,rqiblten)
886 call dtend_helper(100+ntinc,rqniblten)
887 call dtend_helper(100+ntwa,rqnwfablten)
888 call dtend_helper(100+ntia,rqnifablten)
902 else if(mraerosol .and. imp_physics == imp_physics_thompson)
then
905 dqdt_water_vapor(i,k) = rqvblten(i,k)
906 dqdt_liquid_cloud(i,k) = rqcblten(i,k)
907 dqdt_cloud_droplet_num_conc(i,k) = rqncblten(i,k)
908 dqdt_ice(i,k) = rqiblten(i,k)
909 dqdt_ice_num_conc(i,k) = rqniblten(i,k)
910 dqdt_snow(i,k) = rqsblten(i,k)
913 if(ldiag3d .and. .not. flag_for_pbl_generic_tend)
then
914 call dtend_helper(100+ntqv,rqvblten)
915 call dtend_helper(100+ntcw,rqcblten)
916 call dtend_helper(100+ntlnc,rqncblten)
917 call dtend_helper(100+ntiw,rqiblten)
918 call dtend_helper(100+ntinc,rqniblten)
924 dqdt_water_vapor(i,k) = rqvblten(i,k)
925 dqdt_liquid_cloud(i,k) = rqcblten(i,k)
926 dqdt_ice(i,k) = rqiblten(i,k)
927 dqdt_ice_num_conc(i,k) = rqniblten(i,k)
928 dqdt_snow(i,k) = rqsblten(i,k)
932 if(ldiag3d .and. .not. flag_for_pbl_generic_tend)
then
933 call dtend_helper(100+ntqv,rqvblten)
934 call dtend_helper(100+ntcw,rqcblten)
935 call dtend_helper(100+ntiw,rqiblten)
936 call dtend_helper(100+ntinc,rqniblten)
949 elseif (imp_physics == imp_physics_nssl)
then
953 dqdt_water_vapor(i,k) = rqvblten(i,k)
954 dqdt_liquid_cloud(i,k) = rqcblten(i,k)
955 dqdt_cloud_droplet_num_conc(i,k) = rqncblten(i,k)
956 dqdt_ice(i,k) = rqiblten(i,k)
957 dqdt_ice_num_conc(i,k) = rqniblten(i,k)
958 dqdt_snow(i,k) = rqsblten(i,k)
959 IF ( nssl_ccn_on )
THEN
960 dqdt_cccn(i,k) = rqnwfablten(i,k)
965 elseif (imp_physics == imp_physics_gfdl)
then
969 dqdt_water_vapor(i,k) = rqvblten(i,k)
970 dqdt_liquid_cloud(i,k) = rqcblten(i,k)
971 dqdt_ice(i,k) = rqiblten(i,k)
978 if(ldiag3d .and. .not. flag_for_pbl_generic_tend)
then
979 call dtend_helper(100+ntqv,rqvblten)
980 call dtend_helper(100+ntcw,rqcblten)
981 call dtend_helper(100+ntiw,rqiblten)
995 dqdt_water_vapor(i,k) = rqvblten(i,k)
996 dqdt_liquid_cloud(i,k) = rqcblten(i,k)
1004 if(ldiag3d .and. .not. flag_for_pbl_generic_tend)
then
1005 call dtend_helper(100+ntqv,rqvblten)
1006 call dtend_helper(100+ntcw,rqcblten)
1007 call dtend_helper(100+ntiw,rqiblten)
1013 print*,
"===Finished with mynn_bl_driver; output:"
1014 print*,
"T:",adj_t(1,1),adj_t(1,2),adj_t(1,levs)
1015 print*,
"TH:",th(1,1),th(1,2),th(1,levs)
1016 print*,
"rho:",rho(1,1),rho(1,2),rho(1,levs)
1017 print*,
"exner:",exner(1,1),exner(1,2),exner(1,levs)
1018 print*,
"prsl:",prsl(1,1),prsl(1,2),prsl(1,levs)
1019 print*,
"dz:",dz(1,1),dz(1,2),dz(1,levs)
1020 print*,
"u:",u(1,1),u(1,2),u(1,levs)
1021 print*,
"v:",v(1,1),v(1,2),v(1,levs)
1022 print*,
"sqv:",sqv(1,1),sqv(1,2),sqv(1,levs)
1023 print*,
"sqc:",sqc(1,1),sqc(1,2),sqc(1,levs)
1024 print*,
"sqi:",sqi(1,1),sqi(1,2),sqi(1,levs)
1025 print*,
"rmol:",rmol(1),
" ust:",ust(1)
1026 print*,
"dx(1)=",dx(1),
"initflag=",initflag
1027 print*,
"Tsurf:",tsurf(1),
" Thetasurf:",ts(1)
1028 print*,
"HFX:",hfx(1),
" qfx",qfx(1)
1029 print*,
"qsfc:",qsfc(1),
" ps:",ps(1)
1030 print*,
"wspd:",wspd(1),
" rb=",rb(1)
1031 print*,
"znt:",znt(1),
" delt=",delt
1032 print*,
"im=",im,
" levs=",levs
1033 print*,
"PBLH=",pblh(1),
" KPBL=",kpbl(1),
" xland=",xland(1)
1035 print*,
"qke:",qke(1,1),qke(1,2),qke(1,levs)
1036 print*,
"el_pbl:",el_pbl(1,1),el_pbl(1,2),el_pbl(1,levs)
1037 print*,
"Sh3d:",sh3d(1,1),sh3d(1,2),sh3d(1,levs)
1038 print*,
"exch_h:",exch_h(1,1),exch_h(1,2),exch_h(1,levs)
1039 print*,
"exch_m:",exch_m(1,1),exch_m(1,2),exch_m(1,levs)
1040 print*,
"max cf_bl:",maxval(cldfra_bl(1,:))
1041 print*,
"max qc_bl:",maxval(qc_bl(1,:))
1042 print*,
"dtdt:",dtdt(1,1),dtdt(1,2),dtdt(1,levs)
1043 print*,
"dudt:",dudt(1,1),dudt(1,2),dudt(1,levs)
1044 print*,
"dvdt:",dvdt(1,1),dvdt(1,2),dvdt(1,levs)
1045 print*,
"dqdt:",dqdt_water_vapor(1,1),dqdt_water_vapor(1,2),dqdt_water_vapor(1,levs)
1046 print*,
"ztop_plume:",ztop_plume(1),
" maxmf:",maxmf(1)
1047 print*,
"maxwidth:",maxwidth(1)
1051 if(
allocated(save_qke_adv))
then
1052 if(ldiag3d .and. .not. flag_for_pbl_generic_tend)
then
1053 idtend = dtidx(100+ntke,index_of_process_pbl)
1055 dtend(:,:,idtend) = dtend(:,:,idtend) + qke_adv-save_qke_adv
1058 deallocate(save_qke_adv)
1061 if(imfdeepcnv == imfdeepcnv_c3 .or. imfdeepcnv == imfdeepcnv_samf)
then
1065 tmf(i,k,1)=dqdt_water_vapor(i,k)
1072 SUBROUTINE dtend_helper(itracer,field,mult)
1073 real(kind_phys),
intent(in) :: field(im,levs)
1074 real(kind_phys),
intent(in),
optional :: mult(im,levs)
1075 integer,
intent(in) :: itracer
1078 idtend=dtidx(itracer,index_of_process_pbl)
1080 if(
present(mult))
then
1081 dtend(:,:,idtend) = dtend(:,:,idtend) + field*dtf*mult
1083 dtend(:,:,idtend) = dtend(:,:,idtend) + field*dtf
1086 END SUBROUTINE dtend_helper
1089 SUBROUTINE moisture_check2(kte, delt, dp, exner, &
1090 qv, qc, qi, qs, th )
1103 integer,
intent(in) :: kte
1104 real(kind_phys),
intent(in) :: delt
1105 real(kind_phys),
dimension(kte),
intent(in) :: dp, exner
1106 real(kind_phys),
dimension(kte),
intent(inout) :: qv, qc, qi, qs, th
1108 real :: dqc2, dqi2, dqs2, dqv2, sum, aa, dum
1109 real,
parameter :: qvmin1= 1e-8, &
1115 dqc2 = max(0.0, qcmin-qc(k))
1116 dqi2 = max(0.0, qimin-qi(k))
1117 dqs2 = max(0.0, qimin-qs(k))
1120 qc(k) = qc(k) + dqc2
1121 qi(k) = qi(k) + dqi2
1122 qs(k) = qs(k) + dqs2
1123 qv(k) = qv(k) - dqc2 - dqi2 - dqs2
1128 th(k) = th(k) + xlvcp*dqc2 + &
1133 dqv2 = max(0.0, qvmin1-qv(k))
1134 qv(k) = qv(k) + dqv2
1135 qv(k) = max(qv(k),qvmin1)
1138 dqv2 = max(0.0, qvmin-qv(k))
1139 qv(k) = qv(k) + dqv2
1140 qv(k-1)= qv(k-1) - dqv2*dp(k)/dp(k-1)
1141 qv(k) = max(qv(k),qvmin)
1143 qc(k) = max(qc(k),qcmin)
1144 qi(k) = max(qi(k),qimin)
1145 qs(k) = max(qs(k),qimin)
1151 if( dqv2 .gt. 1.e-20 )
then
1154 if( qv(k) .gt. 2.0*qvmin ) sum = sum + qv(k)*dp(k)
1156 aa = dqv2*dp(1)/max(1.e-20,sum)
1157 if( aa .lt. 0.5 )
then
1159 if( qv(k) .gt. 2.0*qvmin )
then
1172 END SUBROUTINE moisture_check2
1174 END SUBROUTINE mynnedmf_wrapper_run
subroutine mynn_bl_driver(initflag, restart, cycling, delt, dz, dx, znt, u, v, w, th, sqv3d, sqc3d, sqi3d, sqs3d, qnc, qni, qnwfa, qnifa, qnbca, ozone, p, exner, rho, t3d, xland, ts, qsfc, ps, ust, ch, hfx, qfx, rmol, wspd, uoce, voce, qke, qke_adv, sh3d, sm3d, nchem, kdvel, ndvel, chem3d, vdep, smoke_dbg, frp, emis_ant_no, mix_chem, enh_mix, rrfs_sd, tsq, qsq, cov, rublten, rvblten, rthblten, rqvblten, rqcblten, rqiblten, rqncblten, rqniblten, rqsblten, rqnwfablten, rqnifablten, rqnbcablten, dozone, exch_h, exch_m, pblh, kpbl, el_pbl, dqke, qwt, qshear, qbuoy, qdiss, qc_bl, qi_bl, cldfra_bl, bl_mynn_tkeadvect, tke_budget, bl_mynn_cloudpdf, bl_mynn_mixlength, icloud_bl, closure, bl_mynn_edmf, bl_mynn_edmf_mom, bl_mynn_edmf_tke, bl_mynn_mixscalars, bl_mynn_output, bl_mynn_cloudmix, bl_mynn_mixqt, edmf_a, edmf_w, edmf_qt, edmf_thl, edmf_ent, edmf_qc, sub_thl3d, sub_sqv3d, det_thl3d, det_sqv3d, maxwidth, maxmf, ztop_plume, ktop_plume, spp_pbl, pattern_spp_pbl, rthraten, flag_qc, flag_qi, flag_qnc, flag_qni, flag_qs, flag_qnwfa, flag_qnifa, flag_qnbca, flag_ozone, ids, ide, jds, jde, kds, kde, ims, ime, jms, jme, kms, kme, its, ite, jts, jte, kts, kte)
This subroutine is the MYNN-EDNF PBL driver routine,which encompassed the majority of the subroutines...
This module defines model-specific constants/parameters.
This module contains the entity of MYNN-EDMF PBL scheme.
The following references best describe the code within Olson et al. (2019, NOAA Technical Memorandum)...