/[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.31 - (show annotations) (download)
Sun Dec 14 23:18:49 2003 UTC (20 years, 5 months ago) by jmc
Branch: MAIN
Changes since 1.30: +27 -115 lines
new S/R that calls each $PKG_write_pickup (if needed)

1 C $Header: /u/gcmpack/MITgcm/model/src/checkpoint.F,v 1.30 2003/11/23 01:28:05 jmc Exp $
2 C $Name: $
3
4 #include "PACKAGES_CONFIG.h"
5 #include "CPP_OPTIONS.h"
6
7 C-- File read_write.F: Routines to handle mid-level I/O interface.
8 C-- Contents
9 C-- o SET_WRITE_GLOBAL_PICKUP
10 C-- o READ_CHECKPOINT - Write out checkpoint files for restarting.
11 C-- o WRITE_CHECKPOINT - Write out checkpoint files for restarting.
12
13 SUBROUTINE SET_WRITE_GLOBAL_PICKUP ( flag )
14 IMPLICIT NONE
15 C SET_WRITE_GLOBAL_FLD( flag ) sets an internal logical state to
16 C indicate whether files written by subsequent call to the
17 C READ_WRITE_FLD package should create "global" or "tiled" files.
18 C flag = .TRUE. indicates "global" files
19 C flag = .FALSE. indicates "tiled" files
20 C
21 C Arguments
22 LOGICAL flag
23 C Common
24 COMMON /PCKP_GBLFLS/ globalFile
25 LOGICAL globalFile
26 C
27 globalFile=flag
28 C
29 RETURN
30 END
31
32 CBOP
33 C !ROUTINE: READ_CHECKPOINT
34 C !INTERFACE:
35 SUBROUTINE READ_CHECKPOINT ( myIter, myThid )
36 C !DESCRIPTION: \bv
37 C *==========================================================*
38 C | SUBROUTINE READ_PICKUP
39 C | o Controlling routine for IO to write restart file.
40 C *==========================================================*
41 C | Read model checkpoint files for use in restart.
42 C *==========================================================*
43 C \ev
44 C !USES:
45 IMPLICIT NONE
46 C == Global variables ===
47 #include "SIZE.h"
48 #include "EEPARAMS.h"
49 #include "PARAMS.h"
50 #include "DYNVARS.h"
51 #ifdef ALLOW_NONHYDROSTATIC
52 #include "GW.h"
53 #include "SOLVE_FOR_PRESSURE3D.h"
54 #endif
55
56 INTEGER IO_ERRCOUNT
57 EXTERNAL IO_ERRCOUNT
58
59 C !INPUT/OUTPUT PARAMETERS:
60 C == Routine arguments ==
61 C myThid - Thread number for this instance of the routine.
62 C myIter - Iteration number
63 INTEGER myThid
64 INTEGER myIter
65
66 C !LOCAL VARIABLES:
67 C == Local variables ==
68 C oldPrec :: Temp. for hold I/O precision information
69 C prec
70 C fn :: Temp. for building file name.
71 INTEGER oldPrec
72 CHARACTER*(MAX_LEN_FNAM) fn
73 CHARACTER*(10) suff
74 INTEGER prec
75 CEOP
76
77 C-- Going to really do some IO. Make everyone except master thread wait.
78 _BARRIER
79 _BEGIN_MASTER( myThid )
80
81 #ifdef OLD_STYLE_WITH_MANY_FILES
82
83 C Force 64-bit IO
84 oldPrec = readBinaryPrec
85 readBinaryPrec = precFloat64
86
87 C-- Read model fields
88 C Raw fields
89 CALL READ_REC_XYZ_RL( 'uVel', uVel, 1,myIter, myThid)
90 CALL READ_REC_XYZ_RL( 'gU', gU, 1,myIter, myThid)
91 CALL READ_REC_XYZ_RL( 'guNm1', gUNm1, 1,myIter, myThid)
92 CALL READ_REC_XYZ_RL( 'vVel', vVel, 1,myIter, myThid)
93 CALL READ_REC_XYZ_RL( 'gV', gV, 1,myIter, myThid)
94 CALL READ_REC_XYZ_RL( 'gvNm1', gVNm1, 1,myIter, myThid)
95 CALL READ_REC_XYZ_RL( 'theta', theta, 1,myIter, myThid)
96 CALL READ_REC_XYZ_RL( 'gT', gT, 1,myIter, myThid)
97 CALL READ_REC_XYZ_RL( 'gtNm1', gTNm1, 1,myIter, myThid)
98 CALL READ_REC_XYZ_RL( 'salt', salt, 1,myIter, myThid)
99 CALL READ_REC_XYZ_RL( 'gS', gS, 1,myIter, myThid)
100 CALL READ_REC_XYZ_RL( 'gsNm1', gSNm1, 1,myIter, myThid)
101 CALL READ_REC_XY_RL ('etaN', etaN, 1,myIter, myThid)
102
103 #ifdef ALLOW_NONHYDROSTATIC
104 IF ( nonHydrostatic ) THEN
105 CALL READ_REC_XYZ_RL('phi_nh',phi_nh,1,myIter,myThid)
106 CALL READ_REC_XYZ_RL( 'gW',gW, 1,myIter,myThid)
107 c CALL READ_REC_XYZ_RL( 'gWnm1',gWnm1, 1,myIter,myThid)
108 ENDIF
109 #endif
110
111 C Reset default IO precision
112 readBinaryPrec = oldPrec
113
114 #else /* OLD_STYLE_WITH_MANY_FILES */
115
116 prec = precFloat64
117
118 C-- Suffix for pickup files
119 IF (pickupSuff.EQ.' ') THEN
120 WRITE(suff,'(I10.10)') myIter
121 ELSE
122 WRITE(suff,'(A10)') pickupSuff
123 ENDIF
124
125 C-- Read model fields
126 WRITE(fn,'(A,A10)') 'pickup.',suff
127 CALL MDSREADFIELD(fn,prec,'RL',Nr,uVel, 1,myThid)
128 CALL MDSREADFIELD(fn,prec,'RL',Nr,gU, 2,myThid)
129 CALL MDSREADFIELD(fn,prec,'RL',Nr,gUnm1, 3,myThid)
130 CALL MDSREADFIELD(fn,prec,'RL',Nr,vVel, 4,myThid)
131 CALL MDSREADFIELD(fn,prec,'RL',Nr,gV, 5,myThid)
132 CALL MDSREADFIELD(fn,prec,'RL',Nr,gVnm1, 6,myThid)
133 CALL MDSREADFIELD(fn,prec,'RL',Nr,theta, 7,myThid)
134 CALL MDSREADFIELD(fn,prec,'RL',Nr,gT, 8,myThid)
135 CALL MDSREADFIELD(fn,prec,'RL',Nr,gTnm1, 9,myThid)
136 CALL MDSREADFIELD(fn,prec,'RL',Nr,salt, 10,myThid)
137 CALL MDSREADFIELD(fn,prec,'RL',Nr,gS, 11,myThid)
138 CALL MDSREADFIELD(fn,prec,'RL',Nr,gSnm1, 12,myThid)
139 CALL MDSREADFIELD(fn,prec,'RL', 1,etaN,12*Nr+1,myThid)
140 #ifdef NONLIN_FRSURF
141 IF ( nonlinFreeSurf.GE.0)
142 & CALL MDSREADFIELD(fn,prec,'RL',1,etaH,12*Nr+2,myThid)
143 #endif
144
145 IF ( useDynP_inEos_Zc ) THEN
146 WRITE(fn,'(A,A10)') 'pickup_ph.',suff
147 CALL MDSREADFIELD(fn,prec,'RL',Nr,totPhiHyd,1,myThid)
148 ENDIF
149
150 #ifdef ALLOW_NONHYDROSTATIC
151 IF ( nonHydrostatic ) THEN
152 WRITE(fn,'(A,A10)') 'pickup_nh.',suff
153 CALL MDSREADFIELD(fn,prec,'RL',Nr,phi_nh,1,myThid)
154 CALL MDSREADFIELD(fn,prec,'RL',Nr,gW, 2,myThid)
155 c CALL MDSREADFIELD(fn,prec,'RL',Nr,gWnm1,3,myThid)
156 ENDIF
157 #endif
158
159 C SPK 4/9/01: Open boundary checkpointing
160 #ifdef ALLOW_OBCS
161 IF (useOBCS) THEN
162 CALL OBCS_READ_CHECKPOINT(prec, suff, myThid)
163 ENDIF
164 #endif /* ALLOW_OBCS */
165
166 #endif /* OLD_STYLE_WITH_MANY_FILES */
167
168 _END_MASTER( myThid )
169 _BARRIER
170
171 C-- Fill in edge regions
172 CALL EXCH_UV_XYZ_RL(uVel,vVel,.TRUE.,myThid)
173 CALL EXCH_UV_XYZ_RL(gU,gV,.TRUE.,myThid)
174 CALL EXCH_UV_XYZ_RL(gUnm1,gVnm1,.TRUE.,myThid)
175 _EXCH_XYZ_R8(theta , myThid )
176 _EXCH_XYZ_R8(gt , myThid )
177 _EXCH_XYZ_R8(gtNM1 , myThid )
178 _EXCH_XYZ_R8(salt , myThid )
179 _EXCH_XYZ_R8(gs , myThid )
180 _EXCH_XYZ_R8(gsNM1 , myThid )
181 _EXCH_XY_R8 (etaN, myThid )
182 _EXCH_XY_R8( etaH, myThid )
183
184 IF ( useDynP_inEos_Zc )
185 & _EXCH_XYZ_RL( totPhiHyd, myThid )
186
187 #ifdef ALLOW_NONHYDROSTATIC
188 IF ( nonHydrostatic ) THEN
189 _EXCH_XYZ_R8(phi_nh, myThid )
190 _EXCH_XYZ_R8(gW , myThid )
191 c _EXCH_XYZ_R8(gWNM1 , myThid )
192 ENDIF
193 #endif
194
195 RETURN
196 END
197
198 CBOP
199 C !ROUTINE: WRITE_CHECKPOINT
200 C !INTERFACE:
201 SUBROUTINE WRITE_CHECKPOINT ( modelEnd, myTime,
202 & myIter, myThid )
203 C !DESCRIPTION: \bv
204 C *==========================================================*
205 C | SUBROUTINE WRITE_CHECKPOINT
206 C | o Controlling routine for IO to write restart file.
207 C *==========================================================*
208 C | Write model checkpoint files for use in restart.
209 C | This routine writes both "rolling-checkpoint" files
210 C | and permanent checkpoint files. A rolling checkpoint
211 C | works through a circular list of suffices. Generally the
212 C | circular list has two entries so that a rolling
213 C | checkpoint will overwrite the last rolling checkpoint
214 C | but one. This is useful for running long jobs without
215 C | filling too much disk space.
216 C | In a permanent checkpoint data is written suffixed by
217 C | the current timestep number. This sort of checkpoint can
218 C | be used to provided a snap-shot from which the model
219 C | can be rerun.
220 C *==========================================================*
221 C \ev
222
223 C !USES:
224 IMPLICIT NONE
225 C == Global variables ===
226 #include "SIZE.h"
227 #include "EEPARAMS.h"
228 #include "PARAMS.h"
229 #include "DYNVARS.h"
230 #ifdef ALLOW_NONHYDROSTATIC
231 #include "GW.h"
232 #include "SOLVE_FOR_PRESSURE3D.h"
233 #endif
234 LOGICAL DIFFERENT_MULTIPLE
235 EXTERNAL DIFFERENT_MULTIPLE
236 INTEGER IO_ERRCOUNT
237 EXTERNAL IO_ERRCOUNT
238
239 C !INPUT/OUTPUT PARAMETERS:
240 C == Routine arguments ==
241 C modelEnd :: Checkpoint call at end of model run.
242 C myThid :: Thread number for this instance of the routine.
243 C myIter :: Iteration number
244 C myTime :: Current time of simulation ( s )
245 LOGICAL modelEnd
246 INTEGER myThid
247 INTEGER myIter
248 _RL myTime
249
250 C == Common blocks ==
251 COMMON /PCKP_GBLFLS/ globalFile
252 LOGICAL globalFile
253
254 C !LOCAL VARIABLES:
255 C == Local variables ==
256 C permCheckPoint :: Flag indicating whether a permanent checkpoint will
257 C be written.
258 C tempCheckPoint :: Flag indicating if it is time to write a non-permanent
259 C checkpoint (that will be permanent if permCheckPoint=T)
260 C oldPrc :: Temp. for holding I/O precision
261 C fn :: Temp. for building file name string.
262 C lgf :: Flag to indicate whether to use global file mode.
263 LOGICAL permCheckPoint, tempCheckPoint
264 INTEGER oldPrec
265 CHARACTER*(MAX_LEN_FNAM) fn
266 CHARACTER*(MAX_LEN_MBUF) msgBuf
267 INTEGER prec
268 LOGICAL lgf
269 CEOP
270
271 permCheckPoint = .FALSE.
272 tempCheckPoint = .FALSE.
273 permCheckPoint=
274 & DIFFERENT_MULTIPLE(pChkptFreq,myTime,myTime-deltaTClock)
275 tempCheckPoint=
276 & DIFFERENT_MULTIPLE( ChkptFreq,myTime,myTime-deltaTClock)
277
278 IF (
279 & ( .NOT.modelEnd .AND. (permCheckPoint.OR.tempCheckPoint) )
280 & .OR.
281 & ( modelEnd .AND. .NOT.(permCheckPoint.OR.tempCheckPoint) )
282 & ) THEN
283
284 C-- Going to really do some IO. Make everyone except master thread wait.
285 _BARRIER
286 _BEGIN_MASTER( myThid )
287
288 #ifdef OLD_STYLE_WITH_MANY_FILES
289 C Force 64-bit IO
290 oldPrec = writeBinaryPrec
291 writeBinaryPrec = precFloat64
292 WRITE(fn,'(A,I10.10)') 'many_files.',myIter
293
294 C-- Write model fields
295 C Raw fields
296 CALL WRITE_REC_XYZ_RL( 'uVel', uVel, 1,myIter, myThid)
297 CALL WRITE_REC_XYZ_RL( 'gU', gU, 1,myIter, myThid)
298 CALL WRITE_REC_XYZ_RL( 'gUNm1', gUNm1, 1,myIter, myThid)
299 CALL WRITE_REC_XYZ_RL( 'vVel', vVel, 1,myIter, myThid)
300 CALL WRITE_REC_XYZ_RL( 'gV', gV, 1,myIter, myThid)
301 CALL WRITE_REC_XYZ_RL( 'gVNm1', gVNm1, 1,myIter, myThid)
302 CALL WRITE_REC_XYZ_RL( 'theta', theta, 1,myIter, myThid)
303 CALL WRITE_REC_XYZ_RL( 'gT', gT, 1,myIter, myThid)
304 CALL WRITE_REC_XYZ_RL( 'gTNm1', gTNm1, 1,myIter, myThid)
305 CALL WRITE_REC_XYZ_RL( 'salt', salt, 1,myIter, myThid)
306 CALL WRITE_REC_XYZ_RL( 'gS', gS, 1,myIter, myThid)
307 CALL WRITE_REC_XYZ_RL( 'gSNm1', gSNm1, 1,myIter, myThid)
308 CALL WRITE_REC_XY_RL ('etaN', etaN, 1,myIter, myThid)
309
310 #ifdef ALLOW_NONHYDROSTATIC
311 IF ( nonHydrostatic ) THEN
312 CALL WRITE_REC_XYZ_RL('phi_nh',phi_nh,1,myIter,myThid)
313 CALL WRITE_REC_XYZ_RL( 'gW',gW, 1,myIter,myThid)
314 c CALL WRITE_REC_XYZ_RL( 'gWnm1',gWnm1, 1,myIter,myThid)
315 ENDIF
316 #endif
317
318 C-- Reset binary precision
319 writeBinaryPrec = oldPrec
320
321 #else /* OLD_STYLE_WITH_MANY_FILES */
322
323 prec = precFloat64
324 lgf = globalFile
325
326 C-- Write model fields
327 IF ( permCheckPoint ) THEN
328 WRITE(fn,'(A,I10.10)') 'pickup.',myIter
329 ELSE
330 WRITE(fn,'(A,A)') 'pickup.',checkPtSuff(nCheckLev)
331 ENDIF
332 CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,uVel, 1,myIter,myThid)
333 CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,gU, 2,myIter,myThid)
334 CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,gUnm1, 3,myIter,myThid)
335 CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,vVel, 4,myIter,myThid)
336 CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,gV, 5,myIter,myThid)
337 CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,gVnm1, 6,myIter,myThid)
338 CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,theta, 7,myIter,myThid)
339 CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,gT, 8,myIter,myThid)
340 CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,gTnm1, 9,myIter,myThid)
341 CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,salt, 10,myIter,myThid)
342 CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,gS, 11,myIter,myThid)
343 CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,gSnm1,12,myIter,myThid)
344 CALL MDSWRITEFIELD(fn,prec,lgf,'RL', 1,etaN,12*Nr+1,
345 & myIter,myThid)
346 #ifdef NONLIN_FRSURF
347 CALL MDSWRITEFIELD(fn,prec,lgf,'RL', 1,etaH,12*Nr+2,
348 & myIter,myThid)
349 #endif
350
351 IF ( useDynP_inEos_Zc ) THEN
352 IF ( permCheckPoint ) THEN
353 WRITE(fn,'(A,I10.10)') 'pickup_ph.',myIter
354 ELSE
355 WRITE(fn,'(A,A)') 'pickup_ph.',checkPtSuff(nCheckLev)
356 ENDIF
357 CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,totPhiHyd,
358 & 1,myIter,myThid)
359 ENDIF
360
361 #ifdef ALLOW_NONHYDROSTATIC
362 IF ( nonHydrostatic ) THEN
363 IF ( permCheckPoint ) THEN
364 WRITE(fn,'(A,I10.10)') 'pickup_nh.',myIter
365 ELSE
366 WRITE(fn,'(A,A)') 'pickup_nh.',checkPtSuff(nCheckLev)
367 ENDIF
368 CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,phi_nh,1,myIter,myThid)
369 CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,gW, 2,myIter,myThid)
370 c CALL MDSWRITEFIELD(fn,prec,lgf,'RL',Nr,gWnm1,3,myIter,myThid)
371 ENDIF
372 #endif
373
374 #endif /* OLD_STYLE_WITH_MANY_FILES */
375
376 IF ( .NOT. permCheckPoint ) THEN
377 nCheckLev = MOD(nCheckLev, maxNoChkptLev)+1
378 ENDIF
379
380 _END_MASTER(myThid)
381 _BARRIER
382
383 C Write information to stdout so there is a record that the
384 C checkpoint was completed
385 _BEGIN_MASTER(myThid)
386 WRITE(msgBuf,'(A11,I10,1X,A10)')
387 & "%CHECKPOINT ",myIter,fn
388 CALL PRINT_MESSAGE(msgBuf,standardMessageUnit,SQUEEZE_RIGHT,1)
389 _END_MASTER(myThid)
390
391 ENDIF
392
393 RETURN
394 END

  ViewVC Help
Powered by ViewVC 1.1.22