From 8100f0d4e156cb5af78e59d72f065bb6cbbd77da Mon Sep 17 00:00:00 2001 From: ParkSuMin Date: Wed, 14 May 2025 14:21:16 +0300 Subject: [PATCH] Change encoding --- src/Solver.cpp | 22 +++++++++++++--------- src/main.cpp | 46 ++++++++++++++++++++++++---------------------- 2 files changed, 37 insertions(+), 31 deletions(-) diff --git a/src/Solver.cpp b/src/Solver.cpp index 145d41f..3d9bdc4 100644 --- a/src/Solver.cpp +++ b/src/Solver.cpp @@ -1,13 +1,15 @@ #include "Solver.hpp" void Solver::SolveExplicit(System& program, double tstop) const { std::ofstream ExplicitOut(_name_1); + //ExplicitOut << "t x y T" << std::endl; + for (double t = 0.0; t < tstop; t += delta) { - /* X */ + /* Обработка узлов по оси X */ for (int i = 1; i < program.LineX().size() - 1; i++) { std::vector temperature; Node* cur = program.LineX()[i]; while (cur) { - /* */ + /* Проверка на существование узла */ if (cur->r() && cur->r()->X() - cur->X() > program.step()) { temperature.push_back(cur); SolveLine(program, temperature); @@ -21,12 +23,12 @@ void Solver::SolveExplicit(System& program, double tstop) const { } SolveLine(program, temperature); } - /* Y */ + /* Обработка узлов по оси Y */ for (int i = 1; i < program.LineY().size() - 1; i++) { std::vector temperature; Node* cur = program.LineY()[i]; while (cur) { - /* */ + /* Проверка на существование узла */ if (cur->u() && cur->u()->Y() - cur->Y() > program.step()) { temperature.push_back(cur); SolveLine(program, temperature); @@ -42,7 +44,7 @@ void Solver::SolveExplicit(System& program, double tstop) const { } for (auto line : program.Nodes()) { for (auto node : line) - ExplicitOut << node->X() << ' ' << node->Y() << ' ' << node->T() << '\n'; + ExplicitOut << t+1 << ' ' << node->X() << ' ' << node->Y() << ' ' << node->T() << '\n'; } ExplicitOut << "\n\n"; } @@ -50,15 +52,17 @@ void Solver::SolveExplicit(System& program, double tstop) const { void Solver::SolveImplicit(System& sys, double tstop) const { std::ofstream EmplicitOut(_name_2); + //EmplicitOut << "t x y T" << std::endl; + for (double t = 0.; t < tstop; t += delta) { for (auto line : sys.Nodes()) for (auto node : line) { - /* */ + /* Проверка на внутренний узел */ if (!node->IsBound()) { /* Tx = T_right - 2T_current + T_left / delta_x ^ 2 */ /* Ty = T_upper - 2T_current + T_down / delta_y ^ 2*/ /* T_new = delta_t * a * (delta_x + delta_y) + T_current - ( a = 1) */ + (для удобства коээфициент a = 1) */ double tx = (node->r()->T() - 2 * node->T() + node->l()->T()) / pow(sys.step(), 2); double ty = (node->u()->T() - 2 * node->T() + node->d()->T()) / pow(sys.step(), 2); @@ -68,7 +72,7 @@ void Solver::SolveImplicit(System& sys, double tstop) const { } for (auto line : sys.Nodes()) { for (auto node : line) - EmplicitOut << node->X() << ' ' << node->Y() << ' ' << node->T() << '\n'; + EmplicitOut << t + 1 << ' ' << node->X() << ' ' << node->Y() << ' ' << node->T() << '\n'; } EmplicitOut << "\n\n"; } @@ -78,7 +82,7 @@ void Solver::SolveLine(System& sys, std::vector& n) const { int size = n.size() - 2; double mu1 = n.front()->Dist(n[1]) / sys.step(); double mu2 = n.back()->Dist(n[n.size() - 2]) / sys.step(); - /* */ + /* Защита от нуля */ if (mu2 == 0.) mu2 = .1; double val2 = -(2 * sys.a1()) / (pow(sys.step(), 2)) - 1 / delta; diff --git a/src/main.cpp b/src/main.cpp index a51ec49..2a23827 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -15,32 +15,34 @@ #define HOLE_Y 155. #define HOLE_RADIUS 50. +#define CONDUCTIVITY 50. // Теплопроводность материала + void visualize(std::ofstream& file, std::string filename, int time_end) { file << "set cbrange [" << 0 << ":" << 100 << "]" << std::endl; file << "set size ratio " << float(400) / 500 << "\nunset key\n" << "\nset palette defined (0 0 0 1, 0.25 0 1 1, 0.5 0 1 0, 0.75 1 1 0, 1 1 0 0)\n" << std::endl; file << "do for [i=0:" << time_end - 1 << "]{" << std::endl; - file << "plot '" << filename << "' u 1:2:3 index i w points pt 5 palette" << std::endl; + file << "plot '" << filename << "' u 2:3:4 index i w points pt 5 palette" << std::endl; file << "pause " << 0.000000001 << "}" << std::endl; file << "pause mouse"; } int main() { - int l = 3; //Bound conditions - int t = 3; + /* Граничные условия: + 1 - нагрев*/ + int l = 3; + int t = 1; int r = 1; - int b = 3; + int b = 4; int r2 = 4; - int s = 3; + int s = 4; - double step = 10; // Mesh step - double step2 = 5; // Mesh step + double step = 10; + double step2 = 5; double time_step = 1; double time_end = 100; - double C = 50.; // Material props - std::map plate{ {"a", WIDTH / 2}, {"b", HEIGHT / 2}, {"h_x", 1 / WIDTH}, {"h_y", 1 / HEIGHT} }; @@ -56,26 +58,26 @@ int main() obj.Add_Form("Arc", arc, true, r2); obj.Add_Form("Rectangle", plate, false, 1); - System explicit10(obj, step, C); + System explicit5(obj, step2, CONDUCTIVITY); + System explicit10(obj, step, CONDUCTIVITY); + + System implicit5(obj, step2, CONDUCTIVITY); + System implicit10(obj, step, CONDUCTIVITY); + + explicit5.DefineBounds(l, t, r, b); explicit10.DefineBounds(l, t, r, b); - System explicit5(obj, step2, C); - explicit5.DefineBounds(l, t, r, b); - - System implicit10(obj, step, C); + implicit5.DefineBounds(l, t, r, b); implicit10.DefineBounds(l, t, r, b); - System implicit5(obj, step2, C); - implicit5.DefineBounds(l, t, r, b); - - - Solver slv10("explicit10.txt", "implicit10.txt", time_step); - slv10.SolveExplicit(explicit10, time_end); - slv10.SolveImplicit(implicit10, time_end); - Solver slv5("explicit5.txt", "implicit5.txt", time_step); + Solver slv10("explicit10.txt", "implicit10.txt", time_step); + slv5.SolveExplicit(explicit5, time_end); slv5.SolveImplicit(implicit5, time_end); + slv10.SolveExplicit(explicit10, time_end); + slv10.SolveImplicit(implicit10, time_end); + std::ofstream script("es10.plt"); visualize(script, "explicit10.txt", time_end); script.close();