/[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.1 - (show annotations) (download)
Thu May 21 18:25:49 1998 UTC (26 years ago) by cnh
Branch: MAIN
CVS Tags: checkpoint5, checkpoint4, checkpoint3, checkpoint2
Added support for binary IO of model fields for restart and/or
postprocessing

1 C $Header:$
2 #include "CPP_EEOPTIONS.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_CHKPT - 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
56 C-- Going to really do some IO. Make everyone except master thread wait.
57 _BARRIER
58 _BEGIN_MASTER( myThid )
59
60 C-- Set suffix for this set of data files.
61 WRITE(suff,'(I10.10)') myIter
62
63 C-- Set IO "context" for writing state
64 CALL DFILE_SET_RO
65 CALL DFILE_SET_CONT_ON_ERROR
66 C Force 64-bit IO
67 readBinaryPrec = precFloat64
68
69
70 C-- Read IO error counter
71 beginIOErrCount = IO_ERRCOUNT(myThid)
72
73 C-- Write model fields
74 C Raw fields
75 CALL READ_FLD_XYZ_RL( 'uVel.',suff, uVel, myIter, myThid)
76 CALL READ_FLD_XYZ_RL( 'gU.',suff, gU, myIter, myThid)
77 CALL READ_FLD_XYZ_RL( 'gUNm1.',suff, gUNm1, myIter, myThid)
78 CALL READ_FLD_XYZ_RL( 'vVel.',suff, vVel, myIter, myThid)
79 CALL READ_FLD_XYZ_RL( 'gV.',suff, gV, myIter, myThid)
80 CALL READ_FLD_XYZ_RL( 'gVNm1.',suff, gVNm1, myIter, myThid)
81 CALL READ_FLD_XYZ_RL( 'theta.',suff, theta, myIter, myThid)
82 CALL READ_FLD_XYZ_RL( 'gT.',suff, gT, myIter, myThid)
83 CALL READ_FLD_XYZ_RL( 'gTNm1.',suff, gTNm1, myIter, myThid)
84 CALL READ_FLD_XYZ_RL( 'salt.',suff, salt, myIter, myThid)
85 CALL READ_FLD_XYZ_RL( 'gS.',suff, gS, myIter, myThid)
86 CALL READ_FLD_XYZ_RL( 'gSNm1.',suff, gSNm1, myIter, myThid)
87 CALL READ_FLD_XY_RL ( 'cg2d_x.',suff, cg2d_x, myIter, myThid)
88
89 C-- Reread IO error counter
90 endIOErrCount = IO_ERRCOUNT(myThid)
91
92 C-- Check for IO errors
93 IF ( endIOErrCount .NE. beginIOErrCount ) THEN
94 WRITE(msgBuf,'(A)') 'S/R READ_CHECKPOINT'
95 CALL PRINT_ERROR( msgBuf, 1 )
96 WRITE(msgBuf,'(A)') 'Error reading in model checkpoint'
97 CALL PRINT_ERROR( msgBuf, 1 )
98 WRITE(msgBuf,'(A,I10)') 'Timestep ',myIter
99 CALL PRINT_ERROR( msgBuf, 1 )
100 STOP 'ABNORMAL END: S/R READ_CHECKPOINT'
101 ELSE
102 WRITE(msgBuf,'(A,I10)') '// Model checkpoint read, timestep', myIter
103 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit, SQUEEZE_RIGHT, 1 )
104 WRITE(msgBuf,'(A)') ' '
105 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit, SQUEEZE_RIGHT, 1 )
106 ENDIF
107
108 _END_MASTER( myThid )
109 _BARRIER
110
111 C-- Fill in edge regions
112 _EXCH_XYZ_R8(uVel , myThid )
113 _EXCH_XYZ_R8(gu , myThid )
114 _EXCH_XYZ_R8(guNM1 , myThid )
115 _EXCH_XYZ_R8(vVel , myThid )
116 _EXCH_XYZ_R8(gv , myThid )
117 _EXCH_XYZ_R8(gvNM1 , myThid )
118 _EXCH_XYZ_R8(theta , myThid )
119 _EXCH_XYZ_R8(gt , myThid )
120 _EXCH_XYZ_R8(gtNM1 , myThid )
121 _EXCH_XYZ_R8(salt , myThid )
122 _EXCH_XYZ_R8(gs , myThid )
123 _EXCH_XYZ_R8(gsNM1 , myThid )
124 _EXCH_XY_R8 (cg2d_x, myThid )
125
126 RETURN
127 END
128
129 CStartofinterface
130 SUBROUTINE READ_FLD_XY_RL( pref ,suff, fld, myIter, myThid)
131 C /==========================================================\
132 C | SUBROUTINE READ_FLD_XY_RL |
133 C | o Generic two-dimensional field IO routine. |
134 C |==========================================================|
135 C | Call low-level routines to read a 2d model field. |
136 C | Handles _RL type data ( generally _RL == REAL*8 ) |
137 C \==========================================================/
138
139 C == Global variables ==
140 #include "SIZE.h"
141 #include "PARAMS.h"
142 #include "EEPARAMS.h"
143 #include "DFILE.h"
144
145 INTEGER IFNBLNK
146 EXTERNAL IFNBLNK
147 INTEGER ILNBLNK
148 EXTERNAL ILNBLNK
149 INTEGER IO_ERRCOUNT
150 EXTERNAL IO_ERRCOUNT
151 CEndofinterface
152
153 C == Routine arguments ==
154 C pref - File name prefix
155 C suff - File name suffix
156 C fld - Array to be filled
157 C myIter - Timestep number
158 C myThid - Thread number calling this routine
159 CHARACTER*(*) pref
160 CHARACTER*(*) suff
161 _RL fld(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
162 INTEGER myIter
163 INTEGER myThid
164
165 C == Local variables ==
166 C fNamData - Filename building strings
167 C fNamMeta
168 C fileHandle - Handle used to refer to an open DFILE file.
169 C lFilled - Used to indicate the number of elements in the
170 C IO buffer that have been filled.
171 C nXP, nYp - Processes domain extents in X and Y.
172 C iP, jP, kP - Index in processes coordinates.
173 C ib - Index in IO buffer
174 C i, j, k, bi, bj - Loop counters
175 C s1Lo, s1Hi, s2Lo, s2Hi - Substring indices
176 C nDims, dimList - Local and global dataset dimensions
177 CHARACTER*(MAX_LEN_FNAM) fNamData
178 CHARACTER*(MAX_LEN_FNAM) fNamMeta
179 INTEGER fileHandle
180 INTEGER lFilled
181 INTEGER nXP, nYP
182 INTEGER iP, jP, kP, ib
183 INTEGER i,j, k, bi, bj
184 INTEGER s1Lo, s1Hi, s2Lo, s2Hi
185 INTEGER nDims
186 PARAMETER ( nDims = 2 )
187 INTEGER dimList(nDims*3)
188 INTEGER beginIOErrCount, endIOErrCount
189 CHARACTER*(MAX_LEN_MBUF) msgBuf
190
191 C-- Track IO errors
192 beginIOErrCount = IO_ERRCOUNT(myThid)
193
194 C-- Build file name
195 C Name has form 'prefix.suffix'
196 C e.g. U.0000000100
197 C U.0000000100
198 s1Lo = IFNBLNK(pref)
199 s1Hi = ILNBLNK(pref)
200 s2Lo = IFNBLNK(suff)
201 s2Hi = ILNBLNK(suff)
202 WRITE( fNamData, '(A,A)' )
203 & pref(s1Lo:s1Hi),
204 & suff(s2Lo:s2Hi)
205 WRITE( fNamMeta, '(A,A)' )
206 & pref(s1Lo:s1Hi),
207 & suff(s2Lo:s2Hi)
208
209 C-- Open file
210 CALL DFILE_OPEN( fNamData, fNamMeta, myThid,
211 O fileHandle )
212 IF ( fileHandle .LE. 0 ) GOTO 1000
213
214 C-- Set local and global data extents
215 nXP=sNx*nSx
216 nYP=sNy*nSy
217 lFilled = sNx*nSx * sNy*nSy
218 dimList(1) = nXP*nPx
219 dimList(2) = myXGlobalLo
220 dimList(3) = myXGlobalLo+nXP-1
221 dimList(4) = nYP*nPy
222 dimList(5) = myYGlobalLo
223 dimList(6) = myYGlobalLo+nYP-1
224
225 C-- Read data
226 IF ( readBinaryPrec .EQ. precFloat32 ) THEN
227 CALL DFILE_READ_R4( lFilled,
228 I fileHandle, myThid )
229 ELSE
230 CALL DFILE_READ_R8( lFilled,
231 I fileHandle, myThid )
232 ENDIF
233
234 C-- Copy data from IO buffer.
235 C Also regrid it to i,j,k indexing.
236 IF ( readBinaryPrec .EQ. precFloat32 ) THEN
237 DO bj=1,nSy
238 DO bi=1,nSx
239 DO j=1,sNy
240 DO i=1,sNx
241 iP = (bi-1)*sNx+i
242 jP = (bj-1)*sNy+j
243 ib = (jP-1)*nXP + iP
244 fld(i,j,bi,bj) = ioBuf_R4(ib)
245 ENDDO
246 ENDDO
247 ENDDO
248 ENDDO
249 ELSE
250 DO bj=1,nSy
251 DO bi=1,nSx
252 DO j=1,sNy
253 DO i=1,sNx
254 iP = (bi-1)*sNx+i
255 jP = (bj-1)*sNy+j
256 ib = (jP-1)*nXP + iP
257 fld(i,j,bi,bj) = ioBuf_R8(ib)
258 ENDDO
259 ENDDO
260 ENDDO
261 ENDDO
262 ENDIF
263
264 C-- Close file
265 CALL DFILE_CLOSE( fileHandle, myThid )
266
267 C-- Check errors
268 endIOerrCount = IO_ERRCOUNT(myThid)
269 IF ( endIOErrCount .EQ. beginIOErrCount ) THEN
270 WRITE(msgBuf,'(A,A,A,A)') '// Read file(s) ',
271 & pref(s1Lo:s1Hi),'*',suff(s2Lo:s2Hi)
272 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit, SQUEEZE_RIGHT, 1 )
273 ELSE
274 WRITE(msgBuf,'(A,A,A)') 'Error reading file ',pref(s1Lo:s1Hi),suff(s2Lo:s2Hi)
275 CALL PRINT_ERROR( msgBuf, 1 )
276 ENDIF
277
278 1000 CONTINUE
279
280 RETURN
281 END
282
283 CStartofinterface
284 SUBROUTINE READ_FLD_XYZ_RL( pref ,suff, fld, myIter, myThid)
285 C /==========================================================\
286 C | SUBROUTINE READ_FLD_XYZ_RL |
287 C | o Generic three-dimensional field IO routine. |
288 C |==========================================================|
289 C | Call low-level routines to read a 3d model field. |
290 C | Handles _RL type data ( generally _RL == REAL*8 ) |
291 C \==========================================================/
292
293 C == Global variables ==
294 #include "SIZE.h"
295 #include "PARAMS.h"
296 #include "EEPARAMS.h"
297 #include "DFILE.h"
298
299 INTEGER IFNBLNK
300 EXTERNAL IFNBLNK
301 INTEGER ILNBLNK
302 EXTERNAL ILNBLNK
303 INTEGER IO_ERRCOUNT
304 EXTERNAL IO_ERRCOUNT
305 CEndofinterface
306
307 C == Routine arguments ==
308 C pref - File name prefix
309 C suff - File name suffix
310 C fld - Array to be filled
311 C myIter - Timestep number
312 C myThid - Thread number calling this routine
313 CHARACTER*(*) pref
314 CHARACTER*(*) suff
315 _RL fld(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nZ,nSx,nSy)
316 INTEGER myIter
317 INTEGER myThid
318
319 C == Local variables ==
320 C fNamData - Filename building strings
321 C fNamMeta
322 C fileHandle - Handle used to refer to an open DFILE file.
323 C lFilled - Used to indicate the number of elements in the
324 C IO buffer that have been filled.
325 C nXP, nYp - Processes domain extents in X and Y.
326 C iP, jP, kP - Index in processes coordinates.
327 C ib - Index in IO buffer
328 C i, j, k, bi, bj - Loop counters
329 C s1Lo, s1Hi, s2Lo, s2Hi - Substring indices
330 C nDims, dimList - Local and global dataset dimensions
331 CHARACTER*(MAX_LEN_FNAM) fNamData
332 CHARACTER*(MAX_LEN_FNAM) fNamMeta
333 INTEGER fileHandle
334 INTEGER lFilled
335 INTEGER nXP, nYP
336 INTEGER iP, jP, kP, ib
337 INTEGER i,j, k, bi, bj
338 INTEGER s1Lo, s1Hi, s2Lo, s2Hi
339 INTEGER nDims
340 PARAMETER ( nDims = 3 )
341 INTEGER dimList(nDims*3)
342 INTEGER beginIOErrCount, endIOErrCount
343 CHARACTER*(MAX_LEN_MBUF) msgBuf
344
345 C-- Track IO errors
346 beginIOErrCount = IO_ERRCOUNT(myThid)
347
348 C-- Build file name
349 C Name has form 'prefix.suffix'
350 C e.g. U.0000000100
351 C U.0000000100
352 s1Lo = IFNBLNK(pref)
353 s1Hi = ILNBLNK(pref)
354 s2Lo = IFNBLNK(suff)
355 s2Hi = ILNBLNK(suff)
356 WRITE( fNamData, '(A,A)' )
357 & pref(s1Lo:s1Hi),
358 & suff(s2Lo:s2Hi)
359 WRITE( fNamMeta, '(A,A)' )
360 & pref(s1Lo:s1Hi),
361 & suff(s2Lo:s2Hi)
362
363 C-- Open file
364 CALL DFILE_OPEN( fNamData, fNamMeta, myThid,
365 O fileHandle )
366 IF ( fileHandle .LE. 0 ) GOTO 1000
367
368 C-- Set local and global data extents
369 nXP=sNx*nSx
370 nYP=sNy*nSy
371 lFilled = sNx*nSx * sNy*nSy * nZ
372 dimList(1) = nXP*nPx
373 dimList(2) = myXGlobalLo
374 dimList(3) = myXGlobalLo+nXP-1
375 dimList(4) = nYP*nPy
376 dimList(5) = myYGlobalLo
377 dimList(6) = myYGlobalLo+nYP-1
378 dimList(7) = nZ
379 dimList(8) = 1
380 dimList(9) = nZ
381
382 C-- Read data
383 IF ( readBinaryPrec .EQ. precFloat32 ) THEN
384 CALL DFILE_READ_R4( lFilled,
385 I fileHandle, myThid )
386 ELSE
387 CALL DFILE_READ_R8( lFilled,
388 I fileHandle, myThid )
389 ENDIF
390
391 C-- Copy data from IO buffer.
392 C Also regrid it to i,j,k indexing.
393 IF ( readBinaryPrec .EQ. precFloat32 ) THEN
394 DO bj=1,nSy
395 DO bi=1,nSx
396 DO K=1,nZ
397 DO j=1,sNy
398 DO i=1,sNx
399 iP = (bi-1)*sNx+i
400 jP = (bj-1)*sNy+j
401 kP = K
402 ib = (kP-1)*nXP*nYP + (jP-1)*nXP + iP
403 fld(i,j,k,bi,bj) = ioBuf_R4(ib)
404 ENDDO
405 ENDDO
406 ENDDO
407 ENDDO
408 ENDDO
409 ELSE
410 DO bj=1,nSy
411 DO bi=1,nSx
412 DO K=1,nZ
413 DO j=1,sNy
414 DO i=1,sNx
415 iP = (bi-1)*sNx+i
416 jP = (bj-1)*sNy+j
417 kP = K
418 ib = (kP-1)*nXP*nYP + (jP-1)*nXP + iP
419 fld(i,j,k,bi,bj) = ioBuf_R8(ib)
420 ENDDO
421 ENDDO
422 ENDDO
423 ENDDO
424 ENDDO
425 ENDIF
426
427 C-- Close file
428 CALL DFILE_CLOSE( fileHandle, myThid )
429
430 C-- Check errors
431 endIOerrCount = IO_ERRCOUNT(myThid)
432 IF ( endIOErrCount .EQ. beginIOErrCount ) THEN
433 WRITE(msgBuf,'(A,A,A,A)') '// Read file(s) ',
434 & pref(s1Lo:s1Hi),'*',suff(s2Lo:s2Hi)
435 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit, SQUEEZE_RIGHT, 1 )
436 ELSE
437 WRITE(msgBuf,'(A,A,A)') 'Error reading file ',pref(s1Lo:s1Hi),suff(s2Lo:s2Hi)
438 CALL PRINT_ERROR( msgBuf, 1 )
439 ENDIF
440
441 1000 CONTINUE
442
443 RETURN
444 END
445
446 CStartofinterface
447 SUBROUTINE WRITE_1D_I( fld, lFld, index_type, head, comment )
448 C /==========================================================\
449 C | o SUBROUTINE WRITE_1D_I |
450 C | Controls formatted, tabular I/O for a one-dimensional |
451 C | INTEGER field. |
452 C |==========================================================|
453 C | This routine produces a standard format for list |
454 C | one-dimensional INTEGER data in textual form. The format |
455 C | is designed to be readily parsed by a post-processing |
456 C | utility. |
457 C \==========================================================/
458
459 C == Global data ==
460 #include "SIZE.h"
461 #include "EEPARAMS.h"
462
463 C == Routine arguments ==
464 C fld - Field to be printed
465 C lFld - Number of elements in field fld.
466 C index_type - Type of index labelling (I=,J=,...) to use
467 C head - Statement start e.g. phi =
468 C comment - Descriptive comment for field
469 INTEGER lFld
470 INTEGER fld(lFld)
471 INTEGER index_type
472 CHARACTER*(*) head
473 CHARACTER*(*) comment
474 CEndofinterface
475
476 C == Local variables ==
477 CHARACTER*(MAX_LEN_MBUF) msgBuf
478
479 WRITE(msgBuf,'(A,A)') head, comment
480 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit, SQUEEZE_RIGHT , 1)
481 CALL PRINT_LIST_I( fld, lFld, index_type, standardMessageUnit )
482 WRITE(msgBuf,'(A)') ' ; '
483 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit, SQUEEZE_RIGHT , 1)
484 C
485 RETURN
486 END
487
488 CStartofinterface
489 SUBROUTINE WRITE_1D_L( fld, lFld, index_type, head, comment )
490 C /==========================================================\
491 C | o SUBROUTINE WRITE_1D_L |
492 C | Controls formatted, tabular I/O for a one-dimensional |
493 C | LOGICAL field. |
494 C |==========================================================|
495 C | This routine produces a standard format for list |
496 C | one-dimensional LOGICAL data in textual form. The format |
497 C | is designed to be readily parsed by a post-processing |
498 C | utility. |
499 C \==========================================================/
500
501 C == Global data ==
502 #include "SIZE.h"
503 #include "EEPARAMS.h"
504
505 C == Routine arguments ==
506 C fld - Field to be printed
507 C lFld - Number of elements in field fld.
508 C index_type - Type of index labelling (I=,J=,...) to use
509 C head - Statement start e.g. phi =
510 C comment - Descriptive comment for field
511 INTEGER lFld
512 LOGICAL fld(lFld)
513 INTEGER index_type
514 CHARACTER*(*) head
515 CHARACTER*(*) comment
516 CEndofinterface
517
518 C == Local variables ==
519 CHARACTER*(MAX_LEN_MBUF) msgBuf
520
521 WRITE(msgBuf,'(A,A)') head, comment
522 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit, SQUEEZE_RIGHT , 1)
523 CALL PRINT_LIST_L( fld, lFld, index_type, standardMessageUnit )
524 WRITE(msgBuf,'(A)') ' ; '
525 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit, SQUEEZE_RIGHT , 1)
526 C
527 RETURN
528 END
529
530 CStartofinterface
531 SUBROUTINE WRITE_1D_R8( fld, lFld, index_type, head, comment )
532 C /==========================================================\
533 C | o SUBROUTINE WRITE_1D_R8 |
534 C | Controls formatted, tabular I/O for a one-dimensional |
535 C | real*8 field. |
536 C |==========================================================|
537 C | This routine produces a standard format for list |
538 C | one-dimensional real*8 data in textual form. The format |
539 C | is designed to be readilya parsed by a post-processing |
540 C | utility. |
541 C \==========================================================/
542
543 C == Global data ==
544 #include "SIZE.h"
545 #include "EEPARAMS.h"
546
547 C == Routine arguments ==
548 C fld - Field to be printed
549 C lFld - Number of elements in field fld.
550 C index_type - Type of index labelling (I=,J=,...) to use
551 C head - Statement start e.g. phi =
552 C comment - Descriptive comment for field
553 INTEGER lFld
554 Real*8 fld(lFld)
555 INTEGER index_type
556 CHARACTER*(*) head
557 CHARACTER*(*) comment
558 CEndofinterface
559
560 C == Local variables ==
561 CHARACTER*(MAX_LEN_MBUF) msgBuf
562
563 WRITE(msgBuf,'(A,A)') head, comment
564 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit, SQUEEZE_RIGHT , 1)
565 CALL PRINT_LIST_R8( fld, lFld, index_type, standardMessageUnit )
566 WRITE(msgBuf,'(A)') ' ; '
567 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit, SQUEEZE_RIGHT , 1)
568 C
569 RETURN
570 END
571
572 CStartofinterface
573 SUBROUTINE WRITE_FLD_XY_RL( pref ,suff, fld, myIter, myThid)
574 C /==========================================================\
575 C | SUBROUTINE WRITE_FLD_XY_RL |
576 C | o Generic two-dimensional field IO routine. |
577 C |==========================================================|
578 C | Call low-level routines to write a model 2d model field. |
579 C | Handles _RL type data ( generally _RL == REAL*8 ) |
580 C \==========================================================/
581
582 C == Global variables ==
583 #include "SIZE.h"
584 #include "PARAMS.h"
585 #include "EEPARAMS.h"
586 #include "DFILE.h"
587
588 INTEGER IFNBLNK
589 EXTERNAL IFNBLNK
590 INTEGER ILNBLNK
591 EXTERNAL ILNBLNK
592 INTEGER IO_ERRCOUNT
593 EXTERNAL IO_ERRCOUNT
594 CEndofinterface
595
596 C == Routine arguments ==
597 C pref - File name prefix
598 C suff - File name suffix
599 C fld - Data to be written
600 C myIter - Timestep number
601 C myThid - Thread number calling this routine
602 CHARACTER*(*) pref
603 CHARACTER*(*) suff
604 _RL fld(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
605 INTEGER myIter
606 INTEGER myThid
607
608 C == Local variables ==
609 C fNamData - Filename building strings
610 C fNamMeta
611 C fileHandle - Handle used to refer to an open DFILE file.
612 C lFilled - Used to indicate the number of elements in the
613 C IO buffer that have been filled.
614 C nXP, nYp - Processes domain extents in X and Y.
615 C iP, jP, kP - Index in processes coordinates.
616 C ib - Index in IO buffer
617 C i, j, k, bi, bj - Loop counters
618 C s1Lo, s1Hi, s2Lo, s2Hi - Substring indices
619 C nDims, dimList - Local and global dataset dimensions
620 CHARACTER*(MAX_LEN_FNAM) fNamData
621 CHARACTER*(MAX_LEN_FNAM) fNamMeta
622 INTEGER fileHandle
623 INTEGER lFilled
624 INTEGER nXP, nYP
625 INTEGER iP, jP, kP, ib
626 INTEGER i,j, k, bi, bj
627 INTEGER s1Lo, s1Hi, s2Lo, s2Hi
628 INTEGER nDims
629 PARAMETER ( nDims = 2 )
630 INTEGER dimList(nDims*3)
631 INTEGER beginIOErrCount, endIOErrCount
632 CHARACTER*(MAX_LEN_MBUF) msgBuf
633
634 C-- Track IO errors
635 beginIOErrCount = IO_ERRCOUNT(myThid)
636
637 C-- Build file name
638 C Name has form 'prefix.pPID.tTID.class.suffix'
639 C e.g. U.p0001.t0001.data.0000000100
640 C U.p0001.t0001.meta.0000000100
641 s1Lo = IFNBLNK(pref)
642 s1Hi = ILNBLNK(pref)
643 s2Lo = IFNBLNK(suff)
644 s2Hi = ILNBLNK(suff)
645 WRITE( fNamData, '(A,A,I4.4,A,I4.4,A,A)' )
646 & pref(s1Lo:s1Hi),
647 & 'p',myProcId,'.t',myThid, '.data.',
648 & suff(s2Lo:s2Hi)
649 WRITE( fNamMeta, '(A,A,I4.4,A,I4.4,A,A)' )
650 & pref(s1Lo:s1Hi),
651 & 'p',myProcId,'.t',myThid, '.meta.',
652 & suff(s2Lo:s2Hi)
653
654 C-- Open file
655 CALL DFILE_OPEN( fNamData, fNamMeta, myThid,
656 O fileHandle )
657 IF ( fileHandle .LE. 0 ) GOTO 1000
658
659 C-- Copy data to IO buffer.
660 C Also regrid it to i,j,k indexing.
661 nXP=sNx*nSx
662 nYP=sNy*nSy
663 lFilled = sNx*nSx * sNy*nSy
664 IF ( writeBinaryPrec .EQ. precFloat32 ) THEN
665 DO bj=1,nSy
666 DO bi=1,nSx
667 DO j=1,sNy
668 DO i=1,sNx
669 iP = (bi-1)*sNx+i
670 jP = (bj-1)*sNy+j
671 ib = (jP-1)*nXP + iP
672 ioBuf_R4(ib) = fld(i,j,bi,bj)
673 ENDDO
674 ENDDO
675 ENDDO
676 ENDDO
677 ELSE
678 DO bj=1,nSy
679 DO bi=1,nSx
680 DO j=1,sNy
681 DO i=1,sNx
682 iP = (bi-1)*sNx+i
683 jP = (bj-1)*sNy+j
684 ib = (jP-1)*nXP + iP
685 ioBuf_R8(ib) = fld(i,j,bi,bj)
686 ENDDO
687 ENDDO
688 ENDDO
689 ENDDO
690 ENDIF
691
692 C-- Set local and global data extents
693 dimList(1) = nXP*nPx
694 dimList(2) = myXGlobalLo
695 dimList(3) = myXGlobalLo+nXP-1
696 dimList(4) = nYP*nPy
697 dimList(5) = myYGlobalLo
698 dimList(6) = myYGlobalLo+nYP-1
699
700 C-- Write data
701 IF ( writeBinaryPrec .EQ. precFloat32 ) THEN
702 CALL DFILE_WRITE_R4( lFilled,
703 I nDims, dimList,
704 I fileHandle, myIter, myThid )
705 ELSE
706 CALL DFILE_WRITE_R8( lFilled,
707 I nDims, dimList,
708 I fileHandle, myIter, myThid )
709 ENDIF
710
711 C-- Close file
712 CALL DFILE_CLOSE( fileHandle, myThid )
713
714 C-- Check errors
715 endIOerrCount = IO_ERRCOUNT(myThid)
716 IF ( endIOErrCount .EQ. beginIOErrCount ) THEN
717 WRITE(msgBuf,'(A,A,A,A)') '// Wrote file(s) ',
718 & pref(s1Lo:s1Hi),'*',suff(s2Lo:s2Hi)
719 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit, SQUEEZE_RIGHT, 1 )
720 ELSE
721 WRITE(msgBuf,'(A,A,A)') 'Error writing file ',pref(s1Lo:s1Hi),suff(s2Lo:s2Hi)
722 CALL PRINT_ERROR( msgBuf, 1 )
723 ENDIF
724
725 1000 CONTINUE
726
727 RETURN
728 END
729
730 CStartofinterface
731 SUBROUTINE WRITE_FLD_XYZ_RL( pref ,suff, fld, myIter, myThid)
732 C /==========================================================\
733 C | SUBROUTINE WRITE_FLD_XYZ_RL |
734 C | o Generic three-dimensional field IO routine. |
735 C |==========================================================|
736 C | Call low-level routines to write a model 3d model field. |
737 C | Handles _RL type data ( generally _RL == REAL*8 ) |
738 C \==========================================================/
739
740 C == Global variables ==
741 #include "SIZE.h"
742 #include "PARAMS.h"
743 #include "EEPARAMS.h"
744 #include "DFILE.h"
745
746 INTEGER IFNBLNK
747 EXTERNAL IFNBLNK
748 INTEGER ILNBLNK
749 EXTERNAL ILNBLNK
750 INTEGER IO_ERRCOUNT
751 EXTERNAL IO_ERRCOUNT
752 CEndofinterface
753
754 C == Routine arguments ==
755 C pref - File name prefix
756 C suff - File name suffix
757 C fld - Data to be written
758 C myIter - Timestep number
759 C myThid - Thread number calling this routine
760 CHARACTER*(*) pref
761 CHARACTER*(*) suff
762 _RL fld(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nz,nSx,nSy)
763 INTEGER myThid
764 INTEGER myIter
765
766 C == Local variables ==
767 C fNamData - Filename building strings
768 C fNamMeta
769 C fileHandle - Handle used to refer to an open DFILE file.
770 C lFilled - Used to indicate the number of elements in the
771 C IO buffer that have been filled.
772 C nXP, nYp - Processes domain extents in X and Y.
773 C iP, jP, kP - Index in processes coordinates.
774 C ib - Index in IO buffer
775 C i, j, k, bi, bj - Loop counters
776 C s1Lo, s1Hi, s2Lo, s2Hi - Substring indices
777 C nDims, dimList - Local and global dataset dimensions
778 CHARACTER*(MAX_LEN_FNAM) fNamData
779 CHARACTER*(MAX_LEN_FNAM) fNamMeta
780 INTEGER fileHandle
781 INTEGER lFilled
782 INTEGER nXP, nYP
783 INTEGER iP, jP, kP, ib
784 INTEGER i,j, k, bi, bj
785 INTEGER s1Lo, s1Hi, s2Lo, s2Hi
786 INTEGER nDims
787 PARAMETER ( nDims = 3 )
788 INTEGER dimList(nDims*3)
789 INTEGER beginIOErrCount, endIOErrCount
790 CHARACTER*(MAX_LEN_MBUF) msgBuf
791
792 C-- Track IO errors
793 beginIOErrCount = IO_ERRCOUNT(myThid)
794
795 C-- Build file name
796 C Name has form 'prefix.pPID.tTID.class.suffix'
797 C e.g. U.p0001.t0001.data.0000000100
798 C U.p0001.t0001.meta.0000000100
799 s1Lo = IFNBLNK(pref)
800 s1Hi = ILNBLNK(pref)
801 s2Lo = IFNBLNK(suff)
802 s2Hi = ILNBLNK(suff)
803 WRITE( fNamData, '(A,A,I4.4,A,I4.4,A,A)' )
804 & pref(s1Lo:s1Hi),
805 & 'p',myProcId,'.t',myThid, '.data.',
806 & suff(s2Lo:s2Hi)
807 WRITE( fNamMeta, '(A,A,I4.4,A,I4.4,A,A)' )
808 & pref(s1Lo:s1Hi),
809 & 'p',myProcId,'.t',myThid, '.meta.',
810 & suff(s2Lo:s2Hi)
811
812 C-- Open file
813 CALL DFILE_OPEN( fNamData, fNamMeta, myThid,
814 O fileHandle )
815 IF ( fileHandle .LE. 0 ) GOTO 1000
816
817 C-- Copy data to IO buffer.
818 C Also regrid it to i,j,k indexing.
819 nXP=sNx*nSx
820 nYP=sNy*nSy
821 lFilled = sNx*nSx * sNy*nSy * Nz
822 IF ( writeBinaryPrec .EQ. precFloat32 ) THEN
823 DO bj=1,nSy
824 DO bi=1,nSx
825 DO k=1,Nz
826 DO j=1,sNy
827 DO i=1,sNx
828 iP = (bi-1)*sNx+i
829 jP = (bj-1)*sNy+j
830 kP = k
831 ib = (kP-1)*nXP*nYP + (jP-1)*nXP + iP
832 ioBuf_R4(ib) = fld(i,j,k,bi,bj)
833 ENDDO
834 ENDDO
835 ENDDO
836 ENDDO
837 ENDDO
838 ELSE
839 DO bj=1,nSy
840 DO bi=1,nSx
841 DO k=1,Nz
842 DO j=1,sNy
843 DO i=1,sNx
844 iP = (bi-1)*sNx+i
845 jP = (bj-1)*sNy+j
846 kP = k
847 ib = (kP-1)*nXP*nYP + (jP-1)*nXP + iP
848 ioBuf_R8(ib) = fld(i,j,k,bi,bj)
849 ENDDO
850 ENDDO
851 ENDDO
852 ENDDO
853 ENDDO
854 ENDIF
855
856 C-- Set local and global data extents
857 dimList(1) = nXP*nPx
858 dimList(2) = myXGlobalLo
859 dimList(3) = myXGlobalLo+nXP-1
860 dimList(4) = nYP*nPy
861 dimList(5) = myYGlobalLo
862 dimList(6) = myYGlobalLo+nYP-1
863 dimList(7) = nZ
864 dimList(8) = 1
865 dimList(9) = nZ
866
867 C-- Write data
868 IF ( writeBinaryPrec .EQ. precFloat32 ) THEN
869 CALL DFILE_WRITE_R4( lFilled,
870 I nDims, dimList,
871 I fileHandle, myIter, myThid )
872 ELSE
873 CALL DFILE_WRITE_R8( lFilled,
874 I nDims, dimList,
875 I fileHandle, myIter, myThid )
876 ENDIF
877
878 C-- Close file
879 CALL DFILE_CLOSE( fileHandle, myThid )
880
881 C-- Check errors
882 endIOerrCount = IO_ERRCOUNT(myThid)
883 IF ( endIOErrCount .EQ. beginIOErrCount ) THEN
884 WRITE(msgBuf,'(A,A,A,A)') '// Wrote file(s) ',
885 & pref(s1Lo:s1Hi),'*',suff(s2Lo:s2Hi)
886 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit, SQUEEZE_RIGHT, 1 )
887 ELSE
888 WRITE(msgBuf,'(A,A,A)') 'Error writing file ',pref(s1Lo:s1Hi),suff(s2Lo:s2Hi)
889 CALL PRINT_ERROR( msgBuf, 1 )
890 ENDIF
891
892 1000 CONTINUE
893
894 RETURN
895 END
896
897 CStartofinterface
898 SUBROUTINE WRITE_CHECKPOINT ( modelEnd, myCurrentTime, myIter, myThid )
899 C /==========================================================\
900 C | SUBROUTINE WRITE_CHKPT |
901 C | o Controlling routine for IO to write restart file. |
902 C |==========================================================|
903 C | Write model checkpoint files for use in restart. |
904 C | This routine writes both "rolling-checkpoint" files |
905 C | and permanent checkpoint files. A rolling checkpoint |
906 C | works through a circular list of suffices. Generally the |
907 C | circular list has two entries so that a rolling |
908 C | checkpoint will overwrite the last rolling checkpoint |
909 C | but one. This is useful for running long jobs without |
910 C | filling too much disk space. |
911 C | In a permanent checkpoint data is written suffixed by |
912 C | the current timestep number. This sort of checkpoint can |
913 C | be used to provided a snap-shot from which the model |
914 C | can be rerun. |
915 C \==========================================================/
916
917 C == Global variables ===
918 #include "SIZE.h"
919 #include "EEPARAMS.h"
920 #include "PARAMS.h"
921 #include "DYNVARS.h"
922 #include "CG2D.h"
923
924 LOGICAL DIFFERENT_MULTIPLE
925 EXTERNAL DIFFERENT_MULTIPLE
926 INTEGER IO_ERRCOUNT
927 EXTERNAL IO_ERRCOUNT
928
929 C == Routine arguments ==
930 C modelEnd - Checkpoint call at end of model run.
931 C myThid - Thread number for this instance of the routine.
932 C myIter - Iteration number
933 C myCurrentTime - Current time of simulation ( s )
934 LOGICAL modelEnd
935 INTEGER myThid
936 INTEGER myIter
937 REAL myCurrentTime
938 CEndofinterface
939
940 C == Local variables ==
941 C suff - Hold suffix part of a filename
942 C beginIOErrCount - Begin and end IO error counts
943 C endIOErrCount
944 C msgBuf - Error message buffer
945 C permCheckPoint - Flag indicating whether a permanent checkpoint will
946 C be written.
947 CHARACTER*(MAX_LEN_FNAM) suff
948 INTEGER beginIOErrCount
949 INTEGER endIOErrCount
950 CHARACTER*(MAX_LEN_MBUF) msgBuf
951 LOGICAL permCheckPoint
952
953 permCheckPoint = .FALSE.
954 permCheckPoint=
955 & DIFFERENT_MULTIPLE(pChkptFreq,myCurrentTime,myCurrentTime-deltaTClock)
956
957 IF (
958 & (.NOT. modelEnd .AND. (
959 & permCheckPoint
960 & .OR.
961 & DIFFERENT_MULTIPLE(chkptFreq,myCurrentTime,myCurrentTime-deltaTClock)
962 & )
963 & )
964 & .OR.
965 & (
966 & modelEnd
967 & .AND. .NOT.
968 & permCheckPoint
969 & .AND. .NOT.
970 & DIFFERENT_MULTIPLE(chkptFreq,myCurrentTime,myCurrentTime-deltaTClock)
971 & )
972 & ) THEN
973
974 C-- Going to really do some IO. Make everyone except master thread wait.
975 _BARRIER
976 _BEGIN_MASTER( myThid )
977
978 C-- Set suffix for this set of data files.
979 suff = checkPtSuff(nCheckLev)
980 IF ( permCheckPoint ) THEN
981 WRITE(suff,'(I10.10)') myIter
982 ENDIF
983
984 C-- Set IO "context" for writing state
985 CALL DFILE_SET_RW
986 CALL DFILE_SET_CONT_ON_ERROR
987 C Force 64-bit IO
988 writeBinaryPrec = precFloat64
989
990
991 C-- Read IO error counter
992 beginIOErrCount = IO_ERRCOUNT(myThid)
993
994 C-- Write model fields
995 C Raw fields
996 CALL WRITE_FLD_XYZ_RL( 'uVel.',suff, uVel, myIter, myThid)
997 CALL WRITE_FLD_XYZ_RL( 'gU.',suff, gU, myIter, myThid)
998 CALL WRITE_FLD_XYZ_RL( 'gUNm1.',suff, gUNm1, myIter, myThid)
999 CALL WRITE_FLD_XYZ_RL( 'vVel.',suff, vVel, myIter, myThid)
1000 CALL WRITE_FLD_XYZ_RL( 'gV.',suff, gV, myIter, myThid)
1001 CALL WRITE_FLD_XYZ_RL( 'gVNm1.',suff, gVNm1, myIter, myThid)
1002 CALL WRITE_FLD_XYZ_RL( 'theta.',suff, theta, myIter, myThid)
1003 CALL WRITE_FLD_XYZ_RL( 'gT.',suff, gT, myIter, myThid)
1004 CALL WRITE_FLD_XYZ_RL( 'gTNm1.',suff, gTNm1, myIter, myThid)
1005 CALL WRITE_FLD_XYZ_RL( 'salt.',suff, salt, myIter, myThid)
1006 CALL WRITE_FLD_XYZ_RL( 'gS.',suff, gS, myIter, myThid)
1007 CALL WRITE_FLD_XYZ_RL( 'gSNm1.',suff, gSNm1, myIter, myThid)
1008 CALL WRITE_FLD_XY_RL ( 'cg2d_x.',suff, cg2d_x, myIter, myThid)
1009
1010 C-- Reread IO error counter
1011 endIOErrCount = IO_ERRCOUNT(myThid)
1012
1013 C-- Check for IO errors
1014 IF ( endIOErrCount .NE. beginIOErrCount ) THEN
1015 WRITE(msgBuf,'(A)') 'S/R WRITE_CHECKPOINT'
1016 CALL PRINT_ERROR( msgBuf, 1 )
1017 WRITE(msgBuf,'(A)') 'Error writing out model checkpoint'
1018 CALL PRINT_ERROR( msgBuf, 1 )
1019 WRITE(msgBuf,'(A,I10)') 'Timestep ',myIter
1020 CALL PRINT_ERROR( msgBuf, 1 )
1021 ELSE
1022 WRITE(msgBuf,'(A,I10)') '// Model checkpoint written, timestep', myIter
1023 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit, SQUEEZE_RIGHT, 1 )
1024 WRITE(msgBuf,'(A)') ' '
1025 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit, SQUEEZE_RIGHT, 1 )
1026 C Wrote OK so step forward to use next checkpoint in loop.
1027 IF ( .NOT. permCheckPoint ) THEN
1028 nCheckLev = MOD(nCheckLev, maxNoChkptLev)+1
1029 ENDIF
1030 ENDIF
1031
1032 _END_MASTER( myThid )
1033 _BARRIER
1034
1035 ENDIF
1036
1037 RETURN
1038 END
1039
1040 CStartofinterface
1041 SUBROUTINE WRITE_STATE ( myCurrentTime, myIter, myThid )
1042 C /==========================================================\
1043 C | SUBROUTINE WRITE_STATE |
1044 C | o Controlling routine for IO to dump model state. |
1045 C |==========================================================|
1046 C | Write model state files for post-processing. This file |
1047 C | includes code for diagnosing W and RHO for output. |
1048 C \==========================================================/
1049
1050 C == Global variables ===
1051 #include "SIZE.h"
1052 #include "EEPARAMS.h"
1053 #include "PARAMS.h"
1054 #include "DYNVARS.h"
1055 #include "CG2D.h"
1056
1057 LOGICAL DIFFERENT_MULTIPLE
1058 EXTERNAL DIFFERENT_MULTIPLE
1059 INTEGER IO_ERRCOUNT
1060 EXTERNAL IO_ERRCOUNT
1061
1062 C == Routine arguments ==
1063 C myThid - Thread number for this instance of the routine.
1064 C myIter - Iteration number
1065 C myCurrentTime - Current time of simulation ( s )
1066 INTEGER myThid
1067 INTEGER myIter
1068 REAL myCurrentTime
1069 CEndofinterface
1070
1071 C == Local variables ==
1072 C suff - Hold suffix part of a filename
1073 C beginIOErrCount - Begin and end IO error counts
1074 C endIOErrCount
1075 C msgBuf - Error message buffer
1076 CHARACTER*(MAX_LEN_FNAM) suff
1077 INTEGER beginIOErrCount
1078 INTEGER endIOErrCount
1079 CHARACTER*(MAX_LEN_MBUF) msgBuf
1080
1081 IF ( .NOT.
1082 & DIFFERENT_MULTIPLE(dumpFreq,myCurrentTime,myCurrentTime-deltaTClock)
1083 & ) RETURN
1084
1085 C-- Going to really do some IO. Make everyone except master thread wait.
1086 _BARRIER
1087 _BEGIN_MASTER( myThid )
1088
1089 C-- Set suffix for this set of data files.
1090 WRITE(suff,'(I10.10)') myIter
1091
1092 C-- Set IO "context" for writing state
1093 CALL DFILE_SET_RW
1094 CALL DFILE_SET_CONT_ON_ERROR
1095 writeBinaryPrec = writeStatePrec
1096
1097 C-- Read IO error counter
1098 beginIOErrCount = IO_ERRCOUNT(myThid)
1099
1100 C-- Write model fields
1101 C Raw fields
1102 CALL WRITE_FLD_XYZ_RL( 'U.',suff, uVel, myIter, myThid)
1103 CALL WRITE_FLD_XYZ_RL( 'V.',suff, vVel, myIter, myThid)
1104 CALL WRITE_FLD_XYZ_RL( 'T.',suff, theta, myIter, myThid)
1105 CALL WRITE_FLD_XYZ_RL( 'S.',suff, salt, myIter, myThid)
1106 CALL WRITE_FLD_XY_RL ( 'H.',suff, cg2d_x, myIter, myThid)
1107 C Hmmm.... what to do atbout these huh
1108 C need to calculate them but remember we are already within a
1109 C _MASTER section. So we can not use multithreaded code.
1110 C We can still code as blocked but the block loop will be
1111 C bj=1,nSy and bi=1,nSx.
1112 C CALL WRITE_FLD_XYZ_RL( 'W.',suff, arr3d , myIter, myThid)
1113 C CALL WRITE_FLD_XYZ_RL( 'RHO.',suff, arr3d , myIter, myThid)
1114 C CALL WRITE_FLD_XYZ_RL('RHOP.',suff, arr3d , myIter, myThid)
1115 C CALL WRITE_FLD_XYZ_RL( 'PH.',suff, arr3d , myIter, myThid)
1116
1117 C-- Reread IO error counter
1118 endIOErrCount = IO_ERRCOUNT(myThid)
1119
1120 C-- Check for IO errors
1121 IF ( endIOErrCount .NE. beginIOErrCount ) THEN
1122 WRITE(msgBuf,'(A)') 'S/R WRITE_STATE'
1123 CALL PRINT_ERROR( msgBuf, 1 )
1124 WRITE(msgBuf,'(A)') 'Error writing out model state'
1125 CALL PRINT_ERROR( msgBuf, 1 )
1126 WRITE(msgBuf,'(A,I10)') 'Timestep ',myIter
1127 CALL PRINT_ERROR( msgBuf, 1 )
1128 ELSE
1129 WRITE(msgBuf,'(A,I10)') '// Model state written, timestep', myIter
1130 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit, SQUEEZE_RIGHT, 1 )
1131 WRITE(msgBuf,'(A)') ' '
1132 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit, SQUEEZE_RIGHT, 1 )
1133 ENDIF
1134
1135 _END_MASTER( myThid )
1136 _BARRIER
1137
1138 RETURN
1139 END

  ViewVC Help
Powered by ViewVC 1.1.22