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 &
12 ,rublten,rvblten,rthblten &
14 ,ust,pblh,hfx,qfx,grdflx &
15 ,u_phy,v_phy,th_phy,rho &
16 ,p_phy,pi_phy,p8w,t_phy,dz8w,z &
17 ,exch_h,exch_m,akhs,akms &
18 ,thz0,qz0,uz0,vz0,qsfc,f &
20 ,psim,psih,gz1oz0, wspd,br,chklowq &
21 ,bl_pbl_physics, ra_lw_physics, dx &
23 ,kpbl,mixht,ct,lh,snow,xice &
24 ,znu, znw, mut, p_top &
27 ! OPTIONAL for TEMF scheme
28 ,te_temf,km_temf,kh_temf &
29 ,shf_temf,qf_temf,uw_temf,vw_temf &
30 ,hd_temf,lcl_temf,hct_temf &
31 ,wupd_temf,mf_temf,thup_temf,qtup_temf,qlup_temf &
32 ,exch_temf,cf3d_temf,cfm_temf &
35 ,qke,tsq,qsq,cov,rmol,ch,qcg,grav_settling &
37 ,el_mynn,dqke,qWT,qSHEAR,qBUOY,qDISS &
46 ,HPBL2D, EVAP2D, HEAT2D & !Kwon FOR SHAL. CON.
47 ,ids,ide, jds,jde, kds,kde &
48 ,ims,ime, jms,jme, kms,kme &
49 ,i_start,i_end, j_start,j_end, kts,kte, num_tiles &
52 ! Optional gravity-wave drag
55 ,dusfcg,dvsfcg,var2d,oc12d &
56 ,oa1,oa2,oa3,oa4,ol1,ol2,ol3,ol4 &
57 ! Optional moisture tracers
58 ,qv_curr, qc_curr, qr_curr &
59 ,qi_curr, qs_curr, qg_curr &
60 ,rqvblten,rqcblten,rqiblten &
61 ,rqrblten,rqsblten,rqgblten &
62 ! Optional moisture tracer flags
65 ! variables added for BEP
67 ,a_u_bep,a_v_bep,a_t_bep,a_q_bep &
68 ,b_u_bep,b_v_bep,b_t_bep,b_q_bep &
70 ,sf_sfclay_physics,sf_urban_physics &
73 ,wu_tur,wv_tur,wt_tur,wq_tur &
75 ,a_e_bep,b_e_bep,dlg_bep,dl_u_bep &
76 ,mfshconv, massflux_EDKF, entr_EDKF, detr_EDKF &
77 ,thl_up, thv_up, rt_up ,rv_up, rc_up, u_up, v_up &
79 ! Wind Turbine Parameterizations
80 ,phb,xlat_u,xlong_u,xlat_v,xlong_v,id &
81 ! variables required for camuwpbl scheme
82 , z_at_w,cldfra,rthratenlw,tauresx2d,tauresy2d &
83 , tpert2d,qpert2d,wpert2d &
85 !------------------------------------------------------------------
87 USE module_state_description, ONLY : &
88 YSUSCHEME,MRFSCHEME,GFSSCHEME,MYJPBLSCHEME,ACMPBLSCHEME,&
89 QNSEPBLSCHEME,MYNNPBLSCHEME2,MYNNPBLSCHEME3,BOULACSCHEME,&
90 CAMUWPBLSCHEME,BEPSCHEME,BEP_BEMSCHEME,MYJSFCSCHEME, &
91 TEMFPBLSCHEME,QNSEPBL09SCHEME, &
92 p_qi,param_first_scalar
93 USE module_wind_generic, ONLY : windspec
95 USE module_state_description, ONLY : &
96 YSUSCHEME,MRFSCHEME,GFSSCHEME,MYJPBLSCHEME,ACMPBLSCHEME &
97 , QNSEPBLSCHEME, p_qi,param_first_scalar &
98 , TEMFPBLSCHEME, GFS2011SCHEME,QNSEPBL09SCHEME &
102 USE module_model_constants
104 ! *** add new modules of schemes here
107 USE module_bl_qnsepbl
108 USE module_bl_qnsepbl09
112 USE module_bl_gfs2011, only: bl_gfs2011
117 USE module_bl_camuwpbl_driver, only:CAMUWPBL
119 USE module_bl_mfshconvpbl
122 USE module_wind_fitch
125 ! This driver calls subroutines for the PBL parameterizations.
131 ! 94. qnsepbl09 (old version)
140 !------------------------------------------------------------------
142 !======================================================================
143 ! Grid structure in physics part of WRF
144 !----------------------------------------------------------------------
145 ! The horizontal velocities used in the physics are unstaggered
146 ! relative to temperature/moisture variables. All predicted
147 ! variables are carried at half levels except w, which is at full
148 ! levels. Some arrays with names (*8w) are at w (full) levels.
150 !----------------------------------------------------------------------
151 ! In WRF, kms (smallest number) is the bottom level and kme (largest
152 ! number) is the top level. In your scheme, if 1 is at the top level,
153 ! then you have to reverse the order in the k direction.
155 ! kme - half level (no data at this level)
156 ! kme ----- full level
158 ! kme-1 ----- full level
163 ! kms+2 ----- full level
165 ! kms+1 ----- full level
167 ! kms ----- full level
169 !======================================================================
172 ! Rho_d dry density (kg/m^3)
173 ! Theta_m moist potential temperature (K)
174 ! Qv water vapor mixing ratio (kg/kg)
175 ! Qc cloud water mixing ratio (kg/kg)
176 ! Qr rain water mixing ratio (kg/kg)
177 ! Qi cloud ice mixing ratio (kg/kg)
178 ! Qs snow mixing ratio (kg/kg)
179 !-----------------------------------------------------------------
180 !-- RUBLTEN U tendency due to
181 ! PBL parameterization (m/s^2)
182 !-- RVBLTEN V tendency due to
183 ! PBL parameterization (m/s^2)
184 !-- RTHBLTEN Theta tendency due to
185 ! PBL parameterization (K/s)
186 !-- RQVBLTEN Qv tendency due to
187 ! PBL parameterization (kg/kg/s)
188 !-- RQCBLTEN Qc tendency due to
189 ! PBL parameterization (kg/kg/s)
190 !-- RQIBLTEN Qi tendency due to
191 ! PBL parameterization (kg/kg/s)
192 !-- id WRF grid id (optional, only needed by turbine drag schemes)
193 !-- itimestep number of time steps
194 !-- GLW downward long wave flux at ground surface (W/m^2)
195 !-- GSW downward short wave flux at ground surface (W/m^2)
196 !-- EMISS surface emissivity (between 0 and 1)
197 !-- TSK surface temperature (K)
198 !-- TMN soil temperature at lower boundary (K)
199 !-- XLAND land mask (1 for land, 2 for water)
200 !-- ZNT roughness length (m)
201 !-- MAVAIL surface moisture availability (between 0 and 1)
202 !-- UST u* in similarity theory (m/s)
203 !-- MOL T* (similarity theory) (K)
204 !-- HOL PBL height over Monin-Obukhov length
205 !-- PBLH PBL height (m)
206 !-- CAPG heat capacity for soil (J/K/m^3)
207 !-- THC thermal inertia (Cal/cm/K/s^0.5)
208 !-- SNOWC flag indicating snow coverage (1 for snow cover)
209 !-- HFX upward heat flux at the surface (W/m^2)
210 !-- QFX upward moisture flux at the surface (kg/m^2/s)
211 !-- REGIME flag indicating PBL regime (stable, unstable, etc.)
212 !-- akhs sfc exchange coefficient of heat/moisture from MYJ
213 !-- akms sfc exchange coefficient of momentum from MYJ
214 !-- tke_pbl turbulence kinetic energy from PBL schemes (m^2/s^2)
215 !-- el_pbl length scale from PBL schemes (m)
216 !-- wu_tur turbulent flux of momentum (x) (m^2/s^2)
217 !-- wv_tur turbulent flux of momentum (y) (m^2/s^2)
218 !-- wt_tur turbulent flux of potential temperature (K m/s)
219 !-- wq_tur turbulent flux of water vapor (- m/s)
220 !-- te_temf Total energy from TEMF BL scheme
221 !-- km_temf Exchange coefficient for momentum from TEMF BL scheme
222 !-- kh_temf Exchange coefficient for heat from TEMF BL scheme
223 !-- shf_temf Sensible heat flux from TEMF BL scheme
224 !-- qf_temf Water vapor flux from TEMF BL scheme
225 !-- uw_temf Momentum flux in U direction from TEMF BL scheme
226 !-- vw_temf Momentum flux in V direction from TEMF BL scheme
227 !-- wupd_temf Updraft velocity from TEMF BL scheme
228 !-- mf_temf Mass flux from TEMF BL scheme
229 !-- thup_temf Updraft thetal from TEMF BL scheme
230 !-- qtup_temf Updraft qt from TEMF BL scheme
231 !-- qlup_temf Updraft ql from TEMF BL scheme
232 !-- cf3d_temf 3D cloud fraction from TEMF PBL
233 !-- cfm_temf Column cloud fraction from TEMF PBL
234 !-- exch_temf Surface exchange coefficient (as for moisture) from TEMF surface layer scheme
235 !-- flhc Surface exchange coefficient for heat (for TEMF)
236 !-- flqc Surface exchange coefficient for moisture (for TEMF)
237 !-- thz0 potential temperature at roughness length (K)
238 !-- uz0 u wind component at roughness length (m/s)
239 !-- vz0 v wind component at roughness length (m/s)
240 !-- qsfc specific humidity at lower boundary (kg/kg)
241 !-- th2 diagnostic 2-m theta from surface layer and lsm
242 !-- t2 diagnostic 2-m temperature from surface layer and lsm
243 !-- q2 diagnostic 2-m mixing ratio from surface layer and lsm
244 !-- lowlyr index of lowest model layer above ground
245 !-- rr dry air density (kg/m^3)
246 !-- u_phy u-velocity interpolated to theta points (m/s)
247 !-- v_phy v-velocity interpolated to theta points (m/s)
248 !-- th_phy potential temperature (K)
249 !-- p_phy pressure (Pa)
250 !-- pi_phy exner function (dimensionless)
251 !-- p8w pressure at full levels (Pa)
252 !-- t_phy temperature (K)
253 !-- dz8w dz between full levels (m)
254 !-- z height above sea level (m)
255 !-- DX horizontal space interval (m)
256 !-- DT time step (second)
257 !-- n_moist number of moisture species
258 !-- PSFC pressure at the surface (Pa)
262 !-- num_soil_layers number of soil layer
263 !-- IFSNOW ifsnow=1 for snow-cover effects
265 !-- P_QV species index for water vapor
266 !-- P_QC species index for cloud water
267 !-- P_QR species index for rain water
268 !-- P_QI species index for cloud ice
269 !-- P_QS species index for snow
270 !-- P_QG species index for graupel
271 !-- ids start index for i in domain
272 !-- ide end index for i in domain
273 !-- jds start index for j in domain
274 !-- jde end index for j in domain
275 !-- kds start index for k in domain
276 !-- kde end index for k in domain
277 !-- ims start index for i in memory
278 !-- ime end index for i in memory
279 !-- jms start index for j in memory
280 !-- jme end index for j in memory
281 !-- kms start index for k in memory
282 !-- kme end index for k in memory
283 !-- jts start index for j in tile
284 !-- jte end index for j in tile
285 !-- kts start index for k in tile
286 !-- kte end index for k in tile
288 !******************************************************************
289 !------------------------------------------------------------------
293 INTEGER, INTENT(IN ) :: bl_pbl_physics, ra_lw_physics,sf_sfclay_physics,sf_urban_physics
295 INTEGER, INTENT(IN ) :: ids,ide, jds,jde, kds,kde, &
296 ims,ime, jms,jme, kms,kme, &
299 INTEGER, DIMENSION(num_tiles), INTENT(IN) :: &
300 & i_start,i_end,j_start,j_end
302 INTEGER, INTENT(IN ) :: itimestep,STEPBL
303 INTEGER, DIMENSION( ims:ime , jms:jme ), &
304 INTENT(IN ) :: LOWLYR
306 LOGICAL, INTENT(IN ) :: warm_rain
308 LOGICAL, INTENT(IN ) :: DISHEAT ! (for HWRF)
312 REAL, INTENT(IN) :: gfs_alpha
315 REAL, DIMENSION(ims:ime,kms:kme,jms:jme), OPTIONAL, INTENT(IN ) :: RTHRATEN !Kwon for GFS PBL
316 REAL, DIMENSION( ims:ime , jms:jme ), &
317 OPTIONAL, INTENT(OUT) :: HPBL2D, EVAP2D, HEAT2D !Kwon for Shallow Convection
319 REAL, DIMENSION( kms:kme ), &
320 OPTIONAL, INTENT(IN ) :: znu, &
323 REAL, INTENT(IN ) :: DT,DX
324 REAL, INTENT(IN ),OPTIONAL :: bldt
325 REAL, INTENT(IN ),OPTIONAL :: curr_secs
326 LOGICAL, INTENT(IN ),OPTIONAL :: adapt_step_flag
327 REAL, INTENT(INOUT),OPTIONAL :: bldtacttime
328 ! Optional for Wind Turbine Parameterizations
329 REAL, DIMENSION( ims:ime, kms:kme ,jms:jme ), &
330 INTENT(IN), OPTIONAL :: phb
331 REAL, DIMENSION( ims:ime, jms:jme ), &
332 INTENT(IN), OPTIONAL :: xlat_u,xlong_u,xlat_v,xlong_v
335 REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), &
336 INTENT(IN ) :: p_phy, &
346 !3D Variables for camuwpbl scheme
347 REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), &
348 INTENT(IN ), OPTIONAL :: z_at_w, &
352 !2D Variables required by camuwpbl scheme
353 REAL, DIMENSION( ims:ime , jms:jme ), &
354 INTENT(INOUT ), OPTIONAL :: tauresx2d, &
361 REAL, DIMENSION( ims:ime , jms:jme ), &
362 INTENT(IN ) :: XLAND, &
371 REAL, DIMENSION( ims:ime, jms:jme ) , &
372 INTENT(INOUT) :: TSK, &
394 REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), &
395 INTENT(INOUT) :: RUBLTEN, &
398 EXCH_H,EXCH_M,TKE_PBL
400 REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), &
401 INTENT(OUT) :: WU_TUR,WV_TUR,WT_TUR,WQ_TUR
405 REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), &
406 &OPTIONAL, INTENT(INOUT) :: &
407 & qke,tsq,qsq,cov & !,k_m,k_h,k_q &
409 & ,el_mynn,dqke,qWT,qSHEAR,qBUOY,qDISS
412 INTEGER, OPTIONAL :: id
414 REAL, DIMENSION( ims:ime , jms:jme ), &
415 &OPTIONAL, INTENT(IN) :: &
419 INTEGER, OPTIONAL, INTENT(IN) :: grav_settling
425 REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), &
426 INTENT(OUT) :: EL_PBL
428 REAL , INTENT(IN ) :: u_frame, &
432 INTEGER, DIMENSION( ims:ime , jms:jme ), &
433 INTENT(INOUT) :: KPBL
435 REAL, DIMENSION( ims:ime , jms:jme ), &
436 INTENT(IN) :: XICE, SNOW, LH
438 ! Bep changes: variable added for urban
439 real, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) ::FRC_URB2D ! URBAN Landuse fraction
440 REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(INOUT) ::a_u_bep ! Implicit component for the momemtum in X-direction
441 REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(INOUT) ::a_v_bep ! Implicit component for the momemtum in Y-direction
442 REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(INOUT) ::a_t_bep ! Implicit component for the Pot. Temp.
443 REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(INOUT) ::a_q_bep ! Implicit component for Moisture
445 REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(INOUT) ::a_e_bep ! Implicit component for the TKE
446 REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(INOUT) ::b_u_bep ! Explicit component for the momemtum in X-direction
447 REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(INOUT) ::b_v_bep ! Explicit component for the momemtum in Y-direction
448 REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(INOUT) ::b_t_bep ! Explicit component for the Pot. Temp.
449 REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(INOUT) ::b_q_bep ! Explicit component for Moisture
451 REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(INOUT) ::b_e_bep ! Explicit component for the TKE
453 REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(INOUT) ::dlg_bep ! Height above ground (L_ground in formula (24) of the BLM paper).
454 REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(INOUT) ::dl_u_bep ! Length scale (lb in formula (22) ofthe BLM paper).
455 ! urban surface and volumes
456 REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(INOUT) ::sf_bep ! surfaces
457 REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(INOUT) ::vl_bep ! volumes
460 ! New variables for TEMF scheme
461 REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), &
462 INTENT(INOUT) :: te_temf
463 REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), &
464 INTENT( OUT) :: km_temf, kh_temf, &
465 shf_temf,qf_temf,uw_temf,vw_temf, &
466 wupd_temf,mf_temf,thup_temf,qtup_temf, &
468 REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), &
469 INTENT(INOUT) :: flhc,flqc
470 REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), &
471 INTENT( OUT) :: hd_temf, lcl_temf, hct_temf, cfm_temf
472 REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), &
473 INTENT(INOUT) :: exch_temf
480 ! Flags relating to the optional tendency arrays declared above
481 ! Models that carry the optional tendencies will provdide the
482 ! optional arguments at compile time; these flags all the model
483 ! to determine at run-time whether a particular tracer is in
486 LOGICAL, INTENT(IN), OPTIONAL :: &
494 REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), &
495 OPTIONAL, INTENT(INOUT) :: &
496 ! optional moisture tracers
497 ! 2 time levels; if only one then use CURR
498 qv_curr, qc_curr, qr_curr &
499 ,qi_curr, qs_curr, qg_curr &
500 ,rqvblten,rqcblten,rqrblten &
501 ,rqiblten,rqsblten,rqgblten
503 REAL, DIMENSION( ims:ime, jms:jme ) , &
505 INTENT(INOUT) :: HOL, &
508 REAL, DIMENSION( ims:ime, jms:jme ) , &
512 INTEGER, OPTIONAL, INTENT(IN) :: gwd_opt
513 REAL, OPTIONAL, INTENT(IN) :: p_top
515 real, dimension( ims:ime, kms:kme, jms:jme ) , &
517 intent(inout ) :: dtaux3d, &
520 real, dimension( ims:ime, jms:jme ) , &
522 intent(inout ) :: dusfcg, &
525 real, dimension( ims:ime, jms:jme ) , &
527 intent(in ) :: var2d, &
532 REAL, OPTIONAL, DIMENSION( ims:ime , jms:jme ), & !mchen
533 INTENT(IN ) :: CTOPO, &
536 ! Variables and Diagnostic for QNSE and EDKF JP
537 INTEGER, INTENT(IN) :: mfshconv
539 REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), OPTIONAL, &
540 INTENT(OUT) :: massflux_EDKF, entr_EDKF, detr_EDKF &
541 ,thl_up, thv_up, rt_up &
542 ,rv_up, rc_up, u_up, v_up &
547 REAL, DIMENSION( ims:ime, kms:kme, jms:jme ) ::v_phytmp
548 REAL, DIMENSION( ims:ime, kms:kme, jms:jme ) ::u_phytmp
550 REAL, DIMENSION( ims:ime, jms:jme ) :: TSKOLD, &
556 ! make these allocatable depending on the setting of idiff
557 ! Typically, we try to avoide allocating and deallocating local storage like this
558 ! so as not to fragment the stack. But at this point, the idiff = 1 case is disabled
559 ! (set to 0 for all cases) and has to be set manually by users who want to work with
560 ! it. When it becomes a more standard option, this should be redone, either defining
561 ! these as state with package clauses to turn them on and off and passing them in,
562 ! or pass in an integer flag that can be used to dimension the arrays to 1:1:1 as
563 ! local variables. JM 20100316
565 REAL, ALLOCATABLE, DIMENSION( :, :, : )::a_u ! Implicit component for the momemtum in X-direction
566 REAL, ALLOCATABLE, DIMENSION( :, :, : )::a_v ! Implicit component for the momemtum in Y-direction
567 REAL, ALLOCATABLE, DIMENSION( :, :, : )::a_t ! Implicit component for the Pot. Temp.
568 REAL, ALLOCATABLE, DIMENSION( :, :, : )::a_q ! Implicit component for the water vapor
570 REAL, ALLOCATABLE, DIMENSION( :, :, : )::b_u ! Explicit component for the momemtum in X-direction
571 REAL, ALLOCATABLE, DIMENSION( :, :, : )::b_v ! Explicit component for the momemtum in Y-direction
572 REAL, ALLOCATABLE, DIMENSION( :, :, : )::b_t ! Explicit component for the Pot. Temp.
573 REAL, ALLOCATABLE, DIMENSION( :, :, : )::b_q ! Explicit component for the water vapor
575 REAL, ALLOCATABLE, DIMENSION( :, :, : )::sf ! surfaces
576 REAL, ALLOCATABLE, DIMENSION( :, :, : )::vl ! volumes
582 INTEGER :: i,J,K,NK,jj,ij,its,ite,jts,jte
585 LOGICAL :: flag_myjsfc
586 LOGICAL :: flag_qv, flag_qc, flag_qr, flag_qi, flag_qs, flag_qg
587 CHARACTER*256 :: message
589 LOGICAL :: run_param , doing_adapt_dt , decided
591 integer iu_bep,iurb,idiff
592 real seamask,thsk,zzz,unew,vnew,tnew,qnew,umom,vmom
594 !------------------------------------------------------------------
596 !!!!!!!if using BEP set flag_bep to true
597 SELECT CASE(sf_urban_physics)
608 SELECT CASE(sf_sfclay_physics)
615 flag_qv = .FALSE. ; IF ( PRESENT( F_QV ) ) flag_qv = F_QV
616 flag_qc = .FALSE. ; IF ( PRESENT( F_QC ) ) flag_qc = F_QC
617 flag_qr = .FALSE. ; IF ( PRESENT( F_QR ) ) flag_qr = F_QR
618 flag_qi = .FALSE. ; IF ( PRESENT( F_QI ) ) flag_qi = F_QI
619 flag_qs = .FALSE. ; IF ( PRESENT( F_QS ) ) flag_qs = F_QS
620 flag_qg = .FALSE. ; IF ( PRESENT( F_QG ) ) flag_qg = F_QG
622 !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'
623 !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'
625 if (bl_pbl_physics .eq. 0) return
627 ! RAINBL in mm (Accumulation between PBL calls)
629 doing_adapt_dt = .FALSE.
630 IF ( PRESENT(adapt_step_flag) ) THEN
631 IF ( adapt_step_flag ) THEN
632 doing_adapt_dt = .TRUE.
633 IF ( bldtacttime .eq. 0. ) THEN
634 bldtacttime = CURR_SECS + bldt*60.
639 ! Do we run through this scheme or not?
641 ! Test 1: If this is the initial model time, then yes.
643 ! Test 2: If the user asked for the pbl to be run every time step, then yes.
645 ! Test 3: If not adaptive dt, and this is on the requested pbl frequency, then yes.
646 ! MOD(ITIMESTEP,STEPBL)=0
647 ! Test 4: If using adaptive dt and the current time is past the last requested activate pbl time, then yes.
648 ! CURR_SECS >= BLDTACTTIME
650 ! If we do run through the scheme, we set the flag run_param to TRUE and we set the decided flag
651 ! to TRUE. The decided flag says that one of these tests was able to say "yes", run the scheme.
652 ! We only proceed to other tests if the previous tests all have left decided as FALSE.
654 ! If we set run_param to TRUE and this is adaptive time stepping, we set the time to the next
659 IF ( ( .NOT. decided ) .AND. &
660 ( itimestep .EQ. 1 ) ) THEN
665 IF ( PRESENT(bldt) )THEN
666 IF ( ( .NOT. decided ) .AND. &
667 ( ( bldt .EQ. 0. ) .OR. ( stepbl .EQ. 1 ) ) ) THEN
672 IF ( ( .NOT. decided ) .AND. &
673 ( stepbl .EQ. 1 ) ) THEN
679 IF ( ( .NOT. decided ) .AND. &
680 ( .NOT. doing_adapt_dt ) .AND. &
681 ( MOD(itimestep,stepbl) .EQ. 0 ) ) THEN
686 IF ( ( .NOT. decided ) .AND. &
687 ( doing_adapt_dt ) .AND. &
688 ( curr_secs .GE. bldtacttime ) ) THEN
691 bldtacttime = curr_secs + bldt*60
697 IF (ra_lw_physics .gt. 0) radiation = .true.
703 ! PBL schemes need PBL time step for updates
705 if (PRESENT(adapt_step_flag)) then
706 if (adapt_step_flag) then
715 if (PRESENT(BLDT)) then
716 if (bldt .eq. 0) then
720 IF ( curr_secs .LT. 2. * dt ) THEN
721 call wrf_message("WARNING: When using an adaptive time-step the boundary layer"// &
722 " time-step should be 0 (i.e., equivalent to model time-step). ")
723 call wrf_message("In order to proceed, for boundary layer calculations, the "// &
724 "boundary layer time-step"// &
725 " will be rounded to the nearest minute," )
726 call wrf_message("possibly resulting in innacurate results.")
738 !!Alberto. If idiff=1, then compute the tendencies at the end in the routine diff3d
739 !!Alberto. If idiff=0, then compute the tendencies in each PBL routine (standard version).
742 ! Added this else clause so that idiff is always initialized regardless of which core we are using
746 IF ( idiff .EQ. 1 ) THEN
747 ALLOCATE (a_u(ims:ime,kms:kme,jms:jme)) ! Implicit component for the momemtum in X-direction
748 ALLOCATE (a_v(ims:ime,kms:kme,jms:jme)) ! Implicit component for the momemtum in Y-direction
749 ALLOCATE (a_t(ims:ime,kms:kme,jms:jme)) ! Implicit component for the Pot. Temp.
750 ALLOCATE (a_q(ims:ime,kms:kme,jms:jme)) ! Implicit component for the water vapor
751 ALLOCATE (b_u(ims:ime,kms:kme,jms:jme)) ! Explicit component for the momemtum in X-direction
752 ALLOCATE (b_v(ims:ime,kms:kme,jms:jme)) ! Explicit component for the momemtum in Y-direction
753 ALLOCATE (b_t(ims:ime,kms:kme,jms:jme)) ! Explicit component for the Pot. Temp.
754 ALLOCATE (b_q(ims:ime,kms:kme,jms:jme)) ! Explicit component for the water vapor
755 ALLOCATE (sf(ims:ime,kms:kme,jms:jme) ) ! surfaces
756 ALLOCATE (vl(ims:ime,kms:kme,jms:jme) ) ! volumes
762 !$OMP PRIVATE ( ij,i,j,k )
764 DO ij = 1 , num_tiles
765 DO j=j_start(ij),j_end(ij)
766 DO i=i_start(ij),i_end(ij)
771 ! REVERSE ORDER IN THE VERTICAL DIRECTION
773 ! testing change later
776 v_phytmp(i,k,j)=v_phy(i,k,j)+v_frame
777 u_phytmp(i,k,j)=u_phy(i,k,j)+u_frame
782 PSFC(I,J)=p8w(I,kms,J)
784 DO k=kts,min(kte+1,kde)
788 IF ( PRESENT( RQCBLTEN )) RQCBLTEN(I,K,J)=0.
789 IF ( PRESENT( RQVBLTEN )) RQVBLTEN(I,K,J)=0.
792 IF (flag_QI .AND. PRESENT(RQIBLTEN) ) THEN
793 DO k=kts,min(kte+1,kde)
800 IF (bl_pbl_physics .EQ. QNSEPBLSCHEME ) THEN
801 ! use u_phytmp instead of wthv_mf, and v_phytmp instead of lm_bl89
802 DO j=j_start(ij),j_end(ij)
803 DO i=i_start(ij),i_end(ij)
813 IF ( idiff.eq.1 ) THEN
815 ! Here we should put a switch:
816 ! if we do not use BEP, just initialize the values of the a, and b to zero, except for the lowest model level,
817 ! where the heat and momentum fluxes are introduced
818 ! if we use BEP, use the values computed by BEP weigthed by the urban fraction.
819 ! for the moment I put a simple "if" but it should be changed to a more elegant way after(using the CASE, maybe?)
821 ! This is the more general way to go, however some of these variables (e. g. a_t, a_q) may be zero nearly all time.
822 ! if we need to be as tight as possible for the memory we can think how to reduce the storage.
824 ! This stuff is becoming large, probably better to put in a subroutine
826 ! preparing the a, b, sf, and vl terms
829 do j=j_start(ij),j_end(ij)
830 do i=i_start(ij),i_end(ij)
832 a_u(i,k,j)=a_u_bep(i,k,j)
833 a_v(i,k,j)=a_v_bep(i,k,j)
834 a_t(i,k,j)=a_t_bep(i,k,j)
835 a_q(i,k,j)=a_q_bep(i,k,j)
836 b_u(i,k,j)=b_u_bep(i,k,j)
837 b_v(i,k,j)=b_v_bep(i,k,j)
838 b_t(i,k,j)=b_t_bep(i,k,j)
839 b_q(i,k,j)=b_q_bep(i,k,j)
840 vl(i,k,j)=vl_bep(i,k,j)
841 sf(i,k,j)=sf_bep(i,k,j)
847 do j=j_start(ij),j_end(ij)
848 do i=i_start(ij),i_end(ij)
862 ! fix the values for the surface fluxes (source/sink terms)
863 ! here for momentum the resolution is done implicitely
864 ! while for heat and moisture is done explicitely
865 a_u(i,1,j)=(-ust(I,J)*ust(I,J))/dz8w(i,1,j)/((u_phy(i,1,j)**2+v_phy(i,1,j)**2.)**.5)
866 a_v(i,1,j)=(-ust(I,J)*ust(I,J))/dz8w(i,1,j)/((u_phy(i,1,j)**2+v_phy(i,1,j)**2.)**.5)
867 b_t(i,1,j)=hfx(i,j)/rho(i,1,j)/CP/dz8w(i,1,j)
868 b_q(i,1,j)=qfx(i,j)/rho(i,1,j)/dz8w(i,1,j)
869 !! if you want to solve also the heat and moisture fluxes implicitely, uncomment the following lines.
870 !! (of course you will need the values of thz0,qz0,akhs).
871 ! b_t(i,1,j)=akhs(i,j)*(thz0(I,J))/dz8w(i,1,j)
872 ! b_q(i,1,j)=akhs(i,j)*(qz0(I,J))/dz8w(i,1,j)
873 ! a_t(i,1,j)=-1.*akhs(i,j)/dz8w(i,1,j)
874 ! a_q(i,1,j)=-1.*akhs(i,j)/dz8w(i,1,j)
875 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
885 !Alberto. From this point if some PBL scheme has a non local term
886 ! (not dependent on the local values of the variable)
887 ! this can be added to b_t, b_q, or b_u, b_v.
893 !$OMP END PARALLEL DO
896 !$OMP PRIVATE ( ij, i,j,k, its, ite, jts, jte )
897 DO ij = 1 , num_tiles
904 pbl_select: SELECT CASE(bl_pbl_physics)
908 ! WRITE( message , * ) 'Calling TEMF PBL scheme, timestep = ', itimestep
909 ! CALL wrf_message ( message )
910 ! print *,'Calling TEMF PBL scheme'
911 CALL wrf_debug(100,'in TEMF PBL')
912 IF ( PRESENT( qv_curr ) .AND. PRESENT( qc_curr ) .AND. &
913 PRESENT( qi_curr ) .AND. &
914 PRESENT( rqvblten ) .AND. PRESENT( rqcblten ) .AND. &
915 PRESENT( rqiblten ) .AND. &
916 PRESENT( te_temf ) .AND. PRESENT( cfm_temf ) .AND. &
917 PRESENT( hol ) ) THEN
919 U3D=u_phytmp,V3D=v_phytmp,TH3D=th_phy,T3D=t_phy &
920 ,QV3D=qv_curr,QC3D=qc_curr,QI3D=qi_curr &
921 ,P3D=p_phy,P3DI=p8w,PI3D=pi_phy,RHO=rho &
922 ,RUBLTEN=rublten,RVBLTEN=rvblten &
923 ,RTHBLTEN=rthblten,RQVBLTEN=rqvblten &
924 ,RQCBLTEN=rqcblten,RQIBLTEN=rqiblten &
926 ,g=g,cp=cp,rcp=rcp,r_d=r_d,r_v=r_v,cpv=cpv &
927 ,Z=z,XLV=XLV,PSFC=PSFC &
928 ,MUT=mut,P_TOP=p_top &
929 ,ZNT=znt,HT=ht,UST=ust,ZOL=zol,HOL=hol,HPBL=pblh &
930 ,PSIM=psim,PSIH=psih,XLAND=xland &
931 ,HFX=hfx,QFX=qfx,TSK=tskold,QSFC=qsfc,GZ1OZ0=gz1oz0 &
932 ,U10=u10,V10=v10,T2=t2 &
933 ,WSPD=wspd,BR=br,DT=dtbl,DTMIN=dtmin,KPBL2D=kpbl &
934 ,SVP1=svp1,SVP2=svp2,SVP3=svp3,SVPT0=svpt0 &
935 ,EP1=ep_1,EP2=ep_2,KARMAN=karman,EOMEG=eomeg &
937 ,te_temf=te_temf,kh_temf=kh_temf,km_temf=km_temf &
938 ,shf_temf=shf_temf,qf_temf=qf_temf &
939 ,uw_temf=uw_temf,vw_temf=vw_temf &
940 ,hd_temf=hd_temf,lcl_temf=lcl_temf,hct_temf=hct_temf &
941 ,wupd_temf=wupd_temf,mf_temf=mf_temf &
942 ,thup_temf=thup_temf,qtup_temf=qtup_temf,qlup_temf=qlup_temf &
943 ,cf3d_temf=cf3d_temf,cfm_temf=cfm_temf &
944 ,flhc=flhc,flqc=flqc,exch_temf=exch_temf &
946 ,IDS=ids,IDE=ide,JDS=jds,JDE=jde,KDS=kds,KDE=kde &
947 ,IMS=ims,IME=ime,JMS=jms,JME=jme,KMS=kms,KME=kme &
948 ,ITS=its,ITE=ite,JTS=jts,JTE=jte,KTS=kts,KTE=kte &
951 CALL wrf_error_fatal('Lack arguments to call TEMF pbl')
955 CALL wrf_debug(100,'in YSU PBL')
956 IF ( PRESENT( qv_curr ) .AND. PRESENT( qc_curr ) .AND. &
957 PRESENT( qi_curr ) .AND. &
958 PRESENT( rqvblten ) .AND. PRESENT( rqcblten ) .AND. &
959 PRESENT( rqiblten ) .AND. &
960 PRESENT( hol ) ) THEN
963 U3D=u_phytmp,V3D=v_phytmp,TH3D=th_phy,T3D=t_phy &
964 ,QV3D=qv_curr,QC3D=qc_curr,QI3D=qi_curr &
965 ,P3D=p_phy,P3DI=p8w,PI3D=pi_phy &
966 ,RUBLTEN=rublten,RVBLTEN=rvblten &
967 ,RTHBLTEN=rthblten,RQVBLTEN=rqvblten &
968 ,RQCBLTEN=rqcblten,RQIBLTEN=rqiblten &
970 ,CP=cp,G=g,ROVCP=rcp,RD=r_D,ROVG=rovg &
971 ,DZ8W=dz8w,XLV=XLV,RV=r_v,PSFC=PSFC &
972 ,ZNU=znu,ZNW=znw,MUT=mut,P_TOP=p_top &
973 ,ZNT=znt,UST=ust,HPBL=pblh &
974 ,PSIM=psim,PSIH=psih,XLAND=xland &
975 ,HFX=hfx,QFX=qfx,GZ1OZ0=gz1oz0 &
978 ,CTOPO=ctopo,CTOPO2=ctopo2 &
980 ,WSPD=wspd,BR=br,DT=dtbl,KPBL2D=kpbl &
981 ,EP1=ep_1,EP2=ep_2,KARMAN=karman &
982 ,EXCH_H=exch_h,REGIME=regime &
983 ,IDS=ids,IDE=ide,JDS=jds,JDE=jde,KDS=kds,KDE=kde &
984 ,IMS=ims,IME=ime,JMS=jms,JME=jme,KMS=kms,KME=kme &
985 ,ITS=its,ITE=ite,JTS=jts,JTE=jte,KTS=kts,KTE=kte &
988 WRITE ( message , FMT = '(A,7(L1,1X))' ) &
997 PRESENT( qv_curr ) , &
998 PRESENT( qc_curr ) , &
999 PRESENT( qi_curr ) , &
1000 PRESENT( rqvblten ) , &
1001 PRESENT( rqcblten ) , &
1002 PRESENT( rqiblten ) , &
1004 CALL wrf_debug(0,message)
1005 CALL wrf_error_fatal('Lack arguments to call YSU pbl')
1009 IF ( PRESENT( qv_curr ) .AND. PRESENT( qc_curr ) .AND. &
1010 PRESENT( rqvblten ) .AND. PRESENT( rqcblten ) .AND. &
1011 PRESENT( hol ) .AND. &
1014 CALL wrf_debug(100,'in MRF')
1016 U3D=u_phytmp,V3D=v_phytmp,TH3D=th_phy,T3D=t_phy &
1020 ,P3D=p_phy,PI3D=pi_phy &
1021 ,RUBLTEN=rublten,RVBLTEN=rvblten &
1022 ,RTHBLTEN=rthblten,RQVBLTEN=rqvblten &
1023 ,RQCBLTEN=rqcblten,RQIBLTEN=rqiblten &
1024 ,CP=cp,G=g,ROVCP=rcp,R=r_d,ROVG=rovg &
1025 ,DZ8W=dz8w,Z=z,XLV=xlv,RV=r_v,PSFC=psfc &
1027 ,ZNT=znt,UST=ust,ZOL=zol,HOL=hol &
1028 ,PBL=pblh,PSIM=psim,PSIH=psih &
1029 ,XLAND=xland,HFX=hfx,QFX=qfx,TSK=tskold &
1030 ,GZ1OZ0=gz1oz0,WSPD=wspd,BR=br &
1031 ,DT=dtbl,DTMIN=dtmin,KPBL2D=kpbl &
1032 ,SVP1=svp1,SVP2=svp2,SVP3=svp3,SVPT0=svpt0 &
1033 ,EP1=ep_1,EP2=ep_2,KARMAN=karman,EOMEG=eomeg &
1034 ,STBOLT=stbolt,REGIME=regime &
1036 ,IDS=ids,IDE=ide,JDS=jds,JDE=jde,KDS=kds,KDE=kde &
1037 ,IMS=ims,IME=ime,JMS=jms,JME=jme,KMS=kms,KME=kme &
1038 ,ITS=its,ITE=ite,JTS=jts,JTE=jte,KTS=kts,KTE=kte &
1041 WRITE ( message , FMT = '(A,5(L1,1X))' ) &
1048 PRESENT( qv_curr ) , &
1049 PRESENT( qc_curr ) , &
1050 PRESENT( rqvblten ) , &
1051 PRESENT( rqcblten ) , &
1053 CALL wrf_debug(0,message)
1054 CALL wrf_error_fatal('Lack arguments to call MRF pbl')
1058 IF ( PRESENT( qv_curr ) .AND. PRESENT( qc_curr ) .AND. &
1059 PRESENT( rqvblten ) .AND. PRESENT( rqcblten ) .AND. &
1061 CALL wrf_debug(100,'in GFS')
1063 U3D=u_phytmp,V3D=v_phytmp &
1064 ,TH3D=th_phy,T3D=t_phy &
1065 ,QV3D=qv_curr,QC3D=qc_curr,QI3D=qi_curr &
1066 ,P3D=p_phy,PI3D=pi_phy &
1067 ,RUBLTEN=rublten,RVBLTEN=rvblten,RTHBLTEN=rthblten &
1068 ,RQVBLTEN=rqvblten,RQCBLTEN=rqcblten &
1069 ,RQIBLTEN=rqiblten &
1070 ,CP=cp,G=g,ROVCP=rcp,R=r_d,ROVG=rovg &
1071 ,DZ8W=dz8w,z=z,PSFC=psfc &
1072 ,UST=ust,PBL=pblh,PSIM=psim,PSIH=psih &
1073 ,HFX=hfx,QFX=qfx,TSK=tskold,GZ1OZ0=gz1oz0 &
1075 ,DT=dtbl,KPBL2D=kpbl,EP1=ep_1,KARMAN=karman &
1082 ,P_QI=p_qi,P_FIRST_SCALAR=param_first_scalar &
1083 ,IDS=ids,IDE=ide,JDS=jds,JDE=jde,KDS=kds,KDE=kde &
1084 ,IMS=ims,IME=ime,JMS=jms,JME=jme,KMS=kms,KME=kme &
1085 ,ITS=its,ITE=ite,JTS=jts,JTE=jte,KTS=kts,KTE=kte &
1088 WRITE ( message , FMT = '(A,4(L1,1X))' ) &
1094 PRESENT( qv_curr ) , &
1095 PRESENT( qc_curr ) , &
1096 PRESENT( rqvblten ) , &
1098 CALL wrf_debug(0,message)
1099 CALL wrf_error_fatal('Lack arguments to call GFS pbl')
1103 CASE (GFS2011SCHEME)
1104 IF ( PRESENT( qv_curr ) .AND. PRESENT( qc_curr ) .AND. &
1105 PRESENT( rqvblten ) .AND. PRESENT( rqcblten ) .AND. &
1107 CALL wrf_debug(100,'in GFS')
1109 U3D=u_phytmp,V3D=v_phytmp &
1110 ,TH3D=th_phy,T3D=t_phy &
1111 ,QV3D=qv_curr,QC3D=qc_curr,QI3D=qi_curr &
1112 ,P3D=p_phy,PI3D=pi_phy &
1113 ,RUBLTEN=rublten,RVBLTEN=rvblten,RTHBLTEN=rthblten &
1114 ,RQVBLTEN=rqvblten,RQCBLTEN=rqcblten &
1115 ,RQIBLTEN=rqiblten &
1116 ,CP=cp,G=g,ROVCP=rcp,R=r_d,ROVG=rovg &
1117 ,DZ8W=dz8w,z=z,PSFC=psfc &
1118 ,UST=ust,PBL=pblh,PSIM=psim,PSIH=psih &
1119 ,HFX=hfx,QFX=qfx,TSK=tskold,GZ1OZ0=gz1oz0 &
1121 ,DT=dtbl,KPBL2D=kpbl,EP1=ep_1,KARMAN=karman &
1125 ,RTHRATEN=RTHRATEN &
1126 ,HPBL2D=HPBL2D, EVAP2D=EVAP2D, HEAT2D=HEAT2D & !Kwon add FOR SHAL. CON.
1127 ,P_QI=p_qi,P_FIRST_SCALAR=param_first_scalar &
1128 ,IDS=ids,IDE=ide,JDS=jds,JDE=jde,KDS=kds,KDE=kde &
1129 ,IMS=ims,IME=ime,JMS=jms,JME=jme,KMS=kms,KME=kme &
1130 ,ITS=its,ITE=ite,JTS=jts,JTE=jte,KTS=kts,KTE=kte &
1133 WRITE ( message , FMT = '(A,4(L1,1X))' ) &
1139 PRESENT( qv_curr ) , &
1140 PRESENT( qc_curr ) , &
1141 PRESENT( rqvblten ) , &
1143 CALL wrf_debug(0,message)
1144 CALL wrf_error_fatal('Lack arguments to call GFS pbl')
1149 IF ( PRESENT( qv_curr ) .AND. PRESENT( qc_curr ) .AND. &
1150 PRESENT( rqvblten ) .AND. PRESENT( rqcblten ) .AND. &
1153 CALL wrf_debug(100,'in MYJPBL')
1154 IF ( .not.flag_bep .and. idiff.ne.1) THEN
1155 CALL myjpbl(DT=dt,STEPBL=stepbl,HT=ht,DZ=dz8w &
1156 ,PMID=p_phy,PINT=p8w,TH=th_phy,T=t_phy,EXNER=pi_phy &
1157 ,QV=qv_curr,QCW=qc_curr,QCI=qi_curr,QCS=qs_curr & !BSF
1158 ,QCR=qr_curr,QCG=qg_curr & !BSF
1159 ,U=u_phy,V=v_phy,RHO=rho &
1160 ,TSK=tsk,QSFC=qsfc,CHKLOWQ=chklowq,THZ0=thz0 &
1161 ,QZ0=qz0,UZ0=uz0,VZ0=vz0 &
1163 ,XLAND=xland,SICE=xice,SNOW=snow &
1164 ,TKE_MYJ=tke_pbl,EXCH_H=exch_h,USTAR=ust,ZNT=znt &
1165 ,EL_MYJ=el_pbl,PBLH=pblh,KPBL=kpbl,CT=ct &
1166 ,AKHS=akhs,AKMS=akms,ELFLX=lh,MIXHT=mixht &
1167 ,RUBLTEN=rublten,RVBLTEN=rvblten,RTHBLTEN=rthblten &
1168 ,RQVBLTEN=rqvblten,RQCBLTEN=rqcblten &
1169 ,RQIBLTEN=rqiblten,RQSBLTEN=rqsblten & !BSF
1170 ,RQRBLTEN=rqrblten,RQGBLTEN=rqgblten & !BSF
1171 ,IDS=ids,IDE=ide,JDS=jds,JDE=jde,KDS=kds,KDE=kde &
1172 ,IMS=ims,IME=ime,JMS=jms,JME=jme,KMS=kms,KME=kme &
1173 ,ITS=its,ITE=ite,JTS=jts,JTE=jte,KTS=kts,KTE=kte &
1175 ELSE !(SF_URBAN_PHYSICS.EQ.2)
1178 CALL myjurb(IDIFF=idiff,FLAG_BEP=flag_bep &
1179 ,DT=dtbl,STEPBL=stepbl,HT=ht,DZ=dz8w &
1180 ,PMID=p_phy,PINT=p8w,TH=th_phy,T=t_phy,EXNER=pi_phy &
1181 ,QV=qv_curr, CWM=qc_curr &
1182 ,U=u_phy,V=v_phy,RHO=rho &
1183 ,TSK=tsk,QSFC=qsfc,CHKLOWQ=chklowq,THZ0=thz0 &
1184 ,QZ0=qz0,UZ0=uz0,VZ0=vz0 &
1186 ,XLAND=xland,SICE=xice,SNOW=snow &
1187 ,TKE_MYJ=tke_pbl,EXCH_H=exch_h,EXCH_M=exch_m &
1188 ,USTAR=ust,ZNT=znt &
1189 ,EL_MYJ=el_pbl,PBLH=pblh,KPBL=kpbl,CT=ct &
1190 ,AKHS=akhs,AKMS=akms,ELFLX=lh &
1191 ,RUBLTEN=rublten,RVBLTEN=rvblten,RTHBLTEN=rthblten &
1192 ,RQVBLTEN=rqvblten,RQCBLTEN=rqcblten &
1194 ,FRC_URB2D=frc_urb2d &
1195 ,A_U_BEP=a_u_bep,A_V_BEP=a_v_bep,A_T_BEP=a_t_bep &
1197 ,A_E_BEP=a_e_bep,B_U_BEP=b_u_bep,B_V_BEP=b_v_bep &
1198 ,B_T_BEP=b_t_bep,B_Q_BEP=b_q_bep &
1199 ,B_E_BEP=b_e_bep,DLG_BEP=dlg_bep &
1200 ,DL_U_BEP=dl_u_bep,SF_BEP=sf_bep,VL_BEP=vl_bep &
1202 ,IDS=ids,IDE=ide,JDS=jds,JDE=jde,KDS=kds,KDE=kde &
1203 ,IMS=ims,IME=ime,JMS=jms,JME=jme,KMS=kms,KME=kme &
1204 ,ITS=its,ITE=ite,JTS=jts,JTE=jte,KTS=kts,KTE=kte &
1209 WRITE ( message , FMT = '(A,4(L1,1X))' ) &
1215 PRESENT( qv_curr ) , &
1216 PRESENT( qc_curr ) , &
1217 PRESENT( rqvblten ) , &
1219 CALL wrf_debug(0,message)
1220 CALL wrf_error_fatal('Lack arguments to call MYJ pbl')
1223 CASE (QNSEPBLSCHEME)
1224 IF ( PRESENT( qv_curr ) .AND. PRESENT( qc_curr ) .AND. &
1225 PRESENT( rqvblten ) .AND. PRESENT( rqcblten ) .AND. &
1227 IF ( MFSHCONV.EQ.1 )THEN
1228 CALL wrf_debug(100,'in MFSHCONVPBL')
1229 CALL mfshconvpbl(DT=dt,STEPBL=stepbl,HT=ht,DZ=dz8w &
1230 ,RHO=rho,PMID=p_phy,PINT=p8w,TH=th_phy,EXNER=pi_phy &
1231 ,QV=qv_curr, QC=qc_curr &
1233 ,HFX=hfx, QFX=qfx,TKE=tke_pbl &
1234 ,RUBLTEN=rublten,RVBLTEN=rvblten,RTHBLTEN=rthblten &
1235 ,RQVBLTEN=rqvblten,RQCBLTEN=rqcblten &
1236 ,IDS=IDS,IDE=IDE,JDS=JDS,JDE=JDE,KDS=KDS,KDE=KDE &
1237 ,IMS=IMS,IME=IME,JMS=JMS,JME=JME,KMS=KMS,KME=KME &
1238 ,ITS=ITS,ITE=ITE,JTS=JTS,JTE=JTE,KTS=KTS,KTE=KTE &
1239 ,KRR=2,MASSFLUX_EDKF=massflux_EDKF &
1240 ,ENTR_EDKF=entr_EDKF, DETR_EDKF=detr_EDKF &
1241 ,THL_UP=thl_up, THV_UP=thv_up, RT_UP=rt_up &
1242 ,RV_UP=rv_up,RC_UP=rc_up, U_UP=u_up, V_UP=v_up &
1243 ,FRAC_UP=frac_up, RC_MF=rc_mf,WTHV=u_phytmp &
1244 ,PLM_BL89=v_phytmp )
1247 CALL wrf_debug(100,'in QNSEPBL')
1249 DT=dt,STEPBL=stepbl,HT=ht,DZ=dz8w &
1250 ,PMID=p_phy,PINT=p8w,TH=th_phy,T=t_phy,EXNER=pi_phy &
1251 ,QV=qv_curr, CWM=qc_curr &
1252 ,U=u_phy,V=v_phy,RHO=rho &
1253 ,TSK=tsk,QSFC=qsfc,CHKLOWQ=chklowq,THZ0=thz0 &
1254 ,QZ0=qz0,UZ0=uz0,VZ0=vz0,CORF=f &
1256 ,XLAND=xland,SICE=xice,SNOW=snow &
1257 ,TKE=tke_pbl,EXCH_H=exch_h,EXCH_M=exch_m,USTAR=ust,ZNT=znt &
1258 ,EL_MYJ=el_pbl,PBLH=pblh,KPBL=kpbl,CT=ct &
1259 ,AKHS=akhs,AKMS=akms,ELFLX=lh &
1260 ,HFX=hfx,WTHV_MF=u_phytmp,LM_BL89=v_phytmp &
1261 ,RUBLTEN=rublten,RVBLTEN=rvblten,RTHBLTEN=rthblten &
1262 ,RQVBLTEN=rqvblten,RQCBLTEN=rqcblten &
1263 ,IDS=ids,IDE=ide,JDS=jds,JDE=jde,KDS=kds,KDE=kde &
1264 ,IMS=ims,IME=ime,JMS=jms,JME=jme,KMS=kms,KME=kme &
1265 ,ITS=its,ITE=ite,JTS=jts,JTE=jte,KTS=kts,KTE=kte &
1267 ! note the tendencies have been added inside qnse
1268 ! IF ( PRESENT (MFSHCONV) )THEN
1269 ! IF (MFSHCONV.EQ.1)THEN
1270 ! rublten(:,:,:)=rublten(:,:,:)+rumften(:,:,:)
1271 ! rvblten(:,:,:)=rvblten(:,:,:)+rvmften(:,:,:)
1272 ! rthblten(:,:,:)=rthblten(:,:,:)+rthmften(:,:,:)
1273 ! rqvblten(:,:,:)=rqvblten(:,:,:)+rqvmften(:,:,:)
1274 ! rqcblten(:,:,:)=rqcblten(:,:,:)+rqcmften(:,:,:)
1279 WRITE ( message , FMT = '(A,4(L1,1X))' ) &
1285 PRESENT( qv_curr ) , &
1286 PRESENT( qc_curr ) , &
1287 PRESENT( rqvblten ) , &
1289 CALL wrf_debug(0,message)
1290 CALL wrf_error_fatal('Lack arguments to call QNSE pbl')
1293 CASE (QNSEPBL09SCHEME)
1294 IF ( PRESENT( qv_curr ) .AND. PRESENT( qc_curr ) .AND. &
1295 PRESENT( rqvblten ) .AND. PRESENT( rqcblten ) .AND. &
1297 CALL wrf_debug(100,'in QNSEPBL09')
1299 DT=dt,STEPBL=stepbl,HT=ht,DZ=dz8w &
1300 ,PMID=p_phy,PINT=p8w,TH=th_phy,T=t_phy,EXNER=pi_phy &
1301 ,QV=qv_curr, CWM=qc_curr &
1302 ,U=u_phy,V=v_phy,RHO=rho &
1303 ,TSK=tsk,QSFC=qsfc,CHKLOWQ=chklowq,THZ0=thz0 &
1304 ,QZ0=qz0,UZ0=uz0,VZ0=vz0,CORF=f &
1306 ,XLAND=xland,SICE=xice,SNOW=snow &
1307 ,TKE=tke_pbl,EXCH_H=exch_h,EXCH_M=exch_m,USTAR=ust,ZNT=znt &
1308 ,EL_MYJ=el_pbl,PBLH=pblh,KPBL=kpbl,CT=ct &
1309 ,AKHS=akhs,AKMS=akms,ELFLX=lh &
1310 ,RUBLTEN=rublten,RVBLTEN=rvblten,RTHBLTEN=rthblten &
1311 ,RQVBLTEN=rqvblten,RQCBLTEN=rqcblten &
1312 ,IDS=ids,IDE=ide,JDS=jds,JDE=jde,KDS=kds,KDE=kde &
1313 ,IMS=ims,IME=ime,JMS=jms,JME=jme,KMS=kms,KME=kme &
1314 ,ITS=its,ITE=ite,JTS=jts,JTE=jte,KTS=kts,KTE=kte &
1317 WRITE ( message , FMT = '(A,4(L1,1X))' ) &
1323 PRESENT( qv_curr ) , &
1324 PRESENT( qc_curr ) , &
1325 PRESENT( rqvblten ) , &
1327 CALL wrf_debug(0,message)
1328 CALL wrf_error_fatal('Lack arguments to call old QNSE pbl')
1333 !! These are values that are not supplied to pbl driver, but are required by ACM
1334 IF ( PRESENT( qv_curr ) .AND. PRESENT( qc_curr ) .AND. &
1335 PRESENT( rqvblten ) .AND. PRESENT( rqcblten ) .AND. &
1337 CALL wrf_debug(100,'in ACM PBL')
1340 XTIME=itimestep, DTPBL=dtbl, ZNW=znw, SIGMAH=znu &
1341 ,U3D=u_phytmp, V3D=v_phytmp, PP3D=p_phy, DZ8W=dz8w, TH3D=th_phy, T3D=t_phy &
1342 ,QV3D=qv_curr, QC3D=qc_curr, QI3D=qi_curr, RR3D=rho &
1343 ,UST=UST, HFX=HFX, QFX=QFX, TSK=tsk &
1344 ,PSFC=PSFC, EP1=EP_1, G=g, ROVCP=rcp,RD=r_D,CPD=cp &
1345 ,PBLH=pblh, KPBL2D=kpbl, REGIME=regime &
1346 ,GZ1OZ0=gz1oz0,WSPD=wspd,PSIM=psim, MUT=mut &
1347 ,RUBLTEN=rublten,RVBLTEN=rvblten,RTHBLTEN=rthblten &
1348 ,RQVBLTEN=rqvblten,RQCBLTEN=rqcblten,RQIBLTEN=rqiblten &
1349 ,IDS=ids,IDE=ide,JDS=jds,JDE=jde,KDS=kds,KDE=kde &
1350 ,IMS=ims,IME=ime,JMS=jms,JME=jme,KMS=kms,KME=kme &
1351 ,ITS=its,ITE=ite,JTS=jts,JTE=jte,KTS=kts,KTE=kte &
1354 WRITE ( message , FMT = '(A,4(L1,1X))' ) &
1360 PRESENT( qv_curr ) , &
1361 PRESENT( qc_curr ) , &
1362 PRESENT( rqvblten ) , &
1364 CALL wrf_debug(0,message)
1365 CALL wrf_error_fatal('Lack arguments to call ACM2 pbl')
1370 CASE (MYNNPBLSCHEME2, MYNNPBLSCHEME3)
1372 IF ( PRESENT( qv_curr ) .AND. PRESENT( qc_curr ) .AND. &
1373 PRESENT( rqvblten ) .AND. PRESENT( rqcblten ) .AND. &
1374 & PRESENT(qke) .AND. PRESENT(tsq) .AND. &
1375 & PRESENT(qsq) .AND. PRESENT(cov) .AND. &
1376 & PRESENT(rmol) .AND. PRESENT(el_mynn).AND. &
1377 & PRESENT(qcg) .AND. PRESENT(ch) .AND. &
1378 & PRESENT(grav_settling) ) THEN
1380 CALL wrf_debug(100,'in MYNNPBL')
1382 IF (itimestep==1) THEN
1388 CALL mynn_bl_driver(&
1389 &initflag=initflag,&
1390 &grav_settling=grav_settling,&
1393 &u=u_phy,v=v_phy,th=th_phy,qv=qv_curr,qc=qc_curr,&
1394 &p=p_phy,exner=pi_phy,rho=rho,&
1395 &xland=xland,ts=tsk,qsfc=qsfc,qcg=qcg,ps=psfc,&
1396 &ust=ust,ch=ch,hfx=hfx,qfx=qfx,rmol=rmol,wspd=wspd,&
1397 &Qke=qke,Tsq=tsq,Qsq=qsq,Cov=cov,&
1398 &Du=rublten,Dv=rvblten,Dth=rthblten,&
1399 &Dqv=rqvblten,Dqc=rqcblten,&
1400 &k_h=exch_h,k_m=exch_m,&
1402 !startJOE -added for extra output
1403 &,el_mynn=el_mynn,dqke=dqke &
1404 &,qWT=qWT,qSHEAR=qSHEAR,qBUOY=qBUOY,qDISS=qDISS &
1406 ,IDS=ids,IDE=ide,JDS=jds,JDE=jde,KDS=kds,KDE=kde &
1407 ,IMS=ims,IME=ime,JMS=jms,JME=jme,KMS=kms,KME=kme &
1408 ,ITS=its,ITE=ite,JTS=jts,JTE=jte,KTS=kts,KTE=kte &
1414 .AND.PRESENT(xlat_u).AND.PRESENT(xlong_u) &
1415 .AND.PRESENT(xlat_v).AND.PRESENT(xlong_v)) THEN
1416 CALL turbine_drag( &
1418 &,PHB=phb,u=u_phy,v=v_phy &
1419 &,XLAT_U=xlat_u,XLONG_U=xlong_u &
1420 &,XLAT_V=xlat_v,XLONG_V=xlong_v &
1421 &,DX=dx,DZ=dz8w,DT=dt &
1422 &,QKE=qke,DU=rublten,DV=rvblten &
1423 &,IDS=ids,IDE=ide,JDS=jds,JDE=jde,KDS=kds,KDE=kde &
1424 &,IMS=ims,IME=ime,JMS=jms,JME=jme,KMS=kms,KME=kme &
1425 &,ITS=its,ITE=ite,JTS=jts,JTE=jte,KTS=kts,KTE=kte &
1430 WRITE ( message , FMT = '(A,12(L1,1X))' ) &
1443 'grav_settling = ', &
1444 PRESENT( qv_curr ) , &
1445 PRESENT( qc_curr ) , &
1446 PRESENT( rqvblten ) , &
1447 PRESENT( rqcblten ) , &
1455 PRESENT( grav_settling)
1456 CALL wrf_debug(0,message)
1457 CALL wrf_error_fatal('Lack arguments to call MYNN pbl')
1462 CALL wrf_debug(100,'in boulac')
1464 CALL BOULAC(FRC_URB2D=frc_urb2d,IDIFF=idiff,FLAG_BEP=flag_bep &
1465 ,DZ8W=dz8w,DT=dt,U_PHY=u_phytmp &
1466 ,V_PHY=v_phytmp,TH_PHY=th_phy &
1467 ,RHO=rho,QV_CURR=qv_curr,HFX=hfx &
1468 ,QFX=qfx,USTAR=ust,CP=cp,G=g &
1469 ,RUBLTEN=rublten,RVBLTEN=rvblten,RTHBLTEN=rthblten &
1470 ,RQVBLTEN=rqvblten,RQCBLTEN=rqvblten &
1471 ,TKE=tke_pbl,DLK=el_pbl,WU=wu_tur,WV=wv_tur,WT=wt_tur,WQ=wq_tur &
1472 ,EXCH_H=exch_h,EXCH_M=exch_m,PBLH=pblh &
1473 ,A_U_BEP=a_u_bep,A_V_BEP=a_v_bep,A_T_BEP=a_t_bep &
1475 ,A_E_BEP=a_e_bep,B_U_BEP=b_u_bep,B_V_BEP=b_v_bep &
1476 ,B_T_BEP=b_t_bep,B_E_BEP=b_e_bep,DLG_BEP=dlg_bep &
1478 ,DL_U_BEP=dl_u_bep,SF_BEP=sf_bep,VL_BEP=vl_bep &
1479 ,IDS=ids,IDE=ide,JDS=jds,JDE=jde,KDS=kds,KDE=kde &
1480 ,IMS=ims,IME=ime,JMS=jms,JME=jme,KMS=kms,KME=kme &
1481 ,ITS=its,ITE=ite,JTS=jts,JTE=jte,KTS=kts,KTE=kte )
1483 CASE (CAMUWPBLSCHEME)
1485 IF ( PRESENT( z_at_w ) .AND. PRESENT( tauresx2d )) THEN
1486 CALL wrf_debug(100,'in camuwpbl')
1488 CALL CAMUWPBL(DT=dt,U_PHY=u_phy,V_PHY=v_phy,TH_PHY=th_phy,RHO=rho &
1489 ,QV_CURR=qv_curr,HFX=hfx,QFX=qfx,USTAR=ust,RUBLTEN=rublten &
1490 ,RVBLTEN=rvblten,RTHBLTEN=rthblten,RQVBLTEN=rqvblten &
1491 ,RQCBLTEN=rqcblten,TKE_PBL=tke_pbl,PBLH2D=pblh,KPBL2D=kpbl &
1492 ,P8W=p8w,P_PHY=p_phy,Z=z,T_PHY=t_phy,QC_CURR=qc_curr &
1493 ,QI_CURR=qi_curr,Z_AT_W=z_at_w,CLDFRA=cldfra,HT=ht &
1494 ,RTHRATENLW=rthratenlw,EXNER=pi_phy,ITIMESTEP=itimestep &
1495 ,TAURESX2D=tauresx2d,TAURESY2D=tauresy2d,KVH3D=exch_h,KVM3D=exch_m &
1496 ,TPERT2D=tpert2d,QPERT2D=qpert2d,WPERT2D=wpert2d &
1497 ,IDS=ids,IDE=ide, JDS=jds,JDE=jde, KDS=kds,KDE=kde &
1498 ,IMS=ims,IME=ime, JMS=jms,JME=jme, KMS=kms,KME=kme &
1499 ,ITS=its,ITE=ite, JTS=jts,JTE=jte, KTS=kts,KTE=kte )
1502 CALL wrf_debug(0,message)
1503 CALL wrf_error_fatal('Lack arguments to call CAMUWPBL pbl')
1510 WRITE( message , * ) 'The pbl option does not exist: bl_pbl_physics = ', bl_pbl_physics
1511 CALL wrf_error_fatal ( message )
1513 END SELECT pbl_select
1515 IF (PRESENT(dtaux3d)) THEN
1516 IF(gwd_opt .EQ. 1)THEN
1518 U3D=u_phytmp,V3D=v_phytmp,T3D=t_phy &
1520 ,P3D=p_phy,P3DI=p8w,PI3D=pi_phy,Z=z &
1521 ,RUBLTEN=rublten,RVBLTEN=rvblten &
1522 ,DTAUX3D=dtaux3d,DTAUY3D=dtauy3d &
1523 ,DUSFCG=dusfcg,DVSFCG=dvsfcg &
1524 ,VAR2D=var2d,OC12D=oc12d &
1525 ,OA2D1=oa1,OA2D2=oa2,OA2D3=oa3,OA2D4=oa4 &
1526 ,OL2D1=ol1,OL2D2=ol2,OL2D3=ol3,OL2D4=ol4 &
1527 ,ZNU=znu,ZNW=znw,MUT=mut,P_TOP=p_top &
1529 ,RV=r_v,EP1=ep_1,PI=3.141592653 &
1530 ,DT=dtbl,DX=dx,KPBL2D=kpbl,ITIMESTEP=itimestep &
1531 ,IDS=ids,IDE=ide,JDS=jds,JDE=jde,KDS=kds,KDE=kde &
1532 ,IMS=ims,IME=ime,JMS=jms,JME=jme,KMS=kms,KME=kme &
1533 ,ITS=its,ITE=ite,JTS=jts,JTE=jte,KTS=kts,KTE=kte )
1540 IF (idiff.eq.1) THEN
1542 !Alberto: here we call the general routine to solve the diffusion
1543 ! + all the source/sink terms.
1544 ! the only thing that should be passed from the PBL schemes is the value of the exch_h, and exch_m
1545 ! (and the non local terms, if present, through the b).
1546 ! So, this routine can be used by any of the previous schemes. We only need to pass the right variables
1547 ! (and eliminate the computation of the tendencies from the previous routines, to avoid doing twice the job).
1548 ! As I explain below, in the routine, here we could extract the vertical turbulent
1549 ! fluxes (something that will be general for all the routines).
1550 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1553 CALL diff3d (DT=dtbl,CP=cp,DZ=dz8w,TH=th_phy,QV=qv_curr,QC=qc_curr,T=t_phy &
1554 ,U=u_phy,V=v_phy,RHO=rho,EXCH_H=exch_h &
1556 ,RUBLTEN=rublten,RVBLTEN=rvblten,RTHBLTEN=rthblten &
1557 ,RQVBLTEN=rqvblten,RQCBLTEN=rqcblten &
1558 ,WU=wu_tur,WV=wv_tur,WT=wt_tur,WQ=wq_tur &
1559 ,A_U=a_u,A_V=a_v,A_T=a_t,A_Q=a_q &
1560 ,B_U=b_u,B_V=b_v,B_T=b_t,B_Q=b_q &
1562 ,IDS=ids,IDE=ide,JDS=jds,JDE=jde,KDS=kds,KDE=kde &
1563 ,IMS=ims,IME=ime,JMS=jms,JME=jme,KMS=kms,KME=kme &
1564 ,ITS=its,ITE=ite,JTS=jts,JTE=jte,KTS=kts,KTE=kte)
1566 DEALLOCATE (a_u) ! Implicit component for the momemtum in X-direction
1567 DEALLOCATE (a_v) ! Implicit component for the momemtum in Y-direction
1568 DEALLOCATE (a_t) ! Implicit component for the Pot. Temp.
1569 DEALLOCATE (a_q) ! Implicit component for the water vapor
1570 DEALLOCATE (b_u) ! Explicit component for the momemtum in X-direction
1571 DEALLOCATE (b_v) ! Explicit component for the momemtum in Y-direction
1572 DEALLOCATE (b_t) ! Explicit component for the Pot. Temp.
1573 DEALLOCATE (b_q) ! Explicit component for the water vapor
1574 DEALLOCATE (sf ) ! surfaces
1575 DEALLOCATE (vl ) ! volumes
1581 !$OMP END PARALLEL DO
1585 END SUBROUTINE pbl_driver
1587 !=============================================================================
1588 SUBROUTINE diff3d(DT,CP,DZ,TH ,QV,QC,T,U,V,RHO &
1590 ,RUBLTEN,RVBLTEN,RTHBLTEN &
1591 ,RQVBLTEN,RQCBLTEN &
1596 ,IDS,IDE,JDS,JDE,KDS,KDE &
1597 ,IMS,IME,JMS,JME,KMS,KME &
1598 ,ITS,ITE,JTS,JTE,KTS,KTE &
1600 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1601 ! Subroutine written by Alberto Martilli, CIEMAT, Spain,
1602 ! e-mail:alberto_martilli@ciemat.es
1604 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1606 ! This routine solves the vertical diffusion
1607 ! + other source/sink terms (surface fluxes, building drag, non local terms, etc.)
1608 ! for U,V, potential temperature and moisture. The equation should be written
1609 ! as follow, for a generic variable M:
1612 ! ---- =---- ---(rho*K----)+AM+B
1614 ! where A and B are the implict and explcit coefficients of the source/sink terms
1615 ! (at the lowest level the surface fluxes should go in these terms)
1616 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1617 !-----------------------------------------------------------------------
1621 !----------------------------------------------------------------------
1622 INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE &
1623 & ,IMS,IME,JMS,JME,KMS,KME &
1624 & ,ITS,ITE,JTS,JTE,KTS,KTE
1628 REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(IN) :: DZ ! Depth of vertical levels
1629 REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(IN) :: TH ! Potential Temperature
1630 REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(IN) :: QV ! water vapor mixing ratio (kg/kg)
1631 REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(IN) :: QC ! cloud water mixing ratio (kg/kg)
1632 REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(IN) :: T ! temperature
1633 REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(IN) :: U ! X-compnent of the wind
1634 REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(IN) :: V ! Y-compnent of the wind
1635 REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(IN) :: RHO ! Air Density
1636 REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(IN) :: EXCH_H ! Turbulent coefficient for heat
1637 REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(IN) :: EXCH_M ! Turbulent coefficient for momentum
1639 REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(IN) :: A_U ! Implicit coefficient for DRAG (x -component)
1640 REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(IN) :: B_U ! Explicit coefficient for DRAG (x -component)
1641 REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(IN) :: A_V ! Implicit coefficient for DRAG (y -component)
1642 REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(IN) :: B_V ! Explicit coefficient for DRAG (y -component)
1643 REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(IN) :: A_T ! Implicit coefficient for Heat flux from buildings
1644 REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(IN) :: B_T ! Explicit coefficient for Heat flux from buildings
1645 REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(IN) :: A_Q ! Implicit coefficient for moisture flux
1646 REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(IN) :: B_Q ! Explicit coefficient for moisture flux
1648 REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(IN) :: VL ! fraction of air volume in the grid cell
1649 REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(IN) :: SF ! fraction of air at the face of the grid cell
1651 REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(OUT) :: RUBLTEN ! tendency for x-wind component
1652 REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(OUT) :: RVBLTEN ! tendency for y-wind component
1653 REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(OUT) :: RTHBLTEN ! tendency for Potential Temperature
1654 REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(OUT) :: RQVBLTEN ! tendency for water vapor mixing ratio (kg/kg)
1655 REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(OUT) :: RQCBLTEN ! tendency for cloud water mixing ratio (kg/kg)
1656 REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(OUT) :: WU ! turbulent flux of momentum (x)
1657 REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(OUT) :: WV ! turbulent flux of momentum (y)
1658 REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(OUT) :: WT ! turbulent flux of potential temperature
1659 REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(OUT) :: WQ ! turbulent flux of water vapor
1662 ! locals (same meaning as above, but 1D)
1664 real u1d(kms:kme),v1d(kms:kme),exch_h1d(kms:kme)
1665 real the1d(kms:kme) ! Equivalent potential temperature
1666 real exch_m1d(kms:kme),qv1d(kms:kme),qc1d(kms:kme)
1667 real dz1d(kms:kme),rho1d(kms:kme),rhoz1d(kms:kme)
1668 real sf1d(kms:kme),vl1d(kms:kme)
1669 real a_u1d(kms:kme),b_u1d(kms:kme)
1670 real a_v1d(kms:kme),b_v1d(kms:kme)
1671 real a_t1d(kms:kme),b_t1d(kms:kme)
1672 real a_q1d(kms:kme),b_q1d(kms:kme)
1673 real a_qc1d(kms:kme),b_qc1d(kms:kme)
1674 real wu1d(kms:kme),wv1d(kms:kme),wt1d(kms:kme),wq1d(kms:kme),wqc1d(kms:kme)
1678 !----------------------------------------------------------------------
1705 ! put three D variables in temporary 1D variables
1710 the1d(k)=TH(i,k,j)*(QC(i,k,j)*(-ELOCP/T(i,k,j))+1)
1729 exch_h1d(k)=exch_h(i,k,j)
1730 exch_m1d(k)=exch_m(i,k,j)
1736 rhoz1d(kts)=rho1d(kts)
1738 rhoz1d(k)=(rho1d(k)*dz1d(k-1)+rho1d(k-1)*dz1d(k))/ &
1739 & (dz1d(k-1)+dz1d(k))
1741 rhoz1d(kte+1)=rho1d(kte)
1744 ! solve the diffusion for x-component of the wind
1746 call diff(kms,kme,kts,kte,dt,u1d,rho1d,rhoz1d,exch_m1d,a_u1d,b_u1d,sf1d, &
1749 ! solve the diffusion for y-component of the wind
1751 call diff(kms,kme,kts,kte,dt,v1d,rho1d,rhoz1d,exch_m1d,a_v1d,b_v1d,sf1d, &
1754 ! solve the diffusion for equivalent potential temperature
1756 call diff(kms,kme,kts,kte,dt,the1d,rho1d,rhoz1d,exch_h1d,a_t1d,b_t1d,sf1d, &
1759 ! solve the diffusion for the water vapor mixing ratio
1761 call diff(kms,kme,kts,kte,dt,qv1d,rho1d,rhoz1d,exch_h1d,a_q1d,b_q1d,sf1d, &
1764 ! solve the diffusion for the cloud water mixing ratio
1766 call diff(kms,kme,kts,kte,dt,qc1d,rho1d,rhoz1d,exch_h1d,a_qc1d,b_qc1d,sf1d, &
1770 ! compute the tendencies
1773 rublten(i,k,j)=(u1d(k)-u(i,k,j))/dt
1774 rvblten(i,k,j)=(v1d(k)-v(i,k,j))/dt
1775 thnew=the1d(k)/(QC(i,k,j)*(-ELOCP/T(i,k,j))+1)
1776 rthblten(i,k,j)=(thnew-th(i,k,j))/dt
1777 rqvblten(i,k,j)=(qv1d(k)-qv(i,k,j))/dt
1778 rqcblten(i,k,j)=(qc1d(k)-qc(i,k,j))/dt
1789 END SUBROUTINE diff3d
1790 ! ===6=8===============================================================72
1791 ! ===6=8===============================================================72
1793 subroutine diff(kms,kme,kts,kte,dt,co,da,daz,cd,aa,bb,sf,vl,dz,fc)
1795 !------------------------------------------------------------------------
1796 ! Calculation of the diffusion in 1D
1797 !------------------------------------------------------------------------
1799 ! nz : number of points
1800 ! iz1 : first calculated point
1801 ! co : concentration of the variable of interest
1802 ! dz : vertical levels
1803 ! cd : diffusion coefficients
1804 ! da : density of the air at the center
1805 ! daz : density of the air at the face
1806 ! dt : diffusion time step
1808 ! co :concentration of the variable of interest
1811 ! cddz : constant terms in the equations
1812 !---------------------------------------------------------------------
1816 integer kms,kme,kts,kte
1818 real co(kms:kme),cd(kms:kme),dz(kms:kme)
1819 real da(kms:kme),daz(kms:kme)
1820 real cddz(kms:kme),fc(kms:kme),df(kms:kme)
1821 real a(kms:kme,3),c(kms:kme)
1822 real sf(kms:kme),vl(kms:kme)
1823 real aa(kms:kme),bb(kms:kme)
1826 ! Compute cddz=2*cd/dz
1828 cddz(kts)=sf(kts)*daz(kts)*cd(kts)/dz(kts)
1830 cddz(iz)=2.*sf(iz)*daz(iz)*cd(iz)/(dz(iz)+dz(iz-1))
1832 cddz(kte+1)=sf(kte+1)*daz(kte+1)*cd(kte+1)/dz(kte)
1840 a(iz,1)=-cddz(iz)*dt/dzv/da(iz)
1841 a(iz,2)=1+dt*(cddz(iz)+cddz(iz+1))/dzv/da(iz)-aa(iz)*dt
1842 a(iz,3)=-cddz(iz+1)*dt/dzv/da(iz)
1843 c(iz)=co(iz)+bb(iz)*dt
1846 do iz=kte-(izf-1),kte
1852 call invert (kms,kme,kts,kte,a,c,co)
1854 !let compute the fluxes, as diagnostic variable
1861 fc(iz)=-(cddz(iz)*(co(iz)-co(iz-1)))/da(iz)
1868 ! ===6=8===============================================================72
1870 subroutine invert(kms,kme,kts,kte,a,c,x)
1872 !ccccccccccccccccccccccccccccccc
1873 ! Aim: Inversion and resolution of a tridiagonal matrix
1876 ! a(*,1) lower diagonal (Ai,i-1)
1877 ! a(*,2) principal diagonal (Ai,i)
1878 ! a(*,3) upper diagonal (Ai,i+1)
1882 !ccccccccccccccccccccccccccccccc
1885 integer kms,kme,kts,kte,in
1886 real a(kms:kme,3),c(kms:kme),x(kms:kme)
1889 c(in)=c(in)-a(in,3)*c(in+1)/a(in+1,2)
1890 a(in,2)=a(in,2)-a(in,3)*a(in+1,1)/a(in+1,2)
1894 c(in)=c(in)-a(in,1)*c(in-1)/a(in-1,2)
1902 end subroutine invert
1904 ! ===6=8===============================================================72
1918 END MODULE module_pbl_driver