dune-fem  2.8-git
entitysearch.hh
Go to the documentation of this file.
1 #ifndef DUNE_FEM_GRIDPART_ENTITYSEARCH_HH
2 #define DUNE_FEM_GRIDPART_ENTITYSEARCH_HH
3 
4 #include <type_traits>
5 
6 #include <dune/geometry/referenceelements.hh>
7 
8 #include <dune/grid/common/gridenums.hh>
9 #include <dune/grid/common/exceptions.hh>
10 #include <dune/grid/utility/hierarchicsearch.hh>
11 
13 
14 namespace Dune
15 {
16 
17  namespace Fem
18  {
19 
20  // DefaultEntitySearch
21  // -------------------
22 
23  template< class GridPart, int codim, PartitionIteratorType partition >
25  {
27 
28  static const int dimension = GridPart::dimension;
29  static const int dimensionworld = GridPart::dimensionworld;
30  static const int codimension = codim;
31  static const int mydimension = dimension - codimension;
32 
33  typedef typename GridPart::template Codim< codimension >::GeometryType GeometryType;
34  typedef typename GridPart::template Codim< codimension >::template Partition< partition >::IteratorType IteratorType;
35 
36  typedef typename GeometryType::ctype ctype;
37  typedef typename GeometryType::LocalCoordinate LocalCoordinateType;
38 
39  public:
40  typedef GridPart GridPartType;
41 
42  typedef typename GridPart::template Codim< codimension >::EntityType EntityType;
43 
44  typedef typename GeometryType::GlobalCoordinate GlobalCoordinateType;
45 
46  explicit DefaultEntitySearch ( const GridPartType &gridPart )
47  : gridPart_( gridPart )
48  {}
49 
51  {
52  const auto end = gridPart_.template end< codimension, partition >();
53  for( auto it = gridPart_.template begin< codimension, partition >(); it != end; ++it )
54  {
55  const auto& entity = *it;
56  const auto geo = entity.geometry();
57  const auto z = geo.local( x );
58  if( (mydimension < dimensionworld) && ((geo.global( z ) - x).two_norm() > 1e-8 ) )
59  continue;
60 
61  if( referenceElement<ctype,mydimension>( geo.type() ).checkInside( z ) )
62  return entity;
63  }
64  DUNE_THROW( GridError, "Coordinate " << x << " is outside the grid." );
65  }
66 
67  private:
68  const GridPartType &gridPart_;
69  };
70 
71 
72 
73  // GridEntitySearch
74  // ----------------
75 
76  template< class GridPart, int codim, PartitionIteratorType partition >
78  : public DefaultEntitySearch< GridPart, codim, partition >
79  {
82 
83  public:
85 
86  explicit GridEntitySearch ( const GridPartType &gridPart )
87  : BaseType( gridPart )
88  {}
89  };
90 
91  template< class GridPart, PartitionIteratorType partition >
92  class GridEntitySearch< GridPart, 0, partition >
93  {
95 
96  static const int dimension = GridPart::dimension;
97  static const int dimensionworld = GridPart::dimensionworld;
98  static const int codimension = 0;
99  static const int mydimension = dimension - codimension;
100 
101  typedef typename GridPart::template Codim< codimension >::GeometryType GeometryType;
102 
103  public:
104  typedef GridPart GridPartType;
105 
106  typedef typename GridPart::template Codim< codimension >::EntityType EntityType;
107 
108  typedef typename GeometryType::GlobalCoordinate GlobalCoordinateType;
109 
110  explicit GridEntitySearch ( const GridPartType &gridPart )
111  : hierarchicSearch_( gridPart.grid(), gridPart.indexSet() )
112  {}
113 
115  {
116  return hierarchicSearch_.template findEntity< partition >( x );
117  }
118 
119  private:
120  Dune::HierarchicSearch< typename GridPartType::GridType, typename GridPartType::IndexSetType > hierarchicSearch_;
121  };
122 
123 
124 
125  // EntitySearch
126  // ------------
127 
128  template< class GridPart, int codim = 0, PartitionIteratorType partition = All_Partition >
130  : public std::conditional< GridPartCapabilities::hasGrid< GridPart >::v, GridEntitySearch< GridPart, codim, partition >, DefaultEntitySearch< GridPart, codim, partition > >::type
131  {
133  typedef typename std::conditional< GridPartCapabilities::hasGrid< GridPart >::v, GridEntitySearch< GridPart, codim, partition >, DefaultEntitySearch< GridPart, codim, partition > >::type BaseType;
134 
135  public:
136  typedef typename BaseType::GridPartType GridPartType;
137 
138  explicit EntitySearch ( const GridPartType &gridPart )
139  : BaseType( gridPart )
140  {}
141  };
142 
143  } // namespace Fem
144 
145 } // namespace Dune
146 
147 #endif // #ifndef DUNE_FEM_GRIDPART_ENTITYSEARCH_HH
Definition: bindguard.hh:11
Definition: entitysearch.hh:25
EntityType operator()(const GlobalCoordinateType &x) const
Definition: entitysearch.hh:50
GeometryType::GlobalCoordinate GlobalCoordinateType
Definition: entitysearch.hh:44
GridPart GridPartType
Definition: entitysearch.hh:40
GridPart::template Codim< codimension >::EntityType EntityType
Definition: entitysearch.hh:42
DefaultEntitySearch(const GridPartType &gridPart)
Definition: entitysearch.hh:46
Definition: entitysearch.hh:79
GridEntitySearch(const GridPartType &gridPart)
Definition: entitysearch.hh:86
BaseType::GridPartType GridPartType
Definition: entitysearch.hh:84
GeometryType::GlobalCoordinate GlobalCoordinateType
Definition: entitysearch.hh:108
GridEntitySearch(const GridPartType &gridPart)
Definition: entitysearch.hh:110
GridPart::template Codim< codimension >::EntityType EntityType
Definition: entitysearch.hh:106
GridPart GridPartType
Definition: entitysearch.hh:104
Definition: entitysearch.hh:131
EntitySearch(const GridPartType &gridPart)
Definition: entitysearch.hh:138
BaseType::GridPartType GridPartType
Definition: entitysearch.hh:136