83 std::pair<int, int> pair;
87 midNorm =
afl.
nrm[i] * delta;
98 if (fabs(a - b) < 1e-10)
100 size_t NEWnVortPerPan = (size_t)std::max((
int)std::ceil(fabs(sol(i)*
afl.
len[i]) / maxG), nVortPerPan);
103 for (
size_t j = 0; j < NEWnVortPerPan; ++j)
105 virtVort.
r() =
afl.
getR(i) + dr * (j * 1.0 + 0.5) + midNorm;
106 virtVort.
g() = sol(i) *
afl.
len[i] / NEWnVortPerPan;
113 else if (a * b >= 0.0)
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);
118 for (
size_t k = 1; k <= NEWnVortPerPan; ++k)
120 if ((a > 0) || (b > 0))
121 ds[k] =
afl.
len[i] / (a - b) * (a - sqrt((b*b * k + a * a*(NEWnVortPerPan - k)) / NEWnVortPerPan));
123 ds[k] =
afl.
len[i] / (a - b) * (a + sqrt((b*b * k + a * a*(NEWnVortPerPan - k)) / NEWnVortPerPan));
126 for (
size_t j = 0; j < NEWnVortPerPan; ++j)
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;
138 double sast = -a *
afl.
len[i] / (b - a);
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);
145 for (
size_t k = 1; k <= NEWnVortPerPan; ++k)
148 ds[k] = sast / (a - 0.0) * (a - sqrt((a * a*(NEWnVortPerPan - k)) / NEWnVortPerPan));
150 ds[k] = sast / (a - 0.0) * (a + sqrt((a * a*(NEWnVortPerPan - k)) / NEWnVortPerPan));
153 for (
size_t j = 0; j < NEWnVortPerPan; ++j)
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;
164 double sastast =
afl.
len[i] - sast;
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);
171 for (
size_t k = 1; k <= NEWnVortPerPan; ++k)
174 ds[k] = sastast / (0.0 - b) * (0.0 - sqrt((b*b * k) / NEWnVortPerPan));
176 ds[k] = sastast / (0.0 - b) * (0.0 + sqrt((b*b * k) / NEWnVortPerPan));
179 for (
size_t j = 0; j < NEWnVortPerPan; ++j)
182 virtVort.
g() = 0.5 * (0.0 + b) * sastast / NEWnVortPerPan;
212 std::vector<double> res(4, 0.0);
214 for (
size_t i = 0; i < np; ++i)
218 lastCol(np + i) = 0.0;
219 lastLine(np + i) = 0.0;
224 for (
size_t i = 0; i < np; ++i)
225 for (
size_t j = 0; j < np; ++j)
229 matr(i, np + j) = res[1];
230 matr(np + i, j) = res[2];
231 matr(np + i, np + j) = res[3];
248 std::vector<double> res(4, 0.0);
250 for (
size_t i = 0; i < np; ++i)
251 for (
size_t j = 0; j < npOther; ++j)
256 matr(i, npOther + j) = res[1];
257 matr(np + i, j) = res[2];
258 matr(np + i, npOther + j) = res[3];
271 std::vector<Point2D> selfVelo(pointsDb.
vtx.size());
273#pragma warning (push)
274#pragma warning (disable: 4101)
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)
316 for (
size_t i = 0; i < velo.size(); ++i)
317 velo[i] += selfVelo[i];
321void BoundaryLinLayerAver::GPUCalcConvVelocityToSetOfPointsFromSheets(
const WakeDataBase& pointsDb, std::vector<Point2D>& velo)
const
325 const size_t npt = pointsDb.
vtx.size();
326 double*& dev_ptr_pt = pointsDb.devVtxPtr;
334 double*& dev_ptr_r =
afl.devRPtr;
335 double*& dev_ptr_freeVortexSheet =
afl.devFreeVortexSheetPtr;
336 double*& dev_ptr_attachedVortexSheet =
afl.devAttachedVortexSheetPtr;
337 double*& dev_ptr_attachedSourceSheet =
afl.devAttachedSourceSheetPtr;
339 double*& dev_ptr_freeVortexSheetLin =
afl.devFreeVortexSheetLinPtr;
340 double*& dev_ptr_attachedVortexSheetLin =
afl.devAttachedVortexSheetLinPtr;
341 double*& dev_ptr_attachedSourceSheetLin =
afl.devAttachedSourceSheetLinPtr;
343 std::vector<Point2D>& Vel = velo;
344 std::vector<Point2D> newV(npt);
345 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.
Заголовочный файл с описанием класса 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
Максимально допустимая циркуляция вихря
double eps2
Квадрат радиуса вихря