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

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

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


Revision 1.11 - (show annotations) (download)
Thu Aug 25 22:20:09 2011 UTC (12 years, 8 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint63p, checkpoint63q, checkpoint63r, checkpoint63s, checkpoint63l, checkpoint63m, checkpoint63n, checkpoint63o, checkpoint63h, checkpoint63i, checkpoint63j, checkpoint63k, checkpoint63d, checkpoint63e, checkpoint63f, checkpoint63g, checkpoint63b, checkpoint63c, checkpoint64
Changes since 1.10: +4 -2 lines
in MDS_WR_METAFILES calls, replace "myTime" by a local copy into array of length 1
  (was caught by compiler syntax-check).

1 C $Header: /u/gcmpack/MITgcm/model/src/write_pickup.F,v 1.10 2010/03/16 00:08:27 jmc 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: WRITE_PICKUP
10 C !INTERFACE:
11 SUBROUTINE WRITE_PICKUP(
12 I permPickup,
13 I myTime, myIter, myThid )
14
15 C !DESCRIPTION:
16 C Write the main-model pickup-file and do it NOW.
17 C It writes both "rolling-pickup" files (ckptA,ckptB) and
18 C permanent pickup files (with iteration number in the file name).
19 C It calls routines from other packages (\textit{eg.} rw and mnc)
20 C to do the per-variable writes.
21
22 C !USES:
23 IMPLICIT NONE
24 #include "SIZE.h"
25 #include "EEPARAMS.h"
26 #include "PARAMS.h"
27 #include "RESTART.h"
28 #include "DYNVARS.h"
29 #include "SURFACE.h"
30 #ifdef ALLOW_GENERIC_ADVDIFF
31 # include "GAD.h"
32 #endif
33 #ifdef ALLOW_NONHYDROSTATIC
34 #include "NH_VARS.h"
35 #endif
36 #ifdef ALLOW_MNC
37 #include "MNC_PARAMS.h"
38 #endif
39
40 C !INPUT PARAMETERS:
41 C permPickup :: Is or is not a permanent pickup.
42 C myTime :: Current time of simulation ( s )
43 C myIter :: Iteration number
44 C myThid :: Thread number for this instance of the routine.
45 LOGICAL permPickup
46 _RL myTime
47 INTEGER myIter
48 INTEGER myThid
49 CEOP
50
51 C !LOCAL VARIABLES:
52 C fp :: pickup-file precision
53 C glf :: local flag for "globalFiles"
54 C fn :: Temp. for building file name.
55 C nWrFlds :: number of fields being written
56 C n3D :: number of 3-D fields being written
57 C listDim :: dimension of "wrFldList" local array
58 C wrFldList :: list of written fields
59 C m1,m2 :: 6.th dim index (AB-3) corresponding to time-step N-1 & N-2
60 C j :: loop index / field number
61 C nj :: record number
62 C msgBuf :: Informational/error message buffer
63 INTEGER fp
64 LOGICAL glf
65 _RL timList(1)
66 CHARACTER*(MAX_LEN_FNAM) fn
67 INTEGER listDim, nWrFlds, n3D
68 PARAMETER( listDim = 20 )
69 CHARACTER*(8) wrFldList(listDim)
70 #ifdef ALLOW_ADAMSBASHFORTH_3
71 INTEGER m1, m2
72 #endif
73 INTEGER j, nj
74 CHARACTER*(MAX_LEN_MBUF) msgBuf
75 #ifndef ALLOW_GENERIC_ADVDIFF
76 LOGICAL AdamsBashforthGt
77 LOGICAL AdamsBashforthGs
78 LOGICAL AdamsBashforth_T
79 LOGICAL AdamsBashforth_S
80 PARAMETER ( AdamsBashforthGt = .FALSE. ,
81 & AdamsBashforthGs = .FALSE. ,
82 & AdamsBashforth_T = .FALSE. ,
83 & AdamsBashforth_S = .FALSE. )
84 #endif
85
86 C- Initialise:
87 DO j=1,listDim
88 wrFldList(j) = ' '
89 ENDDO
90
91 C Write model fields
92 DO j = 1,MAX_LEN_FNAM
93 fn(j:j) = ' '
94 ENDDO
95 IF ( permPickup ) THEN
96 WRITE(fn,'(A,I10.10)') 'pickup.',myIter
97 ELSE
98 WRITE(fn,'(A,A)') 'pickup.',checkPtSuff(nCheckLev)
99 ENDIF
100
101 C Going to really do some IO. Make everyone except master thread wait.
102 C this is done within IO routines => no longer needed
103 c _BARRIER
104
105 IF (pickup_write_mdsio) THEN
106
107 fp = precFloat64
108 j = 0
109 C record number < 0 : a hack not to write meta files now:
110
111 C--- write State 3-D fields for restart
112 j = j + 1
113 CALL WRITE_REC_3D_RL( fn, fp, Nr, uVel, -j, myIter, myThid )
114 IF (j.LE.listDim) wrFldList(j) = 'Uvel '
115 j = j + 1
116 CALL WRITE_REC_3D_RL( fn, fp, Nr, vVel, -j, myIter, myThid )
117 IF (j.LE.listDim) wrFldList(j) = 'Vvel '
118
119 j = j + 1
120 CALL WRITE_REC_3D_RL( fn, fp, Nr, theta, -j, myIter, myThid )
121 IF (j.LE.listDim) wrFldList(j) = 'Theta '
122 j = j + 1
123 CALL WRITE_REC_3D_RL( fn, fp, Nr, salt, -j, myIter, myThid )
124 IF (j.LE.listDim) wrFldList(j) = 'Salt '
125 C--- write 3-D fields for AB-restart
126 #ifdef ALLOW_ADAMSBASHFORTH_3
127 m1 = 1 + MOD(myIter+1,2)
128 m2 = 1 + MOD( myIter ,2)
129 IF ( momStepping ) THEN
130 C-- U velocity:
131 IF ( alph_AB.NE.0. .OR. beta_AB.NE.0. ) THEN
132 j = j + 1
133 CALL WRITE_REC_3D_RL( fn, fp, Nr, guNm(1-Olx,1-Oly,1,1,1,m1),
134 & -j, myIter, myThid )
135 IF (j.LE.listDim) wrFldList(j) = 'GuNm1 '
136 ENDIF
137 IF ( beta_AB.NE.0. ) THEN
138 j = j + 1
139 CALL WRITE_REC_3D_RL( fn, fp, Nr, guNm(1-Olx,1-Oly,1,1,1,m2),
140 & -j, myIter, myThid )
141 IF (j.LE.listDim) wrFldList(j) = 'GuNm2 '
142 ENDIF
143 C-- V velocity:
144 IF ( alph_AB.NE.0. .OR. beta_AB.NE.0. ) THEN
145 j = j + 1
146 CALL WRITE_REC_3D_RL( fn, fp, Nr, gvNm(1-Olx,1-Oly,1,1,1,m1),
147 & -j, myIter, myThid )
148 IF (j.LE.listDim) wrFldList(j) = 'GvNm1 '
149 ENDIF
150 IF ( beta_AB.NE.0. ) THEN
151 j = j + 1
152 CALL WRITE_REC_3D_RL( fn, fp, Nr, gvNm(1-Olx,1-Oly,1,1,1,m2),
153 & -j, myIter, myThid )
154 IF (j.LE.listDim) wrFldList(j) = 'GvNm2 '
155 ENDIF
156 ENDIF
157 C-- Temperature:
158 IF ( AdamsBashforthGt.OR.AdamsBashforth_T ) THEN
159 IF ( alph_AB.NE.0. .OR. beta_AB.NE.0. ) THEN
160 j = j + 1
161 CALL WRITE_REC_3D_RL( fn, fp, Nr, gtNm(1-Olx,1-Oly,1,1,1,m1),
162 & -j, myIter, myThid )
163 IF (j.LE.listDim) THEN
164 IF ( AdamsBashforthGt ) wrFldList(j) = 'GtNm1 '
165 IF ( AdamsBashforth_T ) wrFldList(j) = 'TempNm1 '
166 ENDIF
167 ENDIF
168 IF ( beta_AB.NE.0. ) THEN
169 j = j + 1
170 CALL WRITE_REC_3D_RL( fn, fp, Nr, gtNm(1-Olx,1-Oly,1,1,1,m2),
171 & -j, myIter, myThid )
172 IF (j.LE.listDim) THEN
173 IF ( AdamsBashforthGt ) wrFldList(j) = 'GtNm2 '
174 IF ( AdamsBashforth_T ) wrFldList(j) = 'TempNm2 '
175 ENDIF
176 ENDIF
177 ENDIF
178 C-- Salinity:
179 IF ( AdamsBashforthGs.OR.AdamsBashforth_S ) THEN
180 IF ( alph_AB.NE.0. .OR. beta_AB.NE.0. ) THEN
181 j = j + 1
182 CALL WRITE_REC_3D_RL( fn, fp, Nr, gsNm(1-Olx,1-Oly,1,1,1,m1),
183 & -j, myIter, myThid )
184 IF (j.LE.listDim) THEN
185 IF ( AdamsBashforthGs ) wrFldList(j) = 'GsNm1 '
186 IF ( AdamsBashforth_S ) wrFldList(j) = 'SaltNm1 '
187 ENDIF
188 ENDIF
189 IF ( beta_AB.NE.0. ) THEN
190 j = j + 1
191 CALL WRITE_REC_3D_RL( fn, fp, Nr, gsNm(1-Olx,1-Oly,1,1,1,m2),
192 & -j, myIter, myThid )
193 IF (j.LE.listDim) THEN
194 IF ( AdamsBashforthGs ) wrFldList(j) = 'GsNm2 '
195 IF ( AdamsBashforth_S ) wrFldList(j) = 'SaltNm2 '
196 ENDIF
197 ENDIF
198 ENDIF
199 #ifdef ALLOW_NONHYDROSTATIC
200 C-- W velocity:
201 IF ( nonHydrostatic ) THEN
202 IF ( alph_AB.NE.0. .OR. beta_AB.NE.0. ) THEN
203 j = j + 1
204 CALL WRITE_REC_3D_RL( fn, fp, Nr, gwNm(1-Olx,1-Oly,1,1,1,m1),
205 & -j, myIter, myThid )
206 IF (j.LE.listDim) wrFldList(j) = 'GwNm1 '
207 ENDIF
208 IF ( beta_AB.NE.0. ) THEN
209 j = j + 1
210 CALL WRITE_REC_3D_RL( fn, fp, Nr, gwNm(1-Olx,1-Oly,1,1,1,m2),
211 & -j, myIter, myThid )
212 IF (j.LE.listDim) wrFldList(j) = 'GwNm2 '
213 ENDIF
214 ENDIF
215 #endif /* ALLOW_NONHYDROSTATIC */
216 #else /* ALLOW_ADAMSBASHFORTH_3 */
217 IF ( momStepping ) THEN
218 j = j + 1
219 CALL WRITE_REC_3D_RL( fn, fp, Nr, guNm1, -j, myIter, myThid )
220 IF (j.LE.listDim) wrFldList(j) = 'GuNm1 '
221 j = j + 1
222 CALL WRITE_REC_3D_RL( fn, fp, Nr, gvNm1, -j, myIter, myThid )
223 IF (j.LE.listDim) wrFldList(j) = 'GvNm1 '
224 ENDIF
225 IF ( AdamsBashforthGt ) THEN
226 j = j + 1
227 CALL WRITE_REC_3D_RL( fn, fp, Nr, gtNm1, -j, myIter, myThid )
228 IF (j.LE.listDim) wrFldList(j) = 'GtNm1 '
229 ENDIF
230 IF ( AdamsBashforthGs ) THEN
231 j = j + 1
232 CALL WRITE_REC_3D_RL( fn, fp, Nr, gsNm1, -j, myIter, myThid )
233 IF (j.LE.listDim) wrFldList(j) = 'GsNm1 '
234 ENDIF
235 #ifdef ALLOW_NONHYDROSTATIC
236 IF ( nonHydrostatic ) THEN
237 j = j + 1
238 CALL WRITE_REC_3D_RL( fn, fp, Nr, gwNm1, -j, myIter, myThid )
239 IF (j.LE.listDim) wrFldList(j) = 'GwNm1 '
240 ENDIF
241 #endif /* ALLOW_NONHYDROSTATIC */
242 #endif /* ALLOW_ADAMSBASHFORTH_3 */
243
244 C- write Full Pressure for EOS in pressure:
245 IF ( useDynP_inEos_Zc ) THEN
246 j = j + 1
247 CALL WRITE_REC_3D_RL( fn, fp, Nr,totPhiHyd,-j,myIter, myThid )
248 IF (j.LE.listDim) wrFldList(j) = 'PhiHyd '
249 ENDIF
250 #ifdef ALLOW_NONHYDROSTATIC
251 IF ( use3Dsolver ) THEN
252 j = j + 1
253 CALL WRITE_REC_3D_RL( fn, fp, Nr, phi_nh, -j, myIter, myThid )
254 IF (j.LE.listDim) wrFldList(j) = 'Phi_NHyd'
255 ENDIF
256 #endif /* ALLOW_NONHYDROSTATIC */
257 #ifdef ALLOW_ADDFLUID
258 C- write mass source/sink of fluid (but not needed if selectAddFluid=-1)
259 IF ( selectAddFluid.NE.0 ) THEN
260 j = j + 1
261 CALL WRITE_REC_3D_RL( fn, fp, Nr,addMass,-j,myIter, myThid )
262 IF (j.LE.listDim) wrFldList(j) = 'AddMass '
263 ENDIF
264 #endif /* ALLOW_ADDFLUID */
265
266 n3D = j
267 C--- Write 2-D fields, starting with Eta:
268 j = j + 1
269 nj = -( n3D*(Nr-1) + j )
270 CALL WRITE_REC_3D_RL( fn, fp, 1 , etaN, nj, myIter, myThid )
271 IF (j.LE.listDim) wrFldList(j) = 'EtaN '
272 #ifdef ALLOW_NONHYDROSTATIC
273 IF ( selectNHfreeSurf.GE.1 ) THEN
274 j = j + 1
275 nj = -( n3D*(Nr-1) + j )
276 CALL WRITE_REC_3D_RL( fn, fp, 1, dPhiNH, nj, myIter, myThid )
277 IF (j.LE.listDim) wrFldList(j) = 'dPhiNH '
278 ENDIF
279 #endif /* ALLOW_NONHYDROSTATIC */
280 #ifdef EXACT_CONSERV
281 c IF ( exactConserv ) THEN
282 j = j + 1
283 nj = -( n3D*(Nr-1) + j )
284 CALL WRITE_REC_3D_RL( fn, fp, 1, dEtaHdt, nj, myIter, myThid )
285 IF (j.LE.listDim) wrFldList(j) = 'dEtaHdt '
286 c ENDIF
287 C- note: always write dEtaHdt & EtaH but read only if exactConserv & nonlinFreeSurf
288 C this works only because nonlinFreeSurf > 0 => exactConserv=T
289 c IF ( nonlinFreeSurf.GT.0 ) THEN
290 j = j + 1
291 nj = -( n3D*(Nr-1) + j )
292 CALL WRITE_REC_3D_RL( fn, fp, 1, etaHnm1, nj, myIter, myThid )
293 IF (j.LE.listDim) wrFldList(j) = 'EtaH '
294 c ENDIF
295 #endif /* EXACT_CONSERV */
296 C--------------------------
297 nWrFlds = j
298 IF ( nWrFlds.GT.listDim ) THEN
299 WRITE(msgBuf,'(2A,I5,A)') 'WRITE_PICKUP: ',
300 & 'trying to write ',nWrFlds,' fields'
301 CALL PRINT_ERROR( msgBuf, myThid )
302 WRITE(msgBuf,'(2A,I5,A)') 'WRITE_PICKUP: ',
303 & 'field-list dimension (listDim=',listDim,') too small'
304 CALL PRINT_ERROR( msgBuf, myThid )
305 STOP 'ABNORMAL END: S/R WRITE_PICKUP (list-size Pb)'
306 ENDIF
307 #ifdef ALLOW_MDSIO
308 C- Note: temporary: since it is a pain to add more arguments to
309 C all MDSIO S/R, uses instead this specific S/R to write only
310 C meta files but with more informations in it.
311 nj = ABS(nj)
312 glf = globalFiles
313 timList(1) = myTime
314 CALL MDS_WR_METAFILES( fn, fp, glf, .FALSE.,
315 & 0, 0, 1, ' ',
316 & nWrFlds, wrFldList,
317 & 1, timList,
318 & nj, myIter, myThid )
319 #endif /* ALLOW_MDSIO */
320 C--------------------------
321 ENDIF
322
323 #ifdef ALLOW_MNC
324 IF (useMNC .AND. pickup_write_mnc) THEN
325 IF ( permPickup ) THEN
326 WRITE(fn,'(A)') 'pickup'
327 ELSE
328 WRITE(fn,'(A,A)') 'pickup.',checkPtSuff(nCheckLev)
329 ENDIF
330 C First ***define*** the file group name
331 CALL MNC_CW_SET_UDIM(fn, 0, myThid)
332 IF ( permPickup ) THEN
333 CALL MNC_CW_SET_CITER(fn, 3, 3, myIter, 0, myThid)
334 ELSE
335 CALL MNC_CW_SET_CITER(fn, 2, -1, -1, -1, myThid)
336 ENDIF
337 C Then set the actual unlimited dimension
338 CALL MNC_CW_SET_UDIM(fn, 1, myThid)
339 CALL MNC_CW_RL_W_S('D',fn,0,0,'T', myTime, myThid)
340 CALL MNC_CW_I_W_S('I',fn,0,0,'iter', myIter, myThid)
341 CALL MNC_CW_RL_W('D',fn,0,0,'U', uVel, myThid)
342 CALL MNC_CW_RL_W('D',fn,0,0,'V', vVel, myThid)
343 CALL MNC_CW_RL_W('D',fn,0,0,'Temp', theta, myThid)
344 CALL MNC_CW_RL_W('D',fn,0,0,'S', salt, myThid)
345 CALL MNC_CW_RL_W('D',fn,0,0,'Eta', etaN, myThid)
346 #ifndef ALLOW_ADAMSBASHFORTH_3
347 CALL MNC_CW_RL_W('D',fn,0,0,'gUnm1', guNm1, myThid)
348 CALL MNC_CW_RL_W('D',fn,0,0,'gVnm1', gvNm1, myThid)
349 CALL MNC_CW_RL_W('D',fn,0,0,'gTnm1', gtNm1, myThid)
350 CALL MNC_CW_RL_W('D',fn,0,0,'gSnm1', gsNm1, myThid)
351 #endif /* ALLOW_ADAMSBASHFORTH_3 */
352 #ifdef EXACT_CONSERV
353 CALL MNC_CW_RL_W('D',fn,0,0,'dEtaHdt', dEtaHdt, myThid)
354 CALL MNC_CW_RL_W('D',fn,0,0,'EtaH', etaHnm1, myThid)
355 #endif
356 #ifdef ALLOW_NONHYDROSTATIC
357 IF ( use3Dsolver ) THEN
358 CALL MNC_CW_RL_W('D',fn,0,0,'phi_nh', phi_nh, myThid)
359 c CALL MNC_CW_RL_W('D',fn,0,0,'gW', gW, myThid)
360 #ifndef ALLOW_ADAMSBASHFORTH_3
361 CALL MNC_CW_RL_W('D',fn,0,0,'gWnm1', gwNm1, myThid)
362 #endif
363 ENDIF
364 #endif
365 IF ( useDynP_inEos_Zc ) THEN
366 CALL MNC_CW_RL_W('D',fn,0,0,'phiHyd', totPhiHyd, myThid)
367 ENDIF
368 CALL MNC_FILE_CLOSE_ALL_MATCHING(fn, myThid)
369 ENDIF
370 #endif /* ALLOW_MNC */
371
372 C-- Every one else must wait until writing is done.
373 C this is done within IO routines => no longer needed
374 c _BARRIER
375
376 RETURN
377 END

  ViewVC Help
Powered by ViewVC 1.1.22