dune-fem  2.4.1-rc
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 <dune/common/typetraits.hh>
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 
14 
15 namespace Dune
16 {
17 
18  namespace Fem
19  {
20 
21  // DefaultEntitySearch
22  // -------------------
23 
24  template< class GridPart, int codim, PartitionIteratorType partition >
26  {
28 
29  static const int dimension = GridPart::dimension;
30  static const int dimensionworld = GridPart::dimensionworld;
31  static const int codimension = codim;
32  static const int mydimension = dimension - codimension;
33 
34  typedef typename GridPart::template Codim< codimension >::GeometryType GeometryType;
35  typedef typename GridPart::template Codim< codimension >::template Partition< partition >::IteratorType IteratorType;
36 
37  typedef typename GeometryType::ctype ctype;
38  typedef typename GeometryType::LocalCoordinate LocalCoordinateType;
39 
40  public:
41  typedef GridPart GridPartType;
42 
43  typedef typename GridPart::template Codim< codimension >::EntityType EntityType;
44 
45  typedef typename GeometryType::GlobalCoordinate GlobalCoordinateType;
46 
47  explicit DefaultEntitySearch ( const GridPartType &gridPart )
48  : gridPart_( gridPart )
49  {}
50 
51  EntityType operator() ( const GlobalCoordinateType &x ) const
52  {
53  const IteratorType end = gridPart_.template end< codimension, partition >();
54  for( IteratorType it = gridPart_.template begin< codimension, partition >(); it != end; ++it )
55  {
56  const EntityType &entity = *it;
57  const GeometryType geo = entity.geometry();
58 
59  const LocalCoordinateType &z = geo.local( x );
60  if( (mydimension < dimensionworld) && ((geo.global( z ) - x).two_norm() > 1e-8 ) )
61  continue;
62 
63  if( ReferenceElements< ctype, mydimension >::general( geo.type() ).checkInside( z ) )
64  return entity;
65  }
66  DUNE_THROW( GridError, "Coordinate " << x << " is outside the grid." );
67  }
68 
69  private:
70  const GridPartType &gridPart_;
71  };
72 
73 
74 
75  // GridEntitySearch
76  // ----------------
77 
78  template< class GridPart, int codim, PartitionIteratorType partition >
80  : public DefaultEntitySearch< GridPart, codim, partition >
81  {
84 
85  public:
87 
88  explicit GridEntitySearch ( const GridPartType &gridPart )
89  : BaseType( gridPart )
90  {}
91  };
92 
93  template< class GridPart, PartitionIteratorType partition >
94  class GridEntitySearch< GridPart, 0, partition >
95  {
97 
98  static const int dimension = GridPart::dimension;
99  static const int dimensionworld = GridPart::dimensionworld;
100  static const int codimension = 0;
101  static const int mydimension = dimension - codimension;
102 
103  typedef typename GridPart::template Codim< codimension >::GeometryType GeometryType;
104 
105  public:
106  typedef GridPart GridPartType;
107 
108  typedef typename GridPart::template Codim< codimension >::EntityType EntityType;
109 
110  typedef typename GeometryType::GlobalCoordinate GlobalCoordinateType;
111 
112  explicit GridEntitySearch ( const GridPartType &gridPart )
113  : hierarchicSearch_( gridPart.grid(), gridPart.indexSet() )
114  {}
115 
116  EntityType operator() ( const GlobalCoordinateType &x ) const
117  {
118  return make_entity( hierarchicSearch_.template findEntity< partition >( x ) );
119  }
120 
121  private:
122  Dune::HierarchicSearch< typename GridPartType::GridType, typename GridPartType::IndexSetType > hierarchicSearch_;
123  };
124 
125 
126 
127  // EntitySearch
128  // ------------
129 
130  template< class GridPart, int codim = 0, PartitionIteratorType partition = All_Partition >
132  : public conditional< GridPartCapabilities::hasGrid< GridPart >::v, GridEntitySearch< GridPart, codim, partition >, DefaultEntitySearch< GridPart, codim, partition > >::type
133  {
135  typedef typename conditional< GridPartCapabilities::hasGrid< GridPart >::v, GridEntitySearch< GridPart, codim, partition >, DefaultEntitySearch< GridPart, codim, partition > >::type BaseType;
136 
137  public:
138  typedef typename BaseType::GridPartType GridPartType;
139 
140  explicit EntitySearch ( const GridPartType &gridPart )
141  : BaseType( gridPart )
142  {}
143  };
144 
145  } // namespace Fem
146 
147 } // namespace Dune
148 
149 #endif // #ifndef DUNE_FEM_GRIDPART_ENTITYSEARCH_HH
EntityType operator()(const GlobalCoordinateType &x) const
Definition: entitysearch.hh:51
GridEntitySearch(const GridPartType &gridPart)
Definition: entitysearch.hh:88
BaseType::GridPartType GridPartType
Definition: entitysearch.hh:138
EntitySearch(const GridPartType &gridPart)
Definition: entitysearch.hh:140
GridPart::template Codim< codimension >::EntityType EntityType
Definition: entitysearch.hh:43
GridPart GridPartType
Definition: entitysearch.hh:106
GeometryType::GlobalCoordinate GlobalCoordinateType
Definition: entitysearch.hh:45
GridPart GridPartType
Definition: entitysearch.hh:41
Definition: entitysearch.hh:131
Dune::EntityPointer< Grid, Implementation >::Entity make_entity(const Dune::EntityPointer< Grid, Implementation > &entityPointer)
Definition: compatibility.hh:23
Definition: entitysearch.hh:79
Definition: coordinate.hh:4
GridEntitySearch(const GridPartType &gridPart)
Definition: entitysearch.hh:112
GridPart::template Codim< codimension >::EntityType EntityType
Definition: entitysearch.hh:108
DefaultEntitySearch(const GridPartType &gridPart)
Definition: entitysearch.hh:47
Definition: entitysearch.hh:25
GeometryType::GlobalCoordinate GlobalCoordinateType
Definition: entitysearch.hh:110
BaseType::GridPartType GridPartType
Definition: entitysearch.hh:86