95 W.
getCuda().CopyMemToDev<double, 2>(velo.size(), (
double*)velo.data(), pointsDb.devVelPtr);
97 W.
getCuda().CopyMemToDev<double, 1>(domainRadius.size(), domainRadius.data(), pointsDb.devRadPtr);
135 std::vector<Point2D> selfVelo(pointsDb.
vtx.size());
136 domainRadius.resize(pointsDb.
vtx.size());
140#pragma warning (push)
141#pragma warning (disable: 4101)
145 double dst2eps, dst2;
150#pragma omp parallel for default(none) shared(selfVelo, cft, calcVelo, calcRadius, pointsDb, domainRadius) private(tempVel, velI, dst2, dst2eps) schedule(dynamic, DYN_SCHEDULE)
151 for (
int i = 0; i < pointsDb.
vtx.size(); ++i)
153 double ee2[3] = { 10000.0, 10000.0, 10000.0 };
159 for (
size_t j = 0; j <
W.
getWake().vtx.size(); ++j)
163 dst2 = (posI - posJ).length2();
176 tempVel = { -posI[1] + posJ[1], posI[0] - posJ[0] };
177 tempVel *= (gamJ / dst2eps);
188 dst2 = dist2(posI, posJ);
191 tempVel = { posI[0] - posJ[0], posI[1] - posJ[1] };
192 tempVel *= (gamJ / dst2eps);
256 for (
size_t i = 0; i < velo.size(); ++i)
257 velo[i] += selfVelo[i];
261 W.
getCuda().CopyMemToDev<double, 2>(velo.size(), (
double*)velo.data(), pointsDb.devVelPtr);
272double VelocityBarnesHut::GPUCalcConvVeloToSetOfPointsFromWake(std::unique_ptr<BHcu::CudaTreeInfo>& cntrTree,
const WakeDataBase& pointsDb, std::vector<Point2D>& velo, std::vector<double>& domainRadius,
bool calcVelo,
bool calcRadius)
277 int npt = cntrTree->nObject;
279 float tBLD = 0.0f, tUPW = 0.0f, tDNV;
281 auto& inflTree = *
W.
getCuda().inflTreeWake;
286 if (cntrTree->nObject > 1024 * 80)
287 tDNV = inflTree.DownwardTraversalVorticesToPoints<1024>(*cntrTree, (
Point2D*)pointsDb.devVelPtr, pointsDb.devRadPtr, theta, order, calcRadius);
289 tDNV = inflTree.DownwardTraversalVorticesToPoints<32>(*cntrTree, (
Point2D*)pointsDb.devVelPtr, pointsDb.devRadPtr, theta, order, calcRadius);
297 std::vector<Point2D> Vel;
301 W.
getCuda().CopyMemFromDev<double, 2>(npt, (
double*)pointsDb.devVelPtr, (
double*)Vel.data(), 20);
303 for (
size_t q = 0; q < npt; ++q)
308 W.
getCuda().CopyMemFromDev<double, 1>(npt, pointsDb.devRadPtr, domainRadius.data(), 212);
314void VelocityBarnesHut::GPUCalcConvVelocityToSetOfPointsFromSheets(std::unique_ptr<BHcu::CudaTreeInfo>& cntrTree,
const WakeDataBase& pointsDb, std::vector<Point2D>& velo)
const
316 double*& velD = pointsDb.devVelPtr;
321 std::vector<Point2D> newV(velo.size());
323 int npt = cntrTree->nObject;
333 W.
getCuda().inflTreePnlVortex->DownwardTraversalPanelsToPoints(*cntrTree, (
Point2D*)velD, theta, order);
334 W.
getCuda().CopyMemFromDev<double, 2>(npt, velD, (
double*)newV.data());
336 for (
size_t q = 0; q < velo.size(); ++q)
342 W.
getCuda().inflTreePnlSource->DownwardTraversalPanelsToPoints(*cntrTree, (
Point2D*)velD, theta, order);
343 W.
getCuda().CopyMemFromDev<double, 2>(npt, velD, (
double*)newV.data());
345 for (
size_t q = 0; q < velo.size(); ++q)
Заголовочный файл с описанием класса Airfoil.
Заголовочный файл с описанием класса Boundary.
Заголовочный файл с функциями для метода GMRES.
Заголовочный файл с описанием класса MeasureVP.
Заголовочный файл с описанием класса Mechanics.
Заголовочный файл с описанием класса StreamParser.
void ModifyE2(double *ee2, double dst2)
Заголовочный файл с описанием класса VelocityBarnesHut.
Заголовочный файл с описанием класса Wake.
Заголовочный файл с описанием класса World2D.
size_t getNumberOfPanels() const
Возврат количества панелей на профиле
float DownwardTraversalVorticesToPoints(CpuTreeInfo &cntrTree, std::vector< Point2D > &vel, std::vector< double > &epsast, double theta, int order, bool calcRadius)
PhysicalProperties physicalProperties
Структура с физическими свойствами задачи
NumericalSchemes numericalSchemes
Структура с используемыми численными схемами
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
virtual float CalcConvVeloToSetOfPointsFromWake(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
Возврат константной ссылки на паспорт
CpuTreeInfo & getCntrTreeWake() const
CpuTreeInfo & getInflTreeWake() const
double getCurrentTime() const
numvector< T, n > & toZero(P val=0)
Установка всех компонент вектора в константу (по умолчанию — нуль)
const vmTimer & stop() const
Останов работающего счетчика времени
const vmTimer & start() const
Запуск (первый или повторный) счетчика времени
const vmTimer & reset() const
Сброс счетчика времени
double boundDenom(double r2, double eps2)
Способ сглаживания скорости вихря (вихрь Рэнкина или вихрь Ламба)
double accelCft(double currentTime) const
Функция-множитель, позволяющая моделировать разгон