!
!##################################################################
!##################################################################
!###### ######
!###### 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