C $Header: /u/gcmpack/MITgcm/eesupp/src/exch_cycle_ebl.F,v 1.5 2004/03/27 03:51:51 edhill Exp $
C $Name: $
#include "CPP_EEOPTIONS.h"
CBOP
C !ROUTINE: EXCH_CYCLE_EBL
C !INTERFACE:
SUBROUTINE EXCH_CYCLE_EBL( myThid )
IMPLICIT NONE
C !DESCRIPTION:
C *==========================================================*
C | SUBROUTINE EXCH\_CYCLE\_EBL
C | o Cycle exchange buffer level.
C *==========================================================*
C | Step the "exchange buffer level" to next value.
C | The buffer level is used to prevent consecutive messages
C | overwriting one another. Because we know that every tile
C | will participate in an exchange we can be sure that every
C | tile will cycle through the buffers with the same
C | sequence. Also we know that a tile cannot start a new
C | exchange before it has completed its end of the previous
C | exchange. Thus by cycling through three buffer levels we
C | can be sure that the buffer we write to will be free.
C | That is by the time we are participating in the third
C | exchange transaction we know that both ends of the first
C | transaction must have completed.
C | Note --
C | 1. We allow more than three levels below although this
C | is not necessary.
C *==========================================================*
C !USES:
C == Global data ==
#include "SIZE.h"
#include "EEPARAMS.h"
#include "EESUPPORT.h"
#include "EXCH.h"
C !INPUT PARAMETERS:
C == Routine arguments ==
C myThid :: Thread number of this instance of the routine
INTEGER myThid
C !LOCAL VARIABLES:
C == Local variables ==
C bi, bj :: Loop counters
INTEGER bi, bj
CEOP
DO bj=myByLo(myThid),myByHi(myThid)
DO bi=myBxLo(myThid),myBxHi(myThid)
C-- Use next level exchange buffer in cycle.
exchangeBufLevel(1,bi,bj) = exchangeBufLevel(1,bi,bj)+1
IF ( exchangeBufLevel(1,bi,bj) .GT. NUMBER_OF_BUFFER_LEVELS )
& exchangeBufLevel(1,bi,bj) = 1
ENDDO
ENDDO
RETURN
END