/[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.14 - (hide annotations) (download)
Sun Jun 28 01:06:39 2009 UTC (14 years, 11 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint61t, checkpoint61s
Changes since 1.13: +2 -2 lines
add bj in exch2 arrays and S/R

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

  ViewVC Help
Powered by ViewVC 1.1.22