Skip to content

Commit f8e7ef2

Browse files
committed
feat: added task solution for third special lab
1 parent c73c021 commit f8e7ef2

File tree

2 files changed

+99
-1
lines changed

2 files changed

+99
-1
lines changed

CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,6 @@ function(add_lab lab_number)
4242
endfunction()
4343

4444

45-
add_lab(7)
45+
add_lab(3 ON)
4646

4747

src/Labs/Special/Lab3/Task1.cpp

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
#include <cmath>
2+
#include <vector>
3+
#include <memory>
4+
#include <iostream>
5+
6+
// PDE solvers
7+
#include "Labs/Special/Lab3/ConvectionSolvers/FTCSSolver.h"
8+
#include "Labs/Special/Lab3/ConvectionSolvers/LaxWendroffSolver.h"
9+
#include "Labs/Special/Lab3/ConvectionSolvers/RichtmyerSolver.h"
10+
#include "Labs/Special/Lab3/ConvectionSolvers/MacCormackSolver.h"
11+
#include "Labs/Special/Lab3/ConvectionSolvers/Upwind1Solver.h"
12+
#include "Labs/Special/Lab3/ConvectionSolvers/Upwind2Solver.h"
13+
#include "Labs/Special/Lab3/ConvectionSolvers/BTCSSolver.h"
14+
15+
// Task
16+
#include "Labs/Special/Lab3/Tasks/ConvectionTask.h"
17+
18+
// Linear solver for BTCS
19+
#include "Labs/Lab1/SLAESolvers/ThomasSolver.h"
20+
21+
int main() {
22+
using namespace special;
23+
24+
const double xL = 0.0;
25+
const double xR = 1.0;
26+
const std::size_t Nx = 201; // число узлов по x
27+
28+
const double t0 = 0.0;
29+
const double tN = 10.0;
30+
31+
std::vector<double> outputTimes{0.1, 0.5, 1.0, 5.0, 10.0};
32+
33+
// скорость переноса (можно менять, но c = u*dt/dx будет подбираться ниже)
34+
const double u = 0.1;
35+
36+
auto phi = [](double x) {
37+
return std::cos(M_PI * x / 2.0);
38+
};
39+
40+
auto exact_solution = [=](double x, double t) {
41+
double arg = x - u * t;
42+
return std::cos(M_PI * arg / 2.0);
43+
};
44+
45+
auto leftBC = [=](double t) { return exact_solution(xL, t); };
46+
auto rightBC = [=](double t) { return exact_solution(xR, t); };
47+
48+
Plotter plotter;
49+
50+
ThomasSolver linearSolver;
51+
BTCSSolver btcsSolver(linearSolver);
52+
53+
FTCSSolver ftcsSolver;
54+
LaxWendroffSolver lwSolver;
55+
RichtmyerSolver richtSolver;
56+
MacCormackSolver macSolver;
57+
Upwind1Solver up1Solver;
58+
Upwind2Solver up2Solver;
59+
60+
std::vector<IConvectionSolver*> solvers = {
61+
&ftcsSolver,
62+
&lwSolver,
63+
&richtSolver,
64+
&macSolver,
65+
&up1Solver,
66+
&up2Solver,
67+
&btcsSolver
68+
};
69+
70+
std::vector<double> c_values{0.1, 0.5, 1.0};
71+
72+
for (double c : c_values) {
73+
double dx = (xR - xL) / (Nx - 1);
74+
double dt = c * dx / u;
75+
76+
std::cout << "\n=============================\n";
77+
std::cout << "Convection number c = " << c
78+
<< ", dt = " << dt << "\n";
79+
80+
ConvectionTaskParams params;
81+
params.xL = xL;
82+
params.xR = xR;
83+
params.Nx = Nx;
84+
params.t0 = t0;
85+
params.tN = tN;
86+
params.dt = dt;
87+
params.convectionVelocity = u;
88+
params.u0 = phi;
89+
params.exact = exact_solution;
90+
params.leftBC = leftBC;
91+
params.rightBC = rightBC;
92+
93+
for (IConvectionSolver* s : solvers) {
94+
ConvectionTask task(*s, &plotter, "x", "U");
95+
task.run(params, outputTimes);
96+
}
97+
}
98+
}

0 commit comments

Comments
 (0)