95 std::vector<Point2D> selfVelo(pointsDb.
vtx.size());
96 domainRadius.resize(pointsDb.
vtx.size());
100#pragma warning (push)
101#pragma warning (disable: 4101)
105 double dst2eps, dst2;
112#pragma omp parallel for default(none) shared(selfVelo, cft, calcVelo, calcRadius, eps2, pointsDb, domainRadius) private(tempVel, velI, dst2, dst2eps) schedule(dynamic, DYN_SCHEDULE)
113 for (
int i = 0; i < pointsDb.
vtx.size(); ++i)
115 double ee2[3] = { 10000.0, 10000.0, 10000.0 };
121 for (
size_t j = 0; j <
W.
getWake().vtx.size(); ++j)
125 dst2 = (posI - posJ).length2();
138 tempVel = { -posI[1] + posJ[1], posI[0] - posJ[0] };
139 tempVel *= (gamJ / dst2eps);
150 dst2 = dist2(posI, posJ);
153 tempVel = { posI[0] - posJ[0], posI[1] - posJ[1] };
154 tempVel *= (gamJ / dst2eps);
164 for (
size_t j = 0; j < bou.virtualWake.vtx.size(); ++j)
165 ModifyE2(ee2, dist2(posI, bou.virtualWake.vtx[j].r()));
175 domainRadius[i] = 1.0 * sqrt((ee2[0] + ee2[1] + ee2[2]) / 3.0);
181#pragma omp parallel for default(none) shared(selfVelo, cft, calcVelo, calcRadius, pointsDb, domainRadius) private(tempVel, velI, dst2) schedule(dynamic, DYN_SCHEDULE)
182 for (
int i = 0; i < pointsDb.
vtx.size(); ++i)
184 double ee2[3] = { 10000.0, 10000.0, 10000.0 };
190 for (
size_t j = 0; j <
W.
getWake().vtx.size(); ++j)
194 dst2 = dist2(posI, posJ);
202 for (
size_t j = 0; j <
W.
getBoundary(s).virtualWake.vtx.size(); ++j)
205 dst2 = dist2(posI, posJ);
212 domainRadius[i] = 1.0 * sqrt((ee2[0] + ee2[1] + ee2[2]) / 3.0);
218 for (
size_t i = 0; i < velo.size(); ++i)
219 velo[i] += selfVelo[i];
223 W.
getCuda().CopyMemToDev<double, 2>(velo.size(), (
double*)velo.data(), pointsDb.devVelPtr);
225 W.
getCuda().CopyMemToDev<double, 1>(domainRadius.size(), domainRadius.data(), pointsDb.devRadPtr);
234void VelocityBiotSavart::GPUCalcConvVeloToSetOfPointsFromWake(std::unique_ptr<BHcu::CudaTreeInfo>& cntrTree,
const WakeDataBase& pointsDb, std::vector<Point2D>& velo, std::vector<double>& domainRadius,
bool calcVelo,
bool calcRadius)
238 size_t npt = pointsDb.
vtx.size();
239 double*& dev_ptr_pt = pointsDb.devVtxPtr;
248 double*& dev_ptr_vt =
W.
getWake().devVtxPtr;
250 double*& dev_ptr_sr =
W.
getSource().devVtxPtr;
254 size_t*
const& dev_nVortices =
W.
getCuda().dev_ptr_nVortices;
256 double**
const& dev_ptr_ptr_vtx =
W.
getCuda().dev_ptr_ptr_vtx;
258 std::vector<Point2D> Vel(npt);
259 std::vector<double> Rad(npt);
260 std::vector<Point2D> newV(npt);
262 double*& dev_ptr_vel = pointsDb.devVelPtr;
263 double*& dev_ptr_rad = pointsDb.devRadPtr;
268 cuCalculateConvVeloWake(npt, dev_ptr_pt, nvt, dev_ptr_vt, nsr, dev_ptr_sr, nbou, dev_nVortices, dev_ptr_ptr_vtx, dev_ptr_vel, dev_ptr_rad, eps2, calcVelo, calcRadius);
272 W.
getCuda().CopyMemFromDev<double, 2>(npt, dev_ptr_vel, (
double*)newV.data(), 20);
274 for (
size_t q = 0; q < npt; ++q)
279 for (
size_t q = 0; q < npt; ++q)
289 W.
getCuda().CopyMemFromDev<double, 1>(npt, dev_ptr_rad, Rad.data(), 211);
291 for (
size_t q = 0; q < Rad.size(); ++q)
292 domainRadius[q] = Rad[q];
Заголовочный файл с описанием класса Airfoil.
Заголовок основного класса BarnesHut.
Заголовочный файл с описанием класса Boundary.
Заголовочный файл с описанием класса MeasureVP.
Заголовочный файл с описанием класса Mechanics.
Заголовочный файл с описанием класса StreamParser.
void ModifyE2(double *ee2, double dst2)
Заголовочный файл с описанием класса VelocityBiotSavart.
Заголовочный файл с описанием класса Wake.
Заголовочный файл с описанием класса World2D.
VirtualWake virtualWake
Виртуальный вихревой след конкретного профиля
const WakeDataBase & getWakeVP() const
Возврат wakeVP.
PhysicalProperties physicalProperties
Структура с физическими свойствами задачи
WakeDiscretizationProperties wakeDiscretizationProperties
Структура с параметрами дискретизации вихревого следа
virtual ~VelocityBiotSavart()
Деструктор
VelocityBiotSavart(const World2D &W_)
Конструктор
virtual void CalcConvVeloToSetOfPointsFromWake(const WakeDataBase &pointsDb, std::vector< Point2D > &velo, std::vector< double > &domainRadius, bool calcVelo, bool calcRadius) override
Вычисление конвективных скоростей и радиусов вихревых доменов в заданном наборе точек от следа
Абстрактный класс, определяющий способ вычисления скоростей
const World2D & W
Константная ссылка на решаемую задачу
Класс, опеделяющий набор вихрей
std::vector< Vortex2D > vtx
Список вихревых элементов
Класс, опеделяющий текущую решаемую задачу
const Wake & getWake() const
Возврат константной ссылки на вихревой след
const WakeDataBase & getSource() const
Возврат константной ссылки на источники в области течения
const Gpu & getCuda() const
Возврат константной ссылки на объект, связанный с видеокартой (GPU)
const Passport & getPassport() const
Возврат константной ссылки на паспорт
const Boundary & getBoundary(size_t i) const
Возврат константной ссылки на объект граничного условия
size_t getNumberOfBoundary() const
Возврат количества граничных условий в задаче
const MeasureVP & getMeasureVP() const
Возврат константной ссылки на measureVP.
double getCurrentTime() const
numvector< T, n > & toZero(P val=0)
Установка всех компонент вектора в константу (по умолчанию — нуль)
void ModifyE2(double *ee2, double dst2)
Модифицирует массив квадратов расстояний до ближайших вихрей из wake.
double boundDenom(double r2, double eps2)
Способ сглаживания скорости вихря (вихрь Рэнкина или вихрь Ламба)
double accelCft(double currentTime) const
Функция-множитель, позволяющая моделировать разгон
double eps2
Квадрат радиуса вихря