SUBROUTINE NEWTIM(IOLDT,NEWT,IDIF,MSGUN) C This subroutine creates a new time which is IDIF C centiseconds different from the old time. C IS date time units format; i.e. IOLDT & NEWT have 4 elements: C yyyy, mmdd, hhmm, and centiseconds. IDIF is the number of C centiseconds difference. C NOTES: C - Only absolute idif's less than 365 days are allowed caurrently. C - Times >= 24__ are always converted to 00__; i.e. the C largest hhmm returned will be 2359. C - MSGUN is the fortran unit number to print any diagnostic C messages. C - IDIF is double precision to accomodate short word (32 bit) C machines. C Formal argument declarations: DOUBLE PRECISION IDIF DIMENSION IOLDT(4),NEWT(4) C Local declarations DOUBLE PRECISION NDIFDA , NDIFHR , NDIFMI DIMENSION LMSUM(12),LYS(12),NLS(12),LENM(12) SAVE LYS,NLS,LENM DATA NLS / 0,31,59,90,120,151,181,212,243,273,304,334/ DATA LYS / 0,31,60,91,121,152,182,213,244,274,305,335/ DATA LENM/31,28,31,30 ,31, 30, 31, 31, 30, 31, 30, 31/ IF (DABS(IDIF) .GT. 3153600000D0) GO TO 9200 IF ( IDIF .LT. 0D0) THEN M6000 = 6000 M60 = 60 M24 = 24 ISGN = -1 ELSE M6000 = -6000 M60 = -60 M24 = -24 ISGN = 1 ENDIF C Reset arrays for leap year: IF (MOD(IOLDT(1),4) .EQ. 0) THEN DO 10 I=1,12 10 LMSUM(I)=LYS(I) LENM(2)=29 LASTDA=366 ELSE DO 20 I=1,12 20 LMSUM(I)=NLS(I) LENM(2)=28 LASTDA=365 ENDIF C Determine # of days, hours, mins and seconds to be added IDIFDA = IDINT (IDIF / 8640000D0) NDIFDA = DBLE (IDIFDA) IDIFHR = IDINT((IDIF-NDIFDA*8640000D0) / 360000D0) NDIFHR = DBLE (IDIFHR) IDIFMI = IDINT((IDIF-NDIFDA*8640000D0-NDIFHR*360000D0)/6000D0) NDIFMI = DBLE (IDIFMI) IDIFCS = IDINT((IDIF-NDIFDA*8640000D0-NDIFHR*360000D0- + NDIFMI*6000D0)) C Convert old time to day # of year & reformat hhmm IOMO = IOLDT(2)/100 IODA = IOLDT(2)-IOMO*100 IOJD = LMSUM(IOMO)+IODA IOHR = IOLDT(3)/100 IOMI = IOLDT(3)-IOHR*100 C Now build new time starting with centi-seconds: NEWCS = IOLDT(4) + IDIFCS ICARRY = 0 IF (NEWCS .GE. 6000 .OR. NEWCS .LT. 0) THEN NEWCS = NEWCS + M6000 ICARRY = ISGN ENDIF NEWT(4) = NEWCS C Make new minutes & hours NEWMI = IOMI + IDIFMI + ICARRY ICARRY = 0 IF (NEWMI .GE. 60 .OR. NEWMI .LT. 0) THEN NEWMI = NEWMI + M60 ICARRY = ISGN ENDIF NEWHR = IOHR + IDIFHR + ICARRY ICARRY = 0 IF (NEWHR .GE. 24 .OR. NEWHR .LT. 0) THEN NEWHR = NEWHR+M24 ICARRY = ISGN ENDIF NEWT(3) = NEWHR*100 + NEWMI C Make new day number of year NEWJD = IOJD + IDIFDA + ICARRY NEWT(1) = IOLDT(1) IF (NEWJD .GT. LASTDA .OR. NEWJD .LE. 0) THEN NEWT(1) = IOLDT(1) + ISGN IF (IDIF .GE. 0D0) NEWJD = NEWJD-LASTDA C Reset arrays for leap year: IF (MOD(NEWT(1),4) .EQ. 0) THEN DO 11 I=1,12 11 LMSUM(I) = LYS(I) LENM(2) = 29 LASTDA = 366 ELSE DO 21 I=1,12 21 LMSUM(I) = NLS(I) LENM(2) = 28 LASTDA = 365 ENDIF IF (IDIF .LT. 0D0) NEWJD = NEWJD + LASTDA ENDIF C Now convert day number of year to mmdd DO 30 I=1,12 ITEST = NEWJD - LMSUM(I) IF (ITEST .GT. 0 .AND. ITEST .LE. LENM(I)) GO TO 40 30 CONTINUE STOP 40 NEWMO = I NEWDA = NEWJD - LMSUM(I) NEWT(2) = NEWMO*100 + NEWDA RETURN 9200 WRITE(MSGUN,'(''0Subroutine NEWTIM has not been tested for '', + ''making new times more'',/, + '' than 365 days from the old time.'')') STOP END