www.pudn.com > cape.rar > cape.f90
PROGRAM MAIN
! parameter (ix=41,iy=31,ik=7,lev=7)
integer iii,m,len_file,len_name,lenst
INTEGER stanum1,stanum,lev1(800),lev11(800),LEV
INTEGER year,month,date,time,sta(800),station(800),number
character*128 dir_in,dir_out(5),vary_ch(5),time_ch
character*128 ch_date,ch3_micaps,file_in,file_out
INTEGER*2 LEN
REAL P(50),h(50),T(50),TD(50),ff(50),dd(50),TW(50)
real p2(800,50),t2(800,50),td2(800,50)
real h2(800,50),ff2(800,50),dd2(800,50)
real h22(800,50),ff22(800,50),dd22(800,50)
real p22(800,50),t22(800,50),td22(800,50)
real CAPE,PLFC,PE,CIN,LI,PC,TC,BCAPE,BIC,DCAPE,TCON,CCL
REAL CAPE1(800),TC1(800),PC1(800),bcape1(800),ncape1(800)
REAL PLFC1(800),PE1(800),LI1(800),CIN1(800),bic1(800)
REAL tcon1(800),ccl1(800)
REAL jd(800),wd(800),gd(800)
REAL jdd(800),wdd(800),gdd(800)
character head*100
character*100 filnam(100)
INTEGER*2 FNUM
! 读入文件列表
open(1,file='d:\wj\cape\filelist.txt',status='old')
read(1,*) FNUM
write(*,*) 'FNUM=',FNUM
do k=1,FNUM
read(1,*)filnam(k)
! filnam(k)='d:\wj\cape\dat\'//filnam(k)
! write(*,*)filnam(k)
enddo
close(1)
! file_in='E:\cape\dat\05090320.57494.text'
! 打开tlogp文件
! open(1,file='E:\cape\dat\05090320.57494.text',status='old')
do iii=1,FNUM
! head=filnam(iii)
! year=head(1:2)
! month=head(3:4)
! date=head(5:6)
! time=head(7:8)
head='d:\wj\cape\dat\'//filnam(iii)
write(*,*)head
open(1,file=head,status='old')
! read(1,*)head
! read(1,*)year,month,date,time,stanum1
stanum=1
! stanum=stanum1-2
! write(*,*)'stanum=',stanum
i=1
do 100 k=1,1
number=0
read(1,*)sta(k),jdd(k),wdd(k),gdd(k),number
write(*,*)sta(k),jdd(k),wdd(k),gdd(k),number
lev11(k)=number/6
do j=1,lev11(k)
read(1,*)p22(K,J),h22(k,J),t22(K,J),td22(K,J),ff22(k,J),dd22(k,J)
enddo
L=0
IF((FF22(K,1).LT.9990).AND.(DD22(K,1).LT.9990).and.(td22(k,1).lt.9990).and.(t22(k,1).lt.9990)) THEN
L=L+1
P2(I,L)=P22(K,1)
T2(I,L)=T22(K,1)
TD2(I,L)=TD22(K,1)
h2(i,L)=0.0
ff2(i,L)=ff22(k,1)
dd2(i,L)=dd22(k,1)
ENDIF
do j=2,lev11(k)
IF((H22(K,J).LT.9990).AND.(FF22(K,J).LT.9990).AND.(DD22(K,J).LT.9990).and.(td22(k,j).lt.9990).and.(t22(k,j).lt.9990)) THEN
L=L+1
P2(I,L)=P22(K,J)
T2(I,L)=T22(K,J)
TD2(I,L)=TD22(K,J)
h2(i,L)=h22(k,j)*10.0
ff2(i,L)=ff22(k,j)
dd2(i,L)=dd22(k,j)
ENDIF
enddo
LEV1(I)=L
if(l.gt.6)then
STATION(I)=STA(K)
JD(I)=JDd(K)
WD(I)=WDd(K)
GD(I)=GDd(K)
I=I+1
endif
GOTO 100
100 continue
!STANUM=I-2
CLOSE(1)
do 150 i=1,stanum
lev=lev1(i)
do j=1,lev
p(j)=p2(i,j)
t(j)=t2(i,j)
td(j)=td2(i,j)
h(j)=h2(i,j)
! u(j)=dd2(i,j)*sin(ff2(i,j)*3.1415926/180.)
! v(j)=dd2(i,j)*cos(ff2(i,j)*3.1415926/180.)
enddo
CALL CAL_CAPE(P,T,TD,lev,CAPE,PLFC,PE,CIN,LI,PC,TC)
cape1(i)=cape
cin1(i)=cin
li1(i)=li
write(*,*)'cape=',CAPE1(i),station(i),pc
if((plfc.lt.90000).and.(pe.lt.90000))then
ncape1(i)=cape/(plfc-pe)
else if(plfc.gt.90000) then
ncape1(i)=0.0
else if(pe.gt.90000) then
ncape1(i)=cape/(plfc-p(lev))
endif
!call CAL_BCAPE(P,T,TD,LEV,BCAPE)
!bcape1(i)=bcape
150 continue
!c 写入抬升指数
! open(2,file='d:\12\cape\抬升指数.txt')
! write(2,*)'diamond 3 ',ch3_micaps
! write(2,'(4i5,a36,i5)')year,month,date,time,' 1000 1 2000 1 2000 1 1.0 2.0 1 ',stanum
! do i=1,stanum
! write(2,'(i10,4f10.1)') station(i),jd(i),wd(i),gd(i),li1(i)
! enddo
! close(2)
!c 写入对流有效位能
! open(3,file='E:\cape\cape.txt')
! open(3,file='d:\wj\cape\cape.txt')
head='d:\wj\cape\result\'//filnam(iii)
write(*,*) head
open(3,file=head)
write(3,'(4i5,a36,i5)')year,month,date,time,' 1000 1 2000 1 2000 1 1.0 2.0 1 ',stanum
!200 format'(4i5,a36,i5)'
do i=1,stanum
write(3,'(i10,4f10.1)') station(i),jd(i),wd(i),gd(i),cape1(i)
enddo
close(3)
!c 写入最佳对流有效位能
! open(2,file='d:\12\cape\最佳对流有效位能.txt')
! write(2,*)'diamond 3 ',ch3_micaps
! write(2,'(4i5,a36,i5)')year,month,date,time,' 1000 1 2000 1 2000 1 1.0 2.0 1 ',stanum
! do i=1,stanum
! write(2,'(i10,4f10.1)') station(i),jd(i),wd(i),gd(i),bcape1(i)
! enddo
! close(2)
!c 写入归一化对流有效位能
! LEN=len_trim(DIR_OUT(4))
! file_out=dir_out(4)(1:LEN)//'\'//ch_date(1:len_name)
! ch3_micaps=ch_date(1:2)//'年'//ch_date(3:4)//'月'//ch_date(5:6)
! &//'日'//ch_date(7:8)//'时'//vary_ch(4)
! open(3,file=file_out)
! write(3,*)'diamond 3 ',ch3_micaps
!! write(3,200)year,month,date,time,' 1000 1 2000 1 2000 1
! &1.0 2.0 1 ',stanum
!200 format(4i5,a36,i5)
! do i=1,stanum
! write(3,300) station(i),jd(i),wd(i),gd(i),ncape1(i)
! write(3,300) ((station(i),jd(i),wd(i),gd(i),ncape1(i)),i=1,stanum)
! enddo
! 300 format(i10,4f10.1)
! close(3)
! 写入对流抑制能量
! LEN=len_trim(DIR_OUT(5))
! file_out=dir_out(5)(1:LEN)//'\'//ch_date(1:len_name)
! ch3_micaps=ch_date(1:2)//'年'//ch_date(3:4)//'月'//ch_date(5:6)
! &//'日'//ch_date(7:8)//'时'//vary_ch(5)
! open(4,file=file_out)
! write(4,*)'diamond 3 ',ch3_micaps
! write(4,200)year,month,date,time,' 1000 1 2000 1 2000 1
! &1.0 2.0 1 ',stanum
!200 format(4i5,a36,i5)
! do i=1,stanum
! write(4,300) station(i),jd(i),wd(i),gd(i),cin1(i)
! write(4,300) ((station(i),jd(i),wd(i),gd(i),cin1(i)),i=1,stanum)
! enddo
! 300 format(i10,4f10.1)
! close(4)
!110 continue
enddo
! close(998)
END
SUBROUTINE CAL_CAPE(P,T,TD,LEV,CAPE,PLFC,PE,CIN,LI,PC,TC)
! THIS SUBROUTINE CALCULATE CONVECTIVE AVAILABLE POTENTIAL ENERGY
! AND IT IS USED WITH CAL_TC_PC,CAL_TA,CAL_TE,CAL_ENGY,
! IN WHICH SUBROUTINE CAL_TA AND CAL_TC_PC ARE USED WITH CAL_THSE
! INPUT T ======> TEMPERATURE (CELSIUS DEGREE)
! TD =====> DEW POINT (CELSIUS DEGREE)
! P ======> PRESSURE (HPA)
! LEV ====> LEVEL
! OUTPUT CAPE ===> EQUIVALENT POTENTIAL TEMPERATURE (J/KG)
! PLFC ===> FREE CONVECTION LEVEL
! PE =====> EMBALANCE LEVEL
! CIN ====> CONVECTIVE INHIBITION
! LI =====> LIFTING INDEX
! TEMP ARRAY
! TE =====> ENVIRONMENT TEMPERATURE (KELVIN)
! TA =====> PARCEL TEMPERATURE (KELVIN)
! TC
DIMENSION P(LEV),T(LEV),TD(LEV)
DIMENSION TE(120),TA(120)
REAL CAPE,TC,PC,THSE,PC0,TC0,TD0,THSE0
REAL PLFC,PE,LI,CIN
INTEGER LEV
! ASSUMING THE BOTTOM POINT AS THE LIFTING LAYER
THSE=220.
PC=P(1)
TC=T(1)
P0=P(1)
T0=T(1)
TD0=TD(1)
CALL CAL_TC_PC(P0,T0,TD0,PC0,TC0,THSE0)
PC=PC0
TC=TC0
CALL CAL_TE(P,T,TE,LEV)
CALL CAL_TA(P0,T0,PC,TC,THSE0,TA)
CALL CAL_PLFC_AND_PE(P,TE,TA,LEV,PLFC,PE)
open(1,file='pe_ta_te')
do k=1,90
ppp=int(p(1)/10.)*10-(k-1)*10.
write(1,'(3f10.2)')ppp,ta(k),te(k)
enddo
close(1)
CALL CAL_VIR_ENGY(P,T,TD,LEV,TE,TA,CAPE)
! print*,ta
! stop
CALL CAL_CIN(P0,TE,TA,CIN)
CALL CAL_LI(P0,TE,TA,LI)
! RETURN
END
SUBROUTINE CAL_TC_PC(P,T,TD,PC,TC,THSE)
! CALCULATE LIFTING CONDENSATION LAYER AND LIFTING CONDENSATION TEMPERATURE
! AND ALSO PSEUDO-POTENTIAL TEMPERATURE AT CONDESAATING POINT
! INPUT P ========> LIFTING PRESSURE (HPA)
! T ========> LIFTING TEMPERATURE (CELSIUS DEGREE)
! TD =======> DEW POINT (CELSIUS DEGREE)
! OUTPUT
! PC =======> CONDESATION PRESSURE
! TC =======> CONDENSATION TEMPERATURE
! THSE =====> PSEUSO EQUIVALENT POTENTION TEMPERATURE (KELVIN)
REAL P,T,TD,PC,TC,THSE
TC=T-(T-TD)*0.976/(0.976-0.000833*(237.3+TD)**2/(273.15+TD))
PC=P*((273.15+TC)/(273.15+T))**3.5
CALL CAL_THSE(PC,TC,THSE)
RETURN
END
SUBROUTINE CAL_THSE(P,T,THSE)
! 计算假相当位温,不考虑 0 度以下假相当位温计算公式的差别
REAL E,A,B,P,T,THSE
A=7.5*T/(237.3+T)
E=6.11*10.**A
B=1000.0/(P-E)
THSE=(273.16+T)*B**0.286*EXP((2.5*10.**6-2368.*T)*0.622*E/(1004.*(273.16+T)*(P-E)))
RETURN
END
SUBROUTINE CAL_THSE1(P,T,THSE)
! 本子程序考虑 0 度以下,假相当位温计算公式不同
REAL E,A,B,P,T,THSE
IF(T.GE.0)A=7.5*T/(237.3+T)
IF(T.LT.0)A=9.5*T/(265.5+T)
E=6.11*10.**A
B=1000.0/(P-E)
IF(T.GE.0) THSE=(273.16+T)*B**0.286*EXP((597.3+0.5*T)*0.622*E/(0.24*(273.16+T)*(P-E)))
IF(T.LT.0) THSE=(273.16+T)*B**0.286*EXP((667.0+0.5*T)*0.622*E/(0.24*(273.16+T)*(P-E)))
RETURN
END
SUBROUTINE CAL_TE(PP,TP,TE,KMAX)
! p ,T ,TE,LEV
! ********** CALCULATE TEMPERTURE AT EACH LEVEL *********
! 计算层结每隔 10HPA 的温度(对数气压线性内插)
! PARAMETER (KMAX=30)
DIMENSION PP(KMAX),TP(KMAX),TE(110)
REAL P_L
INTEGER I_NL,IN
DO K=1,110
TE(K)=-60.
ENDDO
! WRITE(*,*)(PP(K),K=1,KMAX)
! WRITE(*,*)(TP(K),K=1,KMAX)
! PAUSE 31
I_NL=KMAX
I=1
IN=1
101 P_L=INT(PP(I)/10.)*10.0
P_T=INT(PP(I+1)/10.)*10.+10.
10 TE(IN)=TP(I)+(TP(I)-TP(I+1))/ALOG(PP(I)/PP(I+1))*ALOG(P_L/PP(I))
IN=IN+1
P_L=P_L-10.
IF(P_T.GT.PP(I))IN=IN-1
IF(P_L.GE.P_T)GOTO 10
I=I+1
! IF(PP(I+1).GT.50.OR.(I+1).LT.(I_NL))THEN
IF((I+1).LE.(I_NL))THEN
GOTO 101
ELSE
GOTO 20
ENDIF
20 CONTINUE
IF((PP(I_NL).GE.100.).AND.(INT(PP(I_NL)/10.)*10.).EQ.(PP(I_NL))) TE(IN)=TP(I_NL)
RETURN
END
SUBROUTINE CAL_TA(PP0,TP0,PC,TC,THSE,TA)
! 计算状态曲线各整层高度(间隔 10HPA)上的温度
! INPUT PP0 ======> PRESSURE AT THE LIFTING LEVEL (HPA)
! TP0 ======> TEMPERATURE AT THE LIFTING LEVEL (CELSIUS DEGREE)
! PC =======> LIFTING CONDENSATION LEVEL (HPA)
! TC =======> LIFTING CONDESATION TEMPERATURE (CELSIUS DEGREE)
! THESE ====> PSEUDO EQUIVALENT POTENTIAL TEMPERATURE (KELVIN)
! OUTPUT ARRAY
! TA =======> PARCEL TEMPERATURE AT EACH LEVEL (CELSIUS DEGREE)
REAL PP0,TP0,PC,TC,THSE,THSE1,THSE2,P_L,T1,T2,RD,CPD
INTEGER KPC
DIMENSION TA(110)
RD=287.04
CPD=1005.
DO K=1,110
TA(K)=-130.
ENDDO
!C ************** DRY ADIABATIC PROCESS BEGIN
KPC=INT(PP0/10)-INT(PC/10)
P_L=INT(PP0/10.)*10.
THD=(TP0+273.15)*(1000./PP0)**(RD/CPD)
DO I=1,KPC
TA(I)=THD*(P_L/1000.)**(RD/CPD)-273.15
P_L=P_L-10.
ENDDO
! DO I=1,KPC
! TA(I)=TP0+(TC-TP0)/ALOG(PC/PP0)*ALOG(P_L/PP0)
! P_L=P_L-10.
! ENDDO
! ************** DRY ADIABATIC PROCESS END
IN=KPC
T1=TC
P1=PC
! WRITE(*,*)' IN = ',IN,' TC = ',TC,' PC = ',PC
KZERO=1
! KZERO IS A JUDGEMENT FOR TEMPERATURE
!*************** MOIST ADIABATIC PROCESS BEGIN
10 CALL CAL_THSE(P_L,T1,THSE1)
CALL CAL_THSE(P_L,T1-0.1,THSE2)
T2=T1-(THSE1-THSE)/(THSE1-THSE2)*0.1
! NOTICE DIFFERENCE OF THSE WHEN TEMPERERTURE OBOVE OR BELEOW ZERO
IF(T2.LT.0.AND.KZERO.EQ.1)THEN
CALL CAL_THSE(P_L,T2,THSE)
KZERO=0
ENDIF
IN=IN+1
TA(IN)=T2
T1=T2
P_L=P_L-10.
! WRITE(*,*)' T1 = ',T1
! PAUSE
IF(P_L.GE.90.)GOTO 10
! *************** MOIST ADIABATIC PROCESS END
RETURN
END
SUBROUTINE CAL_PLFC_AND_PE(P,TE,TA,LEV,PLFC,PE)
! THIS SUBROUTINE CALCULATE LAYER OF FREE CONVECTION AND EMBALANCE LAYER
! NOTICE THIS SUBROUTINE IS NOT INDEPENDENT!!!
! INPUT TE =====> ENVIRONMENT TEMPERATURE (KELVIN)
! TA =====> PARCEL TEMPERATURE (KELVIN)
! P =====> PRESSURE (HPA)
! LEV ====> NUMBER OF LAYER
! OUTPUT PLFC ===> FREE CONVECTION LAYER (HPA)
! PE =====> EMBALANCE PRESSURE (HPA)
REAL PLFC,PE
DIMENSION TE(110),TA(110),P(LEV)
INTEGER LEV,KLFC
REAL DELT1,DELT2
! WRITE(*,'(10F8.2)')(TA(K),K=1,10),(TE(K),K=1,10)
KLFC=0
! IF(TA(1).GE.TE(1).AND.TA(2).GT.TE(2))THEN
IF(TA(1).GT.TE(1).OR.(TA(1).EQ.TE(1).AND.TA(2).GT.TE(2)))THEN
PLFC=P(1)
ELSEIF((TA(1).EQ.TE(1).AND.TA(2).LE.TE(2)).OR.TA(2).LE.TE(2))THEN
P_L=INT(P(1)/10.)*10
P_T=P_L-10
DO K=2,90
IF(TA(K).GT.TE(K))THEN
KLFC=K
P_B=P_T+10
DELT1=TE(K-1)-TA(K-1)
DELT2=TA(K)-TE(K)
PLFC=(P_B*DELT2+P_T*DELT1)/(DELT1+DELT2)
GOTO 290
ENDIF
P_T=P_T-10
ENDDO
IF(KLFC.EQ.0)PLFC=99999.9
ENDIF
290 CONTINUE
NB=INT(P(1)/10.)
NT=INT((P(LEV)-0.001)/10.)+1
NE=NB-NT+1
KPE=NE
IF(INT(P(LEV))/10..EQ.P(LEV)/10.)THEN
P_T=P(LEV)
ELSE
P_T=INT(P(LEV)/10.)*10+10.
ENDIF
IF(TE(NE).LT.TA(NE))THEN
PE=99999.9
ELSE
DO K=NE-1,1,-1
IF(TE(K).LT.TA(K))THEN
KPE=K
P_B=P_T+10
DELT1=TE(K+1)-TA(K+1)
DELT2=TA(K)-TE(K)
PE=(P_B*DELT2+P_T*DELT1)/(DELT1+DELT2)
GOTO 390
ENDIF
P_T=P_T+10
ENDDO
IF(KPE.EQ.NE)PE=99999.9
ENDIF
390 CONTINUE
RETURN
END
SUBROUTINE CAL_VIR_ENGY(P,T,TD,LEV,TE,TA,CAPEV)
!
! NOTICE IT IS SUPPORTED BY CAL_TDE,CAL_Q AND CAL_QS
! INPUT T ======> TEMPERATURE (CELSIUS DEGREE)
! TD =====> DEW POINT (CELSIUS DEGREE)
! P ======> PRESSURE (HPA)
! LEV ====> LEVEL
! TE =====> ENVIRONMENT TEMPERATURE (CELSIUS DEGREE)
! TA =====> PARCEL TEMPERATURE (CELSIUS DEGREE)
! OUTPUT
! CAPEV ==> CONVECTIVE AVAILABLE POTENTIAL ENERGY (J/KG)
! TEMP ARRAY
! PDS ====> PRESSURE (HPA)
! QE =====> SPECIFIC HUMICITY
! QSE ====> SATURATE SPECIFIC HUMIDITY
! TDE ====> DEW POINT (CELSIUS DEGREE)
REAL CAPEV,R,P_L
DIMENSION TE(110),TA(110),TDE(110),P(LEV),T(LEV),TD(LEV)
DIMENSION PDS(110),QE(110),QSE(110)
DO K=1,LEV
IF(TD(K).GT.90)TD(K)=T(K)-30.
ENDDO
CALL CAL_TDE(P,TD,TDE,LEV)
! WRITE(*,'(10F8.2)')(TDE(K),K=1,90)
NP=1
P_L=INT(P(1)/10.)*10.
1 CONTINUE
IF(P_L.GT.100.)THEN
PDS(NP)=P_L
P_L=P_L-10.
NP=NP+1
GOTO 1
ENDIF
NP=NP-1
CALL CAL_Q(TDE,PDS,NP,QE)
CALL CAL_QS(TA,PDS,NP,QSE)
! WRITE(*,*)' NP = ',NP
! WRITE(*,'(10F8.4)')(QE(I),I=80,110)
! WRITE(*,'(10F8.4)')(QSE(I),I=80,110)
! PAUSE 110
CAPEV=0.
R=287.04
P_L=INT(P(1)/10.)*10
P_T=P_L-10.
DO K=1,NP
IF(TA(K).GT.TE(K).AND.TA(K+1).GT.TE(K+1)) then
CAPEV=CAPEV+R*((1+0.61*QSE(K))*(TA(K)+273.15)+(1+0.61*QSE(K+1))*(TA(K+1)+273.15)-(1+0.61*QE(K))*(TE(K)+273.15)-(1+0.61*QE(K+1))*(TE(K+1)+273.15))/2.*ALOG(P_L/P_T)
endif
! 1 CAPEV=CAPEV+R*(TA(K)+TA(K+1)-TE(K)-TE(K+1))/2.*ALOG(P_L/P_T)
P_L=P_T
P_T=P_T-10.
IF(P_T.LT.P(LEV))GOTO 10
ENDDO
10 CONTINUE
!print*,'pro capev',capev
! RETURN
END
SUBROUTINE CAL_CIN(PP0,TE,TA,CIN)
! CALCULATE CONVECTIVE INHIBITION
! INPUT PP0 ======> BOTTOM PRESSURE
! TE =======> ENVIRONMENTAL TEMPERATURE
! TA =======> PARCEL TEMPERATURE
! OUTPUT
! CIN ======> CONVECTIVE INHIBITION (J/KG)
REAL PP0,R,P_L,CIN
DIMENSION TE(110),TA(110)
CIN=0.
R=287.04
P_L=INT(PP0/10.)*10
P_T=P_L-10.
IF(TA(1).GT.TE(1).OR.TA(2).GT.TE(2))THEN
CIN=0.0
RETURN
ELSE
DO K=1,90
IF(TA(K).LE.TE(K).AND.TA(K+1).LT.TE(K+1).AND.P_L.GE.300) THEN
CIN=CIN-R*(TA(K)+TA(K+1)-TE(K)-TE(K+1))/2.*ALOG(P_L/P_T)
ELSEIF(TA(K+2).GT.TE(K+2))THEN
RETURN
ELSEIF(P_L.LT.300.)THEN
CIN=99999.9
RETURN
ENDIF
P_L=P_T
P_T=P_T-10.
ENDDO
ENDIF
RETURN
END
SUBROUTINE CAL_LI(PP0,TE,TA,LI)
! CALCULATE LIFTING INDEX
! INPUT PP0 ========> BOTTON PRESSURE
! TE =========> ENVIRONMENTAL TEMPERATURE
! TA =========> PARCEL TEMPERATURE
! OUTPUT
! LI =========> LIFTING INDEX
REAL PP0,LI,P_L
DIMENSION TE(110),TA(110)
NP=1
P_L=INT(PP0/10.)*10.
1 CONTINUE
IF(P_L.GT.500.)THEN
P_L=P_L-10.
NP=NP+1
GOTO 1
ENDIF
LI=TE(NP)-TA(NP)
! WRITE(*,*)' NP === ',NP
! WRITE(*,*)' LI === ',LI
RETURN
END
SUBROUTINE CAL_Q(TD,P,LEV,Q)
! THIS SUBROUTINE CALCULATE SPECIFIC HUMIDITY AND SATURATE SPECFIC HUMIDITY
! NOTICE THIS SUBROUTINE IS SUPPORTED BY SUBROUTINE CAL_E
! INPUT TD ======> DEW POINT TEMPERATURE (CELSIUS DEGREE)
! P =====> PRESSURE (HPA)
! LEV ====> LEVEL
! OUTPUT Q ====> SPECIFIC HUMIDITY
! TEMP ARRAY
! E =====> VAPOR PRESSURE (HPA)
INTEGER LEV
DIMENSION TD(LEV),P(LEV),Q(LEV)
DIMENSION E(LEV)
CALL CAL_E(TD,LEV,E)
DO K=1,LEV
IF(E(K).LT.100.)THEN
Q(K)=0.622*E(K)/(P(K)-0.378*E(K))
ELSE
Q(K)=99999.9
ENDIF
ENDDO
RETURN
END
SUBROUTINE CAL_QS(T,P,LEV,QS)
! THIS SUBROUTINE CALCULATE SPECIFIC HUMIDITY AND SATURATE SPECFIC HUMIDITY
! NOTICE THIS SUBROUTINE IS SUPPORTED BY SUBROUTINE CAL_ES
! INPUT TD =====> DEW POINT (CELSIUS DEGREE)
! P =====> PRESSURE (HPA)
! LEV ====> LEVEL
! QS ====> SATURATE SPECIFIC HUMIDITY
! TEMP ARRAY
! ES =====> SATURATED VAPOR PRESSURE (HPA)
INTEGER LEV
DIMENSION T(LEV),P(LEV),QS(LEV)
DIMENSION ES(LEV)
CALL CAL_ES(T,LEV,ES)
DO K=1,LEV
IF(ES(K).LT.100.)THEN
QS(K)=0.622*ES(K)/(P(K)-0.378*ES(K))
ELSE
QS(K)=99999.9
ENDIF
ENDDO
RETURN
END
SUBROUTINE CAL_ES(T,LEV,ES)
! THIS SUBROUTINE CALCULATE SATURATE VAPOR PRESSURE
! NOTICE THE FORMULA ARE DIFFERENT WHEN TEMPERATURE
! IS ABOVE OR BELOW ZERO DEGREE
! INPUT T ======> TEMPERATURE (CELSIUS DEGREE)
! LEV ====> LEVEL
! OUTPUT ES ====> SATURATE VAPOR PRESSURE (HPA)
INTEGER LEV
DIMENSION T(LEV),ES(LEV)
DO K=1,LEV
IF(T(K).GT.-150.AND.T(K).LT.60.)THEN
IF(T(K).GE.0)ES(K)=6.112*10**(7.5*T(K)/(237.3+T(K)))
IF(T(K).LT.0)ES(K)=6.112*10**(9.5*T(K)/(265.5+T(K)))
ELSE
ES(K)=99999.9
ENDIF
ENDDO
RETURN
END
SUBROUTINE CAL_E(TD,LEV,E)
! THIS SUBROUTINE CALCULATE VAPOR PRESURE
! NOTICE THE FORMULA ARE DIFFERENT WHEN DEW POINT TEMPERATURE
! IS ABOVE OR BELOW ZERO DEGREE
! INPUT TD =====> DEW POINT (CELSIUS DEGREE)
! LEV ====> LEVEL
! OUTPUT E ====> VAPOR PRESSURE (HPA)
INTEGER LEV
DIMENSION TD(LEV),E(LEV)
DO K=1,LEV
IF(TD(K).GT.-150.AND.TD(K).LT.60.)THEN
IF(TD(K).GE.0)E(K)=6.112*10**(7.5*TD(K)/(237.3+TD(K)))
IF(TD(K).LT.0)E(K)=6.112*10**(9.5*TD(K)/(265.5+TD(K)))
ELSE
E(K)=99999.9
ENDIF
ENDDO
RETURN
END
SUBROUTINE CAL_TDE(PP,TP,TE,KMAX)
! ********** CALCULATE TEMPERTURE AT EACH LEVEL *********
! PARAMETER (KMAX=30)
DIMENSION PP(KMAX),TP(KMAX),TE(110)
REAL P_L
INTEGER I_NL,IN
DO K=1,110
TE(K)=-120.
ENDDO
I_NL=KMAX
I=1
IN=1
101 P_L=INT(PP(I)/10.)*10.0
P_T=INT(PP(I+1)/10.)*10.+10.
10 TE(IN)=TP(I)+(TP(I)-TP(I+1))/ALOG(PP(I)/PP(I+1))*ALOG(P_L/PP(I))
IN=IN+1
P_L=P_L-10.
IF(P_T.GT.PP(I))IN=IN-1
IF(P_L.GE.P_T)GOTO 10
I=I+1
! IF(PP(I+1).GT.50.OR.(I+1).LT.(I_NL))THEN
IF((I+1).LE.(I_NL))THEN
GOTO 101
ELSE
GOTO 20
ENDIF
20 CONTINUE
IF((PP(I_NL).GE.100.).AND.(INT(PP(I_NL)/10.)*10.).EQ.(PP(I_NL))) TE(IN)=TP(I_NL)
RETURN
END
SUBROUTINE CAL_BCAPE(P,T,TD,LEV,BCAPE)
! THIS SUBROUTINE CALCULATE THE BEST COVECTIVE AVAILABLE POTENTIAL ENERGY
! THIS PROGRAM IS USED WITH SUB(CAL_TC_PC,CAL_TA,CAL_TE,CAL_ENGY,
! IN WHICH SUBROUTINE CAL_TA AND CAL_TC_PC ARE USED WITH CAL_THSE
! INPUT T ======> TEMPERATURE (CELSIUS DEGREE)
! TD =====> DEW POINT (CELSIUS DEGREE)
! P ======> PRESSURE (HPA)
! LEV ====> LEVEL
! OUTPUT
! BCAPE ==> BEST CONVECTIVE AVAILABLE POTENTIAL ENERGY (J/KG)
! TEMP ARRAY
! INPUT TP =====> TEMPERATURE FROM ABOVE MOIST UNSTABLE LAYER
! (CELSIUS DEGREE)
! TDP ====> DEW POINT FROM ABOVE MOIST UNSTABLE LAYER
! (CELSIUS DEGREE)
! PP =====> PRESSURE FROM ABOVE MOIST UNSTABLE LAYER (HPA)
DIMENSION P(LEV),T(LEV),TD(LEV),PP(LEV),TP(LEV),TDP(LEV)
DIMENSION TE(120),TA(120)
REAL BCAPE,TC,PC,THSE,PC0,TC0,TD0,THSE0
INTEGER KP
KP=0
THSE=220.
DO K=1,LEV
P0=P(K)
T0=T(K)
TD0=TD(K)
CALL CAL_TC_PC(P0,T0,TD0,PC0,TC0,THSE0)
IF(P(1)-P0.LT.300.AND.THSE0.GT.THSE)THEN
THSE=THSE0
PC=PC0
TC=TC0
KC=K
ENDIF
ENDDO
KL=LEV-KC+1
DO K=1,KL
PP(K)=P(K+KC-1)
TP(K)=T(K+KC-1)
TDP(K)=TD(K+KC-1)
ENDDO
P0=PP(1)
T0=TP(1)
CALL CAL_TE(PP,TP,TE,KL)
CALL CAL_TA(P0,T0,PC,TC,THSE,TA)
CALL CAL_VIR_ENGY(PP,TP,TDP,KL,TE,TA,BCAPE)
! CALL CAL_ENGY(P0,TE,TA,BCAPE)
RETURN
END
SUBROUTINE CAL_BIC(P,T,TD,LEV,BIC)
! THIS SUBROUTINE CALCULATE BEST STABILITY INDEX OF CONVECTION
! NOTICE THIS PROGRAM IS USED WITH CAL_TE AND CAL_TDE
! INPUT T ======> TEMPERATURE (CELSIUS DEGREE)
! TD =====> DEW POINT (CELSIUS DEGREE)
! P ======> PRESSURE (HPA)
! LEV ====> LEVEL
! OUTPUT
! BIC ====> BEST INDEX OF CONVECTIVE INDEX (KELVIN)
! TEMP ARRAY
! THE =====> EQUIVLENT POTENTIAL TEMPERATURE (KELVIN)
DIMENSION P(LEV),T(LEV),TD(LEV)
DIMENSION THE(LEV)
REAL BIC,THMAX,THMIN
THMAX=220
THMIN=500
IF(P(1).LT.850.)THEN
BIC=99999.9
RETURN
ELSE
CALL CAL_THE(T,TD,P,LEV,THE)
DO K=1,LEV
IF(P(1)-P(K).LT.150.AND.THE(K).GT.THMAX)THEN
THMAX=THE(K)
ENDIF
IF(P(K).GE.500.AND.P(K).LE.650.AND.THE(K).LT.THMIN)THEN
THMIN=THE(K)
ENDIF
IF(P(K).LE.500)THEN
BIC=THMIN-THMAX
RETURN
ENDIF
ENDDO
ENDIF
RETURN
END
SUBROUTINE CAL_THE(T,TD,P,LEV,THE)
! THIS SUBROUTINE CALCULATE EQUIVALENT POTENTIAL TEMPERATURE
! NOTICE THIS SUBROUTINE IS SUPPORTED BY SUBROUTINE CAL_E, CAL_R AND CAL_RH
! INPUT T ======> TEMPERATURE (CELSIUS DEGREE)
! TD =====> DEW POINT (CELSIUS DEGREE)
! P ======> PRESSURE (HPA)
! LEV ====> LEVEL
! OUTPUT THE ====> EQUIVALENT POTENTIAL TEMPERATURE (KELVIN)
! TEMP ARRAY
! R ======> MIXING RATIO
! RH =====> RELATIVE HUMIDITY
! E ======> VAPOR PRESSURE
INTEGER LEV
DIMENSION T(LEV),TD(LEV),P(LEV),THE(LEV)
DIMENSION R(LEV),E(LEV),RH(LEV)
REAL RD,RV,CPD
RD=287.04
RV=461.50
CPD=1005.
CALL CAL_E(TD,LEV,E)
CALL CAL_R(TD,P,LEV,R)
CALL CAL_RH(T,TD,LEV,RH)
DO K=1,LEV
! P0=P(K)
! T0=T(K)
! TD0=TD(K)
! CALL CAL_TC_PC(P0,T0,TD0,PC0,TC0,THSE0)
! THE(K)=THSE0
IF(T(K).LT.70.AND.R(K).LT.1)THEN
THE(K)=(T(K)+273.15)*(1000./(P(K)-E(K)))**(RD/CPD)*RH(K)**(R(K)*RV/CPD)*EXP((2500000.-2368*T(K))*R(K)/(CPD*(T(K)+273.15)))
ELSE
THE(K)=99999.9
ENDIF
ENDDO
RETURN
END
SUBROUTINE CAL_R(TD,P,LEV,R)
! THIS SUBROUTINE CALCULATE MIXING RATION
! NOTICE THIS SUBROUTINE IS SUPPORTED BY SUBROUTINE CAL_E
! INPUT TD =====> DEW POINT (CELSIUS DEGREE)
! P =====> PRESSURE (HPA)
! LEV ====> LEVEL
! OUTPUT R ====> MIXING RATION
! TEMP ARRAY
! E =====> VAPOR PRESSURE (HPA)
INTEGER LEV
DIMENSION TD(LEV),P(LEV),R(LEV)
DIMENSION E(LEV)
CALL CAL_E(TD,LEV,E)
DO K=1,LEV
IF(E(K).LT.100.)THEN
R(K)=0.622*E(K)/(P(K)-E(K))
ELSE
R(K)=99999.9
ENDIF
ENDDO
RETURN
END
SUBROUTINE CAL_RH(T,TD,LEV,RH)
! THIS SUBROUTINE CALCULATE RELATIVE HUMIDITY
! NOTICE THIS SUBROUTINE IS SUPPORTED BY SUBROUTINE CAL_E AND CAL_ES
! INPUT T ======> TEMPERATURE (CELSIUS DEGREE)
! TD =====> DEW POINT (CELSIUS DEGREE)
! LEV ====> LEVEL
! OUTPUT RH ====> RELATIVE HUMIDITY
! TEMP ARRAY
! E =====> VAPOR PRESSURE (HPA)
! ES =====> SATURATED VAPOR PRESSURE (HPA)
INTEGER LEV
DIMENSION T(LEV),TD(LEV),RH(LEV)
DIMENSION E(LEV),ES(LEV)
CALL CAL_E(TD,LEV,E)
CALL CAL_ES(T,LEV,ES)
DO K=1,LEV
IF(E(K).LT.100.AND.ES(K).LT.100)THEN
RH(K)=E(K)/ES(K)
ELSE
RH(K)=99999.9
ENDIF
ENDDO
RETURN
END
! CAL_DCAPE.FOR BEGIN
! DCAPE 下沉对流有效位能
! 从地面往上找,直到500HP,从最小位湿球温处下沉,若没有最小值,
! 则从此600处下沉
! SUBROUTINE CAL_DCAPE(FLOAT PP(M,N,40),FLOAT TT(M,N,40),FLOAT TD(M,N,40),INT NUM_PT,FLOAT *GETDCAPE)
! 参数:各点NUM_PT曾上的P、T、TD(三维数组),
! 所求的量DCAPEX(二维数组)
! FLOAT TW_DEX(FLOAT,FLOAT,FLOAT)
! //湿球温度
! FLOAT PC_TC(FLOAT P0,FLOAT T0,FLOAT TD0,FLOAT *PC,FLOAT *TC)
! //抬升凝结高度PC,TC
! FLOAT EQU_T(FLOAT P,FLOAT T)//
! //返回P,T处的假相当位温
! FLOAT GET_T(FLOAT K,FLOAT P,FLOAT T)
! //参数:假相当位温,压强P及上一点的温度T,返回P处对应的T
! FLOAT GET_T1(FLOAT K,FLOAT P,FLOAT T)
! //参数:假相当位温,压强P及上一点的温度T,返回P处对应的T
SUBROUTINE CAL_DCAPE(PP,TT,TD,NUM_PT,DCAPEX)
REAL PP,TT,TD
DIMENSION PP(NUM_PT),TT(NUM_PT),TD(NUM_PT)
STEPP=10.0
IFT0=0
DCAPE=-999
IF(PP(NUM_PT).GT.500) GOTO 799
PMIN=PP(1)
CALL TW_DEX(PP(1),TT(1),TD(1),TW600)
CALL EQU_T(PMIN,TW600,QMIN)
P600=-999
T600=-999
TD600=-999
DO 10,WHILE(PMIN.GT.500)
PMIN=PMIN-STEPP
! FOR(I=0I.LE.NUM_PTI++)
DO 2 I=1,NUM_PT-1
IF(PP(I).GE.PMIN.AND.PP(I+1).LE.PMIN)THEN
TMIN=TT(I)+LOG(PMIN/PP(I))/LOG(PP(I+1)/PP(I))* (TT(I+1)-TT(I))
TDMIN=TD(I)+LOG(PMIN/PP(I))/LOG(PP(I+1)/PP(I))*(TD(I+1)-TD(I))
CALL TW_DEX(PMIN,TMIN,TDMIN,TWMIN)
CALL EQU_T(PMIN,TWMIN,QX)
GOTO 5
END IF
2 CONTINUE
5 IF(QX.LT.QMIN)THEN
QMIN=QX
P600=PMIN
T600=TMIN
TD600=TDMIN
END IF
10 CONTINUE
IF(P600.LT.500.OR.ABS(T600).GT.800.OR.ABS(TD600).GT.800)THEN
! FIRST P600=T600=TD600=-999
! FOR(I=0I.LT.NUM_PT-1I++)
DO 20 I=1,NUM_PT-1
IF(PP(I).GE.600.AND.PP(I+1).LT.600)THEN
P600=600
T600=TT(I)+LOG(P600/PP(I))/LOG(PP(I+1)/PP(I))*(TT(I+1)-TT(I))
TD600=TD(I)+LOG(P600/PP(I))/LOG(PP(I+1)/PP(I))*(TD(I+1)-TD(I))
GOTO 30
END IF
20 CONTINUE
30 END IF
IF(P600.LT.500.OR.ABS(T600).GT.800.OR.ABS(TD600).GT.800)GOTO 799
DCAPE=0.0
CALL TW_DEX(P600,T600,TD600,TW600)
P1=P600
T1=TW600
CALL EQU_T(P600,TW600,QC)
P2=P600
P1=P600
DO 50,WHILE(P2.LE.PP(1))
CALL EQU_T(P1,T1,Q1)
CALL EQU_T(P1,T1-0.1,Q2)
T2=T1-(Q1-QC)/(Q1-Q2)*0.1
! FOR(I=NUM_PT,I.GE.1,I--) //计算DCAPE
DO 40 I=NUM_PT,2,-1
IF(P1.GE.PP(I).AND.P1.LT.PP(I-1)) THEN
T11=TT(I)+LOG(P1/PP(I))/LOG(PP(I-1)/PP(I))*(TT(I-1)-TT(I))
! T11,T22环境温度
T22=TT(I)+LOG(P2/PP(I))/LOG(PP(I-1)/PP(I))*(TT(I-1)-TT(I))
DCAPE=DCAPE+287.0/2.*(T11+T22-T1-T2)*LOG(P2/P1)
GOTO 41
END IF
40 CONTINUE
41 P1=P2
T1=T2
P2=P2+STEPP
50 CONTINUE
799 DCAPEX=DCAPE
800 CONTINUE
END
! CAL_DCAPE.FOR END
SUBROUTINE EQU_T(P,T,K)
REAL K,LV
A=7.5*T/(237.3+T)
LV=2500000.-2368*T
E=6.11*10**A
B=1000.0/(P-E)
K=(273.16+T)*(B**0.286)*EXP(LV*0.622*E/(1004.*(273.16+T)*(P-E)))
END
SUBROUTINE TW_DEX(P0,T0,TD0,TW)
REAL L
L=597.4
CPD=0.2403
TW=0
IF(P0.LT.10.OR.ABS(T0).GT.85.OR.ABS(TD0).GT.85)RETURN
P=P0
T1=TD0
T2=TD0-0.1
CALL COM_QW(P,TD0,QS)
! 环境比湿
I=1
10 T1=T1+0.1*ABS(T1-T2)
CALL COM_QW(P,T1,QWS)
! 饱和比湿
T2=T0-L*(QWS-QS)/CPD
IF(ABS(T1-T2).LT.0.05) THEN
TW=T2
RETURN
END IF
I=I+1
IF(T2.GT.TD0)GOTO 10
END
SUBROUTINE COM_QW(P,T,QS)
IF(T.GE.0)THEN
A=7.5*T/(237.3+T)
ELSE
A=9.5*T/(265.5+T)
END IF
E=6.11*(10**A)
QS=0.622*E/P
END
SUBROUTINE CAL_CCL(TD,T,P,LEV,CCL,TCON)
! THIS SUBROUTINE CALCULATE CONVECTIVE CONDENSATION LEVEL
! INPUT TD =========> DEW POINT (CELSIUS)
! P ==========> PRESSURE (HPA)
! T ==========> TEMPERATURE (CELSIUS)
! LEV ========> LEVEL
! OUTPUT CCL =======> CONVECTIVE CONDENSATION LEVEL (HPA)
! TCON ======> TEMPERATURE OF CONVECTIVE (CELSIUS)
! TEMP ARRAY
! TE ==========> ENVIRONMENT TEMPERATURE (CELSIUS)
! TDS =========> SATURATED DEW POINT OF PARCEL AT EACH LEVEL
DIMENSION TD(LEV),T(LEV),P(LEV)
DIMENSION TE(110),TDS(110)
INTEGER LEV
REAL CCL
CALL CAL_TE(P,T,TE,LEV)
TD0=TD(1)
CALL CAL_TDS(TD0,P,LEV,TDS)
KLFC=0
IF(TDS(1).GT.TE(1).OR.(TDS(1).EQ.TE(1).AND.TDS(2).GT.TE(2)))THEN
CCL=P(1)
TCON=T(1)
ELSEIF((TDS(1).EQ.TE(1).AND.TDS(2).LE.TE(2)).OR.TDS(2).LE.TE(2))THEN
P_L=INT(P(1)/10.)*10
P_T=P_L-10
DO K=2,90
IF(TDS(K).GT.TE(K))THEN
KLFC=K
P_B=P_T+10
DELT1=TE(K-1)-TDS(K-1)
DELT2=TDS(K)-TE(K)
CCL=(P_B*DELT2+P_T*DELT1)/(DELT1+DELT2)
CCT=TE(K-1)-DELT1/(DELT1+DELT2)*(TE(K-1)-TE(K))
THCL=(CCT+273.15)*(1000./CCL)**(287/1005.)
TCON=THCL*(1000/P(1))**(-287./1005.)-273.15
GOTO 290
ENDIF
P_T=P_T-10
ENDDO
IF(KLFC.EQ.0)CCL=99999.9
ENDIF
290 CONTINUE
RETURN
END
SUBROUTINE CAL_TDS(TD0,P,LEV,TDS)
! THIS SUBROUTINE CALCULATE LAPSE RATE OF DEW POINT
! INPUT TDO ======> DEW POINT OF THE FIRST PRESSURE LEVEL (CELSIUS)
! P ========> PRESSURE (HPA)
! LEV ======> NUMBER OF LEVEL
! OUTPUT TDS =====> DEW POINT ALONG THE SPECIFIC Q LINE
DIMENSION P(LEV),TDS(110)
INTEGER LEV
REAL C
C=461/2500000.
TDS(1)=TD0
! WRITE(*,*)' TD0 = ',TD0
P1=INT(P(1)/10.)*10
P2=P1-10.
DO K=2,110
TDS(K)=1/(C*ALOG(P1/P2)+1/(TDS(K-1)+273.15))-273.15
P1=P1-10.
P2=P2-10.
IF(P2.LT.300.)RETURN
ENDDO
RETURN
END
SUBROUTINE CAL_TW(T,TD,P,LEV,TW)
! THIS SUBROUTINE CALCULATE WET-BULB TEMPERATURE
! NOTICE THIS SUBROUTINE IS SUPPORTED BY CAL_DHZHF
! INPUT T ========> TEMPERATURE (CELSIUS DEGREE)
! TD =======> DEW POINT (CELSIUS DEGREE)
! P ========> PRESSURE (HPA)
! LEV ======> LEVEL
! OUTPUT TW =======> WET-BULB TEMPERATURE (CELSIUS DEGREE)
! TEMP ARRAY
! Q ========> SPECIFIC HUMIDITY
DIMENSION T(LEV),TD(LEV),P(LEV)
DIMENSION TW(LEV),Q(LEV)
INTEGER LEV
REAL CPD,TWW
CPD=1005.
DO K=1,LEV
Q(K)=0.622*6.112*10**(7.5*TD(K)/(237.3+TD(K)))/P(K)
ENDDO
DO K=1,LEV
TOTAL0=T(K)+(2500000.-2368*TD(K))*Q(K)/CPD
PK=P(K)
T0=T(K)
TD0=TD(K)
CALL CAL_DHZHF(TOTAL0,T0,TD0,PK,TWW)
TW(K)=TWW
ENDDO
RETURN
END
SUBROUTINE CAL_DHZHF(TOTAL0,T0,TD0,PK,TW)
! THIS SUBROUTINE CALCULATE A PROPER TEMPERATUE BY USING
! ITERATIVE METHOD
! NOTICE IT IS SUPPORTED BY CAL_QL
! INPUT TOTAL0 ==> TARGET FOR ITERATION
! T0 ======> TEMPERATURE (CELSIUS DEGREE)
! TD0 =====> DEW POINT (CELSIUS DEGREE)
! PK ======> PRESSURE (HPA)
! OUTPUT TW ======> WET-BULB TEMPERATURE (CELSIUS DEGREE)
REAL TOTAL0,T0,TD0,PK,TW,LQ
CPD=1005.
TM0=T0
TM1=TD0
101 TM=(TM0+TM1)/2.
LQ=(2500000.-2368*TM)*6.112*10**(7.5*TM/(237.3+TM))
TOTALM=TM+0.622*LQ/PK/CPD
IF(ABS(TOTALM-TOTAL0).GT.0.001)THEN
IF(TOTALM.GT.TOTAL0)THEN
TM0=TM
TM1=TM1
ELSE
TM0=TM0
TM1=TM
ENDIF
GOTO 101
ELSE
TW=TM
ENDIF
RETURN
END
SUBROUTINE CAL_SSI(p,H0,H,U,V,lev,CAPE,shr,SSI)
!***********************************************************************
! Compute INDEX OF STORM INTENCITY by liuhz 2003.9 *
! INPUT U =====> WIND U (M/S)
! V =====> WIND V (M/S)
! H ======> GEOPOTENTIAL HEIEGHT (gpm)
! H0 =====> GEOPOTENTIAL HEIEGHT ON GIVEN HIGHT (gpm)
! CAPE =====> CONVECTIVE AVAILABLE POTENTIAL ENERGY (J/KG)
! OUTPUT SSI ====> INDEX OF STORM INTENCITY
!***********************************************************************
real H(LEV),U(LEV),V(LEV)
! DIMENSION P(K0),H1(K0),U1(K0),V1(K0)
REAL cape,u0,v0,H0,SSI,shr,h01
! REAL SHR2,H01
PI=3.1415926
50 SSI=9999.
H01=H0
CALL CAL_H0_UV(H0,H,U,V,lev,U0,V0)
! SHR2=SQRT((U0-U(1))**2+(V0-V(1))**2)/(H0/1000)
if((u0.gt.9000).or.(u(1).gt.9000).or.(v0.gt.9000).or.(v(1).gt.9000)) then
shr=9999.9
else
SHR=SQRT((U0-U(1))**2+(V0-V(1))**2)/H01
end if
! shr(i,j)=shr2
! WRITE(*,*)'SHR=',SHR
! PAUSE
if(shr.gt.9000) then
ssi=9999.9
else
SSI=100*(2+0.276*ALOG(SHR)+2.011*CAPE*0.0001)
end if
! 200 CONTINUE
RETURN
END
!-----------------
SUBROUTINE CAL_H0_UV(H0,H,U,V,LEV,U0,V0)
! THIS SUBROUTINE CALCULATE WIND SPEED(U0,V0) ON GIVEN HIGHT H0
DIMENSION H(LEV),U(LEV),V(LEV)
real hmin,umin,vmin,hmax,umax,vmax
INTEGER LEV
REAL H0,U0,V0
u0=9999.0
v0=9999.0
DO K=1,LEV
if((h(k).lt.99990).and.(h(k).LE.H0)) then
hmin=h(k)
umin=u(k)
vmin=v(k)
endif
if((h(k).lt.99990).and.(h(k).GT.H0)) then
hmax=h(k)
umax=u(k)
vmax=v(k)
goto 123
endif
ENDDO
123 continue
CC=(Hmax-H0)/(Hmax-Hmin)
U0=Umax+CC*(Umin-Umax)
V0=Vmax+CC*(Vmin-Vmax)
RETURN
END