  ! przykład użycia procedur SENDRECV i SEND-NDRECV_REPLACE
  !
  integer mynode, totalnodes, mpierr
  integer datasize ! liczba jednostek danych send/recv
  integer process1, process2 ! rangi procesów wymieniających dane
  integer tag1, tag2 ! znacznik komunikatu
  real*8, dimension(:), allocatable :: buff, sendbuff, recvbuff
  MPI_status status ! zmienna przechowujaca informacje o stanie

  call MPI_INIT( ierr )
  call MPI_COMM_SIZE(MPI_COM_WORLD, totalnodes, mpierr)
  call MPI_COMM_RANK(MPI_COM_WORLD, mynode, mpierr)

  ! rezerwacja buforow danych, process1, process2
  allocate(sendbuff(datasize))
  allocate(recvbuff(datasize))
  allocate(buff(datasize))

  if (mynode == process1) then
     ! dane w sendbuff są wysylane do process2, odbierane od process2
     ! dane trafiają do bufora recvbuff
     call MPI_SENDRECV(sendbuff, datasize, MPI_DOUBLE, process2, &
          tag1, recvbuff, datasize, MPI_DOUBLE, process2, &
          tag2, MPI_COMM_WORLD, status)
     ! wywolanie powoduje wymiane (swap) zawartosci bufora buff
     ! z process2
     call MPI_SENDRECV_REPLACE(buff, datasize, MPI_DOUBLE, process2, &
          tag1, process2, tag2, MPI_COMM_WORLD, status)
  end if

  if (mynode == process2) then
     ! zawartosc sendbuff jest przekazana do procesu process1, a dane
     ! trzymane od procesu process1 sa umieszczane w buforze recvbuff
     call MPI_SENDRECV(sendbuff, datasize, MPI_DOUBLE, process1, &
          tag2, recvbuff, datasize, MPI_DOUBLE, process1, &
          tag1, MPI_COMM_WORLD, status)
     ! wymiana danych buff z procesem process1
     !
     call MPI_SENDRECV_REPLACE(buff, datasize, MPI_DOUBLE, process1, &
          tag2, process1, tag1, MPI_COMM_WORLD, status)
  end if

  ! process1 ma w swoim buforze recvbuff zawartosc bufora sendbuff
  ! procesu process1; process2 w swoim buforze recvbuff ma zawartosc
  ! buforu sendbuff procesu process1; zawartosc buforow buff obu
  ! procesów zostala zamieniona
