C $Header: /u/gcmpack/MITgcm/model/src/do_fields_blocking_exchanges.F,v 1.19 2004/11/02 19:09:55 edhill Exp $
C $Name:  $

#include "PACKAGES_CONFIG.h"
#include "CPP_OPTIONS.h"

CBOP
C     !ROUTINE: DO_FIELDS_BLOCKING_EXCHANGES
C     !INTERFACE:
      SUBROUTINE DO_FIELDS_BLOCKING_EXCHANGES(myThid)
C     !DESCRIPTION: \bv
C     /==========================================================\
C     | SUBROUTINE DO_FIELDS_BLOCKING_EXCHANGES                  |
C     | o Controlling routine for exchanging edge info.          |
C     |==========================================================|
C     | One key trick used in UV us that we over-compute and     |
C     | arrange our time-stepping loop so that we only need one  |
C     | edge exchange for the explicit code per timestep.        |
C     \==========================================================/
C     \ev
C     !USES:
      IMPLICIT NONE
C     == Global variables ===
#include "SIZE.h"
#include "EEPARAMS.h"
#include "PARAMS.h"
#include "DYNVARS.h"
#ifdef ALLOW_CD_CODE
#include "CD_CODE_VARS.h"
#endif

C     !INPUT/OUTPUT PARAMETERS:
C     == Routine arguments ==
C     myThid - Thread number for this instance of the routine.
      INTEGER myThid
CEOP

c     _EXCH_XYZ_R8( Gu , myThid )
c     _EXCH_XYZ_R8( Gv , myThid )
c     _EXCH_XYZ_R8( Gt , myThid )
c     _EXCH_XYZ_R8( Gs , myThid )
c     _EXCH_XYZ_R8( gUNm1 , myThid )
c     _EXCH_XYZ_R8( gVNm1 , myThid )
c     _EXCH_XYZ_R8( gTNm1 , myThid )
c     _EXCH_XYZ_R8( gSNm1 , myThid )
c     _EXCH_XYZ_R8( uVel , myThid )
c     _EXCH_XYZ_R8( vVel , myThid )
#ifndef ALLLOW_OFFLINE
      IF ( .NOT.staggerTimeStep .OR. .NOT.useMultiDimAdvec ) THEN
       CALL EXCH_UV_XYZ_RL(uVel,vVel,.TRUE.,myThid)
       _EXCH_XYZ_R8( wVel , myThid )
      ENDIF
c     IF ( exactConserv .AND. implicDiv2Dflow .NE. 0. _d 0)
c    & _EXCH_XY_R8( etaN , myThid )
      _EXCH_XYZ_R8( theta, myThid )
      _EXCH_XYZ_R8( salt , myThid )
#endif

#ifndef ALLOW_OFFLINE
#ifdef ALLOW_CD_CODE
c     _EXCH_XYZ_R8( guCD , myThid )
c     _EXCH_XYZ_R8( gvCD , myThid )
      _EXCH_XYZ_R8( uVelD , myThid )
      _EXCH_XYZ_R8( vVelD , myThid )
#endif
      IF ( useDynP_inEos_Zc )
     & _EXCH_XYZ_RL( totPhiHyd , myThid )
#endif

#ifdef ALLOW_PTRACERS
      IF (usePTRACERS)
     &  CALL PTRACERS_FIELDS_BLOCKING_EXCH(myThid)
#endif /* ALLOW PTRACERS */

#ifdef ALLOW_GGL90
      IF (useGGL90)
     &  CALL GGL90_EXCHANGES(myThid)
#endif /* ALLOW_GGL90 */

      RETURN
      END