/wrfv2_fire/phys/module_cu_bmj.F
FORTRAN Legacy | 2151 lines | 1171 code | 20 blank | 960 comment | 0 complexity | 684e203bda51d1281539c4c7c149847f MD5 | raw file
Possible License(s): AGPL-1.0
Large files files are truncated, but you can click here to view the full file
- !-----------------------------------------------------------------------
- !
- !WRF:MODEL_LAYER:PHYSICS
- !
- !-----------------------------------------------------------------------
- !
- MODULE MODULE_CU_BMJ
- !
- !-----------------------------------------------------------------------
- USE MODULE_MODEL_CONSTANTS
- !-----------------------------------------------------------------------
- !
- REAL,PARAMETER :: &
- & DSPC=-3000. &
- & ,DTTOP=0.,EFIFC=5.0,EFIMN=0.20,EFMNT=0.70 &
- & ,ELIWV=2.683E6,ENPLO=20000.,ENPUP=15000. &
- & ,EPSDN=1.05,EPSDT=0. &
- & ,EPSNTP=.0001,EPSNTT=.0001,EPSPR=1.E-7 &
- & ,EPSUP=1.00 &
- & ,FR=1.00,FSL=0.85,FSS=0.85 &
- & ,FUP=0. &
- & ,PBM=13000.,PFRZ=15000.,PNO=1000. &
- & ,PONE=2500.,PQM=20000. &
- & ,PSH=20000.,PSHU=45000. &
- & ,RENDP=1./(ENPLO-ENPUP) &
- & ,RHLSC=0.00,RHHSC=1.10 &
- & ,ROW=1.E3 &
- & ,STABDF=0.90,STABDS=0.90 &
- & ,STABS=1.0,STRESH=1.10 &
- & ,DTSHAL=-1.0,TREL=2400.
- !
- REAL,PARAMETER :: DTtrigr=-0.0 &
- ,DTPtrigr=DTtrigr*PONE !<-- Average parcel virtual temperature deficit over depth PONE.
- !<-- NOTE: CAPEtrigr is scaled by the cloud base temperature (see below)
- !
- REAL,PARAMETER :: DSPBFL=-3875.*FR &
- & ,DSP0FL=-5875.*FR &
- & ,DSPTFL=-1875.*FR &
- & ,DSPBFS=-3875. &
- & ,DSP0FS=-5875. &
- & ,DSPTFS=-1875.
- !
- REAL,PARAMETER :: PL=2500.,PLQ=70000.,PH=105000. &
- & ,THL=210.,THH=365.,THHQ=325.
- !
- INTEGER,PARAMETER :: ITB=76,JTB=134,ITBQ=152,JTBQ=440
- !
- INTEGER,PARAMETER :: ITREFI_MAX=3
- !
- !*** ARRAYS FOR LOOKUP TABLES
- !
- REAL,DIMENSION(ITB),PRIVATE,SAVE :: STHE,THE0
- REAL,DIMENSION(JTB),PRIVATE,SAVE :: QS0,SQS
- REAL,DIMENSION(ITBQ),PRIVATE,SAVE :: STHEQ,THE0Q
- REAL,DIMENSION(ITB,JTB),PRIVATE,SAVE :: PTBL
- REAL,DIMENSION(JTB,ITB),PRIVATE,SAVE :: TTBL
- REAL,DIMENSION(JTBQ,ITBQ),PRIVATE,SAVE :: TTBLQ
- !*** SHARE COPIES FOR MODULE_BL_MYJPBL
- !
- REAL,DIMENSION(JTB) :: QS0_EXP,SQS_EXP
- REAL,DIMENSION(ITB,JTB) :: PTBL_EXP
- !
- REAL,PARAMETER :: RDP=(ITB-1.)/(PH-PL),RDPQ=(ITBQ-1.)/(PH-PLQ) &
- & ,RDQ=ITB-1,RDTH=(JTB-1.)/(THH-THL) &
- & ,RDTHE=JTB-1.,RDTHEQ=JTBQ-1. &
- & ,RSFCP=1./101300.
- !
- REAL,PARAMETER :: AVGEFI=(EFIMN+1.)*0.5
- !
- !-----------------------------------------------------------------------
- !
- CONTAINS
- !
- !-----------------------------------------------------------------------
- SUBROUTINE BMJDRV( &
- & IDS,IDE,JDS,JDE,KDS,KDE &
- & ,IMS,IME,JMS,JME,KMS,KME &
- & ,ITS,ITE,JTS,JTE,KTS,KTE &
- & ,DT,ITIMESTEP,STEPCU &
- & ,CUDT, CURR_SECS, ADAPT_STEP_FLAG &
- & ,CUDTACTTIME &
- & ,RAINCV,PRATEC,CUTOP,CUBOT,KPBL &
- & ,TH,T,QV &
- & ,PINT,PMID,PI,RHO,DZ8W &
- & ,CP,R,ELWV,ELIV,G,TFRZ,D608 &
- & ,CLDEFI,LOWLYR,XLAND,CU_ACT_FLAG &
- ! optional
- & ,RTHCUTEN, RQVCUTEN &
- & )
- !-----------------------------------------------------------------------
- IMPLICIT NONE
- !-----------------------------------------------------------------------
- INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE &
- & ,IMS,IME,JMS,JME,KMS,KME &
- & ,ITS,ITE,JTS,JTE,KTS,KTE
- !
- INTEGER,INTENT(IN) :: ITIMESTEP,STEPCU
- !
- INTEGER,DIMENSION(IMS:IME,JMS:JME),INTENT(IN) :: KPBL,LOWLYR
- !
- REAL,INTENT(IN) :: CP,DT,ELIV,ELWV,G,R,TFRZ,D608
- !
- REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(IN) :: XLAND
- !
- REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(IN) :: DZ8W &
- & ,PI,PINT &
- & ,PMID,QV &
- & ,RHO,T,TH
- !
- REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME) &
- & ,OPTIONAL &
- & ,INTENT(INOUT) :: RQVCUTEN,RTHCUTEN
- !
- REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(INOUT) :: CLDEFI,RAINCV, &
- PRATEC
- !
- REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(OUT) :: CUBOT,CUTOP
- !
- LOGICAL,DIMENSION(IMS:IME,JMS:JME),INTENT(INOUT) :: CU_ACT_FLAG
- ! Adaptive time-step variables
- REAL, INTENT(IN ) :: CUDT
- REAL, INTENT(IN ) :: CURR_SECS
- LOGICAL,OPTIONAL,INTENT(IN ) :: ADAPT_STEP_FLAG
- REAL, INTENT (INOUT) :: CUDTACTTIME
- !
- !-----------------------------------------------------------------------
- !***
- !*** LOCAL VARIABLES
- !***
- !-----------------------------------------------------------------------
- INTEGER :: LBOT,LPBL,LTOP
- !
- REAL :: DTCNVC,LANDMASK,PCPCOL,PSFC,PTOP
- !
- REAL,DIMENSION(KTS:KTE) :: DPCOL,DQDT,DTDT,PCOL,QCOL,TCOL
- !
- INTEGER :: I,J,K,KFLIP,LMH
- LOGICAL :: run_param , doing_adapt_dt , decided
- !
- !*** Begin debugging convection
- REAL :: DELQ,DELT,PLYR
- INTEGER :: IMD,JMD
- LOGICAL :: PRINT_DIAG
- !*** End debugging convection
- !
- !-----------------------------------------------------------------------
- !***********************************************************************
- !-----------------------------------------------------------------------
- !
- !*** PREPARE TO CALL BMJ CONVECTION SCHEME
- !
- !-----------------------------------------------------------------------
- !
- !*** CHECK TO SEE IF THIS IS A CONVECTION TIMESTEP
- !
- ! Initialization for adaptive time step.
- doing_adapt_dt = .FALSE.
- IF ( PRESENT(adapt_step_flag) ) THEN
- IF ( adapt_step_flag ) THEN
- doing_adapt_dt = .TRUE.
- IF ( cudtacttime .EQ. 0. ) THEN
- cudtacttime = curr_secs + cudt*60.
- END IF
- END IF
- END IF
- ! Do we run through this scheme or not?
- ! Test 1: If this is the initial model time, then yes.
- ! ITIMESTEP=1
- ! Test 2: If the user asked for the cumulus to be run every time step, then yes.
- ! CUDT=0 or STEPCU=1
- ! Test 3: If not adaptive dt, and this is on the requested cumulus frequency, then yes.
- ! MOD(ITIMESTEP,STEPCU)=0
- ! Test 4: If using adaptive dt and the current time is past the last requested activate cumulus time, then yes.
- ! CURR_SECS >= CUDTACTTIME
- ! If we do run through the scheme, we set the flag run_param to TRUE and we set the decided flag
- ! to TRUE. The decided flag says that one of these tests was able to say "yes", run the scheme.
- ! We only proceed to other tests if the previous tests all have left decided as FALSE.
- ! If we set run_param to TRUE and this is adaptive time stepping, we set the time to the next
- ! cumulus run.
- decided = .FALSE.
- run_param = .FALSE.
- IF ( ( .NOT. decided ) .AND. &
- ( itimestep .EQ. 1 ) ) THEN
- run_param = .TRUE.
- decided = .TRUE.
- END IF
- IF ( ( .NOT. decided ) .AND. &
- ( ( cudt .EQ. 0. ) .OR. ( stepcu .EQ. 1 ) ) ) THEN
- run_param = .TRUE.
- decided = .TRUE.
- END IF
- IF ( ( .NOT. decided ) .AND. &
- ( .NOT. doing_adapt_dt ) .AND. &
- ( MOD(itimestep,stepcu) .EQ. 0 ) ) THEN
- run_param = .TRUE.
- decided = .TRUE.
- END IF
- IF ( ( .NOT. decided ) .AND. &
- ( doing_adapt_dt ) .AND. &
- ( curr_secs .GE. cudtacttime ) ) THEN
- run_param = .TRUE.
- decided = .TRUE.
- cudtacttime = curr_secs + cudt*60
- END IF
- !-----------------------------------------------------------------------
- !
- !*** COMPUTE CONVECTION EVERY STEPCU*DT/60.0 MINUTES
- !
- !*** Begin debugging convection
- IMD=(IMS+IME)/2
- JMD=(JMS+JME)/2
- PRINT_DIAG=.FALSE.
- !*** End debugging convection
- IF(run_param)THEN
- !
- DO J=JTS,JTE
- DO I=ITS,ITE
- CU_ACT_FLAG(I,J)=.TRUE.
- ENDDO
- ENDDO
- !
- DTCNVC=DT*STEPCU
- !
- DO J=JTS,JTE
- DO I=ITS,ITE
- !
- DO K=KTS,KTE
- DQDT(K)=0.
- DTDT(K)=0.
- ENDDO
- !
- RAINCV(I,J)=0.
- PRATEC(I,J)=0.
- PCPCOL=0.
- PSFC=PINT(I,LOWLYR(I,J),J)
- PTOP=PINT(I,KTE+1,J) ! KTE+1=KME
- !
- !*** CONVERT TO BMJ LAND MASK (1.0 FOR SEA; 0.0 FOR LAND)
- !
- LANDMASK=XLAND(I,J)-1.
- !
- !*** FILL 1-D VERTICAL ARRAYS
- !*** AND FLIP DIRECTION SINCE BMJ SCHEME
- !*** COUNTS DOWNWARD FROM THE DOMAIN'S TOP
- !
- DO K=KTS,KTE
- KFLIP=KTE+1-K
- !
- !*** CONVERT FROM MIXING RATIO TO SPECIFIC HUMIDITY
- !
- QCOL(K)=MAX(EPSQ,QV(I,KFLIP,J)/(1.+QV(I,KFLIP,J)))
- TCOL(K)=T(I,KFLIP,J)
- PCOL(K)=PMID(I,KFLIP,J)
- ! DPCOL(K)=PINT(I,KFLIP,J)-PINT(I,KFLIP+1,J)
- DPCOL(K)=RHO(I,KFLIP,J)*G*DZ8W(I,KFLIP,J)
- ENDDO
- !
- !*** LOWEST LAYER ABOVE GROUND MUST ALSO BE FLIPPED
- !
- LMH=KTE+1-LOWLYR(I,J)
- LPBL=KTE+1-KPBL(I,J)
- !-----------------------------------------------------------------------
- !***
- !*** CALL CONVECTION
- !***
- !-----------------------------------------------------------------------
- !*** Begin debugging convection
- ! PRINT_DIAG=.FALSE.
- ! IF(I==IMD.AND.J==JMD)PRINT_DIAG=.TRUE.
- !*** End debugging convection
- !-----------------------------------------------------------------------
- CALL BMJ(ITIMESTEP,I,J,DTCNVC,LMH,LANDMASK,CLDEFI(I,J) &
- & ,DPCOL,PCOL,QCOL,TCOL,PSFC,PTOP &
- & ,DQDT,DTDT,PCPCOL,LBOT,LTOP,LPBL &
- & ,CP,R,ELWV,ELIV,G,TFRZ,D608 &
- & ,PRINT_DIAG &
- & ,IDS,IDE,JDS,JDE,KDS,KDE &
- & ,IMS,IME,JMS,JME,KMS,KME &
- & ,ITS,ITE,JTS,JTE,KTS,KTE)
- !-----------------------------------------------------------------------
- !
- !*** COMPUTE HEATING AND MOISTENING TENDENCIES
- !
- IF ( PRESENT( RTHCUTEN ) .AND. PRESENT( RQVCUTEN )) THEN
- DO K=KTS,KTE
- KFLIP=KTE+1-K
- RTHCUTEN(I,K,J)=DTDT(KFLIP)/PI(I,K,J)
- !
- !*** CONVERT FROM SPECIFIC HUMIDTY BACK TO MIXING RATIO
- !
- RQVCUTEN(I,K,J)=DQDT(KFLIP)/(1.-QCOL(KFLIP))**2
- ENDDO
- ENDIF
- !
- !*** ALL UNITS IN BMJ SCHEME ARE MKS, THUS CONVERT PRECIP FROM METERS
- !*** TO MILLIMETERS PER STEP FOR OUTPUT.
- !
- RAINCV(I,J)=PCPCOL*1.E3/STEPCU
- PRATEC(I,J)=PCPCOL*1.E3/(STEPCU * DT)
- !
- !*** CONVECTIVE CLOUD TOP AND BOTTOM FROM THIS CALL
- !
- CUTOP(I,J)=REAL(KTE+1-LTOP)
- CUBOT(I,J)=REAL(KTE+1-LBOT)
- !
- !-----------------------------------------------------------------------
- !*** Begin debugging convection
- IF(PRINT_DIAG)THEN
- DELT=0.
- DELQ=0.
- PLYR=0.
- IF(LBOT>0.AND.LTOP<LBOT)THEN
- DO K=LTOP,LBOT
- PLYR=PLYR+DPCOL(K)
- DELQ=DELQ+DPCOL(K)*DTCNVC*ABS(DQDT(K))
- DELT=DELT+DPCOL(K)*DTCNVC*ABS(DTDT(K))
- ENDDO
- DELQ=DELQ/PLYR
- DELT=DELT/PLYR
- ENDIF
- !
- WRITE(6,"(2a,2i4,3e12.4,f7.2,4i3)") &
- '{cu3 i,j,PCPCOL,DTavg,DQavg,PLYR,' &
- ,'LBOT,LTOP,CUBOT,CUTOP = ' &
- ,i,j, PCPCOL,DELT,1000.*DELQ,.01*PLYR &
- ,LBOT,LTOP,NINT(CUBOT(I,J)),NINT(CUTOP(I,J))
- !
- IF(PLYR> 0.)THEN
- DO K=LBOT,LTOP,-1
- KFLIP=KTE+1-K
- WRITE(6,"(a,i3,2e12.4,f7.2)") '{cu3a KFLIP,DT,DQ,DP = ' &
- ,KFLIP,DTCNVC*DTDT(K),1000.*DTCNVC*DQDT(K),.01*DPCOL(K)
- ENDDO
- ENDIF
- ENDIF
- !*** End debugging convection
- !-----------------------------------------------------------------------
- !
- ENDDO
- ENDDO
- !
- ENDIF
- !
- END SUBROUTINE BMJDRV
- !-----------------------------------------------------------------------
- !XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
- !-----------------------------------------------------------------------
- SUBROUTINE BMJ &
- !-----------------------------------------------------------------------
- & (ITIMESTEP,I,J,DTCNVC,LMH,SM,CLDEFI &
- & ,DPRS,PRSMID,Q,T,PSFC,PT &
- & ,DQDT,DTDT,PCPCOL,LBOT,LTOP,LPBL &
- & ,CP,R,ELWV,ELIV,G,TFRZ,D608 &
- & ,PRINT_DIAG &
- & ,IDS,IDE,JDS,JDE,KDS,KDE &
- & ,IMS,IME,JMS,JME,KMS,KME &
- & ,ITS,ITE,JTS,JTE,KTS,KTE)
- !-----------------------------------------------------------------------
- IMPLICIT NONE
- !-----------------------------------------------------------------------
- INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE &
- ,IMS,IME,JMS,JME,KMS,KME &
- ,ITS,ITE,JTS,JTE,KTS,KTE &
- ,I,J,ITIMESTEP
- !
- INTEGER,INTENT(IN) :: LMH,LPBL
- !
- INTEGER,INTENT(OUT) :: LBOT,LTOP
- !
- REAL,INTENT(IN) :: CP,D608,DTCNVC,ELIV,ELWV,G,PSFC,PT,R,SM,TFRZ
- !
- REAL,DIMENSION(KTS:KTE),INTENT(IN) :: DPRS,PRSMID,Q,T
- !
- REAL,INTENT(INOUT) :: CLDEFI,PCPCOL
- !
- REAL,DIMENSION(KTS:KTE),INTENT(INOUT) :: DQDT,DTDT
- !
- !-----------------------------------------------------------------------
- !*** DEFINE LOCAL VARIABLES
- !-----------------------------------------------------------------------
- !
- REAL,DIMENSION(KTS:KTE) :: APEK,APESK,EL,FPK &
- ,PK,PSK,QK,QREFK,QSATK &
- ,THERK,THEVRF,THSK &
- ,THVMOD,THVREF,TK,TREFK
- REAL,DIMENSION(KTS:KTE) :: APE,DIFQ,DIFT,THEE,THES,TREF
- !
- REAL,DIMENSION(KTS:KTE) :: CPE,CPEcnv,DTV,DTVcnv,THEScnv !<-- CPE for shallow convection buoyancy check (24 Aug 2006)
- !
- LOGICAL :: DEEP,SHALLOW
- !
- !*** Begin debugging convection
- LOGICAL :: PRINT_DIAG
- !*** End debugging convection
- !
- !-----------------------------------------------------------------------
- !***
- !*** LOCAL SCALARS
- !***
- !-----------------------------------------------------------------------
- REAL :: APEKL,APEKXX,APEKXY,APES,APESTS &
- & ,AVRGT,AVRGTL,BQ,BQK,BQS00K,BQS10K &
- & ,CAPA,CUP,DEN,DENTPY,DEPMIN,DEPTH &
- & ,DEPWL,DHDT,DIFQL,DIFTL,DP,DPKL,DPLO,DPMIX,DPOT &
- & ,DPUP,DQREF,DRHDP,DRHEAT,DSP &
- & ,DSP0,DSP0K,DSPB,DSPBK,DSPT,DSPTK &
- & ,DSQ,DST,DSTQ,DTHEM,DTDP,EFI &
- & ,FEFI,FFUP,FPRS,FPTK,HCORR &
- & ,OTSUM,P,P00K,P01K,P10K,P11K &
- & ,PART1,PART2,PART3,PBOT,PBOTFC,PBTK &
- & ,PK0,PKB,PKL,PKT,PKXXXX,PKXXXY &
- & ,PLMH,PELEVFC,PBTmx,plo,POTSUM,PP1,PPK,PRECK &
- & ,PRESK,PSP,PSUM,PTHRS,PTOP,PTPK,PUP &
- & ,QBT,QKL,QNEW,QOTSUM,QQ1,QQK,QRFKL &
- & ,QRFTP,QSP,QSUM,QUP,RDP0T &
- & ,RDPSUM,RDTCNVC,RHH,RHL,RHMAX,ROTSUM,RTBAR,RHAVG &
- & ,SM1,SMIX,SQ,SQK,SQS00K,SQS10K,STABDL,SUMDE,SUMDP &
- & ,SUMDT,TAUK,TAUKSC,TCORR,THBT,THERKX,THERKY &
- & ,THESP,THSKL,THTPK,THVMKL,TKL,TNEW &
- & ,TQ,TQK,TREFKX,TRFKL,trmlo,trmup,TSKL,tsp,TTH &
- & ,TTHK,TUP &
- & ,CAPEcnv,PSPcnv,THBTcnv,CAPEtrigr,CAPE &
- & ,TLEV2,QSAT1,QSAT2,RHSHmax
- !
- INTEGER :: IQ,IQTB,IT,ITER,ITREFI,ITTB,ITTBK,KB,KNUMH,KNUML &
- & ,L,L0,L0M1,LB,LBM1,LCOR,LPT1 &
- & ,LQM,LSHU,LTP1,LTP2,LTSH, LBOTcnv,LTOPcnv,LMID
- !-----------------------------------------------------------------------
- !
- REAL,PARAMETER :: DSPBSL=DSPBFL*FSL,DSP0SL=DSP0FL*FSL &
- & ,DSPTSL=DSPTFL*FSL &
- & ,DSPBSS=DSPBFS*FSS,DSP0SS=DSP0FS*FSS &
- & ,DSPTSS=DSPTFS*FSS
- !
- REAL,PARAMETER :: ELEVFC=0.6,STEFI=1.
- !
- REAL,PARAMETER :: SLOPBL=(DSPBFL-DSPBSL)/(1.-EFIMN) &
- & ,SLOP0L=(DSP0FL-DSP0SL)/(1.-EFIMN) &
- & ,SLOPTL=(DSPTFL-DSPTSL)/(1.-EFIMN) &
- & ,SLOPBS=(DSPBFS-DSPBSS)/(1.-EFIMN) &
- & ,SLOP0S=(DSP0FS-DSP0SS)/(1.-EFIMN) &
- & ,SLOPTS=(DSPTFS-DSPTSS)/(1.-EFIMN) &
- & ,SLOPST=(STABDF-STABDS)/(1.-EFIMN) &
- & ,SLOPE=(1.-EFMNT)/(1.-EFIMN)
- !
- REAL :: A23M4L,CPRLG,ELOCP,RCP,QWAT
- !-----------------------------------------------------------------------
- !***********************************************************************
- !-----------------------------------------------------------------------
- CAPA=R/CP
- CPRLG=CP/(ROW*G*ELWV)
- ELOCP=ELIWV/CP
- RCP=1./CP
- A23M4L=A2*(A3-A4)*ELWV
- RDTCNVC=1./DTCNVC
- DEPMIN=PSH*PSFC*RSFCP
- !
- DEEP=.FALSE.
- SHALLOW=.FALSE.
- !
- DSP0=0.
- DSPB=0.
- DSPT=0.
- !-----------------------------------------------------------------------
- TAUK=DTCNVC/TREL
- TAUKSC=DTCNVC/(1.0*TREL)
- !-----------------------------------------------------------------------
- !-----------------------------PREPARATIONS------------------------------
- !-----------------------------------------------------------------------
- LBOT=LMH
- PCPCOL=0.
- TREF(KTS)=T(KTS)
- !
- DO L=KTS,LMH
- APESTS=PRSMID(L)
- APE(L)=(1.E5/APESTS)**CAPA
- CPEcnv(L)=0.
- DTVcnv(L)=0.
- THEScnv(L)=0.
- ENDDO
- !
- !-----------------------------------------------------------------------
- !----------------SEARCH FOR MAXIMUM BUOYANCY LEVEL----------------------
- !-----------------------------------------------------------------------
- !
- PLMH=PRSMID(LMH)
- PELEVFC=PLMH*ELEVFC
- PBTmx=PRSMID(LMH)-PONE
- CAPEcnv=0.
- PSPcnv=0.
- THBTcnv=0.
- LBOTcnv=LBOT
- LTOPcnv=LBOT
- !
- !-----------------------------------------------------------------------
- !----------------TRIAL MAXIMUM BUOYANCY LEVEL VARIABLES-----------------
- !-----------------------------------------------------------------------
- !
- max_buoy_loop: DO KB=LMH,1,-1
- !
- !-----------------------------------------------------------------------
- !
- PKL=PRSMID(KB)
- ! IF (PKL<PELEVFC .OR. T(KB)<=TFRZ) EXIT
- IF (PKL<PELEVFC) EXIT
- LBOT=LMH
- LTOP=LMH
- !
- !-----------------------------------------------------------------------
- !*** SEARCH OVER A SCALED DEPTH IN FINDING THE PARCEL
- !*** WITH THE MAX THETA-E
- !-----------------------------------------------------------------------
- !
- QBT=Q(KB)
- THBT=T(KB)*APE(KB)
- TTH=(THBT-THL)*RDTH
- QQ1=TTH-AINT(TTH)
- ITTB=INT(TTH)+1
- !----------------KEEPING INDICES WITHIN THE TABLE-----------------------
- IF(ITTB<1)THEN
- ITTB=1
- QQ1=0.
- ELSE IF(ITTB>=JTB)THEN
- ITTB=JTB-1
- QQ1=0.
- ENDIF
- !--------------BASE AND SCALING FACTOR FOR SPEC. HUMIDITY---------------
- ITTBK=ITTB
- BQS00K=QS0(ITTBK)
- SQS00K=SQS(ITTBK)
- BQS10K=QS0(ITTBK+1)
- SQS10K=SQS(ITTBK+1)
- !--------------SCALING SPEC. HUMIDITY & TABLE INDEX---------------------
- BQ=(BQS10K-BQS00K)*QQ1+BQS00K
- SQ=(SQS10K-SQS00K)*QQ1+SQS00K
- TQ=(QBT-BQ)/SQ*RDQ
- PP1=TQ-AINT(TQ)
- IQTB=INT(TQ)+1
- !----------------KEEPING INDICES WITHIN THE TABLE-----------------------
- IF(IQTB<1)THEN
- IQTB=1
- PP1=0.
- ELSE IF(IQTB>=ITB)THEN
- IQTB=ITB-1
- PP1=0.
- ENDIF
- !--------------SATURATION PRESSURE AT FOUR SURROUNDING TABLE PTS.-------
- IQ=IQTB
- IT=ITTB
- P00K=PTBL(IQ ,IT )
- P10K=PTBL(IQ+1,IT )
- P01K=PTBL(IQ ,IT+1)
- P11K=PTBL(IQ+1,IT+1)
- !
- !--------------SATURATION POINT VARIABLES AT THE BOTTOM-----------------
- !
- PSP=P00K+(P10K-P00K)*PP1+(P01K-P00K)*QQ1 &
- & +(P00K-P10K-P01K+P11K)*PP1*QQ1
- APES=(1.E5/PSP)**CAPA
- THESP=THBT*EXP(ELOCP*QBT*APES/THBT)
- !
- !-----------------------------------------------------------------------
- !-----------CHOOSE CLOUD BASE AS MODEL LEVEL JUST BELOW PSP-------------
- !-----------------------------------------------------------------------
- !
- DO L=KTS,LMH-1
- P=PRSMID(L)
- IF(P<PSP.AND.P>=PQM)LBOT=L+1
- ENDDO
- !***
- !*** WARNING: LBOT MUST NOT BE > LMH-1 IN SHALLOW CONVECTION
- !*** MAKE SURE CLOUD BASE IS AT LEAST PONE ABOVE THE SURFACE
- !***
- PBOT=PRSMID(LBOT)
- IF(PBOT>=PBTmx.OR.LBOT>=LMH)THEN
- DO L=KTS,LMH-1
- P=PRSMID(L)
- IF(P<PBTmx)LBOT=L
- ENDDO
- PBOT=PRSMID(LBOT)
- ENDIF
- !
- !-----------------------------------------------------------------------
- !----------------CLOUD TOP COMPUTATION----------------------------------
- !-----------------------------------------------------------------------
- !
- LTOP=LBOT
- PTOP=PBOT
- DO L=LMH,KTS,-1
- THES(L)=THESP
- ENDDO
- !
- !-----------------------------------------------------------------------
- !### BEGIN: ########### WARNING ########### WARNING ###########
- !-----------------------------------------------------------------------
- !
- !### IMPORTANT: THIS "DO KB=LMH,1,-1" loop must be broken up into two
- ! separate loops in order for entrainment as programmed below to work
- ! properly.
- !
- !--------------- ENTRAINMENT DURING PARCEL ASCENT --------------------
- !
- ! DO L=LMH,KB,-1
- ! THES(L)=THESP
- ! ENDDO
- !
- ! DO L=KTS,LMH
- ! THEE(L)=THES(L)
- ! ENDDO
- !!
- ! FEFI=(CLDEFI-EFIMN)*SLOPE+EFMNT
- ! FFUP=FUP/(FEFI*FEFI)
- !!
- ! IF(PBOT>ENPLO)THEN
- ! FPRS=1.
- ! ELSEIF(PBOT>ENPUP)THEN
- ! FPRS=(PBOT-ENPUP)*RENDP
- ! ELSE
- ! FPRS=0.
- ! ENDIF
- !!
- ! FFUP=FFUP*FPRS*FPRS*0.5
- ! DPUP=DPRS(KB)
- !!
- ! DO L=KB-1,KTS,-1
- ! DPLO=DPUP
- ! DPUP=DPRS(L)
- !!
- ! THES(L)=((-FFUP*DPLO+1.)*THES(L+1) &
- ! & +(THEE(L)*DPUP+THEE(L+1)*DPLO)*FFUP) &
- ! & /(FFUP*DPUP+1.)
- ! ENDDO
- !
- !-----------------------------------------------------------------------
- !### END: ########### WARNING ########### WARNING ###########
- !-----------------------------------------------------------------------
- !!
- !-----------------------------------------------------------------------
- !!*** COMPUTE PARCEL TEMPERATURE ALONG THE ASCENT TRAJECTORY
- !!*** SCALING PRESSURE & TT TABLE INDEX.
- !-----------------------------------------------------------------------
- !!
- !!
- ! DO L=LMH,KTS,-1
- !!
- ! PRESK=PRSMID(L)
- !!
- ! IF(PRESK<PLQ)THEN
- ! CALL TTBLEX(ITB,JTB,PL,PRESK,RDP,RDTHE &
- ! & ,STHE,THE0,THES(L),TTBL,TREF(L))
- ! ELSE
- ! CALL TTBLEX(ITBQ,JTBQ,PLQ,PRESK,RDPQ,RDTHEQ &
- ! & ,STHEQ,THE0Q,THES(L),TTBLQ,TREF(L))
- ! ENDIF
- !!
- ! ENDDO
- !!
- !!-----------------------------------------------------------------------
- !!----------------BUOYANCY CHECK-----------------------------------------
- !!-----------------------------------------------------------------------
- !!
- ! DO L=LMH,KTS,-1
- ! IF(TREF(L)>T(L)-DTTOP)LTOP=L
- ! ENDDO
- !!
- !!*** CLOUD TOP PRESSURE
- !!
- ! PTOP=PRSMID(LTOP)
- !
- !------------------FIRST ENTROPY CHECK----------------------------------
- !
- DO L=KTS,LMH
- CPE(L)=0.
- DTV(L)=0.
- ENDDO
- !-----------------------------------------------------------------------
- ! lbot_ltop: IF(LBOT>LTOP)THEN
- !-----------------------------------------------------------------------
- !-- Begin: Buoyancy check including deep convection (24 Aug 2006)
- !-----------------------------------------------------------------------
- DENTPY=0.
- L=KB
- PLO=PRSMID(L)
- TRMLO=0.
- CAPEtrigr=DTPtrigr/T(LBOT)
- !
- !--- Below cloud base
- !
- IF(KB>LBOT) THEN
- DO L=KB-1,LBOT+1,-1
- PUP=PRSMID(L)
- TUP=THBT/APE(L)
- DP=PLO-PUP
- TRMUP=(TUP*(QBT*0.608+1.) &
- & -T(L)*(Q(L)*0.608+1.))*0.5 &
- & /(T(L)*(Q(L)*0.608+1.))
- DTV(L)=TRMLO+TRMUP
- DENTPY=DTV(L)*DP+DENTPY
- CPE(L)=DENTPY
- IF (DENTPY < CAPEtrigr) GO TO 170
- PLO=PUP
- TRMLO=TRMUP
- ENDDO
- ELSE
- L=LBOT+1
- PLO=PRSMID(L)
- TUP=THBT/APE(L)
- TRMLO=(TUP*(QBT*0.608+1.) &
- & -T(L)*(Q(L)*0.608+1.))*0.5 &
- & /(T(L)*(Q(L)*0.608+1.))
- ENDIF ! IF(KB>LBOT) THEN
- !
- !--- At cloud base
- !
- L=LBOT
- PUP=PSP
- TUP=THBT/APES
- TSP=(T(L+1)-T(L))/(PLO-PBOT) &
- & *(PUP-PBOT)+T(L)
- QSP=(Q(L+1)-Q(L))/(PLO-PBOT) &
- & *(PUP-PBOT)+Q(L)
- DP=PLO-PUP
- TRMUP=(TUP*(QBT*0.608+1.) &
- & -TSP*(QSP*0.608+1.))*0.5 &
- & /(TSP*(QSP*0.608+1.))
- DTV(L)=TRMLO+TRMUP
- DENTPY=DTV(L)*DP+DENTPY
- CPE(L)=DENTPY
- DTV(L)=DTV(L)*DP
- PLO=PUP
- TRMLO=TRMUP
- PUP=PRSMID(L)
- !
- !--- Calculate updraft temperature along moist adiabat (TUP)
- !
- IF(PUP<PLQ)THEN
- CALL TTBLEX(ITB,JTB,PL,PUP,RDP,RDTHE &
- & ,STHE,THE0,THES(L),TTBL,TUP)
- ELSE
- CALL TTBLEX(ITBQ,JTBQ,PLQ,PUP,RDPQ,RDTHEQ &
- & ,STHEQ,THE0Q,THES(L),TTBLQ,TUP)
- ENDIF
- !
- QUP=PQ0/PUP*EXP(A2*(TUP-A3)/(TUP-A4))
- QWAT=QBT-QUP !-- Water loading effects, reversible adiabat
- DP=PLO-PUP
- TRMUP=(TUP*(QUP*0.608+1.-QWAT) &
- & -T(L)*(Q(L)*0.608+1.))*0.5 &
- & /(T(L)*(Q(L)*0.608+1.))
- DENTPY=(TRMLO+TRMUP)*DP+DENTPY
- CPE(L)=DENTPY
- DTV(L)=(DTV(L)+(TRMLO+TRMUP)*DP)/(PRSMID(LBOT+1)-PRSMID(LBOT))
- !
- IF (DENTPY < CAPEtrigr) GO TO 170
- !
- PLO=PUP
- TRMLO=TRMUP
- !
- !-----------------------------------------------------------------------
- !--- In cloud above cloud base
- !-----------------------------------------------------------------------
- !
- DO L=LBOT-1,KTS,-1
- PUP=PRSMID(L)
- !
- !--- Calculate updraft temperature along moist adiabat (TUP)
- !
- IF(PUP<PLQ)THEN
- CALL TTBLEX(ITB,JTB,PL,PUP,RDP,RDTHE &
- & ,STHE,THE0,THES(L),TTBL,TUP)
- ELSE
- CALL TTBLEX(ITBQ,JTBQ,PLQ,PUP,RDPQ,RDTHEQ &
- & ,STHEQ,THE0Q,THES(L),TTBLQ,TUP)
- ENDIF
- !
- QUP=PQ0/PUP*EXP(A2*(TUP-A3)/(TUP-A4))
- QWAT=QBT-QUP !-- Water loading effects, reversible adiabat
- DP=PLO-PUP
- TRMUP=(TUP*(QUP*0.608+1.-QWAT) &
- & -T(L)*(Q(L)*0.608+1.))*0.5 &
- & /(T(L)*(Q(L)*0.608+1.))
- DTV(L)=TRMLO+TRMUP
- DENTPY=DTV(L)*DP+DENTPY
- CPE(L)=DENTPY
- !
- IF (DENTPY < CAPEtrigr) GO TO 170
- !
- PLO=PUP
- TRMLO=TRMUP
- ENDDO
- !
- !-----------------------------------------------------------------------
- !
- 170 LTP1=KB
- CAPE=0.
- !
- !-----------------------------------------------------------------------
- !--- Cloud top level (LTOP) is located where CAPE is a maximum
- !--- Exit cloud-top search if CAPE < CAPEtrigr
- !-----------------------------------------------------------------------
- !
- DO L=KB,KTS,-1
- IF (CPE(L) < CAPEtrigr) THEN
- EXIT
- ELSE IF (CPE(L) > CAPE) THEN
- LTP1=L
- CAPE=CPE(L)
- ENDIF
- ENDDO !-- End DO L=KB,KTS,-1
- !
- LTOP=MIN(LTP1,LBOT)
- !
- !-----------------------------------------------------------------------
- !--------------- CHECK FOR MAXIMUM INSTABILITY ------------------------
- !-----------------------------------------------------------------------
- IF(CAPE > CAPEcnv) THEN
- CAPEcnv=CAPE
- PSPcnv=PSP
- THBTcnv=THBT
- LBOTcnv=LBOT
- LTOPcnv=LTOP
- DO L=LMH,KTS,-1
- CPEcnv(L)=CPE(L)
- DTVcnv(L)=DTV(L)
- THEScnv(L)=THES(L)
- ENDDO
- ENDIF ! End IF(CAPE > CAPEcnv) THEN
- !
- ! ENDIF lbot_ltop
- !
- !-----------------------------------------------------------------------
- !
- ENDDO max_buoy_loop
- !
- !-----------------------------------------------------------------------
- !------------------------ MAXIMUM INSTABILITY ------------------------
- !-----------------------------------------------------------------------
- !
- IF(CAPEcnv > 0.) THEN
- PSP=PSPcnv
- THBT=THBTcnv
- LBOT=LBOTcnv
- LTOP=LTOPcnv
- PBOT=PRSMID(LBOT)
- PTOP=PRSMID(LTOP)
- !
- DO L=LMH,KTS,-1
- CPE(L)=CPEcnv(L)
- DTV(L)=DTVcnv(L)
- THES(L)=THEScnv(L)
- ENDDO
- !
- ENDIF
- !
- !-----------------------------------------------------------------------
- !----- Quick exit if cloud is too thin or no CAPE is present ---------
- !-----------------------------------------------------------------------
- !
- IF(PTOP>PBOT-PNO.OR.LTOP>LBOT-2.OR.CAPEcnv<=0.)THEN
- LBOT=0
- LTOP=KTE
- PBOT=PRSMID(LMH)
- PTOP=PBOT
- CLDEFI=AVGEFI*SM+STEFI*(1.-SM)
- GO TO 800
- ENDIF
- !
- !*** DEPTH OF CLOUD REQUIRED TO MAKE THE POINT A DEEP CONVECTION POINT
- !*** IS A SCALED VALUE OF PSFC.
- !
- DEPTH=PBOT-PTOP
- !
- IF(DEPTH>=DEPMIN) THEN
- DEEP=.TRUE.
- ELSE
- SHALLOW=.TRUE.
- GO TO 600
- ENDIF
- !
- !-----------------------------------------------------------------------
- !DCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD
- !DCDCDCDCDCDCDCDCDCDCDC DEEP CONVECTION DCDCDCDCDCDCDCDCDCDCDCDCDCD
- !DCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD
- !-----------------------------------------------------------------------
- !
- 300 CONTINUE
- !
- LB =LBOT
- EFI=CLDEFI
- !-----------------------------------------------------------------------
- !--------------INITIALIZE VARIABLES IN THE CONVECTIVE COLUMN------------
- !-----------------------------------------------------------------------
- !***
- !*** ONE SHOULD NOTE THAT THE VALUES ASSIGNED TO THE ARRAY TREFK
- !*** IN THE FOLLOWING LOOP ARE REALLY ONLY RELEVANT IN ANCHORING THE
- !*** REFERENCE TEMPERATURE PROFILE AT LEVEL LB. WHEN BUILDING THE
- !*** REFERENCE PROFILE FROM CLOUD BASE, THEN ASSIGNING THE
- !*** AMBIENT TEMPERATURE TO TREFK IS ACCEPTABLE. HOWEVER, WHEN
- !*** BUILDING THE REFERENCE PROFILE FROM SOME OTHER LEVEL (SUCH AS
- !*** ONE LEVEL ABOVE THE GROUND), THEN TREFK SHOULD BE FILLED WITH
- !*** THE TEMPERATURES IN TREF(L) WHICH ARE THE TEMPERATURES OF
- !*** THE MOIST ADIABAT THROUGH CLOUD BASE. BY THE TIME THE LINE
- !*** NUMBERED 450 HAS BEEN REACHED, TREFK ACTUALLY DOES HOLD THE
- !*** REFERENCE TEMPERATURE PROFILE.
- !***
- DO L=KTS,LMH
- DIFT (L)=0.
- DIFQ (L)=0.
- TKL =T(L)
- TK (L)=TKL
- TREFK (L)=TKL
- QKL =Q(L)
- QK (L)=QKL
- QREFK (L)=QKL
- PKL =PRSMID(L)
- PK (L)=PKL
- PSK (L)=PKL
- APEKL =APE(L)
- APEK (L)=APEKL
- !
- !--- Calculate temperature along moist adiabat (TREF)
- !
- IF(PKL<PLQ)THEN
- CALL TTBLEX(ITB,JTB,PL,PKL,RDP,RDTHE &
- & ,STHE,THE0,THES(L),TTBL,TREF(L))
- ELSE
- CALL TTBLEX(ITBQ,JTBQ,PLQ,PKL,RDPQ,RDTHEQ &
- & ,STHEQ,THE0Q,THES(L),TTBLQ,TREF(L))
- ENDIF
- THERK (L)=TREF(L)*APEKL
- ENDDO
- !
- !------------DEEP CONVECTION REFERENCE TEMPERATURE PROFILE------------
- !
- LTP1=LTOP+1
- LBM1=LB-1
- PKB=PK(LB)
- PKT=PK(LTOP)
- STABDL=(EFI-EFIMN)*SLOPST+STABDS
- !
- !------------TEMPERATURE REFERENCE PROFILE BELOW FREEZING LEVEL-------
- !
- EL(LB) = ELWV
- L0=LB
- PK0=PK(LB)
- TREFKX=TREFK(LB)
- THERKX=THERK(LB)
- APEKXX=APEK(LB)
- THERKY=THERK(LBM1)
- APEKXY=APEK(LBM1)
- !
- DO L=LBM1,LTOP,-1
- IF(T(L+1)<TFRZ)GO TO 430
- TREFKX=((THERKY-THERKX)*STABDL &
- & +TREFKX*APEKXX)/APEKXY
- TREFK(L)=TREFKX
- EL(L)=ELWV
- APEKXX=APEKXY
- THERKX=THERKY
- APEKXY=APEK(L-1)
- THERKY=THERK(L-1)
- L0=L
- PK0=PK(L0)
- ENDDO
- !
- !--------------FREEZING LEVEL AT OR ABOVE THE CLOUD TOP-----------------
- !
- GO TO 450
- !
- !--------------TEMPERATURE REFERENCE PROFILE ABOVE FREEZING LEVEL-------
- !
- 430 L0M1=L0-1
- RDP0T=1./(PK0-PKT)
- DTHEM=THERK(L0)-TREFK(L0)*APEK(L0)
- !
- DO L=LTOP,L0M1
- TREFK(L)=(THERK(L)-(PK(L)-PKT)*DTHEM*RDP0T)/APEK(L)
- EL(L)=ELWV !ELIV
- ENDDO
- !
- !-----------------------------------------------------------------------
- !--------------DEEP CONVECTION REFERENCE HUMIDITY PROFILE---------------
- !-----------------------------------------------------------------------
- !
- !*** DEPWL IS THE PRESSURE DIFFERENCE BETWEEN CLOUD BASE AND
- !*** THE FREEZING LEVEL
- !
- 450 CONTINUE
- DEPWL=PKB-PK0
- DEPTH=PFRZ*PSFC*RSFCP
- SM1=1.-SM
- PBOTFC=1.
- !
- !-------------FIRST ADJUSTMENT OF TEMPERATURE PROFILE-------------------
- !!
- ! SUMDT=0.
- ! SUMDP=0.
- !!
- ! DO L=LTOP,LB
- ! SUMDT=(TK(L)-TREFK(L))*DPRS(L)+SUMDT
- ! SUMDP=SUMDP+DPRS(L)
- ! ENDDO
- !!
- ! TCORR=SUMDT/SUMDP
- !!
- ! DO L=LTOP,LB
- ! TREFK(L)=TREFK(L)+TCORR
- ! ENDDO
- !!
- !-----------------------------------------------------------------------
- !--------------- ITERATION LOOP FOR CLOUD EFFICIENCY -------------------
- !-----------------------------------------------------------------------
- !
- cloud_efficiency : DO ITREFI=1,ITREFI_MAX
- !
- !-----------------------------------------------------------------------
- DSPBK=((EFI-EFIMN)*SLOPBS+DSPBSS*PBOTFC)*SM &
- & +((EFI-EFIMN)*SLOPBL+DSPBSL*PBOTFC)*SM1
- DSP0K=((EFI-EFIMN)*SLOP0S+DSP0SS*PBOTFC)*SM &
- & +((EFI-EFIMN)*SLOP0L+DSP0SL*PBOTFC)*SM1
- DSPTK=((EFI-EFIMN)*SLOPTS+DSPTSS*PBOTFC)*SM &
- & +((EFI-EFIMN)*SLOPTL+DSPTSL*PBOTFC)*SM1
- !
- !-----------------------------------------------------------------------
- !
- DO L=LTOP,LB
- !
- !***
- !*** SATURATION PRESSURE DIFFERENCE
- !***
- IF(DEPWL>=DEPTH)THEN
- IF(L<L0)THEN
- DSP=((PK0-PK(L))*DSPTK+(PK(L)-PKT)*DSP0K)/(PK0-PKT)
- ELSE
- DSP=((PKB-PK(L))*DSP0K+(PK(L)-PK0)*DSPBK)/(PKB-PK0)
- ENDIF
- ELSE
- DSP=DSP0K
- IF(L<L0)THEN
- DSP=((PK0-PK(L))*DSPTK+(PK(L)-PKT)*DSP0K)/(PK0-PKT)
- ENDIF
- ENDIF
- !***
- !*** HUMIDITY PROFILE
- !***
- IF(PK(L)>PQM)THEN
- PSK(L)=PK(L)+DSP
- APESK(L)=(1.E5/PSK(L))**CAPA
- THSK(L)=TREFK(L)*APEK(L)
- QREFK(L)=PQ0/PSK(L)*EXP(A2*(THSK(L)-A3*APESK(L)) &
- & /(THSK(L)-A4*APESK(L)))
- ELSE
- QREFK(L)=QK(L)
- ENDIF
- !
- ENDDO
- !-----------------------------------------------------------------------
- !***
- !*** ENTHALPY CONSERVATION INTEGRAL
- !***
- !-----------------------------------------------------------------------
- enthalpy_conservation : DO ITER=1,2
- !
- SUMDE=0.
- SUMDP=0.
- !
- DO L=LTOP,LB
- SUMDE=((TK(L)-TREFK(L))*CP+(QK(L)-QREFK(L))*EL(L))*DPRS(L) &
- & +SUMDE
- SUMDP=SUMDP+DPRS(L)
- ENDDO
- !
- HCORR=SUMDE/(SUMDP-DPRS(LTOP))
- LCOR=LTOP+1
- !***
- !*** FIND LQM
- !***
- LQM=1
- DO L=KTS,LB
- IF(PK(L)<=PQM)LQM=L
- ENDDO
- !***
- !*** ABOVE LQM CORRECT TEMPERATURE ONLY
- !***
- IF(LCOR<=LQM)THEN
- DO L=LCOR,LQM
- TREFK(L)=TREFK(L)+HCORR*RCP
- ENDDO
- LCOR=LQM+1
- ENDIF
- !***
- !*** BELOW LQM CORRECT BOTH TEMPERATURE AND MOISTURE
- !***
- DO L=LCOR,LB
- TSKL=TREFK(L)*APEK(L)/APESK(L)
- DHDT=QREFK(L)*A23M4L/(TSKL-A4)**2+CP
- TREFK(L)=HCORR/DHDT+TREFK(L)
- THSKL=TREFK(L)*APEK(L)
- QREFK(L)=PQ0/PSK(L)*EXP(A2*(THSKL-A3*APESK(L)) &
- & /(THSKL-A4*APESK(L)))
- ENDDO
- !
- ENDDO enthalpy_conservation
- !-----------------------------------------------------------------------
- !
- !*** HEATING, MOISTENING, PRECIPITATION
- !
- !-----------------------------------------------------------------------
- AVRGT=0.
- PRECK=0.
- DSQ=0.
- DST=0.
- !
- DO L=LTOP,LB
- TKL=TK(L)
- DIFTL=(TREFK(L)-TKL )*TAUK
- DIFQL=(QREFK(L)-QK(L))*TAUK
- AVRGTL=(TKL+TKL+DIFTL)
- DPOT=DPRS(L)/AVRGTL
- DST=DIFTL*DPOT+DST
- DSQ=DIFQL*EL(L)*DPOT+DSQ
- AVRGT=AVRGTL*DPRS(L)+AVRGT
- PRECK=DIFTL*DPRS(L)+PRECK
- DIFT(L)=DIFTL
- DIFQ(L)=DIFQL
- ENDDO
- !
- DST=(DST+DST)*CP
- DSQ=DSQ+DSQ
- DENTPY=DST+DSQ
- AVRGT=AVRGT/(SUMDP+SUMDP)
- !
- ! DRHEAT=PRECK*CP/AVRGT
- DRHEAT=(PRECK*SM+MAX(1.E-7,PRECK)*(1.-SM))*CP/AVRGT !As in Eta!
- DRHEAT=MAX(DRHEAT,1.E-20)
- EFI=EFIFC*DENTPY/DRHEAT
- !-----------------------------------------------------------------------
- EFI=MIN(EFI,1.)
- EFI=MAX(EFI,EFIMN)
- !-----------------------------------------------------------------------
- !
- ENDDO cloud_efficiency
- !
- !-----------------------------------------------------------------------
- !
- !-----------------------------------------------------------------------
- !---------------------- DEEP CONVECTION --------------------------------
- !-----------------------------------------------------------------------
- !
- IF(DENTPY>=EPSNTP.AND.PRECK>EPSPR)THEN
- !
- CLDEFI=EFI
- FEFI=EFMNT+SLOPE*(EFI-EFIMN)
- FEFI=(DENTPY-EPSNTP)*FEFI/DENTPY
- PRECK=PRECK*FEFI
- !
- !*** UPDATE PRECIPITATION AND TENDENCIES OF TEMPERATURE AND MOISTURE
- !
- CUP=PRECK*CPRLG
- PCPCOL=CUP
- !
- DO L=LTOP,LB
- DTDT(L)=DIFT(L)*FEFI*RDTCNVC
- DQDT(L)=DIFQ(L)*FEFI*RDTCNVC
- ENDDO
- !
- ELSE
- !
- !-----------------------------------------------------------------------
- !*** REDUCE THE CLOUD TOP
- !-----------------------------------------------------------------------
- !
- ! LTOP=LTOP+3
- ! PTOP=PRSMID(LTOP)
- ! DEPMIN=PSH*PSFC*RSFCP
- ! DEPTH=PBOT-PTOP
- !***
- !*** ITERATE DEEP CONVECTION PROCEDURE IF NEEDED
- !***
- ! IF(DEPTH>=DEPMIN)THEN
- ! GO TO 300
- ! ENDIF
- !
- ! CLDEFI=AVGEFI
- CLDEFI=EFIMN*SM+STEFI*(1.-SM)
- !***
- !*** SEARCH FOR SHALLOW CLOUD TOP
- !***
- ! LTSH=LBOT
- ! LBM1=LBOT-1
- ! PBTK=PK(LBOT)
- ! DEPMIN=PSH*PSFC*RSFCP
- ! PTPK=PBTK-DEPMIN
- PTPK=MAX(PSHU, PK(LBOT)-DEPMIN)
- !***
- !*** CLOUD TOP IS THE LEVEL JUST BELOW PBTK-PSH or JUST BELOW PSHU
- !***
- DO L=KTS,LMH
- IF(PK(L)<=PTPK)LTOP=L+1
- ENDDO
- !
- ! PTPK=PK(LTOP)
- !!***
- !!*** HIGHEST LEVEL ALLOWED IS LEVEL JUST BELOW PSHU
- !!***
- ! IF(PTPK<=PSHU)THEN
- !!
- ! DO L=KTS,LMH
- ! IF(PK(L)<=PSHU)LSHU=L+1
- ! ENDDO
- !!
- ! LTOP=LSHU
- ! PTPK=PK(LTOP)
- ! ENDIF
- !
- ! if(ltop>=lbot)then
- !!!!!! lbot=0
- ! ltop=lmh
- !!!!!! pbot=pk(lbot)
- ! ptop=pk(ltop)
- ! pbot=ptop
- ! go to 600
- ! endif
- !
- ! LTP1=LTOP+1
- ! LTP2=LTOP+2
- !!
- ! DO L=LTOP,LBOT
- ! QSATK(L)=PQ0/PK(L)*EXP(A2*(TK(L)-A3)/(TK(L)-A4))
- ! ENDDO
- !!
- ! RHH=QK(LTOP)/QSATK(LTOP)
- ! RHMAX=0.
- ! LTSH=LTOP
- !!
- ! DO L=LTP1,LBM1
- ! RHL=QK(L)/QSATK(L)
- ! DRHDP=(RHH-RHL)/(PK(L-1)-PK(L))
- !!
- ! IF(DRHDP>RHMAX)THEN
- ! LTSH=L-1
- ! RHMAX=DRHDP
- ! ENDIF
- !!
- ! RHH=RHL
- ! ENDDO
- !
- !-----------------------------------------------------------------------
- !-- Make shallow cloud top a function of virtual temperature excess (DTV)
- !-----------------------------------------------------------------------
- !
- LTP1=LBOT
- DO L=LBOT-1,LTOP,-1
- IF (DTV(L) > 0.) THEN
- LTP1=L
- ELSE
- EXIT
- ENDIF
- ENDDO
- LTOP=MIN(LTP1,LBOT)
- !***
- !*** CLOUD MUST BE AT LEAST TWO LAYERS THICK
- !***
- ! IF(LBOT-LTOP<2)LTOP=LBOT-2 (eliminate this criterion)
- !
- !-- End: Buoyancy check (24 Aug 2006)
- !
- PTOP=PK(LTOP)
- SHALLOW=.TRUE.
- DEEP=.FALSE.
- !
- ENDIF
- !DCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD
- !DCDCDCDCDCDCDC END OF DEEP CONVECTION DCDCDCDCDCDCD
- !DCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD
- !
- !-----------------------------------------------------------------------
- !-----------------------------------------------------------------------
- 600 CONTINUE
- !-----------------------------------------------------------------------
- !-----------------------------------------------------------------------
- !
- !----------------GATHER SHALLOW CONVECTION POINTS-----------------------
- !
- ! IF(PTOP<=PBOT-PNO.AND.LTOP<=LBOT-2)THEN
- ! DEPMIN=PSH*PSFC*RSFCP
- !!
- !! if(lpbl<lbot)lbot=lpbl
- !! if(lbot>lmh-1)lbot=lmh-1
- !! pbot=prsmid(lbot)
- !!
- ! IF(PTOP+1.>=PBOT-DEPMIN)SHALLOW=.TRUE.
- ! ELSE
- ! LBOT=0
- ! LTOP=KTE
- ! ENDIF
- !
- !***********************************************************************
- !-----------------------------------------------------------------------
- !*** Begin debugging convection
- IF(PRINT_DIAG)THEN
- WRITE(6,"(a,2i3,L2,3e12.4)") &
- '{cu2a lbot,ltop,shallow,pbot,ptop,depmin = ' &
- ,lbot,ltop,shallow,pbot,ptop,depmin
- ENDIF
- !*** End debugging convection
- !-----------------------------------------------------------------------
- !
- IF(.NOT.SHALLOW)GO TO 800
- !
- !-----------------------------------------------------------------------
- !***********************************************************************
- !-----------------------------------------------------------------------
- !SCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCS
- !SCSCSCSCSCSCSC SHALLOW CONVECTION CSCSCSCSCSCSCSCSCSCS
- !SCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCS
- !-----------------------------------------------------------------------
- DO L=KTS,LMH
- TKL =T(L)
- TK (L) =TKL
- TREFK(L) =TKL
- QKL =Q(L)
- QK (L) =QKL
- QREFK(L) =QKL
- PKL =PRSMID(L)
- PK (L) =PKL
- QSATK(L) =PQ0/PK(L)*EXP(A2*(TK(L)-A3)/(TK(L)-A4))
- APEKL =APE(L)
- APEK (L) =APEKL
- THVMKL =TKL*APEKL*(QKL*D608+1.)
- THVREF(L)=THVMKL
- !
- ! IF(TKL>=TFRZ)THEN
- EL(L)=ELWV
- ! ELSE
- ! EL(L)=ELIV
- ! ENDIF
- ENDDO
- !
- !-----------------------------------------------------------------------
- !-- Begin: Raise cloud top if avg RH>RHSHmax and CAPE>0
- ! RHSHmax=RH at cloud base associated with a DSP of PONE
- !-----------------------------------------------------------------------
- !
- TLEV2=T(LBOT)*((PK(LBOT)-PONE)/PK(LBOT))**CAPA
- QSAT1=PQ0/PK(LBOT)*EXP(A2*(T(LBOT)-A3)/(TK(LBOT)-A4))
- QSAT2=PQ0/(PK(LBOT)-PONE)*EXP(A2*(TLEV2-A3)/(TLEV2-A4))
- RHSHmax=QSAT2/QSAT1
- SUMDP=0.
- RHAVG=0.
- !
- DO L=LBOT,LTOP,-1
- RHAVG=RHAVG+DPRS(L)*QK(L)/QSATK(L)
- SUMDP=SUMDP+DPRS(L)
- ENDDO
- !
- IF (RHAVG/SUMDP > RHSHmax) THEN
- LTSH=LTOP
- DO L=LTOP-1,KTS,-1
- RHAVG=RHAVG+DPRS(L)*QK(L)/QSATK(L)
- SUMDP=SUMDP+DPRS(L)
- IF (CPE(L) > 0.) THEN
- LTSH=L
- ELSE
- EXIT
- ENDIF
- IF (RHAVG/SUMDP <= RHSHmax) EXIT
- IF (PK(L) <= PSHU) EXIT
- ENDDO
- LTOP=LTSH
- ENDIF
- !
- !-- End: Raise cloud top if avg RH>RHSHmax and CAPE>0
- !
- !---------------------------SHALLOW CLOUD TOP---------------------------
- LBM1=LBOT-1
- PTPK=PTOP
- LTP1=LTOP-1
- DEPTH=PBOT-PTOP
- !-----------------------------------------------------------------------
- !*** Begin debugging convection
- IF(PRINT_DIAG)THEN
- WRITE(6,"(a,4e12.4)") '{cu2b PBOT,PTOP,DEPTH,DEPMIN= ' &
- ,PBOT,PTOP,DEPTH,DEPMIN
- ENDIF
- !*** End debugging convection
- !-----------------------------------------------------------------------
- !
- !BSF IF(DEPTH<DEPMIN)THEN
- !BSF GO TO 800
- !BSF ENDIF
- !-----------------------------------------------------------------------
- IF(PTOP>PBOT-PNO.OR.LTOP>LBOT-2)THEN
- LBOT=0
- !!! LTOP=LBOT
- LTOP=KTE
- PTOP=PBOT
- GO TO 800
- ENDIF
- !
- !--------------SCALING POTENTIAL TEMPERATURE & TABLE INDEX AT TOP-------
- !
- THTPK=T(LTP1)*APE(LTP1)
- !
- TTHK=(THTPK-THL)*RDTH
- QQK =TTHK-AINT(TTHK)
- IT =INT(TTHK)+1
- !
- IF(IT<1)THEN
- IT=1
- QQK=0.
- ENDIF
- !
- IF(IT>=JTB)THEN
- IT=JTB-1
- QQK=0.
- ENDIF
- !
- !--------------BASE AND SCALING FACTOR FOR SPEC. HUMIDITY AT TOP--------
- !
- BQS00K=QS0(IT)
- SQS00K=SQS(IT)
- BQS10K=QS0(IT+1)
- SQS10K=SQS(IT+1)
- !
- !--------------SCALING SPEC. HUMIDITY & TABLE INDEX AT TOP--------------
- !
- BQK=(BQS10K-BQS00K)*QQK+BQS00K
- SQK=(SQS10K-SQS00K)*QQK+SQS00K
- !
- ! TQK=(Q(LTOP)-BQK)/SQK*RDQ
- TQK=(Q(LTP1)-BQK)/SQK*RDQ
- !
- PPK=TQK-AINT(TQK)
- IQ =INT(TQK)+1
- !
- IF(IQ<1)THEN
- IQ=1
- PPK=0.
- ENDIF
- !
- IF(IQ>=ITB)THEN
- IQ=ITB-1
- PPK=0.
- ENDIF
- !
- !----------------CLOUD TOP SATURATION POINT PRESSURE--------------------
- !
- PART1=(PTBL(IQ+1,IT)-PTBL(IQ,IT))*PPK
- PART2=(PTBL(IQ,IT+1)-PTBL(IQ,IT))*QQK
- PART3=(PTBL(IQ ,IT )-PTBL(IQ+1,IT ) &
- & -PTBL(IQ ,IT+1)+PTBL(IQ+1,IT+1))*PPK*QQK
- PTPK=PTBL(IQ,IT)+PART1+PART2+PART3
- !-----------------------------------------------------------------------
- DPMIX=PTPK-PSP
- IF(ABS(DPMIX).LT.3000.)DPMIX=-3000.
- !
- !----------------TEMPERATURE PROFILE SLOPE------------------------------
- !
- SMIX=(THTPK-THBT)/DPMIX*STABS
- !
- TREFKX=TREFK(LBOT+1)
- PKXXXX=PK(LBOT+1)
- PKXXXY=PK(LBOT)
- APEKXX=APEK(LBO…
Large files files are truncated, but you can click here to view the full file