The main documentation of the Initialize_Timer Procedure contains additional explanation of this code listing.
subroutine Initialize_Timer (Timer, Name, status)
! Use association information.
use Caesar_Numbers_Module, only: zero
! Input variables.
type(character,*), intent(in) :: Name ! Timer name.
! Output variables.
type(Timer_type), intent(out) :: Timer ! Timer to be initialized.
type(Status_type), intent(out), optional :: status ! Exit status.
! Internal variables.
type(Status_type), dimension(5) :: allocate_status ! Allocation Status.
type(Status_type) :: consolidated_status ! Consolidated Status.
!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
! Verify requirements.
VERIFY(.not.Valid_State(Timer),5) ! Timer is not valid.
VERIFY(Valid_State(Name),5) ! Name is valid.
! Allocations and initializations.
call Initialize (allocate_status)
call Initialize (consolidated_status)
call Initialize (Timer%CPU_Time%Start, allocate_status(1))
call Initialize (Timer%CPU_Time%Statistics, 'CPU Time', &
allocate_status(2))
call Initialize (Timer%Wall_Clock_Time%Start, allocate_status(3))
call Initialize (Timer%Wall_Clock_Time%Statistics, 'Wall Clock Time', &
allocate_status(4))
call Initialize (Timer%Running, allocate_status(5))
! Set up internals.
Timer%Name = Name
! Make sure that initial values are correct.
Timer%CPU_Time%Start = zero
Timer%Wall_Clock_Time%Start = zero
Timer%Running = .false.
! Process status variables.
consolidated_status = allocate_status
if (PRESENT(status)) then
WARN_IF(Error(consolidated_status), 5)
status = consolidated_status
else
VERIFY(Normal(consolidated_status), 5)
end if
call Finalize (consolidated_status)
call Finalize (allocate_status)
! Set initialization flag.
call Initialize (Timer%Initialized, 0)
! Verify guarantees.
VERIFY(Valid_State(Timer),5) ! Timer is now valid.
return
end subroutine Initialize_Timer