C $Header: /u/gcmpack/MITgcm/pkg/aim/aim_external_forcing.F,v 1.6 2002/09/27 20:05:11 jmc Exp $
C $Name: $
#include "AIM_OPTIONS.h"
CStartOfInterface
SUBROUTINE AIM_EXTERNAL_FORCING_U(
I iMin, iMax, jMin, jMax,bi,bj,kLev,
I myCurrentTime,myThid)
C /==========================================================\
C | S/R AIM_EXTERNAL_FORCING_U |
C | o Add AIM tendency terms to U tendency. |
C \==========================================================/
IMPLICIT NONE
C == Global data ==
#include "SIZE.h"
#include "EEPARAMS.h"
#include "PARAMS.h"
#include "GRID.h"
#include "DYNVARS.h"
#include "AIM2DYN.h"
#include "AIM_DIAGS.h"
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
#ifdef ALLOW_AIM
C == Local variables ==
C i,j - Loop counters
INTEGER i, j
_RL DDTT, uStr_tmp
DDTT = deltaTclock
#ifdef OLD_AIM_INTERFACE
c---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
C - to reproduce old results (coupled run, summer 2000) :
IF (kLev.eq.1) THEN
DO j=jMin,jMax
DO i=iMin,iMax
uStr_tmp = -aim_drag(i,j,bi,bj)*uVel(i,j,kLev,bi,bj)
gU(i,j,kLev,bi,bj) = gU(i,j,kLev,bi,bj)
& + uStr_tmp*gravity*recip_drF(kLev)
#ifdef ALLOW_TIMEAVE
USTRtave(i,j,bi,bj) = USTRtave(i,j,bi,bj) + uStr_tmp*DDTT
#endif
ENDDO
ENDDO
ELSE
DO j=jMin,jMax
DO i=iMin,iMax
IF ( maskW(i,j,kLev-1,bi,bj) .EQ. 0. ) THEN
uStr_tmp = -aim_drag(i,j,bi,bj)*uVel(i,j,kLev,bi,bj)
#ifdef ALLOW_TIMEAVE
USTRtave(i,j,bi,bj) = USTRtave(i,j,bi,bj) + uStr_tmp*DDTT
#endif
C - put the same bug as in the old setup :
IF ( maskC(i,j,kLev-1,bi,bj) .EQ. 1. ) uStr_tmp = 0.
gU(i,j,kLev,bi,bj) = gU(i,j,kLev,bi,bj)
& + uStr_tmp*gravity*recip_drF(kLev)
ENDIF
ENDDO
ENDDO
ENDIF
#else /* OLD_AIM_INTERFACE */
c---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
IF (kLev.eq.1) THEN
DO j=jMin,jMax
DO i=iMin,iMax
IF ( hFacW(i,j,kLev,bi,bj) .NE. 0. ) THEN
uStr_tmp =
& -( aim_drag(i-1,j,bi,bj)+aim_drag(i,j,bi,bj) )
& * 0.5 _d 0 * uVel(i,j,kLev,bi,bj)
gU(i,j,kLev,bi,bj) = gU(i,j,kLev,bi,bj)
& + uStr_tmp*gravity*recip_drF(kLev)
c & * recip_hFacW(i,j,kLev,bi,bj)
#ifdef ALLOW_TIMEAVE
USTRtave(i,j,bi,bj) = USTRtave(i,j,bi,bj) + uStr_tmp*DDTT
#endif
ENDIF
ENDDO
ENDDO
ELSE
DO j=jMin,jMax
DO i=iMin,iMax
IF ( hFacW(i,j,kLev,bi,bj) .NE. 0. ) THEN
uStr_tmp =
& -( (1.-maskC(i-1,j,kLev-1,bi,bj))*aim_drag(i-1,j,bi,bj)
& +(1.-maskC( i ,j,kLev-1,bi,bj))*aim_drag( i ,j,bi,bj)
& )* 0.5 _d 0 * uVel(i,j,kLev,bi,bj)
gU(i,j,kLev,bi,bj) = gU(i,j,kLev,bi,bj)
& + uStr_tmp*gravity*recip_drF(kLev)
c & * recip_hFacW(i,j,kLev,bi,bj)
#ifdef ALLOW_TIMEAVE
USTRtave(i,j,bi,bj) = USTRtave(i,j,bi,bj) + uStr_tmp*DDTT
#endif
ENDIF
ENDDO
ENDDO
ENDIF
c---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
#endif /* OLD_AIM_INTERFACE */
#endif /* ALLOW_AIM */
RETURN
END
CStartOfInterface
SUBROUTINE AIM_EXTERNAL_FORCING_V(
I iMin, iMax, jMin, jMax,bi,bj,kLev,
I myCurrentTime,myThid)
C /==========================================================\
C | S/R EXTERNAL_FORCING_V |
C | o Add AIM tendency to meridional velocity. |
C \==========================================================/
IMPLICIT NONE
C == Global data ==
#include "SIZE.h"
#include "EEPARAMS.h"
#include "PARAMS.h"
#include "GRID.h"
#include "DYNVARS.h"
#include "AIM2DYN.h"
#include "AIM_DIAGS.h"
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
#ifdef ALLOW_AIM
C == Local variables ==
C Loop counters
INTEGER i, j
_RL DDTT, vStr_tmp
DDTT = deltaTclock
C call CHKSUM_TILED( ' drag AAA ',aim_drag,1,bi,bj,myThid )
#ifdef OLD_AIM_INTERFACE
c---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
C - to reproduce old results (coupled run, summer 2000) :
IF (kLev.eq.1) THEN
DO j=jMin,jMax
DO i=iMin,iMax
vStr_tmp = -aim_drag(i,j,bi,bj)*vVel(i,j,kLev,bi,bj)
gV(i,j,kLev,bi,bj) = gV(i,j,kLev,bi,bj)
& + vStr_tmp*gravity*recip_drF(kLev)
#ifdef ALLOW_TIMEAVE
VSTRtave(i,j,bi,bj) = VSTRtave(i,j,bi,bj) + vStr_tmp*DDTT
#endif
ENDDO
ENDDO
ELSE
DO j=jMin,jMax
DO i=iMin,iMax
IF ( maskS(i,j,kLev-1,bi,bj) .EQ. 0. ) THEN
vStr_tmp = -aim_drag(i,j,bi,bj)*vVel(i,j,kLev,bi,bj)
#ifdef ALLOW_TIMEAVE
VSTRtave(i,j,bi,bj) = VSTRtave(i,j,bi,bj) + vStr_tmp*DDTT
#endif
C - put the same bug as in the old setup :
IF ( maskC(i,j,kLev-1,bi,bj) .EQ. 1. ) vStr_tmp = 0.
gV(i,j,kLev,bi,bj) = gV(i,j,kLev,bi,bj)
& + vStr_tmp*gravity*recip_drF(kLev)
ENDIF
ENDDO
ENDDO
ENDIF
#else /* OLD_AIM_INTERFACE */
c---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
IF (kLev.eq.1) THEN
DO j=jMin,jMax
DO i=iMin,iMax
IF ( hFacS(i,j,kLev,bi,bj) .NE. 0. ) THEN
vStr_tmp =
& -( aim_drag(i,j-1,bi,bj)+aim_drag(i,j,bi,bj) )
& * 0.5 _d 0 * vVel(i,j,kLev,bi,bj)
gV(i,j,kLev,bi,bj) = gV(i,j,kLev,bi,bj)
& + vStr_tmp*gravity*recip_drF(kLev)
c & * recip_hFacS(i,j,kLev,bi,bj)
#ifdef ALLOW_TIMEAVE
VSTRtave(i,j,bi,bj) = VSTRtave(i,j,bi,bj) + vStr_tmp*DDTT
#endif
ENDIF
ENDDO
ENDDO
ELSE
DO j=jMin,jMax
DO i=iMin,iMax
IF ( hFacS(i,j,kLev,bi,bj) .NE. 0. ) THEN
vStr_tmp =
& -( (1.-maskC(i,j-1,kLev-1,bi,bj))*aim_drag(i,j-1,bi,bj)
& +(1.-maskC(i, j ,kLev-1,bi,bj))*aim_drag(i, j ,bi,bj)
& )* 0.5 _d 0 * vVel(i,j,kLev,bi,bj)
gV(i,j,kLev,bi,bj) = gV(i,j,kLev,bi,bj)
& + vStr_tmp*gravity*recip_drF(kLev)
c & * recip_hFacS(i,j,kLev,bi,bj)
#ifdef ALLOW_TIMEAVE
VSTRtave(i,j,bi,bj) = VSTRtave(i,j,bi,bj) + vStr_tmp*DDTT
#endif
ENDIF
ENDDO
ENDDO
ENDIF
c---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
#endif /* OLD_AIM_INTERFACE */
#endif /* ALLOW_AIM */
RETURN
END
CStartOfInterface
SUBROUTINE AIM_EXTERNAL_FORCING_T(
I iMin, iMax, jMin, jMax,bi,bj,kLev,
I myCurrentTime,myThid)
C /==========================================================\
C | S/R AIM_EXTERNAL_FORCING_T |
C | o Add AIM tendency to T |
C \==========================================================/
IMPLICIT NONE
C == Global data ==
#include "SIZE.h"
#include "EEPARAMS.h"
#include "PARAMS.h"
#include "GRID.h"
#include "DYNVARS.h"
#include "AIM2DYN.h"
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
#ifdef ALLOW_AIM
C == Local variables ==
C Loop counters
INTEGER I, J
C-- Forcing: add AIM heating/cooling tendency to gT:
DO J=1,sNy
DO I=1,sNx
gT(i,j,kLev,bi,bj) = maskC(i,j,kLev,bi,bj)
& *( gT(i,j,kLev,bi,bj) + aim_dTdt(i,j,kLev,bi,bj) )
ENDDO
ENDDO
#endif /* ALLOW_AIM */
RETURN
END
CStartOfInterface
SUBROUTINE AIM_EXTERNAL_FORCING_S(
I iMin, iMax, jMin, jMax,bi,bj,kLev,
I myCurrentTime,myThid)
C /==========================================================\
C | S/R AIM_EXTERNAL_FORCING_S |
C | o Add AIM tendency to S. |
C \==========================================================/
IMPLICIT NONE
C == Global data ==
#include "SIZE.h"
#include "EEPARAMS.h"
#include "PARAMS.h"
#include "GRID.h"
#include "DYNVARS.h"
#include "AIM2DYN.h"
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
#ifdef ALLOW_AIM
C == Local variables ==
C Loop counters
INTEGER I, J
C-- Forcing: add AIM dq/dt tendency to gS:
DO J=1,sNy
DO I=1,sNx
gS(i,j,kLev,bi,bj) = maskC(i,j,kLev,bi,bj)
& *( gS(i,j,kLev,bi,bj) + aim_dSdt(i,j,kLev,bi,bj) )
ENDDO
ENDDO
#endif /* ALLOW_AIM */
RETURN
END