C $Header: /u/gcmpack/MITgcm/model/src/load_grid_spacing.F,v 1.8 2011/12/12 19:00:10 jmc Exp $
C $Name:  $

#include "PACKAGES_CONFIG.h"
#include "CPP_OPTIONS.h"
#ifdef ALLOW_EXCH2
# include "W2_OPTIONS.h"
#endif /* ALLOW_EXCH2 */

C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
CBOP
C     !ROUTINE: LOAD_GRID_SPACING
C     !INTERFACE:
      SUBROUTINE LOAD_GRID_SPACING( myThid )

C     !DESCRIPTION:
C     load grid-spacing (vector array) delX, delY, delR or delRc from file.

C     !USES:
      IMPLICIT NONE
#include "SIZE.h"
#include "EEPARAMS.h"
#include "PARAMS.h"
#ifdef ALLOW_EXCH2
# include "W2_EXCH2_SIZE.h"
# include "W2_EXCH2_TOPOLOGY.h"
#endif /* ALLOW_EXCH2 */
#include "GRID.h"
#include "SET_GRID.h"

C     !INPUT/OUTPUT PARAMETERS:
C     myThid    :: my Thread Id. number
      INTEGER myThid
CEOP

C     !FUNCTIONS:
      INTEGER  ILNBLNK
      EXTERNAL 

C     !LOCAL VARIABLES:
C     msgBuf    :: Informational/error message buffer
C     delYsum   :: delY full-domain sum
      INTEGER iLen
      INTEGER i, j, n
      INTEGER gridNx, gridNy
      CHARACTER*(MAX_LEN_MBUF) msgBuf
      _RL delYsum

C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|

#ifdef ALLOW_EXCH2
      gridNx = exch2_mydNx(1)
      gridNy = exch2_mydNy(1)
#else /* ALLOW_EXCH2 */
      gridNx = Nx
      gridNy = Ny
#endif /* ALLOW_EXCH2 */

      _BEGIN_MASTER( myThid )

C--   X coordinate
      IF ( delXFile .NE. ' ' ) THEN
        iLen = ILNBLNK(delXFile)
        CALL READ_GLVEC_RL( delXFile, ' ', delX, gridNx, 1, myThid )
        WRITE(msgBuf,'(3A)') 'S/R LOAD_GRID_SPACING:',
     &    ' delX loaded from file: ', delXFile(1:iLen)
        CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
     &                      SQUEEZE_RIGHT , myThid )
      ENDIF

C--   Y coordinate
      IF ( delYFile .NE. ' ' ) THEN
        iLen = ILNBLNK(delYFile)
        CALL READ_GLVEC_RL( delYFile, ' ', delY, gridNy, 1, myThid )
        WRITE(msgBuf,'(3A)') 'S/R LOAD_GRID_SPACING:',
     &    ' delY loaded from file: ', delYFile(1:iLen)
        CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
     &                      SQUEEZE_RIGHT , myThid )
      ENDIF

C--   vertical coordinate "R"
      IF ( delRFile .NE. ' ' ) THEN
        iLen = ILNBLNK(delRFile)
        CALL READ_GLVEC_RL( delRFile, ' ', delR, Nr, 1, myThid )
        WRITE(msgBuf,'(3A)') 'S/R LOAD_GRID_SPACING:',
     &    ' delR loaded from file: ', delRFile(1:iLen)
        CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
     &                      SQUEEZE_RIGHT , myThid )
      ENDIF

      IF ( delRcFile .NE. ' ' ) THEN
        iLen = ILNBLNK(delRcFile)
        CALL READ_GLVEC_RL( delRcFile, ' ', delRc, Nr+1, 1, myThid )
        WRITE(msgBuf,'(3A)') 'S/R LOAD_GRID_SPACING:',
     &    ' delRc loaded from file: ', delRcFile(1:iLen)
        CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
     &                      SQUEEZE_RIGHT , myThid )
      ENDIF

C--   hybrid sigma vertical coordinate coefficient
      IF ( hybSigmFile .NE. ' ' ) THEN
        iLen = ILNBLNK(hybSigmFile)
        CALL READ_GLVEC_RS( hybSigmFile,' ',aHybSigmF,Nr+1, 1,myThid )
        CALL READ_GLVEC_RS( hybSigmFile,' ',bHybSigmF,Nr+1, 2,myThid )
        WRITE(msgBuf,'(3A)') 'S/R LOAD_GRID_SPACING:',
     &    ' a&b_HybSigmF loaded from file: ', hybSigmFile(1:iLen)
        CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
     &                      SQUEEZE_RIGHT , myThid )
      ENDIF

C--   Check horizontal grid-spacing
      IF ( .NOT.usingCurvilinearGrid ) THEN
C Note: To avoid multiple copies of the same code in several horiz.grid
C       initialisation S/R, check horiz.grid spacing here, after
C       loading delX,delY (and before calling any of these S/R).

C--   Check delX grid-spacing:
       n = 0
       DO i=1,gridNx
C-    check that delX has been set
        IF ( delX(i).EQ.UNSET_RL ) THEN
         n = n+1
         WRITE(msgBuf,'(2A,I5)') 'S/R LOAD_GRID_SPACING:',
     &       ' No value for delX at i =', i
         CALL PRINT_ERROR( msgBuf, myThid )
        ENDIF
C-    check that delX is > 0
        IF ( delX(i).LE.0. ) THEN
         n = n+1
         WRITE(msgBuf,'(2A,I5,A,1PE16.8,A)') 'S/R LOAD_GRID_SPACING:',
     &       ' delX(i=', i, ')=', delX(i), ' : MUST BE >0'
         CALL PRINT_ERROR( msgBuf, myThid )
        ENDIF
       ENDDO
       IF ( n.GE.1 ) THEN
         WRITE(msgBuf,'(2A,I5,A)') 'S/R LOAD_GRID_SPACING:',
     &       ' found', n, ' invalid delX values'
         CALL PRINT_ERROR( msgBuf, myThid )
         STOP 'ABNORMAL END: S/R LOAD_GRID_SPACING'
       ENDIF

C--   Check delY grid-spacing:
       n = 0
       DO j=1,gridNy
C-    check that delY has been set
        IF ( delY(j).EQ.UNSET_RL ) THEN
         n = n+1
         WRITE(msgBuf,'(2A,I5)') 'S/R LOAD_GRID_SPACING:',
     &       ' No value for delY at j =', j
         CALL PRINT_ERROR( msgBuf, myThid )
        ENDIF
C-    check that delY is > 0
        IF ( delY(j).LE.0. ) THEN
         n = n+1
         WRITE(msgBuf,'(2A,I5,A,1PE16.8,A)') 'S/R LOAD_GRID_SPACING:',
     &       ' delY(j=', j, ')=', delY(j), ' : MUST BE >0'
         CALL PRINT_ERROR( msgBuf, myThid )
        ENDIF
       ENDDO
       IF ( n.GE.1 ) THEN
         WRITE(msgBuf,'(2A,I5,A)') 'S/R LOAD_GRID_SPACING:',
     &       ' found', n, ' invalid delY values'
         CALL PRINT_ERROR( msgBuf, myThid )
         STOP 'ABNORMAL END: S/R LOAD_GRID_SPACING'
       ENDIF
C--   end of grid-spacing check (not usingCurvilinearGrid)
      ENDIF

C--   Set default (=whole domain) for where relaxation to climatology applies
      IF ( usingCartesianGrid .OR. usingSphericalPolarGrid ) THEN
        delYsum = 0.
        DO j=1,gridNy
          delYsum = delYsum + delY(j)
        ENDDO
        IF ( latBandClimRelax.EQ.UNSET_RL ) THEN
          latBandClimRelax = delYsum*3. _d 0
        ENDIF
      ENDIF

      _END_MASTER(myThid)
C--   Everyone else must wait for the parameters to be loaded
      _BARRIER

      RETURN
      END