Сохранение вихревого следа в файл .vtk.
116{
118
120 {
121 std::ofstream outfile;
122 size_t numberNonZero = 0;
123
125 numberNonZero +=
vtx.size();
126 else
130
132 {
135
136 outfile << "# vtk DataFile Version 2.0\n";
138 outfile << "ASCII\n";
139 outfile << "DATASET UNSTRUCTURED_GRID\n";
140 outfile << "POINTS " << numberNonZero << " float\n";
141
142
145 {
147 outfile << r[0] << " " << r[1] << " " << "0.0\n";
148 }
149 else
151 for (
size_t s = 0; s <
W.
getAirfoil(q).getNumberOfPanels(); ++s)
152 {
154 outfile << r[0] << " " << r[1] << " " << "0.0\n";
155 }
156
157 outfile << "CELLS " << numberNonZero << " " << 2 * numberNonZero << '\n';
158 for (size_t i = 0; i < numberNonZero; ++i)
159 outfile << "1 " << i << '\n';
160
161 outfile << "CELL_TYPES " << numberNonZero << '\n';
162 for (size_t i = 0; i < numberNonZero; ++i)
163 outfile << "1\n";
164
165 outfile << '\n';
166 outfile << "POINT_DATA " << numberNonZero << '\n';
167 outfile << "SCALARS Gamma float 1\n";
168 outfile << "LOOKUP_TABLE default\n";
169
172 outfile << v.g() << '\n';
173 else
175 for (
size_t s = 0; s <
W.
getAirfoil(q).getNumberOfPanels(); ++s)
176 outfile << "0.0\n";
177
178 outfile << "SCALARS Sigma float 1\n";
179 outfile << "LOOKUP_TABLE default\n";
180
183 outfile << v.sigma() << '\n';
184 else
186 for (
size_t s = 0; s <
W.
getAirfoil(q).getNumberOfPanels(); ++s)
187 outfile << "0.0\n";
188
189#ifdef TURB
190 outfile << "SCALARS nut float 1\n";
191 outfile << "LOOKUP_TABLE default\n";
192
195 outfile <<
sqr(v.sigma() / 4.48) /
W.getPassport().timeDiscretizationProperties.dt -
W.getPassport().physicalProperties.nu <<
'\n';
196 else
198 for (
size_t s = 0; s <
W.
getAirfoil(q).getNumberOfPanels(); ++s)
199 outfile << "0.0\n";
200#endif
201
202
203 outfile.close();
204 }
206 {
207
208 uint16_t x = 0x0001;
209 bool littleEndian = (*((uint8_t*)&x));
210 const char eolnBIN[] = "\n";
211
213 outfile.open(
W.
getPassport().
dir +
"snapshots/" + fname, std::ios::out | std::ios::binary);
214
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;
218
220 {
221 Eigen::VectorXf rData = Eigen::VectorXf::Zero(
vtx.size() * 3);
222 for (
size_t i = 0; i <
vtx.size(); ++i)
223 {
224 rData(3 * i) = (float)(
vtx[i].r())[0];
225 rData(3 * i + 1) = (float)(
vtx[i].r())[1];
226 }
227
228 if (littleEndian)
229 for (
int i = 0; i <
vtx.size() * 3; ++i)
231 outfile.write(
reinterpret_cast<char*
>(rData.data()),
vtx.size() * 3 *
sizeof(float));
232 }
233 else
235 {
237 for (
size_t s = 0; s <
W.
getAirfoil(q).getNumberOfPanels(); ++s)
238 {
241 }
242
243 if (littleEndian)
247 }
248
249
250 std::vector<int> cells(2 * numberNonZero);
251 for (size_t i = 0; i < numberNonZero; ++i)
252 {
253 cells[2 * i] = 1;
254 cells[2 * i + 1] = (int)i;
255 }
256
257 std::vector<int> cellsTypes;
258 cellsTypes.resize(numberNonZero, 1);
259
260 if (littleEndian)
261 {
262 for (int i = 0; i < numberNonZero * 2; ++i)
264
265 for (int i = 0; i < numberNonZero; ++i)
267 }
268
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));
273
274
275 outfile << eolnBIN << "POINT_DATA " << numberNonZero << eolnBIN;
276 outfile << eolnBIN << "SCALARS Gamma " << "float" << " 1" << eolnBIN;
277 outfile << "LOOKUP_TABLE default" << eolnBIN;
278
280 {
281 Eigen::VectorXf pData = Eigen::VectorXf::Zero(numberNonZero);
282 for (
int s = 0; s <
vtx.size(); ++s)
283 pData(s) = (float)
vtx[s].g();
284
285 if (littleEndian)
286 for (
int i = 0; i <
vtx.size(); ++i)
288 outfile.write(
reinterpret_cast<char*
>(pData.data()),
vtx.size() *
sizeof(float));
289 }
290 else
292 {
294 for (
int s = 0; s <
W.
getAirfoil(q).getNumberOfPanels(); ++s)
295 pData(s) = 0;
296
297 if (littleEndian)
298 for (
int i = 0; i <
W.
getAirfoil(q).getNumberOfPanels(); ++i)
301 }
302
303 outfile << eolnBIN;
304
305
306
307 outfile << eolnBIN << "SCALARS Sigma " << "float" << " 1" << eolnBIN;
308 outfile << "LOOKUP_TABLE default" << eolnBIN;
309
311 {
312 Eigen::VectorXf pData = Eigen::VectorXf::Zero(numberNonZero);
313 for (
int s = 0; s <
vtx.size(); ++s)
314 pData(s) = (float)
vtx[s].sigma();
315
316 if (littleEndian)
317 for (
int i = 0; i <
vtx.size(); ++i)
319 outfile.write(
reinterpret_cast<char*
>(pData.data()),
vtx.size() *
sizeof(float));
320 }
321 else
323 {
325 for (
int s = 0; s <
W.
getAirfoil(q).getNumberOfPanels(); ++s)
326 pData(s) = 0;
327
328 if (littleEndian)
329 for (
int i = 0; i <
W.
getAirfoil(q).getNumberOfPanels(); ++i)
332 }
333
334 outfile << eolnBIN;
335
336#ifdef TURB
337
338 outfile << eolnBIN << "SCALARS nut " << "float" << " 1" << eolnBIN;
339 outfile << "LOOKUP_TABLE default" << eolnBIN;
340
342 {
343 Eigen::VectorXf pData = Eigen::VectorXf::Zero(numberNonZero);
344 for (
int s = 0; s <
vtx.size(); ++s)
346
347 if (littleEndian)
348 for (
int i = 0; i <
vtx.size(); ++i)
350 outfile.write(
reinterpret_cast<char*
>(pData.data()),
vtx.size() *
sizeof(float));
351 }
352 else
354 {
356 for (
int s = 0; s <
W.
getAirfoil(q).getNumberOfPanels(); ++s)
357 pData(s) = 0;
358
359 if (littleEndian)
360 for (
int i = 0; i <
W.
getAirfoil(q).getNumberOfPanels(); ++i)
363 }
364
365 outfile << eolnBIN;
366#endif
367
368
369 outfile.close();
370 }
371
373 {
376
377 outfile << "point,x,y,G,S";
378#ifdef TURB
379 outfile << ",nut";
380#endif
381 outfile << '\n';
382
383 int counter = 0;
384
387 {
388 outfile << counter++ << "," << v.r()[0] << "," << v.r()[1] << "," << v.g() << "," << v.sigma();
389#ifdef TURB
391#endif
392 outfile << '\n';
393 }
394 else
396 for (
size_t s = 0; s <
W.
getAirfoil(q).getNumberOfPanels(); ++s)
397 {
399 outfile << counter++ << "," << r[0] << "," << r[1] << "," << "0.0" << "," << "0.0";
400#ifdef TURB
401 outfile << "," << 0.0;
402#endif
403 outfile << '\n';
404 }
405 outfile.close();
406 }
407
408 }
409
411}
const Point2D & getR(size_t q) const
Возврат константной ссылки на вершину профиля
size_t getNumberOfPanels() const
Возврат количества панелей на профиле
PhysicalProperties physicalProperties
Структура с физическими свойствами задачи
size_t getNumberOfAirfoil() const
Возврат количества профилей в задаче
const Airfoil & getAirfoil(size_t i) const
Возврат константной ссылки на объект профиля
VMlib::TimersGen & getTimers() const
Возврат ссылки на временную статистику выполнения шага расчета по времени
bool ifDivisible(int val) const
TimeDiscretizationProperties timeDiscretizationProperties
Структура с параметрами процесса интегрирования по времени
std::string dir
Рабочий каталог задачи
void stop(const std::string &timerLabel)
Останов счетчика
void start(const std::string &timerLabel)
Запуск счетчика
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)
Формирование имени файла
T sqr(T x)
Возведение числа в квадрат
std::string CurrentDataTime()
Формирование строки с текущем временем и датой
void SwapEnd(T &var)
Вспомогательная функция перестановки байт местами (нужно для сохранения бинарных VTK)
double nu
Коэффициент кинематической вязкости среды
std::pair< std::string, int > fileTypeVtx
Тип файлов для сохранения скорости и давления
int saveVtxStep
Шаг сохранения кадров в бинарные файлы
int nameLength
Число разрядов в имени файла