/[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.4 - (hide annotations) (download)
Tue Nov 13 19:37:44 2007 UTC (17 years, 7 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint60, checkpoint61, checkpoint59q, checkpoint59p, checkpoint59r, checkpoint59m, checkpoint59l, checkpoint59o, checkpoint59n, checkpoint59k, checkpoint61f, checkpoint61g, checkpoint61d, checkpoint61e, checkpoint61b, checkpoint61c, checkpoint61a
Changes since 1.3: +52 -35 lines
add arguments to S/R MDS_READ_FIELD and MDS_WRITE_FIELD.

1 jmc 1.4 C $Header: /u/gcmpack/MITgcm/pkg/mdsio/mdsio_write_field.F,v 1.3 2007/03/21 01:57:55 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 jmc 1.1 INTEGER x_size,y_size,length_of_rec
116     #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 PARAMETER ( x_size = exch2_domain_nxt * sNx )
119     PARAMETER ( y_size = exch2_domain_nyt * sNy )
120     #else
121     PARAMETER ( x_size = Nx )
122     PARAMETER ( y_size = Ny )
123     #endif
124     Real*4 r4seg(sNx)
125     Real*8 r8seg(sNx)
126     Real*4 xy_buffer_r4(x_size,y_size)
127     Real*8 xy_buffer_r8(x_size,y_size)
128     Real*8 globalBuf(Nx,Ny)
129     #ifdef ALLOW_EXCH2
130 jmc 1.2 c INTEGER tGy,tGx,tNy,tNx,tN
131     INTEGER tGy,tGx, tNx,tN
132 jmc 1.1 #endif /* ALLOW_EXCH2 */
133     INTEGER tNy
134    
135     C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
136    
137 jmc 1.2 C- default:
138     iGjLoc = 0
139     jGjLoc = 1
140    
141 jmc 1.1 C Assume nothing
142     fileIsOpen = .FALSE.
143     IL = ILNBLNK( fName )
144     pIL = ILNBLNK( mdsioLocalDir )
145 jmc 1.4 nNz = 1 + kHi - kLo
146 jmc 1.1 irecord = ABS(jrecord)
147     writeMetaF = jrecord.GT.0
148    
149     C Only do I/O if I am the master thread (and mpi process 0 IF useSingleCpuIO):
150     iAmDoingIO = MASTER_CPU_IO(myThid)
151    
152     C Only do I/O if I am the master thread
153     IF ( iAmDoingIO ) THEN
154    
155     C Record number must be >= 1
156     IF (irecord .LT. 1) THEN
157     WRITE(msgBuf,'(A,I9.8)')
158     & ' MDS_WRITE_FIELD: argument irecord = ',irecord
159     CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
160     & SQUEEZE_RIGHT , myThid)
161     WRITE(msgBuf,'(A)')
162     & ' MDS_WRITE_FIELD: invalid value for irecord'
163     CALL PRINT_ERROR( msgBuf, myThid )
164     STOP 'ABNORMAL END: S/R MDS_WRITE_FIELD'
165     ENDIF
166 jmc 1.4 C check for valid sub-set of levels:
167     IF ( kLo.LT.1 .OR. kHi.GT.kSize ) THEN
168     WRITE(msgBuf,'(3(A,I6))')
169     & ' MDS_WRITE_FIELD: arguments kSize=', kSize,
170     & ' , kLo=', kLo, ' , kHi=', kHi
171     CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
172     & SQUEEZE_RIGHT , myThid)
173     WRITE(msgBuf,'(A)')
174     & ' MDS_WRITE_FIELD: invalid sub-set of levels'
175     CALL PRINT_ERROR( msgBuf, myThid )
176     STOP 'ABNORMAL END: S/R MDS_WRITE_FIELD'
177     ENDIF
178 jmc 1.1
179     C Assign special directory
180     IF ( useCurrentDir .OR. pIL.EQ.0 ) THEN
181     pfName = fName
182     ELSE
183     WRITE(pfName,'(2A)') mdsioLocalDir(1:pIL), fName(1:IL)
184     ENDIF
185     pIL=ILNBLNK( pfName )
186    
187     C Assign a free unit number as the I/O channel for this routine
188     CALL MDSFINDUNIT( dUnit, myThid )
189    
190     C- endif iAmDoingIO
191     ENDIF
192    
193     C If option globalFile is desired but does not work or if
194     C globalFile is too slow, then try using single-CPU I/O.
195     IF (useSingleCpuIO) THEN
196    
197     C Master thread of process 0, only, opens a global file
198     IF ( iAmDoingIO ) THEN
199     WRITE(dataFName,'(2a)') fName(1:IL),'.data'
200     length_of_rec=MDS_RECLEN(filePrec,x_size*y_size,myThid)
201     IF (irecord .EQ. 1) THEN
202     OPEN( dUnit, file=dataFName, status=_NEW_STATUS,
203     & access='direct', recl=length_of_rec )
204     ELSE
205     OPEN( dUnit, file=dataFName, status=_OLD_STATUS,
206     & access='direct', recl=length_of_rec )
207     ENDIF
208     ENDIF
209    
210     C Gather array and WRITE it to file, one vertical level at a time
211 jmc 1.4 DO k=kLo,kHi
212 jmc 1.1 C- copy from arr(level=k) to 2-D "local":
213     IF ( arrType.EQ.'RS' ) THEN
214 jmc 1.4 CALL MDS_PASStoRS(sharedLocalBuf,arr,k,kSize,.FALSE.,myThid)
215 jmc 1.1 ELSEIF ( arrType.EQ.'RL' ) THEN
216 jmc 1.4 CALL MDS_PASStoRL(sharedLocalBuf,arr,k,kSize,.FALSE.,myThid)
217 jmc 1.1 ELSE
218     WRITE(msgBuf,'(A)')
219     & ' MDS_WRITE_FIELD: illegal value for arrType'
220     CALL PRINT_ERROR( msgBuf, myThid )
221     STOP 'ABNORMAL END: S/R MDS_WRITE_FIELD'
222     ENDIF
223     CALL GATHER_2D( globalBuf, sharedLocalBuf, myThid )
224    
225     IF ( iAmDoingIO ) THEN
226 jmc 1.2 #if defined(ALLOW_EXCH2) && !defined(MISSING_TILE_IO)
227 jmc 1.1 IF (filePrec .EQ. precFloat32) THEN
228     DO J=1,y_size
229     DO I=1,x_size
230     xy_buffer_r4(I,J) = 0.0
231     ENDDO
232     ENDDO
233 jmc 1.2 ELSEIF (filePrec .EQ. precFloat64) THEN
234     DO J=1,y_size
235     DO I=1,x_size
236     xy_buffer_r8(I,J) = 0.0
237     ENDDO
238     ENDDO
239     ENDIF
240    
241     bj=1
242     DO npe=1,nPx*nPy
243     DO bi=1,nSx
244     #ifdef ALLOW_USE_MPI
245     loc_xGlobalLo = mpi_myXGlobalLo(npe)
246     loc_yGlobalLo = mpi_myYGlobalLo(npe)
247     #else /* ALLOW_USE_MPI */
248     loc_xGlobalLo = myXGlobalLo
249     loc_yGlobalLo = myYGlobalLo
250     #endif /* ALLOW_USE_MPI */
251     tN = W2_mpi_myTileList(npe,bi)
252     IF ( exch2_mydNx(tN) .GT. x_size ) THEN
253     C- face x-size larger than glob-size : fold it
254     iGjLoc = 0
255     jGjLoc = exch2_mydNx(tN) / x_size
256     ELSEIF ( exch2_tNy(tN) .GT. y_size ) THEN
257     C- tile y-size larger than glob-size : make a long line
258     iGjLoc = exch2_mydNx(tN)
259     jGjLoc = 0
260     ELSE
261     C- default (face fit into global-IO-array)
262     iGjLoc = 0
263     jGjLoc = 1
264     ENDIF
265    
266     IF (filePrec .EQ. precFloat32) THEN
267 jmc 1.1 DO J=1,sNy
268     DO I=1,sNx
269 jmc 1.2 iG = loc_xGlobalLo-1+(bi-1)*sNx+i
270     jG = loc_yGlobalLo-1+(bj-1)*sNy+j
271     iG_IO=exch2_txGlobalo(tN)+iGjLoc*(j-1)+i-1
272     jG_IO=exch2_tyGlobalo(tN)+jGjLoc*(j-1)
273 jmc 1.1 xy_buffer_r4(iG_IO,jG_IO) = globalBuf(iG,jG)
274     ENDDO
275     ENDDO
276 jmc 1.2 ELSEIF (filePrec .EQ. precFloat64) THEN
277     DO J=1,sNy
278     DO I=1,sNx
279     iG = loc_xGlobalLo-1+(bi-1)*sNx+i
280     jG = loc_yGlobalLo-1+(bj-1)*sNy+j
281     iG_IO=exch2_txGlobalo(tN)+iGjLoc*(j-1)+i-1
282     jG_IO=exch2_tyGlobalo(tN)+jGjLoc*(j-1)
283     xy_buffer_r8(iG_IO,jG_IO) = globalBuf(iG,jG)
284     ENDDO
285     ENDDO
286     ENDIF
287    
288     C-- end of npe & bi loops
289 jmc 1.1 ENDDO
290 jmc 1.2 ENDDO
291 jmc 1.1 #else /* defined(ALLOW_EXCH2) && !defined(MISSING_TILE_IO) */
292 jmc 1.2 IF (filePrec .EQ. precFloat32) THEN
293 jmc 1.1 DO J=1,Ny
294     DO I=1,Nx
295     xy_buffer_r4(I,J) = globalBuf(I,J)
296     ENDDO
297     ENDDO
298     ELSEIF (filePrec .EQ. precFloat64) THEN
299     DO J=1,Ny
300     DO I=1,Nx
301     xy_buffer_r8(I,J) = globalBuf(I,J)
302     ENDDO
303     ENDDO
304 jmc 1.2 ENDIF
305 jmc 1.1 #endif /* defined(ALLOW_EXCH2) && !defined(MISSING_TILE_IO) */
306 jmc 1.2
307 jmc 1.4 irec=k+1-kLo+nNz*(irecord-1)
308 jmc 1.2 IF (filePrec .EQ. precFloat32) THEN
309     #ifdef _BYTESWAPIO
310     CALL MDS_BYTESWAPR4( x_size*y_size, xy_buffer_r4 )
311     #endif
312     WRITE(dUnit,rec=irec) xy_buffer_r4
313     ELSEIF (filePrec .EQ. precFloat64) THEN
314 jmc 1.1 #ifdef _BYTESWAPIO
315     CALL MDS_BYTESWAPR8( x_size*y_size, xy_buffer_r8 )
316     #endif
317     WRITE(dUnit,rec=irec) xy_buffer_r8
318     ELSE
319     WRITE(msgBuf,'(A)')
320     & ' MDS_WRITE_FIELD: illegal value for filePrec'
321     CALL PRINT_ERROR( msgBuf, myThid )
322     STOP 'ABNORMAL END: S/R MDS_WRITE_FIELD'
323     ENDIF
324 jmc 1.2 C- end if iAmDoingIO
325 jmc 1.1 ENDIF
326 jmc 1.2 C- end of k loop
327 jmc 1.1 ENDDO
328    
329     C Close data-file
330     IF ( iAmDoingIO ) THEN
331     CLOSE( dUnit )
332     ENDIF
333    
334     C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
335     C--- else .NOT.useSingleCpuIO
336     ELSE
337    
338     C Only do I/O if I am the master thread
339     IF ( iAmDoingIO ) THEN
340    
341     C If we are writing to a global file then we open it here
342     IF (globalFile) THEN
343     WRITE(dataFName,'(2a)') fName(1:IL),'.data'
344     IF (irecord .EQ. 1) THEN
345     length_of_rec=MDS_RECLEN( filePrec, sNx, myThid )
346     OPEN( dUnit, file=dataFName, status=_NEW_STATUS,
347     & access='direct', recl=length_of_rec )
348     fileIsOpen=.TRUE.
349     ELSE
350     length_of_rec=MDS_RECLEN( filePrec, sNx, myThid )
351     OPEN( dUnit, file=dataFName, status=_OLD_STATUS,
352     & access='direct', recl=length_of_rec )
353     fileIsOpen=.TRUE.
354     ENDIF
355     ENDIF
356    
357     C Loop over all tiles
358     DO bj=1,nSy
359     DO bi=1,nSx
360     C If we are writing to a tiled MDS file then we open each one here
361     IF (.NOT. globalFile) THEN
362     iG=bi+(myXGlobalLo-1)/sNx ! Kludge until unstructered tiles
363     jG=bj+(myYGlobalLo-1)/sNy ! Kludge until unstructered tiles
364     WRITE(dataFName,'(2A,I3.3,A,I3.3,A)')
365     & pfName(1:pIL),'.',iG,'.',jG,'.data'
366     IF (irecord .EQ. 1) THEN
367     length_of_rec=MDS_RECLEN( filePrec, sNx, myThid )
368     OPEN( dUnit, file=dataFName, status=_NEW_STATUS,
369     & access='direct', recl=length_of_rec )
370     fileIsOpen=.TRUE.
371     ELSE
372     length_of_rec=MDS_RECLEN( filePrec, sNx, myThid )
373     OPEN( dUnit, file=dataFName, status=_OLD_STATUS,
374     & access='direct', recl=length_of_rec )
375     fileIsOpen=.TRUE.
376     ENDIF
377     ENDIF
378 jmc 1.2
379 jmc 1.1 IF (fileIsOpen) THEN
380     tNy = sNy
381     #ifdef ALLOW_EXCH2
382 jmc 1.2 tN = W2_myTileList(bi)
383     tGy = exch2_tyGlobalo(tN)
384     tGx = exch2_txGlobalo(tN)
385     tNy = exch2_tNy(tN)
386     tNx = exch2_tNx(tN)
387     IF ( exch2_mydNx(tN) .GT. x_size ) THEN
388     C- face x-size larger than glob-size : fold it
389     iGjLoc = 0
390     jGjLoc = exch2_mydNx(tN) / x_size
391     ELSEIF ( exch2_tNy(tN) .GT. y_size ) THEN
392     C- tile y-size larger than glob-size : make a long line
393     iGjLoc = exch2_mydNx(tN)
394     jGjLoc = 0
395     ELSE
396     C- default (face fit into global-IO-array)
397     iGjLoc = 0
398     jGjLoc = 1
399     ENDIF
400 jmc 1.1 #endif /* ALLOW_EXCH2 */
401     DO k=1,nNz
402     DO j=1,tNy
403     IF (globalFile) THEN
404     #ifdef ALLOW_EXCH2
405 jmc 1.2 irec = 1 + ( tGx-1 + (j-1)*iGjLoc )/tNx
406     & + ( tGy-1 + (j-1)*jGjLoc )*exch2_domain_nxt
407 jmc 1.4 & + ( k-kLo + (irecord-1)*nNz
408 jmc 1.2 & )*y_size*exch2_domain_nxt
409 jmc 1.1 #else /* ALLOW_EXCH2 */
410     iG = myXGlobalLo-1 + (bi-1)*sNx
411     jG = myYGlobalLo-1 + (bj-1)*sNy
412     irec= 1 + INT(iG/sNx) + nSx*nPx*(jG+j-1)
413 jmc 1.4 & + nSx*nPx*Ny*(k-kLo)
414 jmc 1.1 & + nSx*nPx*Ny*nNz*(irecord-1)
415     #endif /* ALLOW_EXCH2 */
416     ELSE
417 jmc 1.4 irec=j + sNy*(k-kLo) + sNy*nNz*(irecord-1)
418 jmc 1.1 ENDIF
419     IF (filePrec .EQ. precFloat32) THEN
420     IF (arrType .EQ. 'RS') THEN
421 jmc 1.4 CALL MDS_SEG4toRS( j,bi,bj,k,kSize, r4seg,.FALSE.,arr )
422 jmc 1.1 ELSEIF (arrType .EQ. 'RL') THEN
423 jmc 1.4 CALL MDS_SEG4toRL( j,bi,bj,k,kSize, r4seg,.FALSE.,arr )
424 jmc 1.1 ELSE
425     WRITE(msgBuf,'(A)')
426     & ' MDS_WRITE_FIELD: illegal value for arrType'
427     CALL PRINT_ERROR( msgBuf, myThid )
428     STOP 'ABNORMAL END: S/R MDS_WRITE_FIELD'
429     ENDIF
430     #ifdef _BYTESWAPIO
431     CALL MDS_BYTESWAPR4( sNx, r4seg )
432     #endif
433     WRITE(dUnit,rec=irec) r4seg
434     ELSEIF (filePrec .EQ. precFloat64) THEN
435     IF (arrType .EQ. 'RS') THEN
436 jmc 1.4 CALL MDS_SEG8toRS( j,bi,bj,k,kSize, r8seg,.FALSE.,arr )
437 jmc 1.1 ELSEIF (arrType .EQ. 'RL') THEN
438 jmc 1.4 CALL MDS_SEG8toRL( j,bi,bj,k,kSize, r8seg,.FALSE.,arr )
439 jmc 1.1 ELSE
440     WRITE(msgBuf,'(A)')
441     & ' MDS_WRITE_FIELD: illegal value for arrType'
442     CALL PRINT_ERROR( msgBuf, myThid )
443     STOP 'ABNORMAL END: S/R MDS_WRITE_FIELD'
444     ENDIF
445     #ifdef _BYTESWAPIO
446     CALL MDS_BYTESWAPR8( sNx, r8seg )
447     #endif
448     WRITE(dUnit,rec=irec) r8seg
449     ELSE
450     WRITE(msgBuf,'(A)')
451     & ' MDS_WRITE_FIELD: illegal value for filePrec'
452     CALL PRINT_ERROR( msgBuf, myThid )
453     STOP 'ABNORMAL END: S/R MDS_WRITE_FIELD'
454     ENDIF
455     C End of j loop
456     ENDDO
457     C End of k loop
458     ENDDO
459     ELSE
460     C fileIsOpen=F
461     WRITE(msgBuf,'(A)')
462     & ' MDS_WRITE_FIELD: I should never get to this point'
463     CALL PRINT_ERROR( msgBuf, myThid )
464     STOP 'ABNORMAL END: S/R MDS_WRITE_FIELD'
465     ENDIF
466     C If we were writing to a tiled MDS file then we close it here
467     IF (fileIsOpen .AND. (.NOT. globalFile)) THEN
468     CLOSE( dUnit )
469     fileIsOpen = .FALSE.
470     ENDIF
471     C Create meta-file for each tile if we are tiling
472     IF ( .NOT.globalFile .AND. writeMetaF ) THEN
473     iG=bi+(myXGlobalLo-1)/sNx
474     jG=bj+(myYGlobalLo-1)/sNy
475     WRITE(metaFname,'(2A,I3.3,A,I3.3,A)')
476     & pfName(1:pIL),'.',iG,'.',jG,'.meta'
477     #if defined(ALLOW_EXCH2) && !defined(MISSING_TILE_IO)
478 jmc 1.2 tN = W2_myTileList(bi)
479 jmc 1.1 dimList(1,1)=x_size
480 jmc 1.2 dimList(2,1)=exch2_txGlobalo(tN)
481     dimList(3,1)=exch2_txGlobalo(tN)+sNx-1
482 jmc 1.1 dimList(1,2)=y_size
483 jmc 1.2 dimList(2,2)=exch2_tyGlobalo(tN)
484     dimList(3,2)=exch2_tyGlobalo(tN)+sNy-1
485 jmc 1.1 #else /* defined(ALLOW_EXCH2) && !defined(MISSING_TILE_IO) */
486     C- jmc: if MISSING_TILE_IO, keep meta files unchanged
487     C to stay consistent with global file structure
488     dimList(1,1)=Nx
489     dimList(2,1)=myXGlobalLo+(bi-1)*sNx
490     dimList(3,1)=myXGlobalLo+bi*sNx-1
491     dimList(1,2)=Ny
492     dimList(2,2)=myYGlobalLo+(bj-1)*sNy
493     dimList(3,2)=myYGlobalLo+bj*sNy-1
494     #endif /* defined(ALLOW_EXCH2) && !defined(MISSING_TILE_IO) */
495     dimList(1,3)=nNz
496     dimList(2,3)=1
497     dimList(3,3)=nNz
498     nDims=3
499     IF ( nNz.EQ.1 ) nDims=2
500 jmc 1.2 map2gl(1) = iGjLoc
501     map2gl(2) = jGjLoc
502 jmc 1.1 CALL MDS_WRITE_META(
503     I metaFName, dataFName, the_run_name, ' ',
504 jmc 1.2 I filePrec, nDims,dimList,map2gl, 0, ' ',
505 jmc 1.1 I 0, UNSET_RL, irecord, myIter, myThid )
506     ENDIF
507     C End of bi,bj loops
508     ENDDO
509     ENDDO
510    
511     C If global file was opened then close it
512     IF (fileIsOpen .AND. globalFile) THEN
513     CLOSE( dUnit )
514     fileIsOpen = .FALSE.
515     ENDIF
516    
517     C- endif iAmDoingIO
518     ENDIF
519    
520     C if useSingleCpuIO / else / end
521     ENDIF
522    
523     C Create meta-file for the global-file (also if useSingleCpuIO)
524     IF ( writeMetaF .AND. iAmDoingIO .AND.
525     & (globalFile .OR. useSingleCpuIO) ) THEN
526     WRITE(metaFName,'(2A)') fName(1:IL),'.meta'
527     dimList(1,1)=x_size
528     dimList(2,1)=1
529     dimList(3,1)=x_size
530     dimList(1,2)=y_size
531     dimList(2,2)=1
532     dimList(3,2)=y_size
533     dimList(1,3)=nNz
534     dimList(2,3)=1
535     dimList(3,3)=nNz
536 jmc 1.2 nDims=3
537     IF ( nNz.EQ.1 ) nDims=2
538 jmc 1.3 map2gl(1) = 0
539     map2gl(2) = 1
540 jmc 1.1 CALL MDS_WRITE_META(
541     I metaFName, dataFName, the_run_name, ' ',
542 jmc 1.2 I filePrec, nDims,dimList,map2gl, 0, ' ',
543 jmc 1.1 I 0, UNSET_RL, irecord, myIter, myThid )
544     c I metaFName, dataFName, the_run_name, titleLine,
545 jmc 1.2 c I filePrec, nDims, dimList, map2gl, nFlds, fldList,
546 jmc 1.1 c I nTimRec, timList, irecord, myIter, myThid )
547     ENDIF
548    
549     C To be safe, make other processes wait for I/O completion
550     _BARRIER
551    
552     C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
553     RETURN
554     END

  ViewVC Help
Powered by ViewVC 1.1.22