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
39
40#ifndef AIRFOIL_H
41#define AIRFOIL_H
42
43#include "defs.h"
44
45#ifdef USE_CUDA
46#ifdef USE_CUDNN
47 #include "cuMlp.cuh"
48#endif
49#endif
50
51namespace VM2D
52{
64
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
200 std::vector<std::vector<Point2D>> possibleWays;
201
203 std::vector<int> wayToVertex;
204
206 void lightningTest();
207
208
210 std::vector<double> meanEpsOverPanel;
211
212
213
215 IFCUDA(mutable double* devRPtr);
216
218 IFCUDA(mutable double* devPsnPtr);
219
221 IFCUDA(mutable double* devRhsPtr);
222
224 IFCUDA(mutable double* devRhsLinPtr);
225
227 IFCUDA(mutable std::vector<double> tmpRhs);
228
230 IFCUDA(mutable double* devFreeVortexSheetPtr);
231
233 IFCUDA(mutable double* devFreeVortexSheetLinPtr);
234
236 IFCUDA(mutable double* devAttachedVortexSheetPtr);
237
239 IFCUDA(mutable double* devAttachedVortexSheetLinPtr);
240
242 IFCUDA(mutable double* devAttachedSourceSheetPtr);
243
245 IFCUDA(mutable double* devAttachedSourceSheetLinPtr);
246
248 IFCUDA(mutable double* devMeanEpsOverPanelPtr);
249
251 IFCUDA(mutable double* devViscousStressesPtr);
252
254 IFCUDA(mutable std::vector<double> tmpViscousStresses);
255
257#ifdef USE_CUDNN
258 IFCUDA(CudaNN NN);
259
260 IFCUDA(std::vector<int> vorticesToProcess);
261 IFCUDA(int vtp);
262 IFCUDA(std::vector<float> batch); //(vtp * 3 * 5);
263 IFCUDA(std::vector<int> signy); //(vtp * 3 * 5);
264 IFCUDA(std::vector<float> nnout); //(vtp * 2 * 5);
265 IFCUDA(std::vector<int> batchPanels); // (vtp * 5);
266#endif
267
269 std::vector<double> viscousStress;
270
273
277 std::vector<double> gammaThrough;
278
282 Airfoil(const World2D& W_, const size_t numberInPassport_);
283
284
286 virtual ~Airfoil() { };
287
288
294 bool isAfter(size_t i, size_t j) const;
295
297 void CalcNrmTauLen();
298
303 virtual void Rotate(double alpha);
304
309 virtual void Scale(const Point2D&);
310
316 virtual void Move(const Point2D& dr);
317
323 virtual void GetGabarits(double gap = 0.02);
324
329 bool isInsideGabarits(const Point2D& r) const;
330
335 bool isOutsideGabarits(const Point2D& r) const;
336
341 virtual bool IsPointInAirfoil(const Point2D& point) const;
342
350 virtual void ReadFromFile(const std::string& dir);
351
359 virtual std::vector<double> getA(size_t p, size_t i, const Airfoil& airfoil, size_t j) const;
360
367 virtual void calcIQ(size_t p, const Airfoil& otherAirfoil, std::pair<Eigen::MatrixXd, Eigen::MatrixXd>& matrPair) const;
368
369
372
373
384 virtual void GetDiffVelocityI0I3ToSetOfPointsAndViscousStresses(const WakeDataBase& pointsDb, std::vector<double>& domainRadius, std::vector<double>& I0, std::vector<Point2D>& I3);
385
386#if defined(USE_CUDA)
387 virtual void GPUGetDiffVelocityI0I3ToSetOfPointsAndViscousStresses(std::vector<double>& domainRadius, std::vector<double>& I0, std::vector<Point2D>& I3);
388#endif
389
398 virtual void GetInfluenceFromVorticesToPanel(size_t panel, const Vortex2D* ptr, ptrdiff_t count, std::vector<double>& panelRhs) const;
399
400
409 virtual void GetInfluenceFromSourcesToPanel(size_t panel, const Vortex2D* ptr, ptrdiff_t count, std::vector<double>& panelRhs) const;
410
411
417 virtual void GetInfluenceFromSourceSheetToVortex(size_t panel, const Vortex2D& vtx, Point2D& vel) const;
418
424 virtual void GetInfluenceFromVortexSheetToVortex(size_t panel, const Vortex2D& vtx, Point2D& vel) const;
425
431 virtual void GetInfluenceFromVInfToPanel(std::vector<double>& vInfRhs) const;
432};
433
434}//namespace VM2D
435
436#endif
#define IFCUDA(...)
Definition Gpudefs.h:79
Класс, определяющий форму профиля
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:97
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:77
IFCUDA(mutable double *devRPtr)
Указатель на девайсе, где хранятся вершины профиля
Point2D startOfWays
Возможные пути внутри профиля от точки (startOfWays) к центрам всех панелей
Definition Airfoil2D.h:199
bool isOutsideGabarits(const Point2D &r) const
Определяет, находится ли точка с радиус-вектором вне габаритного прямоугольника профиля
Definition Airfoil2D.cpp:91
Point2D upRight
Правый верхний угол габаритного прямоугольника профиля
Definition Airfoil2D.h:272
IFCUDA(mutable std::vector< double > tmpRhs)
Указатель на хосте, где хранится временная часть матрицы, полученная с девайса
IFCUDA(mutable double *devAttachedVortexSheetPtr)
Указатель на девайсе, где хранятся интенсивности (константные) присоединенного вихревого слоя на пане...
std::vector< double > gammaThrough
Суммарные циркуляции вихрей, пересекших панели профиля на прошлом шаге
Definition Airfoil2D.h:277
std::vector< int > wayToVertex
Номера путей к вершинам
Definition Airfoil2D.h:203
IFCUDA(mutable double *devAttachedSourceSheetLinPtr)
Указатель на девайсе, где хранятся интенсивности (линейные) присоединенного слоя источников на панеля...
IFCUDA(mutable double *devRhsPtr)
Указатель на девайсе, где хранится правая часть (константная) матрицы
virtual void GetGabarits(double gap=0.02)
Вычисляет габаритный прямоугольник профиля
bool isInsideGabarits(const Point2D &r) const
Определяет, находится ли точка с радиус-вектором внутри габаритного прямоугольника профиля
Definition Airfoil2D.cpp:84
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:271
std::vector< double > viscousStress
Нейросеть для коэффициентов I0 и I3 диффузионной скорости
Definition Airfoil2D.h:269
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)
Вычисление числителей и знаменателей диффузионных скоростей в заданном наборе точек,...
Airfoil(const World2D &W_, const size_t numberInPassport_)
Definition Airfoil2D.cpp:62
const size_t numberInPassport
Номер профиля в паспорте
Definition Airfoil2D.h:188
IFCUDA(mutable double *devPsnPtr)
Указатель на девайсе, где хранятся псевдонормали профиля
std::vector< std::vector< Point2D > > possibleWays
Definition Airfoil2D.h:200
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:286
std::vector< double > meanEpsOverPanel
Средние значения Eps на панелях
Definition Airfoil2D.h:210
virtual void ReadFromFile(const std::string &dir)
Считывание профиля из файла
Класс, опеделяющий набор вихрей
Класс, опеделяющий текущую решаемую задачу
Definition World2D.h:77
Класс, опеделяющий двумерный вихревой элемент
Definition Vortex2D.h:59