71 std::string filename = dir +
"pointsVP";
74 if (fileExistTest(filename,
W.
getInfo(),
true, {
"txt",
"TXT" }))
96 std::string VPFileNameList =
W.
getPassport().
dir +
"velPres/listPoints";
97 std::ofstream VPFileList(VPFileNameList.c_str());
99 VMlib::PrintLogoToTextFile(VPFileList, VPFileNameList.c_str(),
"List of points, where velocity and pressure are measured in csv-files");
107 std::string VPFileNameCsv;
110 std::ofstream VPFileCsv(VPFileNameCsv.c_str());
113 VPFileCsv <<
"pt,t,Vx,Vy,p" << std::endl;
115 VPFileCsv <<
"pt,t,CVx,CVy,Cp" << std::endl;
146 std::string VPFileNameList =
W.
getPassport().
dir +
"velPres/listPoints";
147 std::ofstream VPFileList(VPFileNameList.c_str());
149 VMlib::PrintLogoToTextFile(VPFileList, VPFileNameList.c_str(),
"List of points, where velocity and pressure are measured in csv-files");
157 std::string VPFileNameCsv;
160 std::ofstream VPFileCsv(VPFileNameCsv.c_str());
163 VPFileCsv <<
"pt,t,Vx,Vy,p" << std::endl;
165 VPFileCsv <<
"pt,t,CVx,CVy,Cp" << std::endl;
223 addvtx.
sigma() = -1.0;
224 wakeVP->vtx.push_back(addvtx);
232 addvtx.
sigma() = -1.0;
233 wakeVP->vtx.push_back(addvtx);
242 if ((ptr !=
nullptr) && (ptr->
beam->fsi))
246 W.
getInfo(
'e') <<
"Only airfoil 0 can be elastic!" << std::endl;
253 for (
size_t q = 0; q < ptr->
chord.size(); ++q)
255 std::pair<size_t, size_t> pnls = ptr->
chord[q].infPanels;
276 for (
size_t q = 0; q <
W.
getAirfoil(afl).getNumberOfPanels(); ++q)
295 addvtx.
sigma() = -1.0;
296 wakeVP->vtx.push_back(addvtx);
309 int addWSize = (int)
wakeVP->vtx.size();
319 double P0 = 0.5 * V0.
length2();
323#pragma warning (push)
324#pragma warning (disable: 4101)
330#pragma omp parallel for default(none) private(alpha, lambda, dri, Vi, vi, dst2eps, cPan) shared(P0, dt, V0, addWSize, std::cout, IDPI)
331 for (
int i = 0; i < addWSize; ++i)
339 for (
size_t j = 0; j <
W.
getWake().
vtx.size(); ++j)
344 const double sigma2 = sqr(
W.
getWake().
vtx[j].sigma());
366 Point2D skos =
IDPI * ((alpha * u0).kcross() + (lambda * u0));
375 Vi = 0.5 * (afl.
getV(pnl) + afl.
getV(pnl + 1));
438 alpha = atan2((cPan - pt) ^ (rcm - pt), (cPan - pt) & (rcm - pt));
442 for (
int q = 0; q <
W.
getAirfoil(bou).possibleWays[way - 1].size() + 1; ++q)
446 alpha += atan2((finish - pt) ^ (start - pt), (finish - pt) & (start - pt));
456 lambda = 0.5 * log((pt - cPan).length2());
462 for (
size_t i = 0; i <
pressure.size(); ++i)
471void MeasureVP::GPUCalcPressure()
475 int addWSize = (int)
wakeVP->vtx.size();
478#if (defined(USE_CUDA))
489 std::vector<double> oldAttVortexSheet, oldAttSourceSheet, gammaThroughIntensity;
490 oldAttVortexSheet.reserve(npnl);
491 oldAttSourceSheet.reserve(npnl);
492 gammaThroughIntensity.reserve(npnl);
495 for (
size_t p = 0; p <
W.
getBoundary(bou).afl.getNumberOfPanels(); ++p)
502 double* devOldVortexSheet;
503 cudaMalloc(&devOldVortexSheet, npnl *
sizeof(
double));
504 cudaMemcpy(devOldVortexSheet, oldAttVortexSheet.data(), npnl *
sizeof(
double), cudaMemcpyHostToDevice);
506 double* devOldSourceSheet;
507 cudaMalloc(&devOldSourceSheet, npnl *
sizeof(
double));
508 cudaMemcpy(devOldSourceSheet, oldAttSourceSheet.data(), npnl *
sizeof(
double), cudaMemcpyHostToDevice);
510 double* devGammaThroughIntensity;
511 cudaMalloc(&devGammaThroughIntensity, npnl *
sizeof(
double));
512 cudaMemcpy(devGammaThroughIntensity, gammaThroughIntensity.data(), npnl *
sizeof(
double), cudaMemcpyHostToDevice);
515 cudaMalloc(&devDiffVelo,
W.
getWake().
vtx.size() * 2 *
sizeof(
double));
519 cuCalculatePressure(addWSize,
wakeVP->devVtxPtr,
522 devOldVortexSheet, devOldSourceSheet, devGammaThroughIntensity,
523 this->devPressurePtr);
525 cudaFree(devOldVortexSheet);
526 cudaFree(devOldSourceSheet);
527 cudaFree(devGammaThroughIntensity);
528 cudaFree(devDiffVelo);
530 std::vector<double> presGPU(addWSize);
531 cuCopyMemFromDev(presGPU.data(), this->devPressurePtr, addWSize *
sizeof(
double), 18);
544 double P0 = 0.5 * V0.
length2();
548#pragma warning (push)
549#pragma warning (disable: 4101)
555 for (
int i = 0; i < addWSize; ++i)
562#pragma omp parallel for default(none) private(alpha, lambda, dri, Vi, vi, dst2eps, cPan) shared(P0, dt, V0, addWSize, std::cout, IDPI)
563 for (
int i = 0; i < addWSize; ++i)
609 for (
size_t j = 0; j <
W.
getAirfoil(bou).getNumberOfPanels(); ++j)
620 alpha = atan2((cPan - pt) ^ (rcm - pt), (cPan - pt) & (rcm - pt));
624 for (
int q = 0; q <
W.
getAirfoil(bou).possibleWays[way - 1].size() + 1; ++q)
626 Point2D start = ((q == 0) ? rcm :
W.getAirfoil(bou).possibleWays[way - 1][q - 1]);
628 alpha += atan2((finish - pt) ^ (start - pt), (finish - pt) & (start - pt));
637 lambda = 0.5 * log((pt - cPan).length2());
643 for (
size_t i = 0; i <
pressure.size(); ++i)
658 double scaleV = 1.0, scaleP = 1.0;
667 std::ofstream outfile;
677 outfile <<
"# vtk DataFile Version 2.0\n";
679 outfile <<
"ASCII\n";
680 outfile <<
"DATASET UNSTRUCTURED_GRID\n";
681 outfile <<
"POINTS " << nRealPressurePoints <<
" float\n";
683 for (
size_t i = 0; i < nRealPressurePoints; ++i)
685 double xi = (
wakeVP->vtx[i].r())[0];
686 double yi = (
wakeVP->vtx[i].r())[1];
687 outfile << xi <<
" " << yi <<
" " <<
"0.0\n";
690 outfile <<
"CELLS " << nRealPressurePoints <<
" " << 2 * nRealPressurePoints <<
'\n';
691 for (
size_t i = 0; i < nRealPressurePoints; ++i)
692 outfile <<
"1 " << i <<
'\n';
694 outfile <<
"CELL_TYPES " << nRealPressurePoints <<
'\n';
695 for (
size_t i = 0; i < nRealPressurePoints; ++i)
699 outfile <<
"POINT_DATA " << nRealPressurePoints <<
'\n';
702 outfile <<
"VECTORS V float\n";
704 outfile <<
"VECTORS CV float\n";
706 for (
size_t i = 0; i < nRealPressurePoints; ++i)
708 outfile <<
velocity[i][0] * scaleV <<
" " <<
velocity[i][1] * scaleV <<
" 0.0\n";
714 outfile <<
"SCALARS P float 1\n";
716 outfile <<
"SCALARS CP float 1\n";
718 outfile <<
"LOOKUP_TABLE default\n";
720 for (
size_t i = 0; i < nRealPressurePoints; ++i)
722 outfile <<
pressure[i] * scaleP <<
'\n';
731 bool littleEndian = (*((uint8_t*)&x));
732 const char eolnBIN[] =
"\n";
735 outfile.open(
W.
getPassport().
dir +
"velPres/" + fname, std::ios::out | std::ios::binary);
738 outfile <<
"BINARY" << eolnBIN;
739 outfile <<
"DATASET UNSTRUCTURED_GRID" << eolnBIN <<
"POINTS " << nRealPressurePoints <<
" " <<
"float" << eolnBIN;
742 Eigen::VectorXf pData = Eigen::VectorXf::Zero(nRealPressurePoints);
743 Eigen::VectorXf vData = Eigen::VectorXf::Zero(nRealPressurePoints * 3);
744 Eigen::VectorXf rData = Eigen::VectorXf::Zero(nRealPressurePoints * 3);
747 for (
size_t i = 0; i < nRealPressurePoints; ++i)
749 rData(3 * i + 0) = (float)(
wakeVP->vtx[i].r())[0];
750 rData(3 * i + 1) = (float)(
wakeVP->vtx[i].r())[1];
753 for (
size_t i = 0; i < nRealPressurePoints; ++i)
755 vData(3 * i + 0) = (float)(
velocity[i][0] * scaleV);
756 vData(3 * i + 1) = (float)(
velocity[i][1] * scaleV);
759 for (
size_t i = 0; i < nRealPressurePoints; ++i)
761 pData(i) = (float)(
pressure[i] * scaleP);
766 for (
int i = 0; i < nRealPressurePoints * 3; ++i)
768 outfile.write(
reinterpret_cast<char*
>(rData.data()), nRealPressurePoints * 3 *
sizeof(float));
771 std::vector<int> cells(2 * nRealPressurePoints);
772 for (
size_t i = 0; i < nRealPressurePoints; ++i)
774 cells[2 * i + 0] = 1;
775 cells[2 * i + 1] = (int)i;
778 std::vector<int> cellsTypes;
779 cellsTypes.resize(nRealPressurePoints, 1);
783 for (
int i = 0; i < nRealPressurePoints * 2; ++i)
786 for (
int i = 0; i < nRealPressurePoints; ++i)
790 outfile << eolnBIN <<
"CELLS " << nRealPressurePoints <<
" " << nRealPressurePoints * 2 << eolnBIN;
791 outfile.write(
reinterpret_cast<char*
>(cells.data()), nRealPressurePoints * 2 *
sizeof(int));
792 outfile << eolnBIN <<
"CELL_TYPES " << nRealPressurePoints << eolnBIN;
793 outfile.write(
reinterpret_cast<char*
>(cellsTypes.data()), nRealPressurePoints *
sizeof(
int));
797 for (
int i = 0; i < nRealPressurePoints * 3; ++i)
800 outfile << eolnBIN <<
"POINT_DATA " << nRealPressurePoints << eolnBIN;
803 outfile <<
"VECTORS V " <<
"float" << eolnBIN;
805 outfile <<
"VECTORS CV " <<
"float" << eolnBIN;
807 outfile.write(
reinterpret_cast<char*
>(vData.data()), nRealPressurePoints * 3 *
sizeof(
float));
811 for (
int i = 0; i < nRealPressurePoints; ++i)
815 outfile << eolnBIN <<
"SCALARS P " <<
"float" <<
" 1" << eolnBIN;
817 outfile << eolnBIN <<
"SCALARS CP " <<
"float" <<
" 1" << eolnBIN;
819 outfile <<
"LOOKUP_TABLE default" << eolnBIN;
820 outfile.write(
reinterpret_cast<char*
>(pData.data()), nRealPressurePoints *
sizeof(
float));
832 outfile <<
"point,x,y,Vx,Vy,P\n";
834 outfile <<
"point,x,y,CVx,CVy,CP\n";
836 for (
size_t i = 0; i < nRealPressurePoints; ++i)
838 double xi = (
wakeVP->vtx[i].r())[0];
839 double yi = (
wakeVP->vtx[i].r())[1];
840 outfile << i <<
"," << xi <<
"," << yi \
842 <<
"," <<
pressure[i] * scaleP <<
'\n';
848 std::string fnameBunCsv =
W.
getPassport().
dir +
"velPres/" +
"velPresBundle.csv";
849 std::ofstream VPFileBunCsv(fnameBunCsv.c_str(),
W.
getCurrentStep() ? std::ios::app : std::ios::out);
852 VPFileBunCsv << nRealPressurePoints <<
'\n';
855 for (
size_t q = 0; q < nRealPressurePoints; ++q)
860 <<
wakeVP->vtx[q].r()[0] <<
"," <<
wakeVP->vtx[q].r()[1] <<
"," \
870 #pragma omp parallel for
876 std::string VPFileNameCsv;
879 std::ofstream VPFileCsv(VPFileNameCsv.c_str(),
W.
getCurrentStep() ? std::ios::app : std::ios::out);
882 VPFileCsv <<
"point,time,Vx,Vy,P\n";
884 VPFileCsv <<
"point,time,CVx,CVy,CP\n";
900 #pragma omp parallel for
903 std::string VPFileNameCsv;
906 std::ofstream VPFileCsv(VPFileNameCsv.c_str(),
W.
getCurrentStep() ? std::ios::app : std::ios::out);
908 VPFileCsv <<
sstr[q].str();
926 std::vector<std::pair<Point2D, double>> result;
932 result.push_back({ velocity[nRealPressurePoints + q], pressure[nRealPressurePoints + q] });
Заголовочный файл с описанием класса Airfoil.
Заголовочный файл с описанием класса Boundary.
Заголовочный файл с функциями для метода GMRES.
Заголовочный файл с описанием класса MeasureVP.
Заголовочный файл с описанием класса Mechanics.
Заголовочный файл с описанием класса Preprocessor.
Заголовочный файл с описанием класса 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 > nrm
Нормали к панелям профиля
std::vector< Point2D > tau
Касательные к панелям профиля
Point2D rcm
Положение центра масс профиля
size_t getNumberOfPanels() const
Возврат количества панелей на профиле
Абстрактный класс, определяющий обтекаемый профиль
std::vector< double > gammaThrough
Суммарные циркуляции вихрей, пересекших панели профиля на прошлом шаге
std::vector< int > wayToVertex
Номера путей к вершинам
std::vector< std::vector< Point2D > > possibleWays
Возможные пути внутри профиля от точки (0, 0) к центрам всех панелей
Абстрактный класс, определяющий способ удовлетворения граничного условия на обтекаемом профиле
Sheet oldSheets
Слои на профиле с предыдущего шага
Sheet sheets
Слои на профиле
std::vector< Point2D > initialPoints
Точки, которые считываются из файла (давление пишется в vtk-файлы)
std::vector< double > pressure
Давление в нужных точках
void ReadPointsFromFile(const std::string &dir)
Чтение точек, в которых нужно посчитать давление и скорость
void SaveVP()
Сохранение в файл вычисленных скоростей и давлений
const World2D & W
Константная ссылка на решаемую задачу
std::vector< Point2D > historyPoints
Точки, которые считываются из файла (давление пишется в vtk и csv-файлы)
std::unique_ptr< WakeDataBase > wakeVP
Умный указатель на точки, в которых нужно вычислять в данный момент времени Хранятся в виде "мнимой" ...
std::vector< Point2D > elasticPoints
Точки, в которых давление нужно вычислять в служебных целях (для задач гидроупругости),...
std::vector< double > domainRadius
Радиусы вихрей в нужных точках
void Initialization()
Инициализация векторов для вычисления скоростей и давлений Вызывается только на тех шагах расчета,...
void SetPoints(const std::vector< Point2D > &points, const std::vector< Point2D > &history)
std::vector< std::pair< Point2D, double > > GetVPinElasticPoints()
Возврат давления в "гидроупругих" точках
void CalcPressure()
Расчет поля давления
MeasureVP(const World2D &W_)
Конструктор
std::vector< Point2D > velocity
Скорости в нужных точках
std::vector< std::ostringstream > sstr
PhysicalProperties physicalProperties
Структура с физическими свойствами задачи
bool calcCoefficients
Признак вычисления коэффициентов вместо сил
double rotateAngleVpPoints
Угол поворота точек VP.
const double & attachedVortexSheet(size_t n, size_t moment) const
const double & attachedSourceSheet(size_t n, size_t moment) const
const double & freeVortexSheet(size_t n, size_t moment) const
VortexesParams wakeVortexesParams
Струтура, определяющая параметры вихрей в следе
Класс, опеделяющий набор вихрей
std::vector< Vortex2D > vtx
Список вихревых элементов
Класс, опеделяющий текущую решаемую задачу
size_t getNumberOfAirfoil() const
Возврат количества профилей в задаче
const Wake & getWake() const
Возврат константной ссылки на вихревой след
const Airfoil & getAirfoil(size_t i) const
Возврат константной ссылки на объект профиля
Velocity & getNonConstVelocity() const
Возврат неконстантной ссылки на объект для вычисления скоростей
VMlib::TimersGen & getTimers() const
Возврат ссылки на временную статистику выполнения шага расчета по времени
Point2D getV0() const
Возврат текущей скорости набегающего потока
const Velocity & getVelocity() const
Возврат константной ссылки на объект для вычисления скоростей
const Passport & getPassport() const
Возврат константной ссылки на паспорт
const Boundary & getBoundary(size_t i) const
Возврат константной ссылки на объект граничного условия
size_t getNumberOfBoundary() const
Возврат количества граничных условий в задаче
Mechanics & getNonConstMechanics(size_t i) const
Возврат неконстантной ссылки на объект механики
TimeDiscretizationProperties timeDiscretizationProperties
Структура с параметрами процесса интегрирования по времени
std::string dir
Рабочий каталог задачи
Класс, позволяющий выполнять предварительную обработку файлов
Класс, позволяющий выполнять разбор файлов и строк с настройками и параметрами
bool get(const std::string &name, std::vector< Point2D > &res, const std::vector< Point2D > *defValue=nullptr, bool echoDefault=true) const
Считывание вектора из двумерных точек из базы данных
void stop(const std::string &timerLabel)
Останов счетчика
void start(const std::string &timerLabel)
Запуск счетчика
Класс, опеделяющий двумерный вихревой элемент
HD double & sigma()
Функция для доступа к радиусу вихря
HD Point2D & r()
Функция для доступа к радиус-вектору вихря
HD double & g()
Функция для доступа к циркуляции вихря
VMlib::LogStream & getInfo() const
Возврат ссылки на объект LogStream Используется в техничеcких целях для организации вывода
double getCurrentTime() const
size_t getCurrentStep() const
Возврат константной ссылки на параметры распараллеливания по MPI.
numvector< T, 2 > kcross() const
Геометрический поворот двумерного вектора на 90 градусов
auto length2() const -> typename std::remove_const< typename std::remove_reference< decltype(this->data[0])>::type >::type
Вычисление квадрата нормы (длины) вектора
void PrintHeaderToTextFile(std::ofstream &str, const std::string &header)
Формирование подзаголовка в текстовом файле вывода программы VM2D/VM3D.
void CreateUserDirectory(const std::string &dir, const std::string &name)
Создание каталога
double Lambda(const Point2D &p, const Point2D &s)
Вспомогательная функция вычисления логарифма отношения норм векторов
void PrintLogoToTextFile(std::ofstream &str, const std::string &fileName, const std::string &descr)
Формирование заголовка файла программы VM2D/VM3D.
std::string fileNameStep(const std::string &name, int length, size_t number, const std::string &ext)
Формирование имени файла
double boundDenom(double r2, double eps2)
Способ сглаживания скорости вихря (вихрь Рэнкина или вихрь Ламба)
double Alpha(const Point2D &p, const Point2D &s)
Вспомогательная функция вычисления угла между векторами
std::string CurrentDataTime()
Формирование строки с текущем временем и датой
void SwapEnd(T &var)
Вспомогательная функция перестановки байт местами (нужно для сохранения бинарных VTK)
double vRef
Референсная скорость
double rho
Плотность потока
std::vector< Point2D > convVelo
Вектор конвективных скоростей вихрей
std::vector< Point2D > diffVelo
Вектор диффузионных скоростей вихрей
int saveVPstep
Шаг вычисления и сохранения скорости и давления
int nameLength
Число разрядов в имени файла
std::pair< std::string, int > fileTypeVP
Тип файлов для сохранения скорости и давления