!----------------------------------------------------------------------- ! !WRF:MODEL_LAYER:PHYSICS ! !----------------------------------------------------------------------- ! MODULE MODULE_CU_BMJ 3 ! !----------------------------------------------------------------------- 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( & 1,1 & IDS,IDE,JDS,JDE,KDS,KDE & & ,IMS,IME,JMS,JME,KMS,KME & & ,ITS,ITE,JTS,JTE,KTS,KTE & & ,DT,ITIMESTEP,STEPCU & & ,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 ! !----------------------------------------------------------------------- !*** !*** 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 !*** Begin debugging convection REAL :: DELQ,DELT,PLYR INTEGER :: IMD,JMD LOGICAL :: PRINT_DIAG !*** End debugging convection ! !----------------------------------------------------------------------- !*********************************************************************** !----------------------------------------------------------------------- ! !*** PREPARE TO CALL BMJ CONVECTION SCHEME ! !----------------------------------------------------------------------- !*** Begin debugging convection IMD=(IMS+IME)/2 JMD=(JMS+JME)/2 PRINT_DIAG=.FALSE. !*** End debugging convection ! 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 ! END SUBROUTINE BMJDRV !----------------------------------------------------------------------- !XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX !----------------------------------------------------------------------- SUBROUTINE BMJ & 1,6 !----------------------------------------------------------------------- & (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(LBOT+1) APEKXY=APEK(LBOT) ! LMID=.5*(LBOT+LTOP) ! DO L=LBOT,LTOP,-1 TREFKX=((PKXXXY-PKXXXX)*SMIX & & +TREFKX*APEKXX)/APEKXY TREFK(L)=TREFKX IF(L<=LMID) TREFK(L)=MAX(TREFK(L), TK(L)+DTSHAL) APEKXX=APEKXY PKXXXX=PKXXXY APEKXY=APEK(L-1) PKXXXY=PK(L-1) ENDDO ! !----------------TEMPERATURE REFERENCE PROFILE CORRECTION--------------- ! SUMDT=0. SUMDP=0. ! DO L=LTOP,LBOT SUMDT=(TK(L)-TREFK(L))*DPRS(L)+SUMDT SUMDP=SUMDP+DPRS(L) ENDDO ! RDPSUM=1./SUMDP FPK(LBOT)=TREFK(LBOT) ! TCORR=SUMDT*RDPSUM ! DO L=LTOP,LBOT TRFKL =TREFK(L)+TCORR TREFK(L)=TRFKL FPK (L)=TRFKL ENDDO ! !----------------HUMIDITY PROFILE EQUATIONS----------------------------- ! PSUM =0. QSUM =0. POTSUM=0. QOTSUM=0. OTSUM =0. DST =0. FPTK =FPK(LTOP) ! DO L=LTOP,LBOT DPKL =FPK(L)-FPTK PSUM =DPKL *DPRS(L)+PSUM QSUM =QK(L)*DPRS(L)+QSUM RTBAR =2./(TREFK(L)+TK(L)) OTSUM =DPRS(L)*RTBAR+OTSUM POTSUM=DPKL *RTBAR*DPRS(L)+POTSUM QOTSUM=QK(L) *RTBAR*DPRS(L)+QOTSUM DST =(TREFK(L)-TK(L))*RTBAR*DPRS(L)/EL(L)+DST ENDDO ! PSUM =PSUM*RDPSUM QSUM =QSUM*RDPSUM ROTSUM=1./OTSUM POTSUM=POTSUM*ROTSUM QOTSUM=QOTSUM*ROTSUM DST =DST*ROTSUM*CP ! !----------------------------------------------------------------------- !*** Begin debugging convection IF(PRINT_DIAG)THEN WRITE(6,"(a,5e12.4)") '{cu2c DST,PSUM,QSUM,POTSUM,QOTSUM = ' & ,DST,PSUM,QSUM,POTSUM,QOTSUM ENDIF !*** End debugging convection !----------------------------------------------------------------------- ! !----------------ENSURE POSITIVE ENTROPY CHANGE------------------------- ! IF(DST>0.)THEN ! dstq=dst*epsup LBOT=0 !!!! LTOP=LBOT LTOP=KTE PTOP=PBOT GO TO 800 ELSE DSTQ=DST*EPSDN ENDIF ! !----------------CHECK FOR ISOTHERMAL ATMOSPHERE------------------------ ! DEN=POTSUM-PSUM ! IF(-DEN/PSUM<5.E-5)THEN LBOT=0 !!!! LTOP=LBOT LTOP=KTE PTOP=PBOT GO TO 800 ! !----------------SLOPE OF THE REFERENCE HUMIDITY PROFILE---------------- ! ELSE DQREF=(QOTSUM-DSTQ-QSUM)/DEN ENDIF ! !-------------- HUMIDITY DOES NOT INCREASE WITH HEIGHT------------------ ! IF(DQREF<0.)THEN LBOT=0 !!!! LTOP=LBOT LTOP=KTE PTOP=PBOT GO TO 800 ENDIF ! !----------------HUMIDITY AT THE CLOUD TOP------------------------------ ! QRFTP=QSUM-DQREF*PSUM ! !----------------HUMIDITY PROFILE--------------------------------------- ! DO L=LTOP,LBOT QRFKL=(FPK(L)-FPTK)*DQREF+QRFTP ! !*** TOO DRY CLOUDS NOT ALLOWED ! TNEW=(TREFK(L)-TK(L))*TAUKSC+TK(L) QSATK(L)=PQ0/PK(L)*EXP(A2*(TNEW-A3)/(TNEW-A4)) QNEW=(QRFKL-QK(L))*TAUKSC+QK(L) ! IF(QNEW<QSATK(L)*RHLSC)THEN LBOT=0 !!!! LTOP=LBOT LTOP=KTE PTOP=PBOT GO TO 800 ENDIF ! !-------------TOO MOIST CLOUDS NOT ALLOWED------------------------------ ! IF(QNEW>QSATK(L)*RHHSC)THEN LBOT=0 !!!! LTOP=LBOT LTOP=KTE PTOP=PBOT GO TO 800 ENDIF ! THVREF(L)=TREFK(L)*APEK(L)*(QRFKL*D608+1.) QREFK(L)=QRFKL ENDDO ! !------------------ ELIMINATE CLOUDS WITH BOTTOMS TOO DRY -------------- !! ! qnew=(qrefk(lbot)-qk(lbot))*tauksc+qk(lbot) !! ! if(qnew<qk(lbot+1)*stresh)then !!?? stresh too large!! ! lbot=0 !!!!!! ltop=lbot ! ltop=kte ! ptop=pbot ! go to 800 ! endif !! !-------------- ELIMINATE IMPOSSIBLE SLOPES (BETTS,DTHETA/DQ)------------ ! DO L=LTOP,LBOT DTDP=(THVREF(L-1)-THVREF(L))/(PRSMID(L)-PRSMID(L-1)) ! IF(DTDP<EPSDT)THEN LBOT=0 !!!!! LTOP=LBOT LTOP=KTE PTOP=PBOT GO TO 800 ENDIF ! ENDDO !----------------------------------------------------------------------- !--------------RELAXATION TOWARD REFERENCE PROFILES--------------------- !----------------------------------------------------------------------- ! DO L=LTOP,LBOT DTDT(L)=(TREFK(L)-TK(L))*TAUKSC*RDTCNVC DQDT(L)=(QREFK(L)-QK(L))*TAUKSC*RDTCNVC ENDDO ! !----------------------------------------------------------------------- !*** Begin debugging convection IF(PRINT_DIAG)THEN DO L=LBOT,LTOP,-1 WRITE(6,"(a,i3,4e12.4)") '{cu2 KFLIP,DT,DTDT,DQ,DQDT = ' & ,KTE+1-L,TREFK(L)-TK(L),DTDT(L),QREFK(L)-QK(L),DQDT(L) ENDDO ENDIF !*** End debugging convection !----------------------------------------------------------------------- ! !----------------------------------------------------------------------- !SCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCS !SCSCSCSCSCSCSC END OF SHALLOW CONVECTION SCSCSCSCSCSCSCS !SCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCS !----------------------------------------------------------------------- 800 CONTINUE !----------------------------------------------------------------------- END SUBROUTINE BMJ !----------------------------------------------------------------------- !XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX !----------------------------------------------------------------------- SUBROUTINE TTBLEX & 6 & (ITBX,JTBX,PLX,PRSMID,RDPX,RDTHEX,STHE & & ,THE0,THESP,TTBL,TREF) !----------------------------------------------------------------------- ! ****************************************************************** ! * * ! * EXTRACT TEMPERATURE OF THE MOIST ADIABAT FROM * ! * THE APPROPRIATE TTBL * ! * * ! ****************************************************************** !----------------------------------------------------------------------- IMPLICIT NONE !----------------------------------------------------------------------- INTEGER,INTENT(IN) :: ITBX,JTBX ! REAL,INTENT(IN) :: PLX,PRSMID,RDPX,RDTHEX,THESP ! REAL,DIMENSION(ITBX),INTENT(IN) :: STHE,THE0 ! REAL,DIMENSION(JTBX,ITBX),INTENT(IN) :: TTBL ! REAL,INTENT(OUT) :: TREF !----------------------------------------------------------------------- REAL :: BTHE00K,BTHE10K,BTHK,PK,PP,QQ,STHE00K,STHE10K,STHK & & ,T00K,T01K,T10K,T11K,TPK,TTHK ! INTEGER :: IPTB,ITHTB !----------------------------------------------------------------------- !----------------SCALING PRESSURE & TT TABLE INDEX---------------------- !----------------------------------------------------------------------- PK=PRSMID TPK=(PK-PLX)*RDPX QQ=TPK-AINT(TPK) IPTB=INT(TPK)+1 !----------------KEEPING INDICES WITHIN THE TABLE----------------------- IF(IPTB<1)THEN IPTB=1 QQ=0. ENDIF ! IF(IPTB>=ITBX)THEN IPTB=ITBX-1 QQ=0. ENDIF !----------------BASE AND SCALING FACTOR FOR THETAE--------------------- BTHE00K=THE0(IPTB) STHE00K=STHE(IPTB) BTHE10K=THE0(IPTB+1) STHE10K=STHE(IPTB+1) !----------------SCALING THE & TT TABLE INDEX--------------------------- BTHK=(BTHE10K-BTHE00K)*QQ+BTHE00K STHK=(STHE10K-STHE00K)*QQ+STHE00K TTHK=(THESP-BTHK)/STHK*RDTHEX PP=TTHK-AINT(TTHK) ITHTB=INT(TTHK)+1 !----------------KEEPING INDICES WITHIN THE TABLE----------------------- IF(ITHTB<1)THEN ITHTB=1 PP=0. ENDIF ! IF(ITHTB>=JTBX)THEN ITHTB=JTBX-1 PP=0. ENDIF !----------------TEMPERATURE AT FOUR SURROUNDING TT TABLE PTS.---------- T00K=TTBL(ITHTB,IPTB) T10K=TTBL(ITHTB+1,IPTB) T01K=TTBL(ITHTB,IPTB+1) T11K=TTBL(ITHTB+1,IPTB+1) !----------------------------------------------------------------------- !----------------PARCEL TEMPERATURE------------------------------------- !----------------------------------------------------------------------- TREF=(T00K+(T10K-T00K)*PP+(T01K-T00K)*QQ & & +(T00K-T10K-T01K+T11K)*PP*QQ) !----------------------------------------------------------------------- END SUBROUTINE TTBLEX !----------------------------------------------------------------------- !----------------------------------------------------------------------- SUBROUTINE BMJINIT(RTHCUTEN,RQVCUTEN,RQCCUTEN,RQRCUTEN & 1,3 & ,CLDEFI,LOWLYR,CP,RD,RESTART & & ,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 ! REAL,INTENT(IN) :: CP,RD ! REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(OUT) :: & & RTHCUTEN & & ,RQVCUTEN & & ,RQCCUTEN & & ,RQRCUTEN ! REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(OUT) :: CLDEFI INTEGER,DIMENSION(IMS:IME,JMS:JME),INTENT(INOUT) :: LOWLYR ! REAL,PARAMETER :: EPS=1.E-9 ! REAL, DIMENSION(JTB) :: APP,APT,AQP,AQT,PNEW,POLD,QSNEW,QSOLD & & ,THENEW,THEOLD,TNEW,TOLD,Y2P,Y2T ! REAL,DIMENSION(JTBQ) :: APTQ,AQTQ,THENEWQ,THEOLDQ & & ,TNEWQ,TOLDQ,Y2TQ ! INTEGER :: I,J,K,ITF,JTF,KTF INTEGER :: KTH,KTHM,KTHM1,KP,KPM,KPM1 ! REAL :: APE,DP,DQS,DTH,DTHE,P,QS,QS0K,SQSK,STHEK & & ,TH,THE0K,DENOM,ELOCP !----------------------------------------------------------------------- ELOCP=ELIWV/CP JTF=MIN0(JTE,JDE-1) KTF=MIN0(KTE,KDE-1) ITF=MIN0(ITE,IDE-1) ! IF(.NOT.RESTART)THEN DO J=JTS,JTF DO K=KTS,KTF DO I=ITS,ITF RTHCUTEN(I,K,J)=0. RQVCUTEN(I,K,J)=0. RQCCUTEN(I,K,J)=0. RQRCUTEN(I,K,J)=0. ENDDO ENDDO ENDDO ! DO J=JTS,JTF DO I=ITS,ITF CLDEFI(I,J)=AVGEFI ENDDO ENDDO ENDIF ! !*** FOR NOW, ASSUME SIGMA MODE FOR LOWEST MODEL LAYER ! DO J=JTS,JTF DO I=ITS,ITF LOWLYR(I,J)=1 ENDDO ENDDO !----------------------------------------------------------------------- !----------------COARSE LOOK-UP TABLE FOR SATURATION POINT-------------- !----------------------------------------------------------------------- ! KTHM=JTB KPM=ITB KTHM1=KTHM-1 KPM1=KPM-1 ! DTH=(THH-THL)/REAL(KTHM-1) DP =(PH -PL )/REAL(KPM -1) ! TH=THL-DTH !----------------------------------------------------------------------- DO 100 KTH=1,KTHM ! TH=TH+DTH P=PL-DP ! DO KP=1,KPM P=P+DP APE=(100000./P)**(RD/CP) DENOM=TH-A4*APE IF (DENOM>EPS) THEN QSOLD(KP)=PQ0/P*EXP(A2*(TH-A3*APE)/DENOM) ELSE QSOLD(KP)=0. ENDIF POLD(KP)=P ENDDO ! QS0K=QSOLD(1) SQSK=QSOLD(KPM)-QSOLD(1) QSOLD(1 )=0. QSOLD(KPM)=1. ! DO KP=2,KPM1 QSOLD(KP)=(QSOLD(KP)-QS0K)/SQSK IF((QSOLD(KP)-QSOLD(KP-1)).LT.EPS)QSOLD(KP)=QSOLD(KP-1)+EPS ENDDO ! QS0(KTH)=QS0K QS0_EXP(KTH)=QS0K SQS(KTH)=SQSK SQS_EXP(KTH)=SQSK !----------------------------------------------------------------------- QSNEW(1 )=0. QSNEW(KPM)=1. DQS=1./REAL(KPM-1) ! DO KP=2,KPM1 QSNEW(KP)=QSNEW(KP-1)+DQS ENDDO ! Y2P(1 )=0. Y2P(KPM )=0. ! CALL SPLINE(JTB,KPM,QSOLD,POLD,Y2P,KPM,QSNEW,PNEW,APP,AQP) ! DO KP=1,KPM PTBL(KP,KTH)=PNEW(KP) PTBL_EXP(KP,KTH)=PNEW(KP) ENDDO !----------------------------------------------------------------------- 100 CONTINUE !----------------------------------------------------------------------- !------------COARSE LOOK-UP TABLE FOR T(P) FROM CONSTANT THE------------ !----------------------------------------------------------------------- P=PL-DP ! DO 200 KP=1,KPM ! P=P+DP TH=THL-DTH ! DO KTH=1,KTHM TH=TH+DTH APE=(1.E5/P)**(RD/CP) DENOM=TH-A4*APE IF (DENOM>EPS) THEN QS=PQ0/P*EXP(A2*(TH-A3*APE)/DENOM) ELSE QS=0. ENDIF ! QS=PQ0/P*EXP(A2*(TH-A3*APE)/(TH-A4*APE)) TOLD(KTH)=TH/APE THEOLD(KTH)=TH*EXP(ELOCP*QS/TOLD(KTH)) ENDDO ! THE0K=THEOLD(1) STHEK=THEOLD(KTHM)-THEOLD(1) THEOLD(1 )=0. THEOLD(KTHM)=1. ! DO KTH=2,KTHM1 THEOLD(KTH)=(THEOLD(KTH)-THE0K)/STHEK IF((THEOLD(KTH)-THEOLD(KTH-1)).LT.EPS) & & THEOLD(KTH)=THEOLD(KTH-1) + EPS ENDDO ! THE0(KP)=THE0K STHE(KP)=STHEK !----------------------------------------------------------------------- THENEW(1 )=0. THENEW(KTHM)=1. DTHE=1./REAL(KTHM-1) ! DO KTH=2,KTHM1 THENEW(KTH)=THENEW(KTH-1)+DTHE ENDDO ! Y2T(1 )=0. Y2T(KTHM)=0. ! CALL SPLINE(JTB,KTHM,THEOLD,TOLD,Y2T,KTHM,THENEW,TNEW,APT,AQT) ! DO KTH=1,KTHM TTBL(KTH,KP)=TNEW(KTH) ENDDO !----------------------------------------------------------------------- 200 CONTINUE !----------------------------------------------------------------------- ! !----------------------------------------------------------------------- !---------------FINE LOOK-UP TABLE FOR SATURATION POINT----------------- !----------------------------------------------------------------------- KTHM=JTBQ KPM=ITBQ KTHM1=KTHM-1 KPM1=KPM-1 ! DTH=(THHQ-THL)/REAL(KTHM-1) DP=(PH-PLQ)/REAL(KPM-1) ! TH=THL-DTH P=PLQ-DP !----------------------------------------------------------------------- !---------------FINE LOOK-UP TABLE FOR T(P) FROM CONSTANT THE----------- !----------------------------------------------------------------------- DO 300 KP=1,KPM ! P=P+DP TH=THL-DTH ! DO KTH=1,KTHM TH=TH+DTH APE=(1.E5/P)**(RD/CP) DENOM=TH-A4*APE IF (DENOM>EPS) THEN QS=PQ0/P*EXP(A2*(TH-A3*APE)/DENOM) ELSE QS=0. ENDIF ! QS=PQ0/P*EXP(A2*(TH-A3*APE)/(TH-A4*APE)) TOLDQ(KTH)=TH/APE THEOLDQ(KTH)=TH*EXP(ELOCP*QS/TOLDQ(KTH)) ENDDO ! THE0K=THEOLDQ(1) STHEK=THEOLDQ(KTHM)-THEOLDQ(1) THEOLDQ(1 )=0. THEOLDQ(KTHM)=1. ! DO KTH=2,KTHM1 THEOLDQ(KTH)=(THEOLDQ(KTH)-THE0K)/STHEK IF((THEOLDQ(KTH)-THEOLDQ(KTH-1))<EPS) & & THEOLDQ(KTH)=THEOLDQ(KTH-1)+EPS ENDDO ! THE0Q(KP)=THE0K STHEQ(KP)=STHEK !----------------------------------------------------------------------- THENEWQ(1 )=0. THENEWQ(KTHM)=1. DTHE=1./REAL(KTHM-1) ! DO KTH=2,KTHM1 THENEWQ(KTH)=THENEWQ(KTH-1)+DTHE ENDDO ! Y2TQ(1 )=0. Y2TQ(KTHM)=0. ! CALL SPLINE(JTBQ,KTHM,THEOLDQ,TOLDQ,Y2TQ,KTHM & & ,THENEWQ,TNEWQ,APTQ,AQTQ) ! DO KTH=1,KTHM TTBLQ(KTH,KP)=TNEWQ(KTH) ENDDO !----------------------------------------------------------------------- 300 CONTINUE !----------------------------------------------------------------------- END SUBROUTINE BMJINIT !----------------------------------------------------------------------- !XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX !----------------------------------------------------------------------- SUBROUTINE SPLINE(JTBX,NOLD,XOLD,YOLD,Y2,NNEW,XNEW,YNEW,P,Q) 4 ! ******************************************************************** ! * * ! * THIS IS A ONE-DIMENSIONAL CUBIC SPLINE FITTING ROUTINE * ! * PROGRAMED FOR A SMALL SCALAR MACHINE. * ! * * ! * PROGRAMER Z. JANJIC * ! * * ! * NOLD - NUMBER OF GIVEN VALUES OF THE FUNCTION. MUST BE GE 3. * ! * XOLD - LOCATIONS OF THE POINTS AT WHICH THE VALUES OF THE * ! * FUNCTION ARE GIVEN. MUST BE IN ASCENDING ORDER. * ! * YOLD - THE GIVEN VALUES OF THE FUNCTION AT THE POINTS XOLD. * ! * Y2 - THE SECOND DERIVATIVES AT THE POINTS XOLD. IF NATURAL * ! * SPLINE IS FITTED Y2(1)=0. AND Y2(NOLD)=0. MUST BE * ! * SPECIFIED. * ! * NNEW - NUMBER OF VALUES OF THE FUNCTION TO BE CALCULATED. * ! * XNEW - LOCATIONS OF THE POINTS AT WHICH THE VALUES OF THE * ! * FUNCTION ARE CALCULATED. XNEW(K) MUST BE GE XOLD(1) * ! * AND LE XOLD(NOLD). * ! * YNEW - THE VALUES OF THE FUNCTION TO BE CALCULATED. * ! * P, Q - AUXILIARY VECTORS OF THE LENGTH NOLD-2. * ! * * ! ******************************************************************** !----------------------------------------------------------------------- IMPLICIT NONE !----------------------------------------------------------------------- INTEGER,INTENT(IN) :: JTBX,NNEW,NOLD REAL,DIMENSION(JTBX),INTENT(IN) :: XNEW,XOLD,YOLD REAL,DIMENSION(JTBX),INTENT(INOUT) :: P,Q,Y2 REAL,DIMENSION(JTBX),INTENT(OUT) :: YNEW ! INTEGER :: K,K1,K2,KOLD,NOLDM1 REAL :: AK,BK,CK,DEN,DX,DXC,DXL,DXR,DYDXL,DYDXR & & ,RDX,RTDXC,X,XK,XSQ,Y2K,Y2KP1 !----------------------------------------------------------------------- NOLDM1=NOLD-1 ! DXL=XOLD(2)-XOLD(1) DXR=XOLD(3)-XOLD(2) DYDXL=(YOLD(2)-YOLD(1))/DXL DYDXR=(YOLD(3)-YOLD(2))/DXR RTDXC=0.5/(DXL+DXR) ! P(1)= RTDXC*(6.*(DYDXR-DYDXL)-DXL*Y2(1)) Q(1)=-RTDXC*DXR ! IF(NOLD==3)GO TO 150 !----------------------------------------------------------------------- K=3 ! 100 DXL=DXR DYDXL=DYDXR DXR=XOLD(K+1)-XOLD(K) DYDXR=(YOLD(K+1)-YOLD(K))/DXR DXC=DXL+DXR DEN=1./(DXL*Q(K-2)+DXC+DXC) ! P(K-1)= DEN*(6.*(DYDXR-DYDXL)-DXL*P(K-2)) Q(K-1)=-DEN*DXR ! K=K+1 IF(K<NOLD)GO TO 100 !----------------------------------------------------------------------- 150 K=NOLDM1 ! 200 Y2(K)=P(K-1)+Q(K-1)*Y2(K+1) ! K=K-1 IF(K>1)GO TO 200 !----------------------------------------------------------------------- K1=1 ! 300 XK=XNEW(K1) ! DO 400 K2=2,NOLD ! IF(XOLD(K2)>XK)THEN KOLD=K2-1 GO TO 450 ENDIF ! 400 CONTINUE ! YNEW(K1)=YOLD(NOLD) GO TO 600 ! 450 IF(K1==1)GO TO 500 IF(K==KOLD)GO TO 550 ! 500 K=KOLD ! Y2K=Y2(K) Y2KP1=Y2(K+1) DX=XOLD(K+1)-XOLD(K) RDX=1./DX ! AK=.1666667*RDX*(Y2KP1-Y2K) BK=0.5*Y2K CK=RDX*(YOLD(K+1)-YOLD(K))-.1666667*DX*(Y2KP1+Y2K+Y2K) ! 550 X=XK-XOLD(K) XSQ=X*X ! YNEW(K1)=AK*XSQ*X+BK*XSQ+CK*X+YOLD(K) ! 600 K1=K1+1 IF(K1<=NNEW)GO TO 300 !----------------------------------------------------------------------- END SUBROUTINE SPLINE !----------------------------------------------------------------------- ! END MODULE MODULE_CU_BMJ ! !-----------------------------------------------------------------------