153 lines
4.8 KiB
Plaintext
153 lines
4.8 KiB
Plaintext
! Fortran Time Module
|
|
!
|
|
! To Use:
|
|
! 1) declare a ClockTime variable: type (ClockTime) :: Timer
|
|
! 2) Set a beginning Time: call set(Timer)
|
|
! 3a) Print Elapsed Time: printTime(Timer)
|
|
! 3b) Print Remaining Time: printRemainingTime(Timer,ratio)
|
|
! 3c) Predict Completion Time: predict(Timer,ratio)
|
|
!
|
|
! Copyright (c) 2008 Charles O'Neill
|
|
!
|
|
! Permission is hereby granted, free of charge, to any person
|
|
! obtaining a copy of this software and associated documentation
|
|
! files (the "Software"), to deal in the Software without
|
|
! restriction, including without limitation the rights to use,
|
|
! copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
! copies of the Software, and to permit persons to whom the
|
|
! Software is furnished to do so, subject to the following
|
|
! conditions:
|
|
!
|
|
! The above copyright notice and this permission notice shall be
|
|
! included in all copies or substantial portions of the Software.
|
|
!
|
|
! THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
! EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
|
! OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
! NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
|
! HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
|
! WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
! FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
|
! OTHER DEALINGS IN THE SOFTWARE.
|
|
|
|
module ClockTiming
|
|
implicit none
|
|
|
|
! Integer Precision
|
|
integer, parameter :: IS = 2
|
|
! Real Single Precision
|
|
integer, parameter :: SP = 4 ! 4 gives 32 bits
|
|
! Real Double Precision
|
|
integer, parameter :: DP = 8 ! 4 gives 32 bits, 8 gives 64 bits (double)
|
|
|
|
type ClockTime
|
|
private
|
|
real(SP) :: time_begin
|
|
end type
|
|
|
|
! Time Constants
|
|
real(SP),parameter :: SecondsPerMinutes = 60.0
|
|
real(SP),parameter :: MinutesPerHour = 60.0
|
|
real(SP),parameter :: HoursPerDay = 24.0
|
|
|
|
real(SP),parameter :: PrintMaxSeconds = 90.0d0
|
|
real(SP),parameter :: PrintMaxMinutes = SecondsPerMinutes*MinutesPerHour
|
|
real(SP),parameter :: PrintMaxHours = SecondsPerMinutes*MinutesPerHour*HoursPerDay
|
|
|
|
!.................................
|
|
! Public Interfaces to ClockTime Data
|
|
|
|
! Resets timer to zero
|
|
interface set
|
|
module procedure setTime
|
|
end interface
|
|
|
|
! Returns elapsed time
|
|
interface get
|
|
module procedure getTime
|
|
end interface
|
|
|
|
! Prints total elapsed time
|
|
interface printTime
|
|
module procedure printTime
|
|
end interface
|
|
|
|
! Prints total remaining time
|
|
interface printRemainingTime
|
|
module procedure PrintTimeSecondsHoursDays
|
|
end interface
|
|
|
|
! Predicts total elapsed time
|
|
interface predict
|
|
module procedure PredictTime
|
|
end interface
|
|
|
|
private :: setTime, getTime, PredictTime, PrintTimeSecondsHoursDays
|
|
|
|
contains
|
|
|
|
! Resets timer to zero
|
|
subroutine setTime(this)
|
|
implicit none
|
|
type (ClockTime) :: this
|
|
! CPU_TIME is the system's clock time function
|
|
CALL CPU_TIME ( this%time_begin )
|
|
end subroutine setTime
|
|
|
|
! Returns elapsed time
|
|
function getTime(this)
|
|
implicit none
|
|
real(SP) :: getTime, time_end
|
|
type (ClockTime) :: this
|
|
CALL CPU_TIME ( time_end )
|
|
getTime=time_end - this%time_begin
|
|
end function getTime
|
|
|
|
! Prints total elapsed time
|
|
subroutine printTime(this)
|
|
implicit none
|
|
type (ClockTime) :: this
|
|
write(*,'(/ '' Operation time '', f8.3, '' seconds.'')') getTime(this)
|
|
end subroutine printTime
|
|
|
|
! Predicts remaining time before completion
|
|
function PredictTime(this,CompletionRatio)
|
|
implicit none
|
|
real(SP) :: PredictTime
|
|
type (ClockTime) :: this
|
|
real(SP) :: CompletionRatio
|
|
! Definitions:
|
|
! CompletionRatio = Ratio of Completed Tasks to Total Tasks
|
|
! Time_Remaining = Time_TotalPredicted - Time_elapsed
|
|
! = Time_elapsed/CompletionRatio*(1-CompletionRatio)
|
|
PredictTime = getTime(this)*(1-CompletionRatio)/CompletionRatio
|
|
end function PredictTime
|
|
|
|
! Pretty Prints remaining time
|
|
subroutine PrintTimeSecondsHoursDays(this, PredictionRatio)
|
|
! Choose to output either seconds, hours or days depending on magnitude
|
|
implicit none
|
|
type (ClockTime) :: this
|
|
real(SP) :: PredictionRatio
|
|
real(SP) :: Seconds
|
|
|
|
Seconds = PredictTime(this,PredictionRatio)
|
|
|
|
if(Seconds<PrintMaxSeconds)then
|
|
! Seconds
|
|
write(*,'( f5.1 , '' seconds'')',advance='no') Seconds
|
|
elseif(Seconds<PrintMaxMinutes)then
|
|
! Minutes
|
|
write(*,'( f5.1 , '' minutes'')',advance='no') Seconds/SecondsPerMinutes
|
|
elseif(Seconds<PrintMaxHours)then
|
|
! Hours
|
|
write(*,'( f5.1 , '' hours'')',advance='no') Seconds/SecondsPerMinutes/MinutesPerHour
|
|
else
|
|
! Days
|
|
write(*,'( f5.1 , '' days'')',advance='no') Seconds/SecondsPerMinutes/MinutesPerHour/HoursPerDay
|
|
endif
|
|
|
|
end subroutine
|
|
|
|
end module
|