C $Header: /u/gcmpack/MITgcm/pkg/ctrl/ctrl_bound.F,v 1.5 2012/08/12 19:34:22 jmc Exp $ C $Name: $ #include "CTRL_OPTIONS.h" C- note: although we just need CPP_EEOPTIONS.h here, prefer to C include the same option-file above as in the AD version. C-- File ctrl_bound.F: C-- Contents C-- o CTRL_BOUND_3D C-- o CTRL_BOUND_2D C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| CBOP C !ROUTINE: CTRL_BOUND_3D C !INTERFACE: SUBROUTINE CTRL_BOUND_3D( U fieldCur, I maskFld3d, boundsVec, myThid ) C !DESCRIPTION: \bv C *==========================================================* C | started: Gael Forget gforget@mit.edu 20-Aug-2007 C | C | o in forward mode: impose bounds on ctrl vector values C | o in adjoint mode: do nothing ... or emulate local minimum C *==========================================================* C \ev C !USES: IMPLICIT NONE #include "SIZE.h" #include "EEPARAMS.h" C !INPUT/OUTPUT PARAMETERS: _RL fieldCur (1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr,nSx,nSy) _RS maskFld3d(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr,nSx,nSy) _RL boundsVec(5) INTEGER myThid C !LOCAL VARIABLES: INTEGER bi,bj,i,j,k CEOP IF (boundsVec(1).LT.boundsVec(4)) THEN DO bj=myByLo(myThid), myByHi(myThid) DO bi=myBxLo(myThid), myBxHi(myThid) DO k = 1,Nr DO j = 1,sNy DO i = 1,sNx IF (maskFld3d(i,j,k,bi,bj).NE.0.) THEN IF (fieldCur(i,j,k,bi,bj).GT.boundsVec(4)) THEN fieldCur(i,j,k,bi,bj)=boundsVec(4) ENDIF IF (fieldCur(i,j,k,bi,bj).LT.boundsVec(1)) THEN fieldCur(i,j,k,bi,bj)=boundsVec(1) ENDIF ENDIF ENDDO ENDDO ENDDO ENDDO ENDDO ENDIF RETURN END C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| CBOP C C !ROUTINE: CTRL_BOUND_2D C !INTERFACE: SUBROUTINE CTRL_BOUND_2D( U fieldCur, I maskFld3d, boundsVec, myThid ) C !DESCRIPTION: \bv C *==========================================================* C | started: Gael Forget gforget@mit.edu 20-Aug-2007 C | C | o in forward mode: impose bounds on ctrl vector values C | o in adjoint mode: do nothing ... or emulate local minimum C *==========================================================* C \ev C !USES: IMPLICIT NONE #include "SIZE.h" #include "EEPARAMS.h" C !INPUT/OUTPUT PARAMETERS: _RL fieldCur (1-Olx:sNx+Olx,1-Oly:sNy+Oly, nSx,nSy) _RS maskFld3d(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr,nSx,nSy) _RL boundsVec(5) INTEGER myThid C !LOCAL VARIABLES: INTEGER bi,bj,i,j CEOP IF (boundsVec(1).LT.boundsVec(4)) THEN DO bj=myByLo(myThid), myByHi(myThid) DO bi=myBxLo(myThid), myBxHi(myThid) DO j = 1-OLy,sNy+OLy DO i = 1-OLx,sNx+OLx IF (maskFld3d(i,j,1,bi,bj).NE.0.) THEN IF (fieldCur(i,j,bi,bj).GT.boundsVec(4)) THEN fieldCur(i,j,bi,bj)=boundsVec(4) ENDIF IF (fieldCur(i,j,bi,bj).LT.boundsVec(1)) THEN fieldCur(i,j,bi,bj)=boundsVec(1) ENDIF ENDIF ENDDO ENDDO ENDDO ENDDO ENDIF RETURN END