12#ifndef DUMUX_VTK_GRID_DATA_HANDLE_HH
13#define DUMUX_VTK_GRID_DATA_HANDLE_HH
20#include <dune/common/parallel/communication.hh>
21#include <dune/geometry/dimension.hh>
22#include <dune/grid/common/partitionset.hh>
23#include <dune/grid/common/datahandleif.hh>
33template<
class Gr
id,
class Gr
idFactory,
class Data>
35:
public Dune::CommDataHandleIF<VtkGridDataHandle<Grid, GridFactory, Data>, typename Data::value_type>
40 : gridView_(grid.levelGridView(0))
41 , idSet_(grid.localIdSet())
42 , userCellData_(cellData)
43 , userPointData_(pointData)
47 for (
const auto& [key, data] : userCellData_)
48 cellData_[key] = std::move(userCellData_[key]);
49 for (
const auto& [key, data] : userPointData_)
50 pointData_[key] = std::move(userPointData_[key]);
54 std::array<std::size_t, 2> numKeys{{ cellData_.size(), pointData_.size() }};
55 Dune::MPIHelper::getCommunication().broadcast(numKeys.data(), 2, 0);
59 std::vector<std::size_t> keyLengthAndComponents(2*(numKeys[0] + numKeys[1]), 0);
64 for (
const auto& [key, data] : cellData_)
65 keyLengthAndComponents[n++] = key.size();
66 for (
const auto& [key, data] : pointData_)
67 keyLengthAndComponents[n++] = key.size();
70 for (
const auto& [key, data] : cellData_)
71 keyLengthAndComponents[n++] = gridView_.size(0) > 0 ? data.size()/gridView_.size(0) : 0;
72 for (
const auto& [key, data] : pointData_)
73 keyLengthAndComponents[n++] = gridView_.size(Grid::dimension) > 0 ? data.size()/gridView_.size(Grid::dimension) : 0;
76 assert((Dune::MPIHelper::instance().rank() == 0) == (n == keyLengthAndComponents.size()));
78 Dune::MPIHelper::getCommunication().broadcast(keyLengthAndComponents.data(), keyLengthAndComponents.size(), 0);
82 const auto begin = keyLengthAndComponents.begin() + numKeys[0] + numKeys[1];
83 cellDataComponents_.assign(begin, begin + numKeys[0]);
84 pointDataComponents_.assign(begin + numKeys[0], keyLengthAndComponents.end());
85 numCellDataPerElement_ = std::accumulate(cellDataComponents_.begin(), cellDataComponents_.end(), 0UL);
86 numPointDataPerVertex_ = std::accumulate(pointDataComponents_.begin(), pointDataComponents_.end(), 0UL);
89 std::string keys; keys.resize(std::accumulate(keyLengthAndComponents.begin(), begin, 0UL));
92 for (
const auto& [key, data] : cellData_)
93 for (
const auto& c : key)
95 for (
const auto& [key, data] : pointData_)
96 for (
const auto& c : key)
100 assert((Dune::MPIHelper::instance().rank() == 0) == (n == keys.size()));
102 Dune::MPIHelper::getCommunication().broadcast(keys.data(), keys.size(), 0);
106 std::size_t offset = 0;
107 for (
int keyIdx = 0; keyIdx < numKeys[0]; ++keyIdx)
109 if (std::string key{ keys, offset, keyLengthAndComponents[keyIdx] }; cellData_.count(key) == 0)
110 cellData_[key] = Data{};
112 offset += keyLengthAndComponents[keyIdx];
114 for (
int keyIdx = numKeys[0]; keyIdx < numKeys[0] + numKeys[1]; ++keyIdx)
116 if (std::string key{ keys, offset, keyLengthAndComponents[keyIdx] }; pointData_.count(key) == 0)
117 pointData_[key] = Data{};
119 offset += keyLengthAndComponents[keyIdx];
123 for (
const auto& element : elements(gridView_, Dune::Partitions::interior))
125 data_[idSet_.id(element)].resize(numCellDataPerElement_);
128 for (
const auto& [key, data] : cellData_)
130 const auto nComp = cellDataComponents_[l++];
131 for (
int k = 0; k < nComp; ++k)
132 std::swap(cellData_[key][k + nComp*gridFactory.insertionIndex(element)], data_[idSet_.id(element)][n++]);
135 assert(n == numCellDataPerElement_);
138 for (
const auto& vertex : vertices(gridView_))
140 data_[idSet_.id(vertex)].resize(numPointDataPerVertex_);
143 for (
const auto& [key, data] : pointData_)
145 const auto nComp = pointDataComponents_[l++];
146 for (
int k = 0; k < nComp; ++k)
147 std::swap(pointData_[key][k + nComp*gridFactory.insertionIndex(vertex)], data_[idSet_.id(vertex)][n++]);
150 assert(n == numPointDataPerVertex_);
157 const auto& indexSet = gridView_.indexSet();
161 for (
const auto& [key, data] : cellData_)
162 cellData_[key].resize(indexSet.size(0)*cellDataComponents_[n++]);
166 for (
const auto& [key, data] : pointData_)
167 pointData_[key].resize(indexSet.size(GridView::dimension)*pointDataComponents_[n++]);
170 for (
const auto& element : elements(gridView_))
173 for (
const auto& [key, data] : cellData_)
175 const auto nComp = cellDataComponents_[l++];
176 for (
int k = 0; k < nComp; ++k)
177 std::swap(cellData_[key][k + nComp*indexSet.index(element)], data_[idSet_.id(element)][n++]);
181 for (
const auto& vertex : vertices(gridView_))
184 for (
const auto& [key, data] : pointData_)
186 const auto nComp = pointDataComponents_[l++];
187 for (
int k = 0; k < nComp; ++k)
188 std::swap(pointData_[key][k + nComp*indexSet.index(vertex)], data_[idSet_.id(vertex)][n++]);
193 for (
const auto& [key, data] : cellData_)
194 userCellData_[key] = std::move(cellData_[key]);
195 for (
const auto& [key, data] : pointData_)
196 userPointData_[key] = std::move(pointData_[key]);
199 Dune::CommDataHandleIF<VtkGridDataHandle<Grid, GridFactory, Data>,
typename Data::value_type>&
interface()
203 {
return codim == 0 || codim == dim; }
209 template<
class Entity>
210 std::size_t
size (
const Entity&)
const
212 if constexpr (Entity::codimension == 0)
213 return numCellDataPerElement_;
214 else if constexpr (Entity::codimension == GridView::dimension)
215 return numPointDataPerVertex_;
220 template<
class MessageBufferImp,
class Entity>
221 void gather (MessageBufferImp& buff,
const Entity& e)
const
223 if constexpr (Entity::codimension == 0)
225 const auto& data = data_[idSet_.id(e)];
226 for (
int n = 0; n < numCellDataPerElement_; ++n)
230 if constexpr (Entity::codimension == GridView::dimension)
232 const auto& data = data_[idSet_.id(e)];
233 for (
int n = 0; n < numPointDataPerVertex_; ++n)
238 template<
class MessageBufferImp,
class Entity>
239 void scatter (MessageBufferImp& buff,
const Entity& e, std::size_t n)
241 auto& data = data_[idSet_.id(e)];
244 if constexpr (Entity::codimension == 0)
245 for (
int k = 0; k < numCellDataPerElement_; ++k)
248 if constexpr (Entity::codimension == GridView::dimension)
249 for (
int k = 0; k < numPointDataPerVertex_; ++k)
254 using IdSet =
typename Grid::LocalIdSet;
262 std::map<std::string, VTKReader::Data::mapped_type> cellData_;
263 std::map<std::string, VTKReader::Data::mapped_type> pointData_;
265 std::vector<std::size_t> cellDataComponents_;
266 std::vector<std::size_t> pointDataComponents_;
268 std::size_t numCellDataPerElement_;
269 std::size_t numPointDataPerVertex_;
271 mutable std::map< typename IdSet::IdType, std::vector<typename Data::value_type> > data_;
std::unordered_map< std::string, std::vector< double > > Data
the cell / point data type for point data read from a grid file
Definition: vtkreader.hh:277
A data handle for communicating grid data for VTK grids.
Definition: vtkgriddatahandle.hh:36
void scatter(MessageBufferImp &buff, const Entity &e, std::size_t n)
Definition: vtkgriddatahandle.hh:239
void gather(MessageBufferImp &buff, const Entity &e) const
Definition: vtkgriddatahandle.hh:221
bool contains(int dim, int codim) const
Definition: vtkgriddatahandle.hh:202
bool fixedSize(int dim, int codim) const
returns true if size per entity of given dim and codim is a constant
Definition: vtkgriddatahandle.hh:206
~VtkGridDataHandle()
Definition: vtkgriddatahandle.hh:154
Dune::CommDataHandleIF< VtkGridDataHandle< Grid, GridFactory, Data >, typename Data::value_type > & interface()
Definition: vtkgriddatahandle.hh:199
std::size_t size(const Entity &) const
Definition: vtkgriddatahandle.hh:210
VtkGridDataHandle(const Grid &grid, const GridFactory &gridFactory, VTKReader::Data &cellData, VTKReader::Data &pointData)
Definition: vtkgriddatahandle.hh:39
typename Grid::LevelGridView GridView
Definition: vtkgriddatahandle.hh:37
A vtk file reader using tinyxml2 as xml backend.