94 std::pair<int, int> pair;
96 for (
size_t i = 0; i < np; ++i)
98 midNorm =
afl.
nrm[i] * delta;
99 size_t iNext = (i < np-1) ? i + 1 : 0;
100 size_t iPrev = (i > 0) ? i - 1 : np - 1;
110 virtVort.
g() = Gamma / NEWnVortPerPan;
112 for (
size_t j = 0; j < NEWnVortPerPan; ++j)
137 for (
size_t i = 0; i < np; ++i)
144#pragma omp parallel for shared(matr)
145 for (
int i = 0; i < np; ++i)
146 for (
size_t j = 0; j < np; ++j)
160#pragma omp parallel for shared(matr)
179 std::vector<Point2D> selfVelo(pointsDb.
vtx.size());
183#pragma warning (push)
184#pragma warning (disable: 4101)
191#pragma omp parallel for default(none) shared(selfVelo, pointsDb, cft, std::cout) private(velI, tempVel)
192 for (
int i = 0; i < pointsDb.
vtx.size(); ++i)
228 for (
size_t i = 0; i < velo.size(); ++i)
229 velo[i] += selfVelo[i];
234void BoundaryVortexCollocN::GPUCalcConvVelocityToSetOfPointsFromSheets(
const WakeDataBase& pointsDb, std::vector<Point2D>& velo)
const
238 const size_t npt = pointsDb.
vtx.size();
239 double*& dev_ptr_pt = pointsDb.devVtxPtr;
245 double*& dev_ptr_r =
afl.devRPtr;
246 double*& dev_ptr_freeVortexSheet =
afl.devFreeVortexSheetPtr;
247 double*& dev_ptr_attachedVortexSheet =
afl.devAttachedVortexSheetPtr;
248 double*& dev_ptr_attachedSourceSheet =
afl.devAttachedSourceSheetPtr;
250 double*& dev_ptr_freeVortexSheetLin =
afl.devFreeVortexSheetLinPtr;
251 double*& dev_ptr_attachedVortexSheetLin =
afl.devAttachedVortexSheetLinPtr;
252 double*& dev_ptr_attachedSourceSheetLin =
afl.devAttachedSourceSheetLinPtr;
254 std::vector<Point2D>& Vel = velo;
255 std::vector<Point2D> newV(npt);
256 double*& dev_ptr_vel = pointsDb.devVelPtr;
263 cuCalculateConvVeloWakeFromVirtual(npt, dev_ptr_pt, npnl, dev_ptr_r, \
264 dev_ptr_freeVortexSheet, dev_ptr_freeVortexSheetLin, \
265 dev_ptr_attachedVortexSheet, dev_ptr_attachedVortexSheetLin, \
266 dev_ptr_attachedSourceSheet, dev_ptr_attachedSourceSheetLin, \
271 W.
getCuda().CopyMemFromDev<double, 2>(npt, dev_ptr_vel, (
double*)newV.data());
274 for (
size_t q = 0; q < Vel.size(); ++q)
304 double& velI = wakeRhs[0];
308 for (
size_t it = 0; it != count; ++it)
313 const double& gamJ = vt.
g();
327 double& velI = wakeRhs[0];
331 for (
size_t it = 0; it != count; ++it)
336 const double& gamJ = vt.
g();
402#pragma omp parallel for default(none) shared(vInfRhs, np)
403 for (
int i = 0; i < np; ++i)
Заголовочный файл с описанием класса Airfoil.
Заголовочный файл с описанием класса BoundaryVortexCollocN.
Заголовочный файл с описанием класса 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
Возврат количества панелей на профиле
const size_t numberInPassport
Номер профиля в паспорте
Абстрактный класс, определяющий способ удовлетворения граничного условия на обтекаемом профиле
Sheet oldSheets
Слои на профиле с предыдущего шага
const World2D & W
Константная ссылка на решаемую задачу
Sheet sheets
Слои на профиле
std::vector< std::pair< int, int > > vortexBeginEnd
Номера первого и последнего вихрей, рождаемых на каждой панели профиля (формируется после решения СЛА...
VirtualWake virtualWake
Виртуальный вихревой след конкретного профиля
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 GetInfluenceFromVorticesToRectPanel(size_t panel, const Vortex2D *ptr, ptrdiff_t count, std::vector< double > &wakeRhs) const override
Вычисление влияния части подряд идущих вихрей из вихревого следа на прямолинейную панель для правой ч...
virtual void SolutionToFreeVortexSheetAndVirtualVortex(const Eigen::VectorXd &sol) override
Пересчет решения на интенсивность вихревого слоя и на рождаемые вихри на конкретном профиле
virtual void FillIQFromOther(const Boundary &otherBoundary, std::pair< Eigen::MatrixXd, Eigen::MatrixXd > &IQ) override
Генерация блока матрицы, состоящей из интегралов от (r-xi)/|r-xi|^2, влияние одного профиля на другой
virtual void GetInfluenceFromSourcesToRectPanel(size_t panel, const Vortex2D *ptr, ptrdiff_t count, std::vector< double > &wakeRhs) const override
Вычисление влияния части подряд источников из области течения на прямолинейную панель для правой част...
virtual void GetInfluenceFromVInfToRectPanel(std::vector< double > &vInfRhs) const override
Вычисление влияния набегающего потока на прямолинейную панель для правой части
virtual void ComputeAttachedSheetsIntensity() override
Вычисление интенсивностей присоединенного вихревого слоя и присоединенного слоя источников
virtual void FillIQSelf(std::pair< Eigen::MatrixXd, Eigen::MatrixXd > &IQ) override
Генерация блока матрицы, состоящей из интегралов от (r-xi)/|r-xi|^2, влияние профиля самого на себя
BoundaryVortexCollocN(const World2D &W_, size_t numberInPassport_)
Конструктор
virtual void CalcConvVelocityToSetOfPointsFromSheets(const WakeDataBase &pointsDb, std::vector< Point2D > &velo) const override
Вычисление конвективных скоростей в наборе точек, вызываемых наличием слоев вихрей и источников на пр...
virtual void GetInfluenceFromSourceSheetAtRectPanelToVortex(size_t panel, const Vortex2D &ptr, Point2D &vel) const override
Вычисление влияния слоя источников конкретной прямолинейной панели на вихрь в области течения
std::vector< Point2D > c
Контрольные точки - центры панелей
virtual void FillMatrixFromOther(const Boundary &otherBoundary, Eigen::MatrixXd &matr) 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
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
Квадрат радиуса вихря