Advertisement
Guest User

Untitled

a guest
Apr 22nd, 2018
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.32 KB | None | 0 0
  1. #include <math.h>
  2. #include <mpi.h>
  3. #include <stdio.h>
  4.  
  5.  
  6. const double A1 = 0;
  7. const double B1 = 100;
  8. const double A2 = 0;
  9. const double B2 = 100;
  10. const double PI = 3.1415926;
  11. const int N = 5e3;
  12. const int M = 5e3;
  13.  
  14. #define PRECISION "3"
  15.  
  16.  
  17. double f(double x, double y)
  18. {
  19.     return (exp(sin(PI * x) * cos(PI * y)) + 1) / ((B1 - A1) * (B2 - A2));
  20. }
  21.  
  22.  
  23. double q(int i, int j)
  24. {
  25.     double result = 1;
  26.     if (i == 0 || i == N - 1)
  27.     {
  28.         result *= 0.5;
  29.     }
  30.     if (j == 0 || j == M - 1)
  31.     {
  32.         result *= 0.5;
  33.     }
  34.     return result;
  35. }
  36.  
  37.  
  38. void usual()
  39. {
  40.     double start_time = MPI_Wtime();
  41.    
  42.     double answer = 0;
  43.    
  44.     double h1 = (B1 - A1) / N;
  45.     double h2 = (B2 - A2) / M;
  46.     int i;
  47.     for (i = 0; i < N; i++)
  48.     {
  49.         double xi = A1 + i * h1;
  50.         int j;
  51.         for (j = 0; j < M; j++)
  52.         {
  53.             double yi = A2 + j * h2;
  54.             answer += f(xi, yi) * q(i, j);
  55.         }
  56.     }
  57.  
  58.     answer *= h1 * h2;
  59.  
  60.     printf("[%." PRECISION "lf sec] usual "
  61.            "(answer = %." PRECISION "lf)\n",
  62.                MPI_Wtime() - start_time, answer);
  63. }
  64.  
  65.  
  66. void external(int rank, int ncount)
  67. {
  68.     double start_time = MPI_Wtime();
  69.    
  70.     double answer = 0;
  71.    
  72.     double h1 = (B1 - A1) / N;
  73.     double h2 = (B2 - A2) / M;
  74.     int i;
  75.    
  76.     for (i = 0; i < N; i++)
  77.     {
  78.         if (rank == i % ncount)
  79.         {
  80.             double xi = A1 + i * h1;
  81.             int j;
  82.             for (j = 0; j < M; j++)
  83.             {
  84.                 double yi = A2 + j * h2;
  85.                 answer += f(xi, yi) * q(i, j);
  86.             }
  87.         }
  88.     }
  89.  
  90.     if (rank)
  91.         MPI_Send(&answer, 1, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD);
  92.     else
  93.     {
  94.         for (i = 1; i < ncount; i++)
  95.         {
  96.             double s;
  97.             MPI_Status st;
  98.             MPI_Recv(&s, 1, MPI_DOUBLE, i, 0, MPI_COMM_WORLD, &st);
  99.             answer += s;
  100.         }
  101.  
  102.         answer *= h1 * h2;
  103.  
  104.         printf("[%." PRECISION "lf sec] parallel "
  105.            "(answer = %." PRECISION "lf)\n",
  106.                MPI_Wtime() - start_time, answer);
  107.     }
  108. }
  109.  
  110.  
  111. int main()
  112. {    
  113.     MPI_Init(NULL, NULL);
  114.  
  115.     int rank, ncount;
  116.     MPI_Comm_rank(MPI_COMM_WORLD, &rank);
  117.     MPI_Comm_size(MPI_COMM_WORLD, &ncount);
  118.    
  119.     if (!rank)
  120.     {
  121.         printf("2.130997\n");
  122.         usual();
  123.     }
  124.     external(rank, ncount);
  125.    
  126.     MPI_Finalize();
  127. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement