#include <stdio.h>
#include <stdlib.h>
#include "mpi.h"

#define SIZE 100

int main (int argc, char * argv[])
{
  int size;
  int rank;
  int i, j;
  float send_array[SIZE], recv_array[SIZE];
  MPI_Request req[2];
  MPI_Status statuses[2];

  MPI_Init (&argc, &argv);
  MPI_Comm_rank (MPI_COMM_WORLD, &rank);
  MPI_Comm_size (MPI_COMM_WORLD, &size);

  /*
   * Initialize send and recv-array
   */

  for (j = 0; j < SIZE; j++)
    {
      send_array[j] = 1.0;
      recv_array[j] = 0.0;
    }

  for (i = 0; i < size; i++)
    {
      int j;
      MPI_Irecv (recv_array, SIZE, MPI_FLOAT, (rank + size -1) % size, 4711, MPI_COMM_WORLD, &req[0]);
      MPI_Isend (send_array, SIZE, MPI_FLOAT, (rank +1) % size, 4711, MPI_COMM_WORLD, &req[1]);
      MPI_Waitall (2, req, statuses); 

      for (j = 0; j < SIZE; j++)
        send_array[j] = send_array[j] + recv_array[j];
    }

  printf ("recv_array[0]:%f\n", recv_array[0]);

  MPI_Finalize ();
  return 0;
}
