! !################################################################## !################################################################## !###### ###### !###### 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, &,3 x,y,zp,xs,ys,zps, & u,v,ptprt,pprt,qv,ptbar,pbar,usc,vsc,rfrct, & radarx,radary,radarz,radius, & zsnd,ktsnd,usnd,vsnd,rfrctsnd) ! !----------------------------------------------------------------------- ! ! 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(IN) :: ptprt(nx,ny,nz) REAL, INTENT(IN) :: pprt(nx,ny,nz) REAL, INTENT(IN) :: qv(nx,ny,nz) REAL, INTENT(IN) :: ptbar(nx,ny,nz) REAL, INTENT(IN) :: pbar(nx,ny,nz) REAL, INTENT(OUT) :: usc(nx,ny,nz) REAL, INTENT(OUT) :: vsc(nx,ny,nz) REAL, INTENT(OUT) :: rfrct(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) REAL, INTENT(OUT) :: rfrctsnd(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,rfrgrad 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. rfrctsnd(k)=0. END DO ! CALL refract(nx,ny,nz,ptprt,pprt,qv,ptbar,pbar,rfrct) ! 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) rfrctsnd(k)=rfrctsnd(k)+ & whigh*rfrct(i,j,kext)+wlow*rfrct(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) rfrctsnd(k)=rfrctsnd(k)/ktsnd(k) END DO ! !----------------------------------------------------------------------- ! ! Set variables "below-ground" ! Zero gradiant assumed in usnd, vsnd. ! Constant gradiant assumed in rfrsnd. ! !----------------------------------------------------------------------- ! rfrgrad=(rfrctsnd(kbot+1)-rfrctsnd(kbot))/(zsnd(kbot+1)-zsnd(kbot)) DO k=kbot-1,1,-1 usnd(k)=usnd(kbot) vsnd(k)=vsnd(kbot) rfrctsnd(k)=rfrctsnd(kbot)+(zsnd(k)-zsnd(kbot))*rfrgrad END DO ! !----------------------------------------------------------------------- ! ! Set variables "above-top" ! Zero gradiant assumed. ! !----------------------------------------------------------------------- ! rfrgrad=(rfrctsnd(ktop)-rfrctsnd(ktop-1))/(zsnd(ktop)-zsnd(ktop-1)) DO k=ktop+1,lvlprof usnd(k)=usnd(ktop) vsnd(k)=vsnd(ktop) rfrctsnd(k)=rfrctsnd(ktop)+(zsnd(k)-zsnd(ktop))*rfrgrad 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 UV2VRN ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE uv2vrn(nzsnd,zsnd,rfrsnd,rfropt,rlen,elev,azimu, &,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: ! !----------------------------------------------------------------------- ! INTEGER, INTENT(IN) :: nzsnd REAL, INTENT(IN) :: zsnd(nzsnd) REAL, INTENT(IN) :: rfrsnd(nzsnd) INTEGER, INTENT(IN) :: rfropt REAL, INTENT(IN) :: rlen, elev, azimu REAL, INTENT(IN) :: rlat_rad,rlon_rad,ralt_rad REAL, INTENT(IN) :: ugrid,vgrid REAL, INTENT(OUT) :: 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 beamelvn(nzsnd,zsnd,rfrsnd,ralt_rad,rfropt,dz,dist,eleva,range) CALL dhdrangn(nzsnd,zsnd,rfrsnd,ralt_rad,rfropt,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 uv2vrn ! !################################################################## !################################################################## !###### ###### !###### SUBROUTINE QUADFIT ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE quadfit(maxgate,maxazim,maxelev,nzsnd,maxsort, &,3 varchek,vmedlim,dazlim,iorder,rfropt, & kntgate,kntazim,kntelev, & radarx,radary,rdralt,dazim, & rngmin,rngmax,zsnd,rfrsnd, & rngvol,azmvol,elvvol, & rxvol,ryvol,rzvol, & varsort,elvmean,varvol, & istatus) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Uses a least squares local quadratic fit to refill any data region ! rejected during unfolding process ! !----------------------------------------------------------------------- ! ! AUTHOR: Keith Brewster, CAPS ! ! MODIFICATION HISTORY: ! ! 14-Jan-2004 Keith Brewster ! Modified logic to avoid possibility of overflow of varsort. ! Updated azimuth searching to match design of remapvol. ! 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 ! nzsnd Number of levels in sounding arrays ! maxsort Number of elements in sorting vector for computing median ! ! 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 ! iorder Order of polynomial to fit (1: linear, 2: quadratic) ! rfropt Rafractivity option (1: std atmos lapse, 2: avg actual lapse rate) ! kntgate Number of gates ! kntazim Number of azimuths for each tilt ! kntelev Number of elevation angles (tilts) of data ! ! radarx x-location of radar ! radary y-location of radar ! rdralt Elevation (m MSL) of radar ! dazim Approximate range resolution of data (degrees of azimuth) ! 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 ! ! zsnd Heights of levels in refractivity profile ! rfrsnd Refractivity profile ! ! 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 ! ! rxvol x coordinate of radar volume elements ! ryvol y coordinate of radar volume elements ! rzvol z coordinate of radar volume elements ! ! ! OUTPUT: ! ! varsort Temporary array used for computing the mean ! elvmean Temporary array average elevation angle for each tilt ! ! 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 INTEGER, INTENT(IN) :: nzsnd INTEGER, INTENT(IN) :: maxsort REAL, INTENT(IN) :: varchek REAL, INTENT(IN) :: vmedlim REAL, INTENT(IN) :: dazlim INTEGER, INTENT(IN) :: iorder INTEGER, INTENT(IN) :: rfropt 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) :: zsnd(nzsnd) REAL, INTENT(IN) :: rfrsnd(nzsnd) REAL, INTENT(IN) :: rngvol(maxgate,maxelev) REAL, INTENT(IN) :: azmvol(maxazim,maxelev) REAL, INTENT(IN) :: elvvol(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(OUT) :: varsort(maxsort) REAL, INTENT(OUT) :: elvmean(maxelev) REAL, INTENT(INOUT) :: varvol(maxgate,maxazim,maxelev) INTEGER, INTENT(OUT) :: istatus ! !----------------------------------------------------------------------- ! ! Misc. Local Variables ! !----------------------------------------------------------------------- ! INTEGER, PARAMETER :: n = 6 REAL, PARAMETER :: eps = 1.0E-25 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) 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 :: iigate,jjazim,kkelev INTEGER :: istatal,istatwrt INTEGER :: nbeam,nrang ! ! 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 :: 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 ! !----------------------------------------------------------------------- ! ! Include files: ! !----------------------------------------------------------------------- INCLUDE 'globcst.inc' ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! deg2rad = atan(1.)/45. rad2deg = 1./deg2rad dazimr = dazim*deg2rad dxthr0=5*250. dxthr=dxthr0 maxkok=0 ! 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 ! 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 beamhgtn(nzsnd,zsnd,rfrsnd,rdralt,rfropt, & 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) ! 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(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=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 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 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 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 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 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 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 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(i==10 .and. j==10 .and. k==5) & ! print *, ' OUT3 jazim,kinbox= ',jazim,kinbox 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 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 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=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 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 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 .AND. jknt > jsrchmn) 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 .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 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 .AND. jknt > jsrchmn) 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 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 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 .AND. jknt > jsrchmn) 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 .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 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)+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 .AND. jknt > jsrchmn) 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 END DO END DO END DO IF(maxkok > maxsort) THEN WRITE(6,'(a,i10,/a,i10,a,/a)') & ' quadfit: 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)') & ' quadfit: FYI max gate count in grid vol =',maxkok, & ' Sort space allocated for median check =',maxsort END IF 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=256) :: tmpdirnam CHARACTER (LEN=256) :: vfnam INTEGER :: nunit !----------------------------------------------------------------------- ! ! 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_angle CALL getunit( nunit) write(*,'(a)') vfnam open(nunit,file=TRIM(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) 315 CONTINUE 1003 format(6i4) 1004 format(i8) 1005 format(16f8.2) ! close(nunit) CALL retunit(nunit) END SUBROUTINE wrtvel