source: trunk/WRF.COMMON/WRFV2/phys/module_cu_bmj.F @ 3567

Last change on this file since 3567 was 11, checked in by aslmd, 14 years ago

spiga@svn-planeto:ajoute le modele meso-echelle martien

File size: 59.5 KB
Line 
1!-----------------------------------------------------------------------
2!
3!WRF:MODEL_LAYER:PHYSICS
4!
5!-----------------------------------------------------------------------
6!
7      MODULE MODULE_CU_BMJ
8!
9!-----------------------------------------------------------------------
10      USE MODULE_MODEL_CONSTANTS
11!-----------------------------------------------------------------------
12!
13      REAL,PARAMETER ::                                                 &
14     &                  DSPC=-3000.                                     &
15     &                 ,DTTOP=0.,EFIFC=5.0,EFIMN=0.20,EFMNT=0.70        &
16     &                 ,ELIVW=2.72E6,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     &                 ,TREL=2400.
31      REAL,PARAMETER :: DSPBFL=-3875.*FR                                &
32     &                 ,DSP0FL=-5875.*FR                                &
33     &                 ,DSPTFL=-1875.*FR                                &
34     &                 ,DSPBFS=-3875.                                   &
35     &                 ,DSP0FS=-5875.                                   &
36     &                 ,DSPTFS=-1875.
37!
38      REAL,PARAMETER :: PL=2500.,PLQ=70000.,PH=105000.                  &
39     &                 ,THL=210.,THH=365.,THHQ=325.
40!
41      INTEGER,PARAMETER :: ITB=76,JTB=134,ITBQ=152,JTBQ=440
42!
43      INTEGER,PARAMETER :: ITREFI_MAX=3
44!
45!***  ARRAYS FOR LOOKUP TABLES
46!
47      REAL,DIMENSION(ITB),PRIVATE,SAVE :: STHE,THE0
48      REAL,DIMENSION(JTB),PRIVATE,SAVE :: QS0,SQS
49      REAL,DIMENSION(ITBQ),PRIVATE,SAVE :: STHEQ,THE0Q
50      REAL,DIMENSION(ITB,JTB),PRIVATE,SAVE :: PTBL
51      REAL,DIMENSION(JTB,ITB),PRIVATE,SAVE :: TTBL
52      REAL,DIMENSION(JTBQ,ITBQ),PRIVATE,SAVE :: TTBLQ
53
54!***  SHARE COPIES FOR MODULE_BL_MYJPBL
55!
56      REAL,DIMENSION(JTB) :: QS0_EXP,SQS_EXP
57      REAL,DIMENSION(ITB,JTB) :: PTBL_EXP
58!
59      REAL,PARAMETER :: RDP=(ITB-1.)/(PH-PL),RDPQ=(ITBQ-1.)/(PH-PLQ)  &
60     &                 ,RDQ=ITB-1,RDTH=(JTB-1.)/(THH-THL)             &
61     &                 ,RDTHE=JTB-1.,RDTHEQ=JTBQ-1.                   &
62     &                 ,RSFCP=1./101300.
63!
64      REAL,PARAMETER :: AVGEFI=(EFIMN+1.)*0.5
65!-----------------------------------------------------------------------
66!
67CONTAINS
68!
69!-----------------------------------------------------------------------
70      SUBROUTINE BMJDRV(                                                &
71     &                  IDS,IDE,JDS,JDE,KDS,KDE                         &
72     &                 ,IMS,IME,JMS,JME,KMS,KME                         &
73     &                 ,ITS,ITE,JTS,JTE,KTS,KTE                         &
74     &                 ,DT,ITIMESTEP,STEPCU                             &
75     &                 ,RAINCV,CUTOP,CUBOT,KPBL                         &
76     &                 ,TH,T,QV                                         &
77     &                 ,PINT,PMID,PI,RHO,DZ8W                           &
78     &                 ,CP,R,ELWV,ELIV,G,TFRZ,D608                      &
79     &                 ,CLDEFI,LOWLYR,XLAND,CU_ACT_FLAG                 &
80                      ! optional
81     &                 ,RTHCUTEN, RQVCUTEN                              &
82     &                                                                  )
83!-----------------------------------------------------------------------
84      IMPLICIT NONE
85!-----------------------------------------------------------------------
86      INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE                     &
87     &                     ,IMS,IME,JMS,JME,KMS,KME                     &
88     &                     ,ITS,ITE,JTS,JTE,KTS,KTE
89!
90      INTEGER,INTENT(IN) :: ITIMESTEP,STEPCU
91!
92      INTEGER,DIMENSION(IMS:IME,JMS:JME),INTENT(IN) :: KPBL,LOWLYR
93!
94      REAL,INTENT(IN) :: CP,DT,ELIV,ELWV,G,R,TFRZ,D608
95!
96      REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(IN) :: XLAND
97!
98      REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(IN) :: DZ8W        &
99     &                                                     ,PI,PINT     &
100     &                                                     ,PMID,QV     &
101     &                                                     ,RHO,T,TH
102!
103      REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME)                           &
104     &    ,OPTIONAL                                                     &
105     &    ,INTENT(INOUT) ::                        RQVCUTEN,RTHCUTEN
106!
107      REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(INOUT) :: CLDEFI,RAINCV
108!
109      REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(OUT) :: CUBOT,CUTOP
110!
111      LOGICAL,DIMENSION(IMS:IME,JMS:JME),INTENT(INOUT) :: CU_ACT_FLAG
112!
113!-----------------------------------------------------------------------
114!***
115!***  LOCAL VARIABLES
116!***
117!-----------------------------------------------------------------------
118      INTEGER :: LBOT,LPBL,LTOP
119!
120      REAL :: DTCNVC,LANDMASK,PCPCOL,PSFC,PTOP
121!
122      REAL,DIMENSION(KTS:KTE) :: DPCOL,DQDT,DTDT,PCOL,QCOL,TCOL
123!
124      INTEGER :: I,J,K,KFLIP,ICLDCK,LMH
125!
126!***  Begin debugging convection
127      REAL :: DELQ,DELT,PLYR
128      INTEGER :: IMD,JMD
129      LOGICAL :: PRINT_DIAG
130!***  End debugging convection
131!
132!-----------------------------------------------------------------------
133!***********************************************************************
134!-----------------------------------------------------------------------
135!
136!***  PREPARE TO CALL BMJ CONVECTION SCHEME
137!
138!-----------------------------------------------------------------------
139!
140!***  CHECK TO SEE IF THIS IS A CONVECTION TIMESTEP
141!                                                                       
142      ICLDCK=MOD(ITIMESTEP,STEPCU)                                             
143!-----------------------------------------------------------------------
144!                                                                     
145!***  COMPUTE CONVECTION EVERY STEPCU*DT/60.0 MINUTES
146!                                                                     
147!***  Begin debugging convection
148      IMD=(IMS+IME)/2
149      JMD=(JMS+JME)/2
150      PRINT_DIAG=.FALSE.
151!***  End debugging convection
152
153      IF(ICLDCK==0.OR.ITIMESTEP==0)THEN
154!
155        DO J=JTS,JTE
156        DO I=ITS,ITE
157          CU_ACT_FLAG(I,J)=.TRUE.
158        ENDDO
159        ENDDO
160
161!
162        DTCNVC=DT*STEPCU
163!
164        DO J=JTS,JTE 
165        DO I=ITS,ITE
166!
167          DO K=KTS,KTE
168            DQDT(K)=0.
169            DTDT(K)=0.
170          ENDDO
171!
172          RAINCV(I,J)=0.
173          PCPCOL=0.
174          PSFC=PINT(I,LOWLYR(I,J),J)
175          PTOP=PINT(I,KTE+1,J)      ! KTE+1=KME
176!
177!***  CONVERT TO BMJ LAND MASK (1.0 FOR SEA; 0.0 FOR LAND)
178!
179          LANDMASK=XLAND(I,J)-1.
180!
181!***  FILL 1-D VERTICAL ARRAYS
182!***  AND FLIP DIRECTION SINCE BMJ SCHEME
183!***  COUNTS DOWNWARD FROM THE DOMAIN'S TOP
184!
185          DO K=KTS,KTE
186            KFLIP=KTE+1-K
187!
188!***  CONVERT FROM MIXING RATIO TO SPECIFIC HUMIDITY
189!
190            QCOL(K)=MAX(EPSQ,QV(I,KFLIP,J)/(1.+QV(I,KFLIP,J)))
191            TCOL(K)=T(I,KFLIP,J)
192            PCOL(K)=PMID(I,KFLIP,J)
193!           DPCOL(K)=PINT(I,KFLIP,J)-PINT(I,KFLIP+1,J)
194            DPCOL(K)=RHO(I,KFLIP,J)*G*DZ8W(I,KFLIP,J)
195          ENDDO
196!
197!***  LOWEST LAYER ABOVE GROUND MUST ALSO BE FLIPPED
198!
199          LMH=KTE+1-LOWLYR(I,J)
200          LPBL=KTE+1-KPBL(I,J)
201!-----------------------------------------------------------------------
202!***
203!***  CALL CONVECTION
204!***
205!-----------------------------------------------------------------------
206!***  Begin debugging convection
207!         PRINT_DIAG=.FALSE.
208!         IF(I==IMD.AND.J==JMD)PRINT_DIAG=.TRUE.
209!***  End debugging convection
210!-----------------------------------------------------------------------
211          CALL BMJ(ITIMESTEP,I,J,DTCNVC,LMH,LANDMASK,CLDEFI(I,J)        &
212     &            ,DPCOL,PCOL,QCOL,TCOL,PSFC,PTOP                       &
213     &            ,DQDT,DTDT,PCPCOL,LBOT,LTOP,LPBL                      &
214     &            ,CP,R,ELWV,ELIV,G,TFRZ,D608                           &   
215     &            ,PRINT_DIAG                                           &   
216     &            ,IDS,IDE,JDS,JDE,KDS,KDE                              &     
217     &            ,IMS,IME,JMS,JME,KMS,KME                              &
218     &            ,ITS,ITE,JTS,JTE,KTS,KTE)
219!-----------------------------------------------------------------------
220!
221!***  COMPUTE HEATING AND MOISTENING TENDENCIES
222!
223          IF ( PRESENT( RTHCUTEN ) .AND. PRESENT( RQVCUTEN )) THEN
224            DO K=KTS,KTE
225              KFLIP=KTE+1-K
226              RTHCUTEN(I,K,J)=DTDT(KFLIP)/PI(I,K,J)
227!
228!***  CONVERT FROM SPECIFIC HUMIDTY BACK TO MIXING RATIO
229!
230              RQVCUTEN(I,K,J)=DQDT(KFLIP)/(1.-QCOL(KFLIP))**2
231            ENDDO
232          ENDIF
233!
234!***  ALL UNITS IN BMJ SCHEME ARE MKS, THUS CONVERT PRECIP FROM METERS
235!***  TO MILLIMETERS PER STEP FOR OUTPUT.
236!
237          RAINCV(I,J)=PCPCOL*1.E3/STEPCU
238!
239!***  CONVECTIVE CLOUD TOP AND BOTTOM FROM THIS CALL
240!
241          CUTOP(I,J)=REAL(KTE+1-LTOP)
242          CUBOT(I,J)=REAL(KTE+1-LBOT)
243!
244!-----------------------------------------------------------------------
245!***  Begin debugging convection
246          IF(PRINT_DIAG)THEN
247            DELT=0.
248            DELQ=0.
249            PLYR=0.
250            IF(LBOT>0.AND.LTOP<LBOT)THEN
251              DO K=LTOP,LBOT
252                PLYR=PLYR+DPCOL(K)
253                DELQ=DELQ+DPCOL(K)*DTCNVC*ABS(DQDT(K))
254                DELT=DELT+DPCOL(K)*DTCNVC*ABS(DTDT(K))
255              ENDDO
256              DELQ=DELQ/PLYR
257              DELT=DELT/PLYR
258            ENDIF
259!
260            WRITE(6,"(2a,2i4,3e12.4,f7.2,4i3)") &
261                 '{cu3 i,j,PCPCOL,DTavg,DQavg,PLYR,'  &
262                 ,'LBOT,LTOP,CUBOT,CUTOP = '  &
263                 ,i,j, PCPCOL,DELT,1000.*DELQ,.01*PLYR  &
264                 ,LBOT,LTOP,NINT(CUBOT(I,J)),NINT(CUTOP(I,J))
265!
266            IF(PLYR> 0.)THEN
267              DO K=LBOT,LTOP,-1
268                KFLIP=KTE+1-K
269                WRITE(6,"(a,i3,2e12.4,f7.2)") '{cu3a KFLIP,DT,DQ,DP = ' &
270                     ,KFLIP,DTCNVC*DTDT(K),1000.*DTCNVC*DQDT(K),.01*DPCOL(K)
271              ENDDO
272            ENDIF
273          ENDIF
274!***  End debugging convection
275!-----------------------------------------------------------------------
276!
277        ENDDO
278        ENDDO
279!
280      ENDIF
281!
282      END SUBROUTINE BMJDRV
283!-----------------------------------------------------------------------
284!XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
285!-----------------------------------------------------------------------
286                          SUBROUTINE BMJ                                &
287!-----------------------------------------------------------------------
288     & (ITIMESTEP,I,J,DTCNVC,LMH,SM,CLDEFI                              &
289     & ,DPRS,PRSMID,Q,T,PSFC,PT                                         &
290     & ,DQDT,DTDT,PCPCOL,LBOT,LTOP,LPBL                                 &
291     & ,CP,R,ELWV,ELIV,G,TFRZ,D608                                      &
292     & ,PRINT_DIAG                                                      &   
293     & ,IDS,IDE,JDS,JDE,KDS,KDE                                         &
294     & ,IMS,IME,JMS,JME,KMS,KME                                         &
295     & ,ITS,ITE,JTS,JTE,KTS,KTE)
296!-----------------------------------------------------------------------
297      IMPLICIT NONE
298!-----------------------------------------------------------------------
299      INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE                     &
300                           ,IMS,IME,JMS,JME,KMS,KME                     &
301                           ,ITS,ITE,JTS,JTE,KTS,KTE                     &
302                           ,I,J,ITIMESTEP
303!
304      INTEGER,INTENT(IN) :: LMH,LPBL
305!
306      INTEGER,INTENT(OUT) :: LBOT,LTOP
307!
308      REAL,INTENT(IN) :: CP,D608,DTCNVC,ELIV,ELWV,G,PSFC,PT,R,SM,TFRZ
309!
310      REAL,DIMENSION(KTS:KTE),INTENT(IN) :: DPRS,PRSMID,Q,T
311!
312      REAL,INTENT(INOUT) :: CLDEFI,PCPCOL
313!
314      REAL,DIMENSION(KTS:KTE),INTENT(INOUT) :: DQDT,DTDT
315!
316!-----------------------------------------------------------------------
317!***  DEFINE LOCAL VARIABLES
318!-----------------------------------------------------------------------
319!                                                           
320      REAL,DIMENSION(KTS:KTE) :: APEK,APESK,EL,FPK                      &
321                                ,PK,PSK,QK,QREFK,QSATK                  &
322                                ,THERK,THEVRF,THSK                      &
323                                ,THVMOD,THVREF,TK,TREFK
324!
325      REAL,DIMENSION(KTS:KTE) :: APE,DIFQ,DIFT,THEE,THES,TREF
326!
327      LOGICAL :: DEEP,SHALLOW
328!
329!***  Begin debugging convection
330      LOGICAL :: PRINT_DIAG
331!***  End debugging convection
332!
333!-----------------------------------------------------------------------
334!***
335!***  LOCAL SCALARS
336!***
337!-----------------------------------------------------------------------
338      REAL :: APEKL,APEKXX,APEKXY,APES,APESP,APESTS                     &
339     &            ,AVRGT,AVRGTL,BQ,BQK,BQS00K,BQS10K                    &
340     &            ,CAPA,CUP,DEN,DENTPY,DEPMIN,DEPTH                     &
341     &            ,DEPWL,DHDT,DIFQL,DIFTL,DP,DPKL,DPLO,DPMIX,DPOT       &
342     &            ,DPUP,DQREF,DRHDP,DRHEAT,DSP                          &
343     &            ,DSP0,DSP0K,DSPB,DSPBK,DSPT,DSPTK                     &
344     &            ,DSQ,DST,DSTQ,DTHEM,DTDP,EFI                          &
345     &            ,FEFI,FFUP,FPRS,FPTK,HCORR                            &
346     &            ,OTSUM,P,P00K,P01K,P10K,P11K                          &
347     &            ,PART1,PART2,PART3,PBOT,PBOTFC,PBTK                   &
348     &            ,PK0,PKB,PKL,PKT,PKXXXX,PKXXXY                        &
349     &            ,PLMH,plo,POTSUM,PP1,PPK,PRECK                        &
350     &            ,PRESK,PSP,PSUM,PTHRS,PTOP,PTPK,PUP                   &
351     &            ,QBT,QKL,QNEW,QOTSUM,QQ1,QQBT,QQK,QRFKL               &
352     &            ,QRFTP,QSP,QSUM,QUP,RDP0T                             &
353     &            ,RDPSUM,RDTCNVC,RHH,RHL,RHMAX,ROTSUM,RTBAR            &
354     &            ,SM1,SMIX,SQ,SQK,SQS00K,SQS10K,STABDL,SUMDE,SUMDP     &
355     &            ,SUMDT,TAUK,TAUKSC,TCORR,THBT,THERKX,THERKY           &
356     &            ,THESP,THSKL,THTPK,THVMKL,TKL,TNEW                    &
357     &            ,TPSP,TQ,TQK,TREFKX,TRFKL,trmlo,trmup,TSKL,tsp,TTH    &
358     &            ,TTHBT,TTHES,TTHK,TUP
359!
360      INTEGER :: IQ,IQTB,IT,ITER,ITREFI,ITTB,ITTBK,KB,KBMAX,KNUMH,KNUML &
361     &          ,L,L0,L0M1,LB,LBM1,LCOR,LPT1                            &
362     &          ,LQM,LSHU,LTP1,LTP2,LTSH
363!-----------------------------------------------------------------------
364!
365      REAL,PARAMETER :: DSPBSL=DSPBFL*FSL,DSP0SL=DSP0FL*FSL             &
366     &                 ,DSPTSL=DSPTFL*FSL                               &
367     &                 ,DSPBSS=DSPBFS*FSS,DSP0SS=DSP0FS*FSS             &
368     &                 ,DSPTSS=DSPTFS*FSS
369!
370      REAL,PARAMETER :: ELEVFC=0.8,STEFI=1.
371!
372      REAL,PARAMETER :: SLOPBL=(DSPBFL-DSPBSL)/(1.-EFIMN)               &
373     &                 ,SLOP0L=(DSP0FL-DSP0SL)/(1.-EFIMN)               &
374     &                 ,SLOPTL=(DSPTFL-DSPTSL)/(1.-EFIMN)               &
375     &                 ,SLOPBS=(DSPBFS-DSPBSS)/(1.-EFIMN)               &
376     &                 ,SLOP0S=(DSP0FS-DSP0SS)/(1.-EFIMN)               &
377     &                 ,SLOPTS=(DSPTFS-DSPTSS)/(1.-EFIMN)               &
378     &                 ,SLOPST=(STABDF-STABDS)/(1.-EFIMN)               &
379     &                 ,SLOPE=(1.-EFMNT)/(1.-EFIMN)
380!
381      REAL :: A23M4L,CPRLG,ELOCP,RCP
382!-----------------------------------------------------------------------
383!***********************************************************************
384!-----------------------------------------------------------------------
385      CAPA=R/CP
386      CPRLG=CP/(ROW*G*ELWV)
387      ELOCP=ELIVW/CP
388      RCP=1./CP
389      A23M4L=A2*(A3-A4)*ELWV
390      RDTCNVC=1./DTCNVC
391!
392      DEEP=.FALSE.
393      SHALLOW=.FALSE.
394!
395      DSP0=0.
396      DSPB=0.
397      DSPT=0.
398      PSP=0.
399!-----------------------------------------------------------------------
400      TAUK=DTCNVC/TREL
401      TAUKSC=DTCNVC/(1.0*TREL)
402!-----------------------------------------------------------------------
403!-----------------------------PREPARATIONS------------------------------
404!-----------------------------------------------------------------------
405      LBOT=LMH
406      THESP=0.
407      PCPCOL=0.
408      TREF(KTS)=T(KTS)
409!
410      KBMAX=LMH
411!
412      DO L=KTS,LMH
413        APESTS=PRSMID(L)
414        APE(L)=(1.E5/APESTS)**CAPA
415      ENDDO
416!-----------------------------------------------------------------------
417!----------------SEARCH FOR MAXIMUM BUOYANCY LEVEL----------------------
418!-----------------------------------------------------------------------
419                             DO 170 KB=1,LMH
420!-----------------------------------------------------------------------
421!----------------TRIAL MAXIMUM BUOYANCY LEVEL VARIABLES-----------------
422!-----------------------------------------------------------------------
423!
424      PKL=PRSMID(KB)
425      PLMH=PRSMID(LMH)
426!
427!-----------------------------------------------------------------------
428!***  SEARCH OVER A SCALED DEPTH IN FINDING THE PARCEL
429!***  WITH THE MAX THETA-E
430!-----------------------------------------------------------------------
431      IF(KB<=LMH)THEN
432!-----------------------------------------------------------------------
433        QBT=Q(KB)
434        TTHBT=T(KB)*APE(KB)
435        TTH=(TTHBT-THL)*RDTH
436        QQ1=TTH-AINT(TTH)
437        ITTB=INT(TTH)+1
438!----------------KEEPING INDICES WITHIN THE TABLE-----------------------
439        IF(ITTB<1)THEN
440          ITTB=1
441          QQ1=0.
442        ENDIF
443!
444        IF(ITTB>=JTB)THEN
445          ITTB=JTB-1
446          QQ1=0.
447        ENDIF
448!--------------BASE AND SCALING FACTOR FOR SPEC. HUMIDITY---------------
449        ITTBK=ITTB
450        BQS00K=QS0(ITTBK)
451        SQS00K=SQS(ITTBK)
452        BQS10K=QS0(ITTBK+1)
453        SQS10K=SQS(ITTBK+1)
454!--------------SCALING SPEC. HUMIDITY & TABLE INDEX---------------------
455        BQ=(BQS10K-BQS00K)*QQ1+BQS00K
456        SQ=(SQS10K-SQS00K)*QQ1+SQS00K
457        TQ=(QBT-BQ)/SQ*RDQ
458        PP1=TQ-AINT(TQ)
459        IQTB=INT(TQ)+1
460!----------------KEEPING INDICES WITHIN THE TABLE-----------------------
461        IF(IQTB<1)THEN
462          IQTB=1
463          PP1=0.
464        ENDIF
465!
466        IF(IQTB>=ITB)THEN
467          IQTB=ITB-1
468          PP1=0.
469        ENDIF
470!--------------SATURATION PRESSURE AT FOUR SURROUNDING TABLE PTS.-------
471        IQ=IQTB
472        IT=ITTB
473        P00K=PTBL(IQ  ,IT  )
474        P10K=PTBL(IQ+1,IT  )
475        P01K=PTBL(IQ  ,IT+1)
476        P11K=PTBL(IQ+1,IT+1)
477!
478!--------------SATURATION POINT VARIABLES AT THE BOTTOM-----------------
479!
480        TPSP=P00K+(P10K-P00K)*PP1+(P01K-P00K)*QQ1                       &
481     &           +(P00K-P10K-P01K+P11K)*PP1*QQ1
482        APESP=(1.E5/TPSP)**CAPA
483        TTHES=TTHBT*EXP(ELOCP*QBT*APESP/TTHBT)
484        THES(KB)=TTHES
485!
486!--------------CHECK FOR MAXIMUM BUOYANCY-------------------------------
487!
488          IF(PKL>=ELEVFC*PLMH.AND.TTHES>THESP)THEN
489            PSP  =TPSP
490            APES =APESP
491            THBT =TTHBT
492            THESP=TTHES
493            QQBT=QBT
494            KBMAX=KB
495          ENDIF ! End of search for maximum buoyancy level
496!-----------------------------------------------------------------------
497      ENDIF
498!-----------------------------------------------------------------------
499  170 CONTINUE
500!-----------------------------------------------------------------------
501!-----------CHOOSE CLOUD BASE AS MODEL LEVEL JUST BELOW PSP-------------
502!-----------------------------------------------------------------------
503      DO L=KTS,LMH-1
504        P=PRSMID(L)
505        IF(P<PSP.AND.P>=PQM)LBOT=L+1
506      ENDDO
507!***
508!*** WARNING: LBOT MUST NOT BE GT LMH-1 IN SHALLOW CONVECTION
509!*** MAKE SURE CLOUD BASE IS AT LEAST PONE ABOVE THE SURFACE
510!***
511      PBOT=PRSMID(LBOT)
512      PLMH=PRSMID(LMH)
513      IF(PBOT>=PLMH-PONE.OR.LBOT>=LMH)THEN
514!
515        DO L=KTS,LMH-1
516          P=PRSMID(L)
517          IF(P<PLMH-PONE)LBOT=L
518        ENDDO
519!
520        PBOT=PRSMID(LBOT)
521      ENDIF
522!-----------------------------------------------------------------------
523!----------------CLOUD TOP COMPUTATION----------------------------------
524!-----------------------------------------------------------------------
525      LTOP=LBOT
526      PTOP=PBOT
527!----------------ENTRAINMENT DURING PARTICLE ASCENT---------------------
528!
529      DO L=LMH,KBMAX,-1
530        THES(L)=THESP
531      ENDDO
532!
533      DO L=KTS,LMH
534        THEE(L)=THES(L)
535      ENDDO
536!
537      FEFI=(CLDEFI-EFIMN)*SLOPE+EFMNT
538      FFUP=FUP/(FEFI*FEFI)
539!
540      IF(PBOT>ENPLO)THEN
541        FPRS=1.
542      ELSEIF(PBOT>ENPUP)THEN
543        FPRS=(PBOT-ENPUP)*RENDP
544      ELSE
545        FPRS=0.
546      ENDIF
547!
548      FFUP=FFUP*FPRS*FPRS*0.5
549      DPUP=DPRS(KBMAX)
550!
551      DO L=KBMAX-1,KTS,-1
552        DPLO=DPUP
553        DPUP=DPRS(L)
554!
555        THES(L)=((-FFUP*DPLO+1.)*THES(L+1)                              &
556     &          +(THEE(L)*DPUP+THEE(L+1)*DPLO)*FFUP)                    &
557     &         /(FFUP*DPUP+1.)
558      ENDDO
559!-----------------------------------------------------------------------
560!***
561!***  COMPUTE PARCEL TEMPERATURE ALONG THE ASCENT TRAJECTORY
562!***  SCALING PRESSURE & TT TABLE INDEX.
563!***
564!
565      DO L=LMH,KTS,-1
566!
567        PRESK=PRSMID(L)
568!
569        IF(PRESK<PLQ)THEN
570          CALL TTBLEX(ITB,JTB,PL,PRESK,RDP,RDTHE                        &
571     &               ,STHE,THE0,THES(L),TTBL,TREF(L))
572        ELSE
573          CALL TTBLEX(ITBQ,JTBQ,PLQ,PRESK,RDPQ,RDTHEQ                   &
574     &               ,STHEQ,THE0Q,THES(L),TTBLQ,TREF(L))
575        ENDIF
576!
577      ENDDO
578!
579!-----------------------------------------------------------------------
580!----------------BUOYANCY CHECK-----------------------------------------
581!-----------------------------------------------------------------------
582!
583      DO L=LMH,KTS,-1
584        IF(TREF(L)>T(L)-DTTOP)LTOP=L
585      ENDDO
586!
587!***  CLOUD TOP PRESSURE
588!
589      PTOP=PRSMID(LTOP)
590!
591!------------------FIRST ENTROPY CHECK----------------------------------
592!
593!      IF(KBMAX>LBOT.AND.LBOT>LTOP)THEN
594!!-----------------------------------------------------------------------
595!        DENTPY=0.
596!        SUMDP=0.
597!        L=KBMAX
598!        PLO=PRSMID(L)
599!        TRMLO=0.
600!!
601!        DO L=KBMAX-1,LBOT+1,-1
602!          PUP=PRSMID(L)
603!          TUP=THBT/APE(L)
604!          DP=PLO-PUP
605!          TRMUP=(TUP*(QQBT*0.608+1.)                                    &
606!     &          -T(L)*(Q(L)*0.608+1.))*0.5                              &
607!     &           /(T(L)*(Q(L)*0.608+1.))
608!          DENTPY=(TRMLO+TRMUP)*DP+DENTPY
609!          SUMDP=SUMDP+DP
610!          PLO=PUP
611!          TRMLO=TRMUP
612!        ENDDO
613!!
614!        L=LBOT
615!        PUP=PSP
616!        TUP=THBT/APES
617!        TSP=(T(L+1)-T(L))/(PLO-PBOT)                                    &
618!     &     *(PUP-PBOT)+T(L)
619!        QSP=(Q(L+1)-Q(L))/(PLO-PBOT)                                    &
620!     &     *(PUP-PBOT)+Q(L)
621!        DP=PLO-PUP
622!        TRMUP=(TUP*(QQBT*0.608+1.)                                      &
623!     &        -TSP*(QSP*0.608+1.))*0.5                                  &
624!     &       /(TSP*(QSP*0.608+1.))
625!        DENTPY=(TRMLO+TRMUP)*DP+DENTPY
626!        SUMDP=SUMDP+DP
627!        PLO=PUP
628!        TRMLO=TRMUP
629!        PUP=PRSMID(L)
630!        TUP=TREF(L)
631!        QUP=PQ0/PUP*EXP(A2*(TUP-A3)/(TUP-A4))
632!        DP=PLO-PUP
633!        TRMUP=(TUP*(QUP*0.608+1.)                                       &
634!     &        -T(L)*(Q(L)*0.608+1.))*0.5                                &
635!     &       /(T(L)*(Q(L)*0.608+1.))
636!        DENTPY=(TRMLO+TRMUP)*DP+DENTPY
637!        SUMDP=SUMDP+DP
638!        PLO=PUP
639!        TRMLO=TRMUP
640!!
641!        DO L=LBOT-1,LTOP
642!          PUP=PRSMID(L)
643!          TUP=TREF(L)
644!          QUP=PQ0/PUP*EXP(A2*(TUP-A3)/(TUP-A4))
645!          DP=PLO-PUP
646!          TRMUP=(TUP*(QUP*0.608+1.)                                     &
647!     &          -T(L)*(Q(L)*0.608+1.))*0.5                              &
648!     &         /(T(L)*(Q(L)*0.608+1.))
649!          DENTPY=(TRMLO+TRMUP)*DP+DENTPY
650!          SUMDP=SUMDP+DP
651!          PLO=PUP
652!          TRMLO=TRMUP
653!        ENDDO
654!!
655!        DENTPY=DENTPY*CP/SUMDP
656!        IF(DENTPY<=EPSNTT)THEN
657!          LTOP=LBOT
658!          PTOP=PBOT
659!        ENDIF
660!!-----------------------------------------------------------------------
661!      ENDIF
662!-----------------------------------------------------------------------
663!***
664!***  CLEAN UP AND GATHER DEEP CONVECTION POINTS
665!***
666      IF(LTOP>=LBOT)THEN
667        LBOT=0
668!!        LTOP=LBOT
669        LTOP=KTE
670        PTOP=PBOT
671      ENDIF
672
673!
674      IF(PTOP>PBOT-PNO.OR.LTOP>LBOT-2)THEN
675        CLDEFI=AVGEFI*SM+STEFI*(1.-SM)
676      ENDIF
677!
678!***  DEPTH OF CLOUD REQUIRED TO MAKE THE POINT A DEEP CONVECTION POINT
679!***  IS A SCALED VALUE OF PSFC.
680!
681      DEPMIN=PSH*PSFC*RSFCP
682      DEPTH=PBOT-PTOP
683!
684      IF(DEPTH>=DEPMIN)THEN
685        DEEP=.TRUE.
686      ENDIF
687!***********************************************************************
688!************************ DEEP CONVECTION ******************************
689!***********************************************************************
690      IF(.NOT.DEEP)GO TO 600
691!***********************************************************************
692!DCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD
693!DCDCDCDCDCDCDC  DEEP CONVECTION   DCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD
694!DCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD
695!
696  300 CONTINUE
697!
698      LB =LBOT
699      EFI=CLDEFI
700!--------------INITIALIZE VARIABLES IN THE CONVECTIVE COLUMN------------
701!***
702!***  ONE SHOULD NOTE THAT THE VALUES ASSIGNED TO THE ARRAY TREFK
703!***  IN THE FOLLOWING LOOP ARE REALLY ONLY RELEVANT IN ANCHORING THE
704!***  REFERENCE TEMPERATURE PROFILE AT LEVEL LB.  WHEN BUILDING THE
705!***  REFERENCE PROFILE FROM CLOUD BASE, THEN ASSIGNING THE
706!***  AMBIENT TEMPERATURE TO TREFK IS ACCEPTABLE.  HOWEVER, WHEN
707!***  BUILDING THE REFERENCE PROFILE FROM SOME OTHER LEVEL (SUCH AS
708!***  ONE LEVEL ABOVE THE GROUND), THEN TREFK SHOULD BE FILLED WITH
709!***  THE TEMPERATURES IN TREF(L) WHICH ARE THE TEMPERATURES OF
710!***  THE MOIST ADIABAT THROUGH CLOUD BASE.  BY THE TIME THE LINE
711!***  NUMBERED 450 HAS BEEN REACHED, TREFK ACTUALLY DOES HOLD THE
712!***  REFERENCE TEMPERATURE PROFILE.
713!***
714      DO L=KTS,LMH
715        DIFT  (L)=0.
716        DIFQ  (L)=0.
717        TKL      =T(L)
718        TK    (L)=TKL
719        TREFK (L)=TKL
720        QKL      =Q(L)
721        QK    (L)=QKL
722        QREFK (L)=QKL
723        PKL      =PRSMID(L)
724        PK    (L)=PKL
725        PSK   (L)=PKL
726        APEKL    =APE(L)
727        APEK  (L)=APEKL
728        THERK (L)=TREF(L)*APEKL
729      ENDDO
730!------------DEEP CONVECTION REFERENCE TEMPERATURE PROFILE------------
731      LTP1=LTOP+1
732      LBM1=LB-1
733      PKB=PK(LB)
734      PKT=PK(LTOP)
735      STABDL=(EFI-EFIMN)*SLOPST+STABDS
736!------------TEMPERATURE REFERENCE PROFILE BELOW FREEZING LEVEL-------
737      EL(LB) = ELWV   
738      L0=LB
739      PK0=PK(LB)
740      TREFKX=TREFK(LB)
741      THERKX=THERK(LB)
742      APEKXX=APEK(LB)
743      THERKY=THERK(LBM1)
744      APEKXY=APEK(LBM1)
745!
746      DO L=LBM1,LTOP,-1
747        IF(T(L+1)<TFRZ)GO TO 430
748        TREFKX=((THERKY-THERKX)*STABDL                                  &
749     &          +TREFKX*APEKXX)/APEKXY
750        TREFK(L)=TREFKX
751        EL(L)=ELWV
752        APEKXX=APEKXY
753        THERKX=THERKY
754        APEKXY=APEK(L-1)
755        THERKY=THERK(L-1)
756        L0=L
757        PK0=PK(L0)
758      ENDDO
759!--------------FREEZING LEVEL AT OR ABOVE THE CLOUD TOP-----------------
760      GO TO 450
761!--------------TEMPERATURE REFERENCE PROFILE ABOVE FREEZING LEVEL-------
762  430 L0M1=L0-1
763      RDP0T=1./(PK0-PKT)
764      DTHEM=THERK(L0)-TREFK(L0)*APEK(L0)
765!
766      DO L=LTOP,L0M1
767        TREFK(L)=(THERK(L)-(PK(L)-PKT)*DTHEM*RDP0T)/APEK(L)
768        EL(L)=ELWV !ELIV
769      ENDDO
770!-----------------------------------------------------------------------
771!--------------DEEP CONVECTION REFERENCE HUMIDITY PROFILE---------------
772!-----------------------------------------------------------------------
773!
774!***  DEPWL IS THE PRESSURE DIFFERENCE BETWEEN CLOUD BASE AND
775!***  THE FREEZING LEVEL
776!
777  450 CONTINUE
778      DEPWL=PKB-PK0
779      DEPTH=PFRZ*PSFC*RSFCP
780      SM1=1.-SM
781      PBOTFC=1.
782!
783!-------------FIRST ADJUSTMENT OF TEMPERATURE PROFILE-------------------
784!!
785!      SUMDT=0.
786!      SUMDP=0.
787!!
788!      DO L=LTOP,LB
789!        SUMDT=(TK(L)-TREFK(L))*DPRS(L)+SUMDT
790!        SUMDP=SUMDP+DPRS(L)
791!      ENDDO
792!!
793!      TCORR=SUMDT/SUMDP
794!!
795!      DO L=LTOP,LB
796!        TREFK(L)=TREFK(L)+TCORR
797!      ENDDO
798!!
799!-----------------------------------------------------------------------
800!--------------- ITERATION LOOP FOR CLOUD EFFICIENCY -------------------
801!-----------------------------------------------------------------------
802!
803      cloud_efficiency : DO ITREFI=1,ITREFI_MAX 
804!
805!-----------------------------------------------------------------------
806      DSPBK=((EFI-EFIMN)*SLOPBS+DSPBSS*PBOTFC)*SM                       &
807     &     +((EFI-EFIMN)*SLOPBL+DSPBSL*PBOTFC)*SM1
808      DSP0K=((EFI-EFIMN)*SLOP0S+DSP0SS*PBOTFC)*SM                       &
809     &     +((EFI-EFIMN)*SLOP0L+DSP0SL*PBOTFC)*SM1
810      DSPTK=((EFI-EFIMN)*SLOPTS+DSPTSS*PBOTFC)*SM                       &
811     &     +((EFI-EFIMN)*SLOPTL+DSPTSL*PBOTFC)*SM1
812!
813!-----------------------------------------------------------------------
814!
815      DO L=LTOP,LB
816!
817!***
818!***  SATURATION PRESSURE DIFFERENCE
819!***
820        IF(DEPWL>=DEPTH)THEN
821          IF(L<L0)THEN
822            DSP=((PK0-PK(L))*DSPTK+(PK(L)-PKT)*DSP0K)/(PK0-PKT)
823          ELSE
824            DSP=((PKB-PK(L))*DSP0K+(PK(L)-PK0)*DSPBK)/(PKB-PK0)
825          ENDIF
826        ELSE
827          DSP=DSP0K
828          IF(L<L0)THEN
829            DSP=((PK0-PK(L))*DSPTK+(PK(L)-PKT)*DSP0K)/(PK0-PKT)
830          ENDIF
831        ENDIF
832!***
833!***  HUMIDITY PROFILE
834!***
835        IF(PK(L)>PQM)THEN
836          PSK(L)=PK(L)+DSP
837          APESK(L)=(1.E5/PSK(L))**CAPA
838          THSK(L)=TREFK(L)*APEK(L)
839          QREFK(L)=PQ0/PSK(L)*EXP(A2*(THSK(L)-A3*APESK(L))              &
840     &                              /(THSK(L)-A4*APESK(L)))
841        ELSE
842          QREFK(L)=QK(L)
843        ENDIF
844!
845      ENDDO
846!-----------------------------------------------------------------------
847!***
848!***  ENTHALPY CONSERVATION INTEGRAL
849!***
850!-----------------------------------------------------------------------
851      enthalpy_conservation : DO ITER=1,2
852!
853        SUMDE=0.
854        SUMDP=0.
855!
856        DO L=LTOP,LB
857          SUMDE=((TK(L)-TREFK(L))*CP+(QK(L)-QREFK(L))*EL(L))*DPRS(L)    &
858     &          +SUMDE
859          SUMDP=SUMDP+DPRS(L)
860        ENDDO
861!
862        HCORR=SUMDE/(SUMDP-DPRS(LTOP))
863        LCOR=LTOP+1
864!***
865!***  FIND LQM
866!***
867        LQM=1
868        DO L=KTS,LB
869          IF(PK(L)<=PQM)LQM=L
870        ENDDO
871!***
872!***  ABOVE LQM CORRECT TEMPERATURE ONLY
873!***
874        IF(LCOR<=LQM)THEN
875          DO L=LCOR,LQM
876            TREFK(L)=TREFK(L)+HCORR*RCP
877          ENDDO
878          LCOR=LQM+1
879        ENDIF
880!***
881!***  BELOW LQM CORRECT BOTH TEMPERATURE AND MOISTURE
882!***
883        DO L=LCOR,LB
884          TSKL=TREFK(L)*APEK(L)/APESK(L)
885          DHDT=QREFK(L)*A23M4L/(TSKL-A4)**2+CP
886          TREFK(L)=HCORR/DHDT+TREFK(L)
887          THSKL=TREFK(L)*APEK(L)
888          QREFK(L)=PQ0/PSK(L)*EXP(A2*(THSKL-A3*APESK(L))                &
889     &                              /(THSKL-A4*APESK(L)))
890        ENDDO
891!
892      ENDDO  enthalpy_conservation
893!-----------------------------------------------------------------------
894!
895!***  HEATING, MOISTENING, PRECIPITATION
896!
897!-----------------------------------------------------------------------
898      AVRGT=0.
899      PRECK=0.
900      DSQ=0.
901      DST=0.
902!
903      DO L=LTOP,LB
904        TKL=TK(L)
905        DIFTL=(TREFK(L)-TKL  )*TAUK
906        DIFQL=(QREFK(L)-QK(L))*TAUK
907        AVRGTL=(TKL+TKL+DIFTL)
908        DPOT=DPRS(L)/AVRGTL
909        DST=DIFTL*DPOT+DST
910        DSQ=DIFQL*EL(L)*DPOT+DSQ
911        AVRGT=AVRGTL*DPRS(L)+AVRGT
912        PRECK=DIFTL*DPRS(L)+PRECK
913        DIFT(L)=DIFTL
914        DIFQ(L)=DIFQL
915      ENDDO
916!
917      DST=(DST+DST)*CP
918      DSQ=DSQ+DSQ
919      DENTPY=DST+DSQ
920      AVRGT=AVRGT/(SUMDP+SUMDP)
921!
922!      DRHEAT=PRECK*CP/AVRGT
923      DRHEAT=(PRECK*SM+MAX(1.E-7,PRECK)*(1.-SM))*CP/AVRGT !As in Eta!
924      DRHEAT=MAX(DRHEAT,1.E-20)
925      EFI=EFIFC*DENTPY/DRHEAT
926!-----------------------------------------------------------------------
927      EFI=MIN(EFI,1.)
928      EFI=MAX(EFI,EFIMN)
929!-----------------------------------------------------------------------
930      ENDDO  cloud_efficiency
931!-----------------------------------------------------------------------
932!
933!-----------------------------------------------------------------------
934!---------------------- DEEP CONVECTION --------------------------------
935!-----------------------------------------------------------------------
936      IF(DENTPY>=EPSNTP.AND.PRECK>EPSPR)THEN
937!
938        CLDEFI=EFI
939        FEFI=EFMNT+SLOPE*(EFI-EFIMN)
940        FEFI=(DENTPY-EPSNTP)*FEFI/DENTPY
941        PRECK=PRECK*FEFI
942!
943!***  UPDATE PRECIPITATION AND TENDENCIES OF TEMPERATURE AND MOISTURE
944!
945        CUP=PRECK*CPRLG
946        PCPCOL=CUP
947!
948        DO L=LTOP,LB
949          DTDT(L)=DIFT(L)*FEFI*RDTCNVC
950          DQDT(L)=DIFQ(L)*FEFI*RDTCNVC
951        ENDDO
952!
953      ELSE
954!
955!-----------------------------------------------------------------------
956!***  REDUCE THE CLOUD TOP
957!-----------------------------------------------------------------------
958!
959!        LTOP=LTOP+3
960!        PTOP=PRSMID(LTOP)
961!        DEPMIN=PSH*PSFC*RSFCP
962!        DEPTH=PBOT-PTOP
963!***
964!***  ITERATE DEEP CONVECTION PROCEDURE IF NEEDED
965!***
966!        IF(DEPTH>=DEPMIN)THEN
967!          GO TO 300
968!        ENDIF
969!
970!        CLDEFI=AVGEFI
971         CLDEFI=EFIMN*SM+STEFI*(1.-SM)
972!***
973!***  SEARCH FOR SHALLOW CLOUD TOP
974!***
975        LTSH=LBOT
976        LBM1=LBOT-1
977        PBTK=PK(LBOT)
978        DEPMIN=PSH*PSFC*RSFCP
979        PTPK=PBTK-DEPMIN
980!***
981!***  CLOUD TOP IS THE LEVEL JUST BELOW PBTK-PSH
982!***
983        DO L=KTS,LMH
984          IF(PK(L)<=PTPK)LTOP=L+1
985        ENDDO
986!
987        PTPK=PK(LTOP)
988!***
989!***  HIGHEST LEVEL ALLOWED IS LEVEL JUST BELOW PSHU
990!***
991        IF(PTPK<=PSHU)THEN
992!
993          DO L=KTS,LMH
994            IF(PK(L)<=PSHU)LSHU=L+1
995          ENDDO
996!
997          LTOP=LSHU
998          PTPK=PK(LTOP)
999        ENDIF
1000!
1001!        if(ltop>=lbot)then
1002!!!!!!     lbot=0
1003!          ltop=lmh
1004!!!!!!     pbot=pk(lbot)
1005!          ptop=pk(ltop)
1006!          pbot=ptop
1007!          go to 600
1008!        endif
1009!
1010        LTP1=LTOP+1
1011        LTP2=LTOP+2
1012!
1013        DO L=LTOP,LBOT
1014          QSATK(L)=PQ0/PK(L)*EXP(A2*(TK(L)-A3)/(TK(L)-A4))
1015        ENDDO
1016!
1017        RHH=QK(LTOP)/QSATK(LTOP)
1018        RHMAX=0.
1019!
1020        DO L=LTP1,LBM1
1021          RHL=QK(L)/QSATK(L)
1022          DRHDP=(RHH-RHL)/(PK(L-1)-PK(L))
1023!
1024          IF(DRHDP>RHMAX)THEN
1025            LTSH=L-1
1026            RHMAX=DRHDP
1027          ENDIF
1028!
1029          RHH=RHL
1030        ENDDO
1031!
1032        LTOP=LTSH
1033!***
1034!***  CLOUD MUST BE AT LEAST TWO LAYERS THICK
1035!***
1036        IF(LBOT-LTOP<2)LTOP=LBOT-2
1037!
1038        PTOP=PK(LTOP)
1039!
1040      ENDIF
1041!DCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD
1042!DCDCDCDCDCDCDC          END OF DEEP CONVECTION            DCDCDCDCDCDCD
1043!DCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD
1044!
1045!-----------------------------------------------------------------------
1046!-----------------------------------------------------------------------
1047  600 CONTINUE
1048!-----------------------------------------------------------------------
1049!-----------------------------------------------------------------------
1050!
1051!----------------GATHER SHALLOW CONVECTION POINTS-----------------------
1052!
1053      IF(PTOP<=PBOT-PNO.AND.LTOP<=LBOT-2)THEN
1054         DEPMIN=PSH*PSFC*RSFCP
1055!
1056!        if(lpbl<lbot)lbot=lpbl
1057!        if(lbot>lmh-1)lbot=lmh-1
1058!        pbot=prsmid(lbot)
1059!
1060         IF(PTOP+1.>=PBOT-DEPMIN)SHALLOW=.TRUE.
1061      ELSE
1062         LBOT=0
1063         LTOP=KTE
1064      ENDIF
1065!
1066!***********************************************************************
1067!-----------------------------------------------------------------------
1068!***  Begin debugging convection
1069      IF(PRINT_DIAG)THEN
1070        WRITE(6,"(a,2i3,L2,3e12.4)")  &
1071             '{cu2a lbot,ltop,shallow,pbot,ptop,depmin = ' &
1072             ,lbot,ltop,shallow,pbot,ptop,depmin
1073      ENDIF
1074!***  End debugging convection
1075!-----------------------------------------------------------------------
1076!
1077      IF(.NOT.SHALLOW)GO TO 800
1078!
1079!-----------------------------------------------------------------------
1080!***********************************************************************
1081!-----------------------------------------------------------------------
1082!SCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCS
1083!SCSCSCSCSCSCSC         SHALLOW CONVECTION          CSCSCSCSCSCSCSCSCSCS
1084!SCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCS
1085!-----------------------------------------------------------------------
1086      DO L=KTS,LMH
1087        TKL      =T(L)
1088        TK   (L) =TKL
1089        TREFK(L) =TKL
1090        QKL      =Q(L)
1091        QK   (L) =QKL
1092        QREFK(L) =QKL
1093        PKL      =PRSMID(L)
1094        PK   (L) =PKL
1095        QSATK(L) =PQ0/PK(L)*EXP(A2*(TK(L)-A3)/(TK(L)-A4))
1096        APEKL    =APE(L)
1097        APEK (L) =APEKL
1098        THVMKL   =TKL*APEKL*(QKL*D608+1.)
1099        THVREF(L)=THVMKL
1100!
1101!        if(tkl>=tfrz)then
1102          EL(L)=ELWV
1103!        else
1104!          el(l)=eliv
1105!        endif
1106      ENDDO
1107!---------------------------SHALLOW CLOUD TOP---------------------------
1108      LBM1=LBOT-1
1109      PTPK=PTOP
1110      LTP1=LTOP-1
1111      DEPTH=PBOT-PTOP
1112!-----------------------------------------------------------------------
1113!***  Begin debugging convection
1114      IF(PRINT_DIAG)THEN
1115        WRITE(6,"(a,4e12.4)") '{cu2b PBOT,PTOP,DEPTH,DEPMIN= ' &
1116             ,PBOT,PTOP,DEPTH,DEPMIN
1117      ENDIF
1118!***  End debugging convection
1119!-----------------------------------------------------------------------
1120!
1121!BSF      IF(DEPTH<DEPMIN)THEN
1122!BSF        GO TO 800
1123!BSF      ENDIF
1124!-----------------------------------------------------------------------
1125      IF(PTOP>PBOT-PNO.OR.LTOP>LBOT-2)THEN
1126        LBOT=0
1127!!!     LTOP=LBOT
1128        LTOP=KTE
1129        PTOP=PBOT
1130        GO TO 800
1131      ENDIF
1132!--------------SCALING POTENTIAL TEMPERATURE & TABLE INDEX AT TOP-------
1133!
1134      THTPK=T(LTP1)*APE(LTP1)
1135!
1136      TTHK=(THTPK-THL)*RDTH
1137      QQK =TTHK-AINT(TTHK)
1138      IT  =INT(TTHK)+1
1139!
1140      IF(IT<1)THEN
1141        IT=1
1142        QQK=0.
1143      ENDIF
1144!
1145      IF(IT>=JTB)THEN
1146        IT=JTB-1
1147        QQK=0.
1148      ENDIF
1149!--------------BASE AND SCALING FACTOR FOR SPEC. HUMIDITY AT TOP--------
1150      BQS00K=QS0(IT)
1151      SQS00K=SQS(IT)
1152      BQS10K=QS0(IT+1)
1153      SQS10K=SQS(IT+1)
1154!--------------SCALING SPEC. HUMIDITY & TABLE INDEX AT TOP--------------
1155      BQK=(BQS10K-BQS00K)*QQK+BQS00K
1156      SQK=(SQS10K-SQS00K)*QQK+SQS00K
1157!
1158!     TQK=(Q(LTOP)-BQK)/SQK*RDQ
1159      TQK=(Q(LTP1)-BQK)/SQK*RDQ
1160!
1161      PPK=TQK-AINT(TQK)
1162      IQ =INT(TQK)+1
1163!
1164      IF(IQ<1)THEN
1165        IQ=1
1166        PPK=0.
1167      ENDIF
1168!
1169      IF(IQ>=ITB)THEN
1170        IQ=ITB-1
1171        PPK=0.
1172      ENDIF
1173!----------------CLOUD TOP SATURATION POINT PRESSURE--------------------
1174      PART1=(PTBL(IQ+1,IT)-PTBL(IQ,IT))*PPK
1175      PART2=(PTBL(IQ,IT+1)-PTBL(IQ,IT))*QQK
1176      PART3=(PTBL(IQ  ,IT  )-PTBL(IQ+1,IT  )                            &
1177     &      -PTBL(IQ  ,IT+1)+PTBL(IQ+1,IT+1))*PPK*QQK
1178      PTPK=PTBL(IQ,IT)+PART1+PART2+PART3
1179!-----------------------------------------------------------------------
1180      DPMIX=PTPK-PSP
1181      IF(ABS(DPMIX).LT.3000.)DPMIX=-3000.
1182!----------------TEMPERATURE PROFILE SLOPE------------------------------
1183      SMIX=(THTPK-THBT)/DPMIX*STABS
1184!
1185      TREFKX=TREFK(LBOT+1)
1186      PKXXXX=PK(LBOT+1)
1187      PKXXXY=PK(LBOT)
1188      APEKXX=APEK(LBOT+1)
1189      APEKXY=APEK(LBOT)
1190!
1191      DO L=LBOT,LTOP,-1
1192        TREFKX=((PKXXXY-PKXXXX)*SMIX                                    &
1193     &          +TREFKX*APEKXX)/APEKXY
1194        TREFK(L)=TREFKX
1195        APEKXX=APEKXY
1196        PKXXXX=PKXXXY
1197        APEKXY=APEK(L-1)
1198        PKXXXY=PK(L-1)
1199      ENDDO
1200!----------------TEMPERATURE REFERENCE PROFILE CORRECTION---------------
1201      SUMDT=0.
1202      SUMDP=0.
1203!
1204      DO L=LTOP,LBOT
1205        SUMDT=(TK(L)-TREFK(L))*DPRS(L)+SUMDT
1206        SUMDP=SUMDP+DPRS(L)
1207      ENDDO
1208!
1209      RDPSUM=1./SUMDP
1210      FPK(LBOT)=TREFK(LBOT)
1211!
1212      TCORR=SUMDT*RDPSUM
1213!
1214      DO L=LTOP,LBOT
1215        TRFKL   =TREFK(L)+TCORR
1216        TREFK(L)=TRFKL
1217        FPK  (L)=TRFKL
1218      ENDDO
1219!----------------HUMIDITY PROFILE EQUATIONS-----------------------------
1220      PSUM  =0.
1221      QSUM  =0.
1222      POTSUM=0.
1223      QOTSUM=0.
1224      OTSUM =0.
1225      DST   =0.
1226      FPTK  =FPK(LTOP)
1227!
1228      DO L=LTOP,LBOT
1229        DPKL  =FPK(L)-FPTK
1230        PSUM  =DPKL *DPRS(L)+PSUM
1231        QSUM  =QK(L)*DPRS(L)+QSUM
1232        RTBAR =2./(TREFK(L)+TK(L))
1233        OTSUM =DPRS(L)*RTBAR+OTSUM
1234        POTSUM=DPKL    *RTBAR*DPRS(L)+POTSUM
1235        QOTSUM=QK(L)   *RTBAR*DPRS(L)+QOTSUM
1236        DST   =(TREFK(L)-TK(L))*RTBAR*DPRS(L)/EL(L)+DST
1237      ENDDO
1238!
1239      PSUM  =PSUM*RDPSUM
1240      QSUM  =QSUM*RDPSUM
1241      ROTSUM=1./OTSUM
1242      POTSUM=POTSUM*ROTSUM
1243      QOTSUM=QOTSUM*ROTSUM
1244      DST   =DST*ROTSUM*CP
1245!
1246!-----------------------------------------------------------------------
1247!***  Begin debugging convection
1248      IF(PRINT_DIAG)THEN
1249        WRITE(6,"(a,5e12.4)") '{cu2c DST,PSUM,QSUM,POTSUM,QOTSUM = ' &
1250             ,DST,PSUM,QSUM,POTSUM,QOTSUM
1251      ENDIF
1252!***  End debugging convection
1253!-----------------------------------------------------------------------
1254!
1255!----------------ENSURE POSITIVE ENTROPY CHANGE-------------------------
1256      IF(DST>0.)THEN
1257!        dstq=dst*epsup
1258        LBOT=0
1259!!!!    LTOP=LBOT
1260        LTOP=KTE
1261        PTOP=PBOT
1262        GO TO 800
1263      ELSE
1264        DSTQ=DST*EPSDN
1265      ENDIF
1266!----------------CHECK FOR ISOTHERMAL ATMOSPHERE------------------------
1267      DEN=POTSUM-PSUM
1268!
1269      IF(-DEN/PSUM<5.E-5)THEN
1270        LBOT=0
1271!!!!    LTOP=LBOT
1272        LTOP=KTE
1273        PTOP=PBOT
1274        GO TO 800
1275!
1276!----------------SLOPE OF THE REFERENCE HUMIDITY PROFILE----------------
1277      ELSE
1278        DQREF=(QOTSUM-DSTQ-QSUM)/DEN
1279      ENDIF
1280!-------------- HUMIDITY DOES NOT INCREASE WITH HEIGHT------------------
1281      IF(DQREF<0.)THEN
1282        LBOT=0
1283!!!!    LTOP=LBOT
1284        LTOP=KTE
1285        PTOP=PBOT
1286        GO TO 800
1287      ENDIF
1288!----------------HUMIDITY AT THE CLOUD TOP------------------------------
1289      QRFTP=QSUM-DQREF*PSUM
1290!----------------HUMIDITY PROFILE---------------------------------------
1291!
1292      DO L=LTOP,LBOT
1293        QRFKL=(FPK(L)-FPTK)*DQREF+QRFTP
1294!
1295!***  TOO DRY CLOUDS NOT ALLOWED
1296!
1297        TNEW=(TREFK(L)-TK(L))*TAUKSC+TK(L)
1298        QSATK(L)=PQ0/PK(L)*EXP(A2*(TNEW-A3)/(TNEW-A4))
1299        QNEW=(QRFKL-QK(L))*TAUKSC+QK(L)
1300!
1301        IF(QNEW<QSATK(L)*RHLSC)THEN
1302          LBOT=0
1303!!!!      LTOP=LBOT
1304          LTOP=KTE
1305          PTOP=PBOT
1306          GO TO 800
1307        ENDIF
1308!
1309!-------------TOO MOIST CLOUDS NOT ALLOWED------------------------------
1310!
1311        IF(QNEW>QSATK(L)*RHHSC)THEN
1312          LBOT=0
1313!!!!      LTOP=LBOT
1314          LTOP=KTE
1315          PTOP=PBOT
1316          GO TO 800
1317        ENDIF
1318
1319!
1320        THVREF(L)=TREFK(L)*APEK(L)*(QRFKL*D608+1.)
1321        QREFK(L)=QRFKL
1322      ENDDO
1323!
1324!------------------ ELIMINATE CLOUDS WITH BOTTOMS TOO DRY --------------
1325!!
1326!      qnew=(qrefk(lbot)-qk(lbot))*tauksc+qk(lbot)
1327!!
1328!      if(qnew<qk(lbot+1)*stresh)then  !!?? stresh too large!!
1329!        lbot=0
1330!!!!!!   ltop=lbot
1331!        ltop=kte
1332!        ptop=pbot
1333!        go to 800
1334!      endif
1335!!
1336!-------------- ELIMINATE IMPOSSIBLE SLOPES (BETTS,DTHETA/DQ)------------
1337!
1338      DO L=LTOP,LBOT
1339        DTDP=(THVREF(L-1)-THVREF(L))/(PRSMID(L)-PRSMID(L-1))
1340!
1341        IF(DTDP<EPSDT)THEN
1342          LBOT=0
1343!!!!!     LTOP=LBOT
1344          LTOP=KTE
1345          PTOP=PBOT
1346          GO TO 800
1347        ENDIF
1348!
1349      ENDDO
1350!-----------------------------------------------------------------------
1351!--------------RELAXATION TOWARD REFERENCE PROFILES---------------------
1352!-----------------------------------------------------------------------
1353!
1354      DO L=LTOP,LBOT
1355        DTDT(L)=(TREFK(L)-TK(L))*TAUKSC*RDTCNVC
1356        DQDT(L)=(QREFK(L)-QK(L))*TAUKSC*RDTCNVC
1357      ENDDO
1358!
1359!-----------------------------------------------------------------------
1360!***  Begin debugging convection
1361      IF(PRINT_DIAG)THEN
1362        DO L=LBOT,LTOP,-1
1363          WRITE(6,"(a,i3,4e12.4)") '{cu2 KFLIP,DT,DTDT,DQ,DQDT = ' &
1364               ,KTE+1-L,TREFK(L)-TK(L),DTDT(L),QREFK(L)-QK(L),DQDT(L)
1365        ENDDO
1366      ENDIF
1367!***  End debugging convection
1368!-----------------------------------------------------------------------
1369!
1370!-----------------------------------------------------------------------
1371!SCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCS
1372!SCSCSCSCSCSCSC         END OF SHALLOW CONVECTION        SCSCSCSCSCSCSCS
1373!SCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCS
1374!-----------------------------------------------------------------------
1375  800 CONTINUE
1376!-----------------------------------------------------------------------
1377      END SUBROUTINE BMJ
1378!-----------------------------------------------------------------------
1379!XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
1380!-----------------------------------------------------------------------
1381                           SUBROUTINE TTBLEX                            &
1382     & (ITBX,JTBX,PLX,PRSMID,RDPX,RDTHEX,STHE                           &
1383     & ,THE0,THESP,TTBL,TREF)
1384!-----------------------------------------------------------------------
1385!     ******************************************************************
1386!     *                                                                *
1387!     *           EXTRACT TEMPERATURE OF THE MOIST ADIABAT FROM        *
1388!     *                      THE APPROPRIATE TTBL                      *
1389!     *                                                                *
1390!     ******************************************************************
1391!-----------------------------------------------------------------------
1392      IMPLICIT NONE
1393!-----------------------------------------------------------------------
1394      INTEGER,INTENT(IN) :: ITBX,JTBX
1395!
1396      REAL,INTENT(IN) :: PLX,PRSMID,RDPX,RDTHEX,THESP
1397!
1398      REAL,DIMENSION(ITBX),INTENT(IN) :: STHE,THE0
1399!
1400      REAL,DIMENSION(JTBX,ITBX),INTENT(IN) :: TTBL
1401!
1402      REAL,INTENT(OUT) :: TREF
1403!-----------------------------------------------------------------------
1404      REAL :: BTHE00K,BTHE10K,BTHK,PK,PP,QQ,STHE00K,STHE10K,STHK        &
1405     &       ,T00K,T01K,T10K,T11K,TPK,TTHK
1406!
1407      INTEGER :: IPTB,ITHTB
1408!-----------------------------------------------------------------------
1409!----------------SCALING PRESSURE & TT TABLE INDEX----------------------
1410!-----------------------------------------------------------------------
1411      PK=PRSMID
1412      TPK=(PK-PLX)*RDPX
1413      QQ=TPK-AINT(TPK)
1414      IPTB=INT(TPK)+1
1415!----------------KEEPING INDICES WITHIN THE TABLE-----------------------
1416      IF(IPTB<1)THEN
1417        IPTB=1
1418        QQ=0.
1419      ENDIF
1420!
1421      IF(IPTB>=ITBX)THEN
1422        IPTB=ITBX-1
1423        QQ=0.
1424      ENDIF
1425!----------------BASE AND SCALING FACTOR FOR THETAE---------------------
1426      BTHE00K=THE0(IPTB)
1427      STHE00K=STHE(IPTB)
1428      BTHE10K=THE0(IPTB+1)
1429      STHE10K=STHE(IPTB+1)
1430!----------------SCALING THE & TT TABLE INDEX---------------------------
1431      BTHK=(BTHE10K-BTHE00K)*QQ+BTHE00K
1432      STHK=(STHE10K-STHE00K)*QQ+STHE00K
1433      TTHK=(THESP-BTHK)/STHK*RDTHEX
1434      PP=TTHK-AINT(TTHK)
1435      ITHTB=INT(TTHK)+1
1436!----------------KEEPING INDICES WITHIN THE TABLE-----------------------
1437      IF(ITHTB<1)THEN
1438        ITHTB=1
1439        PP=0.
1440      ENDIF
1441!
1442      IF(ITHTB>=JTBX)THEN
1443        ITHTB=JTBX-1
1444        PP=0.
1445      ENDIF
1446!----------------TEMPERATURE AT FOUR SURROUNDING TT TABLE PTS.----------
1447      T00K=TTBL(ITHTB,IPTB)
1448      T10K=TTBL(ITHTB+1,IPTB)
1449      T01K=TTBL(ITHTB,IPTB+1)
1450      T11K=TTBL(ITHTB+1,IPTB+1)
1451!-----------------------------------------------------------------------
1452!----------------PARCEL TEMPERATURE-------------------------------------
1453!-----------------------------------------------------------------------
1454      TREF=(T00K+(T10K-T00K)*PP+(T01K-T00K)*QQ                          &
1455     &    +(T00K-T10K-T01K+T11K)*PP*QQ)
1456!-----------------------------------------------------------------------
1457      END SUBROUTINE TTBLEX
1458!-----------------------------------------------------------------------
1459!-----------------------------------------------------------------------
1460      SUBROUTINE BMJINIT(RTHCUTEN,RQVCUTEN,RQCCUTEN,RQRCUTEN            &
1461     &                  ,CLDEFI,LOWLYR,CP,RD,RESTART                    &
1462     &                  ,ALLOWED_TO_READ                                &
1463     &                  ,IDS,IDE,JDS,JDE,KDS,KDE                        &
1464     &                  ,IMS,IME,JMS,JME,KMS,KME                        &
1465     &                  ,ITS,ITE,JTS,JTE,KTS,KTE)
1466!-----------------------------------------------------------------------
1467      IMPLICIT NONE
1468!-----------------------------------------------------------------------
1469      LOGICAL,INTENT(IN) :: RESTART,ALLOWED_TO_READ
1470      INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE                     &
1471     &                     ,IMS,IME,JMS,JME,KMS,KME                     &
1472     &                     ,ITS,ITE,JTS,JTE,KTS,KTE
1473!
1474      REAL,INTENT(IN) :: CP,RD
1475!
1476      REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(OUT) ::            &
1477     &                                              RTHCUTEN            &
1478     &                                             ,RQVCUTEN            &
1479     &                                             ,RQCCUTEN            &
1480     &                                             ,RQRCUTEN
1481!
1482      REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(OUT) :: CLDEFI
1483
1484      INTEGER,DIMENSION(IMS:IME,JMS:JME),INTENT(INOUT) :: LOWLYR
1485!
1486      REAL,PARAMETER :: ELIWV=2.683E6,EPS=1.E-9
1487!
1488      REAL, DIMENSION(JTB) :: APP,APT,AQP,AQT,PNEW,POLD,QSNEW,QSOLD     &
1489     &                       ,THENEW,THEOLD,TNEW,TOLD,Y2P,Y2T
1490!
1491      REAL,DIMENSION(JTBQ) :: APTQ,AQTQ,THENEWQ,THEOLDQ                 &
1492     &                       ,TNEWQ,TOLDQ,Y2TQ
1493!
1494      INTEGER :: I,J,K,ITF,JTF,KTF
1495      INTEGER :: KTH,KTHM,KTHM1,KP,KPM,KPM1
1496!
1497      REAL :: APE,DP,DQS,DTH,DTHE,P,QS,QS0K,SQSK,STHEK                  &
1498     &       ,TH,THE0K,DENOM
1499!-----------------------------------------------------------------------
1500
1501      JTF=MIN0(JTE,JDE-1)
1502      KTF=MIN0(KTE,KDE-1)
1503      ITF=MIN0(ITE,IDE-1)
1504!
1505      IF(.NOT.RESTART)THEN
1506        DO J=JTS,JTF
1507        DO K=KTS,KTF
1508        DO I=ITS,ITF
1509          RTHCUTEN(I,K,J)=0.
1510          RQVCUTEN(I,K,J)=0.
1511          RQCCUTEN(I,K,J)=0.
1512          RQRCUTEN(I,K,J)=0.
1513        ENDDO
1514        ENDDO
1515        ENDDO
1516!
1517        DO J=JTS,JTF
1518        DO I=ITS,ITF
1519          CLDEFI(I,J)=AVGEFI
1520        ENDDO
1521        ENDDO
1522      ENDIF
1523!
1524!***  FOR NOW, ASSUME SIGMA MODE FOR LOWEST MODEL LAYER
1525!
1526      DO J=JTS,JTF
1527      DO I=ITS,ITF
1528        LOWLYR(I,J)=1
1529      ENDDO
1530      ENDDO
1531!-----------------------------------------------------------------------
1532!----------------COARSE LOOK-UP TABLE FOR SATURATION POINT--------------
1533!-----------------------------------------------------------------------
1534!
1535      KTHM=JTB
1536      KPM=ITB
1537      KTHM1=KTHM-1
1538      KPM1=KPM-1
1539!
1540      DTH=(THH-THL)/REAL(KTHM-1)
1541      DP =(PH -PL )/REAL(KPM -1)
1542!
1543      TH=THL-DTH
1544!-----------------------------------------------------------------------
1545      DO 100 KTH=1,KTHM
1546!
1547      TH=TH+DTH
1548      P=PL-DP
1549!
1550      DO KP=1,KPM
1551        P=P+DP
1552        APE=(100000./P)**(RD/CP)
1553        DENOM=TH-A4*APE
1554        IF (DENOM>EPS) THEN
1555           QSOLD(KP)=PQ0/P*EXP(A2*(TH-A3*APE)/DENOM)
1556        ELSE
1557           QSOLD(KP)=0.
1558        ENDIF
1559        POLD(KP)=P
1560      ENDDO
1561!
1562      QS0K=QSOLD(1)
1563      SQSK=QSOLD(KPM)-QSOLD(1)
1564      QSOLD(1  )=0.
1565      QSOLD(KPM)=1.
1566!
1567      DO KP=2,KPM1
1568        QSOLD(KP)=(QSOLD(KP)-QS0K)/SQSK
1569        IF((QSOLD(KP)-QSOLD(KP-1)).LT.EPS)QSOLD(KP)=QSOLD(KP-1)+EPS
1570      ENDDO
1571!
1572      QS0(KTH)=QS0K
1573      QS0_EXP(KTH)=QS0K
1574      SQS(KTH)=SQSK
1575      SQS_EXP(KTH)=SQSK
1576!-----------------------------------------------------------------------
1577      QSNEW(1  )=0.
1578      QSNEW(KPM)=1.
1579      DQS=1./REAL(KPM-1)
1580!
1581      DO KP=2,KPM1
1582        QSNEW(KP)=QSNEW(KP-1)+DQS
1583      ENDDO
1584!
1585      Y2P(1   )=0.
1586      Y2P(KPM )=0.
1587!
1588      CALL SPLINE(JTB,KPM,QSOLD,POLD,Y2P,KPM,QSNEW,PNEW,APP,AQP)
1589!
1590      DO KP=1,KPM
1591        PTBL(KP,KTH)=PNEW(KP)
1592        PTBL_EXP(KP,KTH)=PNEW(KP)
1593      ENDDO
1594!-----------------------------------------------------------------------
1595  100 CONTINUE
1596!-----------------------------------------------------------------------
1597!------------COARSE LOOK-UP TABLE FOR T(P) FROM CONSTANT THE------------
1598!-----------------------------------------------------------------------
1599      P=PL-DP
1600!
1601      DO 200 KP=1,KPM
1602!
1603      P=P+DP
1604      TH=THL-DTH
1605!
1606      DO KTH=1,KTHM
1607        TH=TH+DTH
1608        APE=(1.E5/P)**(RD/CP)
1609        DENOM=TH-A4*APE
1610        IF (DENOM>EPS) THEN
1611           QS=PQ0/P*EXP(A2*(TH-A3*APE)/DENOM)
1612        ELSE
1613           QS=0.
1614        ENDIF
1615!        QS=PQ0/P*EXP(A2*(TH-A3*APE)/(TH-A4*APE))
1616        TOLD(KTH)=TH/APE
1617        THEOLD(KTH)=TH*EXP(ELIWV*QS/(CP*TOLD(KTH)))
1618      ENDDO
1619!
1620      THE0K=THEOLD(1)
1621      STHEK=THEOLD(KTHM)-THEOLD(1)
1622      THEOLD(1   )=0.
1623      THEOLD(KTHM)=1.
1624!
1625      DO KTH=2,KTHM1
1626        THEOLD(KTH)=(THEOLD(KTH)-THE0K)/STHEK
1627        IF((THEOLD(KTH)-THEOLD(KTH-1)).LT.EPS)                          &
1628     &      THEOLD(KTH)=THEOLD(KTH-1)  +  EPS
1629      ENDDO
1630!
1631      THE0(KP)=THE0K
1632      STHE(KP)=STHEK
1633!-----------------------------------------------------------------------
1634      THENEW(1  )=0.
1635      THENEW(KTHM)=1.
1636      DTHE=1./REAL(KTHM-1)
1637!
1638      DO KTH=2,KTHM1
1639        THENEW(KTH)=THENEW(KTH-1)+DTHE
1640      ENDDO
1641!
1642      Y2T(1   )=0.
1643      Y2T(KTHM)=0.
1644!
1645      CALL SPLINE(JTB,KTHM,THEOLD,TOLD,Y2T,KTHM,THENEW,TNEW,APT,AQT)
1646!
1647      DO KTH=1,KTHM
1648        TTBL(KTH,KP)=TNEW(KTH)
1649      ENDDO
1650!-----------------------------------------------------------------------
1651  200 CONTINUE
1652!-----------------------------------------------------------------------
1653!
1654!-----------------------------------------------------------------------
1655!---------------FINE LOOK-UP TABLE FOR SATURATION POINT-----------------
1656!-----------------------------------------------------------------------
1657      KTHM=JTBQ
1658      KPM=ITBQ
1659      KTHM1=KTHM-1
1660      KPM1=KPM-1
1661!
1662      DTH=(THHQ-THL)/REAL(KTHM-1)
1663      DP=(PH-PLQ)/REAL(KPM-1)
1664!
1665      TH=THL-DTH
1666      P=PLQ-DP
1667!-----------------------------------------------------------------------
1668!---------------FINE LOOK-UP TABLE FOR T(P) FROM CONSTANT THE-----------
1669!-----------------------------------------------------------------------
1670      DO 300 KP=1,KPM
1671!
1672      P=P+DP
1673      TH=THL-DTH
1674!
1675      DO KTH=1,KTHM
1676        TH=TH+DTH
1677        APE=(1.E5/P)**(RD/CP)
1678        DENOM=TH-A4*APE
1679        IF (DENOM>EPS) THEN
1680           QS=PQ0/P*EXP(A2*(TH-A3*APE)/DENOM)
1681        ELSE
1682           QS=0.
1683        ENDIF
1684!        QS=PQ0/P*EXP(A2*(TH-A3*APE)/(TH-A4*APE))
1685        TOLDQ(KTH)=TH/APE
1686        THEOLDQ(KTH)=TH*EXP(ELIWV*QS/(CP*TOLDQ(KTH)))
1687      ENDDO
1688!
1689      THE0K=THEOLDQ(1)
1690      STHEK=THEOLDQ(KTHM)-THEOLDQ(1)
1691      THEOLDQ(1   )=0.
1692      THEOLDQ(KTHM)=1.
1693!
1694      DO KTH=2,KTHM1
1695        THEOLDQ(KTH)=(THEOLDQ(KTH)-THE0K)/STHEK
1696        IF((THEOLDQ(KTH)-THEOLDQ(KTH-1))<EPS)                           &
1697     &      THEOLDQ(KTH)=THEOLDQ(KTH-1)+EPS
1698      ENDDO
1699!
1700      THE0Q(KP)=THE0K
1701      STHEQ(KP)=STHEK
1702!-----------------------------------------------------------------------
1703      THENEWQ(1  )=0.
1704      THENEWQ(KTHM)=1.
1705      DTHE=1./REAL(KTHM-1)
1706!
1707      DO KTH=2,KTHM1
1708        THENEWQ(KTH)=THENEWQ(KTH-1)+DTHE
1709      ENDDO
1710!
1711      Y2TQ(1   )=0.
1712      Y2TQ(KTHM)=0.
1713!
1714      CALL SPLINE(JTBQ,KTHM,THEOLDQ,TOLDQ,Y2TQ,KTHM                     &
1715     &           ,THENEWQ,TNEWQ,APTQ,AQTQ)
1716!
1717      DO KTH=1,KTHM
1718        TTBLQ(KTH,KP)=TNEWQ(KTH)
1719      ENDDO
1720!-----------------------------------------------------------------------
1721  300 CONTINUE
1722!-----------------------------------------------------------------------
1723      END SUBROUTINE BMJINIT
1724!-----------------------------------------------------------------------
1725!XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
1726!-----------------------------------------------------------------------
1727      SUBROUTINE SPLINE(JTBX,NOLD,XOLD,YOLD,Y2,NNEW,XNEW,YNEW,P,Q)
1728!   ********************************************************************
1729!   *                                                                  *
1730!   *  THIS IS A ONE-DIMENSIONAL CUBIC SPLINE FITTING ROUTINE          *
1731!   *  PROGRAMED FOR A SMALL SCALAR MACHINE.                           *
1732!   *                                                                  *
1733!   *  PROGRAMER Z. JANJIC                                             *
1734!   *                                                                  *
1735!   *  NOLD - NUMBER OF GIVEN VALUES OF THE FUNCTION.  MUST BE GE 3.   *
1736!   *  XOLD - LOCATIONS OF THE POINTS AT WHICH THE VALUES OF THE       *
1737!   *         FUNCTION ARE GIVEN.  MUST BE IN ASCENDING ORDER.         *
1738!   *  YOLD - THE GIVEN VALUES OF THE FUNCTION AT THE POINTS XOLD.     *
1739!   *  Y2   - THE SECOND DERIVATIVES AT THE POINTS XOLD.  IF NATURAL   *
1740!   *         SPLINE IS FITTED Y2(1)=0. AND Y2(NOLD)=0. MUST BE        *
1741!   *         SPECIFIED.                                               *
1742!   *  NNEW - NUMBER OF VALUES OF THE FUNCTION TO BE CALCULATED.       *
1743!   *  XNEW - LOCATIONS OF THE POINTS AT WHICH THE VALUES OF THE       *
1744!   *         FUNCTION ARE CALCULATED.  XNEW(K) MUST BE GE XOLD(1)     *
1745!   *         AND LE XOLD(NOLD).                                       *
1746!   *  YNEW - THE VALUES OF THE FUNCTION TO BE CALCULATED.             *
1747!   *  P, Q - AUXILIARY VECTORS OF THE LENGTH NOLD-2.                  *
1748!   *                                                                  *
1749!   ********************************************************************
1750!-----------------------------------------------------------------------
1751      IMPLICIT NONE
1752!-----------------------------------------------------------------------
1753      INTEGER,INTENT(IN) :: JTBX,NNEW,NOLD
1754      REAL,DIMENSION(JTBX),INTENT(IN) :: XNEW,XOLD,YOLD
1755      REAL,DIMENSION(JTBX),INTENT(INOUT) :: P,Q,Y2
1756      REAL,DIMENSION(JTBX),INTENT(OUT) :: YNEW
1757!
1758      INTEGER :: K,K1,K2,KOLD,NOLDM1
1759      REAL :: AK,BK,CK,DEN,DX,DXC,DXL,DXR,DYDXL,DYDXR                   &
1760     &       ,RDX,RTDXC,X,XK,XSQ,Y2K,Y2KP1
1761!-----------------------------------------------------------------------
1762      NOLDM1=NOLD-1
1763!
1764      DXL=XOLD(2)-XOLD(1)
1765      DXR=XOLD(3)-XOLD(2)
1766      DYDXL=(YOLD(2)-YOLD(1))/DXL
1767      DYDXR=(YOLD(3)-YOLD(2))/DXR
1768      RTDXC=0.5/(DXL+DXR)
1769!
1770      P(1)= RTDXC*(6.*(DYDXR-DYDXL)-DXL*Y2(1))
1771      Q(1)=-RTDXC*DXR
1772!
1773      IF(NOLD==3)GO TO 150
1774!-----------------------------------------------------------------------
1775      K=3
1776!
1777  100 DXL=DXR
1778      DYDXL=DYDXR
1779      DXR=XOLD(K+1)-XOLD(K)
1780      DYDXR=(YOLD(K+1)-YOLD(K))/DXR
1781      DXC=DXL+DXR
1782      DEN=1./(DXL*Q(K-2)+DXC+DXC)
1783!
1784      P(K-1)= DEN*(6.*(DYDXR-DYDXL)-DXL*P(K-2))
1785      Q(K-1)=-DEN*DXR
1786!
1787      K=K+1
1788      IF(K<NOLD)GO TO 100
1789!-----------------------------------------------------------------------
1790  150 K=NOLDM1
1791!
1792  200 Y2(K)=P(K-1)+Q(K-1)*Y2(K+1)
1793!
1794      K=K-1
1795      IF(K>1)GO TO 200
1796!-----------------------------------------------------------------------
1797      K1=1
1798!
1799  300 XK=XNEW(K1)
1800!
1801      DO 400 K2=2,NOLD
1802!
1803      IF(XOLD(K2)>XK)THEN
1804        KOLD=K2-1
1805        GO TO 450
1806      ENDIF
1807!
1808  400 CONTINUE
1809!
1810      YNEW(K1)=YOLD(NOLD)
1811      GO TO 600
1812!
1813  450 IF(K1==1)GO TO 500
1814      IF(K==KOLD)GO TO 550
1815!
1816  500 K=KOLD
1817!
1818      Y2K=Y2(K)
1819      Y2KP1=Y2(K+1)
1820      DX=XOLD(K+1)-XOLD(K)
1821      RDX=1./DX
1822!
1823      AK=.1666667*RDX*(Y2KP1-Y2K)
1824      BK=0.5*Y2K
1825      CK=RDX*(YOLD(K+1)-YOLD(K))-.1666667*DX*(Y2KP1+Y2K+Y2K)
1826!
1827  550 X=XK-XOLD(K)
1828      XSQ=X*X
1829!
1830      YNEW(K1)=AK*XSQ*X+BK*XSQ+CK*X+YOLD(K)
1831!
1832  600 K1=K1+1
1833      IF(K1<=NNEW)GO TO 300
1834!-----------------------------------------------------------------------
1835      END SUBROUTINE SPLINE
1836!-----------------------------------------------------------------------
1837!
1838      END MODULE MODULE_CU_BMJ
1839!
1840!-----------------------------------------------------------------------
Note: See TracBrowser for help on using the repository browser.