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

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

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


Revision 1.10 - (show annotations) (download)
Tue Jun 30 17:21:11 1998 UTC (26 years ago) by cnh
Branch: MAIN
CVS Tags: checkpoint11, checkpoint10, checkpoint13, checkpoint12, branch-point-rdot
Branch point for: branch-rdot
Changes since 1.9: +16 -2 lines
Changes to make checkpointing work again!

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

  ViewVC Help
Powered by ViewVC 1.1.22