#include "PACKAGES_CONFIG.h" #include "CPP_EEOPTIONS.h" C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| CBOP C !ROUTINE: FILL_CS_CORNER_UV_RS C !INTERFACE: SUBROUTINE FILL_CS_CORNER_UV_RS( I withSigns, U uFld, vFld, I bi,bj, myThid) IMPLICIT NONE C !DESCRIPTION: C *==========================================================* C | SUBROUTINE FILL_CS_CORNER_UV_RS C | o Fill the corner-halo region of CS-grid, C | for a 2 components, C-grid vector field C *==========================================================* C | o the corner halo region is filled with valid values C | in order to extend in X and Y direction calculations C | of fluxes, on a wide stencil. C *==========================================================* C !USES: 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 == C C withSigns :: uFld,vFld are vector components C uFld :: u-component, at C-grid West point location C vFld :: v-component, at C-grid SOuth point location C bi,bj :: tile indices C myThid :: thread number LOGICAL withSigns _RS uFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy) _RS vFld(1-OLx:sNx+OLx,1-OLy:sNy+OLy) INTEGER bi,bj INTEGER myThid C !LOCAL VARIABLES: C == Local variables == C i,j :: loop indices C myTile :: tile number INTEGER i,j LOGICAL southWestCorner LOGICAL southEastCorner LOGICAL northWestCorner LOGICAL northEastCorner _RL negOne #ifdef ALLOW_EXCH2 INTEGER myTile #endif CEOP IF (useCubedSphereExchange) THEN negOne = 1. _d 0 IF (withSigns) negOne = -1. _d 0 #ifdef ALLOW_EXCH2 myTile = W2_myTileList(bi,bj) southWestCorner = exch2_isWedge(myTile).EQ.1 & .AND. exch2_isSedge(myTile).EQ.1 southEastCorner = exch2_isEedge(myTile).EQ.1 & .AND. exch2_isSedge(myTile).EQ.1 northEastCorner = exch2_isEedge(myTile).EQ.1 & .AND. exch2_isNedge(myTile).EQ.1 northWestCorner = exch2_isWedge(myTile).EQ.1 & .AND. exch2_isNedge(myTile).EQ.1 #else southWestCorner = .TRUE. southEastCorner = .TRUE. northWestCorner = .TRUE. northEastCorner = .TRUE. #endif C-- To extend calculations in X direction, fill uFld array C with valid value in the corner. C e.g., NW corner: copy V( 0,sNy ) into U( -1,sNy+1) C copy V( 0,sNy-1) into U( -2,sNy+1) C copy V( -1,sNy ) into U( -1,sNy+2) C copy V( -1,sNy-1) into U( -2,sNy+2) C | | C U(-1,sNy+1) U(1,sNy+1) U(2,sNy+1) C | ^ | | C -----|--\--------corner----------| C | \ | | C | \ | C | \ | C -----|---V(0,sNy)--|--------------- C | | C C-- to extend calculations in Y direction, fill vFld array C with valid value in the corner. C e.g., NW corner: copy U( 2,sNy+1) into V( 0,sNy+2) C copy U( 3,sNy+1) into V( 0,sNy+3) C copy U( 2,sNy+2) into V( -1,sNy+2) C copy U( 3,sNy+2) into V( -1,sNy+3) C | | | C -----|--V(0,sNy+2)--|--------------| C | ^====================\ C U(-1,sNy+1) U(1,sNy+1) U(2,sNy+1) C | | | C -----|--V(0,sNy+1)--o--------------| C | |\ | C | | \=corner C | | C -----|--V(0,sNy)----|-- C | | C IF ( southWestCorner ) THEN C- prepare for direction X: DO j=1,OLy DO i=1,OLx uFld( 1-i , 1-j ) = negOne*vFld( 1-j , 1+i ) ENDDO ENDDO C- prepare for direction Y: DO j=1,OLy DO i=1,OLx vFld( 1-i , 1-j ) = negOne*uFld( 1+j , 1-i ) ENDDO ENDDO ENDIF IF ( southEastCorner ) THEN C- prepare for direction X: DO j=1,OLy DO i=2,OLx uFld(sNx+i, 1-j ) = vFld(sNx+j, i ) ENDDO ENDDO C- prepare for direction Y: DO j=1,OLy DO i=1,OLx vFld(sNx+i, 1-j ) = uFld(sNx+1-j, 1-i ) ENDDO ENDDO ENDIF IF ( northWestCorner ) THEN C- prepare for direction X: DO j=1,OLy DO i=1,OLx uFld( 1-i ,sNy+j) = vFld( 1-j , sNy+1-i ) ENDDO ENDDO C- prepare for direction Y: DO j=2,OLy DO i=1,OLx vFld( 1-i ,sNy+j) = uFld( j , sNy+i ) ENDDO ENDDO ENDIF IF ( northEastCorner ) THEN C- prepare for direction X: DO j=1,OLy DO i=2,OLx uFld(sNx+i,sNy+j) = negOne*vFld(sNx+j, sNy+2-i ) ENDDO ENDDO C- prepare for direction Y: DO j=2,OLy DO i=1,OLx vFld(sNx+i,sNy+j) = negOne*uFld(sNx+2-j, sNy+i ) ENDDO ENDDO ENDIF C-- End useCubedSphereExchange ENDIF RETURN END