/* From: "COMPUTATIONAL PHYSICS, 2nd Ed" by RH Landau, MJ Paez, and CC Bordeianu Copyright Wiley-VCH 2007. Electronic Materials copyright: R Landau, Oregon State Univ, 2007; MJ Paez, Univ Antioquia, 2007; & CC Bordeianu, Univ Bucharest, 2007 Support by National Science Foundation */ // MPIpi.c computes pi in parallel by Monte Carlo Integration #include "mpi.h" #include #include double f(double); int main(int argc,char *argv[]) { int n, myid, numprocs, i; double PI25DT = 3.141592653589793238462643; double mypi, pi, h, sum, x, startwtime=0., endwtime; int namelen; char processor_name[MPI_MAX_PROCESSOR_NAME]; MPI_Init( &argc, &argv); MPI_Comm_size( MPI_COMM_WORLD, &numprocs); MPI_Comm_rank( MPI_COMM_WORLD, &myid); MPI_Get_processor_name( processor_name, &namelen); fprintf(stdout,"Process %d of %d is on %s\n", myid, numprocs, processor_name); fflush( stdout ); n = 10000; // default # of rectangles if (myid == 0) startwtime = MPI_Wtime(); MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD); h = 1. / (double) n; sum = 0.; for (i = myid + 1; i <= n; i += numprocs) { // Better to work back x = h * ((double)i - 0.5); sum += f(x); } mypi = h * sum; MPI_Reduce(&mypi,&pi, 1,MPI_DOUBLE, MPI_SUM,0, MPI_COMM_WORLD); if (myid == 0) { endwtime = MPI_Wtime(); printf("pi is approximately %.16f, Error is %.16f\n", pi, fabs(pi - PI25DT)); printf("wall clock time = %f\n", endwtime-startwtime); fflush(stdout); } MPI_Finalize(); return 0; } double f(double a) { return (4./(1. + a*a));} // Function f(a)