C $Header: /u/gcmpack/MITgcm/pkg/opps/opps_interface.F,v 1.5 2010/01/03 19:11:43 jmc Exp $
C $Name: $
#include "OPPS_OPTIONS.h"
CBOP
C !ROUTINE: OPPS_INTERFACE
C !INTERFACE:
SUBROUTINE OPPS_INTERFACE(
I bi, bj, iMin, iMax, jMin, jMax,
I myTime, myIter, myThid )
C !DESCRIPTION: \bv
C *================================================================*
C | SUBROUTINE OPPS_INTERFACE |
C | o Driver for OPPS mixing scheme that can be called |
C | instead of convective_adjustment. |
C | Reference: Paluszkiewicz+Romea, Dynamics of Atmospheres and |
C | Oceans (1997) 26, pp. 95-130 |
C | o Support for passive tracers by joint treatment of |
C | active (theta, salt) and passive tracers. The array |
C | tracerLoc(Nr,2+PTRACERS_num) contains |
C | theta = tracerLoc(:,1), |
C | salt = tracerLoc(:,2), and |
C | ptracers = tracerLoc(:,3:PTRACERS_num+2). For this to |
C | work, the routine opps_calc had to be modified |
C | considerably. opps_calc is based on nlopps.F but there is |
C | is little left of the original (see opps_calc.F) |
C *================================================================*
C \ev
C !USES:
IMPLICIT NONE
C == Global data ==
#include "SIZE.h"
#include "EEPARAMS.h"
#include "PARAMS.h"
#include "DYNVARS.h"
#include "GRID.h"
#include "OPPS.h"
#ifdef ALLOW_PTRACERS
#include "PTRACERS_SIZE.h"
#include "PTRACERS_PARAMS.h"
#include "PTRACERS_FIELDS.h"
#endif
C !INPUT/OUTPUT PARAMETERS:
C == Routine arguments ==
C bi,bj,iMin,iMax,jMin,jMax,K - Loop counters
C myTime - Current time in simulation
C myIter - Current iteration in simulation
C myThid - Thread number of this instance of S/R CONVECT
INTEGER bi,bj,iMin,iMax,jMin,jMax
_RL myTime
INTEGER myIter
INTEGER myThid
#ifdef ALLOW_OPPS
C !LOCAL VARIABLES:
C == Local variables ==
C msgBuf - Informational/error meesage buffer
INTEGER nTracer
#ifdef ALLOW_PTRACERS
PARAMETER( nTracer = 2+PTRACERS_num )
INTEGER itr
#else /* not ALLOW_PTRACERS */
PARAMETER( nTracer = 2 )
#endif /* ALLOW_PTRACERS */
INTEGER I, J, K, kMax
INTEGER nTracerInUse
_RL tMin, tMax, sMin, sMax
_RL tMinNew, tMaxNew, sMinNew, sMaxNew
_RL wVelLoc(Nr)
_RL tracerLoc(Nr,nTracer)
CHARACTER*(MAX_LEN_MBUF) msgBuf
CEOP
C initialization
#ifdef ALLOW_PTRACERS
nTracerInUse = 2+PTRACERS_numInUse
#else
nTracerInUse = 2
#endif /* ALLOW_PTRACERS */
tMax = -1. _d 23
tMin = 1. _d 23
sMax = -1. _d 23
sMin = 1. _d 23
tMaxNew = -1. _d 23
tMinNew = 1. _d 23
sMaxNew = -1. _d 23
sMinNew = 1. _d 23
tMinNew = 1. _d 23
C re-initialize convection counter
DO K=1,Nr
DO J=1-Oly,sNy+Oly
DO I=1-Olx,sNx+Olx
OPPSconvectCount(I,J,K,bi,bj) = 0. _d 0
ENDDO
ENDDO
ENDDO
C
DO J=jMin,jMax
DO I=iMin,iMax
IF ( kSurfC(I,J,bi,bj) .LE. Nr ) THEN
IF ( useGCMwVel ) THEN
DO K=1,Nr
tracerLoc(K,1) = theta(I,J,K,bi,bj)
tracerLoc(K,2) = salt(I,J,K,bi,bj)
wVelLoc(K) = wVel(I,J,K,bi,bj)
ENDDO
ELSE
DO K=1,Nr
tracerLoc(K,1) = theta(I,J,K,bi,bj)
tracerLoc(K,2) = salt(I,J,K,bi,bj)
wVelLoc(K) = - VERTICAL_VELOCITY
ENDDO
ENDIF
#ifdef ALLOW_PTRACERS
DO itr = 3, nTracerInUse
DO K=1,Nr
tracerLoc(K,itr) = ptracer(I,J,K,bi,bj,itr-2)
ENDDO
ENDDO
#endif /* ALLOW_PTRACERS */
#ifdef ALLOW_OPPS_DEBUG
IF ( OPPSdebugLevel .GE. debLevA ) THEN
C determine range of temperature and salinity
tMax = -1. d 23
tMin = 1. d 23
sMax = -1. d 23
sMin = 1. d 23
DO K=1,Nr
tMax = MAX(tracerLoc(K,1),tMax)
tMin = MAX(tracerLoc(K,1),tMin)
sMax = MAX(tracerLoc(K,2),sMax)
sMin = MAX(tracerLoc(K,2),sMin)
ENDDO
ENDIF
#endif /* ALLOW_OPPS_DEBUG */
kMax = kLowC(I,J,bi,bj)
CALL OPPS_CALC(
U tracerLoc,
I wVelLoc,kMax,nTracer,nTracerInUse,
I I,J,bi,bj,myTime,myIter,myThid)
#ifdef ALLOW_OPPS_DEBUG
IF ( OPPSdebugLevel .GE. debLevA ) THEN
C determine range of temperature and salinity
tMaxNew = -1. d 23
tMinNew = 1. d 23
sMaxNew = -1. d 23
sMinNew = 1. d 23
DO K=1,Nr
tMaxNew = MAX(tracerLoc(K,1),tMaxNew)
tMinNew = MAX(tracerLoc(K,1),tMinNew)
sMaxNew = MAX(tracerLoc(K,2),sMaxNew)
sMinNew = MAX(tracerLoc(K,2),sMinNew)
ENDDO
IF ( tMaxNew.GT.tMax .OR. tMinNew.LT.tMin .OR.
& sMaxNew.GT.sMax .OR. sMinNew.LT.sMIN ) THEN
WRITE(msgBuf,'(A,A)') 'OPPS_INTERFACE: theta or S-range is',
& ' larger than before mixing'
CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
& SQUEEZE_RIGHT , myThid )
WRITE(msgBuf,'(A,2I5)') ' for (i,j) = ', I,J
CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
& SQUEEZE_RIGHT , myThid )
ENDIF
ENDIF
#endif /* ALLOW_OPPS_DEBUG */
DO K=1,Nr
theta(I,J,K,bi,bj) = tracerLoc(K,1)
salt(I,J,K,bi,bj) = tracerLoc(K,2)
ENDDO
#ifdef ALLOW_PTRACERS
DO itr = 3, nTracerInUse
DO K=1,Nr
ptracer(I,J,K,bi,bj,itr-2) = tracerLoc(K,itr)
ENDDO
ENDDO
#endif /* ALLOW_PTRACERS */
ENDIF
ENDDO
ENDDO
#endif /* ALLOW_OPPS */
RETURN
END