C $Header: /u/gcmpack/MITgcm/pkg/exch2/exch2_get_scal_bounds.F,v 1.1 2009/05/30 21:22:13 jmc Exp $
C $Name: $
#include "CPP_EEOPTIONS.h"
CBOP 0
C !ROUTINE: EXCH2_GET_SCAL_BOUNDS
C !INTERFACE:
SUBROUTINE EXCH2_GET_SCAL_BOUNDS(
I fCode, eWdth, updateCorners,
I tgTile, tgNb,
O tIlo, tIhi, tJlo, tJhi,
O tiStride, tjStride,
I myThid )
C !DESCRIPTION:
C Return the index range & step of the part of the array (overlap-region)
C which is going to be updated by the exchange with 1 neighbour.
C Scalar field version (as opposed to 2-components vector field).
C Note: presently only coded for grid-centered (mass point) scalar.
C needs to extend it to grid-corner (vorticity point) scalar.
C !USES:
IMPLICIT NONE
#include "SIZE.h"
#include "W2_EXCH2_SIZE.h"
#include "W2_EXCH2_TOPOLOGY.h"
C !INPUT/OUTPUT PARAMETERS:
C fCode :: field code (position on staggered grid)
C eWdth :: width of data region to exchange
C updateCorners :: flag, do update corner halo region if true
C tgTile :: target tile
C tgNb :: target Neighbour entry
C tIlo, tIhi :: index range in I that will be filled in target array
C tJlo, tJhi :: index range in J that will be filled in target array
C tiStride :: index step in I that will be filled in target array
C tjStride :: index step in J that will be filled in target array
C myThid :: my Thread Id. number
CHARACTER*2 fCode
INTEGER eWdth
LOGICAL updateCorners
INTEGER tgTile, tgNb
INTEGER tIlo, tIhi, tJlo, tJhi
INTEGER tiStride, tjStride
INTEGER myThid
C !LOCAL VARIABLES:
CEOP
C--- Initialise index range from Topology values:
tIlo = exch2_iLo(tgNb,tgTile)
tIhi = exch2_iHi(tgNb,tgTile)
tJlo = exch2_jLo(tgNb,tgTile)
tJhi = exch2_jHi(tgNb,tgTile)
C--- Expand index range according to exchange-Width "eWdth"
IF ( tIlo .EQ. tIhi .AND. tIlo .EQ. 0 ) THEN
C Filling a west edge overlap
tIlo = 1-eWdth
tiStride = 1
IF ( tJlo .LE. tJhi ) THEN
tjStride = 1
ELSE
tjStride =-1
ENDIF
IF ( updateCorners ) THEN
tJlo = tJlo-tjStride*(eWdth-1)
tJhi = tJhi+tjStride*(eWdth-1)
ELSE
tJlo = tJlo+tjStride
tJhi = tJhi-tjStride
ENDIF
ENDIF
IF ( tIlo .EQ. tIhi .AND. tIlo .GT. 1 ) THEN
C Filling an east edge overlap
tIhi = tIhi+eWdth-1
tiStride = 1
IF ( tJlo .LE. tJhi ) THEN
tjStride = 1
ELSE
tjStride =-1
ENDIF
IF ( updateCorners ) THEN
tJlo = tJlo-tjStride*(eWdth-1)
tJhi = tJhi+tjStride*(eWdth-1)
ELSE
tJlo = tJlo+tjStride
tJhi = tJhi-tjStride
ENDIF
ENDIF
IF ( tJlo .EQ. tJhi .AND. tJlo .EQ. 0 ) THEN
C Filling a south edge overlap
tJlo = 1-eWdth
tjStride = 1
IF ( tIlo .LE. tIhi ) THEN
tiStride = 1
ELSE
tiStride =-1
ENDIF
IF ( updateCorners ) THEN
tIlo = tIlo-tiStride*(eWdth-1)
tIhi = tIhi+tiStride*(eWdth-1)
ELSE
tIlo = tIlo+tiStride
tIhi = tIhi-tiStride
ENDIF
ENDIF
IF ( tJlo .EQ. tJhi .AND. tJlo .GT. 1 ) THEN
C Filling a north edge overlap
tJhi = tJhi+eWdth-1
tjStride = 1
IF ( tIlo .LE. tIhi ) THEN
tiStride = 1
ELSE
tiStride =-1
ENDIF
IF ( updateCorners ) THEN
tIlo = tIlo-tiStride*(eWdth-1)
tIhi = tIhi+tiStride*(eWdth-1)
ELSE
tIlo = tIlo+tiStride
tIhi = tIhi-tiStride
ENDIF
ENDIF
RETURN
END