C $Header: /u/gcmpack/MITgcm/pkg/mdsio/mdsio_facef_read.F,v 1.4 2009/06/28 01:06:39 jmc Exp $ C $Name: $ #include "MDSIO_OPTIONS.h" C-- File mdsio_read_facefile.F: C-- Contents C-- o MDS_FACEF_READ_RS C-- o MDS_FACEF_READ_RL <- not yet coded C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| CBOP C !ROUTINE: MDS_FACEF_READ_RS C !INTERFACE: SUBROUTINE MDS_FACEF_READ_RS( I fName, fPrec, irec, U array, I bi,bj, myThid ) C !DESCRIPTION: \bv C *==========================================================* C | SUBROUTINE MDS_FACEF_READ_RS C *==========================================================* C | Read 1 field from a file which contains all the data from C | 1 "face" (= piece of domain with rectangular topology) C *==========================================================* C \ev C !USES: IMPLICIT NONE C === Global variables === #include "SIZE.h" #include "EEPARAMS.h" #ifdef ALLOW_EXCH2 #include "W2_EXCH2_SIZE.h" #include "W2_EXCH2_TOPOLOGY.h" #endif /* ALLOW_EXCH2 */ C !INPUT/OUTPUT PARAMETERS: C == Routine arguments == CHARACTER*(*) fName INTEGER fPrec INTEGER irec _RS array(1-Olx:sNx+Olx,1-Oly:sNy+Oly,nSx,nSy) INTEGER bi,bj, myThid CEOP C !FUNCTIONS: INTEGER MDS_RECLEN EXTERNAL INTEGER ILNBLNK EXTERNAL C !LOCAL VARIABLES: C == Local variables == INTEGER i,j, dUnit, iLen INTEGER length_of_rec CHARACTER*(MAX_LEN_MBUF) msgBuf #ifdef ALLOW_EXCH2 INTEGER tN, dNx, dNy, tBx, tBy, tNx, tNY, jj, jBase Real*4 ioBuf4(1:sNx*nSx*nPx+1) Real*8 ioBuf8(1:sNx*nSx*nPx+1) #else Real*4 ioBuf4(1:sNx+1,1:sNy+1) Real*8 ioBuf8(1:sNx+1,1:sNy+1) #endif /* ALLOW_EXCH2 */ iLen = ILNBLNK(fName) #ifdef ALLOW_EXCH2 C Figure out offset of tile within face tN = W2_myTileList(bi,bj) dNx = exch2_mydnx(tN) dNy = exch2_mydny(tN) tBx = exch2_tbasex(tN) tBy = exch2_tbasey(tN) tNx = exch2_tnx(tN) tNy = exch2_tny(tN) CALL MDSFINDUNIT( dUnit, myThid ) length_of_rec = MDS_RECLEN( fPrec, (dNx+1), myThid ) OPEN( dUnit, file=fName(1:iLen), status='old', & access='direct', recl=length_of_rec ) j = 0 jBase=(irec-1)*(dNy+1) IF ( fPrec.EQ.precFloat32 ) THEN DO jj=1+tBy,sNy+1+tBy READ(dUnit,rec=jj+jBase) (ioBuf4(i),i=1,dNx+1) #ifdef _BYTESWAPIO CALL MDS_BYTESWAPR4( (dNx+1), ioBuf4 ) #endif j = j+1 DO i=1,sNx+1 array(i,j,bi,bj) = ioBuf4(i+tBx) ENDDO ENDDO ELSEIF ( fPrec.EQ.precFloat64 ) THEN DO jj=1+tBy,sNy+1+tBy READ(dUnit,rec=jj+jBase) (ioBuf8(i),i=1,dNx+1) #ifdef _BYTESWAPIO CALL MDS_BYTESWAPR8( (dNx+1), ioBuf8 ) #endif j = j+1 DO i=1,sNx+1 array(i,j,bi,bj) = ioBuf8(i+tBx) ENDDO ENDDO ELSE WRITE(msgBuf,'(A,I8,A)') ' MDS_FACEF_READ_RS:', & fPrec, ' = illegal value for fPrec' CALL PRINT_ERROR( msgBuf, myThid ) STOP 'ABNORMAL END: S/R MDS_FACEF_READ_RS' ENDIF CLOSE( dUnit ) #else /* ALLOW_EXCH2 */ CALL MDSFINDUNIT( dUnit, myThid ) length_of_rec = MDS_RECLEN( fPrec, (sNx+1)*(sNy+1), myThid ) OPEN( dUnit, file=fName(1:iLen), status='old', & access='direct', recl=length_of_rec ) IF ( fPrec.EQ.precFloat32 ) THEN READ(dUnit, rec=irec) ioBuf4 #ifdef _BYTESWAPIO CALL MDS_BYTESWAPR4( (sNx+1)*(sNy+1), ioBuf4 ) #endif DO j=1,sNy+1 DO i=1,sNx+1 array(i,j,bi,bj) = ioBuf4(i,j) ENDDO ENDDO ELSEIF ( fPrec.EQ.precFloat64 ) THEN READ(dUnit, rec=irec) ioBuf8 #ifdef _BYTESWAPIO CALL MDS_BYTESWAPR8( (sNx+1)*(sNy+1), ioBuf8 ) #endif DO j=1,sNy+1 DO i=1,sNx+1 array(i,j,bi,bj) = ioBuf8(i,j) ENDDO ENDDO ELSE WRITE(msgBuf,'(A,I8,A)') ' MDS_FACEF_READ_RS:', & fPrec, ' = illegal value for fPrec' CALL PRINT_ERROR( msgBuf, myThid ) STOP 'ABNORMAL END: S/R MDS_FACEF_READ_RS' ENDIF CLOSE( dUnit ) #endif /* ALLOW_EXCH2 */ C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| RETURN END