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

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

#include <Boundary2DLinLayerAver.h>

Inheritance diagram for VM2D::BoundaryLinLayerAver:
Collaboration diagram for VM2D::BoundaryLinLayerAver:

Public Member Functions

 BoundaryLinLayerAver (const World2D &W_, size_t numberInPassport_)
 Конструктор
 
virtual ~BoundaryLinLayerAver ()
 Деструктор
 
virtual void FillMatrixSelf (Eigen::MatrixXd &matr, Eigen::VectorXd &lastLine, Eigen::VectorXd &lactCol) override
 Генерация блока матрицы
 
virtual void FillIQSelf (std::pair< Eigen::MatrixXd, Eigen::MatrixXd > &IQ) override
 Генерация блока матрицы, состоящей из интегралов от (r-xi)/|r-xi|^2, влияние профиля самого на себя
 
virtual void FillMatrixFromOther (const Boundary &otherBoundary, Eigen::MatrixXd &matr) override
 Генерация блока матрицы влияния от другого профиля того же типа
 
virtual void FillIQFromOther (const Boundary &otherBoundary, std::pair< Eigen::MatrixXd, Eigen::MatrixXd > &IQ) override
 Генерация блока матрицы, состоящей из интегралов от (r-xi)/|r-xi|^2, влияние одного профиля на другой
 
virtual void SolutionToFreeVortexSheetAndVirtualVortex (const Eigen::VectorXd &sol) override
 Пересчет решения на интенсивность вихревого слоя и на рождаемые вихри на конкретном профиле
 
virtual void CalcConvVelocityToSetOfPointsFromSheets (const WakeDataBase &pointsDb, std::vector< Point2D > &velo) const override
 Вычисление конвективных скоростей в наборе точек, вызываемых наличием слоев вихрей и источников на профиле
 
virtual void ComputeAttachedSheetsIntensity () override
 Вычисление интенсивностей присоединенного вихревого слоя и присоединенного слоя источников
 
virtual void GetInfluenceFromVorticesToRectPanel (size_t panel, const Vortex2D *ptr, ptrdiff_t count, std::vector< double > &wakeRhs) const override
 Вычисление влияния части подряд идущих вихрей из вихревого следа на прямолинейную панель для правой части
 
virtual void GetInfluenceFromSourcesToRectPanel (size_t panel, const Vortex2D *ptr, ptrdiff_t count, std::vector< double > &wakeRhs) const override
 Вычисление влияния части подряд источников из области течения на прямолинейную панель для правой части
 
virtual void GetInfluenceFromVortexSheetAtRectPanelToVortex (size_t panel, const Vortex2D &vtx, Point2D &vel) const override
 Вычисление влияния вихревых слоев (свободный + присоединенный) конкретной прямолинейной панели на вихрь в области течения ///.
 
virtual void GetInfluenceFromSourceSheetAtRectPanelToVortex (size_t panel, const Vortex2D &vtx, Point2D &vel) const override
 Вычисление влияния слоя источников конкретной прямолинейной панели на вихрь в области течения
 
virtual void GetInfluenceFromVInfToRectPanel (std::vector< double > &vInfRhs) const override
 Вычисление влияния набегающего потока на прямолинейную панель для правой части
 
size_t GetUnknownsSize () const
 Возврат размерности вектора решения
 

Public Attributes

const Airfoilafl
 
int minVortexPerPanel
 Минимальное число вихрей, рождаемых на панели профиля и формирующих виртуальный вихревой след
 
std::vector< std::pair< int, int > > vortexBeginEnd
 Номера первого и последнего вихрей, рождаемых на каждой панели профиля (формируется после решения СЛАУ)
 
VirtualWake virtualWake
 Виртуальный вихревой след конкретного профиля
 
size_t sheetDim
 Размерность параметров каждого из слоев на каждой из панелей
 
Sheet sheets
 Слои на профиле
 
Sheet oldSheets
 Слои на профиле с предыдущего шага
 

Protected Attributes

const World2DW
 Константная ссылка на решаемую задачу
 
const size_t numberInPassport
 Номер профиля в паспорте
 

Detailed Description

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

Способ удовлетворения граничного условия:

  • вихревой слой представляется кусочно-линейном виде с разрывами в каждом узле профиля;
  • условие ортогональности невязки граничного условия константным и линейным проекционным функциям.
Author
Марчевский Илья Константинович
Сокол Ксения Сергеевна
Рятина Евгения Павловна
Колганова Александра Олеговна

\Version 1.14

Date
6 марта 2026 г.

Definition at line 65 of file Boundary2DLinLayerAver.h.

Constructor & Destructor Documentation

◆ BoundaryLinLayerAver()

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

Конструктор

Parameters
[in]W_константная ссылка на решаемую задачу
[in]numberInPassport_номер профиля в паспорте задачи

Definition at line 74 of file Boundary2DLinLayerAver.h.

74 :
75 Boundary(W_, numberInPassport_, 2)
76 { };
Boundary(const World2D &W_, size_t numberInPassport_, int sheetDim_)
Конструктор

◆ ~BoundaryLinLayerAver()

virtual VM2D::BoundaryLinLayerAver::~BoundaryLinLayerAver ( )
inlinevirtual

Деструктор

Definition at line 79 of file Boundary2DLinLayerAver.h.

79{};

Member Function Documentation

◆ CalcConvVelocityToSetOfPointsFromSheets()

void BoundaryLinLayerAver::CalcConvVelocityToSetOfPointsFromSheets ( const WakeDataBase pointsDb,
std::vector< Point2D > &  velo 
) const
overridevirtual

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

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

Parameters
[in]pointsDbконстантная ссылка на базу данных вихрей, в точках которых вычисляются скорости
[out]veloссылка на вектор скоростей, которые приобретают точки из-за влияния слоев вихрей и источников на профиле
Warning
velo — накапливается!
Todo:
Тут надо разобраться, как должно быть...
Todo:
Todo:
сделать if(move || deform)
Todo:
почему не sheets.freeVortexSheet(j, 0)?

Implements VM2D::Boundary.

Definition at line 269 of file Boundary2DLinLayerAver.cpp.

270{
271 std::vector<Point2D> selfVelo(pointsDb.vtx.size());
272
273#pragma warning (push)
274#pragma warning (disable: 4101)
275 //Локальные переменные для цикла
276 Point2D velI;
277 Point2D tempVel;
278#pragma warning (pop)
279
280#pragma omp parallel for default(none) shared(selfVelo, pointsDb, std::cout, IDPI) private(velI, tempVel)
281 for (int i = 0; i < pointsDb.vtx.size(); ++i)
282 {
283 velI.toZero();
284
285 const Point2D& posI = pointsDb.vtx[i].r();
286
289 for (size_t j = 0; j < afl.getNumberOfPanels(); ++j)
290 {
291 Point2D dj = afl.getR(j + 1) - afl.getR(j);
292 Point2D tauj = dj.unit();
293
294 Point2D s = posI - afl.getR(j);
295 Point2D p = posI - afl.getR(j + 1);
296
297 double a = VMlib::Alpha(p, s);
298
299 double lambda = VMlib::Lambda(p, s);
300
301 Point2D u1 = 0.5 / dj.length() * VMlib::Omega(p + s, tauj, tauj) ;
302
303 Point2D skos0 = -a * tauj.kcross() + lambda * tauj;
304 Point2D skos1 = -a * u1.kcross() + lambda * u1 - tauj;
305
307 velI += sheets.freeVortexSheet(j, 0) * skos0.kcross() + sheets.freeVortexSheet(j, 1) * skos1.kcross();
308 velI += sheets.attachedVortexSheet(j, 0) * skos0.kcross() + sheets.attachedVortexSheet(j, 1) * skos1.kcross();
309 velI += sheets.attachedSourceSheet(j, 0) * skos0 + sheets.attachedSourceSheet(j, 1) * skos1;
310 }//for j
311
312 velI *= IDPI;
313 selfVelo[i] = velI;
314 }//for i
315
316 for (size_t i = 0; i < velo.size(); ++i)
317 velo[i] += selfVelo[i];
318}//CalcConvVelocityToSetOfPointsFromSheets(...)
const Point2D & getR(size_t q) const
Возврат константной ссылки на вершину профиля
Definition Airfoil2D.h:113
size_t getNumberOfPanels() const
Возврат количества панелей на профиле
Definition Airfoil2D.h:163
const Airfoil & afl
Definition Boundary2D.h:77
Sheet sheets
Слои на профиле
Definition Boundary2D.h:96
const double & attachedVortexSheet(size_t n, size_t moment) const
Definition Sheet2D.h:105
const double & attachedSourceSheet(size_t n, size_t moment) const
Definition Sheet2D.h:110
const double & freeVortexSheet(size_t n, size_t moment) const
Definition Sheet2D.h:100
std::vector< Vortex2D > vtx
Список вихревых элементов
numvector< T, 2 > kcross() const
Геометрический поворот двумерного вектора на 90 градусов
Definition numvector.h:510
numvector< T, n > & toZero(P val=0)
Установка всех компонент вектора в константу (по умолчанию — нуль)
Definition numvector.h:527
auto unit(P newlen=1) const -> numvector< typename std::remove_const< decltype(this->data[0] *newlen)>::type, n >
Вычисление орта вектора или вектора заданной длины, коллинеарного данному
Definition numvector.h:402
P length() const
Вычисление 2-нормы (длины) вектора
Definition numvector.h:374
const double IDPI
Число .
Definition defs.h:85
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:

◆ ComputeAttachedSheetsIntensity()

void BoundaryLinLayerAver::ComputeAttachedSheetsIntensity ( )
overridevirtual

Вычисление интенсивностей присоединенного вихревого слоя и присоединенного слоя источников

Implements VM2D::Boundary.

Definition at line 373 of file Boundary2DLinLayerAver.cpp.

374{
375 for (size_t i = 0; i < afl.getNumberOfPanels(); ++i)
376 {
381 }
382
383 const AirfoilGeometry* oldAfl = (W.getCurrentStep() == 0) ? &afl : &W.getOldAirfoil(numberInPassport);
384
385 for (size_t i = 0; i < afl.getNumberOfPanels(); ++i)
386 {
387 sheets.attachedVortexSheet(i, 0) = 0.5 * (afl.getV(i + 1) + afl.getV(i)) & afl.tau[i];
389
390 sheets.attachedSourceSheet(i, 0) = 0.5 * (afl.getV(i + 1) + afl.getV(i)) & afl.nrm[i];
392
393
394 }
395}//ComputeAttachedSheetsIntensity()
Класс, определяющий форму профиля
Definition Airfoil2D.h:66
double phiAfl
Поворот профиля
Definition Airfoil2D.h:100
std::vector< double > len
Длины панелей профиля
Definition Airfoil2D.h:94
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
Sheet oldSheets
Слои на профиле с предыдущего шага
Definition Boundary2D.h:99
const World2D & W
Константная ссылка на решаемую задачу
Definition Boundary2D.h:68
const size_t numberInPassport
Номер профиля в паспорте
Definition Boundary2D.h:71
const Passport & getPassport() const
Возврат константной ссылки на паспорт
Definition World2D.h:251
TimeDiscretizationProperties timeDiscretizationProperties
Структура с параметрами процесса интегрирования по времени
size_t getCurrentStep() const
Возврат константной ссылки на параметры распараллеливания по MPI.
Definition WorldGen.h:99
double dt
Шаг по времени
Definition PassportGen.h:67
Here is the call graph for this function:

◆ FillIQFromOther()

void BoundaryLinLayerAver::FillIQFromOther ( const Boundary otherBoundary,
std::pair< Eigen::MatrixXd, Eigen::MatrixXd > &  IQ 
)
overridevirtual

Генерация блока матрицы, состоящей из интегралов от (r-xi)/|r-xi|^2, влияние одного профиля на другой

Генерирует блок матрицы влияния от другого профиля того же типа

Parameters
[in]otherBoundaryконстантная ссылка на граничное условие на втором профиле
[out]IQссылка на пару матриц, выражающих взаимные влияния (касательные и нормальные) панелей профиля
Todo:
Пока считается, что граничные условия одинаковые

Implements VM2D::Boundary.

Definition at line 262 of file Boundary2DLinLayerAver.cpp.

263{
264 afl.calcIQ(2, otherBoundary.afl, IQ);
265}//FillIQFromOther(...)
virtual void calcIQ(size_t p, const Airfoil &otherAirfoil, std::pair< Eigen::MatrixXd, Eigen::MatrixXd > &matrPair) const
Вычисление коэффициентов матрицы, состоящей из интегралов от (r-xi)/|r-xi|^2.
Here is the call graph for this function:

◆ FillIQSelf()

void BoundaryLinLayerAver::FillIQSelf ( std::pair< Eigen::MatrixXd, Eigen::MatrixXd > &  IQ)
overridevirtual

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

Parameters
[out]IQссылка на генерируемую матрицу

Implements VM2D::Boundary.

Definition at line 236 of file Boundary2DLinLayerAver.cpp.

237{
238 afl.calcIQ(2, afl, IQ);
239}//FillIQSelf(...)
Here is the call graph for this function:

◆ FillMatrixFromOther()

void BoundaryLinLayerAver::FillMatrixFromOther ( const Boundary otherBoundary,
Eigen::MatrixXd &  matr 
)
overridevirtual

Генерация блока матрицы влияния от другого профиля того же типа

Генерирует блок матрицы влияния от другого профиля того же типа

Parameters
[in]otherBoundaryконстантная ссылка на граничное условие на втором профиле
[out]matrссылка на генерируемый блок матрицы
Todo:
Пока считается, что граничные условия одинаковые

Implements VM2D::Boundary.

Definition at line 243 of file Boundary2DLinLayerAver.cpp.

244{
245 size_t np = afl.getNumberOfPanels();
246 size_t npOther = otherBoundary.afl.getNumberOfPanels();
247
248 std::vector<double> res(4, 0.0);
249
250 for (size_t i = 0; i < np; ++i)
251 for (size_t j = 0; j < npOther; ++j)
252 {
253 res = afl.getA(2, i, otherBoundary.afl, j);
254
255 matr(i, j) = res[0];
256 matr(i, npOther + j) = res[1];
257 matr(np + i, j) = res[2];
258 matr(np + i, npOther + j) = res[3];
259 }
260}//FillMatrixFromOther(...)
virtual std::vector< double > getA(size_t p, size_t i, const Airfoil &airfoil, size_t j) const
Вычисление коэффициентов матрицы A для расчета влияния панели на панель
Here is the call graph for this function:

◆ FillMatrixSelf()

void BoundaryLinLayerAver::FillMatrixSelf ( Eigen::MatrixXd &  matr,
Eigen::VectorXd &  lastLine,
Eigen::VectorXd &  lactCol 
)
overridevirtual

Генерация блока матрицы

Генерирует следующие компоненты матрицы:

  • диагональный блок матрицы — влияние данного профиля на самого себя;
  • нижнюю строку для матрицы для данного профиля;
  • правый столбец матрицы для данного профиля.
Parameters
[out]matrссылка на генерируемую матрицу
[out]lastLineссылка на нижнюю строку
[out]lactColссылка на правый столбец

Implements VM2D::Boundary.

Definition at line 208 of file Boundary2DLinLayerAver.cpp.

209{
210 size_t np = afl.getNumberOfPanels();
211
212 std::vector<double> res(4, 0.0);
213
214 for (size_t i = 0; i < np; ++i)
215 {
216 lastCol(i) = 1.0;
217 lastLine(i) = afl.len[i];
218 lastCol(np + i) = 0.0;
219 lastLine(np + i) = 0.0;
220 }
221
222
223
224 for (size_t i = 0; i < np; ++i)
225 for (size_t j = 0; j < np; ++j)
226 {
227 res = afl.getA(2, i, afl, j);
228 matr(i, j) = res[0];
229 matr(i, np + j) = res[1];
230 matr(np + i, j) = res[2];
231 matr(np + i, np + j) = res[3];
232 }
233}//FillMatrixSelf(...)
Here is the call graph for this function:

◆ GetInfluenceFromSourceSheetAtRectPanelToVortex()

void BoundaryLinLayerAver::GetInfluenceFromSourceSheetAtRectPanelToVortex ( size_t  panel,
const Vortex2D vtx,
Point2D vel 
) const
overridevirtual

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

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

Implements VM2D::Boundary.

Definition at line 462 of file Boundary2DLinLayerAver.cpp.

463{
464 vel.toZero();
465
466 const Point2D& posI = ptr.r();
467
468 Point2D dj = afl.getR(panel + 1) - afl.getR(panel);
469 Point2D tauj = dj.unit();
470
471 Point2D s = posI - afl.getR(panel);
472 Point2D p = posI - afl.getR(panel + 1);
473
474 Point2D u1 = 0.5 / dj.length()* VMlib::Omega(p + s, tauj, tauj);
475
476 double a = VMlib::Alpha(p, s);
477
478 double lambda;
479 if ((s.length2() > 1e-16) && (p.length2() > 1e-16))
480 lambda = VMlib::Lambda(p, s);
481 else
482 lambda = 0.0;
483
484 vel += sheets.attachedSourceSheet(panel, 0) * (-a * u1.kcross() + lambda * u1 - tauj);
485 vel *= IDPI;
486}// GetInfluenceFromSourceSheetAtRectPanelToVortex(...)
auto length2() const -> typename std::remove_const< typename std::remove_reference< decltype(this->data[0])>::type >::type
Вычисление квадрата нормы (длины) вектора
Definition numvector.h:386
Here is the call graph for this function:

◆ GetInfluenceFromSourcesToRectPanel()

void BoundaryLinLayerAver::GetInfluenceFromSourcesToRectPanel ( size_t  panel,
const Vortex2D ptr,
ptrdiff_t  count,
std::vector< double > &  wakeRhs 
) const
overridevirtual

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

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

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

Implements VM2D::Boundary.

Definition at line 430 of file Boundary2DLinLayerAver.cpp.

431{
432 double& velI = wakeRhs[0];
433 double& velILin = wakeRhs[1];
434
435 const Point2D& posI0 = afl.getR(panel);
436 const Point2D& posI1 = afl.getR(panel + 1);
437 Point2D di = posI1 - posI0;
438 const Point2D& taui = afl.tau[panel];
439
440 for (size_t it = 0; it != count; ++it)
441 {
442 const Vortex2D& vt = ptr[it];
443 const Point2D& posJ = vt.r();
444 const double& gamJ = vt.g();
445
446 Point2D s = posJ - posI0;
447 Point2D p = posJ - posI1;
448
449 Point2D u1 = 0.5 / di.length() * VMlib::Omega(p + s, taui, taui);
450
451 double alpha = VMlib::Alpha(p, s);
452 double lambda = VMlib::Lambda(p, s);
453
454 velI -= gamJ * lambda;
455
456 velILin -= gamJ * (alpha * (u1 & taui.kcross()) + lambda * (u1 & taui) - 1.0);
457 }
458
459}//GetInfluenceFromSourcesToRectPanel(...)
Класс, опеделяющий двумерный вихревой элемент
Definition Vortex2D.h:59
HD Point2D & r()
Функция для доступа к радиус-вектору вихря
Definition Vortex2D.h:87
HD double & g()
Функция для доступа к циркуляции вихря
Definition Vortex2D.h:95
Here is the call graph for this function:

◆ GetInfluenceFromVInfToRectPanel()

void BoundaryLinLayerAver::GetInfluenceFromVInfToRectPanel ( std::vector< double > &  vInfRhs) const
overridevirtual

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

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

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

Implements VM2D::Boundary.

Definition at line 515 of file Boundary2DLinLayerAver.cpp.

516{
517 size_t np = afl.getNumberOfPanels();
518
519 vInfRhs.resize(2 * np);
520
521#pragma omp parallel for default(none) shared(vInfRhs, np)
522 for (int i = 0; i < np; ++i)
523 {
524 vInfRhs[i] = afl.tau[i] & W.getV0();
525 vInfRhs[np + i] = 0;
526 }
527}
Point2D getV0() const
Возврат текущей скорости набегающего потока
Definition World2D.h:142
Here is the call graph for this function:

◆ GetInfluenceFromVortexSheetAtRectPanelToVortex()

void BoundaryLinLayerAver::GetInfluenceFromVortexSheetAtRectPanelToVortex ( size_t  panel,
const Vortex2D vtx,
Point2D vel 
) const
overridevirtual

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

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

Implements VM2D::Boundary.

Definition at line 489 of file Boundary2DLinLayerAver.cpp.

490{
491 vel.toZero();
492
493 const Point2D& posI = ptr.r();
494
495 Point2D dj = afl.getR(panel + 1) - afl.getR(panel);
496 Point2D tauj = dj.unit();
497
498 Point2D s = posI - afl.getR(panel);
499 Point2D p = posI - afl.getR(panel + 1);
500
501 Point2D u1 = 0.5 / dj.length()* VMlib::Omega(p + s, tauj, tauj);
502
503 double lambda;
504 if ((s.length2() > 1e-16) && (p.length2() > 1e-16))
505 lambda = VMlib::Lambda(p, s);
506 else
507 lambda = 0.0;
508
509 vel += sheets.freeVortexSheet(panel, 0) * (lambda * u1.kcross() - tauj.kcross());
510 vel += sheets.attachedVortexSheet(panel, 0) * (lambda * u1.kcross() - tauj.kcross());
511 vel *= IDPI;
512}// GetInfluenceFromVortexSheetAtRectPanelToVortex(...)
Here is the call graph for this function:

◆ GetInfluenceFromVorticesToRectPanel()

void BoundaryLinLayerAver::GetInfluenceFromVorticesToRectPanel ( size_t  panel,
const Vortex2D ptr,
ptrdiff_t  count,
std::vector< double > &  wakeRhs 
) const
overridevirtual

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

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

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

Implements VM2D::Boundary.

Definition at line 398 of file Boundary2DLinLayerAver.cpp.

399{
400 double& velI = wakeRhs[0];
401 double& velILin = wakeRhs[1];
402
403 const Point2D& posI0 = afl.getR(panel);
404 const Point2D& posI1 = afl.getR(panel + 1);
405 Point2D di = posI1 - posI0;
406 const Point2D& taui = afl.tau[panel];
407
408 for (size_t it = 0; it != count; ++it)
409 {
410 const Vortex2D& vt = ptr[it];
411 const Point2D& posJ = vt.r();
412 const double& gamJ = vt.g();
413
414 Point2D s = posJ - posI0;
415 Point2D p = posJ - posI1;
416
417 Point2D u1 = 0.5 / di.length() * VMlib::Omega(p + s, taui, taui);
418
419 double alpha = VMlib::Alpha(p, s);
420 double lambda = VMlib::Lambda(p, s);
421
422 velI -= gamJ * alpha;
423
424 velILin -= gamJ * (alpha * (u1 & taui) + lambda * (u1 & (-taui.kcross())));
425 }
426}//GetInfluenceFromVorticesToRectPanel(...)
Here is the call graph for this function:

◆ GetUnknownsSize()

size_t Boundary::GetUnknownsSize ( ) const
inherited

Возврат размерности вектора решения

(без учета регуляризирующей переменной)

Returns
размерность вектора решения

Definition at line 73 of file Boundary2D.cpp.

74{
76}
size_t sheetDim
Размерность параметров каждого из слоев на каждой из панелей
Definition Boundary2D.h:93
Here is the call graph for this function:
Here is the caller graph for this function:

◆ SolutionToFreeVortexSheetAndVirtualVortex()

void BoundaryLinLayerAver::SolutionToFreeVortexSheetAndVirtualVortex ( const Eigen::VectorXd &  sol)
overridevirtual

Пересчет решения на интенсивность вихревого слоя и на рождаемые вихри на конкретном профиле

1) Приводит решение к интенсивности вихревого слоя и записывает его в sheets.freeVortexSheet:

  • если неизвестное — интенсивность вихря, то он "размазывается" по панели;
  • если неизвестное — интенсивность слоя, то она передается непосредственно.

2) Приводит интенсивность вихревого слоя к рождаемым вихрям, а также вычисляет их положения

Parameters
[in]solвектор решения СЛАУ

Implements VM2D::Boundary.

Definition at line 56 of file Boundary2DLinLayerAver.cpp.

57{
58 Vortex2D virtVort;
59 Point2D midNorm;
60
62
64
65 //Очистка и резервирование памяти
67 virtualWake.vecHalfGamma.reserve(afl.getNumberOfPanels() * nVortPerPan);
68
69 //Очистка и резервирование памяти
70 virtualWake.aflPan.clear();
71 virtualWake.aflPan.reserve(afl.getNumberOfPanels() * nVortPerPan);
72
73 //Очистка и резервирование памяти
74 virtualWake.vtx.clear();
75 virtualWake.vtx.reserve(afl.getNumberOfPanels() * nVortPerPan);
76
77 //Очистка и резервирование памяти
78 vortexBeginEnd.clear();
80
82
83 std::pair<int, int> pair;
84
85 for (size_t i = 0; i < afl.getNumberOfPanels(); ++i)
86 {
87 midNorm = afl.nrm[i] * delta;
88
89 //число участков, на которые разбивается панель для сброса вихрей
90 //определяется через наибольшее значение решения на профиле, т.е. в крайней точке
91
92
93 pair.first = (int)virtualWake.vtx.size();
94
95 double a = sol(i) - 0.5 * sol(afl.getNumberOfPanels() + i);
96 double b = sol(i) + 0.5 * sol(afl.getNumberOfPanels() + i);
97
98 if (fabs(a - b) < 1e-10)
99 {
100 size_t NEWnVortPerPan = (size_t)std::max((int)std::ceil(fabs(sol(i)*afl.len[i]) / maxG), nVortPerPan);
101 Point2D dr = 1.0 / NEWnVortPerPan * (afl.getR(i + 1) - afl.getR(i));
102
103 for (size_t j = 0; j < NEWnVortPerPan; ++j)
104 {
105 virtVort.r() = afl.getR(i) + dr * (j * 1.0 + 0.5) + midNorm;
106 virtVort.g() = sol(i) * afl.len[i] / NEWnVortPerPan;
107 virtualWake.vtx.push_back(virtVort);
108
109 virtualWake.vecHalfGamma.push_back(0.5 * sol(i) * afl.tau[i]);
110 virtualWake.aflPan.push_back({ numberInPassport, i });
111 }
112 }
113 else if (a * b >= 0.0)
114 {
115 size_t NEWnVortPerPan = (size_t)std::max((int)std::ceil(fabs(0.5*(a+b)*afl.len[i]) / maxG), nVortPerPan);
116 std::vector<double> ds(NEWnVortPerPan+1, 0.0);
117
118 for (size_t k = 1; k <= NEWnVortPerPan; ++k)
119 {
120 if ((a > 0) || (b > 0))
121 ds[k] = afl.len[i] / (a - b) * (a - sqrt((b*b * k + a * a*(NEWnVortPerPan - k)) / NEWnVortPerPan));
122 else
123 ds[k] = afl.len[i] / (a - b) * (a + sqrt((b*b * k + a * a*(NEWnVortPerPan - k)) / NEWnVortPerPan));
124 }
125
126 for (size_t j = 0; j < NEWnVortPerPan; ++j)
127 {
128 virtVort.r() = afl.getR(i) + 0.5*(ds[j]+ds[j+1])*afl.tau[i] + midNorm;
129 virtVort.g() = 0.5 * (a+b) * afl.len[i] / NEWnVortPerPan;
130 virtualWake.vtx.push_back(virtVort);
131
132 virtualWake.vecHalfGamma.push_back(0.5 * (a + 0.5*(ds[j] + ds[j + 1]) * (b-a)/ afl.len[i]) * afl.tau[i]);
133 virtualWake.aflPan.push_back({ numberInPassport, i });
134 }
135 }
136 else
137 {
138 double sast = -a * afl.len[i] / (b - a);
139
140 //from 0 to sast
141 {
142 size_t NEWnVortPerPan = (size_t)std::max((int)std::ceil(fabs(0.5*(a + 0.0)*sast) / maxG), (int)std::ceil(nVortPerPan * sast / afl.len[i]));
143 std::vector<double> ds(NEWnVortPerPan + 1, 0.0);
144
145 for (size_t k = 1; k <= NEWnVortPerPan; ++k)
146 {
147 if (a > 0)
148 ds[k] = sast / (a - 0.0) * (a - sqrt((a * a*(NEWnVortPerPan - k)) / NEWnVortPerPan));
149 else
150 ds[k] = sast / (a - 0.0) * (a + sqrt((a * a*(NEWnVortPerPan - k)) / NEWnVortPerPan));
151 }
152
153 for (size_t j = 0; j < NEWnVortPerPan; ++j)
154 {
155 virtVort.r() = afl.getR(i) + 0.5*(ds[j] + ds[j + 1])*afl.tau[i] + midNorm;
156 virtVort.g() = 0.5 * (a + 0.0) * sast / NEWnVortPerPan;
157 virtualWake.vtx.push_back(virtVort);
158
159 virtualWake.vecHalfGamma.push_back(0.5 * (a + 0.5*(ds[j] + ds[j + 1]) * (0.0 - a) / sast) * afl.tau[i]);
160 virtualWake.aflPan.push_back({ numberInPassport, i });
161 }
162 }
163
164 double sastast = afl.len[i] - sast;
165
166 //from sats to len
167 {
168 size_t NEWnVortPerPan = (size_t)std::max((int)std::ceil(fabs(0.5*(0.0 + b)*sastast) / maxG), (int)std::ceil(nVortPerPan * sastast / afl.len[i]));
169 std::vector<double> ds(NEWnVortPerPan + 1, 0.0);
170
171 for (size_t k = 1; k <= NEWnVortPerPan; ++k)
172 {
173 if (b > 0)
174 ds[k] = sastast / (0.0 - b) * (0.0 - sqrt((b*b * k) / NEWnVortPerPan));
175 else
176 ds[k] = sastast / (0.0 - b) * (0.0 + sqrt((b*b * k) / NEWnVortPerPan));
177 }
178
179 for (size_t j = 0; j < NEWnVortPerPan; ++j)
180 {
181 virtVort.r() = afl.getR(i) + sast * afl.tau[i] + 0.5*(ds[j] + ds[j + 1])*afl.tau[i] + midNorm;
182 virtVort.g() = 0.5 * (0.0 + b) * sastast / NEWnVortPerPan;
183 virtualWake.vtx.push_back(virtVort);
184
185 virtualWake.vecHalfGamma.push_back(0.5 * (0.0 + 0.5*(ds[j] + ds[j + 1]) * (b - 0.0) / sastast) * afl.tau[i]);
186 virtualWake.aflPan.push_back({ numberInPassport, i });
187 }
188
189 }
190 }
191
192 pair.second = (int)virtualWake.vtx.size();
193 vortexBeginEnd.push_back(pair);
194 }
195
196
197 for (size_t j = 0; j < afl.getNumberOfPanels(); ++j)
198 {
199 sheets.freeVortexSheet(j, 0) = sol(j);
200 sheets.freeVortexSheet(j, 1) = sol(afl.getNumberOfPanels() + j);
201 }
202
203}//SolutionToFreeVortexSheetAndVirtualVortex(...)
std::vector< std::pair< int, int > > vortexBeginEnd
Номера первого и последнего вихрей, рождаемых на каждой панели профиля (формируется после решения СЛА...
Definition Boundary2D.h:83
VirtualWake virtualWake
Виртуальный вихревой след конкретного профиля
Definition Boundary2D.h:86
WakeDiscretizationProperties wakeDiscretizationProperties
Структура с параметрами дискретизации вихревого следа
Definition Passport2D.h:292
std::vector< Point2D > vecHalfGamma
Скорость вихрей виртуального следа конкретного профиля (равна Gamma/2) используется для расчета давле...
std::vector< std::pair< size_t, size_t > > aflPan
Пара чисел: номер профиля и номер панели, на которой рожден виртуальный вихрь
int minVortexPerPanel
Минимальное число вихрей, рождаемых на каждой панели профииля
Definition Passport2D.h:141
double delta
Расстояние, на которое рождаемый вихрь отодвигается от профиля
Definition Passport2D.h:138
double maxGamma
Максимально допустимая циркуляция вихря
Definition Passport2D.h:144
Here is the call graph for this function:

Member Data Documentation

◆ afl

const Airfoil& VM2D::Boundary::afl
inherited

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

Definition at line 77 of file Boundary2D.h.

◆ minVortexPerPanel

int VM2D::Boundary::minVortexPerPanel
inherited

Минимальное число вихрей, рождаемых на панели профиля и формирующих виртуальный вихревой след

Definition at line 80 of file Boundary2D.h.

◆ numberInPassport

const size_t VM2D::Boundary::numberInPassport
protectedinherited

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

Definition at line 71 of file Boundary2D.h.

◆ oldSheets

Sheet VM2D::Boundary::oldSheets
inherited

Слои на профиле с предыдущего шага

Definition at line 99 of file Boundary2D.h.

◆ sheetDim

size_t VM2D::Boundary::sheetDim
inherited

Размерность параметров каждого из слоев на каждой из панелей

Указывает, сколькими числами задается интенсивность каждого из слоев на каждой панели:

  • 1 — одно число — задается только среднее значение;
  • 2 — два числа — задается среднее значение и "наклон".

Definition at line 93 of file Boundary2D.h.

◆ sheets

Sheet VM2D::Boundary::sheets
inherited

Слои на профиле

Definition at line 96 of file Boundary2D.h.

◆ virtualWake

VirtualWake VM2D::Boundary::virtualWake
inherited

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

Definition at line 86 of file Boundary2D.h.

◆ vortexBeginEnd

std::vector<std::pair<int, int> > VM2D::Boundary::vortexBeginEnd
inherited

Номера первого и последнего вихрей, рождаемых на каждой панели профиля (формируется после решения СЛАУ)

Definition at line 83 of file Boundary2D.h.

◆ W

const World2D& VM2D::Boundary::W
protectedinherited

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

Definition at line 68 of file Boundary2D.h.


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