85 std::pair<int, int> pair;
87 for (
size_t i = 0; i < np; ++i)
89 midNorm =
afl.
nrm[i] * delta;
91 size_t NEWnVortPerPan = (size_t)std::max((
int)std::ceil(fabs(sol(i) *
afl.
len[i]) / maxG), nVortPerPan);
98 for (
size_t j = 0; j < NEWnVortPerPan; ++j)
100 virtVort.
r() =
afl.
getR(i) + dr * (j * 1.0 + 0.5) + midNorm;
101 virtVort.
g() = sol(i) *
afl.
len[i] / NEWnVortPerPan;
113 for (
size_t j = 0; j < np; ++j)
124 for (
size_t i = 0; i < np; ++i)
130 for (
size_t i = 0; i < np; ++i)
131 for (
size_t j = 0; j < np; ++j)
146 matr(i, j) =
afl.
getA(1, i, otherBoundary.
afl, j)[0];
159 std::vector<Point2D> selfVelo(pointsDb.
vtx.size());
163#pragma warning (push)
164#pragma warning (disable: 4101)
171#pragma omp parallel for default(none) shared(selfVelo, cft, pointsDb, std::cout) private(velI, tempVel)
172 for (
int i = 0; i < pointsDb.
vtx.size(); ++i)
209 for (
size_t i = 0; i < velo.size(); ++i)
210 velo[i] += selfVelo[i];
215void BoundaryConstLayerAver::GPUCalcConvVelocityToSetOfPointsFromSheets(
const WakeDataBase& pointsDb, std::vector<Point2D>& velo)
const
219 const size_t npt = pointsDb.
vtx.size();
220 double*& dev_ptr_pt = pointsDb.devVtxPtr;
226 double*& dev_ptr_r =
afl.devRPtr;
227 double*& dev_ptr_freeVortexSheet =
afl.devFreeVortexSheetPtr;
228 double*& dev_ptr_attachedVortexSheet =
afl.devAttachedVortexSheetPtr;
229 double*& dev_ptr_attachedSourceSheet =
afl.devAttachedSourceSheetPtr;
231 double*& dev_ptr_freeVortexSheetLin =
afl.devFreeVortexSheetLinPtr;
232 double*& dev_ptr_attachedVortexSheetLin =
afl.devAttachedVortexSheetLinPtr;
233 double*& dev_ptr_attachedSourceSheetLin =
afl.devAttachedSourceSheetLinPtr;
235 std::vector<Point2D>& Vel = velo;
236 double*& dev_ptr_vel = pointsDb.devVelPtr;
242 cuCalculateConvVeloWakeFromVirtual(npt, dev_ptr_pt, npnl, dev_ptr_r, \
243 dev_ptr_freeVortexSheet, dev_ptr_freeVortexSheetLin, \
244 dev_ptr_attachedVortexSheet, dev_ptr_attachedVortexSheetLin, \
245 dev_ptr_attachedSourceSheet, dev_ptr_attachedSourceSheetLin, \
248 std::vector<Point2D> newV(Vel.size());
249 W.
getCuda().CopyMemFromDev<double, 2>(npt, dev_ptr_vel, (
double*)newV.data());
251 for (
size_t q = 0; q < Vel.size(); ++q)
296 double& velI = wakeRhs[0];
302 for (
size_t it = 0; it != count; ++it)
307 const double& gamJ = vt.
g();
314 velI -= gamJ * alpha;
323 double& velI = wakeRhs[0];
328 for (
size_t it = 0; it != count; ++it)
332 const double& gamJ = vt.
g();
339 velI -= gamJ * lambda;
402#pragma omp parallel for default(none) shared(vInfRhs, np)
403 for (
int i = 0; i < np; ++i)
Заголовочный файл с описанием класса Airfoil.
Заголовочный файл с описанием класса BoundaryConstLayerAver.
Заголовочный файл с описанием класса MeasureVP.
Заголовочный файл с описанием класса Mechanics.
Заголовочный файл с описанием класса StreamParser.
Заголовочный файл с описанием класса Velocity.
Заголовочный файл с описанием класса Wake.
Заголовочный файл с описанием класса World2D.
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 для расчета влияния панели на панель
virtual void FillMatrixFromOther(const Boundary &otherBoundary, Eigen::MatrixXd &matr) override
Генерация блока матрицы влияния от другого профиля того же типа
virtual void GetInfluenceFromSourcesToRectPanel(size_t panel, const Vortex2D *ptr, ptrdiff_t count, std::vector< double > &wakeRhs) const override
Вычисление влияния части подряд источников из области течения на прямолинейную панель для правой част...
virtual void ComputeAttachedSheetsIntensity() override
Вычисление интенсивностей присоединенного вихревого слоя и присоединенного слоя источников
virtual void FillIQSelf(std::pair< Eigen::MatrixXd, Eigen::MatrixXd > &IQ) override
Генерация блока матрицы, состоящей из интегралов от (r-xi)/|r-xi|^2, влияние профиля самого на себя
virtual void GetInfluenceFromSourceSheetAtRectPanelToVortex(size_t panel, const Vortex2D &ptr, Point2D &vel) const override
Вычисление влияния слоя источников конкретной прямолинейной панели на вихрь в области течения
virtual void FillIQFromOther(const Boundary &otherBoundary, std::pair< Eigen::MatrixXd, Eigen::MatrixXd > &IQ) override
Генерация блока матрицы, состоящей из интегралов от (r-xi)/|r-xi|^2, влияние одного профиля на другой
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 GetInfluenceFromVInfToRectPanel(std::vector< double > &vInfRhs) const override
Вычисление влияния набегающего потока на прямолинейную панель для правой части
virtual void CalcConvVelocityToSetOfPointsFromSheets(const WakeDataBase &pointsDb, std::vector< Point2D > &velo) const override
Вычисление конвективных скоростей в наборе точек, вызываемых наличием слоев вихрей и источников на пр...
virtual void GetInfluenceFromVorticesToRectPanel(size_t panel, const Vortex2D *ptr, ptrdiff_t count, std::vector< double > &wakeRhs) const override
Вычисление влияния части подряд идущих вихрей из вихревого следа на прямолинейную панель для правой ч...
virtual void SolutionToFreeVortexSheetAndVirtualVortex(const Eigen::VectorXd &sol) override
Пересчет решения на интенсивность вихревого слоя и на рождаемые вихри на конкретном профиле
Абстрактный класс, определяющий способ удовлетворения граничного условия на обтекаемом профиле
Sheet oldSheets
Слои на профиле с предыдущего шага
const World2D & W
Константная ссылка на решаемую задачу
Sheet sheets
Слои на профиле
std::vector< std::pair< int, int > > vortexBeginEnd
Номера первого и последнего вихрей, рождаемых на каждой панели профиля (формируется после решения СЛА...
VirtualWake virtualWake
Виртуальный вихревой след конкретного профиля
const size_t numberInPassport
Номер профиля в паспорте
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
size_t getSheetSize() 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
Возврат константной ссылки на объект профиля
Point2D getV0() const
Возврат текущей скорости набегающего потока
const Gpu & getCuda() const
Возврат константной ссылки на объект, связанный с видеокартой (GPU)
const Passport & getPassport() const
Возврат константной ссылки на паспорт
Класс, опеделяющий двумерный вихревой элемент
HD Point2D & r()
Функция для доступа к радиус-вектору вихря
HD double & g()
Функция для доступа к циркуляции вихря
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 >
Вычисление орта вектора или вектора заданной длины, коллинеарного данному
double Lambda(const Point2D &p, const Point2D &s)
Вспомогательная функция вычисления логарифма отношения норм векторов
double Alpha(const Point2D &p, const Point2D &s)
Вспомогательная функция вычисления угла между векторами
int minVortexPerPanel
Минимальное число вихрей, рождаемых на каждой панели профииля
double delta
Расстояние, на которое рождаемый вихрь отодвигается от профиля
double maxGamma
Максимально допустимая циркуляция вихря
double eps2
Квадрат радиуса вихря