/[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.4 - (show annotations) (download)
Tue Nov 13 19:37:44 2007 UTC (16 years, 6 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint60, checkpoint61, checkpoint59q, checkpoint59p, checkpoint59r, checkpoint59m, checkpoint59l, checkpoint59o, checkpoint59n, checkpoint59k, checkpoint61f, checkpoint61g, checkpoint61d, checkpoint61e, checkpoint61b, checkpoint61c, checkpoint61a
Changes since 1.3: +52 -35 lines
add arguments to S/R MDS_READ_FIELD and MDS_WRITE_FIELD.

1 C $Header: /u/gcmpack/MITgcm/pkg/mdsio/mdsio_write_field.F,v 1.3 2007/03/21 01:57:55 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 "EESUPPORT.h"
73 #include "PARAMS.h"
74 #ifdef ALLOW_EXCH2
75 #include "W2_EXCH2_TOPOLOGY.h"
76 #include "W2_EXCH2_PARAMS.h"
77 #endif /* ALLOW_EXCH2 */
78 #include "MDSIO_SCPU.h"
79
80 C !INPUT PARAMETERS:
81 CHARACTER*(*) fName
82 INTEGER filePrec
83 LOGICAL globalFile
84 LOGICAL useCurrentDir
85 CHARACTER*(2) arrType
86 INTEGER kSize, kLo, kHi
87 cph(
88 cph Real arr(*)
89 _RL arr(1-oLx:sNx+oLx,1-oLy:sNy+oLy,kSize,nSx,nSy)
90 cph)
91 INTEGER jrecord
92 INTEGER myIter
93 INTEGER myThid
94 C !OUTPUT PARAMETERS:
95
96 C !FUNCTIONS
97 INTEGER ILNBLNK
98 INTEGER MDS_RECLEN
99 LOGICAL MASTER_CPU_IO
100 EXTERNAL ILNBLNK
101 EXTERNAL MDS_RECLEN
102 EXTERNAL MASTER_CPU_IO
103
104 C !LOCAL VARIABLES:
105 CHARACTER*(MAX_LEN_FNAM) dataFName,metaFName,pfName
106 CHARACTER*(MAX_LEN_MBUF) msgBuf
107 LOGICAL fileIsOpen
108 LOGICAL iAmDoingIO
109 LOGICAL writeMetaF
110 INTEGER irecord
111 INTEGER iG,jG,bi,bj,i,j,k,nNz
112 INTEGER irec,dUnit,IL,pIL
113 INTEGER dimList(3,3), nDims, map2gl(2)
114 INTEGER iGjLoc, jGjLoc
115 INTEGER x_size,y_size,length_of_rec
116 #if defined(ALLOW_EXCH2) && !defined(MISSING_TILE_IO)
117 INTEGER iG_IO,jG_IO,npe, loc_xGlobalLo, loc_yGlobalLo
118 PARAMETER ( x_size = exch2_domain_nxt * sNx )
119 PARAMETER ( y_size = exch2_domain_nyt * sNy )
120 #else
121 PARAMETER ( x_size = Nx )
122 PARAMETER ( y_size = Ny )
123 #endif
124 Real*4 r4seg(sNx)
125 Real*8 r8seg(sNx)
126 Real*4 xy_buffer_r4(x_size,y_size)
127 Real*8 xy_buffer_r8(x_size,y_size)
128 Real*8 globalBuf(Nx,Ny)
129 #ifdef ALLOW_EXCH2
130 c INTEGER tGy,tGx,tNy,tNx,tN
131 INTEGER tGy,tGx, tNx,tN
132 #endif /* ALLOW_EXCH2 */
133 INTEGER tNy
134
135 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
136
137 C- default:
138 iGjLoc = 0
139 jGjLoc = 1
140
141 C Assume nothing
142 fileIsOpen = .FALSE.
143 IL = ILNBLNK( fName )
144 pIL = ILNBLNK( mdsioLocalDir )
145 nNz = 1 + kHi - kLo
146 irecord = ABS(jrecord)
147 writeMetaF = jrecord.GT.0
148
149 C Only do I/O if I am the master thread (and mpi process 0 IF useSingleCpuIO):
150 iAmDoingIO = MASTER_CPU_IO(myThid)
151
152 C Only do I/O if I am the master thread
153 IF ( iAmDoingIO ) THEN
154
155 C Record number must be >= 1
156 IF (irecord .LT. 1) THEN
157 WRITE(msgBuf,'(A,I9.8)')
158 & ' MDS_WRITE_FIELD: argument irecord = ',irecord
159 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
160 & SQUEEZE_RIGHT , myThid)
161 WRITE(msgBuf,'(A)')
162 & ' MDS_WRITE_FIELD: invalid value for irecord'
163 CALL PRINT_ERROR( msgBuf, myThid )
164 STOP 'ABNORMAL END: S/R MDS_WRITE_FIELD'
165 ENDIF
166 C check for valid sub-set of levels:
167 IF ( kLo.LT.1 .OR. kHi.GT.kSize ) THEN
168 WRITE(msgBuf,'(3(A,I6))')
169 & ' MDS_WRITE_FIELD: arguments kSize=', kSize,
170 & ' , kLo=', kLo, ' , kHi=', kHi
171 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
172 & SQUEEZE_RIGHT , myThid)
173 WRITE(msgBuf,'(A)')
174 & ' MDS_WRITE_FIELD: invalid sub-set of levels'
175 CALL PRINT_ERROR( msgBuf, myThid )
176 STOP 'ABNORMAL END: S/R MDS_WRITE_FIELD'
177 ENDIF
178
179 C Assign special directory
180 IF ( useCurrentDir .OR. pIL.EQ.0 ) THEN
181 pfName = fName
182 ELSE
183 WRITE(pfName,'(2A)') mdsioLocalDir(1:pIL), fName(1:IL)
184 ENDIF
185 pIL=ILNBLNK( pfName )
186
187 C Assign a free unit number as the I/O channel for this routine
188 CALL MDSFINDUNIT( dUnit, myThid )
189
190 C- endif iAmDoingIO
191 ENDIF
192
193 C If option globalFile is desired but does not work or if
194 C globalFile is too slow, then try using single-CPU I/O.
195 IF (useSingleCpuIO) THEN
196
197 C Master thread of process 0, only, opens a global file
198 IF ( iAmDoingIO ) THEN
199 WRITE(dataFName,'(2a)') fName(1:IL),'.data'
200 length_of_rec=MDS_RECLEN(filePrec,x_size*y_size,myThid)
201 IF (irecord .EQ. 1) THEN
202 OPEN( dUnit, file=dataFName, status=_NEW_STATUS,
203 & access='direct', recl=length_of_rec )
204 ELSE
205 OPEN( dUnit, file=dataFName, status=_OLD_STATUS,
206 & access='direct', recl=length_of_rec )
207 ENDIF
208 ENDIF
209
210 C Gather array and WRITE it to file, one vertical level at a time
211 DO k=kLo,kHi
212 C- copy from arr(level=k) to 2-D "local":
213 IF ( arrType.EQ.'RS' ) THEN
214 CALL MDS_PASStoRS(sharedLocalBuf,arr,k,kSize,.FALSE.,myThid)
215 ELSEIF ( arrType.EQ.'RL' ) THEN
216 CALL MDS_PASStoRL(sharedLocalBuf,arr,k,kSize,.FALSE.,myThid)
217 ELSE
218 WRITE(msgBuf,'(A)')
219 & ' MDS_WRITE_FIELD: illegal value for arrType'
220 CALL PRINT_ERROR( msgBuf, myThid )
221 STOP 'ABNORMAL END: S/R MDS_WRITE_FIELD'
222 ENDIF
223 CALL GATHER_2D( globalBuf, sharedLocalBuf, myThid )
224
225 IF ( iAmDoingIO ) THEN
226 #if defined(ALLOW_EXCH2) && !defined(MISSING_TILE_IO)
227 IF (filePrec .EQ. precFloat32) THEN
228 DO J=1,y_size
229 DO I=1,x_size
230 xy_buffer_r4(I,J) = 0.0
231 ENDDO
232 ENDDO
233 ELSEIF (filePrec .EQ. precFloat64) THEN
234 DO J=1,y_size
235 DO I=1,x_size
236 xy_buffer_r8(I,J) = 0.0
237 ENDDO
238 ENDDO
239 ENDIF
240
241 bj=1
242 DO npe=1,nPx*nPy
243 DO bi=1,nSx
244 #ifdef ALLOW_USE_MPI
245 loc_xGlobalLo = mpi_myXGlobalLo(npe)
246 loc_yGlobalLo = mpi_myYGlobalLo(npe)
247 #else /* ALLOW_USE_MPI */
248 loc_xGlobalLo = myXGlobalLo
249 loc_yGlobalLo = myYGlobalLo
250 #endif /* ALLOW_USE_MPI */
251 tN = W2_mpi_myTileList(npe,bi)
252 IF ( exch2_mydNx(tN) .GT. x_size ) THEN
253 C- face x-size larger than glob-size : fold it
254 iGjLoc = 0
255 jGjLoc = exch2_mydNx(tN) / x_size
256 ELSEIF ( exch2_tNy(tN) .GT. y_size ) THEN
257 C- tile y-size larger than glob-size : make a long line
258 iGjLoc = exch2_mydNx(tN)
259 jGjLoc = 0
260 ELSE
261 C- default (face fit into global-IO-array)
262 iGjLoc = 0
263 jGjLoc = 1
264 ENDIF
265
266 IF (filePrec .EQ. precFloat32) THEN
267 DO J=1,sNy
268 DO I=1,sNx
269 iG = loc_xGlobalLo-1+(bi-1)*sNx+i
270 jG = loc_yGlobalLo-1+(bj-1)*sNy+j
271 iG_IO=exch2_txGlobalo(tN)+iGjLoc*(j-1)+i-1
272 jG_IO=exch2_tyGlobalo(tN)+jGjLoc*(j-1)
273 xy_buffer_r4(iG_IO,jG_IO) = globalBuf(iG,jG)
274 ENDDO
275 ENDDO
276 ELSEIF (filePrec .EQ. precFloat64) THEN
277 DO J=1,sNy
278 DO I=1,sNx
279 iG = loc_xGlobalLo-1+(bi-1)*sNx+i
280 jG = loc_yGlobalLo-1+(bj-1)*sNy+j
281 iG_IO=exch2_txGlobalo(tN)+iGjLoc*(j-1)+i-1
282 jG_IO=exch2_tyGlobalo(tN)+jGjLoc*(j-1)
283 xy_buffer_r8(iG_IO,jG_IO) = globalBuf(iG,jG)
284 ENDDO
285 ENDDO
286 ENDIF
287
288 C-- end of npe & bi loops
289 ENDDO
290 ENDDO
291 #else /* defined(ALLOW_EXCH2) && !defined(MISSING_TILE_IO) */
292 IF (filePrec .EQ. precFloat32) THEN
293 DO J=1,Ny
294 DO I=1,Nx
295 xy_buffer_r4(I,J) = globalBuf(I,J)
296 ENDDO
297 ENDDO
298 ELSEIF (filePrec .EQ. precFloat64) THEN
299 DO J=1,Ny
300 DO I=1,Nx
301 xy_buffer_r8(I,J) = globalBuf(I,J)
302 ENDDO
303 ENDDO
304 ENDIF
305 #endif /* defined(ALLOW_EXCH2) && !defined(MISSING_TILE_IO) */
306
307 irec=k+1-kLo+nNz*(irecord-1)
308 IF (filePrec .EQ. precFloat32) THEN
309 #ifdef _BYTESWAPIO
310 CALL MDS_BYTESWAPR4( x_size*y_size, xy_buffer_r4 )
311 #endif
312 WRITE(dUnit,rec=irec) xy_buffer_r4
313 ELSEIF (filePrec .EQ. precFloat64) THEN
314 #ifdef _BYTESWAPIO
315 CALL MDS_BYTESWAPR8( x_size*y_size, xy_buffer_r8 )
316 #endif
317 WRITE(dUnit,rec=irec) xy_buffer_r8
318 ELSE
319 WRITE(msgBuf,'(A)')
320 & ' MDS_WRITE_FIELD: illegal value for filePrec'
321 CALL PRINT_ERROR( msgBuf, myThid )
322 STOP 'ABNORMAL END: S/R MDS_WRITE_FIELD'
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 Only do I/O if I am the master thread
339 IF ( iAmDoingIO ) THEN
340
341 C If we are writing to a global file then we open it here
342 IF (globalFile) THEN
343 WRITE(dataFName,'(2a)') fName(1:IL),'.data'
344 IF (irecord .EQ. 1) THEN
345 length_of_rec=MDS_RECLEN( filePrec, sNx, myThid )
346 OPEN( dUnit, file=dataFName, status=_NEW_STATUS,
347 & access='direct', recl=length_of_rec )
348 fileIsOpen=.TRUE.
349 ELSE
350 length_of_rec=MDS_RECLEN( filePrec, sNx, myThid )
351 OPEN( dUnit, file=dataFName, status=_OLD_STATUS,
352 & access='direct', recl=length_of_rec )
353 fileIsOpen=.TRUE.
354 ENDIF
355 ENDIF
356
357 C Loop over all tiles
358 DO bj=1,nSy
359 DO bi=1,nSx
360 C If we are writing to a tiled MDS file then we open each one here
361 IF (.NOT. globalFile) THEN
362 iG=bi+(myXGlobalLo-1)/sNx ! Kludge until unstructered tiles
363 jG=bj+(myYGlobalLo-1)/sNy ! Kludge until unstructered tiles
364 WRITE(dataFName,'(2A,I3.3,A,I3.3,A)')
365 & pfName(1:pIL),'.',iG,'.',jG,'.data'
366 IF (irecord .EQ. 1) THEN
367 length_of_rec=MDS_RECLEN( filePrec, sNx, myThid )
368 OPEN( dUnit, file=dataFName, status=_NEW_STATUS,
369 & access='direct', recl=length_of_rec )
370 fileIsOpen=.TRUE.
371 ELSE
372 length_of_rec=MDS_RECLEN( filePrec, sNx, myThid )
373 OPEN( dUnit, file=dataFName, status=_OLD_STATUS,
374 & access='direct', recl=length_of_rec )
375 fileIsOpen=.TRUE.
376 ENDIF
377 ENDIF
378
379 IF (fileIsOpen) THEN
380 tNy = sNy
381 #ifdef ALLOW_EXCH2
382 tN = W2_myTileList(bi)
383 tGy = exch2_tyGlobalo(tN)
384 tGx = exch2_txGlobalo(tN)
385 tNy = exch2_tNy(tN)
386 tNx = exch2_tNx(tN)
387 IF ( exch2_mydNx(tN) .GT. x_size ) THEN
388 C- face x-size larger than glob-size : fold it
389 iGjLoc = 0
390 jGjLoc = exch2_mydNx(tN) / x_size
391 ELSEIF ( exch2_tNy(tN) .GT. y_size ) THEN
392 C- tile y-size larger than glob-size : make a long line
393 iGjLoc = exch2_mydNx(tN)
394 jGjLoc = 0
395 ELSE
396 C- default (face fit into global-IO-array)
397 iGjLoc = 0
398 jGjLoc = 1
399 ENDIF
400 #endif /* ALLOW_EXCH2 */
401 DO k=1,nNz
402 DO j=1,tNy
403 IF (globalFile) THEN
404 #ifdef ALLOW_EXCH2
405 irec = 1 + ( tGx-1 + (j-1)*iGjLoc )/tNx
406 & + ( tGy-1 + (j-1)*jGjLoc )*exch2_domain_nxt
407 & + ( k-kLo + (irecord-1)*nNz
408 & )*y_size*exch2_domain_nxt
409 #else /* ALLOW_EXCH2 */
410 iG = myXGlobalLo-1 + (bi-1)*sNx
411 jG = myYGlobalLo-1 + (bj-1)*sNy
412 irec= 1 + INT(iG/sNx) + nSx*nPx*(jG+j-1)
413 & + nSx*nPx*Ny*(k-kLo)
414 & + nSx*nPx*Ny*nNz*(irecord-1)
415 #endif /* ALLOW_EXCH2 */
416 ELSE
417 irec=j + sNy*(k-kLo) + sNy*nNz*(irecord-1)
418 ENDIF
419 IF (filePrec .EQ. precFloat32) THEN
420 IF (arrType .EQ. 'RS') THEN
421 CALL MDS_SEG4toRS( j,bi,bj,k,kSize, r4seg,.FALSE.,arr )
422 ELSEIF (arrType .EQ. 'RL') THEN
423 CALL MDS_SEG4toRL( j,bi,bj,k,kSize, r4seg,.FALSE.,arr )
424 ELSE
425 WRITE(msgBuf,'(A)')
426 & ' MDS_WRITE_FIELD: illegal value for arrType'
427 CALL PRINT_ERROR( msgBuf, myThid )
428 STOP 'ABNORMAL END: S/R MDS_WRITE_FIELD'
429 ENDIF
430 #ifdef _BYTESWAPIO
431 CALL MDS_BYTESWAPR4( sNx, r4seg )
432 #endif
433 WRITE(dUnit,rec=irec) r4seg
434 ELSEIF (filePrec .EQ. precFloat64) THEN
435 IF (arrType .EQ. 'RS') THEN
436 CALL MDS_SEG8toRS( j,bi,bj,k,kSize, r8seg,.FALSE.,arr )
437 ELSEIF (arrType .EQ. 'RL') THEN
438 CALL MDS_SEG8toRL( j,bi,bj,k,kSize, r8seg,.FALSE.,arr )
439 ELSE
440 WRITE(msgBuf,'(A)')
441 & ' MDS_WRITE_FIELD: illegal value for arrType'
442 CALL PRINT_ERROR( msgBuf, myThid )
443 STOP 'ABNORMAL END: S/R MDS_WRITE_FIELD'
444 ENDIF
445 #ifdef _BYTESWAPIO
446 CALL MDS_BYTESWAPR8( sNx, r8seg )
447 #endif
448 WRITE(dUnit,rec=irec) r8seg
449 ELSE
450 WRITE(msgBuf,'(A)')
451 & ' MDS_WRITE_FIELD: illegal value for filePrec'
452 CALL PRINT_ERROR( msgBuf, myThid )
453 STOP 'ABNORMAL END: S/R MDS_WRITE_FIELD'
454 ENDIF
455 C End of j loop
456 ENDDO
457 C End of k loop
458 ENDDO
459 ELSE
460 C fileIsOpen=F
461 WRITE(msgBuf,'(A)')
462 & ' MDS_WRITE_FIELD: I should never get to this point'
463 CALL PRINT_ERROR( msgBuf, myThid )
464 STOP 'ABNORMAL END: S/R MDS_WRITE_FIELD'
465 ENDIF
466 C If we were writing to a tiled MDS file then we close it here
467 IF (fileIsOpen .AND. (.NOT. globalFile)) THEN
468 CLOSE( dUnit )
469 fileIsOpen = .FALSE.
470 ENDIF
471 C Create meta-file for each tile if we are tiling
472 IF ( .NOT.globalFile .AND. writeMetaF ) THEN
473 iG=bi+(myXGlobalLo-1)/sNx
474 jG=bj+(myYGlobalLo-1)/sNy
475 WRITE(metaFname,'(2A,I3.3,A,I3.3,A)')
476 & pfName(1:pIL),'.',iG,'.',jG,'.meta'
477 #if defined(ALLOW_EXCH2) && !defined(MISSING_TILE_IO)
478 tN = W2_myTileList(bi)
479 dimList(1,1)=x_size
480 dimList(2,1)=exch2_txGlobalo(tN)
481 dimList(3,1)=exch2_txGlobalo(tN)+sNx-1
482 dimList(1,2)=y_size
483 dimList(2,2)=exch2_tyGlobalo(tN)
484 dimList(3,2)=exch2_tyGlobalo(tN)+sNy-1
485 #else /* defined(ALLOW_EXCH2) && !defined(MISSING_TILE_IO) */
486 C- jmc: if MISSING_TILE_IO, keep meta files unchanged
487 C to stay consistent with global file structure
488 dimList(1,1)=Nx
489 dimList(2,1)=myXGlobalLo+(bi-1)*sNx
490 dimList(3,1)=myXGlobalLo+bi*sNx-1
491 dimList(1,2)=Ny
492 dimList(2,2)=myYGlobalLo+(bj-1)*sNy
493 dimList(3,2)=myYGlobalLo+bj*sNy-1
494 #endif /* defined(ALLOW_EXCH2) && !defined(MISSING_TILE_IO) */
495 dimList(1,3)=nNz
496 dimList(2,3)=1
497 dimList(3,3)=nNz
498 nDims=3
499 IF ( nNz.EQ.1 ) nDims=2
500 map2gl(1) = iGjLoc
501 map2gl(2) = jGjLoc
502 CALL MDS_WRITE_META(
503 I metaFName, dataFName, the_run_name, ' ',
504 I filePrec, nDims,dimList,map2gl, 0, ' ',
505 I 0, UNSET_RL, irecord, myIter, myThid )
506 ENDIF
507 C End of bi,bj loops
508 ENDDO
509 ENDDO
510
511 C If global file was opened then close it
512 IF (fileIsOpen .AND. globalFile) THEN
513 CLOSE( dUnit )
514 fileIsOpen = .FALSE.
515 ENDIF
516
517 C- endif iAmDoingIO
518 ENDIF
519
520 C if useSingleCpuIO / else / end
521 ENDIF
522
523 C Create meta-file for the global-file (also if useSingleCpuIO)
524 IF ( writeMetaF .AND. iAmDoingIO .AND.
525 & (globalFile .OR. useSingleCpuIO) ) THEN
526 WRITE(metaFName,'(2A)') fName(1:IL),'.meta'
527 dimList(1,1)=x_size
528 dimList(2,1)=1
529 dimList(3,1)=x_size
530 dimList(1,2)=y_size
531 dimList(2,2)=1
532 dimList(3,2)=y_size
533 dimList(1,3)=nNz
534 dimList(2,3)=1
535 dimList(3,3)=nNz
536 nDims=3
537 IF ( nNz.EQ.1 ) nDims=2
538 map2gl(1) = 0
539 map2gl(2) = 1
540 CALL MDS_WRITE_META(
541 I metaFName, dataFName, the_run_name, ' ',
542 I filePrec, nDims,dimList,map2gl, 0, ' ',
543 I 0, UNSET_RL, irecord, myIter, myThid )
544 c I metaFName, dataFName, the_run_name, titleLine,
545 c I filePrec, nDims, dimList, map2gl, nFlds, fldList,
546 c I nTimRec, timList, irecord, myIter, myThid )
547 ENDIF
548
549 C To be safe, make other processes wait for I/O completion
550 _BARRIER
551
552 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
553 RETURN
554 END

  ViewVC Help
Powered by ViewVC 1.1.22