! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE ARPS_BE ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE arps_be(nx,ny,nz, & 3,10 pres,hgt,tk,wmr, & lcl,lfc,el,twdf,li,cape,mcape,cin,tcap, & p1d,ht1d,t1d,tv1d,td1d,wmr1d, & partem,buoy,wload,mbuoy,pbesnd,mbesnd,tem1) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Calculate the lifting condensation level (lcl), level of free ! convection (lfc), equilibrium level (el), max wet-bulb potential ! temperature difference (twdf), lifted index (LI), Convective ! Available Potential Energy (CAPE), Moist Convective Potential ! Energy (MCAPE, includes water loading), convective inhibition ! (CIN) and lid strength (tcap) over the ARPS grid. ! !----------------------------------------------------------------------- ! ! ! AUTHOR: Keith Brewster ! April, 1995 Based on OLAPS, hence LAPS, version of same. ! ! MODIFICATION HISTORY: ! 3/11/1996 (Keith Brewster) ! Cleaned-up, removed OLAPS artifacts. ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER :: nx,ny,nz ! !----------------------------------------------------------------------- ! ! 3-D input variables ! !----------------------------------------------------------------------- ! REAL :: pres(nx,ny,nz) REAL :: hgt(nx,ny,nz) REAL :: tk(nx,ny,nz) REAL :: wmr(nx,ny,nz) ! !----------------------------------------------------------------------- ! ! Output variables (2d) ! !----------------------------------------------------------------------- ! REAL :: lcl(nx,ny) REAL :: lfc(nx,ny) REAL :: el(nx,ny) REAL :: twdf(nx,ny) REAL :: li(nx,ny) REAL :: cape(nx,ny) REAL :: mcape(nx,ny) REAL :: cin(nx,ny) REAL :: tcap(nx,ny) ! !----------------------------------------------------------------------- ! ! Scratch space for calculations ! !----------------------------------------------------------------------- ! REAL :: p1d(nz),ht1d(nz) REAL :: t1d(nz),tv1d(nz),td1d(nz),wmr1d(nz) REAL :: partem(nz),buoy(nz),wload(nz) REAL :: mbuoy(nz),pbesnd(nz),mbesnd(nz) REAL :: tem1(nx,ny) ! !----------------------------------------------------------------------- ! ! Functions ! !----------------------------------------------------------------------- ! REAL :: wmr2td,tctotv ! !----------------------------------------------------------------------- ! ! Misc internal variables ! !----------------------------------------------------------------------- ! INTEGER :: i,j,k,n,imid,jmid,nlevel ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! imid=(nx/2) + 1 jmid=(ny/2) + 1 ! !----------------------------------------------------------------------- ! ! Loop over all columns ! !----------------------------------------------------------------------- ! DO j=1,ny-1 DO i=1,nx-1 ! DO k=2,nz-1 n = k-1 p1d(n) = 0.01 * pres(i,j,k) ht1d(n) = hgt(i,j,k)*1000. wmr1d(n)= 1000. * wmr(i,j,k) t1d(n) = tk(i,j,k) - 273.15 td1d(n) = wmr2td(p1d(n),wmr1d(n)) tv1d(n) = tctotv(t1d(n),wmr1d(n)) END DO ! nlevel = nz-2 ! CALL sindex(nz,nlevel,p1d,ht1d,t1d,tv1d,td1d,wmr1d, & partem,buoy,wload,mbuoy,pbesnd,mbesnd, & lcl(i,j),lfc(i,j),el(i,j),twdf(i,j), & li(i,j),cape(i,j),mcape(i,j), & cin(i,j),tcap(i,j)) IF(i == imid .AND. j == jmid) THEN WRITE(6,*) & ' n p t tpar buoy wmr be' DO n = 1,nlevel WRITE(6,801) n,p1d(n),t1d(n),partem(n),buoy(n), & wmr1d(n),pbesnd(n) 801 FORMAT(1X,i2,f8.1,f10.2,f10.2,f10.4,f10.4,f10.1) END DO END IF END DO END DO ! !----------------------------------------------------------------------- ! ! Smooth the output arrays ! !----------------------------------------------------------------------- ! CALL smooth9p( lcl,nx,ny,1,nx-1,1,ny-1,tem1) CALL smooth9p( lfc,nx,ny,1,nx-1,1,ny-1,tem1) CALL smooth9p( el,nx,ny,1,nx-1,1,ny-1,tem1) CALL smooth9p( twdf,nx,ny,1,nx-1,1,ny-1,tem1) CALL smooth9p( li,nx,ny,1,nx-1,1,ny-1,tem1) CALL smooth9p( cape,nx,ny,1,nx-1,1,ny-1,tem1) CALL smooth9p(mcape,nx,ny,1,nx-1,1,ny-1,tem1) CALL smooth9p( cin,nx,ny,1,nx-1,1,ny-1,tem1) CALL smooth9p( tcap,nx,ny,1,nx-1,1,ny-1,tem1) ! RETURN END SUBROUTINE arps_be ! ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE SINDEX ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE sindex(maxlev,nlevel,p,ht,t,tv,td,w, & 1,5 partem,buoy,wload,mbuoy,pbesnd,mbesnd, & lcl_pbe,lfc,el,twdf,li,cape,mcape,cin,tcap) ! ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Calculate Convective Available Potential Energy (CAPE) ! in each column of ARPS grid. ! !----------------------------------------------------------------------- ! ! ! AUTHOR: Keith Brewster ! April, 1995 Based on OLAPS, hence LAPS, version of same. ! ! MODIFICATION HISTORY: ! 3/11/1996 Cleaned-up, removed OLAPS artifacts. ! 5/13/1996 Added cap strength. ! !----------------------------------------------------------------------- ! IMPLICIT NONE ! INTEGER :: maxlev,nlevel ! REAL :: p(maxlev),ht(maxlev),t(maxlev),tv(maxlev), & td(maxlev),w(maxlev) REAL :: partem(maxlev),buoy(maxlev),wload(maxlev),mbuoy(maxlev) REAL :: pbesnd(maxlev),mbesnd(maxlev) ! ! Returned from sindx ! REAL :: lfc,el,twdf,li,cape,mcape,cin,mcin,tcap ! ! Potbe variables ! REAL :: plcl_pbe,tlcl_pbe,lcl_pbe,thepcl REAL :: velneg,mvelneg ! ! Functions ! REAL :: oe ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! thepcl=oe(! ! print *, ' theta-e of parcel: ',thepcl ! CALL ptlcl(! ! Find height of LCL ! CALL intrpr(maxlev,nlevel,p,ht,plcl_pbe,lcl_pbe) ! ! Calculate the CAPE and such ! CALL potbe(maxlev,nlevel,p(1),t(1),w(1), & thepcl,plcl_pbe,tlcl_pbe,lcl_pbe, & p,ht,t,tv,td,w, & partem,buoy,wload,mbuoy,pbesnd,mbesnd, & cin,velneg,cape,mcin,mvelneg,mcape,lfc,el,tcap) ! ! Calculate Lifted Index ! CALL calcli(maxlev,nlevel,thepcl,p,t,li) ! ! Calculate max and min wet bulb potential temperature ! CALL thwxn(maxlev,nlevel,p,ht,t,td,ht(1),twdf) ! RETURN END SUBROUTINE sindex ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE POTBE ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! ! SUBROUTINE potbe(maxlev,nlevel,pmean,tmean,wmean, & 1,3 blthte,plcl,tlcl,lcl, & p,ht,t,tv,td,w, & partem,buoy,wload,mbuoy,pbesnd,mbesnd, & pbeneg,velneg,pos_max, & mbeneg,mvelneg,mpos_max,lfc,el,tcap) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Calculate Convective Available Potential Energy (CAPE) ! in each column of ARPS grid. ! !----------------------------------------------------------------------- ! ! ! AUTHOR: Keith Brewster ! February, 1994 Based on OLAPS, hence LAPS, version of same. ! from FSL, by Steve Albers 1991 ! ! MODIFICATION HISTORY: ! 3/11/1996 Cleaned-up, removed OLAPS artifacts. ! !----------------------------------------------------------------------- ! IMPLICIT NONE ! INTEGER :: maxlev,nlevel REAL :: pmean,tmean,wmean,blthte,plcl,tlcl,lcl REAL :: p(maxlev),ht(maxlev) REAL :: t(maxlev),tv(maxlev),td(maxlev),w(maxlev) REAL :: partem(maxlev),buoy(maxlev),wload(maxlev),mbuoy(maxlev) REAL :: pbesnd(maxlev),mbesnd(maxlev) REAL :: pbeneg,velneg,pos_max REAL :: mbeneg,mvelneg,mpos_max,lfc,el,tcap ! ! Parameters ! REAL :: g,gamma PARAMETER (g=9.80665, & gamma = .009760) ! Dry Adiabatic Lapse Rate Deg/m ! ! Functions ! REAL :: tsa_fast,tctotv ! ! Misc internal variables ! INTEGER :: n,nel REAL :: deltah,delta_ht_dry,delta_ht_wet REAL :: sntlcl,buoy_lcl,wsat,partv REAL :: nbe_min,pbe_wet,pbe_dry,pos_area REAL :: wlow,htzero,adjeng ! !----------------------------------------------------------------------- ! ! Function f_mrsat and inline directive for Cray PVP ! !----------------------------------------------------------------------- ! REAL :: f_mrsat !fpp$ expand (f_mrsat) !dir$ inline always f_mrsat !*$* inline routine (f_mrsat) ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! ! Reset output variables. ! ! These should be the same as what is assigned ! no positive area found. They are limited in ! range to allow for contouring when positive ! areas exist in some columns of a domain and ! not in others. ! pbeneg=-400. velneg=20. pos_max=0. mbeneg=-400. mvelneg=20. mpos_max=0. lfc=10000. el=0. tcap=0. ! ! Inxtialize parcel path arrays ! partem(1) = t(1) buoy(1) = 0. wload(1) = 0. mbuoy(1) = 0. pbesnd(1) = 0. mbesnd(1) = 0. ! WRITE(6,810)pmean,tmean,wmean,plcl,tlcl,lcl ! 810 format(' pmean,tmean,wmean,plcl,tlcl,lcl',2F10.2,F10.5,2F10.2 ! + ,F5.1) DO n=2,nlevel deltah = ht(n) - ht(n-1) IF(plcl < p(n-1))THEN ! lower level is below LCL IF(plcl < p(n))THEN ! upper level is below LCL ! WRITE(6,*)' DRY CASE' partem(n)=partem(n-1)-gamma*deltah partv=tctotv(partem(n),w(1)) buoy(n)=(partv-tv(n))/tv(n) pbesnd(n)=pbesnd(n-1)+g*0.5*(buoy(n)+buoy(n-1))*deltah wload(n)=0. mbuoy(n)=buoy(n) mbesnd(n)=pbesnd(n) IF((p(1)-p(n)) < 300.) tcap=AMAX1(tcap,(tv(n)-partv)) ELSE ! Upper level is above LCL ! ! BRACKETING CASE AROUND lcl - DRY ADIABATIC PART ! ! WRITE(6,*)' DRY ADIABATIC PART' delta_ht_dry = lcl - ht(n-1) ! WRITE(6,307)tlcl !307 format(' PARCEL TEMP AT lcl= ',F10.3) CALL intrpr(maxlev,nlevel,p,tv,plcl,sntlcl) partv=tctotv(tlcl,w(1)) buoy_lcl=(partv-sntlcl)/sntlcl pbe_dry=g*0.5*(buoy_lcl+buoy(n-1))*delta_ht_dry IF((p(1)-plcl) < 300.) tcap=AMAX1(tcap,(sntlcl-partv)) ! WRITE(6,777)N,P(N),tlcl,sntlcl,buoy_lcl !# ,buoy(N-1),delta_ht_dry,HT(N),pbesnd(N-1)+pbe_dry ! ! MOIST ADIABATIC PART ! ! WRITE(6,*)' MOIST ADIABATIC PART' delta_ht_wet=deltah-delta_ht_dry partem(n) = tsa_fast(blthte,p(n)) wsat=1000.*f_mrsat( p(n)*100., partem(n)+273.15 ) partv=tctotv(partem(n),wsat) buoy(n)=(partv-tv(n))/tv(n) pbe_wet = g*0.5*(buoy(n)+buoy_lcl)*delta_ht_wet pbesnd(n)=pbesnd(n-1) + pbe_dry + pbe_wet ! wload(n)=0.001*(w(1)-wsat) mbuoy(n)=buoy(n) - wload(n) pbe_wet = g*0.5*(mbuoy(n)+buoy_lcl)*delta_ht_wet mbesnd(n)=mbesnd(n-1) + pbe_dry + pbe_wet IF((p(1)-plcl) < 300.) tcap=AMAX1(tcap,(tv(n)-partv)) END IF ! Upper level below LCL (Dry or bracket) ELSE ! Lower Level is above LCL ! WRITE(6,*)' GETTING PARCEL TEMPERATURE FOR MOIST CASE' partem(n) = tsa_fast(blthte,p(n)) wsat=1000.*f_mrsat( p(n)*100., partem(n)+273.15 ) partv=tctotv(partem(n),wsat) buoy(n)=(partv-tv(n))/tv(n) pbesnd(n)=pbesnd(n-1)+g*0.5*(buoy(n)+buoy(n-1))*deltah ! wload(n)=0.001*(w(1)-wsat) mbuoy(n)=buoy(n) - wload(n) mbesnd(n)=mbesnd(n-1)+g*0.5*(mbuoy(n)+mbuoy(n-1))*deltah IF((p(1)-p(n)) < 300.) tcap=AMAX1(tcap,(tv(n)-partv)) END IF ! WRITE(6,777)N,P(N),partem(N),T(N),(buoy(n)*1000.),pbesnd(n) !777 format(' PBE: P,partem,t,b,pbe=',I3,F6.1,4F8.2) END DO ! ! DETERMINE ENERGY EXTREMA ! Find heights with nuetral buoyancy ! pos_area=0. nbe_min=0. DO n=2,nlevel ! WRITE(6,940)N !940 format( ! :' LOOKING FOR NEUTRAL BUOYANCY - ENERGY EXTREMUM, LEVEL',I3) IF((buoy(n)*buoy(n-1)) < 0.)THEN wlow=buoy(n)/(buoy(n)-buoy(n-1)) htzero=ht(n)*(1.-wlow) + wlow*ht(n-1) deltah=htzero-ht(n-1) adjeng=pbesnd(n-1)+g*0.5*buoy(n-1)*deltah ! IF (p(n) >= 500.) THEN nbe_min=AMIN1(adjeng,nbe_min) END IF ! pos_area=adjeng-nbe_min pos_max=AMAX1(pos_area,pos_max) END IF END DO ! WRITE(6,464)ICP,ICT,N1,NLEVEL !464 format(' ICP,ICT,N1,NLEVEL',4I5) ! ! Case when equlibrium level is above top of domain ! pos_area=pbesnd(nlevel)-nbe_min pos_max=AMAX1(pos_area,pos_max) ! ! At least one region of positive area in sounding ! Make sure there is at least 1 J/kg to avoid some ! round-off errors esp near LCL. ! IF(pos_max > 1.0)THEN pbeneg=AMAX1(nbe_min,-400.) velneg=SQRT(2.0*ABS(pbeneg)) velneg=AMIN1(velneg,20.) ELSE ! Case when no positive area exists anywhere in sounding pos_max=0.0 pbeneg =-400. velneg = 20. END IF ! WRITE(6,485)pos_max,PBENEG,VELNEG !485 format(' pos_max',F10.1,' PBENEG',F10.1,' VELNEG',F10.1) ! ! DETERMINE ENERGY EXTREMA FOR MOIST BUOYANCY ! Find heights with nuetral buoyancy ! pos_area=0. nbe_min=0. DO n=2,nlevel ! WRITE(6,940)N IF((mbuoy(n)*mbuoy(n-1)) < 0.)THEN wlow=mbuoy(n)/(mbuoy(n)-mbuoy(n-1)) htzero=ht(n)*(1.-wlow) + wlow*ht(n-1) deltah=htzero-ht(n-1) adjeng=mbesnd(n-1)+g*0.5*mbuoy(n-1)*deltah ! IF (p(n) >= 500.) THEN nbe_min=AMIN1(adjeng,nbe_min) END IF ! pos_area=adjeng-nbe_min mpos_max=AMAX1(pos_area,mpos_max) END IF END DO ! WRITE(6,464)ICP,ICT,N1,NLEVEL ! ! Case when equlibrium level is above top of domain ! pos_area=mbesnd(nlevel)-nbe_min mpos_max=AMAX1(pos_area,mpos_max) ! ! At least one region of positive area in sounding ! Make sure there is at least 1 J/kg to ! spurious pos energy due to round off. ! IF(mpos_max > 1.0)THEN mbeneg=AMAX1(nbe_min,-400.) mvelneg=SQRT(2.0*ABS(pbeneg)) mvelneg=AMIN1(mvelneg,20.) ELSE ! Case when no positive area exists anywhere in sounding mpos_max=0.0 mbeneg =-400. mvelneg = 20. END IF ! WRITE(6,486)mpos_max,PBENEG,VELNEG !486 format(' Mpos_max',F10.1,' MBENEG',F10.1,' mVELNEG',F10.1) ! ! Case when equlibrium level is above top of domain ! mpos_max = MAX(mpos_max,(mbesnd(nlevel) - nbe_min)) ! ! Find EL and LFC ! Unxts are set to km ASL ! IF(pos_max > 1.0) THEN IF(buoy(nlevel) > 0.) THEN nel=nlevel el=0.001*ht(nlevel) ELSE DO n=nlevel-1,2,-1 IF(buoy(n) > 0.) EXIT END DO ! 1201 CONTINUE nel=n wlow=buoy(n+1)/(buoy(n+1)-buoy(n)) el=0.001 * (ht(n+1)*(1.-wlow) + ht(n)*wlow) END IF ! DO n=nel,1,-1 IF(buoy(n) < 0.) EXIT END DO ! 1301 CONTINUE IF(n > 0) THEN wlow=buoy(n+1)/(buoy(n+1)-buoy(n)) lfc=ht(n+1)*(1.-wlow) + ht(n)*wlow ELSE lfc=ht(1) END IF ELSE el=0. lfc=10000. END IF lfc=AMIN1(lfc,10000.) RETURN END SUBROUTINE potbe ! ! !################################################################## !################################################################## !###### ###### !###### FUNCTION TCTOTV ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! ! FUNCTION tctotv(tt,ww) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Virtual Temperature ! ! Given T in Celcius and mixing ratio in g/kg ! find the virtual temperature. ! !----------------------------------------------------------------------- ! ! ! AUTHOR: Keith Brewster ! April, 1995 Based on OLAPS, hence LAPS, version of same. ! ! MODIFICATION HISTORY: ! !----------------------------------------------------------------------- ! IMPLICIT NONE ! REAL :: tctotv,tt,ww ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! tctotv=(tt+273.15)*(1.+0.0006*ww) RETURN END FUNCTION tctotv ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE THWXN ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! ! SUBROUTINE thwxn(maxlev,nlevel,p,ht,t,td,elev,twdf) 1 ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! !----------------------------------------------------------------------- ! ! ! AUTHOR: Keith Brewster ! April, 1995 Based on OLAPS, hence LAPS, version of same. ! ! MODIFICATION HISTORY: ! 3/11/1996 Cleaned-up, removed OLAPS artifacts. ! !----------------------------------------------------------------------- ! IMPLICIT NONE ! ! Input variables ! INTEGER :: maxlev,nlevel REAL :: p(maxlev),ht(maxlev),t(maxlev),td(maxlev) REAL :: elev ! ! Output variables ! REAL :: twdf ! ! Functions ! REAL :: oe,tsa_fast ! ! Misc internal variables ! INTEGER :: n REAL :: h3km,thaec,thw,twx,twn ! ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! twx=-999. twn=999. h3km=elev+3000. DO n=1,nlevel IF(ht(n) >= elev) THEN IF(ht(n) > h3km) EXIT thaec=oe( thw=tsa_fast(thaec,1000.) twx=AMAX1(twx,thw) twn=AMIN1(twn,thw) END IF END DO ! 101 CONTINUE ! ! Find difference between max and min ! twdf=twx-twn RETURN END SUBROUTINE thwxn ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE CALCLI ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE calcli(maxlev,nlevel,thepcl,p,t,li) 1 ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Calculate Convective Available Potential Energy (CAPE) ! in each column of ARPS grid. ! !----------------------------------------------------------------------- ! ! ! AUTHOR: Keith Brewster ! April, 1995 Based on OLAPS, hence LAPS, version of same. ! ! MODIFICATION HISTORY: ! 3/11/1996 Cleaned-up, removed OLAPS artifacts. ! !----------------------------------------------------------------------- ! IMPLICIT NONE ! ! Input variables ! INTEGER :: maxlev,nlevel REAL :: thepcl REAL :: p(maxlev),t(maxlev) ! ! Output variable ! REAL :: li ! ! Functions ! REAL :: tsa_fast ! ! Misc internal variables ! INTEGER :: n REAL :: dp,wlow,t500,par500 ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! DO n=2,nlevel-1 IF( p(n) <= 500.) EXIT END DO ! 101 CONTINUE dp=ALOG( wlow=ALOG(500./p(n))/dp t500=t(n)*(1.-wlow) + t(n-1)*wlow par500=tsa_fast(thepcl,500.) ! li=t500-par500 ! RETURN END SUBROUTINE calcli ! !################################################################## !################################################################## !###### ###### !###### FUNCTION WMR2TD ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! ! FUNCTION wmr2td(pres,wmr) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Calculate Convective Available Potential Energy (CAPE) ! in each column of ARPS grid. ! !----------------------------------------------------------------------- ! ! ! AUTHOR: Keith Brewster ! April, 1995 Based on GEMPAK routine of same name. ! ! MODIFICATION HISTORY: ! !----------------------------------------------------------------------- ! IMPLICIT NONE REAL :: wmr2td REAL :: pres REAL :: wmr REAL :: wkgkg,e,evap ! wkgkg = 0.001 * wmr wkgkg = AMAX1(wkgkg,0.00005) e= (pres*wkgkg) / (0.62197 + wkgkg) evap = e /(1.001 + (( pres - 100.) /900.) * 0.0034) wmr2td = ALOG(evap/6.112) * 243.5 /( 17.67 - ALOG (evap/6.112)) RETURN END FUNCTION wmr2td ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE INTRPR ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! ! SUBROUTINE intrpr(nz,nlev,p,var,plvl,varatp) 2 ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Interpolate variable "var" linearly in log-pressure (p). ! !----------------------------------------------------------------------- ! ! ! AUTHOR: Keith Brewster ! April, 1995 Based on OLAPS, hence LAPS, version of same. ! ! MODIFICATION HISTORY: ! 3/11/1996 Cleaned-up, removed OLAPS artifacts. ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER :: nz,nlev REAL :: p(nz),var(nz) REAL :: plvl REAL :: varatp ! INTEGER :: k REAL :: w1 ! DO k=2,nlev-1 IF( END DO ! 101 CONTINUE ! w1=ALOG( varatp = w1*var(k-1) + (1.-w1)*var(k) ! RETURN END SUBROUTINE intrpr ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE CALCSHR ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE calcshr(nx,ny,nz,x,y,zp,sigma, & 2,11 p_pa,t3d,u3d,v3d,cape, & shr37,ustrm,vstrm,srlfl,srmfl,helicity,brn,brnu,blcon, & tem1,tem2,tem3,elev,hgt3d) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Calculate various wind shear parameters useful for gauging ! the potential for severe storms. ! !----------------------------------------------------------------------- ! ! ! AUTHOR: Keith Brewster ! February, 1994 Based on OLAPS, hence LAPS, version of same. ! ! MODIFICATION HISTORY: ! 3/11/1996 Keith Brewster ! Added storm-relative flows, general clean-up to ! meet ARPS coding standards. ! ! 3/22/1996 (Keith Brewster) ! Fixed some bugs, added smoothing at the end. ! ! 06/20/2000 (Eric Kemp and Keith Brewster) ! Changed BRN Shear to be the denominator of BRN, instead of wind ! speed, now has units of speed squared. ! !----------------------------------------------------------------------- ! ! Calculates some of the shear related variables from the ! ARPS 3D wind field. ! ! shr37 Magnitude of wind shear between 3 and 7 km AGL ! ustrm,vstrm Estimated storm motion (modified from Bob Johns) ! srlfl Low-level storm-relative wind ! srmfl Mid-level storm-relative wind ! helicity Helicity, storm relative ! brn Bulk Richardson Number (Weisman and Klemp) ! brnu Shear parameter of BRN, "U" ! !----------------------------------------------------------------------- ! IMPLICIT NONE ! !----------------------------------------------------------------------- ! ! Input variables ! !----------------------------------------------------------------------- ! INTEGER :: nx,ny,nz REAL :: x(nx) REAL :: y(ny) REAL :: zp(nx,ny,nz) REAL :: sigma(nx,ny) REAL :: p_pa(nx,ny,nz) REAL :: t3d(nx,ny,nz) REAL :: u3d(nx,ny,nz) REAL :: v3d(nx,ny,nz) REAL :: cape(nx,ny) ! !----------------------------------------------------------------------- ! ! Output variables ! !----------------------------------------------------------------------- ! REAL :: shr37(nx,ny) ! 7km - 3km wind shear REAL :: ustrm(nx,ny) REAL :: vstrm(nx,ny) ! Estimated storm motion (Bob Johns) REAL :: srlfl(nx,ny) REAL :: srmfl(nx,ny) REAL :: helicity(nx,ny) ! Helicity, storm relative REAL :: brn(nx,ny) ! Bulk Richardson Number (Weisman and Klemp) REAL :: brnu(nx,ny) ! Shear parameter of BRN, "U" REAL :: blcon(nx,ny) ! !----------------------------------------------------------------------- ! ! Temporary variables ! !----------------------------------------------------------------------- ! REAL :: tem1(nx,ny) REAL :: tem2(nx,ny) REAL :: tem3(nx,ny) REAL :: elev(nx,ny) REAL :: hgt3d(nx,ny,nz) ! !----------------------------------------------------------------------- ! ! Misc internal variables ! !----------------------------------------------------------------------- ! INTEGER :: imid,jmid INTEGER :: i,j,k,ksfc,k2km,k3km REAL :: h3km,u3km,v3km,h7km,u7km,v7km,u2,v2 REAL :: p2km,t2km,h2km,u2km,v2km,p9km,t9km,h9km,u9km,v9km REAL :: p500m,t500m,h500m,u500m,v500m,p6km,t6km,h6km,u6km,v6km REAL :: sumu,sumv,sump,sumh,wlow,whigh,dx,dy,dz,dp,dx2,dy2 REAL :: rhohi,rholo,rhoinv REAL :: dirmean,spmean,ushr,vshr,ddir,perc ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! imid=nx/2 jmid=nx/2 ! DO j=1,ny-1 DO i=1,nx-1 elev(i,j)=zp(i,j,2) END DO END DO DO k=1,nz-1 DO j=1,ny-1 DO i=1,nx-1 hgt3d(i,j,k)=0.5*(zp(i,j,k)+zp(i,j,k+1)) END DO END DO END DO ! !----------------------------------------------------------------------- ! ! Main loop over all horizontal scalar points ! !----------------------------------------------------------------------- ! ksfc=2 DO j=1,ny-1 DO i=1,nx-1 ! !----------------------------------------------------------------------- ! ! Find mass weighted mean wind in first 500m ! !----------------------------------------------------------------------- ! sumu=0. sumv=0. sump=0. h500m=elev(i,j)+500. DO k=ksfc+1,nz-1 IF( hgt3d(i,j,k) < h500m ) THEN dp=p_pa(i,j,k-1)-p_pa(i,j,k) rhohi=p_pa(i,j,k)/t3d(i,j,k) rholo=p_pa(i,j,k-1)/t3d(i,j,k-1) rhoinv=1./(rhohi+rholo) sumu=sumu+dp*rhoinv*(rholo*u3d(i,j,k-1)+rhohi*u3d(i,j,k)) sumv=sumv+dp*rhoinv*(rholo*v3d(i,j,k-1)+rhohi*v3d(i,j,k)) sump=sump+dp ELSE dz=hgt3d(i,j,k)-hgt3d(i,j,k-1) wlow=(hgt3d(i,j,k)-h500m)/dz u500m=u3d(i,j,k)*(1.-wlow) + u3d(i,j,k-1)*wlow v500m=v3d(i,j,k)*(1.-wlow) + v3d(i,j,k-1)*wlow p500m=p_pa(i,j,k)*(1.-wlow) + p_pa(i,j,k-1)*wlow t500m=t3d(i,j,k)*(1.-wlow) + t3d(i,j,k-1)*wlow dp=p_pa(i,j,k-1)-p500m rhohi=p500m/t500m rholo=p_pa(i,j,k-1)/t3d(i,j,k-1) rhoinv=1./(rhohi+rholo) ! print *, ' p500,t500 = ',p500m,t500m ! print *, ' u500,v500 = ',u500m,v500m sumu=sumu+dp*rhoinv*(rholo*u3d(i,j,k-1)+rhohi*u500m) sumv=sumv+dp*rhoinv*(rholo*v3d(i,j,k-1)+rhohi*v500m) sump=sump+dp EXIT END IF END DO ! 121 CONTINUE u500m=sumu/sump v500m=sumv/sump ! !----------------------------------------------------------------------- ! ! Find mass weighted mean wind sfc-2km AGL ! !----------------------------------------------------------------------- ! sumu=0. sumv=0. sump=0. h2km=elev(i,j)+2000. DO k=ksfc+1,nz-1 IF( hgt3d(i,j,k) < h2km ) THEN dp=p_pa(i,j,k-1)-p_pa(i,j,k) rhohi=p_pa(i,j,k)/t3d(i,j,k) rholo=p_pa(i,j,k-1)/t3d(i,j,k-1) rhoinv=1./(rhohi+rholo) sumu=sumu+dp*rhoinv*(rholo*u3d(i,j,k-1)+rhohi*u3d(i,j,k)) sumv=sumv+dp*rhoinv*(rholo*v3d(i,j,k-1)+rhohi*v3d(i,j,k)) sump=sump+dp ELSE dz=hgt3d(i,j,k)-hgt3d(i,j,k-1) wlow=(hgt3d(i,j,k)-h2km)/dz u2km=u3d(i,j,k)*(1.-wlow) + u3d(i,j,k-1)*wlow v2km=v3d(i,j,k)*(1.-wlow) + v3d(i,j,k-1)*wlow p2km=p_pa(i,j,k)*(1.-wlow) + p_pa(i,j,k-1)*wlow t2km=t3d(i,j,k)*(1.-wlow) + t3d(i,j,k-1)*wlow dp=p_pa(i,j,k-1)-p2km rhohi=p2km/t2km rholo=p_pa(i,j,k-1)/t3d(i,j,k-1) rhoinv=1./(rhohi+rholo) sumu=sumu+dp*rhoinv*(rholo*u3d(i,j,k-1)+rhohi*u2km) sumv=sumv+dp*rhoinv*(rholo*v3d(i,j,k-1)+rhohi*v2km) sump=sump+dp EXIT END IF END DO ! 141 CONTINUE u2km=sumu/sump v2km=sumv/sump tem2(i,j)=u2km tem3(i,j)=v2km ! !----------------------------------------------------------------------- ! ! Find mass weighted mean wind sfc-6km AGL ! !----------------------------------------------------------------------- ! sumu=0. sumv=0. sump=0. h6km=elev(i,j)+6000. DO k=ksfc+1,nz-1 IF( hgt3d(i,j,k) < h6km ) THEN dp=p_pa(i,j,k-1)-p_pa(i,j,k) rhohi=p_pa(i,j,k)/t3d(i,j,k) rholo=p_pa(i,j,k-1)/t3d(i,j,k-1) rhoinv=1./(rhohi+rholo) sumu=sumu+dp*rhoinv*(rholo*u3d(i,j,k-1)+rhohi*u3d(i,j,k)) sumv=sumv+dp*rhoinv*(rholo*v3d(i,j,k-1)+rhohi*v3d(i,j,k)) sump=sump+dp ELSE dz=hgt3d(i,j,k)-hgt3d(i,j,k-1) wlow=(hgt3d(i,j,k)-h6km)/dz u6km=u3d(i,j,k)*(1.-wlow) + u3d(i,j,k-1)*wlow v6km=v3d(i,j,k)*(1.-wlow) + v3d(i,j,k-1)*wlow p6km=p_pa(i,j,k)*(1.-wlow) + p_pa(i,j,k-1)*wlow t6km=t3d(i,j,k)*(1.-wlow) + t3d(i,j,k-1)*wlow dp=p_pa(i,j,k-1)-p6km rhohi=p6km/t6km rholo=p_pa(i,j,k-1)/t3d(i,j,k-1) rhoinv=1./(rhohi+rholo) sumu=sumu+dp*rhoinv*(rholo*u3d(i,j,k-1)+rhohi*u6km) sumv=sumv+dp*rhoinv*(rholo*v3d(i,j,k-1)+rhohi*v6km) sump=sump+dp EXIT END IF END DO u6km=sumu/sump v6km=sumv/sump ! !----------------------------------------------------------------------- ! ! Find mass weighted mean wind 2km-9km AGL ! !----------------------------------------------------------------------- ! sumu=0. sumv=0. sump=0. h9km=elev(i,j)+9000. DO k=ksfc+1,nz-2 IF( hgt3d(i,j,k) > h2km ) EXIT END DO ! 181 CONTINUE k2km=k dz=hgt3d(i,j,k)-hgt3d(i,j,k-1) wlow=(hgt3d(i,j,k)-h2km)/dz u2=u3d(i,j,k)*(1.-wlow) + u3d(i,j,k-1)*wlow v2=v3d(i,j,k)*(1.-wlow) + v3d(i,j,k-1)*wlow p2km=p_pa(i,j,k)*(1.-wlow) + p_pa(i,j,k-1)*wlow t2km=t3d(i,j,k)*(1.-wlow) + t3d(i,j,k-1)*wlow dp=p2km-p_pa(i,j,k) rholo=p2km/t2km rhohi=p_pa(i,j,k)/t3d(i,j,k) rhoinv=1./(rhohi+rholo) sumu=sumu+dp*rhoinv*(rholo*u2+rhohi*u3d(i,j,k)) sumv=sumv+dp*rhoinv*(rholo*v2+rhohi*v3d(i,j,k)) sump=sump+dp DO k=k2km+1,nz-1 IF( hgt3d(i,j,k) < h9km ) THEN dp=p_pa(i,j,k-1)-p_pa(i,j,k) rhohi=p_pa(i,j,k)/t3d(i,j,k) rholo=p_pa(i,j,k-1)/t3d(i,j,k-1) rhoinv=1./(rhohi+rholo) sumu=sumu+dp*rhoinv*(rholo*u3d(i,j,k-1)+rhohi*u3d(i,j,k)) sumv=sumv+dp*rhoinv*(rholo*v3d(i,j,k-1)+rhohi*v3d(i,j,k)) sump=sump+dp ELSE dz=hgt3d(i,j,k)-hgt3d(i,j,k-1) wlow=(hgt3d(i,j,k)-h9km)/dz u9km=u3d(i,j,k)*(1.-wlow) + u3d(i,j,k-1)*wlow v9km=v3d(i,j,k)*(1.-wlow) + v3d(i,j,k-1)*wlow p9km=p_pa(i,j,k)*(1.-wlow) + p_pa(i,j,k-1)*wlow t9km=t3d(i,j,k)*(1.-wlow) + t3d(i,j,k-1)*wlow dp=p_pa(i,j,k-1)-p9km rhohi=p9km/t9km rholo=p_pa(i,j,k-1)/t3d(i,j,k-1) rhoinv=1./(rhohi+rholo) sumu=sumu+dp*rhoinv*(rholo*u3d(i,j,k-1)+rhohi*u9km) sumv=sumv+dp*rhoinv*(rholo*v3d(i,j,k-1)+rhohi*v9km) sump=sump+dp EXIT END IF END DO ! 191 CONTINUE u9km=sumu/sump v9km=sumv/sump ! !----------------------------------------------------------------------- ! ! Storm motion estimation ! From Davies and Johns, 1993 ! "Some wind and instability parameters associated With ! strong and violent tornadoes." ! AGU Monograph 79, The Tornado...(Page 575) ! ! Becuase of the discontinuity produced by that method ! at the 15.5 m/s cutoff, their rules have been modified ! to provide a gradual transition, and accomodate all the ! data they mention in the article. ! !----------------------------------------------------------------------- ! CALL uv2ddff(u6km,v6km,dirmean,spmean) IF(spmean >= 20.0) THEN dirmean=dirmean+18. IF(dirmean > 360.) dirmean=dirmean-360. spmean=spmean*0.89 ELSE IF (spmean > 8.0) THEN whigh=(spmean - 8.0)/12. wlow =1.-whigh ddir=wlow*32.0 + whigh*18.0 perc=wlow*0.75 + whigh*0.89 dirmean=dirmean+ddir IF(dirmean > 360.) dirmean=dirmean-360. spmean=spmean*perc ELSE dirmean=dirmean+32. IF(dirmean > 360.) dirmean=dirmean-360. spmean=spmean*0.75 END IF CALL ddff2uv(dirmean,spmean,ustrm(i,j),vstrm(i,j)) ! !----------------------------------------------------------------------- ! ! Storm-relative low-level flow ! !----------------------------------------------------------------------- ! srlfl(i,j)=SQRT((ustrm(i,j)-u2km)*(ustrm(i,j)-u2km) + & (vstrm(i,j)-v2km)*(vstrm(i,j)-v2km)) ! !----------------------------------------------------------------------- ! ! Storm relative mid-level flow ! !----------------------------------------------------------------------- ! srmfl(i,j)=SQRT((ustrm(i,j)-u9km)*(ustrm(i,j)-u9km) + & (vstrm(i,j)-v9km)*(vstrm(i,j)-v9km)) ! !----------------------------------------------------------------------- ! ! Shear parameter for Bulk Richardson number ! !----------------------------------------------------------------------- ! ! print *, ' density-weight mean 0-500 m ',u500m,v500m ! print *, ' density-weight mean 0-6 km ',u6km,v6km ! brnu(i,j)=0.5*( (u6km-u500m)*(u6km-u500m) + & (v6km-v500m)*(v6km-v500m) ) ! !----------------------------------------------------------------------- ! ! Bulk Richardson number ! A limit of 200 is imposed, since this could ! go to inifinity. ! !----------------------------------------------------------------------- ! IF(brnu(i,j) > 0.) THEN brn(i,j)=cape(i,j)/brnu(i,j) brn(i,j)=AMIN1(brn(i,j),200.) ELSE brn(i,j)=200. END IF ! END DO END DO ! !----------------------------------------------------------------------- ! ! Calculate Helicity and 3km to 7km shear ! since both involve the 3km wind. ! ! For more efficient computation the Helicity is ! computed for zero storm motion and the storm ! motion is accounted for by adding a term at the end. ! This is mathematically equivalent to accounting ! for the storm motion at each level. ! !----------------------------------------------------------------------- ! DO j=1,ny-1 DO i=1,nx-1 h3km=elev(i,j)+3000. h7km=elev(i,j)+7000. ! !----------------------------------------------------------------------- ! ! Find level just above 3 km AGL ! Note, it is assumed here that there is at least ! one level between the sfc and 3 km. ! !----------------------------------------------------------------------- ! sumh=0. DO k=ksfc+1,nz-2 IF(hgt3d(i,j,k) > h3km) EXIT sumh=sumh + & ( u3d(i,j,k)*v3d(i,j,k-1) ) - & ( v3d(i,j,k)*u3d(i,j,k-1) ) END DO ! 240 CONTINUE k3km=k dz=hgt3d(i,j,k)-hgt3d(i,j,k-1) wlow=(hgt3d(i,j,k)-h3km)/dz u3km=u3d(i,j,k)*(1.-wlow) + u3d(i,j,k-1)*wlow v3km=v3d(i,j,k)*(1.-wlow) + v3d(i,j,k-1)*wlow sumh=sumh + & ( u3km*v3d(i,j,k-1) ) - & ( v3km*u3d(i,j,k-1) ) ushr=u3km-u3d(i,j,2) vshr=v3km-v3d(i,j,2) helicity(i,j)=sumh + vshr*ustrm(i,j) - ushr*vstrm(i,j) ! !----------------------------------------------------------------------- ! ! Now Find 7km wind for 3-to-7km shear ! !----------------------------------------------------------------------- ! DO k=k3km,nz-1 IF(hgt3d(i,j,k) > h7km) EXIT END DO ! 260 CONTINUE dz=hgt3d(i,j,k)-hgt3d(i,j,k-1) wlow=(hgt3d(i,j,k)-h7km)/dz u7km=u3d(i,j,k)*(1.-wlow) + u3d(i,j,k-1)*wlow v7km=v3d(i,j,k)*(1.-wlow) + v3d(i,j,k-1)*wlow shr37(i,j)=(SQRT( (u7km-u3km)*(u7km-u3km) + & (v7km-v3km)*(v7km-v3km) ))/4000. END DO END DO !----------------------------------------------------------------------- ! ! Calculate the low-level convergence ! !----------------------------------------------------------------------- ! dx=(x(2)-x(1)) dy=(y(2)-y(1)) dx2=2.*dx dy2=2.*dy DO j=2,ny-2 DO i=2,nx-2 blcon(i,j)=-1000.*( & (tem2(i+1,j)-tem2(i-1,j))/(sigma(i,j)*dx2)+ & (tem3(i,j+1)-tem3(i,j-1))/(sigma(i,j)*dy2) ) END DO END DO DO j=2,ny-2 blcon(1,j)=-1000.*( & (tem2(2,j)-tem2(1,j))/(sigma(1,j)*dx)+ & (tem3(1,j+1)-tem3(1,j-1))/(sigma(1,j)*dy2) ) blcon(nx-1,j)=-1000.*( & (tem2(nx-1,j)-tem2(nx-2,j))/(sigma(nx-1,j)*dx)+ & (tem3(nx-1,j+1)-tem3(nx-1,j-1))/(sigma(nx-1,j)*dy2) ) END DO DO i=2,nx-2 blcon(i,1)=-1000.*( & (tem2(i+1,1)-tem2(i-1,1))/(sigma(i,1)*dx2)+ & (tem3(i,2)-tem3(i,1))/(sigma(i,1)*dy) ) blcon(i,ny-1)=-1000.*( & (tem2(i+1,ny-1)-tem2(i-1,ny-1))/(sigma(i,ny-1)*dx2)+ & (tem3(i,ny-1)-tem3(i,ny-2))/(sigma(i,ny-1)*dy) ) END DO blcon(1,1)=blcon(2,2) blcon(nx-1,ny-1)=blcon(nx-2,ny-2) ! !----------------------------------------------------------------------- ! ! Smooth the output arrays ! !----------------------------------------------------------------------- ! CALL smooth9p( shr37,nx,ny,1,nx-1,1,ny-1,tem1) CALL smooth9p( ustrm,nx,ny,1,nx-1,1,ny-1,tem1) CALL smooth9p( vstrm,nx,ny,1,nx-1,1,ny-1,tem1) CALL smooth9p( srlfl,nx,ny,1,nx-1,1,ny-1,tem1) CALL smooth9p( srmfl,nx,ny,1,nx-1,1,ny-1,tem1) CALL smooth9p(helicity,nx,ny,1,nx-1,1,ny-1,tem1) CALL smooth9p( brn,nx,ny,1,nx-1,1,ny-1,tem1) CALL smooth9p( brnu,nx,ny,1,nx-1,1,ny-1,tem1) CALL smooth9p( blcon,nx,ny,1,nx-1,1,ny-1,tem1) ! RETURN END SUBROUTINE calcshr ! !################################################################## !################################################################## !###### ###### !###### FUNCTION TSA_FAST ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! FUNCTION tsa_fast(os,p),1 ! ! THIS FUNCTION RETURNS THE TEMPERATURE TSA (CELSIUS) ON A SATURATION ! ADIABAT AT PRESSURE P (MILLIBARS). OS IS THE EQUIVALENT POTENTIAL ! TEMPERATURE OF THE PARCEL (CELSIUS). SIGN(A,B) REPLACES THE ! ALGEBRAIC SIGN OF A WITH THAT OF B. ! ! BAKER,SCHLATTER 17-MAY-1982 Original version ! Modification for better convergence, Keith Brewster, Feb 1994. ! ! B IS AN EMPIRICAL CONSTANT APPROXIMATELY EQUAL TO THE LATENT HEAT ! OF VAPORIZATION FOR WATER DIVIDED BY THE SPECIFIC HEAT AT CONSTANT ! PRESSURE FOR DRY AIR. ! ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Calculate Convective Available Potential Energy (CAPE) ! in each column of ARPS grid. ! !----------------------------------------------------------------------- ! ! ! AUTHOR: Keith Brewster ! April, 1995 Based on OLAPS, hence LAPS, version of same. ! ! MODIFICATION HISTORY: ! 3/11/1996 Cleaned-up, removed OLAPS artifacts. ! !----------------------------------------------------------------------- ! REAL :: b ! PARAMETER (B=2.6518986) PARAMETER (b=2651.8986) a= os+273.15 ! ! Above 200 mb figure all the moisture is wrung-out, so ! the temperature is that which has potential temp of theta-e. ! Otherwise iterate to find combo of moisture and temp corresponding ! to thetae. ! IF( p < 200.) THEN tq=a*((p/1000.)**.286) ELSE ! D IS AN INITIAL VALUE USED IN THE ITERATION BELOW. d= 120. ! TQ IS THE FIRST GUESS FOR TSA. tq= 253.15 x = 0. ! ! ITERATE TO OBTAIN SUFFICIENT ACCURACY....SEE TABLE 1, P.8 ! OF STIPANUK (1973) FOR EQUATION USED IN ITERATION. DO i= 1,25 d= 0.5*d x_last = x x= a*EXP(-b*f_mrsat(p*100.,tq)/tq)-tq*((1000./p)**.286) IF (ABS(x) < 1E-3) GO TO 2 ! IF (x_last * x < 0.) THEN slope = (x-x_last) / (tq - tq_last) delta = - x / slope ad = AMIN1(ABS(delta),d) tq_last = tq tq = tq + SIGN(ad,delta) ELSE tq_last = tq tq= tq+SIGN(d,x) END IF END DO END IF 2 tsa_fast = tq-273.15 RETURN END FUNCTION tsa_fast ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE UV2DDFF ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE uv2ddff(u,v,dd,ff) 1 ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Calculate direction and speed from u and v. ! !----------------------------------------------------------------------- ! ! ! AUTHOR: Keith Brewster ! 3/11/1996 ! !----------------------------------------------------------------------- ! IMPLICIT NONE REAL :: u,v,dd,ff REAL :: dlon REAL :: r2deg PARAMETER (r2deg=180./3.141592654) ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! ff = SQRT(u*u + v*v) IF(v > 0.) THEN dlon=r2deg*ATAN(u/v) ELSE IF(v < 0.) THEN dlon=180. + r2deg*ATAN(u/v) ELSE IF(u >= 0.) THEN dlon=90. ELSE dlon=-90. END IF dd= dlon + 180. dd= dd-360.*(nint(dd)/360) RETURN END SUBROUTINE uv2ddff ! ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE DDFF2UV ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE ddff2uv(dd,ff,u,v) 1 ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Calculate u and v wind components from direction and speed. ! !----------------------------------------------------------------------- ! ! ! AUTHOR: Keith Brewster ! 3/11/1996 ! !----------------------------------------------------------------------- ! IMPLICIT NONE REAL :: u,v,dd,ff REAL :: arg REAL :: d2rad PARAMETER (d2rad=3.141592654/180.) ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! arg = (dd * d2rad) u = -ff * SIN(arg) v = -ff * COS(arg) RETURN END SUBROUTINE ddff2uv