1 !wrf:model_layer:physics
9 !-------------------------------------------------------------------
11 subroutine ysu(u3d,v3d,th3d,t3d,qv3d,qc3d,qi3d,p3d,p3di,pi3d, &
12 rublten,rvblten,rthblten, &
13 rqvblten,rqcblten,rqiblten,flag_qi, &
17 znt,ust,zol,hol,hpbl,psim,psih, &
18 xland,hfx,qfx,tsk,gz1oz0,wspd,br, &
20 svp1,svp2,svp3,svpt0,ep1,ep2,karman,eomeg,stbolt, &
23 ids,ide, jds,jde, kds,kde, &
24 ims,ime, jms,jme, kms,kme, &
25 its,ite, jts,jte, kts,kte, &
28 !-------------------------------------------------------------------
30 !-------------------------------------------------------------------
31 !-- u3d 3d u-velocity interpolated to theta points (m/s)
32 !-- v3d 3d v-velocity interpolated to theta points (m/s)
33 !-- th3d 3d potential temperature (k)
34 !-- t3d temperature (k)
35 !-- qv3d 3d water vapor mixing ratio (kg/kg)
36 !-- qc3d 3d cloud mixing ratio (kg/kg)
37 !-- qi3d 3d ice mixing ratio (kg/kg)
38 ! (note: if P_QI<PARAM_FIRST_SCALAR this should be zero filled)
39 !-- p3d 3d pressure (pa)
40 !-- p3di 3d pressure (pa) at interface level
41 !-- pi3d 3d exner function (dimensionless)
42 !-- rr3d 3d dry air density (kg/m^3)
43 !-- rublten u tendency due to
44 ! pbl parameterization (m/s/s)
45 !-- rvblten v tendency due to
46 ! pbl parameterization (m/s/s)
47 !-- rthblten theta tendency due to
48 ! pbl parameterization (K/s)
49 !-- rqvblten qv tendency due to
50 ! pbl parameterization (kg/kg/s)
51 !-- rqcblten qc tendency due to
52 ! pbl parameterization (kg/kg/s)
53 !-- rqiblten qi tendency due to
54 ! pbl parameterization (kg/kg/s)
55 !-- cp heat capacity at constant pressure for dry air (j/kg/k)
56 !-- g acceleration due to gravity (m/s^2)
58 !-- rd gas constant for dry air (j/kg/k)
60 !-- dz8w dz between full levels (m)
61 !-- z height above sea level (m)
62 !-- xlv latent heat of vaporization (j/kg)
63 !-- rv gas constant for water vapor (j/kg/k)
64 !-- psfc pressure at the surface (pa)
65 !-- znt roughness length (m)
66 !-- ust u* in similarity theory (m/s)
67 !-- zol z/l height over monin-obukhov length
68 !-- hol pbl height over monin-obukhov length
69 !-- hpbl pbl height (m)
70 !-- regime flag indicating pbl regime (stable, unstable, etc.)
71 !-- psim similarity stability function for momentum
72 !-- psih similarity stability function for heat
73 !-- xland land mask (1 for land, 2 for water)
74 !-- hfx upward heat flux at the surface (w/m^2)
75 !-- qfx upward moisture flux at the surface (kg/m^2/s)
76 !-- tsk surface temperature (k)
77 !-- gz1oz0 log(z/z0) where z0 is roughness length
78 !-- wspd wind speed at lowest model level (m/s)
79 !-- u10 u-wind speed at 10 m (m/s)
80 !-- v10 v-wind speed at 10 m (m/s)
81 !-- br bulk richardson number in surface layer
83 !-- dtmin time step (minute)
84 !-- rvovrd r_v divided by r_d (dimensionless)
85 !-- svp1 constant for saturation vapor pressure (kpa)
86 !-- svp2 constant for saturation vapor pressure (dimensionless)
87 !-- svp3 constant for saturation vapor pressure (k)
88 !-- svpt0 constant for saturation vapor pressure (k)
89 !-- ep1 constant for virtual temperature (r_v/r_d - 1) (dimensionless)
90 !-- ep2 constant for specific humidity calculation
91 !-- karman von karman constant
92 !-- eomeg angular velocity of earths rotation (rad/s)
93 !-- stbolt stefan-boltzmann constant (w/m^2/k^4)
94 !-- ids start index for i in domain
95 !-- ide end index for i in domain
96 !-- jds start index for j in domain
97 !-- jde end index for j in domain
98 !-- kds start index for k in domain
99 !-- kde end index for k in domain
100 !-- ims start index for i in memory
101 !-- ime end index for i in memory
102 !-- jms start index for j in memory
103 !-- jme end index for j in memory
104 !-- kms start index for k in memory
105 !-- kme end index for k in memory
106 !-- its start index for i in tile
107 !-- ite end index for i in tile
108 !-- jts start index for j in tile
109 !-- jte end index for j in tile
110 !-- kts start index for k in tile
111 !-- kte end index for k in tile
112 !-------------------------------------------------------------------
114 integer, intent(in ) :: ids,ide, jds,jde, kds,kde, &
115 ims,ime, jms,jme, kms,kme, &
116 its,ite, jts,jte, kts,kte
118 real, intent(in ) :: dt,dtmin,cp,g,rovcp,rovg,rd,xlv,rv
120 real, intent(in ) :: svp1,svp2,svp3,svpt0
121 real, intent(in ) :: ep1,ep2,karman,eomeg,stbolt
123 real, dimension( ims:ime, kms:kme, jms:jme ) , &
124 intent(in ) :: qv3d, &
133 real, dimension( ims:ime, kms:kme, jms:jme ) , &
136 real, dimension( ims:ime, kms:kme, jms:jme ) , &
137 intent(inout) :: rublten, &
143 real, dimension( ims:ime, kms:kme, jms:jme ) , &
144 intent(inout) :: exch_h
145 real, dimension( ims:ime, jms:jme ) , &
146 intent(in ) :: u10, &
149 real, dimension( ims:ime, jms:jme ) , &
150 intent(in ) :: xland, &
160 real, dimension( ims:ime, jms:jme ) , &
161 intent(inout) :: hol, &
168 real, dimension( ims:ime, kms:kme, jms:jme ) , &
169 intent(in ) :: u3d, &
172 integer, dimension( ims:ime, jms:jme ) , &
173 intent(out ) :: kpbl2d
175 logical, intent(in) :: flag_qi
177 real, dimension( ims:ime, jms:jme ) , &
179 intent(inout) :: regime
181 real, dimension( ims:ime, kms:kme, jms:jme ) , &
183 intent(inout) :: rqiblten
185 real, dimension( kms:kme ) , &
187 intent(in ) :: znu, &
190 real, dimension( ims:ime, jms:jme ) , &
194 real, optional, intent(in ) :: p_top
198 real, dimension( its:ite, kts:kte ) :: rqibl2dt, &
200 real, dimension( its:ite, kts:kte+1 ) :: pdhi
204 ! For ARW we will replace p and p8w with dry hydrostatic pressure
207 if(k.le.kte)pdh(i,k) = mut(i,j)*znu(k) + p_top
208 pdhi(i,k) = mut(i,j)*znw(k) + p_top
214 if(k.le.kte)pdh(i,k) = p3d(i,k,j)
215 pdhi(i,k) = p3di(i,k,j)
219 call ysu2d(J=j,ux=u3d(ims,kms,j),vx=v3d(ims,kms,j) &
221 ,qx=qv3d(ims,kms,j),qcx=qc3d(ims,kms,j) &
222 ,qix=qi3d(ims,kms,j) &
223 ,p2d=pdh(its,kts),p2di=pdhi(its,kts) &
224 ,pi2d=pi3d(ims,kms,j) &
225 ,utnp=rublten(ims,kms,j),vtnp=rvblten(ims,kms,j) &
226 ,ttnp=rthblten(ims,kms,j),qtnp=rqvblten(ims,kms,j) &
227 ,qctnp=rqcblten(ims,kms,j),qitnp=rqibl2dt(its,kts) &
228 ,cp=cp,g=g,rovcp=rovcp,rd=rd,rovg=rovg &
229 ,dz8w2d=dz8w(ims,kms,j),z2d=z(ims,kms,j) &
231 ,psfcpa=psfc(ims,j),znt=znt(ims,j),ust=ust(ims,j) &
232 ,zol=zol(ims,j),hol=hol(ims,j),hpbl=hpbl(ims,j) &
233 ,regime=regime(ims,j),psim=psim(ims,j) &
234 ,psih=psih(ims,j),xland=xland(ims,j) &
235 ,hfx=hfx(ims,j),qfx=qfx(ims,j) &
236 ,tsk=tsk(ims,j),gz1oz0=gz1oz0(ims,j) &
237 ,wspd=wspd(ims,j),br=br(ims,j) &
238 ,dt=dt,dtmin=dtmin,kpbl1d=kpbl2d(ims,j) &
239 ,svp1=svp1,svp2=svp2,svp3=svp3,svpt0=svpt0 &
240 ,ep1=ep1,ep2=ep2,karman=karman,eomeg=eomeg &
242 ,exch_hx=exch_h(ims,kms,j) &
243 ,u10=u10(ims,j),v10=v10(ims,j) &
244 ,ids=ids,ide=ide, jds=jds,jde=jde, kds=kds,kde=kde &
245 ,ims=ims,ime=ime, jms=jms,jme=jme, kms=kms,kme=kme &
246 ,its=its,ite=ite, jts=jts,jte=jte, kts=kts,kte=kte )
249 rthblten(i,k,j) = rthblten(i,k,j)/pi3d(i,k,j)
250 if(present(rqiblten))rqiblten(i,k,j) = rqibl2dt(i,k)
257 !-------------------------------------------------------------------
259 subroutine ysu2d(j,ux,vx,tx,qx,qcx,qix,p2d,p2di,pi2d, &
262 cp,g,rovcp,rd,rovg, &
263 dz8w2d,z2d,xlv,rv,psfcpa, &
264 znt,ust,zol,hol,hpbl,psim,psih, &
265 xland,hfx,qfx,tsk,gz1oz0,wspd,br, &
267 svp1,svp2,svp3,svpt0,ep1,ep2,karman,eomeg,stbolt, &
270 ids,ide, jds,jde, kds,kde, &
271 ims,ime, jms,jme, kms,kme, &
272 its,ite, jts,jte, kts,kte, &
275 !-------------------------------------------------------------------
277 !-------------------------------------------------------------------
279 ! this code is a revised vertical diffusion package ("ysupbl")
280 ! with a nonlocal turbulent mixing in the pbl after "mrfpbl".
281 ! the ysupbl (hong et al. 2006) is based on the study of noh
282 ! et al.(2003) and accumulated realism of the behavior of the
283 ! troen and mahrt (1986) concept implemented by hong and pan(1996).
284 ! the major ingredient of the ysupbl is the inclusion of an explicit
285 ! treatment of the entrainment processes at the entrainment layer.
286 ! this routine uses an implicit approach for vertical flux
287 ! divergence and does not require "miter" timesteps.
288 ! it includes vertical diffusion in the stable atmosphere
289 ! and moist vertical diffusion in clouds.
292 ! coded by song-you hong (ncep), implemented by jimy dudhia (ncar)
296 ! coded by song-you hong (yonsei university) and implemented by
297 ! song-you hong (yonsei university) and jimy dudhia (ncar)
302 ! hong, noh, and dudhia (2006), mon. wea. rev.
303 ! hong and pan (1996), mon. wea. rev.
304 ! noh, chun, hong, and raasch (2003), boundary layer met.
305 ! troen and mahrt (1986), boundary layer met.
307 !-------------------------------------------------------------------
309 integer,parameter :: ncloud = 3
310 real,parameter :: xkzmin = 0.01,xkzmax = 1000.,rimin = -100.
311 real,parameter :: rlam = 30.,prmin = 0.25,prmax = 4.
312 real,parameter :: brcr_ub = 0.0,brcr_sb = 0.25,cori = 1.e-4
313 real,parameter :: afac = 6.8,bfac = 6.8,pfac = 2.0
314 real,parameter :: phifac = 8.,sfcfrac = 0.1
315 real,parameter :: d1 = 0.02, d2 = 0.05, d3 = 0.001
316 real,parameter :: h1 = 0.33333335, h2 = 0.6666667
317 real,parameter :: ckz = 0.001,zfmin = 1.e-8,aphi5 = 5.,aphi16 = 16.
318 real,parameter :: tmin=1.e-2
319 real,parameter :: gamcrt = 3.,gamcrq = 2.e-3
320 real,parameter :: xka = 2.4e-5
322 integer, intent(in ) :: ids,ide, jds,jde, kds,kde, &
323 ims,ime, jms,jme, kms,kme, &
324 its,ite, jts,jte, kts,kte, j
326 real, intent(in ) :: dt,dtmin,cp,g,rovcp,rovg,rd,xlv,rv
328 real, intent(in ) :: svp1,svp2,svp3,svpt0
329 real, intent(in ) :: ep1,ep2,karman,eomeg,stbolt
331 real, dimension( ims:ime, kms:kme ), &
332 intent(in) :: dz8w2d, &
335 real, dimension( ims:ime, kms:kme ) , &
341 real, dimension( its:ite, kts:kte+1 ) , &
344 real, dimension( its:ite, kts:kte ) , &
347 real, dimension( its:ite, kts:kte ) , &
348 intent(inout) :: qitnp
350 real, dimension( ims:ime, kms:kme ) , &
351 intent(inout) :: utnp, &
357 real, dimension( ims:ime ) , &
358 intent(inout) :: hol, &
362 real, dimension( ims:ime ) , &
363 intent(in ) :: xland, &
367 real, dimension( ims:ime ), intent(inout) :: wspd
368 real, dimension( ims:ime ), intent(in ) :: br
370 real, dimension( ims:ime ), intent(in ) :: psim, &
372 real, dimension( ims:ime ), intent(in ) :: gz1oz0
374 real, dimension( ims:ime ), intent(in ) :: psfcpa
375 real, dimension( ims:ime ), intent(in ) :: tsk
376 real, dimension( ims:ime ), intent(inout) :: zol
377 integer, dimension( ims:ime ), intent(out ) :: kpbl1d
380 real, dimension( ims:ime, kms:kme ) , &
384 real, dimension( ims:ime ) , &
386 intent(inout) :: regime
390 real, dimension( its:ite, kts:kte+1 ) :: zq
392 real, dimension( its:ite, kts:kte ) :: &
403 real, dimension( its:ite ) :: qixsv,rhox, &
410 real, dimension( its:ite ) :: &
421 real, dimension( its:ite, kts:kte ) :: xkzm,xkzh, &
430 real, dimension( ims:ime, kms:kme ) , &
431 intent(inout) :: exch_hx
433 real, dimension( ims:ime ) , &
434 intent(in ) :: u10, &
436 real, dimension( its:ite ) :: &
439 real, dimension( its:ite, kts:kte, ncloud) :: r3,f3
441 logical, dimension( its:ite ) :: pblflg, &
445 integer :: n,i,k,l,nzol,imvdif,ic
448 integer, dimension( its:ite ) :: kpbl
450 real :: zoln,x,y,tvcon,e1,dtstep,brcr
451 real :: zl,tskv,dthvdz,dthvm,vconv,rzol
452 real :: dtthx,psix,dtg,psiq,ustm
453 real :: dt2,rdt,spdk2,fm,fh,hol1,gamfac,vpert,prnum
454 real :: xkzo,ss,ri,qmean,tmean,alph,chi,zk,rl2,dk,sri
455 real :: brint,dtodsd,rdz,dsdzt,dsdzq,dsdz2,ttend,qtend
456 real :: utend,vtend,qctend,qitend,tgc,dtodsu,govrthv
458 real, dimension( its:ite, kts:kte ) :: wscalek, &
461 real, dimension( its:ite ) :: ust3, &
469 real :: prnumfac,bfx0,hfx0,qfx0,delb,dux,dvx, &
470 dsdzu,dsdzv,wm3,dthx,dqx,wspd10,ross,tem1,dsig
472 !----------------------------------------------------------------------
476 !-- imvdif imvdif = 1 for moist adiabat vertical diffusion
479 !----convert ground temperature to potential temperature:
483 ps(i) = psfcpa(i)/1000. ! ps psfc cb
484 thgb(i) = tsk(i)*(100./ps(i))**rovcp
489 thx(i,k) = tx(i,k)/pi2d(i,k)
500 tvcon = (1.+ep1*qx(i,k))
501 thvx(i,k) = thx(i,k)*tvcon
506 e1 = svp1*exp(svp2*(tgdsa(i)-svpt0)/(tgdsa(i)-svp3))
507 qgh(i) = ep2*e1/(ps(i)-e1)
508 cpm(i) = cp*(1.+0.8*qx(i,1))
511 !-----compute the height of full- and half-sigma levels above ground
512 ! level, and the layer thicknesses.
516 rhox(i) = ps(i)*1000./(rd*tx(i,1))
521 zq(i,k+1) = dz8w2d(i,k)+zq(i,k)
527 za(i,k) = 0.5*(zq(i,k)+zq(i,k+1))
528 dzq(i,k) = zq(i,k+1)-zq(i,k)
529 del(i,k) = p2di(i,k)-p2di(i,k+1)
539 dza(i,k) = za(i,k)-za(i,k-1)
544 govrth(i) = g/thx(i,1)
547 !-----initialize vertical tendencies and
571 wspd1(i) = sqrt(ux(i,1)*ux(i,1)+vx(i,1)*vx(i,1))+1.e-9
574 !---- compute vertical diffusion
576 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
577 ! compute preliminary variables
613 thermal(i)= thvx(i,1)
616 if(br(i).gt.0.0) sfcflg(i) = .false.
619 ! compute the first guess of pbl height
629 if(.not.stable(i))then
631 spdk2 = max(ux(i,k)**2+vx(i,k)**2,1.)
632 brup(i) = (thvx(i,k)-thermal(i))*(g*za(i,k)/thvx(i,1))/spdk2
634 stable(i) = brup(i).gt.brcr
641 if(brdn(i).ge.brcr)then
643 elseif(brup(i).le.brcr)then
646 brint = (brcr-brdn(i))/(brup(i)-brdn(i))
648 hpbl(i) = za(i,k-1)+brint*(za(i,k)-za(i,k-1))
649 if(hpbl(i).lt.zq(i,2)) kpbl(i) = 1
650 if(kpbl(i).le.1) pblflg(i) = .false.
654 fm = gz1oz0(i)-psim(i)
655 fh = gz1oz0(i)-psih(i)
656 hol(i) = max(br(i)*fm*fm/fh,rimin)
658 hol(i) = min(hol(i),-zfmin)
660 hol(i) = max(hol(i),zfmin)
662 hol1 = hol(i)*hpbl(i)/zl1(i)*sfcfrac
663 hol(i) = -hol(i)*hpbl(i)/zl1(i)
665 phim(i) = (1.-aphi16*hol1)**(-1./4.)
666 phih(i) = (1.-aphi16*hol1)**(-1./2.)
667 bfx0 = max(hfx(i)/rhox(i)/cpm(i)+ep1*thx(i,1)*qfx(i)/rhox(i),0.)
668 hfx0 = max(hfx(i)/rhox(i)/cpm(i),0.)
669 qfx0 = max(ep1*thx(i,1)*qfx(i)/rhox(i),0.)
670 wstar3(i) = (govrth(i)*bfx0*hpbl(i))
671 wstar(i) = (wstar3(i))**h1
673 phim(i) = (1.+aphi5*hol1)
679 wscale(i) = (ust3(i)+phifac*karman*wstar3(i)*0.5)**h1
680 wscale(i) = min(wscale(i),ust(i)*aphi16)
681 wscale(i) = max(wscale(i),ust(i)/aphi5)
684 ! compute the surface variables for pbl height estimation
685 ! under unstable conditions
689 gamfac = bfac/rhox(i)/wscale(i)
690 hgamt(i) = min(gamfac*hfx(i)/cpm(i),gamcrt)
691 hgamq(i) = min(gamfac*qfx(i),gamcrq)
692 vpert = (hgamt(i)+ep1*thx(i,1)*hgamq(i))/bfac*afac
693 thermal(i) = thermal(i)+max(vpert,0.)
694 hgamt(i) = max(hgamt(i),0.0)
695 hgamq(i) = max(hgamq(i),0.0)
696 brint = -15.9*ust(i)*ust(i)/wspd(i)*wstar3(i)/(wscale(i)**4.)
697 hgamu(i) = brint*ux(i,1)
698 hgamv(i) = brint*vx(i,1)
704 ! enhance the pbl height by considering the thermal
723 if(.not.stable(i).and.pblflg(i))then
725 spdk2 = max(ux(i,k)**2+vx(i,k)**2,1.)
726 brup(i) = (thvx(i,k)-thermal(i))*(g*za(i,k)/thvx(i,1))/spdk2
728 stable(i) = brup(i).gt.brcr
736 if(brdn(i).ge.brcr)then
738 elseif(brup(i).le.brcr)then
741 brint = (brcr-brdn(i))/(brup(i)-brdn(i))
743 hpbl(i) = za(i,k-1)+brint*(za(i,k)-za(i,k-1))
744 if(hpbl(i).lt.zq(i,2)) kpbl(i) = 1
745 if(kpbl(i).le.1) pblflg(i) = .false.
749 ! stable boundary layer
752 if((.not.sfcflg(i)).and.hpbl(i).lt.zq(i,2)) then
761 if((.not.stable(i)).and.((xland(i)-1.5).ge.0))then
762 wspd10 = u10(i)*u10(i) + v10(i)*v10(i)
763 wspd10 = sqrt(wspd10)
764 ross = wspd10 / (cori*znt(i))
765 brcr_sbro(i) = min(0.16*(1.e-7*ross)**(-0.18),.3)
771 if((xland(i)-1.5).ge.0)then
776 if(.not.stable(i))then
778 spdk2 = max(ux(i,k)**2+vx(i,k)**2,1.)
779 brup(i) = (thvx(i,k)-thermal(i))*(g*za(i,k)/thvx(i,1))/spdk2
781 stable(i) = brup(i).gt.brcr
787 if((.not.sfcflg(i)).and.hpbl(i).lt.zq(i,2)) then
788 if((xland(i)-1.5).ge.0)then
794 if(brdn(i).ge.brcr)then
796 elseif(brup(i).le.brcr)then
799 brint = (brcr-brdn(i))/(brup(i)-brdn(i))
801 hpbl(i) = za(i,k-1)+brint*(za(i,k)-za(i,k-1))
802 if(hpbl(i).lt.zq(i,2)) kpbl(i) = 1
803 if(kpbl(i).le.1) pblflg(i) = .false.
807 ! estimate the entrainment parameters
813 wm3 = wstar3(i) + 5. * ust3(i)
815 bfxpbl(i) = -0.15*thvx(i,1)/g*wm3/hpbl(i)
816 dthvx(i) = max(thvx(i,k+1)-thvx(i,k),tmin)
817 dthx = max(thx(i,k+1)-thx(i,k),tmin)
818 dqx = min(qx(i,k+1)-qx(i,k),0.0)
819 we(i) = max(bfxpbl(i)/dthvx(i),-sqrt(wm2(i)))
820 hfxpbl(i) = we(i)*dthx
821 qfxpbl(i) = we(i)*dqx
823 dux = ux(i,k+1)-ux(i,k)
824 dvx = vx(i,k+1)-vx(i,k)
826 ufxpbl(i) = max(prpbl(i)*we(i)*dux,-ust(i)*ust(i))
827 elseif(dux.lt.-tmin) then
828 ufxpbl(i) = min(prpbl(i)*we(i)*dux,ust(i)*ust(i))
833 vfxpbl(i) = max(prpbl(i)*we(i)*dvx,-ust(i)*ust(i))
834 elseif(dvx.lt.-tmin) then
835 vfxpbl(i) = min(prpbl(i)*we(i)*dvx,ust(i)*ust(i))
839 delb = govrth(i)*d3*hpbl(i)
840 delta(i) = min(d1*hpbl(i) + d2*wm2(i)/delb,100.)
846 if(pblflg(i).and.k.ge.kpbl(i))then
847 entfac(i,k) = ((zq(i,k+1)-hpbl(i))/delta(i))**2.
854 ! compute diffusion coefficients below pbl
858 if(k.lt.kpbl(i)) then
859 zfac(i,k) = min(max((1.-(zq(i,k+1)-zl1(i))/(hpbl(i)-zl1(i))),zfmin),1.)
860 xkzo = ckz*dza(i,k+1)
861 zfacent(i,k) = (1.-zfac(i,k))**3.
862 prnumfac = -3.*(max(zq(i,k+1)-sfcfrac*hpbl(i),0.))**2./hpbl(i)**2.
863 prnum = (phih(i)/phim(i)+bfac*karman*sfcfrac)
864 prnum = 1. + (prnum-1.)*exp(prnumfac)
865 prnum = min(prnum,prmax)
866 prnum = max(prnum,prmin)
867 wscalek(i,k) = (ust3(i)+phifac*karman*wstar3(i)*(1.-zfac(i,k)))**h1
868 xkzm(i,k) = xkzo+wscalek(i,k)*karman*zq(i,k+1)*zfac(i,k)**pfac
869 xkzh(i,k) = xkzm(i,k)/prnum
870 xkzm(i,k) = min(xkzm(i,k),xkzmax)
871 xkzm(i,k) = max(xkzm(i,k),xkzmin)
872 xkzh(i,k) = min(xkzh(i,k),xkzmax)
873 xkzh(i,k) = max(xkzh(i,k),xkzmin)
878 ! compute diffusion coefficients over pbl (free atmosphere)
882 xkzo = ckz*dza(i,k+1)
883 if(k.ge.kpbl(i)) then
884 ss = ((ux(i,k+1)-ux(i,k))*(ux(i,k+1)-ux(i,k)) &
885 +(vx(i,k+1)-vx(i,k))*(vx(i,k+1)-vx(i,k))) &
886 /(dza(i,k+1)*dza(i,k+1))+1.e-9
887 govrthv = g/(0.5*(thvx(i,k+1)+thvx(i,k)))
888 ri = govrthv*(thvx(i,k+1)-thvx(i,k))/(ss*dza(i,k+1))
890 if((qcx(i,k)+qix(i,k)).gt.0.01e-3.and.(qcx(i,k+1)+ &
891 qix(i,k+1)).gt.0.01e-3)then
893 qmean = 0.5*(qx(i,k)+qx(i,k+1))
894 tmean = 0.5*(tx(i,k)+tx(i,k+1))
895 alph = xlv*qmean/rd/tmean
896 chi = xlv*xlv*qmean/cp/rv/tmean/tmean
897 ri = (1.+alph)*(ri-g*g/ss/tmean/cp*((chi-alph)/(1.+chi)))
900 zk = karman*zq(i,k+1)
901 rl2 = (zk*rlam/(rlam+zk))**2
906 xkzm(i,k) = xkzo+dk*(1+8.*(-ri)/(1+1.746*sri))
907 xkzh(i,k) = xkzo+dk*(1+8.*(-ri)/(1+1.286*sri))
910 xkzh(i,k) = xkzo+dk/(1+5.*ri)**2
912 prnum = min(prnum,prmax)
913 xkzm(i,k) = (xkzh(i,k)-xkzo)*prnum+xkzo
916 xkzm(i,k) = min(xkzm(i,k),xkzmax)
917 xkzm(i,k) = max(xkzm(i,k),xkzmin)
918 xkzh(i,k) = min(xkzh(i,k),xkzmax)
919 xkzh(i,k) = max(xkzh(i,k),xkzmin)
920 xkzml(i,k) = xkzm(i,k)
921 xkzhl(i,k) = xkzh(i,k)
926 ! compute tridiagonal matrix elements for heat and moisture, and clouds
947 f1(i,1) = thx(i,1)-300.+hfx(i)/(rhox(i)*cpm(i))/zq(i,2)*dt2
948 f3(i,1,1) = qx(i,1)+qfx(i)/(rhox(i))/zq(i,2)*dt2
955 f3(i,1,ic) = qcx(i,1)
957 f3(i,1,ic) = qix(i,1)
965 dtodsd = dt2/del(i,k)
966 dtodsu = dt2/del(i,k+1)
967 dsig = p2d(i,k)-p2d(i,k+1)
969 tem1 = dsig*xkzh(i,k)*rdz
970 if(pblflg(i).and.k.lt.kpbl(i)) then
971 dsdzt = tem1*(-hgamt(i)/hpbl(i)-hfxpbl(i)*zfacent(i,k)/xkzh(i,k))
972 dsdzq = tem1*(-qfxpbl(i)*zfacent(i,k)/xkzh(i,k))
973 f1(i,k) = f1(i,k)+dtodsd*dsdzt
974 f1(i,k+1) = thx(i,k+1)-300.-dtodsu*dsdzt
975 f3(i,k,1) = f3(i,k,1)+dtodsd*dsdzq
976 f3(i,k+1,1) = qx(i,k+1)-dtodsu*dsdzq
977 elseif(pblflg(i).and.k.ge.kpbl(i).and.entfac(i,k).lt.4.6) then
978 xkzh(i,k) = -we(i)*dza(i,kpbl(i))*exp(-entfac(i,k))
979 xkzh(i,k) = sqrt(xkzh(i,k)*xkzhl(i,k))
980 xkzh(i,k) = min(xkzh(i,k),xkzmax)
981 xkzh(i,k) = max(xkzh(i,k),xkzmin)
982 f1(i,k+1) = thx(i,k+1)-300.
983 f3(i,k+1,1) = qx(i,k+1)
985 f1(i,k+1) = thx(i,k+1)-300.
986 f3(i,k+1,1) = qx(i,k+1)
989 au(i,k) = -dtodsd*dsdz2
990 al(i,k) = -dtodsu*dsdz2
991 ad(i,k) = ad(i,k)-au(i,k)
992 ad(i,k+1) = 1.-al(i,k)
993 exch_hx(i,k) = xkzh(i,k)
1002 f3(i,k+1,ic) = qcx(i,k+1)
1003 elseif(ic.eq.3) then
1004 f3(i,k+1,ic) = qix(i,k+1)
1011 ! copies here to avoid duplicate input args for tridin
1023 r3(i,k,ic) = f3(i,k,ic)
1028 ! solve tridiagonal problem for heat and moisture, and clouds
1030 call tridin(al,ad,cu,r1,r3,au,f1,f3,its,ite,kts,kte,ncloud)
1032 ! recover tendencies of heat and moisture
1036 ttend = (f1(i,k)-thx(i,k)+300.)*rdt*pi2d(i,k)
1037 qtend = (f3(i,k,1)-qx(i,k))*rdt
1038 ttnp(i,k) = ttnp(i,k)+ttend
1039 qtnp(i,k) = qtnp(i,k)+qtend
1043 if(ncloud.ge.2) then
1048 qctend = (f3(i,k,ic)-qcx(i,k))*rdt
1049 qctnp(i,k) = qctnp(i,k)+qctend
1050 elseif(ic.eq.3) then
1051 qitend = (f3(i,k,ic)-qix(i,k))*rdt
1052 qitnp(i,k) = qitnp(i,k)+qitend
1059 ! compute tridiagonal matrix elements for momentum
1073 f1(i,1) = ux(i,1)-ux(i,1)/wspd1(i)*ust(i)*ust(i)/zq(i,2)*dt2 &
1074 *(wspd1(i)/wspd(i))**2
1075 f2(i,1) = vx(i,1)-vx(i,1)/wspd1(i)*ust(i)*ust(i)/zq(i,2)*dt2 &
1076 *(wspd1(i)/wspd(i))**2
1081 dtodsd = dt2/del(i,k)
1082 dtodsu = dt2/del(i,k+1)
1083 dsig = p2d(i,k)-p2d(i,k+1)
1085 tem1 = dsig*xkzm(i,k)*rdz
1086 if(pblflg(i).and.k.lt.kpbl(i))then
1087 dsdzu = tem1*(-hgamu(i)/hpbl(i)-ufxpbl(i)*zfacent(i,k)/xkzm(i,k))
1088 dsdzv = tem1*(-hgamv(i)/hpbl(i)-vfxpbl(i)*zfacent(i,k)/xkzm(i,k))
1089 f1(i,k) = f1(i,k)+dtodsd*dsdzu
1090 f1(i,k+1) = ux(i,k+1)-dtodsu*dsdzu
1091 f2(i,k) = f2(i,k)+dtodsd*dsdzv
1092 f2(i,k+1) = vx(i,k+1)-dtodsu*dsdzv
1093 elseif(pblflg(i).and.k.ge.kpbl(i).and.entfac(i,k).lt.4.6) then
1094 xkzm(i,k) = prpbl(i)*xkzh(i,k)
1095 xkzm(i,k) = sqrt(xkzm(i,k)*xkzml(i,k))
1096 xkzm(i,k) = min(xkzm(i,k),xkzmax)
1097 xkzm(i,k) = max(xkzm(i,k),xkzmin)
1098 f1(i,k+1) = ux(i,k+1)
1099 f2(i,k+1) = vx(i,k+1)
1101 f1(i,k+1) = ux(i,k+1)
1102 f2(i,k+1) = vx(i,k+1)
1105 au(i,k) = -dtodsd*dsdz2
1106 al(i,k) = -dtodsu*dsdz2
1107 ad(i,k) = ad(i,k)-au(i,k)
1108 ad(i,k+1) = 1.-al(i,k)
1112 ! copies here to avoid duplicate input args for tridin
1122 ! solve tridiagonal problem for momentum
1124 call tridin(al,ad,cu,r1,r2,au,f1,f2,its,ite,kts,kte,1)
1126 ! recover tendencies of momentum
1130 utend = (f1(i,k)-ux(i,k))*rdt
1131 vtend = (f2(i,k)-vx(i,k))*rdt
1132 utnp(i,k) = utnp(i,k)+utend
1133 vtnp(i,k) = vtnp(i,k)+vtend
1137 !---- end of vertical diffusion
1143 end subroutine ysu2d
1145 subroutine tridin(cl,cm,cu,r1,r2,au,f1,f2,its,ite,kts,kte,nt)
1146 !----------------------------------------------------------------
1148 !----------------------------------------------------------------
1150 integer, intent(in ) :: its,ite, kts,kte, nt
1152 real, dimension( its:ite, kts+1:kte+1 ) , &
1155 real, dimension( its:ite, kts:kte ) , &
1156 intent(in ) :: cm, &
1158 real, dimension( its:ite, kts:kte,nt ) , &
1161 real, dimension( its:ite, kts:kte ) , &
1162 intent(inout) :: au, &
1165 real, dimension( its:ite, kts:kte,nt ) , &
1169 integer :: i,k,l,n,it
1171 !----------------------------------------------------------------
1178 au(i,1) = fk*cu(i,1)
1179 f1(i,1) = fk*r1(i,1)
1184 f2(i,1,it) = fk*r2(i,1,it)
1189 fk = 1./(cm(i,k)-cl(i,k)*au(i,k-1))
1190 au(i,k) = fk*cu(i,k)
1191 f1(i,k) = fk*(r1(i,k)-cl(i,k)*f1(i,k-1))
1197 fk = 1./(cm(i,k)-cl(i,k)*au(i,k-1))
1198 f2(i,k,it) = fk*(r2(i,k,it)-cl(i,k)*f2(i,k-1,it))
1203 fk = 1./(cm(i,n)-cl(i,n)*au(i,n-1))
1204 f1(i,n) = fk*(r1(i,n)-cl(i,n)*f1(i,n-1))
1208 fk = 1./(cm(i,n)-cl(i,n)*au(i,n-1))
1209 f2(i,n,it) = fk*(r2(i,n,it)-cl(i,n)*f2(i,n-1,it))
1214 f1(i,k) = f1(i,k)-au(i,k)*f1(i,k+1)
1220 f2(i,k,it) = f2(i,k,it)-au(i,k)*f2(i,k+1,it)
1225 end subroutine tridin
1227 subroutine ysuinit(rublten,rvblten,rthblten,rqvblten, &
1228 rqcblten,rqiblten,p_qi,p_first_scalar, &
1229 restart, allowed_to_read, &
1230 ids, ide, jds, jde, kds, kde, &
1231 ims, ime, jms, jme, kms, kme, &
1232 its, ite, jts, jte, kts, kte )
1233 !-------------------------------------------------------------------
1235 !-------------------------------------------------------------------
1237 logical , intent(in) :: restart, allowed_to_read
1238 integer , intent(in) :: ids, ide, jds, jde, kds, kde, &
1239 ims, ime, jms, jme, kms, kme, &
1240 its, ite, jts, jte, kts, kte
1241 integer , intent(in) :: p_qi,p_first_scalar
1242 real , dimension( ims:ime , kms:kme , jms:jme ), intent(out) :: &
1249 integer :: i, j, k, itf, jtf, ktf
1251 jtf = min0(jte,jde-1)
1252 ktf = min0(kte,kde-1)
1253 itf = min0(ite,ide-1)
1255 if(.not.restart)then
1261 rthblten(i,k,j) = 0.
1262 rqvblten(i,k,j) = 0.
1263 rqcblten(i,k,j) = 0.
1269 if (p_qi .ge. p_first_scalar .and. .not.restart) then
1273 rqiblten(i,k,j) = 0.
1279 end subroutine ysuinit
1280 !-------------------------------------------------------------------
1281 end module module_bl_ysu