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

int main(int argc, char* argv[]) {
  int    i,n,myrank,numprocs;
  double x,sum,pi,h,mypi;
  FILE*  in;

  MPI_Init(&argc, &argv);
  MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
  MPI_Comm_size(MPI_COMM_WORLD, &numprocs);

  if ( myrank == 0 ) {
    if ( (in = fopen("pi.dat", "r")) == NULL ) {
      perror("pi.dat");
      return 1;
    }
    fscanf(in, "%d", &n);
  }

  MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD);

  h   = 1.0 / n;
  sum = 0.0;
  for (i=myrank; i<n; i+=numprocs) {
    x = (i + 0.5) * h;
    sum += 4.0 / ( 1.0 + x*x );
  }
  mypi = h * sum;

  MPI_Reduce(&mypi, &pi, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);

  if ( myrank == 0 ) {
    printf("Value of pi is %16.12f\n", pi);
  }
  MPI_Finalize();
  return 0;
}

