59 #if (defined(__CUDACC__) || defined(USE_CUDA)) && (defined(CU_I1I2)) 62 double tt1 = omp_get_wtime();
65 double tt2 = omp_get_wtime();
85 #if (defined(__CUDACC__) || defined(USE_CUDA)) && (defined(CU_I1I2)) 88 double tt1 = omp_get_wtime();
90 double tt2 = omp_get_wtime();
100 #if (defined(__CUDACC__) || defined(USE_CUDA)) && (defined(CU_I1I2)) 102 double tt1 = omp_get_wtime();
104 double tt2 = omp_get_wtime();
113 #if (defined(__CUDACC__) || defined(USE_CUDA)) && (defined(CU_I1I2)) 115 double tt1 = omp_get_wtime();
117 double tt2 = omp_get_wtime();
128 double tDivstart, tDivfinish;
133 tDivstart = omp_get_wtime();
135 #pragma omp parallel for private(I1, I2) 140 if (fabs(I1) < 1.e-8)
147 #pragma omp parallel
for private(I1, I2)
153 if (fabs(I1) < 1.e-8)
159 tDivfinish = omp_get_wtime();
169 #if (defined(__CUDACC__) || defined(USE_CUDA)) && (defined(CU_I0I3)) 172 double tt1 = omp_get_wtime();
174 double tt2 = omp_get_wtime();
189 #
if (defined(__CUDACC__) || defined(USE_CUDA)) && (defined(
CU_I0I3))
191 double tt1 = omp_get_wtime();
193 double tt2 = omp_get_wtime();
206 #pragma omp parallel for private(I0, I3, domrad) 217 if (fabs(I0) > 1.e-8)
222 #pragma omp parallel
for private(I0, I3, domrad)
233 if (fabs(I0) > 1.e-8)
241 for (
size_t i = 0; i < diffVel.size(); ++i)
257 double t12start, t12finish;
258 double t03start, t03finish;
259 double tOtherstart, tOtherfinish;
263 t12start = omp_get_wtime();
265 t12finish = omp_get_wtime();
267 t03start = omp_get_wtime();
269 t03finish = omp_get_wtime();
272 tOtherstart = omp_get_wtime();
285 tOtherfinish = omp_get_wtime();
302 double tCPUSTART, tCPUEND;
304 tCPUSTART = omp_get_wtime();
306 std::vector<double> selfI1(pointsDb.
vtx.size(), 0.0);
307 std::vector<Point2D> selfI2(pointsDb.
vtx.size(), { 0.0, 0.0 });
309 #pragma warning (push) 310 #pragma warning (disable: 4101) 314 double diffRadius, domRad;
318 #pragma warning (pop) 320 #pragma omp parallel for default(none) shared(selfI1, selfI2, domainRadius, vorticesDb, pointsDb) private(Rij, rij, expr, diffRadius, domRad, left, right, posJx) 321 for (
int i = 0; i < pointsDb.
vtx.size(); ++i)
328 diffRadius = 8.0 * domRad;
330 left = vtxI.
r()[0] - diffRadius;
331 right = vtxI.
r()[0] + diffRadius;
333 for (
size_t j = 0; j < vorticesDb.
vtx.size(); ++j)
338 if ((left < posJx) && (posJx < right))
340 Rij = vtxI.
r() - vtxJ.
r();
342 if (rij < diffRadius && rij > 1.e-10)
344 expr = exp(-rij / domRad);
345 selfI2[i] += (vtxJ.
g()* expr / rij) * Rij;
346 selfI1[i] += vtxJ.
g()*expr;
353 for (
size_t i = 0; i < I1.size(); ++i)
359 tCPUEND = omp_get_wtime();
367 double tCPUSTART, tCPUEND;
369 tCPUSTART = omp_get_wtime();
371 std::vector<double> selfI1(pointsDb.
vtx.size(), 0.0);
372 std::vector<Point2D> selfI2(pointsDb.
vtx.size(), { 0.0, 0.0 });
374 #pragma warning (push) 375 #pragma warning (disable: 4101) 384 #pragma warning (pop) 387 #pragma omp parallel for default(none) shared(selfI1, selfI2, domainRadius, bnd, pointsDb, std::cout) private(Rij, rij, expr, domRad, diffRadius, left, right, posJx) 388 for (
int i = 0; i < pointsDb.
vtx.size(); ++i)
395 diffRadius = 8.0 * domRad;
397 left = vtxI.
r()[0] - diffRadius;
398 right = vtxI.
r()[0] + diffRadius;
403 const int nQuadPt = 3;
408 for (
int q = 0; q < nQuadPt; ++q)
413 if ((left < posJx) && (posJx < right))
415 Rij = vtxI.
r() - ptJ;
417 if (rij < diffRadius && rij > 1.e-10)
419 expr = exp(-rij / domRad);
420 selfI2[i] += (ptG * expr / rij) * Rij;
421 selfI1[i] += ptG * expr;
428 for (
size_t i = 0; i < I1.size(); ++i)
434 tCPUEND = omp_get_wtime();
440 #if defined (USE_CUDA) 442 void Velocity::GPUCalcDiffVeloI1I2ToSetOfPointsFromWake(
const WakeDataBase& pointsDb,
const std::vector<double>& domainRadius,
const WakeDataBase& vorticesDb, std::vector<double>& I1, std::vector<Point2D>& I2,
bool useMesh)
446 size_t npt = pointsDb.
vtx.size();
454 double*& dev_ptr_pt = pointsDb.devVtxPtr;
455 double*& dev_ptr_dr = pointsDb.devRadPtr;
457 const size_t nvt = vorticesDb.
vtx.size();
458 double*& dev_ptr_vt = vorticesDb.devVtxPtr;
460 std::vector<Point2D> newI2(npt);
461 std::vector<double> newI1(npt);
463 double*& dev_ptr_i1 = pointsDb.devI1Ptr;
464 double*& dev_ptr_i2 = pointsDb.devI2Ptr;
467 if ((nvt > 0) && (npt > 0))
471 cuCalculateDiffVeloWake(npt, dev_ptr_pt, nvt, dev_ptr_vt, dev_ptr_i1, dev_ptr_i2, dev_ptr_dr, minRad);
475 W.
getCuda().CopyMemFromDev<double, 2>(npt, dev_ptr_i2, (
double*)newI2.data(), 10);
476 W.
getCuda().CopyMemFromDev<double, 1>(npt, dev_ptr_i1, newI1.data(), 11);
480 for (
size_t q = 0; q < I2.size(); ++q)
489 size_t curGlobPnl = 0;
494 for (
size_t q = 0; q < nv; ++q)
508 void Velocity::GPUCalcDiffVeloI1I2ToSetOfPointsFromSheets(
const WakeDataBase& pointsDb,
const std::vector<double>& domainRadius,
const Boundary& bou, std::vector<double>& I1, std::vector<Point2D>& I2,
bool useMesh)
514 size_t npt = pointsDb.
vtx.size();
515 double*& dev_ptr_pt = pointsDb.devVtxPtr;
516 double*& dev_ptr_dr = pointsDb.devRadPtr;
525 double*& dev_ptr_r = bou.
afl.devRPtr;
526 double*& dev_ptr_freeVortexSheet = bou.
afl.devFreeVortexSheetPtr;
531 std::vector<Point2D> newI2(npt);
532 std::vector<double> newI1(npt);
534 double*& dev_ptr_i1 = pointsDb.devI1Ptr;
535 double*& dev_ptr_i2 = pointsDb.devI2Ptr;
538 if ((npnl > 0) && (npt > 0))
542 cuCalculateDiffVeloWakeFromPanels(npt, dev_ptr_pt, npnl, dev_ptr_r, dev_ptr_freeVortexSheet, dev_ptr_i1, dev_ptr_i2, dev_ptr_dr, minRad);
546 W.
getCuda().CopyMemFromDev<double, 2>(npt, dev_ptr_i2, (
double*)newI2.data(), 12);
547 W.
getCuda().CopyMemFromDev<double, 1>(npt, dev_ptr_i1, newI1.data(), 13);
551 for (
size_t q = 0; q < I2.size(); ++q)
560 size_t curGlobPnl = 0;
565 for (
size_t q = 0; q < nv; ++q)
581 #if defined(USE_CUDA) 582 void Velocity::GPUDiffVeloFAST(
const WakeDataBase& pointsDb,
const std::vector<double>& domainRadius,
const WakeDataBase& vorticesDb, std::vector<double>& I1, std::vector<Point2D>& I2)
586 size_t npt = pointsDb.
vtx.size();
594 double*& dev_ptr_pt = pointsDb.devVtxPtr;
595 double*& dev_ptr_dr = pointsDb.devRadPtr;
597 const size_t nvt = vorticesDb.
vtx.size();
598 double*& dev_ptr_vt = vorticesDb.devVtxPtr;
600 std::vector<Point2D> newI2(npt);
601 std::vector<double> newI1(npt);
603 double*& dev_ptr_i1 = pointsDb.devI1Ptr;
604 double*& dev_ptr_i2 = pointsDb.devI2Ptr;
610 size_t*
const& dev_nVortices =
W.
getCuda().dev_ptr_nVortices;
612 double**
const& dev_ptr_ptr_vtx =
W.
getCuda().dev_ptr_ptr_vtx;
615 if ((nvt > 0) && (npt > 0))
620 dev_ptr_dr,
W.
getNonConstCuda().CUDAptrs,
false, (int)npt, timings, sqrt(eps2), 1.30,
622 nbou, dev_nVortices, dev_ptr_ptr_vtx);
628 W.
getCuda().CopyMemFromDev<double, 2>(npt, dev_ptr_i2, (
double*)newI2.data(), 10);
629 W.
getCuda().CopyMemFromDev<double, 1>(npt, dev_ptr_i1, newI1.data(), 11);
633 for (
size_t q = 0; q < I2.size(); ++q)
642 size_t curGlobPnl = 0;
647 for (
size_t q = 0; q < nv; ++q)
735 std::stringstream ss;
736 ss <<
"VisStress_" << q <<
"-";
738 std::ofstream outfile;
747 outfile << static_cast<int>(i) <<
" " << r[0] <<
" " << r[1] <<
" " << gi << std::endl;
const double & freeVortexSheet(size_t n, size_t moment) const
std::vector< double > I0
Вектор знаменателей (I0) диффузионных скоростей вихрей (обусловленных профилем)
virtual void GetDiffVelocityI0I3ToWakeAndViscousStresses(const WakeDataBase &pointsDb, std::vector< double > &domainRadius, std::vector< double > &I0, std::vector< Point2D > &I3)=0
std::vector< Point2D > I3
Вектор числителей (I3) диффузионных скоростей вихрей (обусловленных профилем)
Заголовочный файл с описанием класса Passport (двумерный) и cоответствующими структурами ...
void CalcDiffVeloI1I2()
Вычисление диффузионных скоростей вихрей и виртуальных вихрей в вихревом следе
std::vector< double > viscousStress
Касательные напряжения на панелях профиля
Times & getTimestat() const
Возврат ссылки на временную статистику выполнения шага расчета по времени
std::pair< std::string, int > velocityComputation
timePeriod timeCalcVortexDiffVelo
Начало и конец процесса вычисления диффузионных скоростей вихрей
int saveVtxStep
Шаг сохранения кадров в бинарные файлы
void CalcDiffVeloI1I2ToSetOfPointsFromWake(const WakeDataBase &pointsDb, const std::vector< double > &domainRadius, const WakeDataBase &vorticesDb, std::vector< double > &I1, std::vector< Point2D > &I2)
Вычисление числителей и знаменателей диффузионных скоростей в заданном наборе точек ...
void CalcDiffVelo()
Вычисление диффузионных скоростей
Заголовочный файл с описанием класса Wake.
Заголовочный файл с описанием класса World2D.
Gpu & getNonConstCuda() const
Возврат неконстантной ссылки на объект, связанный с видеокартой (GPU)
double vRef
Референсная скорость
size_t getNumberOfBoundary() const
Возврат количества граничных условий в задаче
int nameLength
Число разрядов в имени файла
Заголовочный файл с описанием класса Airfoil.
Абстрактный класс, определяющий способ удовлетворения граничного условия на обтекаемом профиле ...
const Wake & getWake() const
Возврат константной ссылки на вихревой след
double wrapperDiffusiveVelo(const realVortex *vtxl, real *i1l, realPoint *i2l, real *epsastl, CUDApointers &ptrs, bool rebuild, int nbodies, double *timing, real eps, real theta, size_t &nbodiesOld, int nbodiesUp, int order, size_t nAfls, size_t *nVtxs, double **ptrVtxs)
Заголовочный файл с описанием класса WakeDataBase.
double nu
Коэффициент кинематической вязкости среды
const size_t numberInPassport
Номер профиля в паспорте
std::string dir
Рабочий каталог задачи
P length() const
Вычисление 2-нормы (длины) вектора
Заголовочный файл с описанием класса Mechanics.
PhysicalProperties physicalProperties
Структура с физическими свойствами задачи
const Point2D & getR(size_t q) const
Возврат константной ссылки на вершину профиля
const World2D & W
Константная ссылка на решаемую задачу
timePeriod timeCalcVortexConvVelo
Начало и конец процесса вычисления конвективных скоростей вихрей
HD Point2D & r()
Функция для доступа к радиус-вектору вихря
HD double & g()
Функция для доступа к циркуляции вихря
size_t getNumberOfPanels() const
Возврат количества панелей на профиле
void ResizeAndZero()
Очистка старых массивов под хранение скоростей, выделение новой памяти и обнуление ...
std::string fileNameStep(const std::string &name, int length, size_t number, const std::string &ext)
Формирование имени файла
virtual void CalcDiffVeloI1I2ToWakeFromWake(const WakeDataBase &pointsDb, const std::vector< double > &domainRadius, const WakeDataBase &vorticesDb, std::vector< double > &I1, std::vector< Point2D > &I2)=0
std::vector< VortexesParams > virtualVortexesParams
Вектор струтур, определяющий параметры виртуальных вихрей для профилей
bool ifDivisible(int val) const
T sqr(T x)
Возведение числа в квадрат
TimeDiscretizationProperties timeDiscretizationProperties
Структура с параметрами процесса интегрирования по времени
void normalize(P newlen=1.0)
Нормирование вектора на заданную длину
const Boundary & getBoundary(size_t i) const
Возврат константной ссылки на объект граничного условия
virtual void GetDiffVelocityI0I3ToSetOfPointsAndViscousStresses(const WakeDataBase &pointsDb, std::vector< double > &domainRadius, std::vector< double > &I0, std::vector< Point2D > &I3)=0
Вычисление числителей и знаменателей диффузионных скоростей в заданном наборе точек, обусловленных геометрией профиля, и вычисление вязкого трения
void CalcDiffVeloI1I2ToSetOfPointsFromSheets(const WakeDataBase &pointsDb, const std::vector< double > &domainRadius, const Boundary &bnd, std::vector< double > &I1, std::vector< Point2D > &I2)
size_t getNumberOfAirfoil() const
Возврат количества профилей в задаче
Заголовочный файл с описанием класса StreamParser.
std::vector< Vortex2D > vtx
Список вихревых элементов
NumericalSchemes numericalSchemes
Структура с используемыми численными схемами
Velocity & getNonConstVelocity() const
Возврат неконстантной ссылки на объект для вычисления скоростей
Класс, опеделяющий двумерный вектор
std::vector< double > I1
Вектор знаменателей (I1) диффузионных скоростей вихрей (обусловленных завихренностью) ...
std::vector< Point2D > tau
Касательные к панелям профиля
Sheet sheets
Слои на профиле
Заголовочный файл с описанием класса MeasureVP.
const Passport & getPassport() const
Возврат константной ссылки на паспорт
const Gpu & getCuda() const
Возврат константной ссылки на объект, связанный с видеокартой (GPU)
VortexesParams wakeVortexesParams
Струтура, определяющая параметры вихрей в следе
Класс, опеделяющий двумерный вихревой элемент
std::vector< double > epsastWake
Вектор характерных радиусов вихревых доменов (eps*)
std::vector< Point2D > diffVelo
Вектор диффузионных скоростей вихрей
VirtualWake virtualWake
Виртуальный вихревой след конкретного профиля
int saveVisStress
Шаг вычисления и сохранения скорости и давления
std::vector< Point2D > I2
Вектор числителей (I2) диффузионных скоростей вихрей (обусловленных завихренностью) ...
size_t getCurrentStep() const
Возврат константной ссылки на параметры распараллеливания по MPI.
const Airfoil & getAirfoil(size_t i) const
Возврат константной ссылки на объект профиля
Класс, опеделяющий набор вихрей
WakeDiscretizationProperties wakeDiscretizationProperties
Структура с параметрами дискретизации вихревого следа
std::vector< double > len
Длины панелей профиля
virtual void CalcDiffVeloI1I2ToWakeFromSheets(const WakeDataBase &pointsDb, const std::vector< double > &domainRadius, const Boundary &bnd, std::vector< double > &I1, std::vector< Point2D > &I2)=0
Заголовочный файл с описанием класса Velocity.
void LimitDiffVelo(std::vector< Point2D > &diffVel)
Контроль больших значений диффузионных скоростей
void SaveVisStress()
Сохранение вязких напряжений
Airfoil & getNonConstAirfoil(size_t i) const
Возврат неконстантной ссылки на объект профиля
std::vector< Point2D > convVelo
Вектор конвективных скоростей вихрей
void CreateDirectory(const std::string &dir, const std::string &name)
Создание каталога
double eps2
Квадрат радиуса вихря
Заголовочный файл с описанием класса Boundary.
double epscol
Радиус коллапса
double getMinEpsAst() const
Функция минимально возможного значения для epsAst.