Advertisement
BorrowTheProgrammer

Trud

May 15th, 2022
800
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.80 KB | None | 0 0
  1. #include <string.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <unistd.h>
  5. #include <semaphore.h>
  6. #include <sys/time.h>
  7. #include <cmath>
  8. #include <iostream>
  9.  
  10. #define DX 0.5
  11. #define DY 0.5
  12.  
  13. #define DXR 0.25
  14. #define DYR 0.25
  15.  
  16. #define BORDER_TEMPERATURE 200
  17.  
  18. #define HEIGHT 8
  19. #define WIDTH 12
  20. #define XPL 3
  21. #define YPL 5
  22.  
  23. #define PSX ((WIDTH - XPL) / (2 * DX))
  24. #define PEX ((WIDTH + XPL) / (2 * DX))
  25. #define PSY ((HEIGHT - YPL) / (2 * DY))
  26. #define PEY ((HEIGHT + YPL) / (2 * DY))
  27. #define PSXR ((WIDTH - XPL) / (2 * DXR))
  28. #define PEXR ((WIDTH + XPL) / (2 * DXR))
  29. #define PSYR ((HEIGHT - YPL) / (2 * DYR))
  30. #define PEYR ((HEIGHT + YPL) / (2 * DYR))
  31.  
  32. #define CALC_TIME 200
  33. #define delta 4.0
  34.  
  35. using namespace std;
  36.  
  37. double fill_after(double ***T, int w, int h, int x, int y, double dx, double dy, int psx, int pex, int psy, int pey, int time, double DT)
  38. {
  39.     // для ГУ (левая правая стенка)
  40.     if (x == 0 || x == w - 1)
  41.     {
  42.         return BORDER_TEMPERATURE;
  43.     }
  44.     // для верхней и нижней стенки ГУ 2-го рода
  45.     else if (y == h - 1)
  46.     {
  47.         return T[time + 1][x][y - 1];
  48.     }
  49.     else if (y == 0)
  50.     {
  51.         return T[time][x][y + 1];
  52.     }
  53.     // если попадаем в отверстие
  54.     else if (x < pex && x > psx && y < pey && y > psy)
  55.     {
  56.         return 0;
  57.     }
  58.     // левая стенка отверстия
  59.     else if (x == psx && y < pey && y > psy)
  60.     {
  61.         return T[time][x - 1][y] / (sqrt(dx * dx + dy * dy) + 1);
  62.     }
  63.     // правая стенка отверстия
  64.     else if (x == pex && y < pey && y > psy)
  65.     {
  66.         return T[time][x + 1][y] / (sqrt(dx * dx + dy * dy) + 1);
  67.     }
  68.     // нижняя стенка отверстия
  69.     else if (x < pex && x > psx && y == psy)
  70.     {
  71.         return T[time][x][y - 1] / (sqrt(dx * dx + dy * dy) + 1);
  72.     }
  73.     // верхняя сторона отверстия
  74.     else if (x < pex && x > psx && y == pey)
  75.     {
  76.         return T[time][x][y + 1] / (sqrt(dx * dx + dy * dy) + 1);
  77.     }
  78.     // все остальные узлы по формуле трехмерной явной разностной схеме
  79.     else
  80.     {
  81.         return DT * ((T[time][x + 1][y] - 2 * T[time][x][y] + T[time][x - 1][y]) / (dx * dx) + (T[time][x][y + 1] - 2 * T[time][x][y] + T[time][x][y - 1]) / (dy * dy)) + T[time][x][y];
  82.     }
  83. }
  84.  
  85. int main()
  86. {
  87.     // для шага 0.5
  88.     int h = int(HEIGHT / DY) + 1;
  89.     int w = int(WIDTH / DX) + 1;
  90.  
  91.     // для шага 0.25
  92.     int hr = int(HEIGHT / DYR) + 1;
  93.     int wr = int(WIDTH / DXR) + 1;
  94.  
  95.     double maxder = 0;
  96.     double **MP;
  97.  
  98.     // матрица для работы с шагом 0.5
  99.     double **P;
  100.  
  101.     P = new double *[w];
  102.  
  103.     // начальное заполнение матриц
  104.     for (int x = 0; x < w; x++)
  105.     {
  106.         P[x] = new double[h];
  107.         for (int y = 0; y < h; y++)
  108.         {
  109.             P[x][y] = 0;
  110.             if (x == 0 || x == w - 1)
  111.             {
  112.                 P[x][y] = BORDER_TEMPERATURE;
  113.             }
  114.         }
  115.     }
  116.  
  117.     MP = new double *[w - 1];
  118.  
  119.     for (int x = 0; x < w - 1; x++)
  120.     {
  121.         MP[x] = new double[h - 1];
  122.         for (int y = 0; y < h - 1; y++)
  123.         {
  124.             MP[x][y] = 0;
  125.         }
  126.     }
  127.  
  128.     for (int x = 1; x < w - 1; x++)
  129.     {
  130.         for (int y = 1; y < h - 1; y++)
  131.         {
  132.             if (y == h - 2)
  133.                 MP[x - 1][y] = ((P[x + 1][y] - 2 * P[x][y] + P[x - 1][y]) / (DX * DX) + (P[x][y + 1] - 2 * P[x][y] + P[x][y - 1]) / (DY * DY));
  134.             else if (x == w - 2)
  135.                 MP[x][y - 1] = ((P[x + 1][y] - 2 * P[x][y] + P[x - 1][y]) / (DX * DX) + (P[x][y + 1] - 2 * P[x][y] + P[x][y - 1]) / (DY * DY));
  136.             else
  137.                 MP[x - 1][y - 1] = ((P[x + 1][y] - 2 * P[x][y] + P[x - 1][y]) / (DX * DX) + (P[x][y + 1] - 2 * P[x][y] + P[x][y - 1]) / (DY * DY));
  138.         }
  139.     }
  140.  
  141.     for (int x = 0; x < h - 1; x++)
  142.     {
  143.         for (int y = 0; y < w - 1; y++)
  144.         {
  145.             if (MP[x][y] > maxder)
  146.                 maxder = MP[x][y];
  147.         }
  148.     }
  149.  
  150.    
  151.  
  152.     double DT = (double)(delta / maxder);
  153.     int MAX_TIME = (int)(CALC_TIME / DT);
  154.     double ***T = new double **[MAX_TIME];
  155.     double ***TR = new double **[MAX_TIME];
  156.  
  157.     // создание и инициализация трехмерной матрицы
  158.     for (int i = 0; i < MAX_TIME; i++)
  159.     {
  160.         T[i] = new double *[w];
  161.         for (int j = 0; j < w; j++)
  162.         {
  163.             T[i][j] = new double[h];
  164.         }
  165.     }
  166.  
  167.     for (int x = 0; x < w; x++)
  168.     {
  169.         for (int y = 0; y < h; y++)
  170.         {
  171.             T[0][x][y] = 0;
  172.             if (x == 0 || x == w - 1)
  173.             {
  174.                 T[0][x][y] = BORDER_TEMPERATURE;
  175.             }
  176.         }
  177.     }
  178.  
  179.     for (int i = 0; i < MAX_TIME; i++)
  180.     {
  181.         TR[i] = new double *[wr];
  182.         for (int j = 0; j < wr; j++)
  183.         {
  184.             TR[i][j] = new double[hr];
  185.         }
  186.     }
  187.  
  188.     for (int x = 0; x < wr; x++)
  189.     {
  190.         for (int y = 0; y < hr; y++)
  191.         {
  192.             TR[0][x][y] = 0;
  193.             if (x == 0 || x == wr - 1)
  194.             {
  195.                 TR[0][x][y] = BORDER_TEMPERATURE;
  196.             }
  197.         }
  198.     }
  199.  
  200.     int timeCount = MAX_TIME - 1;
  201.  
  202.     for (int time = 0; time < timeCount; time++)
  203.     {
  204.         for (int x = 0; x < w; x++)
  205.         {
  206.             for (int y = 0; y < h; y++)
  207.             {
  208.                 T[time + 1][x][y] = fill_after(T, w, h, x, y, DX, DY, PSX, PEX, PSY, PEY, time, DT);
  209.             }
  210.         }
  211.     }
  212.  
  213.     cout << "h" << endl;
  214.  
  215.     FILE *out;
  216.     out = fopen("out1.txt", "w");
  217.  
  218.     if (out == NULL)
  219.     {
  220.         perror("Ошибка открытия файла 1\n");
  221.         exit(EXIT_FAILURE);
  222.     }
  223.  
  224.     for (int y = h - 1; y >= 0; y--)
  225.     {
  226.         for (int x = 0; x < w; x++)
  227.         {
  228.             printf("%-6.2lf|", T[MAX_TIME - 1][x][y]);
  229.             fprintf(out, "%d %d %lf\n", x, y, T[MAX_TIME - 1][x][y]);
  230.         }
  231.         printf("\n");
  232.         fprintf(out, "\n");
  233.     }
  234.  
  235.     for (int time = 0; time < timeCount; time++)
  236.     {
  237.         for (int x = 0; x < wr; x++)
  238.         {
  239.             for (int y = 0; y < hr; y++)
  240.             {
  241.                 TR[time + 1][x][y] = fill_after(TR, wr, hr, x, y, DXR, DYR, PSXR, PEXR, PSYR, PEYR, time, DT);
  242.             }
  243.         }
  244.     }
  245.  
  246.     printf("\n");
  247.  
  248.     FILE *out2;
  249.     out2 = fopen("out2.txt", "w");
  250.  
  251.     if (out2 == NULL)
  252.     {
  253.         perror("Ошибка открытия файла 2\n");
  254.         exit(EXIT_FAILURE);
  255.     }
  256.  
  257.     for (int y = hr - 1; y >= 0; y--)
  258.     {
  259.         for (int x = 0; x < wr; x++)
  260.         {
  261.             printf("%-6.2lf|", TR[MAX_TIME - 1][x][y]);
  262.             fprintf(out2, "%d %d %lf\n", x, y, TR[MAX_TIME - 1][x][y]);
  263.         }
  264.         printf("\n");
  265.         fprintf(out2, "\n");
  266.     }
  267.  
  268.     for (int x = 0; x < w; x++)
  269.     {
  270.         for (int y = 0; y < h; y++)
  271.         {
  272.             if (x == 0 || x == w - 1)
  273.                 P[x][y] = BORDER_TEMPERATURE;
  274.             else if (y == h - 1)
  275.                 P[x][y] = P[x][y - 1];
  276.             else if (y == 1)
  277.                 P[x][y] = P[x][y - 1];
  278.             else
  279.                 P[x][y] = ((4 * T[MAX_TIME - 1][x][y]) - (TR[MAX_TIME - 1][2 * x][2 * y])) / 3;
  280.         }
  281.     }
  282.  
  283.     printf("\n");
  284.     FILE *outr;
  285.     outr = fopen("outr.txt", "w");
  286.  
  287.     if (outr == NULL)
  288.     {
  289.         perror("Ошибка открытия файла 3\n");
  290.         exit(EXIT_FAILURE);
  291.     }
  292.  
  293.     for (int y = h - 1; y >= 0; y--)
  294.     {
  295.         for (int x = 0; x < w; x++)
  296.         {
  297.             printf("%-6.2lf|", P[x][y]);
  298.             fprintf(outr, "%d %d %lf\n", x, y, P[x][y]);
  299.         }
  300.         printf("\n");
  301.         fprintf(outr, "\n");
  302.     }
  303.     return 0;
  304. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement