117 |
INTEGER length_of_rec |
INTEGER length_of_rec |
118 |
Real*4 r4seg(sNx) |
Real*4 r4seg(sNx) |
119 |
Real*8 r8seg(sNx) |
Real*8 r8seg(sNx) |
120 |
|
Real*4 r4loc(sNx,sNy) |
121 |
|
Real*8 r8loc(sNx,sNy) |
122 |
INTEGER tNx, tNy, global_nTx |
INTEGER tNx, tNy, global_nTx |
123 |
INTEGER tBx, tBy, iGjLoc, jGjLoc |
INTEGER tBx, tBy, iGjLoc, jGjLoc |
124 |
#ifdef ALLOW_EXCH2 |
#ifdef ALLOW_EXCH2 |
201 |
C Master thread of process 0, only, opens a global file |
C Master thread of process 0, only, opens a global file |
202 |
IF ( iAmDoingIO ) THEN |
IF ( iAmDoingIO ) THEN |
203 |
WRITE(dataFName,'(2a)') fName(1:IL),'.data' |
WRITE(dataFName,'(2a)') fName(1:IL),'.data' |
204 |
length_of_rec=MDS_RECLEN(filePrec,xSize*ySize,myThid) |
length_of_rec = MDS_RECLEN( filePrec, xSize*ySize, myThid ) |
205 |
IF (irecord .EQ. 1) THEN |
IF (irecord .EQ. 1) THEN |
206 |
OPEN( dUnit, file=dataFName, status=_NEW_STATUS, |
OPEN( dUnit, file=dataFName, status=_NEW_STATUS, |
207 |
& access='direct', recl=length_of_rec ) |
& access='direct', recl=length_of_rec ) |
217 |
C- copy from arr(level=k) to 2-D "local": |
C- copy from arr(level=k) to 2-D "local": |
218 |
IF ( filePrec.EQ.precFloat32 ) THEN |
IF ( filePrec.EQ.precFloat32 ) THEN |
219 |
IF ( arrType.EQ.'RS' ) THEN |
IF ( arrType.EQ.'RS' ) THEN |
220 |
CALL MDS_PASS_R4toRS( sharedLocBuf_r4, |
CALL MDS_PASS_R4toRS( sharedLocBuf_r4, arr, |
221 |
& arr, k, kSize, .FALSE., myThid ) |
I k, kSize, 0,0, .FALSE., myThid ) |
222 |
ELSEIF ( arrType.EQ.'RL' ) THEN |
ELSEIF ( arrType.EQ.'RL' ) THEN |
223 |
CALL MDS_PASS_R4toRL( sharedLocBuf_r4, |
CALL MDS_PASS_R4toRL( sharedLocBuf_r4, arr, |
224 |
& arr, k, kSize, .FALSE., myThid ) |
I k, kSize, 0,0, .FALSE., myThid ) |
225 |
ELSE |
ELSE |
226 |
WRITE(msgBuf,'(A)') |
WRITE(msgBuf,'(A)') |
227 |
& ' MDS_WRITE_FIELD: illegal value for arrType' |
& ' MDS_WRITE_FIELD: illegal value for arrType' |
235 |
I useExch2ioLayOut, zeroBuff, myThid ) |
I useExch2ioLayOut, zeroBuff, myThid ) |
236 |
ELSEIF ( filePrec.EQ.precFloat64 ) THEN |
ELSEIF ( filePrec.EQ.precFloat64 ) THEN |
237 |
IF ( arrType.EQ.'RS' ) THEN |
IF ( arrType.EQ.'RS' ) THEN |
238 |
CALL MDS_PASS_R8toRS( sharedLocBuf_r8, |
CALL MDS_PASS_R8toRS( sharedLocBuf_r8, arr, |
239 |
& arr, k, kSize, .FALSE., myThid ) |
I k, kSize, 0,0, .FALSE., myThid ) |
240 |
ELSEIF ( arrType.EQ.'RL' ) THEN |
ELSEIF ( arrType.EQ.'RL' ) THEN |
241 |
CALL MDS_PASS_R8toRL( sharedLocBuf_r8, |
CALL MDS_PASS_R8toRL( sharedLocBuf_r8, arr, |
242 |
& arr, k, kSize, .FALSE., myThid ) |
I k, kSize, 0,0, .FALSE., myThid ) |
243 |
ELSE |
ELSE |
244 |
WRITE(msgBuf,'(A)') |
WRITE(msgBuf,'(A)') |
245 |
& ' MDS_WRITE_FIELD: illegal value for arrType' |
& ' MDS_WRITE_FIELD: illegal value for arrType' |
259 |
ENDIF |
ENDIF |
260 |
|
|
261 |
IF ( iAmDoingIO ) THEN |
IF ( iAmDoingIO ) THEN |
262 |
irec=k+1-kLo+nNz*(irecord-1) |
irec = 1 + k-kLo + (irecord-1)*nNz |
263 |
IF (filePrec .EQ. precFloat32) THEN |
IF (filePrec .EQ. precFloat32) THEN |
264 |
#ifdef _BYTESWAPIO |
#ifdef _BYTESWAPIO |
265 |
CALL MDS_BYTESWAPR4( xSize*ySize, xy_buffer_r4 ) |
CALL MDS_BYTESWAPR4( xSize*ySize, xy_buffer_r4 ) |
296 |
C If we are writing to a global file then we open it here |
C If we are writing to a global file then we open it here |
297 |
IF (globalFile) THEN |
IF (globalFile) THEN |
298 |
WRITE(dataFName,'(2a)') fName(1:IL),'.data' |
WRITE(dataFName,'(2a)') fName(1:IL),'.data' |
299 |
|
length_of_rec = MDS_RECLEN( filePrec, sNx, myThid ) |
300 |
IF (irecord .EQ. 1) THEN |
IF (irecord .EQ. 1) THEN |
|
length_of_rec=MDS_RECLEN( filePrec, sNx, myThid ) |
|
301 |
OPEN( dUnit, file=dataFName, status=_NEW_STATUS, |
OPEN( dUnit, file=dataFName, status=_NEW_STATUS, |
302 |
& access='direct', recl=length_of_rec ) |
& access='direct', recl=length_of_rec ) |
|
fileIsOpen=.TRUE. |
|
303 |
ELSE |
ELSE |
|
length_of_rec=MDS_RECLEN( filePrec, sNx, myThid ) |
|
304 |
OPEN( dUnit, file=dataFName, status=_OLD_STATUS, |
OPEN( dUnit, file=dataFName, status=_OLD_STATUS, |
305 |
& access='direct', recl=length_of_rec ) |
& access='direct', recl=length_of_rec ) |
|
fileIsOpen=.TRUE. |
|
306 |
ENDIF |
ENDIF |
307 |
|
fileIsOpen=.TRUE. |
308 |
ENDIF |
ENDIF |
309 |
|
|
310 |
C Loop over all tiles |
C Loop over all tiles |
311 |
DO bj=1,nSy |
DO bj=1,nSy |
312 |
DO bi=1,nSx |
DO bi=1,nSx |
|
C If we are writing to a tiled MDS file then we open each one here |
|
|
IF (.NOT. globalFile) THEN |
|
|
iG=bi+(myXGlobalLo-1)/sNx |
|
|
jG=bj+(myYGlobalLo-1)/sNy |
|
|
WRITE(dataFName,'(2A,I3.3,A,I3.3,A)') |
|
|
& pfName(1:pIL),'.',iG,'.',jG,'.data' |
|
|
IF (irecord .EQ. 1) THEN |
|
|
length_of_rec=MDS_RECLEN( filePrec, sNx, myThid ) |
|
|
OPEN( dUnit, file=dataFName, status=_NEW_STATUS, |
|
|
& access='direct', recl=length_of_rec ) |
|
|
fileIsOpen=.TRUE. |
|
|
ELSE |
|
|
length_of_rec=MDS_RECLEN( filePrec, sNx, myThid ) |
|
|
OPEN( dUnit, file=dataFName, status=_OLD_STATUS, |
|
|
& access='direct', recl=length_of_rec ) |
|
|
fileIsOpen=.TRUE. |
|
|
ENDIF |
|
|
ENDIF |
|
313 |
|
|
314 |
IF (fileIsOpen) THEN |
tNx = sNx |
315 |
tNx = sNx |
tNy = sNy |
316 |
tNy = sNy |
global_nTx = xSize/sNx |
317 |
global_nTx = xSize/sNx |
tBx = myXGlobalLo-1 + (bi-1)*sNx |
318 |
tBx = myXGlobalLo-1 + (bi-1)*sNx |
tBy = myYGlobalLo-1 + (bj-1)*sNy |
|
tBy = myYGlobalLo-1 + (bj-1)*sNy |
|
319 |
#ifdef ALLOW_EXCH2 |
#ifdef ALLOW_EXCH2 |
320 |
IF ( useExch2ioLayOut ) THEN |
IF ( useExch2ioLayOut ) THEN |
321 |
tN = W2_myTileList(bi) |
tN = W2_myTileList(bi) |
322 |
c tNx = exch2_tNx(tN) |
c tNx = exch2_tNx(tN) |
323 |
c tNy = exch2_tNy(tN) |
c tNy = exch2_tNy(tN) |
324 |
c global_nTx = exch2_global_Nx/tNx |
c global_nTx = exch2_global_Nx/tNx |
325 |
tBx = exch2_txGlobalo(tN) - 1 |
tBx = exch2_txGlobalo(tN) - 1 |
326 |
tBy = exch2_tyGlobalo(tN) - 1 |
tBy = exch2_tyGlobalo(tN) - 1 |
327 |
IF ( exch2_mydNx(tN) .GT. xSize ) THEN |
IF ( exch2_mydNx(tN) .GT. xSize ) THEN |
328 |
C- face x-size larger than glob-size : fold it |
C- face x-size larger than glob-size : fold it |
329 |
iGjLoc = 0 |
iGjLoc = 0 |
330 |
jGjLoc = exch2_mydNx(tN) / xSize |
jGjLoc = exch2_mydNx(tN) / xSize |
331 |
ELSEIF ( exch2_tNy(tN) .GT. ySize ) THEN |
ELSEIF ( exch2_tNy(tN) .GT. ySize ) THEN |
332 |
C- tile y-size larger than glob-size : make a long line |
C- tile y-size larger than glob-size : make a long line |
333 |
iGjLoc = exch2_mydNx(tN) |
iGjLoc = exch2_mydNx(tN) |
334 |
jGjLoc = 0 |
jGjLoc = 0 |
335 |
ELSE |
ELSE |
336 |
C- default (face fit into global-IO-array) |
C- default (face fit into global-IO-array) |
337 |
iGjLoc = 0 |
iGjLoc = 0 |
338 |
jGjLoc = 1 |
jGjLoc = 1 |
339 |
ENDIF |
ENDIF |
340 |
ENDIF |
ENDIF |
341 |
#endif /* ALLOW_EXCH2 */ |
#endif /* ALLOW_EXCH2 */ |
342 |
DO k=1,nNz |
|
343 |
|
IF (globalFile) THEN |
344 |
|
C--- Case of 1 Global file: |
345 |
|
|
346 |
|
DO k=kLo,kHi |
347 |
DO j=1,tNy |
DO j=1,tNy |
348 |
IF (globalFile) THEN |
irec = 1 + ( tBx + (j-1)*iGjLoc )/tNx |
349 |
irec = 1 + ( tBx + (j-1)*iGjLoc )/tNx |
& + ( tBy + (j-1)*jGjLoc )*global_nTx |
350 |
& + ( tBy + (j-1)*jGjLoc )*global_nTx |
& +( k-kLo + (irecord-1)*nNz )*global_nTx*ySize |
|
& +( k-kLo + (irecord-1)*nNz )*global_nTx*ySize |
|
|
ELSE |
|
|
irec = j + ( k-kLo + (irecord-1)*nNz )*sNy |
|
|
ENDIF |
|
351 |
IF (filePrec .EQ. precFloat32) THEN |
IF (filePrec .EQ. precFloat32) THEN |
352 |
IF (arrType .EQ. 'RS') THEN |
IF (arrType .EQ. 'RS') THEN |
353 |
CALL MDS_SEG4toRS( j,bi,bj,k,kSize, r4seg,.FALSE.,arr ) |
CALL MDS_SEG4toRS( j,bi,bj,k,kSize, r4seg,.FALSE.,arr ) |
388 |
ENDDO |
ENDDO |
389 |
C End of k loop |
C End of k loop |
390 |
ENDDO |
ENDDO |
391 |
|
|
392 |
ELSE |
ELSE |
393 |
C fileIsOpen=F |
C--- Case of 1 file per tile (globalFile=F): |
394 |
WRITE(msgBuf,'(A)') |
|
395 |
& ' MDS_WRITE_FIELD: I should never get to this point' |
C If we are writing to a tiled MDS file then we open each one here |
396 |
CALL PRINT_ERROR( msgBuf, myThid ) |
iG=bi+(myXGlobalLo-1)/sNx |
397 |
STOP 'ABNORMAL END: S/R MDS_WRITE_FIELD' |
jG=bj+(myYGlobalLo-1)/sNy |
398 |
ENDIF |
WRITE(dataFName,'(2A,I3.3,A,I3.3,A)') |
399 |
C If we were writing to a tiled MDS file then we close it here |
& pfName(1:pIL),'.',iG,'.',jG,'.data' |
400 |
IF (fileIsOpen .AND. (.NOT. globalFile)) THEN |
length_of_rec = MDS_RECLEN( filePrec, sNx*sNy, myThid ) |
401 |
CLOSE( dUnit ) |
IF (irecord .EQ. 1) THEN |
402 |
fileIsOpen = .FALSE. |
OPEN( dUnit, file=dataFName, status=_NEW_STATUS, |
403 |
|
& access='direct', recl=length_of_rec ) |
404 |
|
ELSE |
405 |
|
OPEN( dUnit, file=dataFName, status=_OLD_STATUS, |
406 |
|
& access='direct', recl=length_of_rec ) |
407 |
|
ENDIF |
408 |
|
fileIsOpen=.TRUE. |
409 |
|
|
410 |
|
DO k=kLo,kHi |
411 |
|
|
412 |
|
irec = 1 + k-kLo + (irecord-1)*nNz |
413 |
|
IF (filePrec .EQ. precFloat32) THEN |
414 |
|
IF ( arrType.EQ.'RS' ) THEN |
415 |
|
CALL MDS_PASS_R4toRS( r4loc, arr, |
416 |
|
I k, kSize, bi,bj,.FALSE., myThid ) |
417 |
|
ELSEIF ( arrType.EQ.'RL' ) THEN |
418 |
|
CALL MDS_PASS_R4toRL( r4loc, arr, |
419 |
|
I k, kSize, bi,bj,.FALSE., myThid ) |
420 |
|
ELSE |
421 |
|
WRITE(msgBuf,'(A)') |
422 |
|
& ' MDS_WRITE_FIELD: illegal value for arrType' |
423 |
|
CALL PRINT_ERROR( msgBuf, myThid ) |
424 |
|
STOP 'ABNORMAL END: S/R MDS_WRITE_FIELD' |
425 |
|
ENDIF |
426 |
|
#ifdef _BYTESWAPIO |
427 |
|
CALL MDS_BYTESWAPR4( sNx*sNy, r4loc ) |
428 |
|
#endif |
429 |
|
WRITE(dUnit,rec=irec) r4loc |
430 |
|
ELSEIF (filePrec .EQ. precFloat64) THEN |
431 |
|
IF ( arrType.EQ.'RS' ) THEN |
432 |
|
CALL MDS_PASS_R8toRS( r8loc, arr, |
433 |
|
I k, kSize, bi,bj,.FALSE., myThid ) |
434 |
|
ELSEIF ( arrType.EQ.'RL' ) THEN |
435 |
|
CALL MDS_PASS_R8toRL( r8loc, arr, |
436 |
|
I k, kSize, bi,bj,.FALSE., myThid ) |
437 |
|
ELSE |
438 |
|
WRITE(msgBuf,'(A)') |
439 |
|
& ' MDS_WRITE_FIELD: illegal value for arrType' |
440 |
|
CALL PRINT_ERROR( msgBuf, myThid ) |
441 |
|
STOP 'ABNORMAL END: S/R MDS_WRITE_FIELD' |
442 |
|
ENDIF |
443 |
|
#ifdef _BYTESWAPIO |
444 |
|
CALL MDS_BYTESWAPR8( sNx*sNy, r8loc ) |
445 |
|
#endif |
446 |
|
WRITE(dUnit,rec=irec) r8loc |
447 |
|
ELSE |
448 |
|
WRITE(msgBuf,'(A)') |
449 |
|
& ' MDS_WRITE_FIELD: illegal value for filePrec' |
450 |
|
CALL PRINT_ERROR( msgBuf, myThid ) |
451 |
|
STOP 'ABNORMAL END: S/R MDS_WRITE_FIELD' |
452 |
|
ENDIF |
453 |
|
|
454 |
|
C End of k loop |
455 |
|
ENDDO |
456 |
|
|
457 |
|
C here We close the tiled MDS file |
458 |
|
IF ( fileIsOpen ) THEN |
459 |
|
CLOSE( dUnit ) |
460 |
|
fileIsOpen = .FALSE. |
461 |
|
ENDIF |
462 |
|
|
463 |
|
C--- End Global File / tile-file cases |
464 |
ENDIF |
ENDIF |
465 |
|
|
466 |
C Create meta-file for each tile if we are tiling |
C Create meta-file for each tile if we are tiling |
467 |
IF ( .NOT.globalFile .AND. writeMetaF ) THEN |
IF ( .NOT.globalFile .AND. writeMetaF ) THEN |
468 |
iG=bi+(myXGlobalLo-1)/sNx |
iG=bi+(myXGlobalLo-1)/sNx |
478 |
dimList(1,3) = nNz |
dimList(1,3) = nNz |
479 |
dimList(2,3) = 1 |
dimList(2,3) = 1 |
480 |
dimList(3,3) = nNz |
dimList(3,3) = nNz |
481 |
|
c dimList(1,3) = kSize |
482 |
|
c dimList(2,3) = kLo |
483 |
|
c dimList(3,3) = kHi |
484 |
nDims = 3 |
nDims = 3 |
485 |
IF ( nNz.EQ.1 ) nDims = 2 |
IF ( nNz.EQ.1 ) nDims = 2 |
486 |
map2gl(1) = iGjLoc |
map2gl(1) = iGjLoc |
490 |
I filePrec, nDims,dimList,map2gl, 0, ' ', |
I filePrec, nDims,dimList,map2gl, 0, ' ', |
491 |
I 0, UNSET_RL, irecord, myIter, myThid ) |
I 0, UNSET_RL, irecord, myIter, myThid ) |
492 |
ENDIF |
ENDIF |
493 |
|
|
494 |
C End of bi,bj loops |
C End of bi,bj loops |
495 |
ENDDO |
ENDDO |
496 |
ENDDO |
ENDDO |
520 |
dimList(1,3) = nNz |
dimList(1,3) = nNz |
521 |
dimList(2,3) = 1 |
dimList(2,3) = 1 |
522 |
dimList(3,3) = nNz |
dimList(3,3) = nNz |
523 |
|
c dimList(1,3) = kSize |
524 |
|
c dimList(2,3) = kLo |
525 |
|
c dimList(3,3) = kHi |
526 |
nDims = 3 |
nDims = 3 |
527 |
IF ( nNz.EQ.1 ) nDims = 2 |
IF ( nNz.EQ.1 ) nDims = 2 |
528 |
map2gl(1) = 0 |
map2gl(1) = 0 |