/[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.12 - (show annotations) (download)
Mon Jun 8 14:38:54 2009 UTC (15 years ago) by jmc
Branch: MAIN
CVS Tags: checkpoint61p
Changes since 1.11: +37 -22 lines
a hack for fizhi with NrPhys > 2*Nr

1 C $Header: /u/gcmpack/MITgcm/pkg/mdsio/mdsio_write_field.F,v 1.11 2009/06/08 03:32:33 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
131 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
132 C Set dimensions:
133 xSize = Nx
134 ySize = Ny
135 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
144 C- default:
145 iGjLoc = 0
146 jGjLoc = 1
147
148 C Assume nothing
149 fileIsOpen = .FALSE.
150 IL = ILNBLNK( fName )
151 pIL = ILNBLNK( mdsioLocalDir )
152 nNz = 1 + kHi - kLo
153 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 IF (irecord .LT. 1) THEN
161 WRITE(msgBuf,'(3A,I10))')
162 & ' MDS_WRITE_FIELD: file="', fName(1:IL), '" , iter=', myIter
163 CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
164 & SQUEEZE_RIGHT , myThid )
165 WRITE(msgBuf,'(A,I9.8)')
166 & ' MDS_WRITE_FIELD: argument irecord = ',irecord
167 CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
168 & SQUEEZE_RIGHT , myThid )
169 WRITE(msgBuf,'(A)')
170 & ' 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 C check for valid sub-set of levels:
176 IF ( kLo.LT.1 .OR. kHi.GT.kSize ) THEN
177 WRITE(msgBuf,'(3A,I10))')
178 & ' MDS_WRITE_FIELD: file="', fName(1:IL), '" , iter=', myIter
179 CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
180 & SQUEEZE_RIGHT , myThid )
181 WRITE(msgBuf,'(3(A,I6))')
182 & ' MDS_WRITE_FIELD: arguments kSize=', kSize,
183 & ' , kLo=', kLo, ' , kHi=', kHi
184 CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
185 & SQUEEZE_RIGHT , myThid )
186 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 WRITE(msgBuf,'(3A,I10))')
195 & ' MDS_WRITE_FIELD: file="', fName(1:IL), '" , iter=', myIter
196 CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
197 & SQUEEZE_RIGHT , myThid )
198 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 & SQUEEZE_RIGHT , myThid )
203 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
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 length_of_rec = MDS_RECLEN( filePrec, xSize*ySize, myThid )
239 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 C Gather array and write it to file, one vertical level at a time
249 DO k=kLo,kHi
250 zeroBuff = k.EQ.kLo
251 C- copy from arr(level=k) to 2-D "local":
252 IF ( filePrec.EQ.precFloat32 ) THEN
253 IF ( arrType.EQ.'RS' ) THEN
254 CALL MDS_PASS_R4toRS( sharedLocBuf_r4, arr,
255 I 1, k, kSize, 0, 0, .FALSE., myThid )
256 ELSEIF ( arrType.EQ.'RL' ) THEN
257 CALL MDS_PASS_R4toRL( sharedLocBuf_r4, arr,
258 I 1, k, kSize, 0, 0, .FALSE., myThid )
259 ELSE
260 WRITE(msgBuf,'(2A)')
261 & ' MDS_WRITE_FIELD: illegal value for arrType=', arrType
262 CALL PRINT_ERROR( msgBuf, myThid )
263 CALL ALL_PROC_DIE( myThid )
264 STOP 'ABNORMAL END: S/R MDS_WRITE_FIELD'
265 ENDIF
266 C Wait for all threads to finish filling shared buffer
267 CALL BAR2( myThid )
268 CALL GATHER_2D_R4(
269 O xy_buffer_r4,
270 I sharedLocBuf_r4,
271 I xSize, ySize,
272 I useExch2ioLayOut, zeroBuff, myThid )
273 ELSEIF ( filePrec.EQ.precFloat64 ) THEN
274 IF ( arrType.EQ.'RS' ) THEN
275 CALL MDS_PASS_R8toRS( sharedLocBuf_r8, arr,
276 I 1, k, kSize, 0, 0, .FALSE., myThid )
277
278 ELSEIF ( arrType.EQ.'RL' ) THEN
279 CALL MDS_PASS_R8toRL( sharedLocBuf_r8, arr,
280 I 1, k, kSize, 0, 0, .FALSE., myThid )
281 ELSE
282 WRITE(msgBuf,'(2A)')
283 & ' MDS_WRITE_FIELD: illegal value for arrType=', arrType
284 CALL PRINT_ERROR( msgBuf, myThid )
285 CALL ALL_PROC_DIE( myThid )
286 STOP 'ABNORMAL END: S/R MDS_WRITE_FIELD'
287 ENDIF
288 C Wait for all threads to finish filling shared buffer
289 CALL BAR2( myThid )
290 CALL GATHER_2D_R8(
291 O xy_buffer_r8,
292 I sharedLocBuf_r8,
293 I xSize, ySize,
294 I useExch2ioLayOut, zeroBuff, myThid )
295 ELSE
296 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 ENDIF
302 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
306 IF ( iAmDoingIO ) THEN
307 irec = 1 + k-kLo + (irecord-1)*nNz
308 IF ( filePrec.EQ.precFloat32 ) THEN
309 #ifdef _BYTESWAPIO
310 CALL MDS_BYTESWAPR4( xSize*ySize, xy_buffer_r4 )
311 #endif
312 WRITE(dUnit,rec=irec) ( xy_buffer_r4(i),i=1,xSize*ySize )
313 ELSE
314 #ifdef _BYTESWAPIO
315 CALL MDS_BYTESWAPR8( xSize*ySize, xy_buffer_r8 )
316 #endif
317 WRITE(dUnit,rec=irec) ( xy_buffer_r8(i),i=1,xSize*ySize )
318 ENDIF
319 C- end if iAmDoingIO
320 ENDIF
321 C- end of k loop
322 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 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 WRITE(msgBuf,'(2A)')
343 & ' MDS_WRITE_FIELD: illegal value for arrType=', arrType
344 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 WRITE(msgBuf,'(2A)')
357 & ' MDS_WRITE_FIELD: illegal value for arrType=', arrType
358 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 WRITE(msgBuf,'(A,I6)')
364 & ' MDS_WRITE_FIELD: illegal value for filePrec=',filePrec
365 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 C Only do I/O if I am the master thread
374 IF ( iAmDoingIO ) THEN
375
376 #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 C If we are writing to a global file then we open it here
385 IF (globalFile) THEN
386 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 ENDIF
397
398 C Loop over all tiles
399 DO bj=1,nSy
400 DO bi=1,nSx
401 bBij = sNx*sNy*nNz*( bi-1 + (bj-1)*nSx )
402
403 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 #ifdef ALLOW_EXCH2
409 IF ( useExch2ioLayOut ) THEN
410 tN = W2_myTileList(bi)
411 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 #endif /* ALLOW_EXCH2 */
431
432 IF (globalFile) THEN
433 C--- Case of 1 Global file:
434
435 DO k=kLo,kHi
436 DO j=1,tNy
437 irec = 1 + ( tBx + (j-1)*iGjLoc )/tNx
438 & + ( tBy + (j-1)*jGjLoc )*global_nTx
439 & +( k-kLo + (irecord-1)*nNz )*global_nTx*ySize
440 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 ELSE
445 WRITE(dUnit,rec=irec) (shared3dBuf_r8(i),i=i1,i2)
446 ENDIF
447 C End of j,k loops
448 ENDDO
449 ENDDO
450
451 ELSE
452 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 & pfName(1:pIL),'.',iG,'.',jG,'.data'
459 length_of_rec = MDS_RECLEN( filePrec, sNx*sNy*nNz, myThid )
460 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 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
478 C here We close the tiled MDS file
479 IF ( fileIsOpen ) THEN
480 CLOSE( dUnit )
481 fileIsOpen = .FALSE.
482 ENDIF
483
484 C--- End Global File / tile-file cases
485 ENDIF
486
487 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 dimList(1,1) = xSize
494 dimList(2,1) = tBx + 1
495 dimList(3,1) = tBx + tNx
496 dimList(1,2) = ySize
497 dimList(2,2) = tBy + 1
498 dimList(3,2) = tBy + tNy
499 dimList(1,3) = nNz
500 dimList(2,3) = 1
501 dimList(3,3) = nNz
502 c dimList(1,3) = kSize
503 c dimList(2,3) = kLo
504 c dimList(3,3) = kHi
505 nDims = 3
506 IF ( nNz.EQ.1 ) nDims = 2
507 map2gl(1) = iGjLoc
508 map2gl(2) = jGjLoc
509 CALL MDS_WRITE_META(
510 I metaFName, dataFName, the_run_name, ' ',
511 I filePrec, nDims,dimList,map2gl, 0, ' ',
512 I 0, UNSET_RL, irecord, myIter, myThid )
513 ENDIF
514
515 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 CLOSE( dUnit )
522 fileIsOpen = .FALSE.
523 ENDIF
524
525 C- endif iAmDoingIO
526 ENDIF
527
528 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 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 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 c dimList(1,3) = kSize
549 c dimList(2,3) = kLo
550 c dimList(3,3) = kHi
551 nDims = 3
552 IF ( nNz.EQ.1 ) nDims = 2
553 map2gl(1) = 0
554 map2gl(2) = 1
555 CALL MDS_WRITE_META(
556 I metaFName, dataFName, the_run_name, ' ',
557 I filePrec, nDims,dimList,map2gl, 0, ' ',
558 I 0, UNSET_RL, irecord, myIter, myThid )
559 c I metaFName, dataFName, the_run_name, titleLine,
560 c I filePrec, nDims, dimList, map2gl, nFlds, fldList,
561 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