BEM++  2.0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Groups Pages
concrete_grid_view.hpp
1 // Copyright (C) 2011-2012 by the BEM++ Authors
2 //
3 // Permission is hereby granted, free of charge, to any person obtaining a copy
4 // of this software and associated documentation files (the "Software"), to deal
5 // in the Software without restriction, including without limitation the rights
6 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7 // copies of the Software, and to permit persons to whom the Software is
8 // furnished to do so, subject to the following conditions:
9 //
10 // The above copyright notice and this permission notice shall be included in
11 // all copies or substantial portions of the Software.
12 //
13 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19 // THE SOFTWARE.
20 #ifndef bempp_concrete_grid_view_hpp
21 #define bempp_concrete_grid_view_hpp
22 
23 #include "../common/common.hpp"
24 
25 #include "grid_view.hpp"
26 #include "concrete_element_mapper.hpp"
27 #include "concrete_entity.hpp"
28 #include "concrete_index_set.hpp"
29 #include "concrete_range_entity_iterator.hpp"
30 #include "concrete_vtk_writer.hpp"
31 #include "geometry_type.hpp"
32 #include "reverse_element_mapper.hpp"
33 
34 namespace Bempp
35 {
36 
37 class DomainIndex;
38 
41 template<typename DuneGridView>
43 {
44 private:
45  DuneGridView m_dune_gv;
47  ConcreteElementMapper<DuneGridView> m_element_mapper;
48  const DomainIndex& m_domain_index;
49  mutable ReverseElementMapper m_reverse_element_mapper;
50  mutable bool m_reverse_element_mapper_is_up_to_date;
51 
52 public:
54  explicit ConcreteGridView(const DuneGridView& dune_gv,
55  const DomainIndex& domain_index) :
56  m_dune_gv(dune_gv), m_index_set(&dune_gv.indexSet()),
57  m_element_mapper(dune_gv), m_reverse_element_mapper(*this),
58  m_reverse_element_mapper_is_up_to_date(false),
59  m_domain_index(domain_index)
60  {
61  }
62 
64  const DuneGridView& duneGridView() const {
65  return m_dune_gv;
66  }
67 
69  DuneGridView& duneGridView() {
70  return m_dune_gv;
71  }
72 
73  virtual int dimWorld() const {
74  return DuneGridView::dimensionworld;
75  }
76 
77  virtual int dim() const {
78  return DuneGridView::dimension;
79  }
80 
81  virtual const IndexSet& indexSet() const {
82  return m_index_set;
83  }
84 
85  virtual const Mapper& elementMapper() const {
86  return m_element_mapper;
87  }
88 
89  virtual size_t entityCount(int codim) const {
90  return m_dune_gv.size(codim);
91  }
92 
93  virtual size_t entityCount(const GeometryType &type) const {
94  return m_dune_gv.size(type);
95  }
96 
97  virtual bool containsEntity(const Entity<0>& e) const {
98  return containsEntityCodimN(e);
99  }
100  virtual bool containsEntity(const Entity<1>& e) const {
101  return containsEntityCodimN(e);
102  }
103  virtual bool containsEntity(const Entity<2>& e) const {
104  return containsEntityCodimN(e);
105  }
106  virtual bool containsEntity(const Entity<3>& e) const {
107  return containsEntityCodimN(e);
108  }
109 
111  if (!m_reverse_element_mapper_is_up_to_date)
112  {
113  m_reverse_element_mapper.update();
114  m_reverse_element_mapper_is_up_to_date = true;
115  }
116  return m_reverse_element_mapper;
117  }
118 
119  virtual std::auto_ptr<VtkWriter> vtkWriter(Dune::VTK::DataMode dm=Dune::VTK::conforming) const {
120  return std::auto_ptr<VtkWriter>(new ConcreteVtkWriter<DuneGridView>(m_dune_gv, dm));
121  }
122 
123 private:
124  virtual std::auto_ptr<EntityIterator<0> > entityCodim0Iterator() const {
125  return entityCodimNIterator<0>();
126  }
127  virtual std::auto_ptr<EntityIterator<1> > entityCodim1Iterator() const {
128  return entityCodimNIterator<1>();
129  }
130  virtual std::auto_ptr<EntityIterator<2> > entityCodim2Iterator() const {
131  return entityCodimNIterator<2>();
132  }
133  virtual std::auto_ptr<EntityIterator<3> > entityCodim3Iterator() const {
134  return entityCodimNIterator<3>();
135  }
136 
137  template <int codim>
138  typename boost::disable_if_c<codim <= DuneGridView::dimension, bool>::type
139  containsEntityCodimN(const Entity<codim>& e) const {
140  throw std::logic_error("GridView::containsEntity(): invalid entity codimension");
141  }
142 
143  template <int codim>
144  typename boost::enable_if_c<codim <= DuneGridView::dimension, bool>::type
145  containsEntityCodimN(const Entity<codim>& e) const {
146  typedef typename DuneGridView::template Codim<codim>::Entity DuneEntity;
147  typedef ConcreteEntity<codim, DuneEntity> ConcEntity;
148  const ConcEntity& ce = dynamic_cast<const ConcEntity&>(e);
149  return m_dune_gv.contains(ce.duneEntity());
150  }
151 
152  template <int codim>
153  typename boost::disable_if_c<codim <= DuneGridView::dimension, std::auto_ptr<EntityIterator<codim> > >::type
154  entityCodimNIterator() const {
155  throw std::logic_error("GridView::entityIterator(): invalid entity codimension");
156  }
157 
158  template <int codim>
159  typename boost::enable_if_c<codim <= DuneGridView::dimension, std::auto_ptr<EntityIterator<codim> > >::type
160  entityCodimNIterator() const {
161  typedef typename DuneGridView::template Codim<codim>::Iterator DuneIterator;
162  typedef typename DuneGridView::template Codim<codim>::EntityPointer DuneEntityPointer;
163  typedef ConcreteRangeEntityIterator<DuneIterator, DuneEntityPointer> ConcIterator;
164  typedef typename DuneGridView::Grid::LevelGridView DuneLevelGridView;
165 
166  return std::auto_ptr<EntityIterator<codim> >(
167  new ConcIterator(m_dune_gv.template begin<codim>(),
168  m_dune_gv.template end<codim>(),
169  m_domain_index));
170  }
171 
172  virtual void getRawElementDataDoubleImpl(arma::Mat<double>& vertices,
173  arma::Mat<int>& elementCorners,
174  arma::Mat<char>& auxData,
175  std::vector<int>* domainIndices) const;
176  virtual void getRawElementDataFloatImpl(arma::Mat<float>& vertices,
177  arma::Mat<int>& elementCorners,
178  arma::Mat<char>& auxData,
179  std::vector<int>* domainIndices) const;
180 
181  template <typename CoordinateType>
182  void getRawElementDataImpl(arma::Mat<CoordinateType>& vertices,
183  arma::Mat<int>& elementCorners,
184  arma::Mat<char>& auxData,
185  std::vector<int>* domainIndices) const;
186 };
187 
188 } // namespace Bempp
189 
190 #include "concrete_grid_view_imp.hpp"
191 
192 #endif
DuneGridView & duneGridView()
Access to the underlying Dune grid view object. Use at your own risk!
Definition: concrete_grid_view.hpp:69
virtual std::auto_ptr< EntityIterator< 0 > > entityCodim0Iterator() const
Iterator over entities of codimension 0 contained in this view.
Definition: concrete_grid_view.hpp:124
Abstract wrapper of an entity of codimension codim.
Definition: entity.hpp:46
Dune::GeometryType GeometryType
Identifier of geometry type.
Definition: geometry_type.hpp:34
virtual std::auto_ptr< EntityIterator< 1 > > entityCodim1Iterator() const
Iterator over entities of codimension 1 contained in this view.
Definition: concrete_grid_view.hpp:127
Wrapper of a Dune VTK writer for a grid view of type DuneGridView.
Definition: concrete_vtk_writer.hpp:43
virtual std::auto_ptr< EntityIterator< 2 > > entityCodim2Iterator() const
Iterator over entities of codimension 2 contained in this view.
Definition: concrete_grid_view.hpp:130
ConcreteGridView(const DuneGridView &dune_gv, const DomainIndex &domain_index)
Constructor.
Definition: concrete_grid_view.hpp:54
Abstract wrapper of an index set.
Definition: index_set.hpp:36
virtual bool containsEntity(const Entity< 2 > &e) const
True if the entity e of codimension 2 is contained in this grid view.
Definition: concrete_grid_view.hpp:103
virtual bool containsEntity(const Entity< 1 > &e) const
True if the entity e of codimension 1 is contained in this grid view.
Definition: concrete_grid_view.hpp:100
virtual std::auto_ptr< EntityIterator< 3 > > entityCodim3Iterator() const
Iterator over entities of codimension 3 contained in this view.
Definition: concrete_grid_view.hpp:133
virtual bool containsEntity(const Entity< 0 > &e) const
True if the entity e of codimension 0 is contained in this grid view.
Definition: concrete_grid_view.hpp:97
Wrapper of a Dune grid view of type DuneGridView.
Definition: concrete_grid_view.hpp:42
Mapping from codim-0 entity indices to entity pointers.
Definition: reverse_element_mapper.hpp:37
An injective mapping from the full set of codimension-0 entities (&quot;elements&quot;) of a grid to the intege...
Definition: concrete_element_mapper.hpp:37
const DuneGridView & duneGridView() const
Read-only access to the underlying Dune grid view object.
Definition: concrete_grid_view.hpp:64
Abstract wrapper of a grid view.
Definition: grid_view.hpp:48
virtual const ReverseElementMapper & reverseElementMapper() const
Mapping from codim-0 entity index to entity pointer.
Definition: concrete_grid_view.hpp:110
virtual bool containsEntity(const Entity< 3 > &e) const
True if the entity e of codimension 3 is contained in this grid view.
Definition: concrete_grid_view.hpp:106
virtual std::auto_ptr< VtkWriter > vtkWriter(Dune::VTK::DataMode dm=Dune::VTK::conforming) const
Create a VtkWriter for this grid view.
Definition: concrete_grid_view.hpp:119
virtual const IndexSet & indexSet() const
The index set.
Definition: concrete_grid_view.hpp:81
Definition: domain_index.hpp:32
virtual const Mapper & elementMapper() const
The element mapper.
Definition: concrete_grid_view.hpp:85
virtual size_t entityCount(const GeometryType &type) const
Number of entities with geometry type type.
Definition: concrete_grid_view.hpp:93
virtual size_t entityCount(int codim) const
Number of entities with codimension codim.
Definition: concrete_grid_view.hpp:89
Wrapper of the index set specific to a Dune grid view class DuneGridView.
Definition: concrete_index_set.hpp:45
virtual int dimWorld() const
Dimension of the space containing the grid.
Definition: concrete_grid_view.hpp:73
virtual int dim() const
Dimension of the grid.
Definition: concrete_grid_view.hpp:77
Abstract wrapper of an entity of codimension 0.
Definition: entity.hpp:81
Abstract mapper class.
Definition: mapper.hpp:39