Bonjour,
J'utilise openmp pour effectuer un calcul en parallèle.
J'ai comparé les résultats obtenu avec et sans parallélisme et ça colle pas.
Bref, je vous laisse mon code :
#include <iostream>
#include <omp.h>
#include <cmath>
#include <complex>
#include "r2d2lri.h"
using namespace std;
#define N 10
double a=0.2,b=0.2,k=50.0,xx=0.1,yy=0.1;
int m=0,n=0;
const double pi=4.0*atan(1.0);
const complex<double> I(0.0,1.0);
double g30(double)
{
return 0.0;
}
double g31(double)
{
return pi/2.0;
}
double faReal(double r, double t)
{
return r*jn(2*m,r*cos(t))*jn(2*n,r*sin(t))*cos(r*xx*cos(t))*cos(r*yy*sin(t)/a)/sqrt(pow(r,2)-pow(k*a,2));
}
int main()
{
int i=0,j=0;
int chunk=1;
double aa[N][N];
DoubleIntegral integ(k*a+0.10,(i+1)*k*a,g30,g31,faReal);
omp_set_dynamic(0);
omp_set_num_threads(16);
//calcul parallèle
#pragma omp parallel shared(aa,k,a,b) private(m,n,i)
{
#pragma omp for collapse(3) //schedule(dynamic,chunk) nowait
for (m = 0; m < N; m++)
{
for (n = 0; n < N; n++)
{
for (i=1; i < 10*N;i=i+10)
{
integ.set_new_integral(i*k*a+0.0001,(i+10)*k*a+0.0001,g30,g31,faReal);
#pragma omp critical
aa[m][n] += integ.evaluate();
}
}
}
}
//sans threads
double bb[N][N];
for (m = 0; m < N; m++)
{
for (n = 0; n < N; n++)
{
for (i=1; i < 10*N;i=i+10)
{
integ.set_new_integral(i*k*a+0.0001,(i+10)*k*a+0.0001,g30,g31,faReal);
bb[m][n] += integ.evaluate();
}
cout<<m<<","<<n<<"-->"<<aa[m][n]-bb[m][n]<<endl;
}
}
return 0;
}
DoubleIntegral est une classe du header r2d2lri.h qui permet de calculer une intégrale double de n'importe quel fonction. Elle est téléchargeable depuis ce lien :
http://cubature-research-group.cs.latrobe.edu.au/code.htm
Merci pour votre aide.