!
!##################################################################
!##################################################################
!######                                                      ######
!######               SUBROUTINE SET_LBCOPT                  ######
!######                                                      ######
!######                     Developed by                     ######
!######     Center for Analysis and Prediction of Storms     ######
!######                University of Oklahoma                ######
!######                                                      ######
!##################################################################
!##################################################################
!

SUBROUTINE set_lbcopt(lbcnew)
!
!-----------------------------------------------------------------------
!
!  PURPOSE:
!
!  An interface to access bndry.inc commons from c routines.
!  Allows program to reset lbcopt to save memory in call
!  to initgrdvar when it is used for purposes other than
!  initializing the model.
!
!  AUTHOR:
!  Keith Brewster, CAPS 
!  Jan 30, 2002
!
!-----------------------------------------------------------------------
  IMPLICIT NONE

  INTEGER, INTENT(IN) :: lbcnew

  INCLUDE 'bndry.inc'

  lbcopt=lbcnew

END SUBROUTINE set_lbcopt

!
!##################################################################
!##################################################################
!######                                                      ######
!######               SUBROUTINE EXTENVPRF                   ######
!######                                                      ######
!######                     Developed by                     ######
!######     Center for Analysis and Prediction of Storms     ######
!######                University of Oklahoma                ######
!######                                                      ######
!##################################################################
!##################################################################
!

SUBROUTINE extenvprf(nx,ny,nz,lvlprof,                                  &,2
                     x,y,zp,xs,ys,zps,                                  &
                     u,v,usc,vsc,                                       &
                     radarx,radary,radarz,radius,                       &
                     zsnd,ktsnd,usnd,vsnd)
!
!-----------------------------------------------------------------------
!
!  PURPOSE:
!
!  Finds environmental profile around radar location from gridded data.
!
!  AUTHOR:
!  Keith Brewster, CAPS 
!  Jan 30, 2002
!
!-----------------------------------------------------------------------
!
  IMPLICIT NONE
  INTEGER, INTENT(IN) :: nx,ny,nz
  INTEGER, INTENT(IN) :: lvlprof
  REAL, INTENT(IN)    :: x(nx)
  REAL, INTENT(IN)    :: y(ny)
  REAL, INTENT(IN)    :: zp(nx,ny,nz)
  REAL, INTENT(OUT)   :: xs(nx)
  REAL, INTENT(OUT)   :: ys(ny)
  REAL, INTENT(OUT)   :: zps(nx,ny,nz)
  REAL, INTENT(IN)    :: u(nx,ny,nz)
  REAL, INTENT(IN)    :: v(nx,ny,nz)
  REAL, INTENT(OUT)   :: usc(nx,ny,nz)
  REAL, INTENT(OUT)   :: vsc(nx,ny,nz)
  REAL, INTENT(IN)    :: radarx
  REAL, INTENT(IN)    :: radary
  REAL, INTENT(IN)    :: radarz
  REAL, INTENT(IN)    :: radius
  REAL, INTENT(IN)    :: zsnd(lvlprof)
  REAL, INTENT(OUT)   :: ktsnd(lvlprof)
  REAL, INTENT(OUT)   :: usnd(lvlprof)
  REAL, INTENT(OUT)   :: vsnd(lvlprof)

  INTEGER :: i,j,k,kbot,ktop,kext
  INTEGER :: iradar,jradar
  INTEGER :: ibeg,iend,jbeg,jend
  INTEGER :: knt,knttot
  REAL :: dx,dy
  REAL :: radius2,dist2,whigh,wlow,accept

  dx=x(2)-x(1)
  dy=y(2)-y(1)

  DO i=1,nx-1
    xs(i)=0.5*(x(i)+x(i+1))
  END DO
  xs(nx)=xs(nx-1)+dx

  DO j=1,ny-1
    ys(j)=0.5*(y(j)+y(j+1))
  END DO
  ys(ny)=ys(ny-1)+dy

  DO k=1,nz-1
    DO j=1,ny-1
      DO i=1,nx-1
        zps(i,j,k)=0.5*(zp(i,j,k)+zp(i,j,k+1))
      END DO
    END DO
  END DO

  DO j=1,ny-1
    DO i=1,nx-1
      zps(i,j,nz)=2.0*zp(i,j,nz-1)-zp(i,j,nz-2)
    END DO
  END DO

!-----------------------------------------------------------------------
!
!  Bring u and v to a common grid, the scalar points.
!
!-----------------------------------------------------------------------

  CALL avgx(u, 0, nx,ny,nz,                                             &
            1,nx-1,1,ny-1,1,nz-1,                                       &
            usc)
  CALL avgy(v, 0, nx,ny,nz,                                             &
            1,nx-1,1,ny-1,1,nz-1,                                       &
            vsc)
!
!-----------------------------------------------------------------------
!
!  Find the index of scalar grid location that is closest to the radar.
!  Set bounds of searching to be within a box of 
!  radarx-radius < xs < radarx+radius
!  radary-radius < ys < radary+radius
!
!-----------------------------------------------------------------------
!
  iradar=1+nint((radarx-xs(1))/dx)
  jradar=1+nint((radary-ys(1))/dy)

  ibeg=iradar-(int(radius/dx)+1)
  ibeg=min(ibeg,iradar,nx-2)
  ibeg=max(ibeg,2)

  iend=iradar+(int(radius/dx)+1)
  iend=max(iend,iradar,2)
  iend=min(iend,nx-2)

  jbeg=jradar-(int(radius/dy)+1)
  jbeg=min(jbeg,jradar,ny-2)
  jbeg=max(jbeg,2)

  jend=jradar+(int(radius/dy)+1)
  jend=max(jend,jradar,2)
  jend=min(jend,ny-2)

  iradar=min(max(iradar,2),nx-1)
  jradar=min(max(jradar,2),ny-1)
!
!-----------------------------------------------------------------------
!
!  Initialize sums to zero
! 
!-----------------------------------------------------------------------
! 
  DO k=1,lvlprof
    ktsnd(k)=0.
    usnd(k)=0.
    vsnd(k)=0.
  END DO
!
  knt=0
  knttot=0
  radius2=radius*radius
  DO j=jbeg,jend
    DO i=ibeg,iend
!
!-----------------------------------------------------------------------
!
!  Is this point within the ARPS domain?
!  Since the ARPS grid is Cartesian, need only compare
!  the external grid coordinates to the x and y limits
!  of the ARPS grid.
!
!-----------------------------------------------------------------------
!
      knttot=knttot+1
      dist2 = (xs(i)-radarx)*(xs(i)-radarx)                             &
             +(ys(j)-radary)*(ys(j)-radary)
      IF(dist2 < radius2 .OR.                                           &
            (i == iradar .AND. j == jradar)) THEN
        knt=knt+1
!
!-----------------------------------------------------------------------
!
!
!  Interpolate external data in vertical onto profile
!  arrays.
!
!-----------------------------------------------------------------------
!
        DO k=1,lvlprof
          IF(zps(i,j,2) <= zsnd(k)) THEN
            DO kext=3,nz-1
              IF(zps(i,j,kext) >= zsnd(k)) EXIT
            END DO
            IF(kext > nz-1) EXIT
            whigh=(zsnd(k)-zps(i,j,kext-1))/                            &
                  (zps(i,j,kext)-zps(i,j,kext-1))
            wlow=1.-whigh
            ktsnd(k)=ktsnd(k)+1.
            usnd(k)=usnd(k)+                                            &
                  whigh*usc(i,j,kext)+wlow*usc(i,j,kext-1)
            vsnd(k)=vsnd(k)+                                            &
                  whigh*vsc(i,j,kext)+wlow*vsc(i,j,kext-1)
          END IF
        END DO
      END IF
    END DO
  END DO

  WRITE(6,'(/a,i6,a,/a,i6,a/)')                                         &
       '  extenvprf found ',knt,' points within radius',                &
       '  of ',knttot,' checked.'
  accept=0.3*float(knt)
!
!-----------------------------------------------------------------------
!
!  Find lowest height with data
!
!-----------------------------------------------------------------------
!
  WRITE(6,'(a)') ' Finding range of mean profile data ...'
  DO k=1,lvlprof
    IF(ktsnd(k) > accept) EXIT
  END DO
  kbot=k
!
!-----------------------------------------------------------------------
!
!  Find highest height with data
!
!-----------------------------------------------------------------------
!
  DO k=lvlprof,2,-1
    WRITE(6,'(a,f10.2,a,f6.0,a,f10.0)') ' z = ',zsnd(k),                &
                  ' knt = ',ktsnd(k),' accept = ',accept
    IF(ktsnd(k) > accept) EXIT
  END DO
  ktop=k
!
  WRITE(6,'(a,f10.2,a,f10.2,a)')                                        &
               ' Height of data for wind profile spans from ',         &
                 zsnd(kbot),' to ',zsnd(ktop),' meters.'
!
!-----------------------------------------------------------------------
!
!  Divide through to find average
!
!-----------------------------------------------------------------------
!
  DO k=kbot,ktop
    usnd(k)=usnd(k)/ktsnd(k)
    vsnd(k)=vsnd(k)/ktsnd(k)
  END DO
!
!-----------------------------------------------------------------------
!
!  Set variables "below-ground"
!  Zero gradiant assumed.
!
!-----------------------------------------------------------------------
!
  DO k=kbot-1,1,-1
    usnd(k)=usnd(kbot)
    vsnd(k)=vsnd(kbot)
  END DO
!
!-----------------------------------------------------------------------
!
!  Set variables "above-top"
!  Zero gradiant assumed.
!
!-----------------------------------------------------------------------
!
  DO k=ktop+1,lvlprof
    usnd(k)=usnd(ktop)
    vsnd(k)=vsnd(ktop)
  END DO

  RETURN
END SUBROUTINE extenvprf

!##################################################################
!##################################################################
!######                                                      ######
!######                   SUBROUTINE UV2VR                   ######
!######                                                      ######
!######                     Developed by                     ######
!######     Center for Analysis and Prediction of Storms     ######
!######                University of Oklahoma                ######
!######                                                      ######
!##################################################################
!##################################################################
!

  SUBROUTINE UV2VR(rlen,elev, azimu,                                      & 2,6
                 rlat_rad,rlon_rad,ralt_rad,ugrid,vgrid,vr)                 
!
!-----------------------------------------------------------------------
!
!  PURPOSE:
!  Project u,v to radial direction  
!
!-----------------------------------------------------------------------
!
!  INPUT:
!    rlen       distance to radar location
!    elev       elevation angle 
!    azimu      azimuth angle
!    rlat_rad   latitude of radar
!    rlon_rad   latitude of radar
!    ralt_rad   altitude of radar
!    ugrid      u
!    vgrid      v
!
!  OUTPUT:
!    vr         radial wind
!
!-----------------------------------------------------------------------
  IMPLICIT NONE
!
!-----------------------------------------------------------------------
!
!  INCLUDE FILES
!
!-----------------------------------------------------------------------
!
  INCLUDE 'phycst.inc'
!
!-----------------------------------------------------------------------
!
!  Variable Declarations:
!
!-----------------------------------------------------------------------
!
  REAL :: rlen, elev, azimu 
  REAL :: rlat_rad,rlon_rad,ralt_rad
  REAL :: ugrid,vgrid 
  REAL :: vr
!
!-----------------------------------------------------------------------
!
!  Misc. local variables
!
!-----------------------------------------------------------------------
!
  REAL :: azim,dist,dz,eleva,range,dhdr,dsdr,ddrot
  REAL :: xrad, yrad, r_horiz, z_verti
  REAL :: xgrid,ygrid,zgrid
  REAL :: rlat_grid,rlon_grid
  REAL :: uazmrad,vazmrad
  REAL :: DPI
  PARAMETER ( DPI=3.1415926535898/180.0 )

  REAL :: f_qvsat

!fpp$ expand (f_qvsat)
!dir$ inline always f_qvsat
!*$*  inline routine (f_qvsat)

!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!  Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!
!-----------------------------------------------------------------------
!
!  Get x and y locations of each radar ob
!
!-----------------------------------------------------------------------
!
  CALL lltoxy(1,1,rlat_rad,rlon_rad, xrad, yrad)

  r_horiz = rlen*COS(elev*DPI)
  z_verti = rlen*SIN(elev*DPI)

  xgrid   = r_horiz*SIN( azimu*DPI ) + xrad
  ygrid   = r_horiz*COS( azimu*DPI ) + yrad
  zgrid   = z_verti

  CALL  xytoll(1,1,xgrid, ygrid, rlat_grid,rlon_grid)
!
!-----------------------------------------------------------------------
!
!  Find heading and distance from radar along ground
!  Store correlation of azimuth with u and v drections
!  in uazmrad and vazmrad, respectively.
!
!-----------------------------------------------------------------------
!
  CALL disthead(rlat_grid,rlon_grid,                                &
                rlat_rad,rlon_rad,                                  &
                azim,dist)
!
  CALL ddrotuv(1,rlon_grid, azim,1.,ddrot,                          &
               uazmrad,vazmrad)
!
!-----------------------------------------------------------------------
!
!  Loop in height
!
!-----------------------------------------------------------------------
!
  dz= zgrid - ralt_rad

  CALL beamelv(dz,dist,eleva,range)
  CALL dhdrange(eleva,range,dhdr)
  dsdr=SQRT(AMAX1(0.,(1.-dhdr*dhdr)))
!
!-----------------------------------------------------------------------
!
!  Project u-v to radial direction to get radial velocity 
!
!-----------------------------------------------------------------------
!
  vr=(uazmrad*ugrid + vazmrad*vgrid) * dsdr
!
  RETURN
  END SUBROUTINE UV2VR
! 
!##################################################################
!##################################################################
!######                                                      ######
!######                 SUBROUTINE QUADFIT                   ######
!######                                                      ######
!######                     Developed by                     ######
!######     Center for Analysis and Prediction of Storms     ######
!######                University of Oklahoma                ######
!######                                                      ######
!##################################################################
!##################################################################
!

  SUBROUTINE QUADFIT(maxgate,maxazim,maxelev,                          &,3
                     varchek,vmedlim,dazlim,iorder,                    &
                     kntgate,kntazim,kntelev,                          &
                     radarx,radary,rdralt,dazim,                       &
                     rngmin,rngmax,                                    &
                     rngvol,azmvol,elvvol,                             &
                     varvol,                                           &
                     istatus)
!
!-----------------------------------------------------------------------
!
!  PURPOSE:
!
!  Uses a least squares local quadratic fit to refill the "hole" 
!  rejected during unfolding process 
!
!-----------------------------------------------------------------------
!
!  AUTHOR: Keith Brewster, CAPS
!
!  MODIFICATION HISTORY:
!
!-----------------------------------------------------------------------
!
!  INPUT :
!
!    maxgate   Maximum gates in a radial
!    maxazim   Maximum radials per tilt
!    maxelev   Maximum number of tilts
!
!    varchek  Threshold for checking data, good vs. flagged
!    vmedlim  Threshold limit for median check
!    dazlim   Maximum value of azimuth difference (grid vs data) to accept
!             Generally should be 30 degrees or less for velocity, 360 for refl
!    rngmin   Minimum range (m) of data to use 
!            (10 000 m or more to eliminate near field ground targets).
!    rngmax   Maximum range (m) of data to use 
!
!    rngvvol  Range to gate in velocity 3-D volume
!    azmvvol  Azimuth angle in velocity 3-D volume
!    elvvvol  Elevation angle in velocity 3-D volume
!    varvol   Radar data 3-D volume
!
!    xs       x coordinate of scalar grid points in physical/comp. space (m)
!    ys       y coordinate of scalar grid points in physical/comp. space (m)
!    zps      Vertical coordinate of scalar grid points in physical space(m)
!
!  OUTPUT:
!    varvol   Radar data 3-D volume
!    istatus  Status indicator
!
!-----------------------------------------------------------------------
!
!  Variable Declarations.
!
!-----------------------------------------------------------------------
!
  IMPLICIT NONE
!
  INTEGER, INTENT(IN) :: maxgate
  INTEGER, INTENT(IN) :: maxazim
  INTEGER, INTENT(IN) :: maxelev

  REAL, INTENT(IN)    :: varchek
  REAL, INTENT(IN)    :: vmedlim
  REAL, INTENT(IN)    :: dazlim
  INTEGER, INTENT(IN) :: iorder

  INTEGER, INTENT(IN) :: kntgate(maxazim,maxelev)
  INTEGER, INTENT(IN) :: kntazim(maxelev)
  INTEGER, INTENT(IN) :: kntelev

  REAL, INTENT(IN)    :: radarx
  REAL, INTENT(IN)    :: radary
  REAL, INTENT(IN)    :: rdralt
  REAL, INTENT(IN)    :: dazim
  REAL, INTENT(IN)    :: rngmin
  REAL, INTENT(IN)    :: rngmax

  REAL, INTENT(IN)    :: rngvol(maxgate,maxelev)
  REAL, INTENT(IN)    :: azmvol(maxazim,maxelev)
  REAL, INTENT(IN)    :: elvvol(maxazim,maxelev)
  REAL, INTENT(INOUT)    :: varvol(maxgate,maxazim,maxelev)

  INTEGER, INTENT(OUT) :: istatus
!
!-----------------------------------------------------------------------
!
! Misc. Local Variables
!
!-----------------------------------------------------------------------
!
  INTEGER, PARAMETER :: n = 6
  REAL :: avar(n,n)
  REAL :: rhsvar(n)
  REAL :: avel(n,n)
  REAL :: rhsvel(n)
  REAL :: sol(n)
  REAL :: work(n,n+1)
  REAL :: work1d(n+1)

  REAL :: array(4,4)
  REAL :: rhsv(4)
  REAL :: solv(4)

  REAL, PARAMETER :: eps = 1.0E-25

  INTEGER :: ii,jj,kk,i,j,k,knt,kinbox
  INTEGER :: kok,isort,jsort,mid
  INTEGER :: kbgn,kend
  INTEGER :: igate,jazim,kelev,jazmin,jmirror,jend
  INTEGER :: iigate,jjazim,kkelev
  INTEGER :: istatal,istatwrt
  INTEGER :: nbeam,nrang

  INTEGER, PARAMETER :: maxsort = 5000

  REAL :: deg2rad,rad2deg
  REAL :: elevmin,elevmax
  REAL :: delx,dely,delz,dazimr,daz,azdiff
  REAL :: ddx,ddxy,ddx2,ddy,ddy2,dxthr,dxthr0
  REAL :: cosaz,sinaz,sfcr,zagl
  REAL :: sum,sum2,sdev,thresh,slrange,elijk,azimijk,time
  REAL :: varmax,varmin,varavg,varmean,varmed
  REAL :: xs,ys,zps,fitvalue

  REAL, ALLOCATABLE :: varsort(:)
  REAL, ALLOCATABLE :: elevmean(:)
  REAL, ALLOCATABLE :: rxvol(:,:,:)
  REAL, ALLOCATABLE :: ryvol(:,:,:)
  REAL, ALLOCATABLE :: rzvol(:,:,:)
!
!-----------------------------------------------------------------------
!
! Include files:
!
!-----------------------------------------------------------------------

  INCLUDE 'globcst.inc'

!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!  Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
  deg2rad = atan(1.)/45.
  rad2deg = 1./deg2rad
  dazimr = dazim*deg2rad
  dxthr0=5*250.

  allocate(elevmean(kntelev),stat=istatal)
  allocate(varsort(maxsort),stat=istatal)
  allocate(rxvol(maxgate,maxazim,maxelev),stat=istatal)
  allocate(ryvol(maxgate,maxazim,maxelev),stat=istatal)
  allocate(rzvol(maxgate,maxazim,maxelev),stat=istatal)

  time=0.
  elevmax=-999.
  elevmin=999.
  DO kelev=1,kntelev
    sum=0.
    DO jazim=1,kntazim(kelev)
      sum=sum+elvvol(jazim,kelev)
      elevmin=min(elevmin,elvvol(jazim,kelev))
      elevmax=max(elevmax,elvvol(jazim,kelev))
    END DO
    elevmean(kelev)=sum/float(kntazim(kelev))
  END DO
!

  write(6,'(a)') &
  ' i   j   k   knt  min   mean   max    intrp'

  DO kelev=1,kntelev
    DO jazim=1,kntazim(kelev)
      cosaz=cos(deg2rad*azmvol(jazim,kelev))
      sinaz=sin(deg2rad*azmvol(jazim,kelev))
      DO igate=1,kntgate(jazim,kelev)
        CALL BEAMHGT(elvvol(jazim,kelev),rngvol(igate,kelev), &
                     zagl,sfcr)
        rxvol(igate,jazim,kelev)=radarx+sinaz*sfcr
        ryvol(igate,jazim,kelev)=radary+cosaz*sfcr
        rzvol(igate,jazim,kelev)=rdralt+zagl
      END DO
    END DO
  END DO

  DO kkelev = 1,kntelev
    DO jjazim = 1,kntazim(kkelev)
      DO iigate= 1,kntgate(jjazim,kkelev)
        IF(varvol(iigate,jjazim,kkelev)==-777.0)THEN
          xs = rxvol(iigate,jjazim,kkelev)
          ys = ryvol(iigate,jjazim,kkelev)
          zps = rzvol(iigate,jjazim,kkelev)
        kok=0
        sum=0.
        sum2=0.
        sdev=0.
        varavg=999999.
        varsort=999999.
        delx=xs-radarx
        dely=ys-radary
        delz=zps-rdralt
        slrange=sqrt(delx*delx+dely*dely+delz*delz)
!       dxthr=max(dxthr0,((slrange+dxthr0)*dazimr))
        dxthr=5*250.
!
        IF(delz >= 0. .AND. slrange > 0. ) THEN
          elijk=rad2deg*asin(delz/slrange)
          IF(elijk >= elevmin .AND. elijk <= elevmax) THEN
!
!-----------------------------------------------------------------------
!
! Determine azimuth to this grid cell
!
!-----------------------------------------------------------------------
!
            IF(delx == 0.) THEN
              IF(dely >= 0.) THEN
                azimijk=0.
              ELSE
                azimijk=180.
              END IF
            ELSE
              azimijk=rad2deg*atan(delx/dely)
              IF(dely < 0.) azimijk=azimijk+180.
              IF(azimijk < 0.) azimijk=azimijk+360.
            END IF

            DO kelev=2,kntelev-1
              IF(elevmean(kelev) > elijk) EXIT
            END DO
!
            varmax=-999.
            varmin=999.
            DO jj=1,n
            DO ii=1,n
              avar(ii,jj)=0.
            END DO
            END DO 
!
            DO ii=1,n
              rhsvar(ii)=0.
            END DO
!
            kbgn=max((kelev-1),1)
            kend=min(kelev,kntelev)

            DO kk=kend,kend
!
!-----------------------------------------------------------------------
!
!  Find nearest azimuth at this level
!
!-----------------------------------------------------------------------
!
              azdiff=181.
              jazmin=1
              DO jazim=1,kntazim(kk)
                daz=azmvol(jazim,kk)-azimijk
                IF(daz > 180.) daz=daz-360.
                IF(daz < -180.) daz=daz+360.
                daz=abs(daz)
                IF(daz < azdiff) THEN
                  azdiff=daz
                  jazmin=jazim
                END IF
              END DO
             
              jmirror=jazmin+(kntazim(kk)/2)
              IF(jmirror > kntazim(kk)) jmirror=jmirror-kntazim(kk)
  
!
!-----------------------------------------------------------------------
!
!  First pass, find median, avg, std dev.
!
!
!  Loop forward from jazmin
!
!-----------------------------------------------------------------------
!
              jend=kntazim(kk)
              IF(jmirror > jazmin) jend=jmirror-1
              DO jazim=jazmin,jend
                kinbox=0
                daz=azmvol(jazim,kk)-azimijk
                IF(daz > 180.) daz=daz-360.
                IF(daz < -180.) daz=daz+360.
                IF(abs(daz) > dazlim) EXIT
                DO igate=1,kntgate(jazim,kk)
                  ddx=rxvol(igate,jazim,kk)-xs
                  ddy=ryvol(igate,jazim,kk)-ys
!
                  IF( rngvol(igate,kk) > rngmin .AND.                    &
                      rngvol(igate,kk) < rngmax .AND.                    &
                      abs(ddx) < dxthr .AND. abs(ddy) < dxthr ) THEN
                    kinbox=kinbox+1
                    IF(varvol(igate,jazim,kk) > varchek ) THEN
                      DO isort=1,kok
                        IF(varvol(igate,jazim,kk) < varsort(isort)) EXIT
                      END DO
                      IF(kok < maxsort) THEN
                        DO jsort=kok,isort,-1
                          varsort(jsort+1)=varsort(jsort)
                        END DO
                        varsort(isort)=varvol(igate,jazim,kk)
                        sum=sum+varvol(igate,jazim,kk)
                        sum2=sum2+(varvol(igate,jazim,kk)*varvol(igate,jazim,kk))
                        kok=kok+1
                      ELSE
                        EXIT
                      END IF
                    END IF   ! data ok
                  END IF  ! inside box
                END DO ! igate
                IF(kinbox == 0 .OR. kok == maxsort) EXIT
              END DO ! jazim
!
!-----------------------------------------------------------------------
!
!  IF kinbox > 0 continue from jazim=1
!
!-----------------------------------------------------------------------
!
              IF(kinbox > 0 .and. jend==kntazim(kk)) THEN
              DO jazim=1,jmirror-1
                kinbox=0
                daz=azmvol(jazim,kk)-azimijk
                IF(daz > 180.) daz=daz-360.
                IF(daz < -180.) daz=daz+360.
                IF(abs(daz) > dazlim) EXIT
                DO igate=1,kntgate(jazim,kk)
!
                  ddx=rxvol(igate,jazim,kk)-xs
                  ddy=ryvol(igate,jazim,kk)-ys

                  IF( rngvol(igate,kk) > rngmin .AND.                    &
                      rngvol(igate,kk) < rngmax .AND.                    &
                      abs(ddx) < dxthr .AND. abs(ddy) < dxthr ) THEN
                    IF(varvol(igate,jazim,kk) > varchek ) THEN
                      IF(kok < maxsort) THEN
                        DO isort=1,kok
                          IF(varvol(igate,jazim,kk) < varsort(isort)) EXIT
                        END DO
                        DO jsort=kok,isort,-1
                          varsort(jsort+1)=varsort(jsort)
                        END DO
                        varsort(isort)=varvol(igate,jazim,kk)
                        sum=sum+varvol(igate,jazim,kk)
                        sum2=sum2+(varvol(igate,jazim,kk)*varvol(igate,jazim,kk))
                        kok=kok+1
                      ELSE
                        EXIT
                      END IF
                    END IF
                  END IF
                END DO
                IF(kinbox == 0 .OR. kok == maxsort) EXIT
              END DO
              END IF
!
!-----------------------------------------------------------------------
!
! Loop backward from jazmin
!
!-----------------------------------------------------------------------
!
              jend= 1
              IF(jmirror < jazmin) jend=jmirror
              DO jazim=jazmin-1,jend,-1
                kinbox=0
                daz=azmvol(jazim,kk)-azimijk
                IF(daz > 180.) daz=daz-360.
                IF(daz < -180.) daz=daz+360.
                IF(abs(daz) > dazlim) EXIT
                DO igate=1,kntgate(jazim,kk)
!
                  ddx=rxvol(igate,jazim,kk)-xs
                  ddy=ryvol(igate,jazim,kk)-ys

                  IF( rngvol(igate,kk) > rngmin .AND.                    &
                      rngvol(igate,kk) < rngmax .AND.                    &
                      abs(ddx) < dxthr .AND. abs(ddy) < dxthr ) THEN

                    kinbox=kinbox+1

                    IF(varvol(igate,jazim,kk) > varchek ) THEN
                      IF(kok < maxsort) THEN
                        DO isort=1,kok
                          IF(varvol(igate,jazim,kk) < varsort(isort)) EXIT
                        END DO
                        DO jsort=kok,isort,-1
                          varsort(jsort+1)=varsort(jsort)
                        END DO
                        varsort(isort)=varvol(igate,jazim,kk)
                        sum=sum+varvol(igate,jazim,kk)
                        sum2=sum2+(varvol(igate,jazim,kk)*varvol(igate,jazim,kk))
                        kok=kok+1
                      ELSE
                        EXIT
                      END IF
                    END IF
                  END IF
                END DO
                IF(kinbox == 0 .OR. kok == maxsort) EXIT
              END DO
!
!-----------------------------------------------------------------------
!
! If not yet outside box, continue from last radial.
!
!-----------------------------------------------------------------------
!
!             IF(i==10 .and. j==10 .and. k==5) &
!                 print *, ' OUT3 jazim,kinbox= ',jazim,kinbox
              IF(kinbox > 0 .and. jend==1 ) THEN
              DO jazim=kntazim(kk),jmirror,-1
                kinbox=0
                daz=azmvol(jazim,kk)-azimijk
                IF(daz > 180.) daz=daz-360.
                IF(daz < -180.) daz=daz+360.
                IF(abs(daz) > dazlim) EXIT
                DO igate=1,kntgate(jazim,kk)
!
                  ddx=rxvol(igate,jazim,kk)-xs
                  ddy=ryvol(igate,jazim,kk)-ys
! 
                  IF( rngvol(igate,kk) > rngmin .AND.                    &
                      rngvol(igate,kk) < rngmax .AND.                    &
                      abs(ddx) < dxthr .AND. abs(ddy) < dxthr ) THEN
                    kinbox=kinbox+1
                    IF(varvol(igate,jazim,kk) > varchek ) THEN
                      IF(kok < maxsort ) THEN
                        DO isort=1,kok
                          IF(varvol(igate,jazim,kk) < varsort(isort)) EXIT
                        END DO
                        DO jsort=kok,isort,-1
                          varsort(jsort+1)=varsort(jsort)
                        END DO
                        varsort(isort)=varvol(igate,jazim,kk)
                        sum=sum+varvol(igate,jazim,kk)
                        sum2=sum2+(varvol(igate,jazim,kk)*varvol(igate,jazim,kk))
                        kok=kok+1
                      ELSE
                        EXIT
                      END IF
                    END IF
                  END IF
                END DO  ! igate
                IF(kinbox == 0 .OR. kok == maxsort) EXIT
              END DO ! jazim
              END IF
            END DO ! kk
!
            mid=(kok/2)+1
            varmed=varsort(mid)
            IF(kok > 0) varavg=sum/float(kok)
            IF ( kok > 1 )                                               &
              sdev=sqrt((sum2-(sum*sum/float(kok)))/float(kok-1))
            thresh=max((2.*sdev),vmedlim)
!
!-----------------------------------------------------------------------
!
!  Process data for local quadratic fit
!
!-----------------------------------------------------------------------
!
            DO kk=kend,kend
!
!-----------------------------------------------------------------------
!
!  Find nearest azimuth at this level
!
!-----------------------------------------------------------------------
!
              azdiff=181.
              jazmin=1
              DO jazim=1,kntazim(kk)
                daz=azmvol(jazim,kk)-azimijk
                IF(daz > 180.) daz=daz-360.
                IF(daz < -180.) daz=daz+360.
                daz=abs(daz)
                IF(daz < azdiff) THEN
                  azdiff=daz
                  jazmin=jazim
                END IF
              END DO
!             IF(i==10 .and. j==10 .and. k==5) &
!               print *, ' kk,azdiff,jazmin=', &
!                 kk,azdiff,jazmin,azmvol(jazmin,kk)
             
              jmirror=jazmin+(kntazim(kk)/2)
              IF(jmirror > kntazim(kk)) jmirror=jmirror-kntazim(kk)
  
!             IF(i==10 .and. j==10 .and. k==5) &
!               print *, ' jmirror=',jmirror
!
!-----------------------------------------------------------------------
!
!  Loop forward from jazmin
!
!-----------------------------------------------------------------------
!
              jend=kntazim(kk)
              IF(jmirror > jazmin) jend=jmirror-1
              DO jazim=jazmin,jend
                kinbox=0
                daz=azmvol(jazim,kk)-azimijk
                IF(daz > 180.) daz=daz-360.
                IF(daz < -180.) daz=daz+360.
                IF(abs(daz) > dazlim) EXIT
                DO igate=1,kntgate(jazim,kk)
!
                  ddx=rxvol(igate,jazim,kk)-xs
                  ddy=ryvol(igate,jazim,kk)-ys
! 
                  IF( rngvol(igate,kk) > rngmin .AND.                    &
                      rngvol(igate,kk) < rngmax .AND.                    &
                      abs(ddx) < dxthr .AND. abs(ddy) < dxthr ) THEN

                    kinbox=kinbox+1
                    ddxy=ddx*ddy
                    ddx2=ddx*ddx
                    ddy2=ddy*ddy

                    IF(varvol(igate,jazim,kk) > varchek .AND.  &
                       abs(varvol(igate,jazim,kk)-varmed) < thresh ) THEN
!
                      varmax=max(varmax,varvol(igate,jazim,kk))
                      varmin=min(varmin,varvol(igate,jazim,kk))
!
                      rhsvar(1)=rhsvar(1)+varvol(igate,jazim,kk)
                      rhsvar(2)=rhsvar(2)+varvol(igate,jazim,kk)*ddx
                      rhsvar(3)=rhsvar(3)+varvol(igate,jazim,kk)*ddy
                      rhsvar(4)=rhsvar(4)+varvol(igate,jazim,kk)*ddxy
                      rhsvar(5)=rhsvar(5)+varvol(igate,jazim,kk)*ddx2
                      rhsvar(6)=rhsvar(6)+varvol(igate,jazim,kk)*ddy2
!
                      avar(1,1)=avar(1,1)+1.
                      avar(1,2)=avar(1,2)+ddx
                      avar(1,3)=avar(1,3)+ddy
                      avar(1,4)=avar(1,4)+ddxy
                      avar(1,5)=avar(1,5)+ddx2
                      avar(1,6)=avar(1,6)+ddy2
!
                      avar(2,1)=avar(2,1)+ddx
                      avar(2,2)=avar(2,2)+ddx2
                      avar(2,3)=avar(2,3)+ddx*ddy
                      avar(2,4)=avar(2,4)+ddx*ddxy
                      avar(2,5)=avar(2,5)+ddx*ddx2
                      avar(2,6)=avar(2,6)+ddx*ddy2
!
                      avar(3,1)=avar(3,1)+ddy 
                      avar(3,2)=avar(3,2)+ddy*ddx
                      avar(3,3)=avar(3,3)+ddy2
                      avar(3,4)=avar(3,4)+ddy*ddx2
                      avar(3,5)=avar(3,5)+ddy*ddx2
                      avar(3,6)=avar(3,6)+ddy*ddy2
!
                      avar(4,1)=avar(4,1)+ddxy
                      avar(4,2)=avar(4,2)+ddxy*ddx
                      avar(4,3)=avar(4,3)+ddxy*ddy
                      avar(4,4)=avar(4,4)+ddxy*ddxy
                      avar(4,5)=avar(4,5)+ddxy*ddx2
                      avar(4,6)=avar(4,6)+ddxy*ddy2
!
                      avar(5,1)=avar(6,1)+ddx2
                      avar(5,2)=avar(6,2)+ddx2*ddx
                      avar(5,3)=avar(6,3)+ddx2*ddy
                      avar(5,4)=avar(6,4)+ddx2*ddxy
                      avar(5,5)=avar(6,5)+ddx2*ddx2
                      avar(5,6)=avar(6,6)+ddx2*ddy2
!
                      avar(6,1)=avar(6,1)+ddy2 
                      avar(6,2)=avar(6,2)+ddy2*ddx
                      avar(6,3)=avar(6,3)+ddy2*ddy
                      avar(6,4)=avar(6,4)+ddy2*ddxy
                      avar(6,5)=avar(6,5)+ddy2*ddx2
                      avar(6,6)=avar(6,6)+ddy2*ddy2
!
                    END IF
!
                  END IF
                END DO  ! igate
!               IF(i==10 .and. j==10 .and. k==5) &
!                 print *, ' jazim,azim,kinbox= ',jazim,azmvol(jazim,kk),kinbox
                IF(kinbox == 0) EXIT
              END DO ! jazim
!
!-----------------------------------------------------------------------
!
!  IF kinbox > 0 continue from jazim=1
!
!-----------------------------------------------------------------------
!
!             IF(i==10 .and. j==10 .and. k==5) &
!                 print *, ' OUT1 jazim,azim,kinbox= ',&
!                                 jazim,azmvol(jazim,kk),kinbox
              IF(kinbox > 0 .and. jend==kntazim(kk)) THEN
              DO jazim=1,jmirror-1
                kinbox=0
                daz=azmvol(jazim,kk)-azimijk
                IF(daz > 180.) daz=daz-360.
                IF(daz < -180.) daz=daz+360.
                IF(abs(daz) > dazlim) EXIT
                DO igate=1,kntgate(jazim,kk)
!
                  ddx=rxvol(igate,jazim,kk)-xs
                  ddy=ryvol(igate,jazim,kk)-ys
!
                  IF( rngvol(igate,kk) > rngmin .AND.                    &
                      rngvol(igate,kk) < rngmax .AND.                    &
                      abs(ddx) < dxthr .AND. abs(ddy) < dxthr ) THEN

                    kinbox=kinbox+1
                    ddxy=ddx*ddy
                    ddx2=ddx*ddx
                    ddy2=ddy*ddy

                    IF(varvol(igate,jazim,kk) > varchek .AND.             &
                       abs(varvol(igate,jazim,kk)-varmed) < thresh ) THEN
!
                      varmax=max(varmax,varvol(igate,jazim,kk))
                      varmin=min(varmin,varvol(igate,jazim,kk))
!
                      rhsvar(1)=rhsvar(1)+varvol(igate,jazim,kk)
                      rhsvar(2)=rhsvar(2)+varvol(igate,jazim,kk)*ddx
                      rhsvar(3)=rhsvar(3)+varvol(igate,jazim,kk)*ddy
                      rhsvar(4)=rhsvar(4)+varvol(igate,jazim,kk)*ddxy
                      rhsvar(5)=rhsvar(5)+varvol(igate,jazim,kk)*ddx2
                      rhsvar(6)=rhsvar(6)+varvol(igate,jazim,kk)*ddy2
!
                      avar(1,1)=avar(1,1)+1.
                      avar(1,2)=avar(1,2)+ddx
                      avar(1,3)=avar(1,3)+ddy
                      avar(1,4)=avar(1,4)+ddxy
                      avar(1,5)=avar(1,5)+ddx2
                      avar(1,6)=avar(1,6)+ddy2
!
                      avar(2,1)=avar(2,1)+ddx
                      avar(2,2)=avar(2,2)+ddx2
                      avar(2,3)=avar(2,3)+ddx*ddy
                      avar(2,4)=avar(2,4)+ddx*ddxy
                      avar(2,5)=avar(2,5)+ddx*ddx2
                      avar(2,6)=avar(2,6)+ddx*ddy2
!
                      avar(3,1)=avar(3,1)+ddy 
                      avar(3,2)=avar(3,2)+ddy*ddx
                      avar(3,3)=avar(3,3)+ddy2
                      avar(3,4)=avar(3,4)+ddy*ddxy
                      avar(3,5)=avar(3,5)+ddy*ddx2
                      avar(3,6)=avar(3,6)+ddy*ddy2
!
                      avar(4,1)=avar(4,1)+ddxy
                      avar(4,2)=avar(4,2)+ddxy*ddx
                      avar(4,3)=avar(4,3)+ddxy*ddy
                      avar(4,4)=avar(4,4)+ddxy*ddxy
                      avar(4,5)=avar(4,5)+ddxy*ddx2
                      avar(4,6)=avar(4,6)+ddxy*ddy2

                      avar(5,1)=avar(5,1)+ddx2
                      avar(5,2)=avar(5,2)+ddx2*ddx
                      avar(5,3)=avar(5,3)+ddx2*ddy
                      avar(5,4)=avar(5,4)+ddx2*ddxy
                      avar(5,5)=avar(5,5)+ddx2*ddx2
                      avar(5,6)=avar(5,6)+ddx2*ddy2
!
                      avar(6,1)=avar(6,1)+ddy2 
                      avar(6,2)=avar(6,2)+ddy2*ddx
                      avar(6,3)=avar(6,3)+ddy2*ddy
                      avar(6,4)=avar(6,4)+ddy2*ddxy
                      avar(6,5)=avar(6,5)+ddy2*ddx2
                      avar(6,6)=avar(6,6)+ddy2*ddy2
!
                    END IF
!
                  END IF
                END DO  ! igate
!               IF(i==10 .and. j==10 .and. k==5) &
!                 print *, ' jazim,azim,kinbox= ',jazim,azmvol(jazim,kk),kinbox
                IF(kinbox == 0) EXIT
              END DO ! jazim
              END IF
!
!-----------------------------------------------------------------------
!
! Loop backward from jazmin
!
!-----------------------------------------------------------------------
!
!             IF(i==10 .and. j==10 .and. k==5) &
!                 print *, ' OUT2 jazim,kinbox= ',jazim,kinbox
              jend= 1
              IF(jmirror < jazmin) jend=jmirror
              DO jazim=jazmin-1,jend,-1
                kinbox=0
                daz=azmvol(jazim,kk)-azimijk
                IF(daz > 180.) daz=daz-360.
                IF(daz < -180.) daz=daz+360.
                IF(abs(daz) > dazlim) EXIT
                DO igate=1,kntgate(jazim,kk)
!
                  ddx=rxvol(igate,jazim,kk)-xs
                  ddy=ryvol(igate,jazim,kk)-ys
!
                  IF( rngvol(igate,kk) > rngmin .AND.                    &
                      rngvol(igate,kk) < rngmax .AND.                    &
                      abs(ddx) < dxthr .AND. abs(ddy) < dxthr ) THEN

                    kinbox=kinbox+1
                    ddxy=ddx*ddy
                    ddx2=ddx*ddx
                    ddy2=ddy*ddy

                    IF(varvol(igate,jazim,kk) > varchek .AND.             &
                       abs(varvol(igate,jazim,kk)-varmed) < thresh ) THEN

                      DO isort=1,kok
                        IF(varvol(igate,jazim,kk) < varsort(isort)) EXIT
                      END DO
                      DO jsort=kok,isort,-1
                        varsort(jsort+1)=varsort(jsort)
                      END DO
                      varsort(isort)=varvol(igate,jazim,kk)
                      kok=kok+1
!
                      varmax=max(varmax,varvol(igate,jazim,kk))
                      varmin=min(varmin,varvol(igate,jazim,kk))
!
                      rhsvar(1)=rhsvar(1)+varvol(igate,jazim,kk)
                      rhsvar(2)=rhsvar(2)+varvol(igate,jazim,kk)*ddx
                      rhsvar(3)=rhsvar(3)+varvol(igate,jazim,kk)*ddy
                      rhsvar(4)=rhsvar(4)+varvol(igate,jazim,kk)*ddxy
                      rhsvar(5)=rhsvar(5)+varvol(igate,jazim,kk)*ddx2
                      rhsvar(6)=rhsvar(6)+varvol(igate,jazim,kk)*ddy2
!
                      avar(1,1)=avar(1,1)+1.
                      avar(1,2)=avar(1,2)+ddx
                      avar(1,3)=avar(1,3)+ddy
                      avar(1,4)=avar(1,4)+ddxy
                      avar(1,5)=avar(1,5)+ddx2
                      avar(1,6)=avar(1,6)+ddy2
!
                      avar(2,1)=avar(2,1)+ddx
                      avar(2,2)=avar(2,2)+ddx2
                      avar(2,3)=avar(2,3)+ddx*ddy
                      avar(2,4)=avar(2,4)+ddx*ddxy
                      avar(2,5)=avar(2,5)+ddx*ddx2
                      avar(2,6)=avar(2,6)+ddx*ddy2
!
                      avar(3,1)=avar(3,1)+ddy 
                      avar(3,2)=avar(3,2)+ddy*ddx
                      avar(3,3)=avar(3,3)+ddy2
                      avar(3,4)=avar(3,4)+ddy*ddxy
                      avar(3,5)=avar(3,5)+ddy*ddx2
                      avar(3,6)=avar(3,6)+ddy*ddy2
!
                      avar(4,1)=avar(4,1)+ddxy
                      avar(4,2)=avar(4,2)+ddxy*ddx
                      avar(4,3)=avar(4,3)+ddxy*ddy
                      avar(4,4)=avar(4,4)+ddxy*ddxy
                      avar(4,5)=avar(4,5)+ddxy*ddx2
                      avar(4,6)=avar(4,6)+ddxy*ddy2
!
                      avar(5,1)=avar(5,1)+ddx2
                      avar(5,2)=avar(5,2)+ddx2*ddx
                      avar(5,3)=avar(5,3)+ddx2*ddy
                      avar(5,4)=avar(5,4)+ddx2*ddxy
                      avar(5,5)=avar(5,5)+ddx2*ddx2
                      avar(5,6)=avar(5,6)+ddx2*ddy2
!
                      avar(6,1)=avar(6,1)+ddy2 
                      avar(6,2)=avar(6,2)+ddy2*ddx
                      avar(6,3)=avar(6,3)+ddy2*ddy
                      avar(6,4)=avar(6,4)+ddy2*ddxy
                      avar(6,5)=avar(6,5)+ddy2*ddx2
                      avar(6,6)=avar(6,6)+ddy2*ddy2
!
                    END IF
!
                  END IF
                END DO  ! igate
!               IF(i==10 .and. j==10 .and. k==5) &
!                 print *, ' jazim,azim,kinbox= ',jazim,azmvol(jazim,kk),kinbox
                IF(kinbox == 0) EXIT
              END DO ! jazim
!
!-----------------------------------------------------------------------
!
! If not yet outside box, continue from last radial.
!
!-----------------------------------------------------------------------
!
!             IF(i==10 .and. j==10 .and. k==5) &
!                 print *, ' OUT3 jazim,kinbox= ',jazim,kinbox
              IF(kinbox > 0 .and. jend==1 ) THEN
              DO jazim=kntazim(kk),jmirror,-1
                kinbox=0
                daz=azmvol(jazim,kk)-azimijk
                IF(daz > 180.) daz=daz-360.
                IF(daz < -180.) daz=daz+360.
                IF(abs(daz) > dazlim) EXIT
                DO igate=1,kntgate(jazim,kk)
!
                  ddx=rxvol(igate,jazim,kk)-xs
                  ddy=ryvol(igate,jazim,kk)-ys
!
                  IF( rngvol(igate,kk) > rngmin .AND.                    &
                      rngvol(igate,kk) < rngmax .AND.                    &
                      abs(ddx) < dxthr .AND. abs(ddy) < dxthr ) THEN

                    kinbox=kinbox+1
                    ddxy=ddx*ddy
                    ddx2=ddx*ddx
                    ddy2=ddy*ddy

                    IF(varvol(igate,jazim,kk) > varchek .AND.             &
                       abs(varvol(igate,jazim,kk)-varmed) < thresh ) THEN

                      DO isort=1,kok
                        IF(varvol(igate,jazim,kk) < varsort(isort)) EXIT
                      END DO
                      DO jsort=kok,isort,-1
                        varsort(jsort+1)=varsort(jsort)
                      END DO
                      varsort(isort)=varvol(igate,jazim,kk)
                      kok=kok+1
!
                      varmax=max(varmax,varvol(igate,jazim,kk))
                      varmin=min(varmin,varvol(igate,jazim,kk))
!
                      rhsvar(1)=rhsvar(1)+varvol(igate,jazim,kk)
                      rhsvar(2)=rhsvar(2)+varvol(igate,jazim,kk)*ddx
                      rhsvar(3)=rhsvar(3)+varvol(igate,jazim,kk)*ddy
                      rhsvar(4)=rhsvar(4)+varvol(igate,jazim,kk)*ddxy
                      rhsvar(5)=rhsvar(5)+varvol(igate,jazim,kk)*ddx2
                      rhsvar(6)=rhsvar(6)+varvol(igate,jazim,kk)*ddy2
!
                      avar(1,1)=avar(1,1)+1.
                      avar(1,2)=avar(1,2)+ddx
                      avar(1,3)=avar(1,3)+ddy
                      avar(1,4)=avar(1,4)+ddxy
                      avar(1,5)=avar(1,5)+ddx2
                      avar(1,6)=avar(1,6)+ddy2
!
                      avar(2,1)=avar(2,1)+ddx
                      avar(2,2)=avar(2,2)+ddx2
                      avar(2,3)=avar(2,3)+ddx*ddy
                      avar(2,4)=avar(2,4)+ddx*ddxy
                      avar(2,5)=avar(2,5)+ddx*ddx2
                      avar(2,6)=avar(2,6)+ddx*ddy2
!
                      avar(3,1)=avar(3,1)+ddy 
                      avar(3,2)=avar(3,2)+ddy*ddx
                      avar(3,3)=avar(3,3)+ddy2
                      avar(3,4)=avar(3,4)+ddy*ddxy
                      avar(3,5)=avar(3,5)+ddy*ddx2
                      avar(3,6)=avar(3,6)+ddy*ddy2
!
                      avar(4,1)=avar(4,1)+ddx2
                      avar(4,2)=avar(4,2)+ddx2*ddx
                      avar(4,3)=avar(4,3)+ddx2*ddy
                      avar(4,4)=avar(4,4)+ddx2*ddxy
                      avar(4,5)=avar(4,5)+ddx2*ddx2
                      avar(4,6)=avar(4,6)+ddx2*ddy2
!
                      avar(5,1)=avar(5,1)+ddx2
                      avar(5,2)=avar(5,2)+ddx2*ddx
                      avar(5,3)=avar(5,3)+ddx2*ddy
                      avar(5,4)=avar(5,4)+ddx2*ddxy
                      avar(5,5)=avar(5,5)+ddx2*ddx2
                      avar(5,6)=avar(5,6)+ddx2*ddy2
!
                      avar(6,1)=avar(6,1)+ddy2 
                      avar(6,2)=avar(6,2)+ddy2*ddx
                      avar(6,3)=avar(6,3)+ddy2*ddy
                      avar(6,4)=avar(6,4)+ddy2*ddxy
                      avar(6,5)=avar(6,5)+ddy2*ddx2
                      avar(6,6)=avar(6,6)+ddy2*ddy2
!
                    END IF
 
                  END IF
                END DO  ! igate
!               IF(i==10 .and. j==10 .and. k==5) &
!                 print *, ' jazim,azim,kinbox=',jazim,azmvol(jazim,kk),kinbox
                IF(kinbox == 0) EXIT
              END DO ! jazim
              END IF
!
            END DO ! kk
!           IF(i==10 .and. j==10 .and. k==5) &
!               print *, ' FINAL OUT jjazim,kinbox= ',jazim,kinbox
!
!-----------------------------------------------------------------------
!
!   Solve for variable at grid point
!
!-----------------------------------------------------------------------
!

            knt=nint(avar(1,1))
            IF ( iorder > 1 .and. knt > 6 ) THEN          
              varmean=rhsvar(1)/avar(1,1)
              CALL GJELIM(n,avar,rhsvar,sol,work,work1d,eps,istatus)
              fitvalue=min(varmax,max(varmin,sol(1)))
!             write(6,'(3i3,i7,4f7.1)') i,j,k,knt,                    &
!                    varmin,varmean,varmax,fitvalue
            ELSE IF ( iorder > 0 .and. knt > 5 ) THEN
              DO jj=1,4
                DO ii=1,4
                  array(ii,jj)=avar(ii,jj)
                END DO
              END DO
              DO ii=1,4
                rhsv(ii)=rhsvar(ii)
              END DO
              CALL GJELIM(4,array,rhsv,solv,work,work1d,eps,istatus)
              fitvalue=min(varmax,max(varmin,solv(1)))
!             write(6,'(3i3,a,i6,6f7.1)') i,j,k,'*',knt,              &
!                 varmin,varmean,varmax,gridvar(i,j,k)
            ELSE IF ( knt > 0 ) THEN
              varmean=rhsvar(1)/avar(1,1)
              fitvalue=varmean
!             write(6,'(3i3,a,i6,6f7.1)') i,j,k,'*',knt,              &
!                 varmin,varmean,varmax,fitvalue
            END IF
            varvol(iigate,jjazim,kkelev) = fitvalue
            END IF
          END IF
      ENDIF
   ENDDO
   ENDDO
   ENDDO
!
!  open(19,file='output.dat',form='unformatted',status='unknown')
!    write(19) maxgate
!    write(19) maxazim
!    write(19) maxelev
!    write(19) kntelev
!    write(19) kntazim
!    write(19) kntgate
!    write(19) rngvol
!    write(19) azmvol
!    write(19) elvvol
!    write(19) varvol
!  close(19)

  deallocate(elevmean,stat=istatal)
  deallocate(varsort,stat=istatal)
  deallocate(rxvol,stat=istatal)
  deallocate(ryvol,stat=istatal)
  deallocate(rzvol,stat=istatal)

  RETURN
  END SUBROUTINE QUADFIT 
!
!##################################################################
!##################################################################
!######                                                      ######
!######                  SUBROUTINE WRTVEL                   ######
!######                                                      ######
!######                     Developed by                     ######
!######     Center for Analysis and Prediction of Storms     ######
!######                University of Oklahoma                ######
!######                                                      ######
!##################################################################
!##################################################################
!

  SUBROUTINE WRTVEL(i_angle,i_tilt,varid,                         &,2
                    iyr,imon,iday,ihr,imin,isec,                  &
                    gsp_vel,rfrst_vel,                            &
                    maxgate,maxazim,ngate,nazim,                  &
                    azim,elev,rvel);                                 
!-----------------------------------------------------------------------
!
!  PURPOSE:
!  Write out a tilt of radar data in radar coordinates for plotting 
!
!-----------------------------------------------------------------------
!
!  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
!    i_angle  elevation angle
!    i_tilt   tilt number
!    varid    variable id
!    iyr,imon,iday,ihr,imin,isec    Data time
!    gsp_vel  gate spacing 
!    rfrst_vel distance of first gate to radar
!    azim     azimuthal angles for each radial
!    elev     elevations for each radial    
!    rvel     Doppler radial velocity
!
!  OUTPUT:
!    None 
!
!
!  WORK ARRAYS:
!
!-----------------------------------------------------------------------
!
!  Variable Declarations.
!
!-----------------------------------------------------------------------
!
  IMPLICIT NONE
!
  INTEGER :: maxgate
  INTEGER :: maxazim
  INTEGER :: ngate
  INTEGER :: nazim
  
  INTEGER :: i, j
  INTEGER :: i_angle,i_tilt
  INTEGER :: iyr,imon,iday,ihr,imin,isec
  INTEGER :: gsp_vel,rfrst_vel

  REAL :: rvel(maxgate,maxazim)
  REAL :: elev(maxazim)
  REAL :: azim(maxazim)
!
!-----------------------------------------------------------------------
!
!  Misc. local variables:
!
!-----------------------------------------------------------------------
!
  CHARACTER (LEN=6) :: varid

  CHARACTER (LEN=132) :: tmpdirnam
  CHARACTER (LEN=132) :: vfnam
  INTEGER :: nunit
!  INTEGER :: lfnkey
!-----------------------------------------------------------------------
!
!  Include files:
!
!-----------------------------------------------------------------------
!
   INCLUDE 'globcst.inc'

!-----------------------------------------------------------------------
!
!  Misc. local variables:
!
!-----------------------------------------------------------------------
!
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!  Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
  CALL gtlfnkey( runname, lfnkey )

  tmpdirnam = dirname
  IF ( LEN(tmpdirnam) == 0 .OR. tmpdirnam == ' ' ) THEN
    tmpdirnam = '.'
  END IF

  WRITE (vfnam,'(4A,A6,i6.6)') tmpdirnam(:INDEX(tmpdirnam,' ')-1),     &
      '/', runname(1:lfnkey), '.', varid, i_tilt

  CALL getunit( nunit)
  write(*,'(a)') vfnam

  open(nunit,file=vfnam,form='formatted',status='unknown')
  write(nunit,1003)iyr,imon,iday,ihr,imin,isec

  write(nunit,1004) gsp_vel
  write(nunit,1004) rfrst_vel
  write(nunit,1004) i_angle
  write(nunit,1004) i_tilt
  write(nunit,1004) ngate
  write(nunit,1004) nazim

  write(nunit,1005) (elev(i),i=1,nazim)
  write(nunit,1005) (azim(i),i=1,nazim)

  DO 315 j=1,nazim
    write(nunit,1005) (rvel(i,j),i=1,ngate)
    write(15,1005) (rvel(i,j),i=1,ngate)
315   CONTINUE

1003  format(6i4)
1004  format(i8)
1005  format(16f8.2)
!
  close(nunit)
  CALL retunit(nunit)

  END SUBROUTINE wrtvel