Сохранение вихревого следа в файл .vtk.
110{
112
114 {
115 std::ofstream outfile;
116 size_t numberNonZero = 0;
117
119 numberNonZero +=
vtx.size();
120 else
124
126 {
129
130 outfile << "# vtk DataFile Version 2.0" << std::endl;
132 outfile << "ASCII" << std::endl;
133 outfile << "DATASET UNSTRUCTURED_GRID" << std::endl;
134 outfile << "POINTS " << numberNonZero << " float" << std::endl;
135
136
139 {
141 outfile << r[0] << " " << r[1] << " " << "0.0" << std::endl;
142 }
143 else
145 for (
size_t s = 0; s <
W.
getAirfoil(q).getNumberOfPanels(); ++s)
146 {
148 outfile << r[0] << " " << r[1] << " " << "0.0" << std::endl;
149 }
150
151 outfile << "CELLS " << numberNonZero << " " << 2 * numberNonZero << std::endl;
152 for (size_t i = 0; i < numberNonZero; ++i)
153 outfile << "1 " << i << std::endl;
154
155 outfile << "CELL_TYPES " << numberNonZero << std::endl;
156 for (size_t i = 0; i < numberNonZero; ++i)
157 outfile << "1" << std::endl;
158
159 outfile << std::endl;
160 outfile << "POINT_DATA " << numberNonZero << std::endl;
161 outfile << "SCALARS Gamma float 1" << std::endl;
162 outfile << "LOOKUP_TABLE default" << std::endl;
163
166 outfile << v.g() << std::endl;
167 else
169 for (
size_t s = 0; s <
W.
getAirfoil(q).getNumberOfPanels(); ++s)
170 outfile << "0.0" << std::endl;
171
172 outfile.close();
173 }
175 {
176
177 uint16_t x = 0x0001;
178 bool littleEndian = (*((uint8_t*)&x));
179 const char eolnBIN[] = "\n";
180
182 outfile.open(
W.
getPassport().
dir +
"snapshots/" + fname, std::ios::out | std::ios::binary);
183
184 outfile <<
"# vtk DataFile Version 3.0" <<
"\r\n" <<
"VM2D VTK result: " << (
W.
getPassport().
dir +
"snapshots/" + fname).c_str() <<
" saved " <<
VMlib::CurrentDataTime() << eolnBIN;
185 outfile << "BINARY" << eolnBIN;
186 outfile << "DATASET UNSTRUCTURED_GRID" << eolnBIN << "POINTS " << numberNonZero << " " << "float" << eolnBIN;
187
189 {
190 Eigen::VectorXf rData = Eigen::VectorXf::Zero(
vtx.size() * 3);
191 for (
size_t i = 0; i <
vtx.size(); ++i)
192 {
193 rData(3 * i) = (float)(
vtx[i].r())[0];
194 rData(3 * i + 1) = (float)(
vtx[i].r())[1];
195 }
196
197 if (littleEndian)
198 for (
int i = 0; i <
vtx.size() * 3; ++i)
200 outfile.write(
reinterpret_cast<char*
>(rData.data()),
vtx.size() * 3 *
sizeof(float));
201 }
202 else
204 {
206 for (
size_t s = 0; s <
W.
getAirfoil(q).getNumberOfPanels(); ++s)
207 {
210 }
211
212 if (littleEndian)
216 }
217
218
219 std::vector<int> cells(2 * numberNonZero);
220 for (size_t i = 0; i < numberNonZero; ++i)
221 {
222 cells[2 * i] = 1;
223 cells[2 * i + 1] = (int)i;
224 }
225
226 std::vector<int> cellsTypes;
227 cellsTypes.resize(numberNonZero, 1);
228
229 if (littleEndian)
230 {
231 for (int i = 0; i < numberNonZero * 2; ++i)
233
234 for (int i = 0; i < numberNonZero; ++i)
236 }
237
238 outfile << eolnBIN << "CELLS " << numberNonZero << " " << numberNonZero * 2 << eolnBIN;
239 outfile.write(reinterpret_cast<char*>(cells.data()), numberNonZero * 2 * sizeof(int));
240 outfile << eolnBIN << "CELL_TYPES " << numberNonZero << eolnBIN;
241 outfile.write(reinterpret_cast<char*>(cellsTypes.data()), numberNonZero * sizeof(int));
242
243
244 outfile << eolnBIN << "POINT_DATA " << numberNonZero << eolnBIN;
245 outfile << eolnBIN << "SCALARS Gamma " << "float" << " 1" << eolnBIN;
246 outfile << "LOOKUP_TABLE default" << eolnBIN;
247
249 {
250 Eigen::VectorXf pData = Eigen::VectorXf::Zero(numberNonZero);
251 for (
int s = 0; s <
vtx.size(); ++s)
252 pData(s) = (float)
vtx[s].g();
253
254 if (littleEndian)
255 for (
int i = 0; i <
vtx.size(); ++i)
257 outfile.write(
reinterpret_cast<char*
>(pData.data()),
vtx.size() *
sizeof(float));
258 }
259 else
261 {
263 for (
int s = 0; s <
W.
getAirfoil(q).getNumberOfPanels(); ++s)
264 pData(s) = 0;
265
266 if (littleEndian)
267 for (
int i = 0; i <
W.
getAirfoil(q).getNumberOfPanels(); ++i)
270 }
271
272 outfile << eolnBIN;
273 outfile.close();
274 }
276 {
279
280 outfile << "point,x,y,G " << std::endl;
281
282 int counter = 0;
283
286 outfile << counter++ << "," << v.r()[0] << "," << v.r()[1] << "," << v.g() << std::endl;
287 else
289 for (
size_t s = 0; s <
W.
getAirfoil(q).getNumberOfPanels(); ++s)
290 {
292 outfile << counter++ << "," << r[0] << "," << r[1] << "," << "0.0" << std::endl;
293 }
294 outfile.close();
295 }
296
297 }
298
300}
const Point2D & getR(size_t q) const
Возврат константной ссылки на вершину профиля
size_t getNumberOfPanels() const
Возврат количества панелей на профиле
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
Рабочий каталог задачи
void stop(const std::string &timerLabel)
Останов счетчика
void start(const std::string &timerLabel)
Запуск счетчика
size_t getCurrentStep() const
Возврат константной ссылки на параметры распараллеливания по MPI.
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)
Создание каталога
std::string CurrentDataTime()
Формирование строки с текущем временем и датой
void SwapEnd(T &var)
Вспомогательная функция перестановки байт местами (нужно для сохранения бинарных VTK)
std::pair< std::string, int > fileTypeVtx
Тип файлов для сохранения скорости и давления
int saveVtxStep
Шаг сохранения кадров в бинарные файлы
int nameLength
Число разрядов в имени файла