C $Header: /u/gcmpack/MITgcm/pkg/obcs/obcs_sponge.F,v 1.6 2005/04/27 14:10:06 jmc Exp $
C $Name:  $

#include "OBCS_OPTIONS.h"
#include "AD_CONFIG.h"

CStartOfInterface
      SUBROUTINE OBCS_SPONGE_U(
     I           iMin, iMax, jMin, jMax,bi,bj,kLev,
     I           myCurrentTime,myThid)
C     /==========================================================\
C     | S/R OBCS_SPONGE_U                                        |
C     | o Contains problem specific forcing for zonal velocity.  |
C     |==========================================================|
C     | Adds terms to gU for forcing by external sources         |
C     | e.g. wind stress, bottom friction etc..................  |
C     \==========================================================/
      IMPLICIT NONE

C     == Global data ==
#include "SIZE.h"
#include "EEPARAMS.h"
#include "PARAMS.h"
#include "GRID.h"
#include "DYNVARS.h"
#include "FFIELDS.h"
#ifdef ALLOW_OBCS
# include "OBCS.h"
# ifdef ALLOW_CAL
#  include "cal.h"
# endif
#endif

C     == Routine arguments ==
C     iMin - Working range of tile for applying forcing.
C     iMax
C     jMin
C     jMax
C     kLev
      INTEGER iMin, iMax, jMin, jMax, kLev, bi, bj
      _RL myCurrentTime
      INTEGER myThid
CEndOfInterface

C     == Local variables ==
C     Loop counters
      INTEGER I, J, Isl, Jsl
      _RL urelax, lambda_obcs_u
#ifndef ALLOW_CAL
      INTEGER secondsperday
      PARAMETER (secondsperday=86400)
#endif

#if (defined (ALLOW_OBCS)  defined (ALLOW_OBCS_SPONGE))

      IF (useOBCSsponge) THEN

C Northern Open Boundary
#ifdef ALLOW_OBCS_NORTH
      DO i=iMin,iMax
       IF ((OB_Jn(i,bi,bj).ne.0).and.(spongeThickness.ne.0)) THEN
        DO jsl= 1,spongeThickness
         j=OB_Jn(i,bi,bj)-jsl

         IF ((j.ge.jmin).and.(j.le.jmax)) THEN 
          urelax=( 
     &      float(spongeThickness-jsl)*OBNu(i,kLev,bi,bj)
     &    + float(jsl)*uVel(i,j,kLev,bi,bj) )
     &    / float(spongeThickness)

          lambda_obcs_u = ( 
     &      float(spongeThickness-jsl)*Vrelaxobcsbound
     &    + float(jsl)*Vrelaxobcsinner)
     &    / float(spongeThickness)

          IF (lambda_obcs_u.ne.0.) THEN 
           lambda_obcs_u = 1. _d 0 / lambda_obcs_u
          ELSE 
           lambda_obcs_u = 0. _d 0
          ENDIF 
        
          gU(i,j,kLev,bi,bj) =  gU(i,j,kLev,bi,bj)
     &    - _maskW(i,j,kLev,bi,bj) * lambda_obcs_u
     &    * ( uVel(i,j,kLev,bi,bj) - urelax )
         ENDIF
 
        ENDDO
       ENDIF
      ENDDO
#endif

C Southern Open Boundary
#ifdef ALLOW_OBCS_SOUTH
      DO i=iMin,iMax
       IF ((OB_Js(i,bi,bj).ne.0).and.(spongeThickness.ne.0)) THEN
        DO jsl= 1,spongeThickness
         j=OB_Js(i,bi,bj)+jsl

         IF ((j.ge.jmin).and.(j.le.jmax)) THEN         
          urelax=( 
     &      float(spongeThickness-jsl)*OBSu(i,kLev,bi,bj)
     &    + float(jsl)*uVel(i,j,kLev,bi,bj) )
     &    / float(spongeThickness)

          lambda_obcs_u = ( 
     &      float(spongeThickness-jsl)*Vrelaxobcsbound
     &    + float(jsl)*Vrelaxobcsinner)
     &    / float(spongeThickness)

          if (lambda_obcs_u.ne.0.) then
            lambda_obcs_u = 1. _d 0 / lambda_obcs_u
          else
            lambda_obcs_u = 0. _d 0
          endif

         gU(i,j,kLev,bi,bj) = gU(i,j,kLev,bi,bj)
     &   - _maskW(i,j,kLev,bi,bj) * lambda_obcs_u
     &   * ( uVel(i,j,kLev,bi,bj) - urelax )
         ENDIF

        ENDDO
       ENDIF
      ENDDO
#endif

C Eastern Open Boundary 
#ifdef ALLOW_OBCS_EAST
      DO j=jMin,jMax
       IF ((OB_Ie(j,bi,bj).ne.0).and.(spongeThickness.ne.0)) THEN
        DO isl= 1,spongeThickness
         i=OB_Ie(j,bi,bj)-isl

         IF ((i.ge.imin).and.(i.le.imax)) THEN 
          urelax=( 
     &      float(spongeThickness-isl)*OBEu(j,kLev,bi,bj)
     &    + float(isl)*uVel(i,j,kLev,bi,bj) )
     &    / float(spongeThickness)

          lambda_obcs_u = ( 
     &      float(spongeThickness-isl)*Urelaxobcsbound
     &    + float(isl)*Urelaxobcsinner)
     &    / float(spongeThickness)

          if (lambda_obcs_u.ne.0.) then
            lambda_obcs_u = 1. _d 0 / lambda_obcs_u
          else
            lambda_obcs_u = 0. _d 0
          endif

          gU(i,j,kLev,bi,bj) = gU(i,j,kLev,bi,bj)
     &    - _maskW(i,j,kLev,bi,bj) * lambda_obcs_u
     &    * ( uVel(i,j,kLev,bi,bj) - urelax )
         ENDIF

        ENDDO
       ENDIF
      ENDDO
#endif

C Western Open Boundary
#ifdef ALLOW_OBCS_WEST
      DO j=jMin,jMax
       IF ((OB_Iw(j,bi,bj).ne.0).and.(spongeThickness.ne.0)) THEN
        DO isl= 1,spongeThickness
         i=OB_Iw(j,bi,bj)+isl+1

         IF ((i.ge.imin).and.(i.le.imax)) THEN 
          urelax=( 
     &      float(spongeThickness-isl)*OBWu(j,kLev,bi,bj)
     &    + float(isl)*uVel(i,j,kLev,bi,bj) )
     &    / float(spongeThickness)

          lambda_obcs_u= ( 
     &      float(spongeThickness-isl)*Urelaxobcsbound
     &    + float(isl)*Urelaxobcsinner)
     &    / float(spongeThickness)

          if (lambda_obcs_u.ne.0.) then
            lambda_obcs_u = 1. _d 0 / lambda_obcs_u
          else
            lambda_obcs_u = 0. _d 0
          endif

          gU(i,j,kLev,bi,bj) =  gU(i,j,kLev,bi,bj)
     &    - _maskW(i,j,kLev,bi,bj) * lambda_obcs_u
     &    * ( uVel(i,j,kLev,bi,bj) - urelax )
         ENDIF

        ENDDO
       ENDIF
      ENDDO
#endif

      ENDIF

#endif

      RETURN
      END


CStartOfInterface SUBROUTINE OBCS_SPONGE_V( I iMin, iMax, jMin, jMax,bi,bj,kLev, I myCurrentTime,myThid) C /==========================================================\ C | S/R OBCS_SPONGE_V | C | o Contains problem specific forcing for merid velocity. | C |==========================================================| C | Adds terms to gV for forcing by external sources | C | e.g. wind stress, bottom friction etc.................. | C \==========================================================/ IMPLICIT NONE C == Global data == #include "SIZE.h" #include "EEPARAMS.h" #include "PARAMS.h" #include "GRID.h" #include "DYNVARS.h" #include "FFIELDS.h" #ifdef ALLOW_OBCS # include "OBCS.h" # ifdef ALLOW_CAL # include "cal.h" # endif #endif C == Routine arguments == C iMin - Working range of tile for applying forcing. C iMax C jMin C jMax C kLev INTEGER iMin, iMax, jMin, jMax, kLev, bi, bj _RL myCurrentTime INTEGER myThid CEndOfInterface C == Local variables == C Loop counters INTEGER I, J, Isl, Jsl _RL vrelax,lambda_obcs_v #ifndef ALLOW_CAL INTEGER secondsperday PARAMETER (secondsperday=86400) #endif #if (defined (ALLOW_OBCS) defined (ALLOW_OBCS_SPONGE)) IF (useOBCSsponge) THEN C Northern Open Boundary #ifdef ALLOW_OBCS_NORTH DO i=iMin,iMax IF ((OB_Jn(i,bi,bj).ne.0).and.(spongeThickness.ne.0)) THEN DO jsl= 1,spongeThickness j=OB_Jn(i,bi,bj)-jsl IF ((j.ge.jmin).and.(j.le.jmax)) THEN vrelax=( & float(spongeThickness-jsl)*OBNv(i,kLev,bi,bj) & + float(jsl)*vVel(i,j,kLev,bi,bj) ) & / float(spongeThickness) lambda_obcs_v = ( & float(spongeThickness-jsl)*Vrelaxobcsbound & + float(jsl)*Vrelaxobcsinner) & / float(spongeThickness) IF (lambda_obcs_v.ne.0.) THEN lambda_obcs_v = 1. _d 0 / lambda_obcs_v ELSE lambda_obcs_v = 0. _d 0 ENDIF gV(i,j,kLev,bi,bj) = gV(i,j,kLev,bi,bj) & - _maskS(i,j,kLev,bi,bj) * lambda_obcs_v & * ( vVel(i,j,kLev,bi,bj) - vrelax ) ENDIF ENDDO ENDIF ENDDO #endif C Southern Open Boundary #ifdef ALLOW_OBCS_SOUTH DO i=iMin,iMax IF ((OB_Js(i,bi,bj).ne.0).and.(spongeThickness.ne.0)) THEN DO jsl= 1,spongeThickness j=OB_Js(i,bi,bj)+jsl+1 IF ((j.ge.jmin).and.(j.le.jmax)) THEN vrelax=( & float(spongeThickness-jsl)*OBSv(i,kLev,bi,bj) & + float(jsl)*vVel(i,j,kLev,bi,bj) ) & / float(spongeThickness) lambda_obcs_v = ( & float(spongeThickness-jsl)*Vrelaxobcsbound & + float(jsl)*Vrelaxobcsinner) & / float(spongeThickness) if (lambda_obcs_v.ne.0.) then lambda_obcs_v = 1. _d 0 / lambda_obcs_v else lambda_obcs_v = 0. _d 0 endif gV(i,j,kLev,bi,bj) = gV(i,j,kLev,bi,bj) & - _maskS(i,j,kLev,bi,bj) * lambda_obcs_v & * ( vVel(i,j,kLev,bi,bj) - vrelax ) ENDIF ENDDO ENDIF ENDDO #endif C Eastern Open Boundary #ifdef ALLOW_OBCS_EAST DO j=jMin,jMax IF ((OB_Ie(j,bi,bj).ne.0).and.(spongeThickness.ne.0)) THEN DO isl= 1,spongeThickness i=OB_Ie(j,bi,bj)-isl IF ((i.ge.imin).and.(i.le.imax)) THEN vrelax=( & float(spongeThickness-isl)*OBEv(j,kLev,bi,bj) & + float(isl-1)*vVel(i,j,kLev,bi,bj) ) & / float(spongeThickness) lambda_obcs_v = ( & float(spongeThickness-isl)*Urelaxobcsbound & + float(isl)*Urelaxobcsinner) & / float(spongeThickness) if (lambda_obcs_v.ne.0.) then lambda_obcs_v = 1. _d 0 / lambda_obcs_v else lambda_obcs_v = 0. _d 0 endif gV(i,j,kLev,bi,bj) = gV(i,j,kLev,bi,bj) & - _maskS(i,j,kLev,bi,bj) * lambda_obcs_v & * ( vVel(i,j,kLev,bi,bj) - vrelax ) ENDIF ENDDO ENDIF ENDDO #endif C Western Open Boundary #ifdef ALLOW_OBCS_WEST DO j=jMin,jMax IF ((OB_Iw(j,bi,bj).ne.0).and.(spongeThickness.ne.0)) THEN DO isl= 1,spongeThickness i=OB_Iw(j,bi,bj)+isl IF ((i.ge.imin).and.(i.le.imax)) THEN vrelax=( & float(spongeThickness-isl)*OBWv(j,kLev,bi,bj) & + float(isl)*vVel(i,j,kLev,bi,bj) ) & / float(spongeThickness) lambda_obcs_v = ( & float(spongeThickness-isl)*Urelaxobcsbound & + float(isl)*Urelaxobcsinner) & / float(spongeThickness) if (lambda_obcs_v.ne.0.) then lambda_obcs_v = 1. _d 0 / lambda_obcs_v else lambda_obcs_v = 0. _d 0 endif gV(i,j,kLev,bi,bj) = gV(i,j,kLev,bi,bj) & - _maskS(i,j,kLev,bi,bj) * lambda_obcs_v & * ( vVel(i,j,kLev,bi,bj) - vrelax ) ENDIF ENDDO ENDIF ENDDO #endif ENDIF #endif RETURN END


CStartOfInterface SUBROUTINE OBCS_SPONGE_T( I iMin, iMax, jMin, jMax,bi,bj,kLev, I myCurrentTime,myThid) C /==========================================================\ C | S/R OBCS_SPONGE_T | C | o Contains problem specific forcing for zonal velocity. | C |==========================================================| C | Adds terms to gT for forcing by external sources | C | e.g. wind stress, bottom friction etc.................. | C \==========================================================/ IMPLICIT NONE C == Global data == #include "SIZE.h" #include "EEPARAMS.h" #include "PARAMS.h" #include "GRID.h" #include "DYNVARS.h" #include "FFIELDS.h" #ifdef ALLOW_OBCS # include "OBCS.h" # ifdef ALLOW_CAL # include "cal.h" # endif #endif #ifdef ALLOW_AUTODIFF_TAMC # include "tamc.h" # include "tamc_keys.h" #endif C == Routine arguments == C iMin - Working range of tile for applying forcing. C iMax C jMin C jMax C kLev INTEGER iMin, iMax, jMin, jMax, kLev, bi, bj _RL myCurrentTime INTEGER myThid CEndOfInterface C == Local variables == C Loop counters INTEGER I, J, Isl, Jsl _RL trelax, lambda_obcs_t #ifndef ALLOW_CAL INTEGER secondsperday PARAMETER (secondsperday=86400) #endif #if (defined (ALLOW_OBCS) defined (ALLOW_OBCS_SPONGE)) IF (useOBCSsponge) THEN #ifdef ALLOW_AUTODIFF_TAMC act1 = bi - myBxLo(myThid) max1 = myBxHi(myThid) - myBxLo(myThid) + 1 act2 = bj - myByLo(myThid) max2 = myByHi(myThid) - myByLo(myThid) + 1 act3 = myThid - 1 max3 = nTx*nTy act4 = ikey_dynamics - 1 ikey = (act1 + 1) + act2*max1 & + act3*max1*max2 & + act4*max1*max2*max3 kkey = (ikey-1)*Nr + klev #endif /* ALLOW_AUTODIFF_TAMC */ C Northern Open Boundary #ifdef ALLOW_OBCS_NORTH #ifdef ALLOW_AUTODIFF_TAMC CADJ STORE OBNt(:,klev,bi,bj) = comlev1_bibj_k, key=kkey, byte=isbyte #endif DO i=iMin,iMax IF ((OB_Jn(i,bi,bj).ne.0).and.(spongeThickness.ne.0)) THEN DO jsl= 1,spongeThickness j=OB_Jn(i,bi,bj)-jsl IF ((j.ge.jmin).and.(j.le.jmax)) THEN IF (OBNt(i,klev,bi,bj).ne. 0.d0) then trelax=( & float(spongeThickness-jsl)*OBNt(i,kLev,bi,bj) & + float(jsl)*theta(i,j,kLev,bi,bj) ) & / float(spongeThickness) lambda_obcs_t = ( & float(spongeThickness-jsl)*Vrelaxobcsbound & + float(jsl)*Vrelaxobcsinner) & / float(spongeThickness) IF (lambda_obcs_t.ne.0.) THEN lambda_obcs_t = 1. _d 0 / lambda_obcs_t ELSE lambda_obcs_t = 0. _d 0 ENDIF gT(i,j,kLev,bi,bj) = gT(i,j,kLev,bi,bj) & - maskC(i,j,kLev,bi,bj) * lambda_obcs_t & * ( theta(i,j,kLev,bi,bj) - trelax ) endif ENDIF ENDDO ENDIF ENDDO #endif C Southern Open Boundary #ifdef ALLOW_OBCS_SOUTH #ifdef ALLOW_AUTODIFF_TAMC CADJ STORE OBSt(:,klev,bi,bj) = comlev1_bibj_k, key=kkey, byte=isbyte #endif DO i=iMin,iMax IF ((OB_Js(i,bi,bj).ne.0).and.(spongeThickness.ne.0)) THEN DO jsl= 1,spongeThickness j=OB_Js(i,bi,bj)+jsl IF ((j.ge.jmin).and.(j.le.jmax)) THEN IF (OBSt(i,klev,bi,bj).ne. 0.d0) then trelax=( & float(spongeThickness-jsl)*OBSt(i,kLev,bi,bj) & + float(jsl)*theta(i,j,kLev,bi,bj) ) & / float(spongeThickness) lambda_obcs_t = ( & float(spongeThickness-jsl)*Vrelaxobcsbound & + float(jsl)*Vrelaxobcsinner) & / float(spongeThickness) if (lambda_obcs_t.ne.0.) then lambda_obcs_t = 1. _d 0 / lambda_obcs_t else lambda_obcs_t = 0. _d 0 endif gT(i,j,kLev,bi,bj) = gT(i,j,kLev,bi,bj) & - maskC(i,j,kLev,bi,bj) * lambda_obcs_t & * ( theta(i,j,kLev,bi,bj) - trelax ) endif ENDIF ENDDO ENDIF ENDDO #endif C Eastern Open Boundary #ifdef ALLOW_OBCS_EAST #ifdef ALLOW_AUTODIFF_TAMC CADJ STORE OBEt(:,klev,bi,bj) = comlev1_bibj_k, key=kkey, byte=isbyte #endif DO j=jMin,jMax IF ((OB_Ie(j,bi,bj).ne.0).and.(spongeThickness.ne.0)) THEN DO isl= 1,spongeThickness i=OB_Ie(j,bi,bj)-isl IF ((i.ge.imin).and.(i.le.imax)) THEN IF (OBEt(j,klev,bi,bj).ne. 0.d0) then trelax=( & float(spongeThickness-isl)*OBEt(j,kLev,bi,bj) & + float(isl)*theta(i,j,kLev,bi,bj) ) & / float(spongeThickness) lambda_obcs_t = ( & float(spongeThickness-isl)*Urelaxobcsbound & + float(isl)*Urelaxobcsinner) & / float(spongeThickness) if (lambda_obcs_t.ne.0.) then lambda_obcs_t = 1. _d 0 / lambda_obcs_t else lambda_obcs_t = 0. _d 0 endif gT(i,j,kLev,bi,bj) = gT(i,j,kLev,bi,bj) & - maskC(i,j,kLev,bi,bj) * lambda_obcs_t & * ( theta(i,j,kLev,bi,bj) - trelax ) endif ENDIF ENDDO ENDIF ENDDO #endif C Western Open Boundary #ifdef ALLOW_OBCS_WEST #ifdef ALLOW_AUTODIFF_TAMC CADJ STORE OBWt(:,klev,bi,bj) = comlev1_bibj_k, key=kkey, byte=isbyte #endif DO j=jMin,jMax IF ((OB_Iw(j,bi,bj).ne.0).and.(spongeThickness.ne.0)) THEN DO isl= 1,spongeThickness cgg i=OB_Iw(j,bi,bj)+isl+1 cgg Needed to fix the coordinate of the tracer open boundary. This is the classic "cut-and-paste" bug. i=OB_Iw(j,bi,bj)+isl IF ((i.ge.imin).and.(i.le.imax)) THEN IF (OBWt(j,klev,bi,bj).ne. 0.d0) then trelax=( & float(spongeThickness-isl)*OBWt(j,kLev,bi,bj) & + float(isl)*theta(i,j,kLev,bi,bj) ) & / float(spongeThickness) lambda_obcs_t= ( & float(spongeThickness-isl)*Urelaxobcsbound & + float(isl)*Urelaxobcsinner) & / float(spongeThickness) if (lambda_obcs_t .ne. 0.) then lambda_obcs_t = 1. _d 0 / lambda_obcs_t else lambda_obcs_t = 0. _d 0 endif gT(i,j,kLev,bi,bj) = gT(i,j,kLev,bi,bj) & - maskC(i,j,kLev,bi,bj) * lambda_obcs_t & * ( theta(i,j,kLev,bi,bj) - trelax ) endif ENDIF ENDDO ENDIF ENDDO #endif ENDIF #endif RETURN END


CStartOfInterface SUBROUTINE OBCS_SPONGE_S( I iMin, iMax, jMin, jMax,bi,bj,kLev, I myCurrentTime,myThid) C /==========================================================\ C | S/R OBCS_SPONGE_U | C | o Contains problem specific forcing for zonal velocity. | C |==========================================================| C | Adds terms to gU for forcing by external sources | C | e.g. wind stress, bottom friction etc.................. | C \==========================================================/ IMPLICIT NONE C == Global data == #include "SIZE.h" #include "EEPARAMS.h" #include "PARAMS.h" #include "GRID.h" #include "DYNVARS.h" #include "FFIELDS.h" #ifdef ALLOW_OBCS # include "OBCS.h" # ifdef ALLOW_CAL # include "cal.h" # endif #endif #ifdef ALLOW_AUTODIFF_TAMC # include "tamc.h" # include "tamc_keys.h" #endif C == Routine arguments == C iMin - Working range of tile for applying forcing. C iMax C jMin C jMax C kLev INTEGER iMin, iMax, jMin, jMax, kLev, bi, bj _RL myCurrentTime INTEGER myThid CEndOfInterface C == Local variables == C Loop counters INTEGER I, J, Isl, Jsl _RL srelax, lambda_obcs_s #ifndef ALLOW_CAL INTEGER secondsperday PARAMETER (secondsperday=86400) #endif #if (defined (ALLOW_OBCS) defined (ALLOW_OBCS_SPONGE)) IF (useOBCSsponge) THEN #ifdef ALLOW_AUTODIFF_TAMC act1 = bi - myBxLo(myThid) max1 = myBxHi(myThid) - myBxLo(myThid) + 1 act2 = bj - myByLo(myThid) max2 = myByHi(myThid) - myByLo(myThid) + 1 act3 = myThid - 1 max3 = nTx*nTy act4 = ikey_dynamics - 1 ikey = (act1 + 1) + act2*max1 & + act3*max1*max2 & + act4*max1*max2*max3 kkey = (ikey-1)*Nr + klev #endif /* ALLOW_AUTODIFF_TAMC */ C Northern Open Boundary #ifdef ALLOW_OBCS_NORTH #ifdef ALLOW_AUTODIFF_TAMC CADJ STORE OBNs(:,klev,bi,bj) = comlev1_bibj_k, key=kkey, byte=isbyte #endif DO i=iMin,iMax IF ((OB_Jn(i,bi,bj).ne.0).and.(spongeThickness.ne.0)) THEN DO jsl= 1,spongeThickness j=OB_Jn(i,bi,bj)-jsl IF ((j.ge.jmin).and.(j.le.jmax)) THEN IF (OBNs(i,klev,bi,bj).ne. 0.d0) then srelax=( & float(spongeThickness-jsl)*OBNs(i,kLev,bi,bj) & + float(jsl)*salt(i,j,kLev,bi,bj) ) & / float(spongeThickness) lambda_obcs_s = ( & float(spongeThickness-jsl)*Vrelaxobcsbound & + float(jsl)*Vrelaxobcsinner) & / float(spongeThickness) IF (lambda_obcs_s.ne.0.) THEN lambda_obcs_s = 1. _d 0 / lambda_obcs_s ELSE lambda_obcs_s = 0. _d 0 ENDIF gS(i,j,kLev,bi,bj) = gS(i,j,kLev,bi,bj) & - maskC(i,j,kLev,bi,bj) * lambda_obcs_s & * ( salt(i,j,kLev,bi,bj) - srelax ) endif ENDIF ENDDO ENDIF ENDDO #endif C Southern Open Boundary #ifdef ALLOW_OBCS_SOUTH #ifdef ALLOW_AUTODIFF_TAMC CADJ STORE OBSs(:,klev,bi,bj) = comlev1_bibj_k, key=kkey, byte=isbyte #endif DO i=iMin,iMax IF ((OB_Js(i,bi,bj).ne.0).and.(spongeThickness.ne.0)) THEN DO jsl= 1,spongeThickness j=OB_Js(i,bi,bj)+jsl IF ((j.ge.jmin).and.(j.le.jmax)) THEN IF (OBSs(i,klev,bi,bj).ne. 0.d0) then srelax=( & float(spongeThickness-jsl)*OBSs(i,kLev,bi,bj) & + float(jsl)*salt(i,j,kLev,bi,bj) ) & / float(spongeThickness) lambda_obcs_s = ( & float(spongeThickness)*Vrelaxobcsbound & + float(jsl)*Vrelaxobcsinner) & / float(spongeThickness) if (lambda_obcs_s.ne.0.) then lambda_obcs_s = 1. _d 0 / lambda_obcs_s else lambda_obcs_s = 0. _d 0 endif gS(i,j,kLev,bi,bj) = gS(i,j,kLev,bi,bj) & - maskC(i,j,kLev,bi,bj) * lambda_obcs_s & * ( salt(i,j,kLev,bi,bj) - srelax ) endif ENDIF ENDDO ENDIF ENDDO #endif C Eastern Open Boundary #ifdef ALLOW_OBCS_EAST #ifdef ALLOW_AUTODIFF_TAMC CADJ STORE OBEs(:,klev,bi,bj) = comlev1_bibj_k, key=kkey, byte=isbyte #endif DO j=jMin,jMax IF ((OB_Ie(j,bi,bj).ne.0).and.(spongeThickness.ne.0)) THEN DO isl= 1,spongeThickness i=OB_Ie(j,bi,bj)-isl IF ((i.ge.imin).and.(i.le.imax)) THEN IF (OBEs(j,klev,bi,bj).ne. 0.d0) then srelax=( & float(spongeThickness-isl)*OBEs(j,kLev,bi,bj) & + float(isl)*salt(i,j,kLev,bi,bj) ) & / float(spongeThickness) lambda_obcs_s = ( & float(spongeThickness-isl)*Urelaxobcsbound & + float(isl)*Urelaxobcsinner) & / float(spongeThickness) if (lambda_obcs_s.ne.0.) then lambda_obcs_s = 1. _d 0 / lambda_obcs_s else lambda_obcs_s = 0. _d 0 endif gS(i,j,kLev,bi,bj) = gS(i,j,kLev,bi,bj) & - maskC(i,j,kLev,bi,bj) * lambda_obcs_s & * ( salt(i,j,kLev,bi,bj) - srelax ) endif ENDIF ENDDO ENDIF ENDDO #endif C Western Open Boundary #ifdef ALLOW_OBCS_WEST #ifdef ALLOW_AUTODIFF_TAMC CADJ STORE OBWs(:,klev,bi,bj) = comlev1_bibj_k, key=kkey, byte=isbyte #endif DO j=jMin,jMax IF ((OB_Iw(j,bi,bj).ne.0).and.(spongeThickness.ne.0)) THEN DO isl= 1,spongeThickness cgg i=OB_Iw(j,bi,bj)+isl+1 cgg Fix the tracer o.b. coordinate. i=OB_Iw(j,bi,bj)+isl IF ((i.ge.imin).and.(i.le.imax)) THEN IF (OBWs(j,klev,bi,bj).ne. 0.d0) then srelax=( & float(spongeThickness-isl)*OBWs(j,kLev,bi,bj) & + float(isl)*salt(i,j,kLev,bi,bj) ) & / float(spongeThickness) lambda_obcs_s= ( & float(spongeThickness-isl)*Urelaxobcsbound & + float(isl)*Urelaxobcsinner) & / float(spongeThickness) if (lambda_obcs_s.ne.0.) then lambda_obcs_s = 1. _d 0 / lambda_obcs_s else lambda_obcs_s = 0. _d 0 endif gS(i,j,kLev,bi,bj) = gS(i,j,kLev,bi,bj) & - maskC(i,j,kLev,bi,bj) * lambda_obcs_s & * ( salt(i,j,kLev,bi,bj) - srelax ) endif ENDIF ENDDO ENDIF ENDDO #endif ENDIF #endif RETURN END