dune-fem  2.8-git
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 
15 namespace 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 
35 
37  : gridPart_( gridPart ),
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
GridPartType::template Codim< 0 >::EntityType EntityType
Definition: uniquefacetorientation.hh:28
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
unsigned int operator()(const EntityType &entity) const
Definition: uniquefacetorientation.hh:44
GlobalKeyType globallyUniqueIndex(const Entity &entity) const
Definition: uniquefacetorientation.hh:62
int sequence_
Definition: uniquefacetorientation.hh:75
ParallelMapperType ::GlobalKeyType GlobalKeyType
Definition: uniquefacetorientation.hh:34
SpaceType space_
Definition: uniquefacetorientation.hh:73
const GridPartType & gridPart() const
Definition: uniquefacetorientation.hh:69
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
CartesianUniqueFacetOrientation(const GridPartType &gridPart)
Definition: uniquefacetorientation.hh:89
const GridPartType & gridPart() const
Definition: uniquefacetorientation.hh:98
void mapEach(const ElementType &element, Functor f) const
Definition: parallel.hh:112
void update()
Definition: parallel.hh:173