36 using namespace
Input::Type;
39 return Record(
"vtk",
"Parameters of vtk output format.")
43 "Variant of output stream file format.")
46 "Parallel or serial version of file format.")
52 return Selection(
"VTK variant (ascii or binary)")
54 "ASCII variant of VTK file format")
56 "Uncompressed appended binary XML VTK format without usage of base64 encoding of appended data.")
57 #ifdef FLOW123D_HAVE_ZLIB 59 "Appended binary XML VTK format without usage of base64 encoding of appended data. Compressed with ZLib.")
60 #endif // FLOW123D_HAVE_ZLIB 93 this->
parallel_ = format_rec.val<
bool>(
"parallel");
96 if(this->
rank_ == 0) {
114 ss << basename <<
"/" << basename <<
"-" 115 << std::setw(6) << std::setfill(
'0') << i_step <<
"." << rank <<
".vtu";
118 ss << basename <<
"/" << basename <<
"-" 119 << std::setw(6) << std::setfill(
'0') << i_step <<
".vtu";
127 <<
"<DataSet timestep=\"" << step
128 <<
"\" group=\"\" part=\"" << rank
129 <<
"\" file=\"" << file
151 if (this->
rank_ == 0) {
159 double corrected_time = (isfinite(this->
time)?this->
time:0);
162 for (
int i_rank=0; i_rank<
n_proc_; ++i_rank) {
183 <<
", rank: " << this->
rank_ 184 <<
") file: " << frame_file_name <<
" ... ";
209 if(this->
rank_ == 0) {
223 file <<
"<?xml version=\"1.0\"?>" << endl;
226 file <<
"<VTKFile type=\"UnstructuredGrid\" version=\"0.1\" byte_order=\"LittleEndian\"";
228 file <<
" header_type=\"UInt64\"";
230 if ( this->
variant_type_ == VTKVariant::VARIANT_BINARY_ZLIB ) {
231 file <<
" compressor=\"vtkZLibDataCompressor\"";
234 file <<
"<UnstructuredGrid>" << endl;
241 auto &offsets = *( this->
offsets_->get_component_data(0).get() );
242 unsigned int n_elements = offsets.size();
248 n_nodes = offsets[0];
261 for(
unsigned int i=1; i < n_elements; i++)
263 n_nodes = offsets[i]-offsets[i-1];
286 "Int8",
"UInt8",
"Int16",
"UInt16",
"Int32",
"UInt32",
"Float32",
"Float64" };
290 file <<
"<DataArray type=\"" << types[output_data->vtk_type()] <<
"\" ";
292 if( ! output_data->field_input_name().empty())
293 file <<
"Name=\"" << output_data->field_input_name() <<
"\" ";
295 if (output_data->n_comp() > 1)
298 <<
"NumberOfComponents=\"" << output_data->n_comp() <<
"\" ";
306 output_data->print_ascii_all(file);
307 file <<
"\n</DataArray>" << endl;
310 double range_min, range_max;
311 output_data->get_min_max_range(range_min, range_max);
313 file <<
"RangeMin=\"" << range_min <<
"\" RangeMax=\"" << range_max <<
"\"/>" << endl;
314 if ( this->
variant_type_ == VTKVariant::VARIANT_BINARY_UNCOMPRESSED ) {
317 stringstream uncompressed_data, compressed_data;
318 output_data->print_binary_all( uncompressed_data,
false );
329 static const size_t BUF_SIZE = 32 * 1024;
331 string uncompressed_string = uncompressed_stream.str();
332 zlib_ulong uncompressed_size = uncompressed_string.size();
333 stringstream compressed_data;
335 zlib_ulong count_of_blocks = (uncompressed_size + BUF_SIZE - 1) / BUF_SIZE;
336 zlib_ulong last_block_size = (uncompressed_size % BUF_SIZE);
337 compressed_stream.write(reinterpret_cast<const char*>(&count_of_blocks),
sizeof(
unsigned long long int));
338 compressed_stream.write(reinterpret_cast<const char*>(&BUF_SIZE),
sizeof(
unsigned long long int));
339 compressed_stream.write(reinterpret_cast<const char*>(&last_block_size),
sizeof(
unsigned long long int));
341 for (
zlib_ulong i=0; i<count_of_blocks; ++i) {
343 std::string data_block = uncompressed_string.substr(i*BUF_SIZE, BUF_SIZE);
344 zlib_ulong data_block_size = data_block.size();
347 uint8_t temp_buffer[BUF_SIZE];
353 strm.next_in =
reinterpret_cast<uint8_t *
>(&data_block[0]);
354 strm.avail_in = data_block_size;
355 strm.next_out = temp_buffer;
356 strm.avail_out = BUF_SIZE;
359 deflateInit(&strm, Z_BEST_COMPRESSION);
360 while (strm.avail_in != 0) {
361 int res = deflate(&strm, Z_NO_FLUSH);
363 if (strm.avail_out == 0) {
364 buffer.insert(buffer.end(), temp_buffer, temp_buffer + BUF_SIZE);
365 strm.next_out = temp_buffer;
366 strm.avail_out = BUF_SIZE;
369 int deflate_res = Z_OK;
370 while (deflate_res == Z_OK) {
371 if (strm.avail_out == 0) {
372 buffer.insert(buffer.end(), temp_buffer, temp_buffer + BUF_SIZE);
373 strm.next_out = temp_buffer;
374 strm.avail_out = BUF_SIZE;
376 deflate_res = deflate(&strm, Z_FINISH);
378 ASSERT_EQ(deflate_res, Z_STREAM_END).error();
379 buffer.insert(buffer.end(), temp_buffer, temp_buffer + BUF_SIZE - strm.avail_out);
383 std::string str(buffer.begin(), buffer.end());
385 compressed_stream.write(reinterpret_cast<const char*>(&compressed_data_size),
sizeof(
unsigned long long int));
386 compressed_data << str;
389 compressed_stream << compressed_data.str();
396 if( ! data->is_dummy())
406 if (output_data_vec.empty())
return;
408 file <<
"Scalars=\"";
411 && ! data->is_dummy())
412 file << data->field_input_name() <<
",";
415 file <<
"Vectors=\"";
418 && ! data->is_dummy())
419 file << data->field_input_name() <<
",";
422 file <<
"Tensors=\"";
425 && ! data->is_dummy())
426 file << data->field_input_name() <<
",";
437 node_corner_data.insert(node_corner_data.end(),
440 if( ! node_corner_data.empty() ) {
442 file <<
"<PointData ";
453 file <<
"</PointData>" << endl;
463 if (data_map.empty())
return;
466 file <<
"<CellData ";
474 file <<
"</CellData>" << endl;
483 if (data_map.empty())
return;
486 file <<
"<Flow123dData ";
492 file <<
"<DataArray type=\"Float64\" ";
493 file <<
"Name=\"" << output_data->field_input_name() <<
"\" ";
495 file <<
"dof_handler_hash=\"" << output_data->dof_handler_hash() <<
"\" ";
496 file <<
"n_dofs_per_element=\"" << output_data->n_comp() <<
"\"";
501 file << std::fixed << std::setprecision(10);
502 output_data->print_ascii_all(file);
503 file <<
"\n</DataArray>" << endl;
506 double range_min, range_max;
507 output_data->get_min_max_range(range_min, range_max);
509 file <<
"RangeMin=\"" << range_min <<
"\" RangeMax=\"" << range_max <<
"\"/>" << endl;
510 if ( this->
variant_type_ == VTKVariant::VARIANT_BINARY_UNCOMPRESSED ) {
513 stringstream uncompressed_data, compressed_data;
514 output_data->print_binary_all( uncompressed_data,
false );
522 file <<
"</Flow123dData>" << endl;
530 file <<
"</UnstructuredGrid>" << endl;
533 file <<
"<AppendedData encoding=\"raw\">" << endl;
536 file <<
"</AppendedData>" << endl;
538 file <<
"</VTKFile>" << endl;
550 file <<
"<Piece NumberOfPoints=\"" << this->
nodes_->n_values()
551 <<
"\" NumberOfCells=\"" << this->
offsets_->n_values() <<
"\">" << endl;
554 file <<
"<Points>" << endl;
556 file <<
"</Points>" << endl;
559 file <<
"<Cells>" << endl;
564 file <<
"</Cells>" << endl;
576 file <<
"</Piece>" << endl;
587 if(this->
rank_ != 0) {
593 this->
_base_file <<
"<?xml version=\"1.0\"?>" << endl;
594 this->
_base_file <<
"<VTKFile type=\"Collection\" version=\"0.1\" byte_order=\"LittleEndian\">" << endl;
606 if(this->
rank_ != 0) {
Classes for auxiliary output mesh.
Input::Record input_record_
void fix_main_file_extension(std::string extension)
static const std::vector< std::string > formats
Formats of DataArray section.
std::shared_ptr< ElementDataCache< unsigned int > > connectivity_
Vector maps the nodes to their coordinates in vector nodes_.
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 (...
std::shared_ptr< ElementDataCache< unsigned int > > offsets_
Vector of offsets of node indices of elements. Maps elements to their nodes in connectivity_.
void write_vtk_data(OutputDataPtr output_data)
double convert_unit_from(std::string actual_unit) const
Convert and check user-defined unit.
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
std::shared_ptr< ElementDataCache< double > > nodes_
Vector of node coordinates. [spacedim x n_nodes].
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.
bool parallel_
Parallel or serial version of file format (parallel has effect only for VTK)
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)
string unit_string_
String representation of time unit.
~OutputVTK()
The destructor of this class. It writes tail of the file too.
void write_vtk_native_data(void)
Write native data (part of our own data skipped by Paraview) to the VTK file (.vtu) ...
Dedicated class for storing path to input and output files.
virtual void init_from_input(const std::string &equation_name, const Input::Record &in_rec, std::string unit_str)
Constructor of OutputTime object. It opens base file for writing.
Support classes for parallel programing.
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)
string form_vtu_filename_(string basename, int i_step, int rank)
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)
string pvd_dataset_line(double step, int rank, string file)
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)
Class for representation SI units of Fields.
void init_from_input(const std::string &equation_name, const Input::Record &in_rec, std::string unit_str) 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.