70 std::string filename = dir +
"pointsVP";
73 if (fileExistTest(filename,
W.
getInfo(),
true, {
"txt",
"TXT" }))
95 std::string VPFileNameList =
W.
getPassport().
dir +
"velPres/listPoints";
96 std::ofstream VPFileList(VPFileNameList.c_str());
98 VMlib::PrintLogoToTextFile(VPFileList, VPFileNameList.c_str(),
"List of points, where velocity and pressure are measured in csv-files");
106 std::string VPFileNameCsv;
109 std::ofstream VPFileCsv(VPFileNameCsv.c_str());
112 VPFileCsv <<
"pt,t,Vx,Vy,p" << std::endl;
114 VPFileCsv <<
"pt,t,CVx,CVy,Cp" << std::endl;
145 std::string VPFileNameList =
W.
getPassport().
dir +
"velPres/listPoints";
146 std::ofstream VPFileList(VPFileNameList.c_str());
148 VMlib::PrintLogoToTextFile(VPFileList, VPFileNameList.c_str(),
"List of points, where velocity and pressure are measured in csv-files");
156 std::string VPFileNameCsv;
159 std::ofstream VPFileCsv(VPFileNameCsv.c_str());
162 VPFileCsv <<
"pt,t,Vx,Vy,p" << std::endl;
164 VPFileCsv <<
"pt,t,CVx,CVy,Cp" << std::endl;
183 W.
getInfo(
'i') <<
"Preparing VP points" << std::endl;
221 wakeVP->vtx.push_back(addvtx);
227 wakeVP->vtx.push_back(addvtx);
240 W.
getInfo(
'e') <<
"Only airfoil 0 can be elastic!" << std::endl;
247 for (
size_t q = 0; q < ptr->
chord.size(); ++q)
249 std::pair<size_t, size_t> pnls = ptr->
chord[q].infPanels;
269 for (
size_t q = 0; q <
W.
getAirfoil(afl).getNumberOfPanels(); ++q)
279 wakeVP->vtx.push_back(addvtx);
292 int addWSize = (int)
wakeVP->vtx.size();
303 double P0 = 0.5 * V0.
length2();
307#pragma warning (push)
308#pragma warning (disable: 4101)
314#pragma omp parallel for default(none) private(alpha, lambda, dri, Vi, vi, dst2eps, cPan) shared(P0, dt, eps2, V0, addWSize, std::cout, IDPI)
315 for (
int i = 0; i < addWSize; ++i)
322 for (
size_t j = 0; j <
W.
getWake().
vtx.size(); ++j)
363 Point2D skos =
IDPI * ((alpha * u0).kcross() + (lambda * u0));
372 Vi = 0.5 * (afl.
getV(pnl) + afl.
getV(pnl + 1));
435 alpha = atan2((cPan - pt) ^ (rcm - pt), (cPan - pt) & (rcm - pt));
439 for (
int q = 0; q <
W.
getAirfoil(bou).possibleWays[way - 1].size() + 1; ++q)
443 alpha += atan2((finish - pt) ^ (start - pt), (finish - pt) & (start - pt));
452 lambda = 0.5 * log((pt - cPan).length2());
458 for (
size_t i = 0; i <
pressure.size(); ++i)
470 double scaleV = 1.0, scaleP = 1.0;
479 std::ofstream outfile;
489 outfile <<
"# vtk DataFile Version 2.0\n";
491 outfile <<
"ASCII\n";
492 outfile <<
"DATASET UNSTRUCTURED_GRID\n";
493 outfile <<
"POINTS " << nRealPressurePoints <<
" float\n";
495 for (
size_t i = 0; i < nRealPressurePoints; ++i)
497 double xi = (
wakeVP->vtx[i].r())[0];
498 double yi = (
wakeVP->vtx[i].r())[1];
499 outfile << xi <<
" " << yi <<
" " <<
"0.0\n";
502 outfile <<
"CELLS " << nRealPressurePoints <<
" " << 2 * nRealPressurePoints <<
'\n';
503 for (
size_t i = 0; i < nRealPressurePoints; ++i)
504 outfile <<
"1 " << i <<
'\n';
506 outfile <<
"CELL_TYPES " << nRealPressurePoints <<
'\n';
507 for (
size_t i = 0; i < nRealPressurePoints; ++i)
511 outfile <<
"POINT_DATA " << nRealPressurePoints <<
'\n';
514 outfile <<
"VECTORS V float\n";
516 outfile <<
"VECTORS CV float\n";
518 for (
size_t i = 0; i < nRealPressurePoints; ++i)
520 outfile <<
velocity[i][0] * scaleV <<
" " <<
velocity[i][1] * scaleV <<
" 0.0\n";
526 outfile <<
"SCALARS P float 1\n";
528 outfile <<
"SCALARS CP float 1\n";
530 outfile <<
"LOOKUP_TABLE default\n";
532 for (
size_t i = 0; i < nRealPressurePoints; ++i)
534 outfile <<
pressure[i] * scaleP <<
'\n';
543 bool littleEndian = (*((uint8_t*)&x));
544 const char eolnBIN[] =
"\n";
547 outfile.open(
W.
getPassport().
dir +
"velPres/" + fname, std::ios::out | std::ios::binary);
550 outfile <<
"BINARY" << eolnBIN;
551 outfile <<
"DATASET UNSTRUCTURED_GRID" << eolnBIN <<
"POINTS " << nRealPressurePoints <<
" " <<
"float" << eolnBIN;
554 Eigen::VectorXf pData = Eigen::VectorXf::Zero(nRealPressurePoints);
555 Eigen::VectorXf vData = Eigen::VectorXf::Zero(nRealPressurePoints * 3);
556 Eigen::VectorXf rData = Eigen::VectorXf::Zero(nRealPressurePoints * 3);
559 for (
size_t i = 0; i < nRealPressurePoints; ++i)
561 rData(3 * i + 0) = (float)(
wakeVP->vtx[i].r())[0];
562 rData(3 * i + 1) = (float)(
wakeVP->vtx[i].r())[1];
565 for (
size_t i = 0; i < nRealPressurePoints; ++i)
567 vData(3 * i + 0) = (float)(
velocity[i][0] * scaleV);
568 vData(3 * i + 1) = (float)(
velocity[i][1] * scaleV);
571 for (
size_t i = 0; i < nRealPressurePoints; ++i)
573 pData(i) = (float)(
pressure[i] * scaleP);
578 for (
int i = 0; i < nRealPressurePoints * 3; ++i)
580 outfile.write(
reinterpret_cast<char*
>(rData.data()), nRealPressurePoints * 3 *
sizeof(float));
583 std::vector<int> cells(2 * nRealPressurePoints);
584 for (
size_t i = 0; i < nRealPressurePoints; ++i)
586 cells[2 * i + 0] = 1;
587 cells[2 * i + 1] = (int)i;
590 std::vector<int> cellsTypes;
591 cellsTypes.resize(nRealPressurePoints, 1);
595 for (
int i = 0; i < nRealPressurePoints * 2; ++i)
598 for (
int i = 0; i < nRealPressurePoints; ++i)
602 outfile << eolnBIN <<
"CELLS " << nRealPressurePoints <<
" " << nRealPressurePoints * 2 << eolnBIN;
603 outfile.write(
reinterpret_cast<char*
>(cells.data()), nRealPressurePoints * 2 *
sizeof(int));
604 outfile << eolnBIN <<
"CELL_TYPES " << nRealPressurePoints << eolnBIN;
605 outfile.write(
reinterpret_cast<char*
>(cellsTypes.data()), nRealPressurePoints *
sizeof(
int));
609 for (
int i = 0; i < nRealPressurePoints * 3; ++i)
612 outfile << eolnBIN <<
"POINT_DATA " << nRealPressurePoints << eolnBIN;
615 outfile <<
"VECTORS V " <<
"float" << eolnBIN;
617 outfile <<
"VECTORS CV " <<
"float" << eolnBIN;
619 outfile.write(
reinterpret_cast<char*
>(vData.data()), nRealPressurePoints * 3 *
sizeof(
float));
623 for (
int i = 0; i < nRealPressurePoints; ++i)
627 outfile << eolnBIN <<
"SCALARS P " <<
"float" <<
" 1" << eolnBIN;
629 outfile << eolnBIN <<
"SCALARS CP " <<
"float" <<
" 1" << eolnBIN;
631 outfile <<
"LOOKUP_TABLE default" << eolnBIN;
632 outfile.write(
reinterpret_cast<char*
>(pData.data()), nRealPressurePoints *
sizeof(
float));
644 outfile <<
"point,x,y,Vx,Vy,P\n";
646 outfile <<
"point,x,y,CVx,CVy,CP\n";
648 for (
size_t i = 0; i < nRealPressurePoints; ++i)
650 double xi = (
wakeVP->vtx[i].r())[0];
651 double yi = (
wakeVP->vtx[i].r())[1];
652 outfile << i <<
"," << xi <<
"," << yi \
654 <<
"," <<
pressure[i] * scaleP <<
'\n';
660 std::string fnameBunCsv =
W.
getPassport().
dir +
"velPres/" +
"velPresBundle.csv";
661 std::ofstream VPFileBunCsv(fnameBunCsv.c_str(),
W.
getCurrentStep() ? std::ios::app : std::ios::out);
664 VPFileBunCsv << nRealPressurePoints <<
'\n';
667 for (
size_t q = 0; q < nRealPressurePoints; ++q)
672 <<
wakeVP->vtx[q].r()[0] <<
"," <<
wakeVP->vtx[q].r()[1] <<
"," \
682 #pragma omp parallel for
688 std::string VPFileNameCsv;
691 std::ofstream VPFileCsv(VPFileNameCsv.c_str(),
W.
getCurrentStep() ? std::ios::app : std::ios::out);
694 VPFileCsv <<
"point,time,Vx,Vy,P\n";
696 VPFileCsv <<
"point,time,CVx,CVy,CP\n";
712 #pragma omp parallel for
715 std::string VPFileNameCsv;
718 std::ofstream VPFileCsv(VPFileNameCsv.c_str(),
W.
getCurrentStep() ? std::ios::app : std::ios::out);
720 VPFileCsv <<
sstr[q].str();
738 std::vector<std::pair<Point2D, double>> result;
744 result.push_back({ velocity[nRealPressurePoints + q], pressure[nRealPressurePoints + q] });
Заголовочный файл с описанием класса Airfoil.
Заголовочный файл с описанием класса Boundary.
Заголовочный файл с описанием класса 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.
WakeDiscretizationProperties wakeDiscretizationProperties
Структура с параметрами дискретизации вихревого следа
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
Возврат константной ссылки на объект профиля
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 Point2D & r()
Функция для доступа к радиус-вектору вихря
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.
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)
Формирование имени файла
void CreateDirectory(const std::string &dir, const std::string &name)
Создание каталога
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
Вектор конвективных скоростей вихрей
double eps2
Квадрат радиуса вихря
int saveVPstep
Шаг вычисления и сохранения скорости и давления
int nameLength
Число разрядов в имени файла
std::pair< std::string, int > fileTypeVP
Тип файлов для сохранения скорости и давления