C $Header: /u/gcmpack/MITgcm/pkg/salt_plume/salt_plume_calc_depth.F,v 1.9 2014/10/20 03:17:22 gforget Exp $
C $Name: $
#include "SALT_PLUME_OPTIONS.h"
#ifdef ALLOW_AUTODIFF
# include "AUTODIFF_OPTIONS.h"
#endif
CBOP
C !ROUTINE: SALT_PLUME_CALC_DEPTH
C !INTERFACE:
SUBROUTINE SALT_PLUME_CALC_DEPTH(
I rhoSurf, sigmaR,
I bi, bj, myTime, myIter, myThid )
C !DESCRIPTION: \bv
C *==========================================================*
C | S/R SALT_PLUME_CALC_DEPTH
C | o Compute depth of penetration of salt plumes rejected
C | during sea ice growth
C *==========================================================*
C \ev
C !USES:
IMPLICIT NONE
C == Global variables ==
#include "SIZE.h"
#include "EEPARAMS.h"
#include "PARAMS.h"
#include "GRID.h"
#include "SURFACE.h"
#include "DYNVARS.h"
#include "SALT_PLUME.h"
#ifdef ALLOW_AUTODIFF_TAMC
# include "tamc.h"
# include "tamc_keys.h"
#endif /* ALLOW_AUTODIFF_TAMC */
C !INPUT/OUTPUT PARAMETERS:
C rhoSurf :: Surface density anomaly
C sigmaR :: Vertical gradient of potential density
C bi,bj :: tile indices
C myTime :: Current time in simulation
C myIter :: Current iteration number in simulation
C myThid :: my Thread Id number
_RL rhoSurf(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
_RL sigmaR (1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
INTEGER bi, bj
_RL myTime
INTEGER myIter
INTEGER myThid
CEOP
#ifdef ALLOW_SALT_PLUME
C !LOCAL VARIABLES:
C i,j :: Loop counters
INTEGER i,j,k
_RL rhoBigNb, tmpFac
_RL rhoMxL(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
_RL rhoKm1(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
_RL rhoLoc(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
_RL GG, GGm1
_RL SPIND (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
#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
#endif /* ALLOW_AUTODIFF_TAMC */
C Initializing the saltplume depth to bottom topography
DO j=1-Oly,sNy+Oly
DO i=1-Olx,sNx+Olx
SaltPlumeDepth(i,j,bi,bj) = rF(1)-R_low(I,J,bi,bj)
SPIND(i,j) = 0. _d 0
rhoKm1(i,j) = 0. _d 0
rhoMxL(i,j) = 0. _d 0
ENDDO
ENDDO
C CriterionType 1 = use delta_rho to determine salt plume depth
IF (CriterionType.EQ.1) THEN
rhoBigNb = rhoConst*1. _d 10
DO j=1-Oly,sNy+Oly
DO i=1-Olx,sNx+Olx
SaltPlumeDepth(i,j,bi,bj) = rF(1)-R_low(I,J,bi,bj)
rhoKm1(i,j) = rhoSurf(i,j)
rhoMxL(i,j) = rhoSurf(i,j) + SaltPlumeCriterion
ENDDO
ENDDO
DO k = 2,Nr
#ifdef ALLOW_AUTODIFF_TAMC
kkey = (ikey-1)*Nr + k
CADJ STORE rhoKm1(:,:) = comlev1_bibj_k,
CADJ & key=kkey, byte=isbyte, kind = isbyte
CADJ STORE rhoMxL(:,:) = comlev1_bibj_k,
CADJ & key=kkey, byte=isbyte, kind = isbyte
CADJ STORE theta(:,:,k,bi,bj) = comlev1_bibj_k,
CADJ & key=kkey, byte=isbyte, kind = isbyte
CADJ STORE salt(:,:,k,bi,bj) = comlev1_bibj_k,
CADJ & key=kkey, byte=isbyte, kind = isbyte
#endif
C- potential density (reference level = surface level)
CALL FIND_RHO_2D(
I 1-OLx, sNx+OLx, 1-OLy, sNy+OLy, 1,
I theta(1-OLx,1-OLy,K,bi,bj), salt(1-OLx,1-OLy,K,bi,bj),
O rhoLoc,
I K, bi, bj, myThid )
DO j=1-Oly,sNy+Oly
DO i=1-Olx,sNx+Olx
IF ( k.LE.klowC(i,j,bi,bj) .AND.
& rhoLoc(i,j).GE.rhoMxL(i,j) ) THEN
IF ( rhoLoc(i,j).GT.rhoKm1(i,j) ) THEN
tmpFac = ( rhoMxL(i,j) - rhoKm1(i,j) )
& / ( rhoLoc(i,j) - rhoKm1(i,j) )
ELSE
tmpFac = 0.
ENDIF
SaltPlumeDepth(i,j,bi,bj) = rF(1)-rC(k-1)+tmpFac*drC(k)
rhoMxL(i,j) = rhoBigNb
ELSE
rhoKm1(i,j) = rhoLoc(i,j)
ENDIF
ENDDO
ENDDO
ENDDO
ELSEIF ( CriterionType.EQ.2 ) THEN
DO j=1-Oly,sNy+Oly
DO i=1-Olx,sNx+Olx
SaltPlumeDepth(i,j,bi,bj) = rF(1)-R_low(I,J,bi,bj)
SPIND(i,j) = 0. _d 0
ENDDO
ENDDO
DO k=2,Nr
#ifdef ALLOW_AUTODIFF_TAMC
kkey = (ikey-1)*Nr + k
CADJ STORE SPIND(:,:) = comlev1_bibj_k,
CADJ & key=kkey, byte=isbyte, kind = isbyte
#endif
DO j=1-Oly,sNy+Oly
DO i=1-Olx,sNx+Olx
GG =-1.0*sigmaR(i,j,k)
GGm1=-1.0*sigmaR(i,j,k-1)
IF ( k.LE.klowC(i,j,bi,bj) .AND.
& GG.GE.SaltPlumeCriterion ) THEN
IF (GGm1.LE.SaltPlumeCriterion) THEN
tmpFac = (SaltPlumeCriterion - GGm1)
& / (GG - GGm1)
IF(SPIND(i,j) .LT. 0.5) THEN
SaltPlumeDepth(i,j,bi,bj) = rF(1)-rC(k-1)+tmpFac*drC(k)
SPIND(i,j)=1.
ENDIF
ELSE
tmpFac = 0.
ENDIF
ENDIF
ENDDO
ENDDO
ENDDO
DO j=1-Oly,sNy+Oly
DO i=1-Olx,sNx+Olx
SaltPlumeDepth(i,j,bi,bj) =
& min( SaltPlumeDepth(i,j,bi,bj)*SPovershoot,
& rF(1)-R_low(i,j,bi,bj) )
ENDDO
ENDDO
ENDIF
C Make sure that the deepest SaltPlumeDepth is bottom topography:
DO j=1-Oly,sNy+Oly
DO i=1-Olx,sNx+Olx
SaltPlumeDepth(i,j,bi,bj) =
& min( SaltPlumeDepth(i,j,bi,bj),
& rF(1)-R_low(i,j,bi,bj) )
ENDDO
ENDDO
C#ifdef ALLOW_DIAGNOSTICS
C IF ( useDiagnostics )
C & CALL SALT_PLUME_DIAGNOSTICS_FILL(bi,bj,myThid)
C#endif /* ALLOW_DIAGNOSTICS */
#endif /* ALLOW_SALT_PLUME */
RETURN
END