95 std::pair<int, int> pair;
97 for (
size_t i = 0; i < np; ++i)
99 midNorm =
afl.
nrm[i] * delta;
100 size_t iNext = (i < np-1) ? i + 1 : 0;
101 size_t iPrev = (i > 0) ? i - 1 : np - 1;
111 virtVort.
g() = Gamma / NEWnVortPerPan;
113 for (
size_t j = 0; j < NEWnVortPerPan; ++j)
138 for (
size_t i = 0; i < np; ++i)
145 #pragma omp parallel for shared(matr) 146 for (
int i = 0; i < np; ++i)
147 for (
size_t j = 0; j < np; ++j)
161 #pragma omp parallel for shared(matr) 180 std::vector<Point2D> selfVelo(pointsDb.
vtx.size());
184 #pragma warning (push) 185 #pragma warning (disable: 4101) 190 #pragma warning (pop) 192 #pragma omp parallel for default(none) shared(selfVelo, pointsDb, cft, std::cout) private(velI, tempVel) 193 for (
int i = 0; i < pointsDb.
vtx.size(); ++i)
229 for (
size_t i = 0; i < velo.size(); ++i)
230 velo[i] += selfVelo[i];
234 #if defined(USE_CUDA) 235 void BoundaryVortexCollocN::GPUCalcConvVelocityToSetOfPointsFromSheets(
const WakeDataBase& pointsDb, std::vector<Point2D>& velo)
const 239 const size_t npt = pointsDb.
vtx.size();
240 double*& dev_ptr_pt = pointsDb.devVtxPtr;
246 double*& dev_ptr_r =
afl.devRPtr;
247 double*& dev_ptr_freeVortexSheet =
afl.devFreeVortexSheetPtr;
248 double*& dev_ptr_attachedVortexSheet =
afl.devAttachedVortexSheetPtr;
249 double*& dev_ptr_attachedSourceSheet =
afl.devAttachedSourceSheetPtr;
251 std::vector<Point2D>& Vel = velo;
252 std::vector<Point2D> newV(npt);
253 double*& dev_ptr_vel = pointsDb.devVelPtr;
260 cuCalculateConvVeloWakeFromVirtual(npt, dev_ptr_pt, npnl, dev_ptr_r, dev_ptr_freeVortexSheet, dev_ptr_attachedVortexSheet, dev_ptr_attachedSourceSheet, dev_ptr_vel, eps2);
264 W.
getCuda().CopyMemFromDev<double, 2>(npt, dev_ptr_vel, (
double*)newV.data());
267 for (
size_t q = 0; q < Vel.size(); ++q)
278 std::vector<Point2D>& Vel = velo;
282 #pragma omp parallel for default(none) shared(Vel) 283 for (
int i = 0; i < (int)Vel.size(); ++i)
311 double& velI = wakeRhs[0];
315 for (
size_t it = 0; it != count; ++it)
320 const double& gamJ = vt.
g();
334 double& velI = wakeRhs[0];
338 for (
size_t it = 0; it != count; ++it)
343 const double& gamJ = vt.
g();
409 #pragma omp parallel for default(none) shared(vInfRhs, np) 410 for (
int i = 0; i < np; ++i)
const double & freeVortexSheet(size_t n, size_t moment) const
virtual void CalcConvVelocityToSetOfPointsFromSheets(const WakeDataBase &pointsDb, std::vector< Point2D > &velo) const override
Вычисление конвективных скоростей в наборе точек, вызываемых наличием слоев вихрей и источников на пр...
Заголовочный файл с описанием класса Passport (двумерный) и cоответствующими структурами ...
virtual void FillIQFromOther(const Boundary &otherBoundary, std::pair< Eigen::MatrixXd, Eigen::MatrixXd > &IQ) override
Генерация блока матрицы, состоящей из интегралов от (r-xi)/|r-xi|^2, влияние одного профиля на другой...
const double & attachedVortexSheet(size_t n, size_t moment) const
virtual void FillMatrixSelf(Eigen::MatrixXd &matr, Eigen::VectorXd &lastLine, Eigen::VectorXd &lactCol) override
Генерация блока матрицы
Заголовочный файл с описанием класса Wake.
virtual void GetInfluenceFromVorticesToRectPanel(size_t panel, const Vortex2D *ptr, ptrdiff_t count, std::vector< double > &wakeRhs) const override
Вычисление влияния части подряд идущих вихрей из вихревого следа на прямолинейную панель для правой ч...
double delta
Расстояние, на которое рождаемый вихрь отодвигается от профиля
Заголовочный файл с описанием класса World2D.
virtual void GetInfluenceFromVInfToRectPanel(std::vector< double > &vInfRhs) const override
Вычисление влияния набегающего потока на прямолинейную панель для правой части
Заголовочный файл с описанием класса Airfoil.
double maxGamma
Максимально допустимая циркуляция вихря
Абстрактный класс, определяющий способ удовлетворения граничного условия на обтекаемом профиле ...
std::vector< Point2D > vecHalfGamma
Скорость вихрей виртуального следа конкретного профиля (равна Gamma/2) используется для расчета давле...
const size_t numberInPassport
Номер профиля в паспорте
Заголовочный файл с описанием класса Mechanics.
PhysicalProperties physicalProperties
Структура с физическими свойствами задачи
const Point2D & getR(size_t q) const
Возврат константной ссылки на вершину профиля
const Point2D & getV(size_t q) const
Возврат константной ссылки на скорость вершины профиля
HD Point2D & r()
Функция для доступа к радиус-вектору вихря
HD double & g()
Функция для доступа к циркуляции вихря
double Alpha(const Point2D &p, const Point2D &s)
Вспомогательная функция вычисления угла между векторами
size_t getNumberOfPanels() const
Возврат количества панелей на профиле
auto length2() const -> typename std::remove_const< typename std::remove_reference< decltype(this->data[0])>::type >::type
Вычисление квадрата нормы (длины) вектора
Заголовочный файл с описанием класса BoundaryVortexCollocN.
BoundaryVortexCollocN(const World2D &W_, size_t numberInPassport_)
Конструктор
virtual void FillMatrixFromOther(const Boundary &otherBoundary, Eigen::MatrixXd &matr) override
Генерация блока матрицы влияния от другого профиля того же типа
std::vector< std::pair< size_t, size_t > > aflPan
Пара чисел: номер профиля и номер панели, на которой рожден виртуальный вихрь
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
Вычисление влияния вихревых слоев (свободный + присоединенный) конкретной прямолинейной панели на вих...
size_t getNumberOfAirfoil() const
Возврат количества профилей в задаче
virtual void CalcConvVelocityAtVirtualVortexes(std::vector< Point2D > &velo) const override
Вычисление конвективной скорости в точках расположения виртуальных вихрей
virtual void SolutionToFreeVortexSheetAndVirtualVortex(const Eigen::VectorXd &sol) override
Пересчет решения на интенсивность вихревого слоя и на рождаемые вихри на конкретном профиле ...
Заголовочный файл с описанием класса StreamParser.
std::vector< Vortex2D > vtx
Список вихревых элементов
size_t getSheetSize() const
Класс, опеделяющий двумерный вектор
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
Слои на профиле с предыдущего шага
const Passport & getPassport() const
Возврат константной ссылки на паспорт
virtual void ComputeAttachedSheetsIntensity() override
Вычисление интенсивностей присоединенного вихревого слоя и присоединенного слоя источников ...
const Gpu & getCuda() const
Возврат константной ссылки на объект, связанный с видеокартой (GPU)
std::vector< Point2D > c
Контрольные точки - центры панелей
Класс, опеделяющий двумерный вихревой элемент
int minVortexPerPanel
Минимальное число вихрей, рождаемых на каждой панели профииля
virtual void GetInfluenceFromSourcesToRectPanel(size_t panel, const Vortex2D *ptr, ptrdiff_t count, std::vector< double > &wakeRhs) const override
Вычисление влияния части подряд источников из области течения на прямолинейную панель для правой част...
VirtualWake virtualWake
Виртуальный вихревой след конкретного профиля
virtual void FillIQSelf(std::pair< Eigen::MatrixXd, Eigen::MatrixXd > &IQ) override
Генерация блока матрицы, состоящей из интегралов от (r-xi)/|r-xi|^2, влияние профиля самого на себя ...
std::vector< Point2D > nrm
Нормали к панелям профиля
const Airfoil & getAirfoil(size_t i) const
Возврат константной ссылки на объект профиля
Point2D V0() const
Функция скорости набегающего потока с учетом разгона
Класс, опеделяющий текущую решаемую задачу
Класс, опеделяющий набор вихрей
numvector< T, n > & toZero(P val=0)
Установка всех компонент вектора в константу (по умолчанию — нуль)
WakeDiscretizationProperties wakeDiscretizationProperties
Структура с параметрами дискретизации вихревого следа
std::vector< double > len
Длины панелей профиля
Заголовочный файл с описанием класса Velocity.
std::vector< std::pair< int, int > > vortexBeginEnd
Номера первого и последнего вихрей, рождаемых на каждой панели профиля (формируется после решения СЛА...
const World2D & W
Константная ссылка на решаемую задачу
virtual void GetInfluenceFromSourceSheetAtRectPanelToVortex(size_t panel, const Vortex2D &ptr, Point2D &vel) const override
Вычисление влияния слоя источников конкретной прямолинейной панели на вихрь в области течения ...
double eps2
Квадрат радиуса вихря
numvector< T, 2 > kcross() const
Геометрический поворот двумерного вектора на 90 градусов