dune-fem 2.8.0
Loading...
Searching...
No Matches
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
14namespace 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
GridPart::template Codim< codimension >::EntityType EntityType
Definition: entitysearch.hh:42
GeometryType::GlobalCoordinate GlobalCoordinateType
Definition: entitysearch.hh:44
GridPart GridPartType
Definition: entitysearch.hh:40
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 GridPartType
Definition: entitysearch.hh:104
GridPart::template Codim< codimension >::EntityType EntityType
Definition: entitysearch.hh:106
Definition: entitysearch.hh:131
EntitySearch(const GridPartType &gridPart)
Definition: entitysearch.hh:138
BaseType::GridPartType GridPartType
Definition: entitysearch.hh:136