33 using namespace
Input::Type;
36 return Record(
"vtk",
"Parameters of vtk output format.")
40 "Variant of output stream file format.")
43 "Parallel or serial version of 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 90 this->
parallel_ = format_rec.val<
bool>(
"parallel");
112 << std::setw(6) << std::setfill(
'0') <<
current_step <<
"." << rank <<
".vtu";
116 << std::setw(6) << std::setfill(
'0') <<
current_step <<
".vtu";
124 <<
"<DataSet timestep=\"" << step
125 <<
"\" group=\"\" part=\"" << rank
126 <<
"\" file=\"" << file
148 if (this->
rank == 0) {
156 double corrected_time = (isfinite(this->
time)?this->
time:0);
158 for (
int i_rank=0; i_rank<
n_proc; ++i_rank) {
179 <<
", rank: " << this->
rank 180 <<
") file: " << frame_file_name <<
" ... ";
205 if(this->
rank == 0) {
219 file <<
"<?xml version=\"1.0\"?>" << endl;
222 file <<
"<VTKFile type=\"UnstructuredGrid\" version=\"0.1\" byte_order=\"LittleEndian\"";
224 file <<
" header_type=\"UInt64\"";
226 if ( this->
variant_type_ == VTKVariant::VARIANT_BINARY_ZLIB ) {
227 file <<
" compressor=\"vtkZLibDataCompressor\"";
230 file <<
"<UnstructuredGrid>" << endl;
237 auto &offsets = *( this->
offsets_->get_component_data(0).get() );
238 unsigned int n_elements = offsets.size();
244 n_nodes = offsets[0];
257 for(
unsigned int i=1; i < n_elements; i++)
259 n_nodes = offsets[i]-offsets[i-1];
282 "Int8",
"UInt8",
"Int16",
"UInt16",
"Int32",
"UInt32",
"Float32",
"Float64" };
286 file <<
"<DataArray type=\"" << types[output_data->vtk_type()] <<
"\" ";
288 if( ! output_data->field_input_name().empty())
289 file <<
"Name=\"" << output_data->field_input_name() <<
"\" ";
291 if (output_data->n_elem() > 1)
294 <<
"NumberOfComponents=\"" << output_data->n_elem() <<
"\" ";
302 output_data->print_ascii_all(file);
303 file <<
"\n</DataArray>" << endl;
306 double range_min, range_max;
307 output_data->get_min_max_range(range_min, range_max);
309 file <<
"RangeMin=\"" << range_min <<
"\" RangeMax=\"" << range_max <<
"\"/>" << endl;
310 if ( this->
variant_type_ == VTKVariant::VARIANT_BINARY_UNCOMPRESSED ) {
313 stringstream uncompressed_data, compressed_data;
314 output_data->print_binary_all( uncompressed_data,
false );
325 static const size_t BUF_SIZE = 32 * 1024;
327 string uncompressed_string = uncompressed_stream.str();
328 uLong uncompressed_size = uncompressed_string.size();
329 stringstream compressed_data;
331 uLong count_of_blocks = (uncompressed_size + BUF_SIZE - 1) / BUF_SIZE;
332 uLong last_block_size = (uncompressed_size % BUF_SIZE);
333 compressed_stream.write(reinterpret_cast<const char*>(&count_of_blocks),
sizeof(
unsigned long long int));
334 compressed_stream.write(reinterpret_cast<const char*>(&BUF_SIZE),
sizeof(
unsigned long long int));
335 compressed_stream.write(reinterpret_cast<const char*>(&last_block_size),
sizeof(
unsigned long long int));
337 for (uLong i=0; i<count_of_blocks; ++i) {
339 std::string data_block = uncompressed_string.substr(i*BUF_SIZE, BUF_SIZE);
340 uLong data_block_size = data_block.size();
343 uint8_t temp_buffer[BUF_SIZE];
349 strm.next_in =
reinterpret_cast<uint8_t *
>(&data_block[0]);
350 strm.avail_in = data_block_size;
351 strm.next_out = temp_buffer;
352 strm.avail_out = BUF_SIZE;
355 deflateInit(&strm, Z_BEST_COMPRESSION);
356 while (strm.avail_in != 0) {
357 int res = deflate(&strm, Z_NO_FLUSH);
359 if (strm.avail_out == 0) {
360 buffer.insert(buffer.end(), temp_buffer, temp_buffer + BUF_SIZE);
361 strm.next_out = temp_buffer;
362 strm.avail_out = BUF_SIZE;
365 int deflate_res = Z_OK;
366 while (deflate_res == Z_OK) {
367 if (strm.avail_out == 0) {
368 buffer.insert(buffer.end(), temp_buffer, temp_buffer + BUF_SIZE);
369 strm.next_out = temp_buffer;
370 strm.avail_out = BUF_SIZE;
372 deflate_res = deflate(&strm, Z_FINISH);
374 ASSERT_EQ(deflate_res, Z_STREAM_END).error();
375 buffer.insert(buffer.end(), temp_buffer, temp_buffer + BUF_SIZE - strm.avail_out);
379 std::string str(buffer.begin(), buffer.end());
380 uLong compressed_data_size = str.size();
381 compressed_stream.write(reinterpret_cast<const char*>(&compressed_data_size),
sizeof(
unsigned long long int));
382 compressed_data << str;
385 compressed_stream << compressed_data.str();
401 if (output_data_vec.empty())
return;
403 file <<
"Scalars=\"";
408 file <<
"Vectors=\"";
413 file <<
"Tensors=\"";
426 node_corner_data.insert(node_corner_data.end(),
429 if( ! node_corner_data.empty() ) {
431 file <<
"<PointData ";
442 file <<
"</PointData>" << endl;
452 if (data_map.empty())
return;
455 file <<
"<CellData ";
463 file <<
"</CellData>" << endl;
472 if (data_map.empty())
return;
475 file <<
"<Flow123dData ";
481 file <<
"<DataArray type=\"Float64\" ";
482 file <<
"Name=\"" << output_data->field_input_name() <<
"\" ";
484 file <<
"dof_handler_hash=\"" << output_data->dof_handler_hash() <<
"\" ";
485 file <<
"n_dofs_per_element=\"" << output_data->n_elem() <<
"\"";
490 file << std::fixed << std::setprecision(10);
491 output_data->print_ascii_all(file);
492 file <<
"\n</DataArray>" << endl;
495 double range_min, range_max;
496 output_data->get_min_max_range(range_min, range_max);
498 file <<
"RangeMin=\"" << range_min <<
"\" RangeMax=\"" << range_max <<
"\"/>" << endl;
499 if ( this->
variant_type_ == VTKVariant::VARIANT_BINARY_UNCOMPRESSED ) {
502 stringstream uncompressed_data, compressed_data;
503 output_data->print_binary_all( uncompressed_data,
false );
511 file <<
"</Flow123dData>" << endl;
519 file <<
"</UnstructuredGrid>" << endl;
522 file <<
"<AppendedData encoding=\"raw\">" << endl;
525 file <<
"</AppendedData>" << endl;
527 file <<
"</VTKFile>" << endl;
539 file <<
"<Piece NumberOfPoints=\"" << this->
nodes_->n_values()
540 <<
"\" NumberOfCells=\"" << this->
offsets_->n_values() <<
"\">" << endl;
543 file <<
"<Points>" << endl;
545 file <<
"</Points>" << endl;
548 file <<
"<Cells>" << endl;
553 file <<
"</Cells>" << endl;
565 file <<
"</Piece>" << endl;
576 if(this->
rank != 0) {
582 this->
_base_file <<
"<?xml version=\"1.0\"?>" << endl;
583 this->
_base_file <<
"<VTKFile type=\"Collection\" version=\"0.1\" byte_order=\"LittleEndian\">" << endl;
595 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)
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].
virtual void init_from_input(const std::string &equation_name, const Input::Record &in_rec)
Constructor of OutputTime object. It opens base file for writing.
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 init_from_input(const std::string &equation_name, const Input::Record &in_rec) override
Override OutputTime::init_from_input.
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)
~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.
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)
#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.