/[MITgcm]/MITgcm/model/src/checkpoint.F
ViewVC logotype

Contents of /MITgcm/model/src/checkpoint.F

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


Revision 1.38 - (show annotations) (download)
Fri Mar 19 05:09:41 2004 UTC (20 years, 2 months ago) by edhill
Branch: MAIN
Changes since 1.37: +66 -64 lines
 o add "useMNC" flag for run-time selection of MNC

1 C $Header: /u/gcmpack/MITgcm/model/src/checkpoint.F,v 1.37 2004/03/19 03:28:36 edhill Exp $
2 C $Name: $
3
4 #include "PACKAGES_CONFIG.h"
5 #include "CPP_OPTIONS.h"
6
7 C-- File read_write.F: Routines to handle mid-level I/O interface.
8 C-- Contents
9 C-- o SET_WRITE_GLOBAL_PICKUP
10 C-- o READ_CHECKPOINT - Write out checkpoint files for restarting.
11 C-- o WRITE_CHECKPOINT - Write out checkpoint files for restarting.
12
13 SUBROUTINE SET_WRITE_GLOBAL_PICKUP ( flag )
14 IMPLICIT NONE
15 C SET_WRITE_GLOBAL_FLD( flag ) sets an internal logical state to
16 C indicate whether files written by subsequent call to the
17 C READ_WRITE_FLD package should create "global" or "tiled" files.
18 C flag = .TRUE. indicates "global" files
19 C flag = .FALSE. indicates "tiled" files
20 C
21 C Arguments
22 LOGICAL flag
23 C Common
24 COMMON /PCKP_GBLFLS/ globalFile
25 LOGICAL globalFile
26 C
27 globalFile=flag
28 C
29 RETURN
30 END
31
32 CBOP
33 C !ROUTINE: READ_CHECKPOINT
34 C !INTERFACE:
35 SUBROUTINE READ_CHECKPOINT ( myIter, myThid )
36 C !DESCRIPTION: \bv
37 C *==========================================================*
38 C | SUBROUTINE READ_PICKUP
39 C | o Controlling routine for IO to write restart file.
40 C *==========================================================*
41 C | Read model checkpoint files for use in restart.
42 C *==========================================================*
43 C \ev
44 C !USES:
45 IMPLICIT NONE
46 C == Global variables ===
47 #include "SIZE.h"
48 #include "EEPARAMS.h"
49 #include "PARAMS.h"
50 #include "DYNVARS.h"
51 #ifdef ALLOW_NONHYDROSTATIC
52 #include "GW.h"
53 #include "SOLVE_FOR_PRESSURE3D.h"
54 #endif
55
56 INTEGER IO_ERRCOUNT
57 EXTERNAL IO_ERRCOUNT
58
59 C !INPUT/OUTPUT PARAMETERS:
60 C == Routine arguments ==
61 C myThid - Thread number for this instance of the routine.
62 C myIter - Iteration number
63 INTEGER myThid
64 INTEGER myIter
65
66 C !LOCAL VARIABLES:
67 C == Local variables ==
68 C oldPrec :: Temp. for hold I/O precision information
69 C prec
70 C fn :: Temp. for building file name.
71 INTEGER oldPrec
72 CHARACTER*(MAX_LEN_FNAM) fn
73 CHARACTER*(10) suff
74 INTEGER prec
75 #ifdef ALLOW_MNC
76 INTEGER i,j,k, bi,bj
77 _RL mnc_iter
78 #endif
79 CEOP
80
81 C-- Going to really do some IO. Make everyone except master thread wait.
82 _BARRIER
83 _BEGIN_MASTER( myThid )
84
85 #ifdef OLD_STYLE_WITH_MANY_FILES
86
87 C Force 64-bit IO
88 oldPrec = readBinaryPrec
89 readBinaryPrec = precFloat64
90
91 C-- Read model fields
92 C Raw fields
93 CALL READ_REC_XYZ_RL( 'uVel', uVel, 1,myIter, myThid)
94 CALL READ_REC_XYZ_RL( 'gU', gU, 1,myIter, myThid)
95 CALL READ_REC_XYZ_RL( 'guNm1', gUNm1, 1,myIter, myThid)
96 CALL READ_REC_XYZ_RL( 'vVel', vVel, 1,myIter, myThid)
97 CALL READ_REC_XYZ_RL( 'gV', gV, 1,myIter, myThid)
98 CALL READ_REC_XYZ_RL( 'gvNm1', gVNm1, 1,myIter, myThid)
99 CALL READ_REC_XYZ_RL( 'theta', theta, 1,myIter, myThid)
100 CALL READ_REC_XYZ_RL( 'gT', gT, 1,myIter, myThid)
101 CALL READ_REC_XYZ_RL( 'gtNm1', gTNm1, 1,myIter, myThid)
102 CALL READ_REC_XYZ_RL( 'salt', salt, 1,myIter, myThid)
103 CALL READ_REC_XYZ_RL( 'gS', gS, 1,myIter, myThid)
104 CALL READ_REC_XYZ_RL( 'gsNm1', gSNm1, 1,myIter, myThid)
105 CALL READ_REC_XY_RL ('etaN', etaN, 1,myIter, myThid)
106
107 #ifdef ALLOW_NONHYDROSTATIC
108 IF ( nonHydrostatic ) THEN
109 CALL READ_REC_XYZ_RL('phi_nh',phi_nh,1,myIter,myThid)
110 CALL READ_REC_XYZ_RL( 'gW',gW, 1,myIter,myThid)
111 c CALL READ_REC_XYZ_RL( 'gWnm1',gWnm1, 1,myIter,myThid)
112 ENDIF
113 #endif
114
115 C Reset default IO precision
116 readBinaryPrec = oldPrec
117
118 #else /* OLD_STYLE_WITH_MANY_FILES */
119
120 prec = precFloat64
121
122 C-- Suffix for pickup files
123 IF (pickupSuff.EQ.' ') THEN
124 WRITE(suff,'(I10.10)') myIter
125 ELSE
126 WRITE(suff,'(A10)') pickupSuff
127 ENDIF
128
129 C-- Read model fields
130 WRITE(fn,'(A,A10)') 'pickup.',suff
131 CALL MDSREADFIELD(fn,prec,'RL',Nr,uVel, 1,myThid)
132 CALL MDSREADFIELD(fn,prec,'RL',Nr,gU, 2,myThid)
133 CALL MDSREADFIELD(fn,prec,'RL',Nr,gUnm1, 3,myThid)
134 CALL MDSREADFIELD(fn,prec,'RL',Nr,vVel, 4,myThid)
135 CALL MDSREADFIELD(fn,prec,'RL',Nr,gV, 5,myThid)
136 CALL MDSREADFIELD(fn,prec,'RL',Nr,gVnm1, 6,myThid)
137 CALL MDSREADFIELD(fn,prec,'RL',Nr,theta, 7,myThid)
138 CALL MDSREADFIELD(fn,prec,'RL',Nr,gT, 8,myThid)
139 CALL MDSREADFIELD(fn,prec,'RL',Nr,gTnm1, 9,myThid)
140 CALL MDSREADFIELD(fn,prec,'RL',Nr,salt, 10,myThid)
141 CALL MDSREADFIELD(fn,prec,'RL',Nr,gS, 11,myThid)
142 CALL MDSREADFIELD(fn,prec,'RL',Nr,gSnm1, 12,myThid)
143 CALL MDSREADFIELD(fn,prec,'RL', 1,etaN,12*Nr+1,myThid)
144 #ifdef NONLIN_FRSURF
145 IF ( nonlinFreeSurf.GE.0)
146 & CALL MDSREADFIELD(fn,prec,'RL',1,etaH,12*Nr+2,myThid)
147 #endif
148
149 IF ( useDynP_inEos_Zc ) THEN
150 WRITE(fn,'(A,A10)') 'pickup_ph.',suff
151 CALL MDSREADFIELD(fn,prec,'RL',Nr,totPhiHyd,1,myThid)
152 ENDIF
153
154 #ifdef ALLOW_NONHYDROSTATIC
155 IF ( nonHydrostatic ) THEN
156 WRITE(fn,'(A,A10)') 'pickup_nh.',suff
157 CALL MDSREADFIELD(fn,prec,'RL',Nr,phi_nh,1,myThid)
158 CALL MDSREADFIELD(fn,prec,'RL',Nr,gW, 2,myThid)
159 c CALL MDSREADFIELD(fn,prec,'RL',Nr,gWnm1,3,myThid)
160 ENDIF
161 #endif
162
163 #endif /* OLD_STYLE_WITH_MANY_FILES */
164
165
166 #ifdef ALLOW_MNC
167 IF (useMNC) THEN
168 mnc_iter = myIter
169
170 C Write dynvars using the MNC package
171 CALL MNC_CW_RL_W_D('pickup',0,0,'iter',-1,mnc_iter, myThid)
172 CALL MNC_CW_RL_W_D('pickup',0,0,'U', 0, uVel, myThid)
173 CALL MNC_CW_RL_W_D('pickup',0,0,'V', 0, vVel, myThid)
174 CALL MNC_CW_RL_W_D('pickup',0,0,'T', 0, theta, myThid)
175 CALL MNC_CW_RL_W_D('pickup',0,0,'S', 0, salt, myThid)
176 CALL MNC_CW_RL_W_D('pickup',0,0,'Eta', 0, etaN, myThid)
177 #ifdef NONLIN_FRSURF
178 IF ( nonlinFreeSurf.GE.0)
179 & CALL MNC_CW_RL_W_D('pickup',0,0,'EtaNH', 0, etaH, myThid)
180 #endif
181 CALL MNC_CW_RL_W_D('pickup',0,0,'Unm1', 0, gUnm1, myThid)
182 CALL MNC_CW_RL_W_D('pickup',0,0,'Vnm1', 0, gVnm1, myThid)
183 CALL MNC_CW_RL_W_D('pickup',0,0,'Tnm1', 0, gTnm1, myThid)
184 CALL MNC_CW_RL_W_D('pickup',0,0,'Snm1', 0, gSnm1, myThid)
185
186 DO bj = myByLo(myThid), myByHi(myThid)
187 DO bi = myBxLo(myThid), myBxHi(myThid)
188 DO j=1,sNy
189 DO i=1,sNx
190 etaN(i,j,bi,bj) = 0.0D0
191 etaH(i,j,bi,bj) = 0.0D0
192 ENDDO
193 ENDDO
194 DO k=1,Nr
195 DO j=1,sNy
196 DO i=1,sNx
197 uVel(i,j,k,bi,bj) = 0.0D0
198 vVel(i,j,k,bi,bj) = 0.0D0
199 theta(i,j,k,bi,bj) = 0.0D0
200 salt(i,j,k,bi,bj) = 0.0D0
201
202 C g?nm1 variables
203 gUnm1(i,j,k,bi,bj) = 0.0D0
204 gVnm1(i,j,k,bi,bj) = 0.0D0
205 gTnm1(i,j,k,bi,bj) = 0.0D0
206 gSnm1(i,j,k,bi,bj) = 0.0D0
207
208 C g? variables
209 gU(i,j,k,bi,bj) = 0.0D0
210 gV(i,j,k,bi,bj) = 0.0D0
211 gT(i,j,k,bi,bj) = 0.0D0
212 gS(i,j,k,bi,bj) = 0.0D0
213 ENDDO
214 ENDDO
215 ENDDO
216 ENDDO
217 ENDDO
218
219 C Read variables from the pickup file
220 CALL MNC_FILE_CLOSE_ALL_MATCHING('pickup', myThid)
221 CALL MNC_CW_RL_R_D('pickup',0,0,'iter',1,mnc_iter, myThid)
222 CALL MNC_CW_RL_R_D('pickup',0,0,'U',1,uVel, myThid)
223 CALL MNC_CW_RL_R_D('pickup',0,0,'V',1,vVel, myThid)
224 CALL MNC_CW_RL_R_D('pickup',0,0,'T',1,theta, myThid)
225 CALL MNC_CW_RL_R_D('pickup',0,0,'S',1,salt, myThid)
226 CALL MNC_CW_RL_R_D('pickup',0,0,'Eta',1,etaN, myThid)
227 #ifdef NONLIN_FRSURF
228 IF ( nonlinFreeSurf.GE.0)
229 & CALL MNC_CW_RL_R_D('pickup',0,0,'EtaNH', 1, etaH, myThid)
230 #endif
231 CALL MNC_CW_RL_R_D('pickup',0,0,'Unm1',1,gUnm1, myThid)
232 CALL MNC_CW_RL_R_D('pickup',0,0,'Vnm1',1,gVnm1, myThid)
233 CALL MNC_CW_RL_R_D('pickup',0,0,'Tnm1',1,gTnm1, myThid)
234 CALL MNC_CW_RL_R_D('pickup',0,0,'Snm1',1,gSnm1, myThid)
235 ENDIF
236 #endif /* ALLOW_MNC */
237
238 _END_MASTER( myThid )
239 _BARRIER
240
241 C-- Fill in edge regions
242 CALL EXCH_UV_XYZ_RL(uVel,vVel,.TRUE.,myThid)
243 CALL EXCH_UV_XYZ_RL(gU,gV,.TRUE.,myThid)
244 CALL EXCH_UV_XYZ_RL(gUnm1,gVnm1,.TRUE.,myThid)
245 _EXCH_XYZ_R8(theta , myThid )
246 _EXCH_XYZ_R8(gt , myThid )
247 _EXCH_XYZ_R8(gtNM1 , myThid )
248 _EXCH_XYZ_R8(salt , myThid )
249 _EXCH_XYZ_R8(gs , myThid )
250 _EXCH_XYZ_R8(gsNM1 , myThid )
251 _EXCH_XY_R8 (etaN, myThid )
252 _EXCH_XY_R8( etaH, myThid )
253
254 IF ( useDynP_inEos_Zc )
255 & _EXCH_XYZ_RL( totPhiHyd, myThid )
256
257 #ifdef ALLOW_NONHYDROSTATIC
258 IF ( nonHydrostatic ) THEN
259 _EXCH_XYZ_R8(phi_nh, myThid )
260 _EXCH_XYZ_R8(gW , myThid )
261 c _EXCH_XYZ_R8(gWNM1 , myThid )
262 ENDIF
263 #endif
264
265 RETURN
266 END
267
268 CBOP
269 C !ROUTINE: WRITE_CHECKPOINT
270 C !INTERFACE:
271 SUBROUTINE WRITE_CHECKPOINT ( modelEnd, myTime,
272 & myIter, myThid )
273 C !DESCRIPTION: \bv
274 C *==========================================================*
275 C | SUBROUTINE WRITE_CHECKPOINT
276 C | o Controlling routine for IO to write restart file.
277 C *==========================================================*
278 C | Write model checkpoint files for use in restart.
279 C | This routine writes both "rolling-checkpoint" files
280 C | and permanent checkpoint files. A rolling checkpoint
281 C | works through a circular list of suffices. Generally the
282 C | circular list has two entries so that a rolling
283 C | checkpoint will overwrite the last rolling checkpoint
284 C | but one. This is useful for running long jobs without
285 C | filling too much disk space.
286 C | In a permanent checkpoint data is written suffixed by
287 C | the current timestep number. This sort of checkpoint can
288 C | be used to provided a snap-shot from which the model
289 C | can be rerun.
290 C *==========================================================*
291 C \ev
292
293 C !USES:
294 IMPLICIT NONE
295 C == Global variables ===
296 #include "SIZE.h"
297 #include "EEPARAMS.h"
298 #include "PARAMS.h"
299 #include "DYNVARS.h"
300 #ifdef ALLOW_NONHYDROSTATIC
301 #include "GW.h"
302 #include "SOLVE_FOR_PRESSURE3D.h"
303 #endif
304 LOGICAL DIFFERENT_MULTIPLE
305 EXTERNAL DIFFERENT_MULTIPLE
306 INTEGER IO_ERRCOUNT
307 EXTERNAL IO_ERRCOUNT
308
309 C !INPUT/OUTPUT PARAMETERS:
310 C == Routine arguments ==
311 C modelEnd :: Checkpoint call at end of model run.
312 C myThid :: Thread number for this instance of the routine.
313 C myIter :: Iteration number
314 C myTime :: Current time of simulation ( s )
315 LOGICAL modelEnd
316 INTEGER myThid
317 INTEGER myIter
318 _RL myTime
319 #ifdef ALLOW_MNC
320 _RL mnc_iter
321 #endif
322
323 C == Common blocks ==
324 COMMON /PCKP_GBLFLS/ globalFile
325 LOGICAL globalFile
326
327 C !LOCAL VARIABLES:
328 C == Local variables ==
329 C permCheckPoint :: Flag indicating whether a permanent checkpoint will
330 C be written.
331 C tempCheckPoint :: Flag indicating if it is time to write a non-permanent
332 C checkpoint (that will be permanent if permCheckPoint=T)
333 C oldPrc :: Temp. for holding I/O precision
334 C fn :: Temp. for building file name string.
335 C lgf :: Flag to indicate whether to use global file mode.
336 LOGICAL permCheckPoint, tempCheckPoint
337 INTEGER oldPrec
338 CHARACTER*(MAX_LEN_FNAM) fn
339 CHARACTER*(MAX_LEN_MBUF) msgBuf
340 INTEGER prec
341 LOGICAL lgf
342 CEOP
343
344 permCheckPoint = .FALSE.
345 tempCheckPoint = .FALSE.
346 permCheckPoint=
347 & DIFFERENT_MULTIPLE(pChkptFreq,myTime,myTime-deltaTClock)
348 tempCheckPoint=
349 & DIFFERENT_MULTIPLE( ChkptFreq,myTime,myTime-deltaTClock)
350
351 IF (
352 & ( .NOT.modelEnd .AND. (permCheckPoint.OR.tempCheckPoint) )
353 & .OR.
354 & ( modelEnd .AND. .NOT.(permCheckPoint.OR.tempCheckPoint) )
355 & ) THEN
356
357 C-- Going to really do some IO. Make everyone except master thread wait.
358 _BARRIER
359 _BEGIN_MASTER( myThid )
360
361 #ifdef OLD_STYLE_WITH_MANY_FILES
362 C Force 64-bit IO
363 oldPrec = writeBinaryPrec
364 writeBinaryPrec = precFloat64
365
366 C-- Write model fields
367 C Raw fields
368 CALL WRITE_REC_XYZ_RL( 'uVel', uVel, 1,myIter, myThid)
369 CALL WRITE_REC_XYZ_RL( 'gU', gU, 1,myIter, myThid)
370 CALL WRITE_REC_XYZ_RL( 'gUNm1', gUNm1, 1,myIter, myThid)
371 CALL WRITE_REC_XYZ_RL( 'vVel', vVel, 1,myIter, myThid)
372 CALL WRITE_REC_XYZ_RL( 'gV', gV, 1,myIter, myThid)
373 CALL WRITE_REC_XYZ_RL( 'gVNm1', gVNm1, 1,myIter, myThid)
374 CALL WRITE_REC_XYZ_RL( 'theta', theta, 1,myIter, myThid)
375 CALL WRITE_REC_XYZ_RL( 'gT', gT, 1,myIter, myThid)
376 CALL WRITE_REC_XYZ_RL( 'gTNm1', gTNm1, 1,myIter, myThid)
377 CALL WRITE_REC_XYZ_RL( 'salt', salt, 1,myIter, myThid)
378 CALL WRITE_REC_XYZ_RL( 'gS', gS, 1,myIter, myThid)
379 CALL WRITE_REC_XYZ_RL( 'gSNm1', gSNm1, 1,myIter, myThid)
380 CALL WRITE_REC_XY_RL ('etaN', etaN, 1,myIter, myThid)
381
382 #ifdef ALLOW_NONHYDROSTATIC
383 IF ( nonHydrostatic ) THEN
384 CALL WRITE_REC_XYZ_RL('phi_nh',phi_nh,1,myIter,myThid)
385 CALL WRITE_REC_XYZ_RL( 'gW',gW, 1,myIter,myThid)
386 c CALL WRITE_REC_XYZ_RL( 'gWnm1',gWnm1, 1,myIter,myThid)
387 ENDIF
388 #endif
389
390 C-- Reset binary precision
391 writeBinaryPrec = oldPrec
392
393 #else /* OLD_STYLE_WITH_MANY_FILES */
394
395 prec = precFloat64
396 lgf = globalFile
397
398 C-- Write model fields
399 IF ( permCheckPoint ) THEN
400 WRITE(fn,'(A,I10.10)') 'pickup.',myIter
401 ELSE
402 WRITE(fn,'(A,A)') 'pickup.',checkPtSuff(nCheckLev)
403 ENDIF
404 CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,uVel, 1,myIter,myThid)
405 CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,gU, 2,myIter,myThid)
406 CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,gUnm1, 3,myIter,myThid)
407 CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,vVel, 4,myIter,myThid)
408 CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,gV, 5,myIter,myThid)
409 CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,gVnm1, 6,myIter,myThid)
410 CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,theta, 7,myIter,myThid)
411 CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,gT, 8,myIter,myThid)
412 CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,gTnm1, 9,myIter,myThid)
413 CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,salt, 10,myIter,myThid)
414 CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,gS, 11,myIter,myThid)
415 CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,gSnm1,12,myIter,myThid)
416 CALL MDSWRITEFIELD(fn,prec,lgf,'RL', 1,etaN,12*Nr+1,
417 & myIter,myThid)
418 #ifdef NONLIN_FRSURF
419 CALL MDSWRITEFIELD(fn,prec,lgf,'RL', 1,etaH,12*Nr+2,
420 & myIter,myThid)
421 #endif
422
423 IF ( useDynP_inEos_Zc ) THEN
424 IF ( permCheckPoint ) THEN
425 WRITE(fn,'(A,I10.10)') 'pickup_ph.',myIter
426 ELSE
427 WRITE(fn,'(A,A)') 'pickup_ph.',checkPtSuff(nCheckLev)
428 ENDIF
429 CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,totPhiHyd,
430 & 1,myIter,myThid)
431 ENDIF
432
433 #ifdef ALLOW_NONHYDROSTATIC
434 IF ( nonHydrostatic ) THEN
435 IF ( permCheckPoint ) THEN
436 WRITE(fn,'(A,I10.10)') 'pickup_nh.',myIter
437 ELSE
438 WRITE(fn,'(A,A)') 'pickup_nh.',checkPtSuff(nCheckLev)
439 ENDIF
440 CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,phi_nh,1,myIter,myThid)
441 CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,gW, 2,myIter,myThid)
442 c CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,gWnm1,3,myIter,myThid)
443 ENDIF
444 #endif
445
446 #endif /* OLD_STYLE_WITH_MANY_FILES */
447
448
449 #ifdef ALLOW_MNC
450 IF (useMNC) THEN
451 mnc_iter = myIter
452
453 C Need to add the pickups here...
454 ENDIF
455 #endif /* ALLOW_MNC */
456
457
458 C-- Write suffix for stdout information
459 IF ( permCheckPoint ) THEN
460 WRITE(fn,'(I10.10)') myIter
461 ELSE
462 WRITE(fn,'(A)') checkPtSuff(nCheckLev)
463 ENDIF
464
465 IF ( .NOT. permCheckPoint ) THEN
466 nCheckLev = MOD(nCheckLev, maxNoChkptLev)+1
467 ENDIF
468
469 _END_MASTER(myThid)
470 _BARRIER
471
472 C-- Write information to stdout so there is a record that the
473 C checkpoint was completed
474 _BEGIN_MASTER(myThid)
475 WRITE(msgBuf,'(A11,I10,1X,A10)')
476 & "%CHECKPOINT ",myIter,fn
477 CALL PRINT_MESSAGE(msgBuf,standardMessageUnit,SQUEEZE_RIGHT,1)
478 _END_MASTER(myThid)
479
480 ENDIF
481
482 RETURN
483 END

  ViewVC Help
Powered by ViewVC 1.1.22