-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsolvecontroller.cpp
More file actions
56 lines (47 loc) · 1.84 KB
/
solvecontroller.cpp
File metadata and controls
56 lines (47 loc) · 1.84 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include "solvecontroller.h"
#include "functions.h"
#include "residual.h"
#include "plot3d.h"
#include "iterators.h"
#include "cljacobiiterator.h"
#include <QElapsedTimer>
SolveController::SolveController(size_t gridSize, double epsilon, std::unique_ptr<AbstractIterator> iterator, size_t stepIterations):
m_gridSize(gridSize),
m_epsilon(epsilon),
m_iterator(std::move(iterator)),
m_stepIterations(stepIterations)
{
}
void SolveController::solve()
{
const double h = 1./m_gridSize;
const double xOrigin = 0.;
const double yOrigin = 1.;
const GridValues::Origin origin = std::make_pair(xOrigin, yOrigin);
GridValues fValues(m_gridSize + 1, origin, h);
fValues.fillWithFunction(f);
GridValues uValues(m_gridSize + 1, origin, h);
uValues.fillBoundaryWithFunction(g);
const double zeroResidual = residual(uValues, fValues).maxAbs();
double currentResidual = zeroResidual;
QElapsedTimer timer;
timer.start();
size_t iteration = 0;
double previousEpsilon = 1.;
double currentEpsilon = 1.;
do
{
previousEpsilon = currentEpsilon;
(*m_iterator)(uValues, fValues, m_stepIterations);
currentResidual = residual(uValues, fValues).maxAbs();
++iteration;
emit solution(uValues);
emit message(QString("Итерация: ") + QString::number(iteration) + "\nОтношение невязки: "
+ QString::number(currentResidual / zeroResidual)
+ " Максимальный модуль невязки: " + QString::number(currentResidual) + "\n");
currentEpsilon = currentResidual / zeroResidual;
}
while(iteration < 1 && currentEpsilon <= previousEpsilon && currentEpsilon > m_epsilon);
emit message(QString("Время: ") + QString::number(timer.elapsed()) + "\n");
emit finished();
}