C $Header: /u/gcmpack/MITgcm/pkg/exch2/w2_set_gen_facets.F,v 1.3 2010/10/14 17:34:35 jahn Exp $
C $Name: $
#include "CPP_EEOPTIONS.h"
#include "W2_OPTIONS.h"
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
CBOP 0
C !ROUTINE: W2_SET_GEN_FACETS( myThid )
C !INTERFACE:
SUBROUTINE W2_SET_GEN_FACETS( myThid )
C !DESCRIPTION:
C Set-up multi-facets (=sub-domain) topology : general case
C process topology information from "data.exch2" (facet_dims,facet_link)
C !USES:
IMPLICIT NONE
C Tile topology settings data structures
#include "SIZE.h"
#include "EEPARAMS.h"
#include "W2_EXCH2_SIZE.h"
#include "W2_EXCH2_PARAMS.h"
#include "W2_EXCH2_TOPOLOGY.h"
C !INPUT PARAMETERS:
C myThid :: my Thread Id number
C (Note: not relevant since threading has not yet started)
INTEGER myThid
C !LOCAL VARIABLES:
C === Local variables ===
C msgBuf :: Informational/error message buffer
CHARACTER*(MAX_LEN_MBUF) msgBuf
CHARACTER*1 edge(4)
INTEGER i,j,jj,fNx,fNy
INTEGER errCnt
CEOP
DATA edge / 'N' , 'S' , 'E' , 'W' /
WRITE(msgBuf,'(2A,I3,A)') 'W2_SET_GEN_FACETS:',
& ' preDefTopol=', preDefTopol, ' selected'
CALL PRINT_MESSAGE( msgBuf, W2_oUnit,SQUEEZE_RIGHT,myThid )
C count Nb of Facets (from facet_dims) ; set nFacets
C Assume: consecutive pair (x-dim,y-dim) of non-zero dimension
errCnt = 0
nFacets = 0
C find last pair of non-zero dims
DO j=1,W2_maxNbFacets
fNx = facet_dims(2*j-1)
fNy = facet_dims( 2*j )
C IF ( nFacets.EQ.0 .AND. fNx*fNy.EQ.0 ) THEN
IF ( fNx.NE.0 .AND. fNy.NE.0 ) THEN
nFacets = j
ELSEIF ( fNx.NE.0 .OR. fNy.NE.0 ) THEN
errCnt = errCnt + 1
WRITE(msgBuf,'(A,I3,A,2I6)')
& 'dimsFacets: Expect pair of >0 dims : facet',j,
& ' :',fNx,fNy
CALL PRINT_ERROR( msgBuf, myThid )
ENDIF
ENDDO
IF ( nFacets.EQ.0 ) THEN
errCnt = errCnt + 1
WRITE(msgBuf,'(A)')
& 'dimsFacets: All dimensions are zero!'
CALL PRINT_ERROR( msgBuf, myThid )
ENDIF
IF ( errCnt.GT.0 ) THEN
WRITE(msgBuf,'(A,I3,A)') 'W2_SET_GEN_FACETS: found', errCnt,
& ' errors in dimsFacets list'
CALL PRINT_ERROR( msgBuf, myThid )
STOP 'ABNORMAL END: W2_SET_GEN_FACETS (dimsFacets list)'
ENDIF
C- print out Nb of facets:
WRITE(msgBuf,'(A,I3,A)')
& 'W2_SET_GEN_FACETS: Number of facets =', nFacets,
& ' (inferred from "dimsFacets")'
CALL PRINT_MESSAGE( msgBuf, W2_oUnit, SQUEEZE_RIGHT, myThid )
C- Check remaining part of the list:
errCnt = 0
DO jj=2*nFacets+1,2*W2_maxNbFacets
IF ( facet_dims(jj).NE.0 ) THEN
errCnt = errCnt + 1
WRITE(msgBuf,'(A,I3,A,I5,A)') ' dimsFacets(j=',jj,') =',
& facet_dims(jj), ' : beyond end of list (=1rst zero)'
CALL PRINT_ERROR( msgBuf, myThid )
ENDIF
ENDDO
C- check sign
DO jj=1,2*nFacets
IF ( facet_dims(jj).LT.0 ) THEN
errCnt = errCnt + 1
i=1+MOD(jj-1,2)
j = (jj+1)/2
WRITE(msgBuf,'(A,I2,A,I3,A,I6,A)') 'dimension', i,
& ' of facet', j, ' =', facet_dims(jj), ' : invalid (< 0)'
CALL PRINT_ERROR( msgBuf, myThid )
ENDIF
ENDDO
IF ( errCnt.GT.0 ) THEN
WRITE(msgBuf,'(A,I3,A)') 'W2_SET_GEN_FACETS: found', errCnt,
& ' invalid dims'
CALL PRINT_ERROR( msgBuf, myThid )
STOP 'ABNORMAL END: W2_SET_GEN_FACETS (dimsFacets list)'
ENDIF
C check "facet_link" list:
errCnt = 0
DO j=nFacets+1,W2_maxNbFacets
DO i=1,4
IF ( facet_link(i,j).NE.0 ) THEN
errCnt = errCnt + 1
WRITE(msgBuf,'(3A,I3,A,F6.2,A)')
& 'Link for ',edge(i), '.Edge of facet #',j,
& ' (facetEdgeLink=',facet_link(i,j),')'
CALL PRINT_ERROR( msgBuf, myThid )
WRITE(msgBuf,'(A,I3,A)')
& ' is beyond range (> nFacets=',nFacets,')'
CALL PRINT_ERROR( msgBuf, myThid )
ENDIF
ENDDO
ENDDO
IF ( errCnt.GT.0 ) THEN
WRITE(msgBuf,'(A,I3,A)') 'W2_SET_GEN_FACETS: found', errCnt,
& ' errors in facetEdgeLink list'
CALL PRINT_ERROR( msgBuf, myThid )
STOP 'ABNORMAL END: W2_SET_GEN_FACETS (facetEdgeLink list)'
ENDIF
RETURN
END