dune-fem 2.8.0
Loading...
Searching...
No Matches
uniquefacetorientation.hh
Go to the documentation of this file.
1#ifndef DUNE_FEM_SPACE_COMMON_UNIQUEFACETORIENTATION_HH
2#define DUNE_FEM_SPACE_COMMON_UNIQUEFACETORIENTATION_HH
3
4#include <type_traits>
5#include <utility>
6
7#include <dune/grid/common/rangegenerators.hh>
8
14
15namespace Dune
16{
17
18 namespace Fem
19 {
20
21 // DefaultUniqueFacetOrientation
22 // -----------------------------
23
24 template< class GridPart >
26 {
27 typedef GridPart GridPartType;
28 typedef typename GridPartType::template Codim< 0 >::EntityType EntityType;
29
32
34 typedef typename ParallelMapperType :: GlobalKeyType GlobalKeyType;
35
38 space_( const_cast< GridPartType& > (gridPart_) ),
39 parallelMapper_( gridPart_, space_.blockMapper() ),
40 sequence_( -1 )
41 {
42 }
43
44 unsigned int operator() ( const EntityType &entity ) const
45 {
46 if( sequence_ != space_.sequence() )
47 {
50 }
51
52 unsigned int orientations = 0;
53 for( auto intersection : intersections( gridPart(), entity ) )
54 {
55 if( intersection.neighbor() && (globallyUniqueIndex( entity ) < globallyUniqueIndex( intersection.outside() )) )
56 orientations |= (1 << intersection.indexInInside());
57 }
58 return orientations;
59 }
60
61 template <class Entity>
62 GlobalKeyType globallyUniqueIndex( const Entity& entity ) const
63 {
64 GlobalKeyType index = -1;
65 parallelMapper_.mapEach( entity, [ &index ] ( auto local, auto global ) { assert( local == 0 ); index = global; } );
66 return index;
67 }
68
69 const GridPartType &gridPart () const { return gridPart_; }
70
71 protected:
75 mutable int sequence_;
76 };
77
78
79
80 // CartesianUniqueFacetOrientation
81 // -------------------------------
82
83 template< class GridPart >
85 {
86 typedef GridPart GridPartType;
87 typedef typename GridPart::template Codim< 0 >::EntityType EntityType;
88
90 : gridPart_( gridPart )
91 {}
92
93 unsigned int operator() ( const EntityType &entity ) const
94 {
95 return orientations( std::make_index_sequence< GridPartType::dimension >() );
96 }
97
98 const GridPartType &gridPart () const { return gridPart_; }
99
100 private:
101 template< std::size_t... i >
102 static constexpr unsigned int orientations ( std::index_sequence< i... > )
103 {
104 return Std::sum( (1u << 2*i)... );
105 }
106
107 const GridPartType &gridPart_;
108 };
109
110
111
112 // UniqueFacetOrientation
113 // ----------------------
114
115 template< class GridPart >
117 typename std::conditional< GridPartCapabilities::isCartesian< GridPart >::v,
120
121 } // namespace Fem
122
123} // namespace Dune
124
125#endif // #ifndef DUNE_FEM_SPACE_COMMON_UNIQUEFACETORIENTATION_HH
Definition: bindguard.hh:11
typename std::conditional< GridPartCapabilities::isCartesian< GridPart >::v, CartesianUniqueFacetOrientation< GridPart >, DefaultUniqueFacetOrientation< GridPart > >::type UniqueFacetOrientation
Definition: uniquefacetorientation.hh:119
static constexpr std::decay_t< T > sum(T a)
Definition: utility.hh:33
int sequence() const
get index of the sequence in grid sequences
Definition: discretefunctionspace.hh:718
A vector valued function space.
Definition: functionspace.hh:60
Definition: uniquefacetorientation.hh:26
const GridPartType & gridPart_
Definition: uniquefacetorientation.hh:72
FiniteVolumeSpace< FunctionSpaceType, GridPartType, 0, SimpleStorage > SpaceType
Definition: uniquefacetorientation.hh:31
FunctionSpace< double, int, GridPartType::dimensionworld, 1 > FunctionSpaceType
Definition: uniquefacetorientation.hh:30
DefaultUniqueFacetOrientation(const GridPartType &gridPart)
Definition: uniquefacetorientation.hh:36
const GridPartType & gridPart() const
Definition: uniquefacetorientation.hh:69
unsigned int operator()(const EntityType &entity) const
Definition: uniquefacetorientation.hh:44
GlobalKeyType globallyUniqueIndex(const Entity &entity) const
Definition: uniquefacetorientation.hh:62
GridPartType::template Codim< 0 >::EntityType EntityType
Definition: uniquefacetorientation.hh:28
int sequence_
Definition: uniquefacetorientation.hh:75
SpaceType space_
Definition: uniquefacetorientation.hh:73
ParallelMapperType::GlobalKeyType GlobalKeyType
Definition: uniquefacetorientation.hh:34
ParallelDofMapper< GridPartType, typename SpaceType::BlockMapperType > ParallelMapperType
Definition: uniquefacetorientation.hh:33
GridPart GridPartType
Definition: uniquefacetorientation.hh:27
ParallelMapperType parallelMapper_
Definition: uniquefacetorientation.hh:74
Definition: uniquefacetorientation.hh:85
unsigned int operator()(const EntityType &entity) const
Definition: uniquefacetorientation.hh:93
GridPart GridPartType
Definition: uniquefacetorientation.hh:86
GridPart::template Codim< 0 >::EntityType EntityType
Definition: uniquefacetorientation.hh:87
const GridPartType & gridPart() const
Definition: uniquefacetorientation.hh:98
CartesianUniqueFacetOrientation(const GridPartType &gridPart)
Definition: uniquefacetorientation.hh:89
void mapEach(const ElementType &element, Functor f) const
Definition: parallel.hh:112
void update()
Definition: parallel.hh:173