SUBROUTINE LTGTHERMO(KFILDO,KFIL10,IDPARS,JD,NDATE, 1 NGRIDC,ND11,NSLAB,IPACK,IWORK,DATA,ND5, 2 LSTORE,ND9,LITEMS,CORE,ND10,NBLOCK,NFETCH, 3 IS0,IS1,IS2,IS4,ND7,ND2X3, 4 ISTAV,L3264B,MISTOT,IER) C C C APRIL 2019 SHAFER MDL MOS-2000 C JANUARY 2021 SHAFER, C SAMPLATSKY ADJUSTED SEVERAL IF STATEMENTS C FROM A.GT.B TO A.GE.B AS THE EQ C CONDITION WAS NEVER ACCOUNTED. C ORIGINAL STATEMENTS WERE LEFT C AS COMMENTED. C C PURPOSE C SUBROUTINE LTGTHERMO COMPUTES VARIOUS THERMODYNAMIC/STABILITY C PARAMETERS AT MODEL GRID POINTS FOR PREDICTION OF LIGHTNING. C A SOUNDING IS CONSTRUCTED ABOVE EACH GRID POINT FROM AVAILABLE C TEMPERATURE AND DEWPOINT DATA AT THE SURFACE AND AT PRESSURE C LEVELS. THERE MUST BE AT LEAST FIVE LEVELS AVAILABLE IN ORDER C TO PERFORM CALCULATIONS. C C THE FOLLOWING IDPARS(1) AND IDPARS(2) ARE ACCOMMODATED: C C 002 003 - TEMPERATURE AT THE LIFTING CONDENSATION LEVEL C (DEG C) FOR THE MOST UNSTABLE PARCEL BETWEEN THE C SURFACE UP TO SIGMA LEVEL IDPARS(7)/100. C IDPARS(7)=0 WILL DEFAULT TO 0.7 SIGMA. C C 002 004 - EQUILIBRIUM LEVEL TEMPERATURE (DEC C) FOR THE C MOST UNSTABLE PARCEL BETWEEN THE SURFACE UP TO C SIGMA LEVEL IDPARS(7)/100. IDPARS(7)=0 WILL C DEFAULT TO 0.7 SIGMA. IF NO EQUILIBRIUM LEVEL C EXISTS THIS IS SET TO THE LCL TEMPERATURE FOR C THE MOST UNSTABLE PARCEL. C C 007 021 - BEST LIFTED INDEX (DEG C) COMPUTED BY FINDING THE C MOST UNSTABLE PARCEL BETWEEN THE SURFACE UP TO C SIGMA LEVEL IDPARS(7)/100. IDPARS(7)=0 WILL DEFAULT C TO 0.7 SIGMA. C C 007 104 - MOST UNSTABLE CONVECTIVE AVAILABLE POTENTIAL ENERGY C (CAPE - J/KG) COMPUTED FOR THE LAYER IDPARS(6)<T<0C C WHERE IDPARS(6) IS GIVEN IN KELVIN. UPPER LIMIT FOR C FINDING MOST UNSTABLE PARCEL IS SIGMA IDPARS(7)/100. C IDPARS(7)=0 WILL DEFAULT TO 0.7 SIGMA. C C IDPARS(6) = TEMPERATURE THRESHOLD (IN KELVIN) THAT C DEFINES THE TOP OF THE LAYER FOR C COMPUTING CAPE, E.G., C 0253 = -20C LEVEL C 0000 = USE HIGHEST AVAIL LEVEL C C 007 105 - MOST UNSTABLE CONVECTIVE AVAILABLE POTENTIAL ENERGY C (CAPE - J/KG) IN THE LAYER COLDER THAN A SPECIFIED C TEMPERATURE THRESHOLD GIVEN BY IDPARS(6) IN KELVIN. C UPPER LIMIT FOR FINDING THE MOST UNSTABLE PARCEL IS C SIGMA IDPARS(7)/100. IDPARS(7)=0 WILL DEFAULT TO C 0.7 SIGMA. C C IDPARS(6) = TEMPERATURE THRESHOLD (IN KELVIN) THAT C DEFINES THE BOTTOM OF THE LAYER FOR C COMPUTING CAPE, E.G., C 0273 = 0C LEVEL C 0000 = DEFAULTS TO FULL SOUNDING C C 007 121 - CONVECTIVE INHIBITION (CIN - J/KG) FOR A PARCEL C ORIGINATING IDPARS(6) HPA FROM THE SURFACE, IN THE C LAYER BOUNDED BY IDPARS(7)/100 SIGMA AT THE TOP. C IDPARS(7)=0 WILL DEFAULT TO 0.7 SIGMA. C C C DATA SET USE C KFILDO = DEFAULT UNIT NUMBER FOR OUTPUT(PRINT) FILE. C (OUTPUT) C KFIL10 = UNIT NUMBER OF TDL MOS-2000 FILE SYSTEM C ACCESS.(INPUT-OUTPUT) C C VARIABLES C CORE(J) = THE ARRAY TO STORE OR RETRIEVE THE DATA C IDENTIFIED IN LSTORE(,) (J=1,ND10). C WHEN CORE() IS FULL DATA ARE STORED ON DISK. C (INPUT) C DATA(J) = COMPUTED VARIABLE (J=1,ND5). (OUTPUT) C I = LOOP CONTROL VARIABLE C IDPARS(J) = THE PARSED, INDIVIDUAL COMPONENTS OF THE C PREDICTOR ID CORRESPONDING TO ID() (J=1,15). C (INPUT) C J=1--CCC (CLASS OF VARIABLE), C J=2--FFF (SUBCLASS OF VARIABLE), C J=3--B (BINARY INDICATOR), C J=4--DD (DATA SOURCE, MODEL NUMBER), C J=5--V (VERTICAL APPLICATION), C J=6--LBLBLBLB (BOTTOM OF LAYER, 0 IF ONLY C 1 LAYER) C J=7--LTLTLTLT (TOP OF LAYER) C J=8--T (TRANSFORMATION) C J=9--RR (RUN TIME OFFSET, ALWAYS + AND C BACK IN TIME) C J=10-OT (TIME APPLICATION) C J=11-OH (TIME PERIOD IN HOURS) C J=12-TAU (PROJECTION IN HOURS) C J=13-I (INTERPOLATION TYPE) C J=14-S (SMOOTHING INDICATOR) C J=15-G (GRID INDICATOR) C IER = STATUS RETURN C 0 = GOOD RETURN C SEE GFETCH FOR OTHER VALUES. C WHEN IER NE 0, DATA ARE RETURNED AS MISSING. C (INTERNAL-OUTPUT) C IPACK(J) = WORK ARRAY (J=1,ND5). (INTERNAL) C IS0(J) = MOS-2000 GRIB SECTION 0 ID'S (J=1,3). C (INTERNAL) C IS1(J) = MOS-2000 GRIB SECTION 1 ID'S (J=1,22+). C (INTERNAL) C IS2(J) = MOS-2000 GRIB SECTION 2 ID'S (J=1,12). C IS2(3) AND IS2(4) ARE USED BY THE CALLING C PROGRAM AS THE GRID DIMENSIONS. C (INTERNAL-OUTPUT) C IS4(J) = MOS-2000 GRIB SECTION 4 ID'S (J=1,4). C (INTERNAL) C ISTAV = 0 SINCE THE DATA RETURNED ARE GRID DATA. C (OUTPUT) C IWORK(J) = WORK ARRAY (J=1,ND5). (INTERNAL) C JD(J) = THE BASIC INTEGER PREDICTOR ID (J=1,4). C THIS IS THE SAME AS ID(J), EXCEPT THAT C THE PORTIONS PERTAINING TO PROCESSING C ARE OMITTED: C B = IDPARS(3), C T = IDPARS(8), C I = IDPARS(13), C S = IDPARS(14), C G = IDPARS(15), AND C THRESH. C ID() IS USED TO HELP IDENTIFY THE BASIC MODEL C FIELDS AS READ FROM THE ARCHIVE. (INPUT) C KFILDO = DEFAULT UNIT NUMBER FOR OUTPUT (PRINT) FILE. C (INPUT) C KFIL10 = UNIT NUMBER OF TDL MOS-2000 FILE SYSTEM ACCESS. C (INPUT) C L3264B = INTEGER WORD LENGTH IN BITS OF MACHINE BEING C USED (EITHER 32 OR 64). (INPUT) C LITEMS = THE NUMBER OF ITEMS (COLUMNS) IN LSTORE(,) C THAT HAVE BEEN USED IN THIS RUN. (INPUT) C LSTORE(L,J) = THE ARRAY HOLDING INFORMATION ABOUT THE C DATA STORED (L=1,12) (J=1,LITEMS). C (INPUT-OUTPUT) C L=1,4--THE 4 ID'S FOR THE DATA. C L=5 --LOCATION OF STORED DATA. WHEN IN CORE, C THIS IS THE LOCATION IN CORE() WHERE C THE DATA START. WHEN ON DISK, C THIS IS MINUS THE RECORD NUMBER WHERE C THE DATA START. C L=6 --THE NUMBER OF 4-BYTE WORDS STORED. C L=7 --2 FOR DATA PACKED IN TDL GRIB, 1 FOR NOT. C L=8 --THE DATE/TIME OF THE DATA IN FORMAT C YYYYMMDDHH. C L=9 --NUMBER OF TIMES DATA HAVE BEEN RETRIEVED. C L=10 --NUMBER OF THE SLAB IN DIR(, ,L) AND C IN NGRIDC(,L) DEFINING THE C CHARACTERISTICS OF THIS GRID. C L=11 --THE NUMBER OF THE PREDICTOR IN THE SORTED C LIST IN ID(,N) (N=1,NPRED) FOR WHICH C THIS VARIABLE IS NEEDED, WHEN IT IS C NEEDED ONLY ONCE FROM LSTORE(,). C WHEN IT IS NEEDED MORE THAN ONCE, THE C VALUE IS SET = 7777. C L=12 --USED INITIALLY IN ESTABLISHING C MSTORE(,). LATER USED AS A WAY OF C DETERMINING WHETHER TO KEEP THIS C VARIABLE. C MDPARS() = PARSED ID USED IN SUBROUTINE PRSID1 FOR C SUBROUTINE DEWPOINT C MISSP = PRIMARY MISSING VALUE INDICATOR. RETURNED AS C 0 WHEN DATA ARE NOT PACKED. (INTERNAL) C MISSS = SECONDARY MISSING VALUE INDICATOR. RETURNED AS C 0 WHEN DATA ARE NOT PACKED. (INTERNAL) C MISTOT = TOTAL NUMBER OF TIMES A MISSING INDICATOR C HAS BEEN ENCOUNTERED IN UNPACKING GRIDS. C (INPUT-OUTPUT) C NBLOCK = THE BLOCK SIZE IN WORDS OF THE MOS-2000 RANDOM C DISK FILE. (INPUT) C ND2X3 = DIMENSION OF SEVERAL VARIABLES. THE SIZE OF C THE GRID IS NOT KNOWN BEFORE FDTK AND FDDP C ARE FETCHED. ALL WORK ARRAYS ARE DIMENSIONED C ND2X3 (INPUT) C ND5 = DIMENSION OF IPACK( ), IWORK( ), AND C DATA( ). (INPUT) C ND7 = DIMENSION OF IS0(),IS1(),IS2(), AND IS4(). C NOT ALL LOCATIONS ARE USED. (INPUT) C ND9 = THE SECOND DIMENSION OF LSTORE(,). (INPUT) C ND10 = DIMENSION OF CORE(). (INPUT) C ND11 = MAXIMUM NUMBER OF GRID COMBINATIONS THAT CAN C BE DEALT WITH ON THIS RUN. LAST DIMENSION C OF NGRIDC(,). (INPUT) C NDATE = THE DATE/TIME FOR WHICH PREDICTOR IS NEEDED. C (INPUT) C NFETCH = INCREMENTED EACH TIME GFETCH IS ENTERED. C IT IS A RUNNING COUNT FROM THE BEGINNING OF C THE PROGRAM. THIS COUNT IS MAINTAINED IN C CASE THE USER NEEDS IT(DIAGNOSTICS, ETC.). C (OUTPUT) C NGRIDC(L,M) = HOLDS THE GRID CHARACTERISTICS (L=1,6) FOR C EACH GRID COMBINATION (M=1,NGRID). C L=1--MAP PROJECTION NUMBER (3=LAMBERT, 5= C POLAR STEREOGRAPHIC). C L=2--GRID LENGTH IN METERS. C L=3--LATITUDE AT WHICH THE GRID LENGTH IS C CORRECT *1000. C L=4--GRID ORIENTATION IN DEGREES * 1000. C L=5--LATITUDE OF LL CORNER IN DEGREES *1000. C L=6--LONGITUDE OF LL CORNER IN DEGREES C *1000. C NPACK = 2 FOR TDL GRIB PACKED DATA; 1 FOR NOT PACKED C THIS IS RETURNED FROM GFETCH. (INTERNAL) C NSLAB = THE NUMBER OF THE SLAB IN DIR(, ,) AND C IN NGRIDC(,) DEFINING THE CHARACTERISTICS C OF THIS GRID. (OUTPUT) C NTIMES = THE NUMBER OF TIMES, INCLUDING THIS ONE, C THAT THE RECORD HAS BEEN FETCHED. THIS IS C STORED IN LSTORE(9,). (INTERNAL) C NWORDS = NUMBER OF WORDS RETURNED IN DATA(). THIS C IS RETURNED FROM GFETCH (INTERNAL) C 1 2 3 4 5 6 7 X C IMPLICIT NONE C INTEGER, PARAMETER :: MAXLEV=38 !MAX NUMBER OF PRESSURE LEVELS C INTEGER JD(4),IDPARS(15),LD(4),LDPARS(15) INTEGER IS0(ND7),IS1(ND7),IS2(ND7),IS4(ND7) INTEGER IPACK(ND5),IWORK(ND5) INTEGER LSTORE(12,ND9) INTEGER NGRIDC(6,ND11) INTEGER ICCCFFF,I,J,K,L,N,Z,N500 INTEGER KMAX,NLVL INTEGER NX,NY,ISTAV1,IER1,NLVLT,NLVLTD INTEGER IER,ISTAV,KFILDO,KFIL10,L3264B,LITEMS, 1 MISSP,MISSS,MISTOT,NBLOCK,ND2X3, 2 ND5,ND7,ND9,ND10,ND11, 3 NDATE,NFETCH,NPACK,NSLAB,NTIMES,NWORDS INTEGER TAVAIL(MAXLEV) C REAL CORE(ND10) REAL DATA(ND5),FD1(ND5),FD2(ND5),FD3(ND5),FD4(ND5), 1 PRESS(ND5,MAXLEV),TK(ND5,MAXLEV),TDK(ND5,MAXLEV) REAL P(MAXLEV),T(MAXLEV),D(MAXLEV) REAL PP(MAXLEV),TT(MAXLEV),DD(MAXLEV) REAL TTC(MAXLEV),DDC(MAXLEV),TP(MAXLEV) REAL IP,TRPT,LCLP,PB,SATLFT,ALCL REAL P1,TDIFF,LAPS REAL PO,TO,DO,PT,THW,TP500,ELP REAL PPP,TTE,TTP,PTOP,PBOT C IER=0 ISTAV=0 DATA=9999. PRESS(1:ND5,1:MAXLEV)=99999. TK(1:ND5,1:MAXLEV)=9999. TDK(1:ND5,1:MAXLEV)=9999. TAVAIL(1:MAXLEV)=0 C ICCCFFF=IDPARS(1)*1000+IDPARS(2) C C CHECK IF VARIABLE IS ACCOMMODATED C IF(ICCCFFF.NE.002003.AND.ICCCFFF.NE.002004.AND. 1 ICCCFFF.NE.007021.AND.ICCCFFF.NE.007104.AND. 2 ICCCFFF.NE.007105.AND.ICCCFFF.NE.007121) THEN WRITE(KFILDO,101)(JD(J),J=1,4) 101 FORMAT(/,' ****IDPARS(1) AND IDPARS(2) DO NOT INDICATE', 1 ' LTGTHERMO PREDICTOR. ',I9.9,2I10.9,I4.3,' NOT', 2 ' COMPUTED IN LTGTHERMO.') IER=100 RETURN ENDIF C C FETCH SURFACE PRESSURE AND STORE IT IN PRESS(,1) C (FOR NAM FETCH 0-30MB BOUNDARY LAYER PRESSURE THEN C ADD 15 MB TO IT TO APPROXIMATE A SURFACE PRESSURE). C IF(IDPARS(4).EQ.07) THEN LD(1)=001107000+IDPARS(4) LD(2)=970 ELSE LD(1)=001100000+IDPARS(4) LD(2)=0 ENDIF LD(3)=IDPARS(9)*1000000+IDPARS(12) LD(4)=0 CALL GFETCH(KFILDO,KFIL10,LD,7777,LSTORE,ND9,LITEMS, 1 IS0,IS1,IS2,IS4,ND7,IPACK,IWORK,PRESS(1:ND5,1), 2 ND2X3,NWORDS,NPACK,NDATE,NTIMES,CORE,ND10, 3 NBLOCK,NFETCH,NSLAB,MISSP,MISSS,L3264B,1,IER1) IF(MISSP.NE.0)MISTOT=MISTOT+1 IF(IER1.EQ.0) THEN NX=IS2(3) NY=IS2(4) IF(IDPARS(4).EQ.07) THEN DO J=1,NX*NY PRESS(J,1)=PRESS(J,1)+1500. ENDDO ENDIF ELSE WRITE(KFILDO,111)(JD(J),J=1,4) 111 FORMAT(/' ****VARIABLE ',I9.9,2I10.9,I4.3, 1 ' NOT COMPUTED IN LTGTHERMO. SURFACE PRESSURE COULD', 2 ' NOT BE FETCHED.') IER=101 RETURN ENDIF C C FILL PRESSURE ARRAY IN 25 HPA INCREMENTS C DO J=1,NX*NY PRESS(J,1)=PRESS(J,1)/100. ENDDO DO K=2,MAXLEV PRESS(1:ND5,K)=1000.-((K-2)*25.) ENDDO C C FETCH TEMPERATURE AT EACH PRESSURE LEVEL C AND STORE IT IN TK(:,K). C NLVLT=0 DO K=1,MAXLEV IF(K.EQ.1) THEN LD(1)=002001000+IDPARS(4) LD(2)=2 ELSE LD(1)=002000000+IDPARS(4) LD(2)=1000.-((K-2)*25.) ENDIF LD(3)=IDPARS(9)*1000000+IDPARS(12) LD(4)=0 CALL GFETCH(KFILDO,KFIL10,LD,7777,LSTORE,ND9,LITEMS, 1 IS0,IS1,IS2,IS4,ND7,IPACK,IWORK,TK(1:ND5,K), 2 ND2X3,NWORDS,NPACK,NDATE,NTIMES,CORE,ND10, 3 NBLOCK,NFETCH,NSLAB,MISSP,MISSS,L3264B,1,IER1) IF(MISSP.NE.0)MISTOT=MISTOT+1 IF(IER1.EQ.0) THEN TAVAIL(K)=1 NLVLT=NLVLT+1 ENDIF IF(IS2(3).NE.NX.OR.IS2(4).NE.NY) THEN WRITE(KFILDO,125) 125 FORMAT(/,' ****GRID CHARACTERISTICS OF INPUT GRIDS ARE', 1 ' DIFFERENT IN LTGTHERMO.') IER=102 RETURN ENDIF ENDDO C C FETCH OR COMPUTE DEWPOINT AT EACH PRESSURE LEVEL C AND STORE IT IN TDK(:,K). ONLY CHECK LEVELS C THAT HAD TEMPERATURE TO SAVE TIME. C NLVLTD=0 DO K=1,MAXLEV IF(TAVAIL(K).EQ.0) CYCLE IF(K.EQ.1) THEN LD(1)=003101000+IDPARS(4) LD(2)=2 ELSE LD(1)=003100000+IDPARS(4) LD(2)=1000.-((K-2)*25.) ENDIF LD(3)=IDPARS(9)*1000000+IDPARS(12) LD(4)=0 CALL GFETCH(KFILDO,KFIL10,LD,7777,LSTORE,ND9,LITEMS, 1 IS0,IS1,IS2,IS4,ND7,IPACK,IWORK,TDK(1:ND5,K), 2 ND2X3,NWORDS,NPACK,NDATE,NTIMES,CORE,ND10, 3 NBLOCK,NFETCH,NSLAB,MISSP,MISSS,L3264B,1,IER1) IF(MISSP.NE.0)MISTOT=MISTOT+1 IF(IER1.EQ.0) THEN NLVLTD=NLVLTD+1 CYCLE ENDIF CALL PRSID1(KFILDO,LD,LDPARS) CALL DEWPT(KFILDO,KFIL10,LDPARS,LD,NDATE, 1 NGRIDC,ND11,NSLAB,IPACK,IWORK,TDK(1:ND5,K),ND5, 2 LSTORE,ND9,LITEMS,CORE,ND10,NBLOCK, 3 NFETCH,IS0,IS1,IS2,IS4,ND7, 4 FD1,FD2,FD3,FD4,ND2X3, 5 ISTAV1,L3264B,MISTOT,IER1) IF(IER1.EQ.0)NLVLTD=NLVLTD+1 IF(MISSP.NE.0)MISTOT=MISTOT+1 IF(IS2(3).NE.NX.OR.IS2(4).NE.NY) THEN WRITE(KFILDO,125) IER=102 RETURN ENDIF ENDDO C C CHECK THAT WE HAVE AT LEAST 5 LEVELS AVAILABLE C IF(NLVLT.LT.5.OR.NLVLTD.LT.5) THEN WRITE(KFILDO,150)(JD(J),J=1,4) 150 FORMAT(/' ****VARIABLE ',I9.9,2I10.9,I4.3, 1 ' NOT COMPUTED IN LTGTHERMO. INSUFFICIENT NUMBER', 2 ' OF PRESSURE LEVELS AVAILABLE FOR T AND TD.') IER=103 RETURN ENDIF C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C BEGIN MAIN LOOP TO COMPUTE REQUESTED PARAMETER CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C !$OMP PARALLEL DO DEFAULT(SHARED) !$OMP& PRIVATE(J,K,KMAX,N,P,T,D,NLVL,PP,TT,DD,TTC,DDC,IP,N500, !$OMP& PT,PO,THW,TO,DO,LCLP,TP,ELP,L,P1,Z,PPP,TTE,TTP, !$OMP& TP500,PTOP,PBOT,PB) C DO J=1,NX*NY C IF(PRESS(J,1).EQ.99999..OR. 1 TK(J,1).EQ.9999..OR.TDK(J,1).EQ.9999.) CYCLE C C WRITE(13,*) '' C WRITE(13,*) 'GRIDPOINT= ',J C DO K=MAXLEV,1,-1 C WRITE(13,'(3(f7.2,2x))') PRESS(J,K),TK(J,K), C 1 TDK(J,K) C ENDDO C C DETERMINE HIGHEST AVAILABLE PRESSURE LEVEL C DO K=1,MAXLEV IF(TK(J,K).NE.9999..AND.TDK(J,K).NE.9999.) KMAX=K ENDDO C C CONSTRUCT SOUNDING AT THIS GRID POINT FROM C AVAILABLE PRESSURE LEVELS C N=1 P(1)=PRESS(J,1) T(1)=TK(J,1) D(1)=TDK(J,1) DO K=2,KMAX IF(TK(J,K).NE.9999..AND.TDK(J,K).NE.9999..AND. 2 PRESS(J,K).LT.PRESS(J,1)) THEN N=N+1 P(N)=PRESS(J,K) T(N)=TK(J,K) D(N)=TDK(J,K) ENDIF ENDDO C C WRITE(14,*) '' C WRITE(14,*) 'GRIDPOINT= ',J C DO K=N,1,-1 C WRITE(14,'(3(f7.2,2x))') P(K),T(K),D(K) C ENDDO C C INTERPOLATE TO FILL IN MISSING PRESSURE LEVELS C EVERY 25 HPA UP TO HIGHEST AVAILABLE LEVEL. C NLVL=1 PP(1)=PRESS(J,1) TT(1)=TK(J,1) TTC(1)=TK(J,1)-273.15 DD(1)=TDK(J,1) DDC(1)=TDK(J,1)-273.15 C DO K=2,KMAX IP=1000.-((K-2)*25.) IF(IP.LT.PP(1)) THEN NLVL=NLVL+1 PP(NLVL)=IP IF(PP(NLVL).EQ.500.) N500=NLVL ! LEVEL THAT CORRESPONDS TO 500 HPA IF(TK(J,K).EQ.9999.) THEN TT(NLVL)=TRPT(P,T,N,IP) TTC(NLVL)=TT(NLVL)-273.15 ELSE TT(NLVL)=TK(J,K) TTC(NLVL)=TT(NLVL)-273.15 ENDIF IF(TDK(J,K).EQ.9999.) THEN DD(NLVL)=TRPT(P,D,N,IP) DDC(NLVL)=DD(NLVL)-273.15 ELSE DD(NLVL)=TDK(J,K) DDC(NLVL)=DD(NLVL)-273.15 ENDIF ENDIF ENDDO C C WRITE(15,*) '' C WRITE(15,*) 'GRIDPOINT= ',J C DO K=NLVL,1,-1 C WRITE(15,'(3(f7.2,2x))') PP(K),TTC(K),DDC(K) C ENDDO C C SET UPPER LIMIT FOR FINDING MOST UNSTABLE PARCEL C (ALSO USED AS UPPER LIMIT FOR COMPUTING CIN) C IF(IDPARS(7).EQ.0) THEN PT=PP(1)*0.7 ELSE PT=PP(1)*IDPARS(7)/100. IF(PT.LT.PP(NLVL)) PT=PP(NLVL) ENDIF C C CALL ROUTINE MUPARCEL TO FIND THE PRESSURE OF THE C MOST UNSTABLE PARCEL BETWEEN THE SFC AND PT. THIS IS C THE PARCEL WITH THE WARMEST WETBULB POTENTIAL C TEMPERATURE, THW. C CALL MUPARCEL(TTC,DDC,PP,PT,NLVL,PO,THW) C C FIND TEMP/DEWP (C) OF MOST UNSTABLE PARCEL BY C INTERPOLATING FROM SOUNDING AT PRESSURE PO C TO=TRPT(P,T,N,PO)-273.15 DO=TRPT(P,D,N,PO)-273.15 C C FIND LCL PRESSURE (MB) FOR MOST UNSTABLE PARCEL - C COMPUTED BY FUNCTION ALCL C LCLP=ALCL(TO,DO,PO) IF(LCLP.LT.PP(NLVL)) LCLP=PP(NLVL) C SELECT CASE(ICCCFFF) C CASE(002003) ! LCL TEMPERATURE C C FIND LCL TEMPERATURE (DEG C) BY INTERPOLATING C FROM SOUNDING AT PRESSURE LCLP C IF(LCLP.LE.PP(NLVL)) THEN DATA(J)=TTC(NLVL) ELSE DATA(J)=TRPT(P,T,N,LCLP)-273.15 ENDIF C CASE(002004) ! EQUIL LVL TEMPERATURE C C CALCULATE THE PARCEL TEMPERATURE TP() AT EACH C PRESSURE LEVEL ABOVE THE LCL. THE PARCEL IS C ASSUMED TO BE SATURATED SO IT IS LIFTED ALONG C THE SATURATED ADIABAT, THW. C DO K=1,NLVL IF(PP(K).LE.LCLP) THEN TP(K)=SATLFT(THW,PP(K)) ELSE TP(K)=TTC(K) ENDIF ENDDO C C START AT THE TOP PRESSURE LEVEL AND FIND C WHERE THE PARCEL FIRST BECOMES WARMER THAN C THE ENVIRONMENT - THIS IS THE EQUIL LEVEL. C THEN INTERPOLATE FROM THE SOUNDING TO FIND C THE TEMPERATURE AT THIS LEVEL. C IF(TP(NLVL).GT.TTC(NLVL)) THEN ELP=PP(NLVL) DATA(J)=TTC(NLVL) ! PARCEL WARMER THAN ENV AT TOP LEVEL ELSE ! SET EQUIL LEVEL TO THIS PRESSURE L=NLVL DO K=NLVL,1,-1 IF(TP(K).LE.TTC(K)) THEN L=K P1=PP(K) ELSE EXIT ENDIF ENDDO IF(L.EQ.1) THEN ! PARCEL COLDER THAN ENV ABOVE LCL ELP=LCLP ! SET EQUIL LEVEL TO LCL PRESSURE DATA(J)=TRPT(P,T,N,ELP)-273.15 ELSE DO Z=1,26 ! ITERATE TO FIND EQUIL LEVEL PPP=P1+Z-1 TTE=TRPT(PP,TTC,NLVL,PPP) TTP=TRPT(PP,TP,NLVL,PPP) C IF(TTP.GT.TTE) THEN IF(TTP.GE.TTE) THEN ELP=PPP-0.5 DATA(J)=TRPT(P,T,N,ELP)-273.15 EXIT ENDIF ENDDO ENDIF ENDIF C CASE(007021) ! BEST LIFTED INDEX C C FIND TEMPERATURE OF THE MOST UNSTABLE PARCEL C AT 500 MB - THIS IS COMPUTED BY FUNCTION SATLFT C TP500=SATLFT(THW,500.) C C COMPUTE LIFTED INDEX BY SUBTRACTING THE PARCEL C TEMPERATURE FROM THE ENV TEMPERATURE AT 500 MB C DATA(J)=TTC(N500)-TP500 C CASE(007104) ! LAYER MUCAPE C C FIND THE PRESSURE THAT CORRESPONDS TO THE C TEMPERATURE THRESHOLD GIVEN BY IDPARS(6) - C THIS WILL DEFINE THE TOP OF THE LAYER FOR C COMPUTING MUCAPE. C IF(IDPARS(6).EQ.0) THEN PTOP=PP(NLVL) ! DEFAULT TO HIGHEST LEVEL ELSE L=NLVL DO K=NLVL,1,-1 ! START AT THE TOP AND FIND LEVEL WHERE ENV IF(TT(K).LT.IDPARS(6)) THEN ! TEMP IS WARMER THAN THRESHHOLD L=K P1=PP(K) ELSE EXIT ENDIF ENDDO IF(L.EQ.1) THEN ! ENTIRE SOUNDING < T. SET PTOP TO SFC PRESSURE PTOP=PP(1) ELSE IF(L.EQ.NLVL) THEN ! ENTIRE SOUNDING > T. SET PTOP TO HIGHEST LVL PTOP=PP(NLVL) ELSE DO Z=1,26 ! ITERATE TO FIND P AT T THRESH PPP=P1+Z-1 TTE=TRPT(PP,TT,NLVL,PPP) C IF(TTE.GT.IDPARS(6)) THEN IF(TTE.GE.IDPARS(6)) THEN PTOP=PPP-0.5 EXIT ENDIF ENDDO ENDIF ENDIF C C FIND THE PRESSURE THAT CORRESPONDS TO 0 C. C THIS WILL DEFINE THE BOTTOM OF THE LAYER FOR C COMPUTING MUCAPE. C L=NLVL DO K=NLVL,1,-1 ! START AT THE TOP AND FIND LEVEL WHERE ENV IF(TT(K).LT.273.15) THEN ! TEMP IS WARMER THAN 0C L=K P1=PP(K) ELSE EXIT ENDIF ENDDO IF(L.EQ.1) THEN ! ENTIRE SOUNDING < 0C. SET PBOT TO SFC PRESSURE PBOT=PP(1) ELSE IF(L.EQ.NLVL) THEN ! ENTIRE SOUNDING > 0C. SET PBOT TO HIGHEST LVL PBOT=PP(NLVL) ELSE DO Z=1,26 ! ITERATE TO FIND P AT 0C PPP=P1+Z-1 TTE=TRPT(PP,TT,NLVL,PPP) C IF(TTE.GT.273.15) THEN IF(TTE.GE.273.15) THEN PBOT=PPP-0.5 EXIT ENDIF ENDDO ENDIF C C CALL ROUTINE POSAREA TO COMPUTE MUCAPE FOR C IN THE LAYER BOUNDED BY PRESSURE PBOT AT THE C BOTTOM AND PRESSURE PTOP AT THE TOP. C CALL POSAREA(TO,DO,PO,PBOT,PTOP,TTC,DDC,PP, 1 NLVL,DATA(J)) C CASE(007105) ! LAYER MUCAPE C C FIND THE PRESSURE THAT CORRESPONDS TO THE C TEMPERATURE THRESHOLD GIVEN BY IDPARS(6) - C THIS WILL DEFINE BOTTOM OF THE LAYER FOR C COMPUTING MUCAPE. C IF(IDPARS(6).EQ.0) THEN PB=PP(1) ELSE L=NLVL DO K=NLVL,1,-1 ! START AT THE TOP AND FIND LEVEL WHERE ENV IF(TT(K).LT.IDPARS(6)) THEN ! TEMP IS COLDER THAN THRESHHOLD L=K P1=PP(K) ELSE EXIT ENDIF ENDDO IF(L.EQ.1) THEN ! ENTIRE SOUNDING < T. SET PB TO SFC PRESSURE PB=PP(1) ELSE IF(L.EQ.NLVL) THEN ! ENTIRE SOUNDING > T. SET PB TO HIGHEST LVL PB=PP(NLVL) ELSE DO Z=1,26 ! ITERATE TO FIND P AT T THRESH PPP=P1+Z-1 TTE=TRPT(PP,TT,NLVL,PPP) C IF(TTE.GT.IDPARS(6)) THEN IF(TTE.GE.IDPARS(6)) THEN PB=PPP-0.5 EXIT ENDIF ENDDO ENDIF ENDIF C C CALL ROUTINE POSAREA TO COMPUTE MOST UNSTABLE C CAPE IN THE LAYER BOUNDED BY PRESSURE PB AT THE C BOTTOM AND PRESSURE PP(NLVL) AT THE TOP. C CALL POSAREA(TO,DO,PO,PB,PP(NLVL),TTC,DDC,PP, 1 NLVL,DATA(J)) C CASE(007121) ! LAYER CIN C C FIND TEMPERATURE AND DEWPOINT OF ORIGINATING C PARCEL IN CELSIUS C PO=PP(1)-IDPARS(6) ! PRESSURE OF ORIG PARCEL TO=TRPT(P,T,N,PO)-273.15 ! INTERP T FROM SOUNDING DO=TRPT(P,D,N,PO)-273.15 ! INTERP TD FROM SOUNDING C C CALL ROUTINE NEGAREA TO COMPUTE CIN FOR C PARCEL ORIGINATING AT PRESSURE PO IN THE C LAYER BOUNDED BY PRESSURE PT AT THE TOP. C IF(PT.GT.PO) THEN DATA(J)=0. ELSE CALL NEGAREA(TO,DO,PO,TTC,DDC,PP,PT,NLVL,DATA(J)) ENDIF C END SELECT C ENDDO C !$OMP END PARALLEL DO C C SET NSLAB=1 IN CASE IT GOT CHANGED EARLIER C NSLAB=1 C RETURN END