VM2D 1.14
Vortex methods for 2D flows simulation
Loading...
Searching...
No Matches
VM2D::AirfoilRigid Class Reference

Класс, определяющий тип обтекаемого профиля More...

#include <Airfoil2DRigid.h>

Inheritance diagram for VM2D::AirfoilRigid:
Collaboration diagram for VM2D::AirfoilRigid:

Public Member Functions

 AirfoilRigid (const World2D &W_, const size_t numberInPassport_)
 Конструктор
 
 AirfoilRigid (const Airfoil &afl)
 
virtual ~AirfoilRigid ()
 Деструктор
 
void lightningTest ()
 Тест на "отвещенность".
 
 IFCUDA (mutable double *devRPtr)
 Указатель на девайсе, где хранятся вершины профиля
 
 IFCUDA (mutable double *devPsnPtr)
 Указатель на девайсе, где хранятся псевдонормали профиля
 
 IFCUDA (mutable double *devRhsPtr)
 Указатель на девайсе, где хранится правая часть (константная) матрицы
 
 IFCUDA (mutable double *devRhsLinPtr)
 Указатель на девайсе, где хранится правая часть (линейная) матрицы
 
 IFCUDA (mutable std::vector< double > tmpRhs)
 Указатель на хосте, где хранится временная часть матрицы, полученная с девайса
 
 IFCUDA (mutable double *devFreeVortexSheetPtr)
 Указатель на девайсе, где хранятся интенсивности (константные) свободного вихревого слоя на панелях
 
 IFCUDA (mutable double *devFreeVortexSheetLinPtr)
 Указатель на девайсе, где хранятся интенсивности (линейные) свободного вихревого слоя на панелях
 
 IFCUDA (mutable double *devAttachedVortexSheetPtr)
 Указатель на девайсе, где хранятся интенсивности (константные) присоединенного вихревого слоя на панелях
 
 IFCUDA (mutable double *devAttachedVortexSheetLinPtr)
 Указатель на девайсе, где хранятся интенсивности (линейные) присоединенного вихревого слоя на панелях
 
 IFCUDA (mutable double *devAttachedSourceSheetPtr)
 Указатель на девайсе, где хранятся интенсивности (константные) присоединенного слоя источников на панелях
 
 IFCUDA (mutable double *devAttachedSourceSheetLinPtr)
 Указатель на девайсе, где хранятся интенсивности (линейные) присоединенного слоя источников на панелях
 
 IFCUDA (mutable double *devMeanEpsOverPanelPtr)
 Указатель на девайсе, где хранятся средние eps на панелях
 
 IFCUDA (mutable double *devViscousStressesPtr)
 Указатель на девайсе, где хранится вектор (по панелям) для силы вязкого трения
 
 IFCUDA (mutable std::vector< double > tmpViscousStresses)
 Указатель на хосте, где хранится временная часть вектора (по панелям) для силы вязкого трения
 
bool isAfter (size_t i, size_t j) const
 Проверка, идет ли вершина i следом за вершиной j.
 
void CalcNrmTauLen ()
 Вычисление нормалей, касательных и длин панелей по текущему положению вершин
 
virtual void Rotate (double alpha)
 Поворот профиля
 
virtual void Scale (const Point2D &)
 Масштабирование профиля
 
virtual void Move (const Point2D &dr)
 Перемещение профиля
 
virtual void GetGabarits (double gap=0.02)
 Вычисляет габаритный прямоугольник профиля
 
bool isInsideGabarits (const Point2D &r) const
 Определяет, находится ли точка с радиус-вектором \( \vec r \) внутри габаритного прямоугольника профиля
 
bool isOutsideGabarits (const Point2D &r) const
 Определяет, находится ли точка с радиус-вектором \( \vec r \) вне габаритного прямоугольника профиля
 
virtual bool IsPointInAirfoil (const Point2D &point) const
 Определяет, находится ли точка с радиус-вектором \( \vec r \) внутри профиля
 
virtual void ReadFromFile (const std::string &dir)
 Считывание профиля из файла
 
virtual std::vector< double > getA (size_t p, size_t i, const Airfoil &airfoil, size_t j) const
 Вычисление коэффициентов матрицы A для расчета влияния панели на панель
 
virtual void calcIQ (size_t p, const Airfoil &otherAirfoil, std::pair< Eigen::MatrixXd, Eigen::MatrixXd > &matrPair) const
 Вычисление коэффициентов матрицы, состоящей из интегралов от (r-xi)/|r-xi|^2.
 
void calcMeanEpsOverPanel ()
 Вычисление средних значений eps на панелях
 
virtual void GetDiffVelocityI0I3ToSetOfPointsAndViscousStresses (const WakeDataBase &pointsDb, std::vector< double > &domainRadius, std::vector< double > &I0, std::vector< Point2D > &I3)
 Вычисление числителей и знаменателей диффузионных скоростей в заданном наборе точек, обусловленных геометрией профиля, и вычисление вязкого трения
 
virtual void GetInfluenceFromVorticesToPanel (size_t panel, const Vortex2D *ptr, ptrdiff_t count, std::vector< double > &panelRhs) const
 Вычисление влияния части подряд идущих вихрей из вихревого следа на панель для правой части
 
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
 Вычисление влияния слоя источников конкретной прямолинейной панели на вихрь в области течения

 
virtual void GetInfluenceFromVortexSheetToVortex (size_t panel, const Vortex2D &vtx, Point2D &vel) const
 Вычисление влияния вихревых слоев (свободный + присоединенный) конкретной прямолинейной панели на вихрь в области течения
 
virtual void GetInfluenceFromVInfToPanel (std::vector< double > &vInfRhs) const
 Вычисление влияния набегающего потока на панель для правой части
 
const Point2D & getR (size_t q) const
 Возврат константной ссылки на вершину профиля

 
Point2D & setR (size_t q)
 Возврат ссылки на вершину профиля

 
const Point2D & getV (size_t q) const
 Возврат константной ссылки на скорость вершины профиля

 
void setV (const Point2D &vel)
 Установка постоянной скорости всех вершин профиля
 
void setV (const std::vector< Point2D > &vel)
 Установка скоростей всех вершин профиля
 
size_t getNumberOfPanels () const
 Возврат количества панелей на профиле
 

Public Attributes

const World2DW
 Константная ссылка на решаемую задачу
 
const size_t numberInPassport
 Номер профиля в паспорте
 
double m
 Масса профиля
 
double J
 Полярный момент инерции профиля относительно центра масс
 
std::vector< std::vector< Point2D > > possibleWays
 Возможные пути внутри профиля от точки (0, 0) к центрам всех панелей
 
std::vector< int > wayToVertex
 Номера путей к вершинам
 
std::vector< double > meanEpsOverPanel
 Средние значения Eps на панелях
 
std::vector< double > viscousStress
 Нейросеть для коэффициентов I0 и I3 диффузионной скорости
 
Point2D lowLeft
 Левый нижний угол габаритного прямоугольника профиля
 
Point2D upRight
 Правый верхний угол габаритного прямоугольника профиля
 
std::vector< double > gammaThrough
 Суммарные циркуляции вихрей, пересекших панели профиля на прошлом шаге
 
bool inverse
 Признак разворота нормалей (для расчета внутренних течений)
 
std::vector< Point2D > nrm
 Нормали к панелям профиля
 
std::vector< std::pair< Point2D, Point2D > > psn
 Псевдонормали к панелям профиля
 
std::vector< Point2D > tau
 Касательные к панелям профиля
 
std::vector< double > len
 Длины панелей профиля

 
Point2D rcm
 Положение центра масс профиля
 
double phiAfl
 Поворот профиля
 
double area
 Площадь профиля
 

Protected Attributes

std::vector< Point2D > r_
 Координаты начал панелей

 
std::vector< Point2D > v_
 Скорости начал панелей

 

Detailed Description

Класс, определяющий тип обтекаемого профиля

Тип профиля:

  • профиль с прямолинейными панелями.
Author
Марчевский Илья Константинович
Сокол Ксения Сергеевна
Рятина Евгения Павловна
Колганова Александра Олеговна
Version
1.14
Date
6 марта 2026 г.

Definition at line 64 of file Airfoil2DRigid.h.

Constructor & Destructor Documentation

◆ AirfoilRigid() [1/2]

VM2D::AirfoilRigid::AirfoilRigid ( const World2D W_,
const size_t  numberInPassport_ 
)
inline

Конструктор

Definition at line 70 of file Airfoil2DRigid.h.

71 :Airfoil(W_, numberInPassport_)
72 { };
Airfoil(const World2D &W_, const size_t numberInPassport_)
Definition Airfoil2D.cpp:61

◆ AirfoilRigid() [2/2]

VM2D::AirfoilRigid::AirfoilRigid ( const Airfoil afl)
inline

Definition at line 74 of file Airfoil2DRigid.h.

74: Airfoil(afl) {};

◆ ~AirfoilRigid()

virtual VM2D::AirfoilRigid::~AirfoilRigid ( )
inlinevirtual

Деструктор

Definition at line 77 of file Airfoil2DRigid.h.

77{ };

Member Function Documentation

◆ calcIQ()

void Airfoil::calcIQ ( size_t  p,
const Airfoil otherAirfoil,
std::pair< Eigen::MatrixXd, Eigen::MatrixXd > &  matrPair 
) const
virtualinherited

Вычисление коэффициентов матрицы, состоящей из интегралов от (r-xi)/|r-xi|^2.

Parameters
[in]pразмерность матрицы-результата
[in]otherAirfoilконстантная ссылка на профиль, от которого рассчитывается влияние
[out]matrPairссылка на пару матриц, выражающих взаимные влияния (касательные и нормальные) панелей профиля return соответствующий блок матрицы СЛАУ, вытянутый в линию

Definition at line 1225 of file Airfoil2D.cpp.

1226{
1227 bool self = (&otherAirfoil == this);
1228
1229 size_t aflNSelf = numberInPassport;
1230 size_t aflNOther = otherAirfoil.numberInPassport;
1231
1232 size_t npI;
1233 size_t npJ;
1234
1235 numvector<double, 3> alpha, lambda;
1236
1237 //auxillary vectors
1238 Point2D p1, s1, p2, s2, di, dj, i00, i01, i10, i11;
1239 numvector<Point2D, 3> v00, v11;
1240 numvector<Point2D, 2> v01, v10;
1241
1242#pragma omp parallel for \
1243 default(none) \
1244 shared(otherAirfoil, self, aflNSelf, aflNOther, matrPair, p, IDPI, IQPI) \
1245 private(npI, npJ, alpha, lambda, p1, s1, p2, s2, di, dj, i00, i01, i10, i11, v00, v11, v01, v10) schedule(dynamic, DYN_SCHEDULE)
1246 for (int i = 0; i < (int)getNumberOfPanels(); ++i)
1247 for (int j = 0; j < (int)otherAirfoil.getNumberOfPanels(); ++j)
1248 {
1249 npI = getNumberOfPanels();
1250 npJ = otherAirfoil.getNumberOfPanels();
1251
1252 if ((i == j) && self)
1253 {
1254
1255 matrPair.first(i, j) = 0.0;
1256 matrPair.second(i, j) = 0.0;
1257
1258 if (p == 2)
1259 {
1260 matrPair.first(i, npJ + j) = 0.0;
1261 matrPair.first(npI + i, j) = 0.0;
1262
1263 matrPair.second(i, npJ + j) = -IQPI;
1264 matrPair.second(npI + i, j) = IQPI;
1265
1266 matrPair.first(npI + i, npJ + j) = 0.0;
1267 matrPair.second(npI + i, npJ + j) = 0.0;
1268
1269 }
1270 if (p > 2)
1271 throw (-42);
1272 }//if i==j
1273 else
1274 {
1275 const Point2D& taui = tau[i];
1276 const Point2D& tauj = otherAirfoil.tau[j];
1277
1278 p1 = getR(i + 1) - otherAirfoil.getR(j + 1);
1279 s1 = getR(i + 1) - otherAirfoil.getR(j);
1280 p2 = getR(i) - otherAirfoil.getR(j + 1);
1281 s2 = getR(i) - otherAirfoil.getR(j);
1282 di = getR(i + 1) - getR(i);
1283 dj = otherAirfoil.getR(j + 1) - otherAirfoil.getR(j);
1284
1285 alpha = { \
1286 (self && isAfter(j, i)) ? 0.0 : VMlib::Alpha(s2, s1), \
1287 VMlib::Alpha(s2, p1), \
1288 (self && isAfter(i, j)) ? 0.0 : VMlib::Alpha(p1, p2) \
1289 };
1290
1291 lambda = { \
1292 (self && isAfter(j, i)) ? 0.0 : VMlib::Lambda(s2, s1), \
1293 VMlib::Lambda(s2, p1), \
1294 (self && isAfter(i, j)) ? 0.0 : VMlib::Lambda(p1, p2) \
1295 };
1296
1297 v00 = {
1298 VMlib::Omega(s1, taui, tauj),
1299 -VMlib::Omega(di, taui, tauj),
1300 VMlib::Omega(p2, taui, tauj)
1301 };
1302
1303 i00 = IDPI / len[i] * (-(alpha[0] * v00[0] + alpha[1] * v00[1] + alpha[2] * v00[2]).kcross() \
1304 + (lambda[0] * v00[0] + lambda[1] * v00[1] + lambda[2] * v00[2]));
1305
1306 matrPair.first(i, j) = i00 & nrm[i];
1307 matrPair.second(i, j) = i00 & taui;
1308
1309
1310 if (p == 2)
1311 {
1312 v01 = {
1313 0.5 / (dj.length()) * (((p1 + s1) & tauj) * VMlib::Omega(s1, taui, tauj) - s1.length2() * taui),
1314 -0.5 * di.length() / dj.length() * VMlib::Omega(s1 + p2, tauj, tauj)
1315 };
1316
1317 i01 = IDPI / len[i] * (-((alpha[0] + alpha[2]) * v01[0] + (alpha[1] + alpha[2]) * v01[1]).kcross() \
1318 + ((lambda[0] + lambda[2]) * v01[0] + (lambda[1] + lambda[2]) * v01[1]) - 0.5 * di.length() * tauj);
1319
1320 matrPair.first(i, npJ + j) = i01 & nrm[i];
1321 matrPair.second(i, npJ + j) = i01 & taui;
1322
1323
1324 v10 = {
1325 -0.5 / di.length() * (((s1 + s2) & taui) * VMlib::Omega(s1, taui, tauj) - s1.length2() * tauj),
1326 0.5 * dj.length() / di.length() * VMlib::Omega(s1 + p2, taui, taui)
1327 };
1328
1329 i10 = IDPI / len[i] * (-((alpha[0] + alpha[2]) * v10[0] + alpha[2] * v10[1]).kcross() \
1330 + ((lambda[0] + lambda[2]) * v10[0] + lambda[2] * v10[1]) + 0.5 * dj.length() * taui);
1331
1332 matrPair.first(npI + i, j) = i10 & nrm[i];
1333 matrPair.second(npI + i, j) = i10 & taui;
1334
1335
1336 v11 = {
1337 1.0 / (12.0 * di.length() * dj.length()) * (2.0 * (s1 & VMlib::Omega(s1 - 3.0 * p2, taui, tauj)) * VMlib::Omega(s1, taui, tauj) - s1.length2() * (s1 - 3.0 * p2)) - 0.25 * VMlib::Omega(s1, taui, tauj),
1338 -di.length() / (12.0 * dj.length()) * VMlib::Omega(di, tauj, tauj),
1339 -dj.length() / (12.0 * di.length()) * VMlib::Omega(dj, taui, taui)
1340 };
1341
1342 i11 = IDPI / len[i] * (-((alpha[0] + alpha[2]) * v11[0] + (alpha[1] + alpha[2]) * v11[1] + alpha[2] * v11[2]).kcross()\
1343 + (lambda[0] + lambda[2]) * v11[0] + (lambda[1] + lambda[2]) * v11[1] + lambda[2] * v11[2] \
1344 + 1.0 / 12.0 * (dj.length() * taui + di.length() * tauj - 2.0 * VMlib::Omega(s1, taui, tauj)));
1345
1346 matrPair.first(npI + i, npJ + j) = i11 & nrm[i];
1347 matrPair.second(npI + i, npJ + j) = i11 & taui;
1348 }
1349
1350
1351 if (p > 2)
1352 throw (-42);
1353 }//else(i == j)
1354
1355 }//for(...)
1356}//getIQ(...)
const double IQPI
Число .
Definition defs.h:85
const double IDPI
Число .
Definition defs.h:79
std::vector< double > len
Длины панелей профиля
Definition Airfoil2D.h:94
const Point2D & getR(size_t q) const
Возврат константной ссылки на вершину профиля
Definition Airfoil2D.h:113
std::vector< Point2D > nrm
Нормали к панелям профиля
Definition Airfoil2D.h:81
std::vector< Point2D > tau
Касательные к панелям профиля
Definition Airfoil2D.h:91
size_t getNumberOfPanels() const
Возврат количества панелей на профиле
Definition Airfoil2D.h:163
bool isAfter(size_t i, size_t j) const
Проверка, идет ли вершина i следом за вершиной j.
Definition Airfoil2D.cpp:76
const size_t numberInPassport
Номер профиля в паспорте
Definition Airfoil2D.h:188
Шаблонный класс, определяющий вектор фиксированной длины Фактически представляет собой массив,...
Definition numvector.h:99
auto length2() const -> typename std::remove_const< typename std::remove_reference< decltype(this->data[0])>::type >::type
Вычисление квадрата нормы (длины) вектора
Definition numvector.h:386
P length() const
Вычисление 2-нормы (длины) вектора
Definition numvector.h:374
double Lambda(const Point2D &p, const Point2D &s)
Вспомогательная функция вычисления логарифма отношения норм векторов
Definition defs.cpp:268
double Alpha(const Point2D &p, const Point2D &s)
Вспомогательная функция вычисления угла между векторами
Definition defs.cpp:262
Point2D Omega(const Point2D &a, const Point2D &b, const Point2D &c)
Вспомогательная функция вычисления величины .
Definition defs.cpp:274
Here is the call graph for this function:
Here is the caller graph for this function:

◆ calcMeanEpsOverPanel()

void Airfoil::calcMeanEpsOverPanel ( )
inherited

Вычисление средних значений eps на панелях

Definition at line 96 of file Airfoil2D.cpp.

97{
98 meanEpsOverPanel.clear();
100
101
102 double midEps;
103
106
107 for (size_t i = 0; i < getNumberOfPanels(); ++i)
108 {
109 midEps = 0.0;
110 for (int j = bnd.vortexBeginEnd[i].first; j < bnd.vortexBeginEnd[i].second; ++j)
111 midEps += virtVortParams.epsastWake[j];
112 //midEps += std::max(virtVortParams.epsastWake[j], 0.5 * len[i] / (bnd.vortexBeginEnd[i].second - bnd.vortexBeginEnd[i].first));
113
114 midEps /= (bnd.vortexBeginEnd[i].second - bnd.vortexBeginEnd[i].first);
115 meanEpsOverPanel[i] = midEps;
116 }//for i
117}//calcMeanEpsOverPanel()
const World2D & W
Константная ссылка на решаемую задачу
Definition Airfoil2D.h:185
std::vector< double > meanEpsOverPanel
Средние значения Eps на панелях
Definition Airfoil2D.h:209
Абстрактный класс, определяющий способ удовлетворения граничного условия на обтекаемом профиле
Definition Boundary2D.h:65
std::vector< std::pair< int, int > > vortexBeginEnd
Номера первого и последнего вихрей, рождаемых на каждой панели профиля (формируется после решения СЛА...
Definition Boundary2D.h:83
std::vector< VortexesParams > virtualVortexesParams
Вектор струтур, определяющий параметры виртуальных вихрей для профилей
Definition Velocity2D.h:115
const Velocity & getVelocity() const
Возврат константной ссылки на объект для вычисления скоростей
Definition World2D.h:253
const Boundary & getBoundary(size_t i) const
Возврат константной ссылки на объект граничного условия
Definition World2D.h:186
Структура, определяющая параметры виртуальных вихрей для отдельного профиля
Definition Velocity2D.h:70
std::vector< double > epsastWake
Вектор характерных радиусов вихревых доменов (eps*)
Definition Velocity2D.h:90
Here is the call graph for this function:
Here is the caller graph for this function:

◆ CalcNrmTauLen()

void Airfoil::CalcNrmTauLen ( )
inherited

Вычисление нормалей, касательных и длин панелей по текущему положению вершин

Definition at line 1092 of file Airfoil2D.cpp.

1093{
1094 if (nrm.size() != r_.size())
1095 {
1096 nrm.resize(r_.size());
1097 psn.resize(r_.size());
1098 tau.resize(r_.size());
1099 len.resize(r_.size());
1100 }
1101
1102 Point2D rpan;
1103
1104 //считаем длины, касательные и нормали
1105#pragma omp parallel for private(rpan)
1106 for (int i = 0; i < (int)r_.size(); ++i)
1107 {
1108 rpan = (getR(i + 1) - getR(i));
1109 len[i] = rpan.length();
1110 tau[i] = rpan.unit();
1111 nrm[i] = { tau[i][1], -tau[i][0] };
1112 }
1113
1114 //считаем псевдонормали
1115#pragma omp parallel for
1116 for (int i = 0; i < (int)r_.size(); ++i)
1117 {
1118 int next = (i == (int)r_.size() - 1 ? 0 : i + 1);
1119 int prev = (i == 0 ? (int)r_.size() - 1 : i - 1);
1120
1121 psn[i] = std::make_pair( (nrm[prev] + nrm[i]).unit(), (nrm[i] + nrm[next]).unit() );
1122 }
1123
1124 //закольцовываем
1125 //nrm.push_back(nrm[0]);
1126 //tau.push_back(tau[0]);
1127 //len.push_back(len[0]);
1128}//CalcNrmTauLen()
std::vector< Point2D > r_
Координаты начал панелей
Definition Airfoil2D.h:69
std::vector< std::pair< Point2D, Point2D > > psn
Псевдонормали к панелям профиля
Definition Airfoil2D.h:86
auto unit(P newlen=1) const -> numvector< typename std::remove_const< decltype(this->data[0] *newlen)>::type, n >
Вычисление орта вектора или вектора заданной длины, коллинеарного данному
Definition numvector.h:402
Here is the call graph for this function:
Here is the caller graph for this function:

◆ getA()

std::vector< double > Airfoil::getA ( size_t  p,
size_t  i,
const Airfoil airfoil,
size_t  j 
) const
virtualinherited

Вычисление коэффициентов матрицы A для расчета влияния панели на панель

Parameters
[in]pразмерность матрицы - результата
[in]iномер панели, на которую оказывается влияние
[in]airfoilконстантная ссылка на профиль, от которого рассчитывается влияние
[in]jномер влияющей панели return соответствующий блок матрицы СЛАУ, вытянутый в линию

Definition at line 1184 of file Airfoil2D.cpp.

1185{
1186 std::vector<double> res(p * p, 0.0);
1187
1188 if ((i == j) && (&airfoil == this))
1189 {
1190 res[0] = 0.5 * (tau[i] ^ nrm[i]);
1191 if (p == 1)
1192 return res;
1193
1194 res[3] = (1.0 / 12.0) * res[0];
1195 if (p == 2)
1196 return res;
1197
1198 if (p > 2)
1199 throw (-42);
1200
1201 }//if i==j
1202
1203 const auto& miq = W.getIQ(numberInPassport, airfoil.numberInPassport);
1204
1205 res[0] = miq.first(i, j);
1206
1207 if (p == 1)
1208 return res;
1209
1210 res[1] = miq.first(i, airfoil.getNumberOfPanels() + j);
1211 res[2] = miq.first(getNumberOfPanels() + i, j);
1212 res[3] = miq.first(getNumberOfPanels() + i, airfoil.getNumberOfPanels() + j);
1213
1214 if (p == 2)
1215 return res;
1216
1217 if (p > 2)
1218 throw (-42);
1219
1220 //Хотя сюда никогда и не попадем
1221 return res;
1222}//getA(...)
const std::pair< Eigen::MatrixXd, Eigen::MatrixXd > & getIQ(size_t i, size_t j) const
Возврат константной ссылки на объект, связанный с матрицей интегралов от (r-xi)/|r-xi|^2.
Definition World2D.h:283
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GetDiffVelocityI0I3ToSetOfPointsAndViscousStresses()

void Airfoil::GetDiffVelocityI0I3ToSetOfPointsAndViscousStresses ( const WakeDataBase pointsDb,
std::vector< double > &  domainRadius,
std::vector< double > &  I0,
std::vector< Point2D > &  I3 
)
virtualinherited

Вычисление числителей и знаменателей диффузионных скоростей в заданном наборе точек, обусловленных геометрией профиля, и вычисление вязкого трения

Вычисляет диффузионные скорости в наборе точек, которые обусловленных геометрией профиля, и вычисляет вязкое трение

Parameters
[in]pointsDbконстантная ссылка на базу данных вихрей, в которых вычисляются скорости
[in]domainRadiusссылка на радиусы вихрей
[out]I0ссылка на вектор знаменателей диффузионных скоростей, которые приобретают точки из-за влияния геометрии профиля
[out]I3ссылка на вектор числителей диффузионных скоростей, которые приобретают точки из-за влияния геометрии профиля
Warning
Векторы I0, I3 — накапливаются!

Definition at line 495 of file Airfoil2D.cpp.

496{
497 std::vector<double> selfI0;
498 std::vector<Point2D> selfI3;
499
500 std::vector<double> currViscousStress;
501 currViscousStress.resize(r_.size(), 0.0);
502
503
504 selfI0.resize(pointsDb.vtx.size(), 0.0);
505 selfI3.resize(pointsDb.vtx.size(), { 0.0, 0.0 });
506
507#pragma warning (push)
508#pragma warning (disable: 4101)
509 //Локальные переменные для цикла
510 Point2D q, xi, xi_m, v0;
511 double lxi, lxi_m, lenj_m;
512
513 Point2D mn;
514 int new_n;
515 Point2D h;
516
517 Point2D vec;
518 double s, d;
519
520 double vs;
521 double iDDomRad, domRad, expon;
522#pragma warning (pop)
523
524#pragma omp parallel for \
525 default(none) \
526 shared(domainRadius, pointsDb, selfI0, selfI3, currViscousStress, PI) \
527 private(xi, xi_m, lxi, lxi_m, lenj_m, v0, q, new_n, mn, h, d, s, vec, vs, expon, domRad, iDDomRad) schedule(dynamic, DYN_SCHEDULE)
528 for (int i = 0; i < pointsDb.vtx.size(); ++i)
529 {
530 const Vortex2D& vtxI = pointsDb.vtx[i];
531
532 domRad = std::max(domainRadius[i], W.getPassport().wakeDiscretizationProperties.getMinEpsAst());
533 iDDomRad = 1.0 / domRad;
534
535 for (size_t j = 0; j < r_.size(); ++j)
536 {
537 vs = 0.0;
538 q = vtxI.r() - 0.5 * (getR(j) + getR(j + 1));
539 vec = tau[j];
540
541 s = q & vec;
542 d = fabs(q & nrm[j]);
543
544 if ((d < 50.0 * len[j]) && (fabs(s) < 50.0 * len[j]))
545 {
546 v0 = vec * len[j];
547
548 if ((d > 5.0 * len[j]) || (fabs(s) > 5.0 * len[j]))
549 {
550 xi = q * iDDomRad;
551 lxi = xi.length();
552
553 expon = exp(-lxi) * len[j];
554 mn = nrm[j] * expon;
555
556 //if (selfI0[i] != -PI * domRad)
557 //{
558 selfI0[i] += (xi & mn) * (lxi + 1.0) / (lxi * lxi);
559 selfI3[i] += mn;
560 //}
561
562 vs = vtxI.g() * expon / (PI * sqr(meanEpsOverPanel[j]));
563 }
564 else if ((d >= 0.1 * len[j]) || (fabs(s) > 0.5 * len[j]))
565 {
566 vs = 0.0;
567 double den = (fabs(s) < 0.5 * len[j]) ? d : (fabs(s) + d - 0.5 * len[j]);
568
569 new_n = std::max(1, static_cast<int>(ceil(5.0 * len[j] / den)));
570 //new_n = 100;
571 h = v0 * (1.0 / new_n);
572
573 for (int m = 0; m < new_n; ++m)
574 {
575 xi_m = (vtxI.r() - (getR(j) + h * (m + 0.5))) * iDDomRad;
576 lxi_m = xi_m.length();
577
578 lenj_m = len[j] / new_n;
579 expon = exp(-lxi_m) * lenj_m;
580
581 mn = nrm[j] * expon;
582 //if (selfI0[i] != -PI * domRad)
583 {
584 selfI0[i] += (xi_m & mn) * (lxi_m + 1.0) / (lxi_m * lxi_m);
585 selfI3[i] += mn;
586 }
587 vs += expon;
588 }//for m
589 vs *= vtxI.g() / (PI * sqr(meanEpsOverPanel[j]));
590 }
591 else
592 {
593
594 selfI0[i] += -PI * domRad;
595 double mnog = 2.0 * domRad * (1.0 - exp(-len[j] * iDDomRad / 2.0) * cosh(fabs(s) * iDDomRad));
596 selfI3[i] += nrm[j] * mnog;
597 vs = mnog * vtxI.g() / (PI * sqr(meanEpsOverPanel[j]));
598 }
599 }//if d<50 len
600
601#pragma omp atomic
602 currViscousStress[j] += vs;
603 }//for j
604 }//for i
605
606
607 if (&pointsDb == &(W.getWake()))
608 for (size_t i = 0; i < viscousStress.size(); ++i)
609 {
610 viscousStress[i] += currViscousStress[i];
611 }
612
613 for (size_t i = 0; i < I0.size(); ++i)
614 {
615 domRad = std::max(domainRadius[i], W.getPassport().wakeDiscretizationProperties.getMinEpsAst());
616
617 if (I0[i] != -PI * domRad)
618 {
619 if (selfI0[i] == -PI * domRad)
620 {
621 I0[i] = selfI0[i];
622 I3[i] = selfI3[i];
623 }
624 else
625 {
626 I0[i] += selfI0[i];
627 I3[i] += selfI3[i];
628 }
629 }
630 }
631}; //GetDiffVelocityI0I3ToSetOfPointsAndViscousStresses(...)
const double PI
Число .
Definition defs.h:76
std::vector< double > viscousStress
Нейросеть для коэффициентов I0 и I3 диффузионной скорости
Definition Airfoil2D.h:268
double m
Масса профиля
Definition Airfoil2D.h:193
WakeDiscretizationProperties wakeDiscretizationProperties
Структура с параметрами дискретизации вихревого следа
Definition Passport2D.h:304
std::vector< Vortex2D > vtx
Список вихревых элементов
const Wake & getWake() const
Возврат константной ссылки на вихревой след
Definition World2D.h:232
const Passport & getPassport() const
Возврат константной ссылки на паспорт
Definition World2D.h:263
Класс, опеделяющий двумерный вихревой элемент
Definition Vortex2D.h:59
HD Point2D & r()
Функция для доступа к радиус-вектору вихря
Definition Vortex2D.h:92
HD double & g()
Функция для доступа к циркуляции вихря
Definition Vortex2D.h:100
T sqr(T x)
Возведение числа в квадрат
Definition defs.h:455
double getMinEpsAst() const
Функция минимально возможного значения для epsAst.
Definition Passport2D.h:153
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GetGabarits()

void Airfoil::GetGabarits ( double  gap = 0.02)
virtualinherited

Вычисляет габаритный прямоугольник профиля

Заполняет значения полей lowLeft и upRight по габаритному прямоугольнику профиля с учетом зазора

Parameters
[in]gapотносительная величина зазора в долях от размера габаритного прямоугольника (по умолчанию 0.02, что соответствует 2 %)

Definition at line 1072 of file Airfoil2D.cpp.

1073{
1074 lowLeft = { 1E+10, 1E+10 };
1075 upRight = { -1E+10, -1E+10 };
1076
1077 for (size_t i = 0; i < r_.size(); ++i)
1078 {
1079 lowLeft[0] = std::min(lowLeft[0], r_[i][0]);
1080 lowLeft[1] = std::min(lowLeft[1], r_[i][1]);
1081
1082 upRight[0] = std::max(upRight[0], r_[i][0]);
1083 upRight[1] = std::max(upRight[1], r_[i][1]);
1084 }
1085
1086 Point2D size = upRight - lowLeft;
1087 lowLeft -= size * gap;
1088 upRight += size * gap;
1089}//GetGabarits(...)
Point2D upRight
Правый верхний угол габаритного прямоугольника профиля
Definition Airfoil2D.h:271
Point2D lowLeft
Левый нижний угол габаритного прямоугольника профиля
Definition Airfoil2D.h:270
Here is the caller graph for this function:

◆ GetInfluenceFromSourceSheetToVortex()

void Airfoil::GetInfluenceFromSourceSheetToVortex ( size_t  panel,
const Vortex2D vtx,
Point2D vel 
) const
virtualinherited

Вычисление влияния слоя источников конкретной прямолинейной панели на вихрь в области течения

Parameters
[in]panelномер панели профиля, от которой считается влияние
[in]vtxссылка на вихрь
[out]velссылка на вектор полученной скорости

Definition at line 1371 of file Airfoil2D.cpp.

1372{
1374}//GetInfluenceFromSourceSheetToVortex(...)
virtual void GetInfluenceFromSourceSheetAtRectPanelToVortex(size_t panel, const Vortex2D &vtx, Point2D &vel) const =0
Вычисление влияния слоя источников конкретной прямолинейной панели на вихрь в области течения
Here is the call graph for this function:

◆ GetInfluenceFromSourcesToPanel()

void Airfoil::GetInfluenceFromSourcesToPanel ( size_t  panel,
const Vortex2D ptr,
ptrdiff_t  count,
std::vector< double > &  panelRhs 
) const
virtualinherited

Вычисление влияния части подряд идущих источников из области течения на панель для правой части

Вычисляет влияния части подряд идущих источников из области течения на панель для правой части

Parameters
[in]panelномер панели профиля, на которую считается влияние
[in]ptrуказатель на начало диапазона источников
[in]countдлина диапазона источников
[out]panelRhsссылка на вектор полученного влияния для правой части СЛАУ для конкретной панели

Definition at line 1365 of file Airfoil2D.cpp.

1366{
1368}//GetInfluenceFromSourcesToPanel(...)
virtual void GetInfluenceFromSourcesToRectPanel(size_t panel, const Vortex2D *ptr, ptrdiff_t count, std::vector< double > &wakeRhs) const =0
Вычисление влияния части подряд источников из области течения на прямолинейную панель для правой част...
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GetInfluenceFromVInfToPanel()

void Airfoil::GetInfluenceFromVInfToPanel ( std::vector< double > &  vInfRhs) const
virtualinherited

Вычисление влияния набегающего потока на панель для правой части

Вычисляет влияния набегающего потока на панель для правой части

Parameters
[out]vInfRhsссылка на вектор полученного влияния для правой части СЛАУ для всех панелей профиля

Definition at line 1382 of file Airfoil2D.cpp.

1383{
1385}//GetInfluenceFromVInfToPanel(...)
virtual void GetInfluenceFromVInfToRectPanel(std::vector< double > &vInfRhs) const =0
Вычисление влияния набегающего потока на прямолинейную панель для правой части
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GetInfluenceFromVortexSheetToVortex()

void Airfoil::GetInfluenceFromVortexSheetToVortex ( size_t  panel,
const Vortex2D vtx,
Point2D vel 
) const
virtualinherited

Вычисление влияния вихревых слоев (свободный + присоединенный) конкретной прямолинейной панели на вихрь в области течения

Parameters
[in]panelномер панели профиля, от которой считается влияние
[in]vtxссылка на вихрь
[out]velссылка на вектор полученной скорости

Definition at line 1377 of file Airfoil2D.cpp.

1378{
1380}//GetInfluenceFromVortexSheetToVortex(...)
virtual void GetInfluenceFromVortexSheetAtRectPanelToVortex(size_t panel, const Vortex2D &vtx, Point2D &vel) const =0
Вычисление влияния вихревых слоев (свободный + присоединенный) конкретной прямолинейной панели на вих...
Here is the call graph for this function:

◆ GetInfluenceFromVorticesToPanel()

void Airfoil::GetInfluenceFromVorticesToPanel ( size_t  panel,
const Vortex2D ptr,
ptrdiff_t  count,
std::vector< double > &  panelRhs 
) const
virtualinherited

Вычисление влияния части подряд идущих вихрей из вихревого следа на панель для правой части

Вычисляет влияния части подряд идущих вихрей из вихревого следа на панель для правой части

Parameters
[in]panelномер панели профиля, на которую считается влияние
[in]ptrуказатель на начало диапазона вихрей
[in]countдлина диапазона вихрей
[out]panelRhsссылка на вектор полученного влияния для правой части СЛАУ для конкретной панели

Definition at line 1358 of file Airfoil2D.cpp.

1359{
1361}//GetInfluenceFromVorticesToPanel(...)
virtual void GetInfluenceFromVorticesToRectPanel(size_t panel, const Vortex2D *ptr, ptrdiff_t count, std::vector< double > &wakeRhs) const =0
Вычисление влияния части подряд идущих вихрей из вихревого следа на прямолинейную панель для правой ч...
Here is the call graph for this function:
Here is the caller graph for this function:

◆ getNumberOfPanels()

size_t VM2D::AirfoilGeometry::getNumberOfPanels ( ) const
inlineinherited

Возврат количества панелей на профиле

Returns
количество панелей на профиле

Definition at line 163 of file Airfoil2D.h.

163{ return r_.size(); };
Here is the caller graph for this function:

◆ getR()

const Point2D & VM2D::AirfoilGeometry::getR ( size_t  q) const
inlineinherited

Возврат константной ссылки на вершину профиля

Организовано "зацикливание" в сторону увеличения индекса, т.е. getR[size()] = getR[0];

Это позволяет удобно обращаться к getR(i) и getR(i+1) как к началу и концу i-й панели

Parameters
[in]qномер вершины профиля return константную ссылку на вершину профиля

Definition at line 113 of file Airfoil2D.h.

114 {
115 return (q < r_.size()) ? r_[q] : r_[0];
116 };
Here is the caller graph for this function:

◆ getV()

const Point2D & VM2D::AirfoilGeometry::getV ( size_t  q) const
inlineinherited

Возврат константной ссылки на скорость вершины профиля

Организовано "зацикливание" в сторону увеличения индекса, т.е. getV[size()] = getV[0];

Это позволяет удобно обращаться к getV(i) и getV(i+1) как к скоростям начала и конца i-й панели

Parameters
[in]qномер вершины профиля return константную ссылку на скорость вершины профиля

Definition at line 137 of file Airfoil2D.h.

138 {
139 return (q < v_.size()) ? v_[q] : v_[0];
140 };
std::vector< Point2D > v_
Скорости начал панелей
Definition Airfoil2D.h:72
Here is the caller graph for this function:

◆ IFCUDA() [1/14]

VM2D::Airfoil::IFCUDA ( mutable double *  devAttachedSourceSheetLinPtr)
inherited

Указатель на девайсе, где хранятся интенсивности (линейные) присоединенного слоя источников на панелях

◆ IFCUDA() [2/14]

VM2D::Airfoil::IFCUDA ( mutable double *  devAttachedSourceSheetPtr)
inherited

Указатель на девайсе, где хранятся интенсивности (константные) присоединенного слоя источников на панелях

◆ IFCUDA() [3/14]

VM2D::Airfoil::IFCUDA ( mutable double *  devAttachedVortexSheetLinPtr)
inherited

Указатель на девайсе, где хранятся интенсивности (линейные) присоединенного вихревого слоя на панелях

◆ IFCUDA() [4/14]

VM2D::Airfoil::IFCUDA ( mutable double *  devAttachedVortexSheetPtr)
inherited

Указатель на девайсе, где хранятся интенсивности (константные) присоединенного вихревого слоя на панелях

◆ IFCUDA() [5/14]

VM2D::Airfoil::IFCUDA ( mutable double *  devFreeVortexSheetLinPtr)
inherited

Указатель на девайсе, где хранятся интенсивности (линейные) свободного вихревого слоя на панелях

◆ IFCUDA() [6/14]

VM2D::Airfoil::IFCUDA ( mutable double *  devFreeVortexSheetPtr)
inherited

Указатель на девайсе, где хранятся интенсивности (константные) свободного вихревого слоя на панелях

◆ IFCUDA() [7/14]

VM2D::Airfoil::IFCUDA ( mutable double *  devMeanEpsOverPanelPtr)
inherited

Указатель на девайсе, где хранятся средние eps на панелях

◆ IFCUDA() [8/14]

VM2D::Airfoil::IFCUDA ( mutable double *  devPsnPtr)
inherited

Указатель на девайсе, где хранятся псевдонормали профиля

◆ IFCUDA() [9/14]

VM2D::Airfoil::IFCUDA ( mutable double *  devRhsLinPtr)
inherited

Указатель на девайсе, где хранится правая часть (линейная) матрицы

◆ IFCUDA() [10/14]

VM2D::Airfoil::IFCUDA ( mutable double *  devRhsPtr)
inherited

Указатель на девайсе, где хранится правая часть (константная) матрицы

◆ IFCUDA() [11/14]

VM2D::Airfoil::IFCUDA ( mutable double *  devRPtr)
inherited

Указатель на девайсе, где хранятся вершины профиля

◆ IFCUDA() [12/14]

VM2D::Airfoil::IFCUDA ( mutable double *  devViscousStressesPtr)
inherited

Указатель на девайсе, где хранится вектор (по панелям) для силы вязкого трения

◆ IFCUDA() [13/14]

VM2D::Airfoil::IFCUDA ( mutable std::vector< double >  tmpRhs)
inherited

Указатель на хосте, где хранится временная часть матрицы, полученная с девайса

◆ IFCUDA() [14/14]

VM2D::Airfoil::IFCUDA ( mutable std::vector< double >  tmpViscousStresses)
inherited

Указатель на хосте, где хранится временная часть вектора (по панелям) для силы вязкого трения

◆ isAfter()

bool Airfoil::isAfter ( size_t  i,
size_t  j 
) const
inherited

Проверка, идет ли вершина i следом за вершиной j.

Parameters
[in]iпроверяемая вершина
[in]jконтрольная вершина
Returns
true, если i-я вершина следует зп j-й в порядке обхода профиля

Definition at line 76 of file Airfoil2D.cpp.

77{
78 return ((i == j + 1) || (i == 0 && j == r_.size() - 1));
79}//isAfter(...)
Here is the caller graph for this function:

◆ isInsideGabarits()

bool Airfoil::isInsideGabarits ( const Point2D r) const
inherited

Определяет, находится ли точка с радиус-вектором \( \vec r \) внутри габаритного прямоугольника профиля

Parameters
[in]rконстантная ссылка на текущее положение точки
Returns
true, если точка внутри габаритного прямоугольника

Definition at line 83 of file Airfoil2D.cpp.

84{
85 return (r[0] <= upRight[0] && (r[0] >= lowLeft[0] && r[1] >= lowLeft[1] && r[1] <= upRight[1]));
86}//isInsideGabarits(...)

◆ isOutsideGabarits()

bool Airfoil::isOutsideGabarits ( const Point2D r) const
inherited

Определяет, находится ли точка с радиус-вектором \( \vec r \) вне габаритного прямоугольника профиля

Parameters
[in]rконстантная ссылка на текущее положение точки
Returns
true, если точка вне габаритного прямоугольника

Definition at line 90 of file Airfoil2D.cpp.

91{
92 return (r[0] > upRight[0] || (r[0] < lowLeft[0] || r[1] < lowLeft[1] || r[1] > upRight[1]));
93}//isOutsideGabarits(...)
Here is the caller graph for this function:

◆ IsPointInAirfoil()

bool Airfoil::IsPointInAirfoil ( const Point2D point) const
virtualinherited

Определяет, находится ли точка с радиус-вектором \( \vec r \) внутри профиля

Parameters
[in]pointконстантная ссылка на текущее положение точки
Returns
true, если точка внутри профиля

Definition at line 1052 of file Airfoil2D.cpp.

1053{
1054 double sumAngle = 0.0;
1055
1056 Point2D v1, v2;
1057
1058 for (size_t i = 0; i < r_.size(); ++i)
1059 {
1060 v1 = getR(i) - point;
1061 v2 = getR(i + 1) - point;
1062 sumAngle += atan2(v1 ^ v2, v1 & v2);
1063 }
1064
1065 if (fabs(sumAngle) < 0.1)
1066 return false;
1067 else
1068 return true;
1069}//IsPointInAirfoil(...)
Here is the call graph for this function:

◆ lightningTest()

void Airfoil::lightningTest ( )
inherited

Тест на "отвещенность".

Definition at line 120 of file Airfoil2D.cpp.

121{
123 {
124
125 //Тестируем на "освещенность"
126 wayToVertex.clear();
127 wayToVertex.resize(getNumberOfPanels(), -1);
128
129 for (size_t i = 0; i < getNumberOfPanels(); ++i)
130 {
131 const Point2D& dest = 0.5 * (getR(i) + getR(i + 1));
132
133 bool flag = false;
134 int wayNumber = -1;
135 size_t j;
136
137 do
138 {
139 flag = false;
140 ++wayNumber;
141 j = 0;
142 for (; j < getNumberOfPanels(); ++j)
143 {
144 const Point2D& aflRj = getR(j);
145 const Point2D& aflRj1 = getR(j + 1);
146
147 auto check = [aflRj, aflRj1](const Point2D& start, const Point2D& finish)
148 {
149 return ((((aflRj - start) ^ (finish - start)) * ((aflRj1 - start) ^ (finish - start)) <= 0) && \
150 (((start - aflRj) ^ (aflRj1 - aflRj)) * ((finish - aflRj) ^ (aflRj1 - aflRj)) <= 0));
151 };
152
153 if (i == j)
154 continue;
155
156 for (size_t q = 0; (!flag) && (q < ((wayNumber == 0) ? 1 : possibleWays[wayNumber - 1].size() + 1)); ++q)
157 {
158 Point2D start = ((q == 0) ? rcm : possibleWays[wayNumber - 1][q - 1]);
159 Point2D finish = (wayNumber == 0 || q == possibleWays[wayNumber - 1].size()) ? dest : possibleWays[wayNumber - 1][q];
160
161 flag = (/*flag ||*/ check(start, finish));
162 }
163
164 if (flag)
165 break;
166 }//for j
167
168 if (j == getNumberOfPanels())
169 {
170 wayToVertex[i] = wayNumber;
171 break;
172 }
173 } while ((wayToVertex[i] == -1) && (wayNumber < possibleWays.size()));
174
175 if (wayToVertex[i] == -1)
176 {
177 std::cout << "Possible way to vertex inside airfoil not found" << std::endl;
178 std::cout << "!!!" << std::endl;
179 std::cout << "dest = " << 0.5 * (getR(i) + getR(i + 1)) << std::endl;
180 std::cout << "j = " << j << std::endl;
181 //std::cout << "q = " << q << ", path[q] = " << path[q] << std::endl;
182 //std::cout << "i = " << i << std::endl;
183 std::cout << "rcm = " << rcm << std::endl;
184 std::cout << "possibleWays.size() = " << possibleWays.size() << std::endl;
185
186 for (size_t w = 0; w < possibleWays.size(); ++w)
187 {
188 std::cout << "Possible way # " << w << std::endl;
189 for (size_t p = 0; p < possibleWays[w].size(); ++p)
190 {
191 std::cout << possibleWays[w][p] << " ";
192 }
193 std::cout << std::endl;
194 }
195
196
197 std::ofstream airfoilFileStep(W.getPassport().dir + "afl" + std::to_string(W.getCurrentStep()));
198 for (size_t s = 0; s < getNumberOfPanels(); ++s)
199 airfoilFileStep << getR(s)[0] << " " << getR(s)[1] << "\n";
200 airfoilFileStep.close();
201
202 //exit(767);
203 }
204 }//for i
205 }
206}//lightningTest()
Point2D rcm
Положение центра масс профиля
Definition Airfoil2D.h:97
std::vector< int > wayToVertex
Номера путей к вершинам
Definition Airfoil2D.h:202
std::vector< std::vector< Point2D > > possibleWays
Возможные пути внутри профиля от точки (0, 0) к центрам всех панелей
Definition Airfoil2D.h:199
TimeDiscretizationProperties timeDiscretizationProperties
Структура с параметрами процесса интегрирования по времени
std::string dir
Рабочий каталог задачи
size_t getCurrentStep() const
Возврат константной ссылки на параметры распараллеливания по MPI.
Definition WorldGen.h:99
size_t size() const
Definition numvector.h:114
int saveVPstep
Шаг вычисления и сохранения скорости и давления
Definition PassportGen.h:86
Here is the call graph for this function:
Here is the caller graph for this function:

◆ Move()

void Airfoil::Move ( const Point2D dr)
virtualinherited

Перемещение профиля

Плоскопараллельно перемещает профиль на вектор \( \overrightarrow{dr} \)

Parameters
[in]drконстантная ссылка на вектор перемещения

Definition at line 1131 of file Airfoil2D.cpp.

1132{
1133 for (size_t i = 0; i < r_.size(); ++i)
1134 r_[i] += dr;
1135 rcm += dr;
1136
1137 for (size_t q = 0; q < possibleWays.size(); ++q)
1138 for (Point2D& pts : possibleWays[q])
1139 pts += dr;
1140
1141 CalcNrmTauLen();
1142 GetGabarits();
1143}//Move(...)
virtual void GetGabarits(double gap=0.02)
Вычисляет габаритный прямоугольник профиля
void CalcNrmTauLen()
Вычисление нормалей, касательных и длин панелей по текущему положению вершин
Here is the call graph for this function:
Here is the caller graph for this function:

◆ ReadFromFile()

void Airfoil::ReadFromFile ( const std::string &  dir)
virtualinherited

Считывание профиля из файла

Считывание геометрии профиля из файла, вычисление всех прочих параметров профиля
После загрузки из файла профиль поворачивается на нужный угол и масштабируется на нужный коэффициент

Warning
Сейчас масса, момент инерции и скорости вершин зануляются.
Parameters
[in]dirконстантная ссылка на строку — имя каталога, где лежит cчитываемый файл

Definition at line 212 of file Airfoil2D.cpp.

213{
215 std::string filename = dir + param.fileAirfoil;
216 std::ifstream airfoilFile;
217
218 if (fileExistTest(filename, W.getInfo(), true, { "txt", "TXT" }))
219 {
220 std::stringstream airfoilFile(VMlib::Preprocessor(filename).resultString);
221
222 VMlib::StreamParser airfoilParser(W.getInfo(), "airfoil file parser", airfoilFile);
223
224 m = 0.0; //TODO
225 J = 0.0; //TODO
226 rcm = { 0.0, 0.0 }; //TODO
227 phiAfl = 0.0;
228
229 inverse = param.inverse;
230
231
232
233 //*
234
236 //Проверяем отсутствие "задвоенных" подряд идущих точек
237 //airfoilParser.get("r", r_);
238 std::vector<Point2D> rFromFile;
239 airfoilParser.get("r", rFromFile);
240
241 if (rFromFile.size() > 0)
242 {
243 if (param.requiredNPanels <= rFromFile.size()) {
244
245 r_.reserve(rFromFile.size());
246 r_.push_back(rFromFile[0]);
247 for (size_t i = 1; i < rFromFile.size(); ++i)
248 if ((rFromFile[i] - rFromFile[i - 1]).length2() > 1e-12)
249 r_.push_back(rFromFile[i]);
250
251 //Если первая совпадает с последней, то убираем последнюю
252 if ((r_.back() - r_.front()).length2() < 1e-12)
253 r_.resize(r_.size() - 1);
254 }
255 else
256 {
257 W.getInfo('e') << "Airfoil shape is given explicitely, it can not be automatically split!" << std::endl;
258 exit(200);
259 }
260 }
261 else
262 {
263 std::vector<GeomPoint> geomFromFile;
264
265 airfoilParser.get("geometry", geomFromFile);
266
267 if ((geomFromFile.front() - geomFromFile.back()).length2() < 1e-12)
268 geomFromFile.resize(geomFromFile.size() - 1);
269
270 size_t reqN = param.requiredNPanels;
271
272 std::vector<double> L(geomFromFile.size());
273 double totalLength = 0.0;
274 std::vector<size_t> nc = {};
275 std::vector<size_t> ni = {};
276
277 for (size_t i = 0; i < geomFromFile.size(); ++i)
278 {
279 const Point2D& p1 = geomFromFile[i];
280 const Point2D& p2 = geomFromFile[(i + 1) % geomFromFile.size()];
281
282 L[i] = (p2 - p1).length();
283 totalLength += L[i];
284 }
285
286 /*
287 Point2D p1, p2, p3, cc, dd;
288 double ie = 0;
289 int numOfDivPnt = 12;
290 double alpha;
291 double rscale = 0.1;
292 std::vector<Point2D> pnt(numOfDivPnt);
293 std::vector<Point2D> newGeom(numOfDivPnt * geomFromFile.size());
294
295 for (size_t i = 0; i < geomFromFile.size(); ++i)
296 {
297 p1 = (i == 0 ? geomFromFile[(int)geomFromFile.size() - 1].r : geomFromFile[i - 1].r);
298 p2 = geomFromFile[i].r;
299 p3 = geomFromFile[(i + 1) % geomFromFile.size()].r;
300
301 Point2D dc = (p1 - p2).unit() + (p3 - p2).unit();
302 ie = dc.dist2To(dc.proj(p1 - p2));
303 if (ie < 1e-3) ie = 0;
304
305 alpha = (PI - acos(((p3 - p2) & (p1 - p2)) / (sqrt(((p3 - p2) & (p3 - p2)) * ((p1 - p2) & (p1 - p2)))))) / (numOfDivPnt - 1);
306
307 cc = p2 + (rscale * ie) * dc;
308
309 dd = p2 + (cc - p2).proj(p1 - p2) - cc;
310 for (int j = 0; j < numOfDivPnt; ++j)
311 newGeom[i * numOfDivPnt + j] = cc + dd.rotated(j * alpha);
312 }
313 */
314
315 //Ищем первый сплайн
316 size_t i = 0;
317 std::vector<size_t> splineStart, splineFinish;
318
319 while (i < geomFromFile.size())
320 {
321 while (i < geomFromFile.size() && !(geomFromFile[i].type == "c"))
322 ++i;
323
324 if (i < geomFromFile.size())
325 {
326 splineStart.push_back(i);
327 ++i;
328 //ищем второй конец
329 while (i < geomFromFile.size() && !(geomFromFile[i].type == "c"))
330 ++i;
331
332 splineFinish.push_back(i);
333 }
334 }
335
336 if ((splineStart.size() > 0) && (splineStart[0] != 0))
337 splineFinish.back() = splineStart[0];
338
339 if (reqN == 0)
340 {
341 r_.reserve(geomFromFile.size());
342 for (size_t i = 0; i < geomFromFile.size(); ++i)
343 r_.push_back(geomFromFile[i]);
344 }
345 else
346 {
347 double hRef = totalLength / reqN;
348
349 std::vector<int> nPanels;
350
351 bool cyclic = (splineStart.size() == 0);
352
353 if (cyclic)
354 {
355 splineStart.push_back(0);
356 splineFinish.push_back(geomFromFile.size());
357 }
358
359 for (size_t s = 0; s < splineStart.size(); ++s)
360 {
361 //Сплайн
362 std::vector<double> T, X, Y;
363
364 size_t splineLegs = splineFinish[s] - splineStart[s];
365 if (splineFinish[s] <= splineStart[s])
366 splineLegs += geomFromFile.size();
367
368 T.reserve(splineLegs + 1);
369 X.reserve(T.size());
370 Y.reserve(T.size());
371
372 double tbuf = 0.0;
373
374 for (size_t i = splineStart[s]; i <= splineStart[s] + splineLegs; ++i)
375 {
376 const Point2D& pt = geomFromFile[i % geomFromFile.size()];
377
378 T.push_back(tbuf);
379 X.push_back(pt[0]);
380 Y.push_back(pt[1]);
381
382 if ((i == splineStart[s]) && (splineFinish[s] - splineStart[s] == 1))
383 {
384 double halfL = (i < geomFromFile.size()) ? 0.5 * L[i] : 0.5 * (geomFromFile.front() - geomFromFile.back()).length();
385 tbuf += halfL;
386 T.push_back(tbuf);
387 Point2D nextPt = geomFromFile[(i + 1) % geomFromFile.size()];
388
389 X.push_back(0.5 * (pt[0] + nextPt[0]));
390 Y.push_back(0.5 * (pt[1] + nextPt[1]));
391
392 tbuf += halfL;
393 }
394 else
395 tbuf += (i < geomFromFile.size()) ? L[i] : (geomFromFile.front() - geomFromFile.back()).length();
396 }
397
398 tk::spline s1, s2;
399 if (cyclic)
400 {
401 s1.set_boundary(tk::spline::cyclic);
402 s2.set_boundary(tk::spline::cyclic);
403 }
404 else
405 {
406 s1.set_boundary(tk::spline::second_deriv, 0.0, tk::spline::second_deriv, 0.0);
407 s2.set_boundary(tk::spline::second_deriv, 0.0, tk::spline::second_deriv, 0.0);
408 }
409
410 s1.set_points(T, X);
411 s2.set_points(T, Y);
412
413 int NumberOfPanelsSpline = (int)ceil(T.back() / hRef);
414 double hSpline = T.back() / NumberOfPanelsSpline;
415
416 for (int i = 0; i < NumberOfPanelsSpline; ++i)
417 r_.push_back({ s1(hSpline * i), s2(hSpline * i) });
418
419 nPanels.push_back(NumberOfPanelsSpline);
420
421 }
422 }
423 }//else geometry
424
425 if (r_.size() == 0)
426 {
427 W.getInfo('e') << "No points on airfoil contour!" << std::endl;
428 exit(200);
429 }
430
431 if (inverse)
432 std::reverse(r_.begin(), r_.end());
433
434 v_.resize(0);
435 for (size_t q = 0; q < r_.size(); ++q)
436 v_.push_back({ 0.0, 0.0 });
437
438
439 int nPossibleWays;
440 int defaultNPossibleWays = 0;
441 airfoilParser.get("nPossibleWays", nPossibleWays, &defaultNPossibleWays, false);
442
443 possibleWays.resize(nPossibleWays);
444 for (int q = 0; q < nPossibleWays; ++q)
445 airfoilParser.get("possibleWay" + std::to_string(q + 1), possibleWays[q]);
446
447 //определяем начальные габаритные размеры
448 auto xMinMax = std::minmax_element(r_.begin(), r_.end(), Point2D::cmp<'x'>);
449 auto yMinMax = std::minmax_element(r_.begin(), r_.end(), Point2D::cmp<'y'>);
450
452 { Point2D({ (*xMinMax.first)[0], (*yMinMax.first)[1] }), Point2D({ (*xMinMax.second)[0], (*yMinMax.second)[1] }) };
453
454 Move(param.basePoint);
455 Scale(param.scale);
456
457 double rotationAngle = param.angle;
458
459 //Для обдува ветром, когда углы считаются по компасу
460 //if (W.getPassport().geographicalAngles)
461 // rotationAngle = -param.angle - 0.5 * PI;
462
463 Rotate(-rotationAngle);
464 //в конце Rotate нормали, касательные и длины вычисляются сами
465
466 std::string fname = W.getPassport().dir + "/airfoil-" + std::to_string(numberInPassport) + ".pfl";
467 //if (!fileExistTest(fname, W.getInfo()))
468 {
469 std::ofstream of(fname);
470 for (size_t i = 0; i < r_.size(); ++i)
471 of << r_[i][0] << " " << r_[i][1] << std::endl;
472 of.close();
473 }
474
475
476 gammaThrough.clear();
477 gammaThrough.resize(r_.size(), 0.0);
478
479 //Вычисляем площадь
480 area = 0.0;
481 for (size_t q = 0; q < r_.size(); ++q)
482 {
483 const Point2D& cntq = 0.5 * (getR(q) + getR(q + 1));
484 const Point2D& drq = getR(q + 1) - getR(q);
485 area += (cntq[0] * drq[1] - cntq[1] * drq[0]);
486 }
487 area *= 0.5;
488 area = fabs(area);
489
491 }
492}//ReadFromFile(...)
double phiAfl
Поворот профиля
Definition Airfoil2D.h:100
double area
Площадь профиля
Definition Airfoil2D.h:103
bool inverse
Признак разворота нормалей (для расчета внутренних течений)
Definition Airfoil2D.h:76
virtual void Scale(const Point2D &)
Масштабирование профиля
std::vector< double > gammaThrough
Суммарные циркуляции вихрей, пересекших панели профиля на прошлом шаге
Definition Airfoil2D.h:276
double J
Полярный момент инерции профиля относительно центра масс
Definition Airfoil2D.h:196
virtual void Move(const Point2D &dr)
Перемещение профиля
void lightningTest()
Тест на "отвещенность".
virtual void Rotate(double alpha)
Поворот профиля
std::vector< AirfoilParams > airfoilParams
Список структур с параметрами профилей
Definition Passport2D.h:276
Passport & getNonConstPassport() const
Возврат неконстантной ссылки на паспорт
Definition World2D.h:268
Класс, позволяющий выполнять предварительную обработку файлов
Класс, позволяющий выполнять разбор файлов и строк с настройками и параметрами
VMlib::LogStream & getInfo() const
Возврат ссылки на объект LogStream Используется в техничеcких целях для организации вывода
Definition WorldGen.h:82
bool fileExistTest(std::string &fileName, LogStream &info, bool exitKey=false, const std::list< std::string > &extList={})
Проверка существования файла
Definition defs.h:340
constexpr double ni(int n)
Definition simple_math.h:99
Структура, задающая параметры профиля
Definition Passport2D.h:205
Point2D basePoint
Смещение центра масс (перенос профиля)
Definition Passport2D.h:216
std::string fileAirfoil
Имя файла с начальным состоянием профилей (без полного пути)
Definition Passport2D.h:207
double angle
Угол поворота (угол атаки)
Definition Passport2D.h:225
Point2D scale
Коэффициент масштабирования
Definition Passport2D.h:219
size_t requiredNPanels
Желаемое число панелей для разбиения геометрии
Definition Passport2D.h:213
bool inverse
Признак разворота нормалей (для расчета внутреннего течения)
Definition Passport2D.h:231
Here is the call graph for this function:

◆ Rotate()

void Airfoil::Rotate ( double  alpha)
virtualinherited

Поворот профиля

Поворачивает профиль на угол \( \alpha \) вокруг центра масс

Parameters
[in]alphaугол поворота против часовой стрелки в радианах

Definition at line 1146 of file Airfoil2D.cpp.

1147{
1148 phiAfl += alpha;
1149 nummatrix<double, 2, 2> rotMatrix = { { cos(alpha), -sin(alpha) }, { sin(alpha), cos(alpha) } };
1150
1151 for (size_t i = 0; i < r_.size(); ++i)
1152 r_[i] = rcm + (rotMatrix & (r_[i] - rcm));
1153
1154 for (size_t q = 0; q < possibleWays.size(); ++q)
1155 for (Point2D& pts : possibleWays[q])
1156 {
1157 Point2D oldPts = pts;
1158 pts = rcm + (rotMatrix & (oldPts - rcm));
1159 }
1160
1161 CalcNrmTauLen();
1162 GetGabarits();
1163}//Rotate(...)
Шаблонный класс, определяющий матрицу фиксированного размера Фактически представляет собой массив,...
Definition nummatrix.h:66
Here is the call graph for this function:
Here is the caller graph for this function:

◆ Scale()

void Airfoil::Scale ( const Point2D )
virtualinherited

Масштабирование профиля

Масштабирует профиль в factor раз относительно центра масс

Parameters
[in]factorмасштабный коэффициент

Definition at line 1167 of file Airfoil2D.cpp.

1168{
1169 for (size_t i = 0; i < r_.size(); ++i)
1170 r_[i] = rcm + Point2D{ factor[0] * (r_[i] - rcm)[0], factor[1] * (r_[i] - rcm)[1] };
1171
1172 for (size_t q = 0; q < possibleWays.size(); ++q)
1173 for (Point2D& pts : possibleWays[q])
1174 {
1175 Point2D oldPts = pts;
1176 pts = rcm + Point2D{ factor[0] * (oldPts - rcm)[0], factor[1] * (oldPts - rcm)[1] };
1177 }
1178
1179 CalcNrmTauLen();
1180 GetGabarits();
1181}//Scale(...)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ setR()

Point2D & VM2D::AirfoilGeometry::setR ( size_t  q)
inlineinherited

Возврат ссылки на вершину профиля

Организовано "зацикливание" в сторону увеличения индекса, т.е. getR[size()] = getR[0];

Это позволяет удобно обращаться к getR(i) и getR(i+1) как к началу и концу i-й панели

Parameters
[in]qномер вершины профиля return ссылку на вершину профиля

Definition at line 125 of file Airfoil2D.h.

126 {
127 return (q < r_.size()) ? r_[q] : r_[0];
128 };
Here is the caller graph for this function:

◆ setV() [1/2]

void VM2D::AirfoilGeometry::setV ( const Point2D &  vel)
inlineinherited

Установка постоянной скорости всех вершин профиля

Parameters
[in]velконстантная ссылка на величину устанавливаемой скорости

Definition at line 145 of file Airfoil2D.h.

146 {
147 v_.clear();
148 v_.resize(r_.size(), vel);
149 }
Here is the caller graph for this function:

◆ setV() [2/2]

void VM2D::AirfoilGeometry::setV ( const std::vector< Point2D > &  vel)
inlineinherited

Установка скоростей всех вершин профиля

Parameters
[in]velконстантная ссылка на вектор величин скоростей вершин профиля

Definition at line 154 of file Airfoil2D.h.

155 {
156 v_.clear();
157 v_.insert(v_.end(), vel.begin(), vel.end());
158 }

Member Data Documentation

◆ area

double VM2D::AirfoilGeometry::area
inherited

Площадь профиля

Definition at line 103 of file Airfoil2D.h.

◆ gammaThrough

std::vector<double> VM2D::Airfoil::gammaThrough
inherited

Суммарные циркуляции вихрей, пересекших панели профиля на прошлом шаге

Используются в правой части системы, чтобы компенсировать вихри, проникшие в профиль

Definition at line 276 of file Airfoil2D.h.

◆ inverse

bool VM2D::AirfoilGeometry::inverse
inherited

Признак разворота нормалей (для расчета внутренних течений)

Definition at line 76 of file Airfoil2D.h.

◆ J

double VM2D::Airfoil::J
inherited

Полярный момент инерции профиля относительно центра масс

Definition at line 196 of file Airfoil2D.h.

◆ len

std::vector<double> VM2D::AirfoilGeometry::len
inherited

Длины панелей профиля

Definition at line 94 of file Airfoil2D.h.

◆ lowLeft

Point2D VM2D::Airfoil::lowLeft
inherited

Левый нижний угол габаритного прямоугольника профиля

Definition at line 270 of file Airfoil2D.h.

◆ m

double VM2D::Airfoil::m
inherited

Масса профиля

Definition at line 193 of file Airfoil2D.h.

◆ meanEpsOverPanel

std::vector<double> VM2D::Airfoil::meanEpsOverPanel
inherited

Средние значения Eps на панелях

Definition at line 209 of file Airfoil2D.h.

◆ nrm

std::vector<Point2D> VM2D::AirfoilGeometry::nrm
inherited

Нормали к панелям профиля

Нормали задаются внешними, нормированными на единицу

Definition at line 81 of file Airfoil2D.h.

◆ numberInPassport

const size_t VM2D::Airfoil::numberInPassport
inherited

Номер профиля в паспорте

Definition at line 188 of file Airfoil2D.h.

◆ phiAfl

double VM2D::AirfoilGeometry::phiAfl
inherited

Поворот профиля

Definition at line 100 of file Airfoil2D.h.

◆ possibleWays

std::vector<std::vector<Point2D> > VM2D::Airfoil::possibleWays
inherited

Возможные пути внутри профиля от точки (0, 0) к центрам всех панелей

Definition at line 199 of file Airfoil2D.h.

◆ psn

std::vector<std::pair<Point2D, Point2D> > VM2D::AirfoilGeometry::psn
inherited

Псевдонормали к панелям профиля

Псевдонормали к началу и концу панели, нормированные на единицу

Definition at line 86 of file Airfoil2D.h.

◆ r_

std::vector<Point2D> VM2D::AirfoilGeometry::r_
protectedinherited

Координаты начал панелей

Definition at line 69 of file Airfoil2D.h.

◆ rcm

Point2D VM2D::AirfoilGeometry::rcm
inherited

Положение центра масс профиля

Definition at line 97 of file Airfoil2D.h.

◆ tau

std::vector<Point2D> VM2D::AirfoilGeometry::tau
inherited

Касательные к панелям профиля

Касательные соответствуют обходу профиля против часовой стрелки, задаются нормированными на единицу

Definition at line 91 of file Airfoil2D.h.

◆ upRight

Point2D VM2D::Airfoil::upRight
inherited

Правый верхний угол габаритного прямоугольника профиля

Definition at line 271 of file Airfoil2D.h.

◆ v_

std::vector<Point2D> VM2D::AirfoilGeometry::v_
protectedinherited

Скорости начал панелей

Definition at line 72 of file Airfoil2D.h.

◆ viscousStress

std::vector<double> VM2D::Airfoil::viscousStress
inherited

Нейросеть для коэффициентов I0 и I3 диффузионной скорости

Касательные напряжения на панелях профиля

Definition at line 268 of file Airfoil2D.h.

◆ W

const World2D& VM2D::Airfoil::W
inherited

Константная ссылка на решаемую задачу

Definition at line 185 of file Airfoil2D.h.

◆ wayToVertex

std::vector<int> VM2D::Airfoil::wayToVertex
inherited

Номера путей к вершинам

Definition at line 202 of file Airfoil2D.h.


The documentation for this class was generated from the following file: