// Program:segundo.c
// Programado: Edson/Siang
// Data: 27/02/2003
// Este programa envia o seu rank para as tarefas que estao sendo executadas e 
// recebe o rank das demais tarefa

// Bibliotecas utilizadas
#include <stdio.h>
#include "mpi.h"

// Inicio da funcao principal
main(int argc, char* argv[]) {
// declaracao das variaveis locais
    int         my_rank;       /* rank of process      */
    int         p;             /* number of processes  */
    int         *source;        /* rank of sender       */
    int         *dest;          /* rank of receiver     */
    int         tag = 0;       /* tag for messages     */
    int         i;
    MPI_Status  status;        /* return status for    */
                               /* receive              */
// Passo 1. Inicializacao
// Passo 1.1. Inicialize o MPI
    MPI_Init(&argc, &argv);
// Passo 1.2. Determine o rank da tarefa
    MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
// Passo 1.3. Determine o numero de tarefas
    MPI_Comm_size(MPI_COMM_WORLD, &p);
// Passo 2. Envie/receba o rank
// Passo 2.1.Dimensione os arrays de envio/recebimento (cada tarefa envia p
// MSG's (inclusive para ela mesmo)!!!!!!!
    dest = (int *) malloc(p*sizeof(int));
    source = (int *) malloc(p*sizeof(int));
// Passo 2.2.Atribua my_rank para cada posicao do vetor source (precisamos 
// fazer a atribuicao do que sera enviado para cada tarefa
    for (i = 0; i < p; i++)
      source[i] = my_rank;
// Passo 2.3.Envie/receba o seu rank
    MPI_Alltoall(source, 1, MPI_INT, dest, 1, MPI_INT, MPI_COMM_WORLD);
// Passo 3. Imprima o rank recebido
    for (i = 0; i < p; i++)
       printf("Meu rank %d recebi %d do rank %d\n", my_rank, dest[i], i);
// Passo 4. Finalize o MPI
    MPI_Finalize();
} /* main */
