C**** ASCII.FOR Make ASCII file from binary datafile 1999/03/16 C**** C**** Compile: FCE90 ASCII.FOR C**** C**** ASCII reads selected records from a datafile and writes the C**** data as a text file in a ASCII format C**** CHARACTER*80 FILEIN, ARG, TITLE COMMON /DATACB/ REAL4(721*361) C**** NARGS = IARGC() IF(NARGS.lt.2) GO TO 800 C**** C**** Determine resolution C**** CALL GETARG (1,FILEIN) OPEN (1,FILE=FILEIN,ACCESS='DIRECT',RECL=4,STATUS='OLD',ERR=801) READ (1,REC=1) IJT CLOSE (1) IJRES = (IJT-80)/4 C**** C**** Open input datafile and output textfile C**** OPEN (1,FILE=FILEIN,FORM='UNFORMATTED',STATUS='OLD',ERR=801) IRofF1 = 1 ! Input file positioned to read record number 1 OPEN (2,FILE='ASCII.TXT') IRofF2 = 1 ! Output file positioned to write record number 1 C**** C**** Loop over command line arguments containg record numbers C**** DO 310 IARG=2,NARGS CALL GETARG (IARG,ARG) MINUS = INDEX (ARG,'-') IF(MINUS.eq.0) GO TO 110 C**** Argument contains a range of record numbers IR1 = 0 IRM = 0 READ (ARG(1:MINUS-1) ,*) IR1 READ (ARG(MINUS+1:80),*) IRM IF(IR1.le.0 .or. IR1.gt.IRM) GO TO 810 GO TO 200 C**** Argument contains a single record number 110 IR1 = 0 READ (ARG,*) IR1 IF(IR1.le.0) GO TO 810 IRM = IR1 C**** C**** Reposition input file so that record IR1 is next record to be read C**** 200 IF(IRofF1-IR1) 210,300,220 C**** IRofF1 < IR1: read records prior to record IR1 210 READ (1,ERR=821) IRofF1 = IRofF1 + 1 GO TO 200 C**** IRofF1 > IR1: rewind input file 220 REWIND (1) IRofF1 = 1 GO TO 200 C**** C**** Read and write desired records C**** 300 READ (1,ERR=821) TITLE,(REAL4(IJ),IJ=1,IJRES) CALL WRITEA (TITLE,REAL4,IJRES) WRITE (6,930) IRofF2,TITLE IRofF1 = IRofF1 + 1 IRofF2 = IRofF2 + 1 IR1 = IR1 + 1 IF(IR1.le.IRM) GO TO 300 310 continue CLOSE (1) CLOSE (2) GO TO 999 C**** 800 WRITE (0,*) ' Usage: ASCII datafile n1 [n2-n3 ...] 1999/03/16' WRITE (0,*) ' Make ASCII textfile from records of binary datafile' WRITE (0,*) ' Output file is ASCII.TXT in current directory' GO TO 999 801 WRITE (0,*) ' Error opening: ',FILEIN STOP 901 810 WRITE (0,*) ' Unable to decipher record numbers in command line', * ' argument',IARG,' ',ARG STOP 810 821 WRITE (0,*) ' Error reading input file. IR=',IRofF STOP 821 C**** 930 FORMAT (I6,': ',A72) 999 END SUBROUTINE WRITEA (TITLE,REAL4,IMxJM) C**** C**** WRITEA writes an ASCII text record on unit 2 containing the TITLE C**** and the array REAL4. C**** REAL*4 REAL4(IMxJM) CHARACTER TITLE*80, LINE(8)*9 C**** C**** Determine magnitude of numbers C**** KPOWER = 7 RMAG = 0. DO 10 I=1,IMxJM IF(REAL4(I).gt.-999999. .and. ABS(REAL4(I)).gt.RMAG) * RMAG = ABS(REAL4(I)) 10 continue IF(RMAG.le.0.) GO TO 90 KPOWER = LOG10(RMAG) + 2 IF(KPOWER.lt.1) KPOWER = 1 IF(KPOWER.gt.7) KPOWER = 7 C**** C**** Write data out in ASCII format C**** 90 WRITE (2,909) TITLE DO 220 I8=1,IMxJM,8 GO TO (160,150,140,130,120,110,100),KPOWER C**** 100000 < RMAG: output numbers have no decimal places 100 WRITE (LINE,910) (NINT(REAL4(I)),I=I8,I8+7) GO TO 200 C**** 10000 < RMAG < 100000: output numbers have 1 decimal place 110 WRITE (LINE,911) (REAL4(I),I=I8,I8+7) GO TO 200 C**** 1000 < RMAG < 10000: output numbers have 2 decimal places 120 WRITE (LINE,912) (REAL4(I),I=I8,I8+7) GO TO 200 C**** 100 < RMAG < 1000: output numbers have 3 decimal places 130 WRITE (LINE,913) (REAL4(I),I=I8,I8+7) GO TO 200 C**** 10 < RMAG < 100: output numbers have 4 decimal places 140 WRITE (LINE,914) (REAL4(I),I=I8,I8+7) GO TO 200 C**** 1 < RMAG < 10: output numbers have 5 decimal places 150 WRITE (LINE,915) (REAL4(I),I=I8,I8+7) GO TO 200 C**** RMAG < 1: output numbers have 6 decimal places 160 WRITE (LINE,916) (REAL4(I),I=I8,I8+7) GO TO 200 C**** Insert -999999 into output file for missing or bad data 200 DO 210 I=I8,I8+7 210 IF(REAL4(I).le.-999990.) LINE(I-I8+1) = ' -999999' 220 WRITE (2,922) LINE RETURN C**** 909 FORMAT (A80) 910 FORMAT (I9) 911 FORMAT (F9.1) 912 FORMAT (F9.2) 913 FORMAT (F9.3) 914 FORMAT (F9.4) 915 FORMAT (F9.5) 916 FORMAT (F9.6) 922 FORMAT (8A9) END