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

#define size 5
#define root 1
#define tag 123

int main (int argc, char *argv[]) {
    int nprocs, myrank, count, error, i;
    double array[size];
    FILE *file;
    MPI_Status status;

    for (i = 0; i < size; ++i) array[i] = 0.0;
    MPI_Init(&argc,&argv);
    MPI_Comm_size(MPI_COMM_WORLD,&nprocs);
    MPI_Comm_rank(MPI_COMM_WORLD,&myrank);

    if (myrank == root) {
        if ((file = fopen("Programs/reals.input","r")) == NULL) {
            perror("");
            fprintf(stderr,"Unable to open data file\n");
            MPI_Abort(MPI_COMM_WORLD,1);
        }
        error = 0;
        for (i = 0; i < size; ++i)
            if (fscanf(file,"%lf",&array[i]) != 1) error = 1;
        if (error || ferror(file) || fclose(file)) {
            perror("");
            fprintf(stderr,"Unable to read data from file\n");
            MPI_Abort(MPI_COMM_WORLD,1);
        }
    }

    if (myrank == root) {
        for (i = 0; i < nprocs; ++i)
            if (i != myrank)
                MPI_Ssend(array,size,MPI_DOUBLE,i,tag,MPI_COMM_WORLD);
    } else {
        MPI_Recv(array,size,MPI_DOUBLE,root,tag,MPI_COMM_WORLD,&status);
        MPI_Get_count(&status,MPI_DOUBLE,&count);
        if (count != size || status.MPI_SOURCE != root ||
                status.MPI_TAG != tag) {
            fprintf(stderr,"Oops!\n");
            MPI_Abort(MPI_COMM_WORLD,1);
        }
    }
    printf("Processor %d now has data",myrank);
    for (i = 0; i < size; ++i) printf(" %.3f",array[i]);
    printf("\n");
    MPI_Finalize();
    return 0;
}
