/[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.4 - (hide annotations) (download)
Wed Oct 28 03:11:35 1998 UTC (25 years, 7 months ago) by cnh
Branch: MAIN
CVS Tags: checkpoint17, checkpoint19, checkpoint18, checkpoint20, checkpoint21, checkpoint22, checkpoint16
Changes since 1.3: +131 -67 lines
Changes to support
 - g77 compilation under Linux
 - LR(1) form of 64-bit is D or E for constants
 - Modified adjoint of exch with adjoint variables
   acuumulated.

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

  ViewVC Help
Powered by ViewVC 1.1.22