72 int nCores = omp_get_max_threads();
81 double timeBuildTree = 0.0, timeRect = 0.0, timeSummarization = 0.0, timeComputation = 0.0;
83 BH.BuildEnclosingRectangle(timeRect);
84 BH.InfluenceComputation(velo, domainRadius, timeSummarization, timeComputation, calcRadius);
90 W.
getCuda().CopyMemToDev<double, 2>(velo.size(), (
double*)velo.data(), pointsDb.devVelPtr);
92 W.
getCuda().CopyMemToDev<double, 1>(domainRadius.size(), domainRadius.data(), pointsDb.devRadPtr);
103 std::vector<Point2D> selfVelo(pointsDb.
vtx.size());
104 domainRadius.resize(pointsDb.
vtx.size());
108#pragma warning (push)
109#pragma warning (disable: 4101)
113 double dst2eps, dst2;
120#pragma omp parallel for default(none) shared(selfVelo, cft, calcVelo, calcRadius, eps2, pointsDb, domainRadius) private(tempVel, velI, dst2, dst2eps) schedule(dynamic, DYN_SCHEDULE)
121 for (
int i = 0; i < pointsDb.
vtx.size(); ++i)
123 double ee2[3] = { 10000.0, 10000.0, 10000.0 };
129 for (
size_t j = 0; j <
W.
getWake().vtx.size(); ++j)
133 dst2 = (posI - posJ).length2();
146 tempVel = { -posI[1] + posJ[1], posI[0] - posJ[0] };
147 tempVel *= (gamJ / dst2eps);
158 dst2 = dist2(posI, posJ);
161 tempVel = { posI[0] - posJ[0], posI[1] - posJ[1] };
162 tempVel *= (gamJ / dst2eps);
226 for (
size_t i = 0; i < velo.size(); ++i)
227 velo[i] += selfVelo[i];
231 W.
getCuda().CopyMemToDev<double, 2>(velo.size(), (
double*)velo.data(), pointsDb.devVelPtr);
242void VelocityBarnesHut::GPUCalcConvVeloToSetOfPointsFromWake(std::unique_ptr<BHcu::CudaTreeInfo>& cntrTree,
const WakeDataBase& pointsDb, std::vector<Point2D>& velo, std::vector<double>& domainRadius,
bool calcVelo,
bool calcRadius)
248 int npt = cntrTree->nObject;
250 float tBLD = 0.0f, tUPW = 0.0f, tDNV;
252 auto& inflTree = *
W.
getCuda().inflTreeWake;
254 tDNV = inflTree.DownwardTraversalVorticesToPoints(*cntrTree, (
Point2D*)pointsDb.devVelPtr, pointsDb.devRadPtr, eps2, theta, order, calcRadius);
261 std::vector<Point2D> Vel;
265 W.
getCuda().CopyMemFromDev<double, 2>(npt, (
double*)pointsDb.devVelPtr, (
double*)Vel.data(), 20);
267 for (
size_t q = 0; q < npt; ++q)
272 W.
getCuda().CopyMemFromDev<double, 1>(npt, pointsDb.devRadPtr, domainRadius.data(), 212);
276void VelocityBarnesHut::GPUCalcConvVelocityToSetOfPointsFromSheets(std::unique_ptr<BHcu::CudaTreeInfo>& cntrTree,
const WakeDataBase& pointsDb, std::vector<Point2D>& velo)
const
278 double*& velD = pointsDb.devVelPtr;
284 std::vector<Point2D> newV(velo.size());
286 int npt = cntrTree->nObject;
296 W.
getCuda().inflTreePnlVortex->DownwardTraversalPanelsToPoints(*cntrTree, (
Point2D*)velD, eps2, theta, order);
297 W.
getCuda().CopyMemFromDev<double, 2>(npt, velD, (
double*)newV.data());
299 for (
size_t q = 0; q < velo.size(); ++q)
305 W.
getCuda().inflTreePnlSource->DownwardTraversalPanelsToPoints(*cntrTree, (
Point2D*)velD, eps2, theta, order);
306 W.
getCuda().CopyMemFromDev<double, 2>(npt, velD, (
double*)newV.data());
308 for (
size_t q = 0; q < velo.size(); ++q)
Заголовочный файл с описанием класса Airfoil.
Заголовок основного класса BarnesHut.
Заголовочный файл с описанием класса Boundary.
Заголовочный файл с описанием класса MeasureVP.
Заголовочный файл с описанием класса Mechanics.
Заголовочный файл с описанием класса StreamParser.
Заголовочный файл с описанием класса VelocityBarnesHut.
Заголовочный файл с описанием класса Wake.
Заголовочный файл с описанием класса World2D.
Класс, определяющий основной алгоритм модификации метода Барнса - Хата
Класс, содержащий параметры метода Баонса - Хата для CPU.
double eps
Радиус вихревого элемента
int NumOfLevelsVortex
Максимальное количество уровней дерева
double theta
Параметр точности
int order
Точность расчета скоростей:
double eps2
Квадрат радиуса вихревого элемента
size_t getNumberOfPanels() const
Возврат количества панелей на профиле
PhysicalProperties physicalProperties
Структура с физическими свойствами задачи
WakeDiscretizationProperties wakeDiscretizationProperties
Структура с параметрами дискретизации вихревого следа
NumericalSchemes numericalSchemes
Структура с используемыми численными схемами
virtual void CalcConvVeloToSetOfPointsFromWake(const WakeDataBase &pointsDb, std::vector< Point2D > &velo, std::vector< double > &domainRadius, bool calcVelo, bool calcRadius) override
Вычисление конвективных скоростей и радиусов вихревых доменов в заданном наборе точек от следа
VelocityBarnesHut(const World2D &W_)
Конструктор
virtual ~VelocityBarnesHut()
Деструктор
virtual void CalcConvVPVeloToSetOfPointsFromWake(const WakeDataBase &pointsDb, std::vector< Point2D > &velo, std::vector< double > &domainRadius, bool calcVelo, bool calcRadius) override
Абстрактный класс, определяющий способ вычисления скоростей
const World2D & W
Константная ссылка на решаемую задачу
Класс, опеделяющий набор вихрей
std::vector< Vortex2D > vtx
Список вихревых элементов
Класс, опеделяющий текущую решаемую задачу
size_t getNumberOfAirfoil() const
Возврат количества профилей в задаче
bool isAnyMovableOrDeformable() const
Возврат признака того, что хотя бы один из профилей подвижный или деформируемый
const Wake & getWake() const
Возврат константной ссылки на вихревой след
const Airfoil & getAirfoil(size_t i) const
Возврат константной ссылки на объект профиля
const WakeDataBase & getSource() const
Возврат константной ссылки на источники в области течения
const Gpu & getCuda() const
Возврат константной ссылки на объект, связанный с видеокартой (GPU)
const Passport & getPassport() const
Возврат константной ссылки на паспорт
double getCurrentTime() const
numvector< T, n > & toZero(P val=0)
Установка всех компонент вектора в константу (по умолчанию — нуль)
double boundDenom(double r2, double eps2)
Способ сглаживания скорости вихря (вихрь Рэнкина или вихрь Ламба)
double accelCft(double currentTime) const
Функция-множитель, позволяющая моделировать разгон
double eps2
Квадрат радиуса вихря