!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE UNFNQC ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE unfnqc(maxgate,maxazim,ngate,nazim, &,8
lvlprof,zsnd,usnd,vsnd,rfrsnd, &
bkgopt,shropt,rfropt,gsp_vel,rfirst, &
rdrlat,rdrlon,rdralt, &
rvel,spw,elev,azim,vnyq, &
unfvel,bkgvel,bgate,egate,tmp1)
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Unfold and Quality Control Doppler radial velocities.
!
! AUTHOR:
! Keith Brewster, Center for Analysis and Prediction of Storms
!
! MODIFICATION HISTORY:
! Nov. 2000, First Version
! Oct. 2001, Updated and added spectrum width and std dev thresholding
! Jan 2002, Modified to check vs background wind first, added switches
! for comparison to background and for shear checking
!
!-----------------------------------------------------------------------
!
! INPUT :
!
! maxgate Maximum number of gates in a radial
! maxazim Maximum number of radials in a tilt
! ngate Number of gates in radial
! nazim Number of radials
! lvlprof Number of levels in background wind profile
! zsnd Height (m MSL) of winds in background wind profile
! usnd U wind component in background wind profile
! vsnd V wind component in background wind profile
! rfrsnd Refractivity from background temp and moisture profile
! bkgopt Option to check data vs. a background profile (0:no,1:yes)
! shropt Option to check data using local shear check (0:no,1:yes)
! gsp_vel Velocity gate spacing (m)
! rfirst Range to first gate (m)
! rdrlat Latitude (degrees N) of radar
! rdrlon Longitude (degrees E) of radar
! rdralt Altitude (m MSL) of radar
! rvel Doppler radial velocity
! spw Doppler spectrum width
! elev Elevation angle
! azim Azimuth
! vnyq Nyquist velocity
!
! OUTPUT:
! unfvel Unfolded Doppler radial velocity
!
! WORK ARRAYS:
! bkgvel Radial velocity of background wind
! bgate Counter to first valid gate in each ray
! bgate Counter to last valid gate in each ray
! tmp1 Quality/Missing indicator
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
!
INTEGER, INTENT(IN) :: maxgate
INTEGER, INTENT(IN) :: maxazim
INTEGER, INTENT(IN) :: ngate
INTEGER, INTENT(IN) :: nazim
INTEGER, INTENT(IN) :: lvlprof
REAL, INTENT(IN) :: zsnd(lvlprof)
REAL, INTENT(IN) :: usnd(lvlprof)
REAL, INTENT(IN) :: vsnd(lvlprof)
REAL, INTENT(IN) :: rfrsnd(lvlprof)
INTEGER, INTENT(IN) :: bkgopt
INTEGER, INTENT(IN) :: shropt
INTEGER, INTENT(IN) :: rfropt
INTEGER, INTENT(IN) :: gsp_vel
INTEGER, INTENT(IN) :: rfirst
REAL, INTENT(IN) :: rvel(maxgate,maxazim)
REAL, INTENT(IN) :: spw(maxgate,maxazim)
REAL, INTENT(IN) :: elev(maxazim)
REAL, INTENT(IN) :: azim(maxazim)
REAL, INTENT(IN) :: vnyq
REAL, INTENT(IN) :: rdrlat
REAL, INTENT(IN) :: rdrlon
REAL, INTENT(IN) :: rdralt
REAL, INTENT(OUT) :: unfvel(maxgate,maxazim)
REAL, INTENT(OUT) :: bkgvel(maxgate,maxazim)
INTEGER, INTENT(OUT) :: bgate(maxazim)
INTEGER, INTENT(OUT) :: egate(maxazim)
REAL, INTENT(OUT) :: tmp1(maxgate,maxazim)
!
!-----------------------------------------------------------------------
!
! Misc local variables
!
!-----------------------------------------------------------------------
INTEGER :: i,iray,jray,kray,eray
INTEGER :: js1,js2,jstart
INTEGER :: igate,kgate,kkgate
INTEGER :: bkgate,ekgate,lgate,kgate1,kgate2
INTEGER :: k,kh,kclose,kstart,kend
INTEGER :: knt,knt1,knt2,kntall,kntgood,kntfold,kntrej
INTEGER :: istatwrt,rem_points,found,nhlfazim
INTEGER :: igmin,igmax,irayd
REAL :: bknt,fknt,tknt,tpoint
REAL :: twonyq,inv2nyq,thrpri,thrpr2
REAL :: dbkvel,sum,vavg,rvwgt,tstdev,tstvel,sum1,vavg1,range
REAL :: uvel,vvel,bkrvel
REAL :: hlfbeam,elvtop,elvbot,hgtagl,hgttop,hgtbot,hgtmsl
REAL :: refvel,elevavg,sfcr
REAL :: dtr,umean,vmean,veloc,xcomp,ycomp,dotp,dotmin
REAL :: diff,shdiff,shdif2,shdif3,azdiff,azd,azd1,azd2,azd3,azim2
REAL :: rngfrst,gatesp
REAL :: hgtmin,hgtmax
!
!-----------------------------------------------------------------------
!
! Constants
!
!-----------------------------------------------------------------------
!
REAL, PARAMETER :: rvchek = -200.
REAL, PARAMETER :: spwflag = -931.
REAL, PARAMETER :: beamwid = 1.0
REAL, PARAMETER :: bkgwgt = 0.33
REAL, PARAMETER :: eradius = 6371000.
INTEGER, PARAMETER :: lukbak = 20
INTEGER, PARAMETER :: lukbak2 = 25
INTEGER, PARAMETER :: lukfwd2 = 25
INTEGER, PARAMETER :: lukbakr = 20
CHARACTER (LEN=6) :: varid
CHARACTER (LEN=20):: varname
CHARACTER (LEN=20):: varunits = 'm/s'
!
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------
INCLUDE 'globcst.inc'
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
kntall=0
kntgood=0
kntfold=0
kntrej=0
twonyq = 2.0*vnyq
inv2nyq = 1./twonyq
thrpri = min(max((0.5*vnyq),10.),vnyq)
thrpr2 = min(vnyq,(1.5*thrpri))
hlfbeam=0.5*beamwid
rvwgt=1.0-bkgwgt
dtr=atan(1.)/45.
rngfrst=float(rfirst)
gatesp=float(gsp_vel)
nhlfazim=(nazim/2)+1
!
!-----------------------------------------------------------------------
!
! Apply Spectrum width thresholding
!
!-----------------------------------------------------------------------
!
CALL SPWTHR
(maxgate,maxazim, &
ngate,nazim,rvchek,spwflag,vnyq,rvel,spw)
!
!-----------------------------------------------------------------------
!
! Set up tmp1 to be a quality array. 1=good 0=bad/missing
!
!-----------------------------------------------------------------------
!
igmin=ngate/2
igmax=igmin+1
!
DO iray=1,maxazim
bgate(iray)=1
egate(iray)=1
END DO
DO iray=1,maxazim
DO igate=1,maxgate
tmp1(igate,iray)=0.
bkgvel(igate,iray)=0.
END DO
END DO
!
DO iray=1,nazim
bgate(iray)=0
DO igate=1,ngate
unfvel(igate,iray)=rvel(igate,iray)
IF( rvel(igate,iray) > rvchek) THEN
tmp1(igate,iray)=1.
egate(iray)=igate
IF(bgate(iray) == 0) bgate(iray)=igate
END IF
END DO
bgate(iray)=max(bgate(iray),1)
igmin=min(igmin,bgate(iray))
igmax=max(igmax,egate(iray))
END DO
!
elevavg=0.
DO iray=1,nazim
elevavg=elevavg+elev(iray)
END DO
elevavg=elevavg/float(nazim)
WRITE(6,'(a,f10.2)') ' Average Elevation Angle: ',elevavg
!
!-----------------------------------------------------------------------
!
! Determine mean environmental wind in layer observed by radar.
! Used to determine starting radial for unfolding.
!
!-----------------------------------------------------------------------
!
range=rngfrst+(igmin-1)*gatesp
CALL beamhgtn
(lvlprof,zsnd,rfrsnd,rdralt,rfropt,elevavg,range, &
hgtmin,sfcr)
hgtmin=hgtmin+rdralt
!
range=rngfrst+(igmax-1)*gatesp
CALL beamhgtn
(lvlprof,zsnd,rfrsnd,rdralt,rfropt,elevavg,range, &
hgtmax,sfcr)
hgtmax=hgtmax+rdralt
!
write(6,'(a,f12.2,f12.2)') ' Height range (MSL): ',hgtmin,hgtmax
!
knt=0
umean=0.
vmean=0.
DO k=1,lvlprof
IF(zsnd(k) > hgtmax ) EXIT
IF(zsnd(k) > hgtmin ) THEN
knt=knt+1
umean=umean+usnd(k)
vmean=vmean+vsnd(k)
END IF
END DO
knt=max(knt,1)
umean=umean/float(knt)
vmean=vmean/float(knt)
write(6,'(a,f12.2,a,f12.2)') &
' Mean velocity, umean: ',umean,' vmean: ',vmean
veloc=sqrt(umean*umean+vmean*vmean)
IF(veloc > 0.0) THEN
umean=umean/veloc
vmean=vmean/veloc
END IF
!
!-----------------------------------------------------------------------
!
! Find observed radial with direction most perpendicular to the mean wind.
! Smallest dot product between mean wind and azimuth vector.
!
!-----------------------------------------------------------------------
!
dotmin=99999.
js1=1
DO iray=1,nazim
xcomp=sin(dtr*azim(iray))
ycomp=cos(dtr*azim(iray))
dotp=abs(umean*xcomp+vmean*ycomp)
IF( dotp < dotmin) THEN
dotmin=dotp
js1=iray
END IF
END DO
!
write(6,'(a,i6,f12.2)') &
' Most perpendicular radial: ',js1,azim(js1)
!
! Next find the radial opposite of this (+/-180)
!
azim2=azim(js1)+180.
IF(azim2 > 360.) azim2=azim2-360.
azdiff=180.
js2=js1
DO iray=1,nazim
azd1=abs(azim(iray)-azim2)
azd2=abs(azim(iray)-azim2+360.)
azd3=abs(azim(iray)-azim2-360.)
azd=min(azd1,azd2,azd3)
IF( azd < azdiff ) THEN
azdiff=azd
js2=iray
END IF
END DO
!
write(6,'(a,i6,f12.2)') &
' Opposite radial: ',js2,azim(js2)
!
! Find which zone around js1 or js2 has the most valid data.
! This is the best place to start
!
knt1=0
knt2=0
DO iray=1,nazim
irayd=abs(iray-js1)
IF ( irayd < 6 ) THEN
DO igate=bgate(iray),egate(iray)
IF(tmp1(igate,iray) > 0.) knt1=knt1+1
END DO
END IF
irayd=abs(iray-js2)
IF ( irayd < 6 ) THEN
DO igate=bgate(iray),egate(iray)
IF(tmp1(igate,iray) > 0.) knt2=knt2+1
END DO
END IF
END DO
!
write(6,'(a,i6,a,i6)') &
' Data count js1: ',knt1,' Data count js2: ',knt2
IF( knt2 > knt1 ) THEN
jstart=js2
ELSE
jstart=js1
END IF
!
!-----------------------------------------------------------------------
!
! Determine background radial velocity at each valid data point.
!
!-----------------------------------------------------------------------
!
DO iray=1,nazim
DO igate=bgate(iray),egate(iray)
IF( tmp1(igate,iray) > 0. ) THEN
range=rngfrst+(igate-1)*gatesp
CALL beamhgtn
(lvlprof,zsnd,rfrsnd,rdralt,rfropt, &
elev(iray),range,hgtagl,sfcr)
hgtmsl=hgtagl+rdralt
elvtop=elev(iray)+hlfbeam
CALL beamhgtn
(lvlprof,zsnd,rfrsnd,rdralt,rfropt, &
elvtop,range,hgtagl,sfcr)
hgttop=hgtagl+rdralt
hgttop=max(hgttop,(hgtmsl+200.))
elvbot=elev(iray)-hlfbeam
CALL beamhgtn
(lvlprof,zsnd,rfrsnd,rdralt,rfropt, &
elvbot,range,hgtagl,sfcr)
hgtbot=hgtagl+rdralt
hgtbot=min(hgtbot,(hgtmsl-200.))
knt=0
uvel=0.
vvel=0.
DO k=1,lvlprof
IF( zsnd(k) > hgtbot .AND. zsnd(k) < hgttop ) THEN
knt=knt+1
uvel=uvel+usnd(k)
vvel=vvel+vsnd(k)
END IF
IF (zsnd(k) > hgttop) EXIT
END DO
IF(knt > 0) THEN
uvel=uvel/float(knt)
vvel=vvel/float(knt)
CALL uv2vr
(range,elev(iray),azim(iray), &
rdrlat,rdrlon,rdralt, &
uvel,vvel,bkgvel(igate,iray))
ELSE
diff = 99999.0
DO k=1,lvlprof
IF( abs(zsnd(k)-hgtmsl) < diff ) THEN
diff = abs(zsnd(k)-hgtmsl)
kclose = k
END IF
END DO
CALL uv2vr
(range,elev(iray),azim(iray), &
rdrlat,rdrlon,rdralt, &
usnd(kclose),vsnd(kclose),bkgvel(igate,iray))
END IF
END IF
END DO
END DO
!
!-----------------------------------------------------------------------
!
! Checking of data vs background radial velocity
!
!-----------------------------------------------------------------------
!
IF( bkgopt > 0 ) THEN
write(6,'(a,i4)') &
' Unfolding using background wind profile, bkgopt=',bkgopt
DO iray=1,nazim
DO igate=bgate(iray),egate(iray)
IF( tmp1(igate,iray) > 0. ) THEN
kntall=kntall+1
tstdev=twonyq* &
NINT((bkgvel(igate,iray)-rvel(igate,iray))*inv2nyq)
tstvel=rvel(igate,iray)+tstdev
IF(abs(tstdev) > 0.) THEN
kntfold=kntfold+1
ELSE
kntgood = kntgood+1
END IF
unfvel(igate,iray)=tstvel
END IF
END DO
END DO
write(6,'(/a/,a/,3i12)') &
' Comparison to background wind profile:', &
' Gates Good-Gates Folded', &
kntall,kntgood,kntfold
END IF ! bkgopt > 0
!
!-----------------------------------------------------------------------
!
! Apply gate-to-gate shear checking for velocity folding.
! Follows Eilts and Smith, 1989, JTech, 118.
! Loop forward from jstart
!
!-----------------------------------------------------------------------
!
IF (shropt > 0 ) THEN
write(6,'(a,i4)') &
' Unfolding using local shear check, shropt=',shropt
write(6,'(a,i6,f12.2)') &
' Shear-based unfolding will start at: ',jstart,azim(jstart)
kntall = 0
kntgood = 0
kntfold = 0
kntrej = 0
DO i=1,nhlfazim
iray=(jstart+i)-1
IF(iray > nazim) iray=((jstart+i)-1)-nazim
DO igate=bgate(iray),egate(iray)
IF( tmp1(igate,iray) > 0. ) THEN
dbkvel=unfvel(igate,iray)-bkgvel(igate,iray)
kntall=kntall+1
lgate = 0
IF(igate > bgate(iray)) THEN
ekgate = max(bgate(iray),igate-lukbak)
DO kgate = igate-1,ekgate,-1
IF(tmp1(kgate,iray) >0. ) THEN
lgate = kgate
EXIT
END IF
END DO
END IF
IF(lgate >0) THEN
refvel = unfvel(lgate,iray)-bkgvel(lgate,iray)
ELSE
refvel = 999.
END IF
shdiff=abs(dbkvel-refvel)
IF(shdiff > thrpri) THEN
sum=0.
bknt=0.
IF(igate > bgate(iray)) THEN
ekgate=min(max((igate-lukbak2),bgate(iray)),(igate-1))
DO kgate=igate-1,ekgate,-1
bknt=bknt+tmp1(kgate,iray)
sum=sum+tmp1(kgate,iray)* &
(unfvel(kgate,iray)-bkgvel(kgate,iray))
IF (bknt > 2. ) EXIT
END DO
END IF
fknt=0.
eray=max((iray-lukbakr),1)
DO kray=iray-1,eray,-1
ekgate=min((igate+lukfwd2),egate(kray))
DO kgate=igate,ekgate
fknt=fknt+tmp1(kgate,kray)
sum=sum+tmp1(kgate,kray)* &
(unfvel(kgate,kray)-bkgvel(kgate,kray))
IF ( fknt > 4. ) EXIT
END DO
END DO
tknt=bknt+fknt
IF( tknt > 0. ) THEN
vavg=(rvwgt*sum/tknt)+bkgvel(igate,iray)
shdif2=abs(unfvel(igate,iray)-vavg)
IF( shdif2 < thrpr2 ) THEN
kntgood=kntgood+1
ELSE
tstdev=twonyq*NINT((vavg-unfvel(igate,iray))*inv2nyq)
tstvel=unfvel(igate,iray)+tstdev
shdif3=abs(tstvel-vavg)
IF( shdif3 < thrpr2 ) THEN
IF( abs(tstdev) > 0. ) THEN
kntfold=kntfold+1
! write(6,'(a,f10.1,a,f10.1,a,f10.1)') &
! ' Unfold: Meas=',unfvel(igate,iray),' Avgvel=', &
! vavg,' New=',tstvel
unfvel(igate,iray)=tstvel
ELSE
kntgood=kntgood+1
END IF
ELSE
kntrej=kntrej+1
unfvel(igate,iray)=-777.
tmp1(igate,iray)=0.
END IF
END IF ! unfvel-vavg >thresh
END IF
ELSE
kntgood=kntgood+1
END IF !(unfvel(igate,iray) - refvel) > thrpri
END IF ! tmp1(igate,iray) > 0.
END DO
END DO
!
!-----------------------------------------------------------------------
!
! Apply gate-to-gate shear checking for velocity folding.
! Loop backward from jstart-1
!
!-----------------------------------------------------------------------
!
DO i=1,nhlfazim
iray=(jstart-i)+1
IF(iray <= 0) iray=(jstart-i)+nazim
DO igate=bgate(iray),egate(iray)
IF( tmp1(igate,iray) > 0. ) THEN
dbkvel=unfvel(igate,iray)-bkgvel(igate,iray)
kntall=kntall+1
lgate = 0
IF(igate > bgate(iray)) THEN
ekgate = max((igate-lukbak),bgate(iray))
DO kgate = igate-1,ekgate,-1
IF(tmp1(kgate,iray) >0. ) THEN
lgate = kgate
EXIT
END IF
END DO
END IF
IF(lgate > 0) THEN
refvel = unfvel(lgate,iray)-bkgvel(lgate,iray)
ELSE
refvel = 999.
END IF
shdiff=abs(dbkvel-refvel)
IF( shdiff > thrpri) THEN
sum=0.
fknt=0.
bknt=0.
IF(igate > bgate(iray)) THEN
ekgate=max((igate-lukbak2),bgate(iray))
DO kgate=igate-1,ekgate,-1
bknt=bknt+tmp1(kgate,iray)
sum=sum+tmp1(kgate,iray)* &
(unfvel(kgate,iray)-bkgvel(kgate,iray))
IF (bknt > 2. ) EXIT
END DO
END IF
eray=min((iray+lukbakr),nazim)
DO kray=iray+1,eray
ekgate=min((igate+lukfwd2),egate(kray))
DO kgate=igate,ekgate
fknt=fknt+tmp1(kgate,kray)
sum=sum+tmp1(kgate,kray)* &
(unfvel(kgate,kray)-bkgvel(kgate,kray))
IF ( fknt > 4. ) EXIT
END DO
END DO
tknt=bknt+fknt
IF(tknt > 0. ) THEN
vavg=(rvwgt*sum/tknt)+bkgvel(igate,iray)
shdif2=abs(unfvel(igate,iray)-vavg)
IF( shdif2 < thrpr2 ) THEN
kntgood=kntgood+1
ELSE
tstdev=twonyq*NINT((vavg-unfvel(igate,iray))*inv2nyq)
tstvel=unfvel(igate,iray)+tstdev
shdif3=(unfvel(igate,iray)-vavg)
IF( shdif3 < thrpr2 ) THEN
IF( abs(tstdev) > 0. ) THEN
kntfold=kntfold+1
! write(6,'(a,f10.1,a,f10.1,a,f10.1)') &
! ' Unfold: Meas=',unfvel(igate,iray),' Avgvel=', &
! vavg,' New=',tstvel
unfvel(igate,iray)=tstvel
ELSE
kntgood=kntgood+1
END IF
ELSE
kntrej=kntrej+1
! write(8,'(a,i5,a,i5,a,f10.1,a,f10.1,a,f10.1,a,f10.1)') &
! 'igate=',igate,'iray=',iray, &
! ' Reject: Meas=',unfvel(igate,iray),' Avgvel=', &
! vavg,' Try=',tstvel,'vnyq=',vnyq
unfvel(igate,iray)=-777.
tmp1(igate,iray)=0.
END IF ! tstvel-vavg >thresh
END IF ! unfvel-vavg >thresh
END IF ! tknt > 0
ELSE
kntgood=kntgood+1
END IF !(unfvel(igate,iray) - refvel) > thrpri
END IF ! tmp1(igate,iray) > 0.
END DO
END DO
write(6,'(/a/,a/,4i12)') &
' After shear consistency check', &
' Gates Passed Check Folded Rejected', &
kntall,kntgood,kntfold,kntrej
END IF ! shropt > 0
RETURN
END SUBROUTINE unfnqc
!
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE DESPEKL ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE DESPEKL(maxgate,maxazim, & 3
ngate,nazim,varchek,rdata,tmp)
!
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Despeckle radar data.
! Can be used for reflectivity or velocity.
!
!
! AUTHOR: Keith Brewster
!
! MODIFICATION HISTORY:
!
!
!-----------------------------------------------------------------------
!
! INPUT:
! maxgate Maximum number of gates in a radial
! maxazim Maximum number of radials in a tilt
! ngate Number of gates in radial
! nazim Number of radials
! varchek Threshold to determine good data vs. flagged
! rdata Doppler radial velocity
!
! OUTPUT:
! rdata
!
! WORK ARRAYS:
!
! tmp
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
INTEGER, INTENT(IN) :: maxgate
INTEGER, INTENT(IN) :: maxazim
INTEGER, INTENT(IN) :: ngate
INTEGER, INTENT(IN) :: nazim
REAL, INTENT(IN) :: varchek
REAL, INTENT(INOUT) :: rdata(maxgate,maxazim)
REAL, INTENT(OUT) :: tmp(maxgate,maxazim)
!
!-----------------------------------------------------------------------
!
! Misc. local variables
!
!-----------------------------------------------------------------------
!
INTEGER :: i,j
INTEGER :: kntgd,kntdsp
!
REAL :: sum,pctdsp
REAL, PARAMETER :: dspmiss = -991.
!
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!
!-----------------------------------------------------------------------
!
! Create temporary array where tmp=1 if non-missing tmp=0 if missing
!
!-----------------------------------------------------------------------
!
!
tmp=0.
DO j=1,nazim
DO i=1,ngate
IF ( rdata(i,j) > varchek ) tmp(i,j)=1.
END DO
END DO
!
!-----------------------------------------------------------------------
!
! If datum has fewer than 3 non-missing neighbors in a 3x3
! square template set it to missing
!
!-----------------------------------------------------------------------
!
kntgd=0
kntdsp=0
DO j=2,nazim-1
DO i=2,ngate-1
IF(rdata(i,j) > varchek ) THEN
kntgd=kntgd+1
sum=tmp(i-1,j+1)+tmp(i,j+1)+tmp(i+1,j+1) &
+tmp(i-1,j )+ tmp(i+1,j) &
+tmp(i-1,j-1)+tmp(i,j-1)+tmp(i+1,j-1)
IF( sum < 3. ) THEN
kntdsp=kntdsp+1
rdata(i,j) = dspmiss
END IF
END IF
END DO
END DO
IF(kntgd > 0 ) THEN
pctdsp=100.*(float(kntdsp)/float(kntgd))
ELSE
pctdsp=0.
END IF
write(6,'(a,i8,a,i8,a,f6.1,a)') &
' Despeckled ',kntdsp,' of ',kntgd,' data =',pctdsp,' percent.'
!
RETURN
!
END SUBROUTINE despekl
!
!##################################################################
!##################################################################
!###### ######
!###### SUBROUTINE SPWTHR ######
!###### ######
!###### Developed by ######
!###### Center for Analysis and Prediction of Storms ######
!###### University of Oklahoma ######
!###### ######
!##################################################################
!##################################################################
!
SUBROUTINE SPWTHR(maxgate,maxazim, & 1
ngate,nazim,rvchek,spwflag,vnyq,rvel,spw)
!
!-----------------------------------------------------------------------
!
!-----------------------------------------------------------------------
!
! PURPOSE:
!
! Threshold radial velocity data based on spectrum width.
!
!-----------------------------------------------------------------------
!
! AUTHOR: Keith Brewster
!
! MODIFICATION HISTORY:
!
!-----------------------------------------------------------------------
!
! INPUT :
!
! maxgate Maximum number of gates in a radial
! maxazim Maximum number of radials in a tilt
! ngate Number of gates in radial
! nazim Number of radials
! rvchek Threshold for good data vs. flagged
! spwflag Flag for spectrum width threshold fail
! vnyq Nyquist velocity
! rvel Doppler radial velocity
! spw Doppler spectrum width
!
! OUTPUT:
! rvel Doppler radial velocity
!
!
! WORK ARRAYS:
!
!
!-----------------------------------------------------------------------
!
! Variable Declarations.
!
!-----------------------------------------------------------------------
!
IMPLICIT NONE
!
INTEGER, INTENT(IN) :: maxgate
INTEGER, INTENT(IN) :: maxazim
INTEGER, INTENT(IN) :: ngate
INTEGER, INTENT(IN) :: nazim
REAL, INTENT(IN) :: rvchek
REAL, INTENT(IN) :: spwflag
REAL, INTENT(IN) :: vnyq
REAL, INTENT(INOUT) :: rvel(maxgate,maxazim)
REAL, INTENT(IN) :: spw(maxgate,maxazim)
!
!-----------------------------------------------------------------------
!
! Misc. local variables:
!
!-----------------------------------------------------------------------
!
REAL :: spthrat = 0.67
REAL :: spthr
INTEGER :: i,j
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!
!-----------------------------------------------------------------------
!
! If spectrum width is greater than threshold, set to missing
!
!-----------------------------------------------------------------------
!
spthr=spthrat*vnyq
DO j=1,nazim
DO i=1,ngate
IF(rvel(i,j) > rvchek .AND. spw(i,j) > spthr ) rvel(i,j) = spwflag
END DO
END DO
!
RETURN
!
END SUBROUTINE spwthr