33 using namespace
Input::Type;
36 return Record(
"vtk",
"Parameters of vtk output format.")
40 "Variant of output stream file format.")
49 return Selection(
"VTK variant (ascii or binary)")
51 "ASCII variant of VTK file format")
53 "Uncompressed appended binary XML VTK format without usage of base64 encoding of appended data.")
54 #ifdef FLOW123D_HAVE_ZLIB 56 "Appended binary XML VTK format without usage of base64 encoding of appended data. Compressed with ZLib.")
57 #endif // FLOW123D_HAVE_ZLIB 111 if(this->
rank != 0) {
120 << std::setw(6) << std::setfill(
'0') << this->
current_step 124 std::string frame_file_name = ss.str();
142 <<
"\" group=\"\" part=\"0\" file=\"" << relative_frame_file <<
"\"/>" << endl;
146 LogOut() << __func__ <<
": Writing output (frame " << this->current_step <<
") file " << relative_frame_file <<
" ... ";
181 file <<
"<?xml version=\"1.0\"?>" << endl;
184 file <<
"<VTKFile type=\"UnstructuredGrid\" version=\"0.1\" byte_order=\"LittleEndian\"";
186 file <<
" header_type=\"UInt64\"";
188 if ( this->
variant_type_ == VTKVariant::VARIANT_BINARY_ZLIB ) {
189 file <<
" compressor=\"vtkZLibDataCompressor\"";
192 file <<
"<UnstructuredGrid>" << endl;
199 auto &offsets = *(
output_mesh_->offsets_->get_component_data(0).get() );
200 unsigned int n_elements = offsets.size();
206 n_nodes = offsets[0];
219 for(
unsigned int i=1; i < n_elements; i++)
221 n_nodes = offsets[i]-offsets[i-1];
244 "Int8",
"UInt8",
"Int16",
"UInt16",
"Int32",
"UInt32",
"Float32",
"Float64" };
250 file <<
"<DataArray type=\"" << types[output_data->vtk_type()] <<
"\" ";
252 if( ! output_data->field_input_name().empty())
253 file <<
"Name=\"" << output_data->field_input_name() <<
"\" ";
255 if (output_data->n_elem() > 1)
258 <<
"NumberOfComponents=\"" << output_data->n_elem() <<
"\" ";
266 output_data->print_ascii_all(file);
267 file <<
"\n</DataArray>" << endl;
270 double range_min, range_max;
271 output_data->get_min_max_range(range_min, range_max);
273 file <<
"RangeMin=\"" << range_min <<
"\" RangeMax=\"" << range_max <<
"\"/>" << endl;
274 if ( this->
variant_type_ == VTKVariant::VARIANT_BINARY_UNCOMPRESSED ) {
277 stringstream uncompressed_data, compressed_data;
278 output_data->print_binary_all( uncompressed_data,
false );
289 static const size_t BUF_SIZE = 32 * 1024;
291 string uncompressed_string = uncompressed_stream.str();
292 uLong uncompressed_size = uncompressed_string.size();
293 stringstream compressed_data;
295 uLong count_of_blocks = (uncompressed_size + BUF_SIZE - 1) / BUF_SIZE;
296 uLong last_block_size = (uncompressed_size % BUF_SIZE);
297 compressed_stream.write(reinterpret_cast<const char*>(&count_of_blocks),
sizeof(
unsigned long long int));
298 compressed_stream.write(reinterpret_cast<const char*>(&BUF_SIZE),
sizeof(
unsigned long long int));
299 compressed_stream.write(reinterpret_cast<const char*>(&last_block_size),
sizeof(
unsigned long long int));
301 for (uLong i=0; i<count_of_blocks; ++i) {
303 std::string data_block = uncompressed_string.substr(i*BUF_SIZE, BUF_SIZE);
304 uLong data_block_size = data_block.size();
307 uint8_t temp_buffer[BUF_SIZE];
313 strm.next_in =
reinterpret_cast<uint8_t *
>(&data_block[0]);
314 strm.avail_in = data_block_size;
315 strm.next_out = temp_buffer;
316 strm.avail_out = BUF_SIZE;
319 deflateInit(&strm, Z_BEST_COMPRESSION);
320 while (strm.avail_in != 0) {
321 int res = deflate(&strm, Z_NO_FLUSH);
323 if (strm.avail_out == 0) {
324 buffer.insert(buffer.end(), temp_buffer, temp_buffer + BUF_SIZE);
325 strm.next_out = temp_buffer;
326 strm.avail_out = BUF_SIZE;
329 int deflate_res = Z_OK;
330 while (deflate_res == Z_OK) {
331 if (strm.avail_out == 0) {
332 buffer.insert(buffer.end(), temp_buffer, temp_buffer + BUF_SIZE);
333 strm.next_out = temp_buffer;
334 strm.avail_out = BUF_SIZE;
336 deflate_res = deflate(&strm, Z_FINISH);
338 ASSERT_EQ(deflate_res, Z_STREAM_END).error();
339 buffer.insert(buffer.end(), temp_buffer, temp_buffer + BUF_SIZE - strm.avail_out);
343 std::string str(buffer.begin(), buffer.end());
344 uLong compressed_data_size = str.size();
345 compressed_stream.write(reinterpret_cast<const char*>(&compressed_data_size),
sizeof(
unsigned long long int));
346 compressed_data << str;
349 compressed_stream << compressed_data.str();
365 if (output_data_vec.empty())
return;
367 file <<
"Scalars=\"";
372 file <<
"Vectors=\"";
377 file <<
"Tensors=\"";
390 node_corner_data.insert(node_corner_data.end(),
393 if( ! node_corner_data.empty() ) {
395 file <<
"<PointData ";
406 file <<
"</PointData>" << endl;
416 if (data_map.empty())
return;
419 file <<
"<CellData ";
427 file <<
"</CellData>" << endl;
435 file <<
"</UnstructuredGrid>" << endl;
438 file <<
"<AppendedData encoding=\"raw\">" << endl;
441 file <<
"</AppendedData>" << endl;
443 file <<
"</VTKFile>" << endl;
458 file <<
"<Piece NumberOfPoints=\"" <<
output_mesh_->n_nodes()
459 <<
"\" NumberOfCells=\"" <<
output_mesh_->n_elements() <<
"\">" << endl;
462 file <<
"<Points>" << endl;
464 file <<
"</Points>" << endl;
468 file <<
"<Cells>" << endl;
473 file <<
"</Cells>" << endl;
482 file <<
"</Piece>" << endl;
487 <<
"\" NumberOfCells=\"" <<
output_mesh_->n_elements() <<
"\">" << endl;
490 file <<
"<Points>" << endl;
492 file <<
"</Points>" << endl;
495 file <<
"<Cells>" << endl;
500 file <<
"</Cells>" << endl;
509 file <<
"</Piece>" << endl;
521 if(this->
rank != 0) {
528 this->
_base_file <<
"<?xml version=\"1.0\"?>" << endl;
529 this->
_base_file <<
"<VTKFile type=\"Collection\" version=\"0.1\" byte_order=\"LittleEndian\">" << endl;
541 if(this->
rank != 0) {
Classes for auxiliary output mesh.
std::shared_ptr< OutputMesh > output_mesh_
Output mesh.
virtual void init_from_input(const std::string &equation_name, Mesh &mesh, const Input::Record &in_rec)
Constructor of OutputTime object. It opens base file for writing.
Input::Record input_record_
std::shared_ptr< OutputMeshDiscontinuous > output_mesh_discont_
Discontinuous (non-conforming) mesh. Used for CORNER_DATA.
void fix_main_file_extension(std::string extension)
static const Input::Type::Record & get_input_type()
The definition of input record for vtk file format.
void write_vtk_field_data(OutputDataFieldVec &output_data_map)
std::shared_ptr< ElementDataCache< unsigned int > > fill_element_types_data()
Fills the data cache with VTK element types indicators.
void write_vtk_vtu(void)
This function write all scalar and vector data on nodes and elements to the VTK file (...
void write_vtk_data(OutputDataPtr output_data)
static const int registrar
Registrar of class to factory.
static Input::Type::Abstract & get_input_format_type()
The specification of output file format.
std::shared_ptr< ElementDataCacheBase > OutputDataPtr
string main_output_basename_
Basename of main output file (without extension)
#define ASSERT(expr)
Allow use shorter versions of macro names if these names is not used with external library...
int write_head(void)
This function writes header of VTK (.pvd) file format.
string main_output_dir_
Main output file directory.
void write_vtk_element_data(void)
Write data on elements to the VTK file (.vtu)
#define LogOut()
Macro defining 'log' record of log.
VTKVariant
The declaration enumeration used for variant of file VTK format.
void open_stream(Stream &stream) const
int write_data(void)
This function write data to VTK (.pvd) file format for curent time.
ostringstream appended_data_
void write_vtk_vtu_tail(void)
Write tail of VTK file (.vtu)
This class is used for output data to VTK file format.
string parent_path() const
int write_tail(void)
This function writes tail of VTK (.pvd) file format.
void set_stream_precision(std::ofstream &stream)
~OutputVTK()
The destructor of this class. It writes tail of the file too.
Dedicated class for storing path to input and output files.
OutputVTK()
The constructor of this class. The head of file is written, when constructor is called.
#define ASSERT_PTR(ptr)
Definition of assert macro checking non-null pointer (PTR)
VTKVariant variant_type_
Output format (ascii, binary or binary compressed)
void write_vtk_node_data(void)
Write data on nodes to the VTK file (.vtu)
OutputDataFieldVec output_data_vec_[N_DISCRETE_SPACES]
void compress_data(stringstream &uncompressed_stream, stringstream &compressed_stream)
bool enable_refinement_
Auxiliary flag for refinement enabling, due to gmsh format.
void write_vtk_vtu_head(void)
Write header of VTK file (.vtu)
void init_from_input(const std::string &equation_name, Mesh &mesh, const Input::Record &in_rec) override
Override OutputTime::init_from_input.
#define FLOW123D_FORCE_LINK_IN_CHILD(x)
#define ASSERT_EQ(a, b)
Definition of comparative assert macro (EQual)
static const Input::Type::Selection & get_input_type_variant()
The definition of input record for selection of variant of file format.
void write_vtk_data_names(ofstream &file, OutputDataFieldVec &output_data_map)
Write names of data sets in output_data vector that have value type equal to type. Output is done into stream file.