/[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.12 - (show annotations) (download)
Wed Oct 28 03:11:38 1998 UTC (25 years, 8 months ago) by cnh
Branch: MAIN
CVS Tags: checkpoint17, checkpoint16
Changes since 1.11: +103 -52 lines
Changes to support
 - g77 compilation under Linux
 - LR(1) form of 64-bit is D or E for constants
 - Modified adjoint of exch with adjoint variables
   acuumulated.

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

  ViewVC Help
Powered by ViewVC 1.1.22