/[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.42 - (show annotations) (download)
Fri Jul 2 17:43:04 2004 UTC (19 years, 11 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint54, checkpoint54a_pre
Changes since 1.41: +15 -12 lines
mnc: read totPhiHyd from pickup ; change few variable names (gUnm1, ...)

1 C $Header: /u/gcmpack/MITgcm/model/src/checkpoint.F,v 1.41 2004/04/06 01:44:26 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,'EtaH', etaH, myThid)
145 #endif
146 CALL MNC_CW_RL_R('D',fn,0,0,'gUnm1',gUnm1, myThid)
147 CALL MNC_CW_RL_R('D',fn,0,0,'gVnm1',gVnm1, myThid)
148 CALL MNC_CW_RL_R('D',fn,0,0,'gTnm1',gTnm1, myThid)
149 CALL MNC_CW_RL_R('D',fn,0,0,'gSnm1',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 IF ( useDynP_inEos_Zc ) THEN
157 CALL MNC_CW_RL_R('D',fn,0,0,'phiHyd', totPhiHyd, myThid)
158 ENDIF
159 ELSE
160 #endif /* ALLOW_MNC */
161
162 C-- Read model fields
163 CALL MDSREADFIELD(fn,prec,'RL',Nr,uVel, 1,myThid)
164 CALL MDSREADFIELD(fn,prec,'RL',Nr,gU, 2,myThid)
165 CALL MDSREADFIELD(fn,prec,'RL',Nr,gUnm1, 3,myThid)
166 CALL MDSREADFIELD(fn,prec,'RL',Nr,vVel, 4,myThid)
167 CALL MDSREADFIELD(fn,prec,'RL',Nr,gV, 5,myThid)
168 CALL MDSREADFIELD(fn,prec,'RL',Nr,gVnm1, 6,myThid)
169 CALL MDSREADFIELD(fn,prec,'RL',Nr,theta, 7,myThid)
170 CALL MDSREADFIELD(fn,prec,'RL',Nr,gT, 8,myThid)
171 CALL MDSREADFIELD(fn,prec,'RL',Nr,gTnm1, 9,myThid)
172 CALL MDSREADFIELD(fn,prec,'RL',Nr,salt, 10,myThid)
173 CALL MDSREADFIELD(fn,prec,'RL',Nr,gS, 11,myThid)
174 CALL MDSREADFIELD(fn,prec,'RL',Nr,gSnm1, 12,myThid)
175 CALL MDSREADFIELD(fn,prec,'RL', 1,etaN,12*Nr+1,myThid)
176 #ifdef NONLIN_FRSURF
177 IF ( nonlinFreeSurf.GE.0)
178 & CALL MDSREADFIELD(fn,prec,'RL',1,etaH,12*Nr+2,myThid)
179 #endif
180 IF ( useDynP_inEos_Zc ) THEN
181 WRITE(fn,'(A,A10)') 'pickup_ph.',suff
182 CALL MDSREADFIELD(fn,prec,'RL',Nr,totPhiHyd,1,myThid)
183 ENDIF
184 #ifdef ALLOW_NONHYDROSTATIC
185 IF ( nonHydrostatic ) THEN
186 WRITE(fn,'(A,A10)') 'pickup_nh.',suff
187 CALL MDSREADFIELD(fn,prec,'RL',Nr,phi_nh,1,myThid)
188 CALL MDSREADFIELD(fn,prec,'RL',Nr,gW, 2,myThid)
189 c CALL MDSREADFIELD(fn,prec,'RL',Nr,gWnm1,3,myThid)
190 ENDIF
191 #endif
192
193 #ifdef ALLOW_MNC
194 ENDIF
195 #endif /* ALLOW_MNC */
196
197 #endif /* OLD_STYLE_WITH_MANY_FILES */
198
199 _END_MASTER( myThid )
200 _BARRIER
201
202 C-- Fill in edge regions
203 CALL EXCH_UV_XYZ_RL(uVel,vVel,.TRUE.,myThid)
204 CALL EXCH_UV_XYZ_RL(gU,gV,.TRUE.,myThid)
205 CALL EXCH_UV_XYZ_RL(gUnm1,gVnm1,.TRUE.,myThid)
206 _EXCH_XYZ_R8(theta , myThid )
207 _EXCH_XYZ_R8(gt , myThid )
208 _EXCH_XYZ_R8(gtNM1 , myThid )
209 _EXCH_XYZ_R8(salt , myThid )
210 _EXCH_XYZ_R8(gs , myThid )
211 _EXCH_XYZ_R8(gsNM1 , myThid )
212 _EXCH_XY_R8 (etaN, myThid )
213 _EXCH_XY_R8( etaH, myThid )
214
215 IF ( useDynP_inEos_Zc )
216 & _EXCH_XYZ_RL( totPhiHyd, myThid )
217
218 #ifdef ALLOW_NONHYDROSTATIC
219 IF ( nonHydrostatic ) THEN
220 _EXCH_XYZ_R8(phi_nh, myThid )
221 _EXCH_XYZ_R8(gW , myThid )
222 c _EXCH_XYZ_R8(gWNM1 , myThid )
223 ENDIF
224 #endif
225
226 RETURN
227 END
228
229 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
230 CBOP
231 C !ROUTINE: WRITE_CHECKPOINT
232 C !INTERFACE:
233 SUBROUTINE WRITE_CHECKPOINT(
234 I modelEnd, myTime,
235 I myIter, myThid )
236
237 C !DESCRIPTION:
238 C This is the controlling routine for IO to write restart (or
239 C ``pickup'' or ``checkpoint'') files. It calls routines from other
240 C packages (\textit{eg.} mdsio and mnc) to do the per-variable
241 C writes.
242 C
243 C Both ``rolling-checkpoint'' files and permanent checkpoint files
244 C are written here. A rolling checkpoint works through a circular
245 C list of suffices. Generally the circular list has two entries so
246 C that a rolling checkpoint will overwrite the last rolling
247 C checkpoint but one. This is useful for running long jobs without
248 C filling too much disk space. In a permanent checkpoint, data is
249 C written suffixed by the current timestep number. Permanent
250 C checkpoints can be used to provide snap-shots from which the
251 C model can be restarted.
252
253 C !USES:
254 IMPLICIT NONE
255 #include "SIZE.h"
256 #include "EEPARAMS.h"
257 #include "PARAMS.h"
258 #include "DYNVARS.h"
259 #ifdef ALLOW_NONHYDROSTATIC
260 #include "GW.h"
261 #include "SOLVE_FOR_PRESSURE3D.h"
262 #endif
263 LOGICAL DIFFERENT_MULTIPLE
264 EXTERNAL DIFFERENT_MULTIPLE
265 INTEGER IO_ERRCOUNT
266 EXTERNAL IO_ERRCOUNT
267 COMMON /PCKP_GBLFLS/ globalFile
268 LOGICAL globalFile
269
270 C !INPUT PARAMETERS:
271 C modelEnd :: Checkpoint call at end of model run.
272 C myThid :: Thread number for this instance of the routine.
273 C myIter :: Iteration number
274 C myTime :: Current time of simulation ( s )
275 LOGICAL modelEnd
276 INTEGER myThid
277 INTEGER myIter
278 _RL myTime
279 CEOP
280
281 C !LOCAL VARIABLES:
282 C permCheckPoint :: Flag indicating whether a permanent checkpoint will
283 C be written.
284 C tempCheckPoint :: Flag indicating if it is time to write a non-permanent
285 C checkpoint (that will be permanent if permCheckPoint=T)
286 C oldPrc :: Temp. for holding I/O precision
287 C fn :: Temp. for building file name string.
288 C lgf :: Flag to indicate whether to use global file mode.
289 LOGICAL permCheckPoint, tempCheckPoint
290 INTEGER i, oldPrec, prec
291 CHARACTER*(MAX_LEN_FNAM) fn
292 CHARACTER*(MAX_LEN_MBUF) msgBuf
293 LOGICAL lgf
294 COMMON /PCKP_SWAP/ pickup_ext
295 CHARACTER*(1) pickup_ext
296
297 permCheckPoint = .FALSE.
298 tempCheckPoint = .FALSE.
299 permCheckPoint =
300 & DIFFERENT_MULTIPLE(pChkptFreq,myTime,myTime-deltaTClock)
301 tempCheckPoint =
302 & DIFFERENT_MULTIPLE( ChkptFreq,myTime,myTime-deltaTClock)
303
304 IF (
305 & ( .NOT.modelEnd .AND. (permCheckPoint.OR.tempCheckPoint) )
306 & .OR.
307 & ( modelEnd .AND. .NOT.(permCheckPoint.OR.tempCheckPoint) )
308 & ) THEN
309
310 C-- Going to really do some IO. Make everyone except master thread wait.
311 _BARRIER
312 _BEGIN_MASTER( myThid )
313
314 #ifdef OLD_STYLE_WITH_MANY_FILES
315
316 C Force 64-bit IO
317 oldPrec = writeBinaryPrec
318 writeBinaryPrec = precFloat64
319 C-- Write model fields
320 C Raw fields
321 CALL WRITE_REC_XYZ_RL( 'uVel', uVel, 1,myIter, myThid)
322 CALL WRITE_REC_XYZ_RL( 'gU', gU, 1,myIter, myThid)
323 CALL WRITE_REC_XYZ_RL( 'gUNm1', gUNm1, 1,myIter, myThid)
324 CALL WRITE_REC_XYZ_RL( 'vVel', vVel, 1,myIter, myThid)
325 CALL WRITE_REC_XYZ_RL( 'gV', gV, 1,myIter, myThid)
326 CALL WRITE_REC_XYZ_RL( 'gVNm1', gVNm1, 1,myIter, myThid)
327 CALL WRITE_REC_XYZ_RL( 'theta', theta, 1,myIter, myThid)
328 CALL WRITE_REC_XYZ_RL( 'gT', gT, 1,myIter, myThid)
329 CALL WRITE_REC_XYZ_RL( 'gTNm1', gTNm1, 1,myIter, myThid)
330 CALL WRITE_REC_XYZ_RL( 'salt', salt, 1,myIter, myThid)
331 CALL WRITE_REC_XYZ_RL( 'gS', gS, 1,myIter, myThid)
332 CALL WRITE_REC_XYZ_RL( 'gSNm1', gSNm1, 1,myIter, myThid)
333 CALL WRITE_REC_XY_RL ('etaN', etaN, 1,myIter, myThid)
334 #ifdef ALLOW_NONHYDROSTATIC
335 IF ( nonHydrostatic ) THEN
336 CALL WRITE_REC_XYZ_RL('phi_nh',phi_nh,1,myIter,myThid)
337 CALL WRITE_REC_XYZ_RL( 'gW',gW, 1,myIter,myThid)
338 c CALL WRITE_REC_XYZ_RL( 'gWnm1',gWnm1, 1,myIter,myThid)
339 ENDIF
340 #endif
341 C-- Reset binary precision
342 writeBinaryPrec = oldPrec
343
344 #else /* OLD_STYLE_WITH_MANY_FILES */
345
346 prec = precFloat64
347 lgf = globalFile
348
349 C-- Write model fields
350 DO i = 1,MAX_LEN_FNAM
351 fn(i:i) = ' '
352 ENDDO
353 IF ( permCheckPoint ) THEN
354 WRITE(fn,'(A,I10.10)') 'pickup.',myIter
355 ELSE
356 WRITE(fn,'(A,A)') 'pickup.',checkPtSuff(nCheckLev)
357 ENDIF
358
359 #ifdef ALLOW_MNC
360 IF (useMNC .AND. mnc_pickup_write) THEN
361 C Write dynvars using the MNC package
362 CALL MNC_CW_SET_UDIM(fn, -1, myThid)
363 CALL MNC_CW_I_W('I',fn,0,0,'iter', myIter, myThid)
364 CALL MNC_CW_SET_UDIM(fn, 0, myThid)
365 CALL MNC_CW_RL_W('D',fn,0,0,'U', uVel, myThid)
366 CALL MNC_CW_RL_W('D',fn,0,0,'V', vVel, myThid)
367 CALL MNC_CW_RL_W('D',fn,0,0,'T', theta, myThid)
368 CALL MNC_CW_RL_W('D',fn,0,0,'S', salt, myThid)
369 CALL MNC_CW_RL_W('D',fn,0,0,'Eta', etaN, myThid)
370 #ifdef NONLIN_FRSURF
371 IF ( nonlinFreeSurf .GE. 0)
372 & CALL MNC_CW_RL_W('D',fn,0,0,'EtaH', etaH, myThid)
373 #endif
374 CALL MNC_CW_RL_W('D',fn,0,0,'gUnm1', gUnm1, myThid)
375 CALL MNC_CW_RL_W('D',fn,0,0,'gVnm1', gVnm1, myThid)
376 CALL MNC_CW_RL_W('D',fn,0,0,'gTnm1', gTnm1, myThid)
377 CALL MNC_CW_RL_W('D',fn,0,0,'gSnm1', gSnm1, myThid)
378 #ifdef ALLOW_NONHYDROSTATIC
379 IF ( nonHydrostatic ) THEN
380 CALL MNC_CW_RL_W('D',fn,0,0,'phi_nh', phi_nh, myThid)
381 CALL MNC_CW_RL_W('D',fn,0,0,'gW', gW, myThid)
382 ENDIF
383 #endif
384 IF ( useDynP_inEos_Zc ) THEN
385 CALL MNC_CW_RL_W('D',fn,0,0,'phiHyd', totPhiHyd, myThid)
386 ENDIF
387 ELSE
388 #endif /* ALLOW_MNC */
389
390 CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,uVel, 1,myIter,myThid)
391 CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,gU, 2,myIter,myThid)
392 CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,gUnm1, 3,myIter,myThid)
393 CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,vVel, 4,myIter,myThid)
394 CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,gV, 5,myIter,myThid)
395 CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,gVnm1, 6,myIter,myThid)
396 CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,theta, 7,myIter,myThid)
397 CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,gT, 8,myIter,myThid)
398 CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,gTnm1, 9,myIter,myThid)
399 CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,salt, 10,myIter,myThid)
400 CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,gS, 11,myIter,myThid)
401 CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,gSnm1,12,myIter,myThid)
402 CALL MDSWRITEFIELD(fn,prec,lgf,'RL', 1,etaN,12*Nr+1,
403 & myIter,myThid)
404 #ifdef NONLIN_FRSURF
405 CALL MDSWRITEFIELD(fn,prec,lgf,'RL', 1,etaH,12*Nr+2,
406 & myIter,myThid)
407 #endif
408 IF ( useDynP_inEos_Zc ) THEN
409 IF ( permCheckPoint ) THEN
410 WRITE(fn,'(A,I10.10)') 'pickup_ph.',myIter
411 ELSE
412 WRITE(fn,'(A,A)') 'pickup_ph.',checkPtSuff(nCheckLev)
413 ENDIF
414 CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,totPhiHyd,
415 & 1,myIter,myThid)
416 ENDIF
417 #ifdef ALLOW_NONHYDROSTATIC
418 IF ( nonHydrostatic ) THEN
419 IF ( permCheckPoint ) THEN
420 WRITE(fn,'(A,I10.10)') 'pickup_nh.',myIter
421 ELSE
422 WRITE(fn,'(A,A)') 'pickup_nh.',checkPtSuff(nCheckLev)
423 ENDIF
424 CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,phi_nh, 1,
425 & myIter,myThid)
426 CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,gW, 2,
427 & myIter,myThid)
428 C CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,gWnm1, 3,
429 C & myIter,myThid)
430 ENDIF
431 #endif
432
433 #ifdef ALLOW_MNC
434 ENDIF
435 #endif /* ALLOW_MNC */
436
437 #endif /* OLD_STYLE_WITH_MANY_FILES */
438
439 C-- Write suffix for stdout information
440 IF ( permCheckPoint ) THEN
441 WRITE(fn,'(I10.10)') myIter
442 ELSE
443 WRITE(fn,'(A)') checkPtSuff(nCheckLev)
444 ENDIF
445
446 IF ( .NOT. permCheckPoint ) THEN
447 nCheckLev = MOD(nCheckLev, maxNoChkptLev)+1
448 ENDIF
449
450 _END_MASTER(myThid)
451 _BARRIER
452
453 C-- Write information to stdout so there is a record that the
454 C checkpoint was completed
455 _BEGIN_MASTER(myThid)
456 WRITE(msgBuf,'(A11,I10,1X,A10)')
457 & "%CHECKPOINT ",myIter,fn
458 CALL PRINT_MESSAGE(msgBuf,standardMessageUnit,SQUEEZE_RIGHT,1)
459 _END_MASTER(myThid)
460
461 ENDIF
462
463 RETURN
464 END

  ViewVC Help
Powered by ViewVC 1.1.22