/[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.15 - (show 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 C $Header: /u/gcmpack/MITgcm/pkg/mdsio/mdsio_write_field.F,v 1.14 2009/06/28 01:06:39 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 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 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 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 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 C Currently, the meta-files are not read because it is difficult
43 C to parse files in fortran. We should read meta information before
44 C adding records to an existing multi-record file.
45 C The precision of the file is decsribed by filePrec, set either
46 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 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 cph(
92 cph Real arr(*)
93 _RL arr(1-oLx:sNx+oLx,1-oLy:sNy+oLy,kSize,nSx,nSy)
94 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 C bBij :: base shift in Buffer index for tile bi,bj
110 CHARACTER*(MAX_LEN_FNAM) dataFName,metaFName,pfName
111 CHARACTER*(MAX_LEN_MBUF) msgBuf
112 LOGICAL fileIsOpen
113 LOGICAL iAmDoingIO
114 LOGICAL writeMetaF
115 LOGICAL useExch2ioLayOut
116 LOGICAL zeroBuff
117 INTEGER xSize, ySize
118 INTEGER irecord
119 INTEGER iG,jG,bi,bj
120 INTEGER i1,i2,i,j,k,nNz
121 INTEGER irec,dUnit,IL,pIL
122 INTEGER dimList(3,3), nDims, map2gl(2)
123 INTEGER length_of_rec
124 INTEGER bBij
125 INTEGER tNx, tNy, global_nTx
126 INTEGER tBx, tBy, iGjLoc, jGjLoc
127 #ifdef ALLOW_EXCH2
128 INTEGER tN
129 #endif /* ALLOW_EXCH2 */
130 _RL dummyRL(1)
131 CHARACTER*8 blank8c
132
133 DATA dummyRL(1) / 0. _d 0 /
134 DATA blank8c / ' ' /
135
136 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
137 C Set dimensions:
138 xSize = Nx
139 ySize = Ny
140 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
149 C- default:
150 iGjLoc = 0
151 jGjLoc = 1
152
153 C Assume nothing
154 fileIsOpen = .FALSE.
155 IL = ILNBLNK( fName )
156 pIL = ILNBLNK( mdsioLocalDir )
157 nNz = 1 + kHi - kLo
158 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 IF (irecord .LT. 1) THEN
166 WRITE(msgBuf,'(3A,I10)')
167 & ' MDS_WRITE_FIELD: file="', fName(1:IL), '" , iter=', myIter
168 CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
169 & SQUEEZE_RIGHT , myThid )
170 WRITE(msgBuf,'(A,I9.8)')
171 & ' MDS_WRITE_FIELD: argument irecord = ',irecord
172 CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
173 & SQUEEZE_RIGHT , myThid )
174 WRITE(msgBuf,'(A)')
175 & ' 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 C check for valid sub-set of levels:
181 IF ( kLo.LT.1 .OR. kHi.GT.kSize ) THEN
182 WRITE(msgBuf,'(3A,I10)')
183 & ' MDS_WRITE_FIELD: file="', fName(1:IL), '" , iter=', myIter
184 CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
185 & SQUEEZE_RIGHT , myThid )
186 WRITE(msgBuf,'(3(A,I6))')
187 & ' MDS_WRITE_FIELD: arguments kSize=', kSize,
188 & ' , kLo=', kLo, ' , kHi=', kHi
189 CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
190 & SQUEEZE_RIGHT , myThid )
191 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 WRITE(msgBuf,'(3A,I10)')
200 & ' MDS_WRITE_FIELD: file="', fName(1:IL), '" , iter=', myIter
201 CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
202 & SQUEEZE_RIGHT , myThid )
203 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 & SQUEEZE_RIGHT , myThid )
208 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
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 length_of_rec = MDS_RECLEN( filePrec, xSize*ySize, myThid )
244 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 C Gather array and write it to file, one vertical level at a time
254 DO k=kLo,kHi
255 zeroBuff = k.EQ.kLo
256 C- copy from arr(level=k) to 2-D "local":
257 IF ( filePrec.EQ.precFloat32 ) THEN
258 IF ( arrType.EQ.'RS' ) THEN
259 CALL MDS_PASS_R4toRS( sharedLocBuf_r4, arr,
260 I 1, k, kSize, 0, 0, .FALSE., myThid )
261 ELSEIF ( arrType.EQ.'RL' ) THEN
262 CALL MDS_PASS_R4toRL( sharedLocBuf_r4, arr,
263 I 1, k, kSize, 0, 0, .FALSE., myThid )
264 ELSE
265 WRITE(msgBuf,'(2A)')
266 & ' MDS_WRITE_FIELD: illegal value for arrType=', arrType
267 CALL PRINT_ERROR( msgBuf, myThid )
268 CALL ALL_PROC_DIE( myThid )
269 STOP 'ABNORMAL END: S/R MDS_WRITE_FIELD'
270 ENDIF
271 C Wait for all threads to finish filling shared buffer
272 CALL BAR2( myThid )
273 CALL GATHER_2D_R4(
274 O xy_buffer_r4,
275 I sharedLocBuf_r4,
276 I xSize, ySize,
277 I useExch2ioLayOut, zeroBuff, myThid )
278 ELSEIF ( filePrec.EQ.precFloat64 ) THEN
279 IF ( arrType.EQ.'RS' ) THEN
280 CALL MDS_PASS_R8toRS( sharedLocBuf_r8, arr,
281 I 1, k, kSize, 0, 0, .FALSE., myThid )
282
283 ELSEIF ( arrType.EQ.'RL' ) THEN
284 CALL MDS_PASS_R8toRL( sharedLocBuf_r8, arr,
285 I 1, k, kSize, 0, 0, .FALSE., myThid )
286 ELSE
287 WRITE(msgBuf,'(2A)')
288 & ' MDS_WRITE_FIELD: illegal value for arrType=', arrType
289 CALL PRINT_ERROR( msgBuf, myThid )
290 CALL ALL_PROC_DIE( myThid )
291 STOP 'ABNORMAL END: S/R MDS_WRITE_FIELD'
292 ENDIF
293 C Wait for all threads to finish filling shared buffer
294 CALL BAR2( myThid )
295 CALL GATHER_2D_R8(
296 O xy_buffer_r8,
297 I sharedLocBuf_r8,
298 I xSize, ySize,
299 I useExch2ioLayOut, zeroBuff, myThid )
300 ELSE
301 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 ENDIF
307 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
311 IF ( iAmDoingIO ) THEN
312 irec = 1 + k-kLo + (irecord-1)*nNz
313 IF ( filePrec.EQ.precFloat32 ) THEN
314 #ifdef _BYTESWAPIO
315 CALL MDS_BYTESWAPR4( xSize*ySize, xy_buffer_r4 )
316 #endif
317 WRITE(dUnit,rec=irec) ( xy_buffer_r4(i),i=1,xSize*ySize )
318 ELSE
319 #ifdef _BYTESWAPIO
320 CALL MDS_BYTESWAPR8( xSize*ySize, xy_buffer_r8 )
321 #endif
322 WRITE(dUnit,rec=irec) ( xy_buffer_r8(i),i=1,xSize*ySize )
323 ENDIF
324 C- end if iAmDoingIO
325 ENDIF
326 C- end of k loop
327 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 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 WRITE(msgBuf,'(2A)')
348 & ' MDS_WRITE_FIELD: illegal value for arrType=', arrType
349 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 WRITE(msgBuf,'(2A)')
362 & ' MDS_WRITE_FIELD: illegal value for arrType=', arrType
363 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 WRITE(msgBuf,'(A,I6)')
369 & ' MDS_WRITE_FIELD: illegal value for filePrec=',filePrec
370 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 C Only do I/O if I am the master thread
379 IF ( iAmDoingIO ) THEN
380
381 #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 C If we are writing to a global file then we open it here
390 IF (globalFile) THEN
391 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 ENDIF
402
403 C Loop over all tiles
404 DO bj=1,nSy
405 DO bi=1,nSx
406 bBij = sNx*sNy*nNz*( bi-1 + (bj-1)*nSx )
407
408 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 #ifdef ALLOW_EXCH2
414 IF ( useExch2ioLayOut ) THEN
415 tN = W2_myTileList(bi,bj)
416 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 #endif /* ALLOW_EXCH2 */
436
437 IF (globalFile) THEN
438 C--- Case of 1 Global file:
439
440 DO k=kLo,kHi
441 DO j=1,tNy
442 irec = 1 + ( tBx + (j-1)*iGjLoc )/tNx
443 & + ( tBy + (j-1)*jGjLoc )*global_nTx
444 & +( k-kLo + (irecord-1)*nNz )*global_nTx*ySize
445 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 ELSE
450 WRITE(dUnit,rec=irec) (shared3dBuf_r8(i),i=i1,i2)
451 ENDIF
452 C End of j,k loops
453 ENDDO
454 ENDDO
455
456 ELSE
457 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 & pfName(1:pIL),'.',iG,'.',jG,'.data'
464 length_of_rec = MDS_RECLEN( filePrec, sNx*sNy*nNz, myThid )
465 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 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
483 C here We close the tiled MDS file
484 IF ( fileIsOpen ) THEN
485 CLOSE( dUnit )
486 fileIsOpen = .FALSE.
487 ENDIF
488
489 C--- End Global File / tile-file cases
490 ENDIF
491
492 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 dimList(1,1) = xSize
499 dimList(2,1) = tBx + 1
500 dimList(3,1) = tBx + tNx
501 dimList(1,2) = ySize
502 dimList(2,2) = tBy + 1
503 dimList(3,2) = tBy + tNy
504 dimList(1,3) = nNz
505 dimList(2,3) = 1
506 dimList(3,3) = nNz
507 c dimList(1,3) = kSize
508 c dimList(2,3) = kLo
509 c dimList(3,3) = kHi
510 nDims = 3
511 IF ( nNz.EQ.1 ) nDims = 2
512 map2gl(1) = iGjLoc
513 map2gl(2) = jGjLoc
514 CALL MDS_WRITE_META(
515 I metaFName, dataFName, the_run_name, ' ',
516 I filePrec, nDims, dimList, map2gl, 0, blank8c,
517 I 0, dummyRL, irecord, myIter, myThid )
518 ENDIF
519
520 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 CLOSE( dUnit )
527 fileIsOpen = .FALSE.
528 ENDIF
529
530 C- endif iAmDoingIO
531 ENDIF
532
533 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 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 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 c dimList(1,3) = kSize
554 c dimList(2,3) = kLo
555 c dimList(3,3) = kHi
556 nDims = 3
557 IF ( nNz.EQ.1 ) nDims = 2
558 map2gl(1) = 0
559 map2gl(2) = 1
560 CALL MDS_WRITE_META(
561 I metaFName, dataFName, the_run_name, ' ',
562 I filePrec, nDims, dimList, map2gl, 0, blank8c,
563 I 0, dummyRL, irecord, myIter, myThid )
564 c I metaFName, dataFName, the_run_name, titleLine,
565 c I filePrec, nDims, dimList, map2gl, nFlds, fldList,
566 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