/[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.41 - (show annotations) (download)
Tue Apr 6 01:44:26 2004 UTC (20 years, 1 month ago) by edhill
Branch: MAIN
CVS Tags: checkpoint53, checkpoint53d_post, checkpoint52m_post, checkpoint53b_post, checkpoint53c_post, checkpoint53a_post, checkpoint53g_post, checkpoint53f_post, checkpoint53b_pre, checkpoint52n_post, checkpoint53d_pre
Changes since 1.40: +261 -286 lines
 o adding MNC calls and flags for reading/writing checkpoints

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

  ViewVC Help
Powered by ViewVC 1.1.22