//Z1SBKFXE JOB (U0016,N598,50),KRAMER,TIME=(2,00),MSGCLASS=X,CLASS=A /*JOBPARM LINES=100 //*ROUTE PRINT SCFVM.Z1SBK //FORT77 EXEC FORTRAN C FIXES VOYAGER 48 SECOND FIELD VALUES C USES CONNERNY ROUTINE ARGUS, WHICH THROWS AWAY POINTS TOO C FAR FROM THE MEDIAN VALUE OF A GROUP OF POINTS OF C LENGTH FIXINT HOURS C CREATES AND WRITES NEW AVERAGES FROM CLEAN DATA SET CHARACTER*2 CO CHARACTER*6 INDEX CHARACTER*29 DSN INTEGER*4 READCT,MAX48 REAL*4 B(10000),BR(10000),BT(10000),BN(10000) REAL*8 TIME(10000),TDAT0,TDAT1,DTIME,TSTART,TSTOP NIL = 0 C INIT PARAMETERS FIXINT = 1.0 NYR = 90 NDY = 141 NHR = 0 TSTART = DTIME(NYR,NDY,NHR,NIL,NIL,NIL) KYR = 90 KDY = 260 KHR = 0 TSTOP = DTIME(KYR,KDY,KHR,NIL,NIL,NIL) ISC = 2 NREAD = 75 READCT = 0 IUNIT = 10 DSN = 'U0#16.VOYAGER.SUMMARY.INDEX' WRITE(6,892) IUNIT,DSN OPEN(IUNIT,FILE='/'//DSN,STATUS='OLD',FORM='FORMATTED', C ACTION='READ') C READ CATALOGUE ... PROCESS FROM TSTART THROUGH NREAD DATA SETS 10 CONTINUE READ(10,901,END=100) C ISCC,IY00,ID00,IH00,IY11,ID11,IH11,CO,INDEX C READ ONLY CRUISE DATA (HG COORDS) IF (CO.NE.'HG') GO TO 10 TDAT0 = DTIME(IY00,ID00,IH00,NIL,NIL,NIL) TDAT1 = DTIME(IY11,ID11,IH11,NIL,NIL,NIL) NMAX = MAX48(TDAT0,TDAT1) IF (ISCC.NE.ISC) GO TO 10 IF (TDAT1.LT.TSTART) GO TO 10 READCT = READCT + 1 IF (READCT.GT.NREAD) GO TO 100 DSN = 'U0#16.VOYAGER.SUMMARY.'//INDEX IUNIT = IUNIT + 1 C SKIP BAD DATASETS IF (INDEX.EQ.'M21368') GO TO 10 IF (INDEX.EQ.'M21420') GO TO 10 WRITE(6,892) IUNIT,DSN WRITE(6,901) ISCC,IY00,ID00,IH00,IY11,ID11,IH11, C CO,INDEX WRITE(6,890) TSTART,TSTOP,TDAT0,TDAT1 WRITE(6,891) NMAX,READCT C GET ONE SUMMARY TAPE'S WORTH OF DATA CALL INIT(TIME,B,BR,BT,BN) CALL AQUIRE(IUNIT,DSN,TIME,B,BR,BT,BN,TDAT0,TSTART,TSTOP) CALL FIX(FIXINT,NMAX,ISC,TIME,B,BR,BT,BN) GO TO 10 100 CONTINUE CLOSE(10) STOP 890 FORMAT(1X,'MAIN PGM***TSTART,TSTOP,TDAT0,TDAT1 = ',4F12.8) 891 FORMAT(1X,'MAIN PGM***NMAX,READCT = ',2I10) 892 FORMAT(1X,'MAIN PGM***UNIT,DSN = ',I3,A30) 901 FORMAT(1X,I1,1X,I2,1X,I3,1X,I2,4X,I2,1X,I3,1X,I2,1X,A2, C 1X,A6) END SUBROUTINE FIX(FIXINT,NMAX,ISC,TIME,B,BR,BT,BN) INTEGER*4 IA(1000) REAL*4 B(1),BR(1),BT(1),BN(1),B1(1000),BR1(1000),BT1(1000), C BN1(1000),DA(1000),A2(1000),Y(1000) REAL*8 TIME(1),T1(1000),TAV,DELTA,FIXPD C C FIX DATA IN INTERVALS OF MAXIMUM OF FIXINT HOURS AT A TIME C N0 = 1 FIX48 = FIXINT * 3600.0 / 48.0 MAXFIX = INT(FIX48) FIXPD = DBLE(FIXINT)/10.0D0/(24.0D0*365.0D0) 10 CONTINUE NFIX = 0 DO 12 I = 1,MAXFIX LL = I + N0 - 1 C WRITE(6,874) I,LL,NFIX,TIME(LL),B(LL) NYR = IDINT(TIME(LL)) IF (NYR.GT.91 .OR. NYR.LT. 77) GO TO 12 YY = SQRT(BR(LL)**2 + BT(LL)**2 + BN(LL)**2) IF (YY.GT.5.0 .OR. B(LL).GT.5.0) GO TO 12 DELTA = TIME(LL) - T1(NFIX) IF (NFIX.GT.2 .AND. DELTA.GT.FIXPD) GO TO 20 NFIX = NFIX + 1 B1(NFIX) = B(LL) BR1(NFIX) = BR(LL) BT1(NFIX) = BT(LL) BN1(NFIX) = BN(LL) T1(NFIX) = TIME(LL) Y(NFIX) = YY C WRITE(6,895) I,N0,LL,NFIX,TIME(LL),B(LL),BR(LL),BT(LL), C C BN(LL) 12 CONTINUE C 20 CONTINUE IF (NFIX.LT.5) GO TO 30 C WRITE(6,890) NMAX,MAXFIX,NFIX,N0 C DO 22 I = 1,NFIX C WRITE(6,902) I,T1(I),B1(I),Y(I) C 22 CONTINUE C COMPUTE NEW AVERAGES FROM CLEANED TIME SERIES BAVE = 999. BRAVE = 999. BTAVE = 999. BNAVE = 999. CALL ARGUS(B1,A2,DA,IA,1000,NFIX,3.,BAVE,MB1,N999) CALL ARGUS(BR1,A2,DA,IA,1000,NFIX,3.,BRAVE,MBR1,N999) CALL ARGUS(BT1,A2,DA,IA,1000,NFIX,3.,BTAVE,MBT1,N999) CALL ARGUS(BN1,A2,DA,IA,1000,NFIX,3.,BNAVE,MBN1,N999) M = MIN0(MB1,MBR1,MBT1,MBN1) IF (M.LT.5) GO TO 30 C TIME AVERAGE TAV = 0.0 DO 25 I = 1,M TAV = TAV + T1(I) 25 CONTINUE TAV = TAV / M C WRITE NEW, CLEAN AVERAGES TO INTERMEDIARY MERGE SET WRITE(9,900) ISC,TAV,BAVE,BRAVE,BTAVE,BNAVE C C WRITE(6,904) NFIX,M,N999,AVE C DO 28 I = 1,NFIX C WRITE(6,901) ISC,T1(I),B1(I),BR1(I),BT1(I),BN1(I), C WRITE(6,903) I,T1(I),Y(I),A2(I),IA(I),DA(I) C 28 CONTINUE 30 CONTINUE N0 = LL + 1 IF (N0.GT.NMAX-1) GO TO 100 GO TO 10 100 CONTINUE RETURN 874 FORMAT(' I,LL,NFIX,TIME(LL),B(LL) ',3I5,F12.8,F8.3) 890 FORMAT(' NMAX,MAXFIX,NFIX,N0 = ',4I10) 895 FORMAT(4I5,F12.8,4F8.3) 900 FORMAT(I2,F12.8,4F8.3) 901 FORMAT(I2,F12.8,4F8.3,3I5) 902 FORMAT(' BEFORE FIX: T1,B1,Y ',I5,F12.8,2F8.3) 903 FORMAT(' AFTER FIX: T1,Y,A2,IA,DA ',I5,F12.8,2F8.3,I5,F8.3) 904 FORMAT(' NFIX,M,N999,AVE = ',3I5,F8.3) END SUBROUTINE INIT(TIME,B,BR,BT,BN) REAL*4 B(1),BR(1),BT(1),BN(1) REAL*8 TIME(1) DO 10 I = 1,10000 TIME(I) = 999. B(I) = 999. BR(I) = 999. BT(I) = 999. BN(I) = 999. 10 CONTINUE RETURN END SUBROUTINE AQUIRE(IUNIT,DSN,TIM,B,BR,BT,BN,TDAT0,TBEG,TEND) C C MASS STORE RECORD - FROM SUMMARY TAPES C CHARACTER*4 SC CHARACTER*29 DSN INTEGER*2 TIME(6),ID INTEGER*4 MAX48 REAL*4 FIN(568),MAG(496),HEADER(32),MSEDR(40) REAL*4 B(1),BR(1),BT(1),BN(1),LAM,PLS(150),PSEDR(50) REAL*4 F196(5),F296(5),DEL96(5),LAM96(5) REAL*4 B196(5),B296(5),B396(5) REAL*8 T,TDAT0,TIM(1),DTIME,T96(5),TBEG,TEND EQUIVALENCE (FIN(1),HEADER(1)),(FIN(33),MAG(1)), C (HEADER(4),TIME(1)),(HEADER(17),ID), C (HEADER(3),SC),(FIN(529),MSEDR(1)), C (FIN(33),PLS(1)),(FIN(183),PSEDR(1)), C (F196(1),MAG(12)),(F296(1),MAG(17)), C (DEL96(1),MAG(22)),(LAM96(1),MAG(27)), C (B196(1),MAG(32)),(B296(1),MAG(37)), C (B396(1),MAG(42)) C C OPEN DATA SET CONTAINING SUMMARY TAPE DATA C WRITE(6,23) IUNIT,DSN WRITE(6,89) TBEG,TEND OPEN(IUNIT,FILE='/'//DSN,FORM='UNFORMATTED',STATUS='OLD', C ACTION='READ') WRITE(6,24) IUNIT,DSN C DEG = 180.0/3.14159 BLT = 1.38066E-23 PRTN = 1.67265E-27 30 CONTINUE READ(IUNIT,NUM=LEN,END=100,ERR=30) FIN IF (ID.NE.1) GO TO 30 IF (SC.EQ.'FLT1') ISC = 1 IF (SC.EQ.'FLT2') ISC = 2 NYR = TIME(1) NDY = TIME(2) NHR = TIME(3) NMIN = TIME(4) ISEC = TIME(5) MSEC = TIME(6) T = DTIME(NYR,NDY,NHR,NMIN,ISEC,MSEC) IF (T.LT.TBEG) GO TO 30 IF (T.GT.TEND) GO TO 100 IF (ID.EQ.1) THEN IF (MAG(1).LT.0.001) GO TO 30 IND = MAX48(TDAT0,T) - 1 IF (IND.LT.1.OR.IND.GT.10000) GO TO 30 IF (ABS(MAG(5)).GT.0.001) BR(IND) = MAG(5) IF (ABS(MAG(6)).GT.0.001) BT(IND) = MAG(6) IF (ABS(MAG(7)).GT.0.001) BN(IND) = MAG(7) IF (MAG(1).GT.0.001) B(IND) = MAG(1) F1 = MAG(1) F2 = MAG(2) DEL = MAG(3) LAM = MAG(4) DIST = MSEDR(11) C C GET 9.6 SEC AVERAGES C C DO JJ = 1,5 C JMSEC = MSEC + 9600*(JJ-1) C JSEC = ISEC + INT(JMSEC/1000) C JMSEC = MOD(JMSEC,1000) C JMIN = NMIN + INT(JSEC/60) C JSEC = MOD(JSEC,60) C JHOUR = NHR + INT(JMIN/60) C JMIN = MOD(JMIN,60) C JDAY = NDY + INT(JHOUR/24) C JHOUR = MOD(JHOUR,24) C WRITE(9,91) NYR,NDY,NHR,NMIN,ISEC,MSEC C WRITE(9,91) NYR,JDAY,JHOUR,JMIN,JSEC,JMSEC C T96(JJ) = DTIME(NYR,JDAY,JHOUR,JMIN,JSEC,JMSEC) C WRITE(9,88) ISC,T96(JJ),F196(JJ),B196(JJ),B296(JJ), C C B396(JJ),F296(JJ) C END DO END IF C IF (ID.EQ.3) THEN C F1 = PLS(8) C F2 = PLS(9) C BRAD = PLS(96) C BTAN = PLS(97) C BNOR = PLS(98) C BRT = SQRT(BRAD**2 + BTAN**2) C IF (BRT.NE.0.0) THEN C DEL = DEG * ATAN(BNOR/BRT) C LAM = DEG * ATAN2(BTAN,BRAD) C IF (LAM.LT.0.0) LAM = LAM + 360.0 C ELSE C DEL = -99.9 C LAM = -99.9 C END IF C VEL = PLS(108) C VDEL = PLS(109) C VLAM = PLS(110) C DEN = PLS(52) C TEMP = PRTN * (PLS(53)*1000.0)**2 / (2*BLT) C DIST = PSEDR(11) C END IF TIM(IND) = T C WRITE(6,28) IND,TIM(IND),B(IND),BR(IND),BT(IND),BN(IND) C WRITE(9,29) ISC,T,F1,DEL,LAM,VEL,VDEL,VLAM, C C CR,DEN,TEMP,DIST,F2 GO TO 30 100 CONTINUE CLOSE(IUNIT) WRITE(6,25) IUNIT,DSN RETURN 23 FORMAT(1X,'SUB AQUIRE/PRE-OPEN***UNIT = ',I3.3,' DSN = ',A29) 24 FORMAT(1X,'SUB AQUIRE/POST-OPEN***UNIT = ',I3.3,' DSN = ',A29) 25 FORMAT(1X,'SUB AQUIRE/POST-CLOSE***UNIT = ',I3.3,' DSN = ',A29) 28 FORMAT(1X,I5,F12.8,4F8.3) 29 FORMAT(I2,F12.8,6F6.2,3E10.4,F5.2,F6.2) 88 FORMAT(I2,F12.8,5(F6.2)) 89 FORMAT(1X,'TBEG,TEND',2F12.8) 91 FORMAT(6(1X,I4)) END INTEGER FUNCTION MAX48(TIME1,TIME2) C C COMPUTE NUMBER OF 48 SEC AVERAGES IN TIME INTERVAL (TIME1,TIME2) C REAL*8 TIME1,TIME2,LEAP,AVG48 NYR = IDINT(TIME1) LEAP = 365.0D0 IF (MOD(NYR,4).EQ.0) LEAP = 366.0D0 AVG48 = (TIME2 - TIME1) * LEAP * 24.0D0 * 3600.0D0 / 48.0D0 MAX48 = IDINT(AVG48) + 1 RETURN END DOUBLE PRECISION FUNCTION DTIME(YR,DY,HR,MIN,SEC,MSEC) C C CONVERT INTEGER TIME WORDS (YEAR,DAY,HOUR,MINUTE,SECOND,MILLISEC) C INTO DECIMAL YEAR C INTEGER*4 YR,DY,HR,MIN,SEC,MSEC REAL*8 YEAR,DAY,HOUR,MINUTE,SECOND,MILLISEC,LEAP LEAP = 365.0D0 IF (MOD(YR,4).EQ.0) LEAP = 366.0D0 MILLISEC = DFLOAT(MSEC) SECOND = DFLOAT(SEC) + MILLISEC/1000.0D0 MINUTE = DFLOAT(MIN) + SECOND/60.0D0 HOUR = DFLOAT(HR) + MINUTE/60.0D0 DAY = DFLOAT(DY) - 1.0D0 + HOUR/24.0D0 YEAR = DFLOAT(YR) + DAY/LEAP DTIME = YEAR RETURN END CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC CC CC CC ARGUS : SUBROUTINE WHICH, LIKE THE THE HUNDRED EYED CC CC MONSTER WHICH WAS SENT TO OBSERVE IO, LOOKS CC CC THROUGH THE DATA STRING FOR 'BAD' DATA. CC CC ARGUS TRIES TO MEASUREABLY IMPROVE THE CC CC COMPUTED AVERAGE BY TOSSING OUT, ONE BY ONE, CC CC THE WORST-FITTING POINTS. ARGUS IS HAPPY AND CC CC STOPS THROWING AWAY DATA WHEN THE IMPROVEMENT CC CC IS MINIMAL (