84 std::pair<int, int> pair;
88 midNorm =
afl.
nrm[i] * delta;
99 if (fabs(a - b) < 1e-10)
101 size_t NEWnVortPerPan = (size_t)std::max((
int)std::ceil(fabs(sol(i)*
afl.
len[i]) / maxG), nVortPerPan);
104 for (
size_t j = 0; j < NEWnVortPerPan; ++j)
106 virtVort.
r() =
afl.
getR(i) + dr * (j * 1.0 + 0.5) + midNorm;
107 virtVort.
g() = sol(i) *
afl.
len[i] / NEWnVortPerPan;
114 else if (a * b >= 0.0)
116 size_t NEWnVortPerPan = (size_t)std::max((
int)std::ceil(fabs(0.5*(a+b)*
afl.
len[i]) / maxG), nVortPerPan);
117 std::vector<double> ds(NEWnVortPerPan+1, 0.0);
119 for (
size_t k = 1; k <= NEWnVortPerPan; ++k)
121 if ((a > 0) || (b > 0))
122 ds[k] =
afl.
len[i] / (a - b) * (a - sqrt((b*b * k + a * a*(NEWnVortPerPan - k)) / NEWnVortPerPan));
124 ds[k] =
afl.
len[i] / (a - b) * (a + sqrt((b*b * k + a * a*(NEWnVortPerPan - k)) / NEWnVortPerPan));
127 for (
size_t j = 0; j < NEWnVortPerPan; ++j)
129 virtVort.
r() =
afl.
getR(i) + 0.5*(ds[j]+ds[j+1])*
afl.
tau[i] + midNorm;
130 virtVort.
g() = 0.5 * (a+b) *
afl.
len[i] / NEWnVortPerPan;
139 double sast = -a *
afl.
len[i] / (b - a);
143 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]));
144 std::vector<double> ds(NEWnVortPerPan + 1, 0.0);
146 for (
size_t k = 1; k <= NEWnVortPerPan; ++k)
149 ds[k] = sast / (a - 0.0) * (a - sqrt((a * a*(NEWnVortPerPan - k)) / NEWnVortPerPan));
151 ds[k] = sast / (a - 0.0) * (a + sqrt((a * a*(NEWnVortPerPan - k)) / NEWnVortPerPan));
154 for (
size_t j = 0; j < NEWnVortPerPan; ++j)
156 virtVort.
r() =
afl.
getR(i) + 0.5*(ds[j] + ds[j + 1])*
afl.
tau[i] + midNorm;
157 virtVort.
g() = 0.5 * (a + 0.0) * sast / NEWnVortPerPan;
165 double sastast =
afl.
len[i] - sast;
169 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]));
170 std::vector<double> ds(NEWnVortPerPan + 1, 0.0);
172 for (
size_t k = 1; k <= NEWnVortPerPan; ++k)
175 ds[k] = sastast / (0.0 - b) * (0.0 - sqrt((b*b * k) / NEWnVortPerPan));
177 ds[k] = sastast / (0.0 - b) * (0.0 + sqrt((b*b * k) / NEWnVortPerPan));
180 for (
size_t j = 0; j < NEWnVortPerPan; ++j)
183 virtVort.
g() = 0.5 * (0.0 + b) * sastast / NEWnVortPerPan;
213 std::vector<double> res(4, 0.0);
215 for (
size_t i = 0; i < np; ++i)
219 lastCol(np + i) = 0.0;
220 lastLine(np + i) = 0.0;
223 for (
size_t i = 0; i < np; ++i)
224 for (
size_t j = 0; j < np; ++j)
228 matr(i, np + j) = res[1];
229 matr(np + i, j) = res[2];
230 matr(np + i, np + j) = res[3];
247 std::vector<double> res(4, 0.0);
249 for (
size_t i = 0; i < np; ++i)
250 for (
size_t j = 0; j < npOther; ++j)
255 matr(i, npOther + j) = res[1];
256 matr(np + i, j) = res[2];
257 matr(np + i, npOther + j) = res[3];
270 std::vector<Point2D> selfVelo(pointsDb.
vtx.size());
272 #pragma warning (push) 273 #pragma warning (disable: 4101) 277 #pragma warning (pop) 279 #pragma omp parallel for default(none) shared(selfVelo, pointsDb, std::cout) private(velI, tempVel) 280 for (
int i = 0; i < pointsDb.
vtx.size(); ++i)
315 for (
size_t i = 0; i < velo.size(); ++i)
316 velo[i] += selfVelo[i];
319 #if defined(USE_CUDA) 320 void BoundaryLinLayerAver::GPUCalcConvVelocityToSetOfPointsFromSheets(
const WakeDataBase& pointsDb, std::vector<Point2D>& velo)
const 322 const size_t npt = pointsDb.
vtx.size();
323 double*& dev_ptr_pt = pointsDb.devVtxPtr;
326 double*& dev_ptr_r =
afl.devRPtr;
327 double*& dev_ptr_freeVortexSheet =
afl.devFreeVortexSheetPtr;
328 double*& dev_ptr_attachedVortexSheet =
afl.devAttachedVortexSheetPtr;
329 double*& dev_ptr_attachedSourceSheet =
afl.devAttachedSourceSheetPtr;
331 std::vector<Point2D>& Vel = velo;
332 std::vector<Point2D> newV(npt);
333 double*& dev_ptr_vel = pointsDb.devVelPtr;
339 cuCalculateConvVeloWakeFromVirtual(npt, dev_ptr_pt, npnl, dev_ptr_r, dev_ptr_freeVortexSheet, dev_ptr_attachedVortexSheet, dev_ptr_attachedSourceSheet, dev_ptr_vel, eps2);
341 W.
getCuda().CopyMemFromDev<double, 2>(npt, dev_ptr_vel, (
double*)newV.data());
343 for (
size_t q = 0; q < Vel.size(); ++q)
357 std::vector<Point2D>& Vel = velo;
361 #pragma omp parallel for default(none) shared(Vel) 362 for (
int i = 0; i < (int)Vel.size(); ++i)
397 double& velI = wakeRhs[0];
398 double& velILin = wakeRhs[1];
405 for (
size_t it = 0; it != count; ++it)
409 const double& gamJ = vt.
g();
419 velI -= gamJ * alpha;
421 velILin -= gamJ * (alpha * (u1 & taui) + lambda * (u1 & (-taui.
kcross())));
429 double& velI = wakeRhs[0];
430 double& velILin = wakeRhs[1];
437 for (
size_t it = 0; it != count; ++it)
441 const double& gamJ = vt.
g();
451 velI -= gamJ * lambda;
453 velILin -= gamJ * (alpha * (u1 & taui.
kcross()) + lambda * (u1 & taui) - 1.0);
516 vInfRhs.resize(2 * np);
518 #pragma omp parallel for default(none) shared(vInfRhs, np) 519 for (
int i = 0; i < np; ++i)
const double & freeVortexSheet(size_t n, size_t moment) const
virtual void CalcConvVelocityAtVirtualVortexes(std::vector< Point2D > &velo) const override
Вычисление конвективной скорости в точках расположения виртуальных вихрей
Заголовочный файл с описанием класса Passport (двумерный) и cоответствующими структурами ...
const double & attachedVortexSheet(size_t n, size_t moment) const
Заголовочный файл с описанием класса Wake.
double delta
Расстояние, на которое рождаемый вихрь отодвигается от профиля
Заголовочный файл с описанием класса World2D.
virtual void FillIQFromOther(const Boundary &otherBoundary, std::pair< Eigen::MatrixXd, Eigen::MatrixXd > &IQ) override
Генерация блока матрицы, состоящей из интегралов от (r-xi)/|r-xi|^2, влияние одного профиля на другой...
Заголовочный файл с описанием класса Airfoil.
double maxGamma
Максимально допустимая циркуляция вихря
Абстрактный класс, определяющий способ удовлетворения граничного условия на обтекаемом профиле ...
std::vector< Point2D > vecHalfGamma
Скорость вихрей виртуального следа конкретного профиля (равна Gamma/2) используется для расчета давле...
P length() const
Вычисление 2-нормы (длины) вектора
Заголовочный файл с описанием класса Mechanics.
PhysicalProperties physicalProperties
Структура с физическими свойствами задачи
const Point2D & getR(size_t q) const
Возврат константной ссылки на вершину профиля
virtual void GetInfluenceFromSourceSheetAtRectPanelToVortex(size_t panel, const Vortex2D &vtx, Point2D &vel) const override
Вычисление влияния слоя источников конкретной прямолинейной панели на вихрь в области течения ...
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)
Вспомогательная функция вычисления угла между векторами
virtual void GetInfluenceFromVInfToRectPanel(std::vector< double > &vInfRhs) const override
Вычисление влияния набегающего потока на прямолинейную панель для правой части
size_t getNumberOfPanels() const
Возврат количества панелей на профиле
auto length2() const -> typename std::remove_const< typename std::remove_reference< decltype(this->data[0])>::type >::type
Вычисление квадрата нормы (длины) вектора
const Airfoil & getOldAirfoil(size_t i) const
Возврат константной ссылки на объект старого профиля
virtual void FillIQSelf(std::pair< Eigen::MatrixXd, Eigen::MatrixXd > &IQ) override
Генерация блока матрицы, состоящей из интегралов от (r-xi)/|r-xi|^2, влияние профиля самого на себя ...
Point2D Omega(const Point2D &a, const Point2D &b, const Point2D &c)
Вспомогательная функция вычисления величины .
std::vector< std::pair< size_t, size_t > > aflPan
Пара чисел: номер профиля и номер панели, на которой рожден виртуальный вихрь
TimeDiscretizationProperties timeDiscretizationProperties
Структура с параметрами процесса интегрирования по времени
double Lambda(const Point2D &p, const Point2D &s)
Вспомогательная функция вычисления логарифма отношения норм векторов
const size_t numberInPassport
Номер профиля в паспорте
virtual void GetInfluenceFromVortexSheetAtRectPanelToVortex(size_t panel, const Vortex2D &vtx, Point2D &vel) const override
Вычисление влияния вихревых слоев (свободный + присоединенный) конкретной прямолинейной панели на вих...
virtual void FillMatrixSelf(Eigen::MatrixXd &matr, Eigen::VectorXd &lastLine, Eigen::VectorXd &lactCol) override
Генерация блока матрицы
virtual void ComputeAttachedSheetsIntensity() override
Вычисление интенсивностей присоединенного вихревого слоя и присоединенного слоя источников ...
virtual void SolutionToFreeVortexSheetAndVirtualVortex(const Eigen::VectorXd &sol) override
Пересчет решения на интенсивность вихревого слоя и на рождаемые вихри на конкретном профиле ...
Заголовочный файл с описанием класса StreamParser.
std::vector< Vortex2D > vtx
Список вихревых элементов
Заголовочный файл с описанием класса BoundaryLinLayerAver.
Класс, опеделяющий двумерный вектор
auto unit(P newlen=1) const -> numvector< typename std::remove_const< decltype(this->data[0]*newlen)>::type, n >
Вычисление орта вектора или вектора заданной длины, коллинеарного данному
std::vector< Point2D > tau
Касательные к панелям профиля
Sheet sheets
Слои на профиле
Заголовочный файл с описанием класса MeasureVP.
const double & attachedSourceSheet(size_t n, size_t moment) const
Sheet oldSheets
Слои на профиле с предыдущего шага
double phiAfl
Поворот профиля
virtual void GetInfluenceFromSourcesToRectPanel(size_t panel, const Vortex2D *ptr, ptrdiff_t count, std::vector< double > &wakeRhs) const override
Вычисление влияния части подряд источников из области течения на прямолинейную панель для правой част...
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.
Класс, опеделяющий двумерный вихревой элемент
int minVortexPerPanel
Минимальное число вихрей, рождаемых на каждой панели профииля
VirtualWake virtualWake
Виртуальный вихревой след конкретного профиля
std::vector< Point2D > nrm
Нормали к панелям профиля
virtual void CalcConvVelocityToSetOfPointsFromSheets(const WakeDataBase &pointsDb, std::vector< Point2D > &velo) const override
Вычисление конвективных скоростей в наборе точек, вызываемых наличием слоев вихрей и источников на пр...
Абстрактный класс, определяющий обтекаемый профиль
size_t getCurrentStep() const
Возврат константной ссылки на параметры распараллеливания по MPI.
virtual void FillMatrixFromOther(const Boundary &otherBoundary, Eigen::MatrixXd &matr) override
Генерация блока матрицы влияния от другого профиля того же типа
Point2D V0() const
Функция скорости набегающего потока с учетом разгона
Класс, опеделяющий набор вихрей
numvector< T, n > & toZero(P val=0)
Установка всех компонент вектора в константу (по умолчанию — нуль)
virtual void GetInfluenceFromVorticesToRectPanel(size_t panel, const Vortex2D *ptr, ptrdiff_t count, std::vector< double > &wakeRhs) const override
Вычисление влияния части подряд идущих вихрей из вихревого следа на прямолинейную панель для правой ч...
WakeDiscretizationProperties wakeDiscretizationProperties
Структура с параметрами дискретизации вихревого следа
std::vector< double > len
Длины панелей профиля
Заголовочный файл с описанием класса Velocity.
std::vector< std::pair< int, int > > vortexBeginEnd
Номера первого и последнего вихрей, рождаемых на каждой панели профиля (формируется после решения СЛА...
const World2D & W
Константная ссылка на решаемую задачу
double eps2
Квадрат радиуса вихря
numvector< T, 2 > kcross() const
Геометрический поворот двумерного вектора на 90 градусов