PROGRAM SUM C*This program will read in data from two or more data files C*and output the sum of the columns from each file. C C*J.E. Penner-Hahn 6/11/89 C LOGICAL*1 FILE_IN(60),FILE_OUT(60),TEMP_FILE(60) LOGICAL*1 STRING(123) REAL DATA(1000,12),DATA_TEMP(1000,12) INTEGER N_SC_COPY(16),N_SC_AVG(16),N_TEMP(16) DATA MAXCHN,N_POINT_MAX,LUNTTO,LUNTTI/0,0,5,6/ C------------------------------------- C*Get file names and open files C 1 WRITE (LUNTTO,800) 800 FORMAT (//'$Enter name of the first file to sum: ') READ (LUNTTI,801) FILE_IN 801 FORMAT (60A1) IF (FILE_IN(1).EQ.' ') CALL EXIT 12 CONTINUE N_LST_CHAR=0 DO 10 I=60,1,-1 IF (FILE_IN(I).NE.' '.AND.N_LST_CHAR.EQ.0) N_LST_CHAR=I IF (FILE_IN(I).EQ.' ') FILE_IN(I)=0 10 CONTINUE OPEN (UNIT=1,NAME=FILE_IN,ERR=15,STATUS='OLD', 1 FORM='FORMATTED') GO TO 19 15 WRITE (LUNTTO,890) FILE_IN 890 FORMAT (' ***** Unable to open ',60A1) GO TO 1 19 CONTINUE DO 20 I=1,60 FILE_OUT(I)=FILE_IN(I) IF (I.GT.N_LST_CHAR) FILE_OUT(I)=0 20 CONTINUE FILE_OUT(N_LST_CHAR+1)='S' 32 WRITE (LUNTTO,802) FILE_OUT 802 FORMAT (' Enter output filename ['60A1']'/'$ :') READ (LUNTTI,801) TEMP_FILE IF (TEMP_FILE(1).NE.' ') THEN DO 30 I=60,1,-1 IF (TEMP_FILE(I).EQ.' ') TEMP_FILE(I)=0 FILE_OUT(I)=TEMP_FILE(I) 30 CONTINUE ENDIF OPEN (UNIT=2,NAME=FILE_OUT,STATUS='NEW',ERR=35, 1 FORM='FORMATTED',RECL=123) GO TO 400 35 WRITE (LUNTTO,890) FILE_OUT GO TO 32 C------------------------------ C*Get rid of header. Penultimate header line has # as 2nd character. 400 READ (1,840,END=900) STRING 840 FORMAT (123A1) C-N_MAX_POINT is zero for the first file processed. IF (N_POINT_MAX.EQ.0) WRITE (2,840) STRING IF (STRING(2).EQ.'#') THEN READ (1,840) STRING IF (N_POINT_MAX.EQ.0) WRITE (2,840) STRING GO TO 500 ELSE GO TO 400 ENDIF C---------------------------- C*Begin processing file 500 CONTINUE N_POINT=1 505 READ (1,850,END=600) (DATA_TEMP(N_POINT,J),J=1,12) 850 FORMAT (F11.1,F12.0,10F10.0) N_POINT=N_POINT+1 IF (N_POINT.GT.1000) THEN WRITE (LUNTTO,851) 851 FORMAT (///' Processing truncated at 1000 points///') ENDIF C-If we haven't yet determined the number of channels used, do so. C-For this purpose, any "channel" whose value is 0.0 for point 1 is C-considered to be unused. IF (MAXCHN.EQ.0) THEN DO 510 J=12,3,-1 IF (DATA_TEMP(1,J).NE.0.) MAXCHN=J IF (DATA_TEMP(1,J).NE.0.) GO TO 515 510 CONTINUE C-All data in line one is zero WRITE (LUNTTO,9003) FILE_IN 9003 FORMAT (1X,60A1,' does not appear to be a data file') GO TO 1 ENDIF 515 CONTINUE GO TO 505 C-Add these data to the DATA matrix 600 CONTINUE IF (N_POINT_MAX.EQ.0) THEN C-If this is the first file . . . N_POINT_MAX=N_POINT-1 ELSE C-If this is not the first file, confirm that all points are there IF (N_POINT-1.LT.N_POINT_MAX) THEN WRITE (LUNTTO,860) FILE_IN,N_POINT-1,N_POINT_MAX 860 FORMAT (1X,60A1,' contains ',I4,' data point.'/ 1 ' Previous file(s) had ',I4,'. Should file be included' 2 ' in average'/'$anyway? ') READ (LUNTTI,840) STRING IF (STRING(1).EQ.'Y'.OR.STRING(1).EQ.'y') THEN GO TO 610 ELSE GO TO 700 ENDIF ENDIF ENDIF C-Add data to sum 610 CONTINUE DO 630 I=1,N_POINT_MAX DO 620 J=3,MAXCHN DATA(I,J)=DATA_TEMP(I,J)+DATA(I,J) 620 CONTINUE 630 CONTINUE C-Get a new file to average (if appropriate) 700 CONTINUE WRITE (LUNTTO,870) 870 FORMAT ('$Enter name of the next file to be averaged: ') READ (LUNTTI,801) FILE_IN IF (FILE_IN(1).EQ.' ') GO TO 750 CLOSE (UNIT=1) DO 710 I=60,1,-1 IF (FILE_IN(I).EQ.' ') FILE_IN(I)=0 710 CONTINUE OPEN (UNIT=1,NAME=FILE_IN,ERR=715,STATUS='OLD', 1 FORM='FORMATTED') GO TO 400 715 WRITE (LUNTTO,890) FILE_IN GO TO 700 C-Finished reading files - output data, close unit 2, and C-re-initialize variables for a new sum. 750 CONTINUE WRITE (LUNTTO,852) N_POINT_MAX,MAXCHN 852 FORMAT (//' Writing output file. ',I4,' data points,' 1 I3,' channels.') DO 765 I=1,N_POINT_MAX WRITE (2,850) (DATA_TEMP(I,J),J=1,2), 1 (DATA(I,K),K=3,MAXCHN) 765 CONTINUE CLOSE (UNIT=2) MAXCHN=0 N_POINT_MAX=0 GO TO 1 C---------------------- C*Program exits C*Unexpected end during header 900 WRITE (LUNTTO,9000) 9000 FORMAT (//'****Unexpected end of file during header'///) IF (N_POINT_MAX.EQ.0) GO TO 1 IF (N_POINT_MAX.GT.0) GO TO 700 END