1!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2! Copyright 2010.  Los Alamos National Security, LLC. This material was    !
3! produced under U.S. Government contract DE-AC52-06NA25396 for Los Alamos !
4! National Laboratory (LANL), which is operated by Los Alamos National     !
5! Security, LLC for the U.S. Department of Energy. The U.S. Government has !
6! rights to use, reproduce, and distribute this software.  NEITHER THE     !
7! GOVERNMENT NOR LOS ALAMOS NATIONAL SECURITY, LLC MAKES ANY WARRANTY,     !
8! EXPRESS OR IMPLIED, OR ASSUMES ANY LIABILITY FOR THE USE OF THIS         !
9! SOFTWARE.  If software is modified to produce derivative works, such     !
10! modified software should be clearly marked, so as not to confuse it      !
11! with the version available from LANL.                                    !
12!                                                                          !
13! Additionally, this program is free software; you can redistribute it     !
14! and/or modify it under the terms of the GNU General Public License as    !
15! published by the Free Software Foundation; version 2.0 of the License.   !
16! Accordingly, this program is distributed in the hope that it will be     !
17! useful, but WITHOUT ANY WARRANTY; without even the implied warranty of   !
18! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General !
19! Public License for more details.                                         !
20!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
21
22MODULE TIMER_MOD
23
24  IMPLICIT NONE
25  SAVE
26
27  INTEGER :: TSTART_CLOCK, TSTOP_CLOCK, TCLOCK_RATE, TCLOCK_MAX
28  INTEGER :: TX, NUM_TIMERS
29  INTEGER :: LATTE_TIMER, DENSE2SPARSE_TIMER, DMBUILD_TIMER, SPARSE2DENSE_TIMER
30  INTEGER :: SP2ALL_TIMER, SP2SPARSE_TIMER
31  INTEGER, ALLOCATABLE :: TSTART(:), TTOTAL(:), TCOUNT(:)
32  REAL, ALLOCATABLE :: TAVG(:), TSUM(:), TPERCENT(:)
33  CHARACTER(LEN=20), ALLOCATABLE :: TNAME(:)
34
35CONTAINS
36
37  ! Initialize timers
38  !
39  FUNCTION INIT_TIMER()
40
41    INTEGER :: I, INIT_TIMER
42
43    NUM_TIMERS = 6
44
45    IF(.NOT.ALLOCATED(TSTART)) ALLOCATE(TSTART(NUM_TIMERS), TTOTAL(NUM_TIMERS), TCOUNT(NUM_TIMERS))
46    IF(.NOT.ALLOCATED(TNAME)) ALLOCATE(TNAME(NUM_TIMERS))
47    IF(.NOT.ALLOCATED(TAVG))THEN
48       ALLOCATE(TAVG(NUM_TIMERS),TSUM(NUM_TIMERS),TPERCENT(NUM_TIMERS))
49    ENDIF
50
51    ! Timer handles, names, and counters
52    LATTE_TIMER = 1
53    SP2ALL_TIMER = 2
54    SP2SPARSE_TIMER = 3
55    DENSE2SPARSE_TIMER = 4
56    DMBUILD_TIMER = 5
57    SPARSE2DENSE_TIMER = 6
58
59    TNAME(LATTE_TIMER) = "LATTE"
60    TNAME(SP2ALL_TIMER) = "Sp2All"
61    TNAME(SP2SPARSE_TIMER) = "  Sp2Sparse"
62    TNAME(DENSE2SPARSE_TIMER) = "    Dense2Sparse"
63    TNAME(DMBUILD_TIMER) = "    DMBuild"
64    TNAME(SPARSE2DENSE_TIMER) = "  Sparse2Dense"
65
66    TTOTAL = 0
67    TCOUNT = 0
68
69    INIT_TIMER = NUM_TIMERS
70
71  END FUNCTION INIT_TIMER
72
73  ! Done with timers
74  !
75  FUNCTION SHUTDOWN_TIMER()
76
77    INTEGER :: SHUTDOWN_TIMER
78
79    DEALLOCATE(TSTART, TTOTAL, TCOUNT)
80    DEALLOCATE(TNAME)
81
82    SHUTDOWN_TIMER = NUM_TIMERS
83
84  END FUNCTION SHUTDOWN_TIMER
85
86  ! Start Timing
87  !
88  FUNCTION START_TIMER(ITIMER)
89
90    INTEGER :: ITIMER, START_TIMER
91
92    CALL SYSTEM_CLOCK(TSTART_CLOCK, TCLOCK_RATE, TCLOCK_MAX)
93    TSTART(ITIMER) = TSTART_CLOCK
94
95    START_TIMER = TSTART_CLOCK
96
97  END FUNCTION START_TIMER
98
99  ! Stop timing
100  !
101  FUNCTION STOP_TIMER(ITIMER)
102
103    INTEGER :: ITIMER, TDELTA, STOP_TIMER
104
105    CALL SYSTEM_CLOCK(TSTOP_CLOCK, TCLOCK_RATE, TCLOCK_MAX)
106    TDELTA = TSTOP_CLOCK - TSTART(ITIMER)
107    TTOTAL(ITIMER) = TTOTAL(ITIMER) + TDELTA
108    TCOUNT(ITIMER) = TCOUNT(ITIMER) + 1
109
110    STOP_TIMER = TSTOP_CLOCK
111
112  END FUNCTION STOP_TIMER
113
114  ! Print performance results
115  !
116  FUNCTION TIMER_RESULTS()
117
118    INTEGER :: I, TIMER_RESULTS
119
120    PRINT *, ""
121    WRITE(6,*) "Timer                 # Calls  Avg/Call (s)     Total (s)       % Time"
122    PRINT *, ""
123
124    DO I = 1, NUM_TIMERS
125
126       IF (TCOUNT(I) .GT. 0) THEN
127
128          TAVG(I) = (FLOAT(TTOTAL(I))/FLOAT(TCLOCK_RATE))/FLOAT(TCOUNT(I))
129          TSUM(I) = FLOAT(TTOTAL(I))/FLOAT(TCLOCK_RATE)
130          TPERCENT(I) = (TSUM(I) / TSUM(1)) * 100.0
131
132          WRITE(6,10) TNAME(I), TCOUNT(I), TAVG(I), TSUM(I), TPERCENT(I)
13310        FORMAT(A25, I4, 3G16.6)
134       ENDIF
135
136    ENDDO
137
138    TIMER_RESULTS = NUM_TIMERS
139
140  END FUNCTION TIMER_RESULTS
141
142  ! Print a tag time and date
143  !
144  SUBROUTINE TIMEDATE_TAG(TAG)
145    CHARACTER(LEN=*) :: TAG
146    INTEGER :: VALUES(8)
147
148    CALL DATE_AND_TIME(VALUES=VALUES)
149
150    WRITE(*,'(A2,1X,A,1X,I2,A1,I2,2X,A2,1X,I2,A1,I2,A1,I4)') " #",TRIM(TAG),&
151         & VALUES(5),":",VALUES(6),&
152         & "on",VALUES(2),"/",VALUES(3),"/",VALUES(1)
153
154  END SUBROUTINE TIMEDATE_TAG
155
156  ! Get the actual time in mls
157  !
158  FUNCTION TIME_MLS()
159    REAL(8) :: TIME_MLS
160    INTEGER :: TIMEVECTOR(8)
161
162    TIME_MLS = 0.0d0
163    CALL DATE_AND_TIME(VALUES=TIMEVECTOR)
164    TIME_MLS=TIMEVECTOR(5)*60.0d0*60.0d0*1000.0d0 + TIMEVECTOR(6)*60.0d0*1000.0d0 &
165       & + TIMEVECTOR(7)*1000.0d0 + TIMEVECTOR(8)
166
167  END FUNCTION TIME_MLS
168
169
170END MODULE TIMER_MOD
171