DUNE PDELab (2.7)

vtkwriter.hh
Go to the documentation of this file.
1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2// vi: set et ts=4 sw=2 sts=2:
3
4#ifndef DUNE_VTKWRITER_HH
5#define DUNE_VTKWRITER_HH
6
7#include <cstring>
8#include <iostream>
9#include <string>
10#include <fstream>
11#include <sstream>
12#include <iomanip>
13#include <memory>
14
15#include <vector>
16#include <list>
17#include <map>
18
21#include <dune/common/indent.hh>
23#include <dune/common/path.hh>
24#include <dune/geometry/referenceelements.hh>
26#include <dune/grid/common/gridenums.hh>
30#include <dune/grid/io/file/vtk/pvtuwriter.hh>
31#include <dune/grid/io/file/vtk/streams.hh>
32#include <dune/grid/io/file/vtk/vtuwriter.hh>
33
47namespace Dune
48{
49
50 namespace Impl
51 {
52 // Check whether type F has a method 'bind' (see the dune-functions interface)
53 template< class F, class E, class = void >
54 struct IsBindable
55 : std::false_type
56 {};
57
58 template< class F, class E >
59 struct IsBindable< F, E, void_t< decltype( std::declval< F & >().bind( std::declval< const E & >() ) ), decltype( std::declval< F & >().unbind() ) > >
60 : std::true_type
61 {};
62
63 // Check whether localFunction(F) can be called (see the dune-functions interface)
64 template< class F, class = void >
65 struct HasLocalFunction
66 : std::false_type
67 {};
68
69 template< class F >
70 struct HasLocalFunction< F, void_t< decltype( localFunction( std::declval< F& >() ) ) > >
71 : std::true_type
72 {};
73
74 } // namespace Impl
75
76 // Forward-declaration here, so the class can be friend of VTKWriter
77 template <class GridView>
78 class VTKSequenceWriterBase;
79 template <class GridView>
80 class VTKSequenceWriter;
81
90 template< class GridView >
91 class VTKWriter {
92
93 // VTKSequenceWriterBase needs getSerialPieceName
94 // and getParallelHeaderName
95 friend class VTKSequenceWriterBase<GridView>;
96 // VTKSequenceWriter needs the grid view, to get the MPI size and rank
97 friend class VTKSequenceWriter<GridView>;
98
99 // extract types
100 typedef typename GridView::Grid Grid;
101 typedef typename GridView::ctype DT;
102 enum { n = GridView::dimension };
103 enum { w = GridView::dimensionworld };
104
105 typedef typename GridView::template Codim< 0 >::Entity Cell;
106 typedef typename GridView::template Codim< n >::Entity Vertex;
107 typedef Cell Entity;
108
109 typedef typename GridView::IndexSet IndexSet;
110
111 static const PartitionIteratorType VTK_Partition = InteriorBorder_Partition;
112 //static const PartitionIteratorType VTK_Partition = All_Partition;
113
114 typedef typename GridView::template Codim< 0 >
115 ::template Partition< VTK_Partition >::Iterator
116 GridCellIterator;
117 typedef typename GridView::template Codim< n >
118 ::template Partition< VTK_Partition >::Iterator
119 GridVertexIterator;
120
121 typedef typename GridCellIterator::Reference EntityReference;
122
123 typedef typename GridView::template Codim< 0 >
124 ::Entity::Geometry::LocalCoordinate Coordinate;
125
127
128 // return true if entity should be skipped in Vertex and Corner iterator
129 static bool skipEntity( const PartitionType entityType )
130 {
131 switch( VTK_Partition )
132 {
133 // for All_Partition no entity has to be skipped
134 case All_Partition: return false;
135 case InteriorBorder_Partition: return ( entityType != InteriorEntity );
136 default: DUNE_THROW(NotImplemented,"Add check for this partition type");
137 }
138 return false ;
139 }
140
141 public:
142
144
145 protected:
146
148
152 {
153
154 public:
155
157
160 {
161
163 virtual void bind(const Entity& e) = 0;
164
166 virtual void unbind() = 0;
167
169
172 virtual void write(const Coordinate& pos, Writer& w, std::size_t count) const = 0;
173
174 virtual ~FunctionWrapperBase()
175 {}
176
177 };
178
180 template<typename F>
182 : public FunctionWrapperBase
183 {
184 using Function = typename std::decay<F>::type;
185
186 template<typename F_>
187 FunctionWrapper(F_&& f)
188 : _f(std::forward<F_>(f))
189 {}
190
191 virtual void bind(const Entity& e)
192 {
193 _f.bind(e);
194 }
195
196 virtual void unbind()
197 {
198 _f.unbind();
199 }
200
201 virtual void write(const Coordinate& pos, Writer& w, std::size_t count) const
202 {
203 auto r = _f(pos);
204 // we need to do different things here depending on whether r supports indexing into it or not.
205 do_write(w,r,count,IsIndexable<decltype(r)>());
206 }
207
208 private:
209
210 template<typename R>
211 void do_write(Writer& w, const R& r, std::size_t count, std::true_type) const
212 {
213 for (std::size_t i = 0; i < count; ++i)
214 w.write(r[i]);
215 }
216
217 template<typename R>
218 void do_write(Writer& w, const R& r, std::size_t count, std::false_type) const
219 {
220 assert(count == 1);
221 w.write(r);
222 }
223
224 Function _f;
225 };
226
228 template<typename F>
230 : public FunctionWrapperBase
231 {
232 using Function = typename std::decay<F>::type;
233
234 template<typename F_>
236 : _f(std::forward<F_>(f))
237 , element_(nullptr)
238 {}
239
240 virtual void bind(const Entity& e)
241 {
242 element_ = &e;
243 }
244
245 virtual void unbind()
246 {
247 element_ = nullptr;
248 }
249
250 virtual void write(const Coordinate& pos, Writer& w, std::size_t count) const
251 {
252 auto globalPos = element_->geometry().global(pos);
253 auto r = _f(globalPos);
254 Hybrid::ifElse(IsIndexable<decltype(r)>(),
255 [&](auto id) {
256 for (std::size_t i = 0; i < count; ++i)
257 w.write(id(r)[i]);
258 },
259 [&](auto id) {
260 assert(count == 1);
261 w.write(id(r));
262 });
263 }
264 private:
265 Function _f;
266 const Entity* element_;
267 };
268
271 : public FunctionWrapperBase
272 {
273 VTKFunctionWrapper(const std::shared_ptr< const VTKFunction >& f)
274 : _f(f)
275 , _entity(nullptr)
276 {}
277
278 virtual void bind(const Entity& e)
279 {
280 _entity = &e;
281 }
282
283 virtual void unbind()
284 {
285 _entity = nullptr;
286 }
287
288 virtual void write(const Coordinate& pos, Writer& w, std::size_t count) const
289 {
290 for (std::size_t i = 0; i < count; ++i)
291 w.write(_f->evaluate(i,*_entity,pos));
292 }
293
294 private:
295
296 std::shared_ptr< const VTKFunction > _f;
297 const Entity* _entity;
298
299 };
300
302 template<typename F, std::enable_if_t<Impl::IsBindable<F, Entity>::value, int> = 0>
304 : _f(std::make_unique<FunctionWrapper<F> >(std::forward<F>(f)))
305 , _fieldInfo(fieldInfo)
306 {}
307
309 // That is, a function that you can create a LocalFunction for, and evaluate that in element coordinates
310 template<typename F, std::enable_if_t<not Impl::IsBindable<F, Entity>::value && Impl::HasLocalFunction<F>::value, int> = 0>
312 : _f(std::make_unique< FunctionWrapper<
313 typename std::decay<decltype(localFunction(std::forward<F>(f)))>::type
314 > >(localFunction(std::forward<F>(f))))
315 , _fieldInfo(fieldInfo)
316 {}
317
319 // That is, a function that can be evaluated in global coordinates of the domain
320 template<typename F, std::enable_if_t<not Impl::IsBindable<F, Entity>::value && not Impl::HasLocalFunction<F>::value, int> = 0>
322 : _f(std::make_unique< GlobalFunctionWrapper<F> >(std::forward<F>(f)))
323 , _fieldInfo(fieldInfo)
324 {}
325
327 explicit VTKLocalFunction (const std::shared_ptr< const VTKFunction >& vtkFunctionPtr)
328 : _f(std::make_unique<VTKFunctionWrapper>(vtkFunctionPtr))
329 , _fieldInfo(
330 vtkFunctionPtr->name(),
331 vtkFunctionPtr->ncomps() > 1 ? VTK::FieldInfo::Type::vector : VTK::FieldInfo::Type::scalar,
332 vtkFunctionPtr->ncomps(),
333 vtkFunctionPtr->precision()
334 )
335 {}
336
338 std::string name() const
339 {
340 return fieldInfo().name();
341 }
342
345 {
346 return _fieldInfo;
347 }
348
350 void bind(const Entity& e) const
351 {
352 _f->bind(e);
353 }
354
356 void unbind() const
357 {
358 _f->unbind();
359 }
360
362 void write(const Coordinate& pos, Writer& w) const
363 {
364 _f->write(pos,w,fieldInfo().size());
365 }
366
367 std::shared_ptr<FunctionWrapperBase> _f;
368 VTK::FieldInfo _fieldInfo;
369
370 };
371
372 typedef typename std::list<VTKLocalFunction>::const_iterator FunctionIterator;
373
375
380 class CellIterator : public GridCellIterator
381 {
382 public:
384 CellIterator(const GridCellIterator & x) : GridCellIterator(x) {}
388 {
389 return ReferenceElements<DT,n>::general((*this)->type()).position(0,0);
390 }
391 };
392
393 CellIterator cellBegin() const
394 {
395 return gridView_.template begin< 0, VTK_Partition >();
396 }
397
398 CellIterator cellEnd() const
399 {
400 return gridView_.template end< 0, VTK_Partition >();
401 }
402
404
419 public ForwardIteratorFacade<VertexIterator, const Entity, EntityReference, int>
420 {
421 GridCellIterator git;
422 GridCellIterator gend;
423 VTK::DataMode datamode;
424 // Index of the currently visited corner within the current element.
425 // NOTE: this is in Dune-numbering, in contrast to CornerIterator.
426 int cornerIndexDune;
427 const VertexMapper & vertexmapper;
428 std::vector<bool> visited;
429 // in conforming mode, for each vertex id (as obtained by vertexmapper)
430 // hold its number in the iteration order (VertexIterator)
431 int offset;
432
433 // hide operator ->
434 void operator->();
435 protected:
436 void basicIncrement ()
437 {
438 if( git == gend )
439 return;
440 ++cornerIndexDune;
441 const int numCorners = git->subEntities(n);
442 if( cornerIndexDune == numCorners )
443 {
444 offset += numCorners;
445 cornerIndexDune = 0;
446
447 ++git;
448 while( (git != gend) && skipEntity( git->partitionType() ) )
449 ++git;
450 }
451 }
452 public:
453 VertexIterator(const GridCellIterator & x,
454 const GridCellIterator & end,
455 const VTK::DataMode & dm,
456 const VertexMapper & vm) :
457 git(x), gend(end), datamode(dm), cornerIndexDune(0),
458 vertexmapper(vm), visited(vm.size(), false),
459 offset(0)
460 {
461 if (datamode == VTK::conforming && git != gend)
462 visited[vertexmapper.subIndex(*git,cornerIndexDune,n)] = true;
463 }
464 void increment ()
465 {
466 switch (datamode)
467 {
468 case VTK::conforming :
469 while(visited[vertexmapper.subIndex(*git,cornerIndexDune,n)])
470 {
471 basicIncrement();
472 if (git == gend) return;
473 }
474 visited[vertexmapper.subIndex(*git,cornerIndexDune,n)] = true;
475 break;
476 case VTK::nonconforming :
477 basicIncrement();
478 break;
479 }
480 }
481 bool equals (const VertexIterator & cit) const
482 {
483 return git == cit.git
484 && cornerIndexDune == cit.cornerIndexDune
485 && datamode == cit.datamode;
486 }
487 EntityReference dereference() const
488 {
489 return *git;
490 }
492 int localindex () const
493 {
494 return cornerIndexDune;
495 }
498 {
499 return referenceElement<DT,n>(git->type())
500 .position(cornerIndexDune,n);
501 }
502 };
503
504 VertexIterator vertexBegin () const
505 {
506 return VertexIterator( gridView_.template begin< 0, VTK_Partition >(),
507 gridView_.template end< 0, VTK_Partition >(),
508 datamode, *vertexmapper );
509 }
510
511 VertexIterator vertexEnd () const
512 {
513 return VertexIterator( gridView_.template end< 0, VTK_Partition >(),
514 gridView_.template end< 0, VTK_Partition >(),
515 datamode, *vertexmapper );
516 }
517
519
534 public ForwardIteratorFacade<CornerIterator, const Entity, EntityReference, int>
535 {
536 GridCellIterator git;
537 GridCellIterator gend;
538 VTK::DataMode datamode;
539 // Index of the currently visited corner within the current element.
540 // NOTE: this is in VTK-numbering, in contrast to VertexIterator.
541 int cornerIndexVTK;
542 const VertexMapper & vertexmapper;
543 // in conforming mode, for each vertex id (as obtained by vertexmapper)
544 // hold its number in the iteration order of VertexIterator (*not*
545 // CornerIterator)
546 const std::vector<int> & number;
547 // holds the number of corners of all the elements we have seen so far,
548 // excluding the current element
549 int offset;
550
551 // hide operator ->
552 void operator->();
553 public:
554 CornerIterator(const GridCellIterator & x,
555 const GridCellIterator & end,
556 const VTK::DataMode & dm,
557 const VertexMapper & vm,
558 const std::vector<int> & num) :
559 git(x), gend(end), datamode(dm), cornerIndexVTK(0),
560 vertexmapper(vm),
561 number(num), offset(0) {}
562 void increment ()
563 {
564 if( git == gend )
565 return;
566 ++cornerIndexVTK;
567 const int numCorners = git->subEntities(n);
568 if( cornerIndexVTK == numCorners )
569 {
570 offset += numCorners;
571 cornerIndexVTK = 0;
572
573 ++git;
574 while( (git != gend) && skipEntity( git->partitionType() ) )
575 ++git;
576 }
577 }
578 bool equals (const CornerIterator & cit) const
579 {
580 return git == cit.git
581 && cornerIndexVTK == cit.cornerIndexVTK
582 && datamode == cit.datamode;
583 }
584 EntityReference dereference() const
585 {
586 return *git;
587 }
589
593 int id () const
594 {
595 switch (datamode)
596 {
597 case VTK::conforming :
598 return
599 number[vertexmapper.subIndex(*git,VTK::renumber(*git,cornerIndexVTK),
600 n)];
601 case VTK::nonconforming :
602 return offset + VTK::renumber(*git,cornerIndexVTK);
603 default :
604 DUNE_THROW(IOError,"VTKWriter: unsupported DataMode" << datamode);
605 }
606 }
607 };
608
609 CornerIterator cornerBegin () const
610 {
611 return CornerIterator( gridView_.template begin< 0, VTK_Partition >(),
612 gridView_.template end< 0, VTK_Partition >(),
613 datamode, *vertexmapper, number );
614 }
615
616 CornerIterator cornerEnd () const
617 {
618 return CornerIterator( gridView_.template end< 0, VTK_Partition >(),
619 gridView_.template end< 0, VTK_Partition >(),
620 datamode, *vertexmapper, number );
621 }
622
623 public:
632 explicit VTKWriter ( const GridView &gridView,
633 VTK::DataMode dm = VTK::conforming,
634 VTK::Precision coordPrecision = VTK::Precision::float32)
635 : gridView_( gridView ),
636 datamode( dm ),
637 coordPrec (coordPrecision),
638 polyhedralCellsPresent_( checkForPolyhedralCells() )
639 { }
640
645 void addCellData (const std::shared_ptr< const VTKFunction > & p)
646 {
647 celldata.push_back(VTKLocalFunction(p));
648 }
649
669 template<typename F>
670 void addCellData(F&& f, VTK::FieldInfo vtkFieldInfo)
671 {
672 celldata.push_back(VTKLocalFunction(std::forward<F>(f),vtkFieldInfo));
673 }
674
690 template<class Container>
691 void addCellData (const Container& v, const std::string &name, int ncomps = 1,
692 VTK::Precision prec = VTK::Precision::float32)
693 {
695 for (int c=0; c<ncomps; ++c) {
696 std::stringstream compName;
697 compName << name;
698 if (ncomps>1)
699 compName << "[" << c << "]";
700 VTKFunction* p = new Function(gridView_, v, compName.str(), ncomps, c, prec);
701 addCellData(std::shared_ptr< const VTKFunction >(p));
702 }
703 }
704
709 void addVertexData (const std::shared_ptr< const VTKFunction > & p)
710 {
711 vertexdata.push_back(VTKLocalFunction(p));
712 }
713
733 template<typename F>
734 void addVertexData(F&& f, VTK::FieldInfo vtkFieldInfo)
735 {
736 vertexdata.push_back(VTKLocalFunction(std::forward<F>(f),vtkFieldInfo));
737 }
738
739
755 template<class Container>
756 void addVertexData (const Container& v, const std::string &name, int ncomps=1,
757 VTK::Precision prec = VTK::Precision::float32)
758 {
760 for (int c=0; c<ncomps; ++c) {
761 std::stringstream compName;
762 compName << name;
763 if (ncomps>1)
764 compName << "[" << c << "]";
765 VTKFunction* p = new Function(gridView_, v, compName.str(), ncomps, c, prec);
766 addVertexData(std::shared_ptr< const VTKFunction >(p));
767 }
768 }
769
771 void clear ()
772 {
773 celldata.clear();
774 vertexdata.clear();
775 }
776
779 { return coordPrec; }
780
782 virtual ~VTKWriter ()
783 {
784 this->clear();
785 }
786
798 std::string write ( const std::string &name,
799 VTK::OutputType type = VTK::ascii )
800 {
801 return write( name, type, gridView_.comm().rank(), gridView_.comm().size() );
802 }
803
830 std::string pwrite ( const std::string & name, const std::string & path, const std::string & extendpath,
831 VTK::OutputType type = VTK::ascii )
832 {
833 return pwrite( name, path, extendpath, type, gridView_.comm().rank(), gridView_.comm().size() );
834 }
835
836 protected:
838
849 std::string getParallelPieceName(const std::string& name,
850 const std::string& path,
851 int commRank, int commSize) const
852 {
853 std::ostringstream s;
854 if(path.size() > 0) {
855 s << path;
856 if(path[path.size()-1] != '/')
857 s << '/';
858 }
859 s << 's' << std::setw(4) << std::setfill('0') << commSize << '-';
860 s << 'p' << std::setw(4) << std::setfill('0') << commRank << '-';
861 s << name;
862 if(GridView::dimension > 1)
863 s << ".vtu";
864 else
865 s << ".vtp";
866 return s.str();
867 }
868
870
880 std::string getParallelHeaderName(const std::string& name,
881 const std::string& path,
882 int commSize) const
883 {
884 std::ostringstream s;
885 if(path.size() > 0) {
886 s << path;
887 if(path[path.size()-1] != '/')
888 s << '/';
889 }
890 s << 's' << std::setw(4) << std::setfill('0') << commSize << '-';
891 s << name;
892 if(GridView::dimension > 1)
893 s << ".pvtu";
894 else
895 s << ".pvtp";
896 return s.str();
897 }
898
900
912 std::string getSerialPieceName(const std::string& name,
913 const std::string& path) const
914 {
915 static const std::string extension =
916 GridView::dimension == 1 ? ".vtp" : ".vtu";
917
918 return concatPaths(path, name+extension);
919 }
920
936 std::string write ( const std::string &name,
937 VTK::OutputType type,
938 const int commRank,
939 const int commSize )
940 {
941 // in the parallel case, just use pwrite, it has all the necessary
942 // stuff, so we don't need to reimplement it here.
943 if(commSize > 1)
944 return pwrite(name, "", "", type, commRank, commSize);
945
946 // make data mode visible to private functions
947 outputtype = type;
948
949 // generate filename for process data
950 std::string pieceName = getSerialPieceName(name, "");
951
952 // write process data
953 std::ofstream file;
954 file.exceptions(std::ios_base::badbit | std::ios_base::failbit |
955 std::ios_base::eofbit);
956 // check if file can be opened
957 try {
958 file.open( pieceName.c_str(), std::ios::binary );
959 }
960 catch(...) {
961 std::cerr << "Filename: " << pieceName << " could not be opened" << std::endl;
962 throw;
963 }
964 if (! file.is_open())
965 DUNE_THROW(IOError, "Could not write to piece file " << pieceName);
966 writeDataFile( file );
967 file.close();
968
969 return pieceName;
970 }
971
973
996 std::string pwrite(const std::string& name, const std::string& path,
997 const std::string& extendpath,
998 VTK::OutputType ot, const int commRank,
999 const int commSize )
1000 {
1001 // make data mode visible to private functions
1002 outputtype=ot;
1003
1004 // do some magic because paraview can only cope with relative paths to piece files
1005 std::ofstream file;
1006 file.exceptions(std::ios_base::badbit | std::ios_base::failbit |
1007 std::ios_base::eofbit);
1008 std::string piecepath = concatPaths(path, extendpath);
1009 std::string relpiecepath = relativePath(path, piecepath);
1010
1011 // write this processes .vtu/.vtp piece file
1012 std::string fullname = getParallelPieceName(name, piecepath, commRank,
1013 commSize);
1014 // check if file can be opened
1015 try {
1016 file.open(fullname.c_str(),std::ios::binary);
1017 }
1018 catch(...) {
1019 std::cerr << "Filename: " << fullname << " could not be opened" << std::endl;
1020 throw;
1021 }
1022 if (! file.is_open())
1023 DUNE_THROW(IOError, "Could not write to piecefile file " << fullname);
1024 writeDataFile(file);
1025 file.close();
1026 gridView_.comm().barrier();
1027
1028 // if we are rank 0, write .pvtu/.pvtp parallel header
1029 fullname = getParallelHeaderName(name, path, commSize);
1030 if( commRank ==0 )
1031 {
1032 file.open(fullname.c_str());
1033 if (! file.is_open())
1034 DUNE_THROW(IOError, "Could not write to parallel file " << fullname);
1035 writeParallelHeader(file,name,relpiecepath, commSize );
1036 file.close();
1037 }
1038 gridView_.comm().barrier();
1039 return fullname;
1040 }
1041
1042 private:
1044
1061 void writeParallelHeader(std::ostream& s, const std::string& piecename,
1062 const std::string& piecepath, const int commSize)
1063 {
1064 VTK::FileType fileType =
1065 (n == 1) ? VTK::polyData : VTK::unstructuredGrid;
1066
1067 VTK::PVTUWriter writer(s, fileType);
1068
1069 writer.beginMain();
1070
1071 // PPointData
1072 {
1073 std::string scalars, vectors;
1074 std::tie(scalars,vectors) = getDataNames(vertexdata);
1075 writer.beginPointData(scalars, vectors);
1076 }
1077 for (auto it = vertexdata.begin(),
1078 end = vertexdata.end();
1079 it != end;
1080 ++it)
1081 {
1082 unsigned writecomps = it->fieldInfo().size();
1083 if(writecomps == 2) writecomps = 3;
1084 writer.addArray(it->name(), writecomps, it->fieldInfo().precision());
1085 }
1086 writer.endPointData();
1087
1088 // PCellData
1089 {
1090 std::string scalars, vectors;
1091 std::tie(scalars,vectors) = getDataNames(celldata);
1092 writer.beginCellData(scalars, vectors);
1093 }
1094 for (auto it = celldata.begin(),
1095 end = celldata.end();
1096 it != end;
1097 ++it)
1098 {
1099 unsigned writecomps = it->fieldInfo().size();
1100 if(writecomps == 2) writecomps = 3;
1101 writer.addArray(it->name(), writecomps, it->fieldInfo().precision());
1102 }
1103 writer.endCellData();
1104
1105 // PPoints
1106 writer.beginPoints();
1107 writer.addArray("Coordinates", 3, coordPrec);
1108 writer.endPoints();
1109
1110 // Pieces
1111 for( int i = 0; i < commSize; ++i )
1112 {
1113 const std::string& fullname = getParallelPieceName(piecename,
1114 piecepath, i,
1115 commSize);
1116 writer.addPiece(fullname);
1117 }
1118
1119 writer.endMain();
1120 }
1121
1123 void writeDataFile (std::ostream& s)
1124 {
1125 VTK::FileType fileType =
1126 (n == 1) ? VTK::polyData : VTK::unstructuredGrid;
1127
1128 VTK::VTUWriter writer(s, outputtype, fileType);
1129
1130 // Grid characteristics
1131 vertexmapper = new VertexMapper( gridView_, mcmgVertexLayout() );
1132 if (datamode == VTK::conforming)
1133 {
1134 number.resize(vertexmapper->size());
1135 for (std::vector<int>::size_type i=0; i<number.size(); i++) number[i] = -1;
1136 }
1137 countEntities(nvertices, ncells, ncorners);
1138
1139 writer.beginMain(ncells, nvertices);
1140 writeAllData(writer);
1141 writer.endMain();
1142
1143 // write appended binary data section
1144 if(writer.beginAppended())
1145 writeAllData(writer);
1146 writer.endAppended();
1147
1148 delete vertexmapper; number.clear();
1149 }
1150
1151 void writeAllData(VTK::VTUWriter& writer) {
1152 // PointData
1153 writeVertexData(writer);
1154
1155 // CellData
1156 writeCellData(writer);
1157
1158 // Points
1159 writeGridPoints(writer);
1160
1161 // Cells
1162 writeGridCells(writer);
1163 }
1164
1165 protected:
1166 std::string getFormatString() const
1167 {
1168 if (outputtype==VTK::ascii)
1169 return "ascii";
1170 if (outputtype==VTK::base64)
1171 return "binary";
1172 if (outputtype==VTK::appendedraw)
1173 return "appended";
1174 if (outputtype==VTK::appendedbase64)
1175 return "appended";
1176 DUNE_THROW(IOError, "VTKWriter: unsupported OutputType" << outputtype);
1177 }
1178
1179 std::string getTypeString() const
1180 {
1181 if (n==1)
1182 return "PolyData";
1183 else
1184 return "UnstructuredGrid";
1185 }
1186
1188 virtual void countEntities(int &nvertices, int &ncells, int &ncorners)
1189 {
1190 nvertices = 0;
1191 ncells = 0;
1192 ncorners = 0;
1193 for (CellIterator it=cellBegin(); it!=cellEnd(); ++it)
1194 {
1195 ncells++;
1196 // because of the use of vertexmapper->map(), this iteration must be
1197 // in the order of Dune's numbering.
1198 const int subEntities = it->subEntities(n);
1199 for (int i=0; i<subEntities; ++i)
1200 {
1201 ncorners++;
1202 if (datamode == VTK::conforming)
1203 {
1204 int alpha = vertexmapper->subIndex(*it,i,n);
1205 if (number[alpha]<0)
1206 number[alpha] = nvertices++;
1207 }
1208 else
1209 {
1210 nvertices++;
1211 }
1212 }
1213 }
1214 }
1215
1216 template<typename T>
1217 std::tuple<std::string,std::string> getDataNames(const T& data) const
1218 {
1219 std::string scalars = "";
1220 for (auto it = data.begin(),
1221 end = data.end();
1222 it != end;
1223 ++it)
1224 if (it->fieldInfo().type() == VTK::FieldInfo::Type::scalar)
1225 {
1226 scalars = it->name();
1227 break;
1228 }
1229
1230 std::string vectors = "";
1231 for (auto it = data.begin(),
1232 end = data.end();
1233 it != end;
1234 ++it)
1235 if (it->fieldInfo().type() == VTK::FieldInfo::Type::vector)
1236 {
1237 vectors = it->name();
1238 break;
1239 }
1240 return std::make_tuple(scalars,vectors);
1241 }
1242
1243 template<typename Data, typename Iterator>
1244 void writeData(VTK::VTUWriter& writer, const Data& data, const Iterator begin, const Iterator end, int nentries)
1245 {
1246 for (auto it = data.begin(),
1247 iend = data.end();
1248 it != iend;
1249 ++it)
1250 {
1251 const auto& f = *it;
1252 VTK::FieldInfo fieldInfo = f.fieldInfo();
1253 std::size_t writecomps = fieldInfo.size();
1254 switch (fieldInfo.type())
1255 {
1257 break;
1259 // vtk file format: a vector data always should have 3 comps (with
1260 // 3rd comp = 0 in 2D case)
1261 if (writecomps > 3)
1262 DUNE_THROW(IOError,"Cannot write VTK vectors with more than 3 components (components was " << writecomps << ")");
1263 writecomps = 3;
1264 break;
1266 DUNE_THROW(NotImplemented,"VTK output for tensors not implemented yet");
1267 }
1268 std::shared_ptr<VTK::DataArrayWriter> p
1269 (writer.makeArrayWriter(f.name(), writecomps, nentries, fieldInfo.precision()));
1270 if(!p->writeIsNoop())
1271 for (Iterator eit = begin; eit!=end; ++eit)
1272 {
1273 const Entity & e = *eit;
1274 f.bind(e);
1275 f.write(eit.position(),*p);
1276 f.unbind();
1277 // vtk file format: a vector data always should have 3 comps
1278 // (with 3rd comp = 0 in 2D case)
1279 for (std::size_t j=fieldInfo.size(); j < writecomps; ++j)
1280 p->write(0.0);
1281 }
1282 }
1283 }
1284
1286 virtual void writeCellData(VTK::VTUWriter& writer)
1287 {
1288 if(celldata.size() == 0)
1289 return;
1290
1291 std::string scalars, vectors;
1292 std::tie(scalars,vectors) = getDataNames(celldata);
1293
1294 writer.beginCellData(scalars, vectors);
1295 writeData(writer,celldata,cellBegin(),cellEnd(),ncells);
1296 writer.endCellData();
1297 }
1298
1300 virtual void writeVertexData(VTK::VTUWriter& writer)
1301 {
1302 if(vertexdata.size() == 0)
1303 return;
1304
1305 std::string scalars, vectors;
1306 std::tie(scalars,vectors) = getDataNames(vertexdata);
1307
1308 writer.beginPointData(scalars, vectors);
1309 writeData(writer,vertexdata,vertexBegin(),vertexEnd(),nvertices);
1310 writer.endPointData();
1311 }
1312
1314 virtual void writeGridPoints(VTK::VTUWriter& writer)
1315 {
1316 writer.beginPoints();
1317
1318 std::shared_ptr<VTK::DataArrayWriter> p
1319 (writer.makeArrayWriter("Coordinates", 3, nvertices, coordPrec));
1320 if(!p->writeIsNoop()) {
1321 VertexIterator vEnd = vertexEnd();
1322 for (VertexIterator vit=vertexBegin(); vit!=vEnd; ++vit)
1323 {
1324 int dimw=w;
1325 for (int j=0; j<std::min(dimw,3); j++)
1326 p->write((*vit).geometry().corner(vit.localindex())[j]);
1327 for (int j=std::min(dimw,3); j<3; j++)
1328 p->write(0.0);
1329 }
1330 }
1331 // free the VTK::DataArrayWriter before touching the stream
1332 p.reset();
1333
1334 writer.endPoints();
1335 }
1336
1338 virtual void writeGridCells(VTK::VTUWriter& writer)
1339 {
1340 writer.beginCells();
1341
1342 // connectivity
1343 {
1344 std::shared_ptr<VTK::DataArrayWriter> p1
1345 (writer.makeArrayWriter("connectivity", 1, ncorners, VTK::Precision::int32));
1346 if(!p1->writeIsNoop())
1347 for (CornerIterator it=cornerBegin(); it!=cornerEnd(); ++it)
1348 p1->write(it.id());
1349 }
1350
1351 // offsets
1352 {
1353 std::shared_ptr<VTK::DataArrayWriter> p2
1354 (writer.makeArrayWriter("offsets", 1, ncells, VTK::Precision::int32));
1355 if(!p2->writeIsNoop()) {
1356 int offset = 0;
1357 for (CellIterator it=cellBegin(); it!=cellEnd(); ++it)
1358 {
1359 offset += it->subEntities(n);
1360 p2->write(offset);
1361 }
1362 }
1363 }
1364
1365 // types
1366 if (n>1)
1367 {
1368 {
1369 std::shared_ptr<VTK::DataArrayWriter> p3
1370 (writer.makeArrayWriter("types", 1, ncells, VTK::Precision::uint8));
1371
1372 if(!p3->writeIsNoop())
1373 {
1374 for (CellIterator it=cellBegin(); it!=cellEnd(); ++it)
1375 {
1376 int vtktype = VTK::geometryType(it->type());
1377 p3->write(vtktype);
1378 }
1379 }
1380 }
1381
1382
1383 // if polyhedron cells found also cell faces need to be written
1384 if( polyhedralCellsPresent_ )
1385 {
1386 writeCellFaces( writer );
1387 }
1388 }
1389
1390 writer.endCells();
1391 }
1392
1393 protected:
1394 bool checkForPolyhedralCells() const
1395 {
1396 // check if polyhedron cells are present
1397 for( const auto& geomType : gridView_.indexSet().types( 0 ) )
1398 {
1399 if( VTK::geometryType( geomType ) == VTK::polyhedron )
1400 {
1401 return true;
1402 }
1403 }
1404 return false;
1405 }
1406
1408 virtual void writeCellFaces(VTK::VTUWriter& writer)
1409 {
1410 if( ! faceVertices_ )
1411 {
1412 faceVertices_.reset( new std::pair< std::vector<int>, std::vector<int> > () );
1413 // fill face vertex structure
1414 fillFaceVertices( cornerBegin(), cornerEnd(), gridView_.indexSet(),
1415 faceVertices_->first, faceVertices_->second );
1416 }
1417
1418 std::vector< int >& faces = faceVertices_->first;
1419 std::vector< int >& faceOffsets = faceVertices_->second;
1420 assert( int(faceOffsets.size()) == ncells );
1421
1422 {
1423 std::shared_ptr<VTK::DataArrayWriter> p4
1424 (writer.makeArrayWriter("faces", 1, faces.size(), VTK::Precision::int32));
1425 if(!p4->writeIsNoop())
1426 {
1427 for( const auto& face : faces )
1428 p4->write( face );
1429 }
1430 }
1431
1432 {
1433 std::shared_ptr<VTK::DataArrayWriter> p5
1434 (writer.makeArrayWriter("faceoffsets", 1, ncells, VTK::Precision::int32));
1435 if(!p5->writeIsNoop())
1436 {
1437 for( const auto& offset : faceOffsets )
1438 p5->write( offset );
1439
1440 // clear face vertex structure
1441 faceVertices_.reset();
1442 }
1443 }
1444 }
1445
1446 template <class CornerIterator, class IndexSet, class T>
1447 inline void fillFaceVertices( CornerIterator it,
1448 const CornerIterator end,
1449 const IndexSet& indexSet,
1450 std::vector<T>& faces,
1451 std::vector<T>& faceOffsets )
1452 {
1453 if( n == 3 && it != end )
1454 {
1455 // clear output arrays
1456 faces.clear();
1457 faces.reserve( 15 * ncells );
1458 faceOffsets.clear();
1459 faceOffsets.reserve( ncells );
1460
1461 int offset = 0;
1462
1463 Cell element = *it;
1464 int elIndex = indexSet.index( element );
1465 std::vector< T > vertices;
1466 vertices.reserve( 30 );
1467 for( ; it != end; ++it )
1468 {
1469 const Cell& cell = *it ;
1470 const int cellIndex = indexSet.index( cell ) ;
1471 if( elIndex != cellIndex )
1472 {
1473 fillFacesForElement( element, indexSet, vertices, offset, faces, faceOffsets );
1474
1475 vertices.clear();
1476 element = cell ;
1477 elIndex = cellIndex ;
1478 }
1479 vertices.push_back( it.id() );
1480 }
1481
1482 // fill faces for last element
1483 fillFacesForElement( element, indexSet, vertices, offset, faces, faceOffsets );
1484 }
1485 }
1486
1487 template <class Entity, class IndexSet, class T>
1488 static void fillFacesForElement( const Entity& element,
1489 const IndexSet& indexSet,
1490 const std::vector<T>& vertices,
1491 T& offset,
1492 std::vector<T>& faces,
1493 std::vector<T>& faceOffsets )
1494 {
1495 const int dim = n;
1496
1497 std::map< T, T > vxMap;
1498
1499 // get number of local faces
1500 const int nVertices = element.subEntities( dim );
1501 for( int vx = 0; vx < nVertices; ++ vx )
1502 {
1503 const int vxIdx = indexSet.subIndex( element, vx, dim );
1504 vxMap[ vxIdx ] = vertices[ vx ];
1505 }
1506
1507 // get number of local faces
1508 const int nFaces = element.subEntities( 1 );
1509 // store number of faces for current element
1510 faces.push_back( nFaces );
1511 ++offset;
1512 // extract each face as a set of vertex indices
1513 for( int fce = 0; fce < nFaces; ++ fce )
1514 {
1515 // obtain face
1516 const auto face = element.template subEntity< 1 > ( fce );
1517
1518 // get all vertex indices from current face
1519 const int nVxFace = face.subEntities( dim );
1520 faces.push_back( nVxFace );
1521 ++offset ;
1522 for( int i=0; i<nVxFace; ++i )
1523 {
1524 const T vxIndex = indexSet.subIndex( face, i, dim );
1525 assert( vxMap.find( vxIndex ) != vxMap.end() );
1526 faces.push_back( vxMap[ vxIndex ] );
1527 ++offset ;
1528 }
1529 }
1530
1531 // store face offset for each element
1532 faceOffsets.push_back( offset );
1533 }
1534
1535 protected:
1536 // the list of registered functions
1537 std::list<VTKLocalFunction> celldata;
1538 std::list<VTKLocalFunction> vertexdata;
1539
1540 // the grid
1541 GridView gridView_;
1542
1543 // temporary grid information
1544 int ncells;
1545 int nvertices;
1546 int ncorners;
1547 private:
1548 VertexMapper* vertexmapper;
1549 // in conforming mode, for each vertex id (as obtained by vertexmapper)
1550 // hold its number in the iteration order (VertexIterator)
1551 std::vector<int> number;
1552 VTK::DataMode datamode;
1553 VTK::Precision coordPrec;
1554
1555 // true if polyhedral cells are present in the grid
1556 const bool polyhedralCellsPresent_;
1557
1558 // pointer holding face vertex connectivity if needed
1559 std::shared_ptr< std::pair< std::vector<int>, std::vector<int> > > faceVertices_;
1560
1561 protected:
1562 VTK::OutputType outputtype;
1563 };
1564
1565}
1566
1567#endif
vector space out of a tensor product of fields.
Definition: fvector.hh:96
Base class for stl conformant forward iterators.
Definition: iteratorfacades.hh:139
Base class template for function classes.
Definition: function.hh:29
Grid view abstract base class.
Definition: gridview.hh:60
Default exception class for I/O errors.
Definition: exceptions.hh:229
Index Set Interface base class.
Definition: indexidset.hh:76
IndexType index(const typename Traits::template Codim< cc >::Entity &e) const
Map entity to index. The result of calling this method with an entity that is not in the index set is...
Definition: indexidset.hh:111
Index subIndex(const typename GV::template Codim< 0 >::Entity &e, int i, unsigned int codim) const
Map subentity of codim 0 entity to starting index in array for dof block.
Definition: mcmgmapper.hh:268
size_type size() const
Return total number of entities in the entity set managed by the mapper.
Definition: mcmgmapper.hh:287
Default exception for dummy implementations.
Definition: exceptions.hh:261
Take a vector and interpret it as cell data for the VTKWriter.
Definition: function.hh:95
Take a vector and interpret it as point data for the VTKWriter.
Definition: function.hh:203
A base class for grid functions with any return type and dimension.
Definition: function.hh:40
Base class to write pvd-files which contains a list of all collected vtk-files.
Definition: vtksequencewriterbase.hh:32
Writer for the ouput of grid functions in the vtk format.
Definition: vtksequencewriter.hh:28
Iterator over the grids elements.
Definition: vtkwriter.hh:381
CellIterator(const GridCellIterator &x)
construct a CellIterator from the gridview's Iterator.
Definition: vtkwriter.hh:384
const FieldVector< DT, n > position() const
Definition: vtkwriter.hh:387
Iterate over the elements' corners.
Definition: vtkwriter.hh:535
int id() const
Process-local consecutive zero-starting vertex id.
Definition: vtkwriter.hh:593
Type erasure wrapper for VTK data sets.
Definition: vtkwriter.hh:152
void unbind() const
Unbind the data set from the currently bound entity.
Definition: vtkwriter.hh:356
VTKLocalFunction(F &&f, VTK::FieldInfo fieldInfo)
Construct a VTKLocalFunction for a dune-functions style LocalFunction.
Definition: vtkwriter.hh:303
std::string name() const
Returns the name of the data set.
Definition: vtkwriter.hh:338
const VTK::FieldInfo & fieldInfo() const
Returns the VTK::FieldInfo for the data set.
Definition: vtkwriter.hh:344
void bind(const Entity &e) const
Bind the data set to grid entity e.
Definition: vtkwriter.hh:350
VTKLocalFunction(const std::shared_ptr< const VTKFunction > &vtkFunctionPtr)
Construct a VTKLocalFunction for a legacy VTKFunction.
Definition: vtkwriter.hh:327
void write(const Coordinate &pos, Writer &w) const
Write the value of the data set at local coordinate pos to the writer w.
Definition: vtkwriter.hh:362
Iterate over the grid's vertices.
Definition: vtkwriter.hh:420
FieldVector< DT, n > position() const
position of vertex inside the entity
Definition: vtkwriter.hh:497
int localindex() const
index of vertex within the entity, in Dune-numbering
Definition: vtkwriter.hh:492
Writer for the ouput of grid functions in the vtk format.
Definition: vtkwriter.hh:91
void addCellData(const Container &v, const std::string &name, int ncomps=1, VTK::Precision prec=VTK::Precision::float32)
Add a grid function (represented by container) that lives on the cells of the grid to the visualizati...
Definition: vtkwriter.hh:691
void clear()
clear list of registered functions
Definition: vtkwriter.hh:771
std::string write(const std::string &name, VTK::OutputType type=VTK::ascii)
write output (interface might change later)
Definition: vtkwriter.hh:798
std::string getParallelHeaderName(const std::string &name, const std::string &path, int commSize) const
return name of a parallel header file
Definition: vtkwriter.hh:880
void addVertexData(const std::shared_ptr< const VTKFunction > &p)
Add a grid function that lives on the vertices of the grid to the visualization.
Definition: vtkwriter.hh:709
std::string getSerialPieceName(const std::string &name, const std::string &path) const
return name of a serial piece file
Definition: vtkwriter.hh:912
void addCellData(const std::shared_ptr< const VTKFunction > &p)
Add a grid function that lives on the cells of the grid to the visualization.
Definition: vtkwriter.hh:645
void addVertexData(F &&f, VTK::FieldInfo vtkFieldInfo)
Add a function by sampling it on the grid vertices.
Definition: vtkwriter.hh:734
virtual void writeCellData(VTK::VTUWriter &writer)
write cell data
Definition: vtkwriter.hh:1286
std::string getParallelPieceName(const std::string &name, const std::string &path, int commRank, int commSize) const
return name of a parallel piece file
Definition: vtkwriter.hh:849
virtual void countEntities(int &nvertices, int &ncells, int &ncorners)
count the vertices, cells and corners
Definition: vtkwriter.hh:1188
virtual void writeGridCells(VTK::VTUWriter &writer)
write the connectivity array
Definition: vtkwriter.hh:1338
virtual void writeCellFaces(VTK::VTUWriter &writer)
write the connectivity array
Definition: vtkwriter.hh:1408
std::string write(const std::string &name, VTK::OutputType type, const int commRank, const int commSize)
write output (interface might change later)
Definition: vtkwriter.hh:936
VTK::Precision coordPrecision() const
get the precision with which coordinates are written out
Definition: vtkwriter.hh:778
virtual void writeGridPoints(VTK::VTUWriter &writer)
write the positions of vertices
Definition: vtkwriter.hh:1314
virtual void writeVertexData(VTK::VTUWriter &writer)
write vertex data
Definition: vtkwriter.hh:1300
void addCellData(F &&f, VTK::FieldInfo vtkFieldInfo)
Add a function by sampling it on the element centers.
Definition: vtkwriter.hh:670
void addVertexData(const Container &v, const std::string &name, int ncomps=1, VTK::Precision prec=VTK::Precision::float32)
Add a grid function (represented by container) that lives on the vertices of the grid to the visualiz...
Definition: vtkwriter.hh:756
virtual ~VTKWriter()
destructor
Definition: vtkwriter.hh:782
VTKWriter(const GridView &gridView, VTK::DataMode dm=VTK::conforming, VTK::Precision coordPrecision=VTK::Precision::float32)
Construct a VTKWriter working on a specific GridView.
Definition: vtkwriter.hh:632
std::string pwrite(const std::string &name, const std::string &path, const std::string &extendpath, VTK::OutputType ot, const int commRank, const int commSize)
write output; interface might change later
Definition: vtkwriter.hh:996
std::string pwrite(const std::string &name, const std::string &path, const std::string &extendpath, VTK::OutputType type=VTK::ascii)
write output (interface might change later)
Definition: vtkwriter.hh:830
base class for data array writers
Definition: dataarraywriter.hh:54
Descriptor struct for VTK fields.
Definition: common.hh:376
@ tensor
tensor field (always 3x3)
@ vector
vector-valued field (always 3D, will be padded if necessary)
std::string name() const
The name of the data field.
Definition: common.hh:400
Dump a .vtu/.vtp files contents to a stream.
Definition: pvtuwriter.hh:60
Dump a .vtu/.vtp files contents to a stream.
Definition: vtuwriter.hh:96
DataArrayWriter * makeArrayWriter(const std::string &name, unsigned ncomps, unsigned nitems, Precision prec)
acquire a DataArrayWriter
Definition: vtuwriter.hh:378
void endCellData()
finish CellData section
Definition: vtuwriter.hh:218
void beginCells()
start section for the grid cells/PolyData lines
Definition: vtuwriter.hh:272
void endPointData()
finish PointData section
Definition: vtuwriter.hh:180
void beginCellData(const std::string &scalars="", const std::string &vectors="")
start CellData section
Definition: vtuwriter.hh:203
void beginPointData(const std::string &scalars="", const std::string &vectors="")
start PointData section
Definition: vtuwriter.hh:165
void endPoints()
finish section for the point coordinates
Definition: vtuwriter.hh:247
void endCells()
start section for the grid cells/PolyData lines
Definition: vtuwriter.hh:283
void beginPoints()
start section for the point coordinates
Definition: vtuwriter.hh:236
Data array writers for the VTKWriter.
A few common exception classes.
Traits for type conversions and type information.
Common stuff for the VTKWriter.
Precision
which precision to use when writing out data to vtk files
Definition: common.hh:319
OutputType
How the bulk data should be stored in the file.
Definition: common.hh:42
FileType
which type of VTK file to write
Definition: common.hh:300
DataMode
Whether to produce conforming or non-conforming output.
Definition: common.hh:66
Functions for VTK output.
typename Impl::voider< Types... >::type void_t
Is void for all valid input types (see N3911). The workhorse for C++11 SFINAE-techniques.
Definition: typetraits.hh:40
#define DUNE_THROW(E, m)
Definition: exceptions.hh:216
void localFunction(DiscreteGlobalBasisFunction< TT... > &&t)=delete
Construction of local functions from a temporary DiscreteGlobalBasisFunction (forbidden)
const IndexSet & indexSet() const
obtain the index set
Definition: gridview.hh:172
Traits::Grid Grid
type of the grid
Definition: gridview.hh:77
const CollectiveCommunication & comm() const
obtain collective communication object
Definition: gridview.hh:246
Traits::IndexSet IndexSet
type of the index set
Definition: gridview.hh:80
Grid::ctype ctype
type used for coordinates in grid
Definition: gridview.hh:124
@ dimension
The dimension of the grid.
Definition: gridview.hh:127
@ dimensionworld
The dimension of the world the grid lives in.
Definition: gridview.hh:131
PartitionIteratorType
Parameter to be used for the parallel level- and leaf iterators.
Definition: gridenums.hh:134
PartitionType
Attributes used in the generic overlap model.
Definition: gridenums.hh:28
@ All_Partition
all entities
Definition: gridenums.hh:139
@ InteriorBorder_Partition
interior and border entities
Definition: gridenums.hh:136
@ InteriorEntity
all interior entities
Definition: gridenums.hh:29
decltype(auto) ifElse(const Condition &condition, IfFunc &&ifFunc, ElseFunc &&elseFunc)
A conditional expression.
Definition: hybridutilities.hh:355
MCMGLayout mcmgVertexLayout()
layout for vertices (dim-0 entities)
Definition: mcmgmapper.hh:160
std::string relativePath(const std::string &newbase, const std::string &p)
compute a relative path between two paths
Definition: path.cc:151
std::string concatPaths(const std::string &base, const std::string &p)
concatenate two paths
Definition: path.cc:30
auto min(ADLTag< 0 >, const V &v1, const V &v2)
implements binary Simd::min()
Definition: defaults.hh:87
Utility class for handling nested indentation in output.
This file implements iterator facade classes for writing stl conformant iterators.
Mapper for multiple codim and multiple geometry types.
Dune namespace.
Definition: alignedallocator.hh:14
STL namespace.
Utilities for handling filesystem paths.
Static tag representing a codimension.
Definition: dimension.hh:22
static const ReferenceElement & general(const GeometryType &type)
get general reference elements
Definition: referenceelements.hh:196
Type trait to determine whether an instance of T has an operator[](I), i.e. whether it can be indexed...
Definition: typetraits.hh:230
Base class for polymorphic container of underlying data set.
Definition: vtkwriter.hh:160
virtual void write(const Coordinate &pos, Writer &w, std::size_t count) const =0
Evaluate data set at local position pos inside the current entity and write result to w.
virtual void unbind()=0
Unbind data set from current grid entity - mostly here for performance and symmetry reasons.
virtual void bind(const Entity &e)=0
Bind data set to grid entity - must be called before evaluating (i.e. calling write())
Type erasure implementation for functions conforming to the dune-functions LocalFunction interface.
Definition: vtkwriter.hh:183
virtual void write(const Coordinate &pos, Writer &w, std::size_t count) const
Evaluate data set at local position pos inside the current entity and write result to w.
Definition: vtkwriter.hh:201
virtual void unbind()
Unbind data set from current grid entity - mostly here for performance and symmetry reasons.
Definition: vtkwriter.hh:196
virtual void bind(const Entity &e)
Bind data set to grid entity - must be called before evaluating (i.e. calling write())
Definition: vtkwriter.hh:191
Type erasure implementation for C++ functions, i.e., functions that can be evaluated in global coordi...
Definition: vtkwriter.hh:231
virtual void unbind()
Unbind data set from current grid entity - mostly here for performance and symmetry reasons.
Definition: vtkwriter.hh:245
virtual void write(const Coordinate &pos, Writer &w, std::size_t count) const
Evaluate data set at local position pos inside the current entity and write result to w.
Definition: vtkwriter.hh:250
virtual void bind(const Entity &e)
Bind data set to grid entity - must be called before evaluating (i.e. calling write())
Definition: vtkwriter.hh:240
Type erasure implementation for legacy VTKFunctions.
Definition: vtkwriter.hh:272
virtual void unbind()
Unbind data set from current grid entity - mostly here for performance and symmetry reasons.
Definition: vtkwriter.hh:283
virtual void write(const Coordinate &pos, Writer &w, std::size_t count) const
Evaluate data set at local position pos inside the current entity and write result to w.
Definition: vtkwriter.hh:288
virtual void bind(const Entity &e)
Bind data set to grid entity - must be called before evaluating (i.e. calling write())
Definition: vtkwriter.hh:278
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden  |  generated with Hugo v0.111.3 (Jul 15, 22:36, 2024)