/[MITgcm]/MITgcm_contrib/llc_hires/llc_4320/code-async/write_pickup.F
ViewVC logotype

Annotation of /MITgcm_contrib/llc_hires/llc_4320/code-async/write_pickup.F

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


Revision 1.3 - (hide annotations) (download)
Thu Mar 6 02:45:05 2014 UTC (11 years, 5 months ago) by dimitri
Branch: MAIN
Changes since 1.2: +21 -1 lines
updating async-io to latest MITgcm trunk code

1 dimitri 1.3 C $Header: /u/gcmpack/MITgcm_contrib/llc_hires/llc_4320/code-async/write_pickup.F,v 1.2 2014/01/10 16:50:36 dimitri Exp $
2 dimitri 1.1 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_ADDFLUID
37     # include "FFIELDS.h"
38     #endif
39     #ifdef ALLOW_MNC
40     # include "MNC_PARAMS.h"
41     #endif
42 dimitri 1.3 #if defined(ALLOW_EDDYPSI) && defined(ALLOW_GMREDI)
43     # include "GMREDI.h"
44     #endif
45 dimitri 1.1
46     C !INPUT PARAMETERS:
47     C permPickup :: Is or is not a permanent pickup.
48     C myTime :: Current time of simulation ( s )
49     C myIter :: Iteration number
50     C myThid :: Thread number for this instance of the routine.
51     LOGICAL permPickup
52     _RL myTime
53     INTEGER myIter
54     INTEGER myThid
55     CEOP
56    
57     C !LOCAL VARIABLES:
58     C fp :: pickup-file precision
59     C glf :: local flag for "globalFiles"
60     C fn :: Temp. for building file name.
61     C nWrFlds :: number of fields being written
62     C n3D :: number of 3-D fields being written
63     C listDim :: dimension of "wrFldList" local array
64     C wrFldList :: list of written fields
65     C m1,m2 :: 6.th dim index (AB-3) corresponding to time-step N-1 & N-2
66     C j :: loop index / field number
67     C nj :: record number
68     C msgBuf :: Informational/error message buffer
69     INTEGER fp
70     LOGICAL glf
71     _RL timList(1)
72     CHARACTER*(MAX_LEN_FNAM) fn
73     INTEGER listDim, nWrFlds, n3D
74     PARAMETER( listDim = 20 )
75     CHARACTER*(8) wrFldList(listDim)
76     #ifdef ALLOW_ADAMSBASHFORTH_3
77     INTEGER m1, m2
78     #endif
79     INTEGER j, nj
80     CHARACTER*(MAX_LEN_MBUF) msgBuf
81     #ifndef ALLOW_GENERIC_ADVDIFF
82     LOGICAL AdamsBashforthGt
83     LOGICAL AdamsBashforthGs
84     LOGICAL AdamsBashforth_T
85     LOGICAL AdamsBashforth_S
86     PARAMETER ( AdamsBashforthGt = .FALSE. ,
87     & AdamsBashforthGs = .FALSE. ,
88     & AdamsBashforth_T = .FALSE. ,
89     & AdamsBashforth_S = .FALSE. )
90     #endif
91    
92    
93     chenze
94     COMMON /ICOUNTER_COMM/ ICOUNTER
95     INTEGER ICOUNTER
96     CHARACTER*(MAX_LEN_MBUF) suff
97     WRITE(suff,'(I10.10)') myIter
98     chenze
99    
100    
101     C- Initialise:
102     DO j=1,listDim
103     wrFldList(j) = ' '
104     ENDDO
105    
106     C Write model fields
107     DO j = 1,MAX_LEN_FNAM
108     fn(j:j) = ' '
109     ENDDO
110     IF ( permPickup ) THEN
111     WRITE(fn,'(A,I10.10)') 'pickup.',myIter
112     ELSE
113     WRITE(fn,'(A,A)') 'pickup.',checkPtSuff(nCheckLev)
114     ENDIF
115    
116     C Going to really do some IO. Make everyone except master thread wait.
117     C this is done within IO routines => no longer needed
118     c _BARRIER
119    
120    
121     chenze
122    
123     call timer_start('asyncio_pickup ',myThid)
124     ICOUNTER = ICOUNTER+1
125     CALL beginNewEpoch(icounter,myIter,1)
126     CALL ASYNCIO_WRITE_FLD_XYZ_RL( 'U.',suff,uVel,iCounter,myThid)
127     CALL ASYNCIO_WRITE_FLD_XYZ_RL( 'V.',suff,vVel,iCounter,myThid)
128     CALL ASYNCIO_WRITE_FLD_XYZ_RL( 'T.',suff,theta,iCounter,myThid)
129     CALL ASYNCIO_WRITE_FLD_XYZ_RL( 'S.',suff,salt,iCounter,myThid)
130     CALL ASYNCIO_WRITE_FLD_XYZ_RL( 'X.',suff,gunm1,iCounter,myThid)
131     CALL ASYNCIO_WRITE_FLD_XYZ_RL( 'Y.',suff,gvnm1,iCounter,myThid)
132     CALL ASYNCIO_WRITE_FLD_XY_RL( 'N.',suff,etan,iCounter,myThid)
133 dimitri 1.2 CALL ASYNCIO_WRITE_FLD_XY_RL( 'R.',suff,detahdt,iCounter,myThid)
134 dimitri 1.1 CALL ASYNCIO_WRITE_FLD_XY_RL( 'H.',suff,etahnm1,iCounter,myThid)
135     call timer_stop('asyncio_pickup ',myThid)
136    
137     return
138     chenze
139    
140    
141    
142     IF (pickup_write_mdsio) THEN
143    
144     fp = precFloat64
145     j = 0
146     C record number < 0 : a hack not to write meta files now:
147    
148     C--- write State 3-D fields for restart
149     j = j + 1
150     CALL WRITE_REC_3D_RL( fn, fp, Nr, uVel, -j, myIter, myThid )
151     IF (j.LE.listDim) wrFldList(j) = 'Uvel '
152     j = j + 1
153     CALL WRITE_REC_3D_RL( fn, fp, Nr, vVel, -j, myIter, myThid )
154     IF (j.LE.listDim) wrFldList(j) = 'Vvel '
155    
156 dimitri 1.3 #if defined(ALLOW_EDDYPSI) && defined(ALLOW_GMREDI)
157     IF (GM_InMomAsStress) THEN
158     j = j + 1
159     CALL WRITE_REC_3D_RL( fn, fp, Nr, uMean, -j, myIter, myThid)
160     IF (j.LE.listDim) wrFldList(j) = 'Umean '
161     j = j + 1
162     CALL WRITE_REC_3D_RL( fn, fp, Nr, vMean, -j, myIter, myThid)
163     IF (j.LE.listDim) wrFldList(j) = 'Vmean '
164     ENDIF
165     #endif
166    
167 dimitri 1.1 j = j + 1
168     CALL WRITE_REC_3D_RL( fn, fp, Nr, theta, -j, myIter, myThid )
169     IF (j.LE.listDim) wrFldList(j) = 'Theta '
170     j = j + 1
171     CALL WRITE_REC_3D_RL( fn, fp, Nr, salt, -j, myIter, myThid )
172     IF (j.LE.listDim) wrFldList(j) = 'Salt '
173     C--- write 3-D fields for AB-restart
174     #ifdef ALLOW_ADAMSBASHFORTH_3
175     m1 = 1 + MOD(myIter+1,2)
176     m2 = 1 + MOD( myIter ,2)
177     IF ( momStepping ) THEN
178     C-- U velocity:
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, guNm(1-OLx,1-OLy,1,1,1,m1),
182     & -j, myIter, myThid )
183     IF (j.LE.listDim) wrFldList(j) = 'GuNm1 '
184     ENDIF
185     IF ( beta_AB.NE.0. ) THEN
186     j = j + 1
187     CALL WRITE_REC_3D_RL( fn, fp, Nr, guNm(1-OLx,1-OLy,1,1,1,m2),
188     & -j, myIter, myThid )
189     IF (j.LE.listDim) wrFldList(j) = 'GuNm2 '
190     ENDIF
191     C-- V velocity:
192     IF ( alph_AB.NE.0. .OR. beta_AB.NE.0. ) THEN
193     j = j + 1
194     CALL WRITE_REC_3D_RL( fn, fp, Nr, gvNm(1-OLx,1-OLy,1,1,1,m1),
195     & -j, myIter, myThid )
196     IF (j.LE.listDim) wrFldList(j) = 'GvNm1 '
197     ENDIF
198     IF ( beta_AB.NE.0. ) THEN
199     j = j + 1
200     CALL WRITE_REC_3D_RL( fn, fp, Nr, gvNm(1-OLx,1-OLy,1,1,1,m2),
201     & -j, myIter, myThid )
202     IF (j.LE.listDim) wrFldList(j) = 'GvNm2 '
203     ENDIF
204     ENDIF
205     C-- Temperature:
206     IF ( AdamsBashforthGt.OR.AdamsBashforth_T ) THEN
207     IF ( alph_AB.NE.0. .OR. beta_AB.NE.0. ) THEN
208     j = j + 1
209     CALL WRITE_REC_3D_RL( fn, fp, Nr, gtNm(1-OLx,1-OLy,1,1,1,m1),
210     & -j, myIter, myThid )
211     IF (j.LE.listDim) THEN
212     IF ( AdamsBashforthGt ) wrFldList(j) = 'GtNm1 '
213     IF ( AdamsBashforth_T ) wrFldList(j) = 'TempNm1 '
214     ENDIF
215     ENDIF
216     IF ( beta_AB.NE.0. ) THEN
217     j = j + 1
218     CALL WRITE_REC_3D_RL( fn, fp, Nr, gtNm(1-OLx,1-OLy,1,1,1,m2),
219     & -j, myIter, myThid )
220     IF (j.LE.listDim) THEN
221     IF ( AdamsBashforthGt ) wrFldList(j) = 'GtNm2 '
222     IF ( AdamsBashforth_T ) wrFldList(j) = 'TempNm2 '
223     ENDIF
224     ENDIF
225     ENDIF
226     C-- Salinity:
227     IF ( AdamsBashforthGs.OR.AdamsBashforth_S ) THEN
228     IF ( alph_AB.NE.0. .OR. beta_AB.NE.0. ) THEN
229     j = j + 1
230     CALL WRITE_REC_3D_RL( fn, fp, Nr, gsNm(1-OLx,1-OLy,1,1,1,m1),
231     & -j, myIter, myThid )
232     IF (j.LE.listDim) THEN
233     IF ( AdamsBashforthGs ) wrFldList(j) = 'GsNm1 '
234     IF ( AdamsBashforth_S ) wrFldList(j) = 'SaltNm1 '
235     ENDIF
236     ENDIF
237     IF ( beta_AB.NE.0. ) THEN
238     j = j + 1
239     CALL WRITE_REC_3D_RL( fn, fp, Nr, gsNm(1-OLx,1-OLy,1,1,1,m2),
240     & -j, myIter, myThid )
241     IF (j.LE.listDim) THEN
242     IF ( AdamsBashforthGs ) wrFldList(j) = 'GsNm2 '
243     IF ( AdamsBashforth_S ) wrFldList(j) = 'SaltNm2 '
244     ENDIF
245     ENDIF
246     ENDIF
247     #ifdef ALLOW_NONHYDROSTATIC
248     C-- W velocity:
249     IF ( nonHydrostatic ) THEN
250     IF ( alph_AB.NE.0. .OR. beta_AB.NE.0. ) THEN
251     j = j + 1
252     CALL WRITE_REC_3D_RL( fn, fp, Nr, gwNm(1-OLx,1-OLy,1,1,1,m1),
253     & -j, myIter, myThid )
254     IF (j.LE.listDim) wrFldList(j) = 'GwNm1 '
255     ENDIF
256     IF ( beta_AB.NE.0. ) THEN
257     j = j + 1
258     CALL WRITE_REC_3D_RL( fn, fp, Nr, gwNm(1-OLx,1-OLy,1,1,1,m2),
259     & -j, myIter, myThid )
260     IF (j.LE.listDim) wrFldList(j) = 'GwNm2 '
261     ENDIF
262     ENDIF
263     #endif /* ALLOW_NONHYDROSTATIC */
264     #else /* ALLOW_ADAMSBASHFORTH_3 */
265     IF ( momStepping ) THEN
266     j = j + 1
267     CALL WRITE_REC_3D_RL( fn, fp, Nr, guNm1, -j, myIter, myThid )
268     IF (j.LE.listDim) wrFldList(j) = 'GuNm1 '
269     j = j + 1
270     CALL WRITE_REC_3D_RL( fn, fp, Nr, gvNm1, -j, myIter, myThid )
271     IF (j.LE.listDim) wrFldList(j) = 'GvNm1 '
272     ENDIF
273     IF ( AdamsBashforthGt ) THEN
274     j = j + 1
275     CALL WRITE_REC_3D_RL( fn, fp, Nr, gtNm1, -j, myIter, myThid )
276     IF (j.LE.listDim) wrFldList(j) = 'GtNm1 '
277     ENDIF
278     IF ( AdamsBashforthGs ) THEN
279     j = j + 1
280     CALL WRITE_REC_3D_RL( fn, fp, Nr, gsNm1, -j, myIter, myThid )
281     IF (j.LE.listDim) wrFldList(j) = 'GsNm1 '
282     ENDIF
283     #ifdef ALLOW_NONHYDROSTATIC
284     IF ( nonHydrostatic ) THEN
285     j = j + 1
286     CALL WRITE_REC_3D_RL( fn, fp, Nr, gwNm1, -j, myIter, myThid )
287     IF (j.LE.listDim) wrFldList(j) = 'GwNm1 '
288     ENDIF
289     #endif /* ALLOW_NONHYDROSTATIC */
290     #endif /* ALLOW_ADAMSBASHFORTH_3 */
291    
292     C- write Full Pressure for EOS in pressure:
293     IF ( useDynP_inEos_Zc ) THEN
294     j = j + 1
295     CALL WRITE_REC_3D_RL( fn, fp, Nr,totPhiHyd,-j,myIter, myThid )
296     IF (j.LE.listDim) wrFldList(j) = 'PhiHyd '
297     ENDIF
298     #ifdef ALLOW_NONHYDROSTATIC
299     IF ( use3Dsolver ) THEN
300     j = j + 1
301     CALL WRITE_REC_3D_RL( fn, fp, Nr, phi_nh, -j, myIter, myThid )
302     IF (j.LE.listDim) wrFldList(j) = 'Phi_NHyd'
303     ENDIF
304     #endif /* ALLOW_NONHYDROSTATIC */
305     #ifdef ALLOW_ADDFLUID
306     C- write mass source/sink of fluid (but not needed if selectAddFluid=-1)
307     IF ( selectAddFluid.NE.0 ) THEN
308     j = j + 1
309     CALL WRITE_REC_3D_RL( fn, fp, Nr,addMass,-j,myIter, myThid )
310     IF (j.LE.listDim) wrFldList(j) = 'AddMass '
311     ENDIF
312     #endif /* ALLOW_ADDFLUID */
313    
314     n3D = j
315     C--- Write 2-D fields, starting with Eta:
316     j = j + 1
317     nj = -( n3D*(Nr-1) + j )
318     CALL WRITE_REC_3D_RL( fn, fp, 1 , etaN, nj, myIter, myThid )
319     IF (j.LE.listDim) wrFldList(j) = 'EtaN '
320     #ifdef ALLOW_NONHYDROSTATIC
321     IF ( selectNHfreeSurf.GE.1 ) THEN
322     j = j + 1
323     nj = -( n3D*(Nr-1) + j )
324     CALL WRITE_REC_3D_RL( fn, fp, 1, dPhiNH, nj, myIter, myThid )
325     IF (j.LE.listDim) wrFldList(j) = 'dPhiNH '
326     ENDIF
327     #endif /* ALLOW_NONHYDROSTATIC */
328     #ifdef EXACT_CONSERV
329     c IF ( exactConserv ) THEN
330     j = j + 1
331     nj = -( n3D*(Nr-1) + j )
332     CALL WRITE_REC_3D_RL( fn, fp, 1, dEtaHdt, nj, myIter, myThid )
333     IF (j.LE.listDim) wrFldList(j) = 'dEtaHdt '
334     c ENDIF
335     C- note: always write dEtaHdt & EtaH but read only if exactConserv & nonlinFreeSurf
336     C this works only because nonlinFreeSurf > 0 => exactConserv=T
337     c IF ( nonlinFreeSurf.GT.0 ) THEN
338     j = j + 1
339     nj = -( n3D*(Nr-1) + j )
340     CALL WRITE_REC_3D_RL( fn, fp, 1, etaHnm1, nj, myIter, myThid )
341     IF (j.LE.listDim) wrFldList(j) = 'EtaH '
342     c ENDIF
343     #endif /* EXACT_CONSERV */
344     C--------------------------
345     nWrFlds = j
346     IF ( nWrFlds.GT.listDim ) THEN
347     WRITE(msgBuf,'(2A,I5,A)') 'WRITE_PICKUP: ',
348     & 'trying to write ',nWrFlds,' fields'
349     CALL PRINT_ERROR( msgBuf, myThid )
350     WRITE(msgBuf,'(2A,I5,A)') 'WRITE_PICKUP: ',
351     & 'field-list dimension (listDim=',listDim,') too small'
352     CALL PRINT_ERROR( msgBuf, myThid )
353     STOP 'ABNORMAL END: S/R WRITE_PICKUP (list-size Pb)'
354     ENDIF
355     #ifdef ALLOW_MDSIO
356     C- Note: temporary: since it is a pain to add more arguments to
357     C all MDSIO S/R, uses instead this specific S/R to write only
358     C meta files but with more informations in it.
359     nj = ABS(nj)
360     glf = globalFiles
361     timList(1) = myTime
362     CALL MDS_WR_METAFILES( fn, fp, glf, .FALSE.,
363     & 0, 0, 1, ' ',
364     & nWrFlds, wrFldList,
365     & 1, timList, oneRL,
366     & nj, myIter, myThid )
367     #endif /* ALLOW_MDSIO */
368     C--------------------------
369     ENDIF
370    
371     #ifdef ALLOW_MNC
372     IF (useMNC .AND. pickup_write_mnc) THEN
373     IF ( permPickup ) THEN
374     WRITE(fn,'(A)') 'pickup'
375     ELSE
376     WRITE(fn,'(A,A)') 'pickup.',checkPtSuff(nCheckLev)
377     ENDIF
378     C First ***define*** the file group name
379     CALL MNC_CW_SET_UDIM(fn, 0, myThid)
380     IF ( permPickup ) THEN
381     CALL MNC_CW_SET_CITER(fn, 3, 3, myIter, 0, myThid)
382     ELSE
383     CALL MNC_CW_SET_CITER(fn, 2, -1, -1, -1, myThid)
384     ENDIF
385     C Then set the actual unlimited dimension
386     CALL MNC_CW_SET_UDIM(fn, 1, myThid)
387     CALL MNC_CW_RL_W_S('D',fn,0,0,'T', myTime, myThid)
388     CALL MNC_CW_I_W_S('I',fn,0,0,'iter', myIter, myThid)
389     CALL MNC_CW_RL_W('D',fn,0,0,'U', uVel, myThid)
390     CALL MNC_CW_RL_W('D',fn,0,0,'V', vVel, myThid)
391 dimitri 1.3 #if defined(ALLOW_EDDYPSI) && defined(ALLOW_GMREDI)
392     IF (GM_InMomAsStress) THEN
393     CALL MNC_CW_RL_W('D',fn,0,0,'Umean', uMean, myThid)
394     CALL MNC_CW_RL_W('D',fn,0,0,'Vmean', vMean, myThid)
395     ENDIF
396     #endif
397 dimitri 1.1 CALL MNC_CW_RL_W('D',fn,0,0,'Temp', theta, myThid)
398     CALL MNC_CW_RL_W('D',fn,0,0,'S', salt, myThid)
399     CALL MNC_CW_RL_W('D',fn,0,0,'Eta', etaN, myThid)
400     #ifndef ALLOW_ADAMSBASHFORTH_3
401     CALL MNC_CW_RL_W('D',fn,0,0,'gUnm1', guNm1, myThid)
402     CALL MNC_CW_RL_W('D',fn,0,0,'gVnm1', gvNm1, myThid)
403     CALL MNC_CW_RL_W('D',fn,0,0,'gTnm1', gtNm1, myThid)
404     CALL MNC_CW_RL_W('D',fn,0,0,'gSnm1', gsNm1, myThid)
405     #endif /* ALLOW_ADAMSBASHFORTH_3 */
406     #ifdef EXACT_CONSERV
407     CALL MNC_CW_RL_W('D',fn,0,0,'dEtaHdt', dEtaHdt, myThid)
408     CALL MNC_CW_RL_W('D',fn,0,0,'EtaH', etaHnm1, myThid)
409     #endif
410     #ifdef ALLOW_NONHYDROSTATIC
411     IF ( use3Dsolver ) THEN
412     CALL MNC_CW_RL_W('D',fn,0,0,'phi_nh', phi_nh, myThid)
413     c CALL MNC_CW_RL_W('D',fn,0,0,'gW', gW, myThid)
414     #ifndef ALLOW_ADAMSBASHFORTH_3
415     CALL MNC_CW_RL_W('D',fn,0,0,'gWnm1', gwNm1, myThid)
416     #endif
417     ENDIF
418     #endif
419     IF ( useDynP_inEos_Zc ) THEN
420     CALL MNC_CW_RL_W('D',fn,0,0,'phiHyd', totPhiHyd, myThid)
421     ENDIF
422     CALL MNC_FILE_CLOSE_ALL_MATCHING(fn, myThid)
423     ENDIF
424     #endif /* ALLOW_MNC */
425    
426     C-- Every one else must wait until writing is done.
427     C this is done within IO routines => no longer needed
428     c _BARRIER
429    
430     RETURN
431     END

  ViewVC Help
Powered by ViewVC 1.1.22