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

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

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


Revision 1.56 - (show annotations) (download)
Sat Sep 10 18:30:06 2005 UTC (18 years, 9 months ago) by edhill
Branch: MAIN
Changes since 1.55: +14 -3 lines
 o various changes to mnc including:
   - all files use the new "BASENAME[[.ITER].{t|f}NUM].nc" format
   - output can now be grouped so that all files within a group
       change the ITER portion of their names in lock-step together
   - can now read ("global") PER-FACE (in addition to PER-TILE) files
       and works with both EXCH1 and EXCH2 (but needs more testing)
   - writing works for all verification test cases w/ g77 on Linux

1 C $Header: /u/gcmpack/MITgcm/model/src/checkpoint.F,v 1.55 2005/05/25 04:03:09 edhill Exp $
2 C $Name: $
3
4 #include "PACKAGES_CONFIG.h"
5 #include "CPP_OPTIONS.h"
6
7 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
8 CBOP
9 C !ROUTINE: SET_WRITE_GLOBAL_PICKUP
10 C !INTERFACE:
11 SUBROUTINE SET_WRITE_GLOBAL_PICKUP( flag )
12
13 C !DESCRIPTION:
14 C Sets an internal logical state to indicate whether files written
15 C by subsequent calls to the READ_WRITE_FLD package should create
16 C "global" or "tiled" files:
17 C \begin{center}
18 C \begin{tabular}[h]{|l|l|}\hline
19 C \texttt{flag} & Meaning \\\hline
20 C \texttt{.TRUE.} & use ``global'' files \\
21 C \texttt{.TRUE.} & use ``tiled'' files \\\hline
22 C \end{tabular}
23 C \end{center}
24
25 C !USES:
26 IMPLICIT NONE
27
28 C !INPUT PARAMETERS:
29 LOGICAL flag
30 CEOP
31 COMMON /PCKP_GBLFLS/ globalFile
32 LOGICAL globalFile
33
34 globalFile = flag
35
36 RETURN
37 END
38
39 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
40 CBOP
41 C !ROUTINE: READ_CHECKPOINT
42 C !INTERFACE:
43 SUBROUTINE READ_CHECKPOINT(
44 I myIter, myThid )
45
46 C !DESCRIPTION:
47 C This is the controlling routine for IO to write restart (or
48 C ``pickup'' or ``checkpoint'') files. It calls routines from other
49 C packages (\textit{eg.} mdsio and mnc) to do the per-variable
50 C reads.
51
52 C !USES:
53 IMPLICIT NONE
54 #include "SIZE.h"
55 #include "EEPARAMS.h"
56 #include "PARAMS.h"
57 #ifdef ALLOW_MNC
58 #include "MNC_PARAMS.h"
59 #endif
60 #include "DYNVARS.h"
61 #include "SURFACE.h"
62 #ifdef ALLOW_NONHYDROSTATIC
63 #include "GW.h"
64 #include "SOLVE_FOR_PRESSURE3D.h"
65 #endif
66 INTEGER IO_ERRCOUNT
67 EXTERNAL IO_ERRCOUNT
68
69 C !INPUT/OUTPUT PARAMETERS:
70 C myThid - Thread number for this instance of the routine.
71 C myIter - Iteration number
72 INTEGER myThid
73 INTEGER myIter
74 CEOP
75
76 C !LOCAL VARIABLES:
77 C oldPrec :: Temp. for hold I/O precision information
78 C prec
79 C fn :: Temp. for building file name.
80 INTEGER oldPrec, prec
81 INTEGER i, j, nj
82 CHARACTER*(MAX_LEN_FNAM) fn
83 CHARACTER*(10) suff
84
85 C Suffix for pickup files
86 DO i = 1,MAX_LEN_FNAM
87 fn(i:i) = ' '
88 ENDDO
89 IF (pickupSuff .EQ. ' ') THEN
90 WRITE(suff,'(I10.10)') myIter
91 ELSE
92 WRITE(suff,'(A10)') pickupSuff
93 ENDIF
94 WRITE(fn,'(A,A10)') 'pickup.',suff
95
96 C Going to really do some IO. Make everyone except master thread wait.
97 _BARRIER
98 _BEGIN_MASTER( myThid )
99
100 IF (pickup_read_mdsio) THEN
101
102 #ifdef OLD_STYLE_WITH_MANY_FILES
103
104 C Force 64-bit IO
105 oldPrec = readBinaryPrec
106 readBinaryPrec = precFloat64
107
108 C Read model fields
109 C Raw fields
110 CALL READ_REC_XYZ_RL( 'uVel', uVel, 1,myIter,myThid)
111 CALL READ_REC_XYZ_RL( 'gU', gU, 1,myIter,myThid)
112 CALL READ_REC_XYZ_RL( 'guNm1', guNm1, 1,myIter,myThid)
113 CALL READ_REC_XYZ_RL( 'vVel', vVel, 1,myIter,myThid)
114 CALL READ_REC_XYZ_RL( 'gV', gV, 1,myIter,myThid)
115 CALL READ_REC_XYZ_RL( 'gvNm1', gvNm1, 1,myIter,myThid)
116 CALL READ_REC_XYZ_RL( 'theta', theta, 1,myIter,myThid)
117 CALL READ_REC_XYZ_RL( 'gT', gT, 1,myIter,myThid)
118 CALL READ_REC_XYZ_RL( 'gtNm1', gtNm1, 1,myIter,myThid)
119 CALL READ_REC_XYZ_RL( 'salt', salt, 1,myIter,myThid)
120 CALL READ_REC_XYZ_RL( 'gS', gS, 1,myIter,myThid)
121 CALL READ_REC_XYZ_RL( 'gsNm1', gsNm1, 1,myIter,myThid)
122 CALL READ_REC_XY_RL ( 'etaN', etaN, 1,myIter,myThid)
123
124 #ifdef ALLOW_NONHYDROSTATIC
125 IF ( nonHydrostatic ) THEN
126 CALL READ_REC_XYZ_RL('phi_nh',phi_nh,1,myIter,myThid)
127 CALL READ_REC_XYZ_RL( 'gW', gW,1,myIter,myThid)
128 c CALL READ_REC_XYZ_RL( 'gWnm1', gWnm1,1,myIter,myThid)
129 ENDIF
130 #endif
131
132 C Reset default IO precision
133 readBinaryPrec = oldPrec
134
135 #else /* OLD_STYLE_WITH_MANY_FILES */
136
137 prec = precFloat64
138
139 #ifdef ALLOW_MDSIO
140
141 C Read model fields
142 IF ( usePickupBeforeC54 ) THEN
143 #ifndef ALLOW_ADAMSBASHFORTH_3
144 CALL MDSREADFIELD(fn,prec,'RL',Nr,uVel, 1,myThid)
145 CALL MDSREADFIELD(fn,prec,'RL',Nr,gU, 2,myThid)
146 CALL MDSREADFIELD(fn,prec,'RL',Nr,guNm1, 3,myThid)
147 CALL MDSREADFIELD(fn,prec,'RL',Nr,vVel, 4,myThid)
148 CALL MDSREADFIELD(fn,prec,'RL',Nr,gV, 5,myThid)
149 CALL MDSREADFIELD(fn,prec,'RL',Nr,gvNm1, 6,myThid)
150 CALL MDSREADFIELD(fn,prec,'RL',Nr,theta, 7,myThid)
151 CALL MDSREADFIELD(fn,prec,'RL',Nr,gT, 8,myThid)
152 CALL MDSREADFIELD(fn,prec,'RL',Nr,gtNm1, 9,myThid)
153 CALL MDSREADFIELD(fn,prec,'RL',Nr,salt, 10,myThid)
154 CALL MDSREADFIELD(fn,prec,'RL',Nr,gS, 11,myThid)
155 CALL MDSREADFIELD(fn,prec,'RL',Nr,gsNm1, 12,myThid)
156 #endif /* ALLOW_ADAMSBASHFORTH_3 */
157 CALL MDSREADFIELD(fn,prec,'RL', 1,etaN,12*Nr+1,myThid)
158 #ifdef NONLIN_FRSURF
159 IF (nonlinFreeSurf .GE. 0) THEN
160 CALL MDSREADFIELD(fn,prec,'RL',1,etaH,12*Nr+2,myThid)
161 ENDIF
162 #endif
163 ELSE
164 #ifdef ALLOW_ADAMSBASHFORTH_3
165 j = 3
166 IF ( startFromPickupAB2 ) j = 2
167 nj = 0
168 CALL MDSREADFIELD(fn,prec,'RL',Nr,uVel, nj+1,myThid)
169 CALL MDSREADFIELD(fn,prec,'RL',Nr,
170 & guNm(1-Olx,1-Oly,1,1,1,1), nj+2,myThid)
171 CALL MDSREADFIELD(fn,prec,'RL',Nr,
172 & guNm(1-Olx,1-Oly,1,1,1,2), nj+j,myThid)
173 nj = j
174 CALL MDSREADFIELD(fn,prec,'RL',Nr,vVel, nj+1,myThid)
175 CALL MDSREADFIELD(fn,prec,'RL',Nr,
176 & gvNm(1-Olx,1-Oly,1,1,1,1), nj+2,myThid)
177 CALL MDSREADFIELD(fn,prec,'RL',Nr,
178 & gvNm(1-Olx,1-Oly,1,1,1,2), nj+j,myThid)
179 nj = 2*j
180 CALL MDSREADFIELD(fn,prec,'RL',Nr,theta,nj+1,myThid)
181 CALL MDSREADFIELD(fn,prec,'RL',Nr,
182 & gtNm(1-Olx,1-Oly,1,1,1,1), nj+2,myThid)
183 CALL MDSREADFIELD(fn,prec,'RL',Nr,
184 & gtNm(1-Olx,1-Oly,1,1,1,2), nj+j,myThid)
185 nj = 3*j
186 CALL MDSREADFIELD(fn,prec,'RL',Nr,salt, nj+1,myThid)
187 CALL MDSREADFIELD(fn,prec,'RL',Nr,
188 & gsNm(1-Olx,1-Oly,1,1,1,1), nj+2,myThid)
189 CALL MDSREADFIELD(fn,prec,'RL',Nr,
190 & gsNm(1-Olx,1-Oly,1,1,1,2), nj+j,myThid)
191 nj = 4*j
192 #else /* ALLOW_ADAMSBASHFORTH_3 */
193 CALL MDSREADFIELD(fn,prec,'RL',Nr,uVel, 1,myThid)
194 CALL MDSREADFIELD(fn,prec,'RL',Nr,guNm1, 2,myThid)
195 CALL MDSREADFIELD(fn,prec,'RL',Nr,vVel, 3,myThid)
196 CALL MDSREADFIELD(fn,prec,'RL',Nr,gvNm1, 4,myThid)
197 CALL MDSREADFIELD(fn,prec,'RL',Nr,theta, 5,myThid)
198 CALL MDSREADFIELD(fn,prec,'RL',Nr,gtNm1, 6,myThid)
199 CALL MDSREADFIELD(fn,prec,'RL',Nr,salt, 7,myThid)
200 CALL MDSREADFIELD(fn,prec,'RL',Nr,gsNm1, 8,myThid)
201 nj = 8
202 #endif /* ALLOW_ADAMSBASHFORTH_3 */
203 CALL MDSREADFIELD(fn,prec,'RL', 1,etaN, nj*Nr+1,myThid)
204 #ifdef EXACT_CONSERV
205 IF (exactConserv) THEN
206 CALL MDSREADFIELD(fn,prec,'RL',1,dEtaHdt,nj*Nr+2,myThid)
207 ENDIF
208 IF (nonlinFreeSurf .GT. 0) THEN
209 CALL MDSREADFIELD(fn,prec,'RL',1,etaH, nj*Nr+3,myThid)
210 ENDIF
211 #endif
212 ENDIF
213
214 IF ( useDynP_inEos_Zc ) THEN
215 WRITE(fn,'(A,A10)') 'pickup_ph.',suff
216 CALL MDSREADFIELD(fn,prec,'RL',Nr,totPhiHyd,1,myThid)
217 ENDIF
218 #ifdef ALLOW_NONHYDROSTATIC
219 IF ( nonHydrostatic ) THEN
220 WRITE(fn,'(A,A10)') 'pickup_nh.',suff
221 CALL MDSREADFIELD(fn,prec,'RL',Nr,phi_nh,1,myThid)
222 CALL MDSREADFIELD(fn,prec,'RL',Nr, gW,2,myThid)
223 c CALL MDSREADFIELD(fn,prec,'RL',Nr, gWnm1,3,myThid)
224 ENDIF
225 #endif
226
227 #endif /* ALLOW_MDSIO */
228
229 #endif /* OLD_STYLE_WITH_MANY_FILES */
230
231 ENDIF
232
233 #ifdef ALLOW_MNC
234 IF (useMNC .AND. pickup_read_mnc) THEN
235 WRITE(fn,'(A)') 'pickup'
236 CALL MNC_FILE_CLOSE_ALL_MATCHING(fn, myThid)
237 CALL MNC_CW_SET_UDIM(fn, 1, myThid)
238 CALL MNC_CW_SET_CITER(fn, 3, 3, myIter, -1, myThid)
239 CALL MNC_CW_RL_R('D',fn,0,0,'U',uVel, myThid)
240 CALL MNC_CW_RL_R('D',fn,0,0,'V',vVel, myThid)
241 CALL MNC_CW_RL_R('D',fn,0,0,'Temp',theta, myThid)
242 CALL MNC_CW_RL_R('D',fn,0,0,'S',salt, myThid)
243 CALL MNC_CW_RL_R('D',fn,0,0,'Eta',etaN, myThid)
244 #ifndef ALLOW_ADAMSBASHFORTH_3
245 CALL MNC_CW_RL_R('D',fn,0,0,'gUnm1',guNm1, myThid)
246 CALL MNC_CW_RL_R('D',fn,0,0,'gVnm1',gvNm1, myThid)
247 CALL MNC_CW_RL_R('D',fn,0,0,'gTnm1',gtNm1, myThid)
248 CALL MNC_CW_RL_R('D',fn,0,0,'gSnm1',gsNm1, myThid)
249 #endif /* ALLOW_ADAMSBASHFORTH_3 */
250 C#ifdef NONLIN_FRSURF
251 C IF ( nonlinFreeSurf.GE.0 .AND. usePickupBeforeC54 )
252 C & CALL MNC_CW_RL_R('D',fn,0,0,'EtaH', etaH, myThid)
253 C#endif
254 #ifdef EXACT_CONSERV
255 IF (exactConserv) THEN
256 CALL MNC_CW_RL_R('D',fn,0,0,'dEtaHdt',dEtaHdt,myThid)
257 ENDIF
258 IF (nonlinFreeSurf .GT. 0) THEN
259 CALL MNC_CW_RL_R('D',fn,0,0,'EtaH', etaH, myThid)
260 ENDIF
261 #endif
262 #ifdef ALLOW_NONHYDROSTATIC
263 IF (nonHydrostatic) THEN
264 CALL MNC_CW_RL_R('D',fn,0,0,'phi_nh', phi_nh, myThid)
265 CALL MNC_CW_RL_R('D',fn,0,0,'gW', gW, myThid)
266 ENDIF
267 #endif
268 IF ( useDynP_inEos_Zc ) THEN
269 CALL MNC_CW_RL_R('D',fn,0,0,'phiHyd',totPhiHyd,myThid)
270 ENDIF
271 ENDIF
272 #endif /* ALLOW_MNC */
273
274 _END_MASTER( myThid )
275 _BARRIER
276
277 C Fill in edge regions
278 CALL EXCH_UV_XYZ_RL(uVel,vVel,.TRUE.,myThid)
279 _EXCH_XYZ_R8(theta , myThid )
280 _EXCH_XYZ_R8(salt , myThid )
281 c CALL EXCH_UV_XYZ_RL(gU,gV,.TRUE.,myThid)
282 c _EXCH_XYZ_R8(gt , myThid )
283 c _EXCH_XYZ_R8(gs , myThid )
284 #ifdef ALLOW_ADAMSBASHFORTH_3
285 CALL EXCH_UV_XYZ_RL(guNm(1-Olx,1-Oly,1,1,1,1),
286 & gvNm(1-Olx,1-Oly,1,1,1,1),.TRUE.,myThid)
287 _EXCH_XYZ_R8( gtNm(1-Olx,1-Oly,1,1,1,1), myThid )
288 _EXCH_XYZ_R8( gsNm(1-Olx,1-Oly,1,1,1,1), myThid )
289 CALL EXCH_UV_XYZ_RL(guNm(1-Olx,1-Oly,1,1,1,2),
290 & gvNm(1-Olx,1-Oly,1,1,1,2),.TRUE.,myThid)
291 _EXCH_XYZ_R8( gtNm(1-Olx,1-Oly,1,1,1,2), myThid )
292 _EXCH_XYZ_R8( gsNm(1-Olx,1-Oly,1,1,1,2), myThid )
293 #else /* ALLOW_ADAMSBASHFORTH_3 */
294 CALL EXCH_UV_XYZ_RL(guNm1,gvNm1,.TRUE.,myThid)
295 _EXCH_XYZ_R8(gtNm1 , myThid )
296 _EXCH_XYZ_R8(gsNm1 , myThid )
297 #endif /* ALLOW_ADAMSBASHFORTH_3 */
298 _EXCH_XY_R8 (etaN, myThid )
299 _EXCH_XY_R8( etaH, myThid )
300 #ifdef EXACT_CONSERV
301 _EXCH_XY_R8( detaHdt, myThid )
302 #endif
303
304 IF ( useDynP_inEos_Zc )
305 & _EXCH_XYZ_RL( totPhiHyd, myThid )
306
307 #ifdef ALLOW_NONHYDROSTATIC
308 IF ( nonHydrostatic ) THEN
309 _EXCH_XYZ_R8(phi_nh, myThid )
310 _EXCH_XYZ_R8(gW , myThid )
311 c _EXCH_XYZ_R8(gWNM1 , myThid )
312 ENDIF
313 #endif
314
315 RETURN
316 END
317
318 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
319 CBOP
320 C !ROUTINE: WRITE_CHECKPOINT
321 C !INTERFACE:
322 SUBROUTINE WRITE_CHECKPOINT(
323 I modelEnd, myTime,
324 I myIter, myThid )
325
326 C !DESCRIPTION:
327 C This is the controlling routine for IO to write restart (or
328 C ``pickup'' or ``checkpoint'') files. It calls routines from other
329 C packages (\textit{eg.} mdsio and mnc) to do the per-variable
330 C writes.
331 C
332 C Both ``rolling-checkpoint'' files and permanent checkpoint files
333 C are written here. A rolling checkpoint works through a circular
334 C list of suffices. Generally the circular list has two entries so
335 C that a rolling checkpoint will overwrite the last rolling
336 C checkpoint but one. This is useful for running long jobs without
337 C filling too much disk space. In a permanent checkpoint, data is
338 C written suffixed by the current timestep number. Permanent
339 C checkpoints can be used to provide snap-shots from which the
340 C model can be restarted.
341
342 C !USES:
343 IMPLICIT NONE
344 #include "SIZE.h"
345 #include "EEPARAMS.h"
346 #include "PARAMS.h"
347 #ifdef ALLOW_MNC
348 #include "MNC_PARAMS.h"
349 #endif
350 LOGICAL DIFFERENT_MULTIPLE
351 EXTERNAL DIFFERENT_MULTIPLE
352 INTEGER IO_ERRCOUNT
353 EXTERNAL IO_ERRCOUNT
354
355 C !INPUT PARAMETERS:
356 C modelEnd :: Checkpoint call at end of model run.
357 C myThid :: Thread number for this instance of the routine.
358 C myIter :: Iteration number
359 C myTime :: Current time of simulation ( s )
360 LOGICAL modelEnd
361 INTEGER myThid
362 INTEGER myIter
363 _RL myTime
364 CEOP
365
366 C !LOCAL VARIABLES:
367 C permCheckPoint :: Flag indicating whether a permanent checkpoint will
368 C be written.
369 C tempCheckPoint :: Flag indicating if it is time to write a non-permanent
370 C checkpoint (that will be permanent if permCheckPoint=T)
371 LOGICAL permCheckPoint, tempCheckPoint
372 INTEGER thisdate(4), prevdate(4)
373
374 permCheckPoint = .FALSE.
375 tempCheckPoint = .FALSE.
376 permCheckPoint =
377 & DIFFERENT_MULTIPLE(pChkptFreq,myTime,deltaTClock)
378 tempCheckPoint =
379 & DIFFERENT_MULTIPLE( ChkptFreq,myTime,deltaTClock)
380
381 #ifdef ALLOW_CAL
382 IF ( calendarDumps ) THEN
383 C-- Convert approximate months (30-31 days) and years (360-372 days)
384 C to exact calendar months and years.
385 C- First determine calendar dates for this and previous time step.
386 call cal_GetDate( myiter ,mytime ,thisdate,mythid )
387 call cal_GetDate( myiter-1,mytime-deltaTClock,prevdate,mythid )
388 C- Monthly pChkptFreq:
389 IF( pChkptFreq.GE. 2592000 .AND. pChkptFreq.LE. 2678400 ) THEN
390 permCheckPoint = .FALSE.
391 IF((thisdate(1)-prevdate(1)) .GT. 50 )permCheckPoint=.TRUE.
392 ENDIF
393 C- Yearly pChkptFreq:
394 IF( pChkptFreq.GE.31104000 .AND. pChkptFreq.LE.31968000 ) THEN
395 permCheckPoint = .FALSE.
396 IF((thisdate(1)-prevdate(1)) .GT. 5000)permCheckPoint=.TRUE.
397 ENDIF
398 C- Monthly ChkptFreq:
399 IF( ChkptFreq.GE. 2592000 .AND. ChkptFreq.LE. 2678400 ) THEN
400 tempCheckPoint = .FALSE.
401 IF((thisdate(1)-prevdate(1)) .GT. 50 )tempCheckPoint=.TRUE.
402 ENDIF
403 C- Yearly ChkptFreq:
404 IF( ChkptFreq.GE.31104000 .AND. ChkptFreq.LE.31968000 ) THEN
405 tempCheckPoint = .FALSE.
406 IF((thisdate(1)-prevdate(1)) .GT. 5000)tempCheckPoint=.TRUE.
407 ENDIF
408 ENDIF
409 #endif
410
411 IF (
412 & ( .NOT.modelEnd .AND. (permCheckPoint.OR.tempCheckPoint) )
413 & .OR.
414 & ( modelEnd .AND. .NOT.(permCheckPoint.OR.tempCheckPoint) )
415 & ) THEN
416
417 CALL WRITE_CHECKPOINT_NOW(
418 & permCheckPoint, myTime, myIter, myThid )
419
420
421 ENDIF
422 RETURN
423 END
424
425 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
426 CBOP
427 C !ROUTINE: WRITE_CHECKPOINT_NOW
428 C !INTERFACE:
429 SUBROUTINE WRITE_CHECKPOINT_NOW(
430 I permCheckPoint, myTime,
431 I myIter, myThid )
432
433 C !DESCRIPTION:
434 C Write the checkpoint and do it NOW.
435
436 C !USES:
437 IMPLICIT NONE
438 #include "SIZE.h"
439 #include "EEPARAMS.h"
440 #include "PARAMS.h"
441 #ifdef ALLOW_MNC
442 #include "MNC_PARAMS.h"
443 #endif
444 #include "DYNVARS.h"
445 #include "SURFACE.h"
446 #ifdef ALLOW_NONHYDROSTATIC
447 #include "GW.h"
448 #include "SOLVE_FOR_PRESSURE3D.h"
449 #endif
450 INTEGER IO_ERRCOUNT
451 EXTERNAL IO_ERRCOUNT
452 COMMON /PCKP_GBLFLS/ globalFile
453 LOGICAL globalFile
454
455 C !INPUT PARAMETERS:
456 C permCheckPoint :: Is or is not a permanent checkpoint.
457 C myThid :: Thread number for this instance of the routine.
458 C myIter :: Iteration number
459 C myTime :: Current time of simulation ( s )
460 LOGICAL permCheckPoint
461 INTEGER myThid
462 INTEGER myIter
463 _RL myTime
464 CEOP
465
466 C !LOCAL VARIABLES:
467 C oldPrc :: Temp. for holding I/O precision
468 C fn :: Temp. for building file name string.
469 C lgf :: Flag to indicate whether to use global file mode.
470 INTEGER oldPrec, prec
471 INTEGER i, nj
472 CHARACTER*(MAX_LEN_FNAM) fn
473 CHARACTER*(MAX_LEN_MBUF) msgBuf
474 LOGICAL lgf
475
476 C Write model fields
477 DO i = 1,MAX_LEN_FNAM
478 fn(i:i) = ' '
479 ENDDO
480 IF ( permCheckPoint ) THEN
481 WRITE(fn,'(A,I10.10)') 'pickup.',myIter
482 ELSE
483 WRITE(fn,'(A,A)') 'pickup.',checkPtSuff(nCheckLev)
484 ENDIF
485
486 C Going to really do some IO. Make everyone except master thread wait.
487 _BARRIER
488 _BEGIN_MASTER( myThid )
489
490 IF (pickup_write_mdsio) THEN
491
492 #ifdef OLD_STYLE_WITH_MANY_FILES
493
494 C Force 64-bit IO
495 oldPrec = writeBinaryPrec
496 writeBinaryPrec = precFloat64
497 C Write model fields
498 C Raw fields
499 CALL WRITE_REC_XYZ_RL( 'uVel', uVel, 1,myIter,myThid)
500 CALL WRITE_REC_XYZ_RL( 'gU', gU, 1,myIter,myThid)
501 CALL WRITE_REC_XYZ_RL( 'gUNm1', gUNm1, 1,myIter,myThid)
502 CALL WRITE_REC_XYZ_RL( 'vVel', vVel, 1,myIter,myThid)
503 CALL WRITE_REC_XYZ_RL( 'gV', gV, 1,myIter,myThid)
504 CALL WRITE_REC_XYZ_RL( 'gVNm1', gVNm1, 1,myIter,myThid)
505 CALL WRITE_REC_XYZ_RL( 'theta', theta, 1,myIter,myThid)
506 CALL WRITE_REC_XYZ_RL( 'gT', gT, 1,myIter,myThid)
507 CALL WRITE_REC_XYZ_RL( 'gTNm1', gTNm1, 1,myIter,myThid)
508 CALL WRITE_REC_XYZ_RL( 'salt', salt, 1,myIter,myThid)
509 CALL WRITE_REC_XYZ_RL( 'gS', gS, 1,myIter,myThid)
510 CALL WRITE_REC_XYZ_RL( 'gSNm1', gSNm1, 1,myIter,myThid)
511 CALL WRITE_REC_XY_RL ( 'etaN', etaN, 1,myIter,myThid)
512 #ifdef ALLOW_NONHYDROSTATIC
513 IF ( nonHydrostatic ) THEN
514 CALL WRITE_REC_XYZ_RL('phi_nh',phi_nh,1,myIter,myThid)
515 CALL WRITE_REC_XYZ_RL( 'gW', gW,1,myIter,myThid)
516 C CALL WRITE_REC_XYZ_RL( 'gWnm1', gWnm1,1,myIter,myThid)
517 ENDIF
518 #endif
519 C Reset binary precision
520 writeBinaryPrec = oldPrec
521
522 #else /* OLD_STYLE_WITH_MANY_FILES */
523
524 prec = precFloat64
525 lgf = globalFile
526
527 #ifdef ALLOW_MDSIO
528
529 #ifdef ALLOW_ADAMSBASHFORTH_3
530 CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,uVel, 1,myIter,myThid)
531 CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,
532 & guNm(1-Olx,1-Oly,1,1,1,1), 2,myIter,myThid)
533 CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,
534 & guNm(1-Olx,1-Oly,1,1,1,2), 3,myIter,myThid)
535 CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,vVel, 4,myIter,myThid)
536 CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,
537 & gvNm(1-Olx,1-Oly,1,1,1,1), 5,myIter,myThid)
538 CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,
539 & gvNm(1-Olx,1-Oly,1,1,1,2), 6,myIter,myThid)
540 CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,theta, 7,myIter,myThid)
541 CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,
542 & gtNm(1-Olx,1-Oly,1,1,1,1), 8,myIter,myThid)
543 CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,
544 & gtNm(1-Olx,1-Oly,1,1,1,2), 9,myIter,myThid)
545 CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,salt, 10,myIter,myThid)
546 CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,
547 & gsNm(1-Olx,1-Oly,1,1,1,1),11,myIter,myThid)
548 CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,
549 & gsNm(1-Olx,1-Oly,1,1,1,2),12,myIter,myThid)
550 nj = 12
551 #else /* ALLOW_ADAMSBASHFORTH_3 */
552 CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,uVel, 1,myIter,myThid)
553 CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,guNm1,2,myIter,myThid)
554 CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,vVel, 3,myIter,myThid)
555 CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,gvNm1,4,myIter,myThid)
556 CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,theta,5,myIter,myThid)
557 CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,gtNm1,6,myIter,myThid)
558 CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,salt, 7,myIter,myThid)
559 CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,gsNm1,8,myIter,myThid)
560 nj = 8
561 #endif /* ALLOW_ADAMSBASHFORTH_3 */
562 CALL MDSWRITEFIELD(fn,prec,lgf,'RL', 1,etaN, nj*Nr+1,
563 & myIter,myThid)
564 #ifdef EXACT_CONSERV
565 CALL MDSWRITEFIELD(fn,prec,lgf,'RL', 1,dEtaHdt,nj*Nr+2,
566 & myIter,myThid)
567 CALL MDSWRITEFIELD(fn,prec,lgf,'RL', 1,etaHnm1,nj*Nr+3,
568 & myIter,myThid)
569 #endif /* EXACT_CONSERV */
570 IF ( useDynP_inEos_Zc ) THEN
571 IF ( permCheckPoint ) THEN
572 WRITE(fn,'(A,I10.10)') 'pickup_ph.',myIter
573 ELSE
574 WRITE(fn,'(A,A)') 'pickup_ph.',checkPtSuff(nCheckLev)
575 ENDIF
576 CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,totPhiHyd,
577 & 1,myIter,myThid)
578 ENDIF
579 #ifdef ALLOW_NONHYDROSTATIC
580 IF ( nonHydrostatic ) THEN
581 IF ( permCheckPoint ) THEN
582 WRITE(fn,'(A,I10.10)') 'pickup_nh.',myIter
583 ELSE
584 WRITE(fn,'(A,A)') 'pickup_nh.',checkPtSuff(nCheckLev)
585 ENDIF
586 CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,phi_nh, 1,
587 & myIter,myThid)
588 CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,gW, 2,
589 & myIter,myThid)
590 C CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,gWnm1, 3,
591 C & myIter,myThid)
592 ENDIF
593 #endif /* ALLOW_NONHYDROSTATIC */
594
595 #endif /* ALLOW_MDSIO */
596
597 #endif /* OLD_STYLE_WITH_MANY_FILES */
598
599 ENDIF
600
601 #ifdef ALLOW_MNC
602 IF (useMNC .AND. pickup_write_mnc) THEN
603 IF ( permCheckPoint ) THEN
604 WRITE(fn,'(A)') 'pickup'
605 ELSE
606 WRITE(fn,'(A,A)') 'pickup.',checkPtSuff(nCheckLev)
607 ENDIF
608 CALL MNC_CW_SET_UDIM(fn, 1, myThid)
609 IF ( permCheckPoint ) THEN
610 CALL MNC_CW_SET_CITER(fn, 3, 3, myIter, 0, myThid)
611 ELSE
612 CALL MNC_CW_SET_CITER(fn, 2, -1, -1, -1, myThid)
613 ENDIF
614 CALL MNC_CW_RL_W_S('D',fn,0,0,'T', myTime, myThid)
615 CALL MNC_CW_I_W_S('I',fn,0,0,'iter', myIter, myThid)
616 CALL MNC_CW_RL_W('D',fn,0,0,'U', uVel, myThid)
617 CALL MNC_CW_RL_W('D',fn,0,0,'V', vVel, myThid)
618 CALL MNC_CW_RL_W('D',fn,0,0,'Temp', theta, myThid)
619 CALL MNC_CW_RL_W('D',fn,0,0,'S', salt, myThid)
620 CALL MNC_CW_RL_W('D',fn,0,0,'Eta', etaN, myThid)
621 #ifndef ALLOW_ADAMSBASHFORTH_3
622 CALL MNC_CW_RL_W('D',fn,0,0,'gUnm1', guNm1, myThid)
623 CALL MNC_CW_RL_W('D',fn,0,0,'gVnm1', gvNm1, myThid)
624 CALL MNC_CW_RL_W('D',fn,0,0,'gTnm1', gtNm1, myThid)
625 CALL MNC_CW_RL_W('D',fn,0,0,'gSnm1', gsNm1, myThid)
626 #endif /* ALLOW_ADAMSBASHFORTH_3 */
627 #ifdef EXACT_CONSERV
628 CALL MNC_CW_RL_W('D',fn,0,0,'dEtaHdt', dEtaHdt, myThid)
629 CALL MNC_CW_RL_W('D',fn,0,0,'EtaH', etaHnm1, myThid)
630 #endif
631 #ifdef ALLOW_NONHYDROSTATIC
632 IF ( nonHydrostatic ) THEN
633 CALL MNC_CW_RL_W('D',fn,0,0,'phi_nh', phi_nh, myThid)
634 CALL MNC_CW_RL_W('D',fn,0,0,'gW', gW, myThid)
635 ENDIF
636 #endif
637 IF ( useDynP_inEos_Zc ) THEN
638 CALL MNC_CW_RL_W('D',fn,0,0,'phiHyd', totPhiHyd, myThid)
639 ENDIF
640 ENDIF
641 #endif /* ALLOW_MNC */
642
643 C Write suffix for stdout information
644 IF ( permCheckPoint ) THEN
645 WRITE(fn,'(I10.10)') myIter
646 ELSE
647 WRITE(fn,'(A)') checkPtSuff(nCheckLev)
648 ENDIF
649
650 IF ( .NOT. permCheckPoint ) THEN
651 nCheckLev = MOD(nCheckLev, maxNoChkptLev)+1
652 ENDIF
653
654 _END_MASTER(myThid)
655 _BARRIER
656
657 C Write information to stdout so there is a record that the
658 C checkpoint was completed
659 _BEGIN_MASTER(myThid)
660 WRITE(msgBuf,'(A11,I10,1X,A10)')
661 & "%CHECKPOINT ",myIter,fn
662 CALL PRINT_MESSAGE(msgBuf,standardMessageUnit,SQUEEZE_RIGHT,1)
663 _END_MASTER(myThid)
664
665 RETURN
666 END

  ViewVC Help
Powered by ViewVC 1.1.22