VM2D  1.12
Vortex methods for 2D flows simulation
World2D.h
Go to the documentation of this file.
1 /*--------------------------------*- VM2D -*-----------------*---------------*\
2 | ## ## ## ## #### ##### | | Version 1.12 |
3 | ## ## ### ### ## ## ## ## | VM2D: Vortex Method | 2024/01/14 |
4 | ## ## ## # ## ## ## ## | for 2D Flow Simulation *----------------*
5 | #### ## ## ## ## ## | Open Source Code |
6 | ## ## ## ###### ##### | https://www.github.com/vortexmethods/VM2D |
7 | |
8 | Copyright (C) 2017-2024 I. Marchevsky, K. Sokol, E. Ryatina, A. Kolganova |
9 *-----------------------------------------------------------------------------*
10 | File name: World2D.h |
11 | Info: Source code of VM2D |
12 | |
13 | This file is part of VM2D. |
14 | VM2D is free software: you can redistribute it and/or modify it |
15 | under the terms of the GNU General Public License as published by |
16 | the Free Software Foundation, either version 3 of the License, or |
17 | (at your option) any later version. |
18 | |
19 | VM2D is distributed in the hope that it will be useful, but WITHOUT |
20 | ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
21 | FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
22 | for more details. |
23 | |
24 | You should have received a copy of the GNU General Public License |
25 | along with VM2D. If not, see <http://www.gnu.org/licenses/>. |
26 \*---------------------------------------------------------------------------*/
27 
28 
40 #ifndef WORLD2D_H
41 #define WORLD2D_H
42 
43 #include "Gpu2D.h"
44 #include "Times2D.h"
45 #include "WorldGen.h"
46 
47 namespace VM2D
48 {
49  class Airfoil;
50  class Boundary;
51  class MeasureVP;
52  class Mechanics;
53  class Passport;
54  class Times;
55  class Velocity;
56  class Wake;
57  class WakeDataBase;
58 
68  class World2D : public VMlib::WorldGen
69  {
70  private:
72  std::vector<std::unique_ptr<Airfoil>> airfoil;
73 
75  std::vector<std::unique_ptr<Airfoil>> oldAirfoil;
76 
78  std::vector<std::unique_ptr<Boundary>> boundary;
79 
81  std::vector<size_t> dispBoundaryInSystem;
82 
84  std::vector<std::unique_ptr<Mechanics>> mechanics;
85 
87  std::unique_ptr<Velocity> velocity;
88 
90  std::unique_ptr<Wake> wake;
91 
93  std::unique_ptr<WakeDataBase> source;
94 
96  std::unique_ptr<MeasureVP> measureVP;
97 
98  public:
99 
100  private:
102  Eigen::MatrixXd matr;
103 
105  std::vector<std::vector<std::pair<Eigen::MatrixXd, Eigen::MatrixXd>>> IQ;
106 
108  Eigen::MatrixXd invMatr;
109 
112 
114  Eigen::VectorXd rhs;
115 
117  Eigen::VectorXd sol;
118 
121 
123  mutable Gpu cuda;
124 
125  public:
130  const Airfoil& getAirfoil(size_t i) const { return *airfoil[i]; };
131 
136  const Airfoil& getOldAirfoil(size_t i) const { return *oldAirfoil[i]; };
137 
142  Airfoil& getNonConstAirfoil(size_t i) const { return *airfoil[i]; };
143 
147  size_t getNumberOfAirfoil() const { return airfoil.size(); };
148 
153  const Boundary& getBoundary(size_t i) const { return *boundary[i]; };
154 
159  Boundary& getNonConstBoundary(size_t i) const { return *boundary[i]; };
160 
164  size_t getNumberOfBoundary() const { return boundary.size(); };
165 
170  size_t getDispBoundaryInSystem(size_t i) const { return dispBoundaryInSystem[i]; };
171 
175  const MeasureVP& getMeasureVP() const { return *measureVP; };
176 
180  MeasureVP& getNonConstMeasureVP() const { return *measureVP; };
181 
186  const Mechanics& getMechanics(size_t i) const { return *mechanics[i]; };
187 
192  Mechanics& getNonConstMechanics(size_t i) const { return *mechanics[i]; };
193 
197  const Wake& getWake() const { return *wake; };
198 
202  Wake& getNonConstWake() const { return *wake; };
203 
207  const WakeDataBase& getSource() const { return *source; };
208 
212  const Velocity& getVelocity() const { return *velocity; };
213 
217  Velocity& getNonConstVelocity() const { return *velocity; };
218 
222  const Passport& getPassport() const { return passport; };
223 
227  const Gpu& getCuda() const { return cuda; };
228 
232  Gpu& getNonConstCuda() const { return cuda; };
233 
237  const std::pair<Eigen::MatrixXd, Eigen::MatrixXd>& getIQ(size_t i, size_t j) const { return IQ[i][j]; };
238 
242  Times& getTimestat() const { return dynamic_cast<Times&>(*timestat); };
243 
244  bool ifDivisible(int val) const { return ((val > 0) && (!(currentStep % val))); };
245 
249  void SolveLinearSystem();
250 
254  void FillIQ();
255 
259  void FillMatrixAndRhs();
260 
265 
269  void CalcVortexVelo(bool shiftTime);
270 
275 
280 
285  void MoveVortexes(std::vector<Point2D>& newPos);
286 
292  void CheckInside(std::vector<Point2D>& newPos, const std::vector<std::unique_ptr<Airfoil>>& oldAirfoil);
293 
297  void WakeAndAirfoilsMotion();
298 
299 
303  World2D(const VMlib::PassportGen& passport_);
304 
306  ~World2D() { };
307 
310  void GenerateMechanicsHeader(size_t mechanicsNumber);
311 
312 
313 
314  // Реализация виртуальных функций
315  virtual void Step() override;
316  //virtual void ZeroStep() override;
317  };
318 
319 }//namespace VM2D
320 
321 #endif
322 
const std::pair< Eigen::MatrixXd, Eigen::MatrixXd > & getIQ(size_t i, size_t j) const
Возврат константной ссылки на объект, связанный с матрицей интегралов от (r-xi)/|r-xi|^2.
Definition: World2D.h:237
std::unique_ptr< Velocity > velocity
Умный укзатель на объект, определяющий методику вычисления скоростей
Definition: World2D.h:87
Times & getTimestat() const
Возврат ссылки на временную статистику выполнения шага расчета по времени
Definition: World2D.h:242
Eigen::MatrixXd invMatr
Обратная матрица
Definition: World2D.h:108
void MoveVortexes(std::vector< Point2D > &newPos)
Вычисляем новые положения вихрей (в пелене и виртуальных)
Definition: World2D.cpp:681
Класс для сбора статистики времени исполнения основных шагов алгоритма и вывода ее в файл ...
Definition: Times2D.h:59
Boundary & getNonConstBoundary(size_t i) const
Возврат неконстантной ссылки на объект граничного условия
Definition: World2D.h:159
Gpu & getNonConstCuda() const
Возврат неконстантной ссылки на объект, связанный с видеокартой (GPU)
Definition: World2D.h:232
Eigen::VectorXd rhs
Правая часть системы
Definition: World2D.h:114
size_t getNumberOfBoundary() const
Возврат количества граничных условий в задаче
Definition: World2D.h:164
Заголовочный файл с описанием класса WorldGen.
const Velocity & getVelocity() const
Возврат константной ссылки на объект для вычисления скоростей
Definition: World2D.h:212
Абстрактный класс, определяющий способ удовлетворения граничного условия на обтекаемом профиле ...
Definition: Boundary2D.h:63
const Wake & getWake() const
Возврат константной ссылки на вихревой след
Definition: World2D.h:197
std::vector< std::unique_ptr< Airfoil > > oldAirfoil
Список умных указателей на обтекаемые профили для сохранения старого положения
Definition: World2D.h:75
Mechanics & getNonConstMechanics(size_t i) const
Возврат неконстантной ссылки на объект механики
Definition: World2D.h:192
std::unique_ptr< Wake > wake
Умный указатель на вихревой след
Definition: World2D.h:90
const Mechanics & getMechanics(size_t i) const
Возврат константной ссылки на объект механики
Definition: World2D.h:186
const WakeDataBase & getSource() const
Возврат константной ссылки на источники в области течения
Definition: World2D.h:207
Класс, опеделяющий паспорт двумерной задачи
Definition: Passport2D.h:258
Класс, обеспечивающий возможность выполнения вычислений на GPU по технологии Nvidia CUDA...
Definition: Gpu2D.h:67
std::unique_ptr< WakeDataBase > source
Умный указатель на источники
Definition: World2D.h:93
Заголовочный файл с описанием класса Times.
const Airfoil & getOldAirfoil(size_t i) const
Возврат константной ссылки на объект старого профиля
Definition: World2D.h:136
Eigen::MatrixXd matr
Матрица системы
Definition: World2D.h:102
void GenerateMechanicsHeader(size_t mechanicsNumber)
Definition: World2D.cpp:725
bool ifDivisible(int val) const
Definition: World2D.h:244
std::vector< std::unique_ptr< Mechanics > > mechanics
Список умных указателей на типы механической системы для каждого профиля
Definition: World2D.h:84
std::unique_ptr< MeasureVP > measureVP
Умный указатель на алгоритм вычисления полей скоростей и давления (для сохранения в файл) ...
Definition: World2D.h:96
const Boundary & getBoundary(size_t i) const
Возврат константной ссылки на объект граничного условия
Definition: World2D.h:153
Класс, опеделяющий вихревой след (пелену)
Definition: Wake2D.h:59
World2D(const VMlib::PassportGen &passport_)
Конструктор
Definition: World2D.cpp:67
Wake & getNonConstWake() const
Возврат неконстантной ссылки на вихревой след
Definition: World2D.h:202
virtual void Step() override
Функция выполнения предварительного шага
Definition: World2D.cpp:196
Абстрактный класс, опеделяющий паспорт задачи
Definition: PassportGen.h:91
size_t getNumberOfAirfoil() const
Возврат количества профилей в задаче
Definition: World2D.h:147
void CheckInside(std::vector< Point2D > &newPos, const std::vector< std::unique_ptr< Airfoil >> &oldAirfoil)
Проверка проникновения вихрей внутрь профиля
Definition: World2D.cpp:294
Definition: Airfoil2D.h:45
const MeasureVP & getMeasureVP() const
Возврат константной ссылки на measureVP.
Definition: World2D.h:175
void ReserveMemoryForMatrixAndRhs()
Вычисляем размер матрицы и резервируем память под нее и под правую часть
Definition: World2D.cpp:520
Velocity & getNonConstVelocity() const
Возврат неконстантной ссылки на объект для вычисления скоростей
Definition: World2D.h:217
Gpu cuda
Объект, управляющий графическим ускорителем
Definition: World2D.h:123
Класс, отвечающий за вычисление поля скорости и давления в заданых точках для вывода ...
Definition: MeasureVP2D.h:64
std::vector< std::unique_ptr< Airfoil > > airfoil
Список умных указателей на обтекаемые профили
Definition: World2D.h:72
const Passport & getPassport() const
Возврат константной ссылки на паспорт
Definition: World2D.h:222
const Gpu & getCuda() const
Возврат константной ссылки на объект, связанный с видеокартой (GPU)
Definition: World2D.h:227
bool useInverseMatrix
Признак использования обратной матрицы
Definition: World2D.h:111
std::vector< std::vector< std::pair< Eigen::MatrixXd, Eigen::MatrixXd > > > IQ
Матрица, состоящая из пар матриц, в которых хранятся касательные и нормальные компоненты интегралов о...
Definition: World2D.h:105
void CalcAndSolveLinearSystem()
Набор матрицы, правой части и решение СЛАУ
Definition: World2D.cpp:774
Класс, опеделяющий текущую решаемую задачу
Definition: WorldGen.h:55
Eigen::VectorXd sol
Решение системы
Definition: World2D.h:117
size_t currentStep
Текущий номер шага в решаемой задаче
Definition: WorldGen.h:69
MeasureVP & getNonConstMeasureVP() const
Возврат неконстантной ссылки на measureVP.
Definition: World2D.h:180
void CalcPanelsVeloAndAttachedSheets()
Вычисление скоростей панелей и интенсивностей присоединенных слоев вихрей и источников ...
Definition: World2D.cpp:664
Абстрактный класс, определяющий обтекаемый профиль
Definition: Airfoil2D.h:60
const Airfoil & getAirfoil(size_t i) const
Возврат константной ссылки на объект профиля
Definition: World2D.h:130
void FillIQ()
Заполнение матрицы, состоящей из интегралов от (r-xi) / |r-xi|^2.
Definition: World2D.cpp:732
Класс, опеделяющий текущую решаемую задачу
Definition: World2D.h:68
void CalcVortexVelo(bool shiftTime)
Вычисление скоростей (и конвективных, и диффузионных) вихрей (в пелене и виртуальных), а также в точках вычисления VP.
Definition: World2D.cpp:563
Абстрактный класс, определяющий способ вычисления скоростей
Definition: Velocity2D.h:97
Класс, опеделяющий набор вихрей
void FillMatrixAndRhs()
Заполнение матрицы системы для всех профилей
Definition: World2D.cpp:438
size_t getDispBoundaryInSystem(size_t i) const
Возврат смещения в системе dispBoundaryInSystem.
Definition: World2D.h:170
std::vector< std::unique_ptr< Boundary > > boundary
Список умных указателей на формирователи граничных условий на профилях
Definition: World2D.h:78
void SolveLinearSystem()
Решение системы линейных алгебраических уравнений
Definition: World2D.cpp:333
~World2D()
Деструктор
Definition: World2D.h:306
const Passport & passport
Константная ссылка на паспорт конкретного расчета
Definition: World2D.h:120
Airfoil & getNonConstAirfoil(size_t i) const
Возврат неконстантной ссылки на объект профиля
Definition: World2D.h:142
Заголовочный файл с описанием класса Gpu.
std::vector< size_t > dispBoundaryInSystem
Список номеров, с которых начинаются элементы правой части (или матрицы) системы для профилей ...
Definition: World2D.h:81
void WakeAndAirfoilsMotion()
Перемещение вихрей и профилей на шаге
Definition: World2D.cpp:873
Абстрактный класс, определяющий вид механической системы
Definition: Mechanics2D.h:71