1 !WRF:MODEL_LAYER:PHYSICS
5 ! USE module_model_constants
7 REAL, PARAMETER :: RIC = 0.25 ! critical Richardson number
8 REAL, PARAMETER :: CRANKP = 0.5 ! CRANK-NIC PARAMETER
12 !-------------------------------------------------------------------
13 SUBROUTINE ACMPBL(XTIME, DTPBL, ZNW, SIGMAH, &
14 U3D, V3D, PP3D, DZ8W, TH3D, T3D, &
15 QV3D, QC3D, QI3D, RR3D, & !! Moisture
19 PBLH, KPBL2D, REGIME, &
20 GZ1OZ0, WSPD, PSIM, MUT, &
21 RUBLTEN, RVBLTEN, RTHBLTEN, &
22 RQVBLTEN, RQCBLTEN, RQIBLTEN, &
23 ids,ide, jds,jde, kds,kde, &
24 ims,ime, jms,jme, kms,kme, &
25 its,ite, jts,jte, kts,kte)
26 !**********************************************************************
28 ! THIS MODULE COMPUTES VERTICAL MIXING IN AND ABOVE THE PBL ACCORDING TO
29 ! THE ASYMMETRICAL CONVECTIVE MODEL, VERSION 2 (ACM2), WHICH IS A COMBINED
30 ! LOCAL NON-LOCAL CLOSURE SCHEME BASED ON THE ORIGINAL ACM (PLEIM AND CHANG 1992)
33 ! Pleim (2007) A combined local and non-local closure model for the atmospheric
34 ! boundary layer. Part1: Model description and testing.
36 ! Pleim (2007) A combined local and non-local closure model for the atmospheric
37 ! boundary layer. Part2: Application and evaluation in a mesoscale
38 ! meteorology model. JAMC, 46, 1396-1409
41 ! AX 3/2005 - developed WRF version based on the MM5 PX LSM
42 ! RG and JP 7/2006 - Finished WRF adaptation
44 !**********************************************************************
48 !-- XTIME Time since simulation start (min)
49 !-- DTPBL PBL time step
50 !-- ZNW Sigma at full layer
51 !-- SIGMAH Sigma at half layer
52 !-- U3D 3D u-velocity interpolated to theta points (m/s)
53 !-- V3D 3D v-velocity interpolated to theta points (m/s)
54 !-- PP3D Pressure at half levels (Pa)
55 !-- DZ8W dz between full levels (m)
56 !-- TH3D Potential Temperature (K)
57 !-- T3D Temperature (K)
58 !-- QV3D 3D water vapor mixing ratio (Kg/Kg)
59 !-- QC3D 3D cloud mixing ratio (Kg/Kg)
60 !-- QI3D 3D ice mixing ratio (Kg/Kg)
61 !-- RR3D 3D dry air density (kg/m^3)
62 !-- UST Friction Velocity (m/s)
63 !-- HFX Upward heat flux at the surface (w/m^2)
64 !-- QFX Upward moisture flux at the surface (Kg/m^2/s)
65 !-- TSK Surface temperature (K)
66 !-- PSFC Pressure at the surface (Pa)
67 !-- EP1 Constant for virtual temperature (r_v/r_d-1) (dimensionless)
70 !-- RD gas constant for dry air (j/kg/k)
71 !-- CPD heat capacity at constant pressure for dry air (j/kg/k)
72 !-- GZ1OZ0 log(z/z0) where z0 is roughness length
73 !-- WSPD wind speed at lowest model level (m/s)
74 !-- PSIM similarity stability function for momentum
75 !-- MUT Total Mu : Psfc - Ptop
77 !-- ids start index for i in domain
78 !-- ide end index for i in domain
79 !-- jds start index for j in domain
80 !-- jde end index for j in domain
81 !-- kds start index for k in domain
82 !-- kde end index for k in domain
83 !-- ims start index for i in memory
84 !-- ime end index for i in memory
85 !-- jms start index for j in memory
86 !-- jme end index for j in memory
87 !-- kms start index for k in memory
88 !-- kme end index for k in memory
89 !-- jts start index for j in tile
90 !-- jte end index for j in tile
91 !-- kts start index for k in tile
92 !-- kte end index for k in tile
95 !-- PBLH PBL height (m)
96 !-- KPBL2D K index for PBL layer
97 !-- REGIME Flag indicating PBL regime (stable, unstable, etc.)
98 !-- RUBLTEN U tendency due to PBL parameterization (m/s^2)
99 !-- RVBLTEN V tendency due to PBL parameterization (m/s^2)
100 !-- RTHBLTEN Theta tendency due to PBL parameterization (K/s)
101 !-- RQVBLTEN Qv tendency due to PBL parameterization (kg/kg/s)
102 !-- RQCBLTEN Qc tendency due to PBL parameterization (kg/kg/s)
103 !-- RQIBLTEN Qi tendency due to PBL parameterization (kg/kg/s)
105 !-------------------------------------------------------------------
109 ! DECLARATIONS - INTEGER
110 INTEGER, INTENT(IN ) :: ids,ide, jds,jde, kds,kde, &
111 ims,ime, jms,jme, kms,kme, &
112 its,ite, jts,jte, kts,kte, XTIME
114 ! DECLARATIONS - REAL
115 REAL, INTENT(IN) :: DTPBL, EP1, &
117 REAL, DIMENSION( kms:kme ), INTENT(IN) :: ZNW, SIGMAH
118 REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), &
119 INTENT(IN) :: U3D, V3D, &
123 REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: UST
124 REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN) :: &
127 INTEGER, DIMENSION( ims:ime, jms:jme ), &
128 INTENT(OUT ) :: KPBL2D
129 REAL, DIMENSION( ims:ime, jms:jme ), &
130 INTENT(INOUT) :: PBLH
131 REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: REGIME
132 REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN) :: &
136 REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), &
137 INTENT(INOUT) :: RUBLTEN, RVBLTEN, &
138 RTHBLTEN, RQVBLTEN, &
146 REAL, DIMENSION( kts:kte ) :: DSIGH, DSIGHI, DSIGFI
147 REAL, DIMENSION( 0:kte ) :: SIGMAF
149 REAL, PARAMETER :: KARMAN = 0.4
160 DSIGH(K) = SIGMAF(K) - SIGMAF(K-1)
161 DSIGHI(K) = 1.0 / DSIGH(K)
165 DSIGFI(K) = 1.0 / (SIGMAH(K+1) - SIGMAH(K))
168 DSIGFI(kte) = DSIGFI(kte-1)
171 CALL ACM2D(j=J,xtime=XTIME, dtpbl=DTPBL, sigmaf=SIGMAF, sigmah=SIGMAH &
172 ,dsigfi=DSIGFI,dsighi=DSIGHI,dsigh=DSIGH &
173 ,us=u3d(ims,kms,j),vs=v3d(ims,kms,j) &
174 ,theta=th3d(ims,kms,j),tt=t3d(ims,kms,j) &
175 ,qvs=qv3d(ims,kms,j),qcs=qc3d(ims,kms,j) &
176 ,qis=qi3d(ims,kms,j),dzf=DZ8W(ims,kms,j) &
177 ,densx=RR3D(ims,kms,j) &
178 ,utnp=rublten(ims,kms,j),vtnp=rvblten(ims,kms,j) &
179 ,ttnp=rthblten(ims,kms,j),qvtnp=rqvblten(ims,kms,j) &
180 ,qctnp=rqcblten(ims,kms,j),qitnp=rqiblten(ims,kms,j) &
181 ,cpd=cpd,g=g,rovcp=rovcp,rd=rd,rdt=rdt &
182 ,psfcpa=psfc(ims,j),ust=ust(ims,j) &
184 ,regime=regime(ims,j),psim=psim(ims,j) &
185 ,hfx=hfx(ims,j),qfx=qfx(ims,j) &
186 ,tg=tsk(ims,j),gz1oz0=gz1oz0(ims,j) &
187 ,wspd=wspd(ims,j) ,klpbl=kpbl2d(ims,j) &
189 ,ep1=ep1,karman=karman &
190 ,ids=ids,ide=ide, jds=jds,jde=jde, kds=kds,kde=kde &
191 ,ims=ims,ime=ime, jms=jms,jme=jme, kms=kms,kme=kme &
192 ,its=its,ite=ite, jts=jts,jte=jte, kts=kts,kte=kte )
195 END SUBROUTINE ACMPBL
197 !--------------------------------------------------------------------
198 SUBROUTINE ACM2D(j,XTIME, DTPBL, sigmaf, sigmah &
199 ,dsigfi,dsighi,dsigh &
200 ,us,vs,theta,tt,qvs,qcs,qis &
201 ,dzf,densx,utnp,vtnp,ttnp,qvtnp,qctnp,qitnp &
202 ,cpd,g,rovcp,rd,rdt,psfcpa,ust &
204 ,hfx,qfx,tg,gz1oz0,wspd ,klpbl &
207 ,ids,ide, jds,jde, kds,kde &
208 ,ims,ime, jms,jme, kms,kme &
209 ,its,ite, jts,jte, kts,kte )
211 ! USE module_wrf_error
217 REAL, DIMENSION( 0:kte ), INTENT(IN) :: SIGMAF
218 REAL, DIMENSION( kms:kme ), INTENT(IN) :: SIGMAH
219 REAL, DIMENSION( kts:kte ), INTENT(IN) :: DSIGH, DSIGHI, DSIGFI
220 REAL , INTENT(IN) :: DTPBL, G, RD,ep1,karman,CPD,ROVCP,RDT
221 REAL , DIMENSION( ims:ime ), INTENT(INOUT) :: PBL, UST
223 REAL , DIMENSION( ims:ime, kms:kme ), INTENT(IN) :: US,VS, THETA, TT, &
225 REAL, DIMENSION( ims:ime, kms:kme ), intent(in) :: DZF
226 REAL, DIMENSION( ims:ime, kms:kme ), intent(inout) :: utnp, &
232 real, dimension( ims:ime ), intent(in ) :: psfcpa
233 real, dimension( ims:ime ), intent(in ) :: tg
234 real, dimension( ims:ime ), intent(inout) :: regime
235 real, dimension( ims:ime ), intent(in) :: wspd, psim, gz1oz0
236 real, dimension( ims:ime ), intent(in) :: hfx, qfx
237 real, dimension( ims:ime ), intent(in) :: mut
240 INTEGER, DIMENSION( ims:ime ), INTENT(OUT):: KLPBL
241 INTEGER, INTENT(IN) :: XTIME
242 integer, intent(in ) :: ids,ide, jds,jde, kds,kde, &
243 ims,ime, jms,jme, kms,kme, &
244 its,ite, jts,jte, kts,kte, j
245 !--------------------------------------------------------------------
249 INTEGER, DIMENSION( its:ite ) :: KPBLH, NOCONV
252 REAL :: TVCON, WSS, TCONV, TH1, TOG, DTMP, WSSQ
254 REAL, DIMENSION( its:ite ) :: FINT, PSTAR, CPAIR
255 REAL, DIMENSION( its:ite, kts:kte ) :: THETAV, RIB, &
256 EDDYZ, UX, VX, THETAX, &
258 REAL, DIMENSION( its:ite, 0:kte ) :: ZF
259 REAL, DIMENSION( its:ite) :: WST, TST, QST, USTM, TSTV
260 REAL, DIMENSION( its:ite ) :: PBLSIG, MOL
261 REAL :: FINTT, ZMIX, UMIX, VMIX
262 REAL :: TMPFX, TMPVTCON, TMPP, TMPTHS, TMPTH1, TMPVCONV, WS1, DTH
263 REAL :: A,TST12,RL,ZFUNC
264 ! REAL, PARAMETER :: KARMAN = 0.4
267 INTEGER :: KL, jtf, ktf, itf, KMIX
269 character*512 :: message
270 !-----initialize vertical tendencies and
293 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
294 !!! Compute Micromet Scaling variables, not availiable in WRF for ACM
296 cpair(i) = CPD * (1.0 + 0.84 * QVS(I,1)) ! J/(K KG)
297 TMPFX = HFX(I) / (cpair(i) * DENSX(I,1))
298 TMPVTCON = 1.0 + EP1 * QVS(I,1) ! COnversion factor for virtual temperature
299 WS1 = SQRT(US(I,1)**2 + VS(I,1)**2) ! Level 1 wind speed
300 TST(I) = -TMPFX / UST(I)
301 QST(I) = -QFX(I) / (UST(I)*DENSX(I,1))
302 USTM(I) = UST(I) * WS1 / wspd(i)
303 THV1 = TMPVTCON * THETA(I,1)
304 TSTV(I) = TST(I)*TMPVTCON + THV1*EP1*QST(I)
305 IF(ABS(TSTV(I)).LT.1.0E-6) THEN
306 TSTV(I) = SIGN(1.0E-6,TSTV(I))
308 MOL(I) = THV1 * UST(i)**2/(KARMAN*G*TSTV(I))
309 WST(I) = UST(I) * (PBL(I)/(KARMAN*ABS(MOL(I)))) ** 0.333333
310 PSTAR(I) = MUT(I)/1000. ! P* in cb
312 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
314 !... Compute PBL height
316 !... compute the height of full- and half-sigma level above ground level
324 ZF(I,K) = DZF(I,K) + ZF(I,K-1)
325 ZA(I,K) = 0.5 * (ZF(I,K) + ZF(I,K-1))
331 TVCON = 1.0 + EP1 * QVS(I,K)
332 THETAV(I,K) = THETA(I,K) * TVCON
337 !... COMPUTE PBL WHERE RICHARDSON NUMBER = RIC (0.25) HOLTSLAG ET AL 1990
339 if(MOL(I).LT.0.0 .AND. XTIME.GT.1) then
340 WSS = (UST(I) ** 3 + 0.6 * WST(I) ** 3) ** 0.33333
341 TCONV = -8.5 * UST(I) * TSTV(I) / WSS
342 TH1 = THETAV(I,1) + TCONV
349 DTMP = THETAV(I,K) - TH1
350 IF (DTMP.LT.0.0) KMIX = K
353 FINTT = (TH1 - THETAV(I,KMIX)) / (THETAV(I,KMIX+1) &
355 ZMIX = FINTT * (ZA(I,KMIX+1)-ZA(I,KMIX)) + ZA(I,KMIX)
356 UMIX = FINTT * (US(I,KMIX+1)-US(I,KMIX)) + US(I,KMIX)
357 VMIX = FINTT * (VS(I,KMIX+1)-VS(I,KMIX)) + VS(I,KMIX)
364 DTMP = THETAV(I,K) - TH1
365 TOG = 0.5 * (THETAV(I,K) + TH1) / G
366 WSSQ = (US(I,K)-UMIX)**2 &
368 IF (KMIX == 1) WSSQ = WSSQ + 100.*UST(I)*UST(I)
369 WSSQ = MAX( WSSQ, 0.1 )
370 RIB(I,K) = ABS(ZA(I,K)-ZMIX) * DTMP / (TOG * WSSQ)
371 IF (RIB(I,K) .GE. RIC) GO TO 201
374 write (message, *)' RIBX never exceeds RIC, RIB(i,kte) = ',rib(i,5), &
375 ' THETAV(i,1) = ',thetav(i,1),' MOL=',mol(i), &
376 ' TCONV = ',TCONV,' WST = ',WST(I), &
377 ' KMIX = ',kmix,' UST = ',UST(I), &
378 ' TST = ',TST(I),' U,V = ',US(I,1),VS(I,1), &
380 CALL wrf_error_fatal ( message )
388 IF (KPBLH(I) .NE. 1) THEN
389 !---------INTERPOLATE BETWEEN LEVELS -- jp 7/93
390 FINT(I) = (RIC - RIB(I,KPBLH(I)-1)) / (RIB(I,KPBLH(I)) - &
392 IF (FINT(I) .GT. 0.5) THEN
394 FINT(I) = FINT(I) - 0.5
396 KPBLHT = KPBLH(I) - 1
397 FINT(I) = FINT(I) + 0.5
399 PBL(I) = FINT(I) * (ZF(I,KPBLHT) - ZF(I,KPBLHT-1)) + &
402 PBLSIG(I) = FINT(I) * DSIGH(KPBLHT) + SIGMAF(KPBLHT-1) ! sigma at PBL height
406 PBLSIG(I) = SIGMAF(1)
414 ! Check for CBL and identify conv. vs. non-conv cells
415 IF (PBL(I) / MOL(I) .LT. -0.02 .AND. KLPBL(I) .GT. 3 &
416 .AND. THETAV(I,1) .GT. THETAV(I,2) .AND. XTIME .GT. 1) THEN
418 REGIME(I) = 4.0 ! FREE CONVECTIVE - ACM
423 CALL EDDYX(DTPBL, ZF, ZA, MOL, PBL, UST, &
424 US, VS, TT, THETAV, DENSX, PSTAR, &
425 QVS, QCS, QIS, DSIGFI, G, RD, CPAIR, &
426 EDDYZ, its,ite, kts,kte,ims,ime, kms,kme)
428 CALL ACM(DTPBL, PSTAR, NOCONV, SIGMAF, DSIGH, DSIGHI, J, &
429 KLPBL, PBL, PBLSIG, MOL, UST, &
430 TST, QST, USTM, EDDYZ, DENSX, &
431 US, VS, THETA, QVS, QCS, QIS, &
432 UX, VX, THETAX, QVX, QCX, QIX, &
433 ids,ide, jds,jde, kds,kde, &
434 ims,ime, jms,jme, kms,kme, &
435 its,ite, jts,jte, kts,kte)
437 !... Calculate tendency due to PBL parameterization
441 UTNP(I,K) = UTNP(I,K) + (UX(I,K) - US(I,K)) * RDT
442 VTNP(I,K) = VTNP(I,K) + (VX(I,K) - VS(I,K)) * RDT
443 TTNP(I,K) = TTNP(I,K) + (THETAX(I,K) - THETA(I,K)) * RDT
444 QVTNP(I,K) = QVTNP(I,K) + (QVX(I,K) - QVS(I,K)) * RDT
445 QCTNP(I,K) = QCTNP(I,K) + (QCX(I,K) - QCS(I,K)) * RDT
446 QITNP(I,K) = QITNP(I,K) + (QIX(I,K) - QIS(I,K)) * RDT
449 ! IF(J.EQ.36)PRINT *,' PBL,THETA,THETAX,QVS,QVX=',PBL(20),THETA(20,1),THETAX(20,1),QVS(20,1),QVX(20,1)
450 ! IF(J.EQ.36)PRINT *,' UST,ustm,TG,TST=',UST(20),ustm(20),Tg(20),TST(20)
451 ! IF(J.EQ.36)PRINT *,' HFX,MOL,WST,WSPD=',HFX(20),MOL(20),WST(20),wspd(20)
455 ! PRINT *,' qvten,uten,vten=',QVTNP(I,K),UTNP(I,K),VTNP(I,K)
456 ! PRINT *,' k,thten,th,thx,edy=',k,TTNP(I,K),THETA(20,k),THETAX(20,k),EDDYZ(20,K)
461 !-------------------------------------------------------------------
462 SUBROUTINE ACMINIT(RUBLTEN,RVBLTEN,RTHBLTEN,RQVBLTEN, &
463 RQCBLTEN,RQIBLTEN,P_QI,P_FIRST_SCALAR, &
464 restart, allowed_to_read , &
465 ids, ide, jds, jde, kds, kde, &
466 ims, ime, jms, jme, kms, kme, &
467 its, ite, jts, jte, kts, kte )
468 !**********************************************************************
470 ! This subroutine is for preparing ACM PBL variables.
471 ! Called from module_physics_init.F
474 ! AX 3/2005 - Originally developed
475 !**********************************************************************
478 !-------------------------------------------------------------------
481 LOGICAL , INTENT(IN) :: restart , allowed_to_read
483 INTEGER , INTENT(IN) :: ids, ide, jds, jde, kds, kde, &
484 ims, ime, jms, jme, kms, kme, &
485 its, ite, jts, jte, kts, kte
487 INTEGER , INTENT(IN) :: P_QI,P_FIRST_SCALAR
489 ! REAL , DIMENSION( kms:kme ), INTENT(IN) :: SHALF
490 REAL , DIMENSION( ims:ime , kms:kme , jms:jme ) , INTENT(OUT) :: &
499 INTEGER :: i, j, k, itf, jtf, ktf
520 IF (P_QI .ge. P_FIRST_SCALAR .and. .not.restart) THEN
531 END SUBROUTINE acminit
533 !-------------------------------------------------------------------
534 SUBROUTINE EDDYX(DTPBL, ZF, ZA, MOL, PBL, UST, &
535 US, VS, TT, THETAV, DENSX, PSTAR, &
536 QVS, QCS, QIS, DSIGFI, G, RD, CPAIR, &
537 EDDYZ, its,ite, kts,kte,ims,ime,kms,kme )
540 !**********************************************************************
541 ! Two methods for computing Kz:
542 ! 1. Boundary scaling similar to Holtslag and Boville (1993)
543 ! 2. Local Kz computed as function of local Richardson # and vertical
544 ! wind shear, similar to LIU & CARROLL (1996)
546 !**********************************************************************
548 !-- DTPBL time step of the minor loop for the land-surface/pbl model
549 !-- ZF height of full sigma level
550 !-- ZA height of half sigma level
551 !-- MOL Monin-Obukhov length in 1D form
552 !-- PBL PBL height in 1D form
553 !-- UST friction velocity U* in 1D form (m/s)
557 !-- THETAV potential virtual temperature
558 !-- DENSX dry air density (kg/m^3)
559 !-- PSTAR P*=Psfc-Ptop
560 !-- QVS water vapor mixing ratio (Kg/Kg)
561 !-- QCS cloud mixing ratio (Kg/Kg)
562 !-- QIS ice mixing ratio (Kg/Kg)
563 !-- DSIGFI inverse of sigma layer delta
565 !-- RD gas constant for dry air (j/kg/k)
566 !-- CPAIR specific heat of moist air (M^2 S^-2 K^-1)
567 !-- EDDYZ eddy diffusivity KZ
568 !-----------------------------------------------------------------------
575 INTEGER, INTENT(IN) :: its,ite, kts,kte,ims,ime,kms,kme
577 REAL , DIMENSION( ims:ime ), INTENT(IN) :: PBL, UST
578 REAL , INTENT(IN) :: DTPBL, G, RD
579 REAL , DIMENSION( kts:kte ), INTENT(IN) :: DSIGFI
580 REAL , DIMENSION( its:ite ), INTENT(IN) :: MOL, PSTAR, CPAIR
582 REAL , DIMENSION( ims:ime, kms:kme ), INTENT(IN) :: US,VS, TT, &
584 REAL, DIMENSION( its:ite, kts:kte ), INTENT(IN) :: ZA, THETAV
585 REAL, DIMENSION( its:ite, 0:kte ) , INTENT(IN) :: ZF
587 REAL , DIMENSION( its:ite, kts:kte ), INTENT(OUT) :: EDDYZ
589 !.......Local variables
592 INTEGER :: ILX, KL, KLM, K, I
595 REAL :: ZOVL, PHIH, WT, ZSOL, ZFUNC, DZF, SS, GOTH, EDYZ
596 REAL :: RI, QMEAN, TMEAN, XLV, ALPH, CHI, ZK, SQL, DENSF,kzo
599 REAL, PARAMETER :: RV = 461.5
600 REAL, PARAMETER :: RC = 0.25
601 REAL, PARAMETER :: RLAM = 80.0
602 REAL, PARAMETER :: GAMH = 16.0 !15.0 ! Holtslag and Boville (1993)
603 REAL, PARAMETER :: BETAH = 5.0 ! Holtslag and Boville (1993)
604 REAL, PARAMETER :: KARMAN = 0.4
605 REAL, PARAMETER :: EDYZ0 = 0.01 ! New Min Kz
606 ! REAL, PARAMETER :: EDYZ0 = 0.1
607 !-- IMVDIF imvdif=1 for moist adiabat vertical diffusion
608 INTEGER, PARAMETER :: imvdif = 1
618 DZF = ZA(I,K+1) - ZA(I,K)
619 ! kzo = min(0.001 * dzf,EDYZ0)
622 !-------------------------------------------------
623 IF (ZF(I,K) .LT. PBL(I)) THEN
624 ZOVL = ZF(I,K) / MOL(I)
625 IF (ZOVL .LT. 0.0) THEN
626 IF (ZF(I,K) .LT. 0.1 * PBL(I)) THEN
627 PHIH = 1.0 / SQRT(1.0 - GAMH * ZOVL)
630 ZSOL = 0.1 * PBL(I) / MOL(I)
631 PHIH = 1.0 / SQRT(1.0 - GAMH * ZSOL)
634 ELSE IF (ZOVL .LT. 1.0) THEN
635 PHIH = 1.0 + BETAH * ZOVL
641 ZFUNC = ZF(I,K) * (1.0 - ZF(I,K) / PBL(I)) ** 2
642 EDYZ = KARMAN * WT * ZFUNC
643 ! EDYZ = AMAX1(EDYZ,EDYZ0)
645 ! PRINT *,I,K,TT(I,K)
646 !--------------------------------------------------------------------------
648 ! RC = 0.257 * DZF ** 0.175
649 SS = ((US(I,K+1) - US(I,K)) ** 2 + (VS(I,K+1) - VS(I,K)) ** 2) &
650 / (DZF * DZF) + 1.0E-9
651 GOTH = 2.0 * G / (THETAV(I,K+1) + THETAV(I,K))
652 RI = GOTH * (THETAV(I,K+1) - THETAV(I,K)) / (DZF * SS)
653 ! PRINT *,I,K,TT(I,K), RI, IMVDIF
655 !-- Adjustment to vert diff in Moist air
657 IF ((QCS(I,K)+QIS(I,K)) .GT. 0.01E-3 .OR. (QCS(I,K+1)+ &
658 QIS(I,K+1)) .GT. 0.01E-3) THEN
659 QMEAN = 0.5 * (QVS(I,K) + QVS(I,K+1))
660 TMEAN = 0.5 * (TT(I,K) + TT(I,K+1))
661 XLV = (2.501 - 0.00237 * (TMEAN - 273.15)) * 1.E6
662 ALPH = XLV * QMEAN / RD / TMEAN
663 CHI = XLV * XLV * QMEAN / CPAIR(I) / RV / TMEAN / TMEAN
664 RI = (1.0 + ALPH) * (RI -G * G / SS / TMEAN / CPAIR(I) * &
665 ((CHI - ALPH) / (1.0 + CHI)))
670 SQL = (ZK * RLAM / (RLAM + ZK)) ** 2
673 EDDYZ(I,K) = kzo !EDYZ0
674 ELSE IF (RI .GE. 0.0) THEN
675 EDDYZ(I,K) = kzo + SQRT(SS) * (1.- RI / RC) ** 2 * SQL
677 EDDYZ(I,K) = kzo + SQRT(SS * (1.0 - 25.0 * RI)) * SQL
680 IF(ZOVL.LT.0.0.AND.EDYZ.GT.EDDYZ(I,K)) THEN
684 EDDYZ(I,K) = MIN(1000.0,EDDYZ(I,K))
685 EDDYZ(I,K) = MAX(kzo,EDDYZ(I,K))
687 DENSF = 0.5 * (DENSX(I,K+1) + DENSX(I,K))
689 EDDYZ(I,K) = EDDYZ(I,K) * (DENSF * G / PSTAR(I)) ** 2 * &
690 DTPBL * DSIGFI(K)*1E-6
695 EDDYZ(I,KL) = 0.0 ! EDDYZ(I,KLM) -- changed jp 3/08
699 !-------------------------------------------------------------------
700 SUBROUTINE ACM (DTPBL, PSTAR, NOCONV, SIGMAF, DSIGH, DSIGHI, JX, &
701 KLPBL, PBL, PBLSIG, MOL, UST, &
702 TST, QST, USTM, EDDYZ, DENSX, &
703 US, VS, THETA, QVS, QCS, QIS, &
704 UX, VX, THETAX, QVX, QCX, QIX, &
705 ids,ide, jds,jde, kds,kde, &
706 ims,ime, jms,jme, kms,kme, &
707 its,ite, jts,jte, kts,kte)
708 !**********************************************************************
709 ! PBL model called the Asymmetric Convective Model, Version 2 (ACM2)
710 ! -- See top of module for summary and references
712 !---- REVISION HISTORY:
713 ! AX 3/2005 - developed WRF version based on ACM2 in the MM5 PX LSM
714 ! JP and RG 8/2006 - updates
716 !**********************************************************************
718 !-- DTPBL PBL time step
719 !-- PSTAR Psurf - Ptop in cb
720 !-- NOCONV If free convection =0, no; =1, yes
721 !-- SIGMAF Sigma for full layer
722 !-- DSIGH Sigma thickness
723 !-- DSIGHI Inverse of sigma thickness
725 !-- KLPBL PBL level at K index
726 !-- PBL PBL height in m
727 !-- PBLSIG Sigma level for PBL
728 !-- MOL Monin-Obukhov length in 1D form
729 !-- UST U* in 1D form
730 !-- TST Theta* in 1D form
731 !-- QST Q* in 1D form
732 !-- USTM U* for computation of momemtum flux
733 !-- EDDYZ eddy diffusivity KZ
734 !-- DENSX dry air density (kg/m^3)
737 !-- THETA potential temperature
738 !-- QVS water vapor mixing ratio (Kg/Kg)
739 !-- QCS cloud mixing ratio (Kg/Kg)
740 !-- QIS ice mixing ratio (Kg/Kg)
743 !-- THETAX new potential temperature
744 !-- QVX new water vapor mixing ratio (Kg/Kg)
745 !-- QCX new cloud mixing ratio (Kg/Kg)
746 !-- QIX new ice mixing ratio (Kg/Kg)
747 !-----------------------------------------------------------------------
754 INTEGER, INTENT(IN) :: ids,ide, jds,jde, kds,kde, &
755 ims,ime, jms,jme, kms,kme, &
756 its,ite, jts,jte, kts,kte, JX
757 INTEGER, DIMENSION( its:ite ), INTENT(IN) :: NOCONV
758 INTEGER, DIMENSION( ims:ime ), INTENT(IN) :: KLPBL
761 REAL , DIMENSION( ims:ime ), INTENT(IN) :: PBL, UST
762 REAL , INTENT(IN) :: DTPBL
763 REAL , DIMENSION( its:ite ), INTENT(IN) :: PSTAR, PBLSIG, &
766 REAL , DIMENSION( kts:kte ), INTENT(IN) :: DSIGHI, DSIGH
767 REAL , DIMENSION( 0:kte ), INTENT(IN) :: SIGMAF
768 REAL , DIMENSION( its:ite, kts:kte ), INTENT(INOUT) :: EDDYZ
769 REAL , DIMENSION( ims:ime, kms:kme ), INTENT(IN) :: US,VS, THETA, &
771 REAL , DIMENSION( its:ite, kts:kte ), INTENT(OUT) :: UX, VX, THETAX, &
774 !.......Local variables
777 INTEGER, PARAMETER :: NSP = 6
779 !......ACM2 Parameters
780 ! INTEGER, PARAMETER :: IFACM = 0
782 REAL, PARAMETER :: G1000 = 9.8 * 1.0E-3
783 REAL, PARAMETER :: XX = 0.5 ! FACTOR APPLIED TO CONV MIXING TIME STEP
784 REAL, PARAMETER :: KARMAN = 0.4
787 INTEGER :: ILX, KL, KLM, I, K, NSPX, NLP, NL, JJ, L
789 INTEGER, DIMENSION( its:ite ) :: KCBL
792 REAL :: G1000I, MBMAX, HOVL, MEDDY, MBAR
793 REAL :: EKZ, RZ, FM, WSPD, DTS, DTRAT, F1
794 REAL, DIMENSION( its:ite ) :: PSTARI, FSACM, RAH, DTLIM
795 REAL, DIMENSION( kts:kte, its:ite) :: MBARKS, MDWN
796 REAL, DIMENSION( 1:NSP, its:ite ) :: FS, BCBOTN
797 REAL, DIMENSION( kts:kte ) :: XPLUS, XMINUS
799 REAL, DIMENSION( 1:NSP,its:ite,kts:kte ) :: VCI
801 REAL, DIMENSION( kts:kte ) :: AI, BI, CI, EI !, Y
802 REAL, DIMENSION( 1:NSP,kts:kte ) :: DI, UI
804 !--Start Exicutable ----
814 !---COMPUTE ACM MIXING RATE
817 PSTARI(I) = 1.0 / PSTAR(I)
821 IF (NOCONV(I) .EQ. 1) THEN
823 !-------MBARKS IS UPWARD MIXING RATE; MDWN IS DOWNWARD MIXING RATE
824 !--New couple ACM & EDDY-------------------------------------------------------------
825 HOVL = -PBL(I) / MOL(I)
826 FSACM(I) = 1./(1.+((KARMAN/(HOVL))**0.3333)/(0.72*KARMAN))
827 MEDDY = EDDYZ(I,1) / (DTPBL * (PBLSIG(I) - SIGMAF(1)))
828 MBAR = MEDDY * FSACM(I)
830 EDDYZ(I,K) = EDDYZ(I,K) * (1.0 - FSACM(I))
832 ! if(i.eq.100.and.jx.eq.43) PRINT *,' Edy,meddy,mbar=', EDDYZ(I,1),MEDDY,MBAR
833 MBMAX = AMAX1(MBMAX,MBAR)
836 MDWN(K,I) = MBAR * (PBLSIG(I) - SIGMAF(K-1)) * DSIGHI(K)
839 MBARKS(KCBL(I),I) = MDWN(KCBL(I),I)
840 MDWN(KCBL(I)+1,I) = 0.0
842 ENDDO ! end of I loop
844 ! if(NOCONV(20).EQ.1) print *,' KCBL,PBLSIG=',KCBL(20),PBLSIG(20),SIGMAF(KCBL(20)-1),DSIGHI(KCBL(20))
846 ! if(NOCONV(20).EQ.1.and.MBAR.lt.1.0e-3)print *,' k,MBARKS,MDWN=',k,MBARKS(k,20),MDWN(k,20)
851 EKZ = EDDYZ(I,K) / DTPBL * DSIGHI(K)
852 DTLIM(I) = AMIN1(0.75 / EKZ,DTLIM(I))
857 IF (NOCONV(I) .EQ. 1) THEN
858 KCBLMX = AMAX0(KLPBL(I),KCBLMX)
859 RZ = (SIGMAF(KCBL(I)) - SIGMAF(1)) * DSIGHI(1)
860 DTLIM(I) = AMIN1(XX / (MBARKS(1,I) * RZ),DTLIM(I))
869 VCI(1,I,K) = THETA(I,K)
870 VCI(2,I,K) = QVS(I,K)
873 ! -- Also mix cloud water and ice if necessary
874 ! IF (IMOISTX.NE.1.AND.IMOISTX.NE.3) THEN !!! Check other PBL models
875 VCI(5,I,K) = QCS(I,K)
876 VCI(6,I,K) = QIS(I,K)
883 ! RAH(I) = RA(I,J) + 3.976 / UST(I)
884 FS(1,I) = -UST(I) * TST(I) * DENSX(I,1) * PSTARI(I)
885 FS(2,I) = -UST(I) * QST(I) * DENSX(I,1) * PSTARI(I)
886 FM = -USTM(I) * USTM(I) * DENSX(I,1) * PSTARI(I)
887 WSPD = SQRT(US(I,1) * US(I,1) + VS(I,1) * VS(I,1)) + 1.E-9
888 FS(3,I) = FM * US(I,1) / WSPD
889 FS(4,I) = FM * VS(I,1) / WSPD
891 FS(6,I) = 0.0 ! SURFACE FLUXES OF CLOUD WATER AND ICE = 0
894 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
896 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
897 NLP = INT(DTPBL / DTLIM(I) + 1.0)
900 DO NL = 1,NLP ! LOOP OVER SUB TIME LOOP
902 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
903 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
905 !-- COMPUTE ARRAY ELEMENTS THAT ARE INDEPENDANT OF SPECIES
915 EI(K-1) = -CRANKP * MDWN(K,I) * DTS * DSIGH(K) * DSIGHI(K-1)
916 BI(K) = 1.0 + CRANKP * MDWN(K,I) * DTS
917 AI(K) = -CRANKP * MBARKS(K,I) * DTS
920 EI(1) = EI(1) -EDDYZ(I,1) * CRANKP * DSIGHI(1 )* DTRAT
921 AI(2) = AI(2) -EDDYZ(I,1) * CRANKP * DSIGHI(2) * DTRAT
928 XPLUS(K) = EDDYZ(I,K) * DSIGHI(K) * DTRAT
929 XMINUS(K) = EDDYZ(I,K-1) * DSIGHI(K) * DTRAT
930 CI(K) = - XMINUS(K) * CRANKP
931 EI(K) = EI(K) - XPLUS(K) * CRANKP
932 BI(K) = BI(K) + XPLUS(K) * CRANKP + XMINUS(K) * CRANKP
935 IF (NOCONV(I) .EQ. 1) THEN
936 BI(1) = 1.0 + CRANKP * MBARKS(1,I) * (PBLSIG(I) - SIGMAF(1)) * &
937 DTS * DSIGHI(1) + EDDYZ(I,1) * DSIGHI(1) * CRANKP * DTRAT
939 BI(1) = 1.0 + EDDYZ(I,1) * DSIGHI(1) * CRANKP * DTRAT
949 !** COMPUTE TENDENCY OF CBL CONCENTRATIONS - SEMI-IMPLICIT SOLUTION
952 DELC = DTS * (MBARKS(K,I) * VCI(L,I,1) - MDWN(K,I) * &
953 VCI(L,I,K) + DSIGH(K+1) * DSIGHI(K) * &
954 MDWN(K+1,I) * VCI(L,I,K+1))
955 DI(L,K) = VCI(L,I,K) + (1.0 - CRANKP) * DELC
968 DI(L,K) = DI(L,K) - (1.0 - CRANKP) * XMINUS(K) * &
969 (VCI(L,I,K) - VCI(L,I,K-1))
973 DI(L,K) = DI(L,K) + (1.0 - CRANKP) * XPLUS(K) * &
974 (VCI(L,I,K+1) - VCI(L,I,K)) - &
975 (1.0 - CRANKP) * XMINUS(K) * &
976 (VCI(L,I,K) - VCI(L,I,K-1))
981 IF (NOCONV(I) .EQ. 1) THEN
983 F1 = -G1000I * (MBARKS(1,I) * &
984 (PBLSIG(I) - SIGMAF(1)) * VCI(L,I,1) - &
985 MDWN(2,I) * VCI(L,I,2) * DSIGH(2))
987 DI(L,1) = VCI(L,I,1) - G1000 * (FS(L,I) - (1.0 - CRANKP) &
988 * F1) * DSIGHI(1) * DTS
992 DI(L,1) = VCI(L,I,1) - G1000 * FS(L,I) * DSIGHI(1) * DTS
996 DI(L,1) = DI(L,1) + (1.0 - CRANKP) * EDDYZ(I,1) * DSIGHI(1) &
997 * DTRAT * (VCI(L,I,2) - VCI(L,I,1))
999 IF ( NOCONV(I) .EQ. 1 ) THEN
1000 CALL MATRIX (AI, BI, CI, DI, EI, UI, KL, NSPX)
1002 CALL TRI (CI, BI, EI, DI, UI, KL, NSPX)
1005 !-- COMPUTE NEW THETAV AND Q
1008 VCI(L,I,K) = UI(L,K)
1013 ENDDO ! END SUB TIME LOOP
1014 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1015 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1020 THETAX(I,K) = VCI(1,I,K)
1021 QVX(I,K) = VCI(2,I,K)
1022 UX(I,K) = VCI(3,I,K)
1023 VX(I,K) = VCI(4,I,K)
1024 ! IF( (I.EQ.61 .OR. I.EQ.15) .AND. JX.EQ.22) THEN
1025 ! PRINT *,'TEST -->',I,K,THETAX(I,K)
1032 QCX(I,K) = VCI(5,I,K)
1033 QIX(I,K) = VCI(6,I,K)
1039 !--------------------------------------------------------
1041 SUBROUTINE MATRIX(A,B,C,D,E,X,KL,NSP)
1045 !-- Bordered band diagonal matrix solver for ACM2
1047 !-- ACM2 Matrix is in this form:
1069 ! L61 L62 L63 L64 L65 1
1070 !---------------------------------------------------------
1072 INTEGER, INTENT(IN) :: KL
1073 INTEGER, INTENT(IN) :: NSP
1074 REAL A(KL),B(KL),E(KL)
1075 REAL C(KL),D(NSP,KL),X(NSP,KL)
1078 REAL Y(NSP,KL),AIJ,SUM
1079 REAL L(KL,KL),UII(KL),UIIP1(KL),RUII(KL)
1082 !-- Define Upper and Lower matrices
1099 L(I,J) = (AIJ-L(I,J-1)*E(J-1))/ &
1100 (B(J)-L(J,J-1)*E(J-1))
1106 ! U(I,I) = B(I)-L(I,I-1)*E(I-1)
1107 UII(I) = B(I)-L(I,I-1)*E(I-1)
1111 !-- Forward sub for Ly=d
1117 SUM = SUM - L(I,J)*Y(V,J)
1123 !-- Back sub for Ux=y
1126 ! X(V,KL) = Y(V,KL)/U(KL,KL)
1127 X(V,KL) = Y(V,KL)*RUII(KL)
1131 ! X(V,I) = (Y(V,I)-U(I,I+1)*X(V,I+1))/U(I,I)
1132 X(V,I) = (Y(V,I)-UIIP1(I)*X(V,I+1))*RUII(I)
1136 END SUBROUTINE MATRIX
1137 !:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
1138 SUBROUTINE TRI ( L, D, U, B, X,KL,NSP)
1139 !-----------------------------------------------------------------------
1142 ! Solves tridiagonal system by Thomas algorithm.
1143 ! The associated tri-diagonal system is stored in 3 arrays
1146 ! U : super-diagonal
1147 ! B : right hand side function
1148 ! X : return solution from tridiagonal solver
1150 ! [ D(1) U(1) 0 0 0 ... 0 ]
1151 ! [ L(2) D(2) U(2) 0 0 ... . ]
1152 ! [ 0 L(3) D(3) U(3) 0 ... . ]
1153 ! [ . . . . . ] X(i) = B(i)
1158 !-----------------------------------------------------------------------
1164 INTEGER, INTENT(IN) :: KL
1165 INTEGER, INTENT(IN) :: NSP
1167 REAL L( KL ) ! subdiagonal
1168 REAL D(KL) ! diagonal
1169 REAL U( KL ) ! superdiagonal
1170 REAL B(NSP,KL ) ! R.H. side
1171 REAL X( NSP,KL ) ! solution
1179 ! Decomposition and forward substitution:
1182 X( V,1 ) = BET * B(V,1 )
1186 GAM(K ) = BET * U( K-1 )
1187 BET = 1.0 / ( D( K ) - L( K ) * GAM( K ) )
1189 X( V, K ) = BET * ( B( V,K ) - L( K ) * X( V,K-1 ) )
1193 ! Back-substitution:
1195 DO K = KL - 1, 1, -1
1197 X( V,K ) = X( V,K ) - GAM( K+1 ) * X( V,K+1 )
1203 END MODULE module_bl_acm