4 #ifndef DUNE_SUBSAMPLINGVTKWRITER_HH
5 #define DUNE_SUBSAMPLINGVTKWRITER_HH
9 #include <dune/geometry/type.hh>
10 #include <dune/common/indent.hh>
34 template<
class Gr
idView >
41 typedef typename GridView::Grid::ctype ctype;
74 unsigned int level_,
bool coerceToSimplex_ =
false)
76 , level(level_), coerceToSimplex(coerceToSimplex_)
81 if(geometryType.isCube() && !coerceToSimplex) { }
82 else geometryType.makeSimplex(dim);
111 void addVertexData (
const V& v,
const std::string &name,
int ncomps=1);
114 bool coerceToSimplex;
118 template <
class Gr
idView>
124 for (
CellIterator it=this->cellBegin(); it!=cellEnd(); ++it)
126 Refinement &refinement = buildRefinement<dim, ctype>(it->type(), subsampledGeometryType(it->type()));
129 nvertices += refinement.
nVertices(level);
130 ncorners += refinement.
nElements(level) * refinement.
eBegin(level).vertexIndices().size();
135 template <
class Gr
idView>
138 if(celldata.size() == 0)
141 std::string scalars =
"";
142 for (FunctionIterator it=celldata.begin(); it!=celldata.end(); ++it)
143 if ((*it)->ncomps()==1)
145 scalars = (*it)->name();
148 std::string vectors =
"";
149 for (FunctionIterator it=celldata.begin(); it!=celldata.end(); ++it)
150 if ((*it)->ncomps()>1)
152 vectors = (*it)->name();
157 for (FunctionIterator it=celldata.begin(); it!=celldata.end(); ++it)
161 unsigned writecomps = (*it)->ncomps();
162 if(writecomps == 2) writecomps = 3;
164 shared_ptr<VTK::DataArrayWriter<float> > p
166 if(!p->writeIsNoop())
170 buildRefinement<dim, ctype>(i->type(),
171 subsampledGeometryType(i->type()));
172 for(SubElementIterator sit = refinement.
eBegin(level),
173 send = refinement.
eEnd(level);
176 for (
int j=0; j<(*it)->ncomps(); j++)
177 p->write((*it)->evaluate(j,*i,sit.coords()));
179 for(
unsigned j = (*it)->ncomps(); j < writecomps; j++)
188 template <
class Gr
idView>
191 if(vertexdata.size() == 0)
194 std::string scalars =
"";
195 for (FunctionIterator it=vertexdata.begin(); it!=vertexdata.end(); ++it)
196 if ((*it)->ncomps()==1)
198 scalars = (*it)->name();
201 std::string vectors =
"";
202 for (FunctionIterator it=vertexdata.begin(); it!=vertexdata.end(); ++it)
203 if ((*it)->ncomps()>1)
205 vectors = (*it)->name();
210 for (FunctionIterator it=vertexdata.begin(); it!=vertexdata.end(); ++it)
214 unsigned writecomps = (*it)->ncomps();
215 if(writecomps == 2) writecomps = 3;
217 shared_ptr<VTK::DataArrayWriter<float> > p
219 if(!p->writeIsNoop())
223 buildRefinement<dim, ctype>(i->type(),
224 subsampledGeometryType(i->type()));
225 for(SubVertexIterator sit = refinement.
vBegin(level),
226 send = refinement.
vEnd(level);
229 for (
int j=0; j<(*it)->ncomps(); j++)
230 p->write((*it)->evaluate(j,*i,sit.coords()));
233 for(
unsigned j = (*it)->ncomps(); j < writecomps; j++)
242 template <
class Gr
idView>
247 shared_ptr<VTK::DataArrayWriter<float> > p
249 if(!p->writeIsNoop())
253 buildRefinement<dim, ctype>(i->type(),
254 subsampledGeometryType(i->type()));
255 for(SubVertexIterator sit = refinement.
vBegin(level),
256 send = refinement.
vEnd(level);
259 FieldVector<ctype, dimw> coords = i->geometry().global(sit.coords());
260 for (
int j=0; j<
std::min(
int(dimw),3); j++)
262 for (
int j=std::min(
int(dimw),3); j<3; j++)
273 template <
class Gr
idView>
280 shared_ptr<VTK::DataArrayWriter<int> > p1
283 if(!p1->writeIsNoop()) {
287 GeometryType coercedToType = subsampledGeometryType(i->type());
289 buildRefinement<dim, ctype>(i->type(), coercedToType);
290 for(SubElementIterator sit = refinement.eBegin(level),
291 send = refinement.eEnd(level);
294 IndexVector indices = sit.vertexIndices();
295 for(
unsigned int ii = 0; ii < indices.size(); ++ii)
305 shared_ptr<VTK::DataArrayWriter<int> > p2
307 if(!p2->writeIsNoop()) {
313 buildRefinement<dim, ctype>(i->type(),
314 subsampledGeometryType(i->type()));
315 unsigned int verticesPerCell =
316 refinement.
eBegin(level).vertexIndices().size();
317 for(
int element = 0; element < refinement.
nElements(level);
320 offset += verticesPerCell;
330 shared_ptr<VTK::DataArrayWriter<unsigned char> > p3
332 if(!p3->writeIsNoop())
335 GeometryType coerceTo = subsampledGeometryType(it->type());
337 buildRefinement<dim, ctype>(it->type(), coerceTo);
339 for(
int i = 0; i < refinement.nElements(level); ++i)
348 #endif // DUNE_SUBSAMPLINGVTKWRITER_HH