C $Header: /u/gcmpack/MITgcm/pkg/salt_plume/salt_plume_tendency_apply_s.F,v 1.11 2014/07/09 17:00:49 jmc Exp $
C $Name: $
#include "SALT_PLUME_OPTIONS.h"
CBOP 0
C !ROUTINE: SALT_PLUME_TENDENCY_APPLY_S
C !INTERFACE:
SUBROUTINE SALT_PLUME_TENDENCY_APPLY_S(
U gS_arr,
I iMin,iMax,jMin,jMax, k, bi, bj,
I myTime, myIter, myThid )
C !DESCRIPTION:
C Add salt_plume tendency terms to S tendency.
C Routine works for one level at a time.
C SaltPlume is the amount of salt rejected by ice while freezing;
C it is here redistributed to multiple vertical levels as per
C Duffy et al. (GRL 1999).
C !USES:
IMPLICIT NONE
#include "SIZE.h"
#include "EEPARAMS.h"
#include "PARAMS.h"
#include "GRID.h"
c#include "DYNVARS.h"
#include "SALT_PLUME.h"
C !INPUT/OUTPUT PARAMETERS:
C gS_arr :: the tendency array
C iMin,iMax :: Working range of x-index for applying forcing.
C jMin,jMax :: Working range of y-index for applying forcing.
C k :: Current vertical level index
C bi,bj :: Current tile indices
C myTime :: Current time in simulation
C myIter :: Current iteration number
C myThid :: my Thread Id number
_RL gS_arr(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
INTEGER iMin, iMax, jMin, jMax
INTEGER k, bi, bj
_RL myTime
INTEGER myIter
INTEGER myThid
CEOP
#ifdef ALLOW_SALT_PLUME
C#ifndef SALT_PLUME_VOLUME
C !LOCAL VARIABLES:
INTEGER i, j
_RL minusone
parameter(minusone = -1.)
_RL plumefrac(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
_RL plumetend(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
#ifdef TARGET_NEC_SX
integer imt
parameter( imt=(sNx+2*OLx)*(sNy+2*OLy) )
_RL plumekb2D(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
#else
integer two2
parameter(two2 = 2)
_RL plumekb(two2), SPdepth(two2)
#ifdef SALT_PLUME_SPLIT_BASIN
_RL lon(two2), lat(two2)
#endif /* SALT_PLUME_SPLIT_BASIN */
#endif
#ifdef TARGET_NEC_SX
C The vector version computes plumekb2D at each grid point, but this
C is still faster than non-vector code.
IF ( k .LT. Nr ) THEN
#ifndef SALT_PLUME_VOLUME
DO j=1-OLy,sNy+OLy
DO i=1-OLx,sNx+OLx
plumekb2D(i,j)=ABS(rF(k))
ENDDO
ENDDO
CALL SALT_PLUME_FRAC(
I imt,minusone,SaltPlumeDepth(1-OLx,1-OLy,bi,bj),
#ifdef SALT_PLUME_SPLIT_BASIN
I XC(1-OLx,1-OLy,bi,bj),YC(1-OLx,1-OLy,bi,bj),
#endif /* SALT_PLUME_SPLIT_BASIN */
U plumekb2D,
I myTime, 1, myThid )
DO j=1-OLy,sNy+OLy
DO i=1-OLx,sNx+OLx
plumefrac(I,J) = plumekb2D(i,j)
plumekb2D(i,j) = ABS(rF(k+1))
ENDDO
ENDDO
CALL SALT_PLUME_FRAC(
I imt,minusone,SaltPlumeDepth(1-OLx,1-OLy,bi,bj),
#ifdef SALT_PLUME_SPLIT_BASIN
I XC(1-OLx,1-OLy,bi,bj),YC(1-OLx,1-OLy,bi,bj),
#endif /* SALT_PLUME_SPLIT_BASIN */
U plumekb2D,
I myTime, 1, myThid )
#endif /* SALT_PLUME_VOLUME */
DO j=1-OLy,sNy+OLy
DO i=1-OLx,sNx+OLx
C Penetrating saltplume fraction:cumSP(k+1)-cumSP(k)
IF ( SaltPlumeDepth(i,j,bi,bj) .GT. ABS(rF(k)) ) THEN
#ifndef SALT_PLUME_VOLUME
plumefrac(i,j) = ( plumekb2D(i,j)-plumefrac(i,j) )
& *maskC(i,j,k,bi,bj)
plumetend(I,J) = saltPlumeFlux(i,j,bi,bj)*plumefrac(I,J)
#else /* SALT_PLUME_VOLUME */
plumetend(I,J) = SPforcingS(i,j,k,bi,bj)
#endif /* SALT_PLUME_VOLUME */
gS_arr(i,j) = gS_arr(i,j) + plumetend(I,J)
& *recip_drF(k)*mass2rUnit*_recip_hFacC(i,j,k,bi,bj)
ELSE
plumefrac(i,j) = 0. _d 0
plumetend(I,J) = 0. _d 0
ENDIF
ENDDO
ENDDO
ENDIF
#else
DO j=jMin,jMax
DO i=iMin,iMax
C Penetrating saltplume fraction:cumulativeSP(k+1)-cumulativeSP(k)
IF ( SaltPlumeDepth(i,j,bi,bj) .GT. ABS(rF(k)) ) THEN
plumefrac(I,J) = 0. _d 0
#ifndef SALT_PLUME_VOLUME
plumekb(1)=ABS(rF(k))
plumekb(2)=ABS(rF(k+1))
SPdepth(1)=SaltPlumeDepth(i,j,bi,bj)
SPdepth(2)=SaltPlumeDepth(i,j,bi,bj)
#ifdef SALT_PLUME_SPLIT_BASIN
lon(1) = XC(i,j,bi,bj)
lon(2) = XC(i,j,bi,bj)
lat(1) = YC(i,j,bi,bj)
lat(2) = YC(i,j,bi,bj)
#endif /* SALT_PLUME_SPLIT_BASIN */
CALL SALT_PLUME_FRAC(
I two2,minusone,SPdepth,
#ifdef SALT_PLUME_SPLIT_BASIN
I lon,lat,
#endif /* SALT_PLUME_SPLIT_BASIN */
U plumekb,
I myTime, 1, myThid )
plumefrac(I,J) = (plumekb(2)-plumekb(1))*maskC(i,j,k,bi,bj)
plumetend(I,J) = saltPlumeFlux(i,j,bi,bj)*plumefrac(I,J)
#else /* SALT_PLUME_VOLUME */
plumetend(i,j) = SPforcingS(i,j,k,bi,bj)
#endif /* SALT_PLUME_VOLUME */
gS_arr(i,j) = gS_arr(i,j) + plumetend(I,J)
& *recip_drF(k)*mass2rUnit*_recip_hFacC(i,j,k,bi,bj)
ELSE
plumefrac(I,J) = 0. _d 0
plumetend(I,J) = 0. _d 0
ENDIF
ENDDO
ENDDO
#endif /* TARGET_NEC_SX */
#ifdef ALLOW_DIAGNOSTICS
IF ( useDiagnostics ) THEN
CALL DIAGNOSTICS_FILL (
& plumefrac,'PLUMEKB ',k,1,2,bi,bj,myThid )
CALL DIAGNOSTICS_FILL (
& plumetend,'oceSPtnd',k,1,2,bi,bj,myThid )
ENDIF
#endif /* ALLOW_DIAGNOSTICS */
C#endif /* SALT_PLUME_VOLUME */
#endif /* ALLOW_SALT_PLUME */
RETURN
END