45 #include <sys/types.h> 74 std::string filename = dir +
"pointsVP";
93 if (historyPoints.size() > 0)
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");
103 for (
size_t q = 0; q < historyPoints.size(); ++q)
105 VPFileList <<
'\n' << q <<
'\t' <<
VMlib::fileNameStep(
"VP-atPoint-", 2, q,
"csv") <<
'\t' << historyPoints[q][0] <<
'\t' << historyPoints[q][1];
107 std::string VPFileNameCsv;
110 std::ofstream VPFileCsv(VPFileNameCsv.c_str());
113 VPFileCsv <<
"t,Vx,Vy,p" << std::endl;
115 VPFileCsv <<
"t,CVx,CVy,Cp" << std::endl;
134 W.
getInfo(
'i') <<
"Preparing VP points" << std::endl;
179 wakeVP->vtx.push_back(addvtx);
185 wakeVP->vtx.push_back(addvtx);
196 int addWSize = (int)
wakeVP->vtx.size();
207 double P0 = 0.5 * V0.
length2();
211 #pragma warning (push) 212 #pragma warning (disable: 4101) 215 #pragma warning (pop) 217 #pragma omp parallel for default(none) private(alpha, dri, Vi, vi, dst2eps, cPan) shared(P0, dt, eps2, V0, addWSize, std::cout, IDPI) 218 for (
int i = 0; i < addWSize; ++i)
225 for (
size_t j = 0; j <
W.
getWake().
vtx.size(); ++j)
256 alpha = atan2((cPan - pt) ^ (rcm - pt), (cPan - pt)&(rcm - pt));
266 for (
size_t i = 0; i <
pressure.size(); ++i)
277 double scaleV = 1.0, scaleP = 1.0;
286 std::ofstream outfile;
295 outfile <<
"# vtk DataFile Version 2.0" << std::endl;
297 outfile <<
"ASCII" << std::endl;
298 outfile <<
"DATASET UNSTRUCTURED_GRID" << std::endl;
299 outfile <<
"POINTS " <<
wakeVP->vtx.size() <<
" float" << std::endl;
301 for (
size_t i = 0; i <
wakeVP->vtx.size(); ++i)
303 double xi = (
wakeVP->vtx[i].r())[0];
304 double yi = (
wakeVP->vtx[i].r())[1];
305 outfile << xi <<
" " << yi <<
" " <<
"0.0" << std::endl;
308 outfile <<
"CELLS " <<
wakeVP->vtx.size() <<
" " << 2 *
wakeVP->vtx.size() << std::endl;
309 for (
size_t i = 0; i <
wakeVP->vtx.size(); ++i)
310 outfile <<
"1 " << i << std::endl;
312 outfile <<
"CELL_TYPES " <<
wakeVP->vtx.size() << std::endl;
313 for (
size_t i = 0; i <
wakeVP->vtx.size(); ++i)
314 outfile <<
"1" << std::endl;
316 outfile << std::endl;
317 outfile <<
"POINT_DATA " <<
wakeVP->vtx.size() << std::endl;
320 outfile <<
"VECTORS V float" << std::endl;
322 outfile <<
"VECTORS CV float" << std::endl;
324 for (
size_t i = 0; i <
wakeVP->vtx.size(); ++i)
326 outfile <<
velocity[i][0] * scaleV <<
" " <<
velocity[i][1] * scaleV <<
" 0.0" << std::endl;
329 outfile << std::endl;
332 outfile <<
"SCALARS P float 1" << std::endl;
334 outfile <<
"SCALARS CP float 1" << std::endl;
336 outfile <<
"LOOKUP_TABLE default" << std::endl;
338 for (
size_t i = 0; i <
wakeVP->vtx.size(); ++i)
340 outfile <<
pressure[i] * scaleP << std::endl;
349 bool littleEndian = (*((uint8_t*)&x));
350 const char eolnBIN[] =
"\n";
353 outfile.open(
W.
getPassport().
dir +
"velPres/" + fname, std::ios::out | std::ios::binary);
356 outfile <<
"BINARY" << eolnBIN;
357 outfile <<
"DATASET UNSTRUCTURED_GRID" << eolnBIN <<
"POINTS " <<
wakeVP->vtx.size() <<
" " <<
"float" << eolnBIN;
360 Eigen::VectorXf pData = Eigen::VectorXf::Zero(
wakeVP->vtx.size());
361 Eigen::VectorXf vData = Eigen::VectorXf::Zero(
wakeVP->vtx.size() * 3);
362 Eigen::VectorXf rData = Eigen::VectorXf::Zero(
wakeVP->vtx.size() * 3);
365 for (
size_t i = 0; i <
wakeVP->vtx.size(); ++i)
367 rData(3 * i + 0) = (float)(
wakeVP->vtx[i].r())[0];
368 rData(3 * i + 1) = (float)(
wakeVP->vtx[i].r())[1];
371 for (
size_t i = 0; i <
wakeVP->vtx.size(); ++i)
373 vData(3 * i + 0) = (float)(
velocity[i][0] * scaleV);
374 vData(3 * i + 1) = (float)(
velocity[i][1] * scaleV);
377 for (
size_t i = 0; i <
wakeVP->vtx.size(); ++i)
379 pData(i) = (float)(
pressure[i] * scaleP);
384 for (
int i = 0; i <
wakeVP->vtx.size() * 3; ++i)
386 outfile.write(reinterpret_cast<char*>(rData.data()),
wakeVP->vtx.size() * 3 *
sizeof(float));
389 std::vector<int> cells(2 *
wakeVP->vtx.size());
390 for (
size_t i = 0; i <
wakeVP->vtx.size(); ++i)
392 cells[2 * i + 0] = 1;
393 cells[2 * i + 1] = (int)i;
396 std::vector<int> cellsTypes;
397 cellsTypes.resize(
wakeVP->vtx.size(), 1);
401 for (
int i = 0; i <
wakeVP->vtx.size() * 2; ++i)
404 for (
int i = 0; i <
wakeVP->vtx.size(); ++i)
408 outfile << eolnBIN <<
"CELLS " <<
wakeVP->vtx.size() <<
" " <<
wakeVP->vtx.size() * 2 << eolnBIN;
409 outfile.write(reinterpret_cast<char*>(cells.data()),
wakeVP->vtx.size() * 2 *
sizeof(int));
410 outfile << eolnBIN <<
"CELL_TYPES " <<
wakeVP->vtx.size() << eolnBIN;
411 outfile.write(reinterpret_cast<char*>(cellsTypes.data()),
wakeVP->vtx.size() *
sizeof(int));
415 for (
int i = 0; i <
wakeVP->vtx.size() * 3; ++i)
418 outfile << eolnBIN <<
"POINT_DATA " <<
wakeVP->vtx.size() << eolnBIN;
421 outfile <<
"VECTORS V " <<
"float" << eolnBIN;
423 outfile <<
"VECTORS CV " <<
"float" << eolnBIN;
425 outfile.write(reinterpret_cast<char*>(vData.data()),
wakeVP->vtx.size() * 3 *
sizeof(float));
429 for (
int i = 0; i <
wakeVP->vtx.size(); ++i)
433 outfile << eolnBIN <<
"SCALARS P " <<
"float" <<
" 1" << eolnBIN;
435 outfile << eolnBIN <<
"SCALARS CP " <<
"float" <<
" 1" << eolnBIN;
437 outfile <<
"LOOKUP_TABLE default" << eolnBIN;
438 outfile.write(reinterpret_cast<char*>(pData.data()),
wakeVP->vtx.size() *
sizeof(float));
450 outfile <<
"point,x,y,Vx,Vy,P" << std::endl;
452 outfile <<
"point,x,y,CVx,CVy,CP" << std::endl;
454 for (
size_t i = 0; i <
wakeVP->vtx.size(); ++i)
456 double xi = (
wakeVP->vtx[i].r())[0];
457 double yi = (
wakeVP->vtx[i].r())[1];
458 outfile << i <<
"," << xi <<
"," << yi \
460 <<
"," <<
pressure[i] * scaleP << std::endl;
466 std::string fnameBunCsv =
W.
getPassport().
dir +
"velPres/" +
"velPresBundle.csv";
467 std::ofstream VPFileBunCsv(fnameBunCsv.c_str(),
W.
getCurrentStep() ? std::ios::app : std::ios::out);
470 VPFileBunCsv <<
wakeVP->vtx.size() << std::endl;
473 for (
size_t q = 0; q <
wakeVP->vtx.size(); ++q)
478 <<
wakeVP->vtx[q].r()[0] <<
"," <<
wakeVP->vtx[q].r()[1] <<
"," \
480 <<
pressure[q] * scaleP << std::endl;
490 std::string VPFileNameCsv;
493 std::ofstream VPFileCsv(VPFileNameCsv.c_str(),
W.
getCurrentStep() ? std::ios::app : std::ios::out);
498 VPFileCsv <<
"point,time,Vx,Vy,P" << std::endl;
500 VPFileCsv <<
"point,time,CVx,CVy,CP" << std::endl;
const double & freeVortexSheet(size_t n, size_t moment) const
std::vector< Point2D > initialPoints
Точки, которые считываются из файла (давление пишется в vtk-файлы)
MeasureVP(const World2D &W_)
Конструктор
std::pair< std::string, int > fileTypeVP
Тип файлов для сохранения скорости и давления
Заголовочный файл с описанием класса Passport (двумерный) и cоответствующими структурами ...
Times & getTimestat() const
Возврат ссылки на временную статистику выполнения шага расчета по времени
void Initialization()
Инициализация векторов для вычисления скоростей и давлений Вызывается только на тех шагах расчета...
const World2D & W
Константная ссылка на решаемую задачу
std::string CurrentDataTime()
Формирование строки с текущем временем и датой
Заголовочный файл с описанием класса Wake.
Заголовочный файл с описанием класса World2D.
double vRef
Референсная скорость
double getCurrTime() const
Возвращает текуще время
size_t getNumberOfBoundary() const
Возврат количества граничных условий в задаче
int nameLength
Число разрядов в имени файла
Заголовочный файл с описанием класса Airfoil.
const Velocity & getVelocity() const
Возврат константной ссылки на объект для вычисления скоростей
std::vector< Point2D > vecHalfGamma
Скорость вихрей виртуального следа конкретного профиля (равна Gamma/2) используется для расчета давле...
const Wake & getWake() const
Возврат константной ссылки на вихревой след
std::vector< double > gammaThrough
Суммарные циркуляции вихрей, пересекших панели профиля на прошлом шаге
void ReadPointsFromFile(const std::string &dir)
Чтение точек, в которых нужно посчитать давление и скорость
std::string dir
Рабочий каталог задачи
Заголовочный файл с описанием класса Preprocessor.
Класс, позволяющий выполнять предварительную обработку файлов
Заголовочный файл с описанием класса Mechanics.
PhysicalProperties physicalProperties
Структура с физическими свойствами задачи
const Point2D & getR(size_t q) const
Возврат константной ссылки на вершину профиля
HD Point2D & r()
Функция для доступа к радиус-вектору вихря
bool calcCoefficients
Признак вычисления коэффициентов вместо сил
size_t getNumberOfPanels() const
Возврат количества панелей на профиле
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.
std::string fileNameStep(const std::string &name, int length, size_t number, const std::string &ext)
Формирование имени файла
double rotateAngleVpPoints
Угол поворота точек VP.
T sqr(T x)
Возведение числа в квадрат
timePeriod timeSaveKadr
Начало и конец процесса сохранения кадра в файл
TimeDiscretizationProperties timeDiscretizationProperties
Структура с параметрами процесса интегрирования по времени
const Boundary & getBoundary(size_t i) const
Возврат константной ссылки на объект граничного условия
double rho
Плотность потока
void CalcPressure()
Расчет поля давления
int saveVPstep
Шаг вычисления и сохранения скорости и давления
Заголовочный файл с описанием класса StreamParser.
std::vector< Vortex2D > vtx
Список вихревых элементов
Класс, опеделяющий двумерный вектор
bool fileExistTest(std::string &fileName, LogStream &info, const std::list< std::string > &extList={})
Проверка существования файла
std::vector< Point2D > velocity
Скорости в нужных точках
Заголовочный файл с описанием класса BoundaryConstLayerAver.
void PrintLogoToTextFile(std::ofstream &str, const std::string &fileName, const std::string &descr)
Формирование заголовка файла программы VM2D/VM3D.
VMlib::LogStream & getInfo() const
Возврат ссылки на объект LogStream Используется в техничеcких целях для организации вывода ...
Sheet sheets
Слои на профиле
std::vector< double > pressure
Давление в нужных точках
std::vector< double > domainRadius
Радиусы вихрей в нужных точках
Заголовочный файл с описанием класса MeasureVP.
const Passport & getPassport() const
Возврат константной ссылки на паспорт
VortexesParams wakeVortexesParams
Струтура, определяющая параметры вихрей в следе
double boundDenom(double r2, double eps2)
Способ сглаживания скорости вихря (вихрь Рэнкина или вихрь Ламба)
Класс, опеделяющий двумерный вихревой элемент
std::vector< Point2D > historyPoints
Точки, которые считываются из файла (давление пишется в vtk и csv-файлы)
void SaveVP()
Сохранение в файл вычисленных скоростей и давлений
Point2D rcm
Положение центра масс профиля
std::unique_ptr< WakeDataBase > wakeVP
Умный указатель на точки, в которых нужно вычислять в данный момент времени Хранятся в виде "мнимой" ...
VirtualWake virtualWake
Виртуальный вихревой след конкретного профиля
timePeriod timeVP
Начало и конец процесса подсчета полей скоростей и давления и сохранения их в файл ...
size_t getCurrentStep() const
Возврат константной ссылки на параметры распараллеливания по MPI.
const Airfoil & getAirfoil(size_t i) const
Возврат константной ссылки на объект профиля
Point2D V0() const
Функция скорости набегающего потока с учетом разгона
Класс, опеделяющий текущую решаемую задачу
Класс, опеделяющий набор вихрей
WakeDiscretizationProperties wakeDiscretizationProperties
Структура с параметрами дискретизации вихревого следа
std::vector< double > len
Длины панелей профиля
Заголовочный файл с описанием класса Velocity.
void SwapEnd(T &var)
Вспомогательная функция перестановки байт местами (нужно для сохранения бинарных VTK) ...
std::vector< Point2D > convVelo
Вектор конвективных скоростей вихрей
void CreateDirectory(const std::string &dir, const std::string &name)
Создание каталога
Класс, позволяющий выполнять разбор файлов и строк с настройками и параметрами
bool get(const std::string &name, std::vector< Point2D > &res, const std::vector< Point2D > *defValue=nullptr, bool echoDefault=true) const
Считывание вектора из двумерных точек из базы данных
double eps2
Квадрат радиуса вихря
Заголовочный файл с описанием класса Boundary.
numvector< T, 2 > kcross() const
Геометрический поворот двумерного вектора на 90 градусов