!WRF:MODEL_LAYER:PHYSICS
!
MODULE module_cu_gf 1
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!
! This convective parameterization is build to attempt !
! a smooth transition to cloud resolving scales as proposed!
! by Arakawa et al (2011, ACP). It currently does not use !
! subsidencespreading as in G3. Difference and details !
! will be described in a forthcoming paper by !
! Grell and Freitas (2013). The parameterization also !
! offers options to couple with aerosols. Both, the smooth !
! transition part as well as the aerosol coupling are !
! experimental. While the smooth transition part is turned !
! on, nd has been tested dow to a resolution of about 3km !
! the aerosol coupling is turned off. !
! More clean-up as well as a direct coupling to chemistry !
! will follow for V3.5.1 !
! !
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
CONTAINS
!-------------------------------------------------------------
SUBROUTINE GFDRV( & 1,3
DT,itimestep,DX &
,rho,RAINCV,PRATEC &
,U,V,t,W,q,p,pi &
,dz8w,p8w,XLV,CP,G,r_v &
,htop,hbot,ktop_deep &
,CU_ACT_FLAG,warm_rain &
,APR_GR,APR_W,APR_MC,APR_ST,APR_AS &
,APR_CAPMA,APR_CAPME,APR_CAPMI &
,MASS_FLUX,HT,hfx,qfx,XLAND,gsw,edt_out &
,GDC,GDC2 ,kpbl,k22_shallow,kbcon_shallow &
,ktop_shallow,xmb_shallow &
,cugd_tten,cugd_qvten ,cugd_qcten &
,cugd_ttens,cugd_qvtens,cugd_avedx,imomentum &
,ichoice &
,ishallow_g3,ids,ide, jds,jde, kds,kde &
,ims,ime, jms,jme, kms,kme &
,its,ite, jts,jte, kts,kte &
,periodic_x,periodic_y &
,RQVCUTEN,RQCCUTEN,RQICUTEN &
,RQVFTEN,RTHFTEN,RTHCUTEN,RTHRATEN &
,rqvblten,rthblten &
,F_QV ,F_QC ,F_QR ,F_QI ,F_QS &
#if ( WRF_DFI_RADAR == 1 )
! Optional CAP suppress option
,do_capsuppress,cap_suppress_loc &
#endif
)
!-------------------------------------------------------------
IMPLICIT NONE
! autoconv, 1=old c0, 2=berry c0
integer, parameter :: autoconv=1
!aeroevap, 1=old,2=?, 3=average
integer, parameter :: aeroevap=1
integer, parameter :: training=0
integer, parameter :: use_excess=0
integer, parameter :: use_excess_sh=0
integer, parameter :: maxiens=1
integer, parameter :: maxens=1
integer, parameter :: maxens2=1
integer, parameter :: maxens3=16
integer, parameter :: ensdim=16
real, parameter :: ccnclean=250.
real, parameter :: aodccn=0.1
real, parameter :: beta=0.02
!-------------------------------------------------------------
INTEGER, INTENT(IN ) :: &
ids,ide, jds,jde, kds,kde, &
ims,ime, jms,jme, kms,kme, &
its,ite, jts,jte, kts,kte
LOGICAL periodic_x,periodic_y
integer, parameter :: ens4_spread = 3 ! max(3,cugd_avedx)
integer, parameter :: ens4=ens4_spread*ens4_spread
integer, intent (in ) :: ichoice
INTEGER, INTENT(IN ) :: ITIMESTEP,cugd_avedx, &
ishallow_g3,imomentum
LOGICAL, INTENT(IN ) :: warm_rain
REAL, INTENT(IN ) :: XLV, R_v
REAL, INTENT(IN ) :: CP,G
REAL, DIMENSION( ims:ime , kms:kme , jms:jme ) , &
INTENT(IN ) :: &
U, &
V, &
W, &
pi, &
t, &
q, &
p, &
dz8w, &
p8w, &
rho
REAL, DIMENSION( ims:ime , kms:kme , jms:jme ) , &
OPTIONAL , &
INTENT(INOUT ) :: &
GDC,GDC2
REAL, DIMENSION( ims:ime , jms:jme ),INTENT(IN) :: hfx,qfx,GSW,HT,XLAND
INTEGER, DIMENSION( ims:ime , jms:jme ),INTENT(IN) :: KPBL
INTEGER, DIMENSION( ims:ime , jms:jme ),INTENT(INOUT) :: k22_shallow, &
kbcon_shallow,ktop_shallow
!
REAL, INTENT(IN ) :: DT, DX
!
REAL, DIMENSION( ims:ime , jms:jme ), &
INTENT(INOUT) :: pratec,RAINCV, MASS_FLUX, &
APR_GR,APR_W,APR_MC,APR_ST,APR_AS, &
edt_out,APR_CAPMA,APR_CAPME,APR_CAPMI, &
htop,hbot,xmb_shallow
!+lxz
! REAL, DIMENSION( ims:ime , jms:jme ) :: & !, INTENT(INOUT) :: &
! HTOP, &! highest model layer penetrated by cumulus since last reset in radiation_driver
! HBOT ! lowest model layer penetrated by cumulus since last reset in radiation_driver
! ! HBOT>HTOP follow physics leveling convention
LOGICAL, DIMENSION( ims:ime , jms:jme ), &
INTENT(INOUT) :: CU_ACT_FLAG
!
! Optionals
!
INTEGER, DIMENSION( ims:ime, jms:jme ), &
OPTIONAL, &
INTENT( OUT) :: ktop_deep
REAL, DIMENSION( ims:ime , kms:kme , jms:jme ), &
OPTIONAL, &
INTENT(INOUT) :: RTHFTEN, &
cugd_tten,cugd_qvten,cugd_qcten, &
cugd_ttens,cugd_qvtens, &
RQVFTEN
REAL, DIMENSION( ims:ime , kms:kme , jms:jme ), &
OPTIONAL, &
INTENT(INOUT) :: &
RTHCUTEN, &
RQVCUTEN, &
RQVBLTEN, &
RTHBLTEN, &
RTHRATEN, &
RQCCUTEN, &
RQICUTEN
!
! Flags relating to the optional tendency arrays declared above
! Models that carry the optional tendencies will provdide the
! optional arguments at compile time; these flags all the model
! to determine at run-time whether a particular tracer is in
! use or not.
!
LOGICAL, OPTIONAL :: &
F_QV &
,F_QC &
,F_QR &
,F_QI &
,F_QS
#if ( WRF_DFI_RADAR == 1 )
!
! option of cap suppress:
! do_capsuppress = 1 do
! do_capsuppress = other don't
!
!
INTEGER, INTENT(IN ) ,OPTIONAL :: do_capsuppress
REAL, DIMENSION( ims:ime, jms:jme ),INTENT(IN ),OPTIONAL :: cap_suppress_loc
REAL, DIMENSION( its:ite ) :: cap_suppress_j
#endif
! LOCAL VARS
real, dimension(its:ite,jts:jte,1:ensdim) :: &
xf_ens,pr_ens
real, dimension ( its:ite , jts:jte , 1:ensdim) :: &
massflni,xfi_ens,pri_ens
REAL, DIMENSION( its:ite , jts:jte ) :: MASSI_FLX, &
APRi_GR,APRi_W,APRi_MC,APRi_ST,APRi_AS, &
edti_out,APRi_CAPMA,APRi_CAPME,APRi_CAPMI,gswi
real, dimension (its:ite,kts:kte) :: &
SUBT,SUBQ,OUTT,OUTQ,OUTQC,phh,subm,cupclw,dhdt, &
outts,outqs,outqcs
real, dimension (its:ite) :: &
ztexec,zqexec,pret, ter11, aa0, fp,xlandi
!+lxz
integer, dimension (its:ite) :: &
ierr,ierrs,kbcon, ktop,kpbli,k22s,kbcons,ktops
!.lxz
integer, dimension (its:ite,jts:jte) :: &
iact_old_gr
integer :: iens,ibeg,iend,jbeg,jend,n,nn,ens4n
integer :: ibegh,iendh,jbegh,jendh
integer :: ibegc,iendc,jbegc,jendc
real rho_dryar,temp
real :: PTEN,PQEN,PAPH,ZRHO,PAHFS,PQHFL,ZKHVFL,ZWS,PGEOH
!
! basic environmental input includes moisture convergence (mconv)
! omega (omeg), windspeed (us,vs), and a flag (aaeq) to turn off
! convection for this call only and at that particular gridpoint
!
real, dimension (its:ite,kts:kte) :: &
zo,T2d,q2d,PO,P2d,US,VS,rhoi,tn,qo,tshall,qshall
real, dimension (its:ite,kts:kte,1:ens4) :: &
omeg
real, dimension (its:ite) :: &
ccn,Z1,PSUR,AAEQ,cuten,umean,vmean,pmean,xmbs
real, dimension (its:ite,1:ens4) :: &
mconv
INTEGER :: i,j,k,ICLDCK,ipr,jpr
REAL :: tcrit,tscl_KF,dp,dq,sub_spread,subcenter
INTEGER :: itf,jtf,ktf,iss,jss,nbegin,nend
INTEGER :: high_resolution
REAL :: rkbcon,rktop !-lxz
character*50 :: ierrc(its:ite)
character*50 :: ierrcs(its:ite)
! ruc variable
real, dimension (its:ite) :: tkm
! A. Betts for shallow convection: suggestion for the KF timescale < DELTAX / 25 m/s
tscl_kf=dx/25.
ccn(its:ite)=1500.
!
! write(0,*)'ishallow = ',ishallow_g3
high_resolution=0
subcenter=0.
iens=1
ipr=0
jpr=0
IF ( periodic_x ) THEN
ibeg=max(its,ids)
iend=min(ite,ide-1)
ibegc=max(its,ids)
iendc=min(ite,ide-1)
ELSE
ibeg=max(its,ids)
iend=min(ite,ide-1)
ibegc=max(its,ids+4)
iendc=min(ite,ide-5)
END IF
IF ( periodic_y ) THEN
jbeg=max(jts,jds)
jend=min(jte,jde-1)
jbegc=max(jts,jds)
jendc=min(jte,jde-1)
ELSE
jbeg=max(jts,jds)
jend=min(jte,jde-1)
jbegc=max(jts,jds+4)
jendc=min(jte,jde-5)
END IF
do j=jts,jte
do i=its,ite
k22_shallow(i,j)=0
kbcon_shallow(i,j)=0
ktop_shallow(i,j)=0
xmb_shallow(i,j)=0
enddo
enddo
tcrit=258.
itf=MIN(ite,ide-1)
ktf=MIN(kte,kde-1)
jtf=MIN(jte,jde-1)
!
DO 100 J = jts,jtf
DO n= 1,ensdim
DO I= its,itf
xfi_ens(i,j,n)=0.
pri_ens(i,j,n)=0.
ENDDO
ENDDO
DO I= its,itf
ierrc(i)=" "
ierrcs(i)=" "
ierr(i)=0
ierrs(i)=0
kbcon(i)=0
ktop(i)=0
tkm(i)=0.
xmbs(i)=0.
k22s(i)=0
kbcons(i)=0
ktops(i)=0
HBOT(I,J) =REAL(KTE)
HTOP(I,J) =REAL(KTS)
iact_old_gr(i,j)=0
mass_flux(i,j)=0.
massi_flx(i,j)=0.
raincv(i,j)=0.
pratec (i,j)=0.
edt_out(i,j)=0.
edti_out(i,j)=0.
gswi(i,j)=gsw(i,j)
xlandi(i)=xland(i,j)
APRi_GR(i,j)=apr_gr(i,j)
APRi_w(i,j)=apr_w(i,j)
APRi_mc(i,j)=apr_mc(i,j)
APRi_st(i,j)=apr_st(i,j)
APRi_as(i,j)=apr_as(i,j)
APRi_capma(i,j)=apr_capma(i,j)
APRi_capme(i,j)=apr_capme(i,j)
APRi_capmi(i,j)=apr_capmi(i,j)
CU_ACT_FLAG(i,j) = .true.
ENDDO
do k=kts,kte
DO I= its,itf
cugd_tten(i,k,j)=0.
cugd_ttens(i,k,j)=0.
cugd_qvten(i,k,j)=0.
cugd_qvtens(i,k,j)=0.
cugd_qcten(i,k,j)=0.
ENDDO
ENDDO
DO n=1,ens4
DO I= its,itf
mconv(i,n)=0.
ENDDO
do k=kts,kte
DO I= its,itf
omeg(i,k,n)=0.
ENDDO
ENDDO
ENDDO
DO k=1,ensdim
DO I= its,itf
massflni(i,j,k)=0.
ENDDO
ENDDO
! put hydrostatic pressure on half levels
DO K=kts,ktf
DO I=ITS,ITF
phh(i,k) = p(i,k,j)
ENDDO
ENDDO
!ipr= 33 !78
!jpr= 17 !110
DO I=ITS,ITF
PSUR(I)=p8w(I,1,J)*.01
! PSUR(I)=p(I,1,J)*.01
TER11(I)=max(0.,HT(i,j))
ZTEXEC(i) = 0.
ZQEXEC(i) = 0.
aaeq(i)=0.
pret(i)=0.
umean(i)=0.
vmean(i)=0.
pmean(i)=0.
kpbli(i)=kpbl(i,j)
zo(i,kts)=ter11(i)+.5*dz8w(i,1,j)
DO K=kts+1,ktf
zo(i,k)=zo(i,k-1)+.5*(dz8w(i,k-1,j)+dz8w(i,k,j))
enddo
ENDDO
if(j.eq.jpr .and. (ipr.gt.its .and. ipr.lt.itf))write(0,*)psur(ipr),ter11(ipr),kpbli(ipr)
DO K=kts,ktf
DO I=ITS,ITF
po(i,k)=phh(i,k)*.01
subm(i,k)=0.
P2d(I,K)=PO(i,k)
rhoi(i,k)=rho(i,k,j)
US(I,K) =u(i,k,j)
VS(I,K) =v(i,k,j)
T2d(I,K)=t(i,k,j)
q2d(I,K)=q(i,k,j)
IF(Q2d(I,K).LT.1.E-08)Q2d(I,K)=1.E-08
SUBT(I,K)=0.
SUBQ(I,K)=0.
OUTT(I,K)=0.
OUTQ(I,K)=0.
OUTQC(I,K)=0.
OUTQCs(I,K)=0.
OUTTS(I,K)=0.
OUTQS(I,K)=0.
TN(I,K)=t2d(i,k)+(RTHFTEN(i,k,j)+RTHRATEN(i,k,j)+RTHBLTEN(i,k,j)) &
*pi(i,k,j)*dt
QO(I,K)=q2d(i,k)+(RQVFTEN(i,k,j)+RQVBLTEN(i,k,j))*dt
TSHALL(I,K)=t2d(i,k)+RTHBLTEN(i,k,j)*pi(i,k,j)*dt
DHDT(I,K)=cp*RTHBLTEN(i,k,j)*pi(i,k,j)+ XLV*RQVBLTEN(i,k,j)
QSHALL(I,K)=q2d(i,k)+RQVBLTEN(i,k,j)*dt
IF(TN(I,K).LT.200.)TN(I,K)=T2d(I,K)
IF(QO(I,K).LT.1.E-08)QO(I,K)=1.E-08
ENDDO
ENDDO
if(use_excess.gt.0 .or. use_excess_sh.gt.0)then
DO I=ITS,ITF
ZRHO = 100.*psur(i)/(287.04*(t2d(i,1)*(1.+0.608*q2d(i,1))))
!- LE and H fluxes
PAHFS=-hfx(i,j)
PQHFL=-qfx(i,j)/xlv
!- buoyancy flux (H+LE)
ZKHVFL= (PAHFS/1004.64+0.608*t2d(i,1)*PQHFL)/ZRHO
!- height of the 1st level
PGEOH = zo(i,1)-ht(i,j)
!-convective-scale velocity w*
ZWS = max(0.,0.001-1.5*0.41*ZKHVFL*PGEOH/T2D(i,1))
if(ZWS > TINY(PGEOH)) then
!-convective-scale velocity w*
ZWS = 1.2*ZWS**.3333
!- temperature excess
ZTEXEC(i) = MAX(-1.5*PAHFS/(ZRHO*ZWS*1004.64),0.0)
!- moisture excess
ZQEXEC(i) = MAX(-1.5*PQHFL/(ZRHO*ZWS),0.)
endif
ENDDO
endif ! use_excess
DO K=kts,ktf
DO I=ITS,ITF
omeg(I,K,:)= -g*rho(i,k,j)*w(i,k,j)
enddo
enddo
do k= kts+1,ktf-1
DO I = its,itf
if((p2d(i,1)-p2d(i,k)).gt.150.and.p2d(i,k).gt.300)then
dp=-.5*(p2d(i,k+1)-p2d(i,k-1))
umean(i)=umean(i)+us(i,k)*dp
vmean(i)=vmean(i)+vs(i,k)*dp
pmean(i)=pmean(i)+dp
endif
enddo
enddo
do n=1,ens4
DO K=kts,ktf-1
DO I = its,itf
dq=(q2d(i,k+1)-q2d(i,k))
mconv(i,n)=mconv(i,n)+omeg(i,k,n)*dq/g
enddo
ENDDO
ENDDO
do n=1,ens4
DO I = its,itf
if(mconv(i,n).lt.0.)mconv(i,n)=0.
ENDDO
ENDDO
!
!---- CALL CUMULUS PARAMETERIZATION
!
#if ( WRF_DFI_RADAR == 1 )
if(do_capsuppress == 1 ) then
DO I= its,itf
cap_suppress_j(i)=cap_suppress_loc(i,j)
ENDDO
endif
#endif
CALL CUP_gf
(zo,outqc,j,AAEQ,T2d,Q2d,TER11,subm,TN,QO,PO,PRET,&
P2d,OUTT,OUTQ,DT,itimestep,PSUR,US,VS,tcrit,iens, &
ztexec,zqexec,ccn,ccnclean,rhoi,dx,mconv,omeg, &
maxiens,maxens,maxens2,maxens3,ensdim, &
APRi_GR,APRi_W,APRi_MC,APRi_ST,APRi_AS, &
APRi_CAPMA,APRi_CAPME,APRi_CAPMI,kbcon,ktop,cupclw, &
xfi_ens,pri_ens,XLANDi,gswi,subt,subq, &
xlv,r_v,cp,g,ichoice,ipr,jpr,ierrc,ens4, &
beta,autoconv,aeroevap,itf,jtf,ktf,training, &
#if ( WRF_DFI_RADAR == 1 )
do_capsuppress,cap_suppress_j, &
#endif
use_excess,its,ite, jts,jte, kts,kte &
)
CALL neg_check
(j,subt,subq,dt,q2d,outq,outt,outqc,pret,its,ite,kts,kte,itf,ktf)
if(ishallow_g3 == 1 )then
!
! this turns off shallow convection when deep convection is active
!
do i=its,ite
if(pret(i).gt.0.)then
ierrs(i)=1
aaeq(i)=-100.
endif
enddo
call CUP_gf_sh
(xmbs,zo,OUTQCs,J,AAEQ,T2D,Q2D,TER11, &
Tshall,Qshall,P2d,PRET,P2d,OUTTS,OUTQS,DT,itimestep,PSUR,US,VS, &
TCRIT,ztexec,zqexec,ccn,ccnclean,rhoi,dx,dhdt, &
kpbli,kbcons,ktops,k22s, & !-lxz
xlandi,gswi,tscl_kf, &
xlv,r_v,cp,g,ichoice,ipr,jpr,ierrs,ierrcs, &
autoconv,itf,jtf,ktf, &
use_excess_sh,its,ite, jts,jte, kts,kte &
)
endif
if(j.lt.jbegc.or.j.gt.jendc)go to 100
if(ishallow_g3.eq.1)then
DO I=ibegc,iendc
xmb_shallow(i,j)=xmbs(i)
k22_shallow(i,j)=k22s(i)
kbcon_shallow(i,j)=kbcons(i)
ktop_shallow(i,j)=ktops(i)
ktop_deep(i,j) = ktop(i)
ENDDO
endif
DO I=ibegc,iendc
cuten(i)=0.
if(pret(i).gt.0.)then
cuten(i)=1.
! raincv(i,j)=pret(i)*dt
endif
ENDDO
DO I=ibegc,iendc
DO K=kts,ktf
RTHCUTEN(I,K,J)=(outts(i,k)+(subt(i,k)+outt(i,k))*cuten(i))/pi(i,k,j)
RQVCUTEN(I,K,J)=outqs(i,k)+(subq(i,k)+outq(i,k))*cuten(i)
ENDDO
ENDDO
DO I=ibegc,iendc
if(pret(i).gt.0.)then
raincv(i,j)=pret(i)*dt
pratec(i,j)=pret(i)
rkbcon = kte+kts - kbcon(i)
rktop = kte+kts - ktop(i)
if (ktop(i) > HTOP(i,j)) HTOP(i,j) = ktop(i)+.001
if (kbcon(i) < HBOT(i,j)) HBOT(i,j) = kbcon(i)+.001
endif
ENDDO
DO n= 1,ensdim
DO I= ibegc,iendc
xf_ens(i,j,n)=xfi_ens(i,j,n)
pr_ens(i,j,n)=pri_ens(i,j,n)
ENDDO
ENDDO
DO I= ibegc,iendc
APR_GR(i,j)=apri_gr(i,j)
APR_w(i,j)=apri_w(i,j)
APR_mc(i,j)=apri_mc(i,j)
APR_st(i,j)=apri_st(i,j)
APR_as(i,j)=apri_as(i,j)
APR_capma(i,j)=apri_capma(i,j)
APR_capme(i,j)=apri_capme(i,j)
APR_capmi(i,j)=apri_capmi(i,j)
mass_flux(i,j)=massi_flx(i,j)
edt_out(i,j)=edti_out(i,j)
ENDDO
IF(PRESENT(RQCCUTEN)) THEN
IF ( F_QC ) THEN
DO K=kts,ktf
DO I=ibegc,iendc
RQCCUTEN(I,K,J)=outqcs(i,k)+outqc(I,K)*cuten(i)
IF ( PRESENT( GDC ) ) GDC(I,K,J)=CUPCLW(I,K)*cuten(i)
IF ( PRESENT( GDC2 ) ) GDC2(I,K,J)=0.
ENDDO
ENDDO
ENDIF
ENDIF
!...... QSTEN STORES GRAUPEL TENDENCY IF IT EXISTS, OTHERISE SNOW (V2)
IF(PRESENT(RQICUTEN).AND.PRESENT(RQCCUTEN))THEN
IF (F_QI) THEN
DO K=kts,ktf
DO I=ibegc,iendc
if(t2d(i,k).lt.258.)then
RQICUTEN(I,K,J)=outqcs(i,k)+outqc(I,K)*cuten(i)
RQCCUTEN(I,K,J)=0.
IF ( PRESENT( GDC2 ) ) GDC2(I,K,J)=CUPCLW(I,K)*cuten(i)
else
RQICUTEN(I,K,J)=0.
RQCCUTEN(I,K,J)=outqcs(i,k)+outqc(I,K)*cuten(i)
IF ( PRESENT( GDC ) ) GDC(I,K,J)=CUPCLW(I,K)*cuten(i)
endif
ENDDO
ENDDO
ENDIF
ENDIF
100 continue
END SUBROUTINE GFDRV
SUBROUTINE CUP_gf(zo,OUTQC,J,AAEQ,T,Q,Z1,sub_mas, & 1,21
TN,QO,PO,PRE,P,OUTT,OUTQ,DTIME,ktau,PSUR,US,VS, &
TCRIT,iens, &
ztexec,zqexec,ccn,ccnclean,rho,dx,mconv, &
omeg,maxiens, &
maxens,maxens2,maxens3,ensdim, &
APR_GR,APR_W,APR_MC,APR_ST,APR_AS, &
APR_CAPMA,APR_CAPME,APR_CAPMI,kbcon,ktop,cupclw, & !-lxz
xf_ens,pr_ens,xland,gsw,subt,subq, &
xl,rv,cp,g,ichoice,ipr,jpr,ierrc,ens4, &
beta,autoconv,aeroevap,itf,jtf,ktf,training, &
#if ( WRF_DFI_RADAR == 1 )
do_capsuppress,cap_suppress_j, &
#endif
use_excess,its,ite, jts,jte, kts,kte &
)
IMPLICIT NONE
integer &
,intent (in ) :: &
autoconv,aeroevap,itf,jtf,ktf,ktau,training,use_excess, &
its,ite, jts,jte, kts,kte,ipr,jpr,ens4
integer, intent (in ) :: &
j,ensdim,maxiens,maxens,maxens2,maxens3,ichoice,iens
!
!
!
real, dimension (its:ite,jts:jte,1:ensdim) &
,intent (inout) :: &
xf_ens,pr_ens
real, dimension (its:ite,jts:jte) &
,intent (inout ) :: &
APR_GR,APR_W,APR_MC,APR_ST,APR_AS,APR_CAPMA, &
APR_CAPME,APR_CAPMI
real, dimension( its:ite , jts:jte ) &
:: weight_GR,weight_W,weight_MC,weight_ST,weight_AS
real, dimension (its:ite,jts:jte) &
,intent (in ) :: &
gsw
#if ( WRF_DFI_RADAR == 1 )
INTEGER, INTENT(IN ) ,OPTIONAL :: do_capsuppress
REAL, DIMENSION( its:ite ) :: cap_suppress_j
#endif
! outtem = output temp tendency (per s)
! outq = output q tendency (per s)
! outqc = output qc tendency (per s)
! pre = output precip
real, dimension (its:ite,kts:kte) &
,intent (inout ) :: &
OUTT,OUTQ,OUTQC,subt,subq,sub_mas,cupclw
real, dimension (its:ite) &
,intent (out ) :: &
pre
integer, dimension (its:ite) &
,intent (out ) :: &
kbcon,ktop
! integer, dimension (its:ite) &
! ,intent (in ) :: &
! kpbl
!
! basic environmental input includes moisture convergence (mconv)
! omega (omeg), windspeed (us,vs), and a flag (aaeq) to turn off
! convection for this call only and at that particular gridpoint
!
real, dimension (its:ite,kts:kte) &
,intent (in ) :: &
rho,T,PO,P,US,VS,tn
real, dimension (its:ite,kts:kte,1:ens4) &
,intent (inout ) :: &
omeg
real, dimension (its:ite,kts:kte) &
,intent (inout) :: &
Q,QO
real, dimension (its:ite) &
,intent (in ) :: &
ztexec,zqexec,ccn,Z1,PSUR,AAEQ,xland
real, dimension (its:ite,1:ens4) &
,intent (in ) :: &
mconv
real &
,intent (in ) :: &
beta,dx,ccnclean,dtime,tcrit,xl,cp,rv,g
!
! local ensemble dependent variables in this routine
!
real, dimension (its:ite,1:maxens) :: &
xaa0_ens
real, dimension (1:maxens) :: &
mbdt_ens
real, dimension (1:maxens2) :: &
edt_ens
real, dimension (its:ite,1:maxens2) :: &
edtc
real, dimension (its:ite,kts:kte,1:maxens2) :: &
dellat_ens,dellaqc_ens,dellaq_ens,pwo_ens,subt_ens,subq_ens
!
!
!
!***************** the following are your basic environmental
! variables. They carry a "_cup" if they are
! on model cloud levels (staggered). They carry
! an "o"-ending (z becomes zo), if they are the forced
! variables. They are preceded by x (z becomes xz)
! to indicate modification by some typ of cloud
!
! z = heights of model levels
! q = environmental mixing ratio
! qes = environmental saturation mixing ratio
! t = environmental temp
! p = environmental pressure
! he = environmental moist static energy
! hes = environmental saturation moist static energy
! z_cup = heights of model cloud levels
! q_cup = environmental q on model cloud levels
! qes_cup = saturation q on model cloud levels
! t_cup = temperature (Kelvin) on model cloud levels
! p_cup = environmental pressure
! he_cup = moist static energy on model cloud levels
! hes_cup = saturation moist static energy on model cloud levels
! gamma_cup = gamma on model cloud levels
!
!
! hcd = moist static energy in downdraft
! zd normalized downdraft mass flux
! dby = buoancy term
! entr = entrainment rate
! zd = downdraft normalized mass flux
! entr= entrainment rate
! hcd = h in model cloud
! bu = buoancy term
! zd = normalized downdraft mass flux
! gamma_cup = gamma on model cloud levels
! qcd = cloud q (including liquid water) after entrainment
! qrch = saturation q in cloud
! pwd = evaporate at that level
! pwev = total normalized integrated evaoprate (I2)
! entr= entrainment rate
! z1 = terrain elevation
! entr = downdraft entrainment rate
! jmin = downdraft originating level
! kdet = level above ground where downdraft start detraining
! psur = surface pressure
! z1 = terrain elevation
! pr_ens = precipitation ensemble
! xf_ens = mass flux ensembles
! massfln = downdraft mass flux ensembles used in next timestep
! omeg = omega from large scale model
! mconv = moisture convergence from large scale model
! zd = downdraft normalized mass flux
! zu = updraft normalized mass flux
! dir = "storm motion"
! mbdt = arbitrary numerical parameter
! dtime = dt over which forcing is applied
! iact_gr_old = flag to tell where convection was active
! kbcon = LFC of parcel from k22
! k22 = updraft originating level
! icoic = flag if only want one closure (usually set to zero!)
! dby = buoancy term
! ktop = cloud top (output)
! xmb = total base mass flux
! hc = cloud moist static energy
! hkb = moist static energy at originating level
real, dimension (its:ite,kts:kte) :: &
entr_rate_2d,mentrd_rate_2d,he,hes,qes,z, &
heo,heso,qeso,zo, &
xhe,xhes,xqes,xz,xt,xq, &
qes_cup,q_cup,he_cup,hes_cup,z_cup,p_cup,gamma_cup,t_cup, &
qeso_cup,qo_cup,heo_cup,heso_cup,zo_cup,po_cup,gammao_cup, &
tn_cup, &
xqes_cup,xq_cup,xhe_cup,xhes_cup,xz_cup,xp_cup,xgamma_cup, &
xt_cup, &
xlamue,dby,qc,qrcd,pwd,pw,hcd,qcd,dbyd,hc,qrc,zu,zd,clw_all, &
dbyo,qco,qrcdo,pwdo,pwo,hcdo,qcdo,dbydo,hco,qrco,zuo,zdo, &
xdby,xqc,xqrcd,xpwd,xpw,xhcd,xqcd,xhc,xqrc,xzu,xzd, &
! cd = detrainment function for updraft
! cdd = detrainment function for downdraft
! dellat = change of temperature per unit mass flux of cloud ensemble
! dellaq = change of q per unit mass flux of cloud ensemble
! dellaqc = change of qc per unit mass flux of cloud ensemble
cd,cdd,DELLAH,DELLAQ,DELLAT,DELLAQC,dsubt,dsubq
! aa0 cloud work function for downdraft
! edt = epsilon
! aa0 = cloud work function without forcing effects
! aa1 = cloud work function with forcing effects
! xaa0 = cloud work function with cloud effects (ensemble dependent)
! edt = epsilon
real, dimension (its:ite) :: &
edt,edto,edtx,AA1,AA0,XAA0,HKB, &
HKBO,XHKB,QKB,QKBO, &
XMB,XPWAV,XPWEV,PWAV,PWEV,PWAVO, &
PWEVO,BU,BUD,BUO,cap_max,xland1, &
cap_max_increment,closure_n,psum,psumh,sig,zuhe
real, dimension (its:ite,1:ens4) :: &
axx
integer, dimension (its:ite) :: &
kzdown,KDET,K22,KB,JMIN,kstabi,kstabm,K22x, & !-lxz
KBCONx,KBx,KTOPx,ierr,ierr2,ierr3,KBMAX
integer :: &
nall,iedt,nens,nens3,ki,I,K,KK,iresult
real :: &
day,dz,dzo,mbdt,entr_rate,radius,entrd_rate,mentrd_rate, &
zcutdown,edtmax,edtmin,depth_min,zkbmax,z_detr,zktop, &
massfld,dh,cap_maxs,trash,frh,xlamdd
real detdo1,detdo2,entdo,dp,subin,detdo,entup, &
detup,subdown,entdoj,entupk,detupk,totmas
real :: power_entr,zustart,zufinal,dzm1,dzp1
integer :: k1,k2,kbegzu,kfinalzu,kstart,jmini,levadj
logical :: keep_going
real xff_shal(9),blqe,xkshal
character*50 :: ierrc(its:ite)
real, dimension (its:ite,kts:kte) :: &
up_massentr,up_massdetr,dd_massentr,dd_massdetr &
,up_massentro,up_massdetro,dd_massentro,dd_massdetro
real, dimension (kts:kte) :: smth
levadj=5
power_entr=2. ! 1.2
zustart=.1
zufinal=1.
day=86400.
do i=its,itf
closure_n(i)=16.
xland1(i)=1.
if(xland(i).gt.1.5)xland1(i)=0.
cap_max_increment(i)=25.
ierrc(i)=" "
! cap_max_increment(i)=1.
enddo
!
!--- specify entrainmentrate and detrainmentrate
!--- highly tuneable !
!
entr_rate=1.e-4
radius=.2/entr_rate
frh=3.14*(2.*radius)*(2.*radius)/dx/dx
if(frh .gt. 0.7)then
frh=.7
radius=sqrt(frh*dx*dx/(3.14*4.))
entr_rate=.2/radius
endif
do i=its,itf
sig(i)=(1.-frh)**2
enddo
!
!--- entrainment of mass
!
mentrd_rate=entr_rate ! 0.
xlamdd=mentrd_rate
!
!--- initial detrainmentrates
!
do k=kts,ktf
do i=its,itf
z(i,k)=zo(i,k)
xz(i,k)=zo(i,k)
cupclw(i,k)=0.
cd(i,k)=1.*entr_rate
cdd(i,k)=xlamdd
hcdo(i,k)=0.
qrcdo(i,k)=0.
dellaqc(i,k)=0.
enddo
enddo
!
!--- max/min allowed value for epsilon (ratio downdraft base mass flux/updraft
! base mass flux
!
edtmax=1.
edtmin=.1
!
!--- minimum depth (m), clouds must have
!
depth_min=1000.
!
!--- maximum depth (mb) of capping
!--- inversion (larger cap = no convection)
!
cap_maxs=75.
DO i=its,itf
kbmax(i)=1
aa0(i)=0.
aa1(i)=0.
edt(i)=0.
kstabm(i)=ktf-1
IERR(i)=0
IERR2(i)=0
IERR3(i)=0
enddo
do i=its,itf
cap_max(i)=cap_maxs
iresult=0
enddo
!
!--- max height(m) above ground where updraft air can originate
!
zkbmax=4000.
!
!--- height(m) above which no downdrafts are allowed to originate
!
zcutdown=3000.
!
!--- depth(m) over which downdraft detrains all its mass
!
z_detr=1250.
!
do nens=1,maxens
mbdt_ens(nens)=(float(nens)-3.)*dtime*1.e-3+dtime*5.E-03
enddo
do nens=1,maxens2
edt_ens(nens)=.95-float(nens)*.01
enddo
!
!--- environmental conditions, FIRST HEIGHTS
!
do i=its,itf
if(ierr(i).ne.20)then
do k=1,maxens*maxens2*maxens3
xf_ens(i,j,(iens-1)*maxens*maxens2*maxens3+k)=0.
pr_ens(i,j,(iens-1)*maxens*maxens2*maxens3+k)=0.
enddo
endif
enddo
!
!--- calculate moist static energy, heights, qes
!
call cup_env
(z,qes,he,hes,t,q,p,z1, &
psur,ierr,tcrit,-1,xl,cp, &
itf,jtf,ktf, &
its,ite, jts,jte, kts,kte)
call cup_env
(zo,qeso,heo,heso,tn,qo,po,z1, &
psur,ierr,tcrit,-1,xl,cp, &
itf,jtf,ktf, &
its,ite, jts,jte, kts,kte)
!
!--- environmental values on cloud levels
!
call cup_env_clev
(t,qes,q,he,hes,z,p,qes_cup,q_cup,he_cup, &
hes_cup,z_cup,p_cup,gamma_cup,t_cup,psur, &
ierr,z1,xl,rv,cp, &
itf,jtf,ktf, &
its,ite, jts,jte, kts,kte)
call cup_env_clev
(tn,qeso,qo,heo,heso,zo,po,qeso_cup,qo_cup, &
heo_cup,heso_cup,zo_cup,po_cup,gammao_cup,tn_cup,psur, &
ierr,z1,xl,rv,cp, &
itf,jtf,ktf, &
its,ite, jts,jte, kts,kte)
do i=its,itf
if(ierr(i).eq.0)then
if(aaeq(i).lt.-0.1)then
ierr(i)=20
endif
!
do k=kts,ktf
if(zo_cup(i,k).gt.zkbmax+z1(i))then
kbmax(i)=k
go to 25
endif
enddo
25 continue
!
!--- level where detrainment for downdraft starts
!
do k=kts,ktf
if(zo_cup(i,k).gt.z_detr+z1(i))then
kdet(i)=k
go to 26
endif
enddo
26 continue
!
endif
enddo
!
!
!
!------- DETERMINE LEVEL WITH HIGHEST MOIST STATIC ENERGY CONTENT - K22
!
CALL cup_MAXIMI
(HEO_CUP,3,KBMAX,K22,ierr, &
itf,jtf,ktf, &
its,ite, jts,jte, kts,kte)
DO 36 i=its,itf
IF(ierr(I).eq.0)THEN
IF(K22(I).GE.KBMAX(i))then
ierr(i)=2
ierrc(i)="could not find k22"
endif
endif
36 CONTINUE
!
!--- DETERMINE THE LEVEL OF CONVECTIVE CLOUD BASE - KBCON
!
do i=its,itf
IF(ierr(I).eq.0)THEN
if(use_excess == 2) then
k1=max(1,k22(i)-1)
k2=k22(i)+1
hkb(i) =sum(he_cup(i,k1:k2))/float(k2-k1+1)+xl*zqexec(i)+cp*ztexec(i)
hkbo(i)=sum(heo_cup(i,k1:k2))/float(k2-k1+1)+xl*zqexec(i)+cp*ztexec(i)
else if(use_excess <= 1)then
hkb(i)=he_cup(i,k22(i))+float(use_excess)*(xl*zqexec(i)+cp*ztexec(i))
hkbo(i)=heo_cup(i,k22(i))+float(use_excess)*(xl*zqexec(i)+cp*ztexec(i))
endif ! excess
endif ! ierr
enddo
call cup_kbcon
(ierrc,cap_max_increment,1,k22,kbcon,heo_cup,heso_cup, &
hkbo,ierr,kbmax,po_cup,cap_max, &
itf,jtf,ktf, &
its,ite, jts,jte, kts,kte)
!
!--- increase detrainment in stable layers
!
CALL cup_minimi
(HEso_cup,Kbcon,kstabm,kstabi,ierr, &
itf,jtf,ktf, &
its,ite, jts,jte, kts,kte)
!
! the following section insures a smooth normalized mass flux profile. See Grell
! and Freitas (2013) for a description
!
DO i=its,itf
IF(ierr(I).eq.0)THEN
do k=kts,ktf
frh = min(qo_cup(i,k)/qeso_cup(i,k),1.)
entr_rate_2d(i,k)=entr_rate*(1.3-frh)
enddo
zuhe(i)=zustart
kstart=1
frh=(zufinal-zustart)/((float(kbcon(i)*kbcon(i)))-(float(kstart*kstart)))
dh=zuhe(i)-frh*(float(kstart*kstart))
do k=kstart,kbcon(i)-1
dz=z_cup(i,k+1)-z_cup(i,k)
! cd(i,k)=entr_rate_2d(i,kbcon(i))
if(p_cup(i,k).gt. p_cup(i,kstabi(i)))cd(i,k)=1.e-6
entr_rate_2d(i,k)=((frh*(float((k+1)*(k+1)))+dh)/zuhe(i)-1.+cd(i,k)*dz)/dz
zuhe(i)=zuhe(i)+entr_rate_2d(i,k)*dz*zuhe(i)-cd(i,k)*dz*zuhe(i)
enddo
kbegzu=kstabi(i)+4
kbegzu=min(kbegzu,ktf-1)
kfinalzu=kbegzu+1
do k=kts,ktf
cd(i,k)=entr_rate_2d(i,kbcon(i))
enddo
do k=kbcon(i),kbegzu
cd(i,k)=entr_rate_2d(i,kbcon(i))
if(p_cup(i,k).gt. p_cup(i,kstabi(i)))cd(i,k)=1.e-6
dz=z_cup(i,k+1)-z_cup(i,k)
zuhe(i)=zuhe(i)+entr_rate_2d(i,k)*dz*zuhe(i)-cd(i,k)*dz*zuhe(i)
enddo
do k=kstabi(i),ktf-2
if((hkb(i)-hes_cup(i,k)).lt.0)then
kfinalzu=k-3
go to 411
endif
enddo
411 continue
kfinalzu=max(kfinalzu,kbegzu+1)
kfinalzu=min(kfinalzu,ktf-1)
frh=-(0.2-zuhe(i))/((float(kfinalzu*kfinalzu))-(float(kbegzu*kbegzu)))
dh=zuhe(i)+frh*(float(kbegzu*kbegzu))
do k=kbegzu+1,kfinalzu
dz=z_cup(i,k+1)-z_cup(i,k)
cd(i,k)=-((-frh*(float((k+1)*(k+1)))+dh)/zuhe(i)-1.-entr_rate_2d(i,k)*dz)/dz
zuhe(i)=zuhe(i)+entr_rate_2d(i,k)*dz*zuhe(i)-cd(i,k)*dz*zuhe(i)
enddo
do k=kfinalzu+1,ktf
cd(i,k)=entr_rate_2d(i,k)
enddo
do k=kts+1,ktf-2
dzm1=z_cup(i,k)-z_cup(i,k-1)
dz=z_cup(i,k+1)-z_cup(i,k)
dzp1=z_cup(i,k+2)-z_cup(i,k+1)
smth(k)=.25*(dzm1*cd(i,k-1)+2.*dz*cd(i,k)+dzp1*cd(i,k+1))
enddo
do k=kts+1,ktf-2
dzm1=z_cup(i,k)-z_cup(i,k-1)
dz=z_cup(i,k+1)-z_cup(i,k)
dzp1=z_cup(i,k+2)-z_cup(i,k+1)
cd(i,k)=smth(k)/dz ! (.25*(dzm1+2.*dz+dzp1))
enddo
smth(:)=0.
do k=2,ktf-2
dzm1=z_cup(i,k)-z_cup(i,k-1)
dz=z_cup(i,k+1)-z_cup(i,k)
dzp1=z_cup(i,k+2)-z_cup(i,k+1)
smth(k)=.25*(dzm1*entr_rate_2d(i,k-1)+2.*dz*entr_rate_2d(i,k)+dzp1*entr_rate_2d(i,k+1))
enddo
do k=2,ktf-2
dz=z_cup(i,k+1)-z_cup(i,k)
entr_rate_2d(i,k)=smth(k)/dz
enddo
zuhe(i)=zustart
do k=2,kbegzu
dz=z_cup(i,k+1)-z_cup(i,k)
frh=zuhe(i)
zuhe(i)=zuhe(i)+entr_rate_2d(i,k)*dz*zuhe(i)-cd(i,k)*dz*zuhe(i)
enddo
ENDIF
enddo
!
! calculate mass entrainment and detrainment
!
do k=kts,ktf
do i=its,itf
hc(i,k)=0.
DBY(I,K)=0.
hco(i,k)=0.
DBYo(I,K)=0.
enddo
enddo
do i=its,itf
IF(ierr(I).eq.0)THEN
do k=1,kbcon(i)-1
hc(i,k)=hkb(i)
hco(i,k)=hkbo(i)
enddo
k=kbcon(i)
hc(i,k)=hkb(i)
DBY(I,Kbcon(i))=Hkb(I)-HES_cup(I,K)
hco(i,k)=hkbo(i)
DBYo(I,Kbcon(i))=Hkbo(I)-HESo_cup(I,K)
endif ! ierr
enddo
!
!
do i=its,itf
if(ierr(i).eq.0)then
zu(i,1)=zustart
zuo(i,1)=zustart
! mass entrainment and detrinament is defined on model levels
do k=2,ktf-1
dz=zo_cup(i,k)-zo_cup(i,k-1)
up_massentro(i,k-1)=entr_rate_2d(i,k-1)*dz*zuo(i,k-1)
up_massdetro(i,k-1)=cd(i,k-1)*dz*zuo(i,k-1)
zuo(i,k)=zuo(i,k-1)+up_massentro(i,k-1)-up_massdetro(i,k-1)
if(zuo(i,k).lt.0.05)then
zuo(i,k)=.05
up_massdetro(i,k-1)=zuo(i,k-1)-.05 + up_massentro(i,k-1)
cd(i,k-1)=up_massdetro(i,k-1)/dz/zuo(i,k-1)
endif
zu(i,k)=zuo(i,k)
up_massentr(i,k-1)=up_massentro(i,k-1)
up_massdetr(i,k-1)=up_massdetro(i,k-1)
enddo
do k=kbcon(i)+1,ktf-1
hc(i,k)=(hc(i,k-1)*zu(i,k-1)-.5*up_massdetr(i,k-1)*hc(i,k-1)+ &
up_massentr(i,k-1)*he(i,k-1)) / &
(zu(i,k-1)-.5*up_massdetr(i,k-1)+up_massentr(i,k-1))
dby(i,k)=hc(i,k)-hes_cup(i,k)
hco(i,k)=(hco(i,k-1)*zuo(i,k-1)-.5*up_massdetro(i,k-1)*hco(i,k-1)+ &
up_massentro(i,k-1)*heo(i,k-1)) / &
(zuo(i,k-1)-.5*up_massdetro(i,k-1)+up_massentro(i,k-1))
dbyo(i,k)=hco(i,k)-heso_cup(i,k)
enddo
do k=kbcon(i)+1,ktf
if(dbyo(i,k).lt.0)then
ktop(i)=k-1
go to 41
endif
enddo
41 continue
if(ktop(i).lt.kbcon(i)+2)ierr(i)=5
do k=ktop(i)+1,ktf
HC(i,K)=hes_cup(i,k)
HCo(i,K)=heso_cup(i,k)
DBY(I,K)=0.
DBYo(I,K)=0.
zu(i,k)=0.
zuo(i,k)=0.
cd(i,k)=0.
entr_rate_2d(i,k)=0.
up_massentr(i,k)=0.
up_massdetr(i,k)=0.
up_massentro(i,k)=0.
up_massdetro(i,k)=0.
enddo
endif
enddo
!
DO 37 i=its,itf
kzdown(i)=0
if(ierr(i).eq.0)then
zktop=(zo_cup(i,ktop(i))-z1(i))*.6
zktop=min(zktop+z1(i),zcutdown+z1(i))
do k=kts,ktf
if(zo_cup(i,k).gt.zktop)then
kzdown(i)=k
go to 37
endif
enddo
endif
37 CONTINUE
!
!--- DOWNDRAFT ORIGINATING LEVEL - JMIN
!
call cup_minimi
(HEso_cup,K22,kzdown,JMIN,ierr, &
itf,jtf,ktf, &
its,ite, jts,jte, kts,kte)
DO 100 i=its,itf
IF(ierr(I).eq.0)THEN
!
!--- check whether it would have buoyancy, if there where
!--- no entrainment/detrainment
!
jmini = jmin(i)
keep_going = .TRUE.
do while ( keep_going )
keep_going = .FALSE.
if ( jmini - 1 .lt. kdet(i) ) kdet(i) = jmini-1
if ( jmini .ge. ktop(i)-1 ) jmini = ktop(i) - 2
ki = jmini
hcdo(i,ki)=heso_cup(i,ki)
DZ=Zo_cup(i,Ki+1)-Zo_cup(i,Ki)
dh=0.
do k=ki-1,1,-1
hcdo(i,k)=heso_cup(i,jmini)
DZ=Zo_cup(i,K+1)-Zo_cup(i,K)
dh=dh+dz*(HCDo(i,K)-heso_cup(i,k))
if(dh.gt.0.)then
jmini=jmini-1
if ( jmini .gt. 5 ) then
keep_going = .TRUE.
else
ierr(i) = 9
ierrc(i) = "could not find jmini9"
exit
endif
endif
enddo
enddo
jmin(i) = jmini
if ( jmini .le. 5 ) then
ierr(i)=4
ierrc(i) = "could not find jmini4"
endif
ENDIF
100 continue
!
! - Must have at least depth_min m between cloud convective base
! and cloud top.
!
do i=its,itf
IF(ierr(I).eq.0)THEN
IF(-zo_cup(I,KBCON(I))+zo_cup(I,KTOP(I)).LT.depth_min)then
ierr(i)=6
ierrc(i)="cloud depth very shallow"
endif
endif
enddo
!
!--- normalized downdraft mass flux profile,also work on bottom detrainment
!--- in this routine
!
do k=kts,ktf
do i=its,itf
zd(i,k)=0.
zdo(i,k)=0.
cdd(i,k)=0.
dd_massentr(i,k)=0.
dd_massdetr(i,k)=0.
dd_massentro(i,k)=0.
dd_massdetro(i,k)=0.
hcdo(i,k)=heso_cup(i,k)
dbydo(i,k)=0.
enddo
enddo
do i=its,itf
bud(i)=0.
IF(ierr(I).eq.0)then
mentrd_rate_2d(i,:)=mentrd_rate
cdd(i,1:jmin(i))=xlamdd
cdd(i,jmin(i))=0.
! start from dd origin
zd(i,jmin(i))=0.2
zdo(i,jmin(i))=0.2
frh=(zdo(i,jmin(i))-1.)/(-float((jmin(i)-levadj)*(jmin(i)-levadj)) &
+float(jmin(i)*jmin(i)))
dh=zdo(i,jmin(i))-frh*float(jmin(i)*jmin(i))
zuhe(i)=zdo(i,jmin(i))
do ki=jmin(i)-1,jmin(i)-levadj,-1
cdd(i,ki)=0.
dz=z_cup(i,ki+1)-z_cup(i,ki)
mentrd_rate_2d(i,ki)=((frh*float(ki*ki)+dh)/zuhe(i)-1.)/dz
zuhe(i)=zuhe(i)+mentrd_rate_2d(i,ki)*dz*zuhe(i)
enddo
! now we know the max zd, for detrainment we will go back to beta at level 1
kstart=max(kbcon(i),kdet(i))-1
kstart=min(jmin(i)-levadj,kstart)
kstart=max(2,kstart)
if(kstart.lt.jmin(i)-levadj-1)then
do ki=jmin(i)-levadj-1,kstart,-1
dz=z_cup(i,ki+1)-z_cup(i,ki)
mentrd_rate_2d(i,ki)=mentrd_rate
cdd(i,ki)=xlamdd
zuhe(i)=zuhe(i)-cdd(i,ki)*dz*zuhe(i)+mentrd_rate_2d(i,ki)*dz*zuhe(i)
enddo
endif
frh=(zuhe(i)-beta)/(float(kstart*kstart)-1.)
dh=beta-frh
mentrd_rate_2d(i,kstart)=0.
do ki=kstart+1,1,-1
mentrd_rate_2d(i,ki)=0.
dz=z_cup(i,ki+1)-z_cup(i,ki)
cdd(i,ki)=max(0.,(1.-(frh*float(ki*ki)+dh)/zuhe(i))/dz)
zuhe(i)=zuhe(i)-cdd(i,ki)*dz*zuhe(i)
! if(i.eq.ipr.and.j.eq.jpr)write(0,*)'low cd ',ki,zuhe(i),cdd(i,ki)
enddo
! now that we have entrainment and detrainment rates,
! calculate downdraft mass terms
!
do ki=jmin(i)-1,1,-1
mentrd_rate=mentrd_rate_2d(i,ki)
dzo=zo_cup(i,ki+1)-zo_cup(i,ki)
dd_massentro(i,ki)=mentrd_rate*dzo*zdo(i,ki+1)
dd_massdetro(i,ki)=cdd(i,ki)*dzo*zdo(i,ki+1)
zdo(i,ki)=zdo(i,ki+1)+dd_massentro(i,ki)-dd_massdetro(i,ki)
enddo
! downdraft moist static energy + moisture budget
dbydo(i,jmin(i))=hcdo(i,jmin(i))-heso_cup(i,jmin(i))
bud(i)=dbydo(i,jmin(i))*(zo_cup(i,jmin(i)+1)-zo_cup(i,jmin(i)))
do ki=jmin(i)-1,1,-1
dzo=zo_cup(i,ki+1)-zo_cup(i,ki)
hcdo(i,ki)=(hcdo(i,ki+1)*zdo(i,ki+1) &
-.5*dd_massdetro(i,ki)*hcdo(i,ki+1)+ &
dd_massentro(i,ki)*heo(i,ki)) / &
(zdo(i,ki+1)-.5*dd_massdetro(i,ki)+dd_massentro(i,ki))
dbydo(i,ki)=hcdo(i,ki)-heso_cup(i,ki)
! if(i.eq.ipr.and.j.eq.jpr)write(0,*)'ki,bud = ',ki,bud(i),hcdo(i,ki)
bud(i)=bud(i)+dbydo(i,ki)*dzo
enddo
endif
if(bud(i).gt.0)then
ierr(i)=7
ierrc(i)='downdraft is not negatively buoyant '
endif
enddo
!
!--- calculate moisture properties of downdraft
!
call cup_dd_moisture_new
(ierrc,zdo,hcdo,heso_cup,qcdo,qeso_cup, &
pwdo,qo_cup,zo_cup,dd_massentro,dd_massdetro,jmin,ierr,gammao_cup, &
pwevo,bu,qrcdo,qo,heo,tn_cup,1,xl, &
itf,jtf,ktf, &
its,ite, jts,jte, kts,kte)
!
!--- calculate moisture properties of updraft
!
call cup_up_moisture
('deep',ierr,zo_cup,qco,qrco,pwo,pwavo, &
ccnclean,p_cup,kbcon,ktop,cd,dbyo,clw_all, &
t_cup,qo,GAMMAo_cup,zuo,qeso_cup,k22,qo_cup,xl, &
ZQEXEC,use_excess,ccn,rho,up_massentr,up_massdetr,psum,psumh,&
autoconv,aeroevap,1,itf,jtf,ktf,j,ipr,jpr, &
its,ite, jts,jte, kts,kte)
do k=kts,ktf
do i=its,itf
cupclw(i,k)=qrco(i,k)
enddo
enddo
!
!--- calculate workfunctions for updrafts
!
call cup_up_aa0
(aa0,z,zu,dby,GAMMA_CUP,t_cup, &
kbcon,ktop,ierr, &
itf,jtf,ktf, &
its,ite, jts,jte, kts,kte)
call cup_up_aa0
(aa1,zo,zuo,dbyo,GAMMAo_CUP,tn_cup, &
kbcon,ktop,ierr, &
itf,jtf,ktf, &
its,ite, jts,jte, kts,kte)
do i=its,itf
if(ierr(i).eq.0)then
if(aa1(i).eq.0.)then
ierr(i)=17
ierrc(i)="cloud work function zero"
endif
endif
enddo
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
do i=1,ens4
axx(:,i)=aa1(:)
enddo
!
!--- DETERMINE DOWNDRAFT STRENGTH IN TERMS OF WINDSHEAR
!
call cup_dd_edt
(ierr,us,vs,zo,ktop,kbcon,edt,po,pwavo, &
pwo,ccn,pwevo,edtmax,edtmin,maxens2,edtc,psum,psumh, &
ccnclean,rho,aeroevap,itf,jtf,ktf,j,ipr,jpr, &
its,ite, jts,jte, kts,kte)
do 250 iedt=1,maxens2
do i=its,itf
if(ierr(i).eq.0)then
edt(i)=edtc(i,iedt)
edto(i)=edtc(i,iedt)
edtx(i)=edtc(i,iedt)
if(maxens2.eq.3)then
edt(i)=edtc(i,3)
edto(i)=edtc(i,3)
edtx(i)=edtc(i,3)
endif
endif
enddo
do k=kts,ktf
do i=its,itf
subt_ens(i,k,iedt)=0.
subq_ens(i,k,iedt)=0.
dellat_ens(i,k,iedt)=0.
dellaq_ens(i,k,iedt)=0.
dellaqc_ens(i,k,iedt)=0.
pwo_ens(i,k,iedt)=0.
enddo
enddo
!
!
!--- change per unit mass that a model cloud would modify the environment
!
!--- 1. in bottom layer
!
do k=kts,ktf
do i=its,itf
dellah(i,k)=0.
dsubt(i,k)=0.
dellaq(i,k)=0.
dsubq(i,k)=0.
enddo
enddo
!
!---------------------------------------------- cloud level ktop
!
!- - - - - - - - - - - - - - - - - - - - - - - - model level ktop-1
! . . .
! . . .
! . . .
! . . .
! . . .
! . . .
!
!---------------------------------------------- cloud level k+2
!
!- - - - - - - - - - - - - - - - - - - - - - - - model level k+1
!
!---------------------------------------------- cloud level k+1
!
!- - - - - - - - - - - - - - - - - - - - - - - - model level k
!
!---------------------------------------------- cloud level k
!
! . . .
! . . .
! . . .
! . . .
! . . .
! . . .
! . . .
! . . .
! . . .
! . . .
!
!---------------------------------------------- cloud level 3
!
!- - - - - - - - - - - - - - - - - - - - - - - - model level 2
!
!---------------------------------------------- cloud level 2
!
!- - - - - - - - - - - - - - - - - - - - - - - - model level 1
do i=its,itf
if(ierr(i).eq.0)then
dp=100.*(po_cup(i,1)-po_cup(i,2))
dellah(i,1)=(edto(i)*zdo(i,2)*hcdo(i,2) &
-edto(i)*zdo(i,2)*heo_cup(i,2))*g/dp
dellaq(i,1)=(edto(i)*zdo(i,2)*qrcdo(i,2) &
-edto(i)*zdo(i,2)*qo_cup(i,2))*g/dp
dsubt(i,1)=0.
dsubq(i,1)=0.
do k=kts+1,ktop(i)
! these three are only used at or near mass detrainment and/or entrainment levels
entupk=0.
detupk=0.
entdoj=0.
! detrainment and entrainment for fowndrafts
detdo=edto(i)*dd_massdetro(i,k)
entdo=edto(i)*dd_massentro(i,k)
! entrainment/detrainment for updraft
entup=up_massentro(i,k)
detup=up_massdetro(i,k)
! subsidence by downdrafts only
subin=-zdo(i,k+1)*edto(i)
subdown=-zdo(i,k)*edto(i)
!
! SPECIAL LEVELS
!
if(k.eq.jmin(i))then
entdoj=edto(i)*zdo(i,k)
endif
if(k.eq.ktop(i))then
detupk=zuo(i,ktop(i))
subin=0.
subdown=0.
detdo=0.
entdo=0.
entup=0.
detup=0.
endif
totmas=subin-subdown+detup-entup-entdo+ &
detdo-entupk-entdoj+detupk+zuo(i,k+1)-zuo(i,k)
! print *,'*********************',k,totmas
! write(0,123)k,subin+zuo(i,k+1),subdown-zuo(i,k),detup,entup, &
! detdo,entdo,entupk,detupk
! write(8,*)'totmas = ',k,totmas
if(abs(totmas).gt.1.e-6)then
write(0,*)'*********************',i,j,k,totmas
write(0,123)k,subin,subdown,detup,entup, &
detdo,entdo,entupk,detupk
123 formAT(1X,i2,8E12.4)
! call wrf_error_fatal ( 'totmas .gt.1.e-6' )
endif
dp=100.*(po_cup(i,k)-po_cup(i,k+1))
dellah(i,k)=(detup*.5*(HCo(i,K+1)+HCo(i,K)) &
+detdo*.5*(HCDo(i,K+1)+HCDo(i,K)) &
-entup*heo(i,k) &
-entdo*heo(i,k) &
+subin*heo_cup(i,k+1) &
-subdown*heo_cup(i,k) &
+detupk*(hco(i,ktop(i))-heo_cup(i,ktop(i))) &
-entupk*heo_cup(i,k22(i)) &
-entdoj*heo_cup(i,jmin(i)) &
)*g/dp
dellaq(i,k)=(detup*.5*(qco(i,K+1)+qco(i,K)-qrco(i,k+1)-qrco(i,k)) &
+detdo*.5*(qrcdo(i,K+1)+qrcdo(i,K)) &
-entup*qo(i,k) &
-entdo*qo(i,k) &
+subin*qo_cup(i,k+1) &
-subdown*qo_cup(i,k) &
+detupk*(qco(i,ktop(i))-qrco(i,ktop(i))-qo_cup(i,ktop(i))) &
-entupk*qo_cup(i,k22(i)) &
-entdoj*qo_cup(i,jmin(i)) &
)*g/dp
!
! updraft subsidence only
!
if(k.lt.ktop(i))then
dsubt(i,k)=(zuo(i,k+1)*heo_cup(i,k+1) &
-zuo(i,k)*heo_cup(i,k))*g/dp
dsubq(i,k)=(zuo(i,k+1)*qo_cup(i,k+1) &
-zuo(i,k)*qo_cup(i,k))*g/dp
endif
!
enddo ! k
endif
enddo
!
!-- take out cloud liquid water for detrainment
!
do k=kts,ktf-1
do i=its,itf
dellaqc(i,k)=0.
if(ierr(i).eq.0)then
if(k.eq.ktop(i)-0)dellaqc(i,k)= &
.01*zuo(i,ktop(i))*qrco(i,ktop(i))* &
9.81/(po_cup(i,k)-po_cup(i,k+1))
if(k.lt.ktop(i).and.k.gt.kbcon(i))then
dz=zo_cup(i,k+1)-zo_cup(i,k)
dellaqc(i,k)=.01*9.81*up_massdetro(i,k)*.5*(qrco(i,k)+qrco(i,k+1))/ &
(po_cup(i,k)-po_cup(i,k+1))
endif
dellaqc(i,k)=max(0.,dellaqc(i,k))
endif
enddo
enddo
!
!--- using dellas, calculate changed environmental profiles
!
mbdt=mbdt_ens(1)
do i=its,itf
xaa0_ens(i,:)=0.
enddo
do k=kts,ktf
do i=its,itf
dellat(i,k)=0.
if(ierr(i).eq.0)then
trash=dsubt(i,k)
XHE(I,K)=(dsubt(i,k)+DELLAH(I,K))*MBDT+HEO(I,K)
XQ(I,K)=(dsubq(i,k)+DELLAQ(I,K))*MBDT+QO(I,K)
DELLAT(I,K)=(1./cp)*(DELLAH(I,K)-xl*DELLAQ(I,K))
dSUBT(I,K)=(1./cp)*(dsubt(i,k)-xl*dsubq(i,k))
XT(I,K)= (DELLAT(I,K)+dsubt(i,k))*MBDT+TN(I,K)
IF(XQ(I,K).LE.0.)XQ(I,K)=1.E-08
ENDIF
enddo
enddo
do i=its,itf
if(ierr(i).eq.0)then
xhkb(i)=hkbo(i)+(dsubt(i,k22(i))+DELLAH(I,K22(i)))*MBDT
XHE(I,ktf)=HEO(I,ktf)
XQ(I,ktf)=QO(I,ktf)
XT(I,ktf)=TN(I,ktf)
IF(XQ(I,ktf).LE.0.)XQ(I,ktf)=1.E-08
endif
enddo
!
!--- calculate moist static energy, heights, qes
!
call cup_env
(xz,xqes,xhe,xhes,xt,xq,po,z1, &
psur,ierr,tcrit,-1,xl,cp, &
itf,jtf,ktf, &
its,ite, jts,jte, kts,kte)
!
!--- environmental values on cloud levels
!
call cup_env_clev
(xt,xqes,xq,xhe,xhes,xz,po,xqes_cup,xq_cup, &
xhe_cup,xhes_cup,xz_cup,po_cup,gamma_cup,xt_cup,psur, &
ierr,z1,xl,rv,cp, &
itf,jtf,ktf, &
its,ite, jts,jte, kts,kte)
!
!
!**************************** static control
!
!--- moist static energy inside cloud
!
! do i=its,itf
! if(ierr(i).eq.0)then
! xhkb(i)=xhe(i,k22(i))
! endif
! enddo
do k=kts,ktf
do i=its,itf
xhc(i,k)=0.
xDBY(I,K)=0.
enddo
enddo
do i=its,itf
if(ierr(i).eq.0)then
! if(use_excess == 2) then
! k1=max(1,k22(i)-1)
! k2=max(1,min(kbcon(i)-1,k22(i)+1))
! k1=1
! k2=k22(i)+1
! xhkb(i) =sum(xhe_cup(i,k1:k2))/float(k2-k1+1)+xl*zqexec(i)+cp*ztexec(i)
! else if(use_excess <= 1) then
! xhkb(i)=xhe_cup(i,k22(i))+float(use_excess)*(xl*zqexec(i)+cp*ztexec(i))
! endif
do k=1,kbcon(i)-1
xhc(i,k)=xhkb(i)
enddo
k=kbcon(i)
xhc(i,k)=xhkb(i)
xDBY(I,Kbcon(i))=xHkb(I)-xHES_cup(I,K)
endif !ierr
enddo
!
!
do i=its,itf
if(ierr(i).eq.0)then
xzu(i,:)=zuo(i,:)
do k=kbcon(i)+1,ktop(i)
xhc(i,k)=(xhc(i,k-1)*xzu(i,k-1)-.5*up_massdetro(i,k-1)*xhc(i,k-1)+ &
up_massentro(i,k-1)*xhe(i,k-1)) / &
(xzu(i,k-1)-.5*up_massdetro(i,k-1)+up_massentro(i,k-1))
xdby(i,k)=xhc(i,k)-xhes_cup(i,k)
enddo
do k=ktop(i)+1,ktf
xHC(i,K)=xhes_cup(i,k)
xDBY(I,K)=0.
xzu(i,k)=0.
enddo
endif
enddo
!
!--- workfunctions for updraft
!
call cup_up_aa0
(xaa0,xz,xzu,xdby,GAMMA_CUP,xt_cup, &
kbcon,ktop,ierr, &
itf,jtf,ktf, &
its,ite, jts,jte, kts,kte)
do 200 nens=1,maxens
do i=its,itf
if(ierr(i).eq.0)then
xaa0_ens(i,nens)=xaa0(i)
nall=(iens-1)*maxens3*maxens*maxens2 &
+(iedt-1)*maxens*maxens3 &
+(nens-1)*maxens3
do k=kts,ktf
if(k.le.ktop(i))then
do nens3=1,maxens3
if(nens3.eq.7)then
!--- b=0
pr_ens(i,j,nall+nens3)=pr_ens(i,j,nall+nens3) &
! +edto(i)*pwdo(i,k) &
+pwo(i,k)
!--- b=beta
else if(nens3.eq.8)then
pr_ens(i,j,nall+nens3)=pr_ens(i,j,nall+nens3)+ &
pwo(i,k)
!--- b=beta/2
else if(nens3.eq.9)then
pr_ens(i,j,nall+nens3)=pr_ens(i,j,nall+nens3) &
! +.5*edto(i)*pwdo(i,k) &
+ pwo(i,k)
else
pr_ens(i,j,nall+nens3)=pr_ens(i,j,nall+nens3)+ &
pwo(i,k) ! +edto(i)*pwdo(i,k)
endif
enddo
endif
enddo
if(pr_ens(i,j,nall+7).lt.1.e-6)then
ierr(i)=18
ierrc(i)="total normalized condensate too small"
! if(i.eq.ipr.and.j.eq.jpr)write(0,*)ierr(i),ierrc(i)
do nens3=1,maxens3
pr_ens(i,j,nall+nens3)=0.
enddo
endif
do nens3=1,maxens3
if(pr_ens(i,j,nall+nens3).lt.1.e-4)then
pr_ens(i,j,nall+nens3)=0.
endif
enddo
endif
! if(i.eq.ipr.and.j.eq.jpr)write(0,*)'ierrc = ',ierr(i),ierrc(i)
enddo
200 continue
!
!--- LARGE SCALE FORCING
!
!
!------- CHECK wether aa0 should have been zero, assuming this
! ensemble is chosen
!
!
do i=its,itf
ierr2(i)=ierr(i)
ierr3(i)=ierr(i)
enddo
if(maxens.gt.1)then
CALL cup_MAXIMI
(HEO_CUP,3,KBMAX,K22x,ierr, &
itf,jtf,ktf, &
its,ite, jts,jte, kts,kte)
call cup_kbcon
(ierrc,cap_max_increment,2,k22x,kbconx,heo_cup, &
heso_cup,hkbo,ierr2,kbmax,po_cup,cap_max, &
itf,jtf,ktf, &
its,ite, jts,jte, kts,kte)
call cup_kbcon
(ierrc,cap_max_increment,3,k22x,kbconx,heo_cup, &
heso_cup,hkbo,ierr3,kbmax,po_cup,cap_max, &
itf,jtf,ktf, &
its,ite, jts,jte, kts,kte)
endif
!
!--- calculate cloud base mass flux
!
call cup_forcing_ens_3d
(closure_n,xland1,aa0,aa1,xaa0_ens,mbdt_ens,dtime, &
ierr,ierr2,ierr3,xf_ens,j,'deeps',axx, &
maxens,iens,iedt,maxens2,maxens3,mconv, &
po_cup,ktop,omeg,zdo,k22,zuo,pr_ens,edto,kbcon, &
ensdim,ichoice, &
ipr,jpr,itf,jtf,ktf, &
its,ite, jts,jte, kts,kte,ens4,ktau)
!
do k=kts,ktf
do i=its,itf
if(ierr(i).eq.0)then
subt_ens(i,k,iedt)=dsubt(i,k)
subq_ens(i,k,iedt)=dsubq(i,k)
dellat_ens(i,k,iedt)=dellat(i,k)
dellaq_ens(i,k,iedt)=dellaq(i,k)
dellaqc_ens(i,k,iedt)=dellaqc(i,k)
pwo_ens(i,k,iedt)=pwo(i,k)+edt(i)*pwdo(i,k)
else
subt_ens(i,k,iedt)=0.
subq_ens(i,k,iedt)=0.
dellat_ens(i,k,iedt)=0.
dellaq_ens(i,k,iedt)=0.
dellaqc_ens(i,k,iedt)=0.
pwo_ens(i,k,iedt)=0.
endif
enddo
enddo
250 continue
!
!--- FEEDBACK
!
call cup_output_ens_3d
(xf_ens,ierr,dellat_ens,dellaq_ens, &
dellaqc_ens,subt_ens,subq_ens,subt,subq,outt, &
outq,outqc,zuo,sub_mas,pre,pwo_ens,xmb,ktop, &
j,'deep',maxens2,maxens,iens,ierr2,ierr3, &
pr_ens,maxens3,ensdim, &
sig,APR_GR,APR_W,APR_MC,APR_ST,APR_AS, &
APR_CAPMA,APR_CAPME,APR_CAPMI,closure_n,xland1, &
weight_GR,weight_W,weight_MC,weight_ST,weight_AS,training, &
ipr,jpr,itf,jtf,ktf, &
its,ite, jts,jte, kts,kte )
k=1
do i=its,itf
if(ierr(i).eq.0) PRE(I)=MAX(PRE(I),0.)
enddo
!
!---------------------------done------------------------------
!
END SUBROUTINE CUP_gf
SUBROUTINE cup_dd_edt(ierr,us,vs,z,ktop,kbcon,edt,p,pwav, & 2
pw,ccn,pwev,edtmax,edtmin,maxens2,edtc,psum2,psumh, &
ccnclean,rho,aeroevap,itf,jtf,ktf,j,ipr,jpr, &
its,ite, jts,jte, kts,kte )
IMPLICIT NONE
integer &
,intent (in ) :: &
j,ipr,jpr,aeroevap,itf,jtf,ktf, &
its,ite, jts,jte, kts,kte
integer, intent (in ) :: &
maxens2
!
! ierr error value, maybe modified in this routine
!
real, dimension (its:ite,kts:kte) &
,intent (in ) :: &
rho,us,vs,z,p,pw
real, dimension (its:ite,1:maxens2) &
,intent (out ) :: &
edtc
real, dimension (its:ite) &
,intent (out ) :: &
edt
real, dimension (its:ite) &
,intent (in ) :: &
pwav,pwev,ccn,psum2,psumh
real &
,intent (in ) :: &
ccnclean,edtmax,edtmin
integer, dimension (its:ite) &
,intent (in ) :: &
ktop,kbcon
integer, dimension (its:ite) &
,intent (inout) :: &
ierr
!
! local variables in this routine
!
integer i,k,kk
real einc,pef,pefb,prezk,zkbc
real, dimension (its:ite) :: &
vshear,sdp,vws
real :: prop_c,pefc,aeroadd,alpha3,beta3,rhoc
prop_c=8. !10.386
alpha3 = 1.9
beta3 = -1.13
pefc=0.
!
!--- DETERMINE DOWNDRAFT STRENGTH IN TERMS OF WINDSHEAR
!
! */ calculate an average wind shear over the depth of the cloud
!
do i=its,itf
edt(i)=0.
vws(i)=0.
sdp(i)=0.
vshear(i)=0.
enddo
do k=1,maxens2
do i=its,itf
edtc(i,k)=0.
enddo
enddo
do kk = kts,ktf-1
do 62 i=its,itf
IF(ierr(i).ne.0)GO TO 62
if (kk .le. min0(ktop(i),ktf) .and. kk .ge. kbcon(i)) then
vws(i) = vws(i)+ &
(abs((us(i,kk+1)-us(i,kk))/(z(i,kk+1)-z(i,kk))) &
+ abs((vs(i,kk+1)-vs(i,kk))/(z(i,kk+1)-z(i,kk)))) * &
(p(i,kk) - p(i,kk+1))
sdp(i) = sdp(i) + p(i,kk) - p(i,kk+1)
endif
if (kk .eq. ktf-1)vshear(i) = 1.e3 * vws(i) / sdp(i)
62 continue
end do
do i=its,itf
IF(ierr(i).eq.0)then
pef=(1.591-.639*VSHEAR(I)+.0953*(VSHEAR(I)**2) &
-.00496*(VSHEAR(I)**3))
if(pef.gt.0.9)pef=0.9
if(pef.lt.0.1)pef=0.1
!
!--- cloud base precip efficiency
!
zkbc=z(i,kbcon(i))*3.281e-3
prezk=.02
if(zkbc.gt.3.)then
prezk=.96729352+zkbc*(-.70034167+zkbc*(.162179896+zkbc &
*(- 1.2569798E-2+zkbc*(4.2772E-4-zkbc*5.44E-6))))
endif
if(zkbc.gt.25)then
prezk=2.4
endif
pefb=1./(1.+prezk)
if(pefb.gt.0.9)pefb=0.9
if(pefb.lt.0.1)pefb=0.1
EDT(I)=1.-.5*(pefb+pef)
if(aeroevap.gt.1)then
aeroadd=(ccnclean**beta3)*((psumh(i))**(alpha3-1)) !*1.e6
! if(i.eq.ipr.and.j.eq.jpr)write(0,*)'edt',ccnclean,psumh(i),aeroadd
! prop_c=.9/aeroadd
prop_c=.5*(pefb+pef)/aeroadd
aeroadd=(ccn(i)**beta3)*((psum2(i))**(alpha3-1)) !*1.e6
! if(i.eq.ipr.and.j.eq.jpr)write(0,*)'edt',ccn(i),psum2(i),aeroadd,prop_c
aeroadd=prop_c*aeroadd
pefc=aeroadd
if(pefc.gt.0.9)pefc=0.9
if(pefc.lt.0.1)pefc=0.1
EDT(I)=1.-pefc
if(aeroevap.eq.2)EDT(I)=1.-.25*(pefb+pef+2.*pefc)
endif
!--- edt here is 1-precipeff!
einc=.2*edt(i)
do k=1,maxens2
edtc(i,k)=edt(i)+float(k-2)*einc
enddo
endif
enddo
do i=its,itf
IF(ierr(i).eq.0)then
do k=1,maxens2
EDTC(I,K)=-EDTC(I,K)*PWAV(I)/PWEV(I)
IF(EDTC(I,K).GT.edtmax)EDTC(I,K)=edtmax
IF(EDTC(I,K).LT.edtmin)EDTC(I,K)=edtmin
enddo
endif
enddo
END SUBROUTINE cup_dd_edt
SUBROUTINE cup_dd_moisture_new(ierrc,zd,hcd,hes_cup,qcd,qes_cup, & 1
pwd,q_cup,z_cup,dd_massentr,dd_massdetr,jmin,ierr, &
gamma_cup,pwev,bu,qrcd, &
q,he,t_cup,iloop,xl, &
itf,jtf,ktf, &
its,ite, jts,jte, kts,kte )
IMPLICIT NONE
integer &
,intent (in ) :: &
itf,jtf,ktf, &
its,ite, jts,jte, kts,kte
! cdd= detrainment function
! q = environmental q on model levels
! q_cup = environmental q on model cloud levels
! qes_cup = saturation q on model cloud levels
! hes_cup = saturation h on model cloud levels
! hcd = h in model cloud
! bu = buoancy term
! zd = normalized downdraft mass flux
! gamma_cup = gamma on model cloud levels
! mentr_rate = entrainment rate
! qcd = cloud q (including liquid water) after entrainment
! qrch = saturation q in cloud
! pwd = evaporate at that level
! pwev = total normalized integrated evaoprate (I2)
! entr= entrainment rate
!
real, dimension (its:ite,kts:kte) &
,intent (in ) :: &
zd,t_cup,hes_cup,hcd,qes_cup,q_cup,z_cup, &
dd_massentr,dd_massdetr,gamma_cup,q,he
real &
,intent (in ) :: &
xl
integer &
,intent (in ) :: &
iloop
integer, dimension (its:ite) &
,intent (in ) :: &
jmin
integer, dimension (its:ite) &
,intent (inout) :: &
ierr
real, dimension (its:ite,kts:kte) &
,intent (out ) :: &
qcd,qrcd,pwd
real, dimension (its:ite) &
,intent (out ) :: &
pwev,bu
character*50 :: ierrc(its:ite)
!
! local variables in this routine
!
integer :: &
i,k,ki
real :: &
dh,dz,dqeva
do i=its,itf
bu(i)=0.
pwev(i)=0.
enddo
do k=kts,ktf
do i=its,itf
qcd(i,k)=0.
qrcd(i,k)=0.
pwd(i,k)=0.
enddo
enddo
!
!
!
do 100 i=its,itf
IF(ierr(I).eq.0)then
k=jmin(i)
DZ=Z_cup(i,K+1)-Z_cup(i,K)
qcd(i,k)=q_cup(i,k)
DH=HCD(I,k)-HES_cup(I,K)
if(dh.lt.0)then
QRCD(I,K)=(qes_cup(i,k)+(1./XL)*(GAMMA_cup(i,k) &
/(1.+GAMMA_cup(i,k)))*DH)
else
qrcd(i,k)=qes_cup(i,k)
endif
pwd(i,jmin(i))=zd(i,jmin(i))*min(0.,qcd(i,k)-qrcd(i,k))
qcd(i,k)=qrcd(i,k)
pwev(i)=pwev(i)+pwd(i,jmin(i))
!
bu(i)=dz*dh
do ki=jmin(i)-1,1,-1
DZ=Z_cup(i,Ki+1)-Z_cup(i,Ki)
qcd(i,ki)=(qcd(i,ki+1)*zd(i,ki+1) &
-.5*dd_massdetr(i,ki)*qcd(i,ki+1)+ &
dd_massentr(i,ki)*q(i,ki)) / &
(zd(i,ki+1)-.5*dd_massdetr(i,ki)+dd_massentr(i,ki))
! write(0,*)'qcd in dd_moi = ',qcd(i,ki)
!
!--- to be negatively buoyant, hcd should be smaller than hes!
!--- ideally, dh should be negative till dd hits ground, but that is not always
!--- the case
!
DH=HCD(I,ki)-HES_cup(I,Ki)
bu(i)=bu(i)+dz*dh
QRCD(I,Ki)=qes_cup(i,ki)+(1./XL)*(GAMMA_cup(i,ki) &
/(1.+GAMMA_cup(i,ki)))*DH
dqeva=qcd(i,ki)-qrcd(i,ki)
if(dqeva.gt.0.)then
dqeva=0.
qrcd(i,ki)=qcd(i,ki)
endif
pwd(i,ki)=zd(i,ki)*dqeva
qcd(i,ki)=qrcd(i,ki)
pwev(i)=pwev(i)+pwd(i,ki)
! if(iloop.eq.1.and.i.eq.102.and.j.eq.62)then
! print *,'in cup_dd_moi ', hcd(i,ki),HES_cup(I,Ki),dh,dqeva
! endif
enddo
!
!--- end loop over i
if(pwev(I).eq.0.and.iloop.eq.1)then
! print *,'problem with buoy in cup_dd_moisture',i
ierr(i)=7
ierrc(i)="problem with buoy in cup_dd_moisture"
endif
if(BU(I).GE.0.and.iloop.eq.1)then
! print *,'problem with buoy in cup_dd_moisture',i
ierr(i)=7
ierrc(i)="problem2 with buoy in cup_dd_moisture"
endif
endif
100 continue
END SUBROUTINE cup_dd_moisture_new
SUBROUTINE cup_env(z,qes,he,hes,t,q,p,z1, & 11,1
psur,ierr,tcrit,itest,xl,cp, &
itf,jtf,ktf, &
its,ite, jts,jte, kts,kte )
IMPLICIT NONE
integer &
,intent (in ) :: &
itf,jtf,ktf, &
its,ite, jts,jte, kts,kte
!
! ierr error value, maybe modified in this routine
! q = environmental mixing ratio
! qes = environmental saturation mixing ratio
! t = environmental temp
! tv = environmental virtual temp
! p = environmental pressure
! z = environmental heights
! he = environmental moist static energy
! hes = environmental saturation moist static energy
! psur = surface pressure
! z1 = terrain elevation
!
!
real, dimension (its:ite,kts:kte) &
,intent (in ) :: &
p,t,q
real, dimension (its:ite,kts:kte) &
,intent (out ) :: &
he,hes,qes
real, dimension (its:ite,kts:kte) &
,intent (inout) :: &
z
real, dimension (its:ite) &
,intent (in ) :: &
psur,z1
real &
,intent (in ) :: &
xl,cp
integer, dimension (its:ite) &
,intent (inout) :: &
ierr
integer &
,intent (in ) :: &
itest
!
! local variables in this routine
!
integer :: &
i,k,iph
real, dimension (1:2) :: AE,BE,HT
real, dimension (its:ite,kts:kte) :: tv
real :: tcrit,e,tvbar
! real, external :: satvap
! real :: satvap
HT(1)=XL/CP
HT(2)=2.834E6/CP
BE(1)=.622*HT(1)/.286
AE(1)=BE(1)/273.+ALOG(610.71)
BE(2)=.622*HT(2)/.286
AE(2)=BE(2)/273.+ALOG(610.71)
! print *, 'TCRIT = ', tcrit,its,ite
DO k=kts,ktf
do i=its,itf
if(ierr(i).eq.0)then
!Csgb - IPH is for phase, dependent on TCRIT (water or ice)
IPH=1
IF(T(I,K).LE.TCRIT)IPH=2
! print *, 'AE(IPH),BE(IPH) = ',AE(IPH),BE(IPH),AE(IPH)-BE(IPH),T(i,k),i,k
! E=EXP(AE(IPH)-BE(IPH)/T(I,K))
! print *, 'P, E = ', P(I,K), E
! QES(I,K)=.622*E/(100.*P(I,K)-E)
e=satvap
(t(i,k))
qes(i,k)=0.622*e/max(1.e-8,(p(i,k)-e))
IF(QES(I,K).LE.1.E-08)QES(I,K)=1.E-08
IF(QES(I,K).LT.Q(I,K))QES(I,K)=Q(I,K)
! IF(Q(I,K).GT.QES(I,K))Q(I,K)=QES(I,K)
TV(I,K)=T(I,K)+.608*Q(I,K)*T(I,K)
endif
enddo
enddo
!
!--- z's are calculated with changed h's and q's and t's
!--- if itest=2
!
if(itest.eq.1 .or. itest.eq.0)then
do i=its,itf
if(ierr(i).eq.0)then
Z(I,1)=max(0.,Z1(I))-(ALOG(P(I,1))- &
ALOG(PSUR(I)))*287.*TV(I,1)/9.81
endif
enddo
! --- calculate heights
DO K=kts+1,ktf
do i=its,itf
if(ierr(i).eq.0)then
TVBAR=.5*TV(I,K)+.5*TV(I,K-1)
Z(I,K)=Z(I,K-1)-(ALOG(P(I,K))- &
ALOG(P(I,K-1)))*287.*TVBAR/9.81
endif
enddo
enddo
else if(itest.eq.2)then
do k=kts,ktf
do i=its,itf
if(ierr(i).eq.0)then
z(i,k)=(he(i,k)-1004.*t(i,k)-2.5e6*q(i,k))/9.81
z(i,k)=max(1.e-3,z(i,k))
endif
enddo
enddo
else if(itest.eq.-1)then
endif
!
!--- calculate moist static energy - HE
! saturated moist static energy - HES
!
DO k=kts,ktf
do i=its,itf
if(ierr(i).eq.0)then
if(itest.le.0)HE(I,K)=9.81*Z(I,K)+1004.*T(I,K)+2.5E06*Q(I,K)
HES(I,K)=9.81*Z(I,K)+1004.*T(I,K)+2.5E06*QES(I,K)
IF(HE(I,K).GE.HES(I,K))HE(I,K)=HES(I,K)
endif
enddo
enddo
END SUBROUTINE cup_env
SUBROUTINE cup_env_clev(t,qes,q,he,hes,z,p,qes_cup,q_cup, & 11
he_cup,hes_cup,z_cup,p_cup,gamma_cup,t_cup,psur, &
ierr,z1,xl,rv,cp, &
itf,jtf,ktf, &
its,ite, jts,jte, kts,kte )
IMPLICIT NONE
integer &
,intent (in ) :: &
itf,jtf,ktf, &
its,ite, jts,jte, kts,kte
!
! ierr error value, maybe modified in this routine
! q = environmental mixing ratio
! q_cup = environmental mixing ratio on cloud levels
! qes = environmental saturation mixing ratio
! qes_cup = environmental saturation mixing ratio on cloud levels
! t = environmental temp
! t_cup = environmental temp on cloud levels
! p = environmental pressure
! p_cup = environmental pressure on cloud levels
! z = environmental heights
! z_cup = environmental heights on cloud levels
! he = environmental moist static energy
! he_cup = environmental moist static energy on cloud levels
! hes = environmental saturation moist static energy
! hes_cup = environmental saturation moist static energy on cloud levels
! gamma_cup = gamma on cloud levels
! psur = surface pressure
! z1 = terrain elevation
!
!
real, dimension (its:ite,kts:kte) &
,intent (in ) :: &
qes,q,he,hes,z,p,t
real, dimension (its:ite,kts:kte) &
,intent (out ) :: &
qes_cup,q_cup,he_cup,hes_cup,z_cup,p_cup,gamma_cup,t_cup
real, dimension (its:ite) &
,intent (in ) :: &
psur,z1
real &
,intent (in ) :: &
xl,rv,cp
integer, dimension (its:ite) &
,intent (inout) :: &
ierr
!
! local variables in this routine
!
integer :: &
i,k
do k=kts,ktf
do i=its,itf
qes_cup(i,k)=0.
q_cup(i,k)=0.
hes_cup(i,k)=0.
he_cup(i,k)=0.
z_cup(i,k)=0.
p_cup(i,k)=0.
t_cup(i,k)=0.
gamma_cup(i,k)=0.
enddo
enddo
do k=kts+1,ktf
do i=its,itf
if(ierr(i).eq.0)then
qes_cup(i,k)=.5*(qes(i,k-1)+qes(i,k))
q_cup(i,k)=.5*(q(i,k-1)+q(i,k))
hes_cup(i,k)=.5*(hes(i,k-1)+hes(i,k))
he_cup(i,k)=.5*(he(i,k-1)+he(i,k))
if(he_cup(i,k).gt.hes_cup(i,k))he_cup(i,k)=hes_cup(i,k)
z_cup(i,k)=.5*(z(i,k-1)+z(i,k))
p_cup(i,k)=.5*(p(i,k-1)+p(i,k))
t_cup(i,k)=.5*(t(i,k-1)+t(i,k))
gamma_cup(i,k)=(xl/cp)*(xl/(rv*t_cup(i,k) &
*t_cup(i,k)))*qes_cup(i,k)
endif
enddo
enddo
do i=its,itf
if(ierr(i).eq.0)then
qes_cup(i,1)=qes(i,1)
q_cup(i,1)=q(i,1)
! hes_cup(i,1)=hes(i,1)
! he_cup(i,1)=he(i,1)
hes_cup(i,1)=9.81*z1(i)+1004.*t(i,1)+2.5e6*qes(i,1)
he_cup(i,1)=9.81*z1(i)+1004.*t(i,1)+2.5e6*q(i,1)
z_cup(i,1)=.5*(z(i,1)+z1(i))
p_cup(i,1)=.5*(p(i,1)+psur(i))
z_cup(i,1)=z1(i)
p_cup(i,1)=psur(i)
t_cup(i,1)=t(i,1)
gamma_cup(i,1)=xl/cp*(xl/(rv*t_cup(i,1) &
*t_cup(i,1)))*qes_cup(i,1)
endif
enddo
END SUBROUTINE cup_env_clev
SUBROUTINE cup_forcing_ens_3d(closure_n,xland,aa0,aa1,xaa0,mbdt,dtime,ierr,ierr2,ierr3,& 2
xf_ens,j,name,axx,maxens,iens,iedt,maxens2,maxens3,mconv, &
p_cup,ktop,omeg,zd,k22,zu,pr_ens,edt,kbcon, &
ensdim,icoic, &
ipr,jpr,itf,jtf,ktf, &
its,ite, jts,jte, kts,kte,ens4,ktau )
IMPLICIT NONE
integer &
,intent (in ) :: &
ipr,jpr,itf,jtf,ktf, &
its,ite, jts,jte, kts,kte,ens4,ktau
integer, intent (in ) :: &
j,ensdim,maxens,iens,iedt,maxens2,maxens3
!
! ierr error value, maybe modified in this routine
! pr_ens = precipitation ensemble
! xf_ens = mass flux ensembles
! massfln = downdraft mass flux ensembles used in next timestep
! omeg = omega from large scale model
! mconv = moisture convergence from large scale model
! zd = downdraft normalized mass flux
! zu = updraft normalized mass flux
! aa0 = cloud work function without forcing effects
! aa1 = cloud work function with forcing effects
! xaa0 = cloud work function with cloud effects (ensemble dependent)
! edt = epsilon
! dir = "storm motion"
! mbdt = arbitrary numerical parameter
! dtime = dt over which forcing is applied
! iact_gr_old = flag to tell where convection was active
! kbcon = LFC of parcel from k22
! k22 = updraft originating level
! icoic = flag if only want one closure (usually set to zero!)
! name = deep or shallow convection flag
!
real, dimension (its:ite,jts:jte,1:ensdim) &
,intent (inout) :: &
pr_ens
real, dimension (its:ite,jts:jte,1:ensdim) &
,intent (out ) :: &
xf_ens
real, dimension (its:ite,kts:kte) &
,intent (in ) :: &
zd,zu,p_cup
real, dimension (its:ite,kts:kte,1:ens4) &
,intent (in ) :: &
omeg
real, dimension (its:ite,1:maxens) &
,intent (in ) :: &
xaa0
real, dimension (its:ite) &
,intent (in ) :: &
aa1,edt,xland
real, dimension (its:ite,1:ens4) &
,intent (in ) :: &
mconv,axx
real, dimension (its:ite) &
,intent (inout) :: &
aa0,closure_n
real, dimension (1:maxens) &
,intent (in ) :: &
mbdt
real &
,intent (in ) :: &
dtime
integer, dimension (its:ite) &
,intent (in ) :: &
k22,kbcon,ktop
integer, dimension (its:ite) &
,intent (inout) :: &
ierr,ierr2,ierr3
integer &
,intent (in ) :: &
icoic
character *(*), intent (in) :: &
name
!
! local variables in this routine
!
real, dimension (1:maxens3) :: &
xff_ens3
real, dimension (1:maxens) :: &
xk
integer :: &
i,k,nall,n,ne,nens,nens3,iresult,iresultd,iresulte,mkxcrt,kclim
parameter (mkxcrt=15)
real :: &
fens4,a1,massfld,a_ave,xff0,xff00,xxx,xomg,aclim1,aclim2,aclim3,aclim4
real, dimension(1:mkxcrt) :: &
pcrit,acrit,acritt
integer :: nall2,ixxx,irandom
integer, dimension (2) :: seed
DATA PCRIT/850.,800.,750.,700.,650.,600.,550.,500.,450.,400., &
350.,300.,250.,200.,150./
DATA ACRIT/.0633,.0445,.0553,.0664,.075,.1082,.1521,.2216, &
.3151,.3677,.41,.5255,.7663,1.1686,1.6851/
! GDAS DERIVED ACRIT
DATA ACRITT/.203,.515,.521,.566,.625,.665,.659,.688, &
.743,.813,.886,.947,1.138,1.377,1.896/
!
seed=0
do i=its,itf
if(ierr(i).eq.0)then
seed(1)=int(aa0(i))
seed(2)=int(aa1(i))
exit
endif
enddo
nens=0
irandom=0
fens4=float(ens4)
!--- LARGE SCALE FORCING
!
DO 100 i=its,itf
if(name.eq.'deeps'.and.ierr(i).gt.995)then
aa0(i)=0.
ierr(i)=0
endif
IF(ierr(i).eq.0)then
!
!---
!
if(name.eq.'deeps')then
!
a_ave=0.
do ne=1,ens4
a_ave=a_ave+axx(i,ne)
! if(i.eq.ipr.and.j.eq.jpr)write(0,*)'in forcing, a_ave,axx(i,ne) = ',a_ave,axx(i,ne)
enddo
a_ave=max(0.,a_ave/fens4)
a_ave=min(a_ave,aa1(i))
a_ave=max(0.,a_ave)
do ne=1,16
xff_ens3(ne)=0.
enddo
xff0= (AA1(I)-AA0(I))/DTIME
xff_ens3(1)=max(0.,(AA1(I)-AA0(I))/dtime)
xff_ens3(2)=max(0.,(a_ave-AA0(I))/dtime)
! if(i.eq.ipr.and.j.eq.jpr)write(0,*)AA1(I),AA0(I),xff_ens3(1),xff_ens3(2)
if(irandom.eq.1)then
call random_number (xxx)
ixxx=min(ens4,max(1,int(fens4*xxx+1.e-8)))
xff_ens3(3)=max(0.,(axx(i,ixxx)-AA0(I))/dtime)
call random_number (xxx)
ixxx=min(ens4,max(1,int(fens4*xxx+1.e-8)))
xff_ens3(13)=max(0.,(axx(i,ixxx)-AA0(I))/dtime)
else
xff_ens3(3)=max(0.,(AA1(I)-AA0(I))/dtime)
xff_ens3(13)=max(0.,(AA1(I)-AA0(I))/dtime)
endif
!
!--- more original Arakawa-Schubert (climatologic value of aa0)
!
!
!--- omeg is in bar/s, mconv done with omeg in Pa/s
! more like Brown (1979), or Frank-Cohen (199?)
!
xff_ens3(14)=0.
do ne=1,ens4
xff_ens3(14)=xff_ens3(14)-omeg(i,k22(i),ne)/(fens4*9.81)
enddo
if(xff_ens3(14).lt.0.)xff_ens3(14)=0.
xff_ens3(5)=0.
do ne=1,ens4
xff_ens3(5)=xff_ens3(5)-omeg(i,kbcon(i),ne)/(fens4*9.81)
enddo
if(xff_ens3(5).lt.0.)xff_ens3(5)=0.
!
! minimum below kbcon
!
xff_ens3(4)=-omeg(i,2,1)/9.81
do k=2,kbcon(i)-1
do ne=1,ens4
xomg=-omeg(i,k,ne)/9.81
if(xomg.lt.xff_ens3(4))xff_ens3(4)=xomg
enddo
enddo
if(xff_ens3(4).lt.0.)xff_ens3(4)=0.
!
! max below kbcon
xff_ens3(6)=-omeg(i,2,1)/9.81
do k=2,kbcon(i)-1
do ne=1,ens4
xomg=-omeg(i,k,ne)/9.81
if(xomg.gt.xff_ens3(6))xff_ens3(6)=xomg
enddo
enddo
if(xff_ens3(6).lt.0.)xff_ens3(6)=0.
! if(i.eq.ipr.and.j.eq.jpr)write(0,*)xff_ens3(4),xff_ens3(5)
!
!--- more like Krishnamurti et al.; pick max and average values
!
xff_ens3(7)=mconv(i,1)
xff_ens3(8)=mconv(i,1)
xff_ens3(9)=mconv(i,1)
if(ens4.gt.1)then
do ne=2,ens4
if (mconv(i,ne).gt.xff_ens3(7))xff_ens3(7)=mconv(i,ne)
enddo
do ne=2,ens4
if (mconv(i,ne).lt.xff_ens3(8))xff_ens3(8)=mconv(i,ne)
enddo
do ne=2,ens4
xff_ens3(9)=xff_ens3(9)+mconv(i,ne)
enddo
xff_ens3(9)=xff_ens3(9)/fens4
endif
! if(i.eq.ipr.and.j.eq.jpr)write(0,*)xff_ens3(7),xff_ens3(8)
!
if(irandom.eq.1)then
call random_number (xxx)
ixxx=min(ens4,max(1,int(fens4*xxx+1.e-8)))
xff_ens3(15)=mconv(i,ixxx)
else
xff_ens3(15)=mconv(i,1)
endif
!
!--- more like Fritsch Chappel or Kain Fritsch (plus triggers)
!
xff_ens3(10)=AA0(i)/(60.*40.)
xff_ens3(11)=AA0(I)/(60.*40.)
if(irandom.eq.1)then
call random_number (xxx)
ixxx=min(ens4,max(1,int(fens4*xxx+1.e-8)))
xff_ens3(12)=AA0(I)/(60.*40.)
else
xff_ens3(12)=AA0(I)/(60.*40.)
endif
!
!--- more original Arakawa-Schubert (climatologic value of aa0)
!
if(icoic.eq.0)then
if(xff0.lt.0.)then
xff_ens3(1)=0.
xff_ens3(2)=0.
xff_ens3(3)=0.
xff_ens3(13)=0.
xff_ens3(10)=0.
xff_ens3(11)=0.
xff_ens3(12)=0.
endif
endif
do nens=1,maxens
XK(nens)=(XAA0(I,nens)-AA1(I))/MBDT(1)
! if(i.eq.ipr.and.j.eq.jpr)write(0,*)'xks = ',xk(nens),XAA0(I,nens),AA1(I),mbdt
if(xk(nens).le.0.and.xk(nens).gt.-1.e-2) &
xk(nens)=-1.e-2
if(xk(nens).gt.0.and.xk(nens).lt.1.e-2) &
xk(nens)=1.e-2
enddo
!
!--- add up all ensembles
!
do 350 ne=1,maxens
!
!--- for every xk, we have maxens3 xffs
!--- iens is from outermost ensemble (most expensive!
!
!--- iedt (maxens2 belongs to it)
!--- is from second, next outermost, not so expensive
!
!--- so, for every outermost loop, we have maxens*maxens2*3
!--- ensembles!!! nall would be 0, if everything is on first
!--- loop index, then ne would start counting, then iedt, then iens....
!
iresult=0
iresultd=0
iresulte=0
nall=(iens-1)*maxens3*maxens*maxens2 &
+(iedt-1)*maxens*maxens3 &
+(ne-1)*maxens3
!
! over water, enfor!e small cap for some of the closures
!
if(maxens.gt.1)then
if(xland(i).lt.0.1)then
if(ierr2(i).gt.0.or.ierr3(i).gt.0)then
xff_ens3(1) =0.
xff_ens3(2) =0.
xff_ens3(3) =0.
xff_ens3(10) =0.
xff_ens3(11) =0.
xff_ens3(12) =0.
xff_ens3(7) =0.
xff_ens3(8) =0.
xff_ens3(9) =0.
xff_ens3(13) =0.
xff_ens3(15) =0.
endif
endif
endif
!
! end water treatment
!
!
!--- check for upwind convection
! iresult=0
massfld=0.
IF(XK(ne).lt.0.and.xff0.gt.0.)iresultd=1
iresulte=max(iresult,iresultd)
iresulte=1
if(iresulte.eq.1)then
!
!--- special treatment for stability closures
!
! if(i.eq.ipr.and.j.eq.jpr)write(0,*)'xffs = ',xff_ens3(1:16)
if(xff0.ge.0.)then
if(xff_ens3(1).gt.0)xf_ens(i,j,nall+1)=max(0.,-xff_ens3(1)/xk(ne))
if(xff_ens3(2).gt.0)xf_ens(i,j,nall+2)=max(0.,-xff_ens3(2)/xk(ne))
if(xff_ens3(3).gt.0)xf_ens(i,j,nall+3)=max(0.,-xff_ens3(3)/xk(ne))
if(xff_ens3(13).gt.0)xf_ens(i,j,nall+13)=max(0.,-xff_ens3(13)/xk(ne))
endif
!
!--- if iresult.eq.1, following independent of xff0
!
xf_ens(i,j,nall+4)=max(0.,xff_ens3(4))
xf_ens(i,j,nall+5)=max(0.,xff_ens3(5))
xf_ens(i,j,nall+6)=max(0.,xff_ens3(6))
xf_ens(i,j,nall+14)=max(0.,xff_ens3(14))
a1=max(1.e-3,pr_ens(i,j,nall+7))
xf_ens(i,j,nall+7)=max(0.,xff_ens3(7)/a1)
! if(i.eq.ipr.and.j.eq.jpr)write(0,*)'a1 = ',xff_ens3(7),a1,xf_ens(i,j,nall+7)
a1=max(1.e-3,pr_ens(i,j,nall+8))
xf_ens(i,j,nall+8)=max(0.,xff_ens3(8)/a1)
a1=max(1.e-3,pr_ens(i,j,nall+9))
xf_ens(i,j,nall+9)=max(0.,xff_ens3(9)/a1)
a1=max(1.e-3,pr_ens(i,j,nall+15))
xf_ens(i,j,nall+15)=max(0.,xff_ens3(15)/a1)
if(XK(ne).lt.0.)then
xf_ens(i,j,nall+10)=max(0.,-xff_ens3(10)/xk(ne))
xf_ens(i,j,nall+11)=max(0.,-xff_ens3(11)/xk(ne))
xf_ens(i,j,nall+12)=max(0.,-xff_ens3(12)/xk(ne))
endif
if(icoic.ge.1)then
closure_n(i)=0.
xf_ens(i,j,nall+1)=xf_ens(i,j,nall+icoic)
xf_ens(i,j,nall+2)=xf_ens(i,j,nall+icoic)
xf_ens(i,j,nall+3)=xf_ens(i,j,nall+icoic)
xf_ens(i,j,nall+4)=xf_ens(i,j,nall+icoic)
xf_ens(i,j,nall+5)=xf_ens(i,j,nall+icoic)
xf_ens(i,j,nall+6)=xf_ens(i,j,nall+icoic)
xf_ens(i,j,nall+7)=xf_ens(i,j,nall+icoic)
xf_ens(i,j,nall+8)=xf_ens(i,j,nall+icoic)
xf_ens(i,j,nall+9)=xf_ens(i,j,nall+icoic)
xf_ens(i,j,nall+10)=xf_ens(i,j,nall+icoic)
xf_ens(i,j,nall+11)=xf_ens(i,j,nall+icoic)
xf_ens(i,j,nall+12)=xf_ens(i,j,nall+icoic)
xf_ens(i,j,nall+13)=xf_ens(i,j,nall+icoic)
xf_ens(i,j,nall+14)=xf_ens(i,j,nall+icoic)
xf_ens(i,j,nall+15)=xf_ens(i,j,nall+icoic)
xf_ens(i,j,nall+16)=xf_ens(i,j,nall+icoic)
endif
!
! 16 is a randon pick from the oher 15
!
if(irandom.eq.1)then
call random_number (xxx)
ixxx=min(15,max(1,int(15.*xxx+1.e-8)))
xf_ens(i,j,nall+16)=xf_ens(i,j,nall+ixxx)
else
xf_ens(i,j,nall+16)=xf_ens(i,j,nall+1)
endif
!
!
!--- do some more on the caps!!! ne=1 for 175, ne=2 for 100,....
!
! do not care for caps here for closure groups 1 and 5,
! they are fine, do not turn them off here
!
!
if(maxens.gt.1)then
if(ne.eq.2.and.ierr2(i).gt.0)then
xf_ens(i,j,nall+1) =0.
xf_ens(i,j,nall+2) =0.
xf_ens(i,j,nall+3) =0.
xf_ens(i,j,nall+4) =0.
xf_ens(i,j,nall+5) =0.
xf_ens(i,j,nall+6) =0.
xf_ens(i,j,nall+7) =0.
xf_ens(i,j,nall+8) =0.
xf_ens(i,j,nall+9) =0.
xf_ens(i,j,nall+10)=0.
xf_ens(i,j,nall+11)=0.
xf_ens(i,j,nall+12)=0.
xf_ens(i,j,nall+13)=0.
xf_ens(i,j,nall+14)=0.
xf_ens(i,j,nall+15)=0.
xf_ens(i,j,nall+16)=0.
endif
if(ne.eq.3.and.ierr3(i).gt.0)then
xf_ens(i,j,nall+1) =0.
xf_ens(i,j,nall+2) =0.
xf_ens(i,j,nall+3) =0.
xf_ens(i,j,nall+4) =0.
xf_ens(i,j,nall+5) =0.
xf_ens(i,j,nall+6) =0.
xf_ens(i,j,nall+7) =0.
xf_ens(i,j,nall+8) =0.
xf_ens(i,j,nall+9) =0.
xf_ens(i,j,nall+10)=0.
xf_ens(i,j,nall+11)=0.
xf_ens(i,j,nall+12)=0.
xf_ens(i,j,nall+13)=0.
xf_ens(i,j,nall+14)=0.
xf_ens(i,j,nall+15)=0.
xf_ens(i,j,nall+16)=0.
endif
endif
endif
350 continue
if(maxens.gt.1)then
! ne=1, cap=175
!
nall=(iens-1)*maxens3*maxens*maxens2 &
+(iedt-1)*maxens*maxens3
! ne=2, cap=100
!
nall2=(iens-1)*maxens3*maxens*maxens2 &
+(iedt-1)*maxens*maxens3 &
+(2-1)*maxens3
xf_ens(i,j,nall+4) = xf_ens(i,j,nall2+4)
xf_ens(i,j,nall+5) =xf_ens(i,j,nall2+5)
xf_ens(i,j,nall+6) =xf_ens(i,j,nall2+6)
xf_ens(i,j,nall+14) =xf_ens(i,j,nall2+14)
xf_ens(i,j,nall+7) =xf_ens(i,j,nall2+7)
xf_ens(i,j,nall+8) =xf_ens(i,j,nall2+8)
xf_ens(i,j,nall+9) =xf_ens(i,j,nall2+9)
xf_ens(i,j,nall+15) =xf_ens(i,j,nall2+15)
xf_ens(i,j,nall+10)=xf_ens(i,j,nall2+10)
xf_ens(i,j,nall+11)=xf_ens(i,j,nall2+11)
xf_ens(i,j,nall+12)=xf_ens(i,j,nall2+12)
endif
go to 100
endif
elseif(ierr(i).ne.20.and.ierr(i).ne.0)then
do n=1,ensdim
xf_ens(i,j,n)=0.
enddo
endif
100 continue
END SUBROUTINE cup_forcing_ens_3d
SUBROUTINE cup_kbcon(ierrc,cap_inc,iloop,k22,kbcon,he_cup,hes_cup, & 9
hkb,ierr,kbmax,p_cup,cap_max, &
itf,jtf,ktf, &
its,ite, jts,jte, kts,kte )
IMPLICIT NONE
!
! only local wrf dimensions are need as of now in this routine
integer &
,intent (in ) :: &
itf,jtf,ktf, &
its,ite, jts,jte, kts,kte
!
!
!
! ierr error value, maybe modified in this routine
!
real, dimension (its:ite,kts:kte) &
,intent (in ) :: &
he_cup,hes_cup,p_cup
real, dimension (its:ite) &
,intent (in ) :: &
hkb,cap_max,cap_inc
integer, dimension (its:ite) &
,intent (in ) :: &
kbmax
integer, dimension (its:ite) &
,intent (inout) :: &
kbcon,k22,ierr
integer &
,intent (in ) :: &
iloop
character*50 :: ierrc(its:ite)
!
! local variables in this routine
!
integer :: &
i,k
real :: &
pbcdif,plus,hetest
!
!--- DETERMINE THE LEVEL OF CONVECTIVE CLOUD BASE - KBCON
!
DO 27 i=its,itf
kbcon(i)=1
IF(ierr(I).ne.0)GO TO 27
KBCON(I)=K22(I)+1
if(iloop.eq.5)KBCON(I)=K22(I)
GO TO 32
31 CONTINUE
KBCON(I)=KBCON(I)+1
IF(KBCON(I).GT.KBMAX(i)+2)THEN
if(iloop.ne.4)then
ierr(i)=3
ierrc(i)="could not find reasonable kbcon in cup_kbcon"
endif
GO TO 27
ENDIF
32 CONTINUE
hetest=HE_cup(I,K22(I))
if(iloop.eq.5)then
hetest=HKB(I)
! do k=1,k22(i)
! hetest=max(hetest,he_cup(i,k))
! enddo
endif
IF(HETEST.LT.HES_cup(I,KBCON(I)))then
! write(0,*)'htest',k22(i),kbcon(i),HETEST,-P_cup(I,KBCON(I))+P_cup(I,K22(I))
GO TO 31
endif
! cloud base pressure and max moist static energy pressure
! i.e., the depth (in mb) of the layer of negative buoyancy
if(KBCON(I)-K22(I).eq.1)go to 27
if(iloop.eq.5 .and. (KBCON(I)-K22(I)).eq.0)go to 27
PBCDIF=-P_cup(I,KBCON(I))+P_cup(I,K22(I))
plus=max(25.,cap_max(i)-float(iloop-1)*cap_inc(i))
if(iloop.eq.4)plus=cap_max(i)
!
! for shallow convection, if cap_max is greater than 25, it is the pressure at pbltop
if(iloop.eq.5)plus=25.
if(iloop.eq.5.and.cap_max(i).gt.25)pbcdif=-P_cup(I,KBCON(I))+cap_max(i)
IF(PBCDIF.GT.plus)THEN
! write(0,*)'htest',k22(i),kbcon(i),plus,-P_cup(I,KBCON(I))+P_cup(I,K22(I))
K22(I)=K22(I)+1
KBCON(I)=K22(I)+1
if(iloop.eq.5)KBCON(I)=K22(I)
IF(KBCON(I).GT.KBMAX(i)+2)THEN
if(iloop.ne.4)then
ierr(i)=3
ierrc(i)="could not find reasonable kbcon in cup_kbcon"
endif
GO TO 27
ENDIF
GO TO 32
ENDIF
27 CONTINUE
END SUBROUTINE cup_kbcon
SUBROUTINE cup_ktop(ierrc,ilo,dby,kbcon,ktop,ierr, & 3
itf,jtf,ktf, &
its,ite, jts,jte, kts,kte )
IMPLICIT NONE
!
! on input
!
! only local wrf dimensions are need as of now in this routine
integer &
,intent (in ) :: &
itf,jtf,ktf, &
its,ite, jts,jte, kts,kte
! dby = buoancy term
! ktop = cloud top (output)
! ilo = flag
! ierr error value, maybe modified in this routine
!
real, dimension (its:ite,kts:kte) &
,intent (inout) :: &
dby
integer, dimension (its:ite) &
,intent (in ) :: &
kbcon
integer &
,intent (in ) :: &
ilo
integer, dimension (its:ite) &
,intent (out ) :: &
ktop
integer, dimension (its:ite) &
,intent (inout) :: &
ierr
character*50 :: ierrc(its:ite)
!
! local variables in this routine
!
integer :: &
i,k
!
DO 42 i=its,itf
ktop(i)=1
IF(ierr(I).EQ.0)then
DO 40 K=KBCON(I)+1,ktf-1
IF(DBY(I,K).LE.0.)THEN
KTOP(I)=K-1
GO TO 41
ENDIF
40 CONTINUE
if(ilo.eq.1)ierr(i)=5
if(ilo.eq.1)ierrc(i)="problem with defining ktop"
! if(ilo.eq.2)ierr(i)=998
GO TO 42
41 CONTINUE
do k=ktop(i)+1,ktf
dby(i,k)=0.
enddo
if(kbcon(i).eq.ktop(i))then
ierr(i)=55
ierrc(i)="kbcon == ktop "
endif
endif
42 CONTINUE
END SUBROUTINE cup_ktop
SUBROUTINE cup_MAXIMI(ARRAY,KS,KE,MAXX,ierr, & 7
itf,jtf,ktf, &
its,ite, jts,jte, kts,kte )
IMPLICIT NONE
!
! on input
!
! only local wrf dimensions are need as of now in this routine
integer &
,intent (in ) :: &
itf,jtf,ktf, &
its,ite, jts,jte, kts,kte
! array input array
! x output array with return values
! kt output array of levels
! ks,kend check-range
real, dimension (its:ite,kts:kte) &
,intent (in ) :: &
array
integer, dimension (its:ite) &
,intent (in ) :: &
ierr,ke
integer &
,intent (in ) :: &
ks
integer, dimension (its:ite) &
,intent (out ) :: &
maxx
real, dimension (its:ite) :: &
x
real :: &
xar
integer :: &
i,k
DO 200 i=its,itf
MAXX(I)=KS
if(ierr(i).eq.0)then
X(I)=ARRAY(I,KS)
!
DO 100 K=KS,KE(i)
XAR=ARRAY(I,K)
IF(XAR.GE.X(I)) THEN
X(I)=XAR
MAXX(I)=K
ENDIF
100 CONTINUE
endif
200 CONTINUE
END SUBROUTINE cup_MAXIMI
SUBROUTINE cup_minimi(ARRAY,KS,KEND,KT,ierr, & 5
itf,jtf,ktf, &
its,ite, jts,jte, kts,kte )
IMPLICIT NONE
!
! on input
!
! only local wrf dimensions are need as of now in this routine
integer &
,intent (in ) :: &
itf,jtf,ktf, &
its,ite, jts,jte, kts,kte
! array input array
! x output array with return values
! kt output array of levels
! ks,kend check-range
real, dimension (its:ite,kts:kte) &
,intent (in ) :: &
array
integer, dimension (its:ite) &
,intent (in ) :: &
ierr,ks,kend
integer, dimension (its:ite) &
,intent (out ) :: &
kt
real, dimension (its:ite) :: &
x
integer :: &
i,k,kstop
DO 200 i=its,itf
KT(I)=KS(I)
if(ierr(i).eq.0)then
X(I)=ARRAY(I,KS(I))
KSTOP=MAX(KS(I)+1,KEND(I))
!
DO 100 K=KS(I)+1,KSTOP
IF(ARRAY(I,K).LT.X(I)) THEN
X(I)=ARRAY(I,K)
KT(I)=K
ENDIF
100 CONTINUE
endif
200 CONTINUE
END SUBROUTINE cup_MINIMI
SUBROUTINE cup_up_aa0(aa0,z,zu,dby,GAMMA_CUP,t_cup, & 13
kbcon,ktop,ierr, &
itf,jtf,ktf, &
its,ite, jts,jte, kts,kte )
IMPLICIT NONE
!
! on input
!
! only local wrf dimensions are need as of now in this routine
integer &
,intent (in ) :: &
itf,jtf,ktf, &
its,ite, jts,jte, kts,kte
! aa0 cloud work function
! gamma_cup = gamma on model cloud levels
! t_cup = temperature (Kelvin) on model cloud levels
! dby = buoancy term
! zu= normalized updraft mass flux
! z = heights of model levels
! ierr error value, maybe modified in this routine
!
real, dimension (its:ite,kts:kte) &
,intent (in ) :: &
z,zu,gamma_cup,t_cup,dby
integer, dimension (its:ite) &
,intent (in ) :: &
kbcon,ktop
!
! input and output
!
integer, dimension (its:ite) &
,intent (inout) :: &
ierr
real, dimension (its:ite) &
,intent (out ) :: &
aa0
!
! local variables in this routine
!
integer :: &
i,k
real :: &
dz,da
!
do i=its,itf
aa0(i)=0.
enddo
DO 100 k=kts+1,ktf
DO 100 i=its,itf
IF(ierr(i).ne.0)GO TO 100
IF(K.LE.KBCON(I))GO TO 100
IF(K.Gt.KTOP(I))GO TO 100
DZ=Z(I,K)-Z(I,K-1)
da=zu(i,k)*DZ*(9.81/(1004.*( &
(T_cup(I,K)))))*DBY(I,K-1)/ &
(1.+GAMMA_CUP(I,K))
IF(K.eq.KTOP(I).and.da.le.0.)go to 100
AA0(I)=AA0(I)+da
if(aa0(i).lt.0.)aa0(i)=0.
100 continue
END SUBROUTINE cup_up_aa0
!====================================================================
SUBROUTINE g3init(RTHCUTEN,RQVCUTEN,RQCCUTEN,RQICUTEN, & 1
MASS_FLUX,cp,restart, &
P_QC,P_QI,P_FIRST_SCALAR, &
RTHFTEN, RQVFTEN, &
APR_GR,APR_W,APR_MC,APR_ST,APR_AS, &
APR_CAPMA,APR_CAPME,APR_CAPMI, &
cugd_tten,cugd_ttens,cugd_qvten, &
cugd_qvtens,cugd_qcten, &
allowed_to_read, &
ids, ide, jds, jde, kds, kde, &
ims, ime, jms, jme, kms, kme, &
its, ite, jts, jte, kts, kte )
!--------------------------------------------------------------------
IMPLICIT NONE
!--------------------------------------------------------------------
LOGICAL , INTENT(IN) :: restart,allowed_to_read
INTEGER , INTENT(IN) :: ids, ide, jds, jde, kds, kde, &
ims, ime, jms, jme, kms, kme, &
its, ite, jts, jte, kts, kte
INTEGER , INTENT(IN) :: P_FIRST_SCALAR, P_QI, P_QC
REAL, INTENT(IN) :: cp
REAL, DIMENSION( ims:ime , kms:kme , jms:jme ) , INTENT(OUT) :: &
CUGD_TTEN, &
CUGD_TTENS, &
CUGD_QVTEN, &
CUGD_QVTENS, &
CUGD_QCTEN
REAL, DIMENSION( ims:ime , kms:kme , jms:jme ) , INTENT(OUT) :: &
RTHCUTEN, &
RQVCUTEN, &
RQCCUTEN, &
RQICUTEN
REAL, DIMENSION( ims:ime , kms:kme , jms:jme ) , INTENT(OUT) :: &
RTHFTEN, &
RQVFTEN
REAL, DIMENSION( ims:ime , jms:jme ) , INTENT(OUT) :: &
APR_GR,APR_W,APR_MC,APR_ST,APR_AS, &
APR_CAPMA,APR_CAPME,APR_CAPMI, &
MASS_FLUX
INTEGER :: i, j, k, itf, jtf, ktf
jtf=min0(jte,jde-1)
ktf=min0(kte,kde-1)
itf=min0(ite,ide-1)
IF(.not.restart)THEN
DO j=jts,jte
DO k=kts,kte
DO i=its,ite
RTHCUTEN(i,k,j)=0.
RQVCUTEN(i,k,j)=0.
ENDDO
ENDDO
ENDDO
DO j=jts,jte
DO k=kts,kte
DO i=its,ite
cugd_tten(i,k,j)=0.
cugd_ttens(i,k,j)=0.
cugd_qvten(i,k,j)=0.
cugd_qvtens(i,k,j)=0.
ENDDO
ENDDO
ENDDO
DO j=jts,jtf
DO k=kts,ktf
DO i=its,itf
RTHFTEN(i,k,j)=0.
RQVFTEN(i,k,j)=0.
ENDDO
ENDDO
ENDDO
IF (P_QC .ge. P_FIRST_SCALAR) THEN
DO j=jts,jtf
DO k=kts,ktf
DO i=its,itf
RQCCUTEN(i,k,j)=0.
cugd_qcten(i,k,j)=0.
ENDDO
ENDDO
ENDDO
ENDIF
IF (P_QI .ge. P_FIRST_SCALAR) THEN
DO j=jts,jtf
DO k=kts,ktf
DO i=its,itf
RQICUTEN(i,k,j)=0.
ENDDO
ENDDO
ENDDO
ENDIF
DO j=jts,jtf
DO i=its,itf
mass_flux(i,j)=0.
ENDDO
ENDDO
DO j=jts,jtf
DO i=its,itf
APR_GR(i,j)=0.
APR_ST(i,j)=0.
APR_W(i,j)=0.
APR_MC(i,j)=0.
APR_AS(i,j)=0.
APR_CAPMA(i,j)=0.
APR_CAPME(i,j)=0.
APR_CAPMI(i,j)=0.
ENDDO
ENDDO
ENDIF
END SUBROUTINE g3init
SUBROUTINE neg_check(j,subt,subq,dt,q,outq,outt,outqc,pret,its,ite,kts,kte,itf,ktf) 1
INTEGER, INTENT(IN ) :: j,its,ite,kts,kte,itf,ktf
real, dimension (its:ite,kts:kte ) , &
intent(inout ) :: &
outq,outt,outqc,subt,subq
real, dimension (its:ite,kts:kte ) , &
intent(inout ) :: &
q
real, dimension (its:ite ) , &
intent(inout ) :: &
pret
real &
,intent (in ) :: &
dt
real :: thresh,qmem,qmemf,qmem2,qtest,qmem1
!
! first do check on vertical heating rate
!
thresh=300.01
do i=its,itf
qmemf=1.
qmem=0.
do k=kts,ktf
qmem=(subt(i,k)+outt(i,k))*86400.
if(qmem.gt.2.*thresh)then
qmem2=2.*thresh/qmem
qmemf=min(qmemf,qmem2)
!
!
! print *,'1',' adjusted massflux by factor ',i,j,k,qmem,qmem2,qmemf,dt
endif
if(qmem.lt.-thresh)then
qmem2=-thresh/qmem
qmemf=min(qmemf,qmem2)
!
!
! print *,'2',' adjusted massflux by factor ',i,j,k,qmem,qmem2,qmemf,dt
endif
enddo
! if(qmemf.lt.1)then
! write(0,*)'1',' adjusted massflux by factor ',i,j,qmemf
! endif
do k=kts,ktf
subq(i,k)=subq(i,k)*qmemf
subt(i,k)=subt(i,k)*qmemf
outq(i,k)=outq(i,k)*qmemf
outt(i,k)=outt(i,k)*qmemf
outqc(i,k)=outqc(i,k)*qmemf
enddo
pret(i)=pret(i)*qmemf
enddo
!
! check whether routine produces negative q's. This can happen, since
! tendencies are calculated based on forced q's. This should have no
! influence on conservation properties, it scales linear through all
! tendencies
!
thresh=1.e-10
do i=its,itf
qmemf=1.
do k=kts,ktf-1
qmem=subq(i,k)+outq(i,k)
if(abs(qmem).gt.0.)then
qtest=q(i,k)+(subq(i,k)+outq(i,k))*dt
if(qtest.lt.thresh)then
!
! qmem2 would be the maximum allowable tendency
!
qmem1=outq(i,k)+subq(i,k)
qmem2=(thresh-q(i,k))/dt
qmemf=min(qmemf,qmem2/qmem1)
qmemf=max(0.,qmemf)
! write(0,*)'4 adjusted tendencies ',i,k,qmem,qmem2,qmemf
! write(0,*)'4 adjusted tendencies ',i,j,k,q(i,k),qmem1,qmemf
endif
endif
enddo
! if(qmemf.lt.1.)write(0,*)'4 adjusted tendencies ',i,j,qmemf
do k=kts,ktf
subq(i,k)=subq(i,k)*qmemf
subt(i,k)=subt(i,k)*qmemf
outq(i,k)=outq(i,k)*qmemf
outt(i,k)=outt(i,k)*qmemf
outqc(i,k)=outqc(i,k)*qmemf
enddo
pret(i)=pret(i)*qmemf
enddo
END SUBROUTINE neg_check
SUBROUTINE cup_output_ens_3d(xf_ens,ierr,dellat,dellaq,dellaqc, & 2,2
subt_ens,subq_ens,subt,subq,outtem,outq,outqc, &
zu,sub_mas,pre,pw,xmb,ktop, &
j,name,nx,nx2,iens,ierr2,ierr3,pr_ens, &
maxens3,ensdim, &
sig,APR_GR,APR_W,APR_MC,APR_ST,APR_AS, &
APR_CAPMA,APR_CAPME,APR_CAPMI,closure_n,xland1, &
weight_GR,weight_W,weight_MC,weight_ST,weight_AS,training, &
ipr,jpr,itf,jtf,ktf, &
its,ite, jts,jte, kts,kte)
IMPLICIT NONE
!
! on input
!
! only local wrf dimensions are need as of now in this routine
integer &
,intent (in ) :: &
ipr,jpr,itf,jtf,ktf, &
its,ite, jts,jte, kts,kte
integer, intent (in ) :: &
j,ensdim,nx,nx2,iens,maxens3,training
! xf_ens = ensemble mass fluxes
! pr_ens = precipitation ensembles
! dellat = change of temperature per unit mass flux of cloud ensemble
! dellaq = change of q per unit mass flux of cloud ensemble
! dellaqc = change of qc per unit mass flux of cloud ensemble
! outtem = output temp tendency (per s)
! outq = output q tendency (per s)
! outqc = output qc tendency (per s)
! pre = output precip
! xmb = total base mass flux
! xfac1 = correction factor
! pw = pw -epsilon*pd (ensemble dependent)
! ierr error value, maybe modified in this routine
!
real, dimension (its:ite,jts:jte,1:ensdim) &
,intent (inout) :: &
xf_ens,pr_ens
!srf ------
! real, dimension (its:ite,jts:jte) &
real, dimension (its:ite,jts:jte) &
,intent (inout) :: &
APR_GR,APR_W,APR_MC,APR_ST,APR_AS,APR_CAPMA, &
APR_CAPME,APR_CAPMI
real, dimension( its:ite , jts:jte ) &
,intent(in) :: weight_gr,weight_w,weight_mc,weight_st,weight_as
!-srf---
real, dimension (its:ite,kts:kte) &
,intent (out ) :: &
outtem,outq,outqc,subt,subq,sub_mas
real, dimension (its:ite,kts:kte) &
,intent (in ) :: &
zu
real, dimension (its:ite) &
,intent (in ) :: &
sig
real, dimension (its:ite) &
,intent (out ) :: &
pre,xmb
real, dimension (its:ite) &
,intent (inout ) :: &
closure_n,xland1
real, dimension (its:ite,kts:kte,1:nx) &
,intent (in ) :: &
subt_ens,subq_ens,dellat,dellaqc,dellaq,pw
integer, dimension (its:ite) &
,intent (in ) :: &
ktop
integer, dimension (its:ite) &
,intent (inout) :: &
ierr,ierr2,ierr3
!
! local variables in this routine
!
integer :: &
i,k,n,ncount
real :: &
outtes,ddtes,dtt,dtq,dtqc,dtpw,prerate,clos_wei,xmbhelp
real :: &
dtts,dtqs
real, dimension (its:ite) :: &
xfac1,xfac2
real, dimension (its:ite):: &
xmb_ske,xmb_ave,xmb_std,xmb_cur,xmbweight
real, dimension (its:ite):: &
pr_ske,pr_ave,pr_std,pr_cur
real, dimension (its:ite,jts:jte):: &
pr_gr,pr_w,pr_mc,pr_st,pr_as,pr_capma, &
pr_capme,pr_capmi
real, dimension (5) :: weight,wm,wm1,wm2,wm3
real, dimension (its:ite,5) :: xmb_w
!
character *(*), intent (in) :: &
name
!
weight(1) = -999. !this will turn off weights
wm(1)=-999.
!
!
DO k=kts,ktf
do i=its,itf
outtem(i,k)=0.
outq(i,k)=0.
outqc(i,k)=0.
subt(i,k)=0.
subq(i,k)=0.
sub_mas(i,k)=0.
enddo
enddo
do i=its,itf
pre(i)=0.
xmb(i)=0.
xfac1(i)=0.
xfac2(i)=0.
xmbweight(i)=1.
enddo
do i=its,itf
IF(ierr(i).eq.0)then
do n=(iens-1)*nx*nx2*maxens3+1,iens*nx*nx2*maxens3
if(pr_ens(i,j,n).le.0.)then
! if(i.eq.ipr.and.j.eq.jpr)write(0,*)'pr_ens',n,pr_ens(i,j,n),xf_ens(i,j,n)
xf_ens(i,j,n)=0.
endif
enddo
endif
enddo
!
xmb_w=0.
!
!-- now do feedback
!
ddtes=100.
do i=its,itf
if(ierr(i).eq.0)then
k=0
xmb_ave(i)=0.
do n=(iens-1)*nx*nx2*maxens3+1,iens*nx*nx2*maxens3
k=k+1
xmb_ave(i)=xmb_ave(i)+xf_ens(i,j,n)
enddo
xmb_ave(i)=xmb_ave(i)/float(k)
if(xmb_ave(i).le.0.)then
ierr(i)=13
xmb_ave(i)=0.
endif
xmb(i)=sig(i)*xmb_ave(i)
! --- Now use proper count of how many closures were actually
! used in cup_forcing_ens (including screening of some
! closures over water) to properly normalize xmb
clos_wei=16./max(1.,closure_n(i))
if(xmb(i).eq.0.)then
ierr(i)=19
endif
if(xmb(i).gt.100.)then
ierr(i)=19
endif
xfac1(i)=xmb(i)
xfac2(i)=xmb(i)
endif
ENDDO
DO k=kts,ktf
do i=its,itf
dtt =0.
dtts=0.
dtq =0.
dtqs=0.
dtqc=0.
dtpw=0.
IF(ierr(i).eq.0.and.k.le.ktop(i))then
do n=1,nx
dtt =dtt + dellat (i,k,n)
dtts=dtts + subt_ens(i,k,n)
dtq =dtq + dellaq (i,k,n)
dtqs=dtqs + subq_ens(i,k,n)
dtqc=dtqc + dellaqc (i,k,n)
dtpw=dtpw + pw (i,k,n)
enddo
OUTTEM(I,K)= XMB(I)* dtt /float(nx)
SUBT (I,K)= XMB(I)* dtts/float(nx)
OUTQ (I,K)= XMB(I)* dtq /float(nx)
SUBQ (I,K)= XMB(I)* dtqs/float(nx)
OUTQC (I,K)= XMB(I)* dtqc/float(nx)
PRE(I)=PRE(I)+XMB(I)*dtpw/float(nx)
sub_mas(i,k)=zu(i,k)*xmb(i)
! xf_ens(i,j,:)=sig(i)*xf_ens(i,j,:)*dtpw/float(nx)
endif
enddo
enddo
do i=its,itf
if(ierr(i).eq.0)then
do k=(iens-1)*nx*nx2*maxens3+1,iens*nx*nx2*maxens3
xf_ens(i,j,k)=sig(i)*xf_ens(i,j,k)*xfac1(i)
enddo
endif
ENDDO
!srf-fix for preci
do i=its,itf
if(ierr(i).ne. 0)then
apr_w (i,j)=0.0
apr_st(i,j)=0.0
apr_gr(i,j)=0.0
apr_mc(i,j)=0.0
apr_as(i,j)=0.0
endif
ENDDO
!srf
END SUBROUTINE cup_output_ens_3d
!-------------------------------------------------------
SUBROUTINE cup_up_moisture(name,ierr,z_cup,qc,qrc,pw,pwav, & 5
ccnclean,p_cup,kbcon,ktop,cd,dby,clw_all,&
t_cup,q,GAMMA_cup,zu,qes_cup,k22,qe_cup,xl, &
ZQEXEC,use_excess,ccn,rho, &
up_massentr,up_massdetr,psum,psumh, &
autoconv,aeroevap,itest,itf,jtf,ktf,j,ipr,jpr, &
its,ite, jts,jte, kts,kte )
IMPLICIT NONE
real, parameter :: BDISPM = 0.366 !Berry--size dispersion (maritime)
REAL, PARAMETER :: BDISPC = 0.146 !Berry--size dispersion (continental)
!
! on input
!
! only local wrf dimensions are need as of now in this routine
integer &
,intent (in ) :: &
use_excess,itest,autoconv,aeroevap,itf,jtf,ktf, &
its,ite, jts,jte,j,ipr,jpr, kts,kte
! cd= detrainment function
! q = environmental q on model levels
! qe_cup = environmental q on model cloud levels
! qes_cup = saturation q on model cloud levels
! dby = buoancy term
! cd= detrainment function
! zu = normalized updraft mass flux
! gamma_cup = gamma on model cloud levels
!
real, dimension (its:ite,kts:kte) &
,intent (in ) :: &
t_cup,p_cup,rho,q,zu,gamma_cup,qe_cup, &
up_massentr,up_massdetr,dby,qes_cup,z_cup,cd
real, dimension (its:ite) &
,intent (in ) :: &
zqexec
! entr= entrainment rate
real &
,intent (in ) :: &
ccnclean,xl
integer, dimension (its:ite) &
,intent (in ) :: &
kbcon,ktop,k22
!
! input and output
!
! ierr error value, maybe modified in this routine
integer, dimension (its:ite) &
,intent (inout) :: &
ierr
character *(*), intent (in) :: &
name
! qc = cloud q (including liquid water) after entrainment
! qrch = saturation q in cloud
! qrc = liquid water content in cloud after rainout
! pw = condensate that will fall out at that level
! pwav = totan normalized integrated condensate (I1)
! c0 = conversion rate (cloud to rain)
real, dimension (its:ite,kts:kte) &
,intent (out ) :: &
qc,qrc,pw,clw_all
real, dimension (its:ite,kts:kte) :: &
qch,qrcb,pwh,clw_allh
real, dimension (its:ite) :: &
pwavh
real, dimension (its:ite) &
,intent (out ) :: &
pwav,psum,psumh
real, dimension (its:ite) &
,intent (in ) :: &
ccn
!
! local variables in this routine
!
integer :: &
iounit,iprop,iall,i,k,k1,k2
real :: &
prop_ave,qrcb_h,bdsp,dp,g,rhoc,dh,qrch,c0,dz,radius,berryc0,q1,berryc
real, dimension (kts:kte) :: &
prop_b
!
prop_b(kts:kte)=0
iall=0
c0=.002
g=9.81
bdsp=BDISPM
!
!--- no precip for small clouds
!
if(name.eq.'shallow')c0=0.
do i=its,itf
pwav(i)=0.
pwavh(i)=0.
psum(i)=0.
psumh(i)=0.
enddo
do k=kts,ktf
do i=its,itf
pw(i,k)=0.
pwh(i,k)=0.
qc(i,k)=0.
if(ierr(i).eq.0)qc(i,k)=qes_cup(i,k)
if(ierr(i).eq.0)qch(i,k)=qes_cup(i,k)
clw_all(i,k)=0.
clw_allh(i,k)=0.
qrc(i,k)=0.
qrcb(i,k)=0.
enddo
enddo
if(use_excess < 2 ) then
do i=its,itf
if(ierr(i).eq.0.)then
do k=2,kbcon(i)-1
DZ=Z_cup(i,K)-Z_cup(i,K-1)
qc(i,k)=qe_cup(i,k22(i))+float(use_excess)*zqexec(i)
qch(i,k)=qe_cup(i,k22(i))+float(use_excess)*zqexec(i)
if(qc(i,k).gt.qes_cup(i,kbcon(i)-1))then
pw(i,k)=zu(i,k)*(qc(i,k)-qes_cup(i,kbcon(i)-1))
qc(i,k)=qes_cup(i,kbcon(i)-1)
qch(i,k)=qes_cup(i,kbcon(i)-1)
PWAV(I)=PWAV(I)+PW(I,K)
Psum(I)=Psum(I)+pw(I,K)*dz
endif
enddo
endif
enddo
else if(use_excess == 2) then
do i=its,itf
if(ierr(i).eq.0.)then
k1=max(1,k22(i)-1)
k2=k22(i)+1
do k=2,kbcon(i)-1
DZ=Z_cup(i,K)-Z_cup(i,K-1)
qc (i,k)=sum(qe_cup(i,k1:k2))/float(k2-k1+1) +zqexec(i)
qch(i,k)=sum(qe_cup(i,k1:k2))/float(k2-k1+1) +zqexec(i)
if(qc(i,k).gt.qes_cup(i,kbcon(i)-1))then
pw(i,k)=zu(i,k)*(qc(i,k)-qes_cup(i,kbcon(i)-1))
qc(i,k)=qes_cup(i,kbcon(i)-1)
qch(i,k)=qes_cup(i,kbcon(i)-1)
PWAV(I)=PWAV(I)+PW(I,K)
Psum(I)=Psum(I)+pw(I,K)*dz
endif
enddo !k
endif !ierr
enddo !i
endif ! use_excess
DO 100 k=kts+1,ktf
DO 100 i=its,itf
IF(ierr(i).ne.0)GO TO 100
IF(K.Lt.KBCON(I))GO TO 100
IF(K.Gt.KTOP(I))GO TO 100
rhoc=.5*(rho(i,k)+rho(i,k-1))
DZ=Z_cup(i,K)-Z_cup(i,K-1)
DP=p_cup(i,K)-p_cup(i,K-1)
!
!--- saturation in cloud, this is what is allowed to be in it
!
QRCH=QES_cup(I,K)+(1./XL)*(GAMMA_cup(i,k) &
/(1.+GAMMA_cup(i,k)))*DBY(I,K)
!
!------ 1. steady state plume equation, for what could
!------ be in cloud without condensation
!
!
qc(i,k)= (qc(i,k-1)*zu(i,k-1)-.5*up_massdetr(i,k-1)* qc(i,k-1)+ &
up_massentr(i,k-1)*q(i,k-1)) / &
(zu(i,k-1)-.5*up_massdetr(i,k-1)+up_massentr(i,k-1))
qch(i,k)= (qch(i,k-1)*zu(i,k-1)-.5*up_massdetr(i,k-1)*qch(i,k-1)+ &
up_massentr(i,k-1)*q(i,k-1)) / &
(zu(i,k-1)-.5*up_massdetr(i,k-1)+up_massentr(i,k-1))
if(qc(i,k).le.qrch)qc(i,k)=qrch
if(qch(i,k).le.qrch)qch(i,k)=qrch
!
!------- Total condensed water before rainout
!
clw_all(i,k)=QC(I,K)-QRCH
QRC(I,K)=(QC(I,K)-QRCH) ! /(1.+C0*DZ*zu(i,k))
clw_allh(i,k)=QCH(I,K)-QRCH
QRCB(I,K)=(QCH(I,K)-QRCH) ! /(1.+C0*DZ*zu(i,k))
IF(autoconv.eq.2) then
!
! normalized berry
!
! first calculate for average conditions, used in cup_dd_edt!
! this will also determine proportionality constant prop_b, which, if applied,
! would give the same results as c0 under these conditions
!
q1=1.e3*rhoc*qrcb(i,k) ! g/m^3 ! g[h2o]/cm^3
berryc0=q1*q1/(60.0*(5.0 + 0.0366*CCNclean/ &
( q1 * BDSP) ) ) !/(
! if(i.eq.ipr.and.j.eq.jpr)write(0,*)'cupm',k,rhoc,rho(i,k)
! qrcb_h=qrcb(i,k)/(1.+c0*dz)
qrcb_h=((QCH(I,K)-QRCH)*zu(i,k)-qrcb(i,k-1)*(.5*up_massdetr(i,k-1)))/ &
(zu(i,k)+.5*up_massdetr(i,k-1)+c0*dz*zu(i,k))
prop_b(k)=c0*qrcb_h*zu(i,k)/(1.e-3*berryc0)
pwh(i,k)=1.e-3*berryc0*dz*prop_b(k) ! 2.
berryc=qrcb(i,k)
qrcb(i,k)=((QCh(I,K)-QRCH)*zu(i,k)-pwh(i,k)-qrcb(i,k-1)*(.5*up_massdetr(i,k-1)))/ &
(zu(i,k)+.5*up_massdetr(i,k-1))
! QRCb(I,K) = qrcb(i,k) - pwh(i,k)
if(qrcb(i,k).lt.0.)then
berryc0=(qrcb(i,k-1)*(.5*up_massdetr(i,k-1))-(QCh(I,K)-QRCH)*zu(i,k))/zu(i,k)*1.e-3*dz*prop_b(k)
pwh(i,k)=zu(i,k)*1.e-3*berryc0*dz*prop_b(k)
qrcb(i,k)=0.
endif
! if(i.eq.ipr.and.j.eq.jpr)write(0,*)'cupm',zu(i,k),pwh(i,k),dz,qrch,qrcb(i,k),clw_allh(i,k)
QCh(I,K)=QRCb(I,K)+qrch
PWAVH(I)=PWAVH(I)+pwh(I,K)
Psumh(I)=Psumh(I)+clw_allh(I,K)*zu(i,k) *dz
!
! then the real berry
!
q1=1.e3*rhoc*qrc(i,k) ! g/m^3 ! g[h2o]/cm^3
berryc0=q1*q1/(60.0*(5.0 + 0.0366*CCN(i)/ &
( q1 * BDSP) ) ) !/(
berryc0=1.e-3*berryc0*dz*prop_b(k) ! 2.
berryc=qrc(i,k)
qrc(i,k)=((QC(I,K)-QRCH)*zu(i,k)-zu(i,k)*berryc0-qrc(i,k-1)*(.5*up_massdetr(i,k-1)))/ &
(zu(i,k)+.5*up_massdetr(i,k-1))
if(qrc(i,k).lt.0.)then
berryc0=((QC(I,K)-QRCH)*zu(i,k)-qrc(i,k-1)*(.5*up_massdetr(i,k-1)))/zu(i,k)
qrc(i,k)=0.
endif
pw(i,k)=berryc0*zu(i,k)
QC(I,K)=QRC(I,K)+qrch
!
! if not running with berry at all, do the following
!
ELSE !c0=.002
qrc(i,k)=((QC(I,K)-QRCH)*zu(i,k)-qrc(i,k-1)*(.5*up_massdetr(i,k-1)))/ &
(zu(i,k)+.5*up_massdetr(i,k-1)+c0*dz*zu(i,k))
PW(i,k)=c0*dz*QRC(I,K)*zu(i,k)
if(qrc(i,k).lt.0)then
qrc(i,k)=0.
pw(i,k)=0.
endif
!
!
if(iall.eq.1)then
qrc(i,k)=0.
pw(i,k)=(QC(I,K)-QRCH)*zu(i,k)
if(pw(i,k).lt.0.)pw(i,k)=0.
endif
QC(I,K)=QRC(I,K)+qrch
endif !autoconv
!
!--- integrated normalized ondensate
!
PWAV(I)=PWAV(I)+PW(I,K)
Psum(I)=Psum(I)+clw_all(I,K)*zu(i,k) *dz
100 CONTINUE
prop_ave=0.
iprop=0
do k=kts,kte
prop_ave=prop_ave+prop_b(k)
if(prop_b(k).gt.0)iprop=iprop+1
enddo
iprop=max(iprop,1)
! write(11,*)'prop_ave = ',prop_ave/float(iprop)
! print *,'pwav = ',pwav(1)
END SUBROUTINE cup_up_moisture
!====================================================================
SUBROUTINE gdinit(RTHCUTEN,RQVCUTEN,RQCCUTEN,RQICUTEN, & 1
MASS_FLUX,cp,restart, &
P_QC,P_QI,P_FIRST_SCALAR, &
RTHFTEN, RQVFTEN, &
APR_GR,APR_W,APR_MC,APR_ST,APR_AS, &
APR_CAPMA,APR_CAPME,APR_CAPMI, &
allowed_to_read, &
ids, ide, jds, jde, kds, kde, &
ims, ime, jms, jme, kms, kme, &
its, ite, jts, jte, kts, kte )
!--------------------------------------------------------------------
IMPLICIT NONE
!--------------------------------------------------------------------
LOGICAL , INTENT(IN) :: restart,allowed_to_read
INTEGER , INTENT(IN) :: ids, ide, jds, jde, kds, kde, &
ims, ime, jms, jme, kms, kme, &
its, ite, jts, jte, kts, kte
INTEGER , INTENT(IN) :: P_FIRST_SCALAR, P_QI, P_QC
REAL, INTENT(IN) :: cp
REAL, DIMENSION( ims:ime , kms:kme , jms:jme ) , INTENT(OUT) :: &
RTHCUTEN, &
RQVCUTEN, &
RQCCUTEN, &
RQICUTEN
REAL, DIMENSION( ims:ime , kms:kme , jms:jme ) , INTENT(OUT) :: &
RTHFTEN, &
RQVFTEN
REAL, DIMENSION( ims:ime , jms:jme ) , INTENT(OUT) :: &
APR_GR,APR_W,APR_MC,APR_ST,APR_AS, &
APR_CAPMA,APR_CAPME,APR_CAPMI, &
MASS_FLUX
IF(.not.restart)THEN
RTHCUTEN=0.
RQVCUTEN=0.
RTHFTEN=0.
RQVFTEN=0.
IF (P_QC .ge. P_FIRST_SCALAR) THEN
RQCCUTEN=0.
ENDIF
IF (P_QI .ge. P_FIRST_SCALAR) THEN
RQICUTEN=0.
ENDIF
mass_flux=0.
ENDIF
APR_GR=0.
APR_ST=0.
APR_W=0.
APR_MC=0.
APR_AS=0.
APR_CAPMA=0.
APR_CAPME=0.
APR_CAPMI=0.
END SUBROUTINE gdinit
!--------------------------------------------------------------------
real function satvap(temp2) 2
implicit none
real :: temp2, temp, toot, toto, eilog, tsot, &
& ewlog, ewlog2, ewlog3, ewlog4
temp = temp2-273.155
if (temp.lt.-20.) then !!!! ice saturation
toot = 273.16 / temp2
toto = 1 / toot
eilog = -9.09718 * (toot - 1) - 3.56654 * (log(toot) / &
& log(10.)) + .876793 * (1 - toto) + (log(6.1071) / log(10.))
satvap = 10 ** eilog
else
tsot = 373.16 / temp2
ewlog = -7.90298 * (tsot - 1) + 5.02808 * &
& (log(tsot) / log(10.))
ewlog2 = ewlog - 1.3816e-07 * &
& (10 ** (11.344 * (1 - (1 / tsot))) - 1)
ewlog3 = ewlog2 + .0081328 * &
& (10 ** (-3.49149 * (tsot - 1)) - 1)
ewlog4 = ewlog3 + (log(1013.246) / log(10.))
satvap = 10 ** ewlog4
end if
return
end function
SUBROUTINE CUP_gf_sh(xmb_out,zo,OUTQC,J,AAEQ,T,Q,Z1, & 1,11
TN,QO,PO,PRE,P,OUTT,OUTQ,DTIME,ktau,PSUR,US,VS, &
TCRIT, &
ztexec,zqexec,ccn,ccnclean,rho,dx,dhdt, &
kpbl,kbcon,ktop,k22, & !-lxz
xland,gsw,tscl_kf, &
xl,rv,cp,g,ichoice,ipr,jpr,ierr,ierrc, &
autoconv,itf,jtf,ktf, &
use_excess,its,ite, jts,jte, kts,kte &
)
IMPLICIT NONE
integer &
,intent (in ) :: &
autoconv,itf,jtf,ktf,ktau,use_excess, &
its,ite, jts,jte, kts,kte,ipr,jpr
integer, intent (in ) :: &
j,ichoice
!
!
!
real, dimension (its:ite,jts:jte) &
,intent (in ) :: &
gsw
! outtem = output temp tendency (per s)
! outq = output q tendency (per s)
! outqc = output qc tendency (per s)
! pre = output precip
real, dimension (its:ite,kts:kte) &
,intent (inout ) :: &
OUTT,OUTQ,OUTQC
real, dimension (its:ite) &
,intent (out ) :: &
pre,xmb_out
integer, dimension (its:ite) &
,intent (out ) :: &
kbcon,ktop,k22
integer, dimension (its:ite) &
,intent (in ) :: &
kpbl
!
! basic environmental input includes moisture convergence (mconv)
! omega (omeg), windspeed (us,vs), and a flag (aaeq) to turn off
! convection for this call only and at that particular gridpoint
!
real, dimension (its:ite,kts:kte) &
,intent (in ) :: &
rho,T,PO,P,US,VS,tn,dhdt
real, dimension (its:ite,kts:kte) &
,intent (inout) :: &
Q,QO
real, dimension (its:ite) &
,intent (in ) :: &
ztexec,zqexec,ccn,Z1,PSUR,AAEQ,xland
real &
,intent (in ) :: &
tscl_kf,dx,ccnclean,dtime,tcrit,xl,cp,rv,g
!
!
!***************** the following are your basic environmental
! variables. They carry a "_cup" if they are
! on model cloud levels (staggered). They carry
! an "o"-ending (z becomes zo), if they are the forced
! variables. They are preceded by x (z becomes xz)
! to indicate modification by some typ of cloud
!
! z = heights of model levels
! q = environmental mixing ratio
! qes = environmental saturation mixing ratio
! t = environmental temp
! p = environmental pressure
! he = environmental moist static energy
! hes = environmental saturation moist static energy
! z_cup = heights of model cloud levels
! q_cup = environmental q on model cloud levels
! qes_cup = saturation q on model cloud levels
! t_cup = temperature (Kelvin) on model cloud levels
! p_cup = environmental pressure
! he_cup = moist static energy on model cloud levels
! hes_cup = saturation moist static energy on model cloud levels
! gamma_cup = gamma on model cloud levels
!
!
! hcd = moist static energy in downdraft
! zd normalized downdraft mass flux
! dby = buoancy term
! entr = entrainment rate
! zd = downdraft normalized mass flux
! entr= entrainment rate
! hcd = h in model cloud
! bu = buoancy term
! zd = normalized downdraft mass flux
! gamma_cup = gamma on model cloud levels
! qcd = cloud q (including liquid water) after entrainment
! qrch = saturation q in cloud
! pwd = evaporate at that level
! pwev = total normalized integrated evaoprate (I2)
! entr= entrainment rate
! z1 = terrain elevation
! entr = downdraft entrainment rate
! jmin = downdraft originating level
! kdet = level above ground where downdraft start detraining
! psur = surface pressure
! z1 = terrain elevation
! pr_ens = precipitation ensemble
! xf_ens = mass flux ensembles
! massfln = downdraft mass flux ensembles used in next timestep
! omeg = omega from large scale model
! mconv = moisture convergence from large scale model
! zd = downdraft normalized mass flux
! zu = updraft normalized mass flux
! dir = "storm motion"
! mbdt = arbitrary numerical parameter
! dtime = dt over which forcing is applied
! iact_gr_old = flag to tell where convection was active
! kbcon = LFC of parcel from k22
! k22 = updraft originating level
! icoic = flag if only want one closure (usually set to zero!)
! dby = buoancy term
! ktop = cloud top (output)
! xmb = total base mass flux
! hc = cloud moist static energy
! hkb = moist static energy at originating level
real, dimension (its:ite,kts:kte) :: &
entr_rate_2d,mentrd_rate_2d,he,hes,qes,z, &
heo,heso,qeso,zo, &
xhe,xhes,xqes,xz,xt,xq, &
qes_cup,q_cup,he_cup,hes_cup,z_cup,p_cup,gamma_cup,t_cup, &
qeso_cup,qo_cup,heo_cup,heso_cup,zo_cup,po_cup,gammao_cup, &
tn_cup, &
xqes_cup,xq_cup,xhe_cup,xhes_cup,xz_cup,xp_cup,xgamma_cup, &
xt_cup, &
xlamue,dby,qc,qrcd,pwd,pw,hcd,qcd,dbyd,hc,qrc,zu,zd,clw_all, &
dbyo,qco,qrcdo,pwdo,pwo,hcdo,qcdo,dbydo,hco,qrco,zuo,zdo, &
xdby,xqc,xqrcd,xpwd,xpw,xhcd,xqcd,xhc,xqrc,xzu,xzd, &
! cd = detrainment function for updraft
! cdd = detrainment function for downdraft
! dellat = change of temperature per unit mass flux of cloud ensemble
! dellaq = change of q per unit mass flux of cloud ensemble
! dellaqc = change of qc per unit mass flux of cloud ensemble
cd,cdd,DELLAH,DELLAQ,DELLAT,DELLAQC,dsubt,dsubq,subt,subq
! aa0 cloud work function for downdraft
! edt = epsilon
! aa0 = cloud work function without forcing effects
! aa1 = cloud work function with forcing effects
! xaa0 = cloud work function with cloud effects (ensemble dependent)
! edt = epsilon
real, dimension (its:ite) :: &
edt,edto,edtx,AA1,AA0,XAA0,HKB, &
HKBO,XHKB,QKB,QKBO, &
xmbmax,XMB,XPWAV,XPWEV,PWAV,PWEV,PWAVO, &
PWEVO,BU,BUD,BUO,cap_max,xland1, &
cap_max_increment,closure_n,psum,psumh,sig,zuhe
integer, dimension (its:ite) :: &
kzdown,KDET,KB,JMIN,kstabi,kstabm,K22x, & !-lxz
KBCONx,KBx,KTOPx,ierr,ierr2,ierr3,KBMAX
integer :: &
nall,iedt,nens,nens3,ki,I,K,KK,iresult
real :: &
day,dz,dzo,mbdt,entr_rate,radius,entrd_rate,mentrd_rate, &
zcutdown,edtmax,edtmin,depth_min,zkbmax,z_detr,zktop, &
massfld,dh,cap_maxs,trash,frh,xlamdd,fsum
real detdo1,detdo2,entdo,dp,subin,detdo,entup, &
detup,subdown,entdoj,entupk,detupk,totmas
real :: power_entr,zustart,zufinal,dzm1,dzp1
integer :: jprnt,k1,k2,kbegzu,kfinalzu,kstart,jmini,levadj
logical :: keep_going
real xff_shal(9),blqe,xkshal
character*50 :: ierrc(its:ite)
real, dimension (its:ite,kts:kte) :: &
up_massentr,up_massdetr,dd_massentr,dd_massdetr &
,up_massentro,up_massdetro,dd_massentro,dd_massdetro
real, dimension (kts:kte) :: smth
zustart=.1
zufinal=1.
levadj=4
power_entr=2.
day=86400.
do i=its,itf
xmb_out(i)=0.
xland1(i)=1.
if(xland(i).gt.1.5)xland1(i)=0.
cap_max_increment(i)=25.
ierrc(i)=" "
enddo
!
!--- initial entrainment rate (these may be changed later on in the
!--- program
!
entr_rate =.2/200.
!
!--- initial detrainmentrates
!
do k=kts,ktf
do i=its,itf
up_massentro(i,k)=0.
up_massdetro(i,k)=0.
z(i,k)=zo(i,k)
xz(i,k)=zo(i,k)
qrco(i,k)=0.
cd(i,k)=1.*entr_rate
dellaqc(i,k)=0.
enddo
enddo
!
!--- max/min allowed value for epsilon (ratio downdraft base mass flux/updraft
!
!--- minimum depth (m), clouds must have
!
depth_min=50.
!
!--- maximum depth (mb) of capping
!--- inversion (larger cap = no convection)
!
cap_maxs=25.
DO i=its,itf
kbmax(i)=1
aa0(i)=0.
aa1(i)=0.
enddo
do i=its,itf
cap_max(i)=cap_maxs
iresult=0
enddo
!
!--- max height(m) above ground where updraft air can originate
!
zkbmax=4000.
!
!--- calculate moist static energy, heights, qes
!
call cup_env
(z,qes,he,hes,t,q,p,z1, &
psur,ierr,tcrit,-1,xl,cp, &
itf,jtf,ktf, &
its,ite, jts,jte, kts,kte)
call cup_env
(zo,qeso,heo,heso,tn,qo,po,z1, &
psur,ierr,tcrit,-1,xl,cp, &
itf,jtf,ktf, &
its,ite, jts,jte, kts,kte)
!
!--- environmental values on cloud levels
!
call cup_env_clev
(t,qes,q,he,hes,z,p,qes_cup,q_cup,he_cup, &
hes_cup,z_cup,p_cup,gamma_cup,t_cup,psur, &
ierr,z1,xl,rv,cp, &
itf,jtf,ktf, &
its,ite, jts,jte, kts,kte)
call cup_env_clev
(tn,qeso,qo,heo,heso,zo,po,qeso_cup,qo_cup, &
heo_cup,heso_cup,zo_cup,po_cup,gammao_cup,tn_cup,psur, &
ierr,z1,xl,rv,cp, &
itf,jtf,ktf, &
its,ite, jts,jte, kts,kte)
do i=its,itf
if(ierr(i).eq.0)then
if(aaeq(i).lt.-0.1)then
ierr(i)=20
endif
!
do k=kts,ktf
if(zo_cup(i,k).gt.zkbmax+z1(i))then
kbmax(i)=k
go to 25
endif
enddo
25 continue
!
kbmax(i)=min(kbmax(i),ktf-4)
endif
enddo
!
!
!
!------- DETERMINE LEVEL WITH HIGHEST MOIST STATIC ENERGY CONTENT - K22
!
CALL cup_MAXIMI
(HEO_CUP,3,KBMAX,K22,ierr, &
itf,jtf,ktf, &
its,ite, jts,jte, kts,kte)
DO 36 i=its,itf
if(kpbl(i).gt.5)cap_max(i)=po_cup(i,kpbl(i))
IF(ierr(I).eq.0.)THEN
IF(K22(I).GT.KBMAX(i))then
ierr(i)=2
ierrc(i)="could not find k22"
endif
if(kpbl(i).gt.5)then
k22(i)=kpbl(i)
ierr(i)=0
ierrc(i)="reset to zero becausof kpbl"
endif
else
ierrc(i)="why here? "
endif
if(j.eq.jpr .and. i.eq.ipr)write(0,*)'initial k22 = ',k22(ipr),kpbl(i)
36 CONTINUE
!
!--- DETERMINE THE LEVEL OF CONVECTIVE CLOUD BASE - KBCON
!
do i=its,itf
IF(ierr(I).eq.0.)THEN
if(use_excess == 2) then
k1=max(1,k22(i)-1)
k2=k22(i)+1
hkb(i) =sum(he_cup(i,k1:k2))/float(k2-k1+1)+xl*zqexec(i)+cp*ztexec(i)
hkbo(i)=sum(heo_cup(i,k1:k2))/float(k2-k1+1)+xl*zqexec(i)+cp*ztexec(i)
qkbo(i)=sum(qo_cup(i,k1:k2))/float(k2-k1+1)+xl*zqexec(i)
! write(0,*)sum(heo_cup(i,k1:k2))/float(k2-k1+1),heo_cup(i,k1),heo(i,k1:k2)
else if(use_excess <= 1) then
hkb(i)=he_cup(i,k22(i))+float(use_excess)*(xl*zqexec(i)+cp*ztexec(i))
hkbo(i)=heo_cup(i,k22(i))+float(use_excess)*(xl*zqexec(i)+cp*ztexec(i))
qkbo(i)=qo_cup(i,k22(i))+float(use_excess)*(xl*zqexec(i))
endif ! excess
do k=1,k22(i)
hkb(i)=max(hkb(i),he_cup(i,k))
hkbo(i)=max(hkbo(i),heo_cup(i,k))
qkbo(i)=max(qkbo(i),qo_cup(i,k))
enddo
endif ! ierr
enddo
call cup_kbcon
(ierrc,cap_max_increment,5,k22,kbcon,heo_cup,heso_cup, &
hkbo,ierr,kbmax,po_cup,cap_max, &
itf,jtf,ktf, &
its,ite, jts,jte, kts,kte)
!
!--- increase detrainment in stable layers
!
DO 887 i=its,itf
IF(ierr(I).eq.0.)THEN
if(kbcon(i).gt.ktf-4)then
ierr(i)=231
go to 887
endif
do k=kts,ktf
frh = min(qo_cup(i,k)/qeso_cup(i,k),1.)
entr_rate_2d(i,k)=entr_rate*(1.3-frh)
cd(i,k)=entr_rate_2d(i,k)
enddo
zuhe(i)=zustart
kstart=1
frh=(zufinal-zustart)/((float(kbcon(i))**power_entr)-(float(kstart)**power_entr))
dh=zuhe(i)-frh*(float(kstart)**power_entr)
do k=kstart,kbcon(i)-1
dz=z_cup(i,k+1)-z_cup(i,k)
cd(i,k)=0.
entr_rate_2d(i,k)=((frh*(float((k+1))**power_entr)+dh)/zuhe(i)-1.+cd(i,k)*dz)/dz
zuhe(i)=zuhe(i)+entr_rate_2d(i,k)*dz*zuhe(i)-cd(i,k)*dz*zuhe(i)
if(i.eq.ipr.and.j.eq.jpr)write(0,*)'entr = ',k,entr_rate_2d(i,k),dh,frh,zuhe(i),dz
enddo
frh=-(0.1-zuhe(i))/((float(kbcon(i)+4)**power_entr)-(float(kbcon(i)-1)**power_entr))
dh=zuhe(i)+frh*(float(kbcon(i))**power_entr)
do k=kbcon(i),kbcon(i)+4
dz=z_cup(i,k+1)-z_cup(i,k)
cd(i,k)=-((-frh*(float((k+1))**power_entr)+dh)/zuhe(i)-1.-entr_rate_2d(i,k)*dz)/dz
zuhe(i)=zuhe(i)+entr_rate_2d(i,k)*dz*zuhe(i)-cd(i,k)*dz*zuhe(i)
if(i.eq.ipr.and.j.eq.jpr)write(0,*)'entr = ',k,entr_rate_2d(i,k),cd(i,k),zuhe(i)
enddo
do k=kbcon(i)+4+1,ktf
entr_rate_2d(i,k)=0.
cd(i,k)=0.
enddo
ENDIF
887 enddo
!
! calculate mass entrainment and detrainment
!
do k=kts,ktf
do i=its,itf
hc(i,k)=0.
DBY(I,K)=0.
hco(i,k)=0.
DBYo(I,K)=0.
enddo
enddo
do i=its,itf
IF(ierr(I).eq.0.)THEN
do k=1,kbcon(i)-1
hc(i,k)=hkb(i)
hco(i,k)=hkbo(i)
qco(i,k)=qkbo(i)
enddo
k=kbcon(i)
hc(i,k)=hkb(i)
qco(i,k)=qkbo(i)
DBY(I,Kbcon(i))=Hkb(I)-HES_cup(I,K)
hco(i,k)=hkbo(i)
DBYo(I,Kbcon(i))=Hkbo(I)-HESo_cup(I,K)
trash=QESo_cup(I,K)+(1./XL)*(GAMMAo_cup(i,k) &
/(1.+GAMMAo_cup(i,k)))*DBYo(I,K)
qrco(i,k)=max(0.,qco(i,k)-trash)
endif ! ierr
enddo
!
!
do 42 i=its,itf
if(ierr(i).eq.0)then
zu(i,1)=zustart
zuo(i,1)=zustart
! mass entrainment and detrinament is defined on model levels
do k=2,ktf-1 !kbcon(i)+4 ! ktf-1
dz=zo_cup(i,k)-zo_cup(i,k-1)
up_massentro(i,k-1)=entr_rate_2d(i,k-1)*dz*zuo(i,k-1)
up_massdetro(i,k-1)=cd(i,k-1)*dz*zuo(i,k-1)
zuo(i,k)=zuo(i,k-1)+up_massentro(i,k-1)-up_massdetro(i,k-1)
if(zuo(i,k).lt.0.05)then
zuo(i,k)=.05
up_massdetro(i,k-1)=zuo(i,k-1)-.05 + up_massentro(i,k-1)
cd(i,k-1)=up_massdetro(i,k-1)/dz/zuo(i,k-1)
endif
zu(i,k)=zuo(i,k)
up_massentr(i,k-1)=up_massentro(i,k-1)
up_massdetr(i,k-1)=up_massdetro(i,k-1)
! zu(i,k)=max(0.01,zu(i,k-1)+up_massentr(i,k-1)-up_massdetr(i,k-1))
enddo
do k=kbcon(i)+1,ktf-1
hc(i,k)=(hc(i,k-1)*zu(i,k-1)-.5*up_massdetr(i,k-1)*hc(i,k-1)+ &
up_massentr(i,k-1)*he(i,k-1)) / &
(zu(i,k-1)-.5*up_massdetr(i,k-1)+up_massentr(i,k-1))
dby(i,k)=hc(i,k)-hes_cup(i,k)
hco(i,k)=(hco(i,k-1)*zuo(i,k-1)-.5*up_massdetro(i,k-1)*hco(i,k-1)+ &
up_massentro(i,k-1)*heo(i,k-1)) / &
(zuo(i,k-1)-.5*up_massdetro(i,k-1)+up_massentro(i,k-1))
dbyo(i,k)=hco(i,k)-heso_cup(i,k)
enddo
do k=kbcon(i)+1,ktf
if(dbyo(i,k).lt.0)then
ktop(i)=k-1
go to 41
endif
enddo
41 continue
if(ktop(i).lt.kbcon(i)+1)then
ierr(i)=5
ierrc(i)='ktop is less than kbcon+1'
go to 42
endif
if(ktop(i).gt.ktf-2)then
ierr(i)=5
ierrc(i)="ktop is larger than ktf-2"
go to 42
endif
do k=kbcon(i)+1,ktop(i)
trash=QESo_cup(I,K)+(1./XL)*(GAMMAo_cup(i,k) &
/(1.+GAMMAo_cup(i,k)))*DBYo(I,K)
qco(i,k)= (qco(i,k-1)*zuo(i,k-1)-.5*up_massdetr(i,k-1)* qco(i,k-1)+ &
up_massentr(i,k-1)*qo(i,k-1)) / &
(zuo(i,k-1)-.5*up_massdetr(i,k-1)+up_massentr(i,k-1))
qrco(i,k)=max(0.,qco(i,k)-trash)
enddo
do k=ktop(i)+1,ktf
HC(i,K)=hes_cup(i,k)
HCo(i,K)=heso_cup(i,k)
DBY(I,K)=0.
DBYo(I,K)=0.
zu(i,k)=0.
zuo(i,k)=0.
cd(i,k)=0.
entr_rate_2d(i,k)=0.
up_massentr(i,k)=0.
up_massdetr(i,k)=0.
up_massentro(i,k)=0.
up_massdetro(i,k)=0.
enddo
if(i.eq.ipr.and.j.eq.jpr)then
write(0,*)'hcnew = '
do k=1,ktf
write(0,*)k,hco(i,k),dbyo(i,k)
enddo
endif
endif
42 continue
! enddo
!
!--- calculate workfunctions for updrafts
!
call cup_up_aa0
(aa0,z,zu,dby,GAMMA_CUP,t_cup, &
kbcon,ktop,ierr, &
itf,jtf,ktf, &
its,ite, jts,jte, kts,kte)
call cup_up_aa0
(aa1,zo,zuo,dbyo,GAMMAo_CUP,tn_cup, &
kbcon,ktop,ierr, &
itf,jtf,ktf, &
its,ite, jts,jte, kts,kte)
do i=its,itf
if(ierr(i).eq.0)then
if(aa1(i).eq.0.)then
ierr(i)=17
ierrc(i)="cloud work function zero"
endif
endif
enddo
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!
!--- change per unit mass that a model cloud would modify the environment
!
!--- 1. in bottom layer
!
do k=kts,ktf
do i=its,itf
dellah(i,k)=0.
dsubt(i,k)=0.
dellaq(i,k)=0.
dsubq(i,k)=0.
enddo
enddo
!
!---------------------------------------------- cloud level ktop
!
!- - - - - - - - - - - - - - - - - - - - - - - - model level ktop-1
! . . .
! . . .
! . . .
! . . .
! . . .
! . . .
!
!---------------------------------------------- cloud level k+2
!
!- - - - - - - - - - - - - - - - - - - - - - - - model level k+1
!
!---------------------------------------------- cloud level k+1
!
!- - - - - - - - - - - - - - - - - - - - - - - - model level k
!
!---------------------------------------------- cloud level k
!
! . . .
! . . .
! . . .
! . . .
! . . .
! . . .
! . . .
! . . .
! . . .
! . . .
!
!---------------------------------------------- cloud level 3
!
!- - - - - - - - - - - - - - - - - - - - - - - - model level 2
!
!---------------------------------------------- cloud level 2
!
!- - - - - - - - - - - - - - - - - - - - - - - - model level 1
do i=its,itf
if(ierr(i).eq.0)then
dp=100.*(po_cup(i,1)-po_cup(i,2))
dsubt(i,1)=0.
dsubq(i,1)=0.
do k=kts+1,ktop(i)
subin=0.
subdown=0.
! these three are only used at or near mass detrainment and/or entrainment levels
entupk=0.
detupk=0.
! entrainment/detrainment for updraft
entup=up_massentro(i,k)
detup=up_massdetro(i,k)
!
! SPECIAL LEVELS
!
if(k.eq.ktop(i))then
detupk=zuo(i,ktop(i))
subin=0.
subdown=0.
entup=0.
detup=0.
endif
totmas=subin-subdown+detup-entup &
-entupk+detupk+zuo(i,k+1)-zuo(i,k)
! print *,'*********************',k,totmas
! write(0,123)k,subin+zuo(i,k+1),subdown-zuo(i,k),detup,entup, &
! detdo,entdo,entupk,detupk
! write(8,*)'totmas = ',k,totmas
if(abs(totmas).gt.1.e-6)then
write(0,*)'*********************',i,j,k,totmas
print *,jmin(i),k22(i),kbcon(i),ktop(i)
write(0,123)k,subin,subdown,detup,entup, &
entupk,detupk,zuo(i,k+1),zuo(i,k)
123 formAT(1X,i2,10E12.4)
! call wrf_error_fatal ( 'totmas .gt.1.e-6' )
endif
dp=100.*(po_cup(i,k)-po_cup(i,k+1))
dellah(i,k)=(detup*.5*(HCo(i,K+1)+HCo(i,K)) &
-entup*heo(i,k) &
+subin*heo_cup(i,k+1) &
-subdown*heo_cup(i,k) &
+detupk*(hco(i,ktop(i))-heo_cup(i,ktop(i))) &
-entupk*heo_cup(i,k22(i)) &
)*g/dp
dellaq(i,k)=(detup*.5*(qco(i,K+1)+qco(i,K)-qrco(i,k+1)-qrco(i,k)) &
-entup*qo(i,k) &
+subin*qo_cup(i,k+1) &
-subdown*qo_cup(i,k) &
+detupk*(qco(i,ktop(i))-qrco(i,ktop(i))-qo_cup(i,ktop(i))) &
-entupk*qo_cup(i,k22(i)) &
)*g/dp
!
! updraft subsidence only
!
if(k.lt.ktop(i))then
dsubt(i,k)=(zuo(i,k+1)*heo_cup(i,k+1) &
-zuo(i,k)*heo_cup(i,k))*g/dp
dsubq(i,k)=(zuo(i,k+1)*qo_cup(i,k+1) &
-zuo(i,k)*qo_cup(i,k))*g/dp
if(i.eq.ipr.and.j.eq.jpr)then
write(0,*)'dq3',k,zuo(i,k+1)*heo_cup(i,k+1),zuo(i,k)*heo_cup(i,k)
endif
endif
!
enddo ! k
endif
enddo
!
!-- take out cloud liquid water for detrainment
!
do k=kts,ktf-1
do i=its,itf
dellaqc(i,k)=0.
if(ierr(i).eq.0)then
if(k.eq.ktop(i)-0)dellaqc(i,k)= &
.01*zuo(i,ktop(i))*qrco(i,ktop(i))* &
9.81/(po_cup(i,k)-po_cup(i,k+1))
if(k.lt.ktop(i).and.k.gt.kbcon(i))then
dz=zo_cup(i,k+1)-zo_cup(i,k)
dellaqc(i,k)=.01*9.81*up_massdetro(i,k)*.5*(qrco(i,k)+qrco(i,k+1))/ &
(po_cup(i,k)-po_cup(i,k+1))
endif
if(dellaqc(i,k).lt.0)write(0,*)'neg della',i,j,k,ktop(i),qrco(i,k), &
qrco(i,k+1),up_massdetro(i,k),zuo(i,ktop(i))
dellaqc(i,k)=max(0.,dellaqc(i,k))
endif
enddo
enddo
!
!--- using dellas, calculate changed environmental profiles
!
mbdt=3.e-4
do k=kts,ktf
do i=its,itf
dellat(i,k)=0.
if(ierr(i).eq.0)then
trash=dsubt(i,k)
XHE(I,K)=(dsubt(i,k)+DELLAH(I,K))*MBDT+HEO(I,K)
XQ(I,K)=(dsubq(i,k)+DELLAQ(I,K))*MBDT+QO(I,K)
DELLAT(I,K)=(1./cp)*(DELLAH(I,K)-xl*DELLAQ(I,K))
dSUBT(I,K)=(1./cp)*(dsubt(i,k)-xl*dsubq(i,k))
XT(I,K)= (DELLAT(I,K)+dsubt(i,k))*MBDT+TN(I,K)
IF(XQ(I,K).LE.0.)XQ(I,K)=1.E-08
ENDIF
enddo
enddo
do i=its,itf
if(ierr(i).eq.0)then
xhkb(i)=hkbo(i)+(dsubt(i,k22(i))+DELLAH(I,K22(i)))*MBDT
XHE(I,ktf)=HEO(I,ktf)
XQ(I,ktf)=QO(I,ktf)
XT(I,ktf)=TN(I,ktf)
IF(XQ(I,ktf).LE.0.)XQ(I,ktf)=1.E-08
endif
enddo
!
!--- calculate moist static energy, heights, qes
!
call cup_env
(xz,xqes,xhe,xhes,xt,xq,po,z1, &
psur,ierr,tcrit,-1,xl,cp, &
itf,jtf,ktf, &
its,ite, jts,jte, kts,kte)
!
!--- environmental values on cloud levels
!
call cup_env_clev
(xt,xqes,xq,xhe,xhes,xz,po,xqes_cup,xq_cup, &
xhe_cup,xhes_cup,xz_cup,po_cup,gamma_cup,xt_cup,psur, &
ierr,z1,xl,rv,cp, &
itf,jtf,ktf, &
its,ite, jts,jte, kts,kte)
!
!
!**************************** static control
!
!--- moist static energy inside cloud
!
! do i=its,itf
! if(ierr(i).eq.0)then
! xhkb(i)=xhe(i,k22(i))
! endif
! enddo
do k=kts,ktf
do i=its,itf
xhc(i,k)=0.
xDBY(I,K)=0.
enddo
enddo
do i=its,itf
if(ierr(i).eq.0)then
! if(use_excess == 2) then
! k1=max(1,k22(i)-1)
! k2=k22(i)+1
! xhkb(i) =sum(xhe_cup(i,k1:k2))/float(k2-k1+1)+xl*zqexec(i)+cp*ztexec(i)
! else if(use_excess <= 1) then
! xhkb(i)=xhe_cup(i,k22(i))+float(use_excess)*(xl*zqexec(i)+cp*ztexec(i))
! endif
do k=1,kbcon(i)-1
xhc(i,k)=xhkb(i)
enddo
k=kbcon(i)
xhc(i,k)=xhkb(i)
xDBY(I,Kbcon(i))=xHkb(I)-xHES_cup(I,K)
endif !ierr
enddo
!
!
do i=its,itf
if(ierr(i).eq.0)then
xzu(i,:)=zuo(i,:)
do k=kbcon(i)+1,ktop(i)
xhc(i,k)=(xhc(i,k-1)*xzu(i,k-1)-.5*up_massdetro(i,k-1)*xhc(i,k-1)+ &
up_massentro(i,k-1)*xhe(i,k-1)) / &
(xzu(i,k-1)-.5*up_massdetro(i,k-1)+up_massentro(i,k-1))
xdby(i,k)=xhc(i,k)-xhes_cup(i,k)
enddo
do k=ktop(i)+1,ktf
xHC(i,K)=xhes_cup(i,k)
xDBY(I,K)=0.
xzu(i,k)=0.
enddo
endif
enddo
!
!--- workfunctions for updraft
!
call cup_up_aa0
(xaa0,xz,xzu,xdby,GAMMA_CUP,xt_cup, &
kbcon,ktop,ierr, &
itf,jtf,ktf, &
its,ite, jts,jte, kts,kte)
!
! now for shallow forcing
!
do i=its,itf
xmb(i)=0.
xff_shal(1:9)=0.
if(ierr(i).eq.0)then
xmbmax(i)=0.1
xkshal=(xaa0(i)-aa1(i))/mbdt
if(xkshal.ge.0.)xkshal=+1.e6
if(xkshal.gt.-1.e-4 .and. xkshal.lt.0.)xkshal=-1.e-4
xff_shal(1)=max(0.,-(aa1(i)-aa0(i))/(xkshal*dtime))
xff_shal(1)=min(xmbmax(i),xff_shal(1))
xff_shal(2)=max(0.,-(aa1(i)-aa0(i))/(xkshal*dtime))
xff_shal(2)=min(xmbmax(i),xff_shal(2))
xff_shal(3)=max(0.,-(aa1(i)-aa0(i))/(xkshal*dtime))
xff_shal(3)=min(xmbmax(i),xff_shal(3))
if(aa1(i).le.0)then
xff_shal(1)=0.
xff_shal(2)=0.
xff_shal(3)=0.
endif
if(aa1(i)-aa0(i).le.0.)then
xff_shal(1)=0.
xff_shal(2)=0.
xff_shal(3)=0.
endif
! boundary layer QE (from Saulo Freitas)
blqe=0.
trash=0.
if(k22(i).lt.kpbl(i)+1)then
do k=1,kbcon(i)-1
blqe=blqe+100.*dhdt(i,k)*(po_cup(i,k)-po_cup(i,k+1))/g
enddo
trash=max((hc(i,kbcon(i))-he_cup(i,kbcon(i))),1.e1)
xff_shal(7)=max(0.,blqe/trash)
xff_shal(7)=min(xmbmax(i),xff_shal(7))
else
xff_shal(7)=0.
endif
if(xkshal.lt.-1.1e-04)then ! .and. &
! ((aa1(i)-aa0(i).gt.0.) .or. (xff_shal(7).gt.0)))then
xff_shal(4)=max(0.,-aa0(i)/(xkshal*tscl_KF))
xff_shal(4)=min(xmbmax(i),xff_shal(4))
xff_shal(5)=xff_shal(4)
xff_shal(6)=xff_shal(4)
else
xff_shal(4)=0.
xff_shal(5)=0.
xff_shal(6)=0.
endif
! write(0,888)'i0=',i,j,kpbl(i),blqe,xff_shal(7)
!888 format(a3,3(1x,i3),2e12.4)
xff_shal(8)= xff_shal(7)
xff_shal(9)= xff_shal(7)
fsum=0.
do k=1,9
xmb(i)=xmb(i)+xff_shal(k)
fsum=fsum+1.
enddo
xmb(i)=min(xmbmax(i),xmb(i)/fsum)
if(i.eq.ipr.and.j.eq.jpr)write(0,*)',ierr,xffs',ierr(i),xff_shal(1:9),xmb(i),xmbmax(i)
if(xmb(i).eq.0.)ierr(i)=22
if(xmb(i).eq.0.)ierrc(i)="22"
if(xmb(i).lt.0.)then
ierr(i)=21
ierrc(i)="21"
write(0,*)'neg xmb,i,j,xmb for shallow = ',i,j,k22(i),ierr(i)
endif
endif
if(ierr(i).ne.0)then
k22(i)=0
kbcon(i)=0
ktop(i)=0
xmb(i)=0
do k=kts,ktf
outt(i,k)=0.
outq(i,k)=0.
outqc(i,k)=0.
enddo
else if(ierr(i).eq.0)then
!
! got the mass flux, sanity check, first for heating rates
!
trash=0.
! kmaxx=0
do k=2,ktop(i)
trash=max(trash,86400.*(dsubt(i,k)+dellat(i,k))*xmb(i))
enddo
if(trash.gt.100.)then
xmb(i)=xmb(i)*100./trash
endif
trash=0.
do k=2,ktop(i)
trash=min(trash,86400.*(dsubt(i,k)+dellat(i,k))*xmb(i))
enddo
if(trash.lt.-100.)then
xmb(i)=-xmb(i)*100./trash
endif
!
! sanity check on moisture tendencies: do not allow anything that may allow neg
! tendencies
!
do k=2,ktop(i)
trash=q(i,k)+(dsubq(i,k)+dellaq(i,k))*xmb(i)*dtime
if(trash.lt.1.e-12)then
! max allowable tendency over tendency that would lead to too small mix ratios
!
trash=(1.e-12 -q(i,k))/((dsubq(i,k)+dellaq(i,k))*dtime)
xmb(i)=(1.e-12 -q(i,k))/((dsubq(i,k)+dellaq(i,k))*dtime)
endif
enddo
xmb_out(i)=xmb(i)
!
! final tendencies
!
do k=2,ktop(i)
outt(i,k)=(dsubt(i,k)+dellat(i,k))*xmb(i)
outq(i,k)=(dsubq(i,k)+dellaq(i,k))*xmb(i)
enddo
endif
enddo
!
! done shallow
!--------------------------done------------------------------
!
END SUBROUTINE CUP_gf_sh
END MODULE module_cu_gf