Advertisement
llownall

fem

Dec 19th, 2019
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.49 KB | None | 0 0
  1. //#pragma warning(disable:4996)
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <conio.h>
  5. #include <locale.h>
  6.  
  7. #include <iostream>
  8. #include <fstream>
  9.  
  10. #include <algorithm>
  11. #include <vector>
  12. #include <list>
  13. #include <set>
  14. #include <tuple>
  15. #include <utility> // pair
  16.  
  17. using namespace std;
  18.  
  19. const double BIG = 1e8;
  20.  
  21. const int Gx[8][8] = {
  22.     { 4, -4, 2, -2, 2, -2, 1, -1 },
  23.     { -4, 4, -2, 2, -2, 2, -1, 1 },
  24.     { 2, -2, 4, -4, 1, -1, 2, -2 },
  25.     { -2, 2, -4, 4, -1, 1, -2, 2 },
  26.     { 2, -2, 1, -1, 4, -4, 2, -2 },
  27.     { -2, 2, -1, 1, -4, 4, -2, 2 },
  28.     { 1, -1, 2, -2, 2, -2, 4, -4 },
  29.     { -1, 1, -2, 2, -2, 2, -4, 4 },
  30. };
  31.  
  32. const int Gy[8][8] = {
  33.     { 4, 2, -4, -2, 2, 1, -2, -1 },
  34.     { 2, 4, -2, -4, 1, 2, -1, -2 },
  35.     { -4, -2, 4, 2, -2, -1, 2, 1 },
  36.     { -2, -4, 2, 4, -1, -2, 1, 2 },
  37.     { 2, 1, -2, -1, 4, 2, -4, -2 },
  38.     { 1, 2, -1, -2, 2, 4, -2, -4 },
  39.     { -2, -1, 2, 1, -4, -2, 4, 2 },
  40.     { -1, -2, 1, 2, -2, -4, 2, 4 },
  41. };
  42.  
  43. const int Gz[8][8] = {
  44.     { 4, 2, 2, 1, -4, -2, -2, -1 },
  45.     { 2, 4, 1, 2, -2, -4, -1, -2 },
  46.     { 2, 1, 4, 2, -2, -1, -4, -2 },
  47.     { 1, 2, 2, 4, -1, -2, -2, -4 },
  48.     { -4, -2, -2, -1, 4, 2, 2, 1 },
  49.     { -2, -4, -1, -2, 2, 4, 1, 2 },
  50.     { -2, -1, -4, -2, 2, 1, 4, 2 },
  51.     { -1, -2, -2, -4, 1, 2, 2, 4 },
  52. };
  53.  
  54. const int M[8][8] = {
  55.     { 8, 4, 4, 2, 4, 2, 2, 1 },
  56.     { 4, 8, 2, 4, 2, 4, 1, 2 },
  57.     { 4, 2, 8, 4, 2, 1, 4, 2 },
  58.     { 2, 4, 4, 8, 1, 2, 2, 4 },
  59.     { 4, 2, 2, 1, 8, 4, 4, 2 },
  60.     { 2, 4, 1, 2, 4, 8, 2, 4 },
  61.     { 2, 1, 4, 2, 4, 2, 8, 4 },
  62.     { 1, 2, 2, 4, 2, 4, 4, 8 },
  63. };
  64.  
  65. const int C[4][4] = {
  66.     { 4, 2, 2, 1 },
  67.     { 2, 4, 1, 2 },
  68.     { 2, 1, 4, 2 },
  69.     { 1, 2, 2, 4 },
  70. };
  71.  
  72. struct node
  73. {
  74.     double x, y, z;
  75. };
  76.  
  77. struct u_in_node
  78. {
  79.     int number;
  80.     double value;
  81. };
  82.  
  83. struct area
  84. {
  85.     vector<double> values;
  86.     vector<int> inodes;
  87. };
  88.  
  89. struct element
  90. {
  91.     double hx, hy, hz, lambda;
  92.     vector<int> inodes;
  93. };
  94.  
  95. double beta;
  96. double gamma;
  97.  
  98. double get_h(vector<double> values)
  99. {
  100.     for (int i = 0; i < values.size(); i++)
  101.         for (int j = i + 1; j < values.size(); j++)
  102.         {
  103.             double diff = values[i] - values[j];
  104.             if (diff != 0)
  105.                 return abs(diff);
  106.         }
  107. }
  108.  
  109. void get_all_h(vector<node> nodes, vector<int> inodes, double& hx, double& hy, double& hz)
  110. {
  111.     vector<double> values;
  112.     for (int inode : inodes)
  113.         values.push_back(nodes[inode].x);
  114.     hx = get_h(values);
  115.  
  116.     values.clear();
  117.     for (int inode : inodes)
  118.         values.push_back(nodes[inode].y);
  119.     hy = get_h(values);
  120.  
  121.     values.clear();
  122.     for (int inode : inodes)
  123.         values.push_back(nodes[inode].z);
  124.     hz = get_h(values);
  125. }
  126.  
  127. int input(
  128.     vector<node>& nodes,
  129.     vector<element>& elements,
  130.     vector<double>& f,
  131.     vector<u_in_node>& conditions1,
  132.     vector<area>& conditions2,
  133.     vector<area>& conditions3
  134. )
  135. {
  136.     ifstream file("nodes.txt");
  137.     int n;
  138.     file >> n;
  139.     file >> beta;
  140.     file >> gamma;
  141.     double x, y, z;
  142.     for (int i = 0; i < n; i++)
  143.     {
  144.         file >> x >> y >> z;
  145.         node _node;
  146.         _node.x = x;
  147.         _node.y = y;
  148.         _node.z = z;
  149.         nodes.push_back(_node);
  150.     }
  151.     file.close();
  152.  
  153.     ifstream file2("elements.txt");
  154.     int elem_count;
  155.     file2 >> elem_count;
  156.     for (int i = 0; i < elem_count; i++)
  157.     {
  158.         element new_elem;
  159.         int temp;
  160.         for (int j = 0; j < 8; j++)
  161.         {
  162.             file2 >> temp;
  163.             new_elem.inodes.push_back(temp - 1);
  164.         }
  165.         file2 >> temp;
  166.         new_elem.lambda = temp;
  167.         sort(new_elem.inodes.begin(), new_elem.inodes.end());
  168.         get_all_h(nodes, new_elem.inodes, new_elem.hx, new_elem.hy, new_elem.hz);
  169.         elements.push_back(new_elem);
  170.     }
  171.     file2.close();
  172.  
  173.     ifstream file3("f.txt");
  174.     for (int i = 0; i < n; i++)
  175.     {
  176.         file3 >> x;
  177.         f.push_back(x);
  178.     }
  179.     file3.close();
  180.  
  181.     ifstream file4("cond1.txt");
  182.     int nn;
  183.     file4 >> nn;
  184.     for (int i = 0; i < nn; i++)
  185.     {
  186.         u_in_node _u;
  187.         int temp;
  188.         file4 >> temp;
  189.         _u.number = temp - 1;
  190.         file4 >> _u.value;
  191.         conditions1.push_back(_u);
  192.     }
  193.     file4.close();
  194.  
  195.     ifstream file5("cond2.txt");
  196.     file5 >> nn;
  197.     double temp2;
  198.     for (int i = 0; i < nn; i++)
  199.     {
  200.         area _area;
  201.         int temp;
  202.         for (int j = 0; j < 4; j++)
  203.         {
  204.             file5 >> temp;
  205.             _area.inodes.push_back(temp - 1);
  206.         }
  207.         double temp2;
  208.         for (int j = 0; j < 4; j++)
  209.         {
  210.             file5 >> temp2;
  211.             _area.values.push_back(temp2);
  212.         }
  213.         conditions2.push_back(_area);
  214.     }
  215.     file5.close();
  216.  
  217.     ifstream file6("cond3.txt");
  218.     file6 >> nn;
  219.     for (int i = 0; i < nn; i++)
  220.     {
  221.         area _area;
  222.         _area.values.push_back(beta);
  223.         int temp;
  224.         for (int j = 0; j < 4; j++)
  225.         {
  226.             file6 >> temp;
  227.             _area.inodes.push_back(temp - 1);
  228.         }
  229.         double temp2;
  230.         for (int j = 0; j < 4; j++)
  231.         {
  232.             file6 >> temp2;
  233.             _area.values.push_back(temp2);
  234.         }
  235.         conditions3.push_back(_area);
  236.     }
  237.     file6.close();
  238.  
  239.     return n;
  240. }
  241.  
  242. void local_matrix(int n, double lambda, double hx, double hy, double hz, vector<double> f, double A[8][8], double b[8])
  243. {
  244.     for (int i = 0; i < 8; i++)
  245.         for (int j = 0; j < 8; j++)
  246.         {
  247.             A[i][j] = lambda * hx * hy * hz / 36 * (Gx[i][j] / (hx * hx) + Gy[i][j] / (hy * hy) + Gz[i][j] / (hz * hz));
  248.             A[i][j] += gamma * hx * hy * hz / 216 * M[i][j];
  249.         }
  250.  
  251.     for (int i = 0; i < 8; i++)
  252.     {
  253.         double sum = 0;
  254.         for (int j = 0; j < 8; j++)
  255.             sum += M[i][j] * f[j];
  256.         b[i] = gamma * hx * hy * hz * sum / 216;
  257.     }
  258. }
  259.  
  260. void portrait(vector<element> elements, int n, vector<int>& ia, vector<int>& ja)
  261. {
  262.     vector<set<int>> _set;
  263.     _set.resize(n);
  264.  
  265.     for (int i = 0; i < elements.size(); i++)
  266.         for (int el : elements[i].inodes)
  267.             for (int node : elements[i].inodes)
  268.                 if (el > node)
  269.                     _set[el].insert(node);
  270.  
  271.     for (int i = 0; i < _set.size(); i++)
  272.     {
  273.         printf("%d : ", i + 1);
  274.         for (int a : _set[i])
  275.             printf("%d ", a + 1);
  276.         cout << endl;
  277.     }
  278.  
  279.     ia.push_back(0);
  280.  
  281.     for (int i = 1; i < _set.size(); i++)
  282.     {
  283.         ia.push_back(ia.back() + _set[i].size());
  284.         for (int node : _set[i])
  285.             ja.push_back(node);
  286.     }
  287.  
  288.     for (int i = 0; i < ia.size(); i++)
  289.     {
  290.         if (ia[i] == 0)
  291.             ia[i] = 1;
  292.         else break;
  293.     }
  294.  
  295.     cout << "\nportrait start\n";
  296.  
  297.     for (int i = 0; i < ia.size(); i++)
  298.         printf("%d ", ia[i]);
  299.  
  300.     cout << endl;
  301.  
  302.     for (int i = 0; i < ja.size(); i++)
  303.         printf("%d ", ja[i] + 1);
  304.  
  305.     cout << "\nportrait end\n\n";
  306. }
  307.  
  308. void matrix_build(int n, vector<node> nodes, vector<element> elements, vector<double> f, double** A, double* b)
  309. {
  310.     /*double** A = new double* [n];
  311.     for (int i = 0; i < n; i++)
  312.         A[i] = new double[n];
  313.     double* b = new double[n];*/
  314.  
  315.     for (int i = 0; i < n; i++)
  316.     {
  317.         for (int j = 0; j < n; j++)
  318.             A[i][j] = 0;
  319.         b[i] = 0;
  320.     }
  321.  
  322.     double _A[8][8];
  323.     double _b[8];
  324.  
  325.     for (int i = 0; i < elements.size(); i++)
  326.     {
  327.         local_matrix(n, elements[i].lambda, elements[i].hx, elements[i].hy, elements[i].hz, f, _A, _b);
  328.         for (int j = 0; j < 8; j++)
  329.         {
  330.  
  331.             for (int k = 0; k < 8; k++)
  332.             {
  333.                 A[elements[i].inodes[j]][elements[i].inodes[k]] += _A[j][k];
  334.                 //printf("%d -> %d\n", elements[i].inodes[j], j);
  335.                 //printf("%d -> %d\n", elements[i].inodes[k], k);
  336.             }
  337.             b[elements[i].inodes[j]] += _b[j];
  338.         }
  339.  
  340.         printf("\n\n");
  341.         for (int i = 0; i < 8; i++)
  342.         {
  343.             for (int j = 0; j < 8; j++)
  344.                 printf("%5.2f ", _A[i][j]);
  345.             cout << endl;
  346.         }
  347.         printf("\n\n");
  348.         for (int i = 0; i < n; i++)
  349.         {
  350.             for (int j = 0; j < n; j++)
  351.                 printf("%5.2f ", A[i][j]);
  352.             cout << endl;
  353.         }
  354.     }
  355. }
  356.  
  357. void conditions(vector<node> nodes, vector<u_in_node> conditions1, vector<area> conditions2, vector<area> conditions3, double** A, double* b)
  358. {
  359.     cout << "\n\nconditions\n\n";
  360.  
  361.     for (area _a : conditions3)
  362.     {
  363.         double hx = abs(nodes[_a.inodes[0]].x - nodes[_a.inodes[3]].x);
  364.         double hy = abs(nodes[_a.inodes[0]].y - nodes[_a.inodes[3]].y);
  365.         double hz = abs(nodes[_a.inodes[0]].z - nodes[_a.inodes[3]].z);
  366.         hx = (hx == 0) ? 1 : hx;
  367.         hy = (hy == 0) ? 1 : hy;
  368.         hz = (hz == 0) ? 1 : hz;
  369.  
  370.         double _C[4];
  371.         for (int i = 0; i < 4; i++)
  372.         {
  373.             _C[i] = 0;
  374.             for (int j = 0; j < 4; j++)
  375.                 _C[i] += C[i][j] * _a.values[j];
  376.         }
  377.  
  378.         for (int i = 0; i < 4; i++)
  379.         {
  380.             for (int j = 0; j < 4; j++)
  381.                 A[_a.inodes[i]][_a.inodes[j]] += beta * hx * hy * hz / 36 * C[i][j];
  382.             b[_a.inodes[i]] += beta * hx * hy * hz / 36 * _C[i];
  383.         }
  384.  
  385.         printf("\n\n");
  386.         for (int i = 0; i < nodes.size(); i++)
  387.         {
  388.             for (int j = 0; j < nodes.size(); j++)
  389.                 printf("%5.2f ", A[i][j]);
  390.             cout << endl;
  391.         }
  392.         printf("\n\n");
  393.         for (int i = 0; i < nodes.size(); i++)
  394.             printf("%5.2f\n", b[i]);
  395.     }
  396.  
  397.     for (area _a : conditions2)
  398.     {
  399.         double hx = abs(nodes[_a.inodes[0]].x - nodes[_a.inodes[3]].x);
  400.         double hy = abs(nodes[_a.inodes[0]].y - nodes[_a.inodes[3]].y);
  401.         double hz = abs(nodes[_a.inodes[0]].z - nodes[_a.inodes[3]].z);
  402.         hx = (hx == 0) ? 1 : hx;
  403.         hy = (hy == 0) ? 1 : hy;
  404.         hz = (hz == 0) ? 1 : hz;
  405.  
  406.         double _C[4];
  407.         for (int i = 0; i < 4; i++)
  408.             for (int j = 0; j < 4; j++)
  409.                 b[_a.inodes[i]] += beta * hx * hy * hz / 36 * C[i][j] * _a.values[j];
  410.  
  411.         printf("\n\n");
  412.         for (int i = 0; i < nodes.size(); i++)
  413.             printf("%5.2f\n", b[i]);
  414.     }
  415.  
  416.     for (u_in_node _u : conditions1)
  417.     {
  418.         A[_u.number][_u.number] = BIG;
  419.         b[_u.number] = BIG * _u.value;
  420.     }
  421. }
  422.  
  423. int main()
  424. {
  425.     vector<node> nodes;
  426.     vector<element> elements;
  427.     vector<double> f;
  428.  
  429.     vector<u_in_node> conditions1;
  430.     vector<area> conditions2;
  431.     vector<area> conditions3;
  432.  
  433.     vector<int> ia = { 0 };
  434.     vector<int> ja;
  435.  
  436.     /*double _A[8][8];
  437.     double _b[8];*/
  438.  
  439.     int n = input(nodes, elements, f, conditions1, conditions2, conditions3);
  440.  
  441.     //portrait(elements, n, ia, ja);
  442.     //matrix_build(n, nodes, elements, f, ia, ja);
  443.  
  444.     double** A = new double* [n];
  445.     for (int i = 0; i < n; i++)
  446.         A[i] = new double[n];
  447.     double* b = new double[n];
  448.  
  449.     matrix_build(n, nodes, elements, f, A, b);
  450.  
  451.     conditions(nodes, conditions1, conditions2, conditions3, A, b);
  452.  
  453.     return 0;
  454. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement