C $Header: /u/gcmpack/MITgcm/pkg/matrix/matrix_store_tendency.F,v 1.6 2014/08/11 20:29:06 jmc Exp $
C $Name:  $

#include "MATRIX_OPTIONS.h"

C--   File matrix_store_tendency.F:
C      Contents
C      o MATRIX_STORE_TENDENCY_EXP
C      o MATRIX_STORE_TENDENCY_IMP

C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
CBOP
C !ROUTINE: MATRIX_STORE_TENDENCY_EXP

C !INTERFACE: ==========================================================
      SUBROUTINE MATRIX_STORE_TENDENCY_EXP(
     I                  iTracer, bi, bj,
     U                  tracNew,
     I                  myTime, myIter, myThid )

C !DESCRIPTION:
C     This routine accumalates the explicit tendency matrix. Note that
C     on entry gPtr is the tracer field after explicit advection-
C     diffusion. On exit, gPtr is set to the initial tracer field for
C     the next step (implicit matrix calculation).

C !USES: ===============================================================
      IMPLICIT NONE
#include "SIZE.h"
#include "EEPARAMS.h"
#include "PARAMS.h"
#include "PTRACERS_SIZE.h"
#include "PTRACERS_PARAMS.h"
#include "MATRIX.h"

C !INPUT/OUTPUT PARAMETERS: ============================================
C     tracNew :: updated tracer field (after adding explicit contributions)
      INTEGER iTracer
      INTEGER bi, bj
      _RL     myTime
      _RL     tracNew(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
      INTEGER myIter
      INTEGER myThid

#ifdef ALLOW_MATRIX
C !LOCAL VARIABLES: ====================================================
      INTEGER i,j,k
CEOP

      DO k=1,Nr
       DO j=1-OLy, sNy+OLy
        DO i=1-OLx, sNx+OLx
          MATRIX(i,j,k,bi,bj,iTracer,1) = MATRIX(i,j,k,bi,bj,iTracer,1)
     &     + ( tracNew(i,j,k) - PTRACERS_initial(i,j,k,bi,bj,iTracer) )
          tracNew(i,j,k) = PTRACERS_initial(i,j,k,bi,bj,iTracer)
        ENDDO
       ENDDO
      ENDDO

C-    Increment counter when processing the last pTracer
      IF ( iTracer.EQ.PTRACERS_numInUse ) THEN
        expMatrixCounter(bi,bj) = expMatrixCounter(bi,bj) + 1
      ENDIF

#endif /* ALLOW_MATRIX */
      RETURN
      END


C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| CBOP C !ROUTINE: MATRIX_STORE_TENDENCY_IMP C !INTERFACE: ========================================================== SUBROUTINE MATRIX_STORE_TENDENCY_IMP( I bi, bj, myTime, myIter, myThid ) C !DESCRIPTION: C This routine accumalates the implicit update matrix. Note that on C entry PTR is the tracer field after implicit advection- C diffusion. On exit, PTR is set to the initial tracer field. C !USES: =============================================================== IMPLICIT NONE #include "SIZE.h" #include "EEPARAMS.h" #include "PARAMS.h" #include "PTRACERS_SIZE.h" #include "PTRACERS_PARAMS.h" #include "PTRACERS_FIELDS.h" #include "MATRIX.h" C !INPUT/OUTPUT PARAMETERS: ============================================ INTEGER bi, bj _RL myTime INTEGER myIter INTEGER myThid #ifdef ALLOW_MATRIX C !LOCAL VARIABLES: ==================================================== INTEGER iTracer INTEGER i,j,k CEOP DO iTracer=1,PTRACERS_numInUse DO k=1,Nr DO j=1-OLy, sNy+OLy DO i=1-OLx, sNx+OLx MATRIX(i,j,k,bi,bj,iTracer,2) = & MATRIX(i,j,k,bi,bj,iTracer,2) & + pTracer(i,j,k,bi,bj,iTracer) pTracer(i,j,k,bi,bj,iTracer)= & PTRACERS_initial(i,j,k,bi,bj,iTracer) ENDDO ENDDO ENDDO ENDDO impMatrixCounter(bi,bj) = impMatrixCounter(bi,bj) + 1 #endif /* ALLOW_MATRIX */ RETURN END