SUBROUTINE OPINPUT ( MOREDATA, STRTYR, STRTMON, STRTDAY, $ STARNUM, STRTSEC, STOPSEC, INTTIM, MINAVG, ALL ) C C by David Mozurkewich MAY 1, 1987 C moved to PC APR 2, 1988 C Removed baseline jan 21, 1989 C Comment out opening log file July 5, 1990 C C This subroutine is part of the Mt. Wilson optical interferometer C data reduction package. C C OPINPUT reads in user supplied parameters, via KEYIN, and checks C for illegal values. C IMPLICIT NONE SAVE INCLUDE 'fritz.inc' C INTEGER MODE, NPARS PARAMETER (MODE = 2 ) PARAMETER ( NPARS = 8 + 10 + 3*20 + 1) LOGICAL MOREDATA, INPUTERR, OPENERR C INTEGER*4 INMODE, I, J REAL*8 INPARS(NPARS), INVALS(NPARS), ENDMRK CHARACTER *1 BACKSLSH CHARACTER *8 LABELS(NPARS), CVALS(0:8) EQUIVALENCE (INPARS(1),LABELS(1)) CHARACTER*64 HELP COMMON /KEYCOM/ HELP C INTEGER*4 STARNUM, STRTYR, STRTMON, STRTDAY, STRTSEC, $ STOPSEC, MINAVG INTEGER *4 FIRST, LAST, NROOT REAL *8 INTTIM LOGICAL ALL, NEW DATA NEW / .TRUE. / DATA BACKSLSH / '\\' / C DATA LABELS / 'INFILE', 7*' ', $ 'STARNUM', 'MONTH', 'DAY', 'YEAR', 'START', 'STOP', $ 'INTTIM', 'MINAVG', 'ALL', 'OFFSET', 20*'NLIMIT3', $ 20*'NLIMIT4', 20*'LIMITS', 'MAKEHIS' / DATA CVALS / '/', 8*' ' / DATA INVALS / 8*0.D0, $ 0.D0, 0.D0, 0.D0, 0.D0, 10000.D0, 86400.D0, $ 0.5D0, 100.D0, 1.D0, 0.D0, 20*0.D0, 20*0.D0, 20*0.D0, 0 / C---------------------------------------------------------------------- C On the first pass, SET UP PARAMETER ARRAYS IF (NEW) THEN DO 30 I = 1, NPARS C READ ( LABELS(I), 1100 ) INPARS(I) 30 CONTINUE READ (CVALS(0), 1100 ) ENDMRK NEW = .FALSE. ELSE C C A new file name nust be entered on each call to this subroutine. C DO 35 I = 1, 8 CVALS(I) = ' ' 35 CONTINUE END IF DO 40 I = 1, 8 READ (CVALS(I), 1100 ) INVALS(I) 40 CONTINUE 1100 FORMAT ( A8 ) C C OFFSET is always reset to zero. C INVALS(8+10) = 0 C---------------------------------------------------------------------- C Read parameters using KEYIN WRITE (TERME, 1001) 1 CONTINUE INMODE = MODE CALL KEYIN (INPARS,INVALS,NPARS,ENDMRK,INMODE,TERMI,TERME ) C WRITE(TERME,*) ' KEYIN end mode = ', INMODE C C Determine input file name. Crop off directory, if any C Add extention to filename if one was not specified. C WRITE ( INDSN, '(8A8)' ) (INVALS( I), I=1,8) IF ( INDSN .EQ. ' ' ) THEN MOREDATA = .FALSE. GO TO 900 END IF FIRST = 1 LAST = 1 NROOT = 65 DO 20 I = 1, 64 IF ( INDSN(I:I) .EQ. BACKSLSH ) THEN FIRST = I+1 ELSE IF ( INDSN(I:I) .EQ. '.' ) THEN NROOT = I ELSE IF ( INDSN(I:I) .EQ. ' ' ) THEN LAST = I-1 GO TO 21 END IF 20 CONTINUE 21 CONTINUE IF ( FIRST .GT. NROOT ) THEN WRITE(0,*) ' BAD FILE SPECIFICATION ', INDSN INPUTERR = .TRUE. ELSE IF ( (NROOT.EQ.65).AND.(LAST.GT.60) ) THEN WRITE(0,*) ' FILE NAME IS TOO LONG ', INDSN INPUTERR = .TRUE. ELSE IF ( (LAST-NROOT) .GT. 4 ) THEN WRITE(0,*) ' FILE EXTENTION IS TOO LONG ', INDSN INPUTERR = .TRUE. ELSE IF ( NROOT .EQ. 65 ) THEN NROOT = LAST + 1 LAST = LAST + 4 INDSN(NROOT:LAST) = '.RAW' INPUTERR = .FALSE. ELSE INPUTERR = .FALSE. END IF C C Determine output file names. C IF ( .NOT. INPUTERR ) THEN AVEDSN = INDSN(FIRST:NROOT) // 'AVG' VISDSN = INDSN(FIRST:NROOT) // 'VIS' PRTDSN = INDSN(FIRST:NROOT) // 'PRT' LOGDSN = ' ' NOLOG = .TRUE. C C If you want a log file, uncomment out the next two lines. C LOGDSN = INDSN(FIRST:NROOT) // 'LOG' C NOLOG = .FALSE. PRTOUT = .TRUE. END IF C---------------------------------------------------------------------- C Load other parameters into apropriate variables, and test STARNUM = INVALS(8+ 1) STRTMON = INVALS(8+ 2) STRTDAY = INVALS(8+ 3) STRTYR = INVALS(8+ 4) STRTSEC = INVALS(8+ 5) STOPSEC = INVALS(8+ 6) INTTIM = INVALS(8+ 7) MINAVG = INVALS(8+ 8) OFFSET = INVALS(8+10) DO 5001 J = 1,20 NLIMIT(J,3)= INVALS(8+10+J) NLIMIT(J,4)= INVALS(8+10+20+J) LIMITS(J) = INVALS(8+10+2*20+J) 5001 CONTINUE MAKEHI = INVALS(8+10+3*20+1) IF ( INVALS(8+9) .EQ. 1.D0 ) THEN ALL = .FALSE. ELSE ALL = .TRUE. END IF C C Check the legality of the input parameters C IF ( STRTMON .LT. 0 .OR. STRTMON .GT. 12 .OR. $ STRTDAY .LT. 0 .OR. STRTDAY .GT. 31 .OR. $ ( STRTYR .LT. 1982 .AND. STRTYR .NE. 0 ) .OR. $ STRTYR .GT. 2000 ) THEN WRITE (TERME ,1000) ' Illegal date. Correct format: '// $ 'DAY=dd MONTH=mm YEAR=yyyy ' INPUTERR = .TRUE. END IF DO 5002 J=1,20 IF ( NLIMIT(J,3) .NE. 0 ) $ WRITE(6,*) ' *** warning *** ALIAS CORRECTION ON CHANNEL 3,', $ ' STAR', LIMITS(J) IF ( NLIMIT(J,4) .NE. 0 ) $ WRITE(6,*) ' *** warning *** ALIAS CORRECTION ON CHANNEL 4,', $ ' STAR', LIMITS(J) 5002 CONTINUE C C Keyin converts times to seconds. Check start and stop. C IF ( STOPSEC .EQ. 0 ) STOPSEC = 86400 IF ( (STRTSEC.GE.STOPSEC) .OR. (STOPSEC.LT.0) $ .OR. (STRTSEC.LT.0) ) THEN WRITE (TERME ,1000) ' Illegal start and/or stop time. ' $ // ' Correct format is HH:MM:SS .' INPUTERR = .TRUE. END IF IF ( INPUTERR ) GO TO 1 C Open the input and output disk files. CALL OPOPEN ( OPENERR ) MOREDATA = .TRUE. IF ( OPENERR ) THEN WRITE(TERME,*) ' OPINPUT: error opening files. Try again' C C Delete the bad file name, so that the program will not go into C an infinite loop when it runs out of input. C DO 350 I = 1, 8 READ (CVALS(I), 1100 ) INVALS(I) 350 CONTINUE OPENERR = .FALSE. INPUTERR = .TRUE. END IF C IF ( STRTYR .NE. 0 ) STRTYR = 1900 + MOD( STRTYR, 100 ) IF (STRTSEC.LT.0) THEN WRITE(TERME,1000) ' STRTSEC must be greater than zero ' INPUTERR = .TRUE. ELSE IF ( STRTSEC .GT. 86400 ) THEN WRITE(TERME,1000) ' STRTSEC must be less than 86400 ' INPUTERR = .TRUE. END IF C IF ( INTTIM .LE. 0. ) THEN WRITE(TERME,1000) ' INTTIME must be greater than zero ' INPUTERR = .TRUE. END IF C C Unless an error has been detected, exit. IF (INPUTERR) GO TO 1 900 CONTINUE RETURN C 1000 FORMAT (A) 1001 FORMAT (' Free format input:'/ $ ' SHOW shows options, you need only enter the file name ' / $ ' / runs the program ' // $ ' output files will be placed in the current directory ') END SUBROUTINE OPOPEN ( OPENERR ) C C by Richard S. Simon C modified (DM) 12-MAY-86 to fix up variable references. C 9 Jul 87 to include log file. C C This subroutine is part of the program FRITZ, which averages C Mt. Wilson optical interferometer data. C C OPOPEN opens the input and output files. C IMPLICIT NONE SAVE INCLUDE 'fritz.inc' INTEGER IERR LOGICAL OPENERR C C Input data file OPEN(UNIT=TERMD,FILE=INDSN,STATUS='OLD',FORM='UNFORMATTED', $ IOSTAT=IERR,RECL=2048,ACCESS='DIRECT') IF (IERR .NE. 0) THEN OPENERR = .TRUE. WRITE (TERME,1000) ' Error', IERR, ' opening INFILE ', INDSN ELSE OPENERR = .FALSE. END IF C C Open output averaged astrometry data file C OPEN(UNIT=TERMO, FILE=AVEDSN, STATUS='UNKNOWN', IOSTAT=IERR ) IF (IERR .NE. 0) THEN OPENERR = .TRUE. WRITE (TERME,1000) ' Error', IERR, ' opening AVEFILE ', AVEDSN END IF C C Open output visibility data file C OPEN(UNIT=TERMV, FILE=VISDSN, STATUS='UNKNOWN', $ FORM='UNFORMATTED', IOSTAT=IERR, RECL=76, ACCESS='DIRECT' ) IF (IERR .NE. 0) THEN OPENERR = .TRUE. WRITE (TERME,1000) ' Error', IERR, ' opening VISFILE ', VISDSN ELSE C C Write header to visi file. CALL HWRITE END IF C C Open output print file, if necessary IF (PRTDSN .EQ. ' ' ) THEN C Data goes to already opened output file TERMP = 6 PRTOUT = .FALSE. ELSE IF (PRTDSN .NE. ' ') THEN PRTOUT = .TRUE. OPEN ( UNIT=TERMP, FILE=PRTDSN, STATUS='UNKNOWN',IOSTAT=IERR) IF (IERR .NE. 0) THEN OPENERR = .TRUE. WRITE (TERME,1000) ' Error ', IERR, $ ' opening DUMPFILE ', PRTDSN END IF ELSE PRTOUT = .FALSE. END IF WRITE(TERMM,1020) INDSN 1020 FORMAT ( 10X, ' INPUT DATA FILE = ', A ) C Open log file C IF ( LOGDSN .EQ. ' ' ) THEN NOLOG = .TRUE. ELSE NOLOG = .FALSE. OPEN (UNIT=TERML, FILE=LOGDSN, STATUS='UNKNOWN', IOSTAT=IERR) IF ( IERR .NE. 0 ) THEN OPENERR = .TRUE. WRITE (TERME,1000) ' Error', IERR, $ ' opening LOG FILE ', LOGDSN END IF END IF IF ( OPENERR ) THEN CLOSE (UNIT=TERMD, STATUS='KEEP' ) CLOSE (UNIT=TERMO, STATUS='DELETE') CLOSE (UNIT=TERMV, STATUS='DELETE') CLOSE (UNIT=TERMP, STATUS='DELETE') CLOSE (UNIT=TERML, STATUS='DELETE') END IF RETURN 1000 FORMAT ( A, I5, 2A ) END SUBROUTINE OPCLOSE C C by David Mozurkewich 28 Oct 1987 C C This subroutine is part of the program FRITZ, which reduces C Mt. Wilson optical interferometer data. C C OPCLOSE closes all of the files C IMPLICIT NONE INCLUDE 'fritz.inc' CLOSE (UNIT=TERMD) CLOSE (UNIT=TERMO) CLOSE (UNIT=TERMV) CLOSE (UNIT=TERMS) IF ( PRTOUT ) CLOSE (UNIT=TERMP) IF ( .NOT. NOLOG ) CLOSE (UNIT=TERML) RETURN END