58 std::string filename = dir + fileName;
59 std::ifstream wakeFile, testFile;
61 char firstChar =
'/', secondChar =
'*';
63 if (fileExistTest(filename,
W.
getInfo(),
true, {
"txt",
"TXT" }))
65 testFile.open(filename);
66 testFile >> firstChar;
67 testFile >> secondChar;
75 if (firstChar ==
'/' && secondChar ==
'*')
77 if (fileExistTest(filename,
W.
getInfo(),
true, {
"txt",
"TXT" }))
84 wakeParser.
get(
"vtx",
vtx);
94 if (fileExistTest(filename,
W.
getInfo(),
true, {
"txt",
"TXT" }))
96 wakeFile.open(filename);
100 for (
int i = 0; i < nnn; ++i)
103 wakeFile >> v.
r()[0] >> v.
r()[1] >> v.
g();
121 std::ofstream outfile;
122 size_t numberNonZero = 0;
125 numberNonZero +=
vtx.size();
136 outfile <<
"# vtk DataFile Version 2.0\n";
138 outfile <<
"ASCII\n";
139 outfile <<
"DATASET UNSTRUCTURED_GRID\n";
140 outfile <<
"POINTS " << numberNonZero <<
" float\n";
147 outfile << r[0] <<
" " << r[1] <<
" " <<
"0.0\n";
154 outfile << r[0] <<
" " << r[1] <<
" " <<
"0.0\n";
157 outfile <<
"CELLS " << numberNonZero <<
" " << 2 * numberNonZero <<
'\n';
158 for (
size_t i = 0; i < numberNonZero; ++i)
159 outfile <<
"1 " << i <<
'\n';
161 outfile <<
"CELL_TYPES " << numberNonZero <<
'\n';
162 for (
size_t i = 0; i < numberNonZero; ++i)
166 outfile <<
"POINT_DATA " << numberNonZero <<
'\n';
167 outfile <<
"SCALARS Gamma float 1\n";
168 outfile <<
"LOOKUP_TABLE default\n";
172 outfile << v.g() <<
'\n';
178 outfile <<
"SCALARS Sigma float 1\n";
179 outfile <<
"LOOKUP_TABLE default\n";
183 outfile << v.sigma() <<
'\n';
190 outfile <<
"SCALARS nut float 1\n";
191 outfile <<
"LOOKUP_TABLE default\n";
209 bool littleEndian = (*((uint8_t*)&x));
210 const char eolnBIN[] =
"\n";
213 outfile.open(
W.
getPassport().
dir +
"snapshots/" + fname, std::ios::out | std::ios::binary);
215 outfile <<
"# vtk DataFile Version 3.0" <<
"\r\n" <<
"VM2D VTK result: " << (
W.
getPassport().
dir +
"snapshots/" + fname).c_str() <<
" saved " <<
VMlib::CurrentDataTime() << eolnBIN;
216 outfile <<
"BINARY" << eolnBIN;
217 outfile <<
"DATASET UNSTRUCTURED_GRID" << eolnBIN <<
"POINTS " << numberNonZero <<
" " <<
"float" << eolnBIN;
221 Eigen::VectorXf rData = Eigen::VectorXf::Zero(
vtx.size() * 3);
222 for (
size_t i = 0; i <
vtx.size(); ++i)
224 rData(3 * i) = (float)(
vtx[i].r())[0];
225 rData(3 * i + 1) = (float)(
vtx[i].r())[1];
229 for (
int i = 0; i <
vtx.size() * 3; ++i)
231 outfile.write(
reinterpret_cast<char*
>(rData.data()),
vtx.size() * 3 *
sizeof(float));
237 for (
size_t s = 0; s <
W.
getAirfoil(q).getNumberOfPanels(); ++s)
250 std::vector<int> cells(2 * numberNonZero);
251 for (
size_t i = 0; i < numberNonZero; ++i)
254 cells[2 * i + 1] = (int)i;
257 std::vector<int> cellsTypes;
258 cellsTypes.resize(numberNonZero, 1);
262 for (
int i = 0; i < numberNonZero * 2; ++i)
265 for (
int i = 0; i < numberNonZero; ++i)
269 outfile << eolnBIN <<
"CELLS " << numberNonZero <<
" " << numberNonZero * 2 << eolnBIN;
270 outfile.write(
reinterpret_cast<char*
>(cells.data()), numberNonZero * 2 *
sizeof(int));
271 outfile << eolnBIN <<
"CELL_TYPES " << numberNonZero << eolnBIN;
272 outfile.write(
reinterpret_cast<char*
>(cellsTypes.data()), numberNonZero *
sizeof(
int));
275 outfile << eolnBIN <<
"POINT_DATA " << numberNonZero << eolnBIN;
276 outfile << eolnBIN <<
"SCALARS Gamma " <<
"float" <<
" 1" << eolnBIN;
277 outfile <<
"LOOKUP_TABLE default" << eolnBIN;
281 Eigen::VectorXf pData = Eigen::VectorXf::Zero(numberNonZero);
282 for (
int s = 0; s <
vtx.size(); ++s)
283 pData(s) = (float)
vtx[s].g();
286 for (
int i = 0; i <
vtx.size(); ++i)
288 outfile.write(
reinterpret_cast<char*
>(pData.data()),
vtx.size() *
sizeof(float));
294 for (
int s = 0; s <
W.
getAirfoil(q).getNumberOfPanels(); ++s)
298 for (
int i = 0; i <
W.
getAirfoil(q).getNumberOfPanels(); ++i)
307 outfile << eolnBIN <<
"SCALARS Sigma " <<
"float" <<
" 1" << eolnBIN;
308 outfile <<
"LOOKUP_TABLE default" << eolnBIN;
312 Eigen::VectorXf pData = Eigen::VectorXf::Zero(numberNonZero);
313 for (
int s = 0; s <
vtx.size(); ++s)
314 pData(s) = (float)
vtx[s].sigma();
317 for (
int i = 0; i <
vtx.size(); ++i)
319 outfile.write(
reinterpret_cast<char*
>(pData.data()),
vtx.size() *
sizeof(float));
325 for (
int s = 0; s <
W.
getAirfoil(q).getNumberOfPanels(); ++s)
329 for (
int i = 0; i <
W.
getAirfoil(q).getNumberOfPanels(); ++i)
338 outfile << eolnBIN <<
"SCALARS nut " <<
"float" <<
" 1" << eolnBIN;
339 outfile <<
"LOOKUP_TABLE default" << eolnBIN;
343 Eigen::VectorXf pData = Eigen::VectorXf::Zero(numberNonZero);
344 for (
int s = 0; s <
vtx.size(); ++s)
348 for (
int i = 0; i <
vtx.size(); ++i)
350 outfile.write(
reinterpret_cast<char*
>(pData.data()),
vtx.size() *
sizeof(float));
356 for (
int s = 0; s <
W.
getAirfoil(q).getNumberOfPanels(); ++s)
360 for (
int i = 0; i <
W.
getAirfoil(q).getNumberOfPanels(); ++i)
377 outfile <<
"point,x,y,G,S";
388 outfile << counter++ <<
"," << v.r()[0] <<
"," << v.r()[1] <<
"," << v.g() <<
"," << v.sigma();
396 for (
size_t s = 0; s <
W.
getAirfoil(q).getNumberOfPanels(); ++s)
399 outfile << counter++ <<
"," << r[0] <<
"," << r[1] <<
"," <<
"0.0" <<
"," <<
"0.0";
401 outfile <<
"," << 0.0;
414void WakeDataBase::SaveScalarFields(
const std::string& filePrefix,
415 const std::vector<double>& VIP,
416 const std::vector<double>& OIP,
417 const std::vector<double>& nut,
418 const std::vector<Point2D>& grNu,
419 const std::vector<double>& RIP,
420 const std::vector<double>& DELTAG
427 std::ofstream outfile;
428 size_t numberNonZero =
vtx.size();
437 outfile <<
"# vtk DataFile Version 2.0\n";
439 outfile <<
"ASCII\n";
440 outfile <<
"DATASET UNSTRUCTURED_GRID\n";
441 outfile <<
"POINTS " << numberNonZero <<
" float\n";
446 outfile << r[0] <<
" " << r[1] <<
" " <<
"0.0\n";
450 outfile <<
"CELLS " << numberNonZero <<
" " << 2 * numberNonZero <<
'\n';
451 for (
size_t i = 0; i < numberNonZero; ++i)
452 outfile <<
"1 " << i <<
'\n';
454 outfile <<
"CELL_TYPES " << numberNonZero <<
'\n';
455 for (
size_t i = 0; i < numberNonZero; ++i)
459 outfile <<
"POINT_DATA " << numberNonZero <<
'\n';
460 outfile <<
"SCALARS Gamma float 1\n";
461 outfile <<
"LOOKUP_TABLE default\n";
464 outfile << v.g() <<
'\n';
467 outfile <<
"SCALARS Sigma float 1\n";
468 outfile <<
"LOOKUP_TABLE default\n";
470 for (
auto& v :
W.getWake().
vtx)
471 outfile << v.sigma() <<
'\n';
473 outfile <<
"SCALARS VIP float 1\n";
474 outfile <<
"LOOKUP_TABLE default\n";
477 outfile << v <<
'\n';
479 outfile <<
"SCALARS OIP float 1\n";
480 outfile <<
"LOOKUP_TABLE default\n";
483 outfile << v <<
'\n';
486 outfile <<
"SCALARS nut float 1\n";
487 outfile <<
"LOOKUP_TABLE default\n";
491 outfile << v <<
'\n';
493 outfile <<
"SCALARS RIP float 1\n";
494 outfile <<
"LOOKUP_TABLE default\n";
497 outfile << v <<
'\n';
500 outfile <<
"SCALARS DELTAG float 1\n";
501 outfile <<
"LOOKUP_TABLE default\n";
503 for (
auto& v : DELTAG)
504 outfile << v <<
'\n';
507 outfile <<
"VECTORS grNu float\n";
509 outfile << v[0] <<
" " << v[1] <<
" 0.0\n";
Заголовочный файл с описанием класса Airfoil.
Заголовочный файл с описанием класса Boundary.
Заголовочный файл с функциями для метода GMRES.
Заголовочный файл с описанием класса MeasureVP.
Заголовочный файл с описанием класса Mechanics.
Заголовочный файл с описанием класса Preprocessor.
Заголовочный файл с описанием класса StreamParser.
Заголовочный файл с описанием класса Velocity.
Заголовочный файл с описанием класса Wake.
Заголовочный файл с описанием класса WakeDataBase.
Заголовочный файл с описанием класса World2D.
const Point2D & getR(size_t q) const
Возврат константной ссылки на вершину профиля
size_t getNumberOfPanels() const
Возврат количества панелей на профиле
PhysicalProperties physicalProperties
Структура с физическими свойствами задачи
WakeDiscretizationProperties wakeDiscretizationProperties
Структура с параметрами дискретизации вихревого следа
std::vector< Vortex2D > vtx
Список вихревых элементов
void ReadFromFile(const std::string &dir, const std::string &fileName)
Считывание вихревого следа из файла
const World2D & W
Константная ссылка на решаемую задачу
void SaveKadrVtk(const std::string &filePrefix="Kadr") const
Сохранение вихревого следа в файл .vtk.
size_t getNumberOfAirfoil() const
Возврат количества профилей в задаче
const Airfoil & getAirfoil(size_t i) const
Возврат константной ссылки на объект профиля
VMlib::TimersGen & getTimers() const
Возврат ссылки на временную статистику выполнения шага расчета по времени
const Passport & getPassport() const
Возврат константной ссылки на паспорт
bool ifDivisible(int val) 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ких целях для организации вывода
size_t getCurrentStep() const
Возврат константной ссылки на параметры распараллеливания по MPI.
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::string CurrentDataTime()
Формирование строки с текущем временем и датой
void SwapEnd(T &var)
Вспомогательная функция перестановки байт местами (нужно для сохранения бинарных VTK)
double nu
Коэффициент кинематической вязкости среды
double sigma0
Радиус вихря
std::pair< std::string, int > fileTypeVtx
Тип файлов для сохранения скорости и давления
int saveVtxStep
Шаг сохранения кадров в бинарные файлы
int nameLength
Число разрядов в имени файла