86 std::pair<int, int> pair;
88 for (
size_t i = 0; i < np; ++i)
90 midNorm =
afl.
nrm[i] * delta;
92 size_t NEWnVortPerPan = (size_t)std::max((
int)std::ceil(fabs(sol(i) *
afl.
len[i]) / maxG), nVortPerPan);
99 for (
size_t j = 0; j < NEWnVortPerPan; ++j)
101 virtVort.
r() =
afl.
getR(i) + dr * (j * 1.0 + 0.5) + midNorm;
102 virtVort.
g() = sol(i) *
afl.
len[i] / NEWnVortPerPan;
114 for (
size_t j = 0; j < np; ++j)
125 for (
size_t i = 0; i < np; ++i)
131 for (
size_t i = 0; i < np; ++i)
132 for (
size_t j = 0; j < np; ++j)
147 matr(i, j) =
afl.
getA(1, i, otherBoundary.
afl, j)[0];
160 std::vector<Point2D> selfVelo(pointsDb.
vtx.size());
164 #pragma warning (push) 165 #pragma warning (disable: 4101) 170 #pragma warning (pop) 172 #pragma omp parallel for default(none) shared(selfVelo, cft, pointsDb, std::cout) private(velI, tempVel) 173 for (
int i = 0; i < pointsDb.
vtx.size(); ++i)
210 for (
size_t i = 0; i < velo.size(); ++i)
211 velo[i] += selfVelo[i];
215 #if defined(USE_CUDA) 216 void BoundaryConstLayerAver::GPUCalcConvVelocityToSetOfPointsFromSheets(
const WakeDataBase& pointsDb, std::vector<Point2D>& velo)
const 220 const size_t npt = pointsDb.
vtx.size();
221 double*& dev_ptr_pt = pointsDb.devVtxPtr;
227 double*& dev_ptr_r =
afl.devRPtr;
228 double*& dev_ptr_freeVortexSheet =
afl.devFreeVortexSheetPtr;
229 double*& dev_ptr_attachedVortexSheet =
afl.devAttachedVortexSheetPtr;
230 double*& dev_ptr_attachedSourceSheet =
afl.devAttachedSourceSheetPtr;
232 std::vector<Point2D>& Vel = velo;
233 std::vector<Point2D> locvel(npt);
234 double*& dev_ptr_vel = pointsDb.devVelPtr;
241 cuCalculateConvVeloWakeFromVirtual(npt, dev_ptr_pt, npnl, dev_ptr_r, dev_ptr_freeVortexSheet, dev_ptr_attachedVortexSheet, dev_ptr_attachedSourceSheet, dev_ptr_vel, eps2);
245 std::vector<Point2D> newV(Vel.size());
246 W.
getCuda().CopyMemFromDev<double, 2>(npt, dev_ptr_vel, (
double*)newV.data());
248 for (
size_t q = 0; q < Vel.size(); ++q)
259 std::vector<Point2D>& Vel = velo;
273 #pragma omp parallel for default(none) shared(Vel) 274 for (
int i = 0; i < (int)Vel.size(); ++i)
304 double& velI = wakeRhs[0];
310 for (
size_t it = 0; it != count; ++it)
315 const double& gamJ = vt.
g();
322 velI -= gamJ * alpha;
331 double& velI = wakeRhs[0];
336 for (
size_t it = 0; it != count; ++it)
340 const double& gamJ = vt.
g();
347 velI -= gamJ * lambda;
410 #pragma omp parallel for default(none) shared(vInfRhs, np) 411 for (
int i = 0; i < np; ++i)
const double & freeVortexSheet(size_t n, size_t moment) const
Заголовочный файл с описанием класса Passport (двумерный) и cоответствующими структурами ...
const double & attachedVortexSheet(size_t n, size_t moment) const
virtual void GetInfluenceFromSourceSheetAtRectPanelToVortex(size_t panel, const Vortex2D &ptr, Point2D &vel) const override
Вычисление влияния слоя источников конкретной прямолинейной панели на вихрь в области течения ...
Заголовочный файл с описанием класса Wake.
virtual void FillIQFromOther(const Boundary &otherBoundary, std::pair< Eigen::MatrixXd, Eigen::MatrixXd > &IQ) override
Генерация блока матрицы, состоящей из интегралов от (r-xi)/|r-xi|^2, влияние одного профиля на другой...
double delta
Расстояние, на которое рождаемый вихрь отодвигается от профиля
virtual void FillMatrixSelf(Eigen::MatrixXd &matr, Eigen::VectorXd &lastLine, Eigen::VectorXd &lactCol) override
Генерация блока матрицы
Заголовочный файл с описанием класса World2D.
Заголовочный файл с описанием класса Airfoil.
double maxGamma
Максимально допустимая циркуляция вихря
Абстрактный класс, определяющий способ удовлетворения граничного условия на обтекаемом профиле ...
std::vector< Point2D > vecHalfGamma
Скорость вихрей виртуального следа конкретного профиля (равна Gamma/2) используется для расчета давле...
virtual void CalcConvVelocityToSetOfPointsFromSheets(const WakeDataBase &pointsDb, std::vector< Point2D > &velo) const override
Вычисление конвективных скоростей в наборе точек, вызываемых наличием слоев вихрей и источников на пр...
const size_t numberInPassport
Номер профиля в паспорте
Заголовочный файл с описанием класса Mechanics.
PhysicalProperties physicalProperties
Структура с физическими свойствами задачи
const Point2D & getR(size_t q) const
Возврат константной ссылки на вершину профиля
const Point2D & getV(size_t q) const
Возврат константной ссылки на скорость вершины профиля
virtual std::vector< double > getA(size_t p, size_t i, const Airfoil &airfoil, size_t j) const =0
Вычисление коэффициентов матрицы A для расчета влияния панели на панель
HD Point2D & r()
Функция для доступа к радиус-вектору вихря
HD double & g()
Функция для доступа к циркуляции вихря
double Alpha(const Point2D &p, const Point2D &s)
Вспомогательная функция вычисления угла между векторами
size_t getNumberOfPanels() const
Возврат количества панелей на профиле
auto length2() const -> typename std::remove_const< typename std::remove_reference< decltype(this->data[0])>::type >::type
Вычисление квадрата нормы (длины) вектора
std::vector< std::pair< size_t, size_t > > aflPan
Пара чисел: номер профиля и номер панели, на которой рожден виртуальный вихрь
virtual void GetInfluenceFromVorticesToRectPanel(size_t panel, const Vortex2D *ptr, ptrdiff_t count, std::vector< double > &wakeRhs) const override
Вычисление влияния части подряд идущих вихрей из вихревого следа на прямолинейную панель для правой ч...
double Lambda(const Point2D &p, const Point2D &s)
Вспомогательная функция вычисления логарифма отношения норм векторов
const size_t numberInPassport
Номер профиля в паспорте
size_t getNumberOfAirfoil() const
Возврат количества профилей в задаче
virtual void ComputeAttachedSheetsIntensity() override
Вычисление интенсивностей присоединенного вихревого слоя и присоединенного слоя источников ...
virtual void FillMatrixFromOther(const Boundary &otherBoundary, Eigen::MatrixXd &matr) override
Генерация блока матрицы влияния от другого профиля того же типа
virtual void GetInfluenceFromVInfToRectPanel(std::vector< double > &vInfRhs) const override
Вычисление влияния набегающего потока на прямолинейную панель для правой части
Заголовочный файл с описанием класса StreamParser.
std::vector< Vortex2D > vtx
Список вихревых элементов
size_t getSheetSize() const
Класс, опеделяющий двумерный вектор
virtual void SolutionToFreeVortexSheetAndVirtualVortex(const Eigen::VectorXd &sol) override
Пересчет решения на интенсивность вихревого слоя и на рождаемые вихри на конкретном профиле ...
auto unit(P newlen=1) const -> numvector< typename std::remove_const< decltype(this->data[0]*newlen)>::type, n >
Вычисление орта вектора или вектора заданной длины, коллинеарного данному
std::vector< Point2D > tau
Касательные к панелям профиля
Заголовочный файл с описанием класса BoundaryConstLayerAver.
Sheet sheets
Слои на профиле
Заголовочный файл с описанием класса MeasureVP.
const double & attachedSourceSheet(size_t n, size_t moment) const
Sheet oldSheets
Слои на профиле с предыдущего шага
const Passport & getPassport() const
Возврат константной ссылки на паспорт
const Gpu & getCuda() const
Возврат константной ссылки на объект, связанный с видеокартой (GPU)
virtual void calcIQ(size_t p, const Airfoil &otherAirfoil, std::pair< Eigen::MatrixXd, Eigen::MatrixXd > &matrPair) const =0
Вычисление коэффициентов матрицы, состоящей из интегралов от (r-xi)/|r-xi|^2.
Класс, опеделяющий двумерный вихревой элемент
virtual void GetInfluenceFromVortexSheetAtRectPanelToVortex(size_t panel, const Vortex2D &vtx, Point2D &vel) const override
Вычисление влияния вихревых слоев (свободный + присоединенный) конкретной прямолинейной панели на вих...
virtual void FillIQSelf(std::pair< Eigen::MatrixXd, Eigen::MatrixXd > &IQ) override
Генерация блока матрицы, состоящей из интегралов от (r-xi)/|r-xi|^2, влияние профиля самого на себя ...
int minVortexPerPanel
Минимальное число вихрей, рождаемых на каждой панели профииля
VirtualWake virtualWake
Виртуальный вихревой след конкретного профиля
std::vector< Point2D > nrm
Нормали к панелям профиля
virtual void GetInfluenceFromSourcesToRectPanel(size_t panel, const Vortex2D *ptr, ptrdiff_t count, std::vector< double > &wakeRhs) const override
Вычисление влияния части подряд источников из области течения на прямолинейную панель для правой част...
const Airfoil & getAirfoil(size_t i) const
Возврат константной ссылки на объект профиля
Point2D V0() const
Функция скорости набегающего потока с учетом разгона
Класс, опеделяющий набор вихрей
numvector< T, n > & toZero(P val=0)
Установка всех компонент вектора в константу (по умолчанию — нуль)
WakeDiscretizationProperties wakeDiscretizationProperties
Структура с параметрами дискретизации вихревого следа
std::vector< double > len
Длины панелей профиля
Заголовочный файл с описанием класса Velocity.
virtual void CalcConvVelocityAtVirtualVortexes(std::vector< Point2D > &velo) const override
Вычисление конвективной скорости в точках расположения виртуальных вихрей
std::vector< std::pair< int, int > > vortexBeginEnd
Номера первого и последнего вихрей, рождаемых на каждой панели профиля (формируется после решения СЛА...
const World2D & W
Константная ссылка на решаемую задачу
double eps2
Квадрат радиуса вихря
numvector< T, 2 > kcross() const
Геометрический поворот двумерного вектора на 90 градусов