Alex9090

mpi

Apr 2nd, 2019
288
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.10 KB | None | 0 0
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <math.h>
  4. #include <gsl/gsl_rng.h>
  5. #include <mpi.h>
  6.  
  7. double f(double x){
  8. return 4.*sqrt(1.-x*x);
  9. }
  10.  
  11. double calculeaza_integrala(double a, double b, double c, long N){
  12.  
  13. long i;
  14. const gsl_rng_type *T;
  15. gsl_rng * r;
  16. double u;
  17. double x, y;
  18. long N1= 0, N2=0;
  19. double I;
  20.  
  21. gsl_rng_env_setup();
  22. T = gsl_rng_default;
  23. r = gsl_rng_alloc(T);
  24.  
  25. for(i = 0; i < N; i++){
  26. u = gsl_rng_uniform(r);
  27. x = a+ (b-a)*u;
  28. u = gsl_rng_uniform(r);
  29. y = c*u;
  30.  
  31. if(y < f(x)){
  32. N1= N1 +1;
  33. }
  34. else {
  35. N2 = N2 + 1;
  36. }
  37. }
  38. I = (double)N1/(double)N * (b-a)*c;
  39. return I;
  40. }
  41.  
  42. int main(int argc, char **argv){
  43. int Np, rank;
  44.  
  45. long i;
  46. double a, b, c;
  47. double N;
  48. double c1, c2;
  49.  
  50. long Ni;
  51. MPI_Init(&argc, &argv);
  52. MPI_Comm_size(MPI_COMM_WORLD, &Np);
  53. MPI_Comm_rank(MPI_COMM_WORLD, &rank);
  54.  
  55. if(rank ==0){
  56. double s, I;
  57. a = 0.;
  58. b = 1.;
  59. c = 4.;
  60. N = 1000000;
  61.  
  62. for(i = 1; i < Np; i++){
  63. MPI_Send (&a, 1, MPI_DOUBLE, i, 0, MPI_COMM_WORLD);
  64. MPI_Send (&b, 1, MPI_DOUBLE, i, 0, MPI_COMM_WORLD);
  65. MPI_Send (&c, 1, MPI_DOUBLE, i, 0, MPI_COMM_WORLD);
  66.  
  67. Ni = (long) ((double)N/(double)(Np-1));
  68. MPI_Send(&Ni, 1, MPI_LONG, i, 0, MPI_COMM_WORLD);
  69. }
  70. I = 0.;
  71.  
  72. for(i = 1; i< Np; i++){
  73. MPI_Recv(&s, 1, MPI_DOUBLE, MPI_ANY_SOURCE, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
  74. I = I + s;
  75. }
  76. I = I / (double) (Np-1);
  77. printf("I = %f \n", I);
  78.  
  79. }
  80. else {
  81. double s;
  82. MPI_Recv(&a, 1, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
  83. MPI_Recv(&b, 1, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
  84. MPI_Recv(&c, 1, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
  85. MPI_Recv(&Ni, 1, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
  86.  
  87. printf("%f %f %f %i \n", a, b, c, Ni);
  88. s = calculeaza_integrala(a, b, c, Ni);
  89. printf("s=%f \n", s);
  90. MPI_Send(&s, 1, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD);
  91.  
  92. }
  93. MPI_Finalize();
  94. return 0;
  95. }
Advertisement
Add Comment
Please, Sign In to add comment