C C PLOTTING PARAMETERS C CHARACTER PLOTTIME*8,PLOTDATE*9,DSN*50, & VALUE*10,XFORM*10,YFORM*10,CTIME1*10,CTIME2*10, & XSTRING*50,YSTRING*50,TITLE*50,SUBTITLE*50 INTEGER*4 XLAB,YLAB,TYPE REAL*4 XLOW,XHIGH C WRITE(6,*) WRITE(6,*) 'ENTER TITLE' READ(5,'(Q,A)') LEN,TITLE TITLE(LEN+1:) = '\E' WRITE(6,*) WRITE(6,*) 'ENTER SUBTITLE' READ(5,'(Q,A)') LEN,SUBTITLE SUBTITLE(LEN+1:) = '\E' C CALL MGOINIT CALL MGOSETUP(-5) CALL MGOERASE C XX1 = 400. XX2 = 2225. C C PLOT SUBTITLE C YY1 = 3000. YY2 = 3100. CALL MGOSETEXPAND(1.0) CALL MGOSETLOC(XX1,YY1,XX2,YY2) CALL MGOSETLIM(0.,0.,100.,100.) CALL MGORELOCATE(50.,50.) CALL MGOPUTLABEL(50,SUBTITLE,5) C C FIELD MAGNITUDE C YY1 = 2730. YY2 = 3000. XT1 = 100. XT2 = 200. YT1 = 100. YT2 = 200. TT1 = 3100. TT2 = 3200. XNUMH = .8 YNUMH = .8 XTXTH = 1. YTXTH = 1. TITLH = 1.3 XLAB = 4 YLAB = 3 XTLEN = 50. YTLEN = 50. XSTRING = 'Y axis\E' YSTRING = 'X axis\E' TYPE = 3 WRITE(6,*) WRITE(6,*) 'ENTER XLOW,XHIGH,BSPANX,SSPANX' READ(5,*) XLOW,XHIGH,BSPANX,SSPANX WRITE(6,*) 'ENTER YLOW,YHIGH,BSPANY,SSPANY (FIELD)' READ(5,*) YLOW,YHIGH,BSPANY,SSPANY YFORM = 'i5' C C PLOT GRID AND LABELS C CALL GRID(XX1,XX2,YY1,YY2,XT1,XT2,YT1,YT2,TT1,TT2, C XNUMH,YNUMH,XTXTH,YTXTH,TITLH,XLAB,YLAB, C XTLEN,YTLEN,XSTRING,YSTRING,TITLE,TYPE, C XLOW,XHIGH,YLOW,YHIGH,SSPANX,BSPANX, C SSPANY,BSPANY,XFORM,YFORM) CALL MGOPRNTPLOT(NVEC) WRITE(6,*) WRITE(6,'(1X,''VECTORS PLOTTED: '',I6)') NVEC WRITE(6,*) STOP END SUBROUTINE GETDATE(SYSDATE) C C CALL DEC FORTRAN SUBROUTINE TO GET SYSTEM DATE C CHARACTER SYSDATE*9 C CALL DATE(SYSDATE) C RETURN END SUBROUTINE GETTIME(SYSTIME) C C CALL DEC FORTRAN SUBROUTINE TO GET SYSTEM TIME C CHARACTER SYSTIME*8 C CALL TIME(SYSTIME) C RETURN END SUBROUTINE HRAVG(T1,T2,FILL,BTIME,DTIME,T,DATA,NPTS, & TOUT,DOUT,PARR,NOUT) C C PRODUCE AVERAGES OF PERIOD DTIME FROM INPUTTED HOUR AVERAGE DATA. C ROUTINE DOES NOT REMOVE TIME POINTS WITH NULL AVERAGES. C INTEGER*4 PARR(1) REAL*4 DATA(1),DOUT(1) REAL*8 T(1),TIME,TIME1,TIME2,TOUT(1),T1,T2,TEND C C T1 START TIME C T2 END TIME C FILL FILL DATA VALUE C BTIME RESOLUTION OF INPUT DATA (HOURS) C DTIME AVERAGING INTERVAL (HOURS) C T INPUT TIME ARRAY C DATA INPUT DATA ARRAY C NPTS NUMBER OF POINTS IN INPUT DATA C TOUT OUTPUT TIME ARRAY C DOUT OUTPUT ARRAY OF DTIME AVERAGES C PARR OUTPUT ARRAY - # OF AVGS/PT C NOUT NUMBER OF POINTS IN OUTPUT DATA C SUM = 0.0 NUM = 0 TEND = T2 + DBLE(BTIME/(100.0*24.0*DAYS(T2))) C TIME1 = T1 - DBLE(BTIME/(100.0*24.0*DAYS(T1))) TIME2 = TIME1 + DBLE(DTIME/(24.0*DAYS(TIME1))) IARR = 0 INDEX = 0 10 CONTINUE IARR = IARR + 1 IF (IARR.GT.NPTS) GOTO 20 TIME = T(IARR) VAL = DATA(IARR) C C GET DATA FROM PROPER TIME INTERVAL C 15 CONTINUE IF (TIME.LT.TIME1) GOTO 10 IF (TIME.GE.TIME2) GOTO 20 IF (TIME.GT.TEND) GOTO 20 C C ACCUMULATE DATA NOT INCLUDING FILL POINTS C IF (VAL.NE.FILL) THEN SUM = SUM + VAL NUM = NUM + 1 END IF C GOTO 10 20 CONTINUE C C AVERAGE DATA AND INCREMENT TIME INTERVAL C AVG = FILL IF (NUM.NE.0) THEN AVG = SUM/FLOAT(NUM) END IF INDEX = INDEX + 1 TOUT(INDEX) = TIME1 + DBLE(BTIME/(100.0*24.0*DAYS(TIME1))) DOUT(INDEX) = AVG PARR(INDEX) = NUM TIME1 = TIME2 TIME2 = TIME1 + DBLE(DTIME/(24.0*DAYS(TIME1))) SUM = 0.0 NUM = 0 IF (IARR.LE.NPTS.AND.TIME.LE.TEND) GOTO 15 C C RETURN FROM AVERAGING OVER DESIRED TIME INTERVAL C 100 CONTINUE WRITE(6,800) TOUT(1),TOUT(INDEX),INDEX CLOSE(10) NOUT = INDEX C RETURN 800 FORMAT(' START ',F12.8,' STOP ',F12.8,' POINTS ',I5) END C C MONGO PLOTTING ROUTINE WITH USER DEFINED SPECIFICS C DEVELOPED BY SAUNDERS B. KRAMER JR., CODE 692 C C XX1 PLOT LOWER X AXIS LIMIT IN DEVICE COORDINATES - R*4 C XX2 PLOT UPPER X AXIS LIMIT IN DEVICE COORDINATES - R*4 C YY1 PLOT LOWER Y AXIS LIMIT IN DEVICE COORDINATES - R*4 C YY2 PLOT UPPER Y AXIS LIMIT IN DEVICE COORDINATES - R*4 C XT1 Y LABEL LOWER X AXIS LIMIT IN DEVICE COORDINATES - R*4 C XT2 Y LABEL UPPER X AXIS LIMIT IN DEVICE COORDINATES - R*4 C YT1 X LABEL LOWER Y AXIS LIMIT IN DEVICE COORDINATES - R*4 C YT2 X LABEL UPPER Y AXIS LIMIT IN DEVICE COORDINATES - R*4 C TT1 TITLE LOWER Y AXIS LIMIT IN DEVICE COORDINATES - R*4 C TT2 TITLE UPPER Y AXIS LIMIT IN DEVICE COORDINATES - R*4 C XNUMH SIZE OF X SCALE CHARACTERS - R*4 C YNUMH SIZE OF Y SCALE CHARACTERS - R*4 C XTXTH SIZE OF X LABEL CHARACTERS - R*4 C YTXTH SIZE OF Y LABEL CHARACTERS - R*4 C TITLH SIZE OF TITLE CHARACTERS - R*4 C XLAB CONTROLS X AXIS SCALING AND LABELLING - I*4 C 0 PRINT ALL SCALES AND X LABEL C 1 SKIP FIRST SCALE C 2 SKIP LAST SCALE C 3 SKIP FIRST AND LAST SCALE C 4 NO SCALES C YLAB PARALLELS XLAB ABOVE FOR Y AXIS - I*4 C XTLEN SIZE OF X AXIS LARGE TICKS - R*4 C YTLEN SIZE OF Y AXIS LARGE TICKS - R*4 C XSTRING X LABEL STRING - C*50 C YSTRING Y LABEL STRING - C*50 C TITLE TITLE STRING - C*50 C TYPE INDICATES INDEPENDENT AXIS FORMAT - I*4 C -6 TIME FORMAT (YEAR//DAY) YEAR INTERVALS C -5 TIME FORMAT (YEAR) * C -4 TIME FORMAT (HOUR) DAY INTERVALS C -3 TIME FORMAT (DAY) * C -2 TIME FORMAT (DAY//HOUR) * C -1 TIME FORMAT (YEAR//DAY) * C 0 STANDARD C 1 LOGARITHMIC INDEPENDENT AXIS, STANDARD Y AXIS C 2 LOGARITHMIC DEPENDENT AXIS, STANDARD X AXIS C 3 LOGARITHMIC INDEPENDENT AND DEPENDENT AXIS C XLOW PLOT LOWER X AXIS LIMIT IN USER COORDINATES - R*4 C XHIGH PLOT UPPER X AXIS LIMIT IN USER COORDINATES - R*4 C YLOW PLOT LOWER Y AXIS LIMIT IN USER COORDINATES - R*4 C YHIGH PLOT LOWER Y AXIS LIMIT IN USER COORDINATES - R*4 C SSPANX SPACING OF INDEPENDENT AXIS SMALL TICKS - R*4 C BSPANX SPACING OF INDEPENDENT AXIS LARGE TICKS - R*4 C SSPANY SPACING OF DEPENDENT AXIS SMALL TICKS - R*4 C BSPANY SPACING OF DEPENDENT AXIS LARGE TICKS - R*4 C XFORM FORTRAN FORMAT OF INDEPENDENT AXIS SCALING - C*10 C YFORM FORTRAN FORMAT OF DEPENDENT AXIS SCALING - C*10 C SUBROUTINE GRID(XX1,XX2,YY1,YY2,XT1,XT2,YT1,YT2,TT1,TT2, C XNUMH,YNUMH,XTXTH,YTXTH,TITLH,XLAB,YLAB, C XTLEN,YTLEN,XSTRING,YSTRING,TITLE,TYPE, C XLOW,XHIGH,YLOW,YHIGH,SSPANX,BSPANX, C SSPANY,BSPANY,XFORM,YFORM) CHARACTER*1 TCHAR CHARACTER*10 VALUE,XFORM,YFORM CHARACTER*50 XSTRING,YSTRING,TITLE INTEGER*4 XNUM,YNUM,XLAB,YLAB,TYPE LOGICAL TIME REAL*8 TLOW,THIGH,DEC,CONVERT C C DETERMINE IF INDEPENDENT AXIS HAS TIME SCALE C TIME = .FALSE. IF (TYPE.LT.0) TIME = .TRUE. IF (.NOT.TIME) GOTO 30 C C CONVERT 6 DIGIT CALENDAR YEAR (YYDDDHH) INTO TRUE DECIMAL YEAR C W/4 DIGITS TO LEFT OF DECIMAL POINT C TLOW = CONVERT(XLOW) THIGH = CONVERT(XHIGH) 30 CONTINUE C C DRAW BOX C CALL MGOSETLOC(XX1,YY1,XX2,YY2) CALL MGOLINE(XX1,YY1,XX1,YY2) CALL MGOLINE(XX1,YY2,XX2,YY2) CALL MGOLINE(XX2,YY2,XX2,YY1) CALL MGOLINE(XX2,YY1,XX1,YY1) C C DRAW TIME (INDEPENDENT) AXIS TICK MARKS C IF (.NOT.TIME) GOTO 40 CALL MGOSETEXPAND(XNUMH) CALL BIGTICK(XX1,XX2,YY1,YY2,TLOW,THIGH,BSPANX, C XLAB,XTLEN,TYPE) CALL SMALLTICK(XX1,XX2,YY1,YY2,TLOW,THIGH,SSPANX, C XTLEN,TYPE) GOTO 45 40 CONTINUE C C DRAW INDEPENDENT AXIS LARGE TICK MARKS AND LABEL C IF (TYPE.EQ.1.OR.TYPE.EQ.3) THEN ISCALE = 1 ELSE ISCALE = 0 END IF CALL MGOSETEXPAND(XNUMH) CALL LRGTICK(YY1,YY2,XX1,XX2,XLOW,XHIGH,BSPANX, C XFORM,XTLEN,XLAB,ISCALE) C C DRAW INDEPENDENT AXIS SMALL TICK MARKS C IF (TYPE.EQ.1.OR.TYPE.EQ.3) THEN CALL LOGTICK(YY1,YY2,XX1,XX2,XLOW,XHIGH,SSPANX,XTLEN) ELSE CALL SMLTICK(YY1,YY2,XX1,XX2,XLOW,XHIGH,SSPANX,XTLEN) END IF C 45 CONTINUE C C DRAW DEPENDENT AXIS LARGE TICK MARKS AND LABEL C IF (TYPE.EQ.2.OR.TYPE.EQ.3) THEN ISCALE = 1 ELSE ISCALE = 0 END IF CALL MGOSETEXPAND(YNUMH) XX1 = -XX1 CALL LRGTICK(XX1,XX2,YY1,YY2,YLOW,YHIGH, C BSPANY,YFORM,YTLEN,YLAB,ISCALE) C C DRAW DEPENDENT AXIS SMALL TICK MARKS C XX1 = -XX1 IF (TYPE.EQ.2.OR.TYPE.EQ.3) THEN CALL LOGTICK(XX1,XX2,YY1,YY2,YLOW,YHIGH,SSPANY,YTLEN) ELSE CALL SMLTICK(XX1,XX2,YY1,YY2,YLOW,YHIGH,SSPANY,YTLEN) END IF C C LABEL TITLE C CALL STRINGSET(XX1,TT1,XX2,TT2,TITLE,50,1,TITLH) C C LABEL INDEPENDENT AXIS C CALL STRINGSET(XX1,YT1,XX2,YT2,XSTRING,50,1,XTXTH) C C LABEL DEPENDENT AXIS C CALL MGOSETANGLE(90.) CALL STRINGSET(XT1,YY1,XT2,YY2,YSTRING,50,1,YTXTH) CALL MGOSETANGLE(0.) C C RESET LOCATION,SIZE AND WEIGHT C CALL MGOSETLOC(XX1,YY1,XX2,YY2) CALL MGOSETEXPAND(1.0) CALL MGOSETLWEIGHT(1) C RETURN END SUBROUTINE STRINGSET(XX1,YY1,XX2,YY2,STRING,LEN,WGHT,SIZE) C C PLACE LABEL CENTERED IN A BOX DEFINED BY DEVICE COORDINATES C CHARACTER*(*) STRING INTEGER*4 WGHT CALL MGOSETLOC(XX1,YY1,XX2,YY2) XX = (XX1 + XX2) / 2.0 YY = (YY1 + YY2) / 2.0 CALL MGOGRELOCATE(XX,YY) CALL MGOSETEXPAND(SIZE) CALL MGOSETLWEIGHT(WGHT) IF (SIZE.NE.0.) CALL MGOPUTLABEL(LEN,STRING,5) CALL MGOSETEXPAND(1.0) CALL MGOSETLWEIGHT(1) RETURN END SUBROUTINE BIGTICK(XX1,XX2,YY1,YY2,XLOW,XHIGH,SPAN, C XLAB,XTLEN,TYPE) C C PRODUCE LARGE TICK MARKS AND LABELS ALONG INDEPENDENT AXIS (TIME) C AT USER DEFINED INTERVALS IN DAYS. RANGE OF AXIS VALUES AND USER C SPECIFIED SPACING DETERMINE NUMBER OF TICK MARKS. DEVICE C COORDINATES USED FOR LOCATING MARKS. C C XX1 = LOWER INDEPENDENT AXIS BOUNDRY C XX2 = UPPER INDEPENDENT AXIS BOUNDRY C YY1 = LOWER DEPENDENT AXIS BOUNDRY C YY2 = UPPER DEPENDENT AXIS BOUNDRY C XLOW = DECIMAL YEAR START C XHIGH = DECIMAL YEAR STOP C SPAN = DISTANCE BETWEEN TICK MARKS C XLAB = BEGIN/END LABEL PRINT FLAG C XTELN = INDEPENDENT AXIS TICK SIZE C TYPE = INDEPENDENT AXIS LABEL TYPE C CHARACTER*10 XCHAR INTEGER*4 XLAB,TYPE REAL*8 XLOW,XHIGH,XVAL,VAL,YR1,YR2,FRAC1,FRAC2 C Y0 = YY1 - XTLEN/2. Y1 = YY1 + XTLEN Y2 = YY2 - XTLEN IF (TYPE.GT.-5) THEN XDIFF = REAL((XHIGH-XLOW)*365.25D0) ELSE XDIFF = REAL(XHIGH-XLOW) END IF YDIFF = YY2 - YY1 ISTOP = NINT(XDIFF/SPAN) + 1 XVAL = XLOW DO 50 I=1,ISTOP XLIN = XX1 + (XX2-XX1) * REAL((XVAL-XLOW)/(XHIGH-XLOW)) ERR = XVAL/XHIGH IF (ERR.GT.1.0) GOTO 50 C ERR = REAL(XVAL-XHIGH)/REAL(XHIGH-XLOW) C IF (ERR.GT.0.0001) GOTO 50 C IF (XVAL.GT.XHIGH) GOTO 50 CALL MGOLINE(XLIN,YY1,XLIN,Y1) CALL MGOLINE(XLIN,YY2,XLIN,Y2) IF ( XLAB.EQ.4 ) GOTO 30 CALL CALENDAR(XVAL,IY,ID,IH) C ONLY WANT LAST 2 DIGITS OF 4 DIGIT YEAR (1960-2059) IF (IY.GT.1999) THEN IY = IY - 2000 ELSE IY = IY - 1900 END IF IF (IY.GT.99) THEN WRITE(6,*) '***BIGTICK***STOP' STOP END IF C BUILD SCALE STRING IF (TYPE.EQ.-1) WRITE(XCHAR,'(I2,I3.3)') IY,ID IF (TYPE.EQ.-2) WRITE(XCHAR,'(I3.3,I2.2)') ID,IH IF (TYPE.EQ.-3) WRITE(XCHAR,'(I3.3)') ID IF (TYPE.EQ.-4) WRITE(XCHAR,'(I2.2)') IH IF (TYPE.EQ.-5) WRITE(XCHAR,'(I2.2)') IY IF (TYPE.EQ.-6) WRITE(XCHAR,'(I2.2,I3.3)') IY,ID INUM = 0 DO ILET=1,10 LVAL = ICHAR(XCHAR(ILET:ILET)) IF ( LVAL.NE.32 ) INUM = INUM + 1 END DO IF ( XLAB.EQ.1.AND.I.EQ.1 ) GOTO 30 IF ( XLAB.EQ.2.AND.I.EQ.ISTOP ) GOTO 30 IF ( XLAB.EQ.3.AND.(I.EQ.1.OR.I.EQ.ISTOP) ) GOTO 30 CALL MGOGRELOCATE(XLIN,Y0) C TYPE*,'X LABEL *'//XCHAR//'*' CALL MGOPUTLABEL(INUM,XCHAR,2) 30 IF (I.EQ.ISTOP) GOTO 50 IF (TYPE.GT.-5) THEN C BALANCE CALENDAR ARITHMETIC ACROSS CHANGE OF YEAR YR1 = DBLE(INT(XVAL)) VAL = XVAL + DBLE(SPAN) / DBLE(DAYS(XVAL)) IF (INT(VAL).GT.INT(XVAL)) THEN YR2 = YR1 + 1.D0 FRAC1 = (YR2 - XVAL) * DBLE(DAYS(XVAL)) FRAC2 = DBLE(SPAN) - FRAC1 VAL = YR2 + FRAC2 / DBLE(DAYS(YR2)) ENDIF XVAL = VAL ELSE XVAL = XVAL + SPAN END IF 50 CONTINUE C RETURN END SUBROUTINE SMALLTICK(XX1,XX2,YY1,YY2,XLOW,XHIGH,SPAN, C XTLEN,TYPE) C C PRODUCE SMALL TICK MARKS ALONG INDEPENDENT AXIS (TIME) C AT USER DEFINED INTERVALS IN DAYS. C C XX1 = LOWER INDEPENDENT AXIS BOUNDRY C XX2 = UPPER INDEPENDENT AXIS BOUNDRY C YY1 = LOWER DEPENDENT AXIS BOUNDRY C YY2 = UPPER DEPENDENT AXIS BOUNDRY C XLOW = DECIMAL YEAR START C XHIGH = DECIMAL YEAR STOP C SPAN = DISTANCE BETWEEN TICK MARKS C XLAB = BEGIN/END LABEL PRINT FLAG C XTELN = INDEPENDENT AXIS TICK SIZE C TYPE = INDEPENDENT AXIS LABEL TYPE C INTEGER*4 TYPE REAL*8 XLOW,XHIGH,XVAL,VAL,YR1,YR2,FRAC1,FRAC2 C Y1 = YY1 + XTLEN/2. Y2 = YY2 - XTLEN/2. IF (TYPE.GT.-5) THEN XDIFF = REAL((XHIGH-XLOW)*365.25D0) ELSE XDIFF = REAL(XHIGH-XLOW) END IF YDIFF = YY2 - YY1 ISTOP = NINT(XDIFF/SPAN) + 1 XVAL = XLOW DO 50 I=1,ISTOP XLIN = XX1 + (XX2-XX1) * REAL((XVAL-XLOW)/(XHIGH-XLOW)) IF (XVAL.GT.XHIGH) GOTO 50 CALL MGOLINE(XLIN,YY1,XLIN,Y1) CALL MGOLINE(XLIN,YY2,XLIN,Y2) IF (TYPE.GT.-5) THEN YR1 = DBLE(INT(XVAL)) VAL = XVAL + DBLE(SPAN) / DBLE(DAYS(XVAL)) IF (INT(VAL).GT.INT(XVAL)) THEN YR2 = YR1 + 1.D0 FRAC1 = (YR2 - XVAL) * DBLE(DAYS(XVAL)) FRAC2 = DBLE(SPAN) - FRAC1 VAL = YR2 + FRAC2 / DBLE(DAYS(YR2)) ENDIF XVAL = VAL ELSE XVAL = XVAL + SPAN END IF 50 CONTINUE C RETURN END SUBROUTINE LRGTICK(VV1,VV2,WW1,WW2,VLOW,VHIGH, C SPAN,FORM,TLEN,LAB,ISCALE) CHARACTER*1 TCHAR CHARACTER*5 EXPONENT CHARACTER*10 FORM,NCHAR REAL*4 NUMH C C DRAW LARGE TICK MARKS AND LABEL C IF (VV1.LT.0) THEN VV1 = ABS(VV1) IAX = 2 ELSE IAX = 1 END IF DIFF = VHIGH - VLOW ISTOP = NINT(DIFF/SPAN) + 1 V0 = VV1 - TLEN/2. V1 = VV1 + TLEN V2 = VV2 - TLEN VAL = VLOW DO I=1,ISTOP VLIN = WW1 + (WW2-WW1)*(VAL-VLOW)/DIFF ERR = (VLIN-WW2)/(WW2-WW1) IF (ERR.GT.0.0001) GOTO 100 IF (IAX.EQ.1) THEN C C DRAW INDEPENDENT AXIS LARGE TICKS C CALL MGOLINE(VLIN,VV1,VLIN,V1) CALL MGOLINE(VLIN,VV2,VLIN,V2) ELSE IF (IAX.EQ.2) THEN C C DRAW DEPENDENT AXIS LARGE TICKS C CALL MGOLINE(VV1,VLIN,V1,VLIN) CALL MGOLINE(VV2,VLIN,V2,VLIN) END IF C IF ( LAB.EQ.4 ) GOTO 60 C C LINEAR SCALING C IF (ISCALE.EQ.0) THEN TCHAR = FORM(1:1) IF (TCHAR.EQ.'I') THEN WRITE(NCHAR,'('//FORM//')') INT(VAL) ELSE WRITE(NCHAR,'('//FORM//')') VAL END IF END IF C C LOGARITHMIC SCALING C IF (ISCALE.EQ.1) THEN WRITE(EXPONENT,'(I5)') INT(VAL) WRITE(NCHAR,'(A10)') '10\\U'//EXPONENT END IF C C SHIFT LEFT CHARACTER STRING C NUM = 0 DO 55 ILET=1,10 TCHAR = NCHAR(ILET:ILET) LVAL = ICHAR(TCHAR) IF ( LVAL.LT.32 .OR. LVAL.EQ.127 ) GOTO 55 IF ( LVAL.NE.32 ) THEN NUM = NUM + 1 NCHAR(NUM:NUM) = TCHAR IF (NUM.NE.ILET) NCHAR(ILET:ILET) = CHAR(32) END IF 55 CONTINUE C IF ( LAB.EQ.1.AND.I.EQ.1 ) GOTO 60 IF ( LAB.EQ.2.AND.I.EQ.ISTOP ) GOTO 60 IF ( LAB.EQ.3.AND.(I.EQ.1.OR.I.EQ.ISTOP) ) GOTO 60 IF (IAX.EQ.1) THEN C TYPE*,'X LABEL *'//NCHAR//'*' CALL MGOGRELOCATE(VLIN,V0) CALL MGOPUTLABEL(NUM,NCHAR,2) END IF IF (IAX.EQ.2) THEN C TYPE*,'Y LABEL *'//NCHAR//'*' CALL MGOGRELOCATE(V0,VLIN) CALL MGOPUTLABEL(NUM,NCHAR,4) END IF 60 VAL = VAL + SPAN END DO 100 CONTINUE RETURN END SUBROUTINE SMLTICK(VV1,VV2,WW1,WW2,VLOW,VHIGH,SPAN,TLEN) C C DRAW SMALL TICK MARKS C IF (VV1.LT.0) THEN VV1 = ABS(VV1) IAX = 2 ELSE IAX = 1 END IF DIFF = VHIGH - VLOW ISTOP = NINT(DIFF/SPAN) + 1 V1 = VV1 + TLEN/2. V2 = VV2 - TLEN/2. VAL = VLOW DO I=1,ISTOP VAL = VAL + SPAN VLIN = WW1 + (WW2-WW1)*(VAL-VLOW)/DIFF IF (VLIN.GT.WW2) GOTO 45 IF (IAX.EQ.1) THEN C C DRAW INDEPENDENT AXIS SMALL TICKS C CALL MGOLINE(VLIN,VV1,VLIN,V1) CALL MGOLINE(VLIN,VV2,VLIN,V2) ELSE IF (IAX.EQ.2) THEN C C DRAW DEPENDENT AXIS SMALL TICKS C CALL MGOLINE(VV1,VLIN,V1,VLIN) CALL MGOLINE(VV2,VLIN,V2,VLIN) END IF C END DO 45 CONTINUE RETURN END SUBROUTINE LOGTICK(VV1,VV2,WW1,WW2,VLOW,VHIGH,SPAN,TLEN) C C DRAW SMALL TICK MARKS C IF (VV1.LT.0) THEN VV1 = ABS(VV1) IAX = 2 ELSE IAX = 1 END IF DIFF = VHIGH - VLOW ISTOP = NINT(DIFF/SPAN) + 1 V1 = VV1 + TLEN/2. V2 = VV2 - TLEN/2. DO DECADE = VLOW,VHIGH,1.0 CURDEC = DECADE DO I = 1,10 VAL = ALOG10(REAL(I)*10.0**CURDEC) VLIN = WW1 + (WW2-WW1)*(VAL-VLOW)/DIFF IF (VLIN.GT.WW2) GOTO 45 IF (IAX.EQ.1) THEN C C DRAW INDEPENDENT AXIS SMALL TICKS C CALL MGOLINE(VLIN,VV1,VLIN,V1) CALL MGOLINE(VLIN,VV2,VLIN,V2) ELSE IF (IAX.EQ.2) THEN C C DRAW DEPENDENT AXIS SMALL TICKS C CALL MGOLINE(VV1,VLIN,V1,VLIN) CALL MGOLINE(VV2,VLIN,V2,VLIN) END IF C END DO END DO 45 CONTINUE RETURN END REAL*8 FUNCTION DECYR(DATE) C C CONVERT HIGH RESOLUTION CALENDAR TIME INTO DECIMAL YEAR TIME C C MODIFIED TO RETURN 4 DIGIT WHOLE YEAR SBK 06/12/98 C INTEGER*2 DATE(6) REAL*8 YEAR,DAY,HOUR,MIN,SEC,MSEC,LEAP LEAP = 365.0D0 IF (MOD(DATE(1),4).EQ.0) LEAP = 366.0D0 MSEC = DFLOAT(DATE(6)) SEC = DFLOAT(DATE(5)) + MSEC/1000.0D0 MIN = DFLOAT(DATE(4)) + SEC/60.0D0 HOUR = DFLOAT(DATE(3)) + MIN/60.0D0 DAY = DFLOAT(DATE(2)-1) + HOUR/24.0D0 YEAR = DFLOAT(DATE(1)) + DAY/LEAP C IF ( DATE(1).LT.60 ) THEN YEAR = YEAR + 2000.0D0 ELSE YEAR = YEAR + 1900.0D0 END IF C DECYR = YEAR C RETURN END REAL*8 FUNCTION DECDY(DATE) C C CONVERT HIGH RESOLUTION CALENDAR DATA TO DECIMAL DAY (JAN. 1 = 1) C INTEGER*2 DATE(6) REAL*8 DAY,HOUR,MIN,SEC,MSEC MSEC = DFLOAT(DATE(6)) SEC = DFLOAT(DATE(5)) + MSEC/1000.0D0 MIN = DFLOAT(DATE(4)) + SEC/60.0D0 HOUR = DFLOAT(DATE(3)) + MIN/60.0D0 DAY = DFLOAT(DATE(2)) + HOUR/24.0D0 DECDY = DAY RETURN END SUBROUTINE CALENDAR(TIME,IYEAR,IDAY,IHOUR) C C CONVERT DOUBLE PRECISION DECIMAL YEAR INTO INTEGER YEAR, DAY AND HOUR C REAL*8 TIME,DYEAR,LEAP C IYEAR = INT(TIME) DYEAR = DBLE(IYEAR) LEAP = DBLE(DAYS(TIME)) DDAY = REAL((TIME-DYEAR)*LEAP) + 1. IDAY = INT(DDAY) DHOUR = (DDAY-REAL(IDAY))*24. IHOUR = INT(DHOUR) DMIN = DHOUR - REAL(IHOUR) IF (DMIN.GT.0.8) IHOUR = IHOUR + 1 C IF (IHOUR.EQ.24) THEN IDAY = IDAY + 1 IHOUR = 0 END IF C ILEAP = INT(LEAP) IF (IDAY.GT.ILEAP) THEN IYEAR = IYEAR + 1 IDAY = IDAY - ILEAP END IF C RETURN END REAL*8 FUNCTION CONVERT(XVAL) CHARACTER*10 VALUE REAL*8 DEC C C CONVERT CONCATENATED CALENDAR DATE STORED AS REAL (YYDDDHH) INTO DECIMAL YEAR C C 1960-1999 = 60-99 C 2000-2059 = 100-159 C IVAL = INT(XVAL) WRITE(VALUE,'(I7)') IVAL READ(VALUE,'(I2,I3,I2)') IY,ID,IH IF ( IY.LT.0 ) THEN WRITE(6,*) & '***CONVERT***INVALID NEGATIVE YEAR. STOPPING EXECUTION.' STOP END IF CONVERT = DEC(IY,ID,IH) RETURN END REAL*4 FUNCTION CONVERTD(XVAL) CHARACTER*10 VALUE C C CONVERT CONCATENATED CALENDAR DATE STORED AS REAL(YYDDDHH) INTO DECIMAL DAY C C 1960-1999 = 60-99 C 2000-2059 = 100-159 C IVAL = INT(XVAL) WRITE(VALUE,'(I7)') IVAL READ(VALUE,'(I2,I3,I2)') IY,ID,IH IF ( IY.LT.0 ) THEN WRITE(6,*) & '***CONVERT***INVALID NEGATIVE YEAR. STOPPING EXECUTION.' STOP END IF C CONVERTD = FLOAT(ID) + FLOAT(IH)/24.0 C RETURN END REAL*8 FUNCTION DEC(NYR,NDY,NHR) C C CONVERT CALENDAR TIME INTO DECIMAL YEAR, C REQUIRES TO DIGIT YEAR (00-99) AS INPUT C OUTPUT DECIMAL YEAR W/4 DIGIT YEAR. C REAL*8 YEAR,DAY,HOUR C IF ( MOD(NYR,4).EQ.0 ) THEN LEAP = 366 ELSE LEAP = 365 END IF C IF ( NDY.GT.LEAP ) THEN NYR = NYR + 1 NDY = NDY - LEAP END IF C YEAR = DFLOAT(NYR) DAY = DFLOAT(NDY) HOUR= DFLOAT(NHR) DEC = YEAR + (DAY-1.D0 + HOUR/24.D0) / DBLE(DAYS(YEAR)) C IF (NYR.LT.60) THEN DEC = DEC + 2000.0D0 ELSE DEC = DEC + 1900.0D0 END IF C RETURN END REAL*4 FUNCTION DAYS(TIME) C C COMPUTE LENGTH OF YEAR IN DAYS C REAL*8 TIME NYR = INT(TIME) DAYS = 365. IF (MOD(NYR,4).EQ.0) DAYS = 366. C RETURN END SUBROUTINE MCONNECT(FILL,XVAL,YVAL,PTS,DELTA) C C ROUTINE TO CONNECT ADJACENT ARRAY POINTS WITH INDEPENDENT DELTAS C LESS THAN WHILE REMOVING FILL VALUES. C INTEGER*4 PTS LOGICAL*1 PRIME REAL*4 X(2),Y(2),XVAL(1),YVAL(1) C C FILL FILL DATA VALUE C XVAL INDEPENDENT AXIS ARRAY C YVAL DEPENDENT AXIS ARRAY C PTS NUMBER OF ELEMENTS IN PARALLEL ARRAYS XVAL & VAL C DELTA MAXIMUM GAP BETWEEN TWO ADJACENT POINTS TO BE CONNECTED C PRIME = .FALSE. IPT = 0 N = PTS - 1 DO I = 1,N IF ( YVAL(I).NE.FILL ) THEN X(1) = XVAL(I) Y(1) = YVAL(I) PRIME = .TRUE. END IF IF ( YVAL(I+1).NE.FILL .AND. PRIME ) THEN X(2) = XVAL(I+1) Y(2) = YVAL(I+1) DIFF = X(2) - X(1) IF ( DIFF.LT.DELTA ) THEN CALL MGOCONNECT(X,Y,2) ELSE CALL MGORELOCATE(XVAL(I+1),YVAL(I+1)) CALL MGOPOINT(10,3) END IF IPT = IPT + 1 X(1) = X(2) Y(1) = Y(2) END IF END DO C RETURN END REAL*8 FUNCTION REALTIME(TIME) C C CONVERT INTEGER CALENDAR TIME INTO DECIMAL YEAR REAL TIME. C INTEGER*2 TIME(6) REAL*8 DAYS C DAYS = 365.0D0 IF (MOD(TIME(1),4).EQ.0) DAYS = 366.0D0 REALTIME = DBLE(TIME(1)) + & DBLE(TIME(2)-1)/DAYS + & DBLE(TIME(3))/24.0D0/DAYS + & DBLE(TIME(4))/60.0D0/24.0D0/DAYS + & DBLE(TIME(5))/60.0D0/60.0D0/24.0D0/DAYS + & DBLE(TIME(6))/1000.0D0/60.0D0/60.0D0/24.0D0/DAYS C C ASSUME 2 DIGIT YEAR. ANY YEAR BEFORE VOYAGER LAUNCH (77) IS INTO NEXT C CENTURY. C IF (TIME(1).LT.77) REALTIME = REALTIME + 100.0D0 C RETURN END