58#if (defined(__CUDACC__) || defined(USE_CUDA)) && (defined(CU_I1I2))
75#if (defined(__CUDACC__) || defined(USE_CUDA)) && (defined(CU_I1I2))
85#pragma omp parallel for private(I1, I2)
103#if (defined(__CUDACC__) || defined(USE_CUDA)) && (defined(CU_I0I3))
117#pragma omp parallel for private(I0, I3, domrad)
130 if (fabs(I0) > 1.e-8)
138 for (
size_t i = 0; i < diffVel.size(); ++i)
152 double t12start, t12finish;
153 double t03start, t03finish;
154 double tOtherstart, tOtherfinish;
158 t12start = omp_get_wtime();
160 t12finish = omp_get_wtime();
162 t03start = omp_get_wtime();
164 t03finish = omp_get_wtime();
166 tOtherstart = omp_get_wtime();
174 for (
size_t i = 0; i <
W.
getAirfoil(afl).viscousStress.size(); ++i)
181 size_t nVirtVortices = 0;
198 tOtherfinish = omp_get_wtime();
208 std::vector<double> selfI1(pointsDb.
vtx.size(), 0.0);
209 std::vector<Point2D> selfI2(pointsDb.
vtx.size(), { 0.0, 0.0 });
211#pragma warning (push)
212#pragma warning (disable: 4101)
216 double diffRadius, domRad;
222#pragma omp parallel for default(none) shared(selfI1, selfI2, domainRadius, vorticesDb, pointsDb) private(Rij, rij, expr, diffRadius, domRad, left, right, posJx)
223 for (
int i = 0; i < pointsDb.
vtx.size(); ++i)
230 diffRadius = 8.0 * domRad;
232 left = vtxI.
r()[0] - diffRadius;
233 right = vtxI.
r()[0] + diffRadius;
235 for (
size_t j = 0; j < vorticesDb.
vtx.size(); ++j)
240 if ((left < posJx) && (posJx < right))
242 Rij = vtxI.
r() - vtxJ.
r();
244 if (rij < diffRadius && rij > 1.e-10)
246 expr = exp(-rij / domRad);
247 selfI2[i] += (vtxJ.
g()* expr / rij) * Rij;
248 selfI1[i] += vtxJ.
g()*expr;
255 for (
size_t i = 0; i < I1.size(); ++i)
266 double tCPUSTART, tCPUEND;
268 tCPUSTART = omp_get_wtime();
270 std::vector<double> selfI1(pointsDb.
vtx.size(), 0.0);
271 std::vector<Point2D> selfI2(pointsDb.
vtx.size(), { 0.0, 0.0 });
273#pragma warning (push)
274#pragma warning (disable: 4101)
286#pragma omp parallel for default(none) shared(selfI1, selfI2, domainRadius, bnd, pointsDb, std::cout) private(Rij, rij, expr, domRad, diffRadius, left, right, posJx)
287 for (
int i = 0; i < pointsDb.
vtx.size(); ++i)
294 diffRadius = 8.0 * domRad;
296 left = vtxI.
r()[0] - diffRadius;
297 right = vtxI.
r()[0] + diffRadius;
302 const int nQuadPt = 3;
307 for (
int q = 0; q < nQuadPt; ++q)
312 if ((left < posJx) && (posJx < right))
314 Rij = vtxI.
r() - ptJ;
316 if (rij < diffRadius && rij > 1.e-10)
318 expr = exp(-rij / domRad);
319 selfI2[i] += (ptG * expr / rij) * Rij;
320 selfI1[i] += ptG * expr;
327 for (
size_t i = 0; i < I1.size(); ++i)
333 tCPUEND = omp_get_wtime();
339#if defined (USE_CUDA)
341void Velocity::GPUCalcDiffVeloI1I2ToSetOfPointsFromWake(
const WakeDataBase& pointsDb,
const std::vector<double>& domainRadius,
const WakeDataBase& vorticesDb, std::vector<double>& I1, std::vector<Point2D>& I2,
bool useMesh)
345 size_t npt = pointsDb.
vtx.size();
353 double*& dev_ptr_pt = pointsDb.devVtxPtr;
354 double*& dev_ptr_dr = pointsDb.devRadPtr;
356 const size_t nvt = vorticesDb.
vtx.size();
357 double*& dev_ptr_vt = vorticesDb.devVtxPtr;
359 std::vector<Point2D> newI2(npt);
360 std::vector<double> newI1(npt);
362 double*& dev_ptr_i1 = pointsDb.devI1Ptr;
363 double*& dev_ptr_i2 = pointsDb.devI2Ptr;
366 if ((nvt > 0) && (npt > 0))
370 cuCalculateDiffVeloWake(npt, dev_ptr_pt, nvt, dev_ptr_vt, dev_ptr_i1, dev_ptr_i2, dev_ptr_dr, minRad);
374 W.
getCuda().CopyMemFromDev<double, 2>(npt, dev_ptr_i2, (
double*)newI2.data(), 10);
375 W.
getCuda().CopyMemFromDev<double, 1>(npt, dev_ptr_i1, newI1.data(), 11);
379 for (
size_t q = 0; q < I2.size(); ++q)
388 size_t curGlobPnl = 0;
393 for (
size_t q = 0; q < nv; ++q)
407void Velocity::GPUCalcDiffVeloI1I2ToSetOfPointsFromSheets(
const WakeDataBase& pointsDb,
const std::vector<double>& domainRadius,
const Boundary& bou, std::vector<double>& I1, std::vector<Point2D>& I2,
bool useMesh)
413 size_t npt = pointsDb.
vtx.size();
414 double*& dev_ptr_pt = pointsDb.devVtxPtr;
415 double*& dev_ptr_dr = pointsDb.devRadPtr;
424 double*& dev_ptr_r = bou.
afl.devRPtr;
425 double*& dev_ptr_freeVortexSheet = bou.
afl.devFreeVortexSheetPtr;
426 double*& dev_ptr_freeVortexSheetLin = bou.
afl.devFreeVortexSheetLinPtr;
431 std::vector<Point2D> newI2(npt);
432 std::vector<double> newI1(npt);
434 double*& dev_ptr_i1 = pointsDb.devI1Ptr;
435 double*& dev_ptr_i2 = pointsDb.devI2Ptr;
438 if ((npnl > 0) && (npt > 0))
442 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);
446 W.
getCuda().CopyMemFromDev<double, 2>(npt, dev_ptr_i2, (
double*)newI2.data(), 12);
447 W.
getCuda().CopyMemFromDev<double, 1>(npt, dev_ptr_i1, newI1.data(), 13);
451 for (
size_t q = 0; q < I2.size(); ++q)
460 size_t curGlobPnl = 0;
465 for (
size_t q = 0; q < nv; ++q)
480void Velocity::GPUDiffVeloFAST(
const std::vector<double>& domainRadius, std::vector<double>& I1, std::vector<Point2D>& I2)
484 std::vector<Point2D> newI2(nvt);
485 std::vector<double> newI1(nvt);
487 double*& dev_ptr_i1 =
W.
getWake().devI1Ptr;
488 double*& dev_ptr_i2 =
W.
getWake().devI2Ptr;
490 size_t*
const& dev_nVortices =
W.
getCuda().dev_ptr_nVortices;
495 auto& treeWake = *
W.
getCuda().inflTreeWake;
496 treeWake.MemoryAllocate((
int)
W.
getCuda().n_CUDA_wake);
503 W.
getCuda().CopyMemFromDev<double, 2>(nvt, dev_ptr_i2, (
double*)newI2.
data(), 10);
504 W.
getCuda().CopyMemFromDev<double, 1>(nvt, dev_ptr_i1, newI1.data(), 11);
506 for (
size_t q = 0; q < I2.size(); ++q)
590 std::stringstream ss;
591 ss <<
"VisStress_" << q <<
"-";
593 std::ofstream outfile;
598 for (
size_t i = 0; i <
W.
getAirfoil(q).viscousStress.size(); ++i)
602 outfile << static_cast<int>(i) <<
" " << r[0] <<
" " << r[1] <<
" " << gi << std::endl;
620 std::vector<double> velI(shDim, 0.0);
622#pragma omp parallel for default(none) shared(shDim, afl, np, wakeRhs, IDPI) private(velI)
623 for (
int i = 0; i < np; ++i)
625 velI.assign(shDim, 0.0);
639 for (
size_t j = 0; j < shDim; ++j)
642 wakeRhs[i] = velI[0];
645 wakeRhs[np + i] = velI[1];
653void Velocity::GPUGetWakeInfluenceToRhs(
const Airfoil& afl, std::vector<double>& wakeVelo)
const
667 double*& dev_ptr_pt = afl.devRPtr;
668 double*& dev_ptr_vt =
W.
getWake().devVtxPtr;
669 double*& dev_ptr_sr =
W.
getSource().devVtxPtr;
670 double*& dev_ptr_rhs = afl.devRhsPtr;
671 double*& dev_ptr_rhsLin = afl.devRhsLinPtr;
673 std::vector<double> locrhs(nTotPan);
674 std::vector<double> locrhsLin(nTotPan);
678 if ((nvt > 0) || (nsr > 0))
680 cuCalculateRhs(nTotPan, dev_ptr_pt, nvt, dev_ptr_vt, nsr, dev_ptr_sr, eps2, dev_ptr_rhs, dev_ptr_rhsLin);
682 std::vector<double> newRhs(nTotPan), newRhsLin(nTotPan);
684 W.
getCuda().CopyMemFromDev<double, 1>(nTotPan, dev_ptr_rhs, newRhs.data(), 22);
686 W.
getCuda().CopyMemFromDev<double, 1>(nTotPan, dev_ptr_rhsLin, newRhsLin.data(), 22);
688 size_t curGlobPnl = 0;
694 tmpRhs.insert(tmpRhs.end(), newRhs.begin() + curGlobPnl, newRhs.begin() + curGlobPnl + np);
696 tmpRhs.insert(tmpRhs.end(), newRhsLin.begin() + curGlobPnl, newRhsLin.begin() + curGlobPnl + np);
703 if ((nvt > 0) || (nsr > 0))
704 wakeVelo = std::move(afl.tmpRhs);
713void Velocity::GPUFASTGetWakeInfluenceToRhs(
const Airfoil & afl, std::vector<double>&wakeVelo)
const
720 auto& inflTree = *
W.
getCuda().inflTreeWake;
729 double*& dev_ptr_pt = afl.devRPtr;
730 double*& dev_ptr_vt =
W.
getWake().devVtxPtr;
731 double*& dev_ptr_sr =
W.
getSource().devVtxPtr;
732 double*& dev_ptr_rhs = afl.devRhsPtr;
733 double*& dev_ptr_rhsLin = afl.devRhsLinPtr;
734 std::vector<double> locrhs(nTotPan);
735 std::vector<double> locrhsLin(nTotPan);
737 if ((nvt > 0) || (nsr > 0))
741 double* linPtr = (
double*)((shDim == 1) ? nullptr : dev_ptr_rhsLin);
743 auto& inflTree = *
W.
getCuda().inflTreeWake;
744 auto& cntrTree = *
W.
getCuda().cntrTreePnl;
746 inflTree.DownwardTraversalVorticesToPanels(cntrTree, (
double*)dev_ptr_rhs,
750 std::vector<double> newRhs(nTotPan), newRhsLin(nTotPan);
752 W.
getCuda().CopyMemFromDev<double, 1>(nTotPan, dev_ptr_rhs, newRhs.data(), 22);
754 W.
getCuda().CopyMemFromDev<double, 1>(nTotPan, dev_ptr_rhsLin, newRhsLin.data(), 22);
756 size_t curGlobPnl = 0;
762 tmpRhs.insert(tmpRhs.end(), newRhs.begin() + curGlobPnl, newRhs.begin() + curGlobPnl + np);
764 tmpRhs.insert(tmpRhs.end(), newRhsLin.begin() + curGlobPnl, newRhsLin.begin() + curGlobPnl + np);
771 if ((nvt > 0) || (nsr > 0))
772 wakeVelo = std::move(afl.tmpRhs);
783 Eigen::VectorXd locRhs;
786 size_t currentRow = 0;
787 size_t currentSkosRow = 0;
801 locRhs.resize(nVars);
804 std::vector<double> wakeRhs;
806 double tt1 = omp_get_wtime();
808#if (defined(__CUDACC__) || defined(USE_CUDA)) && (defined(CU_RHS))
812 GPUFASTGetWakeInfluenceToRhs(afl, wakeRhs);
814 GPUGetWakeInfluenceToRhs(afl, wakeRhs);
819 std::vector<double> vInfRhs;
822#pragma omp parallel for \
824 shared(locRhs, afl, bou, wakeRhs, vInfRhs, np) \
825 schedule(dynamic, DYN_SCHEDULE)
828 locRhs(i) = -vInfRhs[i] - wakeRhs[i] + 0.25 * ((afl.
getV(i) + afl.
getV(i + 1)) & afl.
tau[i]);
830 locRhs(np + i) = -vInfRhs[np + i] - wakeRhs[np + i];
839 const auto& iq =
W.
getIQ(bou, q);
846 if ((i != j) || (bou != q))
848 locRhs(i) += -iq.first(i, j) * sht.attachedVortexSheet(j, 0);
849 locRhs(i) += -iq.second(i, j) * sht.attachedSourceSheet(j, 0);
874 for (
size_t i = 0; i < nVars; ++i)
875 rhsReord(i + currentSkosRow) = locRhs(i);
877 rhsReord(nAllVars + bou) = lastRhs[bou];
879 currentRow += nVars + 1;
880 currentSkosRow += nVars;
893#if (defined(__CUDACC__) || defined(USE_CUDA)) && (defined(CU_CONV_TOWAKE))
899 std::unique_ptr<BHcu::CudaTreeInfo>& cntrTree =
W.
getNonConstCuda().cntrTreeWake;
903 cntrTree->MemoryAllocate((
int)
W.
getCuda().n_CUDA_wake);
908 treeWake.MemoryAllocate((
int)
W.
getCuda().n_CUDA_wake);
921 std::vector<Point2D> nullVector(0);
926#if (defined(__CUDACC__) || defined(USE_CUDA)) && (defined(CU_CONVVIRT))
947 size_t nVirtVortices = 0;
954 for (
size_t v = 0; v <
W.
getBoundary(bou).virtualWake.vtx.size(); ++v)
965 size_t nVirtVortices = 0;
1015 std::vector<Point2D> velConvWake;
1016 std::vector<std::vector<Point2D>> velConvBou;
1020 velConvWake.resize(addWSize, { 0.0, 0.0 });
1024 velConvBou[i].resize(addWSize, { 0.0, 0.0 });
1027 velocityRef.assign(addWSize,
W.
getV0());
1030#if (defined(USE_CUDA))
1034#if (defined(__CUDACC__) || defined(USE_CUDA)) && (defined(CU_VP))
1035 std::unique_ptr<BHcu::CudaTreeInfo>& cntrTree =
W.
getNonConstCuda().cntrTreeVP;
1040 cntrTree->MemoryAllocate((
int)
W.
getCuda().n_CUDA_velVP);
1058#
if (defined(__CUDACC__) || defined(USE_CUDA)) && (defined(
CU_VP))
1064 for (
int s = 0; s < addWSize; ++s)
1065 velocityRef[s] += velConvWake[s];
1067 for (
size_t bou = 0; bou < velConvBou.size(); ++bou)
1068 for (
int j = 0; j < addWSize; ++j)
1069 velocityRef[j] += velConvBou[bou][j];
1078 for (
int i = 0; i < addWSize; ++i)
1079 velocityRef[i] += velConvWake[i];
1081 for (
size_t bou = 0; bou < velConvBou.size(); ++bou)
1082 for (
int j = 0; j < addWSize; ++j)
1083 velocityRef[j] += velConvBou[bou][j];
Заголовочный файл с описанием класса Airfoil.
Заголовок основного класса BarnesHut.
Заголовочный файл с описанием класса Boundary.
Заголовочный файл с описанием класса 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
Вычисление влияния части подряд идущих источников из области течения на панель для правой части
virtual void GetDiffVelocityI0I3ToWakeAndViscousStresses(const WakeDataBase &pointsDb, std::vector< double > &domainRadius, std::vector< double > &I0, std::vector< Point2D > &I3)
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 диффузионной скорости
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
Вычисление конвективных скоростей в наборе точек, вызываемых наличием слоев вихрей и источников на пр...
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
Генерация вектора влияния вихревого следа на профиль
virtual void CalcConvVPVeloToSetOfPointsFromWake(const WakeDataBase &pointsDb, std::vector< Point2D > &velo, std::vector< double > &domainRadius, bool calcVelo, bool calcRadius)
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)
std::vector< VortexesParams > virtualVortexesParams
Вектор струтур, определяющий параметры виртуальных вихрей для профилей
virtual void CalcConvVeloToSetOfPointsFromWake(const WakeDataBase &pointsDb, std::vector< Point2D > &velo, std::vector< double > &domainRadius, bool calcVelo, bool calcRadius)=0
Вычисление конвективных скоростей и радиусов вихревых доменов в заданном наборе точек от следа
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
Константная ссылка на решаемую задачу
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
Возврат константной ссылки на источники в области течения
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
Возврат неконстантной ссылки на объект граничного условия
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.
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
Сброс счетчика времени
const double multipoleTheta
std::string fileNameStep(const std::string &name, int length, size_t number, const std::string &ext)
Формирование имени файла
void CreateDirectory(const std::string &dir, const std::string &name)
Создание каталога
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
Радиус коллапса
double eps2
Квадрат радиуса вихря
int saveVPstep
Шаг вычисления и сохранения скорости и давления
int saveVtxStep
Шаг сохранения кадров в бинарные файлы
int saveVisStress
Шаг вычисления и сохранения скорости и давления
int nameLength
Число разрядов в имени файла