4 #ifndef DUNE_SUBSAMPLINGVTKWRITER_HH
5 #define DUNE_SUBSAMPLINGVTKWRITER_HH
9 #include <dune/common/indent.hh>
10 #include <dune/geometry/type.hh>
11 #include <dune/geometry/virtualrefinement.hh>
34 template<
class Gr
idView >
41 typedef typename GridView::Grid::ctype ctype;
42 typedef typename GridView::template Codim< 0 >::Entity Entity;
43 typedef VirtualRefinement<dim, ctype> Refinement;
44 typedef typename Refinement::IndexVector IndexVector;
45 typedef typename Refinement::ElementIterator SubElementIterator;
46 typedef typename Refinement::VertexIterator SubVertexIterator;
75 int level_,
bool coerceToSimplex_ =
false)
77 , level(level_), coerceToSimplex(coerceToSimplex_)
80 DUNE_THROW(Dune::IOError,
"SubsamplingVTKWriter: Negative Subsampling " << level_ <<
" must not be used!");
86 if(geometryType.isCube() && !coerceToSimplex) { }
87 else geometryType.makeSimplex(dim);
92 template<
typename SubIterator>
93 struct IteratorSelector
96 SubElementIterator refinementBegin(
const Refinement& refinement,
int level, IteratorSelector<SubElementIterator>)
98 return refinement.eBegin(level);
101 SubVertexIterator refinementBegin(
const Refinement& refinement,
int level, IteratorSelector<SubVertexIterator>)
103 return refinement.vBegin(level);
106 SubElementIterator refinementEnd(
const Refinement& refinement,
int level, IteratorSelector<SubElementIterator>)
108 return refinement.eEnd(level);
111 SubVertexIterator refinementEnd(
const Refinement& refinement,
int level, IteratorSelector<SubVertexIterator>)
113 return refinement.vEnd(level);
116 template<
typename Data,
typename Iterator,
typename SubIterator>
117 void writeData(VTK::VTUWriter& writer,
const Data& data,
const Iterator begin,
const Iterator end,
int nentries, IteratorSelector<SubIterator> sis)
119 for (
auto it = data.begin(),
125 VTK::FieldInfo fieldInfo = f.fieldInfo();
126 std::size_t writecomps = fieldInfo.size();
127 switch (fieldInfo.type())
135 DUNE_THROW(IOError,
"Cannot write VTK vectors with more than 3 components (components was " << writecomps <<
")");
139 DUNE_THROW(NotImplemented,
"VTK output for tensors not implemented yet");
141 shared_ptr<VTK::DataArrayWriter<float> > p
142 (writer.makeArrayWriter<
float>(f.name(), writecomps, nentries));
143 if(!p->writeIsNoop())
144 for (Iterator eit = begin; eit!=end; ++eit)
146 const Entity & e = *eit;
148 Refinement &refinement =
149 buildRefinement<dim, ctype>(eit->type(),
150 subsampledGeometryType(eit->type()));
151 for(SubIterator sit = refinementBegin(refinement,level,sis),
152 send = refinementEnd(refinement,level,sis);
156 f.write(sit.coords(),*p);
158 for(
unsigned j = f.fieldInfo().size(); j < writecomps; j++)
192 void addVertexData (
const V& v,
const std::string &name,
int ncomps=1);
194 void addCellData (
const V& v,
const std::string &name,
int ncomps=1);
197 bool coerceToSimplex;
201 template <
class Gr
idView>
207 for (
CellIterator it=this->cellBegin(); it!=cellEnd(); ++it)
209 Refinement &refinement = buildRefinement<dim, ctype>(it->type(), subsampledGeometryType(it->type()));
211 ncells += refinement.nElements(level);
212 nvertices += refinement.nVertices(level);
213 ncorners += refinement.nElements(level) * refinement.eBegin(level).vertexIndices().size();
219 template <
class Gr
idView>
222 if(celldata.size() == 0)
228 std::string defaultScalarField, defaultVectorField;
229 std::tie(defaultScalarField, defaultVectorField) = this->getDataNames(celldata);
231 writer.
beginCellData(defaultScalarField, defaultVectorField);
232 writeData(writer,celldata,cellBegin(),cellEnd(),ncells,IteratorSelector<SubElementIterator>());
237 template <
class Gr
idView>
240 if(vertexdata.size() == 0)
246 std::string defaultScalarField, defaultVectorField;
247 std::tie(defaultScalarField, defaultVectorField) = this->getDataNames(vertexdata);
250 writeData(writer,vertexdata,cellBegin(),cellEnd(),nvertices,IteratorSelector<SubVertexIterator>());
255 template <
class Gr
idView>
260 shared_ptr<VTK::DataArrayWriter<float> > p
262 if(!p->writeIsNoop())
265 Refinement &refinement =
266 buildRefinement<dim, ctype>(i->type(),
267 subsampledGeometryType(i->type()));
268 for(SubVertexIterator sit = refinement.vBegin(level),
269 send = refinement.vEnd(level);
272 FieldVector<ctype, dimw> coords = i->geometry().global(sit.coords());
273 for (
int j=0; j<
std::min(
int(dimw),3); j++)
275 for (
int j=std::min(
int(dimw),3); j<3; j++)
286 template <
class Gr
idView>
293 shared_ptr<VTK::DataArrayWriter<int> > p1
296 if(!p1->writeIsNoop()) {
300 GeometryType coercedToType = subsampledGeometryType(i->type());
301 Refinement &refinement =
302 buildRefinement<dim, ctype>(i->type(), coercedToType);
303 for(SubElementIterator sit = refinement.eBegin(level),
304 send = refinement.eEnd(level);
307 IndexVector indices = sit.vertexIndices();
308 for(
unsigned int ii = 0; ii < indices.size(); ++ii)
311 offset += refinement.nVertices(level);
318 shared_ptr<VTK::DataArrayWriter<int> > p2
320 if(!p2->writeIsNoop()) {
325 Refinement &refinement =
326 buildRefinement<dim, ctype>(i->type(),
327 subsampledGeometryType(i->type()));
328 unsigned int verticesPerCell =
329 refinement.eBegin(level).vertexIndices().size();
330 for(
int element = 0; element < refinement.nElements(level);
333 offset += verticesPerCell;
343 shared_ptr<VTK::DataArrayWriter<unsigned char> > p3
345 if(!p3->writeIsNoop())
348 GeometryType coerceTo = subsampledGeometryType(it->type());
349 Refinement &refinement =
350 buildRefinement<dim, ctype>(it->type(), coerceTo);
352 for(
int i = 0; i < refinement.nElements(level); ++i)
361 #endif // DUNE_SUBSAMPLINGVTKWRITER_HH
Provides file i/o for the visualization toolkit.
void endCellData()
finish CellData section
Definition: vtuwriter.hh:218
void beginCellData(const std::string &scalars="", const std::string &vectors="")
start CellData section
Definition: vtuwriter.hh:203
The dimension of the grid.
Definition: common/gridview.hh:130
Definition: alugrid/common/declaration.hh:20
void beginCells()
start section for the grid cells/PolyData lines
Definition: vtuwriter.hh:272
virtual void writeVertexData(VTK::VTUWriter &writer)
write vertex data
Definition: subsamplingvtkwriter.hh:238
GeometryType geometryType(const Dune::GeometryType &t)
mapping from GeometryType to VTKGeometryType
Definition: common.hh:195
int renumber(const Dune::GeometryType &t, int i)
renumber VTK <-> Dune
Definition: common.hh:224
virtual void countEntities(int &nvertices, int &ncells, int &ncorners)
count the vertices, cells and corners
Definition: subsamplingvtkwriter.hh:202
std::list< VTKLocalFunction > celldata
Definition: vtkwriter.hh:1302
CellIterator cellEnd() const
Definition: vtkwriter.hh:345
int ncorners
Definition: vtkwriter.hh:1311
DataArrayWriter< T > * makeArrayWriter(const std::string &name, unsigned ncomps, unsigned nitems)
aquire a DataArrayWriter
Definition: vtuwriter.hh:379
VertexIterator vertexBegin() const
Definition: vtkwriter.hh:451
GeometryType
Type representing VTK's entity geometry types.
Definition: common.hh:178
void endPointData()
finish PointData section
Definition: vtuwriter.hh:180
Dump a .vtu/.vtp files contents to a stream.
Definition: vtuwriter.hh:96
virtual void writeGridCells(VTK::VTUWriter &writer)
write the connectivity array
Definition: subsamplingvtkwriter.hh:287
VertexIterator vertexEnd() const
Definition: vtkwriter.hh:458
Iterator over the grids elements.
Definition: vtkwriter.hh:327
SubsamplingVTKWriter(const GridView &gridView, int level_, bool coerceToSimplex_=false)
Construct a SubsamplingVTKWriter working on a specific GridView.
Definition: subsamplingvtkwriter.hh:74
vector-valued field (always 3D, will be padded if necessary)
virtual void writeGridPoints(VTK::VTUWriter &writer)
write the positions of vertices
Definition: subsamplingvtkwriter.hh:256
tensor field (always 3x3)
std::list< VTKLocalFunction >::const_iterator FunctionIterator
Definition: vtkwriter.hh:319
virtual void writeCellData(VTK::VTUWriter &writer)
write cell data
Definition: subsamplingvtkwriter.hh:220
int ncells
Definition: vtkwriter.hh:1309
void beginPoints()
start section for the point coordinates
Definition: vtuwriter.hh:236
The dimension of the world the grid lives in.
Definition: common/gridview.hh:134
void addVertexData(VTKFunction *p)
Add a grid function that lives on the vertices of the grid to the visualization.
Definition: vtkwriter.hh:643
int nvertices
Definition: vtkwriter.hh:1310
Writer for the ouput of grid functions in the vtk format.Writes arbitrary grid functions (living on c...
Definition: vtkwriter.hh:87
std::list< VTKLocalFunction > vertexdata
Definition: vtkwriter.hh:1303
CellIterator cellBegin() const
Definition: vtkwriter.hh:340
void beginPointData(const std::string &scalars="", const std::string &vectors="")
start PointData section
Definition: vtuwriter.hh:165
Grid view abstract base class.
Definition: common/gridview.hh:58
int min(const DofVectorPointer< int > &dofVector)
Definition: dofvector.hh:346
void addCellData(const VTKFunctionPtr &p)
Add a grid function that lives on the cells of the grid to the visualization.
Definition: vtkwriter.hh:588
void endPoints()
finish section for the point coordinates
Definition: vtuwriter.hh:247
VTK::OutputType outputtype
Definition: vtkwriter.hh:1319
void endCells()
start section for the grid cells/PolyData lines
Definition: vtuwriter.hh:283
Writer for the output of subsampled grid functions in the vtk format.Writes arbitrary grid functions ...
Definition: subsamplingvtkwriter.hh:35