/[MITgcm]/MITgcm/eesupp/src/timers.F
ViewVC logotype

Annotation of /MITgcm/eesupp/src/timers.F

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.18 - (hide annotations) (download)
Thu Jan 13 00:10:38 2005 UTC (19 years, 4 months ago) by ce107
Branch: MAIN
CVS Tags: checkpoint57g_pre, checkpoint57g_post, checkpoint57d_post, checkpoint57f_post, checkpoint57h_pre, checkpoint57h_post, checkpoint57c_post, checkpoint57c_pre, checkpoint57e_post, eckpoint57e_pre, checkpoint57h_done, checkpoint57f_pre
Changes since 1.17: +21 -16 lines
o Fixed timers for AIX and UNICOS systems:
  To get correct behaviour compile with -DTARGET_AIX for AIX systems (SP3,
  SP4 and other IBM systems), -DTARGET_T3E for Cray T3E and
  -DTARGET_CRAY_VECTOR for any Cray vector systems.

o -DTARGET_AIX replaced the less generic -DTARGET_PWR3

o If you want to use MPI_Wtime() for wallclock time use -DUSE_MPI_WTIME

o Fixed other eesupp routines that AIX systems required a -DTARGET_PWR3
  and in some cases (erroneously when it came to threading) -DTARGET_SGI

1 ce107 1.18 C $Header: /u/gcmpack/MITgcm/eesupp/src/timers.F,v 1.17 2004/06/30 00:58:06 cnh Exp $
2 edhill 1.13 C $Name: $
3 adcroft 1.1
4     #include "CPP_EEOPTIONS.h"
5    
6     C-- File utils.F: General purpose support routines
7     C-- Contents
8     C-- TIMER_INDEX - Returns index associated with timer name.
9     C-- M TIMER_CONTROL - Implements timer functions for given machine.
10     C-- TIMER_PRINT - Print CPU timer statitics.
11     C-- TIMER_PRINTALL - Prints all CPU timers statistics.
12     C-- TIMER_START - Starts CPU timer for code section.
13     C-- TIMER_STOP - Stop CPU tier for code section.
14     C-- Routines marked "M" contain specific machine dependent code.
15     C-- Routines marked "U" contain UNIX OS calls.
16    
17 heimbach 1.12 CGG Modified following A. Biastoch for use with SP3. Is backwards
18     CGG compatible. G. Gebbie, gebbie@mit.edu, 20 Oct 2001, Scripps.
19    
20 cnh 1.10 CBOP
21     C !ROUTINE: TIMER_INDEX
22    
23     C !INTERFACE:
24 adcroft 1.1 INTEGER FUNCTION TIMER_INDEX (
25     I name,timerNames,maxTimers,nTimers )
26 adcroft 1.5 IMPLICIT NONE
27 cnh 1.10
28     C !DESCRIPTION:
29     C *==========================================================*
30 edhill 1.16 C | FUNCTION TIMER\_INDEX
31 cnh 1.10 C | o Timing support routine.
32     C *==========================================================*
33     C | Return index in timer data structure of timer named
34     C | by the function argument "name".
35     C *==========================================================*
36    
37     C !INPUT/OUTPUT PARAMETERS:
38     C == Routine arguements ==
39     C maxTimers :: Total number of timers allowed
40     C nTimers :: Current number of timers
41     C name :: Name of timer to find
42     C timerNames :: List of valid timer names
43 adcroft 1.1 INTEGER maxTimers
44     INTEGER nTimers
45     CHARACTER*(*) name
46     CHARACTER*(*) timerNames(maxTimers)
47 cnh 1.10
48     C !LOCAL VARIABLES:
49     C == Local variables ==
50     C I :: Index variable
51 adcroft 1.1 INTEGER I
52 cnh 1.10 CEOP
53 adcroft 1.1 C
54     TIMER_INDEX = 0
55     IF ( name .EQ. ' ' ) THEN
56     TIMER_INDEX = -1
57     ELSE
58     DO 10 I = 1, nTimers
59     IF ( name .NE. timerNames(I) ) GOTO 10
60     TIMER_INDEX = I
61     GOTO 11
62     10 CONTINUE
63     11 CONTINUE
64     ENDIF
65     RETURN
66     END
67    
68 cnh 1.10 CBOP
69     C !ROUTINE: TIMER_CONTROL
70    
71     C !INTERFACE:
72 adcroft 1.1 SUBROUTINE TIMER_CONTROL ( name , action , callProc , myThreadId )
73 cnh 1.10 IMPLICIT NONE
74    
75     C !DESCRIPTION:
76     C *==========================================================*
77 edhill 1.16 C | SUBROUTINE TIMER\_CONTROL |
78 adcroft 1.1 C | o Timing routine. |
79 cnh 1.10 C *==========================================================*
80 adcroft 1.1 C | User callable interface to timing routines. Timers are |
81     C | created, stopped, started and queried only through this |
82     C | rtouine. |
83 cnh 1.10 C *==========================================================*
84    
85     C !USES:
86 adcroft 1.1 #include "SIZE.h"
87     #include "EEPARAMS.h"
88     #include "EESUPPORT.h"
89     INTEGER TIMER_INDEX
90     INTEGER IFNBLNK
91     INTEGER ILNBLNK
92     EXTERNAL TIMER_INDEX
93     EXTERNAL IFNBLNK
94     EXTERNAL ILNBLNK
95 cnh 1.10
96     C !INPUT/OUTPUT PARAMETERS:
97     C name :: name of the timer
98     C action :: operation to perform with this timer
99     C callProc :: procedure calling this routine
100     C myThreadId :: instance number of this thread
101     CHARACTER*(*) name
102     CHARACTER*(*) action
103     CHARACTER*(*) callProc
104     INTEGER myThreadId
105 adcroft 1.1 C
106 cnh 1.10 C !LOCAL VARIABLES:
107     C maxTimers :: Total numer of timer allowed
108     C maxString :: Max length of a timer name
109 adcroft 1.1 INTEGER maxTimers
110     INTEGER maxString
111     PARAMETER ( maxTimers = 40 )
112     PARAMETER ( maxString = 80 )
113 cnh 1.10 C timerStarts :: Timer counters for each timer and each thread
114     C timerStops
115     C timerUser
116     C timerWall
117     C timerSys
118     C timerT0User
119     C timerT0Wall
120     C timerT0Sys
121     C timerStatus :: START/STOP/RUNNING Status of the timer
122     C timerNameLen :: Length of timer name
123     C timerNames :: Table of timer names
124     C nTimers :: Number of active timers
125 adcroft 1.1 INTEGER timerStarts( maxTimers , MAX_NO_THREADS)
126     SAVE timerStarts
127     INTEGER timerStops ( maxTimers , MAX_NO_THREADS)
128     SAVE timerStops
129     Real*8 timerUser ( maxTimers , MAX_NO_THREADS)
130     SAVE timerUser
131     Real*8 timerWall ( maxTimers , MAX_NO_THREADS)
132     SAVE timerWall
133     Real*8 timerSys ( maxTimers , MAX_NO_THREADS)
134     SAVE timerSys
135     Real*8 timerT0User( maxTimers , MAX_NO_THREADS)
136     SAVE timerT0User
137     Real*8 timerT0Wall( maxTimers , MAX_NO_THREADS)
138     SAVE timerT0Wall
139     Real*8 timerT0Sys ( maxTimers , MAX_NO_THREADS)
140     SAVE timerT0Sys
141     INTEGER timerStatus( maxTimers , MAX_NO_THREADS)
142     SAVE timerStatus
143     INTEGER timerNameLen( maxTimers , MAX_NO_THREADS)
144     SAVE timerNameLen
145     CHARACTER*(maxString) timerNames( maxTimers , MAX_NO_THREADS)
146     SAVE timerNames
147     INTEGER nTimers(MAX_NO_THREADS)
148     CHARACTER*(maxString) tmpName
149     CHARACTER*(maxString) tmpAction
150     INTEGER iTimer
151     INTEGER ISTART
152     INTEGER IEND
153     INTEGER STOPPED
154     PARAMETER ( STOPPED = 0 )
155     INTEGER RUNNING
156     PARAMETER ( RUNNING = 1 )
157     CHARACTER*(*) STOP
158     PARAMETER ( STOP = 'STOP' )
159     CHARACTER*(*) START
160     PARAMETER ( START = 'START' )
161     CHARACTER*(*) PRINT
162     PARAMETER ( PRINT = 'PRINT' )
163     CHARACTER*(*) PRINTALL
164     PARAMETER ( PRINTALL = 'PRINTALL' )
165     INTEGER I
166     Real*8 userTime
167     Real*8 systemTime
168     Real*8 wallClockTime
169     CHARACTER*(MAX_LEN_MBUF) msgBuffer
170     DATA nTimers /MAX_NO_THREADS*0/
171     SAVE nTimers
172 cnh 1.10 CEOP
173 adcroft 1.1 C
174     ISTART = IFNBLNK(name)
175     IEND = ILNBLNK(name)
176     IF ( IEND - ISTART + 1 .GT. maxString ) GOTO 901
177     IF ( ISTART .NE. 0 ) THEN
178     tmpName = name(ISTART:IEND)
179     CALL UCASE( tmpName )
180     ELSE
181     tmpName = ' '
182     ENDIF
183     ISTART = IFNBLNK(action)
184     IEND = ILNBLNK(action)
185     IF ( ISTART .EQ. 0 ) GOTO 902
186     IF ( IEND - ISTART + 1 .GT. maxString ) GOTO 903
187     tmpAction = action(ISTART:IEND)
188     CALL UCASE( tmpAction )
189     C
190 cnh 1.4 iTimer=TIMER_INDEX(tmpName,timerNames(1,myThreadId),
191     & maxTimers,nTimers(myThreadId))
192 adcroft 1.1 C
193     IF ( tmpAction .EQ. START ) THEN
194     IF ( iTimer .EQ. 0 ) THEN
195     IF ( nTimers(myThreadId) .EQ. maxTimers ) GOTO 904
196     nTimers(myThreadId) = nTimers(myThreadId) + 1
197     iTimer = nTimers(myThreadId)
198     timerNames(iTimer,myThreadId) = tmpName
199 cnh 1.4 timerNameLen(iTimer,myThreadId) =
200     & ILNBLNK(tmpName)-IFNBLNK(tmpName)+1
201 adcroft 1.1 timerUser(iTimer,myThreadId) = 0.
202     timerSys (iTimer,myThreadId) = 0.
203     timerWall(iTimer,myThreadId) = 0.
204     timerStarts(iTimer,myThreadId) = 0
205     timerStops (iTimer,myThreadId) = 0
206     timerStatus(iTimer,myThreadId) = STOPPED
207     ENDIF
208     IF ( timerStatus(iTimer,myThreadId) .NE. RUNNING ) THEN
209     CALL TIMER_GET_TIME( userTime, systemTime, wallClockTime )
210     timerT0User(iTimer,myThreadId) = userTime
211     timerT0Sys(iTimer,myThreadId) = systemTime
212     timerT0Wall(iTimer,myThreadId) = wallClockTime
213     timerStatus(iTimer,myThreadId) = RUNNING
214 cnh 1.4 timerStarts(iTimer,myThreadId) =
215     & timerStarts(iTimer,myThreadId)+1
216 adcroft 1.1 ENDIF
217     ELSEIF ( tmpAction .EQ. STOP ) THEN
218     IF ( iTimer .EQ. 0 ) GOTO 905
219     IF ( timerStatus(iTimer,myThreadId) .EQ. RUNNING ) THEN
220     CALL TIMER_GET_TIME( userTime, systemTime, wallClockTime )
221 cnh 1.4 timerUser(iTimer,myThreadId) =
222     & timerUser(iTimer,myThreadId) +
223 adcroft 1.1 & userTime -
224     & timerT0User(iTimer,myThreadId)
225 cnh 1.4 timerSys (iTimer,myThreadId) =
226     & timerSys(iTimer,myThreadId) +
227 adcroft 1.1 & systemTime -
228     & timerT0Sys(iTimer,myThreadId)
229 cnh 1.4 timerWall(iTimer,myThreadId) =
230     & timerWall(iTimer,myThreadId) +
231 adcroft 1.1 & wallClockTime -
232     & timerT0Wall(iTimer,myThreadId)
233     timerStatus(iTimer,myThreadId) = STOPPED
234 cnh 1.4 timerStops (iTimer,myThreadId) =
235     & timerStops (iTimer,myThreadId)+1
236 adcroft 1.1 ENDIF
237     ELSEIF ( tmpAction .EQ. PRINT ) THEN
238     IF ( iTimer .EQ. 0 ) GOTO 905
239     WRITE(msgBuffer,*)
240     & ' Seconds in section "',
241 cnh 1.4 & timerNames(iTimer,myThreadId)(1:timerNameLen(iTimer,myThreadId))
242     & ,'":'
243     CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
244     & SQUEEZE_RIGHT,myThreadId)
245     WRITE(msgBuffer,*) ' User time:',
246     & timerUser(iTimer,myThreadId)
247     CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
248     & SQUEEZE_RIGHT,myThreadId)
249     WRITE(msgBuffer,*) ' System time:',
250     & timerSys(iTimer,myThreadId)
251     CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
252     & SQUEEZE_RIGHT,myThreadId)
253     WRITE(msgBuffer,*) ' Wall clock time:',
254     & timerWall(iTimer,myThreadId)
255     CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
256     & SQUEEZE_RIGHT,myThreadId)
257     WRITE(msgBuffer,*) ' No. starts:',
258     & timerStarts(iTimer,myThreadId)
259     CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
260     & SQUEEZE_RIGHT,myThreadId)
261     WRITE(msgBuffer,*) ' No. stops:',
262     & timerStops(iTimer,myThreadId)
263     CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
264     & SQUEEZE_RIGHT,myThreadId)
265 adcroft 1.1 ELSEIF ( tmpAction .EQ. PRINTALL ) THEN
266     DO 10 I = 1, nTimers(myThreadId)
267     WRITE(msgBuffer,*) ' Seconds in section "',
268 cnh 1.4 & timerNames(I,myThreadId)(1:timerNameLen(I,myThreadId))
269     & ,'":'
270     CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
271     & SQUEEZE_RIGHT,myThreadId)
272     WRITE(msgBuffer,*) ' User time:',
273     & timerUser(I,myThreadId)
274     CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
275     & SQUEEZE_RIGHT,myThreadId)
276     WRITE(msgBuffer,*) ' System time:',
277     & timerSys(I,myThreadId)
278     CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
279     & SQUEEZE_RIGHT,myThreadId)
280     WRITE(msgBuffer,*) ' Wall clock time:',
281     & timerWall(I,myThreadId)
282     CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
283     & SQUEEZE_RIGHT,myThreadId)
284     WRITE(msgBuffer,*) ' No. starts:',
285     & timerStarts(I,myThreadId)
286     CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
287     & SQUEEZE_RIGHT,myThreadId)
288     WRITE(msgBuffer,*) ' No. stops:',
289     & timerStops(I,myThreadId)
290     CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
291     & SQUEEZE_RIGHT,myThreadId)
292 adcroft 1.1 10 CONTINUE
293     ELSE
294     GOTO 903
295     ENDIF
296     C
297     1000 CONTINUE
298     C
299     RETURN
300     901 CONTINUE
301     WRITE(msgBuffer,'(A)')
302     &' '
303 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
304     & SQUEEZE_RIGHT,myThreadId)
305 adcroft 1.1 WRITE(msgBuffer,*)
306     &'*** WARNING WARNING WARNING WARNING WARNING WARNING ***'
307 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
308     & SQUEEZE_RIGHT,myThreadId)
309 adcroft 1.1 WRITE(msgBuffer,*)
310     &'procedure: "',callProc,'".'
311 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
312     & SQUEEZE_RIGHT,myThreadId)
313 adcroft 1.1 WRITE(msgBuffer,*)
314     &'Timer name "',name(ISTART:IEND),'" is invalid.'
315 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
316     & SQUEEZE_RIGHT,myThreadId)
317 adcroft 1.1 WRITE(msgBuffer,*)
318     &' Names must have fewer than',maxString+1,' characters.'
319 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
320     & SQUEEZE_RIGHT,myThreadId)
321 adcroft 1.1 WRITE(msgBuffer,*)
322     &'*******************************************************'
323 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
324     & SQUEEZE_RIGHT,myThreadId)
325 adcroft 1.1 GOTO 1000
326     902 CONTINUE
327     WRITE(msgBuffer,*)
328     &' '
329 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
330     & SQUEEZE_RIGHT,myThreadId)
331 adcroft 1.1 WRITE(msgBuffer,*)
332     &'*** WARNING WARNING WARNING WARNING WARNING WARNING ***'
333 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
334     & SQUEEZE_RIGHT,myThreadId)
335 adcroft 1.1 WRITE(msgBuffer,*)
336     &'procedure: "',callProc,'".'
337 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
338     & SQUEEZE_RIGHT,myThreadId)
339 adcroft 1.1 WRITE(msgBuffer,*)
340     &' No timer action specified.'
341 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
342     & SQUEEZE_RIGHT,myThreadId)
343 adcroft 1.1 WRITE(msgBuffer,*)
344     &' Valid actions are:'
345 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
346     & SQUEEZE_RIGHT,myThreadId)
347 adcroft 1.1 WRITE(msgBuffer,*)
348     &' "START", "STOP", "PRINT" and "PRINTALL".'
349 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
350     & SQUEEZE_RIGHT,myThreadId)
351 adcroft 1.1 WRITE(msgBuffer,*)
352     &'*******************************************************'
353 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
354     & SQUEEZE_RIGHT,myThreadId)
355 adcroft 1.1 GOTO 1000
356     903 CONTINUE
357     WRITE(msgBuffer,*)
358     &' '
359 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
360     & SQUEEZE_RIGHT,myThreadId)
361 adcroft 1.1 WRITE(msgBuffer,*)
362     &'*** WARNING WARNING WARNING WARNING WARNING WARNING ***'
363 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
364     & SQUEEZE_RIGHT,myThreadId)
365 adcroft 1.1 WRITE(msgBuffer,*)
366     &'procedure: "',callProc,'".'
367 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
368     & SQUEEZE_RIGHT,myThreadId)
369 adcroft 1.1 WRITE(msgBuffer,*)
370     &'Timer action"',name(ISTART:IEND),'" is invalid.'
371 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
372     & SQUEEZE_RIGHT,myThreadId)
373 adcroft 1.1 WRITE(msgBuffer,*)
374     &' Valid actions are:'
375 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
376     & SQUEEZE_RIGHT,myThreadId)
377 adcroft 1.1 WRITE(msgBuffer,*)
378     &' "START", "STOP", "PRINT" and "PRINTALL".'
379 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
380     & SQUEEZE_RIGHT,myThreadId)
381 adcroft 1.1 WRITE(msgBuffer,*)
382     &'*******************************************************'
383 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
384     & SQUEEZE_RIGHT,myThreadId)
385 adcroft 1.1 GOTO 1000
386     904 CONTINUE
387     WRITE(msgBuffer,*)
388     &' '
389 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
390     & SQUEEZE_RIGHT,myThreadId)
391 adcroft 1.1 WRITE(msgBuffer,*)
392     &'*** WARNING WARNING WARNING WARNING WARNING WARNING ***'
393 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
394     & SQUEEZE_RIGHT,myThreadId)
395 adcroft 1.1 WRITE(msgBuffer,*)
396     &'procedure: "',callProc,'".'
397 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
398     & SQUEEZE_RIGHT,myThreadId)
399 adcroft 1.1 WRITE(msgBuffer,*)
400     &'Timer "',name(ISTART:IEND),'" cannot be created.'
401 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
402     & SQUEEZE_RIGHT,myThreadId)
403 adcroft 1.1 WRITE(msgBuffer,*)
404     &' Only ',maxTimers,' timers are allowed.'
405 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
406     & SQUEEZE_RIGHT,myThreadId)
407 adcroft 1.1 WRITE(msgBuffer,*)
408     &'*******************************************************'
409 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
410     & SQUEEZE_RIGHT,myThreadId)
411 adcroft 1.1 GOTO 1000
412     905 CONTINUE
413     WRITE(msgBuffer,*)
414     &' '
415 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
416     & SQUEEZE_RIGHT,myThreadId)
417 adcroft 1.1 WRITE(msgBuffer,*)
418     &'*** WARNING WARNING WARNING WARNING WARNING WARNING ***'
419 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
420     & SQUEEZE_RIGHT,myThreadId)
421 adcroft 1.1 WRITE(msgBuffer,*)
422     &'procedure: "',callProc,'".'
423 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
424     & SQUEEZE_RIGHT,myThreadId)
425 adcroft 1.1 WRITE(msgBuffer,*)
426     &'Timer name is blank.'
427 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
428     & SQUEEZE_RIGHT,myThreadId)
429 adcroft 1.1 WRITE(msgBuffer,*)
430     &' A name must be used with "START", "STOP" or "PRINT".'
431 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
432     & SQUEEZE_RIGHT,myThreadId)
433 adcroft 1.1 WRITE(msgBuffer,*)
434     &'*******************************************************'
435 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
436     & SQUEEZE_RIGHT,myThreadId)
437 adcroft 1.1 GOTO 1000
438     END
439    
440 cnh 1.10 CBOP
441     C !ROUTINE: TIMER_GET_TIME
442    
443     C !INTERFACE:
444 adcroft 1.1 SUBROUTINE TIMER_GET_TIME(
445     O userTime,
446     O systemTime,
447     O wallClockTime )
448 adcroft 1.5 IMPLICIT NONE
449 cnh 1.10
450     C !DESCRIPTION:
451     C *==========================================================*
452 edhill 1.16 C | SUBROUTINE TIMER\_GET\_TIME
453 cnh 1.10 C | o Query system timer routines.
454     C *==========================================================*
455     C | Routine returns total elapsed time for program so far.
456     C | Three times are returned that conventionally are used as
457     C | user time, system time and wall-clock time. Not all these
458     C | numbers are available on all machines.
459     C *==========================================================*
460    
461     C !INPUT/OUTPUT PARAMETERS:
462     C userTime :: User time returned
463     C systemTime :: System time returned
464     C wallClockTime :: Wall clock time returned
465 adcroft 1.1 Real*8 userTime
466     Real*8 systemTime
467     Real*8 wallClockTime
468 cnh 1.10
469     C !USES:
470 edhill 1.14 CEH3 This needs to be further cleaned up using a HAVE_CLOC define
471     CEH3 that is diagnosed by genmake
472     CEH3 #ifndef HAVE_FDATE
473 heimbach 1.12 Real*8 system_time, user_time, timenow
474 edhill 1.14 CEH3 #else
475 ce107 1.18 #ifdef TARGET_AIX
476     Real*4 ETIME_
477     EXTERNAL ETIME_
478     #else
479 cnh 1.10 Real*4 ETIME
480 adcroft 1.1 EXTERNAL ETIME
481 ce107 1.18 #endif
482 edhill 1.14 CEH3 #endif
483 cnh 1.10
484     C !LOCAL VARIABLES:
485     C ACTUAL, TARRAY, :: Temps. to hold times
486     C wTime
487     Real*4 ACTUAL, TARRAY(2)
488 adcroft 1.1 Real*8 wtime
489 cnh 1.10 CEOP
490    
491 cnh 1.4 C Real*8 MPI_Wtime
492     C EXTERNAL MPI_Wtime
493 adcroft 1.1
494 ce107 1.18 CCE107 Fixed for AIX and UNICOS
495     #ifdef TARGET_AIX
496     ACTUAL = ETIME_(TARRAY)
497     userTime = TARRAY(1)
498     systemTime = TARRAY(2)
499 heimbach 1.12 wallClockTime = timenow()
500     #elif (defined (TARGET_T3E) || defined (TARGET_CRAY_VECTOR))
501 ce107 1.18 userTime = SECOND()
502 heimbach 1.12 systemTime = 0.
503 ce107 1.18 wallClockTime = SECONDR()
504 adcroft 1.6 #else
505 cnh 1.17 #ifdef HAVE_ETIME
506 adcroft 1.1 ACTUAL = ETIME(TARRAY)
507 cnh 1.17 #else
508 ce107 1.18 TARRAY(1) = user_time()
509     TARRAY(2) = system_time()
510 cnh 1.17 #endif
511 adcroft 1.1 userTime = TARRAY(1)
512     systemTime = TARRAY(2)
513 edhill 1.15 #ifdef HAVE_CLOC
514 cnh 1.3 CALL CLOC(wTime)
515 edhill 1.15 #else
516 ce107 1.18 wtime = timenow()
517 edhill 1.15 #endif /* HAVE_CLOC */
518 cnh 1.3 wallClockTime = wtime
519 edhill 1.15 #endif /* CRAY defines */
520 cnh 1.3
521 ce107 1.18 CCE107 Sometimes MPI_Wtime has better resolution...
522     #if (defined (ALLOW_USE_MPI) && defined (USE_MPI_WTIME))
523     wtime = MPI_Wtime()
524     wallClockTime = wtime
525     #endif /* ALLOW_USE_MPI && USE_MPI_WTIME */
526 adcroft 1.1
527     RETURN
528     END
529    
530 cnh 1.10 CBOP
531    
532     C !ROUTINE: TIMER_PRINTALL
533    
534     C !INTERFACE:
535 adcroft 1.1 SUBROUTINE TIMER_PRINTALL( myThreadId )
536 adcroft 1.5 IMPLICIT NONE
537 cnh 1.10
538     C !DESCRIPTION:
539     C *==========================================================*
540 edhill 1.16 C | SUBROUTINE TIMER\_PRINTALL
541 cnh 1.10 C | o Print timer information
542     C *==========================================================*
543     C | Request print out of table of timing from all timers.
544     C *==========================================================*
545    
546     C !INPUT PARAMETERS:
547     C myThreadId :: This threads number
548 adcroft 1.1 INTEGER myThreadId
549 cnh 1.10 CEOP
550    
551 cnh 1.4 CALL TIMER_CONTROL( ' ', 'PRINTALL', 'TIMER_PRINTALL' ,
552     & myThreadId )
553 adcroft 1.1 C
554     RETURN
555     END
556 cnh 1.10
557     CBOP
558     C !ROUTINE: TIMER_START
559    
560     C !INTERFACE:
561 adcroft 1.1 SUBROUTINE TIMER_START ( string , myThreadId )
562 adcroft 1.5 IMPLICIT NONE
563 cnh 1.10
564     C !DESCRIPTION:
565     C Start timer named "string".
566    
567     C !INPUT PARAMETERS:
568     C string :: Name of timer
569     C myThreadId :: My thread number
570 adcroft 1.1 CHARACTER*(*) string
571     INTEGER myThreadId
572 cnh 1.10 CEOP
573 adcroft 1.1 C
574     CALL TIMER_CONTROL( string, 'START', 'TIMER_START' , myThreadId)
575     C
576     RETURN
577     END
578 cnh 1.10 CBOP
579     C !ROUTINE: TIMER_STOP
580    
581     C !INTERFACE:
582 adcroft 1.1 SUBROUTINE TIMER_STOP ( string , myThreadId)
583 adcroft 1.5 IMPLICIT NONE
584 cnh 1.10
585     C !DESCRIPTION:
586     C Stop timer named "string".
587    
588     C !INPUT PARAMETERS:
589     C string :: Name of timer
590     C myThreadId :: My thread number
591 adcroft 1.1 CHARACTER*(*) string
592     INTEGER myThreadId
593 cnh 1.10 CEOP
594 adcroft 1.1 C
595     CALL TIMER_CONTROL( string, 'STOP', 'TIMER_STOP' , myThreadId )
596     C
597     RETURN
598     END
599     C***********************************************************************

  ViewVC Help
Powered by ViewVC 1.1.22