/[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.7 - (hide annotations) (download)
Mon Mar 27 22:25:40 2000 UTC (24 years, 1 month ago) by adcroft
Branch: MAIN
CVS Tags: checkpoint28, checkpoint29, checkpoint27, checkpoint26
Changes since 1.6: +1 -2 lines
Removed unused variables and fixed some unitialized variables.

1 adcroft 1.7 C $Header: /u/gcmpack/models/MITgcmUV/eesupp/src/timers.F,v 1.6 2000/03/14 20:28:12 adcroft Exp $
2 adcroft 1.1
3     #include "CPP_EEOPTIONS.h"
4    
5     C-- File utils.F: General purpose support routines
6     C-- Contents
7     C-- TIMER_INDEX - Returns index associated with timer name.
8     C-- M TIMER_CONTROL - Implements timer functions for given machine.
9     C-- TIMER_PRINT - Print CPU timer statitics.
10     C-- TIMER_PRINTALL - Prints all CPU timers statistics.
11     C-- TIMER_START - Starts CPU timer for code section.
12     C-- TIMER_STOP - Stop CPU tier for code section.
13     C-- Routines marked "M" contain specific machine dependent code.
14     C-- Routines marked "U" contain UNIX OS calls.
15    
16     CStartOfInterface
17     INTEGER FUNCTION TIMER_INDEX (
18     I name,timerNames,maxTimers,nTimers )
19     C /==========================================================\
20     C | FUNCTION TIMER_INDEX |
21     C | o Timing support routine. |
22     C |==========================================================|
23     C | Return index in timer data structure of timer named |
24     C | by the function argument "name". |
25     C \==========================================================/
26 adcroft 1.5 IMPLICIT NONE
27 adcroft 1.1 INTEGER maxTimers
28     INTEGER nTimers
29     CHARACTER*(*) name
30     CHARACTER*(*) timerNames(maxTimers)
31     CEndOfInterface
32     INTEGER I
33     C
34     TIMER_INDEX = 0
35     IF ( name .EQ. ' ' ) THEN
36     TIMER_INDEX = -1
37     ELSE
38     DO 10 I = 1, nTimers
39     IF ( name .NE. timerNames(I) ) GOTO 10
40     TIMER_INDEX = I
41     GOTO 11
42     10 CONTINUE
43     11 CONTINUE
44     ENDIF
45     RETURN
46     END
47    
48     CStartOfInterface
49     SUBROUTINE TIMER_CONTROL ( name , action , callProc , myThreadId )
50     C /==========================================================\
51     C | SUBROUTINE TIMER_CONTROL |
52     C | o Timing routine. |
53     C |==========================================================|
54     C | User callable interface to timing routines. Timers are |
55     C | created, stopped, started and queried only through this |
56     C | rtouine. |
57     C \==========================================================/
58 adcroft 1.5 IMPLICIT NONE
59 adcroft 1.1 #include "SIZE.h"
60     #include "EEPARAMS.h"
61     #include "EESUPPORT.h"
62     CHARACTER*(*) name
63     CHARACTER*(*) action
64     CHARACTER*(*) callProc
65     INTEGER myThreadId
66     CEndOfInterface
67     C
68     INTEGER TIMER_INDEX
69     INTEGER IFNBLNK
70     INTEGER ILNBLNK
71     EXTERNAL TIMER_INDEX
72     EXTERNAL IFNBLNK
73     EXTERNAL ILNBLNK
74     C
75     INTEGER maxTimers
76     INTEGER maxString
77     PARAMETER ( maxTimers = 40 )
78     PARAMETER ( maxString = 80 )
79     C
80     INTEGER timerStarts( maxTimers , MAX_NO_THREADS)
81     SAVE timerStarts
82     INTEGER timerStops ( maxTimers , MAX_NO_THREADS)
83     SAVE timerStops
84     Real*8 timerUser ( maxTimers , MAX_NO_THREADS)
85     SAVE timerUser
86     Real*8 timerWall ( maxTimers , MAX_NO_THREADS)
87     SAVE timerWall
88     Real*8 timerSys ( maxTimers , MAX_NO_THREADS)
89     SAVE timerSys
90     Real*8 timerT0User( maxTimers , MAX_NO_THREADS)
91     SAVE timerT0User
92     Real*8 timerT0Wall( maxTimers , MAX_NO_THREADS)
93     SAVE timerT0Wall
94     Real*8 timerT0Sys ( maxTimers , MAX_NO_THREADS)
95     SAVE timerT0Sys
96     C ===============================================================
97     C
98     INTEGER timerStatus( maxTimers , MAX_NO_THREADS)
99     SAVE timerStatus
100     INTEGER timerNameLen( maxTimers , MAX_NO_THREADS)
101     SAVE timerNameLen
102     CHARACTER*(maxString) timerNames( maxTimers , MAX_NO_THREADS)
103     SAVE timerNames
104     INTEGER nTimers(MAX_NO_THREADS)
105     CHARACTER*(maxString) tmpName
106     CHARACTER*(maxString) tmpAction
107     INTEGER iTimer
108     INTEGER ISTART
109     INTEGER IEND
110     INTEGER STOPPED
111     PARAMETER ( STOPPED = 0 )
112     INTEGER RUNNING
113     PARAMETER ( RUNNING = 1 )
114     CHARACTER*(*) STOP
115     PARAMETER ( STOP = 'STOP' )
116     CHARACTER*(*) START
117     PARAMETER ( START = 'START' )
118     CHARACTER*(*) PRINT
119     PARAMETER ( PRINT = 'PRINT' )
120     CHARACTER*(*) PRINTALL
121     PARAMETER ( PRINTALL = 'PRINTALL' )
122     INTEGER I
123     Real*8 userTime
124     Real*8 systemTime
125     Real*8 wallClockTime
126     CHARACTER*(MAX_LEN_MBUF) msgBuffer
127     C
128     DATA nTimers /MAX_NO_THREADS*0/
129     SAVE nTimers
130     C
131     ISTART = IFNBLNK(name)
132     IEND = ILNBLNK(name)
133     IF ( IEND - ISTART + 1 .GT. maxString ) GOTO 901
134     IF ( ISTART .NE. 0 ) THEN
135     tmpName = name(ISTART:IEND)
136     CALL UCASE( tmpName )
137     ELSE
138     tmpName = ' '
139     ENDIF
140     ISTART = IFNBLNK(action)
141     IEND = ILNBLNK(action)
142     IF ( ISTART .EQ. 0 ) GOTO 902
143     IF ( IEND - ISTART + 1 .GT. maxString ) GOTO 903
144     tmpAction = action(ISTART:IEND)
145     CALL UCASE( tmpAction )
146     C
147 cnh 1.4 iTimer=TIMER_INDEX(tmpName,timerNames(1,myThreadId),
148     & maxTimers,nTimers(myThreadId))
149 adcroft 1.1 C
150     IF ( tmpAction .EQ. START ) THEN
151     IF ( iTimer .EQ. 0 ) THEN
152     IF ( nTimers(myThreadId) .EQ. maxTimers ) GOTO 904
153     nTimers(myThreadId) = nTimers(myThreadId) + 1
154     iTimer = nTimers(myThreadId)
155     timerNames(iTimer,myThreadId) = tmpName
156 cnh 1.4 timerNameLen(iTimer,myThreadId) =
157     & ILNBLNK(tmpName)-IFNBLNK(tmpName)+1
158 adcroft 1.1 timerUser(iTimer,myThreadId) = 0.
159     timerSys (iTimer,myThreadId) = 0.
160     timerWall(iTimer,myThreadId) = 0.
161     timerStarts(iTimer,myThreadId) = 0
162     timerStops (iTimer,myThreadId) = 0
163     timerStatus(iTimer,myThreadId) = STOPPED
164     ENDIF
165     IF ( timerStatus(iTimer,myThreadId) .NE. RUNNING ) THEN
166     CALL TIMER_GET_TIME( userTime, systemTime, wallClockTime )
167     timerT0User(iTimer,myThreadId) = userTime
168     timerT0Sys(iTimer,myThreadId) = systemTime
169     timerT0Wall(iTimer,myThreadId) = wallClockTime
170     timerStatus(iTimer,myThreadId) = RUNNING
171 cnh 1.4 timerStarts(iTimer,myThreadId) =
172     & timerStarts(iTimer,myThreadId)+1
173 adcroft 1.1 ENDIF
174     ELSEIF ( tmpAction .EQ. STOP ) THEN
175     IF ( iTimer .EQ. 0 ) GOTO 905
176     IF ( timerStatus(iTimer,myThreadId) .EQ. RUNNING ) THEN
177     CALL TIMER_GET_TIME( userTime, systemTime, wallClockTime )
178 cnh 1.4 timerUser(iTimer,myThreadId) =
179     & timerUser(iTimer,myThreadId) +
180 adcroft 1.1 & userTime -
181     & timerT0User(iTimer,myThreadId)
182 cnh 1.4 timerSys (iTimer,myThreadId) =
183     & timerSys(iTimer,myThreadId) +
184 adcroft 1.1 & systemTime -
185     & timerT0Sys(iTimer,myThreadId)
186 cnh 1.4 timerWall(iTimer,myThreadId) =
187     & timerWall(iTimer,myThreadId) +
188 adcroft 1.1 & wallClockTime -
189     & timerT0Wall(iTimer,myThreadId)
190     timerStatus(iTimer,myThreadId) = STOPPED
191 cnh 1.4 timerStops (iTimer,myThreadId) =
192     & timerStops (iTimer,myThreadId)+1
193 adcroft 1.1 ENDIF
194     ELSEIF ( tmpAction .EQ. PRINT ) THEN
195     IF ( iTimer .EQ. 0 ) GOTO 905
196     WRITE(msgBuffer,*)
197     & ' Seconds in section "',
198 cnh 1.4 & timerNames(iTimer,myThreadId)(1:timerNameLen(iTimer,myThreadId))
199     & ,'":'
200     CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
201     & SQUEEZE_RIGHT,myThreadId)
202     WRITE(msgBuffer,*) ' User time:',
203     & timerUser(iTimer,myThreadId)
204     CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
205     & SQUEEZE_RIGHT,myThreadId)
206     WRITE(msgBuffer,*) ' System time:',
207     & timerSys(iTimer,myThreadId)
208     CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
209     & SQUEEZE_RIGHT,myThreadId)
210     WRITE(msgBuffer,*) ' Wall clock time:',
211     & timerWall(iTimer,myThreadId)
212     CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
213     & SQUEEZE_RIGHT,myThreadId)
214     WRITE(msgBuffer,*) ' No. starts:',
215     & timerStarts(iTimer,myThreadId)
216     CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
217     & SQUEEZE_RIGHT,myThreadId)
218     WRITE(msgBuffer,*) ' No. stops:',
219     & timerStops(iTimer,myThreadId)
220     CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
221     & SQUEEZE_RIGHT,myThreadId)
222 adcroft 1.1 ELSEIF ( tmpAction .EQ. PRINTALL ) THEN
223     DO 10 I = 1, nTimers(myThreadId)
224     WRITE(msgBuffer,*) ' Seconds in section "',
225 cnh 1.4 & timerNames(I,myThreadId)(1:timerNameLen(I,myThreadId))
226     & ,'":'
227     CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
228     & SQUEEZE_RIGHT,myThreadId)
229     WRITE(msgBuffer,*) ' User time:',
230     & timerUser(I,myThreadId)
231     CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
232     & SQUEEZE_RIGHT,myThreadId)
233     WRITE(msgBuffer,*) ' System time:',
234     & timerSys(I,myThreadId)
235     CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
236     & SQUEEZE_RIGHT,myThreadId)
237     WRITE(msgBuffer,*) ' Wall clock time:',
238     & timerWall(I,myThreadId)
239     CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
240     & SQUEEZE_RIGHT,myThreadId)
241     WRITE(msgBuffer,*) ' No. starts:',
242     & timerStarts(I,myThreadId)
243     CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
244     & SQUEEZE_RIGHT,myThreadId)
245     WRITE(msgBuffer,*) ' No. stops:',
246     & timerStops(I,myThreadId)
247     CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
248     & SQUEEZE_RIGHT,myThreadId)
249 adcroft 1.1 10 CONTINUE
250     ELSE
251     GOTO 903
252     ENDIF
253     C
254     1000 CONTINUE
255     C
256     RETURN
257     901 CONTINUE
258     WRITE(msgBuffer,'(A)')
259     &' '
260 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
261     & SQUEEZE_RIGHT,myThreadId)
262 adcroft 1.1 WRITE(msgBuffer,*)
263     &'*** WARNING WARNING WARNING WARNING WARNING WARNING ***'
264 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
265     & SQUEEZE_RIGHT,myThreadId)
266 adcroft 1.1 WRITE(msgBuffer,*)
267     &'procedure: "',callProc,'".'
268 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
269     & SQUEEZE_RIGHT,myThreadId)
270 adcroft 1.1 WRITE(msgBuffer,*)
271     &'Timer name "',name(ISTART:IEND),'" is invalid.'
272 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
273     & SQUEEZE_RIGHT,myThreadId)
274 adcroft 1.1 WRITE(msgBuffer,*)
275     &' Names must have fewer than',maxString+1,' characters.'
276 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
277     & SQUEEZE_RIGHT,myThreadId)
278 adcroft 1.1 WRITE(msgBuffer,*)
279     &'*******************************************************'
280 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
281     & SQUEEZE_RIGHT,myThreadId)
282 adcroft 1.1 GOTO 1000
283     902 CONTINUE
284     WRITE(msgBuffer,*)
285     &' '
286 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
287     & SQUEEZE_RIGHT,myThreadId)
288 adcroft 1.1 WRITE(msgBuffer,*)
289     &'*** WARNING WARNING WARNING WARNING WARNING WARNING ***'
290 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
291     & SQUEEZE_RIGHT,myThreadId)
292 adcroft 1.1 WRITE(msgBuffer,*)
293     &'procedure: "',callProc,'".'
294 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
295     & SQUEEZE_RIGHT,myThreadId)
296 adcroft 1.1 WRITE(msgBuffer,*)
297     &' No timer action specified.'
298 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
299     & SQUEEZE_RIGHT,myThreadId)
300 adcroft 1.1 WRITE(msgBuffer,*)
301     &' Valid actions are:'
302 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
303     & SQUEEZE_RIGHT,myThreadId)
304 adcroft 1.1 WRITE(msgBuffer,*)
305     &' "START", "STOP", "PRINT" and "PRINTALL".'
306 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
307     & SQUEEZE_RIGHT,myThreadId)
308 adcroft 1.1 WRITE(msgBuffer,*)
309     &'*******************************************************'
310 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
311     & SQUEEZE_RIGHT,myThreadId)
312 adcroft 1.1 GOTO 1000
313     903 CONTINUE
314     WRITE(msgBuffer,*)
315     &' '
316 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
317     & SQUEEZE_RIGHT,myThreadId)
318 adcroft 1.1 WRITE(msgBuffer,*)
319     &'*** WARNING WARNING WARNING WARNING WARNING WARNING ***'
320 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
321     & SQUEEZE_RIGHT,myThreadId)
322 adcroft 1.1 WRITE(msgBuffer,*)
323     &'procedure: "',callProc,'".'
324 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
325     & SQUEEZE_RIGHT,myThreadId)
326 adcroft 1.1 WRITE(msgBuffer,*)
327     &'Timer action"',name(ISTART:IEND),'" is invalid.'
328 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
329     & SQUEEZE_RIGHT,myThreadId)
330 adcroft 1.1 WRITE(msgBuffer,*)
331     &' Valid actions are:'
332 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
333     & SQUEEZE_RIGHT,myThreadId)
334 adcroft 1.1 WRITE(msgBuffer,*)
335     &' "START", "STOP", "PRINT" and "PRINTALL".'
336 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
337     & SQUEEZE_RIGHT,myThreadId)
338 adcroft 1.1 WRITE(msgBuffer,*)
339     &'*******************************************************'
340 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
341     & SQUEEZE_RIGHT,myThreadId)
342 adcroft 1.1 GOTO 1000
343     904 CONTINUE
344     WRITE(msgBuffer,*)
345     &' '
346 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
347     & SQUEEZE_RIGHT,myThreadId)
348 adcroft 1.1 WRITE(msgBuffer,*)
349     &'*** WARNING WARNING WARNING WARNING WARNING WARNING ***'
350 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
351     & SQUEEZE_RIGHT,myThreadId)
352 adcroft 1.1 WRITE(msgBuffer,*)
353     &'procedure: "',callProc,'".'
354 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
355     & SQUEEZE_RIGHT,myThreadId)
356 adcroft 1.1 WRITE(msgBuffer,*)
357     &'Timer "',name(ISTART:IEND),'" cannot be created.'
358 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
359     & SQUEEZE_RIGHT,myThreadId)
360 adcroft 1.1 WRITE(msgBuffer,*)
361     &' Only ',maxTimers,' timers are allowed.'
362 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
363     & SQUEEZE_RIGHT,myThreadId)
364 adcroft 1.1 WRITE(msgBuffer,*)
365     &'*******************************************************'
366 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
367     & SQUEEZE_RIGHT,myThreadId)
368 adcroft 1.1 GOTO 1000
369     905 CONTINUE
370     WRITE(msgBuffer,*)
371     &' '
372 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
373     & SQUEEZE_RIGHT,myThreadId)
374 adcroft 1.1 WRITE(msgBuffer,*)
375     &'*** WARNING WARNING WARNING WARNING WARNING WARNING ***'
376 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
377     & SQUEEZE_RIGHT,myThreadId)
378 adcroft 1.1 WRITE(msgBuffer,*)
379     &'procedure: "',callProc,'".'
380 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
381     & SQUEEZE_RIGHT,myThreadId)
382 adcroft 1.1 WRITE(msgBuffer,*)
383     &'Timer name is blank.'
384 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
385     & SQUEEZE_RIGHT,myThreadId)
386 adcroft 1.1 WRITE(msgBuffer,*)
387     &' A name must be used with "START", "STOP" or "PRINT".'
388 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
389     & SQUEEZE_RIGHT,myThreadId)
390 adcroft 1.1 WRITE(msgBuffer,*)
391     &'*******************************************************'
392 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
393     & SQUEEZE_RIGHT,myThreadId)
394 adcroft 1.1 GOTO 1000
395     END
396    
397     CStartOfInterface
398     SUBROUTINE TIMER_GET_TIME(
399     O userTime,
400     O systemTime,
401     O wallClockTime )
402     C /==========================================================\
403     C | SUBROUTINE TIMER_GET_TIME |
404     C | o Query system timer routines. |
405     C |==========================================================|
406     C | Routine returns total elapsed time for program so far. |
407     C | Three times are returned that conventionally are used as |
408     C | user time, system time and wall-clock time. Not all these|
409     C | numbers are available on all machines. |
410     C \==========================================================/
411 adcroft 1.5 IMPLICIT NONE
412 adcroft 1.1 Real*8 userTime
413     Real*8 systemTime
414     Real*8 wallClockTime
415     CEndOfInterface
416     Real*4 ETIME, ACTUAL, TARRAY(2)
417 adcroft 1.6 #ifndef TARGET_T3E
418 adcroft 1.1 EXTERNAL ETIME
419 adcroft 1.6 #endif
420 adcroft 1.1 Real*8 wtime
421 cnh 1.4 C Real*8 MPI_Wtime
422     C EXTERNAL MPI_Wtime
423 adcroft 1.1
424 adcroft 1.6 #ifdef TARGET_T3E
425     userTime = 0.
426     systemTime = 0.
427     #else
428 adcroft 1.1 ACTUAL = ETIME(TARRAY)
429     userTime = TARRAY(1)
430     systemTime = TARRAY(2)
431 adcroft 1.6 #endif
432    
433     #ifdef TARGET_T3E
434     wallClockTime = 0.
435     #else
436 cnh 1.3 CALL CLOC(wTime)
437     wallClockTime = wtime
438 adcroft 1.6 #endif
439 cnh 1.3
440 adcroft 1.1 #ifdef ALLOW_USE_MPI
441 cnh 1.3 C wtime = MPI_Wtime()
442     C wallClockTime = wtime
443 adcroft 1.1 #endif /* ALLOW_USE_MPI */
444     #ifndef ALLOW_USE_MPI
445 cnh 1.3 C wallClockTime = 0.
446 adcroft 1.1 #endif
447    
448     RETURN
449     END
450    
451     CStartOfInterface
452     SUBROUTINE TIMER_PRINTALL( myThreadId )
453     C /==========================================================\
454     C | SUBROUTINE TIMER_PRINTALL |
455     C | o Print timer information |
456     C |==========================================================|
457     C | Request print out of table of timing from all timers. |
458     C \==========================================================/
459 adcroft 1.5 IMPLICIT NONE
460 adcroft 1.1 INTEGER myThreadId
461     CEndOfInterface
462     C Print out value for every timer.
463     C
464 cnh 1.4 CALL TIMER_CONTROL( ' ', 'PRINTALL', 'TIMER_PRINTALL' ,
465     & myThreadId )
466 adcroft 1.1 C
467     RETURN
468     END
469     C***********************************************************************
470     SUBROUTINE TIMER_START ( string , myThreadId )
471     C Return start timer named "string".
472 adcroft 1.5 IMPLICIT NONE
473 adcroft 1.1 CHARACTER*(*) string
474     INTEGER myThreadId
475     C
476     CALL TIMER_CONTROL( string, 'START', 'TIMER_START' , myThreadId)
477     C
478     RETURN
479     END
480     C***********************************************************************
481     SUBROUTINE TIMER_STOP ( string , myThreadId)
482     C Return start timer named "string".
483 adcroft 1.5 IMPLICIT NONE
484 adcroft 1.1 CHARACTER*(*) string
485     INTEGER myThreadId
486     C
487     CALL TIMER_CONTROL( string, 'STOP', 'TIMER_STOP' , myThreadId )
488     C
489     RETURN
490     END
491     C***********************************************************************

  ViewVC Help
Powered by ViewVC 1.1.22