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;
225 for (
size_t i = 0; i < np; ++i)
226 for (
size_t j = 0; j < np; ++j)
230 matr(i, np + j) = res[1];
231 matr(np + i, j) = res[2];
232 matr(np + i, np + j) = res[3];
249 std::vector<double> res(4, 0.0);
251 for (
size_t i = 0; i < np; ++i)
252 for (
size_t j = 0; j < npOther; ++j)
257 matr(i, npOther + j) = res[1];
258 matr(np + i, j) = res[2];
259 matr(np + i, npOther + j) = res[3];
272 std::vector<Point2D> selfVelo(pointsDb.
vtx.size());
274#pragma warning (push)
275#pragma warning (disable: 4101)
281#pragma omp parallel for default(none) shared(selfVelo, pointsDb, std::cout, IDPI) private(velI, tempVel)
282 for (
int i = 0; i < pointsDb.
vtx.size(); ++i)
317 for (
size_t i = 0; i < velo.size(); ++i)
318 velo[i] += selfVelo[i];
322void BoundaryLinLayerAver::GPUCalcConvVelocityToSetOfPointsFromSheets(
const WakeDataBase& pointsDb, std::vector<Point2D>& velo)
const
326 const size_t npt = pointsDb.
vtx.size();
327 double*& dev_ptr_pt = pointsDb.devVtxPtr;
335 double*& dev_ptr_r =
afl.devRPtr;
336 double*& dev_ptr_freeVortexSheet =
afl.devFreeVortexSheetPtr;
337 double*& dev_ptr_attachedVortexSheet =
afl.devAttachedVortexSheetPtr;
338 double*& dev_ptr_attachedSourceSheet =
afl.devAttachedSourceSheetPtr;
340 double*& dev_ptr_freeVortexSheetLin =
afl.devFreeVortexSheetLinPtr;
341 double*& dev_ptr_attachedVortexSheetLin =
afl.devAttachedVortexSheetLinPtr;
342 double*& dev_ptr_attachedSourceSheetLin =
afl.devAttachedSourceSheetLinPtr;
344 std::vector<Point2D>& Vel = velo;
345 std::vector<Point2D> newV(npt);
346 double*& dev_ptr_vel = pointsDb.devVelPtr;
351 cuCalculateConvVeloWakeFromVirtual(npt, dev_ptr_pt, npnl, dev_ptr_r, \
352 dev_ptr_freeVortexSheet, dev_ptr_freeVortexSheetLin, \
353 dev_ptr_attachedVortexSheet, dev_ptr_attachedVortexSheetLin, \
354 dev_ptr_attachedSourceSheet, dev_ptr_attachedSourceSheetLin, \
357 W.
getCuda().CopyMemFromDev<double, 2>(npt, dev_ptr_vel, (
double*)newV.data());
359 for (
size_t q = 0; q < Vel.size(); ++q)
400 double& velI = wakeRhs[0];
401 double& velILin = wakeRhs[1];
408 for (
size_t it = 0; it != count; ++it)
412 const double& gamJ = vt.g();
422 velI -= gamJ * alpha;
424 velILin -= gamJ * (alpha * (u1 & taui) + lambda * (u1 & (-taui.
kcross())));
432 double& velI = wakeRhs[0];
433 double& velILin = wakeRhs[1];
440 for (
size_t it = 0; it != count; ++it)
444 const double& gamJ = vt.g();
454 velI -= gamJ * lambda;
456 velILin -= gamJ * (alpha * (u1 & taui.
kcross()) + lambda * (u1 & taui) - 1.0);
519 vInfRhs.resize(2 * np);
521#pragma omp parallel for default(none) shared(vInfRhs, np)
522 for (
int i = 0; i < np; ++i)
Заголовочный файл с описанием класса Airfoil.
Заголовочный файл с описанием класса BoundaryLinLayerAver.
Заголовочный файл с функциями для метода GMRES.
Заголовочный файл с описанием класса MeasureVP.
Заголовочный файл с описанием класса Mechanics.
Заголовочный файл с описанием класса StreamParser.
Заголовочный файл с описанием класса Velocity.
Заголовочный файл с описанием класса Wake.
Заголовочный файл с описанием класса World2D.
Класс, определяющий форму профиля
double phiAfl
Поворот профиля
std::vector< double > len
Длины панелей профиля
const Point2D & getR(size_t q) const
Возврат константной ссылки на вершину профиля
const Point2D & getV(size_t q) const
Возврат константной ссылки на скорость вершины профиля
std::vector< Point2D > nrm
Нормали к панелям профиля
std::vector< Point2D > tau
Касательные к панелям профиля
size_t getNumberOfPanels() const
Возврат количества панелей на профиле
virtual void calcIQ(size_t p, const Airfoil &otherAirfoil, std::pair< Eigen::MatrixXd, Eigen::MatrixXd > &matrPair) const
Вычисление коэффициентов матрицы, состоящей из интегралов от (r-xi)/|r-xi|^2.
const size_t numberInPassport
Номер профиля в паспорте
virtual std::vector< double > getA(size_t p, size_t i, const Airfoil &airfoil, size_t j) const
Вычисление коэффициентов матрицы A для расчета влияния панели на панель
Абстрактный класс, определяющий способ удовлетворения граничного условия на обтекаемом профиле
Sheet oldSheets
Слои на профиле с предыдущего шага
const World2D & W
Константная ссылка на решаемую задачу
Sheet sheets
Слои на профиле
std::vector< std::pair< int, int > > vortexBeginEnd
Номера первого и последнего вихрей, рождаемых на каждой панели профиля (формируется после решения СЛА...
VirtualWake virtualWake
Виртуальный вихревой след конкретного профиля
const size_t numberInPassport
Номер профиля в паспорте
virtual void ComputeAttachedSheetsIntensity() override
Вычисление интенсивностей присоединенного вихревого слоя и присоединенного слоя источников
virtual void SolutionToFreeVortexSheetAndVirtualVortex(const Eigen::VectorXd &sol) override
Пересчет решения на интенсивность вихревого слоя и на рождаемые вихри на конкретном профиле
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 FillIQSelf(std::pair< Eigen::MatrixXd, Eigen::MatrixXd > &IQ) override
Генерация блока матрицы, состоящей из интегралов от (r-xi)/|r-xi|^2, влияние профиля самого на себя
virtual void GetInfluenceFromSourceSheetAtRectPanelToVortex(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 CalcConvVelocityToSetOfPointsFromSheets(const WakeDataBase &pointsDb, std::vector< Point2D > &velo) const override
Вычисление конвективных скоростей в наборе точек, вызываемых наличием слоев вихрей и источников на пр...
virtual void GetInfluenceFromVInfToRectPanel(std::vector< double > &vInfRhs) const override
Вычисление влияния набегающего потока на прямолинейную панель для правой части
virtual void GetInfluenceFromSourcesToRectPanel(size_t panel, const Vortex2D *ptr, ptrdiff_t count, std::vector< double > &wakeRhs) const override
Вычисление влияния части подряд источников из области течения на прямолинейную панель для правой част...
virtual void GetInfluenceFromVorticesToRectPanel(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
Вычисление влияния вихревых слоев (свободный + присоединенный) конкретной прямолинейной панели на вих...
WakeDiscretizationProperties wakeDiscretizationProperties
Структура с параметрами дискретизации вихревого следа
const double & attachedVortexSheet(size_t n, size_t moment) const
const double & attachedSourceSheet(size_t n, size_t moment) const
const double & freeVortexSheet(size_t n, size_t moment) const
std::vector< Point2D > vecHalfGamma
Скорость вихрей виртуального следа конкретного профиля (равна Gamma/2) используется для расчета давле...
std::vector< std::pair< size_t, size_t > > aflPan
Пара чисел: номер профиля и номер панели, на которой рожден виртуальный вихрь
Класс, опеделяющий набор вихрей
std::vector< Vortex2D > vtx
Список вихревых элементов
size_t getNumberOfAirfoil() const
Возврат количества профилей в задаче
const Airfoil & getAirfoil(size_t i) const
Возврат константной ссылки на объект профиля
const AirfoilGeometry & getOldAirfoil(size_t i) const
Возврат константной ссылки на объект старого профиля
Point2D getV0() const
Возврат текущей скорости набегающего потока
const Gpu & getCuda() const
Возврат константной ссылки на объект, связанный с видеокартой (GPU)
const Passport & getPassport() const
Возврат константной ссылки на паспорт
TimeDiscretizationProperties timeDiscretizationProperties
Структура с параметрами процесса интегрирования по времени
Класс, опеделяющий двумерный вихревой элемент
HD Point2D & r()
Функция для доступа к радиус-вектору вихря
HD double & g()
Функция для доступа к циркуляции вихря
size_t getCurrentStep() const
Возврат константной ссылки на параметры распараллеливания по MPI.
numvector< T, 2 > kcross() const
Геометрический поворот двумерного вектора на 90 градусов
auto length2() const -> typename std::remove_const< typename std::remove_reference< decltype(this->data[0])>::type >::type
Вычисление квадрата нормы (длины) вектора
numvector< T, n > & toZero(P val=0)
Установка всех компонент вектора в константу (по умолчанию — нуль)
auto unit(P newlen=1) const -> numvector< typename std::remove_const< decltype(this->data[0] *newlen)>::type, n >
Вычисление орта вектора или вектора заданной длины, коллинеарного данному
P length() const
Вычисление 2-нормы (длины) вектора
double Lambda(const Point2D &p, const Point2D &s)
Вспомогательная функция вычисления логарифма отношения норм векторов
double Alpha(const Point2D &p, const Point2D &s)
Вспомогательная функция вычисления угла между векторами
Point2D Omega(const Point2D &a, const Point2D &b, const Point2D &c)
Вспомогательная функция вычисления величины .
int minVortexPerPanel
Минимальное число вихрей, рождаемых на каждой панели профииля
double delta
Расстояние, на которое рождаемый вихрь отодвигается от профиля
double maxGamma
Максимально допустимая циркуляция вихря