#include <stdio.h>
#include <mpi.h>
#include <math.h>
#define PI 3.14159265358979323846
#define INTERVALS 1000000
// Function to compute y-coordinate of the pi curve
double compute_pi(double x) {
return 4.0 / (1.0 + x * x);
}
int main(int argc, char** argv) {
int rank, size;
double area = 0.0;
double width = 1.0 / INTERVALS;
double x;
// Initialize MPI
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
// Each process calculates its portion of the area
for (int i = rank; i < INTERVALS; i += size) {
x = (i + 0.5) * width;
area += compute_pi(x);
}
double total_area;
// Reduce the partial areas from all processes to get the total area
MPI_Reduce(&area, &total_area, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD);
// Only process 0 prints the result
if (rank == 0) {
double pi = total_area * width;
printf("Approximation of Pi: %.16f\n", pi
); }
// Finalize MPI
MPI_Finalize();
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxtcGkuaD4KI2luY2x1ZGUgPG1hdGguaD4KCiNkZWZpbmUgUEkgMy4xNDE1OTI2NTM1ODk3OTMyMzg0NgojZGVmaW5lIElOVEVSVkFMUyAxMDAwMDAwCgovLyBGdW5jdGlvbiB0byBjb21wdXRlIHktY29vcmRpbmF0ZSBvZiB0aGUgcGkgY3VydmUKZG91YmxlIGNvbXB1dGVfcGkoZG91YmxlIHgpIHsKICAgIHJldHVybiA0LjAgLyAoMS4wICsgeCAqIHgpOwp9CgppbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKICAgIGludCByYW5rLCBzaXplOwogICAgZG91YmxlIGFyZWEgPSAwLjA7CiAgICBkb3VibGUgd2lkdGggPSAxLjAgLyBJTlRFUlZBTFM7CiAgICBkb3VibGUgeDsKCiAgICAvLyBJbml0aWFsaXplIE1QSQogICAgTVBJX0luaXQoJmFyZ2MsICZhcmd2KTsKICAgIE1QSV9Db21tX3JhbmsoTVBJX0NPTU1fV09STEQsICZyYW5rKTsKICAgIE1QSV9Db21tX3NpemUoTVBJX0NPTU1fV09STEQsICZzaXplKTsKCiAgICAvLyBFYWNoIHByb2Nlc3MgY2FsY3VsYXRlcyBpdHMgcG9ydGlvbiBvZiB0aGUgYXJlYQogICAgZm9yIChpbnQgaSA9IHJhbms7IGkgPCBJTlRFUlZBTFM7IGkgKz0gc2l6ZSkgewogICAgICAgIHggPSAoaSArIDAuNSkgKiB3aWR0aDsKICAgICAgICBhcmVhICs9IGNvbXB1dGVfcGkoeCk7CiAgICB9CgogICAgZG91YmxlIHRvdGFsX2FyZWE7CiAgICAvLyBSZWR1Y2UgdGhlIHBhcnRpYWwgYXJlYXMgZnJvbSBhbGwgcHJvY2Vzc2VzIHRvIGdldCB0aGUgdG90YWwgYXJlYQogICAgTVBJX1JlZHVjZSgmYXJlYSwgJnRvdGFsX2FyZWEsIDEsIE1QSV9ET1VCTEUsIE1QSV9TVU0sIDAsIE1QSV9DT01NX1dPUkxEKTsKCiAgICAvLyBPbmx5IHByb2Nlc3MgMCBwcmludHMgdGhlIHJlc3VsdAogICAgaWYgKHJhbmsgPT0gMCkgewogICAgICAgIGRvdWJsZSBwaSA9IHRvdGFsX2FyZWEgKiB3aWR0aDsKICAgICAgICBwcmludGYoIkFwcHJveGltYXRpb24gb2YgUGk6ICUuMTZmXG4iLCBwaSk7CiAgICB9CgogICAgLy8gRmluYWxpemUgTVBJCiAgICBNUElfRmluYWxpemUoKTsKICAgIHJldHVybiAwOwp9Cg==