/[MITgcm]/MITgcm/pkg/diagnostics/diagnostics_out.F
ViewVC logotype

Annotation of /MITgcm/pkg/diagnostics/diagnostics_out.F

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


Revision 1.54 - (hide annotations) (download)
Tue Jun 21 18:00:48 2011 UTC (12 years, 10 months ago) by jmc
Branch: MAIN
Changes since 1.53: +73 -19 lines
Update Velocity-potential computation using post-processed diag framework.

1 jmc 1.54 C $Header: /u/gcmpack/MITgcm/pkg/diagnostics/diagnostics_out.F,v 1.53 2011/06/14 00:18:37 jmc Exp $
2 jmc 1.1 C $Name: $
3    
4     #include "DIAG_OPTIONS.h"
5    
6     C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
7     CBOP 0
8     C !ROUTINE: DIAGNOSTICS_OUT
9    
10     C !INTERFACE:
11 jmc 1.47 SUBROUTINE DIAGNOSTICS_OUT(
12 jmc 1.15 I listId,
13 jmc 1.50 I myTime,
14 jmc 1.1 I myIter,
15     I myThid )
16    
17     C !DESCRIPTION:
18     C Write output for diagnostics fields.
19 jmc 1.15
20 jmc 1.1 C !USES:
21 jmc 1.3 IMPLICIT NONE
22 jmc 1.1 #include "SIZE.h"
23     #include "EEPARAMS.h"
24     #include "PARAMS.h"
25 edhill 1.7 #include "GRID.h"
26 jmc 1.3 #include "DIAGNOSTICS_SIZE.h"
27     #include "DIAGNOSTICS.h"
28 jmc 1.1
29 jmc 1.30 INTEGER NrMax
30 jmc 1.33 PARAMETER( NrMax = numLevels )
31 jmc 1.1
32     C !INPUT PARAMETERS:
33 jmc 1.15 C listId :: Diagnostics list number being written
34 jmc 1.3 C myIter :: current iteration number
35 jmc 1.15 C myTime :: current time of simulation (s)
36 jmc 1.3 C myThid :: my Thread Id number
37 edhill 1.14 _RL myTime
38 jmc 1.15 INTEGER listId, myIter, myThid
39 jmc 1.1 CEOP
40    
41 jmc 1.40 C !FUNCTIONS:
42     INTEGER ILNBLNK
43     EXTERNAL ILNBLNK
44     #ifdef ALLOW_FIZHI
45     _RL getcon
46     EXTERNAL getcon
47     #endif
48    
49 jmc 1.3 C !LOCAL VARIABLES:
50 jmc 1.15 C i,j,k :: loop indices
51 jmc 1.47 C bi,bj :: tile indices
52 jmc 1.29 C lm :: loop index (averageCycle)
53 jmc 1.15 C md :: field number in the list "listId".
54     C ndId :: diagnostics Id number (in available diagnostics list)
55     C mate :: counter mate Id number (in available diagnostics list)
56     C ip :: diagnostics pointer to storage array
57     C im :: counter-mate pointer to storage array
58 jmc 1.47 C nLevOutp :: number of levels to write in output file
59 jmc 1.32 C
60     C-- COMMON /LOCAL_DIAGNOSTICS_OUT/ local common block (for multi-threaded)
61 jmc 1.52 C qtmp1 :: temporary array; used to store a copy of diag. output field.
62     C qtmp2 :: temporary array; used to store a copy of a 2nd diag. field.
63     C- Note: local common block no longer needed.
64     c COMMON /LOCAL_DIAGNOSTICS_OUT/ qtmp1
65 jmc 1.32 _RL qtmp1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,NrMax,nSx,nSy)
66 jmc 1.52 _RL qtmp2(1-OLx:sNx+OLx,1-OLy:sNy+OLy,NrMax,nSx,nSy)
67 jmc 1.32
68 jmc 1.43 INTEGER i, j, k, lm
69 jmc 1.15 INTEGER bi, bj
70 jmc 1.54 INTEGER md, ndId, nn, ip, im
71     INTEGER mate, mDbl, mVec
72 jmc 1.35 CHARACTER*10 gcode
73 jmc 1.52 _RL undefRL
74     INTEGER nLevOutp, kLev
75    
76 jmc 1.50 INTEGER iLen
77 jmc 1.6 INTEGER ioUnit
78 jmc 1.11 CHARACTER*(MAX_LEN_FNAM) fn
79 jmc 1.1 CHARACTER*(MAX_LEN_MBUF) suff
80 jmc 1.3 CHARACTER*(MAX_LEN_MBUF) msgBuf
81 jmc 1.44 INTEGER prec, nRec, nTimRec
82     _RL timeRec(2)
83 jmc 1.52 _RL tmpLoc
84 jmc 1.29 #ifdef ALLOW_MDSIO
85 jmc 1.3 LOGICAL glf
86 jmc 1.29 #endif
87 jmc 1.1 #ifdef ALLOW_MNC
88 jmc 1.41 INTEGER ll, llMx, jj, jjMx
89 jmc 1.1 CHARACTER*(MAX_LEN_FNAM) diag_mnc_bn
90 jmc 1.50 LOGICAL useMissingValue
91     REAL*8 misValLoc
92 jmc 1.1 #endif /* ALLOW_MNC */
93    
94 jmc 1.3 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
95    
96 jmc 1.44 C--- set file properties
97 jmc 1.6 ioUnit= standardMessageUnit
98 jmc 1.52 undefRL = UNSET_RL
99 jmc 1.40 #ifdef ALLOW_FIZHI
100 jmc 1.52 IF ( useFIZHI ) undefRL = getcon('UNDEF')
101 jmc 1.40 #endif
102 jmc 1.1 WRITE(suff,'(I10.10)') myIter
103 jmc 1.50 iLen = ILNBLNK(fnames(listId))
104     WRITE( fn, '(A,A,A)' ) fnames(listId)(1:iLen),'.',suff(1:10)
105 jmc 1.47 C- for now, if integrate vertically, output field has just 1 level:
106     nLevOutp = nlevels(listId)
107     IF ( fflags(listId)(2:2).EQ.'I' ) nLevOutp = 1
108 jmc 1.1
109 jmc 1.44 C-- Set time information:
110     IF ( freq(listId).LT.0. ) THEN
111     C- Snap-shot: store a unique time (which is consistent with State-Var timing)
112     nTimRec = 1
113     timeRec(1) = myTime
114     ELSE
115     C- Time-average: store the 2 edges of the time-averaging interval.
116     C this time is consitent with intermediate Var (i.e., non-state, e.g, flux,
117     C tendencies) timing. For State-Var, this is shifted by + halt time-step.
118     nTimRec = 2
119    
120     C- end of time-averaging interval:
121     timeRec(2) = myTime
122    
123     C- begining of time-averaging interval:
124     c timeRec(1) = myTime - freq(listId)
125     C a) find the time of the previous multiple of output freq:
126     timeRec(1) = myTime-deltaTClock*0.5 _d 0
127     timeRec(1) = (timeRec(1)-phase(listId))/freq(listId)
128     i = INT( timeRec(1) )
129 jmc 1.46 IF ( timeRec(1).LT.0. ) THEN
130 jmc 1.52 tmpLoc = FLOAT(i)
131     IF ( timeRec(1).NE.tmpLoc ) i = i - 1
132 jmc 1.46 ENDIF
133 jmc 1.44 timeRec(1) = phase(listId) + freq(listId)*FLOAT(i)
134     c if ( listId.eq.2 ) write(0,*) 'f',i,timeRec(1)/deltaTClock
135     timeRec(1) = MAX( timeRec(1), startTime )
136    
137     C b) round off to nearest multiple of time-step:
138     timeRec(1) = (timeRec(1)-baseTime)/deltaTClock
139     i = NINT( timeRec(1) )
140     C if just half way, NINT will return the next time-step: correct this
141 jmc 1.52 tmpLoc = FLOAT(i) - 0.5 _d 0
142     IF ( timeRec(1).EQ.tmpLoc ) i = i - 1
143 jmc 1.44 timeRec(1) = baseTime + deltaTClock*FLOAT(i)
144     c if ( listId.eq.2 ) write(0,*) i,timeRec(1)/deltaTClock
145     ENDIF
146 jmc 1.46 C-- Convert time to iteration number (debug)
147     c DO i=1,nTimRec
148     c timeRec(i) = timeRec(i)/deltaTClock
149     c ENDDO
150 jmc 1.44
151 jmc 1.1 #ifdef ALLOW_MNC
152 jmc 1.41 C-- this is a trick to reverse the order of the loops on md (= field)
153     C and lm (= averagePeriod): binary output: lm loop inside md loop ;
154     C mnc ouput: md loop inside lm loop.
155 jmc 1.1 IF (useMNC .AND. diag_mnc) THEN
156 jmc 1.41 jjMx = averageCycle(listId)
157     llMx = 1
158     ELSE
159     jjMx = 1
160     llMx = averageCycle(listId)
161     ENDIF
162     DO jj=1,jjMx
163    
164     IF (useMNC .AND. diag_mnc) THEN
165 jmc 1.52 misValLoc = undefRL
166 jmc 1.51 IF ( misvalFlt(listId).NE.UNSET_RL )
167     & misValLoc = misvalFlt(listId)
168 jmc 1.50 CALL DIAGNOSTICS_MNC_SET(
169     I nLevOutp, listId, jj,
170 jmc 1.51 O diag_mnc_bn, useMissingValue,
171     I misValLoc, myTime, myIter, myThid )
172 jmc 1.41 ENDIF
173 jmc 1.1 #endif /* ALLOW_MNC */
174    
175 jmc 1.29 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
176    
177 jmc 1.41 DO md = 1,nfields(listId)
178 jmc 1.15 ndId = jdiag(md,listId)
179 jmc 1.35 gcode = gdiag(ndId)(1:10)
180 jmc 1.29 mate = 0
181     mVec = 0
182 jmc 1.54 mDbl = 0
183 jmc 1.35 IF ( gcode(5:5).EQ.'C' ) THEN
184 jmc 1.29 C- Check for Mate of a Counter Diagnostic
185 jmc 1.35 mate = hdiag(ndId)
186 jmc 1.54 ELSEIF ( gcode(5:5).EQ.'P' ) THEN
187     C- Also load the mate (if stored) for Post-Processing
188     nn = ndId
189     DO WHILE ( gdiag(nn)(5:5).EQ.'P' )
190     nn = hdiag(nn)
191     ENDDO
192     IF ( mdiag(md,listId).NE.0 ) mDbl = hdiag(nn)
193 jmc 1.35 ELSEIF ( gcode(1:1).EQ.'U' .OR. gcode(1:1).EQ.'V' ) THEN
194 jmc 1.29 C- Check for Mate of a Vector Diagnostic
195 jmc 1.36 mVec = hdiag(ndId)
196 jmc 1.29 ENDIF
197 jmc 1.35 IF ( idiag(md,listId).NE.0 .AND. gcode(5:5).NE.'D' ) THEN
198 jmc 1.3 C-- Start processing 1 Fld :
199 jmc 1.41 #ifdef ALLOW_MNC
200     DO ll=1,llMx
201     lm = jj+ll-1
202     #else
203 jmc 1.29 DO lm=1,averageCycle(listId)
204 jmc 1.41 #endif
205 jmc 1.3
206 jmc 1.29 ip = ABS(idiag(md,listId)) + kdiag(ndId)*(lm-1)
207 jmc 1.15 im = mdiag(md,listId)
208 jmc 1.29 IF (mate.GT.0) im = im + kdiag(mate)*(lm-1)
209 jmc 1.54 IF (mDbl.GT.0) im = im + kdiag(mDbl)*(lm-1)
210 jmc 1.29 IF (mVec.GT.0) im = im + kdiag(mVec)*(lm-1)
211    
212 jmc 1.54 IF ( ndiag(ip,1,1).EQ.0 ) THEN
213 jmc 1.3 C- Empty diagnostics case :
214    
215     _BEGIN_MASTER( myThid )
216     WRITE(msgBuf,'(A,I10)')
217     & '- WARNING - from DIAGNOSTICS_OUT at iter=', myIter
218 jmc 1.15 CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
219 jmc 1.3 & SQUEEZE_RIGHT, myThid)
220 jmc 1.35 WRITE(msgBuf,'(A,I6,3A,I4,2A)')
221 jmc 1.15 & '- WARNING - diag.#',ndId, ' : ',flds(md,listId),
222     & ' (#',md,' ) in outp.Stream: ',fnames(listId)
223     CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
224 jmc 1.3 & SQUEEZE_RIGHT, myThid)
225 jmc 1.29 IF ( averageCycle(listId).GT.1 ) THEN
226 jmc 1.35 WRITE(msgBuf,'(A,2(I3,A))')
227 jmc 1.29 & '- WARNING - has not been filled (ndiag(lm=',lm,')=',
228     & ndiag(ip,1,1), ' )'
229     ELSE
230 jmc 1.35 WRITE(msgBuf,'(A,2(I3,A))')
231 jmc 1.29 & '- WARNING - has not been filled (ndiag=',
232     & ndiag(ip,1,1), ' )'
233     ENDIF
234 jmc 1.15 CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
235 jmc 1.3 & SQUEEZE_RIGHT, myThid)
236     WRITE(msgBuf,'(A)')
237     & 'WARNING DIAGNOSTICS_OUT => write ZEROS instead'
238 jmc 1.15 CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
239 jmc 1.3 & SQUEEZE_RIGHT, myThid)
240     _END_MASTER( myThid )
241     DO bj = myByLo(myThid), myByHi(myThid)
242     DO bi = myBxLo(myThid), myBxHi(myThid)
243 jmc 1.47 DO k = 1,nLevOutp
244 jmc 1.3 DO j = 1-OLy,sNy+OLy
245     DO i = 1-OLx,sNx+OLx
246     qtmp1(i,j,k,bi,bj) = 0. _d 0
247     ENDDO
248     ENDDO
249     ENDDO
250     ENDDO
251     ENDDO
252    
253 jmc 1.54 ELSE
254 jmc 1.3 C- diagnostics is not empty :
255    
256 jmc 1.49 IF ( debugLevel.GE.debLevB .AND. myThid.EQ.1 ) THEN
257 jmc 1.54 IF ( gcode(5:5).EQ.'P' ) THEN
258     WRITE(ioUnit,'(A,I6,7A,I8,2A)')
259     & ' Post-Processing Diag # ', ndId, ' ', cdiag(ndId),
260     & ' Parms: ',gdiag(ndId)
261     IF ( mDbl.EQ.0 ) THEN
262     WRITE(ioUnit,'(2(3A,I6,A,I8))') ' from diag: ',
263     & cdiag(nn), ' (#', nn, ') Cnt=', ndiag(ip,1,1)
264     ELSE
265     WRITE(ioUnit,'(2(3A,I6,A,I8))') ' from diag: ',
266     & cdiag(nn), ' (#', nn, ') Cnt=', ndiag(ip,1,1),
267     & ' and diag: ',
268     & cdiag(mDbl),' (#',mDbl,') Cnt=',ndiag(im,1,1)
269     ENDIF
270     ELSE
271     WRITE(ioUnit,'(A,I6,3A,I8,2A)')
272 jmc 1.15 & ' Computing Diagnostic # ', ndId, ' ', cdiag(ndId),
273     & ' Counter:',ndiag(ip,1,1),' Parms: ',gdiag(ndId)
274 jmc 1.54 ENDIF
275 jmc 1.29 IF ( mate.GT.0 ) THEN
276 jmc 1.35 WRITE(ioUnit,'(3A,I6,2A)')
277 jmc 1.15 & ' use Counter Mate for ', cdiag(ndId),
278     & ' Diagnostic # ',mate, ' ', cdiag(mate)
279 jmc 1.29 ELSEIF ( mVec.GT.0 ) THEN
280 jmc 1.15 IF ( im.GT.0 .AND. ndiag(MAX(1,im),1,1).GT.0 ) THEN
281 jmc 1.35 WRITE(ioUnit,'(3A,I6,3A)')
282 jmc 1.15 & ' Vector Mate for ', cdiag(ndId),
283     & ' Diagnostic # ',mVec, ' ', cdiag(mVec),
284     & ' exists '
285 jmc 1.3 ELSE
286 jmc 1.35 WRITE(ioUnit,'(3A,I6,3A)')
287 jmc 1.15 & ' Vector Mate for ', cdiag(ndId),
288     & ' Diagnostic # ',mVec, ' ', cdiag(mVec),
289     & ' not enabled'
290 jmc 1.3 ENDIF
291     ENDIF
292 jmc 1.6 ENDIF
293 jmc 1.3
294 jmc 1.52 IF ( fflags(listId)(2:2).EQ.' ' ) THEN
295     C- get only selected levels:
296 jmc 1.30 DO bj = myByLo(myThid), myByHi(myThid)
297     DO bi = myBxLo(myThid), myBxHi(myThid)
298 jmc 1.52 DO k = 1,nlevels(listId)
299     kLev = NINT(levs(k,listId))
300     CALL DIAGNOSTICS_GET_DIAG(
301     I kLev, undefRL,
302 jmc 1.30 O qtmp1(1-OLx,1-OLy,k,bi,bj),
303 jmc 1.54 I ndId, mate, ip, im, bi, bj, myThid )
304 jmc 1.30 ENDDO
305     ENDDO
306     ENDDO
307 jmc 1.54 IF ( mDbl.GT.0 ) THEN
308     DO bj = myByLo(myThid), myByHi(myThid)
309     DO bi = myBxLo(myThid), myBxHi(myThid)
310     DO k = 1,nlevels(listId)
311     kLev = NINT(levs(k,listId))
312     CALL DIAGNOSTICS_GET_DIAG(
313     I kLev, undefRL,
314     O qtmp2(1-OLx,1-OLy,k,bi,bj),
315     I mDbl, 0, im, 0, bi, bj, myThid )
316     ENDDO
317     ENDDO
318     ENDDO
319     ENDIF
320 jmc 1.30 ELSE
321 jmc 1.52 C- get all the levels (for vertical post-processing)
322 jmc 1.30 DO bj = myByLo(myThid), myByHi(myThid)
323     DO bi = myBxLo(myThid), myBxHi(myThid)
324 jmc 1.52 CALL DIAGNOSTICS_GET_DIAG(
325     I 0, undefRL,
326     O qtmp1(1-OLx,1-OLy,1,bi,bj),
327 jmc 1.54 I ndId, mate, ip, im, bi, bj, myThid )
328 jmc 1.30 ENDDO
329 jmc 1.3 ENDDO
330 jmc 1.54 IF ( mDbl.GT.0 ) THEN
331     DO bj = myByLo(myThid), myByHi(myThid)
332     DO bi = myBxLo(myThid), myBxHi(myThid)
333     DO k = 1,nlevels(listId)
334     CALL DIAGNOSTICS_GET_DIAG(
335     I 0, undefRL,
336     O qtmp2(1-OLx,1-OLy,k,bi,bj),
337     I mDbl, 0, im, 0, bi, bj, myThid )
338     ENDDO
339     ENDDO
340     ENDDO
341     ENDIF
342 jmc 1.30 ENDIF
343 jmc 1.1
344 molod 1.17 C-----------------------------------------------------------------------
345 jmc 1.47 C-- Apply specific post-processing (e.g., interpolate) before output
346 molod 1.17 C-----------------------------------------------------------------------
347 jmc 1.47 IF ( fflags(listId)(2:2).EQ.'P' ) THEN
348     C- Do vertical interpolation:
349     IF ( fluidIsAir ) THEN
350 jmc 1.29 C jmc: for now, this can only work in an atmospheric set-up (fluidIsAir);
351 jmc 1.47 CALL DIAGNOSTICS_INTERP_VERT(
352     I listId, md, ndId, ip, im, lm,
353 jmc 1.52 U qtmp1, qtmp2,
354     I undefRL, myTime, myIter, myThid )
355 jmc 1.47 ELSE
356     WRITE(msgBuf,'(2A)') 'DIAGNOSTICS_OUT: ',
357     & 'INTERP_VERT not allowed in this config'
358     CALL PRINT_ERROR( msgBuf , myThid )
359     STOP 'ABNORMAL END: S/R DIAGNOSTICS_OUT'
360     ENDIF
361     ENDIF
362     IF ( fflags(listId)(2:2).EQ.'I' ) THEN
363     C- Integrate vertically: for now, output field has just 1 level:
364     CALL DIAGNOSTICS_SUM_LEVELS(
365     I listId, md, ndId, ip, im, lm,
366     U qtmp1,
367 jmc 1.52 I undefRL, myTime, myIter, myThid )
368 jmc 1.47 ENDIF
369 jmc 1.54 IF ( gcode(5:5).EQ.'P' ) THEN
370     C- Do Post-Processing:
371     IF ( flds(md,listId).EQ.'PhiVEL '
372     c & .OR. flds(md,listId).EQ.'PsiVEL '
373     & ) THEN
374     CALL DIAGNOSTICS_CALC_PHIVEL(
375     I listId, md, ndId, ip, im, lm,
376     U qtmp1, qtmp2,
377     I myTime, myIter, myThid )
378     ELSE
379     WRITE(msgBuf,'(2A)') 'DIAGNOSTICS_OUT: ',
380     & 'unknown Processing method for diag="',cdiag(ndId),'"'
381     CALL PRINT_ERROR( msgBuf , myThid )
382     STOP 'ABNORMAL END: S/R DIAGNOSTICS_OUT'
383     ENDIF
384     ENDIF
385 jmc 1.47
386     C-- End of empty diag / not-empty diag block
387 jmc 1.29 ENDIF
388 molod 1.17
389 jmc 1.47 C-- Ready to write field "md", element "lm" in averageCycle(listId)
390 jmc 1.31
391     C- write to binary file, using MDSIO pkg:
392 jmc 1.34 IF ( diag_mdsio ) THEN
393 jmc 1.29 nRec = lm + (md-1)*averageCycle(listId)
394 jmc 1.30 C default precision for output files
395     prec = writeBinaryPrec
396     C fFlag(1)=R(or D): force it to be 32-bit(or 64) precision
397     IF ( fflags(listId)(1:1).EQ.'R' ) prec = precFloat32
398     IF ( fflags(listId)(1:1).EQ.'D' ) prec = precFloat64
399 jmc 1.34 C a hack not to write meta files now: pass -nRec < 0 to MDS_WRITE S/R
400     CALL WRITE_REC_LEV_RL(
401     I fn, prec,
402 jmc 1.47 I NrMax, 1, nLevOutp,
403 jmc 1.34 I qtmp1, -nRec, myIter, myThid )
404 jmc 1.3 ENDIF
405 jmc 1.1
406     #ifdef ALLOW_MNC
407 jmc 1.3 IF (useMNC .AND. diag_mnc) THEN
408 jmc 1.50 CALL DIAGNOSTICS_MNC_OUT(
409     I NrMax, nLevOutp, listId, ndId,
410     I diag_mnc_bn,
411     I useMissingValue, misValLoc,
412     I qtmp1,
413     I myTime, myIter, myThid )
414 jmc 1.3 ENDIF
415 jmc 1.1 #endif /* ALLOW_MNC */
416    
417 jmc 1.41 C-- end loop on lm (or ll if ALLOW_MNC) counter
418 jmc 1.29 ENDDO
419 jmc 1.15 C-- end of Processing Fld # md
420 jmc 1.3 ENDIF
421 jmc 1.41 ENDDO
422    
423     #ifdef ALLOW_MNC
424     C-- end loop on jj counter
425 jmc 1.3 ENDDO
426 jmc 1.41 #endif
427 jmc 1.1
428 jmc 1.31 #ifdef ALLOW_MDSIO
429     IF (diag_mdsio) THEN
430 jmc 1.48 C- Note: temporary: since it is a pain to add more arguments to
431 jmc 1.31 C all MDSIO S/R, uses instead this specific S/R to write only
432     C meta files but with more informations in it.
433 jmc 1.34 glf = globalFiles
434 jmc 1.31 nRec = nfields(listId)*averageCycle(listId)
435     CALL MDS_WR_METAFILES(fn, prec, glf, .FALSE.,
436 jmc 1.47 & 0, 0, nLevOutp, ' ',
437 jmc 1.44 & nfields(listId), flds(1,listId), nTimRec, timeRec,
438 jmc 1.31 & nRec, myIter, myThid)
439     ENDIF
440     #endif /* ALLOW_MDSIO */
441    
442 jmc 1.15 RETURN
443 jmc 1.3 END
444 jmc 1.15
445 jmc 1.1 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|

  ViewVC Help
Powered by ViewVC 1.1.22