!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE QPFGRID ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE qpfgrid(nx,ny,nz,prcrate,pprt,ptprt,qv,pbar,ptbar, & 1
rhostr,zp,j3,j3inv,raing,temxy1,temxy2,pi,dqv)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Calculate the source/sink terms in temperature and moisture
! equations as a results of large-scale (as opposed to subgird scale)
! condensation. Apply the source terms to ptprt and qv.
!
! The surface gridscale rainfall is accumulated in raing.
!
!-----------------------------------------------------------------------
!
! AUTHOR: V. Wong, L. Zhao and X. Song
! 03/12/95
!
! MODIFICATION HISTORY:
!
! 05/10/95 (L. Zhao)
! Correction made to the calculation of accumulated rainfall
! for restart runs.
!
! 8/12/95 (M. Xue)
! Rearranged the argument list to follow ARPS convention.
!
! 01/31/1996 (V. Wong and X. Song)
! Related the accumulated grid-scale precipitation to the parameter,
! qpfgfrq, that controls the the frequency of calling QPFGRID.
!
!-----------------------------------------------------------------------
!
! INPUT:
!
! nx Number of grid points in the x-direction (east/west)
! ny Number of grid points in the y-direction (north/south)
! nz Number of grid points in the vertical
!
! pprt Perturbation pressure (Pascal)
! ptprt Perturbation potential temperature at a given time
! level (K)
! qv Water vapor specific humidity at a given time level
! (kg/kg)
! ptbar Base state potential temperature (K)
! pbar Base state pressure (Pascal)
!
! OUTPUT:
!
! raing Accumulated gridscale rainfall (mm).
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INTEGER :: nx,ny,nz ! The number grid points in 3 directions
REAL :: pprt (nx,ny,nz) ! Perturbation pressure (Pascal)
REAL :: ptprt (nx,ny,nz) ! Perturbation potential temperature (K)
REAL :: qv (nx,ny,nz) ! Water vapor specific humidity (kg/kg)
REAL :: pbar (nx,ny,nz) ! Base state pressure (Pascal)
REAL :: ptbar (nx,ny,nz) ! Base state potential temperature (K)
REAL :: rhostr (nx,ny,nz) ! Base state density rhobar times j3.
REAL :: zp (nx,ny,nz) ! The height of the terrain.
REAL :: j3 (nx,ny,nz) ! Coordinate transformation
! Jacobian d(zp)/d(z)
REAL :: j3inv (nx,ny,nz) ! Coordinate transformation
! Jacobian d(zp)/d(z)
REAL :: raing (nx,ny) ! Accumulated grid precipitation (mm)
REAL :: prcrate(nx,ny) ! precipitation rate (kg/(m**2*s))
REAL :: temxy1 (nx,ny) ! 2-D work array
REAL :: temxy2 (nx,ny) ! 2-D work array
REAL :: pi (nx,ny) ! 2-D work array
REAL :: dqv (nx,ny) ! 2-D work array
!
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!
INTEGER :: i, j, k
REAL :: rhmin,rhmax,al2ovcr,alovcp
DATA rhmin/0.05/
DATA rhmax/1.0/
DATA al2ovcr/1.346946E+07/ !Lv**2/(CP*Rv)
DATA alovcp/2.487458E+03/ !Lv/Cp
REAL :: es,temp2df,pres,tdf,theta
REAL :: p0inv,pterm,tema,temb
!
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
!
INCLUDE 'globcst.inc'
INCLUDE 'phycst.inc'
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
p0inv=1./p0
!
!-----------------------------------------------------------------------
!
! Initializing the working array for each (i,j) point at beginning.
!
!-----------------------------------------------------------------------
!
DO i=1,nx-1
DO j=1,ny-1
temxy1(i,j)=0.0
END DO
END DO
!
!-----------------------------------------------------------------------
!
DO k=nz-2,2,-1
!
!-----------------------------------------------------------------------
!
DO i=1,nx-1
DO j=1,ny-1
!
!-----------------------------------------------------------------------
!
! Computer needed variables from model inputs. p0 and rddcp are
! included in 'physct.inc'
!
!-----------------------------------------------------------------------
!
pres=pprt(i,j,k) + pbar(i,j,k) ! p
pi(i,j)=(pres*p0inv)**rddcp ! pi
tdf=(ptbar(i,j,k)+ptprt(i,j,k))*pi(i,j) ! temperature
!
!-----------------------------------------------------------------------
!
! Calculate saturation vapor pressure(ES) at (P,T).
!
!-----------------------------------------------------------------------
!
pterm = 0.5 + SIGN(0.5, tdf-260.0)
tema = pterm*17.2694 + (1.-pterm)*21.87456
temb = pterm*35.86 + (1.-pterm)*7.66
es = 610.78*EXP(tema*(tdf-273.16)/(tdf-temb))
!
!-----------------------------------------------------------------------
!
! Computer the saturation specific humidity.
!
!-----------------------------------------------------------------------
!
dqv(i,j)=0.622*es/(pres-0.378*es)
!
!-----------------------------------------------------------------------
!
! Set a lower limit to 'qv field' to avoid negative values.
!
!-----------------------------------------------------------------------
!
qv(i,j,k) = MAX( qv(i,j,k), rhmin*dqv(i,j) )
!
!-----------------------------------------------------------------------
!
! Set the upper limit of 'qv field' such that the RHMAX is equal to
! or less than 1.0.
!
! Modified by Zuwen He (04/2002)
! adopt new naming convention: rhsat
!
! original code: dqv(i,j)=rhmax*dqv(i,j)
! new code: dqv(i,j)=rhsat*dqv(i,j)
!
!-----------------------------------------------------------------------
!
dqv(i,j)=rhsat*dqv(i,j)
!
!-----------------------------------------------------------------------
!
! Compute Dq/Dt term.
!
!-----------------------------------------------------------------------
!
temp2df=1.0+al2ovcr*dqv(i,j)/(tdf*tdf)
!
!-----------------------------------------------------------------------
!
! Check for condensation.
!
!-----------------------------------------------------------------------
!
dqv(i,j)=(qv(i,j,k)-dqv(i,j))/temp2df
IF (dqv(i,j) >= 0.0) temxy1(i,j)=temxy1(i,j)+dqv(i,j) &
*rhostr(i,j,k)*(zp(i,j,k+1)-zp(i,j,k))*j3inv(i,j,k)
!
!-----------------------------------------------------------------------
!
! Check for evaporation.
!
!-----------------------------------------------------------------------
!
temp2df=temxy1(i,j)+dqv(i,j) &
*rhostr(i,j,k)*(zp(i,j,k+1)-zp(i,j,k))*j3inv(i,j,k)
IF(temp2df < 0) THEN
temp2df=0.0
dqv(i,j)=-temxy1(i,j) &
/(rhostr(i,j,k)*(zp(i,j,k+1)-zp(i,j,k))*j3inv(i,j,k))
END IF
!
IF(dqv(i,j) < 0)temxy1(i,j)=temp2df
temxy2(i,j)=tdf
temxy1(i,j)=MAX(0.0,temxy1(i,j)) !keep it positive
END DO
END DO
!
!-----------------------------------------------------------------------
!
! Modify T and q fields at the Kth level.
!
!-----------------------------------------------------------------------
!
IF (curtim > dtbig) THEN
DO i=1,nx-1
DO j=1,ny-1
qv(i,j,k)=MAX(0.0,qv(i,j,k)-dqv(i,j))
tdf=temxy2(i,j) + alovcp*dqv(i,j)
theta=tdf/pi(i,j)
ptprt(i,j,k)=theta-ptbar(i,j,k)
END DO
END DO
END IF
END DO
!
!-----------------------------------------------------------------------
!
! Add in condensation to stable preiciptation array (accumulated
! grid precipitation). The value is cumulated until the cumulus
! parameterization is turn on in the mode, which is control by
! 'confrg'. The unit for rainfall is 'mm'.
!
!-----------------------------------------------------------------------
!
! IF (mod(curtim+0.001,confrq).lt.(0.5*dtbig)) THEN
DO i=1,nx-1
DO j=1,ny-1
tema=temxy1(i,j)/rhow
! raing(i,j)=raing(i,j) +
! : 1000.0* temxy1(i,j) * ( pprt(i,j,2)+pbar(i,j,2) -
! : pprt(i,j,3)-pbar(i,j,3) ) /(rhow*g)
raing(i,j)=raing(i,j) + 1000.0*tema
prcrate(i,j)=tema*rhow/qpfgfrq
END DO
END DO
! ENDIF
RETURN
END SUBROUTINE qpfgrid
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE QPFCUMS ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE qpfcums(nx,ny,nz,prcrate,qvsflx, & 1,8
u,v,w,pprt,ptprt,qv,pbar,ptbar,qvbar,rhostr,zp,j3, &
ptcumsrc,qcumsrc,rainc,nca,kfraincv, &
cldefi,xland,bmjraincv, &
tem1,tem2,tem3,tem4,tem5,tem6,tem7,tem8,tem9,tem10)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Calculate the source/sink terms in temperature and moisture
! equations as a results of subgrid scale (as opposed to grid scale)
! cumulus convection.
!
! Kuo, Kain-Fritsch, and WRF BMJ schemes are used here.
!
! The surface convective rainfall is accumulated in rainc.
!
!-----------------------------------------------------------------------
!
! AUTHOR: V. Wong, L. Zhao and X. Song
! 3/06/95
!
! MODIFICATION HISTORY:
!
! 8/12/95 (M. Xue)
! Rearranged the argument list to follow ARPS conventions.
!
! 08/01/97 (Zonghui Huo)
! Added Kain-fritsch cumulus parameterization scheme.
!
! 13 March 2002 (Eric Kemp)
! Added WRF BMJ cumulus parameterization scheme.
!
! April 2002 (Fanyou Kong)
! Added WRF new Kain-Fritsch (April 2002 version: KF_ETA) scheme
!
!-----------------------------------------------------------------------
!
! INPUT:
!
! nx Number of grid points in the x-direction (east/west)
! ny Number of grid points in the y-direction (north/south)
! nz Number of grid points in the vertical
!
! u x component of velocity at a given time level (m/s)
! v y component of velocity at a given time level (m/s)
! w * z component of velocity at a given time level (m/s)
! for KUO scheme
! * time-average vertical velocity (m/s)
! for Kain Fritsch scheme
!
! pprt Perturbation pressure (Pascal)
! ptprt Perturbation potential temperature (K)
! qv Water vapor specific humidity (kg/kg)
! pbar Base state pressure (Pascal)
! ptbar Base state potential temperature (K)
! qvbar Base state water vapor specific humidity (kg/kg)
! rhostr Base state density rhobar times j3 (kg/m**3)
!
! zp The physical height coordinate defined at w-point
! j3 Coordinate transformation Jacobian, d(zp)/d(z)
!
! OUTPUT:
!
! ptcumsrc Potential temperature source term.
! qcumsrc Water specific humidity source term
! rainc Accumulated precipitation by cumulus convection (mm)
! prcrate precipitatioon rate (mm/s)
! kfraincv K-F convective rainfall (cm)
! nca K-F counter for CAPE release
! cldefi BMJ cloud efficiency
! xland BMJ land/sea mask
! bmjraincv BMJ convective rainfall (cm)
!
! WORK ARRAYS:
!
! tem1 Temporary work array
! tem2 Temporary work array
! tem3 Temporary work array
! tem4 Temporary work array
! tem5 Temporary work array
! tem6 Temporary work array
! tem7 Temporary work array
! tem8 Temporary work array
! tem9 Temporary work array
! tem10 Temporary work array
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INTEGER :: nx,ny,nz ! The number grid points in 3 directions
REAL :: u (nx,ny,nz) ! Total u-velocity (m/s)
REAL :: v (nx,ny,nz) ! Total v-velocity (m/s)
REAL :: w (nx,ny,nz) ! Total w-velocity (m/s)
REAL :: pprt (nx,ny,nz) ! Perturbation pressure (Pascal)
REAL :: ptprt (nx,ny,nz) ! Perturbation potential temperature (K)
REAL :: qv (nx,ny,nz) ! Water vapor specific humidity (kg/kg)
REAL :: pbar (nx,ny,nz) ! Base state pressure (Pascal)
REAL :: ptbar (nx,ny,nz) ! Base state potential temperature (K)
REAL :: qvbar (nx,ny,nz) ! Base state water vapor specific
REAL :: rhostr (nx,ny,nz) ! Base state density rhobar times j3.
REAL :: zp (nx,ny,nz) ! The height of the terrain.
REAL :: j3 (nx,ny,nz) ! Coordinate transformation
! Jacobian d(zp)/d(z)
REAL :: ptcumsrc(nx,ny,nz) ! Source term in pt equation.
REAL :: qcumsrc(nx,ny,nz,5) ! Source term in water equations due
! to cumulus parameterization:
! qcumsrc(1,1,1,1) for qv equation
! qcumsrc(1,1,1,2) for qc equation
! qcumsrc(1,1,1,3) for qr equation
! qcumsrc(1,1,1,4) for qi equation
! qcumsrc(1,1,1,5) for qs equation
REAL :: rainc(nx,ny) ! Accumulated precipitation by convection
REAL :: prcrate(nx,ny) ! precipitation rate (kg/(m**2*s))
REAL :: qvsflx(nx,ny) ! Surface moisture flux (kg/(m**2*s))
REAL :: kfraincv (nx,ny) ! K-F convective rainfall (cm)
INTEGER :: nca (nx,ny) ! K-F counter for CAPE release
!EMK BMJ
REAL,INTENT(INOUT) :: cldefi(nx,ny) ! BMJ cloud efficiency
REAL,INTENT(IN) :: xland(nx,ny) ! BMJ land mask
! (1.0 = land, 2.0 = sea)
REAL,INTENT(INOUT) :: bmjraincv(nx,ny) ! BMJ convective rainfall (cm)
!EMK END
REAL :: tem1 (nx,ny,nz) ! Temporary work array
REAL :: tem2 (nx,ny,nz) ! Temporary work array
REAL :: tem3 (nx,ny,nz) ! Temporary work array
REAL :: tem4 (nx,ny,nz) ! Temporary work array
REAL :: tem5 (nx,ny,nz) ! Temporary work array
REAL :: tem6 (nx,ny,nz) ! Temporary work array
REAL :: tem7 (nx,ny,nz) ! Temporary work array
REAL :: tem8 (nx,ny,nz) ! Temporary work array
REAL :: tem9 (nx,ny,nz) ! Temporary work array
REAL :: tem10(nx,ny,nz) ! Temporary work array
!
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!
INTEGER :: i, j, k
REAL :: p0inv,dthmax
REAL :: kqmax,jqmax,iqmax
!
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
!
INCLUDE 'globcst.inc'
INCLUDE 'phycst.inc'
INCLUDE 'cumucst.inc'
INCLUDE 'mp.inc'
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
p0inv=1./p0
IF(cnvctopt == 3) THEN
CALL set_acct
(kfcum_acct)
IF (myproc == 0) &
WRITE(6,'(1x,a)') 'Use Kain-Fritcsh Scheme,Enter kfinterfc'
CALL kfinterfc
(nx,ny,nz,u,v,w,pprt,ptprt,qv,pbar,ptbar,zp, &
ptcumsrc,qcumsrc,rainc,prcrate, &
nca,kfraincv, &
tem1(1,1,1),tem1(1,1,2),tem1(1,1,3), &
tem2,tem3,tem4,tem5,tem6,tem7,tem8,tem9,tem10)
!KFY KF_ETA
ELSE IF (cnvctopt == 5) THEN
CALL set_acct
(kfcum_acct)
IF (myproc == 0) &
WRITE(6,'(1x,a)') 'Use WRF Kain-Fritcsh Scheme'
CALL interface_wrf_kfetadrv(nx,ny,nz,u,v,w, &
pprt,ptprt,qv,pbar,ptbar,zp, &
ptcumsrc,qcumsrc,prcrate, &
nca,kfraincv)
!KFY END
!EMK BMJ
ELSE IF (cnvctopt == 4) THEN
CALL set_acct
(bmjcum_acct)
IF (myproc == 0) &
WRITE(6,'(1x,a)') 'Use WRF Betts-Miller-Janjic Scheme'
CALL interface_wrf_bmjdrv(nx,ny,nz,pprt,ptprt,qv,pbar,ptbar,zp, &
ptcumsrc,qcumsrc,bmjraincv,prcrate,cldefi,&
xland)
!EMK END
ELSE ! use Kuo-scheme
CALL set_acct
(kuocum_acct)
IF (myproc == 0) &
WRITE(6,'(1x,a)') 'Use KUO cumulus scheme'
!
!-----------------------------------------------------------------------
!
! For each grid point, add the convective parameterization.
!
!-----------------------------------------------------------------------
!
dthmax=0.0
DO j=1,ny-1
DO i=1,nx-1
msflux=-qvsflx(i,j)
DO k=1,nz-1
ucon(k)=(u(i,j,k)+u(i+1,j,k))/2.0
vcon(k)=(v(i,j,k)+v(i,j+1,k))/2.0
wcon(k)=w(i,j,k)
picon(k)=cp*((pprt(i,j,k) + pbar(i,j,k))*p0inv)**rddcp
thtcon(k)=ptbar(i,j,k)+ptprt(i,j,k)
tmpcon(k)=thtcon(k)*picon(k)/cp
!
! DNCON = rhobar
!
dncon(k)=rhostr(i,j,k)
qvcon(k)=qv(i,j,k)
ptcumsrc(i,j,k)=0. !initializing forcing terms
qcumsrc(i,j,k,1)=0.
!
zzcon(k) =zp(i,j,k)
zcon(k)=0.5*(zp(i,j,k)+zp(i,j,k+1))
END DO
!
!-----------------------------------------------------------------------
!
! Calculate enviromental parameters.
!
!-----------------------------------------------------------------------
!
CALL environ
(nz-1)
!
!-----------------------------------------------------------------------
!
! IF there is convective heating, Kuo's cumulus parameterization
! scheme is used.
!
!-----------------------------------------------------------------------
!
IF(igo /= 0) THEN
CALL kuocp
END IF
!
!-----------------------------------------------------------------------
!
! If there is convective heating, adjust and output the forcnig
! terms into the model.
!
!-----------------------------------------------------------------------
!
IF(igo /= 0) THEN
CALL cp2mod
(nz-1)
!
DO k=2,nz-2
ptcumsrc(i,j,k)=ftcon(k)
qcumsrc(i,j,k,1)=frcon(k)
END DO
! IF (mod(curtim+0.001,confrq).lt.(0.5*dtbig))THEN
rainc(i,j)=rainc(i,j)+1000.0*cprecip*confrq/rhow
prcrate(i,j)=cprecip
! ENDIF
!
!-----------------------------------------------------------------------
!
! Find the location of maximum convective heating rate.
!
!-----------------------------------------------------------------------
!
DO k=2,nz-2
IF(ptcumsrc(i,j,k) > dthmax) THEN
dthmax=ptcumsrc(i,j,k)
iqmax=i
jqmax=j
kqmax=k
END IF
END DO
END IF
END DO
END DO
END IF ! End of cumulus schemes
RETURN
END SUBROUTINE qpfcums
!
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE KUOCP ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE kuocp 1,2
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Performs the Kuo's convective cumulus parameterization.
!
!-----------------------------------------------------------------------
!
! AUTHOR: V. Wong, L. Zhao and X. Song
! 3/06/95
!
! MODIFICATION HISTORY:
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
!
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!
INTEGER :: k
INTEGER :: kdiv,klfs,kover,kdet
REAL :: supply
! real SUPPLYW
REAL :: zdetr,bkuo,dzdet,wtgnd,wtdiv,preff,envshr,vhint,overmax, &
factr,vdint,vmint,avtdiff,avgmin,wtlcl, &
anegl,dzdiv,dddt,wtlfs,anegh, &
apos
!
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
!
INCLUDE 'globcst.inc'
INCLUDE 'phycst.inc'
INCLUDE 'cumucst.inc'
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!-----------------------------------------------------------------------
!
! Downdraft flag - 0 - no downdrafts
! 1 - simple downdraft model
!
!-----------------------------------------------------------------------
!
! Initializing the data array for theta and qv forcing terms.
!
!-----------------------------------------------------------------------
!
DO k=1,nkp
ftcon(k)=0.
frcon(k)=0.
END DO
!
!-----------------------------------------------------------------------
!
! Compute vertical moisture convergence into the cloud layer.
! Neglect the horizontal advection of specific humidity since
! it can be shown to be relatively small. Vertical flux out cloud
! top is also assumed small.
!
!-----------------------------------------------------------------------
!
! SUPPLYW=RHOE(KLCL)*RVE(KLCL)*(WPE(KLCL)+WPE(KLCL-1))*.5
!
! SUPPLY=MSFLUX-0.125*(RHOE(2)+RHOE(1))
! : *(WPE(2)+WPE(1))*(RVE(2)-RVE(1))
supply=msflux-0.125*(rhoe(klcl+1)+rhoe(klcl)) &
*(wpe(klcl+1)+wpe(klcl)) &
*(rve(klcl+1)-rve(klcl))
! DO 105 K=3,KMT-1
DO k=klcl+2,kmt-1
supply=supply-0.25*(rhoe(k)+rhoe(k-1)) &
*(wpe(k)+wpe(k-1))*(rve(k)-rve(k-1))
END DO
supply=supply-0.125*(rhoe(kmt)+rhoe(kmt-1)) &
*(wpe(kmt)+wpe(kmt-1))*(rve(kmt)-rve(kmt-1))
! SUPPLY=SUPPLYW
!
!-----------------------------------------------------------------------
!
! If water supply is not large enough, no convective is allowed.
!
!-----------------------------------------------------------------------
!
IF (supply <= 1.0E-3) THEN
igo=0
RETURN
END IF
!
!-----------------------------------------------------------------------
!
! This is the cloud model. Updraft is constant THETA e and
! saturated with respect to water. There is no ice.
! Cloud top is one level above ETL.
!
! THETA e of the updraft
!
!-----------------------------------------------------------------------
!
theu(klcl)=(3.376/tlcl-0.00254)*1000*rve(kcon) &
*(1+0.81*rve(kcon))
theu(klcl)=the(kcon)*EXP(theu(klcl))
PRINT*,'THEU(KLCL)=',theu(klcl),' KLCL=',klcl
!
!-----------------------------------------------------------------------
!
! Equilibrium Temperature Level of the source level air.
!
!-----------------------------------------------------------------------
!
igo=0 ! index variable for convection
DO k=klcl,kmt
CALL the2t
(theu(klcl),pe(k),thu(k),tu(k),rsu(k))
IF(thu(k) > the(k).AND.igo == 0) THEN
igo=1
klfc=k ! level of free convection
END IF
IF(thu(k) <= the(k).AND.igo == 1) GO TO 500 !cloud top
END DO
IF (igo == 0) RETURN
PRINT*,' Convection beyond model top - THup, THenv ',thu(kmt) &
,the(kmt)
k=kmt-1
500 CONTINUE
!
! KETL=MIN(K,KMT)
! KCT=MIN(KETL+1,KMT)
!
ketl=MIN(k-1,kmt)
kct=MIN(ketl,kmt)
CALL the2t
(theu(klcl),pe(kct),thu(kct),tu(kct),rsu(kct))
DO k=1,klfc-1
thu(k)=the(k)
END DO
!
!-----------------------------------------------------------------------
!
! If the cloud is not at least CDZMIN deep or cloud top is
! under 500 mb, no convection is allowed.
!
!-----------------------------------------------------------------------
!
IF (ze(ketl)-ze(klfc) < cdzmin.OR.pe(kct) > 50000.) THEN
igo=0
RETURN
END IF
!
!-----------------------------------------------------------------------
!
! Require the positive area be 50% greater than the negative
! area below the LFC and 5% greater in total.
!
!-----------------------------------------------------------------------
!
anegl=0. ! negative area
DO k=klcl,klfc-1
anegl=anegl+(thu(k)-the(k))*(zc(k)-zc(k-1))
END DO
!
apos=0. ! positive area
DO k=klfc,ketl-1
apos=apos+(thu(k)-the(k))*(zc(k)-zc(k-1))
END DO
!
anegh=0.
DO k=ketl,kct
anegh=anegh+(thu(k)-the(k))*(zc(k)-zc(k-1))
END DO
!
IF(apos < ABS(anegl)*1.5.OR.apos < ABS(anegl+anegh)*1.05) THEN
igo=0
RETURN
END IF
!
!-----------------------------------------------------------------------
!
! The downdraft model - starts at THETA e minimum (LFS).
! Downdraft is 2 degrees colder than
! environment at cloud base increasing to 5 degrees
! colder at the ground.
!
! Find LFS as THETA e minimum
!
!-----------------------------------------------------------------------
!
IF (idownd == 1) THEN
!
DO k=kct,2,-1
IF (thee(k) < thee(k+1).AND.thee(k) < thee(k-1)) GO TO 510
END DO
k=2
510 CONTINUE
klfs=k
IF(klfs <= klcl)klfs=klcl+1
thd(klfs)=the(klfs)
!
!-----------------------------------------------------------------------
!
! Limit dd deficit at the ground to the maximum of positive
! temperature difference of updraft if less than 2.5 degrees.
!
!-----------------------------------------------------------------------
!
dddt=0.
DO k=klcl,kct
dddt=MAX(dddt,thu(k)-the(k))
END DO
IF(dddt > 2.5) dddt=5.
!
thd(2)=the(2)-dddt
thd(klcl)=the(klcl)-dddt*.2
DO k=klcl,klfs
thd(k)=thd(klcl)+(thd(klfs)-thd(klcl))/(ze(klfs)-ze(klcl)) &
*(ze(k)-ze(klcl))
END DO
DO k=3,klcl-1
thd(k)=thd(2)+(thd(klcl)-thd(2))/(ze(klcl)-ze(2)) &
*(ze(k)-ze(2))
END DO
!
!-----------------------------------------------------------------------
!
! Now we need to weight the downdraft relative to the updraft.
! Assume that the dd weight is zero at the LFS, 1/2 of
! updraft at cloud base, and equal to the updraft at cloud
! base at the ground.
!
!-----------------------------------------------------------------------
!
dzdiv=1E20
DO k=1,kmt
IF(ABS(ze(k)-800.) < dzdiv)THEN
kdiv=k
dzdiv=ABS(ze(k)-800.)
END IF
END DO
kdiv=MAX(MIN(klcl,kdiv),2)
IF(kdiv == klcl) kdiv=klcl-1
DO k=1,nkp
wtd(k)=0.
END DO
wtlfs=0.
wtlcl=.1
wtdiv=.2
wtgnd=1.
DO k=klcl+1,klfs
wtd(k)=wtlcl+(wtlfs-wtlcl)/(ze(klfs)-ze(klcl)) &
*(ze(k)-ze(klcl))
END DO
DO k=kdiv,klcl
wtd(k)=wtdiv+(wtlcl-wtdiv)/(ze(klcl)-ze(kdiv)) &
*(ze(k)-ze(kdiv))
END DO
DO k=2,kdiv-1
wtd(k)=wtgnd+(wtdiv-wtgnd)/(ze(kdiv)-ze(2)) &
*(ze(k)-ze(2))
END DO
ELSE ! for idownd=0 option
DO k=1,nkp ! set the downdraft weights to zero
wtd(k)=0.
END DO
DO k=2,klcl-1 ! below cloud base, no difference
thu(k)=the(k)
END DO
END IF
!
!-----------------------------------------------------------------------
!
! Compute the b parameter. Use Fritsch/Chappell's precipitation
! efficiency. Notice that the unit of (DV/DZ) is 10e-3 s-1.
!
!-----------------------------------------------------------------------
!
envshr=SQRT((upe(kct)-upe(klfc))**2 &
+(vpe(kct)-vpe(klfc))**2) &
/(ze(kct)-ze(klfc))*1E3
IF (envshr > 1.35) THEN
preff=1.591-.639*envshr+.0953*envshr**2-.00496*envshr**3
ELSE
preff=.9 !parameter (1-b)
END IF
preff=MAX(0.0,preff) !keep it positive
bkuo=1.-preff !parameter b
!
!-----------------------------------------------------------------------
!
! Initializing the vertical profiles of convective heating and
! moistening
!
!-----------------------------------------------------------------------
!
DO k=2,kmt
vheat(k)=0.
vmois(k)=0.
vmdry(k)=0.
END DO
!
!-----------------------------------------------------------------------
!
! Find the weighted THETA to use for the convection. Where WTD is the
! weights for downdraft. When WTD(k)=0, THCON(k)=THU(k).
!
!-----------------------------------------------------------------------
!
DO k=2,kct
thcon(k)=wtd(k)*thd(k)+(1.-wtd(k))*thu(k)
END DO
!
!-----------------------------------------------------------------------
!
! Heating profile is difference between convective THETAs and
! environment.
!
!-----------------------------------------------------------------------
!
DO k=2,kct
vheat(k)=thcon(k)-the(k) !delta theta
END DO
!
!-----------------------------------------------------------------------
!
! Moisture profile is difference between vapor's of updraft and
! environment in the cloud layer. Below cloud base, air is
! dried by SUPPLY. Downdrafts are assumed to have no effect
! on this.
!
!-----------------------------------------------------------------------
!
zdetr=.66667*ze(kct)
dzdet=1000000.
DO k=klcl,kct
IF(ABS(ze(k)-zdetr) < dzdet)THEN
dzdet=ABS(ze(k)-zdetr)
kdet=k
END IF
END DO
DO k=kdet,kct
vmois(k)=1.
END DO
DO k=klcl,kdet-1
vmois(k)=rsu(k)-rve(k)
END DO
DO k=2,klcl-1
vmdry(k)=rve(k)
END DO
vhint=0.
vmint=0.
vdint=0.
DO k=2,kmt
vhint=vhint+vheat(k)*(zc(k)-zc(k-1)) ! sum (dtheta*dz)
vmint=vmint+vmois(k)*(zc(k)-zc(k-1)) ! sum(dq*dz) for moist case
vdint=vdint+vmdry(k)*(zc(k)-zc(k-1)) ! sum(dq*dz) for dry case
END DO
!
!-----------------------------------------------------------------------
!
! If VHINT is less than 0, there is more negative area than
! positive area. No convection allowed.
!
!-----------------------------------------------------------------------
!
IF (vhint <= 0.) THEN
igo=0
RETURN
END IF
!
!-----------------------------------------------------------------------
!
! Also require that there is a minimum average
! temperature difference between the updraft and environment
! from the LFC to the ETL. This eliminates the cases where
! VHINT is very small and the heating and cooling rates get
! astronomically large.
!
!-----------------------------------------------------------------------
!
avgmin=.10
avtdiff=0.
DO k=klfc,ketl-1
avtdiff=avtdiff+(thcon(k)-the(k))
END DO
avtdiff=avtdiff/MAX(1,ketl-klfc)
IF (avtdiff < avgmin) THEN
igo=0
RETURN
END IF
!
!-----------------------------------------------------------------------
!
! Heating and moistening rates
!
!-----------------------------------------------------------------------
!
3100 CONTINUE
DO k=2,kmt
ftcon(k)=alvl*preff*supply*vheat(k) &
/(pke(k)*rhoe(k)*vhint)
END DO
DO k=klcl,kct
frcon(k)=bkuo*supply*vmois(k)/(rhoe(k)*vmint)
END DO
DO k=2,klcl-1
! FRCON(K)=-SUPPLY*VMDRY(K)/(RHOE(K)*VDINT)
frcon(k)=0.0
END DO
!
!-----------------------------------------------------------------------
!
DO k=klfc,ketl-1
qvct1(k)=the(k)+confrq*ftcon(k)
END DO
overmax=0.
DO k=klfc,ketl-1
IF(qvct1(k)-thu(k) > overmax)THEN
overmax=(qvct1(k)-thu(k))/(ftcon(k)*confrq)
kover=k
END IF
END DO
IF(overmax > 0.) THEN
factr=1.-overmax
supply=factr*supply
GO TO 3100
END IF
cprecip=preff*supply
RETURN
END SUBROUTINE kuocp
!
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE CP2MOD ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE cp2mod(nzz) 1
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Convert the cumulus heating and moistening in the convective grid
! to model grid.
!
!-----------------------------------------------------------------------
!
! AUTHOR: V. Wong, L. Zhao and X. Song
! 3/06/95
!
! MODIFICATION HISTORY:
!
!-----------------------------------------------------------------------
!
! INPUT:
!
! nzz
! See the include file cumucst.inc
!
! OUTPUT:
!
! See the include file cumucst.inc
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INTEGER :: nzz
!
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!
INTEGER :: k
INTEGER :: nz1,l
REAL :: tftm,frres,ftres,tfrm,tftc,s_sum,dzlft,tfrc
!
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
!
INCLUDE 'globcst.inc'
INCLUDE 'phycst.inc'
INCLUDE 'cumucst.inc'
REAL :: vctr5(nkp),vctr6(nkp)
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!-----------------------------------------------------------------------
!
! Compute integrated heating and moistening energy tendencies
!
!-----------------------------------------------------------------------
!
DO k=2,kmt
qvct1(k)=rhoe(k)*ftcon(k)*pke(k)
qvct2(k)=rhoe(k)*alvl*frcon(k)
qvct3(k)=(zc(k)-zc(k-1))*qvct1(k) !delta (ZE(k))
qvct4(k)=(zc(k)-zc(k-1))*qvct2(k)
END DO
tftc=s_sum(kmt-1,qvct3(2),1) !vertical integration
tfrc=s_sum(kmt-1,qvct4(2),1)
!
!-----------------------------------------------------------------------
!
! Transfer energy tendencies to model grids
!
!-----------------------------------------------------------------------
!
nz1=nzz-1
DO k=1,nzz !initializing data arrays
vctr5(k)=0.
vctr6(k)=0.
END DO
dzlft=0.
l=2
DO k=2,nzz-1
IF(dzlft /= 0.) THEN
vctr5(k)=vctr5(k)+qvct1(l)*dzlft
vctr6(k)=vctr6(k)+qvct2(l)*dzlft
l=l+1
END IF
500 CONTINUE
IF(zc(l) <= zzcon(k)) THEN
vctr5(k)=vctr5(k)+qvct1(l)*(zc(l)-zc(l-1))
vctr6(k)=vctr6(k)+qvct2(l)*(zc(l)-zc(l-1))
l=l+1
dzlft=0.
GO TO 500
ELSE
vctr5(k)=vctr5(k)+qvct1(l)*(zzcon(k)-zc(l-1))
vctr6(k)=vctr6(k)+qvct2(l)*(zzcon(k)-zc(l-1))
dzlft=zc(l)-zzcon(k)
END IF
END DO
tftm=s_sum(nz1,vctr5(2),1)
tfrm=s_sum(nz1,vctr6(2),1)
!
!-----------------------------------------------------------------------
!
! Make sure the transfer from the convective grid to the model
! grid happened correctly.
!
!-----------------------------------------------------------------------
!
ftres=tftm-tftc
frres=tfrm-tfrc
IF(ABS(ftres) > .01*ABS(tftc)) THEN
PRINT*,' Energy error in grid tranfser in convective param.'
PRINT*,' TFTM,TFTC ',tftm,tftc
END IF
!
!-----------------------------------------------------------------------
!
! Change energy tendencies to temperature and mixing ratio
! tendencies.
!
!-----------------------------------------------------------------------
!
DO k=2,nzz-1
ftcon(k)=vctr5(k)/((zzcon(k+1)-zzcon(k))*dncon(k)*picon(k))
frcon(k)=vctr6(k)/((zzcon(k+1)-zzcon(k))*dncon(k)*alvl)
END DO
RETURN
END SUBROUTINE cp2mod
!
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE ENVIRON ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE environ(nzz) 1,10
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Stability check and determination of cloud base and top
!
!-----------------------------------------------------------------------
!
! AUTHOR: V. Wong, L. Zhao and X. Song
! 3/06/95
!
! MODIFICATION HISTORY:
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INTEGER :: nzz
!
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!
INTEGER :: k,nkmid
REAL :: rlll,zlll,plll,themax,tlll,dzlll,tdu,rdsu,thdu,dzdd, &
abe,znz,wcpmax
!
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
!
INCLUDE 'globcst.inc'
INCLUDE 'phycst.inc'
INCLUDE 'cumucst.inc'
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
REAL :: hz(nkp)
!
!-----------------------------------------------------------------------
!
! Basic constants
!
!-----------------------------------------------------------------------
!
cpr=3.4965 ! Cp/Rd
alvl=2.68E6 ! Binbin Zhuo, July 24, 1997
aliv=2.837E6 ! Lf
dzlow=200. ! higher vertical increment
dzhigh=500. ! lower vertical increment
zmid=3000. ! height of cloud base
cdzmin=3000. ! depth of cloud
!
!-----------------------------------------------------------------------
!
! Compute moist static energy profile. Cp*T+G*Z+Lv*q
!
!-----------------------------------------------------------------------
!
DO k=1,nzz
hz(k)=cp*tmpcon(k)+g*zcon(k)+alvl*qvcon(k)
END DO
!
!-----------------------------------------------------------------------
!
! Check for conditional instability. If no instability exist, there
! will be no convection.
!
!-----------------------------------------------------------------------
!
igo=0 !index variable for convection
DO k=2,nzz
IF(hz(k) > hz(k+1))THEN
igo=1
EXIT
END IF
END DO
! 500 CONTINUE
IF(igo == 0) RETURN
!
!-----------------------------------------------------------------------
!
! Check the upward motion. Only it is greater than some value, like
! WCONMIN, under ZMID, the convection is possible.
!
!-----------------------------------------------------------------------
!
igo=0
wcpmax=-1.e10
DO k=2,nzz
IF(zcon(k) > zmid)EXIT
wcpmax=MAX(wcpmax,wcon(k)) !w in cloud base
END DO
! 510 CONTINUE
IF (wcpmax > 0.0.AND.wcpmax > wcldbs ) igo=1 ! WCLDBS is input parm.
IF (igo == 0) RETURN
!
!-----------------------------------------------------------------------
!
! If the above two conditions are satisfied, set the convective analysis
! grids. There are two type of resolutions. Lower resolution for upper
! levels (above ZMID), higher resolution for lower levels (below ZMID)
!
!-----------------------------------------------------------------------
!
nkmid=zmid/dzlow+1 !# of grid points below cloud base
zc(1)=0.0
DO k=2,nkmid
zc(k)=zc(1)+(k-1)*dzlow
END DO
DO k=nkmid+1,nkp
zc(k)=zc(nkmid)+(k-nkmid)*dzhigh
END DO
!
!-----------------------------------------------------------------------
!
! Computer the height at PI grid points.
!
!-----------------------------------------------------------------------
!
ze(1)=0.
DO k=2,nkp
ze(k)=(zc(k)+zc(k-1))*.5
END DO
!
!-----------------------------------------------------------------------
!
! Find the model top on the convective analysis grids.
!
!-----------------------------------------------------------------------
!
znz=zcon(nzz) ! the height of the model top
DO k=nkp,1,-1 ! to find the cloud grid close to the model top
IF(ze(k) < znz)GO TO 520
END DO
CALL arpsstop
('arpsstop called from environ',1)
! means cloud is out of the analysis domain
520 CONTINUE
kmt=k ! the level of cloud top in cloud grids
!
!-----------------------------------------------------------------------
!
! Interpolate model(environment) variables to the convective analysis
! grids.
!
!-----------------------------------------------------------------------
!
CALL htint
(nzz,ucon,zcon,kmt,upe,ze) ! u
CALL htint
(nzz,vcon,zcon,kmt,vpe,ze) ! v
CALL htint
(nzz,wcon,zzcon,kmt,wpe,ze) ! w
CALL htint
(nzz,thtcon,zcon,kmt,the,ze) ! theta
CALL htint
(nzz,qvcon,zcon,kmt,rve,ze) ! q
!
!-----------------------------------------------------------------------
!
! Set the minimum value of qv.
!
!-----------------------------------------------------------------------
!
DO k=1,kmt
rve(k)=MAX(rve(k),1E-8) ! set the limited qv
END DO
!
!-----------------------------------------------------------------------
!
! Computer theta V, theta E, and get PI pressure profile.
!
!-----------------------------------------------------------------------
!
DO k=1,kmt
thve(k)=the(k)*(1.+.61*rve(k)) ! virtual potential temperature
END DO
pke(1)=picon(1)
DO k=2,kmt
pke(k)=pke(k-1)-g*2.*(ze(k)-ze(k-1)) &
/(thve(k)+thve(k-1))
END DO
DO k=1,kmt
te(k)=the(k)*pke(k)/cp ! temp
pe(k)=(pke(k)/cp)**cpr*p0 ! pressure
rhoe(k)=pe(k)/(rd*te(k)*(1.+.61*rve(k))) ! density
END DO
!
!-----------------------------------------------------------------------
!
! Computer theta E.
!
!-----------------------------------------------------------------------
!
DO k=1,kmt
CALL thetae
(pe(k),te(k),rve(k),thee(k))
END DO
!
!-----------------------------------------------------------------------
!
! Find the main source level of the updraft. First, test if any
! inversion below 1.2 km.
!
!-----------------------------------------------------------------------
!
DO k=3,nkmid !check the levels below ZMID
IF(te(k) > te(k-1).AND.te(k) > te(k+1) &
.AND.ze(k) <= 1200.)THEN
kcon=k
GO TO 530
END IF
END DO
!
!-----------------------------------------------------------------------
!
! If there isn't an inversion, use the level of highest theta E.
!
!-----------------------------------------------------------------------
!
themax=0.
DO k=2,nkmid
IF(thee(k) > themax)THEN
themax=thee(k)
kcon=k
END IF
END DO
!
!-----------------------------------------------------------------------
!
! Find the LCL of a layer average around the source level.
!
!-----------------------------------------------------------------------
!
530 CONTINUE
tlll=(te(kcon)+te(kcon+1)+te(kcon-1))/3. ! averaged
plll=pe(kcon)
rlll=(rve(kcon)+rve(kcon+1)+rve(kcon-1))/3. ! averaged
zlll=ze(kcon)
!
!-----------------------------------------------------------------------
!
! Find the (p,t) at the condesation level and the height of LCL relative
! to the source level.
!
!-----------------------------------------------------------------------
!
CALL lcl
(tlll,plll,rlll,tlcl,plcl,dzlcl) ! condesation level
!
!-----------------------------------------------------------------------
!
! Find the closest level on the convective grid near the LCL.
!
!-----------------------------------------------------------------------
!
dzlll=1E20
DO k=1,kmt
dzdd=ABS(ze(k)-(zlll+dzlcl))
IF(dzdd < dzlll)THEN
dzlll=dzdd
klcl=k
END IF
END DO
!
!-----------------------------------------------------------------------
!
! If there is not upward motion at the LCL, no convection (must be
! greater than wconmin)
!
!-----------------------------------------------------------------------
!
IF(wpe(klcl) < 0.0.OR.wpe(klcl) < wcldbs)THEN
igo=0
RETURN
END IF
!
!-----------------------------------------------------------------------
!
! Locate equilibrium temperature level of an unentrained parcel.
!
!-----------------------------------------------------------------------
!
theu(klcl)=(3.376/tlcl-0.00254)*1000*rve(kcon) &
*(1+0.81*rve(kcon))
theu(klcl)=the(kcon)*EXP(theu(klcl))
DO k=klcl,kmt
IF(theu(klcl) <= thve(k))THEN
ketl=k
GO TO 540
END IF
END DO
CALL arpsstop
("arpsstop called from environ at 540",1)
540 CONTINUE
!
!-----------------------------------------------------------------------
!
! If the cloud depth is less than a critical value (CDZMID), then
! convection is not allowed.
!
!-----------------------------------------------------------------------
!
IF(ze(ketl)-ze(klcl) < cdzmin)THEN
igo=0
RETURN
END IF
!
!-----------------------------------------------------------------------
!
! Computer initial ABE (Avaliable Buoyant Energy). Convection is allowed
! only if ABE is positive.
!
!-----------------------------------------------------------------------
!
abe=0.
DO k=klcl,ketl
CALL the2t
(theu(klcl),pe(k),thdu,tdu,rdsu)
abe=abe+(thdu*(1.+.61*rdsu)-thve(k))/thve(k)*(zc(k)-zc(k-1))
END DO
IF(abe <= 0.)THEN
igo=0
RETURN
END IF
!
RETURN
END SUBROUTINE environ
!
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE LCL ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE lcl(t0,pp0,r0,tlcl,plcl,dzlcl) 1,1
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Determine the LCL.
!
!-----------------------------------------------------------------------
!
! AUTHOR:
!
! MODIFICATION HISTORY:
!
!-----------------------------------------------------------------------
!
! INPUT:
!
! OUTPUT:
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
REAL :: t0,pp0,r0,tlcl,plcl,dzlcl
REAL :: cpg,cpr,p00k
DATA cpg/102.45/,cpr/3.4965/,p00k/26.91535/
!
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!
INTEGER :: nitt
REAL :: dz,td,ttth0,ttd,rvs,r_rs,ti,pki,pppi,p0k,pi0i
!
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
!
INCLUDE 'phycst.inc'
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
plcl=pp0
tlcl=t0
p0k=pp0**rddcp
pi0i=p0k/p00k*cp
ttth0=t0*p00k/p0k
ttd=td(pp0,r0)
dz=cpg*(t0-ttd)
IF(dz <= 0.)THEN
dzlcl=0.
RETURN
END IF
DO nitt=1,50
pki=pi0i-g*dz/(ttth0*(1.+.61*r0))
pppi=(pki/cp)**cpr*p0
ti=ttth0*pki/cp
rvs=r_rs(pppi,ti)
IF (ABS(rvs-r0) < .00001) GO TO 110
ttd=td(pppi,r0)
dz=dz+cpg*(ti-ttd)
END DO
CALL arpsstop
("arpstop called from lcl at 100",1)
110 CONTINUE
plcl=pppi
tlcl=ti
dzlcl=dz
RETURN
END SUBROUTINE lcl
!
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE THE2T ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE the2t(the,p,th,t,r) 3,1
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Convert potential temperature to temperature.
!
!-----------------------------------------------------------------------
!
! AUTHOR:
!
! MODIFICATION HISTORY:
!
!-----------------------------------------------------------------------
!
! INPUT:
!
! OUTPUT:
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
REAL :: the,p,th,t,r
!
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!
INTEGER :: itter
REAL :: TO,pi,alvl,tn,r_rs,cp
DATA cp/1004./,alvl/2.68E6/ ! new, suggested by G S Bhat
! and modified by Binbin Zhou
pi=(p*1E-5)**.286
TO=the/EXP((3.376/295.-0.00254)*1000*.012*(1+0.81*.012))*pi
DO itter=1,50
r=r_rs(p,TO)
th=the/EXP((3.376/TO-0.00254)*1000*r*(1+0.81*r))
tn=th*pi
IF(ABS(TO-tn) < 0.005)GO TO 12
TO=TO+(tn-TO)*.3
END DO
WRITE(6,1) the,p,TO,tn,th,r
1 FORMAT(' STOP IN ROUTINE THE2T '/' THE,P,TO,TN,TH,R',6E15.6)
CALL arpsstop
("arpstop called from the2t",1)
12 CONTINUE
t=tn
RETURN
END SUBROUTINE the2t
!
!##################################################################
!##################################################################
!###### ######
!###### FUNCTION R_RS ######
!###### ######
!##################################################################
!##################################################################
!
FUNCTION r_rs(p,t)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Compute saturation mixing ratio.
!
!-----------------------------------------------------------------------
!
! AUTHOR:
!
! MODIFICATION HISTORY:
!
!-----------------------------------------------------------------------
!
! INPUT:
!
! OUTPUT:
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
REAL :: r_rs,p,t
!
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!
REAL :: es
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
es=610.78*EXP(17.269*(t-273.16)/(t-35.86))
r_rs=.622*es/(p-es)
RETURN
END FUNCTION r_rs
!
!##################################################################
!##################################################################
!###### ######
!###### FUNCTION TD ######
!###### ######
!##################################################################
!##################################################################
!
FUNCTION td(p,rs)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
!-----------------------------------------------------------------------
!
! AUTHOR:
!
! MODIFICATION HISTORY:
!
!-----------------------------------------------------------------------
!
! INPUT:
!
! OUTPUT:
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
REAL :: td,p,rs
!
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!
REAL :: rr,es,esln
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
rr=rs+1E-8
es=p*rr/(.622+rr)
esln=LOG(es)
td=(35.86*esln-4947.2325)/(esln-23.6837)
RETURN
END FUNCTION td
!
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE HTINT ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE htint(nzz1,vctra,eleva,nzz2,vctrb,elevb) 5,1
!
!-----------------------------------------------------------------------
!
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
!-----------------------------------------------------------------------
!
! AUTHOR:
!
! MODIFICATION HISTORY:
!
!-----------------------------------------------------------------------
!
! INPUT:
!
! OUTPUT:
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INTEGER :: nzz1,nzz2
REAL :: vctra(nzz1),vctrb(nzz2),eleva(nzz1),elevb(nzz2)
!
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!
INTEGER :: l,k
REAL :: wt
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! stop SGI pfa compiler from parallelize the code
!*$*NOCONCURRENTIZE
l=1
DO k=1,nzz2
30 CONTINUE
IF (elevb(k) < eleva(1)) GO TO 35
IF (elevb(k) >= eleva(l).AND.elevb(k) <= eleva(l+1)) GO TO 35
IF (elevb(k) > eleva(nzz1)) GO TO 36
l=l+1
IF (l == nzz1) CALL arpsstop
('arpstop called from htint',1)
GO TO 30
35 CONTINUE
wt=(elevb(k)-eleva(l))/(eleva(l+1)-eleva(l))
vctrb(k)=vctra(l)+(vctra(l+1)-vctra(l))*wt
CYCLE
36 CONTINUE
wt=(elevb(k)-eleva(nzz1))/(eleva(nzz1-1)-eleva(nzz1))
vctrb(k)=vctra(nzz1)+(vctra(nzz1-1)-vctra(nzz1))*wt
END DO
! SGI pfa compiler directive:
!*$*CONCURRENTIZE
RETURN
END SUBROUTINE htint
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE THETAE ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE thetae(p,t,rv,the) 1,1
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Compute equivalent potential temperature.
!
!-----------------------------------------------------------------------
!
! AUTHOR:
!
! MODIFICATION HISTORY:
!
!-----------------------------------------------------------------------
!
! INPUT:
!
! OUTPUT:
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
REAL :: p,t,rv,the
!
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!
INTEGER :: itter
REAL :: ttd,td,pit,tupo,tupn,tmn,dz,cpg
REAL :: cp,g,r,alvl
DATA cp/1004./,g/9.8/,r/287./,alvl/2.68E6/ ! modified by
! Binbin Zhou
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
cpg=cp/g
pit=p
tupo=t
ttd=td(p,rv)
dz=cpg*(t-ttd)
IF(dz <= 0.)GO TO 20
DO itter=1,50
tupn=t-g/cp*dz
tmn=(tupn+t)*.5*(1.+.61*rv)
pit=p*EXP(-g*dz/(r*tmn))
IF(ABS(tupn-tupo) < 0.001)GO TO 20
ttd=td(pit,rv)
tupo=tupn
dz=dz+cpg*(tupn-ttd)
END DO
CALL arpsstop
("arpstop called from thetae",1)
20 CONTINUE
the=(3.376/tupo-0.00254)*1000*rv*(1+0.81*rv)
the=tupo*(1E5/pit)**.286*EXP(the)
RETURN
END SUBROUTINE thetae
!
!##################################################################
!##################################################################
!###### ######
!###### FUNCTION S_SUM ######
!###### ######
!##################################################################
!##################################################################
!
FUNCTION s_sum(nn,vctr,inc)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
!-----------------------------------------------------------------------
!
! AUTHOR:
!
! MODIFICATION HISTORY:
!
!-----------------------------------------------------------------------
!
! INPUT:
!
! OUTPUT:
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INTEGER :: nn,inc
REAL :: vctr(nn)
REAL :: s_sum
!
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!
INTEGER :: k
REAL :: sum
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
sum=0.
DO k=1,nn,inc
sum=sum+vctr(k)
END DO
s_sum=sum
RETURN
END FUNCTION s_sum
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE ES_CAL ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE es_cal(t,ess)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! This function computer vapor pressure over water (in Pascal).
!
!-----------------------------------------------------------------------
!
! AUTHOR:
!
! MODIFICATION HISTORY:
!
!-----------------------------------------------------------------------
!
! INPUT:
!
! OUTPUT:
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
REAL :: t,ess
!
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!
REAL :: a1,a2,b1,b2,tt,t1,t2,tice
DATA a1/17.2694/a2/21.87456/
DATA b1/35.86/b2/7.66/
DATA tice/260.0/
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
tt=t
IF (tt <= tice) GO TO 10
t1=a1*(tt-273.16)
t2=tt-b1
GO TO 11
10 t1=a2*(tt-273.16)
t2=tt-b2
11 ess=610.78*EXP(t1/t2)
RETURN
END SUBROUTINE es_cal