/[MITgcm]/MITgcm/pkg/mdsio/mdsio_write_field.F
ViewVC logotype

Contents of /MITgcm/pkg/mdsio/mdsio_write_field.F

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.16 - (show annotations) (download)
Tue Sep 1 19:08:27 2009 UTC (14 years, 8 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 C $Header: /u/gcmpack/MITgcm/pkg/mdsio/mdsio_write_field.F,v 1.15 2009/08/02 20:42:43 jmc Exp $
2 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 I kSize,kLo,kHi,
16 I fldRL, fldRS,
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)) :: which array (fldRL/RS) to write, either "RL" or "RS"
30 C kSize (integer) :: size of third dimension: normally either 1 or Nr
31 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 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 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 C Currently, the meta-files are not read because it is difficult
44 C to parse files in fortran. We should read meta information before
45 C adding records to an existing multi-record file.
46 C The precision of the file is decsribed by filePrec, set either
47 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 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 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 # include "W2_EXCH2_SIZE.h"
75 # include "W2_EXCH2_TOPOLOGY.h"
76 # include "W2_EXCH2_PARAMS.h"
77 #endif /* ALLOW_EXCH2 */
78 #include "EEBUFF_SCPU.h"
79 #ifdef ALLOW_FIZHI
80 # include "fizhi_SIZE.h"
81 #endif /* ALLOW_FIZHI */
82 #include "MDSIO_BUFF_3D.h"
83
84 C !INPUT PARAMETERS:
85 CHARACTER*(*) fName
86 INTEGER filePrec
87 LOGICAL globalFile
88 LOGICAL useCurrentDir
89 CHARACTER*(2) arrType
90 INTEGER kSize, kLo, kHi
91 _RL fldRL(*)
92 _RS fldRS(*)
93 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 C bBij :: base shift in Buffer index for tile bi,bj
108 CHARACTER*(MAX_LEN_FNAM) dataFName,metaFName,pfName
109 CHARACTER*(MAX_LEN_MBUF) msgBuf
110 LOGICAL fileIsOpen
111 LOGICAL iAmDoingIO
112 LOGICAL writeMetaF
113 LOGICAL useExch2ioLayOut
114 LOGICAL zeroBuff
115 INTEGER xSize, ySize
116 INTEGER irecord
117 INTEGER iG,jG,bi,bj
118 INTEGER i1,i2,i,j,k,nNz
119 INTEGER irec,dUnit,IL,pIL
120 INTEGER dimList(3,3), nDims, map2gl(2)
121 INTEGER length_of_rec
122 INTEGER bBij
123 INTEGER tNx, tNy, global_nTx
124 INTEGER tBx, tBy, iGjLoc, jGjLoc
125 #ifdef ALLOW_EXCH2
126 INTEGER tN
127 #endif /* ALLOW_EXCH2 */
128 _RL dummyRL(1)
129 CHARACTER*8 blank8c
130
131 DATA dummyRL(1) / 0. _d 0 /
132 DATA blank8c / ' ' /
133
134 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
135 C Set dimensions:
136 xSize = Nx
137 ySize = Ny
138 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
147 C- default:
148 iGjLoc = 0
149 jGjLoc = 1
150
151 C Assume nothing
152 fileIsOpen = .FALSE.
153 IL = ILNBLNK( fName )
154 pIL = ILNBLNK( mdsioLocalDir )
155 nNz = 1 + kHi - kLo
156 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 IF (irecord .LT. 1) THEN
164 WRITE(msgBuf,'(3A,I10)')
165 & ' MDS_WRITE_FIELD: file="', fName(1:IL), '" , iter=', myIter
166 CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
167 & SQUEEZE_RIGHT , myThid )
168 WRITE(msgBuf,'(A,I9.8)')
169 & ' MDS_WRITE_FIELD: argument irecord = ',irecord
170 CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
171 & SQUEEZE_RIGHT , myThid )
172 WRITE(msgBuf,'(A)')
173 & ' 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 C check for valid sub-set of levels:
179 IF ( kLo.LT.1 .OR. kHi.GT.kSize ) THEN
180 WRITE(msgBuf,'(3A,I10)')
181 & ' MDS_WRITE_FIELD: file="', fName(1:IL), '" , iter=', myIter
182 CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
183 & SQUEEZE_RIGHT , myThid )
184 WRITE(msgBuf,'(3(A,I6))')
185 & ' MDS_WRITE_FIELD: arguments kSize=', kSize,
186 & ' , kLo=', kLo, ' , kHi=', kHi
187 CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
188 & SQUEEZE_RIGHT , myThid )
189 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 WRITE(msgBuf,'(3A,I10)')
198 & ' MDS_WRITE_FIELD: file="', fName(1:IL), '" , iter=', myIter
199 CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
200 & SQUEEZE_RIGHT , myThid )
201 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 & SQUEEZE_RIGHT , myThid )
206 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
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 length_of_rec = MDS_RECLEN( filePrec, xSize*ySize, myThid )
242 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 C Gather array and write it to file, one vertical level at a time
252 DO k=kLo,kHi
253 zeroBuff = k.EQ.kLo
254 C- copy from fldRL/RS(level=k) to 2-D "local":
255 IF ( filePrec.EQ.precFloat32 ) THEN
256 IF ( arrType.EQ.'RS' ) THEN
257 CALL MDS_PASS_R4toRS( sharedLocBuf_r4, fldRS,
258 I 1, k, kSize, 0, 0, .FALSE., myThid )
259 ELSEIF ( arrType.EQ.'RL' ) THEN
260 CALL MDS_PASS_R4toRL( sharedLocBuf_r4, fldRL,
261 I 1, k, kSize, 0, 0, .FALSE., myThid )
262 ELSE
263 WRITE(msgBuf,'(2A)')
264 & ' MDS_WRITE_FIELD: illegal value for arrType=', arrType
265 CALL PRINT_ERROR( msgBuf, myThid )
266 CALL ALL_PROC_DIE( myThid )
267 STOP 'ABNORMAL END: S/R MDS_WRITE_FIELD'
268 ENDIF
269 C Wait for all threads to finish filling shared buffer
270 CALL BAR2( myThid )
271 CALL GATHER_2D_R4(
272 O xy_buffer_r4,
273 I sharedLocBuf_r4,
274 I xSize, ySize,
275 I useExch2ioLayOut, zeroBuff, myThid )
276 ELSEIF ( filePrec.EQ.precFloat64 ) THEN
277 IF ( arrType.EQ.'RS' ) THEN
278 CALL MDS_PASS_R8toRS( sharedLocBuf_r8, fldRS,
279 I 1, k, kSize, 0, 0, .FALSE., myThid )
280
281 ELSEIF ( arrType.EQ.'RL' ) THEN
282 CALL MDS_PASS_R8toRL( sharedLocBuf_r8, fldRL,
283 I 1, k, kSize, 0, 0, .FALSE., myThid )
284 ELSE
285 WRITE(msgBuf,'(2A)')
286 & ' MDS_WRITE_FIELD: illegal value for arrType=', arrType
287 CALL PRINT_ERROR( msgBuf, myThid )
288 CALL ALL_PROC_DIE( myThid )
289 STOP 'ABNORMAL END: S/R MDS_WRITE_FIELD'
290 ENDIF
291 C Wait for all threads to finish filling shared buffer
292 CALL BAR2( myThid )
293 CALL GATHER_2D_R8(
294 O xy_buffer_r8,
295 I sharedLocBuf_r8,
296 I xSize, ySize,
297 I useExch2ioLayOut, zeroBuff, myThid )
298 ELSE
299 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 ENDIF
305 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
309 IF ( iAmDoingIO ) THEN
310 irec = 1 + k-kLo + (irecord-1)*nNz
311 IF ( filePrec.EQ.precFloat32 ) THEN
312 #ifdef _BYTESWAPIO
313 CALL MDS_BYTESWAPR4( xSize*ySize, xy_buffer_r4 )
314 #endif
315 WRITE(dUnit,rec=irec) ( xy_buffer_r4(i),i=1,xSize*ySize )
316 ELSE
317 #ifdef _BYTESWAPIO
318 CALL MDS_BYTESWAPR8( xSize*ySize, xy_buffer_r8 )
319 #endif
320 WRITE(dUnit,rec=irec) ( xy_buffer_r8(i),i=1,xSize*ySize )
321 ENDIF
322 C- end if iAmDoingIO
323 ENDIF
324 C- end of k loop
325 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 C--- Copy from fldRL/RS to 3-D buffer (multi-threads):
337 IF ( filePrec.EQ.precFloat32 ) THEN
338 IF ( arrType.EQ.'RS' ) THEN
339 CALL MDS_PASS_R4toRS( shared3dBuf_r4, fldRS,
340 I nNz, kLo, kSize, 0,0, .FALSE., myThid )
341 ELSEIF ( arrType.EQ.'RL' ) THEN
342 CALL MDS_PASS_R4toRL( shared3dBuf_r4, fldRL,
343 I nNz, kLo, kSize, 0,0, .FALSE., myThid )
344 ELSE
345 WRITE(msgBuf,'(2A)')
346 & ' MDS_WRITE_FIELD: illegal value for arrType=', arrType
347 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 CALL MDS_PASS_R8toRS( shared3dBuf_r8, fldRS,
354 I nNz, kLo, kSize, 0,0, .FALSE., myThid )
355 ELSEIF ( arrType.EQ.'RL' ) THEN
356 CALL MDS_PASS_R8toRL( shared3dBuf_r8, fldRL,
357 I nNz, kLo, kSize, 0,0, .FALSE., myThid )
358 ELSE
359 WRITE(msgBuf,'(2A)')
360 & ' MDS_WRITE_FIELD: illegal value for arrType=', arrType
361 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 WRITE(msgBuf,'(A,I6)')
367 & ' MDS_WRITE_FIELD: illegal value for filePrec=',filePrec
368 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 C Only do I/O if I am the master thread
377 IF ( iAmDoingIO ) THEN
378
379 #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 C If we are writing to a global file then we open it here
388 IF (globalFile) THEN
389 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 ENDIF
400
401 C Loop over all tiles
402 DO bj=1,nSy
403 DO bi=1,nSx
404 bBij = sNx*sNy*nNz*( bi-1 + (bj-1)*nSx )
405
406 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 #ifdef ALLOW_EXCH2
412 IF ( useExch2ioLayOut ) THEN
413 tN = W2_myTileList(bi,bj)
414 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 #endif /* ALLOW_EXCH2 */
434
435 IF (globalFile) THEN
436 C--- Case of 1 Global file:
437
438 DO k=kLo,kHi
439 DO j=1,tNy
440 irec = 1 + ( tBx + (j-1)*iGjLoc )/tNx
441 & + ( tBy + (j-1)*jGjLoc )*global_nTx
442 & +( k-kLo + (irecord-1)*nNz )*global_nTx*ySize
443 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 ELSE
448 WRITE(dUnit,rec=irec) (shared3dBuf_r8(i),i=i1,i2)
449 ENDIF
450 C End of j,k loops
451 ENDDO
452 ENDDO
453
454 ELSE
455 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 & pfName(1:pIL),'.',iG,'.',jG,'.data'
462 length_of_rec = MDS_RECLEN( filePrec, sNx*sNy*nNz, myThid )
463 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 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
481 C here We close the tiled MDS file
482 IF ( fileIsOpen ) THEN
483 CLOSE( dUnit )
484 fileIsOpen = .FALSE.
485 ENDIF
486
487 C--- End Global File / tile-file cases
488 ENDIF
489
490 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 dimList(1,1) = xSize
497 dimList(2,1) = tBx + 1
498 dimList(3,1) = tBx + tNx
499 dimList(1,2) = ySize
500 dimList(2,2) = tBy + 1
501 dimList(3,2) = tBy + tNy
502 dimList(1,3) = nNz
503 dimList(2,3) = 1
504 dimList(3,3) = nNz
505 c dimList(1,3) = kSize
506 c dimList(2,3) = kLo
507 c dimList(3,3) = kHi
508 nDims = 3
509 IF ( nNz.EQ.1 ) nDims = 2
510 map2gl(1) = iGjLoc
511 map2gl(2) = jGjLoc
512 CALL MDS_WRITE_META(
513 I metaFName, dataFName, the_run_name, ' ',
514 I filePrec, nDims, dimList, map2gl, 0, blank8c,
515 I 0, dummyRL, irecord, myIter, myThid )
516 ENDIF
517
518 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 CLOSE( dUnit )
525 fileIsOpen = .FALSE.
526 ENDIF
527
528 C- endif iAmDoingIO
529 ENDIF
530
531 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 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 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 c dimList(1,3) = kSize
552 c dimList(2,3) = kLo
553 c dimList(3,3) = kHi
554 nDims = 3
555 IF ( nNz.EQ.1 ) nDims = 2
556 map2gl(1) = 0
557 map2gl(2) = 1
558 CALL MDS_WRITE_META(
559 I metaFName, dataFName, the_run_name, ' ',
560 I filePrec, nDims, dimList, map2gl, 0, blank8c,
561 I 0, dummyRL, irecord, myIter, myThid )
562 c I metaFName, dataFName, the_run_name, titleLine,
563 c I filePrec, nDims, dimList, map2gl, nFlds, fldList,
564 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