/[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.10 - (hide annotations) (download)
Mon Jun 1 14:20:31 2009 UTC (16 years, 1 month ago) by jmc
Branch: MAIN
Changes since 1.9: +129 -78 lines
read/write tiled (local) files: read/write 1-level tile chunk at a time
 (instead of segment of length sNx); expected to speed up tiled IO.

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

  ViewVC Help
Powered by ViewVC 1.1.22