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 &
83 & ,RAINCV,PRATEC,CUTOP,CUBOT,KPBL &
85 & ,PINT,PMID,PI,RHO,DZ8W &
86 & ,CP,R,ELWV,ELIV,G,TFRZ,D608 &
87 & ,CLDEFI,LOWLYR,XLAND,CU_ACT_FLAG &
89 & ,RTHCUTEN, RQVCUTEN &
91 !-----------------------------------------------------------------------
93 !-----------------------------------------------------------------------
94 INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE &
95 & ,IMS,IME,JMS,JME,KMS,KME &
96 & ,ITS,ITE,JTS,JTE,KTS,KTE
98 INTEGER,INTENT(IN) :: ITIMESTEP,STEPCU
100 INTEGER,DIMENSION(IMS:IME,JMS:JME),INTENT(IN) :: KPBL,LOWLYR
102 REAL,INTENT(IN) :: CP,DT,ELIV,ELWV,G,R,TFRZ,D608
104 REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(IN) :: XLAND
106 REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(IN) :: DZ8W &
111 REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME) &
113 & ,INTENT(INOUT) :: RQVCUTEN,RTHCUTEN
115 REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(INOUT) :: CLDEFI,RAINCV, &
118 REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(OUT) :: CUBOT,CUTOP
120 LOGICAL,DIMENSION(IMS:IME,JMS:JME),INTENT(INOUT) :: CU_ACT_FLAG
122 ! Adaptive time-step variables
123 REAL, INTENT(IN ) :: CUDT
124 REAL, INTENT(IN ) :: CURR_SECS
125 LOGICAL,OPTIONAL,INTENT(IN ) :: ADAPT_STEP_FLAG
126 REAL, INTENT (INOUT) :: CUDTACTTIME
128 !-----------------------------------------------------------------------
132 !-----------------------------------------------------------------------
133 INTEGER :: LBOT,LPBL,LTOP
135 REAL :: DTCNVC,LANDMASK,PCPCOL,PSFC,PTOP
137 REAL,DIMENSION(KTS:KTE) :: DPCOL,DQDT,DTDT,PCOL,QCOL,TCOL
139 INTEGER :: I,J,K,KFLIP,LMH
141 LOGICAL :: run_param , doing_adapt_dt , decided
143 !*** Begin debugging convection
144 REAL :: DELQ,DELT,PLYR
146 LOGICAL :: PRINT_DIAG
147 !*** End debugging convection
149 !-----------------------------------------------------------------------
150 !***********************************************************************
151 !-----------------------------------------------------------------------
153 !*** PREPARE TO CALL BMJ CONVECTION SCHEME
155 !-----------------------------------------------------------------------
157 !*** CHECK TO SEE IF THIS IS A CONVECTION TIMESTEP
160 ! Initialization for adaptive time step.
162 doing_adapt_dt = .FALSE.
163 IF ( PRESENT(adapt_step_flag) ) THEN
164 IF ( adapt_step_flag ) THEN
165 doing_adapt_dt = .TRUE.
166 IF ( cudtacttime .EQ. 0. ) THEN
167 cudtacttime = curr_secs + cudt*60.
172 ! Do we run through this scheme or not?
174 ! Test 1: If this is the initial model time, then yes.
176 ! Test 2: If the user asked for the cumulus to be run every time step, then yes.
178 ! Test 3: If not adaptive dt, and this is on the requested cumulus frequency, then yes.
179 ! MOD(ITIMESTEP,STEPCU)=0
180 ! Test 4: If using adaptive dt and the current time is past the last requested activate cumulus time, then yes.
181 ! CURR_SECS >= CUDTACTTIME
183 ! If we do run through the scheme, we set the flag run_param to TRUE and we set the decided flag
184 ! to TRUE. The decided flag says that one of these tests was able to say "yes", run the scheme.
185 ! We only proceed to other tests if the previous tests all have left decided as FALSE.
187 ! If we set run_param to TRUE and this is adaptive time stepping, we set the time to the next
192 IF ( ( .NOT. decided ) .AND. &
193 ( itimestep .EQ. 1 ) ) THEN
198 IF ( ( .NOT. decided ) .AND. &
199 ( ( cudt .EQ. 0. ) .OR. ( stepcu .EQ. 1 ) ) ) THEN
205 IF ( ( .NOT. decided ) .AND. &
206 ( .NOT. doing_adapt_dt ) .AND. &
207 ( MOD(itimestep,stepcu) .EQ. 0 ) ) THEN
212 IF ( ( .NOT. decided ) .AND. &
213 ( doing_adapt_dt ) .AND. &
214 ( curr_secs .GE. cudtacttime ) ) THEN
217 cudtacttime = curr_secs + cudt*60
220 !-----------------------------------------------------------------------
222 !*** COMPUTE CONVECTION EVERY STEPCU*DT/60.0 MINUTES
224 !*** Begin debugging convection
228 !*** End debugging convection
234 CU_ACT_FLAG(I,J)=.TRUE.
252 PSFC=PINT(I,LOWLYR(I,J),J)
253 PTOP=PINT(I,KTE+1,J) ! KTE+1=KME
255 !*** CONVERT TO BMJ LAND MASK (1.0 FOR SEA; 0.0 FOR LAND)
257 LANDMASK=XLAND(I,J)-1.
259 !*** FILL 1-D VERTICAL ARRAYS
260 !*** AND FLIP DIRECTION SINCE BMJ SCHEME
261 !*** COUNTS DOWNWARD FROM THE DOMAIN'S TOP
266 !*** CONVERT FROM MIXING RATIO TO SPECIFIC HUMIDITY
268 QCOL(K)=MAX(EPSQ,QV(I,KFLIP,J)/(1.+QV(I,KFLIP,J)))
270 PCOL(K)=PMID(I,KFLIP,J)
271 ! DPCOL(K)=PINT(I,KFLIP,J)-PINT(I,KFLIP+1,J)
272 DPCOL(K)=RHO(I,KFLIP,J)*G*DZ8W(I,KFLIP,J)
275 !*** LOWEST LAYER ABOVE GROUND MUST ALSO BE FLIPPED
277 LMH=KTE+1-LOWLYR(I,J)
279 !-----------------------------------------------------------------------
283 !-----------------------------------------------------------------------
284 !*** Begin debugging convection
286 ! IF(I==IMD.AND.J==JMD)PRINT_DIAG=.TRUE.
287 !*** End debugging convection
288 !-----------------------------------------------------------------------
289 CALL BMJ(ITIMESTEP,I,J,DTCNVC,LMH,LANDMASK,CLDEFI(I,J) &
290 & ,DPCOL,PCOL,QCOL,TCOL,PSFC,PTOP &
291 & ,DQDT,DTDT,PCPCOL,LBOT,LTOP,LPBL &
292 & ,CP,R,ELWV,ELIV,G,TFRZ,D608 &
294 & ,IDS,IDE,JDS,JDE,KDS,KDE &
295 & ,IMS,IME,JMS,JME,KMS,KME &
296 & ,ITS,ITE,JTS,JTE,KTS,KTE)
297 !-----------------------------------------------------------------------
299 !*** COMPUTE HEATING AND MOISTENING TENDENCIES
301 IF ( PRESENT( RTHCUTEN ) .AND. PRESENT( RQVCUTEN )) THEN
304 RTHCUTEN(I,K,J)=DTDT(KFLIP)/PI(I,K,J)
306 !*** CONVERT FROM SPECIFIC HUMIDTY BACK TO MIXING RATIO
308 RQVCUTEN(I,K,J)=DQDT(KFLIP)/(1.-QCOL(KFLIP))**2
312 !*** ALL UNITS IN BMJ SCHEME ARE MKS, THUS CONVERT PRECIP FROM METERS
313 !*** TO MILLIMETERS PER STEP FOR OUTPUT.
315 RAINCV(I,J)=PCPCOL*1.E3/STEPCU
316 PRATEC(I,J)=PCPCOL*1.E3/(STEPCU * DT)
318 !*** CONVECTIVE CLOUD TOP AND BOTTOM FROM THIS CALL
320 CUTOP(I,J)=REAL(KTE+1-LTOP)
321 CUBOT(I,J)=REAL(KTE+1-LBOT)
323 !-----------------------------------------------------------------------
324 !*** Begin debugging convection
329 IF(LBOT>0.AND.LTOP<LBOT)THEN
332 DELQ=DELQ+DPCOL(K)*DTCNVC*ABS(DQDT(K))
333 DELT=DELT+DPCOL(K)*DTCNVC*ABS(DTDT(K))
339 WRITE(6,"(2a,2i4,3e12.4,f7.2,4i3)") &
340 '{cu3 i,j,PCPCOL,DTavg,DQavg,PLYR,' &
341 ,'LBOT,LTOP,CUBOT,CUTOP = ' &
342 ,i,j, PCPCOL,DELT,1000.*DELQ,.01*PLYR &
343 ,LBOT,LTOP,NINT(CUBOT(I,J)),NINT(CUTOP(I,J))
348 WRITE(6,"(a,i3,2e12.4,f7.2)") '{cu3a KFLIP,DT,DQ,DP = ' &
349 ,KFLIP,DTCNVC*DTDT(K),1000.*DTCNVC*DQDT(K),.01*DPCOL(K)
353 !*** End debugging convection
354 !-----------------------------------------------------------------------
361 END SUBROUTINE BMJDRV
362 !-----------------------------------------------------------------------
363 !XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
364 !-----------------------------------------------------------------------
366 !-----------------------------------------------------------------------
367 & (ITIMESTEP,I,J,DTCNVC,LMH,SM,CLDEFI &
368 & ,DPRS,PRSMID,Q,T,PSFC,PT &
369 & ,DQDT,DTDT,PCPCOL,LBOT,LTOP,LPBL &
370 & ,CP,R,ELWV,ELIV,G,TFRZ,D608 &
372 & ,IDS,IDE,JDS,JDE,KDS,KDE &
373 & ,IMS,IME,JMS,JME,KMS,KME &
374 & ,ITS,ITE,JTS,JTE,KTS,KTE)
375 !-----------------------------------------------------------------------
377 !-----------------------------------------------------------------------
378 INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE &
379 ,IMS,IME,JMS,JME,KMS,KME &
380 ,ITS,ITE,JTS,JTE,KTS,KTE &
383 INTEGER,INTENT(IN) :: LMH,LPBL
385 INTEGER,INTENT(OUT) :: LBOT,LTOP
387 REAL,INTENT(IN) :: CP,D608,DTCNVC,ELIV,ELWV,G,PSFC,PT,R,SM,TFRZ
389 REAL,DIMENSION(KTS:KTE),INTENT(IN) :: DPRS,PRSMID,Q,T
391 REAL,INTENT(INOUT) :: CLDEFI,PCPCOL
393 REAL,DIMENSION(KTS:KTE),INTENT(INOUT) :: DQDT,DTDT
395 !-----------------------------------------------------------------------
396 !*** DEFINE LOCAL VARIABLES
397 !-----------------------------------------------------------------------
399 REAL,DIMENSION(KTS:KTE) :: APEK,APESK,EL,FPK &
400 ,PK,PSK,QK,QREFK,QSATK &
402 ,THVMOD,THVREF,TK,TREFK
403 REAL,DIMENSION(KTS:KTE) :: APE,DIFQ,DIFT,THEE,THES,TREF
405 REAL,DIMENSION(KTS:KTE) :: CPE,CPEcnv,DTV,DTVcnv,THEScnv !<-- CPE for shallow convection buoyancy check (24 Aug 2006)
407 LOGICAL :: DEEP,SHALLOW
409 !*** Begin debugging convection
410 LOGICAL :: PRINT_DIAG
411 !*** End debugging convection
413 !-----------------------------------------------------------------------
417 !-----------------------------------------------------------------------
418 REAL :: APEKL,APEKXX,APEKXY,APES,APESTS &
419 & ,AVRGT,AVRGTL,BQ,BQK,BQS00K,BQS10K &
420 & ,CAPA,CUP,DEN,DENTPY,DEPMIN,DEPTH &
421 & ,DEPWL,DHDT,DIFQL,DIFTL,DP,DPKL,DPLO,DPMIX,DPOT &
422 & ,DPUP,DQREF,DRHDP,DRHEAT,DSP &
423 & ,DSP0,DSP0K,DSPB,DSPBK,DSPT,DSPTK &
424 & ,DSQ,DST,DSTQ,DTHEM,DTDP,EFI &
425 & ,FEFI,FFUP,FPRS,FPTK,HCORR &
426 & ,OTSUM,P,P00K,P01K,P10K,P11K &
427 & ,PART1,PART2,PART3,PBOT,PBOTFC,PBTK &
428 & ,PK0,PKB,PKL,PKT,PKXXXX,PKXXXY &
429 & ,PLMH,PELEVFC,PBTmx,plo,POTSUM,PP1,PPK,PRECK &
430 & ,PRESK,PSP,PSUM,PTHRS,PTOP,PTPK,PUP &
431 & ,QBT,QKL,QNEW,QOTSUM,QQ1,QQK,QRFKL &
432 & ,QRFTP,QSP,QSUM,QUP,RDP0T &
433 & ,RDPSUM,RDTCNVC,RHH,RHL,RHMAX,ROTSUM,RTBAR,RHAVG &
434 & ,SM1,SMIX,SQ,SQK,SQS00K,SQS10K,STABDL,SUMDE,SUMDP &
435 & ,SUMDT,TAUK,TAUKSC,TCORR,THBT,THERKX,THERKY &
436 & ,THESP,THSKL,THTPK,THVMKL,TKL,TNEW &
437 & ,TQ,TQK,TREFKX,TRFKL,trmlo,trmup,TSKL,tsp,TTH &
439 & ,CAPEcnv,PSPcnv,THBTcnv,CAPEtrigr,CAPE &
440 & ,TLEV2,QSAT1,QSAT2,RHSHmax
442 INTEGER :: IQ,IQTB,IT,ITER,ITREFI,ITTB,ITTBK,KB,KNUMH,KNUML &
443 & ,L,L0,L0M1,LB,LBM1,LCOR,LPT1 &
444 & ,LQM,LSHU,LTP1,LTP2,LTSH, LBOTcnv,LTOPcnv,LMID
445 !-----------------------------------------------------------------------
447 REAL,PARAMETER :: DSPBSL=DSPBFL*FSL,DSP0SL=DSP0FL*FSL &
448 & ,DSPTSL=DSPTFL*FSL &
449 & ,DSPBSS=DSPBFS*FSS,DSP0SS=DSP0FS*FSS &
452 REAL,PARAMETER :: ELEVFC=0.6,STEFI=1.
454 REAL,PARAMETER :: SLOPBL=(DSPBFL-DSPBSL)/(1.-EFIMN) &
455 & ,SLOP0L=(DSP0FL-DSP0SL)/(1.-EFIMN) &
456 & ,SLOPTL=(DSPTFL-DSPTSL)/(1.-EFIMN) &
457 & ,SLOPBS=(DSPBFS-DSPBSS)/(1.-EFIMN) &
458 & ,SLOP0S=(DSP0FS-DSP0SS)/(1.-EFIMN) &
459 & ,SLOPTS=(DSPTFS-DSPTSS)/(1.-EFIMN) &
460 & ,SLOPST=(STABDF-STABDS)/(1.-EFIMN) &
461 & ,SLOPE=(1.-EFMNT)/(1.-EFIMN)
463 REAL :: A23M4L,CPRLG,ELOCP,RCP,QWAT
464 !-----------------------------------------------------------------------
465 !***********************************************************************
466 !-----------------------------------------------------------------------
468 CPRLG=CP/(ROW*G*ELWV)
471 A23M4L=A2*(A3-A4)*ELWV
473 DEPMIN=PSH*PSFC*RSFCP
481 !-----------------------------------------------------------------------
483 TAUKSC=DTCNVC/(1.0*TREL)
484 !-----------------------------------------------------------------------
485 !-----------------------------PREPARATIONS------------------------------
486 !-----------------------------------------------------------------------
493 APE(L)=(1.E5/APESTS)**CAPA
499 !-----------------------------------------------------------------------
500 !----------------SEARCH FOR MAXIMUM BUOYANCY LEVEL----------------------
501 !-----------------------------------------------------------------------
505 PBTmx=PRSMID(LMH)-PONE
512 !-----------------------------------------------------------------------
513 !----------------TRIAL MAXIMUM BUOYANCY LEVEL VARIABLES-----------------
514 !-----------------------------------------------------------------------
516 max_buoy_loop: DO KB=LMH,1,-1
518 !-----------------------------------------------------------------------
521 ! IF (PKL<PELEVFC .OR. T(KB)<=TFRZ) EXIT
522 IF (PKL<PELEVFC) EXIT
526 !-----------------------------------------------------------------------
527 !*** SEARCH OVER A SCALED DEPTH IN FINDING THE PARCEL
528 !*** WITH THE MAX THETA-E
529 !-----------------------------------------------------------------------
536 !----------------KEEPING INDICES WITHIN THE TABLE-----------------------
540 ELSE IF(ITTB>=JTB)THEN
544 !--------------BASE AND SCALING FACTOR FOR SPEC. HUMIDITY---------------
550 !--------------SCALING SPEC. HUMIDITY & TABLE INDEX---------------------
551 BQ=(BQS10K-BQS00K)*QQ1+BQS00K
552 SQ=(SQS10K-SQS00K)*QQ1+SQS00K
556 !----------------KEEPING INDICES WITHIN THE TABLE-----------------------
560 ELSE IF(IQTB>=ITB)THEN
564 !--------------SATURATION PRESSURE AT FOUR SURROUNDING TABLE PTS.-------
572 !--------------SATURATION POINT VARIABLES AT THE BOTTOM-----------------
574 PSP=P00K+(P10K-P00K)*PP1+(P01K-P00K)*QQ1 &
575 & +(P00K-P10K-P01K+P11K)*PP1*QQ1
576 APES=(1.E5/PSP)**CAPA
577 THESP=THBT*EXP(ELOCP*QBT*APES/THBT)
579 !-----------------------------------------------------------------------
580 !-----------CHOOSE CLOUD BASE AS MODEL LEVEL JUST BELOW PSP-------------
581 !-----------------------------------------------------------------------
585 IF(P<PSP.AND.P>=PQM)LBOT=L+1
588 !*** WARNING: LBOT MUST NOT BE > LMH-1 IN SHALLOW CONVECTION
589 !*** MAKE SURE CLOUD BASE IS AT LEAST PONE ABOVE THE SURFACE
592 IF(PBOT>=PBTmx.OR.LBOT>=LMH)THEN
600 !-----------------------------------------------------------------------
601 !----------------CLOUD TOP COMPUTATION----------------------------------
602 !-----------------------------------------------------------------------
610 !-----------------------------------------------------------------------
611 !### BEGIN: ########### WARNING ########### WARNING ###########
612 !-----------------------------------------------------------------------
614 !### IMPORTANT: THIS "DO KB=LMH,1,-1" loop must be broken up into two
615 ! separate loops in order for entrainment as programmed below to work
618 !--------------- ENTRAINMENT DURING PARCEL ASCENT --------------------
628 ! FEFI=(CLDEFI-EFIMN)*SLOPE+EFMNT
629 ! FFUP=FUP/(FEFI*FEFI)
633 ! ELSEIF(PBOT>ENPUP)THEN
634 ! FPRS=(PBOT-ENPUP)*RENDP
639 ! FFUP=FFUP*FPRS*FPRS*0.5
646 ! THES(L)=((-FFUP*DPLO+1.)*THES(L+1) &
647 ! & +(THEE(L)*DPUP+THEE(L+1)*DPLO)*FFUP) &
651 !-----------------------------------------------------------------------
652 !### END: ########### WARNING ########### WARNING ###########
653 !-----------------------------------------------------------------------
655 !-----------------------------------------------------------------------
656 !!*** COMPUTE PARCEL TEMPERATURE ALONG THE ASCENT TRAJECTORY
657 !!*** SCALING PRESSURE & TT TABLE INDEX.
658 !-----------------------------------------------------------------------
666 ! CALL TTBLEX(ITB,JTB,PL,PRESK,RDP,RDTHE &
667 ! & ,STHE,THE0,THES(L),TTBL,TREF(L))
669 ! CALL TTBLEX(ITBQ,JTBQ,PLQ,PRESK,RDPQ,RDTHEQ &
670 ! & ,STHEQ,THE0Q,THES(L),TTBLQ,TREF(L))
675 !!-----------------------------------------------------------------------
676 !!----------------BUOYANCY CHECK-----------------------------------------
677 !!-----------------------------------------------------------------------
680 ! IF(TREF(L)>T(L)-DTTOP)LTOP=L
683 !!*** CLOUD TOP PRESSURE
687 !------------------FIRST ENTROPY CHECK----------------------------------
693 !-----------------------------------------------------------------------
694 ! lbot_ltop: IF(LBOT>LTOP)THEN
695 !-----------------------------------------------------------------------
696 !-- Begin: Buoyancy check including deep convection (24 Aug 2006)
697 !-----------------------------------------------------------------------
702 CAPEtrigr=DTPtrigr/T(LBOT)
704 !--- Below cloud base
711 TRMUP=(TUP*(QBT*0.608+1.) &
712 & -T(L)*(Q(L)*0.608+1.))*0.5 &
713 & /(T(L)*(Q(L)*0.608+1.))
715 DENTPY=DTV(L)*DP+DENTPY
717 IF (DENTPY < CAPEtrigr) GO TO 170
725 TRMLO=(TUP*(QBT*0.608+1.) &
726 & -T(L)*(Q(L)*0.608+1.))*0.5 &
727 & /(T(L)*(Q(L)*0.608+1.))
728 ENDIF ! IF(KB>LBOT) THEN
735 TSP=(T(L+1)-T(L))/(PLO-PBOT) &
737 QSP=(Q(L+1)-Q(L))/(PLO-PBOT) &
740 TRMUP=(TUP*(QBT*0.608+1.) &
741 & -TSP*(QSP*0.608+1.))*0.5 &
742 & /(TSP*(QSP*0.608+1.))
744 DENTPY=DTV(L)*DP+DENTPY
751 !--- Calculate updraft temperature along moist adiabat (TUP)
754 CALL TTBLEX(ITB,JTB,PL,PUP,RDP,RDTHE &
755 & ,STHE,THE0,THES(L),TTBL,TUP)
757 CALL TTBLEX(ITBQ,JTBQ,PLQ,PUP,RDPQ,RDTHEQ &
758 & ,STHEQ,THE0Q,THES(L),TTBLQ,TUP)
761 QUP=PQ0/PUP*EXP(A2*(TUP-A3)/(TUP-A4))
762 QWAT=QBT-QUP !-- Water loading effects, reversible adiabat
764 TRMUP=(TUP*(QUP*0.608+1.-QWAT) &
765 & -T(L)*(Q(L)*0.608+1.))*0.5 &
766 & /(T(L)*(Q(L)*0.608+1.))
767 DENTPY=(TRMLO+TRMUP)*DP+DENTPY
769 DTV(L)=(DTV(L)+(TRMLO+TRMUP)*DP)/(PRSMID(LBOT+1)-PRSMID(LBOT))
771 IF (DENTPY < CAPEtrigr) GO TO 170
776 !-----------------------------------------------------------------------
777 !--- In cloud above cloud base
778 !-----------------------------------------------------------------------
783 !--- Calculate updraft temperature along moist adiabat (TUP)
786 CALL TTBLEX(ITB,JTB,PL,PUP,RDP,RDTHE &
787 & ,STHE,THE0,THES(L),TTBL,TUP)
789 CALL TTBLEX(ITBQ,JTBQ,PLQ,PUP,RDPQ,RDTHEQ &
790 & ,STHEQ,THE0Q,THES(L),TTBLQ,TUP)
793 QUP=PQ0/PUP*EXP(A2*(TUP-A3)/(TUP-A4))
794 QWAT=QBT-QUP !-- Water loading effects, reversible adiabat
796 TRMUP=(TUP*(QUP*0.608+1.-QWAT) &
797 & -T(L)*(Q(L)*0.608+1.))*0.5 &
798 & /(T(L)*(Q(L)*0.608+1.))
800 DENTPY=DTV(L)*DP+DENTPY
803 IF (DENTPY < CAPEtrigr) GO TO 170
809 !-----------------------------------------------------------------------
814 !-----------------------------------------------------------------------
815 !--- Cloud top level (LTOP) is located where CAPE is a maximum
816 !--- Exit cloud-top search if CAPE < CAPEtrigr
817 !-----------------------------------------------------------------------
820 IF (CPE(L) < CAPEtrigr) THEN
822 ELSE IF (CPE(L) > CAPE) THEN
826 ENDDO !-- End DO L=KB,KTS,-1
830 !-----------------------------------------------------------------------
831 !--------------- CHECK FOR MAXIMUM INSTABILITY ------------------------
832 !-----------------------------------------------------------------------
833 IF(CAPE > CAPEcnv) THEN
844 ENDIF ! End IF(CAPE > CAPEcnv) THEN
848 !-----------------------------------------------------------------------
852 !-----------------------------------------------------------------------
853 !------------------------ MAXIMUM INSTABILITY ------------------------
854 !-----------------------------------------------------------------------
856 IF(CAPEcnv > 0.) THEN
872 !-----------------------------------------------------------------------
873 !----- Quick exit if cloud is too thin or no CAPE is present ---------
874 !-----------------------------------------------------------------------
876 IF(PTOP>PBOT-PNO.OR.LTOP>LBOT-2.OR.CAPEcnv<=0.)THEN
881 CLDEFI=AVGEFI*SM+STEFI*(1.-SM)
885 !*** DEPTH OF CLOUD REQUIRED TO MAKE THE POINT A DEEP CONVECTION POINT
886 !*** IS A SCALED VALUE OF PSFC.
890 IF(DEPTH>=DEPMIN) THEN
897 !-----------------------------------------------------------------------
898 !DCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD
899 !DCDCDCDCDCDCDCDCDCDCDC DEEP CONVECTION DCDCDCDCDCDCDCDCDCDCDCDCDCD
900 !DCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD
901 !-----------------------------------------------------------------------
907 !-----------------------------------------------------------------------
908 !--------------INITIALIZE VARIABLES IN THE CONVECTIVE COLUMN------------
909 !-----------------------------------------------------------------------
911 !*** ONE SHOULD NOTE THAT THE VALUES ASSIGNED TO THE ARRAY TREFK
912 !*** IN THE FOLLOWING LOOP ARE REALLY ONLY RELEVANT IN ANCHORING THE
913 !*** REFERENCE TEMPERATURE PROFILE AT LEVEL LB. WHEN BUILDING THE
914 !*** REFERENCE PROFILE FROM CLOUD BASE, THEN ASSIGNING THE
915 !*** AMBIENT TEMPERATURE TO TREFK IS ACCEPTABLE. HOWEVER, WHEN
916 !*** BUILDING THE REFERENCE PROFILE FROM SOME OTHER LEVEL (SUCH AS
917 !*** ONE LEVEL ABOVE THE GROUND), THEN TREFK SHOULD BE FILLED WITH
918 !*** THE TEMPERATURES IN TREF(L) WHICH ARE THE TEMPERATURES OF
919 !*** THE MOIST ADIABAT THROUGH CLOUD BASE. BY THE TIME THE LINE
920 !*** NUMBERED 450 HAS BEEN REACHED, TREFK ACTUALLY DOES HOLD THE
921 !*** REFERENCE TEMPERATURE PROFILE.
938 !--- Calculate temperature along moist adiabat (TREF)
941 CALL TTBLEX(ITB,JTB,PL,PKL,RDP,RDTHE &
942 & ,STHE,THE0,THES(L),TTBL,TREF(L))
944 CALL TTBLEX(ITBQ,JTBQ,PLQ,PKL,RDPQ,RDTHEQ &
945 & ,STHEQ,THE0Q,THES(L),TTBLQ,TREF(L))
947 THERK (L)=TREF(L)*APEKL
950 !------------DEEP CONVECTION REFERENCE TEMPERATURE PROFILE------------
956 STABDL=(EFI-EFIMN)*SLOPST+STABDS
958 !------------TEMPERATURE REFERENCE PROFILE BELOW FREEZING LEVEL-------
970 IF(T(L+1)<TFRZ)GO TO 430
971 TREFKX=((THERKY-THERKX)*STABDL &
972 & +TREFKX*APEKXX)/APEKXY
983 !--------------FREEZING LEVEL AT OR ABOVE THE CLOUD TOP-----------------
987 !--------------TEMPERATURE REFERENCE PROFILE ABOVE FREEZING LEVEL-------
991 DTHEM=THERK(L0)-TREFK(L0)*APEK(L0)
994 TREFK(L)=(THERK(L)-(PK(L)-PKT)*DTHEM*RDP0T)/APEK(L)
998 !-----------------------------------------------------------------------
999 !--------------DEEP CONVECTION REFERENCE HUMIDITY PROFILE---------------
1000 !-----------------------------------------------------------------------
1002 !*** DEPWL IS THE PRESSURE DIFFERENCE BETWEEN CLOUD BASE AND
1003 !*** THE FREEZING LEVEL
1007 DEPTH=PFRZ*PSFC*RSFCP
1011 !-------------FIRST ADJUSTMENT OF TEMPERATURE PROFILE-------------------
1017 ! SUMDT=(TK(L)-TREFK(L))*DPRS(L)+SUMDT
1018 ! SUMDP=SUMDP+DPRS(L)
1024 ! TREFK(L)=TREFK(L)+TCORR
1027 !-----------------------------------------------------------------------
1028 !--------------- ITERATION LOOP FOR CLOUD EFFICIENCY -------------------
1029 !-----------------------------------------------------------------------
1031 cloud_efficiency : DO ITREFI=1,ITREFI_MAX
1033 !-----------------------------------------------------------------------
1034 DSPBK=((EFI-EFIMN)*SLOPBS+DSPBSS*PBOTFC)*SM &
1035 & +((EFI-EFIMN)*SLOPBL+DSPBSL*PBOTFC)*SM1
1036 DSP0K=((EFI-EFIMN)*SLOP0S+DSP0SS*PBOTFC)*SM &
1037 & +((EFI-EFIMN)*SLOP0L+DSP0SL*PBOTFC)*SM1
1038 DSPTK=((EFI-EFIMN)*SLOPTS+DSPTSS*PBOTFC)*SM &
1039 & +((EFI-EFIMN)*SLOPTL+DSPTSL*PBOTFC)*SM1
1041 !-----------------------------------------------------------------------
1046 !*** SATURATION PRESSURE DIFFERENCE
1048 IF(DEPWL>=DEPTH)THEN
1050 DSP=((PK0-PK(L))*DSPTK+(PK(L)-PKT)*DSP0K)/(PK0-PKT)
1052 DSP=((PKB-PK(L))*DSP0K+(PK(L)-PK0)*DSPBK)/(PKB-PK0)
1057 DSP=((PK0-PK(L))*DSPTK+(PK(L)-PKT)*DSP0K)/(PK0-PKT)
1061 !*** HUMIDITY PROFILE
1065 APESK(L)=(1.E5/PSK(L))**CAPA
1066 THSK(L)=TREFK(L)*APEK(L)
1067 QREFK(L)=PQ0/PSK(L)*EXP(A2*(THSK(L)-A3*APESK(L)) &
1068 & /(THSK(L)-A4*APESK(L)))
1074 !-----------------------------------------------------------------------
1076 !*** ENTHALPY CONSERVATION INTEGRAL
1078 !-----------------------------------------------------------------------
1079 enthalpy_conservation : DO ITER=1,2
1085 SUMDE=((TK(L)-TREFK(L))*CP+(QK(L)-QREFK(L))*EL(L))*DPRS(L) &
1090 HCORR=SUMDE/(SUMDP-DPRS(LTOP))
1100 !*** ABOVE LQM CORRECT TEMPERATURE ONLY
1104 TREFK(L)=TREFK(L)+HCORR*RCP
1109 !*** BELOW LQM CORRECT BOTH TEMPERATURE AND MOISTURE
1112 TSKL=TREFK(L)*APEK(L)/APESK(L)
1113 DHDT=QREFK(L)*A23M4L/(TSKL-A4)**2+CP
1114 TREFK(L)=HCORR/DHDT+TREFK(L)
1115 THSKL=TREFK(L)*APEK(L)
1116 QREFK(L)=PQ0/PSK(L)*EXP(A2*(THSKL-A3*APESK(L)) &
1117 & /(THSKL-A4*APESK(L)))
1120 ENDDO enthalpy_conservation
1121 !-----------------------------------------------------------------------
1123 !*** HEATING, MOISTENING, PRECIPITATION
1125 !-----------------------------------------------------------------------
1133 DIFTL=(TREFK(L)-TKL )*TAUK
1134 DIFQL=(QREFK(L)-QK(L))*TAUK
1135 AVRGTL=(TKL+TKL+DIFTL)
1138 DSQ=DIFQL*EL(L)*DPOT+DSQ
1139 AVRGT=AVRGTL*DPRS(L)+AVRGT
1140 PRECK=DIFTL*DPRS(L)+PRECK
1148 AVRGT=AVRGT/(SUMDP+SUMDP)
1150 ! DRHEAT=PRECK*CP/AVRGT
1151 DRHEAT=(PRECK*SM+MAX(1.E-7,PRECK)*(1.-SM))*CP/AVRGT !As in Eta!
1152 DRHEAT=MAX(DRHEAT,1.E-20)
1153 EFI=EFIFC*DENTPY/DRHEAT
1154 !-----------------------------------------------------------------------
1157 !-----------------------------------------------------------------------
1159 ENDDO cloud_efficiency
1161 !-----------------------------------------------------------------------
1163 !-----------------------------------------------------------------------
1164 !---------------------- DEEP CONVECTION --------------------------------
1165 !-----------------------------------------------------------------------
1167 IF(DENTPY>=EPSNTP.AND.PRECK>EPSPR)THEN
1170 FEFI=EFMNT+SLOPE*(EFI-EFIMN)
1171 FEFI=(DENTPY-EPSNTP)*FEFI/DENTPY
1174 !*** UPDATE PRECIPITATION AND TENDENCIES OF TEMPERATURE AND MOISTURE
1180 DTDT(L)=DIFT(L)*FEFI*RDTCNVC
1181 DQDT(L)=DIFQ(L)*FEFI*RDTCNVC
1186 !-----------------------------------------------------------------------
1187 !*** REDUCE THE CLOUD TOP
1188 !-----------------------------------------------------------------------
1192 ! DEPMIN=PSH*PSFC*RSFCP
1195 !*** ITERATE DEEP CONVECTION PROCEDURE IF NEEDED
1197 ! IF(DEPTH>=DEPMIN)THEN
1202 CLDEFI=EFIMN*SM+STEFI*(1.-SM)
1204 !*** SEARCH FOR SHALLOW CLOUD TOP
1209 ! DEPMIN=PSH*PSFC*RSFCP
1211 PTPK=MAX(PSHU, PK(LBOT)-DEPMIN)
1213 !*** CLOUD TOP IS THE LEVEL JUST BELOW PBTK-PSH or JUST BELOW PSHU
1216 IF(PK(L)<=PTPK)LTOP=L+1
1221 !!*** HIGHEST LEVEL ALLOWED IS LEVEL JUST BELOW PSHU
1223 ! IF(PTPK<=PSHU)THEN
1226 ! IF(PK(L)<=PSHU)LSHU=L+1
1233 ! if(ltop>=lbot)then
1236 !!!!!! pbot=pk(lbot)
1246 ! QSATK(L)=PQ0/PK(L)*EXP(A2*(TK(L)-A3)/(TK(L)-A4))
1249 ! RHH=QK(LTOP)/QSATK(LTOP)
1254 ! RHL=QK(L)/QSATK(L)
1255 ! DRHDP=(RHH-RHL)/(PK(L-1)-PK(L))
1257 ! IF(DRHDP>RHMAX)THEN
1265 !-----------------------------------------------------------------------
1266 !-- Make shallow cloud top a function of virtual temperature excess (DTV)
1267 !-----------------------------------------------------------------------
1271 IF (DTV(L) > 0.) THEN
1279 !*** CLOUD MUST BE AT LEAST TWO LAYERS THICK
1281 ! IF(LBOT-LTOP<2)LTOP=LBOT-2 (eliminate this criterion)
1283 !-- End: Buoyancy check (24 Aug 2006)
1290 !DCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD
1291 !DCDCDCDCDCDCDC END OF DEEP CONVECTION DCDCDCDCDCDCD
1292 !DCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD
1294 !-----------------------------------------------------------------------
1295 !-----------------------------------------------------------------------
1297 !-----------------------------------------------------------------------
1298 !-----------------------------------------------------------------------
1300 !----------------GATHER SHALLOW CONVECTION POINTS-----------------------
1302 ! IF(PTOP<=PBOT-PNO.AND.LTOP<=LBOT-2)THEN
1303 ! DEPMIN=PSH*PSFC*RSFCP
1305 !! if(lpbl<lbot)lbot=lpbl
1306 !! if(lbot>lmh-1)lbot=lmh-1
1307 !! pbot=prsmid(lbot)
1309 ! IF(PTOP+1.>=PBOT-DEPMIN)SHALLOW=.TRUE.
1315 !***********************************************************************
1316 !-----------------------------------------------------------------------
1317 !*** Begin debugging convection
1319 WRITE(6,"(a,2i3,L2,3e12.4)") &
1320 '{cu2a lbot,ltop,shallow,pbot,ptop,depmin = ' &
1321 ,lbot,ltop,shallow,pbot,ptop,depmin
1323 !*** End debugging convection
1324 !-----------------------------------------------------------------------
1326 IF(.NOT.SHALLOW)GO TO 800
1328 !-----------------------------------------------------------------------
1329 !***********************************************************************
1330 !-----------------------------------------------------------------------
1331 !SCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCS
1332 !SCSCSCSCSCSCSC SHALLOW CONVECTION CSCSCSCSCSCSCSCSCSCS
1333 !SCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCS
1334 !-----------------------------------------------------------------------
1344 QSATK(L) =PQ0/PK(L)*EXP(A2*(TK(L)-A3)/(TK(L)-A4))
1347 THVMKL =TKL*APEKL*(QKL*D608+1.)
1357 !-----------------------------------------------------------------------
1358 !-- Begin: Raise cloud top if avg RH>RHSHmax and CAPE>0
1359 ! RHSHmax=RH at cloud base associated with a DSP of PONE
1360 !-----------------------------------------------------------------------
1362 TLEV2=T(LBOT)*((PK(LBOT)-PONE)/PK(LBOT))**CAPA
1363 QSAT1=PQ0/PK(LBOT)*EXP(A2*(T(LBOT)-A3)/(TK(LBOT)-A4))
1364 QSAT2=PQ0/(PK(LBOT)-PONE)*EXP(A2*(TLEV2-A3)/(TLEV2-A4))
1370 RHAVG=RHAVG+DPRS(L)*QK(L)/QSATK(L)
1374 IF (RHAVG/SUMDP > RHSHmax) THEN
1377 RHAVG=RHAVG+DPRS(L)*QK(L)/QSATK(L)
1379 IF (CPE(L) > 0.) THEN
1384 IF (RHAVG/SUMDP <= RHSHmax) EXIT
1385 IF (PK(L) <= PSHU) EXIT
1390 !-- End: Raise cloud top if avg RH>RHSHmax and CAPE>0
1392 !---------------------------SHALLOW CLOUD TOP---------------------------
1397 !-----------------------------------------------------------------------
1398 !*** Begin debugging convection
1400 WRITE(6,"(a,4e12.4)") '{cu2b PBOT,PTOP,DEPTH,DEPMIN= ' &
1401 ,PBOT,PTOP,DEPTH,DEPMIN
1403 !*** End debugging convection
1404 !-----------------------------------------------------------------------
1406 !BSF IF(DEPTH<DEPMIN)THEN
1409 !-----------------------------------------------------------------------
1410 IF(PTOP>PBOT-PNO.OR.LTOP>LBOT-2)THEN
1418 !--------------SCALING POTENTIAL TEMPERATURE & TABLE INDEX AT TOP-------
1420 THTPK=T(LTP1)*APE(LTP1)
1422 TTHK=(THTPK-THL)*RDTH
1423 QQK =TTHK-AINT(TTHK)
1436 !--------------BASE AND SCALING FACTOR FOR SPEC. HUMIDITY AT TOP--------
1443 !--------------SCALING SPEC. HUMIDITY & TABLE INDEX AT TOP--------------
1445 BQK=(BQS10K-BQS00K)*QQK+BQS00K
1446 SQK=(SQS10K-SQS00K)*QQK+SQS00K
1448 ! TQK=(Q(LTOP)-BQK)/SQK*RDQ
1449 TQK=(Q(LTP1)-BQK)/SQK*RDQ
1464 !----------------CLOUD TOP SATURATION POINT PRESSURE--------------------
1466 PART1=(PTBL(IQ+1,IT)-PTBL(IQ,IT))*PPK
1467 PART2=(PTBL(IQ,IT+1)-PTBL(IQ,IT))*QQK
1468 PART3=(PTBL(IQ ,IT )-PTBL(IQ+1,IT ) &
1469 & -PTBL(IQ ,IT+1)+PTBL(IQ+1,IT+1))*PPK*QQK
1470 PTPK=PTBL(IQ,IT)+PART1+PART2+PART3
1471 !-----------------------------------------------------------------------
1473 IF(ABS(DPMIX).LT.3000.)DPMIX=-3000.
1475 !----------------TEMPERATURE PROFILE SLOPE------------------------------
1477 SMIX=(THTPK-THBT)/DPMIX*STABS
1479 TREFKX=TREFK(LBOT+1)
1488 TREFKX=((PKXXXY-PKXXXX)*SMIX &
1489 & +TREFKX*APEKXX)/APEKXY
1491 IF(L<=LMID) TREFK(L)=MAX(TREFK(L), TK(L)+DTSHAL)
1498 !----------------TEMPERATURE REFERENCE PROFILE CORRECTION---------------
1504 SUMDT=(TK(L)-TREFK(L))*DPRS(L)+SUMDT
1509 FPK(LBOT)=TREFK(LBOT)
1514 TRFKL =TREFK(L)+TCORR
1519 !----------------HUMIDITY PROFILE EQUATIONS-----------------------------
1531 PSUM =DPKL *DPRS(L)+PSUM
1532 QSUM =QK(L)*DPRS(L)+QSUM
1533 RTBAR =2./(TREFK(L)+TK(L))
1534 OTSUM =DPRS(L)*RTBAR+OTSUM
1535 POTSUM=DPKL *RTBAR*DPRS(L)+POTSUM
1536 QOTSUM=QK(L) *RTBAR*DPRS(L)+QOTSUM
1537 DST =(TREFK(L)-TK(L))*RTBAR*DPRS(L)/EL(L)+DST
1543 POTSUM=POTSUM*ROTSUM
1544 QOTSUM=QOTSUM*ROTSUM
1547 !-----------------------------------------------------------------------
1548 !*** Begin debugging convection
1550 WRITE(6,"(a,5e12.4)") '{cu2c DST,PSUM,QSUM,POTSUM,QOTSUM = ' &
1551 ,DST,PSUM,QSUM,POTSUM,QOTSUM
1553 !*** End debugging convection
1554 !-----------------------------------------------------------------------
1556 !----------------ENSURE POSITIVE ENTROPY CHANGE-------------------------
1569 !----------------CHECK FOR ISOTHERMAL ATMOSPHERE------------------------
1573 IF(-DEN/PSUM<5.E-5)THEN
1580 !----------------SLOPE OF THE REFERENCE HUMIDITY PROFILE----------------
1583 DQREF=(QOTSUM-DSTQ-QSUM)/DEN
1586 !-------------- HUMIDITY DOES NOT INCREASE WITH HEIGHT------------------
1596 !----------------HUMIDITY AT THE CLOUD TOP------------------------------
1598 QRFTP=QSUM-DQREF*PSUM
1600 !----------------HUMIDITY PROFILE---------------------------------------
1603 QRFKL=(FPK(L)-FPTK)*DQREF+QRFTP
1605 !*** TOO DRY CLOUDS NOT ALLOWED
1607 TNEW=(TREFK(L)-TK(L))*TAUKSC+TK(L)
1608 QSATK(L)=PQ0/PK(L)*EXP(A2*(TNEW-A3)/(TNEW-A4))
1609 QNEW=(QRFKL-QK(L))*TAUKSC+QK(L)
1611 IF(QNEW<QSATK(L)*RHLSC)THEN
1619 !-------------TOO MOIST CLOUDS NOT ALLOWED------------------------------
1621 IF(QNEW>QSATK(L)*RHHSC)THEN
1630 THVREF(L)=TREFK(L)*APEK(L)*(QRFKL*D608+1.)
1634 !------------------ ELIMINATE CLOUDS WITH BOTTOMS TOO DRY --------------
1636 ! qnew=(qrefk(lbot)-qk(lbot))*tauksc+qk(lbot)
1638 ! if(qnew<qk(lbot+1)*stresh)then !!?? stresh too large!!
1646 !-------------- ELIMINATE IMPOSSIBLE SLOPES (BETTS,DTHETA/DQ)------------
1649 DTDP=(THVREF(L-1)-THVREF(L))/(PRSMID(L)-PRSMID(L-1))
1660 !-----------------------------------------------------------------------
1661 !--------------RELAXATION TOWARD REFERENCE PROFILES---------------------
1662 !-----------------------------------------------------------------------
1665 DTDT(L)=(TREFK(L)-TK(L))*TAUKSC*RDTCNVC
1666 DQDT(L)=(QREFK(L)-QK(L))*TAUKSC*RDTCNVC
1669 !-----------------------------------------------------------------------
1670 !*** Begin debugging convection
1673 WRITE(6,"(a,i3,4e12.4)") '{cu2 KFLIP,DT,DTDT,DQ,DQDT = ' &
1674 ,KTE+1-L,TREFK(L)-TK(L),DTDT(L),QREFK(L)-QK(L),DQDT(L)
1677 !*** End debugging convection
1678 !-----------------------------------------------------------------------
1680 !-----------------------------------------------------------------------
1681 !SCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCS
1682 !SCSCSCSCSCSCSC END OF SHALLOW CONVECTION SCSCSCSCSCSCSCS
1683 !SCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCSCS
1684 !-----------------------------------------------------------------------
1686 !-----------------------------------------------------------------------
1688 !-----------------------------------------------------------------------
1689 !XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
1690 !-----------------------------------------------------------------------
1692 & (ITBX,JTBX,PLX,PRSMID,RDPX,RDTHEX,STHE &
1693 & ,THE0,THESP,TTBL,TREF)
1694 !-----------------------------------------------------------------------
1695 ! ******************************************************************
1697 ! * EXTRACT TEMPERATURE OF THE MOIST ADIABAT FROM *
1698 ! * THE APPROPRIATE TTBL *
1700 ! ******************************************************************
1701 !-----------------------------------------------------------------------
1703 !-----------------------------------------------------------------------
1704 INTEGER,INTENT(IN) :: ITBX,JTBX
1706 REAL,INTENT(IN) :: PLX,PRSMID,RDPX,RDTHEX,THESP
1708 REAL,DIMENSION(ITBX),INTENT(IN) :: STHE,THE0
1710 REAL,DIMENSION(JTBX,ITBX),INTENT(IN) :: TTBL
1712 REAL,INTENT(OUT) :: TREF
1713 !-----------------------------------------------------------------------
1714 REAL :: BTHE00K,BTHE10K,BTHK,PK,PP,QQ,STHE00K,STHE10K,STHK &
1715 & ,T00K,T01K,T10K,T11K,TPK,TTHK
1717 INTEGER :: IPTB,ITHTB
1718 !-----------------------------------------------------------------------
1719 !----------------SCALING PRESSURE & TT TABLE INDEX----------------------
1720 !-----------------------------------------------------------------------
1725 !----------------KEEPING INDICES WITHIN THE TABLE-----------------------
1735 !----------------BASE AND SCALING FACTOR FOR THETAE---------------------
1738 BTHE10K=THE0(IPTB+1)
1739 STHE10K=STHE(IPTB+1)
1740 !----------------SCALING THE & TT TABLE INDEX---------------------------
1741 BTHK=(BTHE10K-BTHE00K)*QQ+BTHE00K
1742 STHK=(STHE10K-STHE00K)*QQ+STHE00K
1743 TTHK=(THESP-BTHK)/STHK*RDTHEX
1746 !----------------KEEPING INDICES WITHIN THE TABLE-----------------------
1756 !----------------TEMPERATURE AT FOUR SURROUNDING TT TABLE PTS.----------
1757 T00K=TTBL(ITHTB,IPTB)
1758 T10K=TTBL(ITHTB+1,IPTB)
1759 T01K=TTBL(ITHTB,IPTB+1)
1760 T11K=TTBL(ITHTB+1,IPTB+1)
1761 !-----------------------------------------------------------------------
1762 !----------------PARCEL TEMPERATURE-------------------------------------
1763 !-----------------------------------------------------------------------
1764 TREF=(T00K+(T10K-T00K)*PP+(T01K-T00K)*QQ &
1765 & +(T00K-T10K-T01K+T11K)*PP*QQ)
1766 !-----------------------------------------------------------------------
1767 END SUBROUTINE TTBLEX
1768 !-----------------------------------------------------------------------
1769 !-----------------------------------------------------------------------
1770 SUBROUTINE BMJINIT(RTHCUTEN,RQVCUTEN,RQCCUTEN,RQRCUTEN &
1771 & ,CLDEFI,LOWLYR,CP,RD,RESTART &
1772 & ,ALLOWED_TO_READ &
1773 & ,IDS,IDE,JDS,JDE,KDS,KDE &
1774 & ,IMS,IME,JMS,JME,KMS,KME &
1775 & ,ITS,ITE,JTS,JTE,KTS,KTE)
1776 !-----------------------------------------------------------------------
1778 !-----------------------------------------------------------------------
1779 LOGICAL,INTENT(IN) :: RESTART,ALLOWED_TO_READ
1780 INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE &
1781 & ,IMS,IME,JMS,JME,KMS,KME &
1782 & ,ITS,ITE,JTS,JTE,KTS,KTE
1784 REAL,INTENT(IN) :: CP,RD
1786 REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(OUT) :: &
1792 REAL,DIMENSION(IMS:IME,JMS:JME),INTENT(OUT) :: CLDEFI
1794 INTEGER,DIMENSION(IMS:IME,JMS:JME),INTENT(INOUT) :: LOWLYR
1796 REAL,PARAMETER :: EPS=1.E-9
1798 REAL, DIMENSION(JTB) :: APP,APT,AQP,AQT,PNEW,POLD,QSNEW,QSOLD &
1799 & ,THENEW,THEOLD,TNEW,TOLD,Y2P,Y2T
1801 REAL,DIMENSION(JTBQ) :: APTQ,AQTQ,THENEWQ,THEOLDQ &
1804 INTEGER :: I,J,K,ITF,JTF,KTF
1805 INTEGER :: KTH,KTHM,KTHM1,KP,KPM,KPM1
1807 REAL :: APE,DP,DQS,DTH,DTHE,P,QS,QS0K,SQSK,STHEK &
1808 & ,TH,THE0K,DENOM,ELOCP
1809 !-----------------------------------------------------------------------
1816 IF(.NOT.RESTART)THEN
1835 !*** FOR NOW, ASSUME SIGMA MODE FOR LOWEST MODEL LAYER
1842 !-----------------------------------------------------------------------
1843 !----------------COARSE LOOK-UP TABLE FOR SATURATION POINT--------------
1844 !-----------------------------------------------------------------------
1851 DTH=(THH-THL)/REAL(KTHM-1)
1852 DP =(PH -PL )/REAL(KPM -1)
1855 !-----------------------------------------------------------------------
1863 APE=(100000./P)**(RD/CP)
1866 QSOLD(KP)=PQ0/P*EXP(A2*(TH-A3*APE)/DENOM)
1874 SQSK=QSOLD(KPM)-QSOLD(1)
1879 QSOLD(KP)=(QSOLD(KP)-QS0K)/SQSK
1880 IF((QSOLD(KP)-QSOLD(KP-1)).LT.EPS)QSOLD(KP)=QSOLD(KP-1)+EPS
1887 !-----------------------------------------------------------------------
1893 QSNEW(KP)=QSNEW(KP-1)+DQS
1899 CALL SPLINE(JTB,KPM,QSOLD,POLD,Y2P,KPM,QSNEW,PNEW,APP,AQP)
1902 PTBL(KP,KTH)=PNEW(KP)
1903 PTBL_EXP(KP,KTH)=PNEW(KP)
1905 !-----------------------------------------------------------------------
1907 !-----------------------------------------------------------------------
1908 !------------COARSE LOOK-UP TABLE FOR T(P) FROM CONSTANT THE------------
1909 !-----------------------------------------------------------------------
1919 APE=(1.E5/P)**(RD/CP)
1922 QS=PQ0/P*EXP(A2*(TH-A3*APE)/DENOM)
1926 ! QS=PQ0/P*EXP(A2*(TH-A3*APE)/(TH-A4*APE))
1928 THEOLD(KTH)=TH*EXP(ELOCP*QS/TOLD(KTH))
1932 STHEK=THEOLD(KTHM)-THEOLD(1)
1937 THEOLD(KTH)=(THEOLD(KTH)-THE0K)/STHEK
1938 IF((THEOLD(KTH)-THEOLD(KTH-1)).LT.EPS) &
1939 & THEOLD(KTH)=THEOLD(KTH-1) + EPS
1944 !-----------------------------------------------------------------------
1947 DTHE=1./REAL(KTHM-1)
1950 THENEW(KTH)=THENEW(KTH-1)+DTHE
1956 CALL SPLINE(JTB,KTHM,THEOLD,TOLD,Y2T,KTHM,THENEW,TNEW,APT,AQT)
1959 TTBL(KTH,KP)=TNEW(KTH)
1961 !-----------------------------------------------------------------------
1963 !-----------------------------------------------------------------------
1965 !-----------------------------------------------------------------------
1966 !---------------FINE LOOK-UP TABLE FOR SATURATION POINT-----------------
1967 !-----------------------------------------------------------------------
1973 DTH=(THHQ-THL)/REAL(KTHM-1)
1974 DP=(PH-PLQ)/REAL(KPM-1)
1978 !-----------------------------------------------------------------------
1979 !---------------FINE LOOK-UP TABLE FOR T(P) FROM CONSTANT THE-----------
1980 !-----------------------------------------------------------------------
1988 APE=(1.E5/P)**(RD/CP)
1991 QS=PQ0/P*EXP(A2*(TH-A3*APE)/DENOM)
1995 ! QS=PQ0/P*EXP(A2*(TH-A3*APE)/(TH-A4*APE))
1997 THEOLDQ(KTH)=TH*EXP(ELOCP*QS/TOLDQ(KTH))
2001 STHEK=THEOLDQ(KTHM)-THEOLDQ(1)
2006 THEOLDQ(KTH)=(THEOLDQ(KTH)-THE0K)/STHEK
2007 IF((THEOLDQ(KTH)-THEOLDQ(KTH-1))<EPS) &
2008 & THEOLDQ(KTH)=THEOLDQ(KTH-1)+EPS
2013 !-----------------------------------------------------------------------
2016 DTHE=1./REAL(KTHM-1)
2019 THENEWQ(KTH)=THENEWQ(KTH-1)+DTHE
2025 CALL SPLINE(JTBQ,KTHM,THEOLDQ,TOLDQ,Y2TQ,KTHM &
2026 & ,THENEWQ,TNEWQ,APTQ,AQTQ)
2029 TTBLQ(KTH,KP)=TNEWQ(KTH)
2031 !-----------------------------------------------------------------------
2033 !-----------------------------------------------------------------------
2034 END SUBROUTINE BMJINIT
2035 !-----------------------------------------------------------------------
2036 !XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
2037 !-----------------------------------------------------------------------
2038 SUBROUTINE SPLINE(JTBX,NOLD,XOLD,YOLD,Y2,NNEW,XNEW,YNEW,P,Q)
2039 ! ********************************************************************
2041 ! * THIS IS A ONE-DIMENSIONAL CUBIC SPLINE FITTING ROUTINE *
2042 ! * PROGRAMED FOR A SMALL SCALAR MACHINE. *
2044 ! * PROGRAMER Z. JANJIC *
2046 ! * NOLD - NUMBER OF GIVEN VALUES OF THE FUNCTION. MUST BE GE 3. *
2047 ! * XOLD - LOCATIONS OF THE POINTS AT WHICH THE VALUES OF THE *
2048 ! * FUNCTION ARE GIVEN. MUST BE IN ASCENDING ORDER. *
2049 ! * YOLD - THE GIVEN VALUES OF THE FUNCTION AT THE POINTS XOLD. *
2050 ! * Y2 - THE SECOND DERIVATIVES AT THE POINTS XOLD. IF NATURAL *
2051 ! * SPLINE IS FITTED Y2(1)=0. AND Y2(NOLD)=0. MUST BE *
2053 ! * NNEW - NUMBER OF VALUES OF THE FUNCTION TO BE CALCULATED. *
2054 ! * XNEW - LOCATIONS OF THE POINTS AT WHICH THE VALUES OF THE *
2055 ! * FUNCTION ARE CALCULATED. XNEW(K) MUST BE GE XOLD(1) *
2056 ! * AND LE XOLD(NOLD). *
2057 ! * YNEW - THE VALUES OF THE FUNCTION TO BE CALCULATED. *
2058 ! * P, Q - AUXILIARY VECTORS OF THE LENGTH NOLD-2. *
2060 ! ********************************************************************
2061 !-----------------------------------------------------------------------
2063 !-----------------------------------------------------------------------
2064 INTEGER,INTENT(IN) :: JTBX,NNEW,NOLD
2065 REAL,DIMENSION(JTBX),INTENT(IN) :: XNEW,XOLD,YOLD
2066 REAL,DIMENSION(JTBX),INTENT(INOUT) :: P,Q,Y2
2067 REAL,DIMENSION(JTBX),INTENT(OUT) :: YNEW
2069 INTEGER :: K,K1,K2,KOLD,NOLDM1
2070 REAL :: AK,BK,CK,DEN,DX,DXC,DXL,DXR,DYDXL,DYDXR &
2071 & ,RDX,RTDXC,X,XK,XSQ,Y2K,Y2KP1
2072 !-----------------------------------------------------------------------
2077 DYDXL=(YOLD(2)-YOLD(1))/DXL
2078 DYDXR=(YOLD(3)-YOLD(2))/DXR
2081 P(1)= RTDXC*(6.*(DYDXR-DYDXL)-DXL*Y2(1))
2084 IF(NOLD==3)GO TO 150
2085 !-----------------------------------------------------------------------
2090 DXR=XOLD(K+1)-XOLD(K)
2091 DYDXR=(YOLD(K+1)-YOLD(K))/DXR
2093 DEN=1./(DXL*Q(K-2)+DXC+DXC)
2095 P(K-1)= DEN*(6.*(DYDXR-DYDXL)-DXL*P(K-2))
2100 !-----------------------------------------------------------------------
2103 200 Y2(K)=P(K-1)+Q(K-1)*Y2(K+1)
2107 !-----------------------------------------------------------------------
2124 450 IF(K1==1)GO TO 500
2125 IF(K==KOLD)GO TO 550
2131 DX=XOLD(K+1)-XOLD(K)
2134 AK=.1666667*RDX*(Y2KP1-Y2K)
2136 CK=RDX*(YOLD(K+1)-YOLD(K))-.1666667*DX*(Y2KP1+Y2K+Y2K)
2141 YNEW(K1)=AK*XSQ*X+BK*XSQ+CK*X+YOLD(K)
2144 IF(K1<=NNEW)GO TO 300
2145 !-----------------------------------------------------------------------
2146 END SUBROUTINE SPLINE
2147 !-----------------------------------------------------------------------
2149 END MODULE MODULE_CU_BMJ
2151 !-----------------------------------------------------------------------