You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
44 lines
869 B
C
44 lines
869 B
C
2 years ago
|
#include <stdio.h>
|
||
|
#include <stdlib.h>
|
||
|
#include <math.h>
|
||
|
#include <mpi.h>
|
||
|
|
||
|
double f( double x);
|
||
|
|
||
|
int main( int argc, char *argv[]){
|
||
|
int n, mynode, totalnodes, i;
|
||
|
double PI25DT = 3.141592653589793238462643;
|
||
|
double mypi, pi, h, sum, x;
|
||
|
|
||
|
MPI_Init(&argc,&argv);
|
||
|
MPI_Comm_size(MPI_COMM_WORLD,&totalnodes);
|
||
|
MPI_Comm_rank(MPI_COMM_WORLD,&mynode);
|
||
|
|
||
|
if(mynode == 0){
|
||
|
if(argc != 2){
|
||
|
n = 20;
|
||
|
}else{
|
||
|
n = atoi(argv[1]);
|
||
|
}
|
||
|
}
|
||
|
MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD);
|
||
|
h = 1.0 / ((double) n*totalnodes);
|
||
|
sum = 0.0;
|
||
|
for (i = 1+mynode*n; i <= n*(mynode+1); i++){
|
||
|
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 (mynode == 0){
|
||
|
printf("pi is approximately %.16f, Error is %e\n",pi, fabs(pi - PI25DT));
|
||
|
}
|
||
|
MPI_Finalize();
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
double f( double x )
|
||
|
{
|
||
|
return (4.0 / (1.0 + x*x));
|
||
|
}
|