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

#define PI32DT 3.14159265358979323846264338327950

int main(int argc, char** argv) {
		int n, i, numprocs, rank;
		double sum, pi;
		n = atoi(argv[1]);
		MPI_Init(&argc, &argv);
		MPI_Comm_size(MPI_COMM_WORLD, &numprocs);
		MPI_Comm_rank(MPI_COMM_WORLD, &rank);
		MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD);
		sum = 0.0;
		for(i = rank + 1; i <= n; i+=numprocs) { /* use the Leibniz method */
				sum += ((i%2 == 0)? -4.0:4.0) / (2*i - 1);
		}
		MPI_Reduce(&sum, &pi, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);
		if (rank == 0) {
				printf("Pi = %.32f for %d iterations.\n", pi, n);
				printf("That's only about %.32f off!\n", pi - PI32DT);
		}
		MPI_Finalize();
		return 0;
}

