program makework c - For VERTCON 3 c - 2018 03 21: Updated specific to CONUS to add two more columns to the right in c - the work file: c 1) Interpolated VERTCON 2.1 grid value of H88-H29 c 2) Residual between our computed (H88-H29) and the above listed VERTCON 2.1 value c - 2018 02 20: This program is a cannibalized version of "makework.f" as c - used in the creation of NADCON 5. c - The intent is the same: Take some ".in" file, run it through certain c - filters, and create our initial working file or "work" file. c - First major difference: Aside from a "workedits" file, which will c - throw out manually detected outliers, this program will ALSO c - allow the user to filter input data by TYPE. This is because c - the ".in" file will have 4 element which describe the height c - on the old vertical datum and the same 4 elements which describe the height c - on the new vertical datum. These four elements are: c - 1) Order c - 2) Class c - 3) Elevation Source c - 4) Elevation Technique c - This is different from NADCON 5 where ALL data, without regard for c - order or technique or general quality went into the ".in" file c - and then into the "work" files. It may come to pass that c - this allowance of filters won't be necessary for VERTCON 3 c - but considering the variety of ways that a height could get into c - the database, it seemed best to build this in right off the bat. c ------------------------------- START: Comments from NADCON 5 ---------------- c - 2016 09 14: Due to some complications in "mymedian5" which happen if c - data is in the "work" file that is not to be sorted and used, I've decided c - to put the "out of grid" point removal code here, so that such points c - will go into the "work" file but will all get a "111" set of reject codes c - so they don't go forward in the processing. c - 2016 09 13: Fixed a bug that sends an incoming "0" reject flag as a zero. All c - later programs expect a BLANK for a "good" reject code. The incoming "0" is c - from the "workedits" file and is fine to come in, but must go OUT as a BLANK. c - Also, put in code to correct situations where an entry is in workedits, but c - the PID for that entry isn't actually in the incoming data. This relies c - on a new vector "EditTracker" c - 2016 02 26 c - Change (see DRU-12, p. 18) to reflect the decision that "manual edits" should ONLY c - edit data OUT and *not* add data back in. c - 2016 01 07 c - Changed to split "Relevant Edits" into c - three counts: lat, lon and eht c - Program presumes, as input, the "control file name" c - in directory "Control" c - Known control file names are: c cfname = 'control.ussd.nad27.conus' c cfname = 'control.nad27.nad83_1986.conus' c - Further presumes, as input, the existence of a c - "manual edits" file, called "workedits" in c - directory "Work" c - 2015 08 25 , Dru Smith c - Program to create a "work" file which will c - serve as the primary information needed to c - analyze and create NADCON v5.0 grids. c - This program is based on previous programs that c - were created by Dru Smith during the GEOCON v2.0 c - process. It has been modified specifically to be a tool c - for NADCON v5.0. c - c - Rather than have multiple programs (1, 2, 3, 4 as c - was the case for GEOCON v2.0), I have decided c - make ONE working "makework.f" program (this one) c - and have it feed off of an input file which c - can be modified. c - The input file will reflect all that is necessary c - to create a work file. c - c - By way of example... c - If the input file controlling the creation of the work file is: c - Control/control.ussd.nad27.conus c - then the output data file is: c - Work/work.ussd.nad27.conus c - The work file has the following format: c Cols Format Description c 1- 6 a6 PID c 7 1x - blank - c 8- 9 a2 State c 10 a1 Reject code for missing latitude pair (blank for good) c 11 a1 Reject code for missing longitude pair (blank for good) c 12 a1 Reject code for missing ellip ht pair (blank for good) c 13 1x - blank - c 14- 27 f14.10 Latitude (Old Datum), decimal degrees (-90 to +90) c 28 1x - blank - c 29- 42 f14.10 Lonitude (Old Datum), decimal degrees (0 to 360) c 43 1x - blank - c 44- 51 f8.3 Ellipsoid Height (Old datum), meters c 52 1x - blank - c 53- 61 f9.5 Delta Lat (New Datum minus Old Datum), arcseconds c 62 1x - blank - c 63- 71 f9.5 Delta Lon (New Datum minus Old Datum), arcseconds c 72 1x - blank - c 73- 81 f9.3 Delta Ell Ht (New Datum minus Old Datum), meters c 82 1x - blank - c 83- 91 f9.3 Delta Horizontal (absolute value), arcseconds c 92 1x - blank - c 93-101 f9.5 Azimuth of Delta Horizontal (0-360), degrees c 102 1x - blank - c 103-111 f9.3 Delta Lat (New Datum minus Old Datum), meters c 112 1x - blank - c 113-121 f9.3 Delta Lon (New Datum minus Old Datum), meters c 122 1x - blank - c 123-131 f9.3 Delta Horizontal (absolute value), meters c 132 1x - blank - c 133-142 a10 Old Datum Name c 143 1x - blank - c 144-153 a10 New Datum Name c format(a6,1x,a2,a1,a1,a1,1x,f14.10,1x,f14.10,1x,f8.3,1x, c *f9.5,1x,f9.5,1x,f9.3,1x,f9.3,1x,f9.5,1x,f9.3,1x,f9.3,1x,f9.3, c 1x,a10,1x,a10) c - This differs from Dennis's GEOCON v1.0 in that: c - 3 reject codes c - 10 decimal places in latitude (See DRU-10, p. 123) c - 10 decimal places in longitude (See DRU-10, p. 123) c - Lat, Lon and Horizontal in both arcseconds and meters each c - Azimuth of Horizontal c - Identification of which datums are transformed c - NADCON5: c - See DRU-11, p. 124 c - GEOCON v2.0: c - See DRU-10, p. 143 c - See DRU-11, p. 10 c - See DRU-11, p. 26 c - See DRU-11, p. 56 c ------------------------------- STOP: Comments from NADCON 5 ---------------- implicit double precision(a-h,o-z) parameter(maxedits = 10000) character*58 fname0 character*200 cfname character*200 wfname character*200 efname character*80 card character*200 filtercard c - Information extracted from control file character*6 cline character*80 cheader character*30 cregion character*30 cdatum1 character*30 cdatum2 c - Variables for working with manual edit file character*10 dummy1,dummy2,dummy3 character*10 EditRegion(maxedits) character*10 EditOldDtm(maxedits) character*10 EditNewDtm(maxedits) character*6 EditPID(maxedits) character*1 EditRejOht(maxedits) c - Height Type Flags character*1 h1f1,h1f2,h1f3,h1f4 character*1 h2f1,h2f2,h2f3,h2f4 c - Each *.in file (including directory): character*100 fname c - "h" and "f" are artifacts. "h" for HARN meaning c - "old datum". "f" for FBN meaning "new datum". c - Too much trouble to go back and fix variable names. c - Just know that "f" means NEW and "h" means OLD, c - no matter what the datums themselves ARE. character*15 nameh character*15 namef character*6 pid character*2 state character*3 county character*10 olddtm,newdtm,region character*3 afilter integer*4 filter character*1 rejoht character*200 suffix1,suffix2 logical badoht c - 2016 09 13 - To track the use of each so-called "relevant" edit, c - in case some of them aren't actually relevant (e.g. the PID c - doesn't match what's coming in) logical EditTracker(maxedits) c - 2018 03 21: CONUS-specific, the existing VERTCON 2.0 grid logical v2special character*200 v2fname real*8 v2glamn,v2glomn,v2dla,v2dlo,v2glamx,v2glomx integer*4 v2nla,v2nlo,v2ikind c - See DRU-12, p. 128-129 for this change: c real*4 v2dh(521,1161) real*4 v2dh(521,1181) c ------------------------------------------------------------------ c - BEGIN PROGRAM c ------------------------------------------------------------------ write(6,1001) 1001 format('BEGIN program makework.f') c ------------------------------------------------------------------ c - User-supplied input c ------------------------------------------------------------------ read(5,'(a)')olddtm read(5,'(a)')newdtm read(5,'(a)')region read(5,*)filter write(afilter,'(i3.3)')filter c write(6,*) ' filter = ',filter c write(6,'(a3)') afilter c ------------------------------------------------------------------ c - Special code for NGVD29/NAVD88/CONUS to allow R/C/R approach c ------------------------------------------------------------------ v2special=.false. if(trim(region).eq.'conus' .and. * trim(olddtm).eq.'ngvd29' .and. * trim(newdtm).eq.'navd88')v2special = .true. c ------------------------------------------------------------------ c - Get the official grid bounds for this region, c - so that we can auto-reject any points c - that come in and are not inside the official grid bounds. c ------------------------------------------------------------------ write(6,1007) 1007 format(6x,'makework.f: Getting grid boundaries') call getgridbounds(region,xn,xs,xw,xe) noutside = 0 c ------------------------------------------------------------------ c - Generate the suffixes used in all our files c ------------------------------------------------------------------ suffix1=trim(olddtm)//'.'//trim(newdtm)//'.'//trim(region) suffix2=trim(suffix1)//'.'//trim(afilter) c ------------------------------------------------------------------ c - Open the control file c ------------------------------------------------------------------ cfname='Control/control.'//trim(suffix1) open(1,file=cfname,status='old',form='formatted') write(6,1004)trim(cfname) 1004 format(6x,'makework.f: Accessing control file ',a) c ------------------------------------------------------------------ c - Open the "manual edits" file c ------------------------------------------------------------------ efname='Work/workedits' open(20,file=efname,status='old',form='formatted') write(6,1006)trim(efname) 1006 format(6x,'makework.f: Accessing workedits file ',a) c ------------------------------------------------------------------ c - Create and open the work file c ------------------------------------------------------------------ c - The location of the "work*" file wfname = 'Work/work.'//trim(suffix2) open(2,file=wfname,status='new',form='formatted') write(6,1002)trim(wfname) 1002 format(6x,'makework.f: Creating work file ',a) c ------------------------------------------------------------------ c - 2018 03 21: CONUS-specific, read in old VERTCON 2.0 grid c ------------------------------------------------------------------ c - The location of the "work*" file if(v2special)then c - See DRU-12, p. 128-129 for this change: c v2fname='../VERTCON2/vertcon2.0.b' c v2fname='../VERTCON2/vertcon2.0.v3bounds.b' c - Changed to a directory BELOW the /home/dru/VERTCON3 level c - as per conversation with ALB on 12/20/2018, to assist c - in simplifying the creation of the digital archive v2fname='VERTCON2/vertcon2.0.v3bounds.b' open(70,file=v2fname,status='old',form='unformatted') write(6,1020)trim(v2fname) 1020 format(6x,'makework.f: Because region=conus, opening', * ' and reading VERTCON 2.0 grid file ',a) read(70)v2glamn,v2glomn,v2dla,v2dlo,v2nla,v2nlo,v2ikind v2glamx=v2glamn + (v2nla-1)*v2dla v2glomx=v2glomn + (v2nlo-1)*v2dlo do 1021 irow=1,v2nla read(70)(v2dh(irow,jcol),jcol=1,v2nlo) 1021 continue endif c ------------------------------------------------------------------ c - Some necessary constants. c ------------------------------------------------------------------ c pi = 2.d0*dasin(1.d0) c d2r = pi/180.d0 c re = 6371000.d0 c ------------------------------------------------------------------ c - Initialize statistical mins and maxes c ------------------------------------------------------------------ xlatmin = 90.0000 xlatmax = -90.0000 xlonmin = 360.0000 xlonmax = 0.0000 c ------------------------------------------------------------------ c - 2016 09 13 c - Initialize counts for final report c ------------------------------------------------------------------ npts = 0 nptsOht = 0 c ------------------------------------------------------------------ c - Read the control file in and prepare things. c - For now, presume it is in the exact order below, rather than searching. c ------------------------------------------------------------------ c - Header line. Can contain anything. cline='HEADER' read(1,'(a)')card if(card(1:6).ne.cline)then write(6,6000)cline,trim(cfname) stop endif cheader = trim(card(8:200)) c - REGION. Must conform to the following list (expand as needed): c conus, alaska, pr, vi, hawaii, guam, cnmi, as cline='REGION' read(1,'(a)')card if(card(1:6).ne.cline)then write(6,6000)cline,trim(cfname) stop endif cregion = trim(card(8:200)) c - DATUM1. The older datum, chronologically. cline='DATUM1' read(1,'(a)')card if(card(1:6).ne.cline)then write(6,6000)cline,trim(cfname) stop endif cdatum1 = trim(card(8:200)) c - DATUM2. The newer datum, chronologically. cline='DATUM2' read(1,'(a)')card if(card(1:6).ne.cline)then write(6,6000)cline,trim(cfname) stop endif cdatum2 = trim(card(8:200)) c - REJMET. The rejection criteria in meters. c - Basically if any orthometric height difference c - that exceeds this value will be auto-rejected. cline='REJMET' read(1,'(a)')card if(card(1:6).ne.cline)then write(6,6000)cline,trim(cfname) stop endif read(trim(card(8:200)),*)rejmet c - NFILES. The number of *.in files which connect c - the old and new datums in the region being c - addressed. cline='NFILES' read(1,'(a)')card if(card(1:6).ne.cline)then write(6,6000)cline,trim(cfname) stop endif read(card(9:10),*)nfiles 6000 format(6x,'makework.f: Expecting ',a6,' line in ', *a,' but not found. Stopping') c ------------------------------------------------------------------ c - Read the "manual edits" (workedits) file into RAM, so that it may c - be applied on the fly as we go through the "in" files and build c - the "work" file. Note that the "workedits" file contains every c - manual edit, for every point, for every combination of c - old datum/new datum/region that we might work in. This prevents c - the need for multiple files and allows easy access to every change c - requested. c - 2016 09 13: Update: Also set all "EditTracker" values to ".false." c - so that they can be turned on to ".true." as they actually c - get applied. Then we can look for remaining ".false." ones. c - c - NOTE FOR VERTCON 3: The workedits file is formatted different c - than for NADCON 5 so the code below was modified as such. c ------------------------------------------------------------------ c - Total number of edits found in this workedits file: neditsTotal = 0 c - Number of edits in the workedits file that are relevant to c - our particular olddatum/newdatum/region combination: neditsRelevant = 0 c - 2016 09 13 c - Of those that are initially relevant, how many did we finally use? neditsRelevantUsed = 0 701 read(20,702,end=703)card c - If I find a comment or blank, skip out. Otherwise c - pick up one edit's worth of data, and then loop back up if(card(1:1).eq.'#' .or. card(1:1).eq.' ')goto 701 neditsTotal = neditsTotal + 1 if(trim(card( 1: 10)) .eq. trim(olddtm) .and. * trim(card( 12: 21)) .eq. trim(newdtm) .and. * trim(card( 23: 32)) .eq. trim(region) )then neditsRelevant = neditsRelevant + 1 c - 2016 09 13: c - This turns to "true" if we end up applying this manual edit EditTracker(neditsRelevant) = .false. c - The basic info for each relevant edit: EditOldDtm(neditsRelevant) = card( 1: 10) EditNewDtm(neditsRelevant) = card( 12: 21) EditRegion(neditsRelevant) = card( 23: 32) EditPID(neditsRelevant) = card( 34: 39) c EditRejOht(neditsRelevant) = '1' endif goto 701 702 format(a) 703 write(6,704)neditsTotal,neditsRelevant 704 format(6x,'makework.f: Total Manual Edits Found : ',i6,/, * 9x,'Initial Relevant Manual Edits Found: ',i6) cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc c - Loop over all *.in files, compute stuff, populate work file. cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc do 1 i=1,nfiles read(1,'(a)')fname0 fname='InFiles/'//trim(fname0) write(6,999)trim(fname) 999 format(6x,'makework.f: Processing file: ',a) open(10,file=fname,status='old',form='formatted') c - VERTCON3 - No header c read(10,100)nameh,namef c write(6,100)nameh,namef c - Count how many points are killed by the filter subroutine ifilkt = 0 irejbig = 0 cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc c - Set dH to zero on any kind of reject, just to make sure we don't get asterisks in the output 2 read(10,101,end=98)pid,state,county,xlat,xlon, * h1f1,h1f2,h1f3,h1f4,oht1, * h2f1,h2f2,h2f3,h2f4,oht2 badoht = .false. rejoht = ' ' dohtm = oht2 - oht1 c---------------------------------------------------------------------- c - 2018 03 21: If region=conus, then interpolate the VERTCON 2.0 value c - and carry it along, as well as residuals... c - See DRU-12, p. 128-129 for the following logic: Now that the vertcon 2 grid c - is expanded to perfectly align with the "conus" region boundaries, any c - point that is not inside that grid is flagged as "bad" if(v2special)then if(xlat.gt.v2glamx .or. xlat.lt.v2glamn .or. * xlon.lt.v2glamn .or. xlon.gt.v2glomx)then val = 0.d0 badoht = .false. rejoht = '4' else c - See DRU-12, p. 128-129 for this change: call biquad(v2dh,v2glamn,v2glomn,v2dla,v2dlo, * v2nla,v2nlo,521,1181,xlat,xlon,val) c call biquad(v2dh,v2glamn,v2glomn,v2dla,v2dlo, c * v2nla,v2nlo,521,1161,xlat,xlon,val) endif c - VERTCON 2.0 grid is stored in millimeters. Convert to meters. v2dohtm = val / 1000.d0 endif c---------------------------------------------------------------------- call applyfilter(filter,h1f1,h1f2,h1f3,h1f4, * h2f1,h2f2,h2f3,h2f4,filtercard,rejoht,badoht) c - First rejection: Didn't pass through the filter if(rejoht.eq.'9')then badoht =.true. ifilkt = ifilkt + 1 dohtm = 0.d0 if(v2special)then residual = 0.d0 endif goto 907 endif c - Second rejection: Do an auto-rejection on ridiculously large shifts if(dabs(dohtm).gt.rejmet )then badoht =.true. rejoht ='5' irejbig = irejbig + 1 dohtm = 0.d0 if(v2special)then residual = 0.d0 endif write(6,807)rejmet,pid goto 907 endif 807 format(12x,'abs(dH) > ',f10.3,' => Rejecting PID: ',a6) c - Third rejection: Point outside official grid bounds if(xlat.lt.xs.or.xlat.gt.xn .or. * xlon.lt.xw.or.xlon.gt.xe) then noutside = noutside + 1 badoht = .true. rejoht = '4' dohtm = 0.d0 if(v2special)then residual = 0.d0 endif write(6,2003)pid,xlath,xlonh goto 907 endif 2003 format( * 6x,'program makework.f: InFile point found', * ' and flagged with 4 which is outside ', * ' the grid boundaries:',a6,1x,f14.10,1x,f14.10) c - Final Check: Manual Edits c - Cycle through all of the Initially Relevant manual edits, looking c - for this PID, and apply the manual rejections. do 720 irel = 1,neditsRelevant if(trim(EditPID(irel)).ne.pid)goto 720 EditTracker(irel) = .true. rejoht = '1' dohtm = 0.d0 if(v2special)then residual = 0.d0 endif goto 907 720 continue c - If I get here, the height diff is good and we can track statistics c - and output it dohtm = oht2 - oht1 if(v2special)then residual = dohtm - v2dohtm endif c - Now, using only GOOD points, let's find the min/max of everything if(.not.badoht)then if(xlat.lt.xlatmin)xlatmin=xlat if(xlat.gt.xlatmax)xlatmax=xlat if(xlon.lt.xlonmin)xlonmin=xlon if(xlon.gt.xlonmax)xlonmax=xlon endif 907 continue if(.not.v2special)then write(2,104)pid,state,rejoht,xlat,xlon,oht1, * dohtm,olddtm,newdtm,h1f1,h1f2,h1f3,h1f4,h2f1,h2f2,h2f3,h2f4 else write(2,2104)pid,state,rejoht,xlat,xlon,oht1, * dohtm,olddtm,newdtm,h1f1,h1f2,h1f3,h1f4,h2f1,h2f2,h2f3,h2f4, * v2dohtm,residual endif c - 2016 09 13 npts = npts + 1 if(rejoht.eq.' ')nptsOht = nptsOht + 1 104 format(a6,1x,a2,a1,1x,f14.10,1x,f14.10,1x,f9.4,1x, * f9.4,1x,a10,1x,a10,1x,8(a1,1x)) 2104 format(a6,1x,a2,a1,1x,f14.10,1x,f14.10,1x,f9.4,1x, * f9.4,1x,a10,1x,a10,1x,8(a1,1x),1x,f9.4,1x,f9.4) c - The new file has the following format: c Cols Format Description c 1- 6 a6 PID c 7 1x - blank - c 8- 9 a2 State c 10 a1 Reject code for bad oht pair (blank for good) c 11 1x - blank - c 12- 25 f14.10 Latitude, decimal degrees (-90 to +90) c 26 1x - blank - c 27- 40 f14.10 Lonitude, decimal degrees (0 to 360) c 41 1x - blank - c 42- 50 f9.4 Orthometric Height (datum1), meters c 51 1x - blank - c 52- 60 f9.4 Delta Orthometric Ht (New Datum minus Old Datum), meters c 61 1x - blank - c 62- 71 a10 Old Datum c 72 1x - blank - c 73- 82 a10 New Datum c 83 1x - blank - c 84 a1 Flag #1 for height type of Old Height c 85 1x - blank - c 86 a1 Flag #2 for height type of Old Height c 87 1x - blank - c 88 a1 Flag #3 for height type of Old Height c 89 1x - blank - c 90 a1 Flag #4 for height type of Old Height c 91 1x - blank - c 92 a1 Flag #1 for height type of New Height c 93 1x - blank - c 94 a1 Flag #2 for height type of New Height c 95 1x - blank - c 96 a1 Flag #3 for height type of New Height c 97 1x - blank - c 98 a1 Flag #4 for height type of New Height goto 2 98 continue c write(6,103)trim(fname) close(10) 1 continue c - Updated 2016 09 13: c - I notice that sometimes there is a typo in the workedits file c - and an initially "relevant" edit isn't really relevant, because, while c - it matches olddatum/newdatum/region, the actual PID isn't c - even in the InFiles for this olddatum/newdatum/region. c - c - So in the above code, I've been tracking who got used c - in "EditTracker". Let's spin over all so-called "Relevant Edits" c - and see who did NOT get used. c - c - In addition, for VERTCON 3, I cleaned up the code, so that c - points flagged as bad for "didn't pass through filter", c - "too large of dH" or "outside grid" are all removed first, c - and therefore not "relevant" either, having already been c - pre-removed. c write(6,*)EditTracker iNotRel = 0 iNotReloht = 0 do 740 irel = 1,neditsRelevant if(EditTracker(irel))goto 740 iNotRel = iNotRel + 1 c write(6,731)EditPID(irel) c 731 format( c * 6x,'program makework.f: So-called Relevant Edit not used', c * ' since PID is not in the incoming data:',a6) 740 continue neditsRelevantUsed = neditsRelevant - iNotRel write(6,762)filtercard,ifilkt 762 format(6x,'makework.f: ',/, * 6x,' Filter Applied: ',a80,/, * 6x,' Total Points Removed by Filter : ',i6) write(6,763)irejbig 763 format(6x,'makework.f: ',/, * 6x,' Total Points Removed as Too Large : ',i6) write(6,764)noutside 764 format(6x,'makework.f: ',/, * 6x,' Total Points Removed as Outside Grid: ',i6) write(6,732)neditsRelevantUsed 732 format(6x,'makework.f: ',/, * 6x,' Final Relevant Manual Edits Found : ',i6) write(6,1005)xlatmin,xlatmax,xlonmin,xlonmax 1005 format( *6x,'program makework.f: Minimum latitude : ',f14.10,/, *6x,'program makework.f: Maximum latitude : ',f14.10,/, *6x,'program makework.f: Minimum longitude: ',f14.10,/, *6x,'program makework.f: Maximum longitude: ',f14.10) c - 2016 09 13 write(6,1010)npts,nptsOht 1010 format( *6x,'program makework.f: Total records in work file: ',i9,/, *6x,'program makework.f: With a usable OHT diff : ',i9) 99 write(6,1003) 1003 format('END program makework.f') 100 format(27x,a15,26x,a15) c 101 format(a6,1x,a2,5x,a13,1x,a14,1x,a9,3x,a13,1x,a14,1x,a9) 101 format(a6,1x,a2,1x,a3,1x,f14.10,1x,f14.10,1x, *a1,1x,a1,1x,a1,1x,a1,1x,f9.4,1x, *a1,1x,a1,1x,a1,1x,a1,1x,f9.4) 102 format(f15.9,1x,f14.9,1x,f5.1) 103 format(6x,'makework.f: Done with file : ',a) end include 'Subs/getgridbounds.f' include 'Subs/applyfilter.f' include '/home/dru/Subs/biquad.f'