C $Header: /home/ubuntu/mnt/e9_copy/MITgcm/pkg/debug/debug_cs_corner_uv.F,v 1.3 2005/02/10 23:44:06 jmc Exp $ C $Name: checkpoint58b_post $ #include "DEBUG_OPTIONS.h" SUBROUTINE DEBUG_CS_CORNER_UV( I word2print, I uFld, vFld, I k, ioUnit, bi,bj, myThid) C *==========================================================* C | S/R DEBUG_CS_CORNER_UV | C | o check UV fields at Egdes of CS grid, near corners. | C *==========================================================* C | Values of U,V fields at the Edges of the CS grid | C | are common to 2 faces, and are stored + used in 2 | C | places (2 tiles): one in the interior of the 1rst tile, | C | the other in the halo of the 2nd one. | C | This S/R print the 2 values and check that they are | C | identical (print the difference). | C | This is specially usefull for checking that gU,gV are | C | correct before entering solve_for_pressure. | C *==========================================================* C | Note: only works on a 1.cpu set up with square tiles | C *==========================================================* IMPLICIT NONE C == Global variables == #include "SIZE.h" #include "EEPARAMS.h" #ifdef ALLOW_EXCH2 #include "W2_EXCH2_TOPOLOGY.h" #include "W2_EXCH2_PARAMS.h" #endif c #include "PARAMS.h" c #include "GRID.h" C == Routine arguments == C word2print - a string to print C uFld - u component of 2D vector C vFld - v component of 2D vector C k - current level C ioUnit - I/O unit number C bi,bj - tile indices C myThid - Instance number for this invocation of CHARACTER*(*) word2print _RL uFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy) _RL vFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy) INTEGER k, ioUnit INTEGER bi, bj INTEGER myThid #ifdef ALLOW_DEBUG C == Local variables in common block : COMMON / DEBUG_CS_CORNER_UV_LOCAL / tmpU, tmpV _RL tmpU(4,Nr,nSx,nSy) _RL tmpV(4,Nr,nSx,nSy) C == Local variables == C edgeIndex :: index (in X or Y) from the W. or S. edge of the tile C :: of the U,V field to write C n1 :: tile index C n2,n3 :: W. and S. neigbour tile indices INTEGER n,n1,n2,n3 INTEGER edgeIndex INTEGER ic, j EXTERNAL ILNBLNK INTEGER ILNBLNK C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| edgeIndex = 1 j = MIN(MAX(1-Olx,edgeIndex),Olx) 1010 FORMAT(2A,I2,1PE12.4,I3,1P2E12.4) c IF (k.EQ.4 .AND. myIter.EQ.nIter0 ) THEN tmpU(1,k,bi,bj)= uFld(j,1) tmpU(2,k,bi,bj)= uFld(j,sNy) tmpU(3,k,bi,bj)= uFld(sNx+j,1) tmpU(4,k,bi,bj)= uFld(sNx+j,sNy) tmpV(1,k,bi,bj)= vFld(1,j) tmpV(2,k,bi,bj)= vFld(sNx,j) tmpV(3,k,bi,bj)= vFld(1,sNy+j) tmpV(4,k,bi,bj)= vFld(sNx,sNy+j) _BARRIER #ifdef ALLOW_EXCH2 IF (bi.EQ.nSx .AND. sNx.EQ.sNy) THEN #else /* ALLOW_EXCH2 */ IF (bi.EQ.nSx .AND. nSx.EQ.6) THEN #endif /* ALLOW_EXCH2 */ WRITE(ioUnit,'(2A)') 'DEBUG_CS_CORNER_UV: ', & '------------------------------------------------------------' ic = MAX(1,ILNBLNK(word2print)) WRITE(ioUnit,'(3A,I3)') 'DEBUG_CS_CORNER_UV: ', & word2print(1:ic), ' , index=', j WRITE(ioUnit,'(2A,I4)') 'DEBUG_CS_CORNER_UV: ', & ' Edges values near a corner, lev=',k WRITE(ioUnit,'(2A)') 'DEBUG_CS_CORNER_UV: ', & ' tile_1, value_1, tile_2, value_2, difference v1-v2:' DO n=1,nSx #ifdef ALLOW_EXCH2 n1 = W2_myTileList(n) n2 = exch2_neighbourId(4,n1) n3 = exch2_neighbourId(2,n1) IF ( exch2_pj(1,4,n1).eq.-1 ) THEN WRITE(ioUnit,1010) 'DEBUG_CS_CORNER_UV: ', 'W edge, S:', & n1,tmpU(1,k,n1,1), n2,tmpV(4,k,n2,1), & tmpU(1,k,n1,1) - tmpV(4,k,n2,1) WRITE(ioUnit,1010) 'DEBUG_CS_CORNER_UV: ', 'W edge, N:', & n1,tmpU(2,k,n1,1), n2,tmpV(3,k,n2,1), & tmpU(2,k,n1,1) - tmpV(3,k,n2,1) ENDIF IF ( exch2_pj(2,4,n1).eq.1 ) THEN WRITE(ioUnit,1010) 'DEBUG_CS_CORNER_UV: ', 'W edge, S:', & n1,tmpU(1,k,n1,1), n2,tmpU(3,k,n2,1), & tmpU(1,k,n1,1) - tmpU(3,k,n2,1) WRITE(ioUnit,1010) 'DEBUG_CS_CORNER_UV: ', 'W edge, N:', & n1,tmpU(2,k,n1,1), n2,tmpU(4,k,n2,1), & tmpU(2,k,n1,1) - tmpU(4,k,n2,1) ENDIF IF ( exch2_pi(1,2,n1).eq.1 ) THEN WRITE(ioUnit,1010) 'DEBUG_CS_CORNER_UV: ', 'S edge, W:', & n1,tmpV(1,k,n1,1), n3,tmpV(3,k,n3,1), & tmpV(1,k,n1,1) - tmpV(3,k,n3,1) WRITE(ioUnit,1010) 'DEBUG_CS_CORNER_UV: ', 'S edge, E:', & n1,tmpV(2,k,n1,1), n3,tmpV(4,k,n3,1), & tmpV(2,k,n1,1) - tmpV(4,k,n3,1) ENDIF IF ( exch2_pi(2,2,n1).eq.-1 ) THEN WRITE(ioUnit,1010) 'DEBUG_CS_CORNER_UV: ', 'S edge, W:', & n1,tmpV(1,k,n1,1), n3,tmpU(4,k,n3,1), & tmpV(1,k,n1,1) - tmpU(4,k,n3,1) WRITE(ioUnit,1010) 'DEBUG_CS_CORNER_UV: ', 'S edge, E:', & n1,tmpV(2,k,n1,1), n3,tmpU(3,k,n3,1), & tmpV(2,k,n1,1) - tmpU(3,k,n3,1) ENDIF #else /* ALLOW_EXCH2 */ n1 = n IF (MOD(n1,2).EQ.1 ) THEN c n1=1 n2=5,+v,- c n1=1 n3=6,+v,+ c n1=3 n2=1,+v,- c n1=3 n3=2,+v,+ c n1=5 n2=3,+v,- c n1=5 n3=4,+v,+ n2=1+mod(n1-2+5,6) n3=1+mod(n1-1+5,6) WRITE(ioUnit,1010) 'DEBUG_CS_CORNER_UV: ', 'W edge, S:', & n1,tmpU(1,k,n1,1), n2,tmpV(4,k,n2,1), & tmpU(1,k,n1,1) - tmpV(4,k,n2,1) WRITE(ioUnit,1010) 'DEBUG_CS_CORNER_UV: ', 'W edge, N:', & n1,tmpU(2,k,n1,1), n2,tmpV(3,k,n2,1), & tmpU(2,k,n1,1) - tmpV(3,k,n2,1) WRITE(ioUnit,1010) 'DEBUG_CS_CORNER_UV: ', 'S edge, W:', & n1,tmpV(1,k,n1,1), n3,tmpV(3,k,n3,1), & tmpV(1,k,n1,1) - tmpV(3,k,n3,1) WRITE(ioUnit,1010) 'DEBUG_CS_CORNER_UV: ', 'S edge, E:', & n1,tmpV(2,k,n1,1), n3,tmpV(4,k,n3,1), & tmpV(2,k,n1,1) - tmpV(4,k,n3,1) ELSE c n1=2 n2=1,+u,+ c n1=2 n3=6,+u,- c n1=4 n2=3,+u,+ c n1=4 n3=2,+u,- c n1=6 n2=5,+u,+ c n1=6 n3=4,+u,- n2=1+mod(n1-1+5,6) n3=1+mod(n1-2+5,6) WRITE(ioUnit,1010) 'DEBUG_CS_CORNER_UV: ', 'W edge, S:', & n1,tmpU(1,k,n1,1), n2,tmpU(3,k,n2,1), & tmpU(1,k,n1,1) - tmpU(3,k,n2,1) WRITE(ioUnit,1010) 'DEBUG_CS_CORNER_UV: ', 'W edge, N:', & n1,tmpU(2,k,n1,1), n2,tmpU(4,k,n2,1), & tmpU(2,k,n1,1) - tmpU(4,k,n2,1) WRITE(ioUnit,1010) 'DEBUG_CS_CORNER_UV: ', 'S edge, W:', & n1,tmpV(1,k,n1,1), n3,tmpU(4,k,n3,1), & tmpV(1,k,n1,1) - tmpU(4,k,n3,1) WRITE(ioUnit,1010) 'DEBUG_CS_CORNER_UV: ', 'S edge, E:', & n1,tmpV(2,k,n1,1), n3,tmpU(3,k,n3,1), & tmpV(2,k,n1,1) - tmpU(3,k,n3,1) ENDIF #endif /* ALLOW_EXCH2 */ ENDDO WRITE(ioUnit,'(2A)') 'DEBUG_CS_CORNER_UV: ', & '------------------------------------------------------------' ENDIF c ENDIF #endif /* ALLOW_DEBUG */ RETURN END