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

Annotation of /MITgcm/model/src/read_write.F

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


Revision 1.6 - (hide annotations) (download)
Wed Jun 10 17:05:59 1998 UTC (26 years ago) by cnh
Branch: MAIN
CVS Tags: checkpoint7
Branch point for: checkpoint7-4degree-ref
Changes since 1.5: +70 -26 lines
Minor changes to correct bugs with multi-process mode
of operation

1 cnh 1.6 C $Header: /u/gcmpack/models/MITgcmUV/model/src/read_write.F,v 1.5 1998/06/10 01:44:03 cnh Exp $
2 cnh 1.4 #include "CPP_EEOPTIONS.h"
3 cnh 1.1
4     C-- File read_write.F: Routines to handle mid-level I/O interface.
5     C-- Contents
6     C-- o READ_FLD_XY_RL - Read two-dimensional model _RL field.
7     C-- o READ_FLD_XYZ_RL - Read three-dimensional model _RL field.
8     C-- o WRITE_1D_I - Write list of integer values
9     C-- Uses MITgcmUV environment file format.
10     C-- o WRITE_1D_L - Write list of logical values
11     C-- Uses MITgcmUV environment file format.
12     C-- o WRITE_1D_R8 - Write list of real*8 values
13     C-- Uses MITgcmUV environment file format.
14     C-- o WRITE_FLD_XY_RL - Write two-dimensional model _RL field.
15     C-- o WRITE_FLD_XYZ_RL - Write three-dimensional model _RL field.
16     C-- o WRITE_STATE - Write out model state.
17 cnh 1.4 C-- o WRITE_CHECKPOINT - Write out checkpoint files for restarting.
18 cnh 1.1
19     CStartofinterface
20     SUBROUTINE READ_CHECKPOINT ( myIter, myThid )
21     C /==========================================================\
22     C | SUBROUTINE READ_CHECKPOINT |
23     C | o Controlling routine for IO to write restart file. |
24     C |==========================================================|
25     C | Read model checkpoint files for use in restart. |
26     C \==========================================================/
27    
28     C == Global variables ===
29     #include "SIZE.h"
30     #include "EEPARAMS.h"
31     #include "PARAMS.h"
32     #include "DYNVARS.h"
33     #include "CG2D.h"
34    
35     INTEGER IO_ERRCOUNT
36     EXTERNAL IO_ERRCOUNT
37    
38     C == Routine arguments ==
39     C myThid - Thread number for this instance of the routine.
40     C myIter - Iteration number
41     INTEGER myThid
42     INTEGER myIter
43     CEndofinterface
44    
45     C == Local variables ==
46     C suff - Hold suffix part of a filename
47     C beginIOErrCount - Begin and end IO error counts
48     C endIOErrCount
49     C msgBuf - Error message buffer
50     CHARACTER*(MAX_LEN_FNAM) suff
51     INTEGER beginIOErrCount
52     INTEGER endIOErrCount
53     CHARACTER*(MAX_LEN_MBUF) msgBuf
54     LOGICAL permCheckPoint
55    
56     C-- Going to really do some IO. Make everyone except master thread wait.
57     _BARRIER
58     _BEGIN_MASTER( myThid )
59    
60     C-- Set suffix for this set of data files.
61     WRITE(suff,'(I10.10)') myIter
62    
63     C-- Set IO "context" for writing state
64     CALL DFILE_SET_RO
65     CALL DFILE_SET_CONT_ON_ERROR
66     C Force 64-bit IO
67     readBinaryPrec = precFloat64
68    
69    
70     C-- Read IO error counter
71     beginIOErrCount = IO_ERRCOUNT(myThid)
72    
73     C-- Write model fields
74     C Raw fields
75     CALL READ_FLD_XYZ_RL( 'uVel.',suff, uVel, myIter, myThid)
76     CALL READ_FLD_XYZ_RL( 'gU.',suff, gU, myIter, myThid)
77     CALL READ_FLD_XYZ_RL( 'gUNm1.',suff, gUNm1, myIter, myThid)
78     CALL READ_FLD_XYZ_RL( 'vVel.',suff, vVel, myIter, myThid)
79     CALL READ_FLD_XYZ_RL( 'gV.',suff, gV, myIter, myThid)
80     CALL READ_FLD_XYZ_RL( 'gVNm1.',suff, gVNm1, myIter, myThid)
81     CALL READ_FLD_XYZ_RL( 'theta.',suff, theta, myIter, myThid)
82     CALL READ_FLD_XYZ_RL( 'gT.',suff, gT, myIter, myThid)
83     CALL READ_FLD_XYZ_RL( 'gTNm1.',suff, gTNm1, myIter, myThid)
84     CALL READ_FLD_XYZ_RL( 'salt.',suff, salt, myIter, myThid)
85     CALL READ_FLD_XYZ_RL( 'gS.',suff, gS, myIter, myThid)
86     CALL READ_FLD_XYZ_RL( 'gSNm1.',suff, gSNm1, myIter, myThid)
87     CALL READ_FLD_XY_RL ( 'cg2d_x.',suff, cg2d_x, myIter, myThid)
88 cnh 1.2 #ifdef ALLOW_CD
89     CALL READ_FLD_XY_RL ( 'cg2d_xNM1.',suff, cg2d_xNM1, myIter, myThid)
90     CALL READ_FLD_XYZ_RL( 'uVelD.',suff, uVelD, myIter, myThid)
91     CALL READ_FLD_XYZ_RL( 'vVelD.',suff, vVelD, myIter, myThid)
92     CALL READ_FLD_XYZ_RL( 'uNM1.', suff, uNM1, myIter, myThid)
93     CALL READ_FLD_XYZ_RL( 'vNM1.', suff, vNM1, myIter, myThid)
94     CALL READ_FLD_XYZ_RL( 'guCD.', suff, guCD, myIter, myThid)
95     CALL READ_FLD_XYZ_RL( 'gvCD.', suff, gvCD, myIter, myThid)
96     #endif
97 cnh 1.1
98     C-- Reread IO error counter
99     endIOErrCount = IO_ERRCOUNT(myThid)
100    
101     C-- Check for IO errors
102     IF ( endIOErrCount .NE. beginIOErrCount ) THEN
103     WRITE(msgBuf,'(A)') 'S/R READ_CHECKPOINT'
104     CALL PRINT_ERROR( msgBuf, 1 )
105     WRITE(msgBuf,'(A)') 'Error reading in model checkpoint'
106     CALL PRINT_ERROR( msgBuf, 1 )
107     WRITE(msgBuf,'(A,I10)') 'Timestep ',myIter
108     CALL PRINT_ERROR( msgBuf, 1 )
109     STOP 'ABNORMAL END: S/R READ_CHECKPOINT'
110     ELSE
111     WRITE(msgBuf,'(A,I10)') '// Model checkpoint read, timestep', myIter
112     CALL PRINT_MESSAGE( msgBuf, standardMessageUnit, SQUEEZE_RIGHT, 1 )
113     WRITE(msgBuf,'(A)') ' '
114     CALL PRINT_MESSAGE( msgBuf, standardMessageUnit, SQUEEZE_RIGHT, 1 )
115     ENDIF
116    
117     _END_MASTER( myThid )
118     _BARRIER
119    
120     C-- Fill in edge regions
121     _EXCH_XYZ_R8(uVel , myThid )
122     _EXCH_XYZ_R8(gu , myThid )
123     _EXCH_XYZ_R8(guNM1 , myThid )
124     _EXCH_XYZ_R8(vVel , myThid )
125     _EXCH_XYZ_R8(gv , myThid )
126     _EXCH_XYZ_R8(gvNM1 , myThid )
127     _EXCH_XYZ_R8(theta , myThid )
128     _EXCH_XYZ_R8(gt , myThid )
129     _EXCH_XYZ_R8(gtNM1 , myThid )
130     _EXCH_XYZ_R8(salt , myThid )
131     _EXCH_XYZ_R8(gs , myThid )
132     _EXCH_XYZ_R8(gsNM1 , myThid )
133     _EXCH_XY_R8 (cg2d_x, myThid )
134    
135     RETURN
136     END
137    
138     CStartofinterface
139     SUBROUTINE READ_FLD_XY_RL( pref ,suff, fld, myIter, myThid)
140     C /==========================================================\
141     C | SUBROUTINE READ_FLD_XY_RL |
142     C | o Generic two-dimensional field IO routine. |
143     C |==========================================================|
144     C | Call low-level routines to read a 2d model field. |
145     C | Handles _RL type data ( generally _RL == REAL*8 ) |
146     C \==========================================================/
147    
148     C == Global variables ==
149     #include "SIZE.h"
150 cnh 1.4 #include "EEPARAMS.h"
151 cnh 1.1 #include "PARAMS.h"
152 cnh 1.4 #include "DFILE.h"
153    
154     INTEGER IFNBLNK
155     EXTERNAL IFNBLNK
156     INTEGER ILNBLNK
157     EXTERNAL ILNBLNK
158     INTEGER IO_ERRCOUNT
159     EXTERNAL IO_ERRCOUNT
160     CEndofinterface
161    
162     C == Routine arguments ==
163     C pref - File name prefix
164     C suff - File name suffix
165     C fld - Array to be filled
166     C myIter - Timestep number
167     C myThid - Thread number calling this routine
168     CHARACTER*(*) pref
169     CHARACTER*(*) suff
170     _RL fld(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
171     INTEGER myIter
172     INTEGER myThid
173    
174     C == Local variables ==
175     C fNamData - Filename building strings
176     C fNamMeta
177     C fileHandle - Handle used to refer to an open DFILE file.
178     C lFilled - Used to indicate the number of elements in the
179     C IO buffer that have been filled.
180     C nXP, nYp - Processes domain extents in X and Y.
181     C iP, jP, kP - Index in processes coordinates.
182     C ib - Index in IO buffer
183     C i, j, k, bi, bj - Loop counters
184     C s1Lo, s1Hi, s2Lo, s2Hi - Substring indices
185     C nDims, dimList - Local and global dataset dimensions
186     CHARACTER*(MAX_LEN_FNAM) fNamData
187     CHARACTER*(MAX_LEN_FNAM) fNamMeta
188     INTEGER fileHandle
189     INTEGER lFilled
190     INTEGER nXP, nYP
191     INTEGER iP, jP, kP, ib
192 cnh 1.6 INTEGER i,j, k, bi, bj, iG, jG
193 cnh 1.4 INTEGER s1Lo, s1Hi, s2Lo, s2Hi
194     INTEGER nDims
195     PARAMETER ( nDims = 2 )
196     INTEGER dimList(nDims*3)
197     INTEGER beginIOErrCount, endIOErrCount
198     CHARACTER*(MAX_LEN_MBUF) msgBuf
199    
200     C-- Track IO errors
201     beginIOErrCount = IO_ERRCOUNT(myThid)
202    
203     C-- Build file name
204     C Name has form 'prefix.suffix'
205     C e.g. U.0000000100
206     C U.0000000100
207     s1Lo = IFNBLNK(pref)
208     s1Hi = ILNBLNK(pref)
209     s2Lo = IFNBLNK(suff)
210     s2Hi = ILNBLNK(suff)
211 cnh 1.6 IF ( suff .EQ. ' ' ) THEN
212     WRITE( fNamData, '(A)' )
213     & pref(s1Lo:s1Hi)
214     WRITE( fNamMeta, '(A)' )
215     & pref(s1Lo:s1Hi)
216     ELSE
217     WRITE( fNamData, '(A,A)' )
218 cnh 1.4 & pref(s1Lo:s1Hi),
219     & suff(s2Lo:s2Hi)
220 cnh 1.6 WRITE( fNamMeta, '(A,A)' )
221 cnh 1.4 & pref(s1Lo:s1Hi),
222     & suff(s2Lo:s2Hi)
223 cnh 1.6 ENDIF
224 cnh 1.4
225     C-- Open file
226     CALL DFILE_OPEN( fNamData, fNamMeta, myThid,
227     O fileHandle )
228     IF ( fileHandle .LE. 0 ) GOTO 1000
229    
230     C-- Set local and global data extents
231     nXP=sNx*nSx
232     nYP=sNy*nSy
233 cnh 1.6 lFilled = sNx*nSx*nPx * sNy*nSy*nPy
234 cnh 1.4 dimList(1) = nXP*nPx
235     dimList(2) = myXGlobalLo
236     dimList(3) = myXGlobalLo+nXP-1
237     dimList(4) = nYP*nPy
238     dimList(5) = myYGlobalLo
239     dimList(6) = myYGlobalLo+nYP-1
240    
241     C-- Read data
242     IF ( readBinaryPrec .EQ. precFloat32 ) THEN
243     CALL DFILE_READ_R4( lFilled,
244     I fileHandle, myThid )
245     ELSE
246     CALL DFILE_READ_R8( lFilled,
247     I fileHandle, myThid )
248     ENDIF
249    
250     C-- Copy data from IO buffer.
251     C Also regrid it to i,j,k indexing.
252     IF ( readBinaryPrec .EQ. precFloat32 ) THEN
253     DO bj=1,nSy
254     DO bi=1,nSx
255     DO j=1,sNy
256     DO i=1,sNx
257     iP = (bi-1)*sNx+i
258     jP = (bj-1)*sNy+j
259 cnh 1.6 iG = myXGlobalLo-1+(bi-1)*sNx+I
260     jG = myYGlobalLo-1+(bj-1)*sNy+J
261     ib = (jG-1)*nXp*nPx+iG
262 cnh 1.4 fld(i,j,bi,bj) = ioBuf_R4(ib)
263     ENDDO
264     ENDDO
265     ENDDO
266     ENDDO
267     ELSE
268     DO bj=1,nSy
269     DO bi=1,nSx
270     DO j=1,sNy
271     DO i=1,sNx
272     iP = (bi-1)*sNx+i
273     jP = (bj-1)*sNy+j
274 cnh 1.6 iG = myXGlobalLo-1+(bi-1)*sNx+I
275     jG = myYGlobalLo-1+(bj-1)*sNy+J
276     ib = (jG-1)*nXp*nPx+iG
277 cnh 1.4 fld(i,j,bi,bj) = ioBuf_R8(ib)
278     ENDDO
279     ENDDO
280     ENDDO
281     ENDDO
282     ENDIF
283    
284     C-- Close file
285     CALL DFILE_CLOSE( fileHandle, myThid )
286    
287     C-- Check errors
288     endIOerrCount = IO_ERRCOUNT(myThid)
289     IF ( endIOErrCount .EQ. beginIOErrCount ) THEN
290     WRITE(msgBuf,'(A,A,A,A)') '// Read file(s) ',
291     & pref(s1Lo:s1Hi),'*',suff(s2Lo:s2Hi)
292     CALL PRINT_MESSAGE( msgBuf, standardMessageUnit, SQUEEZE_RIGHT, 1 )
293     ELSE
294     WRITE(msgBuf,'(A,A,A)') 'Error reading file ',pref(s1Lo:s1Hi),suff(s2Lo:s2Hi)
295     CALL PRINT_ERROR( msgBuf, 1 )
296     ENDIF
297    
298     1000 CONTINUE
299    
300     RETURN
301     END
302    
303     CStartofinterface
304     SUBROUTINE READ_FLD_XY_RS( pref ,suff, fld, myIter, myThid)
305     C /==========================================================\
306     C | SUBROUTINE READ_FLD_XY_RS |
307     C | o Generic two-dimensional field IO routine. |
308     C |==========================================================|
309     C | Call low-level routines to read a 2d model field. |
310     C | Handles _RS type data ( generally _RS == REAL*4 ) |
311     C \==========================================================/
312    
313     C == Global variables ==
314     #include "SIZE.h"
315 cnh 1.1 #include "EEPARAMS.h"
316 cnh 1.4 #include "PARAMS.h"
317 cnh 1.1 #include "DFILE.h"
318    
319     INTEGER IFNBLNK
320     EXTERNAL IFNBLNK
321     INTEGER ILNBLNK
322     EXTERNAL ILNBLNK
323     INTEGER IO_ERRCOUNT
324     EXTERNAL IO_ERRCOUNT
325     CEndofinterface
326    
327     C == Routine arguments ==
328     C pref - File name prefix
329     C suff - File name suffix
330     C fld - Array to be filled
331     C myIter - Timestep number
332     C myThid - Thread number calling this routine
333     CHARACTER*(*) pref
334     CHARACTER*(*) suff
335 cnh 1.4 _RS fld(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
336 cnh 1.1 INTEGER myIter
337     INTEGER myThid
338    
339     C == Local variables ==
340     C fNamData - Filename building strings
341     C fNamMeta
342     C fileHandle - Handle used to refer to an open DFILE file.
343     C lFilled - Used to indicate the number of elements in the
344     C IO buffer that have been filled.
345     C nXP, nYp - Processes domain extents in X and Y.
346     C iP, jP, kP - Index in processes coordinates.
347     C ib - Index in IO buffer
348     C i, j, k, bi, bj - Loop counters
349     C s1Lo, s1Hi, s2Lo, s2Hi - Substring indices
350     C nDims, dimList - Local and global dataset dimensions
351     CHARACTER*(MAX_LEN_FNAM) fNamData
352     CHARACTER*(MAX_LEN_FNAM) fNamMeta
353     INTEGER fileHandle
354     INTEGER lFilled
355     INTEGER nXP, nYP
356     INTEGER iP, jP, kP, ib
357 cnh 1.6 INTEGER i,j, k, bi, bj, iG, jG
358 cnh 1.1 INTEGER s1Lo, s1Hi, s2Lo, s2Hi
359     INTEGER nDims
360     PARAMETER ( nDims = 2 )
361     INTEGER dimList(nDims*3)
362     INTEGER beginIOErrCount, endIOErrCount
363     CHARACTER*(MAX_LEN_MBUF) msgBuf
364    
365     C-- Track IO errors
366     beginIOErrCount = IO_ERRCOUNT(myThid)
367    
368     C-- Build file name
369     C Name has form 'prefix.suffix'
370     C e.g. U.0000000100
371     C U.0000000100
372     s1Lo = IFNBLNK(pref)
373     s1Hi = ILNBLNK(pref)
374     s2Lo = IFNBLNK(suff)
375     s2Hi = ILNBLNK(suff)
376 cnh 1.5 IF ( pref .EQ. ' ' ) THEN
377     WRITE( fNamData, '(A)' )
378 cnh 1.1 & suff(s2Lo:s2Hi)
379 cnh 1.6 WRITE( fNamMeta, '(A)' )
380     & suff(s2Lo:s2Hi)
381 cnh 1.5 ELSEIF ( suff .EQ. ' ' ) THEN
382     WRITE( fNamData, '(A)' )
383     & pref(s1Lo:s1Hi)
384 cnh 1.6 WRITE( fNamMeta, '(A)' )
385     & pref(s1Lo:s1Hi)
386 cnh 1.5 ELSE
387     WRITE( fNamData, '(A,A)' )
388 cnh 1.1 & pref(s1Lo:s1Hi),
389     & suff(s2Lo:s2Hi)
390 cnh 1.6 WRITE( fNamMeta, '(A,A)' )
391     & pref(s1Lo:s1Hi),
392     & suff(s2Lo:s2Hi)
393 cnh 1.5 ENDIF
394 cnh 1.1
395     C-- Open file
396     CALL DFILE_OPEN( fNamData, fNamMeta, myThid,
397     O fileHandle )
398     IF ( fileHandle .LE. 0 ) GOTO 1000
399    
400     C-- Set local and global data extents
401     nXP=sNx*nSx
402     nYP=sNy*nSy
403 cnh 1.6 lFilled = sNx*nSx*nPx * sNy*nSy*nPy
404 cnh 1.1 dimList(1) = nXP*nPx
405     dimList(2) = myXGlobalLo
406     dimList(3) = myXGlobalLo+nXP-1
407     dimList(4) = nYP*nPy
408     dimList(5) = myYGlobalLo
409     dimList(6) = myYGlobalLo+nYP-1
410    
411     C-- Read data
412     IF ( readBinaryPrec .EQ. precFloat32 ) THEN
413     CALL DFILE_READ_R4( lFilled,
414     I fileHandle, myThid )
415     ELSE
416     CALL DFILE_READ_R8( lFilled,
417     I fileHandle, myThid )
418     ENDIF
419    
420     C-- Copy data from IO buffer.
421     C Also regrid it to i,j,k indexing.
422     IF ( readBinaryPrec .EQ. precFloat32 ) THEN
423     DO bj=1,nSy
424     DO bi=1,nSx
425     DO j=1,sNy
426     DO i=1,sNx
427     iP = (bi-1)*sNx+i
428     jP = (bj-1)*sNy+j
429 cnh 1.6 iG = myXGlobalLo-1+(bi-1)*sNx+I
430     jG = myYGlobalLo-1+(bj-1)*sNy+J
431     ib = (jG-1)*nXp*nPx+iG
432 cnh 1.1 fld(i,j,bi,bj) = ioBuf_R4(ib)
433     ENDDO
434     ENDDO
435     ENDDO
436     ENDDO
437     ELSE
438     DO bj=1,nSy
439     DO bi=1,nSx
440     DO j=1,sNy
441     DO i=1,sNx
442     iP = (bi-1)*sNx+i
443     jP = (bj-1)*sNy+j
444 cnh 1.6 iG = myXGlobalLo-1+(bi-1)*sNx+I
445     jG = myYGlobalLo-1+(bj-1)*sNy+J
446     ib = (jG-1)*nXp*nPx+iG
447 cnh 1.1 fld(i,j,bi,bj) = ioBuf_R8(ib)
448     ENDDO
449     ENDDO
450     ENDDO
451     ENDDO
452     ENDIF
453    
454     C-- Close file
455     CALL DFILE_CLOSE( fileHandle, myThid )
456    
457     C-- Check errors
458     endIOerrCount = IO_ERRCOUNT(myThid)
459     IF ( endIOErrCount .EQ. beginIOErrCount ) THEN
460     WRITE(msgBuf,'(A,A,A,A)') '// Read file(s) ',
461     & pref(s1Lo:s1Hi),'*',suff(s2Lo:s2Hi)
462     CALL PRINT_MESSAGE( msgBuf, standardMessageUnit, SQUEEZE_RIGHT, 1 )
463     ELSE
464     WRITE(msgBuf,'(A,A,A)') 'Error reading file ',pref(s1Lo:s1Hi),suff(s2Lo:s2Hi)
465     CALL PRINT_ERROR( msgBuf, 1 )
466     ENDIF
467    
468     1000 CONTINUE
469    
470     RETURN
471     END
472    
473     CStartofinterface
474     SUBROUTINE READ_FLD_XYZ_RL( pref ,suff, fld, myIter, myThid)
475     C /==========================================================\
476     C | SUBROUTINE READ_FLD_XYZ_RL |
477     C | o Generic three-dimensional field IO routine. |
478     C |==========================================================|
479     C | Call low-level routines to read a 3d model field. |
480     C | Handles _RL type data ( generally _RL == REAL*8 ) |
481     C \==========================================================/
482    
483     C == Global variables ==
484     #include "SIZE.h"
485 cnh 1.4 #include "EEPARAMS.h"
486 cnh 1.1 #include "PARAMS.h"
487 cnh 1.4 #include "DFILE.h"
488    
489     INTEGER IFNBLNK
490     EXTERNAL IFNBLNK
491     INTEGER ILNBLNK
492     EXTERNAL ILNBLNK
493     INTEGER IO_ERRCOUNT
494     EXTERNAL IO_ERRCOUNT
495     CEndofinterface
496    
497     C == Routine arguments ==
498     C pref - File name prefix
499     C suff - File name suffix
500     C fld - Array to be filled
501     C myIter - Timestep number
502     C myThid - Thread number calling this routine
503     CHARACTER*(*) pref
504     CHARACTER*(*) suff
505     _RL fld(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nZ,nSx,nSy)
506     INTEGER myIter
507     INTEGER myThid
508    
509     C == Local variables ==
510     C fNamData - Filename building strings
511     C fNamMeta
512     C fileHandle - Handle used to refer to an open DFILE file.
513     C lFilled - Used to indicate the number of elements in the
514     C IO buffer that have been filled.
515     C nXP, nYp - Processes domain extents in X and Y.
516     C iP, jP, kP - Index in processes coordinates.
517     C ib - Index in IO buffer
518     C i, j, k, bi, bj - Loop counters
519     C s1Lo, s1Hi, s2Lo, s2Hi - Substring indices
520     C nDims, dimList - Local and global dataset dimensions
521     CHARACTER*(MAX_LEN_FNAM) fNamData
522     CHARACTER*(MAX_LEN_FNAM) fNamMeta
523     INTEGER fileHandle
524     INTEGER lFilled
525     INTEGER nXP, nYP
526     INTEGER iP, jP, kP, ib
527 cnh 1.6 INTEGER i,j, k, bi, bj, iG, jG
528 cnh 1.4 INTEGER s1Lo, s1Hi, s2Lo, s2Hi
529     INTEGER nDims
530     PARAMETER ( nDims = 3 )
531     INTEGER dimList(nDims*3)
532     INTEGER beginIOErrCount, endIOErrCount
533     CHARACTER*(MAX_LEN_MBUF) msgBuf
534    
535     C-- Track IO errors
536     beginIOErrCount = IO_ERRCOUNT(myThid)
537    
538     C-- Build file name
539     C Name has form 'prefix.suffix'
540     C e.g. U.0000000100
541     C U.0000000100
542     s1Lo = IFNBLNK(pref)
543     s1Hi = ILNBLNK(pref)
544     s2Lo = IFNBLNK(suff)
545     s2Hi = ILNBLNK(suff)
546 cnh 1.6 IF ( suff .EQ. ' ' ) THEN
547     WRITE( fNamData, '(A)' )
548     & pref(s1Lo:s1Hi)
549     WRITE( fNamMeta, '(A)' )
550     & pref(s1Lo:s1Hi)
551     ELSE
552     WRITE( fNamData, '(A,A)' )
553 cnh 1.4 & pref(s1Lo:s1Hi),
554     & suff(s2Lo:s2Hi)
555 cnh 1.6 WRITE( fNamMeta, '(A,A)' )
556 cnh 1.4 & pref(s1Lo:s1Hi),
557     & suff(s2Lo:s2Hi)
558 cnh 1.6 ENDIF
559 cnh 1.4
560     C-- Open file
561     CALL DFILE_OPEN( fNamData, fNamMeta, myThid,
562     O fileHandle )
563     IF ( fileHandle .LE. 0 ) GOTO 1000
564    
565     C-- Set local and global data extents
566     nXP=sNx*nSx
567     nYP=sNy*nSy
568 cnh 1.6 lFilled = sNx*nSx*nPx * sNy*nSy*nPy * nZ
569 cnh 1.4 dimList(1) = nXP*nPx
570     dimList(2) = myXGlobalLo
571     dimList(3) = myXGlobalLo+nXP-1
572     dimList(4) = nYP*nPy
573     dimList(5) = myYGlobalLo
574     dimList(6) = myYGlobalLo+nYP-1
575     dimList(7) = nZ
576     dimList(8) = 1
577     dimList(9) = nZ
578    
579     C-- Read data
580     IF ( readBinaryPrec .EQ. precFloat32 ) THEN
581     CALL DFILE_READ_R4( lFilled,
582     I fileHandle, myThid )
583     ELSE
584     CALL DFILE_READ_R8( lFilled,
585     I fileHandle, myThid )
586     ENDIF
587    
588     C-- Copy data from IO buffer.
589     C Also regrid it to i,j,k indexing.
590     IF ( readBinaryPrec .EQ. precFloat32 ) THEN
591     DO bj=1,nSy
592     DO bi=1,nSx
593     DO K=1,nZ
594     DO j=1,sNy
595     DO i=1,sNx
596     iP = (bi-1)*sNx+i
597     jP = (bj-1)*sNy+j
598     kP = K
599 cnh 1.6 iG = myXGlobalLo-1+(bi-1)*sNx+I
600     jG = myYGlobalLo-1+(bj-1)*sNy+J
601     ib = (kP-1)*nXp*nPx*nYp*nPy+(jG-1)*nXp*nPx+iG
602 cnh 1.4 fld(i,j,k,bi,bj) = ioBuf_R4(ib)
603     ENDDO
604     ENDDO
605     ENDDO
606     ENDDO
607     ENDDO
608     ELSE
609     DO bj=1,nSy
610     DO bi=1,nSx
611     DO K=1,nZ
612     DO j=1,sNy
613     DO i=1,sNx
614     iP = (bi-1)*sNx+i
615     jP = (bj-1)*sNy+j
616 cnh 1.6 kP = K
617     iG = myXGlobalLo-1+(bi-1)*sNx+I
618     jG = myYGlobalLo-1+(bj-1)*sNy+J
619     ib = (kP-1)*nXp*nPx*nYp*nPy+(jG-1)*nXp*nPx+iG
620 cnh 1.4 fld(i,j,k,bi,bj) = ioBuf_R8(ib)
621     ENDDO
622     ENDDO
623     ENDDO
624     ENDDO
625     ENDDO
626     ENDIF
627    
628     C-- Close file
629     CALL DFILE_CLOSE( fileHandle, myThid )
630    
631     C-- Check errors
632     endIOerrCount = IO_ERRCOUNT(myThid)
633     IF ( endIOErrCount .EQ. beginIOErrCount ) THEN
634     WRITE(msgBuf,'(A,A,A,A)') '// Read file(s) ',
635     & pref(s1Lo:s1Hi),'*',suff(s2Lo:s2Hi)
636     CALL PRINT_MESSAGE( msgBuf, standardMessageUnit, SQUEEZE_RIGHT, 1 )
637     ELSE
638     WRITE(msgBuf,'(A,A,A)') 'Error reading file ',pref(s1Lo:s1Hi),suff(s2Lo:s2Hi)
639     CALL PRINT_ERROR( msgBuf, 1 )
640     ENDIF
641    
642     1000 CONTINUE
643    
644     RETURN
645     END
646    
647     CStartofinterface
648     SUBROUTINE READ_FLD_XYZ_RS( pref ,suff, fld, myIter, myThid)
649     C /==========================================================\
650     C | SUBROUTINE READ_FLD_XYZ_RS |
651     C | o Generic three-dimensional field IO routine. |
652     C |==========================================================|
653     C | Call low-level routines to read a 3d model field. |
654     C | Handles _RS type data ( generally _RS == REAL*4 ) |
655     C \==========================================================/
656    
657     C == Global variables ==
658     #include "SIZE.h"
659 cnh 1.1 #include "EEPARAMS.h"
660 cnh 1.4 #include "PARAMS.h"
661 cnh 1.1 #include "DFILE.h"
662    
663     INTEGER IFNBLNK
664     EXTERNAL IFNBLNK
665     INTEGER ILNBLNK
666     EXTERNAL ILNBLNK
667     INTEGER IO_ERRCOUNT
668     EXTERNAL IO_ERRCOUNT
669     CEndofinterface
670    
671     C == Routine arguments ==
672     C pref - File name prefix
673     C suff - File name suffix
674     C fld - Array to be filled
675     C myIter - Timestep number
676     C myThid - Thread number calling this routine
677     CHARACTER*(*) pref
678     CHARACTER*(*) suff
679 cnh 1.4 _RS fld(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nZ,nSx,nSy)
680 cnh 1.1 INTEGER myIter
681     INTEGER myThid
682    
683     C == Local variables ==
684     C fNamData - Filename building strings
685     C fNamMeta
686     C fileHandle - Handle used to refer to an open DFILE file.
687     C lFilled - Used to indicate the number of elements in the
688     C IO buffer that have been filled.
689     C nXP, nYp - Processes domain extents in X and Y.
690     C iP, jP, kP - Index in processes coordinates.
691     C ib - Index in IO buffer
692     C i, j, k, bi, bj - Loop counters
693     C s1Lo, s1Hi, s2Lo, s2Hi - Substring indices
694     C nDims, dimList - Local and global dataset dimensions
695     CHARACTER*(MAX_LEN_FNAM) fNamData
696     CHARACTER*(MAX_LEN_FNAM) fNamMeta
697     INTEGER fileHandle
698     INTEGER lFilled
699     INTEGER nXP, nYP
700     INTEGER iP, jP, kP, ib
701 cnh 1.6 INTEGER i,j, k, bi, bj, iG , jG
702 cnh 1.1 INTEGER s1Lo, s1Hi, s2Lo, s2Hi
703     INTEGER nDims
704     PARAMETER ( nDims = 3 )
705     INTEGER dimList(nDims*3)
706     INTEGER beginIOErrCount, endIOErrCount
707     CHARACTER*(MAX_LEN_MBUF) msgBuf
708    
709     C-- Track IO errors
710     beginIOErrCount = IO_ERRCOUNT(myThid)
711    
712     C-- Build file name
713     C Name has form 'prefix.suffix'
714     C e.g. U.0000000100
715     C U.0000000100
716     s1Lo = IFNBLNK(pref)
717     s1Hi = ILNBLNK(pref)
718     s2Lo = IFNBLNK(suff)
719     s2Hi = ILNBLNK(suff)
720 cnh 1.6 IF ( suff .EQ. ' ' ) THEN
721     WRITE( fNamData, '(A)' )
722     & pref(s1Lo:s1Hi)
723     WRITE( fNamMeta, '(A)' )
724     & pref(s1Lo:s1Hi)
725     ELSE
726     WRITE( fNamData, '(A,A)' )
727 cnh 1.1 & pref(s1Lo:s1Hi),
728     & suff(s2Lo:s2Hi)
729 cnh 1.6 WRITE( fNamMeta, '(A,A)' )
730 cnh 1.1 & pref(s1Lo:s1Hi),
731     & suff(s2Lo:s2Hi)
732 cnh 1.6 ENDIF
733    
734 cnh 1.1 C-- Open file
735     CALL DFILE_OPEN( fNamData, fNamMeta, myThid,
736     O fileHandle )
737     IF ( fileHandle .LE. 0 ) GOTO 1000
738    
739     C-- Set local and global data extents
740     nXP=sNx*nSx
741     nYP=sNy*nSy
742 cnh 1.6 lFilled = sNx*nSx*nPx * sNy*nSy*nPy * nZ
743 cnh 1.1 dimList(1) = nXP*nPx
744     dimList(2) = myXGlobalLo
745     dimList(3) = myXGlobalLo+nXP-1
746     dimList(4) = nYP*nPy
747     dimList(5) = myYGlobalLo
748     dimList(6) = myYGlobalLo+nYP-1
749     dimList(7) = nZ
750     dimList(8) = 1
751     dimList(9) = nZ
752    
753     C-- Read data
754     IF ( readBinaryPrec .EQ. precFloat32 ) THEN
755     CALL DFILE_READ_R4( lFilled,
756     I fileHandle, myThid )
757     ELSE
758     CALL DFILE_READ_R8( lFilled,
759     I fileHandle, myThid )
760     ENDIF
761    
762     C-- Copy data from IO buffer.
763     C Also regrid it to i,j,k indexing.
764     IF ( readBinaryPrec .EQ. precFloat32 ) THEN
765     DO bj=1,nSy
766     DO bi=1,nSx
767     DO K=1,nZ
768     DO j=1,sNy
769     DO i=1,sNx
770     iP = (bi-1)*sNx+i
771     jP = (bj-1)*sNy+j
772     kP = K
773 cnh 1.6 iG = myXGlobalLo-1+(bi-1)*sNx+I
774     jG = myYGlobalLo-1+(bj-1)*sNy+J
775     ib = (kP-1)*nXp*nPx*nYp*nPy+(jG-1)*nXp*nPx+iG
776 cnh 1.1 fld(i,j,k,bi,bj) = ioBuf_R4(ib)
777     ENDDO
778     ENDDO
779     ENDDO
780     ENDDO
781     ENDDO
782     ELSE
783     DO bj=1,nSy
784     DO bi=1,nSx
785     DO K=1,nZ
786     DO j=1,sNy
787     DO i=1,sNx
788     iP = (bi-1)*sNx+i
789     jP = (bj-1)*sNy+j
790 cnh 1.6 kP = K
791     iG = myXGlobalLo-1+(bi-1)*sNx+I
792     jG = myYGlobalLo-1+(bj-1)*sNy+J
793     ib = (kP-1)*nXp*nPx*nYp*nPy+(jG-1)*nXp*nPx+iG
794 cnh 1.1 fld(i,j,k,bi,bj) = ioBuf_R8(ib)
795     ENDDO
796     ENDDO
797     ENDDO
798     ENDDO
799     ENDDO
800     ENDIF
801    
802     C-- Close file
803     CALL DFILE_CLOSE( fileHandle, myThid )
804    
805     C-- Check errors
806     endIOerrCount = IO_ERRCOUNT(myThid)
807     IF ( endIOErrCount .EQ. beginIOErrCount ) THEN
808     WRITE(msgBuf,'(A,A,A,A)') '// Read file(s) ',
809     & pref(s1Lo:s1Hi),'*',suff(s2Lo:s2Hi)
810     CALL PRINT_MESSAGE( msgBuf, standardMessageUnit, SQUEEZE_RIGHT, 1 )
811     ELSE
812     WRITE(msgBuf,'(A,A,A)') 'Error reading file ',pref(s1Lo:s1Hi),suff(s2Lo:s2Hi)
813     CALL PRINT_ERROR( msgBuf, 1 )
814     ENDIF
815    
816     1000 CONTINUE
817    
818     RETURN
819     END
820    
821     CStartofinterface
822     SUBROUTINE WRITE_1D_I( fld, lFld, index_type, head, comment )
823     C /==========================================================\
824     C | o SUBROUTINE WRITE_1D_I |
825     C | Controls formatted, tabular I/O for a one-dimensional |
826     C | INTEGER field. |
827     C |==========================================================|
828     C | This routine produces a standard format for list |
829     C | one-dimensional INTEGER data in textual form. The format |
830     C | is designed to be readily parsed by a post-processing |
831     C | utility. |
832     C \==========================================================/
833    
834     C == Global data ==
835     #include "SIZE.h"
836     #include "EEPARAMS.h"
837    
838     C == Routine arguments ==
839     C fld - Field to be printed
840     C lFld - Number of elements in field fld.
841     C index_type - Type of index labelling (I=,J=,...) to use
842     C head - Statement start e.g. phi =
843     C comment - Descriptive comment for field
844     INTEGER lFld
845     INTEGER fld(lFld)
846     INTEGER index_type
847     CHARACTER*(*) head
848     CHARACTER*(*) comment
849     CEndofinterface
850    
851     C == Local variables ==
852     CHARACTER*(MAX_LEN_MBUF) msgBuf
853    
854     WRITE(msgBuf,'(A,A)') head, comment
855     CALL PRINT_MESSAGE( msgBuf, standardMessageUnit, SQUEEZE_RIGHT , 1)
856     CALL PRINT_LIST_I( fld, lFld, index_type, standardMessageUnit )
857     WRITE(msgBuf,'(A)') ' ; '
858     CALL PRINT_MESSAGE( msgBuf, standardMessageUnit, SQUEEZE_RIGHT , 1)
859     C
860     RETURN
861     END
862    
863     CStartofinterface
864     SUBROUTINE WRITE_1D_L( fld, lFld, index_type, head, comment )
865     C /==========================================================\
866     C | o SUBROUTINE WRITE_1D_L |
867     C | Controls formatted, tabular I/O for a one-dimensional |
868     C | LOGICAL field. |
869     C |==========================================================|
870     C | This routine produces a standard format for list |
871     C | one-dimensional LOGICAL data in textual form. The format |
872     C | is designed to be readily parsed by a post-processing |
873     C | utility. |
874     C \==========================================================/
875    
876     C == Global data ==
877     #include "SIZE.h"
878     #include "EEPARAMS.h"
879    
880     C == Routine arguments ==
881     C fld - Field to be printed
882     C lFld - Number of elements in field fld.
883     C index_type - Type of index labelling (I=,J=,...) to use
884     C head - Statement start e.g. phi =
885     C comment - Descriptive comment for field
886     INTEGER lFld
887     LOGICAL fld(lFld)
888     INTEGER index_type
889     CHARACTER*(*) head
890     CHARACTER*(*) comment
891     CEndofinterface
892    
893     C == Local variables ==
894     CHARACTER*(MAX_LEN_MBUF) msgBuf
895    
896     WRITE(msgBuf,'(A,A)') head, comment
897     CALL PRINT_MESSAGE( msgBuf, standardMessageUnit, SQUEEZE_RIGHT , 1)
898     CALL PRINT_LIST_L( fld, lFld, index_type, standardMessageUnit )
899     WRITE(msgBuf,'(A)') ' ; '
900     CALL PRINT_MESSAGE( msgBuf, standardMessageUnit, SQUEEZE_RIGHT , 1)
901     C
902     RETURN
903     END
904    
905     CStartofinterface
906     SUBROUTINE WRITE_1D_R8( fld, lFld, index_type, head, comment )
907     C /==========================================================\
908     C | o SUBROUTINE WRITE_1D_R8 |
909     C | Controls formatted, tabular I/O for a one-dimensional |
910     C | real*8 field. |
911     C |==========================================================|
912     C | This routine produces a standard format for list |
913     C | one-dimensional real*8 data in textual form. The format |
914     C | is designed to be readilya parsed by a post-processing |
915     C | utility. |
916     C \==========================================================/
917    
918     C == Global data ==
919     #include "SIZE.h"
920     #include "EEPARAMS.h"
921    
922     C == Routine arguments ==
923     C fld - Field to be printed
924     C lFld - Number of elements in field fld.
925     C index_type - Type of index labelling (I=,J=,...) to use
926     C head - Statement start e.g. phi =
927     C comment - Descriptive comment for field
928     INTEGER lFld
929     Real*8 fld(lFld)
930     INTEGER index_type
931     CHARACTER*(*) head
932     CHARACTER*(*) comment
933     CEndofinterface
934    
935     C == Local variables ==
936     CHARACTER*(MAX_LEN_MBUF) msgBuf
937    
938     WRITE(msgBuf,'(A,A)') head, comment
939     CALL PRINT_MESSAGE( msgBuf, standardMessageUnit, SQUEEZE_RIGHT , 1)
940     CALL PRINT_LIST_R8( fld, lFld, index_type, standardMessageUnit )
941     WRITE(msgBuf,'(A)') ' ; '
942     CALL PRINT_MESSAGE( msgBuf, standardMessageUnit, SQUEEZE_RIGHT , 1)
943     C
944     RETURN
945     END
946    
947     CStartofinterface
948     SUBROUTINE WRITE_FLD_XY_RL( pref ,suff, fld, myIter, myThid)
949     C /==========================================================\
950     C | SUBROUTINE WRITE_FLD_XY_RL |
951     C | o Generic two-dimensional field IO routine. |
952     C |==========================================================|
953     C | Call low-level routines to write a model 2d model field. |
954     C | Handles _RL type data ( generally _RL == REAL*8 ) |
955     C \==========================================================/
956    
957     C == Global variables ==
958     #include "SIZE.h"
959 cnh 1.4 #include "EEPARAMS.h"
960 cnh 1.1 #include "PARAMS.h"
961     #include "DFILE.h"
962    
963     INTEGER IFNBLNK
964     EXTERNAL IFNBLNK
965     INTEGER ILNBLNK
966     EXTERNAL ILNBLNK
967     INTEGER IO_ERRCOUNT
968     EXTERNAL IO_ERRCOUNT
969     CEndofinterface
970    
971     C == Routine arguments ==
972     C pref - File name prefix
973     C suff - File name suffix
974     C fld - Data to be written
975     C myIter - Timestep number
976     C myThid - Thread number calling this routine
977     CHARACTER*(*) pref
978     CHARACTER*(*) suff
979     _RL fld(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
980     INTEGER myIter
981     INTEGER myThid
982    
983     C == Local variables ==
984     C fNamData - Filename building strings
985     C fNamMeta
986     C fileHandle - Handle used to refer to an open DFILE file.
987     C lFilled - Used to indicate the number of elements in the
988     C IO buffer that have been filled.
989     C nXP, nYp - Processes domain extents in X and Y.
990     C iP, jP, kP - Index in processes coordinates.
991     C ib - Index in IO buffer
992     C i, j, k, bi, bj - Loop counters
993     C s1Lo, s1Hi, s2Lo, s2Hi - Substring indices
994     C nDims, dimList - Local and global dataset dimensions
995     CHARACTER*(MAX_LEN_FNAM) fNamData
996     CHARACTER*(MAX_LEN_FNAM) fNamMeta
997     INTEGER fileHandle
998     INTEGER lFilled
999     INTEGER nXP, nYP
1000     INTEGER iP, jP, kP, ib
1001     INTEGER i,j, k, bi, bj
1002     INTEGER s1Lo, s1Hi, s2Lo, s2Hi
1003     INTEGER nDims
1004     PARAMETER ( nDims = 2 )
1005     INTEGER dimList(nDims*3)
1006     INTEGER beginIOErrCount, endIOErrCount
1007     CHARACTER*(MAX_LEN_MBUF) msgBuf
1008    
1009     C-- Track IO errors
1010     beginIOErrCount = IO_ERRCOUNT(myThid)
1011    
1012     C-- Build file name
1013     C Name has form 'prefix.pPID.tTID.class.suffix'
1014     C e.g. U.p0001.t0001.data.0000000100
1015     C U.p0001.t0001.meta.0000000100
1016     s1Lo = IFNBLNK(pref)
1017     s1Hi = ILNBLNK(pref)
1018     s2Lo = IFNBLNK(suff)
1019     s2Hi = ILNBLNK(suff)
1020     WRITE( fNamData, '(A,A,I4.4,A,I4.4,A,A)' )
1021     & pref(s1Lo:s1Hi),
1022     & 'p',myProcId,'.t',myThid, '.data.',
1023     & suff(s2Lo:s2Hi)
1024     WRITE( fNamMeta, '(A,A,I4.4,A,I4.4,A,A)' )
1025     & pref(s1Lo:s1Hi),
1026     & 'p',myProcId,'.t',myThid, '.meta.',
1027     & suff(s2Lo:s2Hi)
1028    
1029     C-- Open file
1030     CALL DFILE_OPEN( fNamData, fNamMeta, myThid,
1031     O fileHandle )
1032     IF ( fileHandle .LE. 0 ) GOTO 1000
1033    
1034     C-- Copy data to IO buffer.
1035     C Also regrid it to i,j,k indexing.
1036     nXP=sNx*nSx
1037     nYP=sNy*nSy
1038     lFilled = sNx*nSx * sNy*nSy
1039     IF ( writeBinaryPrec .EQ. precFloat32 ) THEN
1040     DO bj=1,nSy
1041     DO bi=1,nSx
1042     DO j=1,sNy
1043     DO i=1,sNx
1044     iP = (bi-1)*sNx+i
1045     jP = (bj-1)*sNy+j
1046     ib = (jP-1)*nXP + iP
1047     ioBuf_R4(ib) = fld(i,j,bi,bj)
1048     ENDDO
1049     ENDDO
1050     ENDDO
1051     ENDDO
1052     ELSE
1053     DO bj=1,nSy
1054     DO bi=1,nSx
1055     DO j=1,sNy
1056     DO i=1,sNx
1057     iP = (bi-1)*sNx+i
1058     jP = (bj-1)*sNy+j
1059     ib = (jP-1)*nXP + iP
1060     ioBuf_R8(ib) = fld(i,j,bi,bj)
1061     ENDDO
1062     ENDDO
1063     ENDDO
1064     ENDDO
1065     ENDIF
1066    
1067     C-- Set local and global data extents
1068     dimList(1) = nXP*nPx
1069     dimList(2) = myXGlobalLo
1070     dimList(3) = myXGlobalLo+nXP-1
1071     dimList(4) = nYP*nPy
1072     dimList(5) = myYGlobalLo
1073     dimList(6) = myYGlobalLo+nYP-1
1074    
1075     C-- Write data
1076     IF ( writeBinaryPrec .EQ. precFloat32 ) THEN
1077     CALL DFILE_WRITE_R4( lFilled,
1078     I nDims, dimList,
1079     I fileHandle, myIter, myThid )
1080     ELSE
1081     CALL DFILE_WRITE_R8( lFilled,
1082     I nDims, dimList,
1083     I fileHandle, myIter, myThid )
1084     ENDIF
1085    
1086     C-- Close file
1087     CALL DFILE_CLOSE( fileHandle, myThid )
1088    
1089     C-- Check errors
1090     endIOerrCount = IO_ERRCOUNT(myThid)
1091     IF ( endIOErrCount .EQ. beginIOErrCount ) THEN
1092     WRITE(msgBuf,'(A,A,A,A)') '// Wrote file(s) ',
1093     & pref(s1Lo:s1Hi),'*',suff(s2Lo:s2Hi)
1094     CALL PRINT_MESSAGE( msgBuf, standardMessageUnit, SQUEEZE_RIGHT, 1 )
1095     ELSE
1096     WRITE(msgBuf,'(A,A,A)') 'Error writing file ',pref(s1Lo:s1Hi),suff(s2Lo:s2Hi)
1097     CALL PRINT_ERROR( msgBuf, 1 )
1098     ENDIF
1099    
1100     1000 CONTINUE
1101    
1102     RETURN
1103     END
1104    
1105     CStartofinterface
1106     SUBROUTINE WRITE_FLD_XYZ_RL( pref ,suff, fld, myIter, myThid)
1107     C /==========================================================\
1108     C | SUBROUTINE WRITE_FLD_XYZ_RL |
1109     C | o Generic three-dimensional field IO routine. |
1110     C |==========================================================|
1111     C | Call low-level routines to write a model 3d model field. |
1112     C | Handles _RL type data ( generally _RL == REAL*8 ) |
1113     C \==========================================================/
1114    
1115     C == Global variables ==
1116     #include "SIZE.h"
1117 cnh 1.4 #include "EEPARAMS.h"
1118 cnh 1.1 #include "PARAMS.h"
1119     #include "DFILE.h"
1120    
1121     INTEGER IFNBLNK
1122     EXTERNAL IFNBLNK
1123     INTEGER ILNBLNK
1124     EXTERNAL ILNBLNK
1125     INTEGER IO_ERRCOUNT
1126     EXTERNAL IO_ERRCOUNT
1127     CEndofinterface
1128    
1129     C == Routine arguments ==
1130     C pref - File name prefix
1131     C suff - File name suffix
1132     C fld - Data to be written
1133     C myIter - Timestep number
1134     C myThid - Thread number calling this routine
1135     CHARACTER*(*) pref
1136     CHARACTER*(*) suff
1137     _RL fld(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nz,nSx,nSy)
1138     INTEGER myThid
1139     INTEGER myIter
1140    
1141     C == Local variables ==
1142     C fNamData - Filename building strings
1143     C fNamMeta
1144     C fileHandle - Handle used to refer to an open DFILE file.
1145     C lFilled - Used to indicate the number of elements in the
1146     C IO buffer that have been filled.
1147     C nXP, nYp - Processes domain extents in X and Y.
1148     C iP, jP, kP - Index in processes coordinates.
1149     C ib - Index in IO buffer
1150     C i, j, k, bi, bj - Loop counters
1151     C s1Lo, s1Hi, s2Lo, s2Hi - Substring indices
1152     C nDims, dimList - Local and global dataset dimensions
1153     CHARACTER*(MAX_LEN_FNAM) fNamData
1154     CHARACTER*(MAX_LEN_FNAM) fNamMeta
1155     INTEGER fileHandle
1156     INTEGER lFilled
1157     INTEGER nXP, nYP
1158     INTEGER iP, jP, kP, ib
1159     INTEGER i,j, k, bi, bj
1160     INTEGER s1Lo, s1Hi, s2Lo, s2Hi
1161     INTEGER nDims
1162     PARAMETER ( nDims = 3 )
1163     INTEGER dimList(nDims*3)
1164     INTEGER beginIOErrCount, endIOErrCount
1165     CHARACTER*(MAX_LEN_MBUF) msgBuf
1166    
1167     C-- Track IO errors
1168     beginIOErrCount = IO_ERRCOUNT(myThid)
1169    
1170     C-- Build file name
1171     C Name has form 'prefix.pPID.tTID.class.suffix'
1172     C e.g. U.p0001.t0001.data.0000000100
1173     C U.p0001.t0001.meta.0000000100
1174     s1Lo = IFNBLNK(pref)
1175     s1Hi = ILNBLNK(pref)
1176     s2Lo = IFNBLNK(suff)
1177     s2Hi = ILNBLNK(suff)
1178     WRITE( fNamData, '(A,A,I4.4,A,I4.4,A,A)' )
1179     & pref(s1Lo:s1Hi),
1180     & 'p',myProcId,'.t',myThid, '.data.',
1181     & suff(s2Lo:s2Hi)
1182     WRITE( fNamMeta, '(A,A,I4.4,A,I4.4,A,A)' )
1183     & pref(s1Lo:s1Hi),
1184     & 'p',myProcId,'.t',myThid, '.meta.',
1185     & suff(s2Lo:s2Hi)
1186    
1187     C-- Open file
1188     CALL DFILE_OPEN( fNamData, fNamMeta, myThid,
1189     O fileHandle )
1190     IF ( fileHandle .LE. 0 ) GOTO 1000
1191    
1192     C-- Copy data to IO buffer.
1193     C Also regrid it to i,j,k indexing.
1194     nXP=sNx*nSx
1195     nYP=sNy*nSy
1196     lFilled = sNx*nSx * sNy*nSy * Nz
1197     IF ( writeBinaryPrec .EQ. precFloat32 ) THEN
1198     DO bj=1,nSy
1199     DO bi=1,nSx
1200     DO k=1,Nz
1201     DO j=1,sNy
1202     DO i=1,sNx
1203     iP = (bi-1)*sNx+i
1204     jP = (bj-1)*sNy+j
1205     kP = k
1206     ib = (kP-1)*nXP*nYP + (jP-1)*nXP + iP
1207     ioBuf_R4(ib) = fld(i,j,k,bi,bj)
1208     ENDDO
1209     ENDDO
1210     ENDDO
1211     ENDDO
1212     ENDDO
1213     ELSE
1214     DO bj=1,nSy
1215     DO bi=1,nSx
1216     DO k=1,Nz
1217     DO j=1,sNy
1218     DO i=1,sNx
1219     iP = (bi-1)*sNx+i
1220     jP = (bj-1)*sNy+j
1221     kP = k
1222     ib = (kP-1)*nXP*nYP + (jP-1)*nXP + iP
1223     ioBuf_R8(ib) = fld(i,j,k,bi,bj)
1224     ENDDO
1225     ENDDO
1226     ENDDO
1227     ENDDO
1228     ENDDO
1229     ENDIF
1230    
1231     C-- Set local and global data extents
1232     dimList(1) = nXP*nPx
1233     dimList(2) = myXGlobalLo
1234     dimList(3) = myXGlobalLo+nXP-1
1235     dimList(4) = nYP*nPy
1236     dimList(5) = myYGlobalLo
1237     dimList(6) = myYGlobalLo+nYP-1
1238     dimList(7) = nZ
1239     dimList(8) = 1
1240     dimList(9) = nZ
1241    
1242     C-- Write data
1243     IF ( writeBinaryPrec .EQ. precFloat32 ) THEN
1244     CALL DFILE_WRITE_R4( lFilled,
1245     I nDims, dimList,
1246     I fileHandle, myIter, myThid )
1247     ELSE
1248     CALL DFILE_WRITE_R8( lFilled,
1249     I nDims, dimList,
1250     I fileHandle, myIter, myThid )
1251     ENDIF
1252    
1253     C-- Close file
1254     CALL DFILE_CLOSE( fileHandle, myThid )
1255    
1256     C-- Check errors
1257     endIOerrCount = IO_ERRCOUNT(myThid)
1258     IF ( endIOErrCount .EQ. beginIOErrCount ) THEN
1259     WRITE(msgBuf,'(A,A,A,A)') '// Wrote file(s) ',
1260     & pref(s1Lo:s1Hi),'*',suff(s2Lo:s2Hi)
1261     CALL PRINT_MESSAGE( msgBuf, standardMessageUnit, SQUEEZE_RIGHT, 1 )
1262     ELSE
1263     WRITE(msgBuf,'(A,A,A)') 'Error writing file ',pref(s1Lo:s1Hi),suff(s2Lo:s2Hi)
1264     CALL PRINT_ERROR( msgBuf, 1 )
1265     ENDIF
1266    
1267     1000 CONTINUE
1268    
1269     RETURN
1270     END
1271    
1272     CStartofinterface
1273     SUBROUTINE WRITE_CHECKPOINT ( modelEnd, myCurrentTime, myIter, myThid )
1274     C /==========================================================\
1275 cnh 1.4 C | SUBROUTINE WRITE_CHECKPOINT |
1276 cnh 1.1 C | o Controlling routine for IO to write restart file. |
1277     C |==========================================================|
1278     C | Write model checkpoint files for use in restart. |
1279     C | This routine writes both "rolling-checkpoint" files |
1280     C | and permanent checkpoint files. A rolling checkpoint |
1281     C | works through a circular list of suffices. Generally the |
1282     C | circular list has two entries so that a rolling |
1283     C | checkpoint will overwrite the last rolling checkpoint |
1284     C | but one. This is useful for running long jobs without |
1285     C | filling too much disk space. |
1286     C | In a permanent checkpoint data is written suffixed by |
1287     C | the current timestep number. This sort of checkpoint can |
1288     C | be used to provided a snap-shot from which the model |
1289     C | can be rerun. |
1290     C \==========================================================/
1291    
1292     C == Global variables ===
1293     #include "SIZE.h"
1294     #include "EEPARAMS.h"
1295     #include "PARAMS.h"
1296     #include "DYNVARS.h"
1297     #include "CG2D.h"
1298    
1299     LOGICAL DIFFERENT_MULTIPLE
1300     EXTERNAL DIFFERENT_MULTIPLE
1301     INTEGER IO_ERRCOUNT
1302     EXTERNAL IO_ERRCOUNT
1303    
1304     C == Routine arguments ==
1305     C modelEnd - Checkpoint call at end of model run.
1306     C myThid - Thread number for this instance of the routine.
1307     C myIter - Iteration number
1308     C myCurrentTime - Current time of simulation ( s )
1309     LOGICAL modelEnd
1310     INTEGER myThid
1311     INTEGER myIter
1312     REAL myCurrentTime
1313     CEndofinterface
1314    
1315     C == Local variables ==
1316     C suff - Hold suffix part of a filename
1317     C beginIOErrCount - Begin and end IO error counts
1318     C endIOErrCount
1319     C msgBuf - Error message buffer
1320     C permCheckPoint - Flag indicating whether a permanent checkpoint will
1321     C be written.
1322     CHARACTER*(MAX_LEN_FNAM) suff
1323     INTEGER beginIOErrCount
1324     INTEGER endIOErrCount
1325     CHARACTER*(MAX_LEN_MBUF) msgBuf
1326     LOGICAL permCheckPoint
1327    
1328     permCheckPoint = .FALSE.
1329     permCheckPoint=
1330     & DIFFERENT_MULTIPLE(pChkptFreq,myCurrentTime,myCurrentTime-deltaTClock)
1331    
1332     IF (
1333     & (.NOT. modelEnd .AND. (
1334     & permCheckPoint
1335     & .OR.
1336     & DIFFERENT_MULTIPLE(chkptFreq,myCurrentTime,myCurrentTime-deltaTClock)
1337     & )
1338     & )
1339     & .OR.
1340     & (
1341     & modelEnd
1342     & .AND. .NOT.
1343     & permCheckPoint
1344     & .AND. .NOT.
1345     & DIFFERENT_MULTIPLE(chkptFreq,myCurrentTime,myCurrentTime-deltaTClock)
1346     & )
1347     & ) THEN
1348    
1349     C-- Going to really do some IO. Make everyone except master thread wait.
1350     _BARRIER
1351     _BEGIN_MASTER( myThid )
1352    
1353     C-- Set suffix for this set of data files.
1354     suff = checkPtSuff(nCheckLev)
1355     IF ( permCheckPoint ) THEN
1356     WRITE(suff,'(I10.10)') myIter
1357     ENDIF
1358    
1359     C-- Set IO "context" for writing state
1360     CALL DFILE_SET_RW
1361     CALL DFILE_SET_CONT_ON_ERROR
1362     C Force 64-bit IO
1363     writeBinaryPrec = precFloat64
1364    
1365    
1366     C-- Read IO error counter
1367     beginIOErrCount = IO_ERRCOUNT(myThid)
1368    
1369     C-- Write model fields
1370     C Raw fields
1371     CALL WRITE_FLD_XYZ_RL( 'uVel.',suff, uVel, myIter, myThid)
1372     CALL WRITE_FLD_XYZ_RL( 'gU.',suff, gU, myIter, myThid)
1373     CALL WRITE_FLD_XYZ_RL( 'gUNm1.',suff, gUNm1, myIter, myThid)
1374     CALL WRITE_FLD_XYZ_RL( 'vVel.',suff, vVel, myIter, myThid)
1375     CALL WRITE_FLD_XYZ_RL( 'gV.',suff, gV, myIter, myThid)
1376     CALL WRITE_FLD_XYZ_RL( 'gVNm1.',suff, gVNm1, myIter, myThid)
1377     CALL WRITE_FLD_XYZ_RL( 'theta.',suff, theta, myIter, myThid)
1378     CALL WRITE_FLD_XYZ_RL( 'gT.',suff, gT, myIter, myThid)
1379     CALL WRITE_FLD_XYZ_RL( 'gTNm1.',suff, gTNm1, myIter, myThid)
1380     CALL WRITE_FLD_XYZ_RL( 'salt.',suff, salt, myIter, myThid)
1381     CALL WRITE_FLD_XYZ_RL( 'gS.',suff, gS, myIter, myThid)
1382     CALL WRITE_FLD_XYZ_RL( 'gSNm1.',suff, gSNm1, myIter, myThid)
1383     CALL WRITE_FLD_XY_RL ( 'cg2d_x.',suff, cg2d_x, myIter, myThid)
1384 cnh 1.2 #ifdef ALLOW_CD
1385     CALL WRITE_FLD_XY_RL ( 'cg2d_xNM1.',suff, cg2d_xNM1, myIter, myThid)
1386     CALL WRITE_FLD_XYZ_RL( 'uVelD.',suff, uVelD, myIter, myThid)
1387     CALL WRITE_FLD_XYZ_RL( 'vVelD.',suff, vVelD, myIter, myThid)
1388     CALL WRITE_FLD_XYZ_RL( 'uNM1.', suff, uNM1, myIter, myThid)
1389     CALL WRITE_FLD_XYZ_RL( 'vNM1.', suff, vNM1, myIter, myThid)
1390     CALL WRITE_FLD_XYZ_RL( 'guCD.', suff, guCD, myIter, myThid)
1391     CALL WRITE_FLD_XYZ_RL( 'gvCD.', suff, gvCD, myIter, myThid)
1392     #endif
1393    
1394 cnh 1.1
1395     C-- Reread IO error counter
1396     endIOErrCount = IO_ERRCOUNT(myThid)
1397    
1398     C-- Check for IO errors
1399     IF ( endIOErrCount .NE. beginIOErrCount ) THEN
1400     WRITE(msgBuf,'(A)') 'S/R WRITE_CHECKPOINT'
1401     CALL PRINT_ERROR( msgBuf, 1 )
1402     WRITE(msgBuf,'(A)') 'Error writing out model checkpoint'
1403     CALL PRINT_ERROR( msgBuf, 1 )
1404     WRITE(msgBuf,'(A,I10)') 'Timestep ',myIter
1405     CALL PRINT_ERROR( msgBuf, 1 )
1406     ELSE
1407     WRITE(msgBuf,'(A,I10)') '// Model checkpoint written, timestep', myIter
1408     CALL PRINT_MESSAGE( msgBuf, standardMessageUnit, SQUEEZE_RIGHT, 1 )
1409     WRITE(msgBuf,'(A)') ' '
1410     CALL PRINT_MESSAGE( msgBuf, standardMessageUnit, SQUEEZE_RIGHT, 1 )
1411     C Wrote OK so step forward to use next checkpoint in loop.
1412     IF ( .NOT. permCheckPoint ) THEN
1413     nCheckLev = MOD(nCheckLev, maxNoChkptLev)+1
1414     ENDIF
1415     ENDIF
1416    
1417     _END_MASTER( myThid )
1418     _BARRIER
1419    
1420     ENDIF
1421    
1422     RETURN
1423     END
1424    
1425     CStartofinterface
1426     SUBROUTINE WRITE_STATE ( myCurrentTime, myIter, myThid )
1427     C /==========================================================\
1428     C | SUBROUTINE WRITE_STATE |
1429     C | o Controlling routine for IO to dump model state. |
1430     C |==========================================================|
1431     C | Write model state files for post-processing. This file |
1432     C | includes code for diagnosing W and RHO for output. |
1433     C \==========================================================/
1434    
1435     C == Global variables ===
1436     #include "SIZE.h"
1437     #include "EEPARAMS.h"
1438     #include "PARAMS.h"
1439     #include "DYNVARS.h"
1440     #include "CG2D.h"
1441    
1442     LOGICAL DIFFERENT_MULTIPLE
1443     EXTERNAL DIFFERENT_MULTIPLE
1444     INTEGER IO_ERRCOUNT
1445     EXTERNAL IO_ERRCOUNT
1446    
1447     C == Routine arguments ==
1448     C myThid - Thread number for this instance of the routine.
1449     C myIter - Iteration number
1450     C myCurrentTime - Current time of simulation ( s )
1451     INTEGER myThid
1452     INTEGER myIter
1453     REAL myCurrentTime
1454     CEndofinterface
1455    
1456     C == Local variables ==
1457     C suff - Hold suffix part of a filename
1458     C beginIOErrCount - Begin and end IO error counts
1459     C endIOErrCount
1460     C msgBuf - Error message buffer
1461     CHARACTER*(MAX_LEN_FNAM) suff
1462     INTEGER beginIOErrCount
1463     INTEGER endIOErrCount
1464     CHARACTER*(MAX_LEN_MBUF) msgBuf
1465    
1466     IF ( .NOT.
1467     & DIFFERENT_MULTIPLE(dumpFreq,myCurrentTime,myCurrentTime-deltaTClock)
1468     & ) RETURN
1469    
1470     C-- Going to really do some IO. Make everyone except master thread wait.
1471     _BARRIER
1472     _BEGIN_MASTER( myThid )
1473    
1474     C-- Set suffix for this set of data files.
1475     WRITE(suff,'(I10.10)') myIter
1476    
1477     C-- Set IO "context" for writing state
1478     CALL DFILE_SET_RW
1479     CALL DFILE_SET_CONT_ON_ERROR
1480     writeBinaryPrec = writeStatePrec
1481    
1482     C-- Read IO error counter
1483     beginIOErrCount = IO_ERRCOUNT(myThid)
1484    
1485     C-- Write model fields
1486     C Raw fields
1487     CALL WRITE_FLD_XYZ_RL( 'U.',suff, uVel, myIter, myThid)
1488     CALL WRITE_FLD_XYZ_RL( 'V.',suff, vVel, myIter, myThid)
1489     CALL WRITE_FLD_XYZ_RL( 'T.',suff, theta, myIter, myThid)
1490     CALL WRITE_FLD_XYZ_RL( 'S.',suff, salt, myIter, myThid)
1491     CALL WRITE_FLD_XY_RL ( 'H.',suff, cg2d_x, myIter, myThid)
1492     C Hmmm.... what to do atbout these huh
1493     C need to calculate them but remember we are already within a
1494     C _MASTER section. So we can not use multithreaded code.
1495     C We can still code as blocked but the block loop will be
1496     C bj=1,nSy and bi=1,nSx.
1497     C CALL WRITE_FLD_XYZ_RL( 'W.',suff, arr3d , myIter, myThid)
1498     C CALL WRITE_FLD_XYZ_RL( 'RHO.',suff, arr3d , myIter, myThid)
1499     C CALL WRITE_FLD_XYZ_RL('RHOP.',suff, arr3d , myIter, myThid)
1500     C CALL WRITE_FLD_XYZ_RL( 'PH.',suff, arr3d , myIter, myThid)
1501    
1502     C-- Reread IO error counter
1503     endIOErrCount = IO_ERRCOUNT(myThid)
1504    
1505     C-- Check for IO errors
1506     IF ( endIOErrCount .NE. beginIOErrCount ) THEN
1507     WRITE(msgBuf,'(A)') 'S/R WRITE_STATE'
1508     CALL PRINT_ERROR( msgBuf, 1 )
1509     WRITE(msgBuf,'(A)') 'Error writing out model state'
1510     CALL PRINT_ERROR( msgBuf, 1 )
1511     WRITE(msgBuf,'(A,I10)') 'Timestep ',myIter
1512     CALL PRINT_ERROR( msgBuf, 1 )
1513     ELSE
1514     WRITE(msgBuf,'(A,I10)') '// Model state written, timestep', myIter
1515     CALL PRINT_MESSAGE( msgBuf, standardMessageUnit, SQUEEZE_RIGHT, 1 )
1516     WRITE(msgBuf,'(A)') ' '
1517     CALL PRINT_MESSAGE( msgBuf, standardMessageUnit, SQUEEZE_RIGHT, 1 )
1518     ENDIF
1519    
1520     _END_MASTER( myThid )
1521     _BARRIER
1522    
1523     RETURN
1524     END

  ViewVC Help
Powered by ViewVC 1.1.22