/[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.15 - (hide annotations) (download)
Sun Aug 2 20:42:43 2009 UTC (15 years, 11 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint61u
Changes since 1.14: +10 -5 lines
changed to pass when compiling with strick checking of arguments across S/R

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

  ViewVC Help
Powered by ViewVC 1.1.22