C $Header: /u/gcmpack/MITgcm/pkg/gmredi/gmredi_calc_psi_b.F,v 1.14 2015/10/15 23:06:36 gforget Exp $
C $Name: $
#include "GMREDI_OPTIONS.h"
#ifdef ALLOW_AUTODIFF
# include "AUTODIFF_OPTIONS.h"
#endif
#ifdef ALLOW_CTRL
# include "CTRL_OPTIONS.h"
#endif
CBOP
C !ROUTINE: GMREDI_CALC_PSI_B
C !INTERFACE:
SUBROUTINE GMREDI_CALC_PSI_B(
I bi, bj, iMin, iMax, jMin, jMax,
I sigmaX, sigmaY, sigmaR,
I ldd97_LrhoW, ldd97_LrhoS,
I myThid )
C !DESCRIPTION: \bv
C *==========================================================*
C | SUBROUTINE GMREDI_CALC_PSI_B
C | o Calculate stream-functions for GM bolus velocity
C *==========================================================*
C \ev
C !USES:
IMPLICIT NONE
C == Global variables ==
#include "SIZE.h"
#include "GRID.h"
#include "DYNVARS.h"
#include "EEPARAMS.h"
#include "PARAMS.h"
#include "GMREDI.h"
#include "FFIELDS.h"
#ifdef ALLOW_CTRL
# include "CTRL_FIELDS.h"
#endif
#ifdef ALLOW_AUTODIFF_TAMC
#include "tamc.h"
#include "tamc_keys.h"
#endif /* ALLOW_AUTODIFF_TAMC */
C !INPUT/OUTPUT PARAMETERS:
C == Routine arguments ==
_RL sigmaX(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
_RL sigmaY(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
_RL sigmaR(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
_RL ldd97_LrhoW(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
_RL ldd97_LrhoS(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
INTEGER bi,bj,iMin,iMax,jMin,jMax
INTEGER myThid
CEOP
#ifdef ALLOW_GMREDI
#ifdef GM_BOLUS_ADVEC
C !LOCAL VARIABLES:
C == Local variables ==
INTEGER i,j,k, km1
_RL half_K
_RL SlopeX(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
_RL SlopeY(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
_RL dSigmaDrW(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
_RL dSigmaDrS(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
_RL taperX(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
_RL taperY(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
C- Initialization : <= done in S/R gmredi_init
#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
igmkey = (act1 + 1) + act2*max1
& + act3*max1*max2
& + act4*max1*max2*max3
#endif /* ALLOW_AUTODIFF_TAMC */
#ifdef ALLOW_AUTODIFF_TAMC
# ifdef GM_VISBECK_VARIABLE_K
CADJ STORE VisbeckK(:,:,bi,bj) = comlev1_bibj, key=igmkey, byte=isbyte
# endif
#endif
IF (GM_AdvForm) THEN
DO k=2,Nr
km1 = k-1
#ifdef ALLOW_AUTODIFF
DO j=1-OLy,sNy+OLy
DO i=1-OLx,sNx+OLx
SlopeX(i,j) = 0. _d 0
SlopeY(i,j) = 0. _d 0
dSigmaDrW(i,j) = 0. _d 0
dSigmaDrS(i,j) = 0. _d 0
ENDDO
ENDDO
#endif
C Gradient of Sigma below U and V points
DO j=1-OLy,sNy+OLy
DO i=1-OLx+1,sNx+OLx
SlopeX(i,j)=op5*( sigmaX(i,j,km1)+sigmaX(i,j,k) )
& *maskW(i,j,k,bi,bj)
dSigmaDrW(i,j)=op5*( sigmaR(i-1,j,k)+sigmaR(i,j,k) )
& *maskW(i,j,k,bi,bj)
ENDDO
ENDDO
DO j=1-OLy+1,sNy+OLy
DO i=1-OLx,sNx+OLx
SlopeY(i,j)=op5*( sigmaY(i,j,km1)+sigmaY(i,j,k) )
& *maskS(i,j,k,bi,bj)
dSigmaDrS(i,j)=op5*( sigmaR(i,j-1,k)+sigmaR(i,j,k) )
& *maskS(i,j,k,bi,bj)
ENDDO
ENDDO
C Calculate slopes , taper and/or clip
CALL GMREDI_SLOPE_PSI(
O taperX, taperY,
U SlopeX, SlopeY,
U dSigmaDrW, dSigmaDrS,
I ldd97_LrhoW, ldd97_LrhoS, rF(k), k,
I bi, bj, myThid )
#ifdef ALLOW_AUTODIFF_TAMC
kkey = (igmkey-1)*Nr + k
CADJ STORE SlopeX(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
CADJ STORE SlopeY(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
CADJ STORE taperX(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
CADJ STORE taperY(:,:) = comlev1_bibj_k, key=kkey, byte=isbyte
#endif /* ALLOW_AUTODIFF_TAMC */
C- Compute the 2 stream-function Components ( GM bolus vel.)
half_K = GM_background_K
& *(GM_bolFac1d(km1)+GM_bolFac1d(k))*op25
DO j=1-OLy,sNy+OLy
DO i=1-OLx+1,sNx+OLx
GM_PsiX(i,j,k,bi,bj) = SlopeX(i,j)*taperX(i,j)
#ifdef ALLOW_KAPGM_CONTROL
# ifdef ALLOW_KAPGM_CONTROL_OLD
& *( kapGM(i,j,k,bi,bj)
else
& *( op25*( kapGM(i-1,j,km1,bi,bj)+kapGM(i,j,km1,bi,bj)
& + kapGM(i-1,j,k,bi,bj)+kapGM(i,j,k,bi,bj))
# endif
#else
& *( half_K
& *(GM_bolFac2d(i-1,j,bi,bj)+GM_bolFac2d(i,j,bi,bj))
#endif
#ifdef GM_VISBECK_VARIABLE_K
& +op5*(VisbeckK(i-1,j,bi,bj)+VisbeckK(i,j,bi,bj))
#endif
& )*maskW(i,j,k,bi,bj)
#ifdef ALLOW_EDDYPSI
& +eddyPsiX(i,j,k,bi,bj)*maskW(i,j,k,bi,bj)
#endif
ENDDO
ENDDO
DO j=1-OLy+1,sNy+OLy
DO i=1-OLx,sNx+OLx
GM_PsiY(i,j,k,bi,bj) = SlopeY(i,j)*taperY(i,j)
#ifdef ALLOW_KAPGM_CONTROL
# ifdef ALLOW_KAPGM_CONTROL_OLD
& *( kapGM(i,j,k,bi,bj)
else
& *( op25*( kapGM(i,j-1,km1,bi,bj)+kapGM(i,j,km1,bi,bj)
& + kapGM(i,j-1,k,bi,bj)+kapGM(i,j,k,bi,bj))
# endif
#else
& *( half_K
& *(GM_bolFac2d(i,j-1,bi,bj)+GM_bolFac2d(i,j,bi,bj))
#endif
#ifdef GM_VISBECK_VARIABLE_K
& +op5*(VisbeckK(i,j-1,bi,bj)+VisbeckK(i,j,bi,bj))
#endif
& )*maskS(i,j,k,bi,bj)
#ifdef ALLOW_EDDYPSI
& +eddyPsiY(i,j,k,bi,bj)*maskS(i,j,k,bi,bj)
#endif
ENDDO
ENDDO
C----- end of loop on level k
ENDDO
ENDIF
#endif /* GM_BOLUS_ADVEC */
#endif /* ALLOW_GMREDI */
RETURN
END