! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE RADCOORD ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE radcoord(nx,ny,nz, & 1,1 x,y,z,zp,xs,ys,zps, & radar_lat,radar_lon,radarx,radary) !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Intialize coordinate fields for the radar remapping routines. ! ! !----------------------------------------------------------------------- ! ! AUTHOR: Keith Brewster, CAPS ! ! MODIFICATION HISTORY: ! !----------------------------------------------------------------------- ! ! INPUT : ! ! nx Number of grid points in the x-direction (east/west) ! ny Number of grid points in the y-direction (north/south) ! nz Number of grid points in the vertical ! ! radar_lat Latitude (degrees) of radar ! radar_lon Longitude (positive East) of radar ! ! OUTPUT: ! ! x x coordinate of grid points in physical/comp. space (m) ! y y coordinate of grid points in physical/comp. space (m) ! z z coordinate of grid points in computational space (m) ! zp Vertical coordinate of grid points in physical space(m) ! ! 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) ! ! radarx x location of radar in grid ! radary y location of radar in grid ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER, INTENT(IN) :: nx INTEGER, INTENT(IN) :: ny INTEGER, INTENT(IN) :: nz REAL, INTENT(IN) :: x(nx) REAL, INTENT(IN) :: y(ny) REAL, INTENT(IN) :: z(nz) 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) :: radar_lat REAL, INTENT(IN) :: radar_lon REAL, INTENT(OUT) :: radarx REAL, INTENT(OUT) :: radary ! !----------------------------------------------------------------------- ! ! Misc. local variables: ! !----------------------------------------------------------------------- ! INTEGER i,j,k ! !----------------------------------------------------------------------- ! ! Include files: ! !----------------------------------------------------------------------- ! INCLUDE 'grid.inc' INCLUDE 'globcst.inc' ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! !----------------------------------------------------------------------- ! ! Set the coordinates of the scalar grid points ! !----------------------------------------------------------------------- ! DO i=1,nx-1 xs(i)=0.5*(x(i)+x(i+1)) END DO xs(nx)=2.0*xs(nx-1)-xs(nx-2) DO j=1,ny-1 ys(j)=0.5*(y(j)+y(j+1)) END DO ys(ny)=2.0*ys(ny-1)-ys(ny-2) 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*zps(i,j,nz-1)-zps(i,j,nz-2) END DO END DO ! CALL lltoxy(1,1,radar_lat,radar_lon,radarx,radary) print *, ' radar_lat,radar_lon: ',radar_lat,radar_lon print *, ' grid radarx = ',radarx,' radary = ',radary RETURN END SUBROUTINE radcoord ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE RMPINIT ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE rmpinit(nx,ny,nz,mxrefgat,mxvelgat,maxazim,maxelev, & 1 kntrgat,kntrazm,kntrelv, & kntvgat,kntvazm,kntvelv, & nyqvvol,timevol, & rngrvol,azmrvol,elvrvol,refvol, & rngvvol,azmvvol,elvvvol,velvol, & gridvel,gridref,gridnyq,gridtim) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Intialize fields for the radar remapping routines. ! ! !----------------------------------------------------------------------- ! ! AUTHOR: Keith Brewster, CAPS ! ! MODIFICATION HISTORY: ! ! 05/17/2002 (Keith Brewster) ! Added initialization of gridvel,gridref,gridnyq,gridtim ! to missing value. ! !----------------------------------------------------------------------- ! ! INPUT : ! ! mxrefgat Maximum number of reflectivity gates ! mxvelgat Maximum number of velocity gates ! maxazim Maximum number of azimuth angles per tilt ! maxelev Maximum number of elevation angles (tilts) ! ! OUTPUT ! ! kntrgat Number of reflectivity gates ! kntrazm Number of reflectivity radials ! kntvelv Number of reflectivity tilts ! ! kntvgat Number of velocity gates ! kntvazm Number of velocity radials ! kntvelv Number of velocity tilts ! ! rngrvol Range to gate in reflectivity 3-D volume ! azmrvol Azimuth angle in reflectivity 3-D volume ! elvrvol Elevation angle in reflectivity 3-D volume ! refvol Reflectivity 3-D volume ! ! 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 ! velvol Velocity 3-D volume ! ! gridvel radial velocity at grid points ! gridref reflectivity at grid points ! gridnyq Nyquist velocity at grid points ! gridtim time (offset) at grid points ! !----------------------------------------------------------------------- ! ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER, INTENT(IN) :: nx INTEGER, INTENT(IN) :: ny INTEGER, INTENT(IN) :: nz INTEGER, INTENT(IN) :: mxrefgat INTEGER, INTENT(IN) :: mxvelgat INTEGER, INTENT(IN) :: maxazim INTEGER, INTENT(IN) :: maxelev INTEGER, INTENT(OUT) :: kntrgat(maxazim,maxelev) INTEGER, INTENT(OUT) :: kntrazm(maxelev) INTEGER, INTENT(OUT) :: kntrelv INTEGER, INTENT(OUT) :: kntvgat(maxazim,maxelev) INTEGER, INTENT(OUT) :: kntvazm(maxelev) INTEGER, INTENT(OUT) :: kntvelv REAL, INTENT(OUT) :: nyqvvol(maxelev) INTEGER, INTENT(OUT) :: timevol(maxazim,maxelev) REAL, INTENT(OUT) :: rngrvol(mxrefgat,maxelev) REAL, INTENT(OUT) :: azmrvol(maxazim,maxelev) REAL, INTENT(OUT) :: elvrvol(maxazim,maxelev) REAL, INTENT(OUT) :: refvol(mxrefgat,maxazim,maxelev) REAL, INTENT(OUT) :: rngvvol(mxvelgat,maxelev) REAL, INTENT(OUT) :: azmvvol(maxazim,maxelev) REAL, INTENT(OUT) :: elvvvol(maxazim,maxelev) REAL, INTENT(OUT) :: velvol(mxvelgat,maxazim,maxelev) REAL, INTENT(OUT) :: gridvel(nx,ny,nz) REAL, INTENT(OUT) :: gridref(nx,ny,nz) REAL, INTENT(OUT) :: gridnyq(nx,ny,nz) REAL, INTENT(OUT) :: gridtim(nx,ny,nz) ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! !----------------------------------------------------------------------- ! ! Initialize counters to zero and fill data arrays with missing value ! !----------------------------------------------------------------------- ! kntrelv = 0 kntrazm = 0 kntrgat = 0 kntvelv = 0 kntvazm = 0 kntvgat = 0 nyqvvol = 0. timevol = 0 elvrvol = -999. azmrvol = -999. rngrvol = -999. refvol = -999. elvvvol = -999. azmvvol = -999. rngvvol = -999. velvol = -999. gridvel = -999. gridref = -999. gridnyq = -999. gridtim = -999. RETURN END SUBROUTINE rmpinit ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE VOLBUILD ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE volbuild(maxgate,maxazim,maxelev,ngate,nazim, & 2 nyqset,timeset, & kntgate,kntazim,kntelev, & gatesp,rfirstg,varchek, & vnyquist,time, & azim,elev,vartilt, & nyqvvol,timevol, & rngvol,azmvol,elvvol,varvol) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Build a 3-D volume of radar data from 2-D tilts. ! ! !----------------------------------------------------------------------- ! ! AUTHOR: Keith Brewster, CAPS ! ! MODIFICATION HISTORY: ! ! 2002/07/25 Yunheng Wang ! Changed timevol from REAL to INTEGER. ! ! 2003/07/01 Keith Brewster ! Changed input time variable to INTEGER. ! Added a few enhancements to documentation. ! !----------------------------------------------------------------------- ! ! INPUT : ! ! maxgate Maximum gates in a radial ! maxazim Maximum radials per tilt ! maxelev Maximum number of tilts ! ! ngate Number of gates in each radial ! nazim Number of radials in each tilt ! ! nyqset Flag whether to save and use nyquist data for this tilt ! 0: don't use 1: save and use ! timeset Flag whether to save and use time data for this tilt ! 0: don't use 1: save and use ! ! kntgate Number of gates in radials ! kntazim Number of azimuth radials for each elevation angle ! kntelev Number of elevation angles (tilts) ! ! gatesp Gate spacing ! rfirstg Range (m) to first gate ! varchek Threshold value to determine good vs. flagged data ! ! vnyquist Nyquist velocity ! time Time (offset) ! ! azim Azimuth angles ! elev Elevation angles ! vartilt Radar variable (reflectivity, velocity or spectrum width) ! ! OUTPUT: ! ! kntgate Number of gates in each radial (3-D) ! kntazim Number of radials in each tilt (3-D) ! kntelev Number of elevation angles (tilts) ! ! kntazim Number of radials in each tilt (3-D) ! kntelev Number of elevation angles (tilts) ! ! nyqvvol Nyquist velocity ! timevol Time (offset) ! rngvol Range to gate ! azmvol Azimuth angle ! elvvol Elevation angle ! varvol Radar variables accumulated in 3-D array ! !----------------------------------------------------------------------- ! ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! IMPLICIT NONE INTEGER, INTENT(IN) :: maxgate INTEGER, INTENT(IN) :: maxazim INTEGER, INTENT(IN) :: maxelev INTEGER, INTENT(IN) :: ngate INTEGER, INTENT(IN) :: nazim INTEGER, INTENT(IN) :: nyqset INTEGER, INTENT(IN) :: timeset INTEGER, INTENT(INOUT) :: kntgate(maxazim,maxelev) INTEGER, INTENT(INOUT) :: kntazim(maxelev) INTEGER, INTENT(INOUT) :: kntelev INTEGER, INTENT(IN) :: gatesp INTEGER, INTENT(IN) :: rfirstg REAL, INTENT(IN) :: varchek REAL, INTENT(IN) :: vnyquist INTEGER, INTENT(IN) :: time(maxazim) REAL, INTENT(IN) :: azim(maxazim) REAL, INTENT(IN) :: elev(maxazim) REAL, INTENT(IN) :: vartilt(maxgate,maxazim) REAL, INTENT(OUT) :: nyqvvol(maxelev) INTEGER, INTENT(OUT) :: timevol(maxazim,maxelev) REAL, INTENT(OUT) :: rngvol(maxgate,maxelev) REAL, INTENT(OUT) :: azmvol(maxazim,maxelev) REAL, INTENT(OUT) :: elvvol(maxazim,maxelev) REAL, INTENT(OUT) :: varvol(maxgate,maxazim,maxelev) ! !----------------------------------------------------------------------- ! ! Misc. local variables: ! !----------------------------------------------------------------------- ! INTEGER :: igate,jazim,kelev ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! kntelev = kntelev + 1 kelev = kntelev kntazim(kelev) = nazim IF(nyqset > 0 ) nyqvvol(kelev) = vnyquist DO igate = 1, maxgate rngvol(igate,kelev)=rfirstg+(igate-1)*gatesp END DO IF( timeset > 0 ) THEN DO jazim = 1, nazim timevol(jazim,kelev)=time(jazim) azmvol(jazim,kelev)=azim(jazim) elvvol(jazim,kelev)=elev(jazim) END DO ELSE DO jazim = 1, nazim azmvol(jazim,kelev)=azim(jazim) elvvol(jazim,kelev)=elev(jazim) END DO END IF DO jazim = 1, nazim DO igate=1, ngate varvol(igate,jazim,kelev)=vartilt(igate,jazim) IF (vartilt(igate,jazim) > varchek) & kntgate(jazim,kelev)=max(kntgate(jazim,kelev),igate) END DO END DO RETURN END SUBROUTINE volbuild ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE REMAPVOL ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE remapvol(maxgate,maxazim,maxelev,nx,ny,nz,nzsnd,maxsort, & 2,7 vardump,nyqset,timeset,rfropt, & varid,varname,varunits, & varchek,varmiss,vmedlim,dazlim,iorder, & kntgate,kntazim,kntelev, & rdrlat,rdrlon,radarx,radary,rdralt,dazim, & rngmin,rngmax,time1st, & rngvol,azmvol,elvvol, & varvol,timevol,nyqvvol,rxvol,ryvol,rzvol, & xs,ys,zps,zsnd,rfrsnd,varsort,elvmean, & gridvar,gridtim,gridnyq,istatus) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Take data from a radar volume in polar coordinates and map it to ! ARPS Cartesian terrain-following grid. Uses a least squares ! local quadratic fit to remap the data. ! !----------------------------------------------------------------------- ! ! AUTHOR: Keith Brewster, CAPS ! ! MODIFICATION HISTORY: ! 08-Oct-2003 Keith Brewster ! Modified search logic to search at least jsrchmn (2) radials ! from estimated closest radial. Expanded the area included ! in least sq fit to be 1.5 times width of radial. Makes for ! better horizontal continuity with more overlap of data. ! ! 14-Jan-2004 Keith Brewster ! Modified logic to avoid possibility of overflow of varsort. ! varsort and elvmean arrays are now allocated outside and ! passed into this routine. ! !----------------------------------------------------------------------- ! ! INPUT : ! ! maxgate Maximum gates in a radial ! maxazim Maximum radials per tilt ! maxelev Maximum number of tilts ! ! nx Number of grid points in the x-direction (east/west) ! ny Number of grid points in the y-direction (north/south) ! nz Number of grid points in the vertical ! ! nzsnd Number of levels in refractivity sounding arrays ! maxsort Number of elements in sorting vector for computing median ! ! vardump Switch for writing (1) or not writing (0) remapped data to file ! nyqset Switch for setting (1) or not setting (0) the nyquist variable ! timeset Switch for setting (1) or not setting (0) the time variable ! rfropt Rafractivity option (1: std atmos lapse, 2: avg actual lapse rate) ! ! varid Radar variable ID for diagnostic file writing ! varname Name of radar variable for diagnostic file writing ! varunits Units of radar variable for diagnostic file writing ! ! varchek Threshold for checking data, good vs. flagged ! varmiss Value to assign to data for missing ! 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 ! iorder Order of polynomial to fit (1: linear, 2: quadratic) ! ! kntgate Number of gates in radials ! kntazim Number of azimuth radials for each elevation angle ! kntelev Number of elevation angles (tilts) ! ! rdrlat Latitude (degrees N) of radar ! rdrlon Longitude (degrees E) of radar ! radarx x-location of radar ! radary y-location of radar ! rdralt Elevation (m MSL) of radar ! dazim Typical azimuth spacing for this dataset (degrees) ! ! 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 ! time1st Time of first datum in this volume scan ! ! rngvol Range to gate in velocity 3-D volume ! azmvol Azimuth angle in velocity 3-D volume ! elvvol Elevation angle in velocity 3-D volume ! varvol Radar data 3-D volume ! timevol Time 3-D volume ! nyqvvol Nyquist vel 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) ! ! zsnd Heights of levels in refractivity profile ! rfrsnd Refractivity profile ! ! OUTPUT: ! ! varsort Temporary array used for computing the mean ! elvmean Temporary array average elevation angle for each tilt ! ! rxvol x-coordinate at radar data location ! ryvol y-coordinate at radar data location ! rzvol z-coordinate at radar data location ! ! gridvar Radar variable remapped to scalar points ! gridtim Radar time (offset) on scalar points ! gridnyq Radar Nyquist velocity remapped to scalar points ! ! istatus Status indicator ! !----------------------------------------------------------------------- ! ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! IMPLICIT NONE ! INTEGER, INTENT(IN) :: maxgate INTEGER, INTENT(IN) :: maxazim INTEGER, INTENT(IN) :: maxelev INTEGER, INTENT(IN) :: nx INTEGER, INTENT(IN) :: ny INTEGER, INTENT(IN) :: nz INTEGER, INTENT(IN) :: nzsnd INTEGER, INTENT(IN) :: maxsort INTEGER, INTENT(IN) :: vardump INTEGER, INTENT(IN) :: nyqset INTEGER, INTENT(IN) :: timeset INTEGER, INTENT(IN) :: rfropt CHARACTER (LEN=6), INTENT(IN) :: varid CHARACTER (LEN=20), INTENT(IN) :: varname CHARACTER (LEN=20), INTENT(IN) :: varunits REAL, INTENT(IN) :: varchek REAL, INTENT(IN) :: varmiss 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) :: rdrlat REAL, INTENT(IN) :: rdrlon REAL, INTENT(IN) :: radarx REAL, INTENT(IN) :: radary REAL, INTENT(IN) :: rdralt REAL, INTENT(IN) :: dazim REAL, INTENT(IN) :: rngmin REAL, INTENT(IN) :: rngmax INTEGER, INTENT(IN) :: time1st REAL, INTENT(IN) :: nyqvvol(maxelev) INTEGER, INTENT(IN) :: timevol(maxazim,maxelev) REAL, INTENT(IN) :: rngvol(maxgate,maxelev) REAL, INTENT(IN) :: azmvol(maxazim,maxelev) REAL, INTENT(IN) :: elvvol(maxazim,maxelev) REAL, INTENT(IN) :: varvol(maxgate,maxazim,maxelev) REAL, INTENT(OUT) :: rxvol(maxgate,maxazim,maxelev) REAL, INTENT(OUT) :: ryvol(maxgate,maxazim,maxelev) REAL, INTENT(OUT) :: rzvol(maxgate,maxazim,maxelev) REAL, INTENT(IN) :: xs(nx) REAL, INTENT(IN) :: ys(ny) REAL, INTENT(IN) :: zps(nx,ny,nz) REAL, INTENT(IN) :: zsnd(nzsnd) REAL, INTENT(IN) :: rfrsnd(nzsnd) REAL, INTENT(OUT) :: varsort(maxsort) REAL, INTENT(OUT) :: elvmean(maxelev) REAL, INTENT(OUT) :: gridvar(nx,ny,nz) REAL, INTENT(OUT) :: gridnyq(nx,ny,nz) REAL, INTENT(OUT) :: gridtim(nx,ny,nz) INTEGER, INTENT(OUT) :: istatus ! !----------------------------------------------------------------------- ! ! Misc. Local Variables ! !----------------------------------------------------------------------- ! INTEGER, PARAMETER :: n = 7 REAL :: avar(n,n) REAL :: rhsvar(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 REAL, PARAMETER :: dxlim0 = 1.1 INTEGER :: ii,jj,kk,i,j,k,knt,kinbox INTEGER :: kok,isort,jsort,mid,maxkok INTEGER :: kbgn,kend INTEGER :: igate,jazim,kelev,jazmin,jmirror,jend,jknt INTEGER :: istatal,istatwrt ! ! jsrchmn is the minimum number of radials to search to find data ! that are within the distance limits of the grid center. ! INTEGER, PARAMETER :: jsrchmn = 2 REAL, PARAMETER :: bmwidth = 1.0 REAL :: deg2rad,rad2deg REAL :: elevmin,elevmax REAL :: delx,dely,delz,dazimr,daz,azdiff,ff REAL :: ddx,ddxy,ddx2,ddy,ddy2,ddz,dxthr,dxthr0 REAL :: mapfct,xcomp,ycomp,azmrot,sfcr,zagl REAL :: sum,sum2,sdev,thresh,slrange,elijk,azimijk,time REAL :: varmax,varmin,varavg,varmean,varmed ! !----------------------------------------------------------------------- ! ! Include files: ! !----------------------------------------------------------------------- INCLUDE 'globcst.inc' INCLUDE 'grid.inc' ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! deg2rad = atan(1.)/45. rad2deg = 1./deg2rad dazimr=dxlim0*dazim*deg2rad dxthr0=dxlim0*max((xs(3)-xs(2)),(ys(3)-ys(2))) maxkok=0 CALL lattomf(1,1,rdrlat,mapfct) 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 elvmean(kelev)=sum/float(kntazim(kelev)) END DO ! ! Allow variation within half a beamwidth ! elevmin=elevmin-(0.5*bmwidth) elevmax=elevmax+(0.5*bmwidth) ! write(6,'(a)') & ' i j k knt min mean max intrp' ! DO k=1,nz DO j=1,ny DO i=1,nx gridvar(i,j,k)=varmiss gridtim(i,j,k)=0. gridnyq(i,j,k)=0. END DO END DO END DO ! DO kelev=1,kntelev DO jazim=1,kntazim(kelev) CALL ddrotuv(1,rdrlon,azmvol(jazim,kelev),mapfct, & azmrot,xcomp,ycomp) DO igate=1,kntgate(jazim,kelev) CALL beamhgtn(nzsnd,zsnd,rfrsnd,rdralt,rfropt, & elvvol(jazim,kelev),rngvol(igate,kelev),zagl,sfcr) rxvol(igate,jazim,kelev)=radarx-xcomp*sfcr ryvol(igate,jazim,kelev)=radary-ycomp*sfcr rzvol(igate,jazim,kelev)=rdralt+zagl END DO END DO END DO ! DO k=2,nz-1 DO j=1,ny-1 DO i=1,nx-1 kok=0 sum=0. sum2=0. varavg=999999. varsort=999999. delx=xs(i)-radarx dely=ys(j)-radary delz=zps(i,j,k)-rdralt slrange=sqrt(delx*delx+dely*dely+delz*delz) ! IF(delz >= 0. .AND. slrange > rngmin .AND. slrange < rngmax ) THEN dxthr=max(dxthr0,((slrange+dxthr0)*dazimr)) elijk=rad2deg*asin(delz/slrange) IF(elijk >= elevmin .AND. elijk <= elevmax) THEN ! !----------------------------------------------------------------------- ! ! Determine azimuth to this grid cell ! !----------------------------------------------------------------------- ! CALL uvrotdd(1,1,rdrlon,-delx,-dely,azimijk,ff) ! DO kelev=2,kntelev-1 IF(elvmean(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=kbgn,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) IF(nyqset > 0) gridnyq(i,j,k) = nyqvvol(kk) IF(timeset > 0) gridtim(i,j,k) = & float(timevol(jazmin,kk)-time1st) 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 ! !----------------------------------------------------------------------- ! ! First pass, find median, avg, std dev. ! ! ! Loop forward from jazmin ! !----------------------------------------------------------------------- ! jend=kntazim(kk) IF(jmirror > jazmin) jend=jmirror-1 jknt=0 DO jazim=jazmin,jend kinbox=0 jknt=jknt+1 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(i) ddy=ryvol(igate,jazim,kk)-ys(j) ! 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 IF( kok > 0 ) 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 ELSE isort=1 END IF varsort(isort)=varvol(igate,jazim,kk) END IF sum=sum+varvol(igate,jazim,kk) sum2=sum2+(varvol(igate,jazim,kk)*varvol(igate,jazim,kk)) kok=kok+1 END IF ! data ok END IF ! inside box END DO ! igate IF(kinbox == 0 .AND. jknt > jsrchmn) EXIT END DO ! jazim ! !----------------------------------------------------------------------- ! ! IF kinbox > 0 continue from jazim=1 ! !----------------------------------------------------------------------- ! IF((kinbox > 0 .OR. jknt <= jsrchmn) .and. jend==kntazim(kk)) THEN DO jazim=1,jmirror-1 kinbox=0 jknt=jknt+1 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(i) ddy=ryvol(igate,jazim,kk)-ys(j) 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 IF(kok > 0 ) 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 ELSE isort=1 END IF varsort(isort)=varvol(igate,jazim,kk) END IF sum=sum+varvol(igate,jazim,kk) sum2=sum2+(varvol(igate,jazim,kk)*varvol(igate,jazim,kk)) kok=kok+1 END IF END IF END DO IF(kinbox == 0 .AND. jknt > jsrchmn ) EXIT END DO END IF ! !----------------------------------------------------------------------- ! ! Loop backward from jazmin ! !----------------------------------------------------------------------- ! jend= 1 IF(jmirror < jazmin) jend=jmirror jknt=0 DO jazim=jazmin-1,jend,-1 kinbox=0 jknt=jknt+1 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(i) ddy=ryvol(igate,jazim,kk)-ys(j) 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 IF( kok > 0 ) 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 ELSE isort=1 END IF varsort(isort)=varvol(igate,jazim,kk) END IF sum=sum+varvol(igate,jazim,kk) sum2=sum2+(varvol(igate,jazim,kk)*varvol(igate,jazim,kk)) kok=kok+1 END IF END IF END DO IF(kinbox == 0 .AND. jknt > jsrchmn) EXIT END DO ! !----------------------------------------------------------------------- ! ! If not yet outside box, continue from last radial. ! !----------------------------------------------------------------------- ! IF((kinbox > 0 .OR. jknt <= jsrchmn) .and. jend==1 ) THEN DO jazim=kntazim(kk),jmirror,-1 kinbox=0 jknt=jknt+1 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(i) ddy=ryvol(igate,jazim,kk)-ys(j) ! 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 IF( kok > 0 ) 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 ELSE isort=1 END IF varsort(isort)=varvol(igate,jazim,kk) END IF sum=sum+varvol(igate,jazim,kk) sum2=sum2+(varvol(igate,jazim,kk)*varvol(igate,jazim,kk)) kok=kok+1 END IF END IF END DO ! igate IF(kinbox == 0 .and. jknt > jsrchmn) EXIT END DO ! jazim END IF END DO ! kk ! IF( kok == 0 ) CYCLE varavg=sum/float(kok) IF( kok <= maxsort ) THEN mid=(kok/2)+1 varmed=varsort(mid) ELSE varmed=varavg END IF IF ( kok > 1 ) THEN sdev=sqrt((sum2-(sum*sum/float(kok)))/float(kok-1)) thresh=max((2.*sdev),vmedlim) ELSE thresh=vmedlim END IF maxkok=max(maxkok,kok) ! !----------------------------------------------------------------------- ! ! Process data for local quadratic fit ! !----------------------------------------------------------------------- ! DO kk=kbgn,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) ! !----------------------------------------------------------------------- ! ! Loop forward from jazmin ! !----------------------------------------------------------------------- ! jend=kntazim(kk) IF(jmirror > jazmin) jend=jmirror-1 jknt=0 DO jazim=jazmin,jend kinbox=0 jknt=jknt+1 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(i) ddy=ryvol(igate,jazim,kk)-ys(j) ddz=rzvol(igate,jazim,kk)-zps(i,j,k) ! 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)*ddz rhsvar(5)=rhsvar(5)+varvol(igate,jazim,kk)*ddxy rhsvar(6)=rhsvar(6)+varvol(igate,jazim,kk)*ddx2 rhsvar(7)=rhsvar(7)+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)+ddz avar(1,5)=avar(1,5)+ddxy avar(1,6)=avar(1,6)+ddx2 avar(1,7)=avar(1,7)+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*ddz avar(2,5)=avar(2,5)+ddx*ddxy avar(2,6)=avar(2,6)+ddx*ddx2 avar(2,7)=avar(2,7)+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*ddz avar(3,5)=avar(3,5)+ddy*ddx2 avar(3,6)=avar(3,6)+ddy*ddx2 avar(3,7)=avar(3,7)+ddy*ddy2 ! avar(4,1)=avar(4,1)+ddz avar(4,2)=avar(4,2)+ddz*ddx avar(4,3)=avar(4,3)+ddz*ddy avar(4,4)=avar(4,4)+ddz*ddz avar(4,5)=avar(4,5)+ddz*ddxy avar(4,6)=avar(4,6)+ddz*ddx2 avar(4,7)=avar(4,7)+ddz*ddy2 ! avar(5,1)=avar(5,1)+ddxy avar(5,2)=avar(5,2)+ddxy*ddx avar(5,3)=avar(5,3)+ddxy*ddy avar(5,4)=avar(5,4)+ddxy*ddz avar(5,5)=avar(5,5)+ddxy*ddxy avar(5,6)=avar(5,6)+ddxy*ddx2 avar(5,7)=avar(5,7)+ddxy*ddy2 ! avar(6,1)=avar(6,1)+ddx2 avar(6,2)=avar(6,2)+ddx2*ddx avar(6,3)=avar(6,3)+ddx2*ddy avar(6,4)=avar(6,4)+ddx2*ddz avar(6,5)=avar(6,5)+ddx2*ddxy avar(6,6)=avar(6,6)+ddx2*ddx2 avar(6,7)=avar(6,7)+ddx2*ddy2 ! avar(7,1)=avar(7,1)+ddy2 avar(7,2)=avar(7,2)+ddy2*ddx avar(7,3)=avar(7,3)+ddy2*ddy avar(7,4)=avar(7,4)+ddy2*ddz avar(7,5)=avar(7,5)+ddy2*ddxy avar(7,6)=avar(7,6)+ddy2*ddx2 avar(7,7)=avar(7,7)+ddy2*ddy2 ! END IF ! END IF END DO ! igate IF( kinbox == 0 .AND. jknt > jsrchmn) EXIT END DO ! jazim ! !----------------------------------------------------------------------- ! ! IF kinbox > 0 continue from jazim=1 ! !----------------------------------------------------------------------- ! IF((kinbox > 0 .OR. jknt <= jsrchmn) .and. jend==kntazim(kk)) THEN DO jazim=1,jmirror-1 kinbox=0 jknt=jknt+1 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(i) ddy=ryvol(igate,jazim,kk)-ys(j) ddz=rzvol(igate,jazim,kk)-zps(i,j,k) ! 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)*ddz rhsvar(5)=rhsvar(5)+varvol(igate,jazim,kk)*ddxy rhsvar(6)=rhsvar(6)+varvol(igate,jazim,kk)*ddx2 rhsvar(7)=rhsvar(7)+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)+ddz avar(1,5)=avar(1,5)+ddxy avar(1,6)=avar(1,6)+ddx2 avar(1,7)=avar(1,7)+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*ddz avar(2,5)=avar(2,5)+ddx*ddxy avar(2,6)=avar(2,6)+ddx*ddx2 avar(2,7)=avar(2,7)+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*ddz avar(3,5)=avar(3,5)+ddy*ddxy avar(3,6)=avar(3,6)+ddy*ddx2 avar(3,7)=avar(3,7)+ddy*ddy2 ! avar(4,1)=avar(4,1)+ddz avar(4,2)=avar(4,2)+ddz*ddx avar(4,3)=avar(4,3)+ddz*ddy avar(4,4)=avar(4,4)+ddz*ddz avar(4,5)=avar(4,5)+ddz*ddxy avar(4,6)=avar(4,6)+ddz*ddx2 avar(4,7)=avar(4,7)+ddz*ddy2 ! avar(5,1)=avar(5,1)+ddxy avar(5,2)=avar(5,2)+ddxy*ddx avar(5,3)=avar(5,3)+ddxy*ddy avar(5,4)=avar(5,4)+ddxy*ddz avar(5,5)=avar(5,5)+ddxy*ddxy avar(5,6)=avar(5,6)+ddxy*ddx2 avar(5,7)=avar(5,7)+ddxy*ddy2 avar(6,1)=avar(6,1)+ddx2 avar(6,2)=avar(6,2)+ddx2*ddx avar(6,3)=avar(6,3)+ddx2*ddy avar(6,4)=avar(6,4)+ddx2*ddz avar(6,5)=avar(6,5)+ddx2*ddxy avar(6,6)=avar(6,6)+ddx2*ddx2 avar(6,7)=avar(6,7)+ddx2*ddy2 ! avar(7,1)=avar(7,1)+ddy2 avar(7,2)=avar(7,2)+ddy2*ddx avar(7,3)=avar(7,3)+ddy2*ddy avar(7,4)=avar(7,4)+ddy2*ddz avar(7,5)=avar(7,5)+ddy2*ddxy avar(7,6)=avar(7,6)+ddy2*ddx2 avar(7,7)=avar(7,7)+ddy2*ddy2 ! END IF ! END IF END DO ! igate IF( kinbox == 0 .AND. jknt > jsrchmn ) EXIT END DO ! jazim END IF ! !----------------------------------------------------------------------- ! ! Loop backward from jazmin ! !----------------------------------------------------------------------- ! jend= 1 IF(jmirror < jazmin) jend=jmirror jknt=0 DO jazim=jazmin-1,jend,-1 kinbox=0 jknt=jknt+1 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(i) ddy=ryvol(igate,jazim,kk)-ys(j) ddz=rzvol(igate,jazim,kk)-zps(i,j,k) ! 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)*ddz rhsvar(5)=rhsvar(5)+varvol(igate,jazim,kk)*ddxy rhsvar(6)=rhsvar(6)+varvol(igate,jazim,kk)*ddx2 rhsvar(7)=rhsvar(7)+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)+ddz avar(1,5)=avar(1,5)+ddxy avar(1,6)=avar(1,6)+ddx2 avar(1,7)=avar(1,7)+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*ddz avar(2,5)=avar(2,5)+ddx*ddxy avar(2,6)=avar(2,6)+ddx*ddx2 avar(2,7)=avar(2,7)+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*ddz avar(3,5)=avar(3,5)+ddy*ddxy avar(3,6)=avar(3,6)+ddy*ddx2 avar(3,7)=avar(3,7)+ddy*ddy2 ! avar(4,1)=avar(4,1)+ddz avar(4,2)=avar(4,2)+ddz*ddx avar(4,3)=avar(4,3)+ddz*ddy avar(4,4)=avar(4,4)+ddz*ddz avar(4,5)=avar(4,5)+ddz*ddxy avar(4,6)=avar(4,6)+ddz*ddx2 avar(4,7)=avar(4,7)+ddz*ddy2 ! avar(5,1)=avar(5,1)+ddxy avar(5,2)=avar(5,2)+ddxy*ddx avar(5,3)=avar(5,3)+ddxy*ddy avar(5,4)=avar(5,4)+ddxy*ddz avar(5,5)=avar(5,5)+ddxy*ddxy avar(5,6)=avar(5,6)+ddxy*ddx2 avar(5,7)=avar(5,7)+ddxy*ddy2 ! avar(6,1)=avar(6,1)+ddx2 avar(6,2)=avar(6,2)+ddx2*ddx avar(6,3)=avar(6,3)+ddx2*ddy avar(6,4)=avar(6,4)+ddx2*ddz avar(6,5)=avar(6,5)+ddx2*ddxy avar(6,6)=avar(6,6)+ddx2*ddx2 avar(6,7)=avar(6,7)+ddx2*ddy2 ! avar(7,1)=avar(7,1)+ddy2 avar(7,2)=avar(7,2)+ddy2*ddx avar(7,3)=avar(7,3)+ddy2*ddy avar(7,4)=avar(7,4)+ddy2*ddz avar(7,5)=avar(7,5)+ddy2*ddxy avar(7,6)=avar(7,6)+ddy2*ddx2 avar(7,7)=avar(7,7)+ddy2*ddy2 ! END IF ! END IF END DO ! igate IF( kinbox == 0 .AND. jknt > jsrchmn ) EXIT END DO ! jazim ! !----------------------------------------------------------------------- ! ! If not yet outside box, continue from last radial. ! !----------------------------------------------------------------------- ! IF((kinbox > 0 .OR. jknt <= jsrchmn) .and. jend==1 ) THEN DO jazim=kntazim(kk),jmirror,-1 kinbox=0 jknt=jknt+1 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(i) ddy=ryvol(igate,jazim,kk)-ys(j) ddz=rzvol(igate,jazim,kk)-zps(i,j,k) ! 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)*ddz rhsvar(5)=rhsvar(5)+varvol(igate,jazim,kk)*ddxy rhsvar(6)=rhsvar(6)+varvol(igate,jazim,kk)*ddx2 rhsvar(7)=rhsvar(7)+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)+ddz avar(1,5)=avar(1,5)+ddxy avar(1,6)=avar(1,6)+ddx2 avar(1,7)=avar(1,7)+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*ddz avar(2,5)=avar(2,5)+ddx*ddxy avar(2,6)=avar(2,6)+ddx*ddx2 avar(2,7)=avar(2,7)+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*ddz avar(3,5)=avar(3,5)+ddy*ddxy avar(3,6)=avar(3,6)+ddy*ddx2 avar(3,7)=avar(3,7)+ddy*ddy2 ! avar(4,1)=avar(4,1)+ddz avar(4,2)=avar(4,2)+ddz*ddx avar(4,3)=avar(4,3)+ddz*ddy avar(4,4)=avar(4,4)+ddz*ddz avar(4,5)=avar(4,5)+ddz*ddxy avar(4,6)=avar(4,6)+ddz*ddx2 avar(4,7)=avar(4,7)+ddz*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*ddz avar(5,5)=avar(5,5)+ddx2*ddxy avar(5,6)=avar(5,6)+ddx2*ddx2 avar(5,7)=avar(5,7)+ddx2*ddy2 ! avar(6,1)=avar(6,1)+ddx2 avar(6,2)=avar(6,2)+ddx2*ddx avar(6,3)=avar(6,3)+ddx2*ddy avar(6,4)=avar(6,4)+ddx2*ddz avar(6,5)=avar(6,5)+ddx2*ddxy avar(6,6)=avar(6,6)+ddx2*ddx2 avar(6,7)=avar(6,7)+ddx2*ddy2 ! avar(7,1)=avar(7,1)+ddy2 avar(7,2)=avar(7,2)+ddy2*ddx avar(7,3)=avar(7,3)+ddy2*ddy avar(7,4)=avar(7,4)+ddy2*ddz avar(7,5)=avar(7,5)+ddy2*ddxy avar(7,6)=avar(7,6)+ddy2*ddx2 avar(7,7)=avar(7,7)+ddy2*ddy2 ! END IF END IF END DO ! igate IF( kinbox == 0 .AND. jknt > jsrchmn ) EXIT END DO ! jazim END IF ! END DO ! kk ! !----------------------------------------------------------------------- ! ! Solve for variable at grid point ! !----------------------------------------------------------------------- ! knt=nint(avar(1,1)) IF ( iorder > 1 .and. knt > 7 ) THEN varmean=rhsvar(1)/avar(1,1) CALL GJELIM(n,avar,rhsvar,sol,work,work1d,eps,istatus) gridvar(i,j,k)=min(varmax,max(varmin,sol(1))) ! write(6,'(3i3,i7,4f7.1)') i,j,k,knt, & ! varmin,varmean,varmax,gridvar(i,j,k) 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) gridvar(i,j,k)=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) gridvar(i,j,k)=varmean ! write(6,'(3i3,a,i6,6f7.1)') i,j,k,'*',knt, & ! varmin,varmean,varmax,gridvar(i,j,k) END IF END IF END IF END DO ! i loop END DO ! j loop END DO ! k loop IF(maxkok > maxsort) THEN WRITE(6,'(a,i10,/a,i10,a,/a)') & ' remapvol Note ... max gate count =',maxkok, & ' exceeded sort space allocated =',maxsort, & ' for median check.', & ' Where maxsort is exceeded avg used in place of median for QC.' ELSE WRITE(6,'(a,i10,/a,i10)') & ' remapvol: FYI max gate count in grid vol =',maxkok, & ' Sort space allocated for median check =',maxsort END IF IF( vardump == 1 ) & CALL wrtvar1(nx,ny,nz,gridvar,varid,varname,varunits, & time,runname,dirname,istatwrt) RETURN END SUBROUTINE remapvol ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE REMAP2D ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE remap2d(maxgate,maxazim,maxelev,nx,ny,nzsnd,maxsort, & 2,7 vardump,rfropt, & varid,varname,varunits, & varchek,varmiss,vmedlim,dazlim,iorder, & kntgate,kntazim,kntelev, & rdrlat,rdrlon,radarx,radary,rdralt,dazim, & rngmin,rngmax, & rngvol,azmvol,elvvol, & varvol,rxvol,ryvol, & xs,ys,zsnd,rfrsnd,varsort,gridvar,istatus) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Take data from the lowest tilt and remap it onto a plane for ! purposes of display in comparison to the ARPS k=2 reflectivity. ! Uses a least squares a local quadratic fit to remap the data. ! !----------------------------------------------------------------------- ! ! AUTHOR: Keith Brewster, CAPS ! June, 2002 ! ! MODIFICATION HISTORY: ! 08-Oct-2003 Keith Brewster ! Modified search logic to search at least jsrchmn (2) radials ! from estimated closest radial. Expanded the area included ! in least sq fit to be 1.5 times width of radial. Makes for ! better horizontal continuity with more overlap of data. ! ! 14-Jan-2004 Keith Brewster ! Modified logic to avoid possibility of overflow of varsort. ! varsort and elvmean arrays are now allocated outside and ! passed into this routine. ! !----------------------------------------------------------------------- ! ! INPUT : ! ! maxgate Maximum gates in a radial ! maxazim Maximum radials per tilt ! maxelev Maximum number of tilts ! ! nx Number of grid points in the x-direction (east/west) ! ny Number of grid points in the y-direction (north/south) ! ! nzsnd Number of levels in refractivity sounding arrays ! maxsort Number of elements in sorting vector for computing median ! ! vardump Switch for writing (1) or not writing (0) remapped data to file ! rfropt Rafractivity option (1: std atmos lapse, 2: avg actual lapse rate) ! ! varid Radar variable ID for diagnostic file writing ! varname Name of radar variable for diagnostic file writing ! varunits Units of radar variable for diagnostic file writing ! ! varchek Threshold for checking data, good vs. flagged ! varmiss Value to assign to data for missing ! 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 ! iorder Order of polynomial to fit (1: linear, 2: quadratic) ! ! kntgate Number of gates in radials ! kntazim Number of azimuth radials for each elevation angle ! kntelev Number of elevation angles (tilts) ! ! rdrlat Latitude (degrees N) of radar ! rdrlon Longitude (degrees E) of radar ! radarx x-location of radar ! radary y-location of radar ! rdralt Elevation (m MSL) of radar ! dazim Typical azimuth spacing for this dataset (degrees) ! ! 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) ! ! zsnd Heights of levels in refractivity profile ! rfrsnd Refractivity profile ! ! OUTPUT: ! ! varsort Temporary array used for computing the mean ! elvmean Temporary array average elevation angle for each tilt ! ! rxvol x-coordinate at radar data location ! ryvol y-coordinate at radar data location ! ! gridvar Radar variable remapped to scalar points ! ! istatus Status indicator ! !----------------------------------------------------------------------- ! ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! IMPLICIT NONE ! INTEGER, INTENT(IN) :: maxgate INTEGER, INTENT(IN) :: maxazim INTEGER, INTENT(IN) :: maxelev INTEGER, INTENT(IN) :: nx INTEGER, INTENT(IN) :: ny INTEGER, INTENT(IN) :: nzsnd INTEGER, INTENT(IN) :: maxsort INTEGER, INTENT(IN) :: vardump INTEGER, INTENT(IN) :: rfropt CHARACTER (LEN=6), INTENT(IN) :: varid CHARACTER (LEN=20), INTENT(IN) :: varname CHARACTER (LEN=20), INTENT(IN) :: varunits REAL, INTENT(IN) :: varchek REAL, INTENT(IN) :: varmiss 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) :: rdrlat REAL, INTENT(IN) :: rdrlon 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(IN) :: varvol(maxgate,maxazim,maxelev) REAL, INTENT(OUT) :: rxvol(maxgate,maxazim,maxelev) REAL, INTENT(OUT) :: ryvol(maxgate,maxazim,maxelev) REAL, INTENT(IN) :: xs(nx) REAL, INTENT(IN) :: ys(ny) REAL, INTENT(IN) :: zsnd(nzsnd) REAL, INTENT(IN) :: rfrsnd(nzsnd) REAL, INTENT(OUT) :: varsort(maxsort) REAL, INTENT(OUT) :: gridvar(nx,ny) 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(3,3) REAL :: rhsv(3) REAL :: solv(3) REAL, PARAMETER :: eps = 1.0E-25 REAL, PARAMETER :: dxlim0=1.1 INTEGER :: ii,jj,kk,i,j,k,knt,kinbox,jknt INTEGER :: kok,isort,jsort,mid,maxkok INTEGER :: kbgn,kend INTEGER :: igate,jazim,jazmin,jmirror,jend INTEGER :: istatal,istatwrt ! jsrchmn is the minimum number of radials to search to find data ! that are within the distance limits of the grid center. ! INTEGER, PARAMETER :: jsrchmn = 2 REAL :: deg2rad,rad2deg REAL :: delx,dely,dazimr,daz,azdiff,ff REAL :: ddx,ddxy,ddx2,ddy,ddy2,dxthr,dxthr0 REAL :: azmrot,xcomp,ycomp,mapfct,sfcr,zagl REAL :: sum,sum2,sdev,thresh,slrange,elijk,azimijk,time REAL :: varmax,varmin,varavg,varmean,varmed !----------------------------------------------------------------------- ! ! Include files: ! !----------------------------------------------------------------------- INCLUDE 'globcst.inc' ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! kk=1 maxkok=0 deg2rad = atan(1.)/45. rad2deg = 1./deg2rad dazimr = dxlim0*dazim*deg2rad dxthr0=dxlim0*max((xs(3)-xs(2)),(ys(3)-ys(2))) CALL lattomf(1,1,rdrlat,mapfct) time=0. ! DO j=1,ny DO i=1,nx gridvar(i,j)=varmiss END DO END DO ! DO jazim=1,kntazim(kk) CALL ddrotuv(1,rdrlon,azmvol(jazim,kk),mapfct, & azmrot,xcomp,ycomp) DO igate=1,kntgate(jazim,kk) CALL beamhgtn(nzsnd,zsnd,rfrsnd,rdralt,rfropt, & elvvol(jazim,kk),rngvol(igate,kk),zagl,sfcr) rxvol(igate,jazim,kk)=radarx-xcomp*sfcr ryvol(igate,jazim,kk)=radary-ycomp*sfcr END DO END DO ! DO j=1,ny-1 DO i=1,nx-1 kok=0 sum=0. sum2=0. varavg=999999. varsort=999999. delx=xs(i)-radarx dely=ys(j)-radary slrange=sqrt(delx*delx+dely*dely) ! IF( slrange > rngmin .AND. slrange < rngmax ) THEN dxthr=max(dxthr0,((slrange+dxthr0)*dazimr)) ! !----------------------------------------------------------------------- ! ! Determine azimuth to this grid cell ! !----------------------------------------------------------------------- ! CALL uvrotdd(1,1,rdrlon,-delx,-dely,azimijk,ff) 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 ! !----------------------------------------------------------------------- ! ! 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 jknt=0 DO jazim=jazmin,jend kinbox=0 jknt=jknt+1 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(i) ddy=ryvol(igate,jazim,kk)-ys(j) ! 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 IF(kok > 0 ) 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 ELSE isort=1 END IF varsort(isort)=varvol(igate,jazim,kk) END IF sum=sum+varvol(igate,jazim,kk) sum2=sum2+(varvol(igate,jazim,kk)*varvol(igate,jazim,kk)) kok=kok+1 END IF ! data ok END IF ! inside box END DO ! igate IF( kinbox == 0 .AND. jknt > jsrchmn ) EXIT END DO ! jazim ! !----------------------------------------------------------------------- ! ! IF kinbox > 0 continue from jazim=1 ! !----------------------------------------------------------------------- ! IF((kinbox > 0 .OR. jknt <= jsrchmn) .and. jend==kntazim(kk)) THEN DO jazim=1,jmirror-1 kinbox=0 jknt=jknt+1 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(i) ddy=ryvol(igate,jazim,kk)-ys(j) 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 IF(kok > 0 ) 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 ELSE isort=1 END IF varsort(isort)=varvol(igate,jazim,kk) END IF sum=sum+varvol(igate,jazim,kk) sum2=sum2+(varvol(igate,jazim,kk)*varvol(igate,jazim,kk)) kok=kok+1 END IF END IF END DO IF( kinbox == 0 .AND. jknt > jsrchmn ) EXIT END DO END IF ! !----------------------------------------------------------------------- ! ! Loop backward from jazmin ! !----------------------------------------------------------------------- ! jend= 1 IF(jmirror < jazmin) jend=jmirror jknt=0 DO jazim=jazmin-1,jend,-1 kinbox=0 jknt=jknt+1 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(i) ddy=ryvol(igate,jazim,kk)-ys(j) 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 IF(kok > 0 ) 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 ELSE isort=1 END IF varsort(isort)=varvol(igate,jazim,kk) END IF sum=sum+varvol(igate,jazim,kk) sum2=sum2+(varvol(igate,jazim,kk)*varvol(igate,jazim,kk)) kok=kok+1 END IF END IF END DO IF( kinbox == 0 .AND. jknt > jsrchmn ) EXIT END DO ! !----------------------------------------------------------------------- ! ! If not yet outside box, continue from last radial. ! !----------------------------------------------------------------------- ! IF((kinbox > 0 .OR. jknt <= jsrchmn) .and. jend==1 ) THEN DO jazim=kntazim(kk),jmirror,-1 kinbox=0 jknt=jknt+1 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(i) ddy=ryvol(igate,jazim,kk)-ys(j) ! 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 IF(kok > 0 ) 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 ELSE isort=1 END IF varsort(isort)=varvol(igate,jazim,kk) END IF sum=sum+varvol(igate,jazim,kk) sum2=sum2+(varvol(igate,jazim,kk)*varvol(igate,jazim,kk)) kok=kok+1 END IF END IF END DO ! igate IF( kinbox == 0 .AND. jknt > jsrchmn ) EXIT END DO ! jazim END IF ! IF( kok == 0 ) CYCLE varavg=sum/float(kok) IF( kok <= maxsort ) THEN mid=(kok/2)+1 varmed=varsort(mid) ELSE varmed=varavg END IF IF ( kok > 1 ) THEN sdev=sqrt((sum2-(sum*sum/float(kok)))/float(kok-1)) thresh=max((2.*sdev),vmedlim) ELSE thresh=vmedlim END IF maxkok=max(maxkok,kok) ! !----------------------------------------------------------------------- ! ! Process data for local quadratic fit ! !----------------------------------------------------------------------- ! ! !----------------------------------------------------------------------- ! ! 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) ! !----------------------------------------------------------------------- ! ! Loop forward from jazmin ! !----------------------------------------------------------------------- ! jend=kntazim(kk) IF(jmirror > jazmin) jend=jmirror-1 jknt=0 DO jazim=jazmin,jend kinbox=0 jknt=jknt+1 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(i) ddy=ryvol(igate,jazim,kk)-ys(j) ! 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(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( kinbox == 0 .AND. jknt > jsrchmn ) EXIT END DO ! jazim ! !----------------------------------------------------------------------- ! ! IF kinbox > 0 continue from jazim=1 ! !----------------------------------------------------------------------- ! IF((kinbox > 0 .OR. jknt <= jsrchmn) .and. jend==kntazim(kk)) THEN DO jazim=1,jmirror-1 kinbox=0 jknt=jknt+1 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(i) ddy=ryvol(igate,jazim,kk)-ys(j) ! 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(5,1)=avar(5,1)+ddxy avar(5,2)=avar(5,2)+ddxy*ddx avar(5,3)=avar(5,3)+ddxy*ddy avar(5,4)=avar(5,4)+ddxy*ddxy avar(5,5)=avar(5,5)+ddxy*ddx2 avar(5,6)=avar(5,6)+ddxy*ddy2 avar(6,1)=avar(6,1)+ddx2 avar(6,2)=avar(6,2)+ddx2*ddx avar(6,3)=avar(6,3)+ddx2*ddy avar(6,4)=avar(6,4)+ddx2*ddxy avar(6,5)=avar(6,5)+ddx2*ddx2 avar(6,6)=avar(6,6)+ddx2*ddy2 ! END IF ! END IF END DO ! igate IF( kinbox == 0 .AND. jknt > jsrchmn ) EXIT END DO ! jazim END IF ! !----------------------------------------------------------------------- ! ! Loop backward from jazmin ! !----------------------------------------------------------------------- ! jend= 1 IF(jmirror < jazmin) jend=jmirror jknt=0 DO jazim=jazmin-1,jend,-1 kinbox=0 jknt=jknt+1 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(i) ddy=ryvol(igate,jazim,kk)-ys(j) ! 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( kinbox == 0 .AND. jknt > jsrchmn ) EXIT END DO ! jazim ! !----------------------------------------------------------------------- ! ! If not yet outside box, continue from last radial. ! !----------------------------------------------------------------------- ! IF((kinbox > 0 .OR. jknt <= jsrchmn) .and. jend==1 ) THEN DO jazim=kntazim(kk),jmirror,-1 kinbox=0 jknt=jknt+1 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(i) ddy=ryvol(igate,jazim,kk)-ys(j) ! 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(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)+ddx2 avar(6,2)=avar(6,2)+ddx2*ddx avar(6,3)=avar(6,3)+ddx2*ddy avar(6,4)=avar(6,4)+ddx2*ddxy avar(6,5)=avar(6,5)+ddx2*ddx2 avar(6,6)=avar(6,6)+ddx2*ddy2 ! END IF END IF END DO ! igate IF( kinbox == 0 .AND. jknt > jsrchmn ) EXIT END DO ! jazim END IF ! !----------------------------------------------------------------------- ! ! Solve for variable at grid point ! !----------------------------------------------------------------------- ! knt=nint(avar(1,1)) IF ( iorder > 1 .and. knt > 7 ) THEN varmean=rhsvar(1)/avar(1,1) CALL GJELIM(n,avar,rhsvar,sol,work,work1d,eps,istatus) gridvar(i,j)=min(varmax,max(varmin,sol(1))) ELSE IF ( iorder > 0 .and. knt > 5 ) THEN DO jj=1,3 DO ii=1,3 array(ii,jj)=avar(ii,jj) END DO END DO DO ii=1,3 rhsv(ii)=rhsvar(ii) END DO CALL GJELIM(3,array,rhsv,solv,work,work1d,eps,istatus) gridvar(i,j)=min(varmax,max(varmin,solv(1))) ELSE IF ( knt > 0 ) THEN varmean=rhsvar(1)/avar(1,1) gridvar(i,j)=varmean END IF END IF END DO ! i loop END DO ! j loop IF(maxkok > maxsort) THEN WRITE(6,'(a,i10,/a,i10,a,/a)') & ' remap2d Note ... max gate count =',maxkok, & ' exceeded sort space allocated =',maxsort, & ' for median check.', & ' Where maxsort is exceeded avg used in place of median for QC.' ELSE WRITE(6,'(a,i10,/a,i10)') & ' remap2d: FYI max gate count in grid vol =',maxkok, & ' Sort space allocated for median check =',maxsort END IF IF( vardump == 1 ) & CALL wrtvar1(nx,ny,1,gridvar,varid,varname,varunits, & time,runname,dirname,istatwrt) RETURN END SUBROUTINE remap2d ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE GJELIM ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE gjelim(n,a,rhs,sol,work,work1d,eps,istatus) 7 ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Solve an N x N system of equations. [a][sol]=[rhs] ! Using Gauss-Jordan with array pivoting. ! !----------------------------------------------------------------------- ! ! AUTHOR: Keith Brewster, CAPS ! 09/26/00 ! ! MODIFICATION HISTORY: ! !----------------------------------------------------------------------- ! ! INPUT : ! ! n Matrix order ! a Array ! rhs Right-hand side vector of matrix equation ! eps Error checking threshold ! ! OUTPUT: ! sol Solution vector ! istatus Status indicator ! ! WORK SPACE: ! work Work Array ! work1d Work vector ! !----------------------------------------------------------------------- ! ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! IMPLICIT NONE ! INTEGER, INTENT(IN) :: n REAL, INTENT(IN) :: a(n,n) REAL, INTENT(IN) :: rhs(n) REAL, INTENT(OUT) :: sol(n) REAL, INTENT(OUT) :: work(n,n+1) REAL, INTENT(OUT) :: work1d(n+1) REAL, INTENT(IN) :: eps INTEGER, INTENT(OUT) :: istatus ! !----------------------------------------------------------------------- ! ! Misc. Local Variables ! !----------------------------------------------------------------------- ! REAL :: pivot,const INTEGER np1 INTEGER :: i,j,k,m ! !----------------------------------------------------------------------- ! ! Initialize the work array ! First set all elements to zero. ! Fill nxn with elements from input a ! Fill last column with RHS vector. ! !----------------------------------------------------------------------- ! np1=n+1 DO j=1, np1 DO i=1, n work(i,j)=0.0 END DO END DO DO j=1, n DO i=1, n work(i,j)=a(i,j) END DO END DO DO i=1,n work(i,np1)=rhs(i) END DO DO j=1, n ! !----------------------------------------------------------------------- ! ! Find largest element in column j ! !----------------------------------------------------------------------- ! m=j pivot=ABS(work(m,j)) DO i=j+1,n IF(ABS(work(i,j)) > pivot ) THEN m=i pivot=ABS(work(m,j)) END IF END DO ! !----------------------------------------------------------------------- ! ! Error trapping ! !----------------------------------------------------------------------- ! IF( pivot < eps ) THEN DO i=1, n sol(i)=0. END DO istatus=-1 RETURN END IF ! !----------------------------------------------------------------------- ! ! Swap rows ! !----------------------------------------------------------------------- ! IF(m /= j) THEN DO k=1,np1 work1d(k)=work(j,k) END DO DO k=1,np1 work(j,k)=work(m,k) work(m,k)=work1d(k) END DO END IF ! !----------------------------------------------------------------------- ! ! Normalize Row ! !----------------------------------------------------------------------- ! const=1./work(j,j) DO k=1,np1 work(j,k)=const*work(j,k) END DO work(j,j)=1.0 ! !----------------------------------------------------------------------- ! ! Elimination ! !----------------------------------------------------------------------- ! DO i=1,n IF ( i /= j ) THEN const=work(i,j) DO k=1,np1 work(i,k)=work(i,k)-const*work(j,k) END DO END IF END DO END DO ! !----------------------------------------------------------------------- ! ! Transfer last column to sol vector ! !----------------------------------------------------------------------- ! DO i=1,n sol(i)=work(i,n+1) END DO istatus = 1 RETURN END SUBROUTINE gjelim