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