VM2D 1.14
Vortex methods for 2D flows simulation
Loading...
Searching...
No Matches
Airfoil2D.h
Go to the documentation of this file.
1/*--------------------------------*- VM2D -*-----------------*---------------*\
2| ## ## ## ## #### ##### | | Version 1.14 |
3| ## ## ### ### ## ## ## ## | VM2D: Vortex Method | 2026/03/06 |
4| ## ## ## # ## ## ## ## | for 2D Flow Simulation *----------------*
5| #### ## ## ## ## ## | Open Source Code |
6| ## ## ## ###### ##### | https://www.github.com/vortexmethods/VM2D |
7| |
8| Copyright (C) 2017-2026 I. Marchevsky, K. Sokol, E. Ryatina, A. Kolganova |
9*-----------------------------------------------------------------------------*
10| File name: Airfoil2D.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 AIRFOIL_H
41#define AIRFOIL_H
42
43#include "defs.h"
44
45#ifdef USE_CUDA
46#ifdef USE_CUDNN
47 #include "mlp_cudnn.cuh"
48#endif
49#endif
50
51namespace VM2D
52{
66 {
67 protected:
69 std::vector<Point2D> r_;
70
72 std::vector<Point2D> v_;
73
74 public:
76 bool inverse;
77
81 std::vector<Point2D> nrm;
82
86 std::vector<std::pair<Point2D, Point2D>> psn;
87
91 std::vector<Point2D> tau;
92
94 std::vector<double> len;
95
98
100 double phiAfl;
101
103 double area;
104
105
113 const Point2D& getR(size_t q) const
114 {
115 return (q < r_.size()) ? r_[q] : r_[0];
116 };
117
125 Point2D& setR(size_t q)
126 {
127 return (q < r_.size()) ? r_[q] : r_[0];
128 };
129
137 const Point2D& getV(size_t q) const
138 {
139 return (q < v_.size()) ? v_[q] : v_[0];
140 };
141
145 void setV(const Point2D& vel)
146 {
147 v_.clear();
148 v_.resize(r_.size(), vel);
149 }
150
154 void setV(const std::vector<Point2D>& vel)
155 {
156 v_.clear();
157 v_.insert(v_.end(), vel.begin(), vel.end());
158 }
159
163 size_t getNumberOfPanels() const { return r_.size(); };
164 };
165
166
167
168
169 class World2D;
170 class WakeDataBase;
171
182 {
183 public:
185 const World2D& W;
186
188 const size_t numberInPassport;
189
190
191
193 double m;
194
196 double J;
197
199 std::vector<std::vector<Point2D>> possibleWays;
200
202 std::vector<int> wayToVertex;
203
205 void lightningTest();
206
207
209 std::vector<double> meanEpsOverPanel;
210
211
212
214 IFCUDA(mutable double* devRPtr);
215
217 IFCUDA(mutable double* devPsnPtr);
218
220 IFCUDA(mutable double* devRhsPtr);
221
223 IFCUDA(mutable double* devRhsLinPtr);
224
226 IFCUDA(mutable std::vector<double> tmpRhs);
227
229 IFCUDA(mutable double* devFreeVortexSheetPtr);
230
232 IFCUDA(mutable double* devFreeVortexSheetLinPtr);
233
235 IFCUDA(mutable double* devAttachedVortexSheetPtr);
236
238 IFCUDA(mutable double* devAttachedVortexSheetLinPtr);
239
241 IFCUDA(mutable double* devAttachedSourceSheetPtr);
242
244 IFCUDA(mutable double* devAttachedSourceSheetLinPtr);
245
247 IFCUDA(mutable double* devMeanEpsOverPanelPtr);
248
250 IFCUDA(mutable double* devViscousStressesPtr);
251
253 IFCUDA(mutable std::vector<double> tmpViscousStresses);
254
256#ifdef USE_CUDNN
257 IFCUDA(CudaNN NN);
258
259 IFCUDA(std::vector<int> vorticesToProcess);
260 IFCUDA(int vtp);
261 IFCUDA(std::vector<float> batch); //(vtp * 3 * 5);
262 IFCUDA(std::vector<int> signy); //(vtp * 3 * 5);
263 IFCUDA(std::vector<float> nnout); //(vtp * 2 * 5);
264 IFCUDA(std::vector<int> batchPanels); // (vtp * 5);
265#endif
266
268 std::vector<double> viscousStress;
269
272
276 std::vector<double> gammaThrough;
277
281 Airfoil(const World2D& W_, const size_t numberInPassport_);
282
283
285 virtual ~Airfoil() { };
286
287
293 bool isAfter(size_t i, size_t j) const;
294
296 void CalcNrmTauLen();
297
302 virtual void Rotate(double alpha);
303
308 virtual void Scale(const Point2D&);
309
315 virtual void Move(const Point2D& dr);
316
322 virtual void GetGabarits(double gap = 0.02);
323
328 bool isInsideGabarits(const Point2D& r) const;
329
334 bool isOutsideGabarits(const Point2D& r) const;
335
340 virtual bool IsPointInAirfoil(const Point2D& point) const;
341
349 virtual void ReadFromFile(const std::string& dir);
350
358 virtual std::vector<double> getA(size_t p, size_t i, const Airfoil& airfoil, size_t j) const;
359
366 virtual void calcIQ(size_t p, const Airfoil& otherAirfoil, std::pair<Eigen::MatrixXd, Eigen::MatrixXd>& matrPair) const;
367
368
371
372
383 virtual void GetDiffVelocityI0I3ToSetOfPointsAndViscousStresses(const WakeDataBase& pointsDb, std::vector<double>& domainRadius, std::vector<double>& I0, std::vector<Point2D>& I3);
384#if defined(USE_CUDA)
385 virtual void GPUGetDiffVelocityI0I3ToSetOfPointsAndViscousStresses(std::vector<double>& domainRadius, std::vector<double>& I0, std::vector<Point2D>& I3);
386#endif
387 virtual void GetDiffVelocityI0I3ToWakeAndViscousStresses(const WakeDataBase& pointsDb, std::vector<double>& domainRadius, std::vector<double>& I0, std::vector<Point2D>& I3);
388
397 virtual void GetInfluenceFromVorticesToPanel(size_t panel, const Vortex2D* ptr, ptrdiff_t count, std::vector<double>& panelRhs) const;
398
399
408 virtual void GetInfluenceFromSourcesToPanel(size_t panel, const Vortex2D* ptr, ptrdiff_t count, std::vector<double>& panelRhs) const;
409
410
416 virtual void GetInfluenceFromSourceSheetToVortex(size_t panel, const Vortex2D& vtx, Point2D& vel) const;
417
423 virtual void GetInfluenceFromVortexSheetToVortex(size_t panel, const Vortex2D& vtx, Point2D& vel) const;
424
430 virtual void GetInfluenceFromVInfToPanel(std::vector<double>& vInfRhs) const;
431};
432
433}//namespace VM2D
434
435#endif
#define IFCUDA(...)
Definition Gpudefs.h:73
Класс, определяющий форму профиля
Definition Airfoil2D.h:66
std::vector< Point2D > r_
Координаты начал панелей
Definition Airfoil2D.h:69
void setV(const std::vector< Point2D > &vel)
Установка скоростей всех вершин профиля
Definition Airfoil2D.h:154
std::vector< Point2D > v_
Скорости начал панелей
Definition Airfoil2D.h:72
double phiAfl
Поворот профиля
Definition Airfoil2D.h:100
std::vector< double > len
Длины панелей профиля
Definition Airfoil2D.h:94
std::vector< std::pair< Point2D, Point2D > > psn
Псевдонормали к панелям профиля
Definition Airfoil2D.h:86
void setV(const Point2D &vel)
Установка постоянной скорости всех вершин профиля
Definition Airfoil2D.h:145
const Point2D & getR(size_t q) const
Возврат константной ссылки на вершину профиля
Definition Airfoil2D.h:113
double area
Площадь профиля
Definition Airfoil2D.h:103
const Point2D & getV(size_t q) const
Возврат константной ссылки на скорость вершины профиля
Definition Airfoil2D.h:137
std::vector< Point2D > nrm
Нормали к панелям профиля
Definition Airfoil2D.h:81
std::vector< Point2D > tau
Касательные к панелям профиля
Definition Airfoil2D.h:91
bool inverse
Признак разворота нормалей (для расчета внутренних течений)
Definition Airfoil2D.h:76
Point2D rcm
Положение центра масс профиля
Definition Airfoil2D.h:97
size_t getNumberOfPanels() const
Возврат количества панелей на профиле
Definition Airfoil2D.h:163
Point2D & setR(size_t q)
Возврат ссылки на вершину профиля
Definition Airfoil2D.h:125
Абстрактный класс, определяющий обтекаемый профиль
Definition Airfoil2D.h:182
const World2D & W
Константная ссылка на решаемую задачу
Definition Airfoil2D.h:185
void calcMeanEpsOverPanel()
Вычисление средних значений eps на панелях
Definition Airfoil2D.cpp:93
virtual void GetInfluenceFromSourcesToPanel(size_t panel, const Vortex2D *ptr, ptrdiff_t count, std::vector< double > &panelRhs) const
Вычисление влияния части подряд идущих источников из области течения на панель для правой части
virtual void GetInfluenceFromSourceSheetToVortex(size_t panel, const Vortex2D &vtx, Point2D &vel) const
Вычисление влияния слоя источников конкретной прямолинейной панели на вихрь в области течения
IFCUDA(mutable double *devViscousStressesPtr)
Указатель на девайсе, где хранится вектор (по панелям) для силы вязкого трения
virtual void Scale(const Point2D &)
Масштабирование профиля
IFCUDA(mutable double *devFreeVortexSheetLinPtr)
Указатель на девайсе, где хранятся интенсивности (линейные) свободного вихревого слоя на панелях
bool isAfter(size_t i, size_t j) const
Проверка, идет ли вершина i следом за вершиной j.
Definition Airfoil2D.cpp:73
IFCUDA(mutable double *devRPtr)
Указатель на девайсе, где хранятся вершины профиля
virtual void GetDiffVelocityI0I3ToWakeAndViscousStresses(const WakeDataBase &pointsDb, std::vector< double > &domainRadius, std::vector< double > &I0, std::vector< Point2D > &I3)
bool isOutsideGabarits(const Point2D &r) const
Определяет, находится ли точка с радиус-вектором вне габаритного прямоугольника профиля
Definition Airfoil2D.cpp:87
Point2D upRight
Правый верхний угол габаритного прямоугольника профиля
Definition Airfoil2D.h:271
IFCUDA(mutable std::vector< double > tmpRhs)
Указатель на хосте, где хранится временная часть матрицы, полученная с девайса
IFCUDA(mutable double *devAttachedVortexSheetPtr)
Указатель на девайсе, где хранятся интенсивности (константные) присоединенного вихревого слоя на пане...
std::vector< double > gammaThrough
Суммарные циркуляции вихрей, пересекших панели профиля на прошлом шаге
Definition Airfoil2D.h:276
std::vector< int > wayToVertex
Номера путей к вершинам
Definition Airfoil2D.h:202
IFCUDA(mutable double *devAttachedSourceSheetLinPtr)
Указатель на девайсе, где хранятся интенсивности (линейные) присоединенного слоя источников на панеля...
IFCUDA(mutable double *devRhsPtr)
Указатель на девайсе, где хранится правая часть (константная) матрицы
virtual void GetGabarits(double gap=0.02)
Вычисляет габаритный прямоугольник профиля
bool isInsideGabarits(const Point2D &r) const
Определяет, находится ли точка с радиус-вектором внутри габаритного прямоугольника профиля
Definition Airfoil2D.cpp:80
IFCUDA(mutable std::vector< double > tmpViscousStresses)
Указатель на хосте, где хранится временная часть вектора (по панелям) для силы вязкого трения
double J
Полярный момент инерции профиля относительно центра масс
Definition Airfoil2D.h:196
virtual void GetInfluenceFromVorticesToPanel(size_t panel, const Vortex2D *ptr, ptrdiff_t count, std::vector< double > &panelRhs) const
Вычисление влияния части подряд идущих вихрей из вихревого следа на панель для правой части
virtual void Move(const Point2D &dr)
Перемещение профиля
virtual void GetInfluenceFromVInfToPanel(std::vector< double > &vInfRhs) const
Вычисление влияния набегающего потока на панель для правой части
void CalcNrmTauLen()
Вычисление нормалей, касательных и длин панелей по текущему положению вершин
virtual bool IsPointInAirfoil(const Point2D &point) const
Определяет, находится ли точка с радиус-вектором внутри профиля
IFCUDA(mutable double *devRhsLinPtr)
Указатель на девайсе, где хранится правая часть (линейная) матрицы
void lightningTest()
Тест на "отвещенность".
IFCUDA(mutable double *devAttachedVortexSheetLinPtr)
Указатель на девайсе, где хранятся интенсивности (линейные) присоединенного вихревого слоя на панелях
Point2D lowLeft
Левый нижний угол габаритного прямоугольника профиля
Definition Airfoil2D.h:270
std::vector< double > viscousStress
Нейросеть для коэффициентов I0 и I3 диффузионной скорости
Definition Airfoil2D.h:268
IFCUDA(mutable double *devFreeVortexSheetPtr)
Указатель на девайсе, где хранятся интенсивности (константные) свободного вихревого слоя на панелях
virtual void calcIQ(size_t p, const Airfoil &otherAirfoil, std::pair< Eigen::MatrixXd, Eigen::MatrixXd > &matrPair) const
Вычисление коэффициентов матрицы, состоящей из интегралов от (r-xi)/|r-xi|^2.
double m
Масса профиля
Definition Airfoil2D.h:193
virtual void GetInfluenceFromVortexSheetToVortex(size_t panel, const Vortex2D &vtx, Point2D &vel) const
Вычисление влияния вихревых слоев (свободный + присоединенный) конкретной прямолинейной панели на вих...
virtual void GetDiffVelocityI0I3ToSetOfPointsAndViscousStresses(const WakeDataBase &pointsDb, std::vector< double > &domainRadius, std::vector< double > &I0, std::vector< Point2D > &I3)
Вычисление числителей и знаменателей диффузионных скоростей в заданном наборе точек,...
const size_t numberInPassport
Номер профиля в паспорте
Definition Airfoil2D.h:188
IFCUDA(mutable double *devPsnPtr)
Указатель на девайсе, где хранятся псевдонормали профиля
std::vector< std::vector< Point2D > > possibleWays
Возможные пути внутри профиля от точки (0, 0) к центрам всех панелей
Definition Airfoil2D.h:199
IFCUDA(mutable double *devMeanEpsOverPanelPtr)
Указатель на девайсе, где хранятся средние eps на панелях
IFCUDA(mutable double *devAttachedSourceSheetPtr)
Указатель на девайсе, где хранятся интенсивности (константные) присоединенного слоя источников на пан...
virtual void Rotate(double alpha)
Поворот профиля
virtual std::vector< double > getA(size_t p, size_t i, const Airfoil &airfoil, size_t j) const
Вычисление коэффициентов матрицы A для расчета влияния панели на панель
virtual ~Airfoil()
Деструктор
Definition Airfoil2D.h:285
std::vector< double > meanEpsOverPanel
Средние значения Eps на панелях
Definition Airfoil2D.h:209
virtual void ReadFromFile(const std::string &dir)
Считывание профиля из файла
Класс, опеделяющий набор вихрей
Класс, опеделяющий текущую решаемую задачу
Definition World2D.h:74
Класс, опеделяющий двумерный вихревой элемент
Definition Vortex2D.h:59
Описание базовых вспомогательных функций