Skip to content

Commit 0120dc8

Browse files
Initial commit
0 parents  commit 0120dc8

10 files changed

+922
-0
lines changed

CMakeLists.txt

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
cmake_minimum_required(VERSION 3.7)
2+
project(Diplom)
3+
4+
set(CMAKE_CXX_STANDARD 14)
5+
6+
set(SOURCE_FILES main.cpp Triangle/triangle.cpp EasyLogging/easylogging++.cc constants.h Gauss/gauss.cpp)
7+
add_executable(Diplom ${SOURCE_FILES})

Gauss/gauss.cpp

+48
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
//
2+
// Created by aksol on 12.06.2017.
3+
//
4+
5+
#include "gauss.h"
6+
7+
void Gauss::Solve(double_t *x, vector< vector<double> > A) {
8+
int n = A.size();
9+
10+
for (int i=0; i<n; i++) {
11+
// Search for maximum in this column
12+
double maxEl = abs(A[i][i]);
13+
int maxRow = i;
14+
for (int k=i+1; k<n; k++) {
15+
if (abs(A[k][i]) > maxEl) {
16+
maxEl = abs(A[k][i]);
17+
maxRow = k;
18+
}
19+
}
20+
21+
// Swap maximum row with current row (column by column)
22+
for (int k=i; k<n+1;k++) {
23+
double tmp = A[maxRow][k];
24+
A[maxRow][k] = A[i][k];
25+
A[i][k] = tmp;
26+
}
27+
28+
// Make all rows below this one 0 in current column
29+
for (int k=i+1; k<n; k++) {
30+
double c = -A[k][i]/A[i][i];
31+
for (int j=i; j<n+1; j++) {
32+
if (i==j) {
33+
A[k][j] = 0;
34+
} else {
35+
A[k][j] += c * A[i][j];
36+
}
37+
}
38+
}
39+
}
40+
41+
// Solve equation Ax=b for an upper triangular matrix A
42+
for (int i=n-1; i>=0; i--) {
43+
x[i] = A[i][n]/A[i][i];
44+
for (int k=i-1;k>=0; k--) {
45+
A[k][n] -= A[k][i] * x[i];
46+
}
47+
}
48+
}

Gauss/gauss.h

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
//
2+
// Created by aksol on 12.06.2017.
3+
//
4+
5+
#ifndef DIPLOM_GAUSS_12062017_H
6+
#define DIPLOM_GAUSS_12062017_H
7+
8+
#include <iostream>
9+
#include <cmath>
10+
#include <vector>
11+
12+
using namespace std;
13+
14+
class Gauss {
15+
public:
16+
void Solve(double *x, vector< vector<double> > A);
17+
};
18+
19+
20+
#endif //DIPLOM_GAUSS_12062017_H

Triangle/triangle.cpp

+159
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,159 @@
1+
#include "triangle.h"
2+
3+
double_t IsoscelesTriangleGrid::LineFunction_ab(double_t x, double_t step)
4+
{
5+
double_t y = 2 * (x - step);
6+
7+
return y;
8+
}
9+
10+
double_t IsoscelesTriangleGrid::LineFunction_bc(double_t x)
11+
{
12+
/* x = 1 означает вертикальную грань прямоугольного треугольника
13+
* /|
14+
* / |
15+
* /__|
16+
*
17+
*/
18+
x = 1;
19+
20+
return x;
21+
}
22+
23+
uint_fast32_t IsoscelesTriangleGrid::GetGreed(boolean debug)
24+
{
25+
/*
26+
* Массив координат треугольников
27+
* TODO изменить фиксированную размерность. Заранее вычислять число треугольников.
28+
*/
29+
30+
/* Координаты узлов сетки */
31+
double_t x = m_a.x;
32+
double_t y = 0;
33+
34+
/*
35+
* t1 - разница между координатой y правой точки маленького треугольника и правой границей
36+
* основного треугольника. Если разница меньше eps, считаем что мы дошли до границы.
37+
* t2 - то же самое, для перевернутых маленьких треугольников.
38+
* Если выполнены условия для t1 и t2, значит этот уровень триангулирован и надо идти вверх по оси y
39+
* на следующий уровень.
40+
*/
41+
double_t eps = EPS_T;
42+
double_t t1 = 0;
43+
double_t t2 = 0;
44+
45+
/*
46+
* Счетчики
47+
* i - счетчик прямых, параллельных левой грани треугольника (идет через два шага, одинаково на всех уровнях)
48+
* обнуляется в конце уровня
49+
* j - счетчик треугольников в массиве треугольников
50+
* ii - счетчик сдвига по x при переходе на ряд выше ( счетчик иксов на уровне)
51+
* l - счетчик рядов по высоте (он идет до середины треугольника)
52+
* k - нумератор узлов
53+
* n - число узлов на уровне (на сколько узлов делится горизонтальная сторона треугольника)
54+
* length - длина уровня
55+
*/
56+
uint_fast32_t i = 0;
57+
uint_fast32_t j = 0;
58+
uint_fast32_t ii = 0;
59+
uint_fast32_t l = 0;
60+
61+
uint_fast32_t k = 0;
62+
uint_fast32_t n = 0;
63+
// m_b.x -1 потому что тут бага в координатах (см файл constants).
64+
double_t length = LineFunction_bc(m_b.x - 1) + STEP_X;
65+
66+
/* Переход с ряда на ряд (вверх), пока не дойдем до середины треугольника */
67+
while (y < TRIANGLE_HEIGHT) {
68+
length -= STEP_X;
69+
n += (length / m_hx) + 1;
70+
/* Цикл по горизонтальному ряду */
71+
for (;;) {
72+
x = ii * m_hx;
73+
y = LineFunction_ab(x, i * m_hx);
74+
75+
triangle.first_point = { x, y, k };
76+
77+
x = (ii + 1) * m_hx;
78+
y = LineFunction_ab(x, (i + 1) * m_hx);
79+
80+
triangle.second_point = { x, y, k + 1 };
81+
82+
t1 = abs(x - LineFunction_bc(x));
83+
84+
x = (ii + 1) * m_hx;
85+
y = LineFunction_ab(x, i * m_hx);
86+
87+
triangle.third_point = { x, y, k + ((uint_fast32_t)(length / m_hx) + 1) };
88+
89+
triangles_array.push_back(triangle);
90+
91+
if (debug == true) {
92+
LOG(INFO) << "First point of triange " << j << ": ";
93+
LOG(INFO) << "x: " << triangles_array.at(j).first_point.x;
94+
LOG(INFO) << "y: " << triangles_array.at(j).first_point.y;
95+
LOG(INFO) << "k: " << triangles_array.at(j).first_point.point_num;
96+
LOG(INFO) << "Second point of triange " << j << ": ";
97+
LOG(INFO) << "x: " << triangles_array.at(j).second_point.x;
98+
LOG(INFO) << "y: " << triangles_array.at(j).second_point.y;
99+
LOG(INFO) << "k: " << triangles_array.at(j).second_point.point_num;
100+
LOG(INFO) << "Third point of triange " << j << ": ";
101+
LOG(INFO) << "x: " << triangles_array.at(j).third_point.x;
102+
LOG(INFO) << "y: " << triangles_array.at(j).third_point.y;
103+
LOG(INFO) << "k: " << triangles_array.at(j).third_point.point_num;
104+
}
105+
106+
t2 = abs(x - LineFunction_bc(x));
107+
108+
if ((t2 < EPS_T) && (t1 < EPS_T)) {
109+
ii = l + 1;
110+
i = 0;
111+
j++;
112+
k = n;
113+
if (debug == true) {
114+
LOG(INFO) << "BREAK CONDITION.";
115+
LOG(INFO) << "n = " << n;
116+
LOG(INFO) << "k = " << k;
117+
}
118+
break;
119+
}
120+
121+
triangle.first_point.x = triangles_array.back().third_point.x;
122+
triangle.first_point.y = triangles_array.back().third_point.y;
123+
triangle.first_point.point_num = triangles_array.back().third_point.point_num;
124+
triangle.second_point.x = triangles_array.back().second_point.x;
125+
triangle.second_point.y = triangles_array.back().second_point.y;
126+
triangle.second_point.point_num = triangles_array.back().second_point.point_num;
127+
128+
x = (ii + 2) * m_hx;
129+
y = LineFunction_ab(x, (i + 1) * m_hx);
130+
131+
triangle.third_point = { x, y, k + 1 + ((uint_fast32_t)(length / m_hx) + 1) };
132+
triangles_array.push_back(triangle);
133+
134+
if (debug == true) {
135+
LOG(INFO) << "Second point of triange " << j + 1 << ": ";
136+
LOG(INFO) << "x: " << triangles_array.at(j + 1).first_point.x;
137+
LOG(INFO) << "y: " << triangles_array.at(j + 1).first_point.y;
138+
LOG(INFO) << "k: " << triangles_array.at(j + 1).first_point.point_num;
139+
LOG(INFO) << "Second point of triange " << j + 1 << ": ";
140+
LOG(INFO) << "x: " << triangles_array.at(j + 1).second_point.x;
141+
LOG(INFO) << "y: " << triangles_array.at(j + 1).second_point.y;
142+
LOG(INFO) << "k: " << triangles_array.at(j + 1).second_point.point_num;
143+
LOG(INFO) << "Third point of triange " << j + 1 << ": ";
144+
LOG(INFO) << "x: " << triangles_array.at(j + 1).third_point.x;
145+
LOG(INFO) << "y: " << triangles_array.at(j + 1).third_point.y;
146+
LOG(INFO) << "k: " << triangles_array.at(j + 1).third_point.point_num;
147+
}
148+
i = i + 1;
149+
ii = ii + 1;
150+
j = j + 2;
151+
k++;
152+
}
153+
l++;
154+
if (debug == true) {
155+
LOG(INFO) << "New level l = " << l;
156+
}
157+
}
158+
return triangles_array.back().third_point.point_num;
159+
}

Triangle/triangle.h

+76
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
2+
#ifndef TRIANGLE_H
3+
#define TRIANGLE_H
4+
5+
/* Подключаем быстрые int фиксированного размера */
6+
#include <cstdint>
7+
#include <array>
8+
9+
/* Подключаем double_t тип для оптимальной работы на любой архитектуре компьютера. */
10+
#include <math.h>
11+
12+
/* Мои хедеры */
13+
#include "../constants.h"
14+
#include "../structures.h"
15+
16+
/* Debug */
17+
#include <iostream>
18+
#include <fstream>
19+
#include "../EasyLogging/easylogging++.h"
20+
21+
/*
22+
* Построение треугольной сетки на равнобедренном треугольнике.
23+
* Левая координата треугольника должна совпадать с началом координат.
24+
*/
25+
class IsoscelesTriangleGrid {
26+
27+
private:
28+
/*
29+
* m_a - левая точка треугольника
30+
* m_b - правая точка треугольника
31+
* m_c - центральная точка треугольника
32+
* m_hx - шаг по оси x
33+
*/
34+
points m_a;
35+
points m_b;
36+
points m_c;
37+
double_t m_hx;
38+
triangles triangle;
39+
40+
public:
41+
std::vector<triangles> triangles_array;
42+
43+
/*
44+
* Конструктор класса IsoscelesTriangleGrid
45+
*/
46+
IsoscelesTriangleGrid(points a, points b, points c, double_t hx)
47+
{
48+
m_a = a;
49+
m_b = b;
50+
m_c = c;
51+
m_hx = hx;
52+
}
53+
54+
double_t GetStep() { return m_hx; }
55+
56+
/*
57+
* Метод построения сетки
58+
* TODO массив задавать не хардкодом, а вычислять число треугольников заранее
59+
* На выход число узлов
60+
*/
61+
uint_fast32_t GetGreed(boolean debug);
62+
63+
/*
64+
* Функция, вычисляющая значение координаты y по заданной координате x на левой грани треугольника
65+
* или на прямой, сдвинутой относительно левой грани на step
66+
*/
67+
double_t LineFunction_ab(double_t x, double_t step);
68+
69+
/*
70+
* Функция, вычисляющая значение координаты y по заданной координате x на правой грани треугольника
71+
* (граница фиксированная)
72+
*/
73+
double_t LineFunction_bc(double_t x);
74+
};
75+
76+
#endif //TRIANGLE_H

constants.h

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
2+
#ifndef DIPLOM_CONSTANTS_H
3+
#define DIPLOM_CONSTANTS_H
4+
5+
const double STEP_X = 0.1;
6+
const double TAU = 0.0000001;
7+
const double TRIANGLE_HEIGHT = 2;
8+
const double EPS_T = 0.001;
9+
const double INITIAL_TEMPERATURE = 300;
10+
const double PI = 3.1415926535897932384626433832795;
11+
const double Thermal_Diffusivity = 9300000.0;
12+
const double Thermal_Conductivity = 22.3;
13+
const uint_fast32_t DIMENSION = 3;
14+
#endif //DIPLOM_CONSTANTS_H

gauss.cpp

+49
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
2+
#include "gauss.h"
3+
4+
void GaussMethod::GaussSolve(double *x, double **a, double *y, int n) {
5+
double max;
6+
int k, index;
7+
const double eps = 0.00001; // точность
8+
k = 0;
9+
while (k < n) {
10+
// Поиск строки с максимальным a[i][k]
11+
max = fabs(a[k][k]);
12+
index = k;
13+
for (int i = k + 1; i < n; i++) {
14+
if (fabs(a[i][k]) > max) {
15+
max = fabs(a[i][k]);
16+
index = i;
17+
}
18+
}
19+
for (int j = 0; j < n; j++) {
20+
double temp = a[k][j];
21+
a[k][j] = a[index][j];
22+
a[index][j] = temp;
23+
}
24+
double temp = y[k];
25+
y[k] = y[index];
26+
y[index] = temp;
27+
// Нормализация уравнений
28+
for (int i = k; i < n; i++) {
29+
double temp = a[i][k];
30+
if (fabs(temp) < eps)
31+
continue; // для нулевого коэффициента пропустить
32+
for (int j = 0; j < n; j++)
33+
a[i][j] = a[i][j] / temp;
34+
y[i] = y[i] / temp;
35+
if (i == k)
36+
continue; // уравнение не вычитать само из себя
37+
for (int j = 0; j < n; j++)
38+
a[i][j] = a[i][j] - a[k][j];
39+
y[i] = y[i] - y[k];
40+
}
41+
k++;
42+
}
43+
// обратная подстановка
44+
for (k = n - 1; k >= 0; k--) {
45+
x[k] = y[k];
46+
for (int i = 0; i < k; i++)
47+
y[i] = y[i] - a[i][k] * x[k];
48+
}
49+
}

gauss.h

+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
2+
#ifndef DIPLOM_GAUSS_H
3+
#define DIPLOM_GAUSS_H
4+
//#include <cstdlib>
5+
//Если использовать cstdlib std:abs, то в ответе нет чисел с отрицательным знаком и в целом ответ полностью меняется.
6+
// статья на тему https://stackoverflow.com/questions/21392627/abs-vs-stdabs-what-does-the-reference-say
7+
// https://stackoverflow.com/questions/3118165/when-do-i-use-fabs-and-when-is-it-sufficient-to-use-stdabs
8+
// <cmath> и std::abs дает такие же результаты
9+
#include <math.h>
10+
11+
class GaussMethod {
12+
public:
13+
void GaussSolve(double *x, double** a, double* y, int n);
14+
};
15+
16+
17+
#endif //DIPLOM_GAUSS_H

0 commit comments

Comments
 (0)