/[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.16 - (hide annotations) (download)
Tue Sep 1 19:08:27 2009 UTC (15 years, 10 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint62, checkpoint62c, checkpoint62b, checkpoint62a, checkpoint62g, checkpoint62f, checkpoint62e, checkpoint62d, checkpoint62k, checkpoint62j, checkpoint62i, checkpoint62h, checkpoint62o, checkpoint62n, checkpoint62m, checkpoint62l, checkpoint62p, checkpoint61v, checkpoint61w, checkpoint61z, checkpoint61x, checkpoint61y
Changes since 1.15: +21 -23 lines
rework MDS-IO high level S/R interface:
 To avoid mixing type (RS/RL) of input/output array argument,
 replace single mixed array with a pair of each type (RS/Rl).

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

  ViewVC Help
Powered by ViewVC 1.1.22