#include <stdio.h>
#include <math.h>
#include<cmath>
#include <mpi.h>
using namespace std;
double f(double x)
{ return (((2 + x)/(2 - x));}
double g(double x)
{ return (x * x * x * x);}
int main(int argc, char *argv[])
{ int r, p,i,n=1000000000;
double sum, sumg, sumf,hf, hg,t,af=0.0,bf=1.0, ag =1.0, bg =2.0;
MPI_Status st;
MPI_Init(&argc,&argv);
MPI_Comm_rank(MPI_COMM_WORLD,&r);
MPI_Comm_size(MPI_COMM_WORLD,&p);
printf("r = %d, p = %d\n",r
,p
); if (r==0)
t=MPI_Wtime();
MPI_Barrier(MPI_COMM_WORLD);
sumf=0; hf=(bf-af)/n;
sumg=0; hg=(bg-ag)/n;
for(i=r;i<=n;i+=p){
double xf1 = af + i * hf;
double xf2 = af + (i + 1) * hf;
double xg1 = ag + i * hg;
double xg2 = ag + (i + 1) * hg;
sumf+=0.5 * (xf2 - xf1) * (f(xf1) + f(xf2));
sumg+=0.5 * (xg2 - xg1) * (g(xg1) + f(xg2));
}
if (r!=0) {
MPI_Send(&sumf,1,MPI_DOUBLE,0,1,MPI_COMM_WORLD);
MPI_Send(&sumg,1,MPI_DOUBLE,0,2,MPI_COMM_WORLD);}
if (r==0)
{ double sf;
double sg;
for(i=1;i<p;i++)
{
MPI_Recv(&sf,1,MPI_DOUBLE,i,1,MPI_COMM_WORLD,&st);
MPI_Recv(&sg,1,MPI_DOUBLE,i,2,MPI_COMM_WORLD,&st);
sumf+=sf;
sumg+=sg;
}
sum = sumf * sumg;
t=MPI_Wtime()-t;
printf("Произведение интегралов = %lf,\n Время работы программы = %lf c.\n",sum
, t
); }
MPI_Finalize();
}
CiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8bWF0aC5oPgojaW5jbHVkZTxjbWF0aD4KI2luY2x1ZGUgPG1waS5oPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmRvdWJsZSBmKGRvdWJsZSB4KQp7IHJldHVybiAoKCgyICsgeCkvKDIgLSB4KSk7fQoKZG91YmxlIGcoZG91YmxlIHgpCnsgcmV0dXJuICh4ICogeCAqIHggKiB4KTt9CgppbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQp7CWludCByLCBwLGksbj0xMDAwMDAwMDAwOwoJZG91YmxlIHN1bSwgc3VtZywgc3VtZixoZiwgaGcsdCxhZj0wLjAsYmY9MS4wLCBhZyA9MS4wLCBiZyA9Mi4wOwoJTVBJX1N0YXR1cyBzdDsKCU1QSV9Jbml0KCZhcmdjLCZhcmd2KTsKCU1QSV9Db21tX3JhbmsoTVBJX0NPTU1fV09STEQsJnIpOyAJCglNUElfQ29tbV9zaXplKE1QSV9DT01NX1dPUkxELCZwKTsKCXByaW50ZigiciA9ICVkLCBwID0gJWRcbiIscixwKTsKCWlmIChyPT0wKQkKCXQ9TVBJX1d0aW1lKCk7CglNUElfQmFycmllcihNUElfQ09NTV9XT1JMRCk7CglzdW1mPTA7CWhmPShiZi1hZikvbjsKCXN1bWc9MDsJaGc9KGJnLWFnKS9uOwoJZm9yKGk9cjtpPD1uO2krPXApewoJCWRvdWJsZSB4ZjEgPSBhZiArIGkgKiBoZjsKICAgICAgICBkb3VibGUgeGYyID0gYWYgKyAoaSArIDEpICogaGY7CiAgICAgICAgZG91YmxlIHhnMSA9IGFnICsgaSAqIGhnOwogICAgICAgIGRvdWJsZSB4ZzIgPSBhZyArIChpICsgMSkgKiBoZzsKCXN1bWYrPTAuNSAqICh4ZjIgLSB4ZjEpICogKGYoeGYxKSArIGYoeGYyKSk7CglzdW1nKz0wLjUgKiAoeGcyIC0geGcxKSAqIChnKHhnMSkgKyBmKHhnMikpOwoJfQoJCglpZiAociE9MCkgewoJCU1QSV9TZW5kKCZzdW1mLDEsTVBJX0RPVUJMRSwwLDEsTVBJX0NPTU1fV09STEQpOwoJCU1QSV9TZW5kKCZzdW1nLDEsTVBJX0RPVUJMRSwwLDIsTVBJX0NPTU1fV09STEQpO30KCWlmIChyPT0wKSAKCXsJZG91YmxlIHNmOwoJCWRvdWJsZSBzZzsKCQlmb3IoaT0xO2k8cDtpKyspCgkJewoJCQlNUElfUmVjdigmc2YsMSxNUElfRE9VQkxFLGksMSxNUElfQ09NTV9XT1JMRCwmc3QpOwoJCQlNUElfUmVjdigmc2csMSxNUElfRE9VQkxFLGksMixNUElfQ09NTV9XT1JMRCwmc3QpOwoJCQlzdW1mKz1zZjsKCQkJc3VtZys9c2c7CgkJfQoJCXN1bSA9IHN1bWYgKiBzdW1nOwoJCXQ9TVBJX1d0aW1lKCktdDsKCXByaW50Zigi0J/RgNC+0LjQt9Cy0LXQtNC10L3QuNC1INC40L3RgtC10LPRgNCw0LvQvtCyID0gJWxmLFxuINCS0YDQtdC80Y8g0YDQsNCx0L7RgtGLINC/0YDQvtCz0YDQsNC80LzRiyA9ICVsZiBjLlxuIixzdW0sIHQpOwoJfQoJTVBJX0ZpbmFsaXplKCk7Cn0=