!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE PREPRETR ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE prepretr(nx,ny,nz,nvar, & 1,2
nzret,mxret,mxcolret,mxztab,nsrcret, &
nretfil,fretname, &
isrcret,srcret,nlvrttab,qsrcret,hrtqsrc, &
stnret,latret,lonret,elvret, &
latretc,lonretc,xretc,yretc,iret,nlevret, &
hgtretc,obsret,qrret,qobsret,qualret, &
rmiss,ncolret,tem1,istatus)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Control reading columns of data from the ARPS temperaturea
! and velocity retrieval routines.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Keith Brewster, CAPS
! April, 1996
!
! MODIFICATION HISTORY:
!
!-----------------------------------------------------------------------
!
! Variable Declarations:
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INTEGER :: nx,ny,nz,nvar
INTEGER :: nzret,mxret,mxcolret,mxztab,nsrcret
!
INTEGER :: nretfil
CHARACTER (LEN=132) :: fretname(nretfil)
INTEGER :: isrcret(0:mxret)
CHARACTER (LEN=8) :: srcret(mxret)
INTEGER :: nlvrttab(nsrcret)
REAL :: qsrcret(nvar,mxztab,nsrcret)
REAL :: hrtqsrc(mxztab,nsrcret)
CHARACTER (LEN=5) :: stnret(mxret)
REAL :: latret(mxret)
REAL :: lonret(mxret)
REAL :: elvret(mxret)
REAL :: latretc(mxcolret)
REAL :: lonretc(mxcolret)
REAL :: xretc(mxcolret)
REAL :: yretc(mxcolret)
INTEGER :: iret(mxcolret)
INTEGER :: nlevret(mxcolret)
REAL :: hgtretc(nzret,mxcolret)
REAL :: obsret(nvar,nzret,mxcolret)
REAL :: qrret(nzret,mxcolret)
REAL :: qobsret(nvar,nzret,mxcolret)
INTEGER :: qualret(nvar,nzret,mxcolret)
REAL :: rmiss
INTEGER :: ncolret
REAL :: tem1(nx,ny,nz)
INTEGER :: istatus
!
!-----------------------------------------------------------------------
!
! Misc. local variables
!
!-----------------------------------------------------------------------
!
INTEGER :: ista,ilev,ivar,isrc,ktab
REAL :: wthi,wtlo
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
DO ista=1,mxcolret
iret(ista)=0
DO ilev=1,nzret
DO ivar=1,nvar
obsret(ivar,ilev,ista)=rmiss
qobsret(ivar,ilev,ista)=999999.
qualret(ivar,ilev,ista)=0
END DO
END DO
END DO
!
CALL rdretcol
(nx,ny,nz,nvar, &
mxret,nzret,mxcolret,nretfil,fretname, &
srcret,isrcret(1),stnret,latret,lonret,elvret, &
latretc,lonretc,iret,nlevret,hgtretc,obsret,qrret, &
ncolret,istatus,tem1)
!
!-----------------------------------------------------------------------
!
! Get x and y locations of each retrieval column
!
!-----------------------------------------------------------------------
!
CALL lltoxy
(ncolret,1,latretc,lonretc,xretc,yretc)
!
!-----------------------------------------------------------------------
!
! Set qobs based on source and height
!
!-----------------------------------------------------------------------
!
DO ista=1,ncolret
IF(iret(ista) > 0) THEN
isrc=isrcret(iret(ista))
DO ilev=1,nlevret(ista)
DO ktab=2,nlvrttab(isrc)-1
IF(hrtqsrc(ktab,isrc) > hgtretc(ilev,ista)) EXIT
END DO
! 226 CONTINUE
wthi= (hgtretc(ilev,ista)-hrtqsrc(ktab-1,isrc))/ &
(hrtqsrc(ktab,isrc)-hrtqsrc(ktab-1,isrc))
wthi=AMAX1(wthi,0.0)
wthi=AMIN1(wthi,1.0)
wtlo=1.0-wthi
DO ivar=1,nvar
qobsret(ivar,ilev,ista)= &
wthi*qsrcret(ivar,ktab, isrc) + &
wtlo*qsrcret(ivar,ktab-1,isrc)
IF(obsret(ivar,ilev,ista) > -999.) qualret(ivar,ilev,ista)=10
END DO
END DO
END IF
END DO
RETURN
END SUBROUTINE prepretr
!
SUBROUTINE retmcro(nx,ny,nz, & 1
mx_ret,nsrc_ret,nvar_anx,nz_ret,mx_colret, &
srcret,isrcret,iret,nlevret, &
xretc,yretc,hgtretc,qrret,ncolret, &
dzfill, &
xs,ys,zs,qr)
IMPLICIT NONE
INTEGER :: nx,ny,nz
INTEGER :: mx_ret,nsrc_ret,nvar_anx,nz_ret,mx_colret
!
!-----------------------------------------------------------------------
!
! Retrieval observation variables
!
!-----------------------------------------------------------------------
!
CHARACTER (LEN=8) :: srcret(nsrc_ret)
INTEGER :: isrcret(0:mx_ret)
INTEGER :: iret(mx_colret)
INTEGER :: nlevret(mx_colret)
REAL :: xretc(mx_colret)
REAL :: yretc(mx_colret)
REAL :: hgtretc(nz_ret,mx_colret)
REAL :: qrret(nz_ret,mx_colret)
!
INTEGER :: ncolret
REAL :: dzfill
!
REAL :: xs(nx)
REAL :: ys(ny)
REAL :: zs(nx,ny,nz)
REAL :: qr(nx,ny,nz)
!
!-----------------------------------------------------------------------
!
! Misc. local variables
!
!-----------------------------------------------------------------------
!
INTEGER :: i,j,k,icol,jret
INTEGER :: klow,knex,klast
REAL :: dx,dy,dstlim2,dist,qrlow,qrintr
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
dx=xs(2)-xs(1)
dy=ys(2)-ys(1)
dstlim2=0.95*(dx*dx+dy*dy)
!
!-----------------------------------------------------------------------
!
! For each horizontal grid point, use retrieval columns within
! the threshold distance defined by dstlim2 to set clouds and rain.
!
!-----------------------------------------------------------------------
!
DO j=1,ny-1
DO i=1,nx-1
DO icol=1,ncolret
jret=iret(icol)
IF(isrcret(jret) > 0) THEN
dist=((xretc(icol)-xs(i))*(xretc(icol)-xs(i)) + &
(yretc(icol)-ys(j))*(yretc(icol)-ys(j)))
IF(dist < dstlim2) THEN
DO klow=1,nlevret(icol)
IF(qrret(klow,icol) > 0.) GO TO 451
END DO
CYCLE
451 CONTINUE
!
!-----------------------------------------------------------------------
!
! Found a postive qr in retrieval data column.
!
!-----------------------------------------------------------------------
!
480 CONTINUE
DO k=1,nz-1
IF(zs(i,j,k) >= hgtretc(klow,icol)) GO TO 501
END DO
CYCLE
501 CONTINUE
qr(i,j,k)=MAX(qr(i,j,k),qrret(klow,icol))
qrlow=qrret(klow,icol)
klast=k
!
!-----------------------------------------------------------------------
!
! Find next positive qr in retrieval data column.
!
!-----------------------------------------------------------------------
!
520 CONTINUE
DO knex=klow+1,nlevret(icol)
IF(qrret(klow,icol) > 0.) GO TO 551
END DO
CYCLE
551 CONTINUE
!
!-----------------------------------------------------------------------
!
! Found another positive qr, so determine which
! ARPS grid points are affected. Either
! 1) Fill from the previous reflectivity level ..or..
! 2) Set a new klow and klast and treat as if this were
! the first point for this column.
!
!-----------------------------------------------------------------------
!
IF((hgtretc(knex,icol)-hgtretc(klow,icol)) < &
dzfill) THEN
DO k=klast+1,nz-1
IF(zs(i,j,k) <= hgtretc(knex,icol)) THEN
qrintr=(qrret(knex,icol)-qrlow) &
/(hgtretc(knex,icol)-hgtretc(klow,icol)) &
*(zs(i,j,k)-hgtretc(klow,icol)) &
+qrlow
qr(i,j,k)=MAX(qr(i,j,k),qrintr)
klast=k
ELSE
GO TO 601
END IF
END DO
CYCLE
601 CONTINUE
qrlow=qrret(knex,icol)
klow=knex
GO TO 520
ELSE
qrlow=qrret(knex,icol)
klow=knex
GO TO 480
END IF
END IF
END IF
END DO
END DO
END DO
RETURN
END SUBROUTINE retmcro