/[MITgcm]/MITgcm/pkg/mdsio/mdsio_write_field.F
ViewVC logotype

Annotation of /MITgcm/pkg/mdsio/mdsio_write_field.F

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


Revision 1.5 - (hide annotations) (download)
Tue Dec 30 00:13:35 2008 UTC (15 years, 6 months ago) by jahn
Branch: MAIN
CVS Tags: checkpoint61l, checkpoint61m, checkpoint61j, checkpoint61k, checkpoint61h, checkpoint61i
Changes since 1.4: +2 -10 lines
move buffers to common block to save some memory

1 jahn 1.5 C $Header: /u/gcmpack/MITgcm/pkg/mdsio/mdsio_write_field.F,v 1.4 2007/11/13 19:37:44 jmc Exp $
2 jmc 1.1 C $Name: $
3    
4     #include "MDSIO_OPTIONS.h"
5    
6     CBOP
7     C !ROUTINE: MDS_WRITE_FIELD
8     C !INTERFACE:
9     SUBROUTINE MDS_WRITE_FIELD(
10     I fName,
11     I filePrec,
12     I globalFile,
13     I useCurrentDir,
14     I arrType,
15 jmc 1.4 I kSize,kLo,kHi,
16 jmc 1.1 I arr,
17     I jrecord,
18     I myIter,
19     I myThid )
20    
21     C !DESCRIPTION:
22     C Arguments:
23     C
24     C fName (string) :: base name for file to write
25     C filePrec (integer) :: number of bits per word in file (32 or 64)
26     C globalFile (logical):: selects between writing a global or tiled file
27     C useCurrentDir(logic):: always write to the current directory (even if
28     C "mdsioLocalDir" is set)
29     C arrType (char(2)) :: declaration of "arr": either "RS" or "RL"
30 jmc 1.4 C kSize (integer) :: size of third dimension: normally either 1 or Nr
31     C kLo (integer) :: 1rst vertical level (of array "arr") to write
32     C kHi (integer) :: last vertical level (of array "arr") to write
33     C arr ( RS/RL ) :: array to write, arr(:,:,kSize,:,:)
34 jmc 1.1 C irecord (integer) :: record number to write
35     C myIter (integer) :: time step number
36     C myThid (integer) :: thread identifier
37     C
38     C MDS_WRITE_FIELD creates either a file of the form "fName.data" and
39 jmc 1.4 C "fName.meta" if the logical flag "globalFile" is set true. Otherwise
40     C it creates MDS tiled files of the form "fName.xxx.yyy.data" and
41     C "fName.xxx.yyy.meta". If jrecord > 0, a meta-file is created.
42 jmc 1.1 C Currently, the meta-files are not read because it is difficult
43 jmc 1.4 C to parse files in fortran. We should read meta information before
44     C adding records to an existing multi-record file.
45 jmc 1.1 C The precision of the file is decsribed by filePrec, set either
46 jmc 1.4 C to floatPrec32 or floatPrec64. The precision or declaration of
47     C the array argument must be consistently described by the char*(2)
48     C string arrType, either "RS" or "RL".
49     C (kSize,kLo,kHi) allows for both 2-D and 3-D arrays to be handled, with
50     C the option to only write a sub-set of consecutive vertical levels (from
51     C kLo to kHi); (kSize,kLo,kHi)=(1,1,1) implies a 2-D model field and
52     C (kSize,kLo,kHi)=(Nr,1,Nr) implies a 3-D model field.
53     C irecord=|jrecord| is the record number to be written and must be >= 1.
54     C NOTE: It is currently assumed that the highest record number in the file
55     C was the last record written. Nor is there a consistency check between the
56     C routine arguments and file, i.e., if you write record 2 after record 4
57     C the meta information will record the number of records to be 2. This,
58     C again, is because we have read the meta information. To be fixed.
59 jmc 1.1 C
60     C Created: 03/16/99 adcroft@mit.edu
61     C Changed: 01/06/02 menemenlis@jpl.nasa.gov
62     C added useSingleCpuIO hack
63     C changed: 1/23/04 afe@ocean.mit.edu
64     C added exch2 handling -- yes, the globalfile logic is nuts
65     CEOP
66    
67     C !USES:
68     IMPLICIT NONE
69     C Global variables / common blocks
70     #include "SIZE.h"
71     #include "EEPARAMS.h"
72     #include "EESUPPORT.h"
73     #include "PARAMS.h"
74     #ifdef ALLOW_EXCH2
75     #include "W2_EXCH2_TOPOLOGY.h"
76     #include "W2_EXCH2_PARAMS.h"
77     #endif /* ALLOW_EXCH2 */
78     #include "MDSIO_SCPU.h"
79    
80     C !INPUT PARAMETERS:
81     CHARACTER*(*) fName
82     INTEGER filePrec
83     LOGICAL globalFile
84     LOGICAL useCurrentDir
85     CHARACTER*(2) arrType
86 jmc 1.4 INTEGER kSize, kLo, kHi
87 jmc 1.1 cph(
88     cph Real arr(*)
89 jmc 1.4 _RL arr(1-oLx:sNx+oLx,1-oLy:sNy+oLy,kSize,nSx,nSy)
90 jmc 1.1 cph)
91     INTEGER jrecord
92     INTEGER myIter
93     INTEGER myThid
94     C !OUTPUT PARAMETERS:
95    
96     C !FUNCTIONS
97     INTEGER ILNBLNK
98     INTEGER MDS_RECLEN
99     LOGICAL MASTER_CPU_IO
100     EXTERNAL ILNBLNK
101     EXTERNAL MDS_RECLEN
102     EXTERNAL MASTER_CPU_IO
103    
104     C !LOCAL VARIABLES:
105     CHARACTER*(MAX_LEN_FNAM) dataFName,metaFName,pfName
106     CHARACTER*(MAX_LEN_MBUF) msgBuf
107     LOGICAL fileIsOpen
108     LOGICAL iAmDoingIO
109     LOGICAL writeMetaF
110     INTEGER irecord
111 jmc 1.4 INTEGER iG,jG,bi,bj,i,j,k,nNz
112     INTEGER irec,dUnit,IL,pIL
113 jmc 1.2 INTEGER dimList(3,3), nDims, map2gl(2)
114     INTEGER iGjLoc, jGjLoc
115 jahn 1.5 INTEGER length_of_rec
116 jmc 1.1 #if defined(ALLOW_EXCH2) && !defined(MISSING_TILE_IO)
117 jmc 1.2 INTEGER iG_IO,jG_IO,npe, loc_xGlobalLo, loc_yGlobalLo
118 jmc 1.1 #endif
119     Real*4 r4seg(sNx)
120     Real*8 r8seg(sNx)
121     #ifdef ALLOW_EXCH2
122 jmc 1.2 c INTEGER tGy,tGx,tNy,tNx,tN
123     INTEGER tGy,tGx, tNx,tN
124 jmc 1.1 #endif /* ALLOW_EXCH2 */
125     INTEGER tNy
126    
127     C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
128    
129 jmc 1.2 C- default:
130     iGjLoc = 0
131     jGjLoc = 1
132    
133 jmc 1.1 C Assume nothing
134     fileIsOpen = .FALSE.
135     IL = ILNBLNK( fName )
136     pIL = ILNBLNK( mdsioLocalDir )
137 jmc 1.4 nNz = 1 + kHi - kLo
138 jmc 1.1 irecord = ABS(jrecord)
139     writeMetaF = jrecord.GT.0
140    
141     C Only do I/O if I am the master thread (and mpi process 0 IF useSingleCpuIO):
142     iAmDoingIO = MASTER_CPU_IO(myThid)
143    
144     C Only do I/O if I am the master thread
145     IF ( iAmDoingIO ) THEN
146    
147     C Record number must be >= 1
148     IF (irecord .LT. 1) THEN
149     WRITE(msgBuf,'(A,I9.8)')
150     & ' MDS_WRITE_FIELD: argument irecord = ',irecord
151     CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
152     & SQUEEZE_RIGHT , myThid)
153     WRITE(msgBuf,'(A)')
154     & ' MDS_WRITE_FIELD: invalid value for irecord'
155     CALL PRINT_ERROR( msgBuf, myThid )
156     STOP 'ABNORMAL END: S/R MDS_WRITE_FIELD'
157     ENDIF
158 jmc 1.4 C check for valid sub-set of levels:
159     IF ( kLo.LT.1 .OR. kHi.GT.kSize ) THEN
160     WRITE(msgBuf,'(3(A,I6))')
161     & ' MDS_WRITE_FIELD: arguments kSize=', kSize,
162     & ' , kLo=', kLo, ' , kHi=', kHi
163     CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
164     & SQUEEZE_RIGHT , myThid)
165     WRITE(msgBuf,'(A)')
166     & ' MDS_WRITE_FIELD: invalid sub-set of levels'
167     CALL PRINT_ERROR( msgBuf, myThid )
168     STOP 'ABNORMAL END: S/R MDS_WRITE_FIELD'
169     ENDIF
170 jmc 1.1
171     C Assign special directory
172     IF ( useCurrentDir .OR. pIL.EQ.0 ) THEN
173     pfName = fName
174     ELSE
175     WRITE(pfName,'(2A)') mdsioLocalDir(1:pIL), fName(1:IL)
176     ENDIF
177     pIL=ILNBLNK( pfName )
178    
179     C Assign a free unit number as the I/O channel for this routine
180     CALL MDSFINDUNIT( dUnit, myThid )
181    
182     C- endif iAmDoingIO
183     ENDIF
184    
185     C If option globalFile is desired but does not work or if
186     C globalFile is too slow, then try using single-CPU I/O.
187     IF (useSingleCpuIO) THEN
188    
189     C Master thread of process 0, only, opens a global file
190     IF ( iAmDoingIO ) THEN
191     WRITE(dataFName,'(2a)') fName(1:IL),'.data'
192     length_of_rec=MDS_RECLEN(filePrec,x_size*y_size,myThid)
193     IF (irecord .EQ. 1) THEN
194     OPEN( dUnit, file=dataFName, status=_NEW_STATUS,
195     & access='direct', recl=length_of_rec )
196     ELSE
197     OPEN( dUnit, file=dataFName, status=_OLD_STATUS,
198     & access='direct', recl=length_of_rec )
199     ENDIF
200     ENDIF
201    
202     C Gather array and WRITE it to file, one vertical level at a time
203 jmc 1.4 DO k=kLo,kHi
204 jmc 1.1 C- copy from arr(level=k) to 2-D "local":
205     IF ( arrType.EQ.'RS' ) THEN
206 jmc 1.4 CALL MDS_PASStoRS(sharedLocalBuf,arr,k,kSize,.FALSE.,myThid)
207 jmc 1.1 ELSEIF ( arrType.EQ.'RL' ) THEN
208 jmc 1.4 CALL MDS_PASStoRL(sharedLocalBuf,arr,k,kSize,.FALSE.,myThid)
209 jmc 1.1 ELSE
210     WRITE(msgBuf,'(A)')
211     & ' MDS_WRITE_FIELD: illegal value for arrType'
212     CALL PRINT_ERROR( msgBuf, myThid )
213     STOP 'ABNORMAL END: S/R MDS_WRITE_FIELD'
214     ENDIF
215     CALL GATHER_2D( globalBuf, sharedLocalBuf, myThid )
216    
217     IF ( iAmDoingIO ) THEN
218 jmc 1.2 #if defined(ALLOW_EXCH2) && !defined(MISSING_TILE_IO)
219 jmc 1.1 IF (filePrec .EQ. precFloat32) THEN
220     DO J=1,y_size
221     DO I=1,x_size
222     xy_buffer_r4(I,J) = 0.0
223     ENDDO
224     ENDDO
225 jmc 1.2 ELSEIF (filePrec .EQ. precFloat64) THEN
226     DO J=1,y_size
227     DO I=1,x_size
228     xy_buffer_r8(I,J) = 0.0
229     ENDDO
230     ENDDO
231     ENDIF
232    
233     bj=1
234     DO npe=1,nPx*nPy
235     DO bi=1,nSx
236     #ifdef ALLOW_USE_MPI
237     loc_xGlobalLo = mpi_myXGlobalLo(npe)
238     loc_yGlobalLo = mpi_myYGlobalLo(npe)
239     #else /* ALLOW_USE_MPI */
240     loc_xGlobalLo = myXGlobalLo
241     loc_yGlobalLo = myYGlobalLo
242     #endif /* ALLOW_USE_MPI */
243     tN = W2_mpi_myTileList(npe,bi)
244     IF ( exch2_mydNx(tN) .GT. x_size ) THEN
245     C- face x-size larger than glob-size : fold it
246     iGjLoc = 0
247     jGjLoc = exch2_mydNx(tN) / x_size
248     ELSEIF ( exch2_tNy(tN) .GT. y_size ) THEN
249     C- tile y-size larger than glob-size : make a long line
250     iGjLoc = exch2_mydNx(tN)
251     jGjLoc = 0
252     ELSE
253     C- default (face fit into global-IO-array)
254     iGjLoc = 0
255     jGjLoc = 1
256     ENDIF
257    
258     IF (filePrec .EQ. precFloat32) THEN
259 jmc 1.1 DO J=1,sNy
260     DO I=1,sNx
261 jmc 1.2 iG = loc_xGlobalLo-1+(bi-1)*sNx+i
262     jG = loc_yGlobalLo-1+(bj-1)*sNy+j
263     iG_IO=exch2_txGlobalo(tN)+iGjLoc*(j-1)+i-1
264     jG_IO=exch2_tyGlobalo(tN)+jGjLoc*(j-1)
265 jmc 1.1 xy_buffer_r4(iG_IO,jG_IO) = globalBuf(iG,jG)
266     ENDDO
267     ENDDO
268 jmc 1.2 ELSEIF (filePrec .EQ. precFloat64) THEN
269     DO J=1,sNy
270     DO I=1,sNx
271     iG = loc_xGlobalLo-1+(bi-1)*sNx+i
272     jG = loc_yGlobalLo-1+(bj-1)*sNy+j
273     iG_IO=exch2_txGlobalo(tN)+iGjLoc*(j-1)+i-1
274     jG_IO=exch2_tyGlobalo(tN)+jGjLoc*(j-1)
275     xy_buffer_r8(iG_IO,jG_IO) = globalBuf(iG,jG)
276     ENDDO
277     ENDDO
278     ENDIF
279    
280     C-- end of npe & bi loops
281 jmc 1.1 ENDDO
282 jmc 1.2 ENDDO
283 jmc 1.1 #else /* defined(ALLOW_EXCH2) && !defined(MISSING_TILE_IO) */
284 jmc 1.2 IF (filePrec .EQ. precFloat32) THEN
285 jmc 1.1 DO J=1,Ny
286     DO I=1,Nx
287     xy_buffer_r4(I,J) = globalBuf(I,J)
288     ENDDO
289     ENDDO
290     ELSEIF (filePrec .EQ. precFloat64) THEN
291     DO J=1,Ny
292     DO I=1,Nx
293     xy_buffer_r8(I,J) = globalBuf(I,J)
294     ENDDO
295     ENDDO
296 jmc 1.2 ENDIF
297 jmc 1.1 #endif /* defined(ALLOW_EXCH2) && !defined(MISSING_TILE_IO) */
298 jmc 1.2
299 jmc 1.4 irec=k+1-kLo+nNz*(irecord-1)
300 jmc 1.2 IF (filePrec .EQ. precFloat32) THEN
301     #ifdef _BYTESWAPIO
302     CALL MDS_BYTESWAPR4( x_size*y_size, xy_buffer_r4 )
303     #endif
304     WRITE(dUnit,rec=irec) xy_buffer_r4
305     ELSEIF (filePrec .EQ. precFloat64) THEN
306 jmc 1.1 #ifdef _BYTESWAPIO
307     CALL MDS_BYTESWAPR8( x_size*y_size, xy_buffer_r8 )
308     #endif
309     WRITE(dUnit,rec=irec) xy_buffer_r8
310     ELSE
311     WRITE(msgBuf,'(A)')
312     & ' MDS_WRITE_FIELD: illegal value for filePrec'
313     CALL PRINT_ERROR( msgBuf, myThid )
314     STOP 'ABNORMAL END: S/R MDS_WRITE_FIELD'
315     ENDIF
316 jmc 1.2 C- end if iAmDoingIO
317 jmc 1.1 ENDIF
318 jmc 1.2 C- end of k loop
319 jmc 1.1 ENDDO
320    
321     C Close data-file
322     IF ( iAmDoingIO ) THEN
323     CLOSE( dUnit )
324     ENDIF
325    
326     C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
327     C--- else .NOT.useSingleCpuIO
328     ELSE
329    
330     C Only do I/O if I am the master thread
331     IF ( iAmDoingIO ) THEN
332    
333     C If we are writing to a global file then we open it here
334     IF (globalFile) THEN
335     WRITE(dataFName,'(2a)') fName(1:IL),'.data'
336     IF (irecord .EQ. 1) THEN
337     length_of_rec=MDS_RECLEN( filePrec, sNx, myThid )
338     OPEN( dUnit, file=dataFName, status=_NEW_STATUS,
339     & access='direct', recl=length_of_rec )
340     fileIsOpen=.TRUE.
341     ELSE
342     length_of_rec=MDS_RECLEN( filePrec, sNx, myThid )
343     OPEN( dUnit, file=dataFName, status=_OLD_STATUS,
344     & access='direct', recl=length_of_rec )
345     fileIsOpen=.TRUE.
346     ENDIF
347     ENDIF
348    
349     C Loop over all tiles
350     DO bj=1,nSy
351     DO bi=1,nSx
352     C If we are writing to a tiled MDS file then we open each one here
353     IF (.NOT. globalFile) THEN
354     iG=bi+(myXGlobalLo-1)/sNx ! Kludge until unstructered tiles
355     jG=bj+(myYGlobalLo-1)/sNy ! Kludge until unstructered tiles
356     WRITE(dataFName,'(2A,I3.3,A,I3.3,A)')
357     & pfName(1:pIL),'.',iG,'.',jG,'.data'
358     IF (irecord .EQ. 1) THEN
359     length_of_rec=MDS_RECLEN( filePrec, sNx, myThid )
360     OPEN( dUnit, file=dataFName, status=_NEW_STATUS,
361     & access='direct', recl=length_of_rec )
362     fileIsOpen=.TRUE.
363     ELSE
364     length_of_rec=MDS_RECLEN( filePrec, sNx, myThid )
365     OPEN( dUnit, file=dataFName, status=_OLD_STATUS,
366     & access='direct', recl=length_of_rec )
367     fileIsOpen=.TRUE.
368     ENDIF
369     ENDIF
370 jmc 1.2
371 jmc 1.1 IF (fileIsOpen) THEN
372     tNy = sNy
373     #ifdef ALLOW_EXCH2
374 jmc 1.2 tN = W2_myTileList(bi)
375     tGy = exch2_tyGlobalo(tN)
376     tGx = exch2_txGlobalo(tN)
377     tNy = exch2_tNy(tN)
378     tNx = exch2_tNx(tN)
379     IF ( exch2_mydNx(tN) .GT. x_size ) THEN
380     C- face x-size larger than glob-size : fold it
381     iGjLoc = 0
382     jGjLoc = exch2_mydNx(tN) / x_size
383     ELSEIF ( exch2_tNy(tN) .GT. y_size ) THEN
384     C- tile y-size larger than glob-size : make a long line
385     iGjLoc = exch2_mydNx(tN)
386     jGjLoc = 0
387     ELSE
388     C- default (face fit into global-IO-array)
389     iGjLoc = 0
390     jGjLoc = 1
391     ENDIF
392 jmc 1.1 #endif /* ALLOW_EXCH2 */
393     DO k=1,nNz
394     DO j=1,tNy
395     IF (globalFile) THEN
396     #ifdef ALLOW_EXCH2
397 jmc 1.2 irec = 1 + ( tGx-1 + (j-1)*iGjLoc )/tNx
398     & + ( tGy-1 + (j-1)*jGjLoc )*exch2_domain_nxt
399 jmc 1.4 & + ( k-kLo + (irecord-1)*nNz
400 jmc 1.2 & )*y_size*exch2_domain_nxt
401 jmc 1.1 #else /* ALLOW_EXCH2 */
402     iG = myXGlobalLo-1 + (bi-1)*sNx
403     jG = myYGlobalLo-1 + (bj-1)*sNy
404     irec= 1 + INT(iG/sNx) + nSx*nPx*(jG+j-1)
405 jmc 1.4 & + nSx*nPx*Ny*(k-kLo)
406 jmc 1.1 & + nSx*nPx*Ny*nNz*(irecord-1)
407     #endif /* ALLOW_EXCH2 */
408     ELSE
409 jmc 1.4 irec=j + sNy*(k-kLo) + sNy*nNz*(irecord-1)
410 jmc 1.1 ENDIF
411     IF (filePrec .EQ. precFloat32) THEN
412     IF (arrType .EQ. 'RS') THEN
413 jmc 1.4 CALL MDS_SEG4toRS( j,bi,bj,k,kSize, r4seg,.FALSE.,arr )
414 jmc 1.1 ELSEIF (arrType .EQ. 'RL') THEN
415 jmc 1.4 CALL MDS_SEG4toRL( j,bi,bj,k,kSize, r4seg,.FALSE.,arr )
416 jmc 1.1 ELSE
417     WRITE(msgBuf,'(A)')
418     & ' MDS_WRITE_FIELD: illegal value for arrType'
419     CALL PRINT_ERROR( msgBuf, myThid )
420     STOP 'ABNORMAL END: S/R MDS_WRITE_FIELD'
421     ENDIF
422     #ifdef _BYTESWAPIO
423     CALL MDS_BYTESWAPR4( sNx, r4seg )
424     #endif
425     WRITE(dUnit,rec=irec) r4seg
426     ELSEIF (filePrec .EQ. precFloat64) THEN
427     IF (arrType .EQ. 'RS') THEN
428 jmc 1.4 CALL MDS_SEG8toRS( j,bi,bj,k,kSize, r8seg,.FALSE.,arr )
429 jmc 1.1 ELSEIF (arrType .EQ. 'RL') THEN
430 jmc 1.4 CALL MDS_SEG8toRL( j,bi,bj,k,kSize, r8seg,.FALSE.,arr )
431 jmc 1.1 ELSE
432     WRITE(msgBuf,'(A)')
433     & ' MDS_WRITE_FIELD: illegal value for arrType'
434     CALL PRINT_ERROR( msgBuf, myThid )
435     STOP 'ABNORMAL END: S/R MDS_WRITE_FIELD'
436     ENDIF
437     #ifdef _BYTESWAPIO
438     CALL MDS_BYTESWAPR8( sNx, r8seg )
439     #endif
440     WRITE(dUnit,rec=irec) r8seg
441     ELSE
442     WRITE(msgBuf,'(A)')
443     & ' MDS_WRITE_FIELD: illegal value for filePrec'
444     CALL PRINT_ERROR( msgBuf, myThid )
445     STOP 'ABNORMAL END: S/R MDS_WRITE_FIELD'
446     ENDIF
447     C End of j loop
448     ENDDO
449     C End of k loop
450     ENDDO
451     ELSE
452     C fileIsOpen=F
453     WRITE(msgBuf,'(A)')
454     & ' MDS_WRITE_FIELD: I should never get to this point'
455     CALL PRINT_ERROR( msgBuf, myThid )
456     STOP 'ABNORMAL END: S/R MDS_WRITE_FIELD'
457     ENDIF
458     C If we were writing to a tiled MDS file then we close it here
459     IF (fileIsOpen .AND. (.NOT. globalFile)) THEN
460     CLOSE( dUnit )
461     fileIsOpen = .FALSE.
462     ENDIF
463     C Create meta-file for each tile if we are tiling
464     IF ( .NOT.globalFile .AND. writeMetaF ) THEN
465     iG=bi+(myXGlobalLo-1)/sNx
466     jG=bj+(myYGlobalLo-1)/sNy
467     WRITE(metaFname,'(2A,I3.3,A,I3.3,A)')
468     & pfName(1:pIL),'.',iG,'.',jG,'.meta'
469     #if defined(ALLOW_EXCH2) && !defined(MISSING_TILE_IO)
470 jmc 1.2 tN = W2_myTileList(bi)
471 jmc 1.1 dimList(1,1)=x_size
472 jmc 1.2 dimList(2,1)=exch2_txGlobalo(tN)
473     dimList(3,1)=exch2_txGlobalo(tN)+sNx-1
474 jmc 1.1 dimList(1,2)=y_size
475 jmc 1.2 dimList(2,2)=exch2_tyGlobalo(tN)
476     dimList(3,2)=exch2_tyGlobalo(tN)+sNy-1
477 jmc 1.1 #else /* defined(ALLOW_EXCH2) && !defined(MISSING_TILE_IO) */
478     C- jmc: if MISSING_TILE_IO, keep meta files unchanged
479     C to stay consistent with global file structure
480     dimList(1,1)=Nx
481     dimList(2,1)=myXGlobalLo+(bi-1)*sNx
482     dimList(3,1)=myXGlobalLo+bi*sNx-1
483     dimList(1,2)=Ny
484     dimList(2,2)=myYGlobalLo+(bj-1)*sNy
485     dimList(3,2)=myYGlobalLo+bj*sNy-1
486     #endif /* defined(ALLOW_EXCH2) && !defined(MISSING_TILE_IO) */
487     dimList(1,3)=nNz
488     dimList(2,3)=1
489     dimList(3,3)=nNz
490     nDims=3
491     IF ( nNz.EQ.1 ) nDims=2
492 jmc 1.2 map2gl(1) = iGjLoc
493     map2gl(2) = jGjLoc
494 jmc 1.1 CALL MDS_WRITE_META(
495     I metaFName, dataFName, the_run_name, ' ',
496 jmc 1.2 I filePrec, nDims,dimList,map2gl, 0, ' ',
497 jmc 1.1 I 0, UNSET_RL, irecord, myIter, myThid )
498     ENDIF
499     C End of bi,bj loops
500     ENDDO
501     ENDDO
502    
503     C If global file was opened then close it
504     IF (fileIsOpen .AND. globalFile) THEN
505     CLOSE( dUnit )
506     fileIsOpen = .FALSE.
507     ENDIF
508    
509     C- endif iAmDoingIO
510     ENDIF
511    
512     C if useSingleCpuIO / else / end
513     ENDIF
514    
515     C Create meta-file for the global-file (also if useSingleCpuIO)
516     IF ( writeMetaF .AND. iAmDoingIO .AND.
517     & (globalFile .OR. useSingleCpuIO) ) THEN
518     WRITE(metaFName,'(2A)') fName(1:IL),'.meta'
519     dimList(1,1)=x_size
520     dimList(2,1)=1
521     dimList(3,1)=x_size
522     dimList(1,2)=y_size
523     dimList(2,2)=1
524     dimList(3,2)=y_size
525     dimList(1,3)=nNz
526     dimList(2,3)=1
527     dimList(3,3)=nNz
528 jmc 1.2 nDims=3
529     IF ( nNz.EQ.1 ) nDims=2
530 jmc 1.3 map2gl(1) = 0
531     map2gl(2) = 1
532 jmc 1.1 CALL MDS_WRITE_META(
533     I metaFName, dataFName, the_run_name, ' ',
534 jmc 1.2 I filePrec, nDims,dimList,map2gl, 0, ' ',
535 jmc 1.1 I 0, UNSET_RL, irecord, myIter, myThid )
536     c I metaFName, dataFName, the_run_name, titleLine,
537 jmc 1.2 c I filePrec, nDims, dimList, map2gl, nFlds, fldList,
538 jmc 1.1 c I nTimRec, timList, irecord, myIter, myThid )
539     ENDIF
540    
541     C To be safe, make other processes wait for I/O completion
542     _BARRIER
543    
544     C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
545     RETURN
546     END

  ViewVC Help
Powered by ViewVC 1.1.22