Advertisement
yalik97

Untitled

Mar 19th, 2018
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.74 KB | None | 0 0
  1. #include <iostream>
  2. #include <cmath>
  3. #include <vector>
  4. #include <omp.h>
  5.  
  6. using namespace std;
  7.  
  8. const int n1 = 41;
  9. const int n2 = 41;
  10. const int n3 = 41;
  11. const int tmax = 100;
  12.  
  13. const double h1 = 0.01;
  14. const double h2 = 0.01;
  15. const double h3 = 0.01;
  16. const double tau = 0.01;
  17.  
  18. vector<vector<vector<vector<double>>>> y =
  19. vector<vector<vector<vector<double>>>>(n1,
  20. vector<vector<vector<double>>>(n2,
  21. vector<vector<double>>(n3,
  22. vector<double>(tmax, 0.))));
  23.  
  24. vector<vector<vector<double>>> a0 =
  25. vector<vector<vector<double>>>(n2,
  26. vector<vector<double>>(n3,
  27. vector<double>(tmax)));
  28.  
  29. vector<vector<vector<double>>> a1 =
  30. vector<vector<vector<double>>>(n2,
  31. vector<vector<double>>(n3,
  32. vector<double>(tmax)));
  33.  
  34. vector<vector<vector<double>>> b0 =
  35. vector<vector<vector<double>>>(n1,
  36. vector<vector<double>>(n3,
  37. vector<double>(tmax)));
  38.  
  39. vector<vector<vector<double>>> b1 =
  40. vector<vector<vector<double>>>(n1,
  41. vector<vector<double>>(n3,
  42. vector<double>(tmax)));
  43.  
  44. vector<vector<vector<double>>> c0 =
  45. vector<vector<vector<double>>>(n1,
  46. vector<vector<double>>(n2,
  47. vector<double>(tmax)));
  48.  
  49. vector<vector<vector<double>>> c1 =
  50. vector<vector<vector<double>>>(n1,
  51. vector<vector<double>>(n2,
  52. vector<double>(tmax)));
  53.  
  54. const double lambda1 = 1;
  55. const double lambda2 = 3;
  56.  
  57. int i, i1, i2, i3, j;
  58.  
  59. // u = e ^ (lambda1 * (x1 + x2 + x3) + lambda2 * t)
  60.  
  61. void setBorderConditions()
  62. {
  63. for (i2 = 0; i2 < n2; ++i2)
  64. {
  65. for (i3 = 0; i3 < n3; ++i3)
  66. {
  67. for (j = 0; j < tmax; ++j)
  68. {
  69. a0[i2][i3][j] =
  70. exp(lambda1 * (i2 * h2 + i3 * h3) + lambda2 * (j + (1. / 3.)) * tau);
  71. a1[i2][i3][j] =
  72. exp(lambda1 * ((n1 - 1) * h1 + i2 * h2 + i3 * h3) + lambda2 * (j + (1. / 3.)) * tau);
  73. }
  74. }
  75. }
  76.  
  77. for (i1 = 0; i1 < n1; ++i1)
  78. {
  79. for (i3 = 0; i3 < n3; ++i3)
  80. {
  81. for (j = 0; j < tmax; ++j)
  82. {
  83. b0[i1][i3][j] =
  84. exp(lambda1 * (i1 * h1 + i3 * h3) + lambda2 * (j + (2. / 3.)) * tau);
  85. b1[i1][i3][j] =
  86. exp(lambda1 * (i1 * h1 + (n2 - 1) * h2 + i3 * h3) + lambda2 * (j + (2. / 3.)) * tau);
  87. }
  88. }
  89. }
  90.  
  91. for (i1 = 0; i1 < n1; ++i1)
  92. {
  93. for (i2 = 0; i2 < n2; ++i2)
  94. {
  95. for (j = 0; j < tmax; ++j)
  96. {
  97. c0[i1][i2][j] =
  98. exp(lambda1 * (i1 * h1 + i2 * h2) + lambda2 * (j + 1) * tau);
  99. c1[i1][i2][j] =
  100. exp(lambda1 * (i1 * h1 + i2 * h2 + (n3 - 1) * h3) + lambda2 * (j + 1) * tau);
  101. }
  102. }
  103. }
  104. }
  105.  
  106. void setInitialApproximation()
  107. {
  108. for (i1 = 0; i1 < n1; ++i1)
  109. {
  110. for (i2 = 0; i2 < n2; ++i2)
  111. {
  112. for (i3 = 0; i3 < n3; ++i3)
  113. {
  114. y[i1][i2][i3][0] = exp(lambda1 * (i1 * h1 + i2 * h2 + i3 * h3));
  115. }
  116. }
  117. }
  118. }
  119.  
  120. void main()
  121. {
  122. setBorderConditions();
  123.  
  124. setInitialApproximation();
  125.  
  126. double epsilon1 = 2 * h1 * h1 / tau;
  127. double epsilon2 = 2 * h2 * h2 / tau;
  128. double epsilon3 = 2 * h3 * h3 / tau;
  129.  
  130. double *alpha;
  131. double *beta;
  132.  
  133. vector<vector<vector<vector<double>>>> tempY =
  134. vector<vector<vector<vector<double>>>>(n1,
  135. vector<vector<vector<double>>>(n2,
  136. vector<vector<double>>(n3,
  137. vector<double>(2))));
  138.  
  139. double start_time = omp_get_wtime();
  140. for (j = 0; j < tmax - 1; ++j)
  141. {
  142. alpha = new double[n1];
  143. beta = new double[n1];
  144.  
  145. try {
  146. #pragma omp parallel for
  147. for (i2 = 0; i2 < n2; ++i2)
  148. {
  149. for (i3 = 0; i3 < n3; ++i3)
  150. {
  151. alpha[0] = 0;
  152. beta[0] = a0[i2][i3][j];
  153. for (i = 1; i < n1 - 1; ++i)
  154. {
  155. alpha[i] = 1 / (2 + epsilon1 - alpha[i - 1]);
  156. beta[i] =
  157. ((y[i + 1][i2][i3][j] + y[i - 1][i2][i3][j] + beta[i - 1]) +
  158. (epsilon1 - 2) * y[i][i2][i3][j]) /
  159. (2 + epsilon1 - alpha[i - 1]);
  160. }
  161. tempY[n1 - 1][i2][i3][0] = a1[i2][i3][j];
  162. for (i = n1 - 2; i >= 0; --i)
  163. {
  164. tempY[i][i2][i3][0] =
  165. alpha[i] * tempY[i + 1][i2][i3][0] + beta[i];
  166. }
  167. }
  168. }
  169. }
  170. catch (exception e) {
  171. cout << e.what();
  172. }
  173.  
  174.  
  175. alpha = new double[n2];
  176. beta = new double[n2];
  177.  
  178. for (i1 = 0; i1 < n1; ++i1)
  179. {
  180. for (i3 = 0; i3 < n3; ++i3)
  181. {
  182. alpha[0] = 0;
  183. beta[0] = b0[i1][i3][j];
  184. for (i = 1; i < n2 - 1; ++i)
  185. {
  186. alpha[i] = 1 / (2 + epsilon2 - alpha[i - 1]);
  187. beta[i] =
  188. ((tempY[i1][i + 1][i3][0] + tempY[i1][i - 1][i3][0] + beta[i - 1]) +
  189. (epsilon2 - 2) * tempY[i1][i][i3][0]) /
  190. (2 + epsilon2 - alpha[i - 1]);
  191. }
  192. tempY[i1][n2 - 1][i3][1] = b1[i1][i3][j];
  193. for (i = n2 - 2; i >= 0; --i)
  194. {
  195. tempY[i1][i][i3][1] =
  196. alpha[i] * tempY[i1][i + 1][i3][1] + beta[i];
  197. }
  198. }
  199. }
  200.  
  201. alpha = new double[n3];
  202. beta = new double[n3];
  203.  
  204. for (i1 = 0; i1 < n1; ++i1)
  205. {
  206. for (i2 = 0; i2 < n2; ++i2)
  207. {
  208. alpha[0] = 0;
  209. beta[0] = c0[i1][i2][j];
  210. for (i = 1; i < n3 - 1; ++i)
  211. {
  212. alpha[i] = 1 / (2 + epsilon3 - alpha[i - 1]);
  213. beta[i] =
  214. ((tempY[i1][i2][i + 1][1] + tempY[i1][i2][i - 1][1] + beta[i - 1]) +
  215. (epsilon3 - 2) * tempY[i1][i2][i][1]) /
  216. (2 + epsilon3 - alpha[i - 1]);
  217. }
  218. y[i1][i2][n3 - 1][j + 1] = c1[i1][i2][j];
  219. for (i = n3 - 2; i >= 0; --i)
  220. {
  221. y[i1][i2][i][j + 1] =
  222. alpha[i] * y[i1][i2][i + 1][j + 1] + beta[i];
  223. }
  224. }
  225. }
  226.  
  227. /*double maxDifference = 0;
  228. double koord[3] = { 0, 0, 0 };
  229.  
  230. for (i1 = 0; i1 < n1; ++i1)
  231. {
  232. for (i2 = 0; i2 < n2; ++i2)
  233. {
  234. for (i3 = 0; i3 < n3; ++i3)
  235. {
  236. if (fabs(exp(lambda1 * (i1 * h1 + i2 * h2 + i3 * h3) + lambda2 * (j + 1) * tau) -
  237. y[i1][i2][i3][j + 1]) > maxDifference)
  238. {
  239. maxDifference =
  240. fabs(exp(lambda1 * (i1 * h1 + i2 * h2 + i3 * h3) + lambda2 * (j + 1) * tau) -
  241. y[i1][i2][i3][j + 1]);
  242. koord[0] = i1;
  243. koord[1] = i2;
  244. koord[2] = i3;
  245. }
  246. }
  247. }
  248. }
  249.  
  250. std::cout << maxDifference << std::endl;*/
  251. }
  252.  
  253. cout << start_time - omp_get_wtime();
  254.  
  255. system("pause");
  256. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement