PROGRAM arpstern,13 !################################################################## !################################################################## !###### ###### !###### PROGRAM ARPSTERN ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! A stand alone program created for initializing the ARPS model with ! a terrain data base obtained from NCAR. This program ! will set up the horizontal grid according to the latitude and ! longitude of a point provided by the user for the domain of the ! model run. There is a choice of three different map projections ! at the time this code was prepared. The terrain elevation data ! consists of 30 second, 5 minute and 1 degree resolutions obtained ! from NCAR data services. The structure of this program is as ! follows: ! ! ! 1. Determine the model domain and set up the analysis grid. ! (subroutine setgrid) ! ! 2. Read the user specified data sets and fill the 1 degree blocks ! with the highest resolution data avaliable. (subroutine getter ! and readter) ! ! 3. Apply a filter (Barnes, or other scheme) to the data. ! (subroutine barnes) ! ! 4. Determine and plot the shape/response functions for the given ! filter. (subroutine response) ! ! 5. Calculate and plot the RMS (root mean square) difference ! fields. (subroutine rmsdif) ! ! Note: ARPSTERN is the driver for the ARPS terrain ! initialization. ! ! To compile and link the program: ! ! make arpstern ! ! To execute the program: ! ! arpstern < arpstern.input >! arpstern.output ! ! To create a tar file of all relevant files (except for terrain ! data): ! ! make arpster.tar ! !----------------------------------------------------------------------- ! ! AUTHOR: Dan Weber ! 1/12/94 ! Modification history: ! ! M. Xue 2/7/94. ! User specification of terrain data directory. More error ! checking when opening/reading files. ! ! D. Weber 12/15/94. ! Included pre-set values of input data and print statements ! of variables and parameters. ! ! K. Brewster 1/30/95 ! Write file before doing any plotting. ! ! D. Weber 9/8/95. ! Revised the definition of tema and temb in GETTER to include the ! absolute value. This allows the proper setting of the ! DO LOOP limits for use in analyzing southern hemispheric ! data. ! ! 1999/07/16 (Gene Bassett) ! Added patches for Great Lakes and other areas. ! ! ! 2000/11/28 (D. Weber) ! Added dynamic allocation for expanded f90 capabilites. This ! involved setting the nx and ny in the arpstern.input file ! and computing the ntx and nty for the job. Ntx and nty are ! no longer needed as well as terrain.inc. ! !----------------------------------------------------------------------- ! ! Input read in from the input file: ! ! ! INPUT: ! ! ! COMMON BLOCK VARIABLES: ! ! nx number of grid points in the x direction. ! ny number of grid points in the y direction. ! ! analtype Type of analysis for use in filtering the data ! analtype = 1 Barnes scheme ! = 2 others (not yet implemented) ! ! mapproj Type of map projection used to setup the analysis grid. ! mapproj = 1 Polar Stereographic projection ! = 2 Mercator projection ! = 3 Lambert ! ! itertype Type of terrain data desired, ! itertype = 30 second ! = 5 minute ! = 1 degree ! rmsopt RMS difference control parameter, ! rmsopt = 0 rms difference and background field will ! not be calculated for a 1 pass analysis. ! = 1 rms difference and background field will ! be calculated for a 1 pass analysis. ! NOTE: for multiple pass scheme, the background field ! must be calculated!!!!!! ! ! comtype Computer type the arpstern11.f program will be run on ! comtype = 1 for IBM and other machine capable of ! declaring 2 byte integers ! = 4 for CRAY machines and other machines ! in which the minimum integer declaration ! is integer *8 ! ! knot Influence factor for the barnes scheme ! gamma Shape factor for the multiple pass Barnes analysis ! ipass Number of passes for the Barnes routine ! trulat Latitude at which the map projection is true (degree N) ! trulon Longitude at which the map projection is true ! (degree E) ! sclfct Map scale factor (1/1000000=1000000=sclfct) ! dx Analysis grid spacing in the e-w direction (m) ! dy Analysis grid spacing in the n-s direction (m) ! ctrlat Latitude of the center of the analysis grid (deg. N) ! ctrlon Longitude of the center of the analysis grid (deg. E) ! tol Tolerance level for the weight function ! wdn Number of grid points representing the wavelength ! associated ! with the rdnot initial response. ! rdnot First pass or initial response for the wnd length wave. ! ! LOCAL VARIABLES: ! ! glab Graphic label for the terrain plots ! nlat Latitude of the northern most extent of the analysis ! grid (degrees n) ! slat Latitude of the southern most extent of the analysis ! grid (degrees n) ! elon Longitude of the eastern edge of the analysis grid ! (degrees E) ! wlon Longitude of the western edge of the analysis grid ! (degrees E) ! ! nbufx Number of additional terrain data points outside the ! analysis domain used on the calculation of the ! boundaries. East-west ! nbufy Number of additional terrain data points outside the ! analysis domain used on the calculation of the ! boundaries. North-south ! ntx Number of terrain data points in the east-west ! direction ! nty Number of terrain data points in the north-south ! direction ! pi The number pi. ! temak Working knot used by the program (user specified or ! calc. in setgrid) (m**2) ! ! ! h Initial data array (m) ! ! ! OUTPUT: ! ! hback Analyzed Background field at data points (m) ! hterain Analyzed terrain data array written out to ! arpstern.dat. (m) ! ! ! TEMPORARY ARRAYS: ! ! ! tem1,tem2 ! tem3,tem4 ! ! tem11,tem12,tem13,tem14,tem15,tem16 ! ! tem21,tem22,tem23,tem24,tem25,tem26,tem27,tem28 ! !----------------------------------------------------------------------- ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- IMPLICIT NONE ! !----------------------------------------------------------------------- ! ! INPUT: ! !----------------------------------------------------------------------- ! ! !----------------------------------------------------------------------- ! ! COMMON BLOCK VARIABLES: ! !----------------------------------------------------------------------- ! INTEGER :: nx ! number of grid points in the ! x-direction INTEGER :: ny ! number of grid points in the ! y-direction INTEGER :: ndx ! number of data points in the ! x-direction for the desired terrain ! data INTEGER :: ndy ! number of grid points in the ! y-direction for the desired terrain ! data INTEGER :: analtype ! Type of analysis technique INTEGER :: mapproj ! Type of map projection INTEGER :: itertype ! Type of terrain data INTEGER :: rmsopt ! RMS difference control parameter INTEGER :: comtype ! Computer type, =1 for ibm, =4 for ! cray CHARACTER (LEN=80 ) :: tdatadir ! Directory containing the terrain ! data CHARACTER (LEN=80 ) :: terndir ! Directory containing the ascii ! terrain data INTEGER :: ltdir ! Length of none-blank part of ! tdatadir. REAL :: knot ! Influence parameter for the barnes ! scheme REAL :: gamma ! Shape factor for the multiple pass ! barnes. INTEGER :: ipass ! Number of passes for the Barnes ! routine REAL :: trulat (2) ! Latitude at which the map projection ! is true (degees N) REAL :: trulon ! Longitude at which the map ! projection is true (degrees E) REAL :: sclfct ! Map scale factor (m) REAL :: dx ! Analysis grid spacing in the e-w dir REAL :: dy ! Analysis grid spacing in the n-s dir REAL :: ctrlat ! Latitude of the center analysis grid REAL :: ctrlon ! Longitude of the center of analysis ! grid REAL :: tol ! Tolerance level for the weight ! function REAL :: wdn ! Wavelength in terms of gridpoints ! for the rdnot response REAL :: rdnot ! Initial response to wdn length wave. ! !----------------------------------------------------------------------- ! ! LOCAL VARIABLES: ! !----------------------------------------------------------------------- ! CHARACTER (LEN=65) :: glab ! Graphic label for the terrain plots REAL :: nlat ! Latitude of the northern most ! extent of the analysis grid ! (degrees N) REAL :: slat ! Latitude of the southern most ! extent of the analysis grid ! (degrees N) REAL :: elon ! Longitude of the eastern edge of ! analysis grid (degrees E) REAL :: wlon ! Longitude of the western edge of ! analysis grid (degrees E) INTEGER :: nbufx ! Number of buffer points in e-w INTEGER :: nbufy ! Number of buffer points in n-s INTEGER :: ntx ! Number of terrain grid points e-w INTEGER :: nty ! Number of terrain grid points n-s REAL :: pi ! The number pi REAL :: temak ! Working knot (m**2) REAL, ALLOCATABLE :: h (:,:) ! Initial terrain data array ! for use in the analysis (m) ! !----------------------------------------------------------------------- ! ! OUTPUT: ! !----------------------------------------------------------------------- ! REAL, ALLOCATABLE :: hback(:,:) ! Analyzed background field at data ! points (m) REAL, ALLOCATABLE :: hterain(:,:) ! Analyzed terrain data array at ! analysis points for use in model.(m) ! !----------------------------------------------------------------------- ! ! TEMPORARY ARRAYS: ! !----------------------------------------------------------------------- ! REAL, ALLOCATABLE :: tem1 (:) REAL, ALLOCATABLE :: tem2 (:) INTEGER*2, ALLOCATABLE :: tem3(:,:) ! Array for reading 1km, 5min, 1deg ! data INTEGER*2, ALLOCATABLE :: tem4(:,:) ! Array used to store terrain data REAL, ALLOCATABLE :: tem11(:,:) REAL, ALLOCATABLE :: tem12(:,:) REAL, ALLOCATABLE :: tem13(:,:) REAL, ALLOCATABLE :: tem14(:,:) INTEGER, ALLOCATABLE :: tem15(:,:) INTEGER, ALLOCATABLE :: tem16(:,:) REAL, ALLOCATABLE :: tem21(:,:) REAL, ALLOCATABLE :: tem22(:,:) REAL, ALLOCATABLE :: tem23(:,:) REAL, ALLOCATABLE :: tem24(:,:) INTEGER, ALLOCATABLE :: tem25(:,:) INTEGER, ALLOCATABLE :: tem26(:,:) REAL, ALLOCATABLE :: tem27(:,:) REAL, ALLOCATABLE :: tem28(:,:) !----------------------------------------------------------------------- ! ! Misc. local variables: ! !----------------------------------------------------------------------- ! REAL :: tema,temb,temc,temd,trulat1,trulat2,cint INTEGER :: i,j,ibgn,iend,jbgn,jend INTEGER :: ierr,istatus INTEGER :: idummy,imin,jmin,imax,jmax REAL :: rdummy,hmin,hmax REAL :: lat, lon, terdx,terdy REAL :: fix_wisc, fix_bahamas ! !----------------------------------------------------------------------- ! ! Defining COMMON Blocks: ! !----------------------------------------------------------------------- COMMON /terrainc/ analtype,mapproj,itertype,rmsopt,comtype, & tdatadir,ltdir COMMON /barnesc/ knot,gamma,ipass COMMON /projectc/ trulat,trulon,sclfct COMMON /gridc/ dx,dy,ctrlat,ctrlon,tol,wdn,rdnot !----------------------------------------------------------------------- ! ! Defining namelists: ! !----------------------------------------------------------------------- NAMELIST /terraind/analtype,mapproj,itertype,rmsopt,comtype, & tdatadir,terndir NAMELIST /grid/ nx,ny NAMELIST /barnesd/ knot,gamma,ipass NAMELIST /mapprojd/trulat1,trulat2,trulon,sclfct NAMELIST /gridd/ dx,dy,ctrlat,ctrlon,tol,wdn,rdnot !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Set the Namelist variables before they are read in. ! This is done for the case of a read error in the namelist input ! file. Namelist variables will be set to values provided in the ! example in section 9.3 of the ARPS User's Guide. ! nx = 67 ny = 67 analtype = 1 mapproj = 1 itertype = 1 rmsopt = 1 comtype = 1 tdatadir = 'arpstern.data' terndir = 'arpstern.data' knot = 0.0 gamma = 1.00 ipass = 4 trulat1 = 40.70 trulat2 = 0.0 trulon = 248.00 sclfct = 1.0 dx = 1000.0 dy = 1000.0 ctrlat = 40.70 ctrlon = 248.00 tol = 1.0E-7 wdn = 2.00 rdnot = 0.006 ! ! Read and Print of Namelist variables and parameters. ! !----------------------------------------------------------------------- ! READ(5,grid) WRITE(6,'(/5x,a,i4)') 'nx was: ',nx WRITE(6,'(/5x,a,i4)') 'ny was: ',ny READ(5,terraind) WRITE(6,'(/5x,a,i4)') 'Analysis type was: ',analtype WRITE(6,'(/5x,a,i4)') 'Projection type was: ',mapproj WRITE(6,'(/5x,a,i4)') 'Terrain data type was: ',itertype IF(itertype == 1)THEN ndx = 120 ndy = 120 ELSEIF(itertype == 2)THEN ndx = 12 ndy = 12 ELSEIF(itertype == 3)THEN ndx = 2 ndy = 2 END IF WRITE(6,'(/5x,a,i6)')'number of x data points per block was:',ndx WRITE(6,'(/5x,a,i6)')'number of y data points per block was:',ndy WRITE(6,'(/5x,a,i4)') 'Rmsopt was: ',rmsopt WRITE(6,'(/5x,a,i4)') 'Computer type was: ',comtype WRITE(6,'(/5x,a,a)') 'The source data directory was: ',tdatadir WRITE(6,'(/5x,a,a)') 'The analyzed data directory was:',terndir READ(5,barnesd) WRITE(6,'(/5x,a,f6.3)') 'knot was: ',knot WRITE(6,'(/5x,a,f6.3)') 'Gamma was: ',gamma WRITE(6,'(/5x,a,i4)') 'Ipass was: ',ipass READ(5,mapprojd) WRITE(6,'(/5x,a,f8.2)') 'trulat1 was: ',trulat1 WRITE(6,'(/5x,a,f8.2)') 'trulat2 was: ',trulat2 WRITE(6,'(/5x,a,f8.2)') 'trulon was: ',trulon WRITE(6,'(/5x,a,f12.1)') 'The scale factor was:',sclfct READ(5,gridd) WRITE(6,'(/5x,a,f9.2)') 'The x grid spacing was: ',dx WRITE(6,'(/5x,a,f9.2)') 'The y grid spacing was: ',dy WRITE(6,'(/5x,a,f8.2)') 'The center latitude was: ',ctrlat WRITE(6,'(/5x,a,f8.2)') 'The center longitude was:',ctrlon WRITE(6,'(/5x,a,f12.9)') 'The tolerance level was: ',tol WRITE(6,'(/5x,a,f6.3)') 'The base line wavelength was:',wdn WRITE(6,'(/5x,a,f6.3)') 'The base line response was:',rdnot ! allocate some arrays associated with nx and ny, ndx and ndy. ALLOCATE(hterain(nx,ny),STAT=istatus) hterain = 0 ALLOCATE(tem1(nx),STAT=istatus) tem1 = 0 ALLOCATE(tem2(ny),STAT=istatus) tem2 = 0 ALLOCATE(tem3(ndx,ndy),STAT=istatus) tem3 = 0 ALLOCATE(tem4(ndx,ndy),STAT=istatus) tem4 = 0 ALLOCATE(tem11(nx,ny),STAT=istatus) tem11 = 0 ALLOCATE(tem12(nx,ny),STAT=istatus) tem12 = 0 ALLOCATE(tem13(nx,ny),STAT=istatus) tem13 = 0 ALLOCATE(tem14(nx,ny),STAT=istatus) tem14 = 0 ALLOCATE(tem15(nx,ny),STAT=istatus) tem15 = 0 ALLOCATE(tem16(nx,ny),STAT=istatus) tem16 = 0 ! initial allocation complete.... ! !----------------------------------------------------------------------- ! ! Test to see if the comtype is suitable.... ! !----------------------------------------------------------------------- ! IF(comtype /= 1.AND.comtype /= 4)THEN PRINT *,'comtype in terrain.input is not set to IBM or CRAY ', & 'type. Please reset to 1 for IBM or 4 for CRAY' STOP END IF ! !----------------------------------------------------------------------- ! ! setting ctrlon in terms of degrees east ! !----------------------------------------------------------------------- ! IF(ctrlon < 0)THEN ctrlon=360+ctrlon END IF ! !----------------------------------------------------------------------- ! ! test to see if reset value is within longitudinal limits.. ! !----------------------------------------------------------------------- ! IF(ctrlon < 0.OR.ctrlon > 360)THEN PRINT *,'ctrlon is incorrectly set in terrain.input, please ', & 'reset, use degrees east' STOP END IF ! !----------------------------------------------------------------------- ! ! test to see if the ctrlat is within limits... ! !----------------------------------------------------------------------- ! IF(ctrlat < -90.OR.ctrlat > 90)THEN PRINT *,'ctrlat in terrain.input is too large or too small. ', & 'must be set between -90. and +90. degree north.' STOP END IF ! !----------------------------------------------------------------------- ! ! setting trulon in terms of degrees east ! !----------------------------------------------------------------------- ! IF(trulon < 0)THEN trulon=360+trulon END IF ! !----------------------------------------------------------------------- ! ! test to see if reset value is within longitudinal limits.. ! !----------------------------------------------------------------------- ! IF(trulon < 0.OR.trulon > 360)THEN PRINT *,'trulon is incorrectly set in terrain.input, please ', & 'reset, use degrees east' STOP END IF ! !----------------------------------------------------------------------- ! ! test to see if trulat is within limits... ! !----------------------------------------------------------------------- ! IF(trulat (1) < -90.OR.trulat (1) > 90)THEN PRINT *,'trulat (1) in terrain.input is too large or too ', & 'small. must be set between -90 and +90 degree north.' STOP END IF IF(trulat (2) < -90.OR.trulat (2) > 90)THEN PRINT *,'trulat (2) in terrain.input is too large or too ', & 'small. must be set between -90 and +90 degree north.' STOP END IF ltdir=LEN(tdatadir) CALL strlnth( tdatadir , ltdir) IF( ltdir == 0 ) THEN tdatadir = '.' ltdir =1 END IF IF( tdatadir(ltdir:ltdir) /= '/') THEN ltdir=ltdir+1 tdatadir(ltdir:ltdir)='/' END IF PRINT*,tdatadir(ltdir:ltdir) pi=4.0*ATAN(1.0) trulat (1)=trulat1 trulat (2)=trulat2 temak=knot CALL opngks ! !----------------------------------------------------------------------- ! ! Set the base grid parameters. ! !----------------------------------------------------------------------- ! CALL setgrid(nx,ny,ndx,ndy,pi, & ntx,nty,nbufx,nbufy,slat,nlat,wlon,elon,temak, & tema,temb,temc,temd,terdx,terdy, & tem1,tem2,tem11,tem12,tem13,tem14) ! !----------------------------------------------------------------------- ! ! Allocate the space for the variables used in the analysis. Can't ! do this until the grid parameters are computed (above). ! !----------------------------------------------------------------------- ! ALLOCATE( h = 0 ALLOCATE(hback(ntx,nty),STAT=istatus) hback = 0 ALLOCATE(tem21(ntx,nty),STAT=istatus) tem21 = 0 ALLOCATE(tem22(ntx,nty),STAT=istatus) tem22 = 0 ALLOCATE(tem23(ntx,nty),STAT=istatus) tem23 = 0 ALLOCATE(tem24(ntx,nty),STAT=istatus) tem24 = 0 ALLOCATE(tem25(ntx,nty),STAT=istatus) tem25 = 0 ALLOCATE(tem26(ntx,nty),STAT=istatus) tem26 = 0 ALLOCATE(tem27(ntx,nty),STAT=istatus) tem27 = 0 ALLOCATE(tem28(ntx,nty),STAT=istatus) tem28 = 0 ! !----------------------------------------------------------------------- ! ! Set the grid arrays for the model and the extended buffer area. ! !----------------------------------------------------------------------- ! call compgrid(nx,ny,ndx,ndy,pi, & ntx,nty,nbufx,nbufy,slat,nlat,wlon,elon,temak, & tema,temb,temc,temd,terdx,terdy, & tem1,tem2,tem11,tem12,tem13,tem14,tem15,tem16, & tem21,tem22,tem23,tem24,tem25,tem26) ! !----------------------------------------------------------------------- ! ! Call the GETTER subroutine to read the terrain data files and ! fill the initial terrain array (h). ! !----------------------------------------------------------------------- ! CALL getter(ntx,nty,ndx,ndy,slat,nlat,wlon,elon, & h, & tem3,tem4) print *,'initial terrain field' WRITE (*,'(10f7.1)') ((h(i,j),i=1,10),j=1,10) ! !----------------------------------------------------------------------- ! ! Fill in Great Lakes. The original data set corresponds to the ! bottom of the lakes. ! !----------------------------------------------------------------------- ! CALL fix_lake_eliv(h,tem23,tem24,ntx,nty) ! !----------------------------------------------------------------------- ! ! Correct for bad terrain point in Wisc. & Bermuda. ! !----------------------------------------------------------------------- ! DO j=1,nty DO i=1,ntx lat = tem23(i,j) lon = tem24(i,j) - 360.0 fix_wisc = 290.0 IF (lat > 43.0 .AND. lat < 44.0 .AND. lon > -90.5 .AND. & lon < -89.0 .AND. h(i,j) > 500.0) THEN PRINT 9901, 'ARPSTERN: Lowering Wisc: i,j,0,lat,lon,h: ', & i,j,0,lat,lon,h(i,j),fix_wisc h(i,j) = fix_wisc END IF fix_bahamas = 0.0 IF (lat >= 22.5 .AND. lat <= 24.0 .AND. lon >= -76.5 .AND. & lon <= -75.0 .AND. ABS( PRINT 9901, 'ARPSTERN: Raising Bahamas: i,j,0,lat,lon,h: ', & i,j,0,lat,lon,h(i,j),fix_bahamas h(i,j) = fix_bahamas END IF END DO END DO 9901 FORMAT (a,3I4,2F8.2,2F8.0) ! !----------------------------------------------------------------------- ! ! This section creates an analytical function for testing purposes ! !----------------------------------------------------------------------- ! ! DO 2 i=1,ntx ! ! DO 2 j=1,nty ! h(i,j)=20.*SIN(2.*pi*real((i-1.)/12.)) ! the denominator is the ! horizontal wavelength..... ! compute max and min of h... hmax = -1000000. hmin = 1000000. DO j=1,nty DO i=1,ntx IF( imax = i jmax = j hmax = h(i,j) END IF IF( hmin = h(i,j) imin = i jmin = j END IF END DO END DO print *,'hmax is =',hmax,imax,jmax print *,'hmin is =',hmin,imin,jmin ! !----------------------------------------------------------------------- ! ! Perform the desired analysis on the data base h. ! !----------------------------------------------------------------------- IF (analtype == 1) THEN ! perform a Barnes analysis on the data. DO i=1,ipass CALL barnes(i,1,nx,1,ny,nx,ny,ntx,nty,nbufx,nbufy, & temak,hback,h, & hterain, & tem11,tem12,tem21,tem22,tem15,tem16,tem13,tem14) IF(ipass > 1.OR.rmsopt == 1) THEN ! perform a barnes analysis ! at the data points ibgn=1+i*nbufx iend=ntx-i*nbufx jbgn=1+i*nbufy jend=nty-i*nbufy CALL barnes(i,ibgn,iend,jbgn,jend,ntx,nty,ntx,nty, & nbufx,nbufy,temak,hback,h, & hback, & tem21,tem22,tem21,tem22,tem25,tem26,tem27,tem28) END IF END DO ! !----------------------------------------------------------------------- ! ! Write the analyzed terrain data (model grid data) into file ! arpstern.dat. ! !----------------------------------------------------------------------- ! CALL asnctl ('NEWLOCAL', 1, ierr) CALL asnfile('arpstern.dat', '-F f77 -N ieee', ierr) OPEN(11,FILE='arpstern.dat',FORM='unformatted', & STATUS='unknown') WRITE(11) nx,ny idummy = 0 rdummy = 0.0 WRITE(11) analtype,mapproj,itertype,ipass,idummy, & idummy,idummy,idummy,idummy,idummy, & idummy,idummy,idummy,idummy,idummy, & idummy,idummy,idummy,idummy,idummy WRITE(11) dx ,dy ,ctrlat,ctrlon,knot , & gamma ,trulat1,trulat2,trulon,sclfct, & tol ,wdn ,rdnot ,rdummy,rdummy, & rdummy,rdummy,rdummy,rdummy,rdummy WRITE(11) hterain CLOSE(11) ! !----------------------------------------------------------------------- ! ! Plotting the results. ! !----------------------------------------------------------------------- ! ! !----------------------------------------------------------------------- ! ! Plot the analysis according to the user defined map proj. ! !----------------------------------------------------------------------- ! WRITE (glab,65) ipass,gamma 65 FORMAT('Barnes Analysis (m) ','Pass=',i2,' Gamma=',f4.2) cint=0. CALL plot(nx,ny,nx,mapproj,trulat,trulon,cint, & tema,temb,temc,temd,glab,hterain) ! !----------------------------------------------------------------------- ! ! Plot the initial data field using a cylindrical equidistant proj. ! !----------------------------------------------------------------------- ! PRINT *,'initial field, h' WRITE (*,'(10f7.1)') ((h(i,j),i=1,10),j=1,10) WRITE (glab,55) itertype 55 FORMAT('Initial Terrain Field (m) ',' Itertype=',i2) cint=0. CALL plot(ntx,nty,ntx,8,trulat,trulon,cint, & tem23(1,nty),tem24(1,nty),tem23(ntx,1), & tem24(ntx,1),glab,h) ! !----------------------------------------------------------------------- ! ! Print the maximum initial data set value. ! !----------------------------------------------------------------------- ! tema=-1000000. temb= 1000000. DO j=1,nty DO i=1,ntx tema=MAX(tema,h(i,j)) temb=MIN(temb,h(i,j)) END DO END DO PRINT *,'the maximum terrain initial value is',tema PRINT *,'the minimum terrain initial value is',temb ! !----------------------------------------------------------------------- ! ! Print the maximum analysis value. ! !----------------------------------------------------------------------- ! hmax = -1000000. hmin = 1000000. DO j=1,ny DO i=1,nx IF(hterain(i,j) > hmax)THEN imax = i jmax = j hmax = hterain(i,j) END IF IF(hterain(i,j) < hmax)THEN hmin = hterain(i,j) imin = i jmin = j END IF END DO END DO print *,'hterain max is =',hmax,imax,jmax print *,'hterain min is =',hmin,imin,jmin tema=-100000. temb= 100000. DO j=1,ny DO i=1,nx tema=MAX(tema,hterain(i,j)) temb=MIN(temb,hterain(i,j)) END DO END DO PRINT *,'the maximum analysis value is',tema PRINT *,'the minimum analysis value is',temb ! !----------------------------------------------------------------------- ! ! Print the maximum background value. ! !----------------------------------------------------------------------- ! IF(ipass > 1.OR.rmsopt == 1)THEN tema=-100. DO j=1,nty DO i=1,ntx tema=MAX(tema,hback(i,j)) END DO END DO PRINT *,'the maximum background analysis value is',tema ! !----------------------------------------------------------------------- ! ! Plot the background data field using a cylindrical equidistant ! proj. ! !----------------------------------------------------------------------- ! ! !----------------------------------------------------------------------- ! ! Setting the lat/lon bounds for the plot routine. ! !----------------------------------------------------------------------- ! ibgn= 1+ipass*nbufx iend= ntx-ipass*nbufx jbgn= 1+ipass*nbufy jend= nty-ipass*nbufy WRITE (glab,56) ipass,gamma 56 FORMAT(1X,'Analyzed Terrain field (m)', & ' Pass=',i2,' Gamma=',f4.2) cint=0. CALL plot((iend-ibgn+1),(jend-jbgn+1),ntx, & 8,trulat,trulon,cint, & tem23(ibgn,jend),tem24(ibgn,jend), & tem23(iend,jbgn),tem24(iend,jbgn), & glab,hback(ibgn,jbgn)) !----------------------------------------------------------------------- ! ! Call the RMS difference subroutine to compare the analysis of ! data field at the data points to the initial data field. ! !----------------------------------------------------------------------- PRINT *,'tem23,tem24 before rms' PRINT *,tem23(ibgn,jend),tem24(ibgn,jend),tem23(iend,jbgn) & ,tem24(iend,jbgn) WRITE (glab,57) ipass,gamma 57 FORMAT(1X,'RMS Difference at terrain points (m)',' Pass=' & ,i2,' Gamma=',f4.2) CALL rmsdif(ibgn,iend,jbgn,jend,ntx,nty, & tem23(ibgn,jend),tem24(ibgn,jend), & tem23(iend,jbgn), & tem24(iend,jbgn),glab,h,hback,tem27) END IF ELSE IF(analtype == 2) THEN !perform other type of analysis WRITE (6,'(a)') 'Other type of analysis is implemented yet.' ! !----------------------------------------------------------------------- ! ! Other analysis methods have not yet been developed and implemented ! !----------------------------------------------------------------------- ! END IF CALL clsgks STOP END PROGRAM arpstern !################################################################## !################################################################## !###### ###### !###### SUBROUTINE SETGRID ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! ! SUBROUTINE setgrid(nx,ny,ndx,ndy,pi, & 1,10 ntx,nty,nbufx,nbufy,slat,nlat,wlon,elon,temak, & temc,temd,teme,temf, terdx,terdy, & xg1d,yg1d,xg,yg,glat,glon) !----------------------------------------------------------------------- ! ! PURPOSE: ! ! To set the grid of the analysis domain for use by the chosen ! data analysis technique. ! ! The structure of this program is as follows: ! ! 1. Read the arpstern.input file for the following required info: ! ! - grid spacing in meters (dx,dy) ! ! - type of map projection (polar stereographic, mercator, ! lambert) and standard latitude(s) and longitude of the these ! projections. ! ! - scale factor of the projection (eg. 1/1000000=1000000) ! ! - central latitude and longitude of the model grid ! !----------------------------------------------------------------------- ! ! AUTHOR: Dan Weber ! 1/12/94 ! ! ! REVISED: Dan Weber ! 6/17/94 ! ! Modified initial position to center of analysis grid. ! Code cleanup and added comtype option for computer specific ! record length requirements. ! ! MODIFIED: Dan Weber ! 11/28/2000 ! ! Removed computation of grid arrays for f90 allocation purposes. ! !----------------------------------------------------------------------- ! ! ! ! INPUT : ! ! nx Number of grid points for the analysis grid e-w dir. ! ny Number of grid points for the analysis grid n-s dir. ! ndx Number of data points in a 1 degree block (e-w) ! ndy Number of data points in a 1 degree block (n-s) ! pi The constant Pi ! !----------------------------------------------------------------------- ! ! COMMON BLOCK VARIABLES: ! !----------------------------------------------------------------------- ! ! analtype Analysis type (1=barnes,2=other,...) ! mapproj Type of map projection used to setup the analysis grid. ! mapproj = 1 Polar Stereographic projection ! = 2 Mercator projection ! = 3 Lambert ! itertype Type of terrain desired (1=30 second, 2= 5 minute, ! 3= 1 degree) ! rmsopt Option for calc. the rms differences. (0=no,1=yes) ! comtype Computer type the arpstern11.f program will be run on ! comtype = 1 for IBM and other machine capable of ! declaring 2 byte integers ! = 4 for CRAY machines and other machines ! in which the minimum integer declaration ! is integer *8 ! knot Shape parameter for the barnes weight function. ! gamma Shape factor for multi pass scheme ! ipass Total number of passes thru the barnes scheme ! trulat Latitude(s) at which the map projection is true ! (degree N) ! trulon Longitude at which the map projection is true ! (degree E) ! sclfct Map scale factor (m) ! ! dx Analysis grid spacing in the x-direction east-west (m) ! dy Analysis grid spacing in the y-direction north-south(m) ! ctrlat Latitude of the center of the analysis grid (deg. N) ! ctrlon Longitude of the center of the analysis grid (deg. E) ! tol Tolerance for the weight function used in determining ! the cut-off radius or radius of influence ! wdn Wavelength in terms of grid points in which rdnot is ! valid ! rdnot Initial Response for wdn length wave ! ! LOCAL VARIABLES: ! ! dincx Analysis x-direction grid spacing normalized by the map ! scale dincx=dx/sclfct ! dincy Analysis y-direction grid spacing normalized by the map ! scale dincy=dy/sclfct ! mterdx Max. distance between e-w data pts. (m) ! terdx Distance in meters between data points in the e-w dir. ! (m) ! terdy Distance in meters between data points in the n-s dir. ! (m) ! ! OUTPUT: ! ! ntx Number of data points needed in the east-west direction ! nty Number of data points needed in the north-south ! direction ! nbufx Number of additional points needed to perform the ! Barnes ! analysis at the edges of the domain. e-w ! nbufy Number of additional points needed to perform the ! Barnes ! analysis at the edges of the domain. n-s ! nlat Latitude of the northern edge of the data area ! (degrees N) ! slat Latitude of the southern edge of the data area ! (degrees N) ! elon Longitude of the eastern edge of the data area ! (degrees E) ! wlon Longitude of the western edge of the data area ! (degrees E) ! temak Working value of knot (user or program specified) ! xg1d Analysis grid points e-w (1-d) in grid units ! (=meters/sclfct) ! yg1d Analysis grid points n-s (1-d) in grid units ! (=meters/sclfct) ! xg Analysis grid points in the e-w direction ! (in grid units) ! yg Analysis grid points in the n-s direction ! (in grid units) ! glat Latitude of the analysis data points ! glon Longitude of the analysis data points ! ! !----------------------------------------------------------------------- ! ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- IMPLICIT NONE ! !----------------------------------------------------------------------- ! ! INPUT: ! !----------------------------------------------------------------------- ! INTEGER :: nx ! Number of analysis grid points e-w INTEGER :: ny ! Number of analysis grid points n-s INTEGER :: ndx ! Number of data points (e-w) INTEGER :: ndy ! Number of data points (n-s) REAL :: pi ! The constant Pi ! !----------------------------------------------------------------------- ! ! COMMON BLOCK VARIABLES: ! !----------------------------------------------------------------------- ! INTEGER :: analtype ! Analysis type INTEGER :: mapproj ! Type of map projection used in ! analysis INTEGER :: itertype ! Desired terrain resolution for ! analysis INTEGER :: rmsopt ! Option for enabling the rms diff. ! routine. INTEGER :: comtype ! Computer type, =1 for ibm, =4 for ! cray CHARACTER (LEN=80 ) :: tdatadir ! Directory containing the terrain ! data INTEGER :: ltdir ! Length of none-blank part of ! tdatadir. REAL :: knot ! Influence parameter for the barnes ! scheme REAL :: gamma ! Barnes shape factor for multi pass ! scheme INTEGER :: ipass ! Total number of passes REAL :: trulat (2) ! Latitude of true map projection ! (deg N) REAL :: trulon ! Longitude of true map projection ! (deg E) REAL :: sclfct ! Map scale factor (m) REAL :: dx ! Analysis grid spacing e-w direction ! (m) REAL :: dy ! Analysis grid spacing n-s direction ! (m) REAL :: ctrlat ! Latitude of the center of the ! analysis grid (deg. n) REAL :: ctrlon ! Longitude of the center of the ! analysis grid (deg. e) REAL :: tol ! Tolerance level for the weight ! function REAL :: wdn ! Wavelength in terms of analysis grid ! points for the rdnot response REAL :: rdnot ! Initial Response for wdn length wave ! !----------------------------------------------------------------------- ! ! LOCAL VARIABLES: ! !----------------------------------------------------------------------- ! REAL :: dincx ! Analysis x-direction grid ! spacing/map scale REAL :: dincy ! Analysis y-direction grid ! spacing/map scale REAL :: mterdx ! Max. distance between e-w data pts REAL :: terdx ! Distance in grid meters between e-w ! data pts REAL :: terdy ! Distance in grid meters between n-s ! data pts ! !----------------------------------------------------------------------- ! ! OUTPUT: ! !----------------------------------------------------------------------- ! INTEGER :: ntx ! Actual number of data points needed ! for data domain e-w INTEGER :: nty ! Actual number of data points needed ! for data domain n-s INTEGER :: nbufx ! Number of buffer points in the x ! direction INTEGER :: nbufy ! Number of buffer points in the y ! direction REAL :: nlat ! Max. Latitude of the data area ! (degrees n) REAL :: slat ! Min. Latitude of the data area ! (degrees n) REAL :: elon ! Max. Longitude of the data area ! (degrees e) REAL :: wlon ! Min. Longitude of the data area ! (degrees e) REAL :: temak ! Working value of knot REAL :: xg1d(nx) ! Analysis grid points e-w (1-d) in ! grid units REAL :: yg1d(ny) ! Analysis grid points n-s (1-d) in ! grid units REAL :: xg(nx,ny) ! 2-D analysis grid points east-west REAL :: yg(nx,ny) ! 2-D analysis grid points north-south REAL :: glat(nx,ny) ! Latitude of the analysis data points REAL :: glon(nx,ny) ! Longitude of the analysis data ! points ! !----------------------------------------------------------------------- ! ! Misc. local variables: ! !----------------------------------------------------------------------- ! INTEGER :: i,j,k,l,m,n,itema,itemb REAL :: tema,temb,temc,temd,teme,temf ! !----------------------------------------------------------------------- ! ! Defining COMMON blocks: ! !----------------------------------------------------------------------- COMMON /terrainc/ analtype,mapproj,itertype,rmsopt,comtype & ,tdatadir,ltdir COMMON /projectc/ trulat,trulon,sclfct COMMON /gridc/ dx,dy,ctrlat,ctrlon,tol,wdn,rdnot COMMON /barnesc/ knot,gamma,ipass !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ sclfct=1.0/sclfct dincx=dx*sclfct dincy=dy*sclfct PRINT *,'dincx,dincy' PRINT *,dincx,dincy ! !----------------------------------------------------------------------- ! ! Note IMPORTANT!!!!: dx and dy are in meters...and the grid is ! oriented so that the y-axis runs along a longitude line towards ! the northpole and the x-axis is perpendicular to the y-axis. ! Create the x,y grid in grid meters (multiplied by sclfct), the ! origin is the southwest corner of the analysis domain and is ! translated from the center point specified by the user (lat,lon). ! ! !----------------------------------------------------------------------- CALL setmapr(mapproj,sclfct,trulat,trulon) CALL lltoxy(1,1,ctrlat,ctrlon,tema,temb) ! !----------------------------------------------------------------------- ! ! translate the center point to the first physical point. ! !----------------------------------------------------------------------- ! tema=tema-((nx-3)*dincx)/2 temb=temb-((ny-3)*dincy)/2 ! !----------------------------------------------------------------------- ! ! translating from the first physical point to the first scalar ! point. ! !----------------------------------------------------------------------- ! tema=tema-dincx/2.0 temb=temb-dincy/2.0 ! !----------------------------------------------------------------------- ! ! Calculate the rest of the analysis grid points in earth ! meters*sclfct ! !----------------------------------------------------------------------- ! DO j=1,ny yg1d(j)=temb+(j-1)*dincy END DO DO i=1,nx xg1d(i)=tema+(i-1)*dincx END DO ! !----------------------------------------------------------------------- ! ! Print a sample of the analysis grid values... ! !----------------------------------------------------------------------- ! PRINT *,'xg' WRITE(*,'(6f12.1)') (xg1d(i),i=1,6) PRINT *,'yg' WRITE(*,'(3f12.1)') (yg1d(j),j=1,3) !----------------------------------------------------------------------- ! ! Need to determine the boundaries of the analysis grid domain in ! terms of latitude and longitude. This will be done by taking the ! southwest in terms of analysis grid values (in meters) and ! calculating the lat/lon. ! !----------------------------------------------------------------------- CALL xytoll(nx,ny,xg1d,yg1d,glat,glon) ! !----------------------------------------------------------------------- ! ! Print a sample of the analysis grid lat/lons... ! !----------------------------------------------------------------------- ! PRINT *,'glat' WRITE (*,'(10f7.2)') ((glat(i,j),i=1,10),j=1,3) PRINT *,'glon' WRITE (*,'(10f7.2)') ((glon(i,j),i=1,10),j=1,3) ! !----------------------------------------------------------------------- ! ! Converting the longitudes obtained from the xytoll program to ! degrees east for use in the data sets. ! !----------------------------------------------------------------------- ! ! commented out the follwoinig code testing 11/28/00 ! DO j=1,ny ! DO i=1,nx ! IF(glon(i,j) < 0.0)glon(i,j)=glon(i,j)+360. ! start of new code ! IF(glon(i,j) >= 360.0)glon(i,j)=glon(i,j)-360. ! end of new code ! END DO ! END DO ! PRINT *,'glon adjusted' ! WRITE (*,'(10f7.2)') ((glon(i,j),i=1,nx),j=1,3) !----------------------------------------------------------------------- ! ! Calculating the number of data points to be included in the ! buffered areas (nbufx,nbufy). But first we need to determine the ! smallest horizontal spacing of the user requested data set for use ! in calculating nbufx and nbufy. ! ! note: lat and lon are in degrees north and east... ! !----------------------------------------------------------------------- nlat=-91. slat=91. elon=-900. wlon=900. DO i=1,nx nlat=MAX(glat(i,ny),nlat) slat=MIN(glat(i,1),slat) elon=MAX(glon(i,ny),elon) wlon=MIN(glon(i,1),wlon) END DO DO j=1,ny nlat=MAX(glat(1,j),nlat) nlat=MAX(glat(nx,j),nlat) slat=MIN(glat(1,j),slat) slat=MIN(glat(nx,j),slat) elon=MAX(glon(nx,j),elon) wlon=MIN(glon(1,j),wlon) END DO ! !----------------------------------------------------------------------- ! ! Test to see if maxlat and minlat are within physical limits.... ! !----------------------------------------------------------------------- ! IF (nlat > 90.0.OR.slat <= -90.0)THEN PRINT *,'maxlat is greater than 90. or minlat is less than ', & '-90. degrees latitude' PRINT *,'maxlat,minlat',nlat,slat STOP END IF ! !----------------------------------------------------------------------- ! ! Print the bound of the lat/lons of the analysis grid... ! !----------------------------------------------------------------------- ! PRINT *,'maxlat,minlat',nlat,slat PRINT *,'maxlon,minlon',elon,wlon ! !----------------------------------------------------------------------- ! ! Estimating the minumum data spacing in meters ! using the two furthest northward data points. These values ! will be used to determine the largest number of data points ! needed to determine the barnes analysis data buffer ! !----------------------------------------------------------------------- ! CALL lltoxy(1,1,nlat,glon(1,ny),tema,temb) temb=glon(1,ny)+REAL(1./ndx) CALL lltoxy(1,1,nlat,temb,temc,temd) terdx=ABS(tema-temc)/sclfct ! !----------------------------------------------------------------------- ! ! Calculating the maximum terdx at the southern most point in the domain ! !----------------------------------------------------------------------- ! CALL lltoxy(1,1,slat,glon(1,1),tema,temb) temb=glon(1,1)+REAL(1./ndx) CALL lltoxy(1,1,slat,temb,temc,temd) mterdx=ABS(tema-temc)/sclfct ! !----------------------------------------------------------------------- ! ! Calculating terdy at the northern most point in the domain ! !----------------------------------------------------------------------- ! CALL lltoxy(1,1,nlat,glon(1,ny),tema,temb) tema=nlat+REAL(1./ndy) CALL lltoxy(1,1,tema,glon(1,ny),temc,temd) terdy=ABS(temb-temd)/sclfct ! !----------------------------------------------------------------------- ! ! Pring the terrain data spacings... ! !----------------------------------------------------------------------- ! PRINT *,'terdx,terdy,mterdx',terdx,terdy,mterdx PRINT *,'2*mterdx=',2*mterdx,'2*terdy=',2*terdy ! !----------------------------------------------------------------------- ! ! Setting the Barnes influence factor and response to the desired ! wdn wavelength set by the user in arpstern.input. ! !----------------------------------------------------------------------- ! temb=MAX(dx,dy) tema=wdn*temb*sclfct IF (knot /= 0.0)THEN ! temak is knot read from ! arpstern.input temak=knot ELSE temak=-(tema/pi)*(tema/pi)*LOG(rdnot) END IF ! !----------------------------------------------------------------------- ! ! Calculate and plot the barnes response function ! !----------------------------------------------------------------------- ! temb=tema/wdn temc=temb/sclfct CALL response(tema,temb,temc,temak,pi) ! !----------------------------------------------------------------------- ! ! Calculate nbufx and nbufy... ! !----------------------------------------------------------------------- ! tema=SQRT(-LOG(tol)*temak) nbufx=INT(tema/(terdx*sclfct)+1) nbufy=INT(tema/(terdy*sclfct)+1) ! !----------------------------------------------------------------------- ! ! Print buffer sizes, working knot and cutoff radius.... ! !----------------------------------------------------------------------- ! PRINT *, 'nbufx,nbufy',nbufx,nbufy PRINT *, 'knot,temak,rc',knot,temak,tema !----------------------------------------------------------------------- ! ! Set up the limits of the latitude and longitude values for the ! data area. ! !----------------------------------------------------------------------- temc=REAL(1./ndy) temd=REAL(1./ndx) slat=slat-REAL((ipass+1)*nbufy*temc) wlon=wlon-REAL((ipass+1)*nbufx*temd) tema=slat-INT(slat) temb=wlon-INT(wlon) tema=INT(tema/temc) temb=INT(temb/temd) slat=REAL(INT(slat)+tema*temc) wlon=REAL(INT(wlon)+temb*temd) nlat=nlat+REAL((ipass+1)*nbufy*temc) elon=elon+REAL((ipass+1)*nbufx*temd) tema=nlat-INT(nlat) temb=elon-INT(elon) ! tema=REAL(INT(tema/temc)+1.) ! TESTING ORIGINAL CODE ! temb=REAL(INT(temb/temd)+1.) ! TESTING ORIGINAL CODE tema=INT(tema/temc) ! TESTING NEW CODE temb=INT(temb/temd) ! TESTING NEW CODE nlat=REAL(INT(nlat)+tema*temc) elon=REAL(INT(elon)+temb*temd) ! !----------------------------------------------------------------------- ! ! Print lat/lon bounds of the initial data field... ! !----------------------------------------------------------------------- ! PRINT *,'Buffer adjusted nlat,slat,wlon,elon' PRINT *,nlat,slat,wlon,elon !----------------------------------------------------------------------- ! ! Determine ntx, nty the total number of data points needed ! to perform the barnes analysis for the analysis domain. ! !----------------------------------------------------------------------- ! original code nty=INT(REAL(nlat-slat)*ndy)+1 ntx=INT(REAL(elon-wlon)*ndx)+1 ! testing new code... nty=INT(REAL(nlat-slat)*ndy) ntx=INT(REAL(elon-wlon)*ndx) PRINT *,'ntx,nty',ntx,nty PRINT *,'the number of terrain points in the x dir is',ntx PRINT *,'the number of terrain points in the y dir is',nty RETURN END SUBROUTINE setgrid !################################################################## !################################################################## !###### ###### !###### SUBROUTINE COMPGRID ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! ! SUBROUTINE compgrid(nx,ny,ndx,ndy,pi, & 1,1 ntx,nty,nbufx,nbufy,slat,nlat,wlon,elon,temak, & temc,temd,teme,temf,terdx,terdy, & xg1d,yg1d,xg,yg,glat,glon,closi,closj, & xob,yob,doblat,doblon,closit,closjt) !----------------------------------------------------------------------- ! ! PURPOSE: ! ! To compute the grid point locations for use by the chosen ! data analysis technique. Added due to f90 changes. ! ! !----------------------------------------------------------------------- ! ! AUTHOR: Dan Weber ! 11/28/2000 ! !----------------------------------------------------------------------- ! ! ! ! INPUT : ! ! nx Number of grid points for the analysis grid e-w dir. ! ny Number of grid points for the analysis grid n-s dir. ! ntx number of e-w data points ! nty number of n-s data points ! ndx Number of data points in a 1 degree block (e-w) ! ndy Number of data points in a 1 degree block (n-s) ! pi The constant Pi ! !----------------------------------------------------------------------- ! ! COMMON BLOCK VARIABLES: ! !----------------------------------------------------------------------- ! ! analtype Analysis type (1=barnes,2=other,...) ! mapproj Type of map projection used to setup the analysis grid. ! mapproj = 1 Polar Stereographic projection ! = 2 Mercator projection ! = 3 Lambert ! itertype Type of terrain desired (1=30 second, 2= 5 minute, ! 3= 1 degree) ! rmsopt Option for calc. the rms differences. (0=no,1=yes) ! comtype Computer type the arpstern11.f program will be run on ! comtype = 1 for IBM and other machine capable of ! declaring 2 byte integers ! = 4 for CRAY machines and other machines ! in which the minimum integer declaration ! is integer *8 ! knot Shape parameter for the barnes weight function. ! gamma Shape factor for multi pass scheme ! ipass Total number of passes thru the barnes scheme ! trulat Latitude(s) at which the map projection is true ! (degree N) ! trulon Longitude at which the map projection is true ! (degree E) ! sclfct Map scale factor (m) ! ! dx Analysis grid spacing in the x-direction east-west (m) ! dy Analysis grid spacing in the y-direction north-south(m) ! ctrlat Latitude of the center of the analysis grid (deg. N) ! ctrlon Longitude of the center of the analysis grid (deg. E) ! tol Tolerance for the weight function used in determining ! the cut-off radius or radius of influence ! wdn Wavelength in terms of grid points in which rdnot is ! valid ! rdnot Initial Response for wdn length wave ! ! LOCAL VARIABLES: ! ! dincx Analysis x-direction grid spacing normalized by the map ! scale dincx=dx/sclfct ! dincy Analysis y-direction grid spacing normalized by the map ! scale dincy=dy/sclfct ! mterdx Max. distance between e-w data pts. (m) ! terdx Distance in meters between data points in the e-w dir. ! (m) ! terdy Distance in meters between data points in the n-s dir. ! (m) ! ! OUTPUT: ! ! ntx Number of data points needed in the east-west direction ! nty Number of data points needed in the north-south ! direction ! nbufx Number of additional points needed to perform the ! Barnes ! analysis at the edges of the domain. e-w ! nbufy Number of additional points needed to perform the ! Barnes ! analysis at the edges of the domain. n-s ! nlat Latitude of the northern edge of the data area ! (degrees N) ! slat Latitude of the southern edge of the data area ! (degrees N) ! elon Longitude of the eastern edge of the data area ! (degrees E) ! wlon Longitude of the western edge of the data area ! (degrees E) ! temak Working value of knot (user or program specified) ! xg1d Analysis grid points e-w (1-d) in grid units ! (=meters/sclfct) ! yg1d Analysis grid points n-s (1-d) in grid units ! (=meters/sclfct) ! xg Analysis grid points in the e-w direction ! (in grid units) ! yg Analysis grid points in the n-s direction ! (in grid units) ! glat Latitude of the analysis data points ! glon Longitude of the analysis data points ! closi Array storing the data i index value corresponding to ! the closest analysis grid point ! closj Array storing the data j index value corresponding to ! the closest analysis grid point ! xob Analysis grid value in the east-west direction for the ! data points (terrain data) ! yob Analysis grid value in the north-south direction for ! the data points (terrain data) ! doblat Latitude of the data points (degrees north) ! doblon Longitude of the data points (degrees east) ! closit Array storing the terrain i index value corresponding ! to the closest terrain point ! closjt Array storing the terrain j index value corresponding ! to the closest terrain point ! ! !----------------------------------------------------------------------- ! ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- IMPLICIT NONE ! !----------------------------------------------------------------------- ! ! INPUT: ! !----------------------------------------------------------------------- ! INTEGER :: nx ! Number of analysis grid points e-w INTEGER :: ny ! Number of analysis grid points n-s INTEGER :: ndx ! Number of data points (e-w) INTEGER :: ndy ! Number of data points (n-s) REAL :: pi ! The constant Pi ! !----------------------------------------------------------------------- ! ! COMMON BLOCK VARIABLES: ! !----------------------------------------------------------------------- ! INTEGER :: analtype ! Analysis type INTEGER :: mapproj ! Type of map projection used in ! analysis INTEGER :: itertype ! Desired terrain resolution for ! analysis INTEGER :: rmsopt ! Option for enabling the rms diff. ! routine. INTEGER :: comtype ! Computer type, =1 for ibm, =4 for ! cray CHARACTER (LEN=80 ) :: tdatadir ! Directory containing the terrain ! data INTEGER :: ltdir ! Length of none-blank part of ! tdatadir. REAL :: knot ! Influence parameter for the barnes ! scheme REAL :: gamma ! Barnes shape factor for multi pass ! scheme INTEGER :: ipass ! Total number of passes REAL :: trulat (2) ! Latitude of true map projection ! (deg N) REAL :: trulon ! Longitude of true map projection ! (deg E) REAL :: sclfct ! Map scale factor (m) REAL :: dx ! Analysis grid spacing e-w direction ! (m) REAL :: dy ! Analysis grid spacing n-s direction ! (m) REAL :: ctrlat ! Latitude of the center of the ! analysis grid (deg. n) REAL :: ctrlon ! Longitude of the center of the ! analysis grid (deg. e) REAL :: tol ! Tolerance level for the weight ! function REAL :: wdn ! Wavelength in terms of analysis grid ! points for the rdnot response REAL :: rdnot ! Initial Response for wdn length wave ! !----------------------------------------------------------------------- ! ! LOCAL VARIABLES: ! !----------------------------------------------------------------------- ! REAL :: terdx ! Distance in grid meters between e-w ! data pts REAL :: terdy ! Distance in grid meters between n-s ! data pts ! !----------------------------------------------------------------------- ! ! OUTPUT: ! !----------------------------------------------------------------------- ! INTEGER :: ntx ! Actual number of data points needed ! for data domain e-w INTEGER :: nty ! Actual number of data points needed ! for data domain n-s INTEGER :: nbufx ! Number of buffer points in the x ! direction INTEGER :: nbufy ! Number of buffer points in the y ! direction REAL :: nlat ! Max. Latitude of the data area ! (degrees n) REAL :: slat ! Min. Latitude of the data area ! (degrees n) REAL :: elon ! Max. Longitude of the data area ! (degrees e) REAL :: wlon ! Min. Longitude of the data area ! (degrees e) REAL :: temak ! Working value of knot REAL :: xg1d(nx) ! Analysis grid points e-w (1-d) in ! grid units REAL :: yg1d(ny) ! Analysis grid points n-s (1-d) in ! grid units REAL :: xg(nx,ny) ! 2-D analysis grid points east-west REAL :: yg(nx,ny) ! 2-D analysis grid points north-south REAL :: glat(nx,ny) ! Latitude of the analysis data points REAL :: glon(nx,ny) ! Longitude of the analysis data ! points INTEGER :: closi(nx,ny) ! Array storing the data i index value ! corresponding to the closest ! analysis pt. INTEGER :: closj(nx,ny) ! Array storing the data j index value ! corresponding to the closest ! analysis pt. REAL :: xob(ntx,nty) ! Data set grid point values east-west REAL :: yob(ntx,nty) ! Data set grid point values ! north-south REAL :: doblat(ntx,nty) ! Latitude of the data points ! (degrees north) REAL :: doblon(ntx,nty) ! Longitude of the data points ! (degrees east) INTEGER :: closit(ntx,nty) ! array storing the data i index value ! corresponding to the closest data ! point INTEGER :: closjt(ntx,nty) ! array storing the data j index value ! corresponding to the closest data ! point ! !----------------------------------------------------------------------- ! ! Misc. local variables: ! !----------------------------------------------------------------------- ! INTEGER :: i,j,k,l,m,n,itema,itemb REAL :: tema,temb,temc,temd,teme,temf ! !----------------------------------------------------------------------- ! ! Defining COMMON blocks: ! !----------------------------------------------------------------------- COMMON /terrainc/ analtype,mapproj,itertype,rmsopt,comtype & ,tdatadir,ltdir COMMON /projectc/ trulat,trulon,sclfct COMMON /gridc/ dx,dy,ctrlat,ctrlon,tol,wdn,rdnot COMMON /barnesc/ knot,gamma,ipass !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! !----------------------------------------------------------------------- ! ! Print lat/lon bounds of the initial data field... ! !----------------------------------------------------------------------- ! temc=REAL(1./ndy) temd=REAL(1./ndx) PRINT *,'in compgrid nlat,slat,wlon,elon' PRINT *,nlat,slat,wlon,elon DO j=1,nty DO i=1,ntx doblat(i,j)=slat+REAL((j-1.)*temc) doblon(i,j)=wlon+REAL((i-1.)*temd) END DO END DO ! !----------------------------------------------------------------------- ! ! Print a sample of the initial data field lat/lon values... ! !----------------------------------------------------------------------- ! PRINT *,'doblon' WRITE (*,'(8f9.3)') ((doblon(i,j),i=1,8),j=1,3) PRINT *,'doblat' WRITE (*,'(8f9.3)') ((doblat(i,j),i=1,8),j=1,3) !----------------------------------------------------------------------- ! ! Calculate the grid point values for the data ! !----------------------------------------------------------------------- CALL lltoxy(ntx,nty,doblat,doblon,xob,yob) ! !----------------------------------------------------------------------- ! ! Print a sample of the initial data field grid values... ! !----------------------------------------------------------------------- ! PRINT *,'xob' WRITE (*,'(6f12.1)') ((xob(i,j),i=1,7),j=1,3) PRINT *,'yob' WRITE (*,'(6f12.1)') ((yob(i,j),i=1,7),j=1,3) ! !----------------------------------------------------------------------- ! ! Setting the corners of the analysis grid in degrees lat/lon for the ! purpose of plotting later.( glat and glon will be overwritten in ! subroutine barnes) ! !----------------------------------------------------------------------- ! temc=glat(1,ny) temd=glon(1,ny) teme=glat(nx,1) temf=glon(nx,1) ! !----------------------------------------------------------------------- ! ! Looking for the data point which is closest to the analysis ! point (1,1). These indicies will be used to find the remaining points ! !----------------------------------------------------------------------- ! print *,yg1d(1),xg1d(1) tema=10000000. DO l=1,nty/2 DO k=1,ntx/2 temb=SQRT((xg1d(1)-xob(k,l))*(xg1d(1)-xob(k,l))+ & (yg1d(1)-yob(k,l))*(yg1d(1)-yob(k,l))) IF(temb < tema)THEN m=k n=l tema=temb END IF END DO END DO ! !----------------------------------------------------------------------- ! ! Calculate an increment which insures each closest point will be found ! !----------------------------------------------------------------------- ! itema=INT(dx/terdx+3) itemb=INT(dy/terdy+3) DO j=1,ny DO i=1,nx tema=10000000. DO l=n-itemb,n+itemb DO k=m-itema,m+itema temb=SQRT((xg1d(i)-xob(k,l))*(xg1d(i)-xob(k,l))+ & (yg1d(j)-yob(k,l))*(yg1d(j)-yob(k,l))) IF (temb < tema)THEN closi(i,j)=k closj(i,j)=l tema=temb END IF END DO END DO m=closi(i,j) n=closj(i,j) END DO m=closi(1,j) n=closj(1,j) END DO ! !----------------------------------------------------------------------- ! ! Print a sample of closi and closj... ! !----------------------------------------------------------------------- ! PRINT *,'closi' WRITE (*,'(14i5)') ((closi(i,j),i=1,14),j=1,3) PRINT *,'closj' WRITE (*,'(14i5)') ((closj(i,j),i=1,14),j=1,3) ! !----------------------------------------------------------------------- ! ! Set the closit, closjt for the terrain data points analysis. ! !----------------------------------------------------------------------- ! DO j=1,nty DO i=1,ntx closit(i,j)=i closjt(i,j)=j END DO END DO ! !----------------------------------------------------------------------- ! ! Expand the 1 dimensional grid arrays into 2-D arrays for use ! in the barnes scheme. ! !----------------------------------------------------------------------- ! DO j=1,ny DO i=1,nx xg(i,j)=xg1d(i) yg(i,j)=yg1d(j) END DO END DO RETURN END SUBROUTINE compgrid !################################################################## !################################################################## !###### ###### !###### SUBROUTINE GETTER ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE getter(ntx,nty,ndx,ndy,slat,nlat,wlon,elon, & 1,3 h, & nval,readdat) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! To retrieve elevation data from terrain data files and fill (if ! needed) areas which are not covered by the user specified data set ! . This program will read the desired terrain resolution header ! file, if the data is found the program will read the data in and ! load the terrain array. If the initial read does not find the ! data avaliable, the program will read the header file for the next ! best avaliable resolution set. This process will continue until ! data has been found. If no data exists for this particular 1 ! degree block (this can happen!!!) the program will stop. ! ! Three terrain resolutions are currently supported by this code: ! ! 1. 30 second resolution data for the continental United ! States(approx. 1km resolution) ! 2. 5 minute resolution data for most of North America and ! some of Europe. ! (approx. 10km resolution) ! 3. 1 degree resolution (30 minute in some locations) for the ! entire globe. (minus a few locations including the south ! pole) (appros. 110km resolution) ! ! The structure of this program is as follows: (eg. 30 second data ! chosen) ! 1. Read 30 second header for a block match. If block is ! found, read the data file and continue to the next block. ! If no 30 second data exists for this block, the 5 minute ! header file will be read to find a block match. If there ! is a match, the data will be read, and expanded to fit the ! size of the 30 second data array. If there is no match ! with the 5 minute header file, the 1 degree header file ! will be read. If there is a match the 1 degree data will ! be read and expanded to fit the 30 second data structure. ! If no data exists for the block in the 1 degree header ! file the program will print a stop message and end. ! ! !----------------------------------------------------------------------- ! ! AUTHOR: Dan Weber ! 1/12/94 ! ! MODIFICATION HISTORY: ! ! 2/16/98, Dan Weber. ! Bug fix for tema and temb for southern hemisphere indexing. ! ! 2000/02/03 Gene Bassett. ! Moved Great Lakes terrain corrections into a subroutine. ! ! 11/29/2000 Dan Weber ! Bug fix to the loading of the first terrain value along a longitude ! circle. ! Bug fix for data sets that span the 0 longitude line. ! !----------------------------------------------------------------------- ! ! ! INPUT : ! ! ntx Limit of terrain data points for use in the east-west dir. ! nty Limit of terrain data points for use in the north-south dir. ! ndx Number of terrain data points in the (east-west) direction ! for a 1 degree block of data ! ndy Number of terrain data points in the (north-south) direction ! for a 1 degree block of data ! nlat Northern extent of the buffered data set (degrees N) ! slat Southern extent of the buffered data set (degrees N) ! elon Eastern extent of the buffered data set (degrees E) ! wlon Western extent of the buffered data set (degrees E) ! ! ! COMMON BLOCK VARIABLES: ! ! analtype Type of analysis variable requested ! mapproj Type of projection desired ! itertype Type of terrain data requested ! rmsopt Rms error option ! comtype Type of computer this analysis is run on ! ! tdatadir Directory containing the terrain data ! ltdir Length of none-blank part of tdatadir ! ! LOCAL VARIABLES : ! ! id Array for reading header information from the data files ! idim East-west dimension of the readdat array in the readter sub. ! jdim North-south dimension of the readdat array in the readter sub. ! n Record number for use in readter ! nfile2 Character string storing the data file name ! rlength Record length of the data set ! ! OUTPUT: ! ! h Terrain data for use in the Barnes analysis scheme (m) ! ! ! TEMPORARY ARRAYS: ! ! nval Temporary array which contains the terrain data (m) ! readdat Temporary array used to read the data file ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- IMPLICIT NONE ! !----------------------------------------------------------------------- ! ! INPUT: ! !----------------------------------------------------------------------- ! INTEGER :: ntx ! Limit of terrain data points e-w dir. INTEGER :: nty ! Limit of terrain data points n-s dir. INTEGER :: ndx ! Number of terrain data points in the e-w INTEGER :: ndy ! Number of terrain data points in the n-s REAL :: nlat ! Northern extent of the buffered data set (N) REAL :: slat ! Southern extent of the buffered data set (N) REAL :: elon ! Eastern extent of the buffered data set (E) REAL :: wlon ! Western extent of the buffered data set (E) ! !----------------------------------------------------------------------- ! ! COMMON BLOCK VARIABLES: ! !----------------------------------------------------------------------- ! INTEGER :: analtype ! Type of analysis variable requested INTEGER :: mapproj ! Type of projection desired INTEGER :: itertype ! =1,2,or 3 for 30 sec,5 min, or 1 deg data INTEGER :: rmsopt ! Rms error option INTEGER :: comtype ! Computer type CHARACTER (LEN=80 ) :: tdatadir ! Directory containing the terrain data INTEGER :: ltdir ! Length of none-blank part of tdatadir. ! !----------------------------------------------------------------------- ! ! LOCAL VARIABLES: ! !----------------------------------------------------------------------- ! INTEGER :: id(2) ! Data file header array INTEGER :: idim ! East-west dimension of the readdat array ! in the readter subroutine INTEGER :: jdim ! North-south dimension of the readdat array ! in the readter subroutine INTEGER :: n ! Record number for use in readter CHARACTER (LEN=80) :: nfile2 ! Character storing the data file name INTEGER :: rlength ! Length of the record in a data set ! !----------------------------------------------------------------------- ! ! OUTPUT: ! !----------------------------------------------------------------------- ! REAL :: h(ntx,nty) ! Terrain data for use in the analysis scheme, ! includes the buffered area. (m) ! !----------------------------------------------------------------------- ! ! TEMPORARY ARRAYS: ! !----------------------------------------------------------------------- ! INTEGER*2 nval(ndx,ndy) ! Temporary array which contains the data (m) INTEGER*2 readdat(ndx,ndy)! Temporary array which used to read the file !----------------------------------------------------------------------- ! ! Misc. local variables: ! !----------------------------------------------------------------------- ! REAL :: newslat,newnlat,newelon,newwlon,teme,temf INTEGER :: i,j,k,l,ll,inew,acount INTEGER :: tema,temb,temc,temd INTEGER :: ii,jj,kk,kbgn,kend,lbgn,lend,istat ! !----------------------------------------------------------------------- ! !----------------------------------------------------------------------- ! ! COMMON block definition: ! !----------------------------------------------------------------------- ! COMMON /terrainc/ analtype,mapproj,itertype,rmsopt,comtype & ,tdatadir,ltdir ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ PRINT *,'entering getter' !----------------------------------------------------------------------- ! ! Setting the internal dimensions of the readdat array specific to the ! type of data read. ! ! NOTE: If the desired data resolution is 5 minutes, the 30 second data ! file will not be accessed. If the desired data resolution is 1 degree ! the 5 minute and 30 second data sets will not be accessed. ! !----------------------------------------------------------------------- PRINT *,'itertype=',itertype IF(itertype > 3.OR.itertype < 1)THEN PRINT *,'itertype is not supported, program will stop' STOP END IF OPEN(12,FILE=tdatadir(1:ltdir)//'dir30sec.hdr', & FORM='formatted',STATUS='old',IOSTAT=istat) IF( istat /= 0) THEN WRITE(6,'(/a,/a/)') & ' Error occured when opening terrain header file ', & tdatadir(1:ltdir)//'dir30sec.hdr',' Program stopped in GETTER.' STOP END IF OPEN(13,FILE=tdatadir(1:ltdir)//'dir5min.hdr', & FORM='formatted',STATUS='old',IOSTAT=istat) IF( istat /= 0) THEN WRITE(6,'(/a,/a/)') & ' Error occured when opening terrain header file.', & tdatadir(1:ltdir)//'dir5min.hdr',' Program stopped in GETTER.' STOP END IF OPEN(14,FILE=tdatadir(1:ltdir)//'dir1deg.hdr', & FORM='formatted',STATUS='old',IOSTAT=istat) IF( istat /= 0) THEN WRITE(6,'(/a,/a/)') & ' Error occured when opening terrain header file.', & tdatadir(1:ltdir)//'dir1deg.hdr',' Program stopped in GETTER.' STOP END IF ! ! new code added to fix a southern hemisphere indexing bug... ! (if statements) IF(slat >= 0.0)THEN ! compute the index for the southern lat. tema=INT((slat-INT(slat))*ndy)+1 ELSE ! compute the index for the southern lat. IF( ABS(slat-INT(slat)) < 0.000001)THEN tema = 1 ELSE tema=ABS(INT((1.+slat-INT(slat))*ndy))+1 END IF END IF IF(nlat >= 0.0)THEN ! compute the index for the northern lat. temb=INT((nlat-INT(nlat))*ndy)+1 ELSE ! compute the index for the northern lat. IF(abs(nlat-INT(nlat)) < 0.000001) THEN temb = 1 ELSE temb=ABS(INT((1.+nlat-INT(nlat))*ndy))+1 END IF END IF ! added/modified the following to fix a bug DBW, 11/29/2000 IF(wlon < 0.0)THEN IF(abs(wlon-INT(wlon)) < 0.000001) THEN print *,'got here a' temc = 1 ELSE temc=ABS(INT((1.+wlon-INT(wlon))*ndx))+1 print *,'got here b' END IF ELSE temc=INT((wlon-INT(wlon))*ndx)+1 END IF IF(elon < 0.0)THEN IF(abs(elon-INT(elon)) < 0.000001) THEN temd = 1 ELSE temd=ABS(INT((1.+elon-INT(elon))*ndx))+1 END IF ELSE temd=INT((elon-INT(elon))*ndx)+1 END IF PRINT *,'tema,temb,temc,temd',tema,temb,temc,temd ! !----------------------------------------------------------------------- ! ! Starting the main search and read loop..... ! !----------------------------------------------------------------------- ! jj=0 IF(slat < 0.0)THEN ! testing for negative latitude limits... newslat=slat teme = slat-INT(slat) IF(ABS(teme) > 0.000001 )newslat=slat-1.0 ELSE newslat=slat END IF IF(nlat < 0.0)THEN ! testing for negative latitude limits... newnlat=nlat teme = nlat-INT(nlat) IF(ABS(teme) > 0.000001 )newnlat=nlat-1.0 ELSE newnlat=nlat END IF IF(wlon < 0.0)THEN ! testing for negative longitude limits... newwlon=wlon teme = wlon-INT(wlon) IF(ABS(teme) > 0.000001 )newwlon=wlon-1.0 ELSE newwlon=wlon END IF IF(elon < 0.0)THEN ! testing for negative longitude limits... newelon=elon teme = elon-INT(elon) IF(ABS(teme) > 0.000001 )newelon=elon-1.0 ELSE newelon=elon END IF DO j=INT(newslat),INT(newnlat) jj=jj+1 ii=0 acount = 0 DO i=INT(newwlon),INT(newelon) ii=ii+1 IF(i >= 360.AND.acount == 0)THEN ! need to rewind the header files... acount = 1 IF(itertype == 3)THEN ! rewind dir1deg.hdr only... REWIND(14) ELSE IF(itertype == 2)THEN ! rewind dir5min and dir1deg.hdrs REWIND(13) REWIND(14) ELSE IF(itertype == 1)THEN ! rewind all header files... REWIND(12) REWIND(13) REWIND(14) END IF END IF ! !----------------------------------------------------------------------- ! ! Testing for values of longitude greater than 359. ! !----------------------------------------------------------------------- ! inew=i IF(i >= 360)THEN inew=inew-360 END IF ! start of bug fix area for data spanning the 0 longitude line... ! DBW 11/29/2000 IF(i < 0)THEN inew=inew+360 ENDIF IF(int(wlon) < 0.AND.(i >= 0.AND.i-1 < 0))THEN IF(itertype.eq.3)then ! rewind dir1deg.hdr only... rewind(14) ELSE IF(itertype == 2)then ! rewind dir5min and dir1deg.hdrs rewind(13) rewind(14) ELSE IF(itertype == 1)then ! rewind all header files... rewind(12) rewind(13) rewind(14) ENDIF ENDIF ! end of bug fix area DBW 11/29/2000. PRINT *,'looking for latitude, longitude',j,inew IF(itertype == 1)THEN ! reading the 30 second header file 1 READ(12,'(3i6)',END=2) id(1),id(2),n IF(id(1) == j.AND.id(2) == inew)THEN ! testing for a match nfile2=tdatadir(1:ltdir)//'dir30sec.dat ' PRINT *,'we have a match reading ',nfile2 idim=120 jdim=120 rlength=28800*comtype CALL readter(n,idim,jdim,ndx,ndy,nfile2,rlength, & readdat,nval) GO TO 99 ! Data has been read, add to the h array... ELSE ! no match yet read header file again... GO TO 1 END IF END IF 2 PRINT *,'block not found in dir30sec.hdr or data not desired' REWIND (12) IF(itertype == 2.OR.itertype == 1)THEN ! testing for correct itertype 3 READ(13,'(3i6)',END=4) id(1),id(2),n IF(id(1) == j.AND.id(2) == inew)THEN ! testing for a match (5 minute) nfile2=tdatadir(1:ltdir)//'dir5min.dat ' PRINT *,'reading ',nfile2,n idim=12 jdim=12 rlength=288*comtype CALL readter(n,idim,jdim,ndx,ndy,nfile2,rlength, & readdat,nval) GO TO 99 ELSE GO TO 3 END IF END IF 4 PRINT *,'block not found in dir5min.hdr or data not desired' REWIND (13) ! !----------------------------------------------------------------------- ! ! Reading the dir1deg header file. ! !----------------------------------------------------------------------- ! PRINT *,'reading dir1deg.hdr file' 5 READ(14,'(3i6)',END=6) id(1),id(2),n IF(id(1) == j.AND.id(2) == inew)THEN ! testing for a match... nfile2=tdatadir(1:ltdir)//'dir1deg.dat' PRINT *,'reading ',nfile2 idim=2 jdim=2 rlength=8*comtype CALL readter(n,idim,jdim,ndx,ndy,nfile2,rlength, & readdat,nval) print *,nval(1,1),nval(2,1),nval(1,2),nval(2,2) print *,readdat(1,1),readdat(2,1),readdat(1,2),readdat(2,2) GO TO 99 ! update the terrain array..... ELSE GO TO 5 ! read the header file again...... END IF 6 PRINT *,'block not found in dir1deg.hdr,no data was found ', & 'for this block, the program will stop' STOP ! !----------------------------------------------------------------------- ! ! Update the terrain array (h), unpack, and convert to meters. ! !----------------------------------------------------------------------- ! 99 PRINT *,'adding nval to the h array' ! !----------------------------------------------------------------------- ! ! Setting up the ranges for adding each nval to the h array.... ! !----------------------------------------------------------------------- ! IF(jj == 1.AND.j == INT(newnlat))THEN lbgn=tema lend=temb ll=0 ELSE IF(jj == 1)THEN lbgn=tema lend=ndy ll=0 ELSE IF (j == INT(newnlat))THEN lbgn=1 lend=temb ll=ndy-tema+1+(jj-2)*ndy ELSE lbgn=1 lend=ndy ll=ndy-tema+1+(jj-2)*ndy END IF DO l=lbgn,lend ll=ll+1 IF(ii == 1.AND.i == INT(newelon))THEN kbgn=temc kend=temd kk=0 ELSE IF(ii == 1)THEN kbgn=temc kend=ndx kk=0 ELSE IF(i == INT(newelon))THEN kbgn=1 kend=temd kk=ndx-temc+1+(ii-2)*ndx ELSE kbgn=1 kend=ndx kk=ndx-temc+1+(ii-2)*ndx END IF DO k=kbgn,kend kk=kk+1 h(kk,ll)=REAL(nval(k,l)*20-4000) ! units are in meters... ! print *,'kk ll and h = ',kk,ll,h(kk,ll),nval(k,l),k,l END DO END DO print *,'kbgn,kend,lbgn,lend ',kbgn,kend,lbgn,lend END DO END DO CLOSE(12) CLOSE(13) CLOSE(14) RETURN END SUBROUTINE getter !################################################################## !################################################################## !###### ###### !###### SUBROUTINE READTER ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE readter(n,idim,jdim,ndx,ndy,nfile2,rlength, & 3 readdat,nval) !----------------------------------------------------------------------- ! ! PURPOSE: ! ! To retrieve terrain data from the selected data files ! This program will read either the 30 second, 5 minute, or 1 degree ! terrain data base files in a direct access format. ! (original sources, DMA_ELEV.DAT or elev.dat data files obtain from NCAR) ! ! NOTE: these original data files have been modified to run more ! efficiently (put in direct access format by dir30sec.f, dir5min.f and ! dir1deg.f). ! !----------------------------------------------------------------------- ! ! !----------------------------------------------------------------------- ! ! Variable definitions ! !----------------------------------------------------------------------- ! ! INPUT: ! ! n value of the record number ! idim x dimension of the readdat array ! jdim y dimension of the readdat array ! ndx Number of terrain data points in the e-w direction ! for the DESIRED data resolution ! ndy Number of terrain data points in the n-s direction ! for the DESIRED data resolution ! nfile2 Filename of the data set to be accessed ! rlength Length of the record to be read from the data set ! readdat Array which will read the data file ! ! OUTPUT: ! ! nval Array in which the terrain values will be stored ! !----------------------------------------------------------------------- ! ! Variable declarations ! !----------------------------------------------------------------------- IMPLICIT NONE ! !----------------------------------------------------------------------- ! ! INPUT: ! !----------------------------------------------------------------------- ! INTEGER :: n ! Specific value of the record number INTEGER :: idim ! East-west readdat dimension INTEGER :: jdim ! North-south readdat dimension INTEGER :: ndx ! East-west nval dimension INTEGER :: ndy ! North-south nval dimension CHARACTER (LEN=* ) :: nfile2 ! Data set filename INTEGER :: rlength ! Length of the data record INTEGER*2 readdat(idim,jdim) ! Array which will read the data file ! !----------------------------------------------------------------------- ! ! OUTPUT: ! !----------------------------------------------------------------------- ! INTEGER*2 nval(ndx,ndy) ! Array of terrain data for the block ! !----------------------------------------------------------------------- ! ! Misc. local variables: ! !----------------------------------------------------------------------- ! INTEGER :: itema,itemb REAL :: tema,temb,temc,temd INTEGER :: k,l,istat ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ OPEN(11,FILE=nfile2,ACCESS='direct',FORM='unformatted', & STATUS='old',RECL=rlength,IOSTAT=istat) IF( istat /= 0) THEN WRITE(6,'(/a,/a,a/)') & 'Error occured when opening terrain data file.', & nfile2,', Program stopped in READTER.' STOP END IF READ(11,REC=n,ERR=991) readdat CLOSE (11) ! !----------------------------------------------------------------------- ! ! Filling the nval array ! !----------------------------------------------------------------------- ! IF(idim < ndx)THEN ! if true, nval will be filled stepwise temc=REAL(idim/REAL(ndx)) temd=REAL(jdim/REAL(ndy)) DO l=1,ndy DO k=1,ndx tema=REAL((k-1)*temc) temb=REAL((l-1)*temd) itema=INT(tema) itemb=INT(temb) nval(k,l)=readdat(1+itema,1+itemb) END DO END DO ELSE ! direct fill... DO l=1,ndy DO k=1,ndx nval(k,l)=readdat(k,l) END DO END DO END IF RETURN 991 PRINT*,'Error occurred when reading data ',nfile2, & ' in READTER. Program stopped in READTER.' STOP END SUBROUTINE readter !################################################################## !################################################################## !###### ###### !###### SUBROUTINE BARNES ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE barnes(ipnum,ibgn,iend,jbgn,jend,nx,ny,ntx,nty, & 2 nbufx,nbufy,temak,zbt,za, & zga, & xg,yg,xob,yob,closi,closj,tem1,tem2) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Perform a Barnes analysis on a data base for a prespecified ! knot and gamma (multipass scheme). The user can specific knot, the ! influence factor, in arpstern.input or allow the program to calculate ! one given specified parameters (in setgrid). The cutoff radius is ! ! rc=(ln(rdnot) * KNOT)**0.5 ! ! The Barnes weight function is w = EXP(-r**2/knot) ! where r is the distance between the analysis point and the data ! point. ! !----------------------------------------------------------------------- ! ! AUTHOR: Dan Weber ! 1/13/94 ! !----------------------------------------------------------------------- ! ! INPUT : ! ! ipnum Current pass number ! ibgn Starting index for the analysis (e-w) ! iend Ending index for the analysis (e-w) ! jbgn Starting index for the analysis (n-s) ! jbgn Ending index for the analysis (n-s) ! nx Number of analysis grid points in the east-west direction ! ny Number of analysis grid points in the north-south direction ! ntx Limit of number of data points e-w ! nty Limit of number of data points n-w ! nbufx Number of additional data points outside the model ! domain used on the calculation of the boundaries. east-west ! nbufy Number of additional data points outside the model ! domain used on the calculation of the boundaries. north-south ! temak Working value of knot (set in setgrid subroutine) ! ! zbt Analyzed data at analysis points obtained ! from performing a barnes analysis at the data points. ! za Data for the buffered and analysis areas (m) ! ! xg Analysis grid points east-west direction (grid units) ! ! yg Analysis grid points north-south direction (grid units) ! ! xob Data set grid point values east-west direction ! yob Data set grid point values north-south direction ! ! closi Array storing the data i index value corresponding to ! the closest analysis grid point ! closj Array storing the data j index value corresponding to ! the closest analysis grid point ! ! COMMON block variables: ! ! knot Shape parameter for the barnes weight function. ! gamma Response factor for multiple passes of the Barnes analysis ! ipass Total number of passes to be performed ! ! OUTPUT: ! ! zga Analyzed data field. (m) ! ! ! TEMPORARY ARRAYS ! ! tem1 Temporary working array (barnes weight function) ! tem2 Temporary working array ! ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- ! IMPLICIT NONE !----------------------------------------------------------------------- ! ! INPUT: ! !----------------------------------------------------------------------- ! INTEGER :: ipnum ! Current pass number INTEGER :: ibgn ! starting index for the analysis (e-w) INTEGER :: iend ! ending index for the analysis (e-w) INTEGER :: jbgn ! starting index for the analysis (n-s) INTEGER :: jend ! ending index for the analysis (n-s) INTEGER :: nx ! Number of analysis grid points (e-w) INTEGER :: ny ! Number of analysis grid points (n-s) INTEGER :: ntx ! Limit of data points e-w INTEGER :: nty ! Limit of data poitns n-s INTEGER :: nbufx ! Number of buffer data points e-w INTEGER :: nbufy ! Number of buffer data points n-s REAL :: temak ! Working value of knot REAL :: zbt(ntx,nty) ! Background data field (not required) ! at the data points. (m) REAL :: za(ntx,nty) ! Data base for use in the Barnes ! analysis for the buffered area. (m) REAL :: xg(nx,ny) ! Analysis grid points east-west ! direction (analysis grid units) REAL :: yg(nx,ny) ! Analysis grid points north-south ! direction (analysis grid units) REAL :: xob(ntx,nty) ! Data set grid point values east-west ! direction REAL :: yob(ntx,nty) ! Data set grid point values north-south ! direction INTEGER :: closi(nx,ny) ! array storing the data i index value ! corresponding to the closest grid pt INTEGER :: closj(nx,ny) ! array storing the data j index value ! corresponding to the closest grid pt ! !----------------------------------------------------------------------- ! ! COMMON block variables: ! !----------------------------------------------------------------------- ! REAL :: knot ! Shape parameter for the barnes scheme REAL :: gamma ! Response factor for multiple pass Barnes INTEGER :: ipass ! Total number of passes to be performed ! !----------------------------------------------------------------------- ! ! OUTPUT: ! !----------------------------------------------------------------------- ! REAL :: zga(nx,ny) ! Analyzed data base for use by the user (m) ! !----------------------------------------------------------------------- ! ! TEMPORARY ARRAYS ! !----------------------------------------------------------------------- ! REAL :: tem1(nx,ny) ! Temporary working array (Barnes Weights) REAL :: tem2(nx,ny) ! Temporary working array ! !----------------------------------------------------------------------- ! ! Misc. local variables: ! !----------------------------------------------------------------------- ! INTEGER :: i,j,m,n,in,jn REAL :: w,tema,temb,temc ! !----------------------------------------------------------------------- ! ! COMMON block definition: ! !----------------------------------------------------------------------- ! COMMON /barnesc/ knot,gamma,ipass ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ IF(ipnum == 1)THEN tema=1.0 DO j=jbgn,jend DO i=ibgn,iend zga(i,j)=0.0 END DO END DO DO j=1,nty DO i=1,ntx zbt(i,j)=0.0 END DO END DO ELSE tema=gamma END IF DO j=jbgn,jend DO i=ibgn,iend tem1(i,j)=0.0 tem2(i,j)=0.0 END DO END DO ! !----------------------------------------------------------------------- ! ! BEGIN THE BARNES ANALYSIS*********** ! !----------------------------------------------------------------------- ! ! !----------------------------------------------------------------------- ! ! Print the bounds of the barnes analysis and current pass number. ! !----------------------------------------------------------------------- ! PRINT *,'ibgn,iend,jbgn,jend',ibgn,iend,jbgn,jend PRINT *,'current barnes pass ',ipnum PRINT *,'closi(1,ny),closj(1,ny),nbufx,nbufy', & closi(1,ny),closj(1,ny),nbufx,nbufy tema=temak*tema DO n=-nbufy,nbufy DO m=-nbufx,nbufx DO j=jbgn,jend DO i=ibgn,iend in=closi(i,j)+m jn=closj(i,j)+n temb=xg(i,j)-xob(in,jn) temc=yg(i,j)-yob(in,jn) w=EXP(-(temb*temb+temc*temc)/tema) tem2(i,j)=(za(in,jn)-zbt(in,jn))*w+tem2(i,j) tem1(i,j)=tem1(i,j)+w END DO END DO END DO END DO ! !----------------------------------------------------------------------- ! ! Summing up the weights from each observation inside the rc ! and dividing by the total weight for each analysis grid point. ! !----------------------------------------------------------------------- ! DO j=jbgn,jend DO i=ibgn,iend zga(i,j)=zga(i,j)+tem2(i,j)/tem1(i,j) END DO END DO PRINT *,'leaving the barnes subroutine' RETURN END SUBROUTINE barnes !################################################################## !################################################################## !###### ###### !###### SUBROUTINE RMSDIF ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE rmsdif(ibgn,iend,jbgn,jend,ntx,nty,tema,temb,temc, & 1,1 temd,glab,f1,f2,diff) ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Calculate and plot the root mean square difference between ! two data fields. ! !----------------------------------------------------------------------- ! ! AUTHOR: Dan Weber ! 1/12/94 ! !----------------------------------------------------------------------- ! ! INPUT: ! ! ibgn Starting i index for the differencing loop ! iend Ending i index for the differencing loop ! jbgn Starting j index for the differencing loop ! jend Ending j index for the differencing loop ! ! ntx Dimension in the e-w direction for the f1,f2, diff arrays ! nty Dimension in the n-s direction for the f1,f2, diff arrays ! ! tema Latitude of the northwest corner of the area ! temb Longitude of the northwest corner of the area ! temc Latitude of the southwest corner of the area ! temd Longitude of the southwest corner of the area ! glab Label for the difference field plot ! ! f1 First data array ! f2 Second data array ! ! ! OUTPUT: ! ! diff Root mean square difference field between f1 and f2 ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- IMPLICIT NONE INTEGER :: ibgn ! Starting i index for the differencing loop INTEGER :: iend ! Ending i index for the differencing loop INTEGER :: jbgn ! Starting j index for the differencing loop INTEGER :: jend ! Ending j index for the differencing loop INTEGER :: ntx ! Dimension in the e-w direction for f1 and f2 INTEGER :: nty ! Dimension in the n-s direction for f1 and f2 REAL :: tema ! Lat of the northwest corner of the area REAL :: temb ! Lon of the northwest corner of the area REAL :: temc ! Lat of the southwest corner of the area REAL :: temd ! Lon of the southwest corner of the area CHARACTER (LEN=65) :: glab ! Label for the difference field plot REAL :: f1(ntx,nty) ! Array containing field number 1 REAL :: f2(ntx,nty) ! Array containing field number 2 REAL :: diff(ntx,nty) ! Root mean square difference field ! diff=sqrt((f1-f2)*(f1-f2)) ! !----------------------------------------------------------------------- ! ! Misc. local variables: ! !----------------------------------------------------------------------- ! INTEGER :: i,j REAL :: cint ! !----------------------------------------------------------------------- ! ! Defining COMMON blocks: ! !----------------------------------------------------------------------- ! REAL :: trulat (2) ! Latitude of true map projection ! (deg N) REAL :: trulon ! Longitude of true map projection ! (deg E) REAL :: sclfct ! Map scale factor (m) COMMON /projectc/ trulat,trulon,sclfct ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! PRINT *,'ibgn,iend,jbgn,jend in rmsdiff' PRINT *,ibgn,iend,jbgn,jend DO j=jbgn,jend DO i=ibgn,iend diff(i,j)=SQRT((f1(i,j)-f2(i,j))*(f1(i,j)-f2(i,j))) END DO END DO cint=-4. CALL plot((iend-ibgn)+1,(jend-jbgn)+1,ntx,8,trulat,trulon,cint, & tema,temb,temc,temd,glab,diff(ibgn,jbgn)) RETURN END SUBROUTINE rmsdif !################################################################## !################################################################## !###### ###### !###### SUBROUTINE RESPONSE ###### !###### ###### !###### Developed by ###### !###### Center for Analysis and Prediction of Storms ###### !###### University of Oklahoma ###### !###### ###### !################################################################## !################################################################## ! SUBROUTINE response(tema,temb,temc,temak,pi) 1 ! !----------------------------------------------------------------------- ! ! PURPOSE: ! ! Calculate the final response function/curve for the Barnes analysis ! Details of this method of calculating the response function ! can be found in Koch et.al. JCAM Sept. 1983. ! !----------------------------------------------------------------------- ! ! AUTHOR: Dan Weber ! 12/6/93 ! !----------------------------------------------------------------------- ! ! INPUT : ! ! ! tema Wdn*max grid spacing(dx or dy)*sclfct ! temb max grid spacing*sclfct ! temc max grid spacing ! temak Working value of knot (set in setgrid) ! pi The value pi ! ! ! COMMON BLOCK VARIABLES: ! ! knot Barnes response shape factor ! gamma Multipass shape adjustment ! ipass Total passes for the Barnes scheme ! ! ! OUTPUT: ! ! d1star response function for the barnes analysis ! ! !----------------------------------------------------------------------- ! ! Variable Declarations. ! !----------------------------------------------------------------------- IMPLICIT NONE ! !----------------------------------------------------------------------- ! ! INPUT: ! !----------------------------------------------------------------------- ! REAL :: tema ! Wdn*max spacing*sclfct REAL :: temb ! Max spacing*sclfct REAL :: temc ! max data or grid spacing REAL :: temak ! Working value of knot (set in setgrid) REAL :: pi ! The value pi INTEGER :: inum ! Number of points used to define the response ! curve. PARAMETER (inum=35) REAL :: dnot(inum) ! response function for the first pass of ! the barnes analysis REAL :: xplot(inum) ! x axis for response curve plot ! !----------------------------------------------------------------------- ! ! COMMON BLOCK VARIABLES: ! !----------------------------------------------------------------------- ! REAL :: knot ! Barnes response shape factor REAL :: gamma ! Multipass shape adjustment INTEGER :: ipass ! Total passes for the Barnes scheme ! !----------------------------------------------------------------------- ! ! OUTPUT: ! !----------------------------------------------------------------------- ! REAL :: dnstar(inum) ! response function for the barnes analysis ! !----------------------------------------------------------------------- ! ! TEMPROARY ARRAYS: ! !----------------------------------------------------------------------- ! REAL :: tem1(inum) ! !----------------------------------------------------------------------- ! ! Misc. local variables: ! !----------------------------------------------------------------------- ! INTEGER :: i,n REAL :: alamnot,akstar,alam,alamstr,tem CHARACTER (LEN=75) :: glab ! !----------------------------------------------------------------------- ! ! COMMON BLOCK DEFINITION: ! !----------------------------------------------------------------------- COMMON /barnesc/ knot,gamma,ipass !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ! ! Beginning of executable code... ! !@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ alamnot=tema akstar=temak/(alamnot*alamnot) PRINT *,'tema,temak in response subroutine' PRINT *,tema,temak ! !----------------------------------------------------------------------- ! ! Calculate the initial response.... ! !----------------------------------------------------------------------- ! DO n=1,inum alam=REAL(n)*temb alamstr=alam/alamnot tem= -akstar*(pi/alamstr)*(pi/alamstr) dnot(n)=EXP(tem) xplot(n)=n END DO IF(ipass == 1)THEN ! set dnot = dnstar and plot DO n=1,inum dnstar(n)=dnot(n) END DO ELSE IF(ipass == 2)THEN ! calculate D1* = dnstar DO n=1,inum tem=dnot(n)**gamma dnstar(n)=dnot(n)+tem-tem*dnot(n) END DO ELSE ! calculate Dn* = dnstar DO n=1,inum dnstar(n)=0.0 tem1(n)=1.0 END DO DO i=2,ipass-1 tem=gamma*(i-1) DO n=1,inum tem1(n)=(1.0-dnot(n)**tem)*tem1(n) END DO tem=i*gamma DO n=1,inum dnstar(n)=(dnot(n)**tem)*tem1(n)+dnstar(n) END DO END DO DO n=1,inum dnstar(n)=dnot(n)+(1.0-dnot(n))*((dnot(n)**gamma)+dnstar(n)) END DO END IF !----------------------------------------------------------------------- ! ! Print the response for the first and last passes. ! !----------------------------------------------------------------------- PRINT *,'wavelength (dx) first pass(dnot) last pass(dnotstar)' DO n=1,inum PRINT *,n,dnot(n),dnstar(n) END DO !----------------------------------------------------------------------- ! ! Set up the labels for the plot axis ! !----------------------------------------------------------------------- CALL agsetc('LABEL/NAME.','T') CALL agseti('LINE/NUMBER.',100) CALL agseti('LINE/MAXIMUM.',70) CALL agsetc('LABEL/NAME.','B') CALL agseti('LINE/NUMBER.',-100) CALL agsetc('LINE/TEXT.','Wavelength (x*max grid spacing)') CALL agsetc('LABEL/NAME.','L') CALL agseti('LINE/NUMBER.',100) CALL agsetc('LINE/TEXT.','Response (g/f)') WRITE(glab,70) ipass,gamma,temc 70 FORMAT('Barnes Response Function',' Pass # =',i2, & ' Gamma =',f5.2,' max. spacing=',f8.1) CALL ezxy(xplot,dnstar,inum,glab) RETURN END SUBROUTINE response