1#ifndef DUNE_FEM_SPACE_COMMON_UNIQUEFACETORIENTATION_HH
2#define DUNE_FEM_SPACE_COMMON_UNIQUEFACETORIENTATION_HH
7#include <dune/grid/common/rangegenerators.hh>
9#include <dune/fem/common/utility.hh>
10#include <dune/fem/gridpart/common/capabilities.hh>
11#include <dune/fem/space/common/functionspace.hh>
12#include <dune/fem/space/common/dofmanager.hh>
13#include <dune/fem/space/finitevolume.hh>
14#include <dune/fem/space/mapper/parallel.hh>
25 template<
class Gr
idPart >
26 struct DefaultUniqueFacetOrientation
28 typedef GridPart GridPartType;
29 typedef typename GridPartType::GridType GridType;
30 typedef DofManager< GridType > DofManagerType;
32 typedef typename GridPartType::template Codim< 0 >::EntityType EntityType;
33 typedef typename EntityType::Geometry::GlobalCoordinate GlobalCoordinateType;
41 static const int dimensionworld = GridPartType::dimensionworld;
43 explicit DefaultUniqueFacetOrientation (
const GridPartType &gridPart )
44 : gridPart_( gridPart ),
45 dofManager_( DofManagerType::instance( gridPart_.grid() ) ),
46 uniqueDirection_( M_PI ),
49 if constexpr ( dimensionworld > 1 )
50 uniqueDirection_[ 1 ] = M_LN2;
51 if constexpr ( dimensionworld > 2 )
52 uniqueDirection_[ 2 ] = M_E;
57 if( sequence_ != dofManager_.sequence() )
59 orientations_.resize( gridPart().indexSet().
size(0) );
60 const auto& indexSet = gridPart().indexSet();
63 unsigned int orientations = 0;
64 for(
auto intersection : intersections( gridPart(), entity ) )
66 if( intersection.neighbor() )
69 assert( std::abs(intersection.centerUnitOuterNormal() * uniqueDirection_) > 0 );
71 if( (intersection.centerUnitOuterNormal() * uniqueDirection_) > 0 )
73 orientations |= (1 << intersection.indexInInside());
77 orientations_[ indexSet.index( entity ) ] = orientations;
79 sequence_ = dofManager_.sequence();
83 unsigned int operator() (
const EntityType &entity )
const
86 return orientations_[ gridPart().indexSet().index( entity ) ];
111 const GridPartType &gridPart ()
const {
return gridPart_; }
114 const GridPartType& gridPart_;
115 const DofManagerType& dofManager_;
116 GlobalCoordinateType uniqueDirection_;
117 mutable std::vector< unsigned int > orientations_;
120 mutable int sequence_;
128 template<
class Gr
idPart >
129 struct CartesianUniqueFacetOrientation
131 typedef GridPart GridPartType;
132 typedef typename GridPart::template Codim< 0 >::EntityType EntityType;
134 explicit CartesianUniqueFacetOrientation (
const GridPartType &gridPart )
135 : gridPart_( gridPart )
138 unsigned int operator() (
const EntityType &entity )
const
140 return orientations( std::make_index_sequence< GridPartType::dimension >() );
143 const GridPartType &gridPart ()
const {
return gridPart_; }
146 template< std::size_t... i >
147 static constexpr unsigned int orientations ( std::index_sequence< i... > )
149 return Std::sum( (1u << 2*i)... );
152 const GridPartType &gridPart_;
161 using UniqueFacetOrientation =
162 typename std::conditional< GridPartCapabilities::isCartesian< GP >::v,
163 CartesianUniqueFacetOrientation< GP>,
164 DefaultUniqueFacetOrientation< GP > >::type;
constexpr All all
PartitionSet for all partitions.
Definition: partitionset.hh:295
Dune namespace
Definition: alignedallocator.hh:13
constexpr std::integral_constant< std::size_t, sizeof...(II)> size(std::integer_sequence< T, II... >)
Return the size of the sequence.
Definition: integersequence.hh:75