1 !-----------------------------------------------------------------------
3 !WRF:MODEL_LAYER:PHYSICS
5 !-----------------------------------------------------------------------
9 !-----------------------------------------------------------------------
10 USE MODULE_MODEL_CONSTANTS
11 !-----------------------------------------------------------------------
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 &
20 & ,FR=1.00,FSL=0.85,FSS=0.85 &
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 &
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 &
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. &
69 REAL,PARAMETER :: AVGEFI=(EFIMN+1.)*0.5
71 !-----------------------------------------------------------------------
75 !-----------------------------------------------------------------------
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 &
84 & ,PINT,PMID,PI,RHO,DZ8W &
85 & ,CP,R,ELWV,ELIV,G,TFRZ,D608 &
86 & ,CLDEFI,LOWLYR,XLAND,CU_ACT_FLAG &
88 & ,RTHCUTEN, RQVCUTEN &
90 !-----------------------------------------------------------------------
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 &
110 REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME) &
112 & ,INTENT(INOUT) :: RQVCUTEN,RTHCUTEN
114 REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(INOUT) :: CLDEFI,RAINCV, &
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 !-----------------------------------------------------------------------
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
141 !*** Begin debugging convection
142 REAL :: DELQ,DELT,PLYR
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
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
166 if (MOD(ITIMESTEP,STEPCU) .EQ. 0 .or. ITIMESTEP .eq. 0) then
173 !-----------------------------------------------------------------------
175 !*** COMPUTE CONVECTION EVERY STEPCU*DT/60.0 MINUTES
177 !*** Begin debugging convection
181 !*** End debugging convection
187 CU_ACT_FLAG(I,J)=.TRUE.
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
219 !*** CONVERT FROM MIXING RATIO TO SPECIFIC HUMIDITY
221 QCOL(K)=MAX(EPSQ,QV(I,KFLIP,J)/(1.+QV(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)
228 !*** LOWEST LAYER ABOVE GROUND MUST ALSO BE FLIPPED
230 LMH=KTE+1-LOWLYR(I,J)
232 !-----------------------------------------------------------------------
236 !-----------------------------------------------------------------------
237 !*** Begin debugging convection
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 &
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
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
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
282 IF(LBOT>0.AND.LTOP<LBOT)THEN
285 DELQ=DELQ+DPCOL(K)*DTCNVC*ABS(DQDT(K))
286 DELT=DELT+DPCOL(K)*DTCNVC*ABS(DTDT(K))
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))
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)
306 !*** End debugging convection
307 !-----------------------------------------------------------------------
314 END SUBROUTINE BMJDRV
315 !-----------------------------------------------------------------------
316 !XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
317 !-----------------------------------------------------------------------
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 &
325 & ,IDS,IDE,JDS,JDE,KDS,KDE &
326 & ,IMS,IME,JMS,JME,KMS,KME &
327 & ,ITS,ITE,JTS,JTE,KTS,KTE)
328 !-----------------------------------------------------------------------
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 &
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 !-----------------------------------------------------------------------
352 REAL,DIMENSION(KTS:KTE) :: APEK,APESK,EL,FPK &
353 ,PK,PSK,QK,QREFK,QSATK &
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 !-----------------------------------------------------------------------
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 &
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 &
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 !-----------------------------------------------------------------------
421 CPRLG=CP/(ROW*G*ELWV)
424 A23M4L=A2*(A3-A4)*ELWV
426 DEPMIN=PSH*PSFC*RSFCP
434 !-----------------------------------------------------------------------
436 TAUKSC=DTCNVC/(1.0*TREL)
437 !-----------------------------------------------------------------------
438 !-----------------------------PREPARATIONS------------------------------
439 !-----------------------------------------------------------------------
446 APE(L)=(1.E5/APESTS)**CAPA
452 !-----------------------------------------------------------------------
453 !----------------SEARCH FOR MAXIMUM BUOYANCY LEVEL----------------------
454 !-----------------------------------------------------------------------
458 PBTmx=PRSMID(LMH)-PONE
465 !-----------------------------------------------------------------------
466 !----------------TRIAL MAXIMUM BUOYANCY LEVEL VARIABLES-----------------
467 !-----------------------------------------------------------------------
469 max_buoy_loop: DO KB=LMH,1,-1
471 !-----------------------------------------------------------------------
474 ! IF (PKL<PELEVFC .OR. T(KB)<=TFRZ) EXIT
475 IF (PKL<PELEVFC) EXIT
479 !-----------------------------------------------------------------------
480 !*** SEARCH OVER A SCALED DEPTH IN FINDING THE PARCEL
481 !*** WITH THE MAX THETA-E
482 !-----------------------------------------------------------------------
489 !----------------KEEPING INDICES WITHIN THE TABLE-----------------------
493 ELSE IF(ITTB>=JTB)THEN
497 !--------------BASE AND SCALING FACTOR FOR SPEC. HUMIDITY---------------
503 !--------------SCALING SPEC. HUMIDITY & TABLE INDEX---------------------
504 BQ=(BQS10K-BQS00K)*QQ1+BQS00K
505 SQ=(SQS10K-SQS00K)*QQ1+SQS00K
509 !----------------KEEPING INDICES WITHIN THE TABLE-----------------------
513 ELSE IF(IQTB>=ITB)THEN
517 !--------------SATURATION PRESSURE AT FOUR SURROUNDING TABLE PTS.-------
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 !-----------------------------------------------------------------------
538 IF(P<PSP.AND.P>=PQM)LBOT=L+1
541 !*** WARNING: LBOT MUST NOT BE > LMH-1 IN SHALLOW CONVECTION
542 !*** MAKE SURE CLOUD BASE IS AT LEAST PONE ABOVE THE SURFACE
545 IF(PBOT>=PBTmx.OR.LBOT>=LMH)THEN
553 !-----------------------------------------------------------------------
554 !----------------CLOUD TOP COMPUTATION----------------------------------
555 !-----------------------------------------------------------------------
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
571 !--------------- ENTRAINMENT DURING PARCEL ASCENT --------------------
581 ! FEFI=(CLDEFI-EFIMN)*SLOPE+EFMNT
582 ! FFUP=FUP/(FEFI*FEFI)
586 ! ELSEIF(PBOT>ENPUP)THEN
587 ! FPRS=(PBOT-ENPUP)*RENDP
592 ! FFUP=FFUP*FPRS*FPRS*0.5
599 ! THES(L)=((-FFUP*DPLO+1.)*THES(L+1) &
600 ! & +(THEE(L)*DPUP+THEE(L+1)*DPLO)*FFUP) &
604 !-----------------------------------------------------------------------
605 !### END: ########### WARNING ########### WARNING ###########
606 !-----------------------------------------------------------------------
608 !-----------------------------------------------------------------------
609 !!*** COMPUTE PARCEL TEMPERATURE ALONG THE ASCENT TRAJECTORY
610 !!*** SCALING PRESSURE & TT TABLE INDEX.
611 !-----------------------------------------------------------------------
619 ! CALL TTBLEX(ITB,JTB,PL,PRESK,RDP,RDTHE &
620 ! & ,STHE,THE0,THES(L),TTBL,TREF(L))
622 ! CALL TTBLEX(ITBQ,JTBQ,PLQ,PRESK,RDPQ,RDTHEQ &
623 ! & ,STHEQ,THE0Q,THES(L),TTBLQ,TREF(L))
628 !!-----------------------------------------------------------------------
629 !!----------------BUOYANCY CHECK-----------------------------------------
630 !!-----------------------------------------------------------------------
633 ! IF(TREF(L)>T(L)-DTTOP)LTOP=L
636 !!*** CLOUD TOP PRESSURE
640 !------------------FIRST ENTROPY CHECK----------------------------------
646 !-----------------------------------------------------------------------
647 ! lbot_ltop: IF(LBOT>LTOP)THEN
648 !-----------------------------------------------------------------------
649 !-- Begin: Buoyancy check including deep convection (24 Aug 2006)
650 !-----------------------------------------------------------------------
655 CAPEtrigr=DTPtrigr/T(LBOT)
657 !--- Below cloud base
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.))
668 DENTPY=DTV(L)*DP+DENTPY
670 IF (DENTPY < CAPEtrigr) GO TO 170
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
688 TSP=(T(L+1)-T(L))/(PLO-PBOT) &
690 QSP=(Q(L+1)-Q(L))/(PLO-PBOT) &
693 TRMUP=(TUP*(QBT*0.608+1.) &
694 & -TSP*(QSP*0.608+1.))*0.5 &
695 & /(TSP*(QSP*0.608+1.))
697 DENTPY=DTV(L)*DP+DENTPY
704 !--- Calculate updraft temperature along moist adiabat (TUP)
707 CALL TTBLEX(ITB,JTB,PL,PUP,RDP,RDTHE &
708 & ,STHE,THE0,THES(L),TTBL,TUP)
710 CALL TTBLEX(ITBQ,JTBQ,PLQ,PUP,RDPQ,RDTHEQ &
711 & ,STHEQ,THE0Q,THES(L),TTBLQ,TUP)
714 QUP=PQ0/PUP*EXP(A2*(TUP-A3)/(TUP-A4))
715 QWAT=QBT-QUP !-- Water loading effects, reversible adiabat
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
722 DTV(L)=(DTV(L)+(TRMLO+TRMUP)*DP)/(PRSMID(LBOT+1)-PRSMID(LBOT))
724 IF (DENTPY < CAPEtrigr) GO TO 170
729 !-----------------------------------------------------------------------
730 !--- In cloud above cloud base
731 !-----------------------------------------------------------------------
736 !--- Calculate updraft temperature along moist adiabat (TUP)
739 CALL TTBLEX(ITB,JTB,PL,PUP,RDP,RDTHE &
740 & ,STHE,THE0,THES(L),TTBL,TUP)
742 CALL TTBLEX(ITBQ,JTBQ,PLQ,PUP,RDPQ,RDTHEQ &
743 & ,STHEQ,THE0Q,THES(L),TTBLQ,TUP)
746 QUP=PQ0/PUP*EXP(A2*(TUP-A3)/(TUP-A4))
747 QWAT=QBT-QUP !-- Water loading effects, reversible adiabat
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.))
753 DENTPY=DTV(L)*DP+DENTPY
756 IF (DENTPY < CAPEtrigr) GO TO 170
762 !-----------------------------------------------------------------------
767 !-----------------------------------------------------------------------
768 !--- Cloud top level (LTOP) is located where CAPE is a maximum
769 !--- Exit cloud-top search if CAPE < CAPEtrigr
770 !-----------------------------------------------------------------------
773 IF (CPE(L) < CAPEtrigr) THEN
775 ELSE IF (CPE(L) > CAPE) THEN
779 ENDDO !-- End DO L=KB,KTS,-1
783 !-----------------------------------------------------------------------
784 !--------------- CHECK FOR MAXIMUM INSTABILITY ------------------------
785 !-----------------------------------------------------------------------
786 IF(CAPE > CAPEcnv) THEN
797 ENDIF ! End IF(CAPE > CAPEcnv) THEN
801 !-----------------------------------------------------------------------
805 !-----------------------------------------------------------------------
806 !------------------------ MAXIMUM INSTABILITY ------------------------
807 !-----------------------------------------------------------------------
809 IF(CAPEcnv > 0.) THEN
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
834 CLDEFI=AVGEFI*SM+STEFI*(1.-SM)
838 !*** DEPTH OF CLOUD REQUIRED TO MAKE THE POINT A DEEP CONVECTION POINT
839 !*** IS A SCALED VALUE OF PSFC.
843 IF(DEPTH>=DEPMIN) THEN
850 !-----------------------------------------------------------------------
851 !DCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD
852 !DCDCDCDCDCDCDCDCDCDCDC DEEP CONVECTION DCDCDCDCDCDCDCDCDCDCDCDCDCD
853 !DCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD
854 !-----------------------------------------------------------------------
860 !-----------------------------------------------------------------------
861 !--------------INITIALIZE VARIABLES IN THE CONVECTIVE COLUMN------------
862 !-----------------------------------------------------------------------
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.
891 !--- Calculate temperature along moist adiabat (TREF)
894 CALL TTBLEX(ITB,JTB,PL,PKL,RDP,RDTHE &
895 & ,STHE,THE0,THES(L),TTBL,TREF(L))
897 CALL TTBLEX(ITBQ,JTBQ,PLQ,PKL,RDPQ,RDTHEQ &
898 & ,STHEQ,THE0Q,THES(L),TTBLQ,TREF(L))
900 THERK (L)=TREF(L)*APEKL
903 !------------DEEP CONVECTION REFERENCE TEMPERATURE PROFILE------------
909 STABDL=(EFI-EFIMN)*SLOPST+STABDS
911 !------------TEMPERATURE REFERENCE PROFILE BELOW FREEZING LEVEL-------
923 IF(T(L+1)<TFRZ)GO TO 430
924 TREFKX=((THERKY-THERKX)*STABDL &
925 & +TREFKX*APEKXX)/APEKXY
936 !--------------FREEZING LEVEL AT OR ABOVE THE CLOUD TOP-----------------
940 !--------------TEMPERATURE REFERENCE PROFILE ABOVE FREEZING LEVEL-------
944 DTHEM=THERK(L0)-TREFK(L0)*APEK(L0)
947 TREFK(L)=(THERK(L)-(PK(L)-PKT)*DTHEM*RDP0T)/APEK(L)
951 !-----------------------------------------------------------------------
952 !--------------DEEP CONVECTION REFERENCE HUMIDITY PROFILE---------------
953 !-----------------------------------------------------------------------
955 !*** DEPWL IS THE PRESSURE DIFFERENCE BETWEEN CLOUD BASE AND
956 !*** THE FREEZING LEVEL
960 DEPTH=PFRZ*PSFC*RSFCP
964 !-------------FIRST ADJUSTMENT OF TEMPERATURE PROFILE-------------------
970 ! SUMDT=(TK(L)-TREFK(L))*DPRS(L)+SUMDT
971 ! SUMDP=SUMDP+DPRS(L)
977 ! TREFK(L)=TREFK(L)+TCORR
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 !-----------------------------------------------------------------------
999 !*** SATURATION PRESSURE DIFFERENCE
1001 IF(DEPWL>=DEPTH)THEN
1003 DSP=((PK0-PK(L))*DSPTK+(PK(L)-PKT)*DSP0K)/(PK0-PKT)
1005 DSP=((PKB-PK(L))*DSP0K+(PK(L)-PK0)*DSPBK)/(PKB-PK0)
1010 DSP=((PK0-PK(L))*DSPTK+(PK(L)-PKT)*DSP0K)/(PK0-PKT)
1014 !*** HUMIDITY PROFILE
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)))
1027 !-----------------------------------------------------------------------
1029 !*** ENTHALPY CONSERVATION INTEGRAL
1031 !-----------------------------------------------------------------------
1032 enthalpy_conservation : DO ITER=1,2
1038 SUMDE=((TK(L)-TREFK(L))*CP+(QK(L)-QREFK(L))*EL(L))*DPRS(L) &
1043 HCORR=SUMDE/(SUMDP-DPRS(LTOP))
1053 !*** ABOVE LQM CORRECT TEMPERATURE ONLY
1057 TREFK(L)=TREFK(L)+HCORR*RCP
1062 !*** BELOW LQM CORRECT BOTH TEMPERATURE AND MOISTURE
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)))
1073 ENDDO enthalpy_conservation
1074 !-----------------------------------------------------------------------
1076 !*** HEATING, MOISTENING, PRECIPITATION
1078 !-----------------------------------------------------------------------
1086 DIFTL=(TREFK(L)-TKL )*TAUK
1087 DIFQL=(QREFK(L)-QK(L))*TAUK
1088 AVRGTL=(TKL+TKL+DIFTL)
1091 DSQ=DIFQL*EL(L)*DPOT+DSQ
1092 AVRGT=AVRGTL*DPRS(L)+AVRGT
1093 PRECK=DIFTL*DPRS(L)+PRECK
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 !-----------------------------------------------------------------------
1110 !-----------------------------------------------------------------------
1112 ENDDO cloud_efficiency
1114 !-----------------------------------------------------------------------
1116 !-----------------------------------------------------------------------
1117 !---------------------- DEEP CONVECTION --------------------------------
1118 !-----------------------------------------------------------------------
1120 IF(DENTPY>=EPSNTP.AND.PRECK>EPSPR)THEN
1123 FEFI=EFMNT+SLOPE*(EFI-EFIMN)
1124 FEFI=(DENTPY-EPSNTP)*FEFI/DENTPY
1127 !*** UPDATE PRECIPITATION AND TENDENCIES OF TEMPERATURE AND MOISTURE
1133 DTDT(L)=DIFT(L)*FEFI*RDTCNVC
1134 DQDT(L)=DIFQ(L)*FEFI*RDTCNVC
1139 !-----------------------------------------------------------------------
1140 !*** REDUCE THE CLOUD TOP
1141 !-----------------------------------------------------------------------
1145 ! DEPMIN=PSH*PSFC*RSFCP
1148 !*** ITERATE DEEP CONVECTION PROCEDURE IF NEEDED
1150 ! IF(DEPTH>=DEPMIN)THEN
1155 CLDEFI=EFIMN*SM+STEFI*(1.-SM)
1157 !*** SEARCH FOR SHALLOW CLOUD TOP
1162 ! DEPMIN=PSH*PSFC*RSFCP
1164 PTPK=MAX(PSHU, PK(LBOT)-DEPMIN)
1166 !*** CLOUD TOP IS THE LEVEL JUST BELOW PBTK-PSH or JUST BELOW PSHU
1169 IF(PK(L)<=PTPK)LTOP=L+1
1174 !!*** HIGHEST LEVEL ALLOWED IS LEVEL JUST BELOW PSHU
1176 ! IF(PTPK<=PSHU)THEN
1179 ! IF(PK(L)<=PSHU)LSHU=L+1
1186 ! if(ltop>=lbot)then
1189 !!!!!! pbot=pk(lbot)
1199 ! QSATK(L)=PQ0/PK(L)*EXP(A2*(TK(L)-A3)/(TK(L)-A4))
1202 ! RHH=QK(LTOP)/QSATK(LTOP)
1207 ! RHL=QK(L)/QSATK(L)
1208 ! DRHDP=(RHH-RHL)/(PK(L-1)-PK(L))
1210 ! IF(DRHDP>RHMAX)THEN
1218 !-----------------------------------------------------------------------
1219 !-- Make shallow cloud top a function of virtual temperature excess (DTV)
1220 !-----------------------------------------------------------------------
1224 IF (DTV(L) > 0.) THEN
1232 !*** CLOUD MUST BE AT LEAST TWO LAYERS THICK
1234 ! IF(LBOT-LTOP<2)LTOP=LBOT-2 (eliminate this criterion)
1236 !-- End: Buoyancy check (24 Aug 2006)
1243 !DCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD
1244 !DCDCDCDCDCDCDC END OF DEEP CONVECTION DCDCDCDCDCDCD
1245 !DCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD
1247 !-----------------------------------------------------------------------
1248 !-----------------------------------------------------------------------
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.
1268 !***********************************************************************
1269 !-----------------------------------------------------------------------
1270 !*** Begin debugging convection
1272 WRITE(6,"(a,2i3,L2,3e12.4)") &
1273 '{cu2a lbot,ltop,shallow,pbot,ptop,depmin = ' &
1274 ,lbot,ltop,shallow,pbot,ptop,depmin
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 !-----------------------------------------------------------------------
1297 QSATK(L) =PQ0/PK(L)*EXP(A2*(TK(L)-A3)/(TK(L)-A4))
1300 THVMKL =TKL*APEKL*(QKL*D608+1.)
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))
1323 RHAVG=RHAVG+DPRS(L)*QK(L)/QSATK(L)
1327 IF (RHAVG/SUMDP > RHSHmax) THEN
1330 RHAVG=RHAVG+DPRS(L)*QK(L)/QSATK(L)
1332 IF (CPE(L) > 0.) THEN
1337 IF (RHAVG/SUMDP <= RHSHmax) EXIT
1338 IF (PK(L) <= PSHU) EXIT
1343 !-- End: Raise cloud top if avg RH>RHSHmax and CAPE>0
1345 !---------------------------SHALLOW CLOUD TOP---------------------------
1350 !-----------------------------------------------------------------------
1351 !*** Begin debugging convection
1353 WRITE(6,"(a,4e12.4)") '{cu2b PBOT,PTOP,DEPTH,DEPMIN= ' &
1354 ,PBOT,PTOP,DEPTH,DEPMIN
1356 !*** End debugging convection
1357 !-----------------------------------------------------------------------
1359 !BSF IF(DEPTH<DEPMIN)THEN
1362 !-----------------------------------------------------------------------
1363 IF(PTOP>PBOT-PNO.OR.LTOP>LBOT-2)THEN
1371 !--------------SCALING POTENTIAL TEMPERATURE & TABLE INDEX AT TOP-------
1373 THTPK=T(LTP1)*APE(LTP1)
1375 TTHK=(THTPK-THL)*RDTH
1376 QQK =TTHK-AINT(TTHK)
1389 !--------------BASE AND SCALING FACTOR FOR SPEC. HUMIDITY AT TOP--------
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
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 !-----------------------------------------------------------------------
1426 IF(ABS(DPMIX).LT.3000.)DPMIX=-3000.
1428 !----------------TEMPERATURE PROFILE SLOPE------------------------------
1430 SMIX=(THTPK-THBT)/DPMIX*STABS
1432 TREFKX=TREFK(LBOT+1)
1441 TREFKX=((PKXXXY-PKXXXX)*SMIX &
1442 & +TREFKX*APEKXX)/APEKXY
1444 IF(L<=LMID) TREFK(L)=MAX(TREFK(L), TK(L)+DTSHAL)
1451 !----------------TEMPERATURE REFERENCE PROFILE CORRECTION---------------
1457 SUMDT=(TK(L)-TREFK(L))*DPRS(L)+SUMDT
1462 FPK(LBOT)=TREFK(LBOT)
1467 TRFKL =TREFK(L)+TCORR
1472 !----------------HUMIDITY PROFILE EQUATIONS-----------------------------
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
1496 POTSUM=POTSUM*ROTSUM
1497 QOTSUM=QOTSUM*ROTSUM
1500 !-----------------------------------------------------------------------
1501 !*** Begin debugging convection
1503 WRITE(6,"(a,5e12.4)") '{cu2c DST,PSUM,QSUM,POTSUM,QOTSUM = ' &
1504 ,DST,PSUM,QSUM,POTSUM,QOTSUM
1506 !*** End debugging convection
1507 !-----------------------------------------------------------------------
1509 !----------------ENSURE POSITIVE ENTROPY CHANGE-------------------------
1522 !----------------CHECK FOR ISOTHERMAL ATMOSPHERE------------------------
1526 IF(-DEN/PSUM<5.E-5)THEN
1533 !----------------SLOPE OF THE REFERENCE HUMIDITY PROFILE----------------
1536 DQREF=(QOTSUM-DSTQ-QSUM)/DEN
1539 !-------------- HUMIDITY DOES NOT INCREASE WITH HEIGHT------------------
1549 !----------------HUMIDITY AT THE CLOUD TOP------------------------------
1551 QRFTP=QSUM-DQREF*PSUM
1553 !----------------HUMIDITY PROFILE---------------------------------------
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
1572 !-------------TOO MOIST CLOUDS NOT ALLOWED------------------------------
1574 IF(QNEW>QSATK(L)*RHHSC)THEN
1583 THVREF(L)=TREFK(L)*APEK(L)*(QRFKL*D608+1.)
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!!
1599 !-------------- ELIMINATE IMPOSSIBLE SLOPES (BETTS,DTHETA/DQ)------------
1602 DTDP=(THVREF(L-1)-THVREF(L))/(PRSMID(L)-PRSMID(L-1))
1613 !-----------------------------------------------------------------------
1614 !--------------RELAXATION TOWARD REFERENCE PROFILES---------------------
1615 !-----------------------------------------------------------------------
1618 DTDT(L)=(TREFK(L)-TK(L))*TAUKSC*RDTCNVC
1619 DQDT(L)=(QREFK(L)-QK(L))*TAUKSC*RDTCNVC
1622 !-----------------------------------------------------------------------
1623 !*** Begin debugging convection
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)
1630 !*** End debugging convection
1631 !-----------------------------------------------------------------------
1633 !-----------------------------------------------------------------------
1634 !SCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCS
1635 !SCSCSCSCSCSCSC END OF SHALLOW CONVECTION SCSCSCSCSCSCSCS
1636 !SCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCS
1637 !-----------------------------------------------------------------------
1639 !-----------------------------------------------------------------------
1641 !-----------------------------------------------------------------------
1642 !XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
1643 !-----------------------------------------------------------------------
1645 & (ITBX,JTBX,PLX,PRSMID,RDPX,RDTHEX,STHE &
1646 & ,THE0,THESP,TTBL,TREF)
1647 !-----------------------------------------------------------------------
1648 ! ******************************************************************
1650 ! * EXTRACT TEMPERATURE OF THE MOIST ADIABAT FROM *
1651 ! * THE APPROPRIATE TTBL *
1653 ! ******************************************************************
1654 !-----------------------------------------------------------------------
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 !-----------------------------------------------------------------------
1678 !----------------KEEPING INDICES WITHIN THE TABLE-----------------------
1688 !----------------BASE AND SCALING FACTOR FOR THETAE---------------------
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
1699 !----------------KEEPING INDICES WITHIN THE TABLE-----------------------
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 !-----------------------------------------------------------------------
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) :: &
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 &
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 !-----------------------------------------------------------------------
1769 IF(.NOT.RESTART)THEN
1788 !*** FOR NOW, ASSUME SIGMA MODE FOR LOWEST MODEL LAYER
1795 !-----------------------------------------------------------------------
1796 !----------------COARSE LOOK-UP TABLE FOR SATURATION POINT--------------
1797 !-----------------------------------------------------------------------
1804 DTH=(THH-THL)/REAL(KTHM-1)
1805 DP =(PH -PL )/REAL(KPM -1)
1808 !-----------------------------------------------------------------------
1816 APE=(100000./P)**(RD/CP)
1819 QSOLD(KP)=PQ0/P*EXP(A2*(TH-A3*APE)/DENOM)
1827 SQSK=QSOLD(KPM)-QSOLD(1)
1832 QSOLD(KP)=(QSOLD(KP)-QS0K)/SQSK
1833 IF((QSOLD(KP)-QSOLD(KP-1)).LT.EPS)QSOLD(KP)=QSOLD(KP-1)+EPS
1840 !-----------------------------------------------------------------------
1846 QSNEW(KP)=QSNEW(KP-1)+DQS
1852 CALL SPLINE(JTB,KPM,QSOLD,POLD,Y2P,KPM,QSNEW,PNEW,APP,AQP)
1855 PTBL(KP,KTH)=PNEW(KP)
1856 PTBL_EXP(KP,KTH)=PNEW(KP)
1858 !-----------------------------------------------------------------------
1860 !-----------------------------------------------------------------------
1861 !------------COARSE LOOK-UP TABLE FOR T(P) FROM CONSTANT THE------------
1862 !-----------------------------------------------------------------------
1872 APE=(1.E5/P)**(RD/CP)
1875 QS=PQ0/P*EXP(A2*(TH-A3*APE)/DENOM)
1879 ! QS=PQ0/P*EXP(A2*(TH-A3*APE)/(TH-A4*APE))
1881 THEOLD(KTH)=TH*EXP(ELOCP*QS/TOLD(KTH))
1885 STHEK=THEOLD(KTHM)-THEOLD(1)
1890 THEOLD(KTH)=(THEOLD(KTH)-THE0K)/STHEK
1891 IF((THEOLD(KTH)-THEOLD(KTH-1)).LT.EPS) &
1892 & THEOLD(KTH)=THEOLD(KTH-1) + EPS
1897 !-----------------------------------------------------------------------
1900 DTHE=1./REAL(KTHM-1)
1903 THENEW(KTH)=THENEW(KTH-1)+DTHE
1909 CALL SPLINE(JTB,KTHM,THEOLD,TOLD,Y2T,KTHM,THENEW,TNEW,APT,AQT)
1912 TTBL(KTH,KP)=TNEW(KTH)
1914 !-----------------------------------------------------------------------
1916 !-----------------------------------------------------------------------
1918 !-----------------------------------------------------------------------
1919 !---------------FINE LOOK-UP TABLE FOR SATURATION POINT-----------------
1920 !-----------------------------------------------------------------------
1926 DTH=(THHQ-THL)/REAL(KTHM-1)
1927 DP=(PH-PLQ)/REAL(KPM-1)
1931 !-----------------------------------------------------------------------
1932 !---------------FINE LOOK-UP TABLE FOR T(P) FROM CONSTANT THE-----------
1933 !-----------------------------------------------------------------------
1941 APE=(1.E5/P)**(RD/CP)
1944 QS=PQ0/P*EXP(A2*(TH-A3*APE)/DENOM)
1948 ! QS=PQ0/P*EXP(A2*(TH-A3*APE)/(TH-A4*APE))
1950 THEOLDQ(KTH)=TH*EXP(ELOCP*QS/TOLDQ(KTH))
1954 STHEK=THEOLDQ(KTHM)-THEOLDQ(1)
1959 THEOLDQ(KTH)=(THEOLDQ(KTH)-THE0K)/STHEK
1960 IF((THEOLDQ(KTH)-THEOLDQ(KTH-1))<EPS) &
1961 & THEOLDQ(KTH)=THEOLDQ(KTH-1)+EPS
1966 !-----------------------------------------------------------------------
1969 DTHE=1./REAL(KTHM-1)
1972 THENEWQ(KTH)=THENEWQ(KTH-1)+DTHE
1978 CALL SPLINE(JTBQ,KTHM,THEOLDQ,TOLDQ,Y2TQ,KTHM &
1979 & ,THENEWQ,TNEWQ,APTQ,AQTQ)
1982 TTBLQ(KTH,KP)=TNEWQ(KTH)
1984 !-----------------------------------------------------------------------
1986 !-----------------------------------------------------------------------
1987 END SUBROUTINE BMJINIT
1988 !-----------------------------------------------------------------------
1989 !XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
1990 !-----------------------------------------------------------------------
1991 SUBROUTINE SPLINE(JTBX,NOLD,XOLD,YOLD,Y2,NNEW,XNEW,YNEW,P,Q)
1992 ! ********************************************************************
1994 ! * THIS IS A ONE-DIMENSIONAL CUBIC SPLINE FITTING ROUTINE *
1995 ! * PROGRAMED FOR A SMALL SCALAR MACHINE. *
1997 ! * PROGRAMER Z. JANJIC *
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 *
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. *
2013 ! ********************************************************************
2014 !-----------------------------------------------------------------------
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 !-----------------------------------------------------------------------
2030 DYDXL=(YOLD(2)-YOLD(1))/DXL
2031 DYDXR=(YOLD(3)-YOLD(2))/DXR
2034 P(1)= RTDXC*(6.*(DYDXR-DYDXL)-DXL*Y2(1))
2037 IF(NOLD==3)GO TO 150
2038 !-----------------------------------------------------------------------
2043 DXR=XOLD(K+1)-XOLD(K)
2044 DYDXR=(YOLD(K+1)-YOLD(K))/DXR
2046 DEN=1./(DXL*Q(K-2)+DXC+DXC)
2048 P(K-1)= DEN*(6.*(DYDXR-DYDXL)-DXL*P(K-2))
2053 !-----------------------------------------------------------------------
2056 200 Y2(K)=P(K-1)+Q(K-1)*Y2(K+1)
2060 !-----------------------------------------------------------------------
2077 450 IF(K1==1)GO TO 500
2078 IF(K==KOLD)GO TO 550
2084 DX=XOLD(K+1)-XOLD(K)
2087 AK=.1666667*RDX*(Y2KP1-Y2K)
2089 CK=RDX*(YOLD(K+1)-YOLD(K))-.1666667*DX*(Y2KP1+Y2K+Y2K)
2094 YNEW(K1)=AK*XSQ*X+BK*XSQ+CK*X+YOLD(K)
2097 IF(K1<=NNEW)GO TO 300
2098 !-----------------------------------------------------------------------
2099 END SUBROUTINE SPLINE
2100 !-----------------------------------------------------------------------
2102 END MODULE MODULE_CU_BMJ
2104 !-----------------------------------------------------------------------