/[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.10 - (show annotations) (download)
Tue Mar 16 00:08:27 2010 UTC (14 years, 2 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint63a, checkpoint63, checkpoint62g, checkpoint62f, checkpoint62e, checkpoint62d, checkpoint62k, checkpoint62j, checkpoint62i, checkpoint62h, checkpoint62o, checkpoint62n, checkpoint62m, checkpoint62l, checkpoint62s, checkpoint62r, checkpoint62q, checkpoint62p, checkpoint62w, checkpoint62v, checkpoint62u, checkpoint62t, checkpoint62z, checkpoint62y, checkpoint62x
Changes since 1.9: +2 -2 lines
avoid unbalanced quote (single or double) in commented line

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

  ViewVC Help
Powered by ViewVC 1.1.22