1 !WRF:MEDIATION_LAYER:PHYSICS
4 MODULE module_pbl_driver
7 !------------------------------------------------------------------
8 SUBROUTINE pbl_driver( &
9 itimestep,dt,u_frame,v_frame &
10 ,bldt,curr_secs,adapt_step_flag &
11 ,rublten,rvblten,rthblten &
13 ,ust,pblh,hfx,qfx,grdflx &
14 ,u_phy,v_phy,th_phy,rho &
15 ,p_phy,pi_phy,p8w,t_phy,dz8w,z &
16 ,tke_myj,el_myj,exch_h,akhs,akms &
17 ,thz0,qz0,uz0,vz0,qsfc &
19 ,psim,psih,gz1oz0, wspd,br,chklowq &
20 ,bl_pbl_physics, ra_lw_physics, dx &
22 ,kpbl,ct,lh,snow,xice &
23 ,znu, znw, mut, p_top &
24 ,ids,ide, jds,jde, kds,kde &
25 ,ims,ime, jms,jme, kms,kme &
26 ,i_start,i_end, j_start,j_end, kts,kte, num_tiles &
29 ! Optional moisture tracers
30 ,qv_curr, qc_curr, qr_curr &
31 ,qi_curr, qs_curr, qg_curr &
32 ,rqvblten,rqcblten,rqiblten &
33 ,rqrblten,rqsblten,rqgblten &
34 ! Optional moisture tracer flags
38 !------------------------------------------------------------------
39 USE module_state_description, ONLY : &
40 YSUSCHEME,MRFSCHEME,GFSSCHEME,MYJPBLSCHEME,ACMPBLSCHEME
42 USE module_model_constants
44 ! *** add new modules of schemes here
52 ! This driver calls subroutines for the PBL parameterizations.
60 !------------------------------------------------------------------
62 !======================================================================
63 ! Grid structure in physics part of WRF
64 !----------------------------------------------------------------------
65 ! The horizontal velocities used in the physics are unstaggered
66 ! relative to temperature/moisture variables. All predicted
67 ! variables are carried at half levels except w, which is at full
68 ! levels. Some arrays with names (*8w) are at w (full) levels.
70 !----------------------------------------------------------------------
71 ! In WRF, kms (smallest number) is the bottom level and kme (largest
72 ! number) is the top level. In your scheme, if 1 is at the top level,
73 ! then you have to reverse the order in the k direction.
75 ! kme - half level (no data at this level)
76 ! kme ----- full level
78 ! kme-1 ----- full level
83 ! kms+2 ----- full level
85 ! kms+1 ----- full level
87 ! kms ----- full level
89 !======================================================================
92 ! Rho_d dry density (kg/m^3)
93 ! Theta_m moist potential temperature (K)
94 ! Qv water vapor mixing ratio (kg/kg)
95 ! Qc cloud water mixing ratio (kg/kg)
96 ! Qr rain water mixing ratio (kg/kg)
97 ! Qi cloud ice mixing ratio (kg/kg)
98 ! Qs snow mixing ratio (kg/kg)
99 !-----------------------------------------------------------------
100 !-- RUBLTEN U tendency due to
101 ! PBL parameterization (m/s^2)
102 !-- RVBLTEN V tendency due to
103 ! PBL parameterization (m/s^2)
104 !-- RTHBLTEN Theta tendency due to
105 ! PBL parameterization (K/s)
106 !-- RQVBLTEN Qv tendency due to
107 ! PBL parameterization (kg/kg/s)
108 !-- RQCBLTEN Qc tendency due to
109 ! PBL parameterization (kg/kg/s)
110 !-- RQIBLTEN Qi tendency due to
111 ! PBL parameterization (kg/kg/s)
112 !-- itimestep number of time steps
113 !-- GLW downward long wave flux at ground surface (W/m^2)
114 !-- GSW downward short wave flux at ground surface (W/m^2)
115 !-- EMISS surface emissivity (between 0 and 1)
116 !-- TSK surface temperature (K)
117 !-- TMN soil temperature at lower boundary (K)
118 !-- XLAND land mask (1 for land, 2 for water)
119 !-- ZNT roughness length (m)
120 !-- MAVAIL surface moisture availability (between 0 and 1)
121 !-- UST u* in similarity theory (m/s)
122 !-- MOL T* (similarity theory) (K)
123 !-- HOL PBL height over Monin-Obukhov length
124 !-- PBLH PBL height (m)
125 !-- CAPG heat capacity for soil (J/K/m^3)
126 !-- THC thermal inertia (Cal/cm/K/s^0.5)
127 !-- SNOWC flag indicating snow coverage (1 for snow cover)
128 !-- HFX upward heat flux at the surface (W/m^2)
129 !-- QFX upward moisture flux at the surface (kg/m^2/s)
130 !-- REGIME flag indicating PBL regime (stable, unstable, etc.)
131 !-- tke_myj turbulence kinetic energy from Mellor-Yamada-Janjic (MYJ) (m^2/s^2)
132 !-- el_myj mixing length from Mellor-Yamada-Janjic (MYJ) (m)
133 !-- akhs sfc exchange coefficient of heat/moisture from MYJ
134 !-- akms sfc exchange coefficient of momentum from MYJ
135 !-- thz0 potential temperature at roughness length (K)
136 !-- uz0 u wind component at roughness length (m/s)
137 !-- vz0 v wind component at roughness length (m/s)
138 !-- qsfc specific humidity at lower boundary (kg/kg)
139 !-- th2 diagnostic 2-m theta from surface layer and lsm
140 !-- t2 diagnostic 2-m temperature from surface layer and lsm
141 !-- q2 diagnostic 2-m mixing ratio from surface layer and lsm
142 !-- lowlyr index of lowest model layer above ground
143 !-- rr dry air density (kg/m^3)
144 !-- u_phy u-velocity interpolated to theta points (m/s)
145 !-- v_phy v-velocity interpolated to theta points (m/s)
146 !-- th_phy potential temperature (K)
147 !-- p_phy pressure (Pa)
148 !-- pi_phy exner function (dimensionless)
149 !-- p8w pressure at full levels (Pa)
150 !-- t_phy temperature (K)
151 !-- dz8w dz between full levels (m)
152 !-- z height above sea level (m)
153 !-- DX horizontal space interval (m)
154 !-- DT time step (second)
155 !-- n_moist number of moisture species
156 !-- PSFC pressure at the surface (Pa)
160 !-- num_soil_layers number of soil layer
161 !-- IFSNOW ifsnow=1 for snow-cover effects
163 !-- P_QV species index for water vapor
164 !-- P_QC species index for cloud water
165 !-- P_QR species index for rain water
166 !-- P_QI species index for cloud ice
167 !-- P_QS species index for snow
168 !-- P_QG species index for graupel
169 !-- ids start index for i in domain
170 !-- ide end index for i in domain
171 !-- jds start index for j in domain
172 !-- jde end index for j in domain
173 !-- kds start index for k in domain
174 !-- kde end index for k in domain
175 !-- ims start index for i in memory
176 !-- ime end index for i in memory
177 !-- jms start index for j in memory
178 !-- jme end index for j in memory
179 !-- kms start index for k in memory
180 !-- kme end index for k in memory
181 !-- jts start index for j in tile
182 !-- jte end index for j in tile
183 !-- kts start index for k in tile
184 !-- kte end index for k in tile
186 !******************************************************************
187 !------------------------------------------------------------------
191 INTEGER, INTENT(IN ) :: bl_pbl_physics, ra_lw_physics
193 INTEGER, INTENT(IN ) :: ids,ide, jds,jde, kds,kde, &
194 ims,ime, jms,jme, kms,kme, &
197 INTEGER, DIMENSION(num_tiles), INTENT(IN) :: &
198 & i_start,i_end,j_start,j_end
200 INTEGER, INTENT(IN ) :: itimestep,STEPBL
201 INTEGER, DIMENSION( ims:ime , jms:jme ), &
202 INTENT(IN ) :: LOWLYR
204 LOGICAL, INTENT(IN ) :: warm_rain
206 REAL, DIMENSION( kms:kme ), &
207 OPTIONAL, INTENT(IN ) :: znu, &
210 REAL, INTENT(IN ) :: DT,DX
211 REAL, INTENT(IN ),OPTIONAL :: bldt
212 REAL, INTENT(IN ),OPTIONAL :: curr_secs
213 LOGICAL, INTENT(IN ),OPTIONAL :: adapt_step_flag
216 REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), &
217 INTENT(IN ) :: p_phy, &
229 REAL, DIMENSION( ims:ime , jms:jme ), &
230 INTENT(IN ) :: XLAND, &
238 REAL, DIMENSION( ims:ime, jms:jme ) , &
239 INTENT(INOUT) :: TSK, &
259 REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), &
260 INTENT(INOUT) :: RUBLTEN, &
265 REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), &
266 INTENT(OUT) :: EL_MYJ
268 REAL , INTENT(IN ) :: u_frame, &
272 INTEGER, DIMENSION( ims:ime , jms:jme ), &
273 INTENT(INOUT) :: KPBL
275 REAL, DIMENSION( ims:ime , jms:jme ), &
276 INTENT(IN) :: XICE, SNOW, LH
282 ! Flags relating to the optional tendency arrays declared above
283 ! Models that carry the optional tendencies will provdide the
284 ! optional arguments at compile time; these flags all the model
285 ! to determine at run-time whether a particular tracer is in
288 LOGICAL, INTENT(IN), OPTIONAL :: &
296 REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), &
297 OPTIONAL, INTENT(INOUT) :: &
298 ! optional moisture tracers
299 ! 2 time levels; if only one then use CURR
300 qv_curr, qc_curr, qr_curr &
301 ,qi_curr, qs_curr, qg_curr &
302 ,rqvblten,rqcblten,rqrblten &
303 ,rqiblten,rqsblten,rqgblten
305 REAL, DIMENSION( ims:ime, jms:jme ) , &
307 INTENT(INOUT) :: HOL, &
310 REAL, DIMENSION( ims:ime, jms:jme ) , &
314 REAL, OPTIONAL, INTENT(IN) :: p_top
318 REAL, DIMENSION( ims:ime, kms:kme, jms:jme ) ::v_phytmp
319 REAL, DIMENSION( ims:ime, kms:kme, jms:jme ) ::u_phytmp
321 REAL, DIMENSION( ims:ime, jms:jme ) :: TSKOLD, &
331 INTEGER :: i,J,K,NK,jj,ij,its,ite,jts,jte
333 LOGICAL :: flag_qv, flag_qc, flag_qr, flag_qi, flag_qs, flag_qg
334 CHARACTER*256 :: message
339 !------------------------------------------------------------------
342 flag_qv = .FALSE. ; IF ( PRESENT( F_QV ) ) flag_qv = F_QV
343 flag_qc = .FALSE. ; IF ( PRESENT( F_QC ) ) flag_qc = F_QC
344 flag_qr = .FALSE. ; IF ( PRESENT( F_QR ) ) flag_qr = F_QR
345 flag_qi = .FALSE. ; IF ( PRESENT( F_QI ) ) flag_qi = F_QI
346 flag_qs = .FALSE. ; IF ( PRESENT( F_QS ) ) flag_qs = F_QS
347 flag_qg = .FALSE. ; IF ( PRESENT( F_QG ) ) flag_qg = F_QG
349 !print *,flag_qv, flag_qc, flag_qr, flag_qi, flag_qs, flag_qg,' flag_qv, flag_qc, flag_qr, flag_qi, flag_qs, flag_qg'
350 !print *,f_qv, f_qc, f_qr, f_qi, f_qs, f_qg,' f_qv, f_qc, f_qr, f_qi, f_qs, f_qg'
352 if (bl_pbl_physics .eq. 0) return
353 ! RAINBL in mm (Accumulation between PBL calls)
357 ! Modified for adaptive time step
359 IF ( (itimestep .EQ. 1) .OR. (MOD(itimestep,STEPBL) .EQ. 0) ) THEN
365 IF (PRESENT(adapt_step_flag)) THEN
366 IF ((adapt_step_flag)) THEN
367 IF ( (itimestep .EQ. 1) .OR. (bldt .EQ. 0) .OR. &
368 ( CURR_SECS + dt >= ( INT( CURR_SECS / ( bldt * 60 ) + 1 ) * bldt * 60) ) ) THEN
378 IF (ra_lw_physics .gt. 0) radiation = .true.
384 ! PBL schemes need PBL time step for updates
386 if (PRESENT(adapt_step_flag)) then
387 if (adapt_step_flag) then
396 if (PRESENT(BLDT)) then
397 if (bldt .eq. 0) then
401 call wrf_message("WARNING: When using an adaptive time-step the boundary layer"// &
402 " time-step should be 0 (i.e., equivalent to model time-step). "// &
403 "In order to proceed, for boundary layer calculations, the "// &
404 "boundary layer time-step"// &
405 " will be rounded to the nearest minute, possibly resulting in"// &
406 " innacurate results.")
420 !$OMP PRIVATE ( ij,i,j,k )
421 DO ij = 1 , num_tiles
422 DO j=j_start(ij),j_end(ij)
423 DO i=i_start(ij),i_end(ij)
428 ! REVERSE ORDER IN THE VERTICAL DIRECTION
430 ! testing change later
433 v_phytmp(i,k,j)=v_phy(i,k,j)+v_frame
434 u_phytmp(i,k,j)=u_phy(i,k,j)+u_frame
439 PSFC(I,J)=p8w(I,kms,J)
441 DO k=kts,min(kte+1,kde)
445 IF ( PRESENT( RQCBLTEN )) RQCBLTEN(I,K,J)=0.
446 IF ( PRESENT( RQVBLTEN )) RQVBLTEN(I,K,J)=0.
449 IF (flag_QI .AND. PRESENT(RQIBLTEN) ) THEN
450 DO k=kts,min(kte+1,kde)
458 !$OMP END PARALLEL DO
461 !$OMP PRIVATE ( ij, i,j,k, its, ite, jts, jte )
462 DO ij = 1 , num_tiles
469 pbl_select: SELECT CASE(bl_pbl_physics)
472 CALL wrf_debug(100,'in YSU PBL')
473 IF ( PRESENT( qv_curr ) .AND. PRESENT( qc_curr ) .AND. &
474 PRESENT( qi_curr ) .AND. &
475 PRESENT( rqvblten ) .AND. PRESENT( rqcblten ) .AND. &
476 PRESENT( rqiblten ) .AND. &
477 PRESENT( hol ) ) THEN
479 U3D=u_phytmp,V3D=v_phytmp,TH3D=th_phy,T3D=t_phy &
480 ,QV3D=qv_curr,QC3D=qc_curr,QI3D=qi_curr &
481 ,P3D=p_phy,P3DI=p8w,PI3D=pi_phy &
482 ,RUBLTEN=rublten,RVBLTEN=rvblten &
483 ,RTHBLTEN=rthblten,RQVBLTEN=rqvblten &
484 ,RQCBLTEN=rqcblten,RQIBLTEN=rqiblten &
486 ,CP=cp,G=g,ROVCP=rcp,RD=r_D,ROVG=rovg &
487 ,DZ8W=dz8w,Z=z,XLV=XLV,RV=r_v,PSFC=PSFC &
488 ,ZNU=znu,ZNW=znw,MUT=mut,P_TOP=p_top &
489 ,ZNT=znt,UST=ust,ZOL=zol,HOL=hol,HPBL=pblh &
490 ,PSIM=psim,PSIH=psih,XLAND=xland &
491 ,HFX=hfx,QFX=qfx,TSK=tskold,GZ1OZ0=gz1oz0 &
493 ,WSPD=wspd,BR=br,DT=dtbl,DTMIN=dtmin,KPBL2D=kpbl &
494 ,SVP1=svp1,SVP2=svp2,SVP3=svp3,SVPT0=svpt0 &
495 ,EP1=ep_1,EP2=ep_2,KARMAN=karman,EOMEG=eomeg &
496 ,STBOLT=stbolt,EXCH_H=exch_h,REGIME=regime &
497 ,IDS=ids,IDE=ide,JDS=jds,JDE=jde,KDS=kds,KDE=kde &
498 ,IMS=ims,IME=ime,JMS=jms,JME=jme,KMS=kms,KME=kme &
499 ,ITS=its,ITE=ite,JTS=jts,JTE=jte,KTS=kts,KTE=kte &
502 CALL wrf_error_fatal('Lack arguments to call YSU pbl')
506 IF ( PRESENT( qv_curr ) .AND. PRESENT( qc_curr ) .AND. &
507 PRESENT( rqvblten ) .AND. PRESENT( rqcblten ) .AND. &
508 PRESENT( hol ) .AND. &
511 CALL wrf_debug(100,'in MRF')
513 U3D=u_phytmp,V3D=v_phytmp,TH3D=th_phy,T3D=t_phy &
517 ,P3D=p_phy,PI3D=pi_phy &
518 ,RUBLTEN=rublten,RVBLTEN=rvblten &
519 ,RTHBLTEN=rthblten,RQVBLTEN=rqvblten &
520 ,RQCBLTEN=rqcblten,RQIBLTEN=rqiblten &
521 ,CP=cp,G=g,ROVCP=rcp,R=r_d,ROVG=rovg &
522 ,DZ8W=dz8w,Z=z,XLV=xlv,RV=r_v,PSFC=psfc &
524 ,ZNT=znt,UST=ust,ZOL=zol,HOL=hol &
525 ,PBL=pblh,PSIM=psim,PSIH=psih &
526 ,XLAND=xland,HFX=hfx,QFX=qfx,TSK=tskold &
527 ,GZ1OZ0=gz1oz0,WSPD=wspd,BR=br &
528 ,DT=dtbl,DTMIN=dtmin,KPBL2D=kpbl &
529 ,SVP1=svp1,SVP2=svp2,SVP3=svp3,SVPT0=svpt0 &
530 ,EP1=ep_1,EP2=ep_2,KARMAN=karman,EOMEG=eomeg &
531 ,STBOLT=stbolt,REGIME=regime &
533 ,IDS=ids,IDE=ide,JDS=jds,JDE=jde,KDS=kds,KDE=kde &
534 ,IMS=ims,IME=ime,JMS=jms,JME=jme,KMS=kms,KME=kme &
535 ,ITS=its,ITE=ite,JTS=jts,JTE=jte,KTS=kts,KTE=kte &
538 CALL wrf_error_fatal('Lack arguments to call MRF pbl')
542 IF ( PRESENT( qv_curr ) .AND. PRESENT( qc_curr ) .AND. &
543 PRESENT( rqvblten ) .AND. PRESENT( rqcblten ) .AND. &
545 CALL wrf_debug(100,'in GFS')
547 U3D=u_phytmp,V3D=v_phytmp &
548 ,TH3D=th_phy,T3D=t_phy &
549 ,QV3D=qv_curr,QC3D=qc_curr,QI3D=qi_curr &
550 ,P3D=p_phy,PI3D=pi_phy &
551 ,RUBLTEN=rublten,RVBLTEN=rvblten,RTHBLTEN=rthblten &
552 ,RQVBLTEN=rqvblten,RQCBLTEN=rqcblten &
554 ,CP=cp,G=g,ROVCP=rcp,R=r_d,ROVG=rovg,FLAG_QI=flag_qi &
555 ,DZ8W=dz8w,z=z,PSFC=psfc &
556 ,UST=ust,PBL=pblh,PSIM=psim,PSIH=psih &
557 ,HFX=hfx,QFX=qfx,TSK=tskold,GZ1OZ0=gz1oz0 &
559 ,DT=dtbl,KPBL2D=kpbl,EP1=ep_1,KARMAN=karman &
560 ,IDS=ids,IDE=ide,JDS=jds,JDE=jde,KDS=kds,KDE=kde &
561 ,IMS=ims,IME=ime,JMS=jms,JME=jme,KMS=kms,KME=kme &
562 ,ITS=its,ITE=ite,JTS=jts,JTE=jte,KTS=kts,KTE=kte &
565 CALL wrf_error_fatal('Lack arguments to call GFS pbl')
569 IF ( PRESENT( qv_curr ) .AND. PRESENT( qc_curr ) .AND. &
570 PRESENT( rqvblten ) .AND. PRESENT( rqcblten ) .AND. &
573 CALL wrf_debug(100,'in MYJPBL')
575 DT=dt,STEPBL=stepbl,HT=ht,DZ=dz8w &
576 ,PMID=p_phy,PINT=p8w,TH=th_phy,T=t_phy,EXNER=pi_phy &
577 ,QV=qv_curr, CWM=qc_curr &
578 ,U=u_phy,V=v_phy,RHO=rho &
579 ,TSK=tsk,QSFC=qsfc,CHKLOWQ=chklowq,THZ0=thz0 &
580 ,QZ0=qz0,UZ0=uz0,VZ0=vz0 &
582 ,XLAND=xland,SICE=xice,SNOW=snow &
583 ,TKE_MYJ=tke_myj,EXCH_H=exch_h,USTAR=ust,ZNT=znt &
584 ,EL_MYJ=el_myj,PBLH=pblh,KPBL=kpbl,CT=ct &
585 ,AKHS=akhs,AKMS=akms,ELFLX=lh &
586 ,RUBLTEN=rublten,RVBLTEN=rvblten,RTHBLTEN=rthblten &
587 ,RQVBLTEN=rqvblten,RQCBLTEN=rqcblten &
588 ,IDS=ids,IDE=ide,JDS=jds,JDE=jde,KDS=kds,KDE=kde &
589 ,IMS=ims,IME=ime,JMS=jms,JME=jme,KMS=kms,KME=kme &
590 ,ITS=its,ITE=ite,JTS=jts,JTE=jte,KTS=kts,KTE=kte &
593 CALL wrf_error_fatal('Lack arguments to call MYJ pbl')
598 !! These are values that are not supplied to pbl driver, but are required by ACM
599 IF ( PRESENT( qv_curr ) .AND. PRESENT( qc_curr ) .AND. &
600 PRESENT( rqvblten ) .AND. PRESENT( rqcblten ) .AND. &
602 CALL wrf_debug(100,'in ACM PBL')
605 XTIME=itimestep, DTPBL=dtbl, ZNW=znw, SIGMAH=znu &
606 ,U3D=u_phytmp, V3D=v_phytmp, PP3D=p_phy, DZ8W=dz8w, TH3D=th_phy, T3D=t_phy &
607 ,QV3D=qv_curr, QC3D=qc_curr, QI3D=qi_curr, RR3D=rho &
608 ,UST=UST, HFX=HFX, QFX=QFX, TSK=tsk &
609 ,PSFC=PSFC, EP1=EP_1, G=g, ROVCP=rcp,RD=r_D,CPD=cp &
610 ,PBLH=pblh, KPBL2D=kpbl, REGIME=regime &
611 ,GZ1OZ0=gz1oz0,WSPD=wspd,PSIM=psim, MUT=mut &
612 ,RUBLTEN=rublten,RVBLTEN=rvblten,RTHBLTEN=rthblten &
613 ,RQVBLTEN=rqvblten,RQCBLTEN=rqcblten,RQIBLTEN=rqiblten &
614 ,IDS=ids,IDE=ide,JDS=jds,JDE=jde,KDS=kds,KDE=kde &
615 ,IMS=ims,IME=ime,JMS=jms,JME=jme,KMS=kms,KME=kme &
616 ,ITS=its,ITE=ite,JTS=jts,JTE=jte,KTS=kts,KTE=kte &
619 CALL wrf_error_fatal('Lack arguments to call ACM2 pbl')
625 WRITE( message , * ) 'The pbl option does not exist: bl_pbl_physics = ', bl_pbl_physics
626 CALL wrf_error_fatal ( message )
628 END SELECT pbl_select
631 !$OMP END PARALLEL DO
635 END SUBROUTINE pbl_driver
636 END MODULE module_pbl_driver