Сохранение вихревого следа в файл .vtk.
116{
117 W.getTimers().start(
"Save");
118
119 if (
W.ifDivisible(
W.getPassport().timeDiscretizationProperties.saveVtxStep))
120 {
121 std::ofstream outfile;
122 size_t numberNonZero = 0;
123
125 numberNonZero +=
vtx.size();
126 else
127 for (
size_t q = 0; q <
W.getNumberOfAirfoil(); ++q)
128 numberNonZero +=
W.getAirfoil(q).getNumberOfPanels();
130
131 if (
W.getPassport().timeDiscretizationProperties.fileTypeVtx.second == 0)
132 {
133 std::string fname =
VMlib::fileNameStep(filePrefix,
W.getPassport().timeDiscretizationProperties.nameLength,
W.getCurrentStep(),
"vtk");
134 outfile.open(
W.getPassport().dir +
"snapshots/" + fname);
135
136 outfile << "# vtk DataFile Version 2.0\n";
137 outfile <<
"VM2D VTK result: " << (
W.getPassport().dir +
"snapshots/" + fname).c_str() <<
" saved " <<
VMlib::CurrentDataTime() <<
'\n';
138 outfile << "ASCII\n";
139 outfile << "DATASET UNSTRUCTURED_GRID\n";
140 outfile << "POINTS " << numberNonZero << " float\n";
141
142
145 {
146 const Point2D& r = v.r();
147 outfile << r[0] << " " << r[1] << " " << "0.0\n";
148 }
149 else
150 for (
size_t q = 0; q <
W.getNumberOfAirfoil(); ++q)
151 for (
size_t s = 0; s <
W.getAirfoil(q).getNumberOfPanels(); ++s)
152 {
153 const Point2D& r =
W.getAirfoil(q).getR(s);
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
174 for (
size_t q = 0; q <
W.getNumberOfAirfoil(); ++q)
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
185 for (
size_t q = 0; q <
W.getNumberOfAirfoil(); ++q)
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
197 for (
size_t q = 0; q <
W.getNumberOfAirfoil(); ++q)
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 }
205 else if (
W.getPassport().timeDiscretizationProperties.fileTypeVtx.second == 1)
206 {
207
208 uint16_t x = 0x0001;
209 bool littleEndian = (*((uint8_t*)&x));
210 const char eolnBIN[] = "\n";
211
212 std::string fname =
VMlib::fileNameStep(filePrefix,
W.getPassport().timeDiscretizationProperties.nameLength,
W.getCurrentStep(),
"vtk");
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
234 for (
size_t q = 0; q <
W.getNumberOfAirfoil(); ++q)
235 {
236 Eigen::VectorXf rData = Eigen::VectorXf::Zero(
W.getAirfoil(q).getNumberOfPanels() * 3);
237 for (
size_t s = 0; s <
W.getAirfoil(q).getNumberOfPanels(); ++s)
238 {
239 rData(3 * s) = (float)(
W.getAirfoil(q).getR(s))[0];
240 rData(3 * s + 1) = (float)(
W.getAirfoil(q).getR(s))[1];
241 }
242
243 if (littleEndian)
244 for (
int i = 0; i <
W.getAirfoil(q).getNumberOfPanels() * 3; ++i)
246 outfile.write(
reinterpret_cast<char*
>(rData.data()),
W.getAirfoil(q).getNumberOfPanels() * 3 *
sizeof(
float));
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
291 for (
size_t q = 0; q <
W.getNumberOfAirfoil(); ++q)
292 {
293 Eigen::VectorXf pData = Eigen::VectorXf::Zero(
W.getAirfoil(q).getNumberOfPanels());
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)
300 outfile.write(
reinterpret_cast<char*
>(pData.data()),
W.getAirfoil(q).getNumberOfPanels() *
sizeof(
float));
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
322 for (
size_t q = 0; q <
W.getNumberOfAirfoil(); ++q)
323 {
324 Eigen::VectorXf pData = Eigen::VectorXf::Zero(
W.getAirfoil(q).getNumberOfPanels());
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)
331 outfile.write(
reinterpret_cast<char*
>(pData.data()),
W.getAirfoil(q).getNumberOfPanels() *
sizeof(
float));
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)
345 pData(s) = (float)(
sqr(
vtx[s].sigma() / 4.48) /
W.getPassport().timeDiscretizationProperties.dt -
W.getPassport().physicalProperties.nu);;
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
353 for (
size_t q = 0; q <
W.getNumberOfAirfoil(); ++q)
354 {
355 Eigen::VectorXf pData = Eigen::VectorXf::Zero(
W.getAirfoil(q).getNumberOfPanels());
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)
362 outfile.write(
reinterpret_cast<char*
>(pData.data()),
W.getAirfoil(q).getNumberOfPanels() *
sizeof(
float));
363 }
364
365 outfile << eolnBIN;
366#endif
367
368
369 outfile.close();
370 }
371
372 if (
W.getPassport().timeDiscretizationProperties.fileTypeVtx.second == 2)
373 {
374 std::string fname =
VMlib::fileNameStep(filePrefix,
W.getPassport().timeDiscretizationProperties.nameLength,
W.getCurrentStep(),
"csv");
375 outfile.open(
W.getPassport().dir +
"snapshots/" + fname);
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
390 outfile <<
"," <<
sqr(v.sigma() / 4.48) /
W.getPassport().timeDiscretizationProperties.dt -
W.getPassport().physicalProperties.nu;
391#endif
392 outfile << '\n';
393 }
394 else
395 for (
size_t q = 0; q <
W.getNumberOfAirfoil(); ++q)
396 for (
size_t s = 0; s <
W.getAirfoil(q).getNumberOfPanels(); ++s)
397 {
398 const Point2D& r =
W.getAirfoil(q).getR(s);
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
410 W.getTimers().stop(
"Save");
411}
T sqr(T x)
Возведение числа в квадрат
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).