REAL FUNCTION WTIME() IMPLICIT NONE ! ! RETURN WALL TIME BASED ON SYSTEM_CLOCK. ! ! WILL FAIL IF THE COUNT IS EVER NEGATIVE. ! STANDARD SAYS THAT IT IS AWAYS NON-NEGATIVE IF A CLOCK EXISTS. ! REAL, PARAMETER :: ZERO=0.0, ONE=1.0 INTEGER COUNT, MCOUNT, RATE REAL OFFSEC, OFFSET, PERSEC SAVE OFFSEC, OFFSET, PERSEC INTEGER ICOUNT, NCOUNT, IOVER, LCOUNT SAVE ICOUNT, NCOUNT, IOVER, LCOUNT DATA IOVER, LCOUNT / -1, -1 / CALL SYSTEM_CLOCK(COUNT) IF (COUNT.LT.LCOUNT) THEN ! ! COUNT IS SUPPOSED TO BE NON-DECREASING EXCEPT WHEN IT WRAPS, ! BUT SOME IMPLEMENTATIONS DON''T DO THIS. SO IGNORE ANY ! DECREASE OF LESS THAN ONE PERCENT OF THE RANGE. ! IF (LCOUNT-COUNT.LT.NCOUNT) THEN COUNT = LCOUNT ELSE IOVER = IOVER + 1 OFFSET = OFFSET + OFFSEC ENDIF ENDIF LCOUNT = COUNT IF (IOVER.EQ.0) THEN ! ! FIRST CYCLE, FOR ACCURACY WITH 64-BIT COUNTS. ! WTIME = (COUNT - ICOUNT) * PERSEC ELSEIF (IOVER.GT.0) THEN ! ! ALL OTHER CYCLES. ! WTIME = COUNT * PERSEC + OFFSET ELSE ! ! INITIALIZATION. ! CALL SYSTEM_CLOCK(ICOUNT, RATE, MCOUNT) PERSEC = ONE / RATE NCOUNT = MCOUNT / 100 OFFSEC = MCOUNT * PERSEC OFFSET = -ICOUNT * PERSEC IOVER = 0 WTIME = ZERO ENDIF END FUNCTION WTIME