/[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.16 - (show annotations) (download)
Mon Mar 22 15:54:04 1999 UTC (25 years, 3 months ago) by adcroft
Branch: MAIN
CVS Tags: checkpoint20
Changes since 1.15: +49 -7 lines
Modifications for non-hydrostatic ability + updates for open-boundaries.

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

  ViewVC Help
Powered by ViewVC 1.1.22