C $Header: /u/gcmpack/MITgcm/model/src/tracers_iigw_correction.F,v 1.2 2006/06/07 01:55:13 heimbach Exp $
C $Name: $
#include "CPP_OPTIONS.h"
CBOP
C !ROUTINE: TRACERS_CORRECTION_IIGW
C !INTERFACE:
SUBROUTINE TRACERS_IIGW_CORRECTION(
I bi, bj, myTime, myIter, myThid )
C !DESCRIPTION: \bv
C *==========================================================*
C | S/R TRACERS_IIGW_CORRECTION
C | o apply correction term to Tracers due to Implicit
C | treatment of Internal Gravity Waves:
C- | -DeltaT.(w^{n+1}-w^{n})*d.Tr_{ref}/dz
C *==========================================================*
C \ev
C !USES:
IMPLICIT NONE
C == Global variables ==
#include "SIZE.h"
#include "EEPARAMS.h"
#include "PARAMS.h"
#include "GRID.h"
#include "DYNVARS.h"
#ifdef ALLOW_NONHYDROSTATIC
#include "NH_VARS.h"
#endif
C !INPUT/OUTPUT PARAMETERS:
C == Routine Arguments ==
C bi,bj :: tile indices
C myTime :: current time in simulation
C myIter :: current iteration number in simulation
C myThid :: my Thread Id number
INTEGER bi,bj
_RL myTime
INTEGER myIter
INTEGER myThid
#ifdef ALLOW_NONHYDROSTATIC
C !LOCAL VARIABLES:
C == Local variables ==
C i,j,k :: Loop counters
INTEGER i,j,k
INTEGER kp1
_RL dTr_k, dTrp1
_RL dW_k(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
_RL dWp1(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
CEOP
C- Initialise dW = w^{n+1} - w^{n} to zero:
DO j=1-Oly,sNy+Oly
DO i=1-Olx,sNx+Olx
dWp1(i,j) = 0. _d 0
ENDDO
ENDDO
C-- Start vertical loop
DO k=1,Nr
C- Compute dW @ interface k & k+1
kp1 = MIN(k+1,Nr)
DO j=1-Oly,sNy+Oly
DO i=1-Olx,sNx+Olx
dW_k(i,j) = dWp1(i,j)
dWp1(i,j) = ( wVel(i,j,kp1,bi,bj)
& - gW(i,j,kp1,bi,bj) )*maskC(i,j,k,bi,bj)
ENDDO
ENDDO
C- Add Impl.IGW correction to Pot.Temperature:
dTr_k = 0. _d 0
IF ( k.GT.1 ) dTr_k = (tRef(k) - tRef(k-1))*rkSign
dTrp1 = (tRef(kp1) - tRef(k))*rkSign
IF ( tempAdvection .AND.
& (dTr_k.NE.0. _d 0 .OR. dTrp1.NE.0. _d 0) ) THEN
DO j=1-Oly,sNy+Oly
DO i=1-Olx,sNx+Olx
theta(i,j,k,bi,bj) = theta(i,j,k,bi,bj)
& -dTtracerLev(k)*0.5 _d 0
& *( dTr_k*dW_k(i,j) + dTrp1*dWp1(i,j) )
& *recip_drF(k)*_recip_hFacC(i,j,k,bi,bj)
ENDDO
ENDDO
ENDIF
C- Add Impl.IGW correction to Salinity/Water vapor:
dTr_k = 0. _d 0
IF ( k.GT.1 ) dTr_k = (sRef(k) - sRef(k-1))*rkSign
dTrp1 = (sRef(kp1) - sRef(k))*rkSign
IF ( saltAdvection .AND.
& (dTr_k.NE.0. _d 0 .OR. dTrp1.NE.0. _d 0) ) THEN
DO j=1-Oly,sNy+Oly
DO i=1-Olx,sNx+Olx
salt(i,j,k,bi,bj) = salt(i,j,k,bi,bj)
& -dTtracerLev(k)*0.5 _d 0
& *( dTr_k*dW_k(i,j) + dTrp1*dWp1(i,j) )
& *recip_drF(k)*_recip_hFacC(i,j,k,bi,bj)
ENDDO
ENDDO
ENDIF
C- End of k loop
ENDDO
#endif /* ALLOW_NONHYDROSTATIC */
RETURN
END