From e4c350d0878d3d804ff4f51bd2007837e8816395 Mon Sep 17 00:00:00 2001 From: Simon Praetorius <simon.praetorius@tu-dresden.de> Date: Sun, 19 Aug 2018 13:38:16 +0200 Subject: [PATCH] Better detection of appended data --- dune/vtk/filereader.hh | 16 +-- dune/vtk/vtkreader.hh | 49 ++++----- dune/vtk/vtkreader.impl.hh | 206 ++++++++++++++++++++----------------- dune/vtk/vtkwriter.impl.hh | 39 +++---- src/vtkreader.cc | 29 ++++-- 5 files changed, 182 insertions(+), 157 deletions(-) diff --git a/dune/vtk/filereader.hh b/dune/vtk/filereader.hh index b473ec5..5e2c313 100644 --- a/dune/vtk/filereader.hh +++ b/dune/vtk/filereader.hh @@ -1,17 +1,19 @@ #pragma once +#include <memory> #include <string> +#include <utility> namespace Dune { - template <class Grid, class GridReaderImp> + template <class Grid, class FilerReaderImp> class FileReader { private: // type of underlying implementation, for internal use only - using Implementation = GridReaderImp; + using Implementation = FilerReaderImp; - //! \brief An accessor class to call protected members of reader implementations. + /// \brief An accessor class to call protected members of reader implementations. struct Accessor : public Implementation { template <class... Args> @@ -28,16 +30,16 @@ namespace Dune }; public: - //! Reads the grid from a file with filename and returns a unique_ptr to the created grid. - //! Redirects to concrete implementation of derivated class. + /// Reads the grid from a file with filename and returns a unique_ptr to the created grid. + /// Redirects to concrete implementation of derivated class. template <class... Args> static std::unique_ptr<Grid> read (const std::string &filename, Args&&... args) { return Accessor::readImpl(filename, std::forward<Args>(args)...); } - //! Reads the grid from a file with filename into a grid-factory. - //! Redirects to concrete implementation of derivated class. + /// Reads the grid from a file with filename into a grid-factory. + /// Redirects to concrete implementation of derivated class. template <class... Args> static void read (GridFactory<Grid> &factory, const std::string &filename, Args&&... args) { diff --git a/dune/vtk/vtkreader.hh b/dune/vtk/vtkreader.hh index 6e327c2..786d66e 100644 --- a/dune/vtk/vtkreader.hh +++ b/dune/vtk/vtkreader.hh @@ -25,6 +25,13 @@ namespace Dune POINTS, POINTS_DATA_ARRAY, CELLS, CELLS_DATA_ARRAY, APPENDED_DATA, XML_NAME, XML_NAME_ASSIGN, XML_VALUE }; + struct DataArrayAttributes + { + Vtk::DataTypes type; + std::size_t components = 1; + std::uint64_t offset = 0; + }; + using Entity = typename Grid::template Codim<0>::Entity; using GlobalCoordinate = typename Entity::Geometry::GlobalCoordinate; @@ -47,48 +54,27 @@ namespace Dune private: // Read values stored on the cells with name `name` template <class T> - Sections readCellData (std::ifstream& /*input*/, - std::vector<T>& /*values*/, - std::string /*name*/, - Vtk::DataTypes /*type*/, - std::size_t /*nComponents*/, - std::string /*format*/, - std::uint64_t /*offset*/) + Sections readCellData (std::ifstream& /*input*/, std::vector<T>& /*values*/, std::string /*name*/) { /* does not read anything */ return CD_DATA_ARRAY; } template <class T> - Sections readPointData (std::ifstream& /*input*/, - std::vector<T>& /*values*/, - std::string /*name*/, - Vtk::DataTypes /*type*/, - std::size_t /*nComponents*/, - std::string /*format*/, - std::uint64_t /*offset*/) + Sections readPointData (std::ifstream& /*input*/, std::vector<T>& /*values*/, std::string /*name*/) { /* does not read anything */ return PD_DATA_ARRAY; } // Read vertex coordinates from `input` stream and store in into `factory` - Sections readPoints (std::ifstream& input, - std::string name, - Vtk::DataTypes type, - std::size_t nComponents, - std::string format, - std::uint64_t offset); + Sections readPoints (std::ifstream& input); template <class T> void readPointsAppended (std::ifstream& input); // Read cell type, cell offsets and connectivity from `input` stream - Sections readCells (std::ifstream& input, - std::string name, - Vtk::DataTypes type, - std::string format, - std::uint64_t offset); + Sections readCells (std::ifstream& input, std::string name); void readCellsAppended (std::ifstream& input); @@ -100,7 +86,7 @@ namespace Dune bool isSection (std::string line, std::string key, Sections current, - Sections parent = NO_SECTION) + Sections parent = NO_SECTION) const { bool result = line.substr(1, key.length()) == key; if (result && current != parent) @@ -108,6 +94,9 @@ namespace Dune return result; } + // Find beginning of appended binary data + std::uint64_t findAppendedDataPosition (std::ifstream& input) const; + // Read attributes from current xml tag std::map<std::string, std::string> parseXml(std::string const& line, bool& closed); @@ -126,12 +115,12 @@ namespace Dune std::vector<std::int64_t> vec_offsets; //< offset of vertices of cell std::vector<std::int64_t> vec_connectivity; //< vertex indices of cell - std::size_t numCells_; //< Number of cells in the grid - std::size_t numVertices_; // Number of vertices in the grid + std::size_t numberOfCells_; //< Number of cells in the grid + std::size_t numberOfPoints_; // Number of vertices in the grid // offset information for appended data - // map Name -> {DataType,Offset} - std::map<std::string, std::pair<Vtk::DataTypes,std::uint64_t>> offsets_; + // map Name -> {DataType,NumberOfComponents,Offset} + std::map<std::string, DataArrayAttributes> dataArray_; /// Offset of beginning of appended data std::uint64_t offset0_; diff --git a/dune/vtk/vtkreader.impl.hh b/dune/vtk/vtkreader.impl.hh index 6dcba2d..4954fd6 100644 --- a/dune/vtk/vtkreader.impl.hh +++ b/dune/vtk/vtkreader.impl.hh @@ -23,19 +23,12 @@ void VtkReader<Grid>::readFromFile (std::string const& filename) std::ifstream input(filename, std::ios_base::in | std::ios_base::binary); - std::string data_name = "", - data_format = ""; + std::string compressor = ""; + std::string data_name = "", data_format = ""; Vtk::DataTypes data_type = Vtk::UNKNOWN; std::size_t data_components = 0; std::uint64_t data_offset = 0; - std::string file_type = "", - byte_order = "", - header_type = "", - compressor = "", - encoding = ""; - double version = 0.0; - Sections section = NO_SECTION; for (std::string line; std::getline(input, line); ) { ltrim(line); @@ -43,17 +36,22 @@ void VtkReader<Grid>::readFromFile (std::string const& filename) if (isSection(line, "VTKFile", section)) { bool closed = false; auto attr = parseXml(line, closed); - file_type = attr["type"]; - if (file_type != "UnstructuredGrid") - DUNE_THROW(NotImplemented, "Only UnstructuredGrid format implemented. Found: " << file_type); + + if (!attr["type"].empty()) + assert(attr["type"] == "UnstructuredGrid"); if (!attr["version"].empty()) assert(std::stod(attr["version"]) == 1.0); - if (!attr["header_type"].empty()) + if (!attr["byte_order"].empty()) assert(attr["byte_order"] == "LittleEndian"); if (!attr["header_type"].empty()) assert(attr["header_type"] == "UInt64"); - if (!attr["compressor"].empty()) + if (!attr["compressor"].empty()) { compressor = attr["compressor"]; + assert(compressor == "vtkZLibDataCompressor"); // only ZLib compression supported + } + + // std::cout << "<VTKFile type='" << attr["type"] << "' version='" << attr["version"] << "' header_type='" << attr["header_type"] << "' byte_order='" << attr["byte_order"] << "' compressor='" << attr["compressor"] << "'>\n"; + section = VTK_FILE; } else if (isSection(line, "/VTKFile", section, VTK_FILE)) @@ -65,8 +63,10 @@ void VtkReader<Grid>::readFromFile (std::string const& filename) else if (isSection(line, "Piece", section, UNSTRUCTURED_GRID)) { bool closed = false; auto attr = parseXml(line, closed); - numVertices_ = std::stol(attr["NumberOfPoints"]); - numCells_ = std::stol(attr["NumberOfCells"]); + + assert(attr.count("NumberOfPoints") > 0 && attr.count("NumberOfCells") > 0); + numberOfPoints_ = std::stoul(attr["NumberOfPoints"]); + numberOfCells_ = std::stoul(attr["NumberOfCells"]); section = PIECE; } else if (isSection(line, "/Piece", section, PIECE)) @@ -92,28 +92,51 @@ void VtkReader<Grid>::readFromFile (std::string const& filename) auto attr = parseXml(line, closed); data_type = Vtk::Map::datatype[attr["type"]]; - data_name = attr["Name"]; + + if (!attr["Name"].empty()) + data_name = to_lower(attr["Name"]); + else if (section == POINTS) + data_name = "points"; + + data_components = 1; if (!attr["NumberOfComponents"].empty()) data_components = std::stoul(attr["NumberOfComponents"]); // determine FormatType - data_format = attr["format"]; + data_format = to_lower(attr["format"]); if (data_format == "appended") { - if (!compressor.empty()) - format_ = Vtk::COMPRESSED; - else - format_ = Vtk::BINARY; + format_ = !compressor.empty() ? Vtk::COMPRESSED : Vtk::BINARY; } else { format_ = Vtk::ASCII; } + // Offset makes sense in appended mode only + data_offset = 0; if (!attr["offset"].empty()) { data_offset = std::stoul(attr["offset"]); assert(data_format == "appended"); } - if (closed) continue; - else if (section == POINT_DATA) + // Store attributes of DataArray + dataArray_[data_name] = {data_type, data_components, data_offset}; + + // std::cout << "<DataArray type='" << attr["type"] << "' Name='" << data_name << "' NumberOfComponents='" << attr["NumberOfComponents"] << "' format='" << data_format << "' offset='" << attr["offset"] << "' " << (closed ? "/" : "") << ">\n"; + + // Skip section in appended mode + if (data_format == "appended") { + if (!closed) { + while (std::getline(input, line)) { + ltrim(line); + if (line.substr(1,10) == "/DataArray") { + // std::cout << "</DataArray>\n"; + break; + } + } + } + continue; + } + + if (section == POINT_DATA) section = PD_DATA_ARRAY; else if (section == POINTS) section = POINTS_DATA_ARRAY; @@ -139,16 +162,11 @@ void VtkReader<Grid>::readFromFile (std::string const& filename) else if (isSection(line, "AppendedData", section, VTK_FILE)) { bool closed = false; auto attr = parseXml(line, closed); - encoding = attr["encoding"]; - if (encoding != "raw") - DUNE_THROW(NotImplemented, "Binary encoding != raw not implemented."); - - // Find starting point of appended data - while (input.get() != '_') - /*do nothing*/; + if (!attr["encoding"].empty()) + assert(attr["encoding"] == "raw"); // base64 encoding not supported - offset0_ = input.tellg()+1; - if (offsets_["points"].first == Vtk::FLOAT32) + offset0_ = findAppendedDataPosition(input); + if (dataArray_["points"].type == Vtk::FLOAT32) readPointsAppended<float>(input); else readPointsAppended<double>(input); @@ -163,26 +181,26 @@ void VtkReader<Grid>::readFromFile (std::string const& filename) case PD_DATA_ARRAY: if (data_type == Vtk::FLOAT32) { std::vector<float> values; - section = readPointData(input, values, data_name, data_type, data_components, data_format, data_offset); - } else { + section = readPointData(input, values, data_name); + } else if (data_type == Vtk::FLOAT64) { std::vector<double> values; - section = readPointData(input, values, data_name, data_type, data_components, data_format, data_offset); + section = readPointData(input, values, data_name); } break; case POINTS_DATA_ARRAY: - section = readPoints(input, data_name, data_type, data_components, data_format, data_offset); + section = readPoints(input); break; case CD_DATA_ARRAY: if (data_type == Vtk::FLOAT32) { std::vector<float> values; - section = readCellData(input, values, data_name, data_type, data_components, data_format, data_offset); - } else { + section = readCellData(input, values, data_name); + } else if (data_type == Vtk::FLOAT64) { std::vector<double> values; - section = readCellData(input, values, data_name, data_type, data_components, data_format, data_offset); + section = readCellData(input, values, data_name); } break; case CELLS_DATA_ARRAY: - section = readCells(input, data_name, data_type, data_format, data_offset); + section = readCells(input, data_name); break; default: // do nothing @@ -208,17 +226,16 @@ void VtkReader<Grid>::readFromFile (std::string const& filename) * \param parent_section XML Section to return when current `section` is finished. **/ template <class IStream, class T, class Sections> -Sections read_data_array (IStream& input, std::vector<T>& values, std::size_t max_size, - Sections section, Sections parent_section) +Sections readDataArray (IStream& input, std::vector<T>& values, std::size_t max_size, + Sections section, Sections parent_section) { values.reserve(max_size); - using S = std::conditional_t<(sizeof(T) <= 1), std::uint16_t, T>; + using S = std::conditional_t<(sizeof(T) <= 1), std::uint16_t, T>; // problem when reading chars as ints std::size_t idx = 0; - std::string line; - while (std::getline(input, line)) { + for (std::string line; std::getline(input, line);) { trim(line); - if (line.substr(0,12) == std::string("</DataArray>")) + if (line.substr(1,10) == "/DataArray") return parent_section; std::istringstream stream(line); @@ -234,25 +251,21 @@ Sections read_data_array (IStream& input, std::vector<T>& values, std::size_t ma template <class Grid> typename VtkReader<Grid>::Sections -VtkReader<Grid>::readPoints (std::ifstream& input, std::string name, Vtk::DataTypes type, - std::size_t nComponents, std::string format, std::uint64_t offset) +VtkReader<Grid>::readPoints (std::ifstream& input) { - if (format == "appended") { - offsets_["points"] = {type, offset}; - return POINTS; - } - - assert(numVertices_ > 0); using T = typename GlobalCoordinate::value_type; + assert(numberOfPoints_ > 0); + assert(dataArray_["points"].components == 3u); + std::vector<T> point_values; - auto sec = read_data_array(input, point_values, 3*numVertices_, POINTS_DATA_ARRAY, POINTS); + auto sec = readDataArray(input, point_values, 3*numberOfPoints_, POINTS_DATA_ARRAY, POINTS); assert(sec == POINTS); - assert(point_values.size() == 3*numVertices_); + assert(point_values.size() == 3*numberOfPoints_); // extract points from continuous values GlobalCoordinate p; std::size_t idx = 0; - for (std::size_t i = 0; i < numVertices_; ++i) { + for (std::size_t i = 0; i < numberOfPoints_; ++i) { for (std::size_t j = 0; j < p.size(); ++j) p[j] = point_values[idx++]; idx += (3u - p.size()); @@ -267,16 +280,17 @@ template <class Grid> template <class T> void VtkReader<Grid>::readPointsAppended (std::ifstream& input) { - assert(numVertices_ > 0); - auto offset_data = offsets_["points"]; + assert(numberOfPoints_ > 0); + assert(dataArray_["points"].components == 3u); + std::vector<T> point_values; - readAppended(input, point_values, offset_data.second); - assert(point_values.size() == 3*numVertices_); + readAppended(input, point_values, dataArray_["points"].offset); + assert(point_values.size() == 3*numberOfPoints_); // extract points from continuous values GlobalCoordinate p; std::size_t idx = 0; - for (std::size_t i = 0; i < numVertices_; ++i) { + for (std::size_t i = 0; i < numberOfPoints_; ++i) { for (std::size_t j = 0; j < p.size(); ++j) p[j] = T(point_values[idx++]); idx += (3u - p.size()); @@ -288,31 +302,25 @@ void VtkReader<Grid>::readPointsAppended (std::ifstream& input) template <class Grid> typename VtkReader<Grid>::Sections -VtkReader<Grid>::readCells (std::ifstream& input, std::string name, Vtk::DataTypes type, - std::string format, std::uint64_t offset) +VtkReader<Grid>::readCells (std::ifstream& input, std::string name) { - if (format == "appended") { - offsets_[name] = {type, offset}; - return CELLS; - } - Sections sec = CELLS_DATA_ARRAY; - assert(numCells_ > 0); + assert(numberOfCells_ > 0); if (name == "types") { - sec = read_data_array(input, vec_types, numCells_, CELLS_DATA_ARRAY, CELLS); - assert(vec_types.size() == numCells_); + sec = readDataArray(input, vec_types, numberOfCells_, CELLS_DATA_ARRAY, CELLS); + assert(vec_types.size() == numberOfCells_); } else if (name == "offsets") { - sec = read_data_array(input, vec_offsets, numCells_, CELLS_DATA_ARRAY, CELLS); - assert(vec_offsets.size() == numCells_); + sec = readDataArray(input, vec_offsets, numberOfCells_, CELLS_DATA_ARRAY, CELLS); + assert(vec_offsets.size() == numberOfCells_); } else if (name == "connectivity") { std::size_t max_size = 0; int max_vertices = (Grid::dimension == 1 ? 2 : Grid::dimension == 2 ? 4 : 8); if (!vec_offsets.empty()) max_size = vec_offsets.back(); else - max_size = numCells_ * max_vertices; - sec = read_data_array(input, vec_connectivity, max_size, CELLS_DATA_ARRAY, CELLS); + max_size = numberOfCells_ * max_vertices; + sec = readDataArray(input, vec_connectivity, max_size, CELLS_DATA_ARRAY, CELLS); } return sec; @@ -322,21 +330,21 @@ VtkReader<Grid>::readCells (std::ifstream& input, std::string name, Vtk::DataTyp template <class Grid> void VtkReader<Grid>::readCellsAppended (std::ifstream& input) { - assert(numCells_ > 0); - auto types_data = offsets_["types"]; - auto offsets_data = offsets_["offsets"]; - auto connectivity_data = offsets_["connectivity"]; + assert(numberOfCells_ > 0); + auto types_data = dataArray_["types"]; + auto dataArray_data = dataArray_["offsets"]; + auto connectivity_data = dataArray_["connectivity"]; - assert(types_data.first == Vtk::UINT8); - readAppended(input, vec_types, types_data.second); - assert(vec_types.size() == numCells_); + assert(types_data.type == Vtk::UINT8); + readAppended(input, vec_types, types_data.offset); + assert(vec_types.size() == numberOfCells_); - assert(offsets_data.first == Vtk::INT64); - readAppended(input, vec_offsets, offsets_data.second); - assert(vec_offsets.size() == numCells_); + assert(dataArray_data.type == Vtk::INT64); + readAppended(input, vec_offsets, dataArray_data.offset); + assert(vec_offsets.size() == numberOfCells_); - assert(connectivity_data.first == Vtk::INT64); - readAppended(input, vec_connectivity, connectivity_data.second); + assert(connectivity_data.type == Vtk::INT64); + readAppended(input, vec_connectivity, connectivity_data.offset); assert(vec_connectivity.size() == vec_offsets.back()); } @@ -360,13 +368,14 @@ void read_compressed (T* buffer, unsigned char* buffer_in, Bytef* compressed_buffer = reinterpret_cast<Bytef*>(buffer_in); Bytef* uncompressed_buffer = reinterpret_cast<Bytef*>(buffer); - input.readsome((char*)(compressed_buffer), compressed_space); + input.read((char*)(compressed_buffer), compressed_space); assert(input.gcount() == compressed_space); if (uncompress(uncompressed_buffer, &uncompressed_space, compressed_buffer, compressed_space) != Z_OK) { std::cerr << "Zlib error while uncompressing data.\n"; std::abort(); } + assert(uLongf(bs) == uncompressed_space); #else std::cerr << "Can not call read_compressed without compression enabled!\n"; std::abort(); @@ -405,7 +414,6 @@ void VtkReader<Grid>::readAppended (std::ifstream& input, std::vector<T>& values } else { input.read((char*)&size, sizeof(std::uint64_t)); } - std::cout << "size = " << size << "\n"; assert(size > 0 && (size % sizeof(T)) == 0); values.resize(size / sizeof(T)); @@ -421,7 +429,7 @@ void VtkReader<Grid>::readAppended (std::ifstream& input, std::vector<T>& values read_compressed(values.data() + i*num_values, buffer_in.data(), bs, cbs[i], input); } } else { - input.readsome((char*)(values.data()), size); + input.read((char*)(values.data()), size); assert(input.gcount() == size); } } @@ -454,6 +462,20 @@ void VtkReader<Grid>::createGrid () const } +template <class Grid> +std::uint64_t VtkReader<Grid>::findAppendedDataPosition (std::ifstream& input) const +{ + char c; + while (input.get(c) && std::isblank(c)) { /*do nothing*/ } + + std::uint64_t offset = input.tellg(); + if (c != '_') + --offset; // if char is not '_', assume it is part of the data. + + return offset; +} + + template <class Grid> std::map<std::string, std::string> VtkReader<Grid>::parseXml (std::string const& line, bool& closed) { diff --git a/dune/vtk/vtkwriter.impl.hh b/dune/vtk/vtkwriter.impl.hh index 1201136..145fec8 100644 --- a/dune/vtk/vtkwriter.impl.hh +++ b/dune/vtk/vtkwriter.impl.hh @@ -21,7 +21,7 @@ namespace Dune { template <class GridView> -void VtkWriter<GridView>::write(std::string const& fn, Vtk::FormatTypes format, Vtk::DataTypes datatype) +void VtkWriter<GridView>::write (std::string const& fn, Vtk::FormatTypes format, Vtk::DataTypes datatype) { format_ = format; datatype_ = datatype; @@ -53,7 +53,7 @@ void VtkWriter<GridView>::write(std::string const& fn, Vtk::FormatTypes format, template <class GridView> -void VtkWriter<GridView>::writeImpl(std::string const& filename) const +void VtkWriter<GridView>::writeImpl (std::string const& filename) const { std::ofstream out(filename, std::ios_base::ate | std::ios::binary); if (format_ == Vtk::ASCII) { @@ -134,9 +134,10 @@ void VtkWriter<GridView>::writeImpl(std::string const& filename) const // @{ implementation details +// TODO: allow to overload these function template <class T, class GridView> -std::vector<T> getPoints(GridView const& gridView) +std::vector<T> getPoints (GridView const& gridView) { const int dim = GridView::dimension; std::vector<T> data(gridView.size(dim) * 3); @@ -153,7 +154,7 @@ std::vector<T> getPoints(GridView const& gridView) } template <class T, class GridView, class GlobalFunction> -std::vector<T> getVertexData(GridView const& gridView, GlobalFunction const& fct) +std::vector<T> getVertexData (GridView const& gridView, GlobalFunction const& fct) { const int dim = GridView::dimension; std::vector<T> data(gridView.size(dim) * fct.ncomps()); @@ -174,7 +175,7 @@ std::vector<T> getVertexData(GridView const& gridView, GlobalFunction const& fct } template <class T, class GridView, class GlobalFunction> -std::vector<T> getCellData(GridView const& gridView, GlobalFunction const& fct) +std::vector<T> getCellData (GridView const& gridView, GlobalFunction const& fct) { const int dim = GridView::dimension; std::vector<T> data(gridView.size(0) * fct.ncomps()); @@ -195,8 +196,8 @@ std::vector<T> getCellData(GridView const& gridView, GlobalFunction const& fct) template <class GridView> -void VtkWriter<GridView>::writeData(std::ofstream& out, std::vector<pos_type>& offsets, - GlobalFunction const& fct, Vtk::PositionTypes type) const +void VtkWriter<GridView>::writeData (std::ofstream& out, std::vector<pos_type>& offsets, + GlobalFunction const& fct, Vtk::PositionTypes type) const { out << "<DataArray Name=\"" << fct.name() << "\" type=\"" << (datatype_ == Vtk::FLOAT32 ? "Float32" : "Float64") << "\"" << " NumberOfComponents=\"" << fct.ncomps() << "\" format=\"" << (format_ == Vtk::ASCII ? "ascii\">\n" : "appended\""); @@ -223,7 +224,7 @@ void VtkWriter<GridView>::writeData(std::ofstream& out, std::vector<pos_type>& o template <class GridView> -void VtkWriter<GridView>::writePoints(std::ofstream& out, std::vector<pos_type>& offsets) const +void VtkWriter<GridView>::writePoints (std::ofstream& out, std::vector<pos_type>& offsets) const { out << "<DataArray type=\"" << (datatype_ == Vtk::FLOAT32 ? "Float32" : "Float64") << "\"" << " NumberOfComponents=\"3\" format=\"" << (format_ == Vtk::ASCII ? "ascii\">\n" : "appended\""); @@ -244,7 +245,7 @@ void VtkWriter<GridView>::writePoints(std::ofstream& out, std::vector<pos_type>& template <class GridView> -void VtkWriter<GridView>::writeCells(std::ofstream& out, std::vector<pos_type>& offsets) const +void VtkWriter<GridView>::writeCells (std::ofstream& out, std::vector<pos_type>& offsets) const { auto const& indexSet = gridView_.indexSet(); if (format_ == Vtk::ASCII) { @@ -295,8 +296,8 @@ void VtkWriter<GridView>::writeCells(std::ofstream& out, std::vector<pos_type>& // @{ implementation details template <class T> -std::uint64_t write_values_to_buffer(std::size_t max_num_values, unsigned char* buffer, - std::vector<T> const& vec, std::size_t shift) +std::uint64_t writeValuesToBuffer (std::size_t max_num_values, unsigned char* buffer, + std::vector<T> const& vec, std::size_t shift) { std::size_t num_values = std::min(max_num_values, vec.size()-shift); std::uint64_t bs = num_values*sizeof(T); @@ -306,7 +307,7 @@ std::uint64_t write_values_to_buffer(std::size_t max_num_values, unsigned char* template <class OStream> -std::uint64_t write_compressed(unsigned char const* buffer, unsigned char* buffer_out, +std::uint64_t writeCompressed (unsigned char const* buffer, unsigned char* buffer_out, std::uint64_t bs, std::uint64_t cbs, int level, OStream& outb) { #ifdef HAVE_ZLIB @@ -325,7 +326,7 @@ std::uint64_t write_compressed(unsigned char const* buffer, unsigned char* buffe return compressed_space; #else - std::cerr << "Can not call write_compressed without compression enabled!\n"; + std::cerr << "Can not call writeCompressed without compression enabled!\n"; std::abort(); return 0; #endif @@ -335,7 +336,7 @@ std::uint64_t write_compressed(unsigned char const* buffer, unsigned char* buffe template <class GridView> template <class T> -std::uint64_t VtkWriter<GridView>::writeAppended(std::ofstream& out, std::vector<T> const& values) const +std::uint64_t VtkWriter<GridView>::writeAppended (std::ofstream& out, std::vector<T> const& values) const { assert(is_a(format_, Vtk::APPENDED) && "Function should by called only in appended mode!\n"); pos_type begin_pos = out.tellp(); @@ -365,11 +366,11 @@ std::uint64_t VtkWriter<GridView>::writeAppended(std::ofstream& out, std::vector std::vector<std::uint64_t> cbs(std::size_t(num_blocks), 0); // compressed block sizes for (std::size_t i = 0; i < std::size_t(num_blocks); ++i) { - std::uint64_t bs = write_values_to_buffer<T>(num_values, buffer.data(), values, i*num_values); + std::uint64_t bs = writeValuesToBuffer<T>(num_values, buffer.data(), values, i*num_values); if (format_ == Vtk::COMPRESSED) { buffer_out.resize(std::size_t(compressed_block_size)); - cbs[i] = write_compressed(buffer.data(), buffer_out.data(), bs, + cbs[i] = writeCompressed(buffer.data(), buffer_out.data(), bs, compressed_block_size, compression_level, out); } else out.write((char*)buffer.data(), bs); @@ -388,7 +389,7 @@ std::uint64_t VtkWriter<GridView>::writeAppended(std::ofstream& out, std::vector template <class GridView> template <class T> -std::uint64_t VtkWriter<GridView>::writeDataAppended(std::ofstream& out, GlobalFunction const& fct, Vtk::PositionTypes type) const +std::uint64_t VtkWriter<GridView>::writeDataAppended (std::ofstream& out, GlobalFunction const& fct, Vtk::PositionTypes type) const { assert(is_a(format_, Vtk::APPENDED) && "Function should by called only in appended mode!\n"); @@ -404,7 +405,7 @@ std::uint64_t VtkWriter<GridView>::writeDataAppended(std::ofstream& out, GlobalF template <class GridView> template <class T> -std::uint64_t VtkWriter<GridView>::writePointsAppended(std::ofstream& out) const +std::uint64_t VtkWriter<GridView>::writePointsAppended (std::ofstream& out) const { assert(is_a(format_, Vtk::APPENDED) && "Function should by called only in appended mode!\n"); @@ -414,7 +415,7 @@ std::uint64_t VtkWriter<GridView>::writePointsAppended(std::ofstream& out) const template <class GridView> -std::array<std::uint64_t,3> VtkWriter<GridView>::writeCellsAppended(std::ofstream& out) const +std::array<std::uint64_t,3> VtkWriter<GridView>::writeCellsAppended (std::ofstream& out) const { assert(is_a(format_, Vtk::APPENDED) && "Function should by called only in appended mode!\n"); diff --git a/src/vtkreader.cc b/src/vtkreader.cc index 8f8db80..546f6ab 100644 --- a/src/vtkreader.cc +++ b/src/vtkreader.cc @@ -67,13 +67,24 @@ int main(int argc, char** argv) vtkWriter.write("test_ascii_float64_3.vtu", Vtk::ASCII, Vtk::FLOAT64); } - { - using GridType2d = UGGrid<2>; - using GridView2d = typename GridType2d::LeafGridView; - auto gridPtr = VtkReader<GridType2d>::read("paraview_2d.vtu"); - auto& grid = *gridPtr; - - VtkWriter<GridView2d> vtkWriter(grid.leafGridView()); - vtkWriter.write("paraview_2d_ascii.vtu", Vtk::ASCII, Vtk::FLOAT64); - } + // { + // using GridType3d = UGGrid<3>; + // using GridView3d = typename GridType3d::LeafGridView; + // auto gridPtr = VtkReader<GridType3d>::read("paraview_3d.vtu"); + // auto& grid = *gridPtr; + + // VtkWriter<GridView3d> vtkWriter(grid.leafGridView()); + // vtkWriter.write("paraview_3d_ascii.vtu", Vtk::ASCII, Vtk::FLOAT64); + // } + + // { + // std::cout << "paraview_2d_ascii...\n"; + // using GridType2d = UGGrid<2>; + // using GridView2d = typename GridType2d::LeafGridView; + // auto gridPtr = VtkReader<GridType2d>::read("paraview_2d.vtu"); + // auto& grid = *gridPtr; + + // VtkWriter<GridView2d> vtkWriter(grid.leafGridView()); + // vtkWriter.write("paraview_2d_ascii.vtu", Vtk::ASCII, Vtk::FLOAT64); + // } } -- GitLab