! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE RDPROF ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE rdprof(nvar,nzua,mxua,jsrc,proffile, & 1,2 stnua,elevua,xua,yua,hgtua,obsua, & qualua,isrcua,nlevsua, & rmiss,nprev,ntotal,istatus) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Read ASCII file containing wind profiler data. ! !----------------------------------------------------------------------- ! ! AUTHOR: Keith Brewster ! July, 1995 ! ! MODIFICATION HISTORY: ! 9/3/96 Keith Brewster ! Added full documentation. ! ! 2/16/98 Keith Brewster ! Added jsrc, source number to the variable list ! !----------------------------------------------------------------------- ! ! INPUT : ! ! nvar Number of variables in analysis (array dimension) ! nzua Maximum number of vertical levels (array dimension) ! mxua Maximum number of UA stations (array dimension) ! jsrc Source number of data set ! proffile Name of profiler data file to read ! rmiss Missing data fill value ! nprev Number of stations read previously into UA observation ! data arrays (array index) ! ! OUTPUT : ! ! stnua station name (character*4) ! elevua station elevation (m MSL) ! xua station location x-coordinate (m) ! yua station location y-coordinate (m) ! hgtua height of data (m MSL) ! obsua observation data ! qualua observation quality indicator ! isrcua data source index ! nlevsua number of levels of data ! ntotal number of stations ! istatus status indicator ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER :: nvar,nzua,mxua ! INTEGER :: jsrc CHARACTER (LEN=132) :: proffile CHARACTER (LEN=5) :: stnua(mxua) REAL :: elevua(mxua) REAL :: xua(mxua) REAL :: yua(mxua) REAL :: hgtua(nzua,mxua) REAL :: obsua(nvar,nzua,mxua) INTEGER :: qualua(nvar,nzua,mxua) INTEGER :: isrcua(mxua) INTEGER :: nlevsua(mxua) REAL :: rmiss INTEGER :: nprev,ntotal INTEGER :: istatus ! !----------------------------------------------------------------------- ! ! Misc. local variables ! !----------------------------------------------------------------------- ! INTEGER :: ista,ivar,jlev,jend,ksta,mxprof,nprof INTEGER :: numsta REAL :: hgtdum,rlat,rlon,DIRECT,speed,ddrot ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! OPEN(12,FILE=trim(proffile),ERR=400,STATUS='old') ! mxprof=mxua-nprev ! !----------------------------------------------------------------------- ! ! Fill arrays with "missing data" indicator ! !----------------------------------------------------------------------- ! DO ista=1,mxprof DO jlev=1,nzua DO ivar=1,nvar ksta=ista+nprev obsua(ivar,jlev,ksta)=rmiss qualua(ivar,jlev,ksta)=-99 END DO END DO END DO ! !----------------------------------------------------------------------- ! ! Main data-reading loop ! !----------------------------------------------------------------------- ! DO ista=1,mxprof ksta=ista+nprev READ(12,'(i12,i12,f11.0,f15.0,f15.0,5x,a5)',ERR=250,END=250) & numsta,nlevsua(ksta),rlat,rlon,elevua(ksta),stnua(ksta) PRINT *, 'Reading Wind Profiler <', stnua(ksta), '>' ! isrcua(ksta)=jsrc CALL lltoxy(1,1,rlat,rlon,xua(ksta),yua(ksta)) ! jend=MIN(nlevsua(ksta),nzua) DO jlev=1,jend READ(12,*,ERR=250,END=250) hgtua(jlev,ksta),DIRECT,speed IF(DIRECT >= 0. .AND. speed >= 0.) THEN CALL ddrotuv(1,rlon,DIRECT,speed,ddrot, & obsua(1,jlev,ksta),obsua(2,jlev,ksta)) ! print *, ' direct,speed,u,v=',direct,speed, ! + obsua(1,jlev,ksta),obsua(2,jlev,ksta) qualua(1,jlev,ksta)=100 qualua(2,jlev,ksta)=100 END IF ! END DO ! !----------------------------------------------------------------------- ! ! Read any extra levels after nzua, but discard them. ! !----------------------------------------------------------------------- ! IF(nlevsua(ksta) > nzua) THEN WRITE(6,'(//a,a/,a,i4,a)') ' RDPROF: WARNING profiler: ', & stnua(ksta),' truncated to nzua=',nzua,' levels.' WRITE(6,'(a,i4,a)') ' Data file has ',nlevsua(ksta), & ' levels.' WRITE(6,'(a/)') ' Increase nz_ua in adas.inc' DO jlev=jend+1,nlevsua(ksta) READ(12,*,ERR=250,END=250) hgtdum,DIRECT,speed END DO nlevsua(ksta)=nzua END IF END DO ! !----------------------------------------------------------------------- ! ! End-of-file destination ! !----------------------------------------------------------------------- ! 250 CONTINUE nprof=ista-1 ntotal=nprev+nprof WRITE(6,'(a,i4,a)') ' Read ',nprof,' profiler sites' CLOSE(12) istatus=1 RETURN ! !----------------------------------------------------------------------- ! ! Error opening file destination ! !----------------------------------------------------------------------- ! 400 CONTINUE WRITE(6,'(a)') ' Error opening profiler file: ',proffile ntotal=nprev istatus=-1 RETURN END SUBROUTINE rdprof ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE RDRAOB ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE rdraob(nvar,nzua,mxua,jsrc,raobfile, & 1,3 stnua,elevua,xua,yua,hgtua,obsua, & qualua,isrcua,nlevsua, & rmiss,nprev,ntotal,istatus) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Read ASCII file containing rawinsonde observations (RAOBs). ! !----------------------------------------------------------------------- ! ! AUTHOR: Keith Brewster ! Jan, 1994 ! ! MODIFICATION HISTORY: ! 9/3/96 Keith Brewster ! Restored proper calculation of moisture variable. ! Added full documentation. ! ! 2/16/98 Keith Brewster ! Added jsrc, source number to the variable list ! !----------------------------------------------------------------------- ! ! INPUT : ! ! nvar Number of variables in analysis (array dimension) ! nzua Maximum number of vertical levels (array dimension) ! mxua Maximum number of UA stations (array dimension) ! jsrc Source number of RAOB data set ! raobfile Name of profiler data file to read ! rmiss Missing data fill value ! nprev Number of stations read previously into UA observation ! data arrays (array index) ! ! OUTPUT : ! ! stnua station name (character*4) ! elevua station elevation (m MSL) ! xua station location x-coordinate (m) ! yua station location y-coordinate (m) ! hgtua height of data (m MSL) ! obsua observation data ! qualua observation quality indicator ! isrcua data source index ! nlevsua number of levels of data ! ntotal number of stations ! istatus status indicator ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER :: nvar,nzua,mxua ! INTEGER :: jsrc CHARACTER (LEN=132) :: raobfile CHARACTER (LEN=5) :: stnua(mxua) REAL :: elevua(mxua) REAL :: xua(mxua) REAL :: yua(mxua) REAL :: hgtua(nzua,mxua) REAL :: obsua(nvar,nzua,mxua) INTEGER :: qualua(nvar,nzua,mxua) INTEGER :: isrcua(mxua) INTEGER :: nlevsua(mxua) REAL :: rmiss INTEGER :: nprev,ntotal INTEGER :: istatus ! REAL :: mbtopa PARAMETER (mbtopa=100.) ! INCLUDE 'phycst.inc' ! !----------------------------------------------------------------------- ! ! Misc. local variables ! !----------------------------------------------------------------------- ! INTEGER :: ista,ivar,jlev,jend,ksta,nraob,mxraob INTEGER :: numsta INTEGER :: nlevlast REAL :: rlat,rlon,hgtdum,press,temp,tdew,DIRECT,speed,ddrot,tdk REAL :: u1last,v1last,pr1last,pt1last,rh1last ! !----------------------------------------------------------------------- ! ! Function f_qvsat and inline directive for Cray PVP ! !----------------------------------------------------------------------- ! REAL :: f_qvsat !fpp$ expand (f_qvsat) !dir$ inline always f_qvsat !*$* inline routine (f_qvsat) ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! OPEN(12,FILE=trim(raobfile),ERR=400,STATUS='old') ! mxraob=mxua-nprev nlevlast=0 u1last=-9999. v1last=-9999. pr1last=-9999. pt1last=-9999. rh1last=-9999. ! !----------------------------------------------------------------------- ! ! Fill arrays with "missing data" indicator ! !----------------------------------------------------------------------- ! DO ista=1,mxraob DO jlev=1,nzua DO ivar=1,nvar ksta=ista+nprev obsua(ivar,jlev,ksta)=rmiss qualua(ivar,jlev,ksta)=-99 END DO END DO END DO ! !----------------------------------------------------------------------- ! ! Main data-reading loop ! !----------------------------------------------------------------------- ! ksta=nprev+1 ntotal=nprev DO ista=1, mxraob READ(12,'(i12,i12,f11.4,f15.4,f15.0,5x,a5)',ERR=250,END=250) & numsta,nlevsua(ksta),rlat,rlon,elevua(ksta),stnua(ksta) ! isrcua(ksta)=jsrc CALL lltoxy(1,1,rlat,rlon,xua(ksta),yua(ksta)) ! jend=MIN(nlevsua(ksta),nzua) DO jlev=1,jend READ(12,*,ERR=250,END=250) & hgtua(jlev,ksta),press,temp,tdew,DIRECT,speed ! !----------------------------------------------------------------------- ! ! observed u,v ! !----------------------------------------------------------------------- ! IF(DIRECT >= 0. .AND. speed >= 0.) THEN CALL ddrotuv(1,rlon,DIRECT,speed,ddrot, & obsua(1,jlev,ksta),obsua(2,jlev,ksta)) qualua(1,jlev,ksta)=100 qualua(2,jlev,ksta)=100 END IF ! !----------------------------------------------------------------------- ! ! observed press and potential temperature ! !----------------------------------------------------------------------- ! IF(press >= 0.) THEN obsua(3,jlev,ksta)=press*mbtopa qualua(3,jlev,ksta)=100 IF(temp > -99.) THEN obsua(4,jlev,ksta)= & (temp+273.15)*((p0/obsua(3,jlev,ksta))**rddcp) qualua(4,jlev,ksta)=100 END IF ! !----------------------------------------------------------------------- ! ! observed specific humidity ! !----------------------------------------------------------------------- ! IF(temp > -99. .AND. tdew > -99.) THEN tdk=tdew + 273.15 obsua(5,jlev,ksta)= & MAX(1.0E-08,f_qvsat(obsua(3,jlev,ksta),tdk)) qualua(5,jlev,ksta)=100 END IF END IF END DO ! !----------------------------------------------------------------------- ! ! Read any extra levels after nzua, but discard them. ! !----------------------------------------------------------------------- ! IF(nlevsua(ksta) > nzua) THEN WRITE(6,'(//a,a/,a,i4,a)') ' RDRAOB: WARNING rawinsonde: ', & stnua(ksta),' truncated to nzua=',nzua,' levels.' WRITE(6,'(a,i4,a)') ' Data file has ',nlevsua(ksta), & ' levels.' WRITE(6,'(a/)') ' Increase nz_ua in adas.inc' ! DO jlev=jend+1,nlevsua(ksta) READ(12,*,ERR=250,END=250) & hgtdum,press,temp,tdew,DIRECT,speed END DO nlevsua(ksta)=nzua END IF ! !----------------------------------------------------------------------- ! ! Check for duplicate sounding to to error some .snd files ! If dupe is found, do not increment ksta or ntotal counter. ! !----------------------------------------------------------------------- ! IF(nlevsua(ksta) == nlevlast .AND. obsua(1,1,ksta) == u1last .AND. & obsua(2,1,ksta) == v1last .AND. & obsua(3,1,ksta) == pr1last .AND. & obsua(4,1,ksta) == pt1last .AND. & obsua(5,1,ksta) == rh1last ) THEN WRITE(6,'(a,a)') & ' Discarding erroneous duplicate data stored for', & stnua(ksta) ELSE !wdt update WRITE(6,'(a,i5,2A)') ' Read', nlevsua(ksta), & ' levels of data from radiosonde station ', TRIM(stnua(ksta)) nlevlast=nlevsua(ksta) u1last=obsua(1,1,ksta) v1last=obsua(2,1,ksta) pr1last=obsua(3,1,ksta) pt1last=obsua(4,1,ksta) rh1last=obsua(5,1,ksta) ksta=ksta+1 ntotal=ntotal+1 END IF END DO ! !----------------------------------------------------------------------- ! ! End-of-file destination ! !----------------------------------------------------------------------- ! 250 CONTINUE nraob=ntotal-nprev CLOSE(12) RETURN ! !----------------------------------------------------------------------- ! ! Error opening file destination ! !----------------------------------------------------------------------- ! 400 CONTINUE WRITE(6,'(a)') ' Error opening raob file: ',raobfile ntotal=nprev RETURN END SUBROUTINE rdraob