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