Advertisement
Guest User

Untitled

a guest
Dec 17th, 2017
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.14 KB | None | 0 0
  1. #include <omp.h>
  2. #include <math.h>
  3. #include <stdio.h>
  4.  
  5. #define A 8.2
  6. #define B -0.7
  7. #define C 0.64
  8. #define D 0.18
  9. #define thread 3 //квадрат -на скольких нитях будет выполняться
  10.  
  11. double F(double x1, double x2)
  12. {
  13. return A*x1 + B*x2 + exp(C*x1*x1 + D*x2*x2);
  14. }
  15.  
  16. int main()
  17. {
  18.  
  19. double xmax = 5.0, ymax = 5.0;
  20. double h1 = 0.1, h2 = 0.001, x = -xmax, y = -ymax;
  21.  
  22. double minMas[thread*thread * 3];//массив с минимумами
  23.  
  24. double tn = omp_get_wtime();
  25.  
  26. #pragma omp parallel num_threads(thread*thread) firstprivate (x,y)
  27. {
  28. int rank = omp_get_thread_num();
  29. //Разбиение на квадраты
  30. double lxBlock = 2 * xmax / thread;//длина блока
  31. double lyBlock = 2 * ymax / thread;//высота блока
  32.  
  33. x += (rank%thread)*lxBlock;//левый нижний
  34. y += (rank / thread)*lyBlock;//левый нижний
  35.  
  36. int nx = (int)(lxBlock / h1 + 1);//кол-во точек по х
  37. int ny = (int)(lyBlock / h1 + 1);//кол-во точек по у
  38.  
  39. double min[3];//0 - значение, 1- х, 2-у
  40. min[0] = F(x, y);
  41. min[1] = x;
  42. min[2] = y;
  43.  
  44. for (int i = 0; i < nx; i++)
  45. for (int j = 0; j < ny; j++)
  46. if (F(x + i*h1, y + j*h1) < min[0]) {
  47. min[0] = F(x + i*h1, y + j*h1);
  48. min[1] = x + i*h1;
  49. min[2] = y + j*h1;
  50. }
  51.  
  52. minMas[rank * 3] = min[0];
  53. minMas[rank * 3 + 1] = min[1];
  54. minMas[rank * 3 + 2] = min[2];
  55. }
  56.  
  57. double minFin[3];//финальный минимум
  58. minFin[0] = minMas[0];
  59. minFin[1] = minMas[1];
  60. minFin[2] = minMas[2];
  61. int minRank = 0;
  62. for (int i = 1; i < thread*thread; i++)
  63. {
  64. if (minFin[0] > minMas[i * 3])
  65. {
  66. minFin[0] = minMas[i * 3];
  67. minFin[1] = minMas[i * 3 + 1];
  68. minFin[2] = minMas[i * 3 + 2];
  69.  
  70. minRank = i;
  71. }
  72. }
  73.  
  74. x = (minRank%thread)*(xmax - x) / thread - xmax;//левый нижний
  75. y = (minRank / thread)*(ymax - y) / thread - ymax;//левый нижний
  76.  
  77. #pragma omp parallel num_threads(thread*thread) firstprivate(x,y)
  78. {
  79. int rank = omp_get_thread_num();
  80.  
  81. double lxBlock = 2 * xmax / (thread*thread);
  82. double lyBlock = 2 * ymax / (thread*thread);
  83.  
  84. x = x + (rank%thread)*lxBlock;
  85. y = y + (rank / thread)*lyBlock;
  86.  
  87. int nx = (int)(lxBlock / h2 + 1);
  88. int ny = (int)(lyBlock / h2 + 1);
  89.  
  90. //ищем более точные минимумы
  91. double min[3];
  92. min[0] = F(x, y);
  93. min[1] = x;
  94. min[2] = y;
  95.  
  96. for (int i = 0; i < nx; i++)
  97. for (int j = 0; j < ny; j++)
  98. if (F(x + i*h2, y + j*h2) < min[0]) {
  99. min[0] = F(x + i*h2, y + j*h2);
  100. min[1] = x + i*h2;
  101. min[2] = y + j*h2;
  102. }
  103. minMas[rank * 3] = min[0];
  104. minMas[rank * 3 + 1] = min[1];
  105. minMas[rank * 3 + 2] = min[2];
  106. }
  107.  
  108. minFin[0] = minMas[0];
  109. minFin[1] = minMas[1];
  110. minFin[2] = minMas[2];
  111. for (int i = 1; i < thread*thread; i++)
  112. {
  113. if (minFin[0] > minMas[i * 3])
  114. {
  115. minFin[0] = minMas[i * 3];
  116. minFin[1] = minMas[i * 3 + 1];
  117. minFin[2] = minMas[i * 3 + 2];
  118. }
  119. }
  120. double tk = omp_get_wtime();
  121.  
  122. FILE *f;
  123. f = fopen("outOMP.txt", "w");
  124. fprintf(f, "%f\nTime=%f\n", minFin[0], tk-tn);
  125. fclose(f);
  126.  
  127. return 0;
  128. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement