/[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.5 - (hide annotations) (download)
Mon May 24 15:15:11 1999 UTC (25 years ago) by adcroft
Branch: MAIN
CVS Tags: checkpoint23, checkpoint24
Changes since 1.4: +7 -1 lines
Added IMPLICIT NONE.

1 adcroft 1.5 C $Header: /u/gcmpack/models/MITgcmUV/eesupp/src/timers.F,v 1.4 1998/10/28 03:11:35 cnh 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     CHARACTER*(maxString) timerAction
105     INTEGER nTimers(MAX_NO_THREADS)
106     CHARACTER*(maxString) tmpName
107     CHARACTER*(maxString) tmpAction
108     INTEGER iTimer
109     INTEGER ISTART
110     INTEGER IEND
111     INTEGER STOPPED
112     PARAMETER ( STOPPED = 0 )
113     INTEGER RUNNING
114     PARAMETER ( RUNNING = 1 )
115     CHARACTER*(*) STOP
116     PARAMETER ( STOP = 'STOP' )
117     CHARACTER*(*) START
118     PARAMETER ( START = 'START' )
119     CHARACTER*(*) PRINT
120     PARAMETER ( PRINT = 'PRINT' )
121     CHARACTER*(*) PRINTALL
122     PARAMETER ( PRINTALL = 'PRINTALL' )
123     INTEGER I
124     Real*8 userTime
125     Real*8 systemTime
126     Real*8 wallClockTime
127     CHARACTER*(MAX_LEN_MBUF) msgBuffer
128     C
129     DATA nTimers /MAX_NO_THREADS*0/
130     SAVE nTimers
131     C
132     ISTART = IFNBLNK(name)
133     IEND = ILNBLNK(name)
134     IF ( IEND - ISTART + 1 .GT. maxString ) GOTO 901
135     IF ( ISTART .NE. 0 ) THEN
136     tmpName = name(ISTART:IEND)
137     CALL UCASE( tmpName )
138     ELSE
139     tmpName = ' '
140     ENDIF
141     ISTART = IFNBLNK(action)
142     IEND = ILNBLNK(action)
143     IF ( ISTART .EQ. 0 ) GOTO 902
144     IF ( IEND - ISTART + 1 .GT. maxString ) GOTO 903
145     tmpAction = action(ISTART:IEND)
146     CALL UCASE( tmpAction )
147     C
148 cnh 1.4 iTimer=TIMER_INDEX(tmpName,timerNames(1,myThreadId),
149     & maxTimers,nTimers(myThreadId))
150 adcroft 1.1 C
151     IF ( tmpAction .EQ. START ) THEN
152     IF ( iTimer .EQ. 0 ) THEN
153     IF ( nTimers(myThreadId) .EQ. maxTimers ) GOTO 904
154     nTimers(myThreadId) = nTimers(myThreadId) + 1
155     iTimer = nTimers(myThreadId)
156     timerNames(iTimer,myThreadId) = tmpName
157 cnh 1.4 timerNameLen(iTimer,myThreadId) =
158     & ILNBLNK(tmpName)-IFNBLNK(tmpName)+1
159 adcroft 1.1 timerUser(iTimer,myThreadId) = 0.
160     timerSys (iTimer,myThreadId) = 0.
161     timerWall(iTimer,myThreadId) = 0.
162     timerStarts(iTimer,myThreadId) = 0
163     timerStops (iTimer,myThreadId) = 0
164     timerStatus(iTimer,myThreadId) = STOPPED
165     ENDIF
166     IF ( timerStatus(iTimer,myThreadId) .NE. RUNNING ) THEN
167     CALL TIMER_GET_TIME( userTime, systemTime, wallClockTime )
168     timerT0User(iTimer,myThreadId) = userTime
169     timerT0Sys(iTimer,myThreadId) = systemTime
170     timerT0Wall(iTimer,myThreadId) = wallClockTime
171     timerStatus(iTimer,myThreadId) = RUNNING
172 cnh 1.4 timerStarts(iTimer,myThreadId) =
173     & timerStarts(iTimer,myThreadId)+1
174 adcroft 1.1 ENDIF
175     ELSEIF ( tmpAction .EQ. STOP ) THEN
176     IF ( iTimer .EQ. 0 ) GOTO 905
177     IF ( timerStatus(iTimer,myThreadId) .EQ. RUNNING ) THEN
178     CALL TIMER_GET_TIME( userTime, systemTime, wallClockTime )
179 cnh 1.4 timerUser(iTimer,myThreadId) =
180     & timerUser(iTimer,myThreadId) +
181 adcroft 1.1 & userTime -
182     & timerT0User(iTimer,myThreadId)
183 cnh 1.4 timerSys (iTimer,myThreadId) =
184     & timerSys(iTimer,myThreadId) +
185 adcroft 1.1 & systemTime -
186     & timerT0Sys(iTimer,myThreadId)
187 cnh 1.4 timerWall(iTimer,myThreadId) =
188     & timerWall(iTimer,myThreadId) +
189 adcroft 1.1 & wallClockTime -
190     & timerT0Wall(iTimer,myThreadId)
191     timerStatus(iTimer,myThreadId) = STOPPED
192 cnh 1.4 timerStops (iTimer,myThreadId) =
193     & timerStops (iTimer,myThreadId)+1
194 adcroft 1.1 ENDIF
195     ELSEIF ( tmpAction .EQ. PRINT ) THEN
196     IF ( iTimer .EQ. 0 ) GOTO 905
197     WRITE(msgBuffer,*)
198     & ' Seconds in section "',
199 cnh 1.4 & timerNames(iTimer,myThreadId)(1:timerNameLen(iTimer,myThreadId))
200     & ,'":'
201     CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
202     & SQUEEZE_RIGHT,myThreadId)
203     WRITE(msgBuffer,*) ' User time:',
204     & timerUser(iTimer,myThreadId)
205     CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
206     & SQUEEZE_RIGHT,myThreadId)
207     WRITE(msgBuffer,*) ' System time:',
208     & timerSys(iTimer,myThreadId)
209     CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
210     & SQUEEZE_RIGHT,myThreadId)
211     WRITE(msgBuffer,*) ' Wall clock time:',
212     & timerWall(iTimer,myThreadId)
213     CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
214     & SQUEEZE_RIGHT,myThreadId)
215     WRITE(msgBuffer,*) ' No. starts:',
216     & timerStarts(iTimer,myThreadId)
217     CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
218     & SQUEEZE_RIGHT,myThreadId)
219     WRITE(msgBuffer,*) ' No. stops:',
220     & timerStops(iTimer,myThreadId)
221     CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
222     & SQUEEZE_RIGHT,myThreadId)
223 adcroft 1.1 ELSEIF ( tmpAction .EQ. PRINTALL ) THEN
224     DO 10 I = 1, nTimers(myThreadId)
225     WRITE(msgBuffer,*) ' Seconds in section "',
226 cnh 1.4 & timerNames(I,myThreadId)(1:timerNameLen(I,myThreadId))
227     & ,'":'
228     CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
229     & SQUEEZE_RIGHT,myThreadId)
230     WRITE(msgBuffer,*) ' User time:',
231     & timerUser(I,myThreadId)
232     CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
233     & SQUEEZE_RIGHT,myThreadId)
234     WRITE(msgBuffer,*) ' System time:',
235     & timerSys(I,myThreadId)
236     CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
237     & SQUEEZE_RIGHT,myThreadId)
238     WRITE(msgBuffer,*) ' Wall clock time:',
239     & timerWall(I,myThreadId)
240     CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
241     & SQUEEZE_RIGHT,myThreadId)
242     WRITE(msgBuffer,*) ' No. starts:',
243     & timerStarts(I,myThreadId)
244     CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
245     & SQUEEZE_RIGHT,myThreadId)
246     WRITE(msgBuffer,*) ' No. stops:',
247     & timerStops(I,myThreadId)
248     CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
249     & SQUEEZE_RIGHT,myThreadId)
250 adcroft 1.1 10 CONTINUE
251     ELSE
252     GOTO 903
253     ENDIF
254     C
255     1000 CONTINUE
256     C
257     RETURN
258     901 CONTINUE
259     WRITE(msgBuffer,'(A)')
260     &' '
261 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
262     & SQUEEZE_RIGHT,myThreadId)
263 adcroft 1.1 WRITE(msgBuffer,*)
264     &'*** WARNING WARNING WARNING WARNING WARNING WARNING ***'
265 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
266     & SQUEEZE_RIGHT,myThreadId)
267 adcroft 1.1 WRITE(msgBuffer,*)
268     &'procedure: "',callProc,'".'
269 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
270     & SQUEEZE_RIGHT,myThreadId)
271 adcroft 1.1 WRITE(msgBuffer,*)
272     &'Timer name "',name(ISTART:IEND),'" is invalid.'
273 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
274     & SQUEEZE_RIGHT,myThreadId)
275 adcroft 1.1 WRITE(msgBuffer,*)
276     &' Names must have fewer than',maxString+1,' characters.'
277 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
278     & SQUEEZE_RIGHT,myThreadId)
279 adcroft 1.1 WRITE(msgBuffer,*)
280     &'*******************************************************'
281 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
282     & SQUEEZE_RIGHT,myThreadId)
283 adcroft 1.1 GOTO 1000
284     902 CONTINUE
285     WRITE(msgBuffer,*)
286     &' '
287 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
288     & SQUEEZE_RIGHT,myThreadId)
289 adcroft 1.1 WRITE(msgBuffer,*)
290     &'*** WARNING WARNING WARNING WARNING WARNING WARNING ***'
291 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
292     & SQUEEZE_RIGHT,myThreadId)
293 adcroft 1.1 WRITE(msgBuffer,*)
294     &'procedure: "',callProc,'".'
295 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
296     & SQUEEZE_RIGHT,myThreadId)
297 adcroft 1.1 WRITE(msgBuffer,*)
298     &' No timer action specified.'
299 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
300     & SQUEEZE_RIGHT,myThreadId)
301 adcroft 1.1 WRITE(msgBuffer,*)
302     &' Valid actions are:'
303 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
304     & SQUEEZE_RIGHT,myThreadId)
305 adcroft 1.1 WRITE(msgBuffer,*)
306     &' "START", "STOP", "PRINT" and "PRINTALL".'
307 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
308     & SQUEEZE_RIGHT,myThreadId)
309 adcroft 1.1 WRITE(msgBuffer,*)
310     &'*******************************************************'
311 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
312     & SQUEEZE_RIGHT,myThreadId)
313 adcroft 1.1 GOTO 1000
314     903 CONTINUE
315     WRITE(msgBuffer,*)
316     &' '
317 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
318     & SQUEEZE_RIGHT,myThreadId)
319 adcroft 1.1 WRITE(msgBuffer,*)
320     &'*** WARNING WARNING WARNING WARNING WARNING WARNING ***'
321 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
322     & SQUEEZE_RIGHT,myThreadId)
323 adcroft 1.1 WRITE(msgBuffer,*)
324     &'procedure: "',callProc,'".'
325 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
326     & SQUEEZE_RIGHT,myThreadId)
327 adcroft 1.1 WRITE(msgBuffer,*)
328     &'Timer action"',name(ISTART:IEND),'" is invalid.'
329 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
330     & SQUEEZE_RIGHT,myThreadId)
331 adcroft 1.1 WRITE(msgBuffer,*)
332     &' Valid actions are:'
333 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
334     & SQUEEZE_RIGHT,myThreadId)
335 adcroft 1.1 WRITE(msgBuffer,*)
336     &' "START", "STOP", "PRINT" and "PRINTALL".'
337 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
338     & SQUEEZE_RIGHT,myThreadId)
339 adcroft 1.1 WRITE(msgBuffer,*)
340     &'*******************************************************'
341 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
342     & SQUEEZE_RIGHT,myThreadId)
343 adcroft 1.1 GOTO 1000
344     904 CONTINUE
345     WRITE(msgBuffer,*)
346     &' '
347 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
348     & SQUEEZE_RIGHT,myThreadId)
349 adcroft 1.1 WRITE(msgBuffer,*)
350     &'*** WARNING WARNING WARNING WARNING WARNING WARNING ***'
351 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
352     & SQUEEZE_RIGHT,myThreadId)
353 adcroft 1.1 WRITE(msgBuffer,*)
354     &'procedure: "',callProc,'".'
355 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
356     & SQUEEZE_RIGHT,myThreadId)
357 adcroft 1.1 WRITE(msgBuffer,*)
358     &'Timer "',name(ISTART:IEND),'" cannot be created.'
359 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
360     & SQUEEZE_RIGHT,myThreadId)
361 adcroft 1.1 WRITE(msgBuffer,*)
362     &' Only ',maxTimers,' timers are allowed.'
363 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
364     & SQUEEZE_RIGHT,myThreadId)
365 adcroft 1.1 WRITE(msgBuffer,*)
366     &'*******************************************************'
367 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
368     & SQUEEZE_RIGHT,myThreadId)
369 adcroft 1.1 GOTO 1000
370     905 CONTINUE
371     WRITE(msgBuffer,*)
372     &' '
373 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
374     & SQUEEZE_RIGHT,myThreadId)
375 adcroft 1.1 WRITE(msgBuffer,*)
376     &'*** WARNING WARNING WARNING WARNING WARNING WARNING ***'
377 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
378     & SQUEEZE_RIGHT,myThreadId)
379 adcroft 1.1 WRITE(msgBuffer,*)
380     &'procedure: "',callProc,'".'
381 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
382     & SQUEEZE_RIGHT,myThreadId)
383 adcroft 1.1 WRITE(msgBuffer,*)
384     &'Timer name is blank.'
385 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
386     & SQUEEZE_RIGHT,myThreadId)
387 adcroft 1.1 WRITE(msgBuffer,*)
388     &' A name must be used with "START", "STOP" or "PRINT".'
389 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
390     & SQUEEZE_RIGHT,myThreadId)
391 adcroft 1.1 WRITE(msgBuffer,*)
392     &'*******************************************************'
393 cnh 1.4 CALL PRINT_MESSAGE(msgBuffer,standardMessageUnit,
394     & SQUEEZE_RIGHT,myThreadId)
395 adcroft 1.1 GOTO 1000
396     END
397    
398     CStartOfInterface
399     SUBROUTINE TIMER_GET_TIME(
400     O userTime,
401     O systemTime,
402     O wallClockTime )
403     C /==========================================================\
404     C | SUBROUTINE TIMER_GET_TIME |
405     C | o Query system timer routines. |
406     C |==========================================================|
407     C | Routine returns total elapsed time for program so far. |
408     C | Three times are returned that conventionally are used as |
409     C | user time, system time and wall-clock time. Not all these|
410     C | numbers are available on all machines. |
411     C \==========================================================/
412 adcroft 1.5 IMPLICIT NONE
413 adcroft 1.1 Real*8 userTime
414     Real*8 systemTime
415     Real*8 wallClockTime
416     CEndOfInterface
417     Real*4 ETIME, ACTUAL, TARRAY(2)
418     EXTERNAL ETIME
419     Real*8 wtime
420 cnh 1.4 C Real*8 MPI_Wtime
421     C EXTERNAL MPI_Wtime
422 adcroft 1.1
423     ACTUAL = ETIME(TARRAY)
424    
425     userTime = TARRAY(1)
426     systemTime = TARRAY(2)
427 cnh 1.3 CALL CLOC(wTime)
428     wallClockTime = wtime
429    
430 adcroft 1.1 #ifdef ALLOW_USE_MPI
431 cnh 1.3 C wtime = MPI_Wtime()
432     C wallClockTime = wtime
433 adcroft 1.1 #endif /* ALLOW_USE_MPI */
434     #ifndef ALLOW_USE_MPI
435 cnh 1.3 C wallClockTime = 0.
436 adcroft 1.1 #endif
437    
438     RETURN
439     END
440    
441     CStartOfInterface
442     SUBROUTINE TIMER_PRINTALL( myThreadId )
443     C /==========================================================\
444     C | SUBROUTINE TIMER_PRINTALL |
445     C | o Print timer information |
446     C |==========================================================|
447     C | Request print out of table of timing from all timers. |
448     C \==========================================================/
449 adcroft 1.5 IMPLICIT NONE
450 adcroft 1.1 INTEGER myThreadId
451     CEndOfInterface
452     C Print out value for every timer.
453     C
454 cnh 1.4 CALL TIMER_CONTROL( ' ', 'PRINTALL', 'TIMER_PRINTALL' ,
455     & myThreadId )
456 adcroft 1.1 C
457     RETURN
458     END
459     C***********************************************************************
460     SUBROUTINE TIMER_START ( string , myThreadId )
461     C Return start timer named "string".
462 adcroft 1.5 IMPLICIT NONE
463 adcroft 1.1 CHARACTER*(*) string
464     INTEGER myThreadId
465     C
466     CALL TIMER_CONTROL( string, 'START', 'TIMER_START' , myThreadId)
467     C
468     RETURN
469     END
470     C***********************************************************************
471     SUBROUTINE TIMER_STOP ( string , myThreadId)
472     C Return start timer named "string".
473 adcroft 1.5 IMPLICIT NONE
474 adcroft 1.1 CHARACTER*(*) string
475     INTEGER myThreadId
476     C
477     CALL TIMER_CONTROL( string, 'STOP', 'TIMER_STOP' , myThreadId )
478     C
479     RETURN
480     END
481     C***********************************************************************

  ViewVC Help
Powered by ViewVC 1.1.22