65#if (defined(__CUDACC__) || defined(USE_CUDA)) && (defined(CU_I1I2))
82#if (defined(__CUDACC__) || defined(USE_CUDA)) && (defined(CU_I1I2))
92#pragma omp parallel for private(I1, I2)
110#if (defined(__CUDACC__) || defined(USE_CUDA)) && (defined(CU_I0I3))
124#pragma omp parallel for private(I0, I3, domrad)
137 if (fabs(I0) > 1.e-8)
145 for (
size_t i = 0; i < diffVel.size(); ++i)
159 double t12start, t12finish;
160 double t03start, t03finish;
161 double tOtherstart, tOtherfinish;
165 t12start = omp_get_wtime();
167 t12finish = omp_get_wtime();
169 t03start = omp_get_wtime();
171 t03finish = omp_get_wtime();
173 tOtherstart = omp_get_wtime();
181 for (
size_t i = 0; i <
W.
getAirfoil(afl).viscousStress.size(); ++i)
188 size_t nVirtVortices = 0;
205 tOtherfinish = omp_get_wtime();
215 std::vector<double> selfI1(pointsDb.
vtx.size(), 0.0);
216 std::vector<Point2D> selfI2(pointsDb.
vtx.size(), { 0.0, 0.0 });
218#pragma warning (push)
219#pragma warning (disable: 4101)
223 double diffRadius, domRad;
229#pragma omp parallel for default(none) shared(selfI1, selfI2, domainRadius, vorticesDb, pointsDb) private(Rij, rij, expr, diffRadius, domRad, left, right, posJx)
230 for (
int i = 0; i < pointsDb.
vtx.size(); ++i)
237 diffRadius = 8.0 * domRad;
239 left = vtxI.
r()[0] - diffRadius;
240 right = vtxI.
r()[0] + diffRadius;
242 for (
size_t j = 0; j < vorticesDb.
vtx.size(); ++j)
247 if ((left < posJx) && (posJx < right))
249 Rij = vtxI.
r() - vtxJ.
r();
251 if (rij < diffRadius && rij > 1.e-10)
253 expr = exp(-rij / domRad);
254 selfI2[i] += (vtxJ.
g()* expr / rij) * Rij;
255 selfI1[i] += vtxJ.
g()*expr;
262 for (
size_t i = 0; i < I1.size(); ++i)
273 double tCPUSTART, tCPUEND;
275 tCPUSTART = omp_get_wtime();
277 std::vector<double> selfI1(pointsDb.
vtx.size(), 0.0);
278 std::vector<Point2D> selfI2(pointsDb.
vtx.size(), { 0.0, 0.0 });
280#pragma warning (push)
281#pragma warning (disable: 4101)
293#pragma omp parallel for default(none) shared(selfI1, selfI2, domainRadius, bnd, pointsDb, std::cout) private(Rij, rij, expr, domRad, diffRadius, left, right, posJx)
294 for (
int i = 0; i < pointsDb.
vtx.size(); ++i)
301 diffRadius = 8.0 * domRad;
303 left = vtxI.
r()[0] - diffRadius;
304 right = vtxI.
r()[0] + diffRadius;
309 const int nQuadPt = 3;
314 for (
int q = 0; q < nQuadPt; ++q)
319 if ((left < posJx) && (posJx < right))
321 Rij = vtxI.
r() - ptJ;
323 if (rij < diffRadius && rij > 1.e-10)
325 expr = exp(-rij / domRad);
326 selfI2[i] += (ptG * expr / rij) * Rij;
327 selfI1[i] += ptG * expr;
334 for (
size_t i = 0; i < I1.size(); ++i)
340 tCPUEND = omp_get_wtime();
346#if defined (USE_CUDA)
348void Velocity::GPUCalcDiffVeloI1I2ToSetOfPointsFromWake(
const WakeDataBase& pointsDb,
const std::vector<double>& domainRadius,
const WakeDataBase& vorticesDb, std::vector<double>& I1, std::vector<Point2D>& I2,
bool useMesh)
352 size_t npt = pointsDb.
vtx.size();
360 double*& dev_ptr_pt = pointsDb.devVtxPtr;
361 double*& dev_ptr_dr = pointsDb.devRadPtr;
363 const size_t nvt = vorticesDb.
vtx.size();
364 double*& dev_ptr_vt = vorticesDb.devVtxPtr;
366 std::vector<Point2D> newI2(npt);
367 std::vector<double> newI1(npt);
369 double*& dev_ptr_i1 = pointsDb.devI1Ptr;
370 double*& dev_ptr_i2 = pointsDb.devI2Ptr;
373 if ((nvt > 0) && (npt > 0))
377 cuCalculateDiffVeloWake(npt, dev_ptr_pt, nvt, dev_ptr_vt, dev_ptr_i1, dev_ptr_i2, dev_ptr_dr, minRad);
381 W.
getCuda().CopyMemFromDev<double, 2>(npt, dev_ptr_i2, (
double*)newI2.data(), 10);
382 W.
getCuda().CopyMemFromDev<double, 1>(npt, dev_ptr_i1, newI1.data(), 11);
386 for (
size_t q = 0; q < I2.size(); ++q)
395 size_t curGlobPnl = 0;
400 for (
size_t q = 0; q < nv; ++q)
414void Velocity::GPUCalcDiffVeloI1I2ToSetOfPointsFromSheets(
const WakeDataBase& pointsDb,
const std::vector<double>& domainRadius,
const Boundary& bou, std::vector<double>& I1, std::vector<Point2D>& I2,
bool useMesh)
420 size_t npt = pointsDb.
vtx.size();
421 double*& dev_ptr_pt = pointsDb.devVtxPtr;
422 double*& dev_ptr_dr = pointsDb.devRadPtr;
431 double*& dev_ptr_r = bou.
afl.devRPtr;
432 double*& dev_ptr_freeVortexSheet = bou.
afl.devFreeVortexSheetPtr;
433 double*& dev_ptr_freeVortexSheetLin = bou.
afl.devFreeVortexSheetLinPtr;
438 std::vector<Point2D> newI2(npt);
439 std::vector<double> newI1(npt);
441 double*& dev_ptr_i1 = pointsDb.devI1Ptr;
442 double*& dev_ptr_i2 = pointsDb.devI2Ptr;
445 if ((npnl > 0) && (npt > 0))
449 cuCalculateDiffVeloWakeFromPanels(npt, dev_ptr_pt, npnl, dev_ptr_r, dev_ptr_freeVortexSheet, dev_ptr_freeVortexSheetLin, dev_ptr_i1, dev_ptr_i2, dev_ptr_dr, minRad);
453 W.
getCuda().CopyMemFromDev<double, 2>(npt, dev_ptr_i2, (
double*)newI2.data(), 12);
454 W.
getCuda().CopyMemFromDev<double, 1>(npt, dev_ptr_i1, newI1.data(), 13);
458 for (
size_t q = 0; q < I2.size(); ++q)
467 size_t curGlobPnl = 0;
472 for (
size_t q = 0; q < nv; ++q)
487void Velocity::GPUDiffVeloFAST(
const std::vector<double>& domainRadius, std::vector<double>& I1, std::vector<Point2D>& I2)
491 std::vector<Point2D> newI2(nvt);
492 std::vector<double> newI1(nvt);
494 double*& dev_ptr_i1 =
W.
getWake().devI1Ptr;
495 double*& dev_ptr_i2 =
W.
getWake().devI2Ptr;
497 size_t*
const& dev_nVortices =
W.
getCuda().dev_ptr_nVortices;
502 auto& treeWake = *
W.
getCuda().inflTreeWake;
503 treeWake.MemoryAllocate((
int)
W.
getCuda().n_CUDA_wake);
510 W.
getCuda().CopyMemFromDev<double, 2>(nvt, dev_ptr_i2, (
double*)newI2.
data(), 10);
511 W.
getCuda().CopyMemFromDev<double, 1>(nvt, dev_ptr_i1, newI1.data(), 11);
513 for (
size_t q = 0; q < I2.size(); ++q)
597 std::stringstream ss;
598 ss <<
"VisStress_" << q <<
"-";
600 std::ofstream outfile;
605 for (
size_t i = 0; i <
W.
getAirfoil(q).viscousStress.size(); ++i)
609 outfile << static_cast<int>(i) <<
" " << r[0] <<
" " << r[1] <<
" " << gi << std::endl;
627 std::vector<double> velI(shDim, 0.0);
629#pragma omp parallel for default(none) shared(shDim, afl, np, wakeRhs, IDPI) private(velI)
630 for (
int i = 0; i < np; ++i)
632 velI.assign(shDim, 0.0);
646 for (
size_t j = 0; j < shDim; ++j)
649 wakeRhs[i] = velI[0];
652 wakeRhs[np + i] = velI[1];
666 wakeRhs.assign(nTotPan, 0.0);
667 wakeRhsLin.assign(nTotPan, 0.0);
686void Velocity::GPUGetWakeInfluenceToRhs(
const Airfoil& afl, std::vector<double>& wakeVelo)
const
699 double*& dev_ptr_pt = afl.devRPtr;
700 double*& dev_ptr_vt =
W.
getWake().devVtxPtr;
701 double*& dev_ptr_sr =
W.
getSource().devVtxPtr;
702 double*& dev_ptr_rhs = afl.devRhsPtr;
703 double*& dev_ptr_rhsLin = afl.devRhsLinPtr;
705 std::vector<double> locrhs(nTotPan);
706 std::vector<double> locrhsLin(nTotPan);
708 if ((nvt > 0) || (nsr > 0))
710 cuCalculateRhs(nTotPan, dev_ptr_pt, nvt, dev_ptr_vt, nsr, dev_ptr_sr, dev_ptr_rhs, dev_ptr_rhsLin);
712 std::vector<double> newRhs(nTotPan), newRhsLin(nTotPan);
714 W.
getCuda().CopyMemFromDev<double, 1>(nTotPan, dev_ptr_rhs, newRhs.data(), 22);
716 W.
getCuda().CopyMemFromDev<double, 1>(nTotPan, dev_ptr_rhsLin, newRhsLin.data(), 22);
718 size_t curGlobPnl = 0;
724 tmpRhs.insert(tmpRhs.end(), newRhs.begin() + curGlobPnl, newRhs.begin() + curGlobPnl + np);
726 tmpRhs.insert(tmpRhs.end(), newRhsLin.begin() + curGlobPnl, newRhsLin.begin() + curGlobPnl + np);
733 if ((nvt > 0) || (nsr > 0))
734 wakeVelo = std::move(afl.tmpRhs);
743void Velocity::GPUFASTGetWakeInfluenceToRhs(
const Airfoil & afl, std::vector<double>&wakeVelo)
const
750 auto& inflTree = *
W.
getCuda().inflTreeWake;
759 double*& dev_ptr_pt = afl.devRPtr;
760 double*& dev_ptr_vt =
W.
getWake().devVtxPtr;
761 double*& dev_ptr_sr =
W.
getSource().devVtxPtr;
762 double*& dev_ptr_rhs = afl.devRhsPtr;
763 double*& dev_ptr_rhsLin = afl.devRhsLinPtr;
764 std::vector<double> locrhs(nTotPan);
765 std::vector<double> locrhsLin(nTotPan);
767 if ((nvt > 0) || (nsr > 0))
771 double* linPtr = (
double*)((shDim == 1) ? nullptr : dev_ptr_rhsLin);
773 auto& inflTree = *
W.
getCuda().inflTreeWake;
774 auto& cntrTree = *
W.
getCuda().cntrTreePnl;
776 inflTree.DownwardTraversalVorticesToPanels(cntrTree, (
double*)dev_ptr_rhs,
780 std::vector<double> newRhs(nTotPan), newRhsLin(nTotPan);
782 W.
getCuda().CopyMemFromDev<double, 1>(nTotPan, dev_ptr_rhs, newRhs.data(), 22);
784 W.
getCuda().CopyMemFromDev<double, 1>(nTotPan, dev_ptr_rhsLin, newRhsLin.data(), 22);
786 size_t curGlobPnl = 0;
792 tmpRhs.insert(tmpRhs.end(), newRhs.begin() + curGlobPnl, newRhs.begin() + curGlobPnl + np);
794 tmpRhs.insert(tmpRhs.end(), newRhsLin.begin() + curGlobPnl, newRhsLin.begin() + curGlobPnl + np);
801 if ((nvt > 0) || (nsr > 0))
802 wakeVelo = std::move(afl.tmpRhs);
813 Eigen::VectorXd locRhs;
816 size_t currentRow = 0;
817 size_t currentSkosRow = 0;
824 std::vector<double> fastWakeRhs;
825 std::vector<double> fastWakeRhsLin;
831 size_t curGlobPnl = 0;
841 locRhs.resize(nVars);
843 std::vector<double> wakeRhs;
845 double tt1 = omp_get_wtime();
847#if (defined(__CUDACC__) || defined(USE_CUDA)) && (defined(CU_RHS))
851 GPUFASTGetWakeInfluenceToRhs(afl, wakeRhs);
853 GPUGetWakeInfluenceToRhs(afl, wakeRhs);
860 wakeRhs.assign(np * shDim, 0.0);
862 for (
size_t i = 0; i < np; ++i)
864 wakeRhs[i] = fastWakeRhs[curGlobPnl + i];
867 wakeRhs[np + i] = fastWakeRhsLin[curGlobPnl + i];
883 std::vector<double> vInfRhs;
886#pragma omp parallel for \
888 shared(locRhs, afl, bou, wakeRhs, vInfRhs, np) \
889 schedule(dynamic, DYN_SCHEDULE)
892 locRhs(i) = -vInfRhs[i] - wakeRhs[i] + 0.25 * ((afl.
getV(i) + afl.
getV(i + 1)) & afl.
tau[i]);
894 locRhs(np + i) = -vInfRhs[np + i] - wakeRhs[np + i];
903 const auto& iq =
W.
getIQ(bou, q);
910 if ((i != j) || (bou != q))
912 locRhs(i) += -iq.first(i, j) * sht.attachedVortexSheet(j, 0);
913 locRhs(i) += -iq.second(i, j) * sht.attachedSourceSheet(j, 0);
938 for (
size_t i = 0; i < nVars; ++i)
939 rhsReord(i + currentSkosRow) = locRhs(i);
941 rhsReord(nAllVars + bou) = lastRhs[bou];
943 currentRow += nVars + 1;
944 currentSkosRow += nVars;
957#if (defined(__CUDACC__) || defined(USE_CUDA)) && (defined(CU_CONV_TOWAKE))
965 std::unique_ptr<BHcu::CudaTreeInfo>& cntrTree =
W.
getNonConstCuda().cntrTreeWake;
969 cntrTree->MemoryAllocate((
int)
W.
getCuda().n_CUDA_wake);
974 treeWake.MemoryAllocate((
int)
W.
getCuda().n_CUDA_wake);
1084 float timeUpd1=0, timeBld1=0, timeUpw1=0, timeUpd2=0, timeBld2=0, timeUpw2=0, timeDnw=0;
1096 int estOptLevel = std::max(4, (
int)(log2(
W.
getWake().
vtx.size())) - 2);
1180 std::vector<Point2D> nullVector(0);
1185#if (defined(__CUDACC__) || defined(USE_CUDA)) && (defined(CU_CONVVIRT))
1206 size_t nVirtVortices = 0;
1213 for (
size_t v = 0; v <
W.
getBoundary(bou).virtualWake.vtx.size(); ++v)
1224 size_t nVirtVortices = 0;
1280 std::vector<Point2D> velConvWake;
1281 std::vector<std::vector<Point2D>> velConvBou;
1285 velConvWake.resize(addWSize, { 0.0, 0.0 });
1289 velConvBou[i].resize(addWSize, { 0.0, 0.0 });
1292 velocityRef.assign(addWSize,
W.
getV0());
1294#if (defined(USE_CUDA))
1298#if (defined(__CUDACC__) || defined(USE_CUDA)) && (defined(CU_VP))
1299 std::unique_ptr<BHcu::CudaTreeInfo>& cntrTree =
W.
getNonConstCuda().cntrTreeVP;
1306 cntrTree->MemoryAllocate((
int)
W.
getCuda().n_CUDA_velVP);
1337#
if (defined(__CUDACC__) || defined(USE_CUDA)) && (defined(
CU_VP))
1343 for (
int s = 0; s < addWSize; ++s)
1344 velocityRef[s] += velConvWake[s];
1346 for (
size_t bou = 0; bou < velConvBou.size(); ++bou)
1347 for (
int j = 0; j < addWSize; ++j)
1348 velocityRef[j] += velConvBou[bou][j];
1357 for (
int i = 0; i < addWSize; ++i)
1358 velocityRef[i] += velConvWake[i];
1360 for (
size_t bou = 0; bou < velConvBou.size(); ++bou)
1361 for (
int j = 0; j < addWSize; ++j)
1362 velocityRef[j] += velConvBou[bou][j];
Заголовочный файл с описанием класса Airfoil.
Заголовочный файл с описанием класса Boundary.
Заголовочный файл с функциями для метода GMRES.
Заголовочный файл с описанием класса MeasureVP.
Заголовочный файл с описанием класса Mechanics.
Заголовочный файл с описанием класса StreamParser.
Заголовочный файл с описанием класса Velocity.
Заголовочный файл с описанием класса Wake.
Заголовочный файл с описанием класса World2D.
std::vector< double > len
Длины панелей профиля
const Point2D & getR(size_t q) const
Возврат константной ссылки на вершину профиля
const Point2D & getV(size_t q) const
Возврат константной ссылки на скорость вершины профиля
std::vector< Point2D > tau
Касательные к панелям профиля
bool inverse
Признак разворота нормалей (для расчета внутренних течений)
size_t getNumberOfPanels() const
Возврат количества панелей на профиле
Абстрактный класс, определяющий обтекаемый профиль
virtual void GetInfluenceFromSourcesToPanel(size_t panel, const Vortex2D *ptr, ptrdiff_t count, std::vector< double > &panelRhs) const
Вычисление влияния части подряд идущих источников из области течения на панель для правой части
std::vector< double > gammaThrough
Суммарные циркуляции вихрей, пересекших панели профиля на прошлом шаге
virtual void GetInfluenceFromVorticesToPanel(size_t panel, const Vortex2D *ptr, ptrdiff_t count, std::vector< double > &panelRhs) const
Вычисление влияния части подряд идущих вихрей из вихревого следа на панель для правой части
virtual void GetInfluenceFromVInfToPanel(std::vector< double > &vInfRhs) const
Вычисление влияния набегающего потока на панель для правой части
std::vector< double > viscousStress
Нейросеть для коэффициентов I0 и I3 диффузионной скорости
virtual void GetDiffVelocityI0I3ToSetOfPointsAndViscousStresses(const WakeDataBase &pointsDb, std::vector< double > &domainRadius, std::vector< double > &I0, std::vector< Point2D > &I3)
Вычисление числителей и знаменателей диффузионных скоростей в заданном наборе точек,...
const size_t numberInPassport
Номер профиля в паспорте
Абстрактный класс, определяющий способ удовлетворения граничного условия на обтекаемом профиле
size_t GetUnknownsSize() const
Возврат размерности вектора решения
size_t sheetDim
Размерность параметров каждого из слоев на каждой из панелей
Sheet sheets
Слои на профиле
VirtualWake virtualWake
Виртуальный вихревой след конкретного профиля
virtual void CalcConvVelocityToSetOfPointsFromSheets(const WakeDataBase &pointsDb, std::vector< Point2D > &velo) const =0
Вычисление конвективных скоростей в наборе точек, вызываемых наличием слоев вихрей и источников на пр...
float Update(const std::vector< Vortex2D > &vtx, int cntrLev=0)
float DownwardTraversalVorticesToPanels(CpuTreeInfo &cntrTree, std::vector< double > &rhs, std::vector< double > &rhsLin, double theta, int order)
float UpwardTraversal(int order)
float DownwardTraversalVorticesToPoints(CpuTreeInfo &cntrTree, std::vector< Point2D > &vel, std::vector< double > &epsast, double theta, int order, bool calcRadius)
const WakeDataBase & getWakeVP() const
Возврат wakeVP.
std::vector< Point2D > & getNonConstVelocity()
Возврат velocity.
std::vector< double > & getNonConstDomainRadius()
Возврат domainRadius.
const bool isMoves
Переменная, отвечающая за то, двигается профиль или нет
double circulationOld
Циркуляция скорости по границе профиля с предыдущего шага
double circulation
Текущая циркуляция скорости по границе профиля
PhysicalProperties physicalProperties
Структура с физическими свойствами задачи
WakeDiscretizationProperties wakeDiscretizationProperties
Структура с параметрами дискретизации вихревого следа
NumericalSchemes numericalSchemes
Структура с используемыми численными схемами
const double & freeVortexSheet(size_t n, size_t moment) const
void CalcConvVelo()
Вычисление конвективных скоростей вихрей и виртуальных вихрей в вихревом следе, а также в точках wake...
void CalcDiffVelo()
Вычисление диффузионных скоростей
void LimitDiffVelo(std::vector< Point2D > &diffVel)
Контроль больших значений диффузионных скоростей
void GetWakeInfluenceToRhs(const Airfoil &afl, std::vector< double > &wakeRhs) const
Генерация вектора влияния вихревого следа на профиль
void CalcDiffVeloI1I2ToWakeFromSheets(const WakeDataBase &pointsDb, const std::vector< double > &domainRadius, const Boundary &bnd, std::vector< double > &I1, std::vector< Point2D > &I2)
void CalcDiffVeloI1I2ToWakeFromWake(const WakeDataBase &pointsDb, const std::vector< double > &domainRadius, const WakeDataBase &vorticesDb, std::vector< double > &I1, std::vector< Point2D > &I2)
virtual float CalcConvVeloToSetOfPointsFromWake(const WakeDataBase &pointsDb, std::vector< Point2D > &velo, std::vector< double > &domainRadius, bool calcVelo, bool calcRadius)=0
Вычисление конвективных скоростей и радиусов вихревых доменов в заданном наборе точек от следа
std::vector< VortexesParams > virtualVortexesParams
Вектор струтур, определяющий параметры виртуальных вихрей для профилей
VortexesParams wakeVortexesParams
Струтура, определяющая параметры вихрей в следе
virtual void CalcVeloToWakeVP()
Вычисление скоростей в точках wakeVP.
void FillRhs(Eigen::VectorXd &rhsReord) const
void CalcDiffVeloI1I2ToSetOfPointsFromWake(const WakeDataBase &pointsDb, const std::vector< double > &domainRadius, const WakeDataBase &vorticesDb, std::vector< double > &I1, std::vector< Point2D > &I2)
Вычисление числителей и знаменателей диффузионных скоростей в заданном наборе точек
void CalcDiffVeloI1I2ToSetOfPointsFromSheets(const WakeDataBase &pointsDb, const std::vector< double > &domainRadius, const Boundary &bnd, std::vector< double > &I1, std::vector< Point2D > &I2)
void ResizeAndZero()
Очистка старых массивов под хранение скоростей, выделение новой памяти и обнуление
void SaveVisStress()
Сохранение вязких напряжений
void CalcDiffVeloI1I2()
Вычисление диффузионных скоростей вихрей и виртуальных вихрей в вихревом следе
const World2D & W
Константная ссылка на решаемую задачу
void CPUGetFASTWakeInfluenceToRhs(std::vector< double > &wakeRhs, std::vector< double > &wakeRhsLin) const
std::vector< Point2D > vecHalfGamma
Скорость вихрей виртуального следа конкретного профиля (равна Gamma/2) используется для расчета давле...
std::vector< std::pair< size_t, size_t > > aflPan
Пара чисел: номер профиля и номер панели, на которой рожден виртуальный вихрь
Класс, опеделяющий набор вихрей
std::vector< Vortex2D > vtx
Список вихревых элементов
VMlib::vmTimer timerConvVelo
size_t getNumberOfAirfoil() const
Возврат количества профилей в задаче
bool isAnyMovableOrDeformable() const
Возврат признака того, что хотя бы один из профилей подвижный или деформируемый
const Wake & getWake() const
Возврат константной ссылки на вихревой след
const Airfoil & getAirfoil(size_t i) const
Возврат константной ссылки на объект профиля
const WakeDataBase & getSource() const
Возврат константной ссылки на источники в области течения
CpuTreeInfo & getCntrTreePnl() const
Gpu & getNonConstCuda() const
Возврат неконстантной ссылки на объект, связанный с видеокартой (GPU)
Velocity & getNonConstVelocity() const
Возврат неконстантной ссылки на объект для вычисления скоростей
MeasureVP & getNonConstMeasureVP() const
Возврат неконстантной ссылки на measureVP.
VMlib::TimersGen & getTimers() const
Возврат ссылки на временную статистику выполнения шага расчета по времени
const Mechanics & getMechanics(size_t i) const
Возврат константной ссылки на объект механики
Point2D getV0() const
Возврат текущей скорости набегающего потока
const std::pair< Eigen::MatrixXd, Eigen::MatrixXd > & getIQ(size_t i, size_t j) const
Возврат константной ссылки на объект, связанный с матрицей интегралов от (r-xi)/|r-xi|^2.
const Gpu & getCuda() const
Возврат константной ссылки на объект, связанный с видеокартой (GPU)
const Passport & getPassport() const
Возврат константной ссылки на паспорт
Boundary & getNonConstBoundary(size_t i) const
Возврат неконстантной ссылки на объект граничного условия
CpuTreeInfo & getCntrTreeVP() const
const Boundary & getBoundary(size_t i) const
Возврат константной ссылки на объект граничного условия
bool ifDivisible(int val) const
size_t getNumberOfBoundary() const
Возврат количества граничных условий в задаче
Airfoil & getNonConstAirfoil(size_t i) const
Возврат неконстантной ссылки на объект профиля
const MeasureVP & getMeasureVP() const
Возврат константной ссылки на measureVP.
CpuTreeInfo & getInflTreeWake() const
TimeDiscretizationProperties timeDiscretizationProperties
Структура с параметрами процесса интегрирования по времени
std::string dir
Рабочий каталог задачи
void stop(const std::string &timerLabel)
Останов счетчика
void start(const std::string &timerLabel)
Запуск счетчика
Класс, опеделяющий двумерный вихревой элемент
HD Point2D & r()
Функция для доступа к радиус-вектору вихря
HD double & g()
Функция для доступа к циркуляции вихря
double getCurrentTime() const
size_t getCurrentStep() const
Возврат константной ссылки на параметры распараллеливания по MPI.
P length() const
Вычисление 2-нормы (длины) вектора
void normalize(P newlen=1.0)
Нормирование вектора на заданную длину
const vmTimer & stop() const
Останов работающего счетчика времени
const vmTimer & start() const
Запуск (первый или повторный) счетчика времени
const vmTimer & reset() const
Сброс счетчика времени
void CreateUserDirectory(const std::string &dir, const std::string &name)
Создание каталога
std::string fileNameStep(const std::string &name, int length, size_t number, const std::string &ext)
Формирование имени файла
std::pair< std::string, int > boundaryCondition
Метод аппроксимации граничных условий
std::pair< std::string, int > velocityComputation
double vRef
Референсная скорость
double nu
Коэффициент кинематической вязкости среды
std::vector< Point2D > convVelo
Вектор конвективных скоростей вихрей
std::vector< double > epsastWake
Вектор характерных радиусов вихревых доменов (eps*)
std::vector< Point2D > I2
Вектор числителей (I2) диффузионных скоростей вихрей (обусловленных завихренностью)
std::vector< double > I0
Вектор знаменателей (I0) диффузионных скоростей вихрей (обусловленных профилем)
std::vector< Point2D > diffVelo
Вектор диффузионных скоростей вихрей
std::vector< Point2D > I3
Вектор числителей (I3) диффузионных скоростей вихрей (обусловленных профилем)
std::vector< double > I1
Вектор знаменателей (I1) диффузионных скоростей вихрей (обусловленных завихренностью)
double getMinEpsAst() const
Функция минимально возможного значения для epsAst.
double epscol
Радиус коллапса
int saveVPstep
Шаг вычисления и сохранения скорости и давления
int saveVtxStep
Шаг сохранения кадров в бинарные файлы
int saveVisStress
Шаг вычисления и сохранения скорости и давления
int nameLength
Число разрядов в имени файла