merge standard release WRF/WPS V3.0.1.1 into wrffire
[wrffire.git] / wrfv2_fire / phys / module_cu_bmj.F
blob9fdd7d4f31e47db49af9a1a9233e7257e1f117ee
1 !-----------------------------------------------------------------------
3 !WRF:MODEL_LAYER:PHYSICS
5 !-----------------------------------------------------------------------
7       MODULE MODULE_CU_BMJ
9 !-----------------------------------------------------------------------
10       USE MODULE_MODEL_CONSTANTS
11 !-----------------------------------------------------------------------
13       REAL,PARAMETER ::                                                 &
14      &                  DSPC=-3000.                                     &
15      &                 ,DTTOP=0.,EFIFC=5.0,EFIMN=0.20,EFMNT=0.70        & 
16      &                 ,ELIWV=2.683E6,ENPLO=20000.,ENPUP=15000.         &
17      &                 ,EPSDN=1.05,EPSDT=0.                             &
18      &                 ,EPSNTP=.0001,EPSNTT=.0001,EPSPR=1.E-7           &
19      &                 ,EPSUP=1.00                                      &
20      &                 ,FR=1.00,FSL=0.85,FSS=0.85                       &
21      &                 ,FUP=0.                                          &
22      &                 ,PBM=13000.,PFRZ=15000.,PNO=1000.                &
23      &                 ,PONE=2500.,PQM=20000.                           &
24      &                 ,PSH=20000.,PSHU=45000.                          &
25      &                 ,RENDP=1./(ENPLO-ENPUP)                          &
26      &                 ,RHLSC=0.00,RHHSC=1.10                           &
27      &                 ,ROW=1.E3                                        &
28      &                 ,STABDF=0.90,STABDS=0.90                         &
29      &                 ,STABS=1.0,STRESH=1.10                           &
30      &                 ,DTSHAL=-1.0,TREL=2400.
32       REAL,PARAMETER :: DTtrigr=-0.0                                    &
33                        ,DTPtrigr=DTtrigr*PONE      !<-- Average parcel virtual temperature deficit over depth PONE.
34                                                    !<-- NOTE: CAPEtrigr is scaled by the cloud base temperature (see below)
36       REAL,PARAMETER :: DSPBFL=-3875.*FR                                &
37      &                 ,DSP0FL=-5875.*FR                                &
38      &                 ,DSPTFL=-1875.*FR                                &
39      &                 ,DSPBFS=-3875.                                   &
40      &                 ,DSP0FS=-5875.                                   &
41      &                 ,DSPTFS=-1875.
43       REAL,PARAMETER :: PL=2500.,PLQ=70000.,PH=105000.                  &
44      &                 ,THL=210.,THH=365.,THHQ=325.
46       INTEGER,PARAMETER :: ITB=76,JTB=134,ITBQ=152,JTBQ=440
48       INTEGER,PARAMETER :: ITREFI_MAX=3
50 !***  ARRAYS FOR LOOKUP TABLES
52       REAL,DIMENSION(ITB),PRIVATE,SAVE :: STHE,THE0
53       REAL,DIMENSION(JTB),PRIVATE,SAVE :: QS0,SQS
54       REAL,DIMENSION(ITBQ),PRIVATE,SAVE :: STHEQ,THE0Q
55       REAL,DIMENSION(ITB,JTB),PRIVATE,SAVE :: PTBL
56       REAL,DIMENSION(JTB,ITB),PRIVATE,SAVE :: TTBL
57       REAL,DIMENSION(JTBQ,ITBQ),PRIVATE,SAVE :: TTBLQ
59 !***  SHARE COPIES FOR MODULE_BL_MYJPBL
61       REAL,DIMENSION(JTB) :: QS0_EXP,SQS_EXP
62       REAL,DIMENSION(ITB,JTB) :: PTBL_EXP
64       REAL,PARAMETER :: RDP=(ITB-1.)/(PH-PL),RDPQ=(ITBQ-1.)/(PH-PLQ)  &
65      &                 ,RDQ=ITB-1,RDTH=(JTB-1.)/(THH-THL)             &
66      &                 ,RDTHE=JTB-1.,RDTHEQ=JTBQ-1.                   &
67      &                 ,RSFCP=1./101300.
69       REAL,PARAMETER :: AVGEFI=(EFIMN+1.)*0.5
71 !-----------------------------------------------------------------------
73 CONTAINS
75 !-----------------------------------------------------------------------
76       SUBROUTINE BMJDRV(                                                &
77      &                  IDS,IDE,JDS,JDE,KDS,KDE                         &
78      &                 ,IMS,IME,JMS,JME,KMS,KME                         &
79      &                 ,ITS,ITE,JTS,JTE,KTS,KTE                         &
80      &                 ,DT,ITIMESTEP,STEPCU                             &
81      &                 ,CUDT, CURR_SECS, ADAPT_STEP_FLAG                &
82      &                 ,RAINCV,PRATEC,CUTOP,CUBOT,KPBL                  &
83      &                 ,TH,T,QV                                         &
84      &                 ,PINT,PMID,PI,RHO,DZ8W                           &
85      &                 ,CP,R,ELWV,ELIV,G,TFRZ,D608                      &
86      &                 ,CLDEFI,LOWLYR,XLAND,CU_ACT_FLAG                 &
87                       ! optional
88      &                 ,RTHCUTEN, RQVCUTEN                              &
89      &                                                                  )
90 !-----------------------------------------------------------------------
91       IMPLICIT NONE
92 !-----------------------------------------------------------------------
93       INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE                     &
94      &                     ,IMS,IME,JMS,JME,KMS,KME                     & 
95      &                     ,ITS,ITE,JTS,JTE,KTS,KTE
97       INTEGER,INTENT(IN) :: ITIMESTEP,STEPCU
99       INTEGER,DIMENSION(IMS:IME,JMS:JME),INTENT(IN) :: KPBL,LOWLYR
101       REAL,INTENT(IN) :: CP,DT,ELIV,ELWV,G,R,TFRZ,D608
103       REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(IN) :: XLAND
105       REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(IN) :: DZ8W        &
106      &                                                     ,PI,PINT     &
107      &                                                     ,PMID,QV     &
108      &                                                     ,RHO,T,TH
110       REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME)                           &
111      &    ,OPTIONAL                                                     &
112      &    ,INTENT(INOUT) ::                        RQVCUTEN,RTHCUTEN 
114       REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(INOUT) :: CLDEFI,RAINCV,   &
115            PRATEC
117       REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(OUT) :: CUBOT,CUTOP
119       LOGICAL,DIMENSION(IMS:IME,JMS:JME),INTENT(INOUT) :: CU_ACT_FLAG
121 ! Adaptive time-step variables
122       REAL,  INTENT(IN   ) :: CUDT
123       REAL,  INTENT(IN   ) :: CURR_SECS
124       LOGICAL,INTENT(IN   ) :: ADAPT_STEP_FLAG
126 !-----------------------------------------------------------------------
127 !***
128 !***  LOCAL VARIABLES
129 !***
130 !-----------------------------------------------------------------------
131       INTEGER :: LBOT,LPBL,LTOP
133       REAL :: DTCNVC,LANDMASK,PCPCOL,PSFC,PTOP
135       REAL,DIMENSION(KTS:KTE) :: DPCOL,DQDT,DTDT,PCOL,QCOL,TCOL
137       INTEGER :: I,J,K,KFLIP,LMH
139       LOGICAL :: run_param
140 !     
141 !***  Begin debugging convection
142       REAL :: DELQ,DELT,PLYR
143       INTEGER :: IMD,JMD
144       LOGICAL :: PRINT_DIAG
145 !***  End debugging convection
147 !-----------------------------------------------------------------------
148 !*********************************************************************** 
149 !-----------------------------------------------------------------------
151 !***  PREPARE TO CALL BMJ CONVECTION SCHEME
153 !-----------------------------------------------------------------------
155 !***  CHECK TO SEE IF THIS IS A CONVECTION TIMESTEP
156 !                                                                        
157       if (adapt_step_flag) then
158          if ( (ITIMESTEP .eq. 0) .or. (cudt .eq. 0) .or. &
159          ( CURR_SECS + dt >= ( int( CURR_SECS / ( cudt * 60 ) ) + 1 ) * cudt * 60 ) ) then
160          run_param = .TRUE.
161       else
162          run_param = .FALSE.
163       endif
164       
165       else
166          if (MOD(ITIMESTEP,STEPCU) .EQ. 0 .or. ITIMESTEP .eq. 0) then
167             run_param = .TRUE.
168          else
169             run_param = .FALSE.
170          endif
171       endif
172       
173 !-----------------------------------------------------------------------
174 !                                                                      
175 !***  COMPUTE CONVECTION EVERY STEPCU*DT/60.0 MINUTES
176 !                                                                     
177 !***  Begin debugging convection
178       IMD=(IMS+IME)/2
179       JMD=(JMS+JME)/2
180       PRINT_DIAG=.FALSE.
181 !***  End debugging convection
183       IF(run_param)THEN
185         DO J=JTS,JTE
186         DO I=ITS,ITE
187           CU_ACT_FLAG(I,J)=.TRUE.
188         ENDDO
189         ENDDO
192         DTCNVC=DT*STEPCU
194         DO J=JTS,JTE  
195         DO I=ITS,ITE
197           DO K=KTS,KTE
198             DQDT(K)=0.
199             DTDT(K)=0.
200           ENDDO
202           RAINCV(I,J)=0.
203           PRATEC(I,J)=0.
204           PCPCOL=0.
205           PSFC=PINT(I,LOWLYR(I,J),J)
206           PTOP=PINT(I,KTE+1,J)      ! KTE+1=KME
208 !***  CONVERT TO BMJ LAND MASK (1.0 FOR SEA; 0.0 FOR LAND)
210           LANDMASK=XLAND(I,J)-1.
212 !***  FILL 1-D VERTICAL ARRAYS 
213 !***  AND FLIP DIRECTION SINCE BMJ SCHEME 
214 !***  COUNTS DOWNWARD FROM THE DOMAIN'S TOP
216           DO K=KTS,KTE
217             KFLIP=KTE+1-K
219 !***  CONVERT FROM MIXING RATIO TO SPECIFIC HUMIDITY
221             QCOL(K)=MAX(EPSQ,QV(I,KFLIP,J)/(1.+QV(I,KFLIP,J)))
222             TCOL(K)=T(I,KFLIP,J)
223             PCOL(K)=PMID(I,KFLIP,J)
224 !           DPCOL(K)=PINT(I,KFLIP,J)-PINT(I,KFLIP+1,J)
225             DPCOL(K)=RHO(I,KFLIP,J)*G*DZ8W(I,KFLIP,J)
226           ENDDO
228 !***  LOWEST LAYER ABOVE GROUND MUST ALSO BE FLIPPED
230           LMH=KTE+1-LOWLYR(I,J)
231           LPBL=KTE+1-KPBL(I,J)
232 !-----------------------------------------------------------------------
233 !***
234 !***  CALL CONVECTION
235 !***
236 !-----------------------------------------------------------------------
237 !***  Begin debugging convection
238 !         PRINT_DIAG=.FALSE.
239 !         IF(I==IMD.AND.J==JMD)PRINT_DIAG=.TRUE.
240 !***  End debugging convection
241 !-----------------------------------------------------------------------
242           CALL BMJ(ITIMESTEP,I,J,DTCNVC,LMH,LANDMASK,CLDEFI(I,J)        &
243      &            ,DPCOL,PCOL,QCOL,TCOL,PSFC,PTOP                       &
244      &            ,DQDT,DTDT,PCPCOL,LBOT,LTOP,LPBL                      &
245      &            ,CP,R,ELWV,ELIV,G,TFRZ,D608                           &   
246      &            ,PRINT_DIAG                                           &   
247      &            ,IDS,IDE,JDS,JDE,KDS,KDE                              &     
248      &            ,IMS,IME,JMS,JME,KMS,KME                              &
249      &            ,ITS,ITE,JTS,JTE,KTS,KTE)
250 !-----------------------------------------------------------------------
252 !***  COMPUTE HEATING AND MOISTENING TENDENCIES
254           IF ( PRESENT( RTHCUTEN ) .AND. PRESENT( RQVCUTEN )) THEN
255             DO K=KTS,KTE
256               KFLIP=KTE+1-K
257               RTHCUTEN(I,K,J)=DTDT(KFLIP)/PI(I,K,J)
259 !***  CONVERT FROM SPECIFIC HUMIDTY BACK TO MIXING RATIO
261               RQVCUTEN(I,K,J)=DQDT(KFLIP)/(1.-QCOL(KFLIP))**2
262             ENDDO
263           ENDIF
265 !***  ALL UNITS IN BMJ SCHEME ARE MKS, THUS CONVERT PRECIP FROM METERS
266 !***  TO MILLIMETERS PER STEP FOR OUTPUT.
268           RAINCV(I,J)=PCPCOL*1.E3/STEPCU
269           PRATEC(I,J)=PCPCOL*1.E3/(STEPCU * DT)
271 !***  CONVECTIVE CLOUD TOP AND BOTTOM FROM THIS CALL
273           CUTOP(I,J)=REAL(KTE+1-LTOP)
274           CUBOT(I,J)=REAL(KTE+1-LBOT)
276 !-----------------------------------------------------------------------
277 !***  Begin debugging convection
278           IF(PRINT_DIAG)THEN
279             DELT=0.
280             DELQ=0.
281             PLYR=0.
282             IF(LBOT>0.AND.LTOP<LBOT)THEN
283               DO K=LTOP,LBOT
284                 PLYR=PLYR+DPCOL(K)
285                 DELQ=DELQ+DPCOL(K)*DTCNVC*ABS(DQDT(K))
286                 DELT=DELT+DPCOL(K)*DTCNVC*ABS(DTDT(K))
287               ENDDO
288               DELQ=DELQ/PLYR
289               DELT=DELT/PLYR
290             ENDIF
292             WRITE(6,"(2a,2i4,3e12.4,f7.2,4i3)") &
293                  '{cu3 i,j,PCPCOL,DTavg,DQavg,PLYR,'  &
294                  ,'LBOT,LTOP,CUBOT,CUTOP = '  &
295                  ,i,j, PCPCOL,DELT,1000.*DELQ,.01*PLYR  &
296                  ,LBOT,LTOP,NINT(CUBOT(I,J)),NINT(CUTOP(I,J))
298             IF(PLYR> 0.)THEN
299               DO K=LBOT,LTOP,-1
300                 KFLIP=KTE+1-K
301                 WRITE(6,"(a,i3,2e12.4,f7.2)") '{cu3a KFLIP,DT,DQ,DP = ' &
302                      ,KFLIP,DTCNVC*DTDT(K),1000.*DTCNVC*DQDT(K),.01*DPCOL(K)
303               ENDDO
304             ENDIF
305           ENDIF
306 !***  End debugging convection
307 !-----------------------------------------------------------------------
309         ENDDO
310         ENDDO
312       ENDIF
314       END SUBROUTINE BMJDRV
315 !-----------------------------------------------------------------------
316 !XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
317 !-----------------------------------------------------------------------
318                           SUBROUTINE BMJ                                &
319 !-----------------------------------------------------------------------
320      & (ITIMESTEP,I,J,DTCNVC,LMH,SM,CLDEFI                              &
321      & ,DPRS,PRSMID,Q,T,PSFC,PT                                         &
322      & ,DQDT,DTDT,PCPCOL,LBOT,LTOP,LPBL                                 &
323      & ,CP,R,ELWV,ELIV,G,TFRZ,D608                                      &
324      & ,PRINT_DIAG                                                      &   
325      & ,IDS,IDE,JDS,JDE,KDS,KDE                                         &
326      & ,IMS,IME,JMS,JME,KMS,KME                                         &
327      & ,ITS,ITE,JTS,JTE,KTS,KTE)
328 !-----------------------------------------------------------------------
329       IMPLICIT NONE
330 !-----------------------------------------------------------------------
331       INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE                     &
332                            ,IMS,IME,JMS,JME,KMS,KME                     &
333                            ,ITS,ITE,JTS,JTE,KTS,KTE                     &
334                            ,I,J,ITIMESTEP
336       INTEGER,INTENT(IN) :: LMH,LPBL
338       INTEGER,INTENT(OUT) :: LBOT,LTOP
340       REAL,INTENT(IN) :: CP,D608,DTCNVC,ELIV,ELWV,G,PSFC,PT,R,SM,TFRZ
342       REAL,DIMENSION(KTS:KTE),INTENT(IN) :: DPRS,PRSMID,Q,T
344       REAL,INTENT(INOUT) :: CLDEFI,PCPCOL
346       REAL,DIMENSION(KTS:KTE),INTENT(INOUT) :: DQDT,DTDT
348 !-----------------------------------------------------------------------
349 !***  DEFINE LOCAL VARIABLES
350 !-----------------------------------------------------------------------
351 !                                                            
352       REAL,DIMENSION(KTS:KTE) :: APEK,APESK,EL,FPK                      &
353                                 ,PK,PSK,QK,QREFK,QSATK                  &
354                                 ,THERK,THEVRF,THSK                      &
355                                 ,THVMOD,THVREF,TK,TREFK
356       REAL,DIMENSION(KTS:KTE) :: APE,DIFQ,DIFT,THEE,THES,TREF
358       REAL,DIMENSION(KTS:KTE) :: CPE,CPEcnv,DTV,DTVcnv,THEScnv    !<-- CPE for shallow convection buoyancy check (24 Aug 2006)
360       LOGICAL :: DEEP,SHALLOW
362 !***  Begin debugging convection
363       LOGICAL :: PRINT_DIAG
364 !***  End debugging convection
366 !-----------------------------------------------------------------------
367 !***
368 !***  LOCAL SCALARS
369 !***
370 !-----------------------------------------------------------------------
371       REAL :: APEKL,APEKXX,APEKXY,APES,APESTS                           &
372      &            ,AVRGT,AVRGTL,BQ,BQK,BQS00K,BQS10K                    &
373      &            ,CAPA,CUP,DEN,DENTPY,DEPMIN,DEPTH                     &
374      &            ,DEPWL,DHDT,DIFQL,DIFTL,DP,DPKL,DPLO,DPMIX,DPOT       &
375      &            ,DPUP,DQREF,DRHDP,DRHEAT,DSP                          &
376      &            ,DSP0,DSP0K,DSPB,DSPBK,DSPT,DSPTK                     &
377      &            ,DSQ,DST,DSTQ,DTHEM,DTDP,EFI                          &
378      &            ,FEFI,FFUP,FPRS,FPTK,HCORR                            &
379      &            ,OTSUM,P,P00K,P01K,P10K,P11K                          &
380      &            ,PART1,PART2,PART3,PBOT,PBOTFC,PBTK                   &
381      &            ,PK0,PKB,PKL,PKT,PKXXXX,PKXXXY                        &
382      &            ,PLMH,PELEVFC,PBTmx,plo,POTSUM,PP1,PPK,PRECK          &
383      &            ,PRESK,PSP,PSUM,PTHRS,PTOP,PTPK,PUP                   &
384      &            ,QBT,QKL,QNEW,QOTSUM,QQ1,QQK,QRFKL                    &
385      &            ,QRFTP,QSP,QSUM,QUP,RDP0T                             &
386      &            ,RDPSUM,RDTCNVC,RHH,RHL,RHMAX,ROTSUM,RTBAR,RHAVG      &
387      &            ,SM1,SMIX,SQ,SQK,SQS00K,SQS10K,STABDL,SUMDE,SUMDP     &
388      &            ,SUMDT,TAUK,TAUKSC,TCORR,THBT,THERKX,THERKY           &
389      &            ,THESP,THSKL,THTPK,THVMKL,TKL,TNEW                    &
390      &            ,TQ,TQK,TREFKX,TRFKL,trmlo,trmup,TSKL,tsp,TTH         &
391      &            ,TTHK,TUP                                             &
392      &            ,CAPEcnv,PSPcnv,THBTcnv,CAPEtrigr,CAPE                &
393      &            ,TLEV2,QSAT1,QSAT2,RHSHmax
395       INTEGER :: IQ,IQTB,IT,ITER,ITREFI,ITTB,ITTBK,KB,KNUMH,KNUML       &
396      &          ,L,L0,L0M1,LB,LBM1,LCOR,LPT1                            &
397      &          ,LQM,LSHU,LTP1,LTP2,LTSH, LBOTcnv,LTOPcnv,LMID
398 !-----------------------------------------------------------------------
400       REAL,PARAMETER :: DSPBSL=DSPBFL*FSL,DSP0SL=DSP0FL*FSL             &
401      &                 ,DSPTSL=DSPTFL*FSL                               &
402      &                 ,DSPBSS=DSPBFS*FSS,DSP0SS=DSP0FS*FSS             &
403      &                 ,DSPTSS=DSPTFS*FSS
405       REAL,PARAMETER :: ELEVFC=0.6,STEFI=1.
407       REAL,PARAMETER :: SLOPBL=(DSPBFL-DSPBSL)/(1.-EFIMN)               &
408      &                 ,SLOP0L=(DSP0FL-DSP0SL)/(1.-EFIMN)               &
409      &                 ,SLOPTL=(DSPTFL-DSPTSL)/(1.-EFIMN)               &
410      &                 ,SLOPBS=(DSPBFS-DSPBSS)/(1.-EFIMN)               &
411      &                 ,SLOP0S=(DSP0FS-DSP0SS)/(1.-EFIMN)               &
412      &                 ,SLOPTS=(DSPTFS-DSPTSS)/(1.-EFIMN)               &
413      &                 ,SLOPST=(STABDF-STABDS)/(1.-EFIMN)               &
414      &                 ,SLOPE=(1.-EFMNT)/(1.-EFIMN)
416       REAL :: A23M4L,CPRLG,ELOCP,RCP,QWAT
417 !-----------------------------------------------------------------------
418 !***********************************************************************
419 !-----------------------------------------------------------------------
420       CAPA=R/CP
421       CPRLG=CP/(ROW*G*ELWV)
422       ELOCP=ELIWV/CP
423       RCP=1./CP
424       A23M4L=A2*(A3-A4)*ELWV
425       RDTCNVC=1./DTCNVC
426       DEPMIN=PSH*PSFC*RSFCP
428       DEEP=.FALSE.
429       SHALLOW=.FALSE.
431       DSP0=0.
432       DSPB=0.
433       DSPT=0.
434 !-----------------------------------------------------------------------
435       TAUK=DTCNVC/TREL
436       TAUKSC=DTCNVC/(1.0*TREL) 
437 !-----------------------------------------------------------------------
438 !-----------------------------PREPARATIONS------------------------------
439 !-----------------------------------------------------------------------
440       LBOT=LMH
441       PCPCOL=0.
442       TREF(KTS)=T(KTS)
444       DO L=KTS,LMH
445         APESTS=PRSMID(L)
446         APE(L)=(1.E5/APESTS)**CAPA
447         CPEcnv(L)=0.
448         DTVcnv(L)=0.
449         THEScnv(L)=0.
450       ENDDO
452 !-----------------------------------------------------------------------
453 !----------------SEARCH FOR MAXIMUM BUOYANCY LEVEL----------------------
454 !-----------------------------------------------------------------------
456       PLMH=PRSMID(LMH)
457       PELEVFC=PLMH*ELEVFC
458       PBTmx=PRSMID(LMH)-PONE
459       CAPEcnv=0.
460       PSPcnv=0.
461       THBTcnv=0.
462       LBOTcnv=LBOT
463       LTOPcnv=LBOT
465 !-----------------------------------------------------------------------
466 !----------------TRIAL MAXIMUM BUOYANCY LEVEL VARIABLES-----------------
467 !-----------------------------------------------------------------------
469       max_buoy_loop: DO KB=LMH,1,-1
471 !-----------------------------------------------------------------------
473         PKL=PRSMID(KB)
474 !       IF (PKL<PELEVFC .OR. T(KB)<=TFRZ) EXIT
475         IF (PKL<PELEVFC) EXIT
476         LBOT=LMH
477         LTOP=LMH
479 !-----------------------------------------------------------------------
480 !***  SEARCH OVER A SCALED DEPTH IN FINDING THE PARCEL
481 !***  WITH THE MAX THETA-E 
482 !-----------------------------------------------------------------------
484         QBT=Q(KB)
485         THBT=T(KB)*APE(KB)
486         TTH=(THBT-THL)*RDTH
487         QQ1=TTH-AINT(TTH)
488         ITTB=INT(TTH)+1
489 !----------------KEEPING INDICES WITHIN THE TABLE-----------------------
490         IF(ITTB<1)THEN
491           ITTB=1
492           QQ1=0.
493         ELSE IF(ITTB>=JTB)THEN
494           ITTB=JTB-1
495           QQ1=0.
496         ENDIF
497 !--------------BASE AND SCALING FACTOR FOR SPEC. HUMIDITY---------------
498         ITTBK=ITTB
499         BQS00K=QS0(ITTBK)
500         SQS00K=SQS(ITTBK)
501         BQS10K=QS0(ITTBK+1)
502         SQS10K=SQS(ITTBK+1)
503 !--------------SCALING SPEC. HUMIDITY & TABLE INDEX---------------------
504         BQ=(BQS10K-BQS00K)*QQ1+BQS00K
505         SQ=(SQS10K-SQS00K)*QQ1+SQS00K
506         TQ=(QBT-BQ)/SQ*RDQ
507         PP1=TQ-AINT(TQ)
508         IQTB=INT(TQ)+1
509 !----------------KEEPING INDICES WITHIN THE TABLE-----------------------
510         IF(IQTB<1)THEN
511           IQTB=1
512           PP1=0.
513         ELSE IF(IQTB>=ITB)THEN
514           IQTB=ITB-1
515           PP1=0.
516         ENDIF
517 !--------------SATURATION PRESSURE AT FOUR SURROUNDING TABLE PTS.-------
518         IQ=IQTB
519         IT=ITTB
520         P00K=PTBL(IQ  ,IT  )
521         P10K=PTBL(IQ+1,IT  )
522         P01K=PTBL(IQ  ,IT+1)
523         P11K=PTBL(IQ+1,IT+1)
525 !--------------SATURATION POINT VARIABLES AT THE BOTTOM-----------------
527         PSP=P00K+(P10K-P00K)*PP1+(P01K-P00K)*QQ1                        &
528      &          +(P00K-P10K-P01K+P11K)*PP1*QQ1
529         APES=(1.E5/PSP)**CAPA
530         THESP=THBT*EXP(ELOCP*QBT*APES/THBT)
532 !-----------------------------------------------------------------------
533 !-----------CHOOSE CLOUD BASE AS MODEL LEVEL JUST BELOW PSP-------------
534 !-----------------------------------------------------------------------
536         DO L=KTS,LMH-1
537           P=PRSMID(L)
538           IF(P<PSP.AND.P>=PQM)LBOT=L+1
539         ENDDO
540 !***
541 !*** WARNING: LBOT MUST NOT BE > LMH-1 IN SHALLOW CONVECTION
542 !*** MAKE SURE CLOUD BASE IS AT LEAST PONE ABOVE THE SURFACE
543 !***
544         PBOT=PRSMID(LBOT)
545         IF(PBOT>=PBTmx.OR.LBOT>=LMH)THEN
546           DO L=KTS,LMH-1
547             P=PRSMID(L)
548             IF(P<PBTmx)LBOT=L
549           ENDDO
550           PBOT=PRSMID(LBOT)
551         ENDIF 
553 !-----------------------------------------------------------------------
554 !----------------CLOUD TOP COMPUTATION----------------------------------
555 !-----------------------------------------------------------------------
557         LTOP=LBOT
558         PTOP=PBOT
559         DO L=LMH,KTS,-1
560           THES(L)=THESP
561         ENDDO
563 !-----------------------------------------------------------------------
564 !### BEGIN: ###########  WARNING  ###########  WARNING  ###########
565 !-----------------------------------------------------------------------
567 !### IMPORTANT: THIS "DO KB=LMH,1,-1" loop must be broken up into two
568 !    separate loops in order for entrainment as programmed below to work
569 !    properly.  
571 !---------------  ENTRAINMENT DURING PARCEL ASCENT  --------------------
573 !        DO L=LMH,KB,-1
574 !          THES(L)=THESP
575 !        ENDDO
577 !        DO L=KTS,LMH
578 !          THEE(L)=THES(L)
579 !        ENDDO
581 !        FEFI=(CLDEFI-EFIMN)*SLOPE+EFMNT
582 !        FFUP=FUP/(FEFI*FEFI)
584 !        IF(PBOT>ENPLO)THEN
585 !          FPRS=1.
586 !        ELSEIF(PBOT>ENPUP)THEN
587 !          FPRS=(PBOT-ENPUP)*RENDP
588 !        ELSE
589 !          FPRS=0.
590 !        ENDIF
592 !        FFUP=FFUP*FPRS*FPRS*0.5
593 !        DPUP=DPRS(KB)
595 !        DO L=KB-1,KTS,-1
596 !          DPLO=DPUP
597 !          DPUP=DPRS(L)
599 !          THES(L)=((-FFUP*DPLO+1.)*THES(L+1)                           &
600 !     &            +(THEE(L)*DPUP+THEE(L+1)*DPLO)*FFUP)                 &
601 !     &           /(FFUP*DPUP+1.)
602 !      ENDDO
604 !-----------------------------------------------------------------------
605 !### END: ###########  WARNING  ###########  WARNING  ###########
606 !-----------------------------------------------------------------------
608 !-----------------------------------------------------------------------
609 !!***  COMPUTE PARCEL TEMPERATURE ALONG THE ASCENT TRAJECTORY
610 !!***  SCALING PRESSURE & TT TABLE INDEX.
611 !-----------------------------------------------------------------------
614 !       DO L=LMH,KTS,-1
616 !         PRESK=PRSMID(L)
618 !         IF(PRESK<PLQ)THEN
619 !           CALL TTBLEX(ITB,JTB,PL,PRESK,RDP,RDTHE                      &
620 !     &                ,STHE,THE0,THES(L),TTBL,TREF(L))
621 !         ELSE
622 !           CALL TTBLEX(ITBQ,JTBQ,PLQ,PRESK,RDPQ,RDTHEQ                 &
623 !     &                ,STHEQ,THE0Q,THES(L),TTBLQ,TREF(L))
624 !         ENDIF
626 !       ENDDO
628 !!-----------------------------------------------------------------------
629 !!----------------BUOYANCY CHECK-----------------------------------------
630 !!-----------------------------------------------------------------------
632 !       DO L=LMH,KTS,-1
633 !         IF(TREF(L)>T(L)-DTTOP)LTOP=L
634 !       ENDDO
636 !!***  CLOUD TOP PRESSURE
638 !       PTOP=PRSMID(LTOP)
640 !------------------FIRST ENTROPY CHECK----------------------------------
642         DO L=KTS,LMH
643           CPE(L)=0.
644           DTV(L)=0.
645         ENDDO
646 !-----------------------------------------------------------------------
647 !       lbot_ltop: IF(LBOT>LTOP)THEN
648 !-----------------------------------------------------------------------
649 !-- Begin: Buoyancy check including deep convection (24 Aug 2006) 
650 !-----------------------------------------------------------------------
651           DENTPY=0.
652           L=KB
653           PLO=PRSMID(L)
654           TRMLO=0.
655           CAPEtrigr=DTPtrigr/T(LBOT)
657 !--- Below cloud base
659           IF(KB>LBOT) THEN
660             DO L=KB-1,LBOT+1,-1
661               PUP=PRSMID(L)
662               TUP=THBT/APE(L)
663               DP=PLO-PUP
664               TRMUP=(TUP*(QBT*0.608+1.)                                 &
665      &            -T(L)*(Q(L)*0.608+1.))*0.5                            &
666      &             /(T(L)*(Q(L)*0.608+1.))
667               DTV(L)=TRMLO+TRMUP
668               DENTPY=DTV(L)*DP+DENTPY
669               CPE(L)=DENTPY
670               IF (DENTPY < CAPEtrigr) GO TO 170
671               PLO=PUP
672               TRMLO=TRMUP
673             ENDDO
674           ELSE
675             L=LBOT+1
676             PLO=PRSMID(L)
677             TUP=THBT/APE(L)
678             TRMLO=(TUP*(QBT*0.608+1.)                                   &
679      &            -T(L)*(Q(L)*0.608+1.))*0.5                            &
680      &             /(T(L)*(Q(L)*0.608+1.))
681           ENDIF  ! IF(KB>LBOT) THEN
683 !--- At cloud base
685           L=LBOT
686           PUP=PSP
687           TUP=THBT/APES
688           TSP=(T(L+1)-T(L))/(PLO-PBOT)                                  &
689      &       *(PUP-PBOT)+T(L)
690           QSP=(Q(L+1)-Q(L))/(PLO-PBOT)                                  &
691      &       *(PUP-PBOT)+Q(L)
692           DP=PLO-PUP
693           TRMUP=(TUP*(QBT*0.608+1.)                                     &
694      &          -TSP*(QSP*0.608+1.))*0.5                                &
695      &         /(TSP*(QSP*0.608+1.))
696           DTV(L)=TRMLO+TRMUP
697           DENTPY=DTV(L)*DP+DENTPY
698           CPE(L)=DENTPY
699           DTV(L)=DTV(L)*DP
700           PLO=PUP
701           TRMLO=TRMUP
702           PUP=PRSMID(L)
704 !--- Calculate updraft temperature along moist adiabat (TUP)
706           IF(PUP<PLQ)THEN
707             CALL TTBLEX(ITB,JTB,PL,PUP,RDP,RDTHE                        &
708      &                 ,STHE,THE0,THES(L),TTBL,TUP)
709           ELSE
710             CALL TTBLEX(ITBQ,JTBQ,PLQ,PUP,RDPQ,RDTHEQ                   &
711      &                 ,STHEQ,THE0Q,THES(L),TTBLQ,TUP)
712           ENDIF
714           QUP=PQ0/PUP*EXP(A2*(TUP-A3)/(TUP-A4))
715           QWAT=QBT-QUP  !-- Water loading effects, reversible adiabat
716           DP=PLO-PUP
717           TRMUP=(TUP*(QUP*0.608+1.-QWAT)                                &
718      &          -T(L)*(Q(L)*0.608+1.))*0.5                              &
719      &         /(T(L)*(Q(L)*0.608+1.))
720           DENTPY=(TRMLO+TRMUP)*DP+DENTPY
721           CPE(L)=DENTPY
722           DTV(L)=(DTV(L)+(TRMLO+TRMUP)*DP)/(PRSMID(LBOT+1)-PRSMID(LBOT))
724           IF (DENTPY < CAPEtrigr) GO TO 170
726           PLO=PUP
727           TRMLO=TRMUP
729 !-----------------------------------------------------------------------
730 !--- In cloud above cloud base
731 !-----------------------------------------------------------------------
733           DO L=LBOT-1,KTS,-1
734             PUP=PRSMID(L)
736 !--- Calculate updraft temperature along moist adiabat (TUP)
738             IF(PUP<PLQ)THEN
739               CALL TTBLEX(ITB,JTB,PL,PUP,RDP,RDTHE                      &
740        &                 ,STHE,THE0,THES(L),TTBL,TUP)
741             ELSE
742               CALL TTBLEX(ITBQ,JTBQ,PLQ,PUP,RDPQ,RDTHEQ                 &
743        &                 ,STHEQ,THE0Q,THES(L),TTBLQ,TUP)
744             ENDIF
746             QUP=PQ0/PUP*EXP(A2*(TUP-A3)/(TUP-A4))
747             QWAT=QBT-QUP  !-- Water loading effects, reversible adiabat
748             DP=PLO-PUP
749             TRMUP=(TUP*(QUP*0.608+1.-QWAT)                              &
750      &            -T(L)*(Q(L)*0.608+1.))*0.5                            &
751      &           /(T(L)*(Q(L)*0.608+1.))
752             DTV(L)=TRMLO+TRMUP
753             DENTPY=DTV(L)*DP+DENTPY
754             CPE(L)=DENTPY
756             IF (DENTPY < CAPEtrigr) GO TO 170
758             PLO=PUP
759             TRMLO=TRMUP
760           ENDDO
762 !-----------------------------------------------------------------------
764 170       LTP1=KB
765           CAPE=0.
767 !-----------------------------------------------------------------------
768 !--- Cloud top level (LTOP) is located where CAPE is a maximum
769 !--- Exit cloud-top search if CAPE < CAPEtrigr
770 !-----------------------------------------------------------------------
772           DO L=KB,KTS,-1
773             IF (CPE(L) < CAPEtrigr) THEN
774               EXIT
775             ELSE IF (CPE(L) > CAPE) THEN
776               LTP1=L
777               CAPE=CPE(L)
778             ENDIF
779           ENDDO      !-- End DO L=KB,KTS,-1
781           LTOP=MIN(LTP1,LBOT)
783 !-----------------------------------------------------------------------
784 !--------------- CHECK FOR MAXIMUM INSTABILITY  ------------------------
785 !-----------------------------------------------------------------------
786           IF(CAPE > CAPEcnv) THEN
787             CAPEcnv=CAPE
788             PSPcnv=PSP
789             THBTcnv=THBT
790             LBOTcnv=LBOT
791             LTOPcnv=LTOP
792             DO L=LMH,KTS,-1
793               CPEcnv(L)=CPE(L)
794               DTVcnv(L)=DTV(L)
795               THEScnv(L)=THES(L)
796             ENDDO
797           ENDIF    ! End IF(CAPE > CAPEcnv) THEN
799 !       ENDIF lbot_ltop
801 !-----------------------------------------------------------------------
803       ENDDO max_buoy_loop
805 !-----------------------------------------------------------------------
806 !------------------------  MAXIMUM INSTABILITY  ------------------------
807 !-----------------------------------------------------------------------
809       IF(CAPEcnv > 0.) THEN
810         PSP=PSPcnv
811         THBT=THBTcnv
812         LBOT=LBOTcnv
813         LTOP=LTOPcnv
814         PBOT=PRSMID(LBOT)
815         PTOP=PRSMID(LTOP)
817         DO L=LMH,KTS,-1
818           CPE(L)=CPEcnv(L)
819           DTV(L)=DTVcnv(L)
820           THES(L)=THEScnv(L)
821         ENDDO
823       ENDIF
825 !-----------------------------------------------------------------------
826 !-----  Quick exit if cloud is too thin or no CAPE is present  ---------
827 !-----------------------------------------------------------------------
829       IF(PTOP>PBOT-PNO.OR.LTOP>LBOT-2.OR.CAPEcnv<=0.)THEN
830         LBOT=0
831         LTOP=KTE
832         PBOT=PRSMID(LMH)
833         PTOP=PBOT
834         CLDEFI=AVGEFI*SM+STEFI*(1.-SM)
835         GO TO 800
836       ENDIF
838 !***  DEPTH OF CLOUD REQUIRED TO MAKE THE POINT A DEEP CONVECTION POINT
839 !***  IS A SCALED VALUE OF PSFC.
841       DEPTH=PBOT-PTOP
843       IF(DEPTH>=DEPMIN) THEN
844         DEEP=.TRUE.
845       ELSE
846         SHALLOW=.TRUE.
847         GO TO 600
848       ENDIF
850 !-----------------------------------------------------------------------
851 !DCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD
852 !DCDCDCDCDCDCDCDCDCDCDC    DEEP CONVECTION   DCDCDCDCDCDCDCDCDCDCDCDCDCD
853 !DCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD
854 !-----------------------------------------------------------------------
856   300 CONTINUE
858       LB =LBOT
859       EFI=CLDEFI
860 !-----------------------------------------------------------------------
861 !--------------INITIALIZE VARIABLES IN THE CONVECTIVE COLUMN------------
862 !-----------------------------------------------------------------------
863 !***
864 !***  ONE SHOULD NOTE THAT THE VALUES ASSIGNED TO THE ARRAY TREFK
865 !***  IN THE FOLLOWING LOOP ARE REALLY ONLY RELEVANT IN ANCHORING THE
866 !***  REFERENCE TEMPERATURE PROFILE AT LEVEL LB.  WHEN BUILDING THE
867 !***  REFERENCE PROFILE FROM CLOUD BASE, THEN ASSIGNING THE
868 !***  AMBIENT TEMPERATURE TO TREFK IS ACCEPTABLE.  HOWEVER, WHEN
869 !***  BUILDING THE REFERENCE PROFILE FROM SOME OTHER LEVEL (SUCH AS
870 !***  ONE LEVEL ABOVE THE GROUND), THEN TREFK SHOULD BE FILLED WITH
871 !***  THE TEMPERATURES IN TREF(L) WHICH ARE THE TEMPERATURES OF
872 !***  THE MOIST ADIABAT THROUGH CLOUD BASE.  BY THE TIME THE LINE 
873 !***  NUMBERED 450 HAS BEEN REACHED, TREFK ACTUALLY DOES HOLD THE
874 !***  REFERENCE TEMPERATURE PROFILE.
875 !***
876       DO L=KTS,LMH
877         DIFT  (L)=0.
878         DIFQ  (L)=0.
879         TKL      =T(L)
880         TK    (L)=TKL
881         TREFK (L)=TKL
882         QKL      =Q(L)
883         QK    (L)=QKL
884         QREFK (L)=QKL
885         PKL      =PRSMID(L)
886         PK    (L)=PKL
887         PSK   (L)=PKL
888         APEKL    =APE(L)
889         APEK  (L)=APEKL
891 !--- Calculate temperature along moist adiabat (TREF)
893         IF(PKL<PLQ)THEN
894           CALL TTBLEX(ITB,JTB,PL,PKL,RDP,RDTHE                          &
895      &               ,STHE,THE0,THES(L),TTBL,TREF(L))
896         ELSE
897           CALL TTBLEX(ITBQ,JTBQ,PLQ,PKL,RDPQ,RDTHEQ                     &
898      &               ,STHEQ,THE0Q,THES(L),TTBLQ,TREF(L))
899         ENDIF
900         THERK (L)=TREF(L)*APEKL
901       ENDDO
903 !------------DEEP CONVECTION REFERENCE TEMPERATURE PROFILE------------
905       LTP1=LTOP+1
906       LBM1=LB-1
907       PKB=PK(LB)
908       PKT=PK(LTOP)
909       STABDL=(EFI-EFIMN)*SLOPST+STABDS
911 !------------TEMPERATURE REFERENCE PROFILE BELOW FREEZING LEVEL-------
913       EL(LB) = ELWV    
914       L0=LB
915       PK0=PK(LB)
916       TREFKX=TREFK(LB)
917       THERKX=THERK(LB)
918       APEKXX=APEK(LB)
919       THERKY=THERK(LBM1)
920       APEKXY=APEK(LBM1)
922       DO L=LBM1,LTOP,-1
923         IF(T(L+1)<TFRZ)GO TO 430
924         TREFKX=((THERKY-THERKX)*STABDL                                  &
925      &          +TREFKX*APEKXX)/APEKXY
926         TREFK(L)=TREFKX
927         EL(L)=ELWV
928         APEKXX=APEKXY
929         THERKX=THERKY
930         APEKXY=APEK(L-1)
931         THERKY=THERK(L-1)
932         L0=L
933         PK0=PK(L0)
934       ENDDO
936 !--------------FREEZING LEVEL AT OR ABOVE THE CLOUD TOP-----------------
938       GO TO 450
940 !--------------TEMPERATURE REFERENCE PROFILE ABOVE FREEZING LEVEL-------
942   430 L0M1=L0-1
943       RDP0T=1./(PK0-PKT)
944       DTHEM=THERK(L0)-TREFK(L0)*APEK(L0)
946       DO L=LTOP,L0M1
947         TREFK(L)=(THERK(L)-(PK(L)-PKT)*DTHEM*RDP0T)/APEK(L)
948         EL(L)=ELWV !ELIV
949       ENDDO
951 !-----------------------------------------------------------------------
952 !--------------DEEP CONVECTION REFERENCE HUMIDITY PROFILE---------------
953 !-----------------------------------------------------------------------
955 !***  DEPWL IS THE PRESSURE DIFFERENCE BETWEEN CLOUD BASE AND
956 !***  THE FREEZING LEVEL
958   450 CONTINUE
959       DEPWL=PKB-PK0
960       DEPTH=PFRZ*PSFC*RSFCP
961       SM1=1.-SM
962       PBOTFC=1.
964 !-------------FIRST ADJUSTMENT OF TEMPERATURE PROFILE-------------------
966 !      SUMDT=0.
967 !      SUMDP=0.
969 !      DO L=LTOP,LB
970 !        SUMDT=(TK(L)-TREFK(L))*DPRS(L)+SUMDT
971 !        SUMDP=SUMDP+DPRS(L)
972 !      ENDDO
974 !      TCORR=SUMDT/SUMDP
976 !      DO L=LTOP,LB
977 !        TREFK(L)=TREFK(L)+TCORR
978 !      ENDDO
980 !-----------------------------------------------------------------------
981 !--------------- ITERATION LOOP FOR CLOUD EFFICIENCY -------------------
982 !-----------------------------------------------------------------------
984       cloud_efficiency : DO ITREFI=1,ITREFI_MAX  
986 !-----------------------------------------------------------------------
987         DSPBK=((EFI-EFIMN)*SLOPBS+DSPBSS*PBOTFC)*SM                     &
988      &       +((EFI-EFIMN)*SLOPBL+DSPBSL*PBOTFC)*SM1
989         DSP0K=((EFI-EFIMN)*SLOP0S+DSP0SS*PBOTFC)*SM                     &
990      &       +((EFI-EFIMN)*SLOP0L+DSP0SL*PBOTFC)*SM1
991         DSPTK=((EFI-EFIMN)*SLOPTS+DSPTSS*PBOTFC)*SM                     &
992      &       +((EFI-EFIMN)*SLOPTL+DSPTSL*PBOTFC)*SM1
994 !-----------------------------------------------------------------------
996         DO L=LTOP,LB
998 !***
999 !***  SATURATION PRESSURE DIFFERENCE
1000 !***
1001           IF(DEPWL>=DEPTH)THEN
1002             IF(L<L0)THEN
1003               DSP=((PK0-PK(L))*DSPTK+(PK(L)-PKT)*DSP0K)/(PK0-PKT)
1004             ELSE
1005               DSP=((PKB-PK(L))*DSP0K+(PK(L)-PK0)*DSPBK)/(PKB-PK0)
1006             ENDIF
1007           ELSE
1008             DSP=DSP0K
1009             IF(L<L0)THEN
1010               DSP=((PK0-PK(L))*DSPTK+(PK(L)-PKT)*DSP0K)/(PK0-PKT)
1011             ENDIF
1012           ENDIF
1013 !***
1014 !***  HUMIDITY PROFILE
1015 !***
1016           IF(PK(L)>PQM)THEN
1017             PSK(L)=PK(L)+DSP
1018             APESK(L)=(1.E5/PSK(L))**CAPA
1019             THSK(L)=TREFK(L)*APEK(L)
1020             QREFK(L)=PQ0/PSK(L)*EXP(A2*(THSK(L)-A3*APESK(L))            &
1021      &                                /(THSK(L)-A4*APESK(L)))
1022           ELSE
1023             QREFK(L)=QK(L)
1024           ENDIF
1026         ENDDO
1027 !-----------------------------------------------------------------------
1028 !***
1029 !***  ENTHALPY CONSERVATION INTEGRAL
1030 !***
1031 !-----------------------------------------------------------------------
1032         enthalpy_conservation : DO ITER=1,2
1034           SUMDE=0.
1035           SUMDP=0.
1037           DO L=LTOP,LB
1038             SUMDE=((TK(L)-TREFK(L))*CP+(QK(L)-QREFK(L))*EL(L))*DPRS(L)  &
1039      &            +SUMDE
1040             SUMDP=SUMDP+DPRS(L)
1041           ENDDO
1043           HCORR=SUMDE/(SUMDP-DPRS(LTOP))
1044           LCOR=LTOP+1
1045 !***
1046 !***  FIND LQM
1047 !***
1048           LQM=1
1049           DO L=KTS,LB
1050             IF(PK(L)<=PQM)LQM=L
1051           ENDDO
1052 !***
1053 !***  ABOVE LQM CORRECT TEMPERATURE ONLY
1054 !***
1055           IF(LCOR<=LQM)THEN
1056             DO L=LCOR,LQM
1057               TREFK(L)=TREFK(L)+HCORR*RCP
1058             ENDDO
1059             LCOR=LQM+1
1060           ENDIF
1061 !***
1062 !***  BELOW LQM CORRECT BOTH TEMPERATURE AND MOISTURE
1063 !***
1064           DO L=LCOR,LB
1065             TSKL=TREFK(L)*APEK(L)/APESK(L)
1066             DHDT=QREFK(L)*A23M4L/(TSKL-A4)**2+CP
1067             TREFK(L)=HCORR/DHDT+TREFK(L)
1068             THSKL=TREFK(L)*APEK(L)
1069             QREFK(L)=PQ0/PSK(L)*EXP(A2*(THSKL-A3*APESK(L))              &
1070      &                                /(THSKL-A4*APESK(L)))
1071           ENDDO
1073         ENDDO  enthalpy_conservation
1074 !-----------------------------------------------------------------------
1076 !***  HEATING, MOISTENING, PRECIPITATION
1078 !-----------------------------------------------------------------------
1079         AVRGT=0.
1080         PRECK=0.
1081         DSQ=0.
1082         DST=0.
1084         DO L=LTOP,LB
1085           TKL=TK(L)
1086           DIFTL=(TREFK(L)-TKL  )*TAUK
1087           DIFQL=(QREFK(L)-QK(L))*TAUK
1088           AVRGTL=(TKL+TKL+DIFTL)
1089           DPOT=DPRS(L)/AVRGTL
1090           DST=DIFTL*DPOT+DST
1091           DSQ=DIFQL*EL(L)*DPOT+DSQ
1092           AVRGT=AVRGTL*DPRS(L)+AVRGT
1093           PRECK=DIFTL*DPRS(L)+PRECK
1094           DIFT(L)=DIFTL
1095           DIFQ(L)=DIFQL
1096         ENDDO
1098         DST=(DST+DST)*CP
1099         DSQ=DSQ+DSQ
1100         DENTPY=DST+DSQ
1101         AVRGT=AVRGT/(SUMDP+SUMDP)
1103 !        DRHEAT=PRECK*CP/AVRGT
1104         DRHEAT=(PRECK*SM+MAX(1.E-7,PRECK)*(1.-SM))*CP/AVRGT !As in Eta!
1105         DRHEAT=MAX(DRHEAT,1.E-20)
1106         EFI=EFIFC*DENTPY/DRHEAT
1107 !-----------------------------------------------------------------------
1108         EFI=MIN(EFI,1.)
1109         EFI=MAX(EFI,EFIMN)
1110 !-----------------------------------------------------------------------
1112       ENDDO  cloud_efficiency
1114 !-----------------------------------------------------------------------
1116 !-----------------------------------------------------------------------
1117 !---------------------- DEEP CONVECTION --------------------------------
1118 !-----------------------------------------------------------------------
1120       IF(DENTPY>=EPSNTP.AND.PRECK>EPSPR)THEN
1122         CLDEFI=EFI
1123         FEFI=EFMNT+SLOPE*(EFI-EFIMN)
1124         FEFI=(DENTPY-EPSNTP)*FEFI/DENTPY
1125         PRECK=PRECK*FEFI
1127 !***  UPDATE PRECIPITATION AND TENDENCIES OF TEMPERATURE AND MOISTURE
1129         CUP=PRECK*CPRLG
1130         PCPCOL=CUP
1132         DO L=LTOP,LB
1133           DTDT(L)=DIFT(L)*FEFI*RDTCNVC
1134           DQDT(L)=DIFQ(L)*FEFI*RDTCNVC
1135         ENDDO
1137       ELSE
1139 !-----------------------------------------------------------------------
1140 !***  REDUCE THE CLOUD TOP
1141 !-----------------------------------------------------------------------
1143 !        LTOP=LTOP+3
1144 !        PTOP=PRSMID(LTOP)
1145 !        DEPMIN=PSH*PSFC*RSFCP
1146 !        DEPTH=PBOT-PTOP
1147 !***
1148 !***  ITERATE DEEP CONVECTION PROCEDURE IF NEEDED
1149 !***
1150 !        IF(DEPTH>=DEPMIN)THEN
1151 !          GO TO 300
1152 !        ENDIF
1154 !        CLDEFI=AVGEFI
1155          CLDEFI=EFIMN*SM+STEFI*(1.-SM)
1156 !***
1157 !***  SEARCH FOR SHALLOW CLOUD TOP
1158 !***
1159 !        LTSH=LBOT
1160 !        LBM1=LBOT-1
1161 !        PBTK=PK(LBOT)
1162 !        DEPMIN=PSH*PSFC*RSFCP
1163 !        PTPK=PBTK-DEPMIN
1164         PTPK=MAX(PSHU, PK(LBOT)-DEPMIN)
1165 !***
1166 !***  CLOUD TOP IS THE LEVEL JUST BELOW PBTK-PSH or JUST BELOW PSHU
1167 !***
1168         DO L=KTS,LMH
1169           IF(PK(L)<=PTPK)LTOP=L+1
1170         ENDDO
1172 !        PTPK=PK(LTOP)
1173 !!***
1174 !!***  HIGHEST LEVEL ALLOWED IS LEVEL JUST BELOW PSHU
1175 !!***
1176 !        IF(PTPK<=PSHU)THEN
1178 !          DO L=KTS,LMH
1179 !            IF(PK(L)<=PSHU)LSHU=L+1
1180 !          ENDDO
1182 !          LTOP=LSHU
1183 !          PTPK=PK(LTOP)
1184 !        ENDIF
1186 !        if(ltop>=lbot)then
1187 !!!!!!     lbot=0
1188 !          ltop=lmh
1189 !!!!!!     pbot=pk(lbot)
1190 !          ptop=pk(ltop)
1191 !          pbot=ptop
1192 !          go to 600
1193 !        endif
1195 !        LTP1=LTOP+1
1196 !        LTP2=LTOP+2
1198 !        DO L=LTOP,LBOT
1199 !          QSATK(L)=PQ0/PK(L)*EXP(A2*(TK(L)-A3)/(TK(L)-A4))
1200 !        ENDDO
1202 !        RHH=QK(LTOP)/QSATK(LTOP)
1203 !        RHMAX=0.
1204 !        LTSH=LTOP
1206 !        DO L=LTP1,LBM1
1207 !          RHL=QK(L)/QSATK(L)
1208 !          DRHDP=(RHH-RHL)/(PK(L-1)-PK(L))
1210 !          IF(DRHDP>RHMAX)THEN
1211 !            LTSH=L-1
1212 !            RHMAX=DRHDP
1213 !          ENDIF
1215 !          RHH=RHL
1216 !        ENDDO
1218 !-----------------------------------------------------------------------
1219 !-- Make shallow cloud top a function of virtual temperature excess (DTV)
1220 !-----------------------------------------------------------------------
1222         LTP1=LBOT
1223         DO L=LBOT-1,LTOP,-1
1224           IF (DTV(L) > 0.) THEN
1225             LTP1=L
1226           ELSE
1227             EXIT
1228           ENDIF
1229         ENDDO
1230         LTOP=MIN(LTP1,LBOT)
1231 !***
1232 !***  CLOUD MUST BE AT LEAST TWO LAYERS THICK
1233 !***
1234 !        IF(LBOT-LTOP<2)LTOP=LBOT-2  (eliminate this criterion)
1236 !-- End: Buoyancy check (24 Aug 2006)
1238         PTOP=PK(LTOP)
1239         SHALLOW=.TRUE.
1240         DEEP=.FALSE.
1242       ENDIF
1243 !DCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD
1244 !DCDCDCDCDCDCDC          END OF DEEP CONVECTION            DCDCDCDCDCDCD
1245 !DCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD
1247 !-----------------------------------------------------------------------
1248 !-----------------------------------------------------------------------
1249   600 CONTINUE
1250 !-----------------------------------------------------------------------
1251 !-----------------------------------------------------------------------
1253 !----------------GATHER SHALLOW CONVECTION POINTS-----------------------
1255 !      IF(PTOP<=PBOT-PNO.AND.LTOP<=LBOT-2)THEN
1256 !         DEPMIN=PSH*PSFC*RSFCP
1258 !!        if(lpbl<lbot)lbot=lpbl
1259 !!        if(lbot>lmh-1)lbot=lmh-1
1260 !!        pbot=prsmid(lbot)
1262 !         IF(PTOP+1.>=PBOT-DEPMIN)SHALLOW=.TRUE.
1263 !      ELSE
1264 !         LBOT=0
1265 !         LTOP=KTE
1266 !      ENDIF
1268 !***********************************************************************
1269 !-----------------------------------------------------------------------
1270 !***  Begin debugging convection
1271       IF(PRINT_DIAG)THEN
1272         WRITE(6,"(a,2i3,L2,3e12.4)")  &
1273              '{cu2a lbot,ltop,shallow,pbot,ptop,depmin = ' &
1274              ,lbot,ltop,shallow,pbot,ptop,depmin
1275       ENDIF
1276 !***  End debugging convection
1277 !-----------------------------------------------------------------------
1279       IF(.NOT.SHALLOW)GO TO 800
1281 !-----------------------------------------------------------------------
1282 !***********************************************************************
1283 !-----------------------------------------------------------------------
1284 !SCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCS
1285 !SCSCSCSCSCSCSC         SHALLOW CONVECTION          CSCSCSCSCSCSCSCSCSCS
1286 !SCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCS
1287 !-----------------------------------------------------------------------
1288       DO L=KTS,LMH
1289         TKL      =T(L)
1290         TK   (L) =TKL
1291         TREFK(L) =TKL
1292         QKL      =Q(L)
1293         QK   (L) =QKL
1294         QREFK(L) =QKL
1295         PKL      =PRSMID(L)
1296         PK   (L) =PKL
1297         QSATK(L) =PQ0/PK(L)*EXP(A2*(TK(L)-A3)/(TK(L)-A4))
1298         APEKL    =APE(L)
1299         APEK (L) =APEKL
1300         THVMKL   =TKL*APEKL*(QKL*D608+1.)
1301         THVREF(L)=THVMKL
1303 !        IF(TKL>=TFRZ)THEN
1304           EL(L)=ELWV
1305 !        ELSE
1306 !          EL(L)=ELIV
1307 !        ENDIF
1308       ENDDO
1310 !-----------------------------------------------------------------------
1311 !-- Begin: Raise cloud top if avg RH>RHSHmax and CAPE>0
1312 !   RHSHmax=RH at cloud base associated with a DSP of PONE
1313 !-----------------------------------------------------------------------
1315       TLEV2=T(LBOT)*((PK(LBOT)-PONE)/PK(LBOT))**CAPA
1316       QSAT1=PQ0/PK(LBOT)*EXP(A2*(T(LBOT)-A3)/(TK(LBOT)-A4))
1317       QSAT2=PQ0/(PK(LBOT)-PONE)*EXP(A2*(TLEV2-A3)/(TLEV2-A4))
1318       RHSHmax=QSAT2/QSAT1
1319       SUMDP=0.
1320       RHAVG=0.
1322       DO L=LBOT,LTOP,-1
1323         RHAVG=RHAVG+DPRS(L)*QK(L)/QSATK(L)
1324         SUMDP=SUMDP+DPRS(L)
1325       ENDDO
1327       IF (RHAVG/SUMDP > RHSHmax) THEN
1328         LTSH=LTOP
1329         DO L=LTOP-1,KTS,-1
1330           RHAVG=RHAVG+DPRS(L)*QK(L)/QSATK(L)
1331           SUMDP=SUMDP+DPRS(L)
1332           IF (CPE(L) > 0.) THEN
1333             LTSH=L
1334           ELSE
1335             EXIT
1336           ENDIF
1337           IF (RHAVG/SUMDP <= RHSHmax) EXIT
1338           IF (PK(L) <= PSHU) EXIT
1339         ENDDO
1340         LTOP=LTSH
1341       ENDIF
1343 !-- End: Raise cloud top if avg RH>RHSHmax and CAPE>0
1345 !---------------------------SHALLOW CLOUD TOP---------------------------
1346       LBM1=LBOT-1
1347       PTPK=PTOP
1348       LTP1=LTOP-1
1349       DEPTH=PBOT-PTOP
1350 !-----------------------------------------------------------------------
1351 !***  Begin debugging convection
1352       IF(PRINT_DIAG)THEN
1353         WRITE(6,"(a,4e12.4)") '{cu2b PBOT,PTOP,DEPTH,DEPMIN= ' &
1354              ,PBOT,PTOP,DEPTH,DEPMIN
1355       ENDIF
1356 !***  End debugging convection
1357 !-----------------------------------------------------------------------
1359 !BSF      IF(DEPTH<DEPMIN)THEN
1360 !BSF        GO TO 800
1361 !BSF      ENDIF
1362 !-----------------------------------------------------------------------
1363       IF(PTOP>PBOT-PNO.OR.LTOP>LBOT-2)THEN
1364         LBOT=0
1365 !!!     LTOP=LBOT
1366         LTOP=KTE
1367         PTOP=PBOT
1368         GO TO 800
1369       ENDIF
1371 !--------------SCALING POTENTIAL TEMPERATURE & TABLE INDEX AT TOP-------
1373       THTPK=T(LTP1)*APE(LTP1)
1375       TTHK=(THTPK-THL)*RDTH
1376       QQK =TTHK-AINT(TTHK)
1377       IT  =INT(TTHK)+1
1379       IF(IT<1)THEN
1380         IT=1
1381         QQK=0.
1382       ENDIF
1384       IF(IT>=JTB)THEN
1385         IT=JTB-1
1386         QQK=0.
1387       ENDIF
1389 !--------------BASE AND SCALING FACTOR FOR SPEC. HUMIDITY AT TOP--------
1391       BQS00K=QS0(IT)
1392       SQS00K=SQS(IT)
1393       BQS10K=QS0(IT+1)
1394       SQS10K=SQS(IT+1)
1396 !--------------SCALING SPEC. HUMIDITY & TABLE INDEX AT TOP--------------
1398       BQK=(BQS10K-BQS00K)*QQK+BQS00K
1399       SQK=(SQS10K-SQS00K)*QQK+SQS00K
1401 !     TQK=(Q(LTOP)-BQK)/SQK*RDQ
1402       TQK=(Q(LTP1)-BQK)/SQK*RDQ
1404       PPK=TQK-AINT(TQK)
1405       IQ =INT(TQK)+1
1407       IF(IQ<1)THEN
1408         IQ=1
1409         PPK=0.
1410       ENDIF
1412       IF(IQ>=ITB)THEN
1413         IQ=ITB-1
1414         PPK=0.
1415       ENDIF
1417 !----------------CLOUD TOP SATURATION POINT PRESSURE--------------------
1419       PART1=(PTBL(IQ+1,IT)-PTBL(IQ,IT))*PPK
1420       PART2=(PTBL(IQ,IT+1)-PTBL(IQ,IT))*QQK
1421       PART3=(PTBL(IQ  ,IT  )-PTBL(IQ+1,IT  )                            &
1422      &      -PTBL(IQ  ,IT+1)+PTBL(IQ+1,IT+1))*PPK*QQK
1423       PTPK=PTBL(IQ,IT)+PART1+PART2+PART3
1424 !-----------------------------------------------------------------------
1425       DPMIX=PTPK-PSP
1426       IF(ABS(DPMIX).LT.3000.)DPMIX=-3000.
1428 !----------------TEMPERATURE PROFILE SLOPE------------------------------
1430       SMIX=(THTPK-THBT)/DPMIX*STABS
1432       TREFKX=TREFK(LBOT+1)
1433       PKXXXX=PK(LBOT+1)
1434       PKXXXY=PK(LBOT)
1435       APEKXX=APEK(LBOT+1)
1436       APEKXY=APEK(LBOT)
1438       LMID=.5*(LBOT+LTOP)
1440       DO L=LBOT,LTOP,-1
1441         TREFKX=((PKXXXY-PKXXXX)*SMIX                                    &
1442      &          +TREFKX*APEKXX)/APEKXY
1443         TREFK(L)=TREFKX
1444         IF(L<=LMID) TREFK(L)=MAX(TREFK(L), TK(L)+DTSHAL)
1445         APEKXX=APEKXY
1446         PKXXXX=PKXXXY
1447         APEKXY=APEK(L-1)
1448         PKXXXY=PK(L-1)
1449       ENDDO
1451 !----------------TEMPERATURE REFERENCE PROFILE CORRECTION---------------
1453       SUMDT=0.
1454       SUMDP=0.
1456       DO L=LTOP,LBOT
1457         SUMDT=(TK(L)-TREFK(L))*DPRS(L)+SUMDT
1458         SUMDP=SUMDP+DPRS(L)
1459       ENDDO
1461       RDPSUM=1./SUMDP
1462       FPK(LBOT)=TREFK(LBOT)
1464       TCORR=SUMDT*RDPSUM
1466       DO L=LTOP,LBOT
1467         TRFKL   =TREFK(L)+TCORR
1468         TREFK(L)=TRFKL
1469         FPK  (L)=TRFKL
1470       ENDDO
1472 !----------------HUMIDITY PROFILE EQUATIONS-----------------------------
1474       PSUM  =0.
1475       QSUM  =0.
1476       POTSUM=0.
1477       QOTSUM=0.
1478       OTSUM =0.
1479       DST   =0.
1480       FPTK  =FPK(LTOP)
1482       DO L=LTOP,LBOT
1483         DPKL  =FPK(L)-FPTK
1484         PSUM  =DPKL *DPRS(L)+PSUM
1485         QSUM  =QK(L)*DPRS(L)+QSUM
1486         RTBAR =2./(TREFK(L)+TK(L))
1487         OTSUM =DPRS(L)*RTBAR+OTSUM
1488         POTSUM=DPKL    *RTBAR*DPRS(L)+POTSUM
1489         QOTSUM=QK(L)   *RTBAR*DPRS(L)+QOTSUM
1490         DST   =(TREFK(L)-TK(L))*RTBAR*DPRS(L)/EL(L)+DST
1491       ENDDO
1493       PSUM  =PSUM*RDPSUM
1494       QSUM  =QSUM*RDPSUM
1495       ROTSUM=1./OTSUM
1496       POTSUM=POTSUM*ROTSUM
1497       QOTSUM=QOTSUM*ROTSUM
1498       DST   =DST*ROTSUM*CP
1500 !-----------------------------------------------------------------------
1501 !***  Begin debugging convection
1502       IF(PRINT_DIAG)THEN
1503         WRITE(6,"(a,5e12.4)") '{cu2c DST,PSUM,QSUM,POTSUM,QOTSUM = ' &
1504              ,DST,PSUM,QSUM,POTSUM,QOTSUM
1505       ENDIF
1506 !***  End debugging convection
1507 !-----------------------------------------------------------------------
1509 !----------------ENSURE POSITIVE ENTROPY CHANGE-------------------------
1511       IF(DST>0.)THEN
1512 !        dstq=dst*epsup
1513         LBOT=0
1514 !!!!    LTOP=LBOT
1515         LTOP=KTE
1516         PTOP=PBOT
1517         GO TO 800
1518       ELSE
1519         DSTQ=DST*EPSDN
1520       ENDIF
1522 !----------------CHECK FOR ISOTHERMAL ATMOSPHERE------------------------
1524       DEN=POTSUM-PSUM
1526       IF(-DEN/PSUM<5.E-5)THEN
1527         LBOT=0
1528 !!!!    LTOP=LBOT
1529         LTOP=KTE
1530         PTOP=PBOT
1531         GO TO 800
1533 !----------------SLOPE OF THE REFERENCE HUMIDITY PROFILE----------------
1535       ELSE
1536         DQREF=(QOTSUM-DSTQ-QSUM)/DEN
1537       ENDIF
1539 !-------------- HUMIDITY DOES NOT INCREASE WITH HEIGHT------------------
1541       IF(DQREF<0.)THEN
1542         LBOT=0
1543 !!!!    LTOP=LBOT
1544         LTOP=KTE
1545         PTOP=PBOT
1546         GO TO 800
1547       ENDIF
1549 !----------------HUMIDITY AT THE CLOUD TOP------------------------------
1551       QRFTP=QSUM-DQREF*PSUM
1553 !----------------HUMIDITY PROFILE---------------------------------------
1555       DO L=LTOP,LBOT
1556         QRFKL=(FPK(L)-FPTK)*DQREF+QRFTP
1558 !***  TOO DRY CLOUDS NOT ALLOWED
1560         TNEW=(TREFK(L)-TK(L))*TAUKSC+TK(L)
1561         QSATK(L)=PQ0/PK(L)*EXP(A2*(TNEW-A3)/(TNEW-A4))
1562         QNEW=(QRFKL-QK(L))*TAUKSC+QK(L)
1564         IF(QNEW<QSATK(L)*RHLSC)THEN
1565           LBOT=0
1566 !!!!      LTOP=LBOT
1567           LTOP=KTE
1568           PTOP=PBOT
1569           GO TO 800
1570         ENDIF
1572 !-------------TOO MOIST CLOUDS NOT ALLOWED------------------------------
1574         IF(QNEW>QSATK(L)*RHHSC)THEN
1575           LBOT=0
1576 !!!!      LTOP=LBOT
1577           LTOP=KTE
1578           PTOP=PBOT
1579           GO TO 800
1580         ENDIF
1583         THVREF(L)=TREFK(L)*APEK(L)*(QRFKL*D608+1.)
1584         QREFK(L)=QRFKL
1585       ENDDO
1587 !------------------ ELIMINATE CLOUDS WITH BOTTOMS TOO DRY --------------
1589 !      qnew=(qrefk(lbot)-qk(lbot))*tauksc+qk(lbot)
1591 !      if(qnew<qk(lbot+1)*stresh)then  !!?? stresh too large!!
1592 !        lbot=0
1593 !!!!!!   ltop=lbot
1594 !        ltop=kte
1595 !        ptop=pbot
1596 !        go to 800
1597 !      endif
1599 !-------------- ELIMINATE IMPOSSIBLE SLOPES (BETTS,DTHETA/DQ)------------
1601       DO L=LTOP,LBOT
1602         DTDP=(THVREF(L-1)-THVREF(L))/(PRSMID(L)-PRSMID(L-1))
1604         IF(DTDP<EPSDT)THEN
1605           LBOT=0
1606 !!!!!     LTOP=LBOT
1607           LTOP=KTE
1608           PTOP=PBOT
1609           GO TO 800
1610         ENDIF
1612       ENDDO
1613 !-----------------------------------------------------------------------
1614 !--------------RELAXATION TOWARD REFERENCE PROFILES---------------------
1615 !-----------------------------------------------------------------------
1617       DO L=LTOP,LBOT
1618         DTDT(L)=(TREFK(L)-TK(L))*TAUKSC*RDTCNVC
1619         DQDT(L)=(QREFK(L)-QK(L))*TAUKSC*RDTCNVC
1620       ENDDO
1622 !-----------------------------------------------------------------------
1623 !***  Begin debugging convection
1624       IF(PRINT_DIAG)THEN
1625         DO L=LBOT,LTOP,-1
1626           WRITE(6,"(a,i3,4e12.4)") '{cu2 KFLIP,DT,DTDT,DQ,DQDT = ' &
1627                ,KTE+1-L,TREFK(L)-TK(L),DTDT(L),QREFK(L)-QK(L),DQDT(L)
1628         ENDDO
1629       ENDIF
1630 !***  End debugging convection
1631 !-----------------------------------------------------------------------
1633 !-----------------------------------------------------------------------
1634 !SCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCS
1635 !SCSCSCSCSCSCSC         END OF SHALLOW CONVECTION        SCSCSCSCSCSCSCS
1636 !SCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCS
1637 !-----------------------------------------------------------------------
1638   800 CONTINUE
1639 !-----------------------------------------------------------------------
1640       END SUBROUTINE BMJ
1641 !-----------------------------------------------------------------------
1642 !XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
1643 !-----------------------------------------------------------------------
1644                            SUBROUTINE TTBLEX                            &
1645      & (ITBX,JTBX,PLX,PRSMID,RDPX,RDTHEX,STHE                           &
1646      & ,THE0,THESP,TTBL,TREF)
1647 !-----------------------------------------------------------------------
1648 !     ******************************************************************
1649 !     *                                                                *
1650 !     *           EXTRACT TEMPERATURE OF THE MOIST ADIABAT FROM        *
1651 !     *                      THE APPROPRIATE TTBL                      *
1652 !     *                                                                *
1653 !     ******************************************************************
1654 !-----------------------------------------------------------------------
1655       IMPLICIT NONE
1656 !-----------------------------------------------------------------------
1657       INTEGER,INTENT(IN) :: ITBX,JTBX
1659       REAL,INTENT(IN) :: PLX,PRSMID,RDPX,RDTHEX,THESP
1661       REAL,DIMENSION(ITBX),INTENT(IN) :: STHE,THE0
1663       REAL,DIMENSION(JTBX,ITBX),INTENT(IN) :: TTBL
1665       REAL,INTENT(OUT) :: TREF
1666 !-----------------------------------------------------------------------
1667       REAL :: BTHE00K,BTHE10K,BTHK,PK,PP,QQ,STHE00K,STHE10K,STHK        &
1668      &       ,T00K,T01K,T10K,T11K,TPK,TTHK
1670       INTEGER :: IPTB,ITHTB
1671 !-----------------------------------------------------------------------
1672 !----------------SCALING PRESSURE & TT TABLE INDEX----------------------
1673 !-----------------------------------------------------------------------
1674       PK=PRSMID
1675       TPK=(PK-PLX)*RDPX
1676       QQ=TPK-AINT(TPK)
1677       IPTB=INT(TPK)+1
1678 !----------------KEEPING INDICES WITHIN THE TABLE-----------------------
1679       IF(IPTB<1)THEN
1680         IPTB=1
1681         QQ=0.
1682       ENDIF
1684       IF(IPTB>=ITBX)THEN
1685         IPTB=ITBX-1
1686         QQ=0.
1687       ENDIF
1688 !----------------BASE AND SCALING FACTOR FOR THETAE---------------------
1689       BTHE00K=THE0(IPTB)
1690       STHE00K=STHE(IPTB)
1691       BTHE10K=THE0(IPTB+1)
1692       STHE10K=STHE(IPTB+1)
1693 !----------------SCALING THE & TT TABLE INDEX---------------------------
1694       BTHK=(BTHE10K-BTHE00K)*QQ+BTHE00K
1695       STHK=(STHE10K-STHE00K)*QQ+STHE00K
1696       TTHK=(THESP-BTHK)/STHK*RDTHEX
1697       PP=TTHK-AINT(TTHK)
1698       ITHTB=INT(TTHK)+1
1699 !----------------KEEPING INDICES WITHIN THE TABLE-----------------------
1700       IF(ITHTB<1)THEN
1701         ITHTB=1
1702         PP=0.
1703       ENDIF
1705       IF(ITHTB>=JTBX)THEN
1706         ITHTB=JTBX-1
1707         PP=0.
1708       ENDIF
1709 !----------------TEMPERATURE AT FOUR SURROUNDING TT TABLE PTS.----------
1710       T00K=TTBL(ITHTB,IPTB)
1711       T10K=TTBL(ITHTB+1,IPTB)
1712       T01K=TTBL(ITHTB,IPTB+1)
1713       T11K=TTBL(ITHTB+1,IPTB+1)
1714 !-----------------------------------------------------------------------
1715 !----------------PARCEL TEMPERATURE-------------------------------------
1716 !-----------------------------------------------------------------------
1717       TREF=(T00K+(T10K-T00K)*PP+(T01K-T00K)*QQ                          &
1718      &    +(T00K-T10K-T01K+T11K)*PP*QQ)
1719 !-----------------------------------------------------------------------
1720       END SUBROUTINE TTBLEX
1721 !-----------------------------------------------------------------------
1722 !-----------------------------------------------------------------------
1723       SUBROUTINE BMJINIT(RTHCUTEN,RQVCUTEN,RQCCUTEN,RQRCUTEN            &
1724      &                  ,CLDEFI,LOWLYR,CP,RD,RESTART                    &
1725      &                  ,ALLOWED_TO_READ                                &
1726      &                  ,IDS,IDE,JDS,JDE,KDS,KDE                        &
1727      &                  ,IMS,IME,JMS,JME,KMS,KME                        &
1728      &                  ,ITS,ITE,JTS,JTE,KTS,KTE)
1729 !-----------------------------------------------------------------------
1730       IMPLICIT NONE
1731 !-----------------------------------------------------------------------
1732       LOGICAL,INTENT(IN) :: RESTART,ALLOWED_TO_READ
1733       INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE                     &
1734      &                     ,IMS,IME,JMS,JME,KMS,KME                     &
1735      &                     ,ITS,ITE,JTS,JTE,KTS,KTE
1737       REAL,INTENT(IN) :: CP,RD
1739       REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(OUT) ::            &
1740      &                                              RTHCUTEN            &
1741      &                                             ,RQVCUTEN            &
1742      &                                             ,RQCCUTEN            &
1743      &                                             ,RQRCUTEN
1745       REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(OUT) :: CLDEFI
1747       INTEGER,DIMENSION(IMS:IME,JMS:JME),INTENT(INOUT) :: LOWLYR
1749       REAL,PARAMETER :: EPS=1.E-9
1751       REAL, DIMENSION(JTB) :: APP,APT,AQP,AQT,PNEW,POLD,QSNEW,QSOLD     &
1752      &                       ,THENEW,THEOLD,TNEW,TOLD,Y2P,Y2T
1754       REAL,DIMENSION(JTBQ) :: APTQ,AQTQ,THENEWQ,THEOLDQ                 &
1755      &                       ,TNEWQ,TOLDQ,Y2TQ
1757       INTEGER :: I,J,K,ITF,JTF,KTF
1758       INTEGER :: KTH,KTHM,KTHM1,KP,KPM,KPM1
1760       REAL :: APE,DP,DQS,DTH,DTHE,P,QS,QS0K,SQSK,STHEK                  &
1761      &       ,TH,THE0K,DENOM,ELOCP
1762 !-----------------------------------------------------------------------
1764       ELOCP=ELIWV/CP
1765       JTF=MIN0(JTE,JDE-1)
1766       KTF=MIN0(KTE,KDE-1)
1767       ITF=MIN0(ITE,IDE-1)
1769       IF(.NOT.RESTART)THEN
1770         DO J=JTS,JTF
1771         DO K=KTS,KTF
1772         DO I=ITS,ITF
1773           RTHCUTEN(I,K,J)=0.
1774           RQVCUTEN(I,K,J)=0.
1775           RQCCUTEN(I,K,J)=0.
1776           RQRCUTEN(I,K,J)=0.
1777         ENDDO
1778         ENDDO
1779         ENDDO
1781         DO J=JTS,JTF
1782         DO I=ITS,ITF
1783           CLDEFI(I,J)=AVGEFI
1784         ENDDO
1785         ENDDO
1786       ENDIF
1788 !***  FOR NOW, ASSUME SIGMA MODE FOR LOWEST MODEL LAYER
1790       DO J=JTS,JTF
1791       DO I=ITS,ITF
1792         LOWLYR(I,J)=1
1793       ENDDO
1794       ENDDO
1795 !-----------------------------------------------------------------------
1796 !----------------COARSE LOOK-UP TABLE FOR SATURATION POINT--------------
1797 !-----------------------------------------------------------------------
1799       KTHM=JTB
1800       KPM=ITB
1801       KTHM1=KTHM-1
1802       KPM1=KPM-1
1804       DTH=(THH-THL)/REAL(KTHM-1)
1805       DP =(PH -PL )/REAL(KPM -1)
1807       TH=THL-DTH
1808 !-----------------------------------------------------------------------
1809       DO 100 KTH=1,KTHM
1811       TH=TH+DTH
1812       P=PL-DP
1814       DO KP=1,KPM
1815         P=P+DP
1816         APE=(100000./P)**(RD/CP)
1817         DENOM=TH-A4*APE
1818         IF (DENOM>EPS) THEN
1819            QSOLD(KP)=PQ0/P*EXP(A2*(TH-A3*APE)/DENOM)
1820         ELSE
1821            QSOLD(KP)=0.
1822         ENDIF
1823         POLD(KP)=P
1824       ENDDO
1826       QS0K=QSOLD(1)
1827       SQSK=QSOLD(KPM)-QSOLD(1)
1828       QSOLD(1  )=0.
1829       QSOLD(KPM)=1.
1831       DO KP=2,KPM1
1832         QSOLD(KP)=(QSOLD(KP)-QS0K)/SQSK
1833         IF((QSOLD(KP)-QSOLD(KP-1)).LT.EPS)QSOLD(KP)=QSOLD(KP-1)+EPS
1834       ENDDO
1836       QS0(KTH)=QS0K
1837       QS0_EXP(KTH)=QS0K
1838       SQS(KTH)=SQSK
1839       SQS_EXP(KTH)=SQSK
1840 !-----------------------------------------------------------------------
1841       QSNEW(1  )=0.
1842       QSNEW(KPM)=1.
1843       DQS=1./REAL(KPM-1)
1845       DO KP=2,KPM1
1846         QSNEW(KP)=QSNEW(KP-1)+DQS
1847       ENDDO
1849       Y2P(1   )=0.
1850       Y2P(KPM )=0.
1852       CALL SPLINE(JTB,KPM,QSOLD,POLD,Y2P,KPM,QSNEW,PNEW,APP,AQP)
1854       DO KP=1,KPM
1855         PTBL(KP,KTH)=PNEW(KP)
1856         PTBL_EXP(KP,KTH)=PNEW(KP)
1857       ENDDO
1858 !-----------------------------------------------------------------------
1859   100 CONTINUE
1860 !-----------------------------------------------------------------------
1861 !------------COARSE LOOK-UP TABLE FOR T(P) FROM CONSTANT THE------------
1862 !-----------------------------------------------------------------------
1863       P=PL-DP
1865       DO 200 KP=1,KPM
1867       P=P+DP
1868       TH=THL-DTH
1870       DO KTH=1,KTHM
1871         TH=TH+DTH
1872         APE=(1.E5/P)**(RD/CP)
1873         DENOM=TH-A4*APE
1874         IF (DENOM>EPS) THEN
1875            QS=PQ0/P*EXP(A2*(TH-A3*APE)/DENOM)
1876         ELSE
1877            QS=0.
1878         ENDIF
1879 !        QS=PQ0/P*EXP(A2*(TH-A3*APE)/(TH-A4*APE))
1880         TOLD(KTH)=TH/APE
1881         THEOLD(KTH)=TH*EXP(ELOCP*QS/TOLD(KTH))
1882       ENDDO
1884       THE0K=THEOLD(1)
1885       STHEK=THEOLD(KTHM)-THEOLD(1)
1886       THEOLD(1   )=0.
1887       THEOLD(KTHM)=1.
1889       DO KTH=2,KTHM1
1890         THEOLD(KTH)=(THEOLD(KTH)-THE0K)/STHEK
1891         IF((THEOLD(KTH)-THEOLD(KTH-1)).LT.EPS)                          &
1892      &      THEOLD(KTH)=THEOLD(KTH-1)  +  EPS
1893       ENDDO
1895       THE0(KP)=THE0K
1896       STHE(KP)=STHEK
1897 !-----------------------------------------------------------------------
1898       THENEW(1  )=0.
1899       THENEW(KTHM)=1.
1900       DTHE=1./REAL(KTHM-1)
1902       DO KTH=2,KTHM1
1903         THENEW(KTH)=THENEW(KTH-1)+DTHE
1904       ENDDO
1906       Y2T(1   )=0.
1907       Y2T(KTHM)=0.
1909       CALL SPLINE(JTB,KTHM,THEOLD,TOLD,Y2T,KTHM,THENEW,TNEW,APT,AQT)
1911       DO KTH=1,KTHM
1912         TTBL(KTH,KP)=TNEW(KTH)
1913       ENDDO
1914 !-----------------------------------------------------------------------
1915   200 CONTINUE
1916 !-----------------------------------------------------------------------
1918 !-----------------------------------------------------------------------
1919 !---------------FINE LOOK-UP TABLE FOR SATURATION POINT-----------------
1920 !-----------------------------------------------------------------------
1921       KTHM=JTBQ
1922       KPM=ITBQ
1923       KTHM1=KTHM-1
1924       KPM1=KPM-1
1926       DTH=(THHQ-THL)/REAL(KTHM-1)
1927       DP=(PH-PLQ)/REAL(KPM-1)
1929       TH=THL-DTH
1930       P=PLQ-DP
1931 !-----------------------------------------------------------------------
1932 !---------------FINE LOOK-UP TABLE FOR T(P) FROM CONSTANT THE-----------
1933 !-----------------------------------------------------------------------
1934       DO 300 KP=1,KPM
1936       P=P+DP
1937       TH=THL-DTH
1939       DO KTH=1,KTHM
1940         TH=TH+DTH
1941         APE=(1.E5/P)**(RD/CP)
1942         DENOM=TH-A4*APE
1943         IF (DENOM>EPS) THEN
1944            QS=PQ0/P*EXP(A2*(TH-A3*APE)/DENOM)
1945         ELSE
1946            QS=0.
1947         ENDIF
1948 !        QS=PQ0/P*EXP(A2*(TH-A3*APE)/(TH-A4*APE))
1949         TOLDQ(KTH)=TH/APE
1950         THEOLDQ(KTH)=TH*EXP(ELOCP*QS/TOLDQ(KTH))
1951       ENDDO
1953       THE0K=THEOLDQ(1)
1954       STHEK=THEOLDQ(KTHM)-THEOLDQ(1)
1955       THEOLDQ(1   )=0.
1956       THEOLDQ(KTHM)=1.
1958       DO KTH=2,KTHM1
1959         THEOLDQ(KTH)=(THEOLDQ(KTH)-THE0K)/STHEK
1960         IF((THEOLDQ(KTH)-THEOLDQ(KTH-1))<EPS)                           &
1961      &      THEOLDQ(KTH)=THEOLDQ(KTH-1)+EPS
1962       ENDDO
1964       THE0Q(KP)=THE0K
1965       STHEQ(KP)=STHEK
1966 !-----------------------------------------------------------------------
1967       THENEWQ(1  )=0.
1968       THENEWQ(KTHM)=1.
1969       DTHE=1./REAL(KTHM-1)
1971       DO KTH=2,KTHM1
1972         THENEWQ(KTH)=THENEWQ(KTH-1)+DTHE
1973       ENDDO
1975       Y2TQ(1   )=0.
1976       Y2TQ(KTHM)=0.
1978       CALL SPLINE(JTBQ,KTHM,THEOLDQ,TOLDQ,Y2TQ,KTHM                     &
1979      &           ,THENEWQ,TNEWQ,APTQ,AQTQ)
1981       DO KTH=1,KTHM
1982         TTBLQ(KTH,KP)=TNEWQ(KTH)
1983       ENDDO
1984 !-----------------------------------------------------------------------
1985   300 CONTINUE
1986 !-----------------------------------------------------------------------
1987       END SUBROUTINE BMJINIT
1988 !-----------------------------------------------------------------------
1989 !XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
1990 !-----------------------------------------------------------------------
1991       SUBROUTINE SPLINE(JTBX,NOLD,XOLD,YOLD,Y2,NNEW,XNEW,YNEW,P,Q)
1992 !   ********************************************************************
1993 !   *                                                                  *
1994 !   *  THIS IS A ONE-DIMENSIONAL CUBIC SPLINE FITTING ROUTINE          *
1995 !   *  PROGRAMED FOR A SMALL SCALAR MACHINE.                           *
1996 !   *                                                                  *
1997 !   *  PROGRAMER Z. JANJIC                                             *
1998 !   *                                                                  *
1999 !   *  NOLD - NUMBER OF GIVEN VALUES OF THE FUNCTION.  MUST BE GE 3.   *
2000 !   *  XOLD - LOCATIONS OF THE POINTS AT WHICH THE VALUES OF THE       *
2001 !   *         FUNCTION ARE GIVEN.  MUST BE IN ASCENDING ORDER.         *
2002 !   *  YOLD - THE GIVEN VALUES OF THE FUNCTION AT THE POINTS XOLD.     *
2003 !   *  Y2   - THE SECOND DERIVATIVES AT THE POINTS XOLD.  IF NATURAL   *
2004 !   *         SPLINE IS FITTED Y2(1)=0. AND Y2(NOLD)=0. MUST BE        *
2005 !   *         SPECIFIED.                                               *
2006 !   *  NNEW - NUMBER OF VALUES OF THE FUNCTION TO BE CALCULATED.       *
2007 !   *  XNEW - LOCATIONS OF THE POINTS AT WHICH THE VALUES OF THE       *
2008 !   *         FUNCTION ARE CALCULATED.  XNEW(K) MUST BE GE XOLD(1)     *
2009 !   *         AND LE XOLD(NOLD).                                       *
2010 !   *  YNEW - THE VALUES OF THE FUNCTION TO BE CALCULATED.             *
2011 !   *  P, Q - AUXILIARY VECTORS OF THE LENGTH NOLD-2.                  *
2012 !   *                                                                  *
2013 !   ********************************************************************
2014 !-----------------------------------------------------------------------
2015       IMPLICIT NONE
2016 !-----------------------------------------------------------------------
2017       INTEGER,INTENT(IN) :: JTBX,NNEW,NOLD
2018       REAL,DIMENSION(JTBX),INTENT(IN) :: XNEW,XOLD,YOLD
2019       REAL,DIMENSION(JTBX),INTENT(INOUT) :: P,Q,Y2
2020       REAL,DIMENSION(JTBX),INTENT(OUT) :: YNEW
2022       INTEGER :: K,K1,K2,KOLD,NOLDM1
2023       REAL :: AK,BK,CK,DEN,DX,DXC,DXL,DXR,DYDXL,DYDXR                   &
2024      &       ,RDX,RTDXC,X,XK,XSQ,Y2K,Y2KP1
2025 !-----------------------------------------------------------------------
2026       NOLDM1=NOLD-1
2028       DXL=XOLD(2)-XOLD(1)
2029       DXR=XOLD(3)-XOLD(2)
2030       DYDXL=(YOLD(2)-YOLD(1))/DXL
2031       DYDXR=(YOLD(3)-YOLD(2))/DXR
2032       RTDXC=0.5/(DXL+DXR)
2034       P(1)= RTDXC*(6.*(DYDXR-DYDXL)-DXL*Y2(1))
2035       Q(1)=-RTDXC*DXR
2037       IF(NOLD==3)GO TO 150
2038 !-----------------------------------------------------------------------
2039       K=3
2041   100 DXL=DXR
2042       DYDXL=DYDXR
2043       DXR=XOLD(K+1)-XOLD(K)
2044       DYDXR=(YOLD(K+1)-YOLD(K))/DXR
2045       DXC=DXL+DXR
2046       DEN=1./(DXL*Q(K-2)+DXC+DXC)
2048       P(K-1)= DEN*(6.*(DYDXR-DYDXL)-DXL*P(K-2))
2049       Q(K-1)=-DEN*DXR
2051       K=K+1
2052       IF(K<NOLD)GO TO 100
2053 !-----------------------------------------------------------------------
2054   150 K=NOLDM1
2056   200 Y2(K)=P(K-1)+Q(K-1)*Y2(K+1)
2058       K=K-1
2059       IF(K>1)GO TO 200
2060 !-----------------------------------------------------------------------
2061       K1=1
2063   300 XK=XNEW(K1)
2065       DO 400 K2=2,NOLD
2067       IF(XOLD(K2)>XK)THEN
2068         KOLD=K2-1
2069         GO TO 450
2070       ENDIF
2072   400 CONTINUE
2074       YNEW(K1)=YOLD(NOLD)
2075       GO TO 600
2077   450 IF(K1==1)GO TO 500
2078       IF(K==KOLD)GO TO 550
2080   500 K=KOLD
2082       Y2K=Y2(K)
2083       Y2KP1=Y2(K+1)
2084       DX=XOLD(K+1)-XOLD(K)
2085       RDX=1./DX
2087       AK=.1666667*RDX*(Y2KP1-Y2K)
2088       BK=0.5*Y2K
2089       CK=RDX*(YOLD(K+1)-YOLD(K))-.1666667*DX*(Y2KP1+Y2K+Y2K)
2091   550 X=XK-XOLD(K)
2092       XSQ=X*X
2094       YNEW(K1)=AK*XSQ*X+BK*XSQ+CK*X+YOLD(K)
2096   600 K1=K1+1
2097       IF(K1<=NNEW)GO TO 300
2098 !-----------------------------------------------------------------------
2099       END SUBROUTINE SPLINE
2100 !-----------------------------------------------------------------------
2102       END MODULE MODULE_CU_BMJ
2104 !-----------------------------------------------------------------------