1#ifndef DUNE_SPGRID_PARTITION_HH
2#define DUNE_SPGRID_PARTITION_HH
7#include <dune/common/iostream.hh>
9#include <dune/grid/spgrid/direction.hh>
10#include <dune/grid/spgrid/multiindex.hh>
11#include <dune/grid/spgrid/mesh.hh>
12#include <dune/grid/spgrid/normal.hh>
21 class SPBasicPartition
23 typedef SPBasicPartition< dim > This;
26 static const int dimension = dim;
30 typedef SPDirection< dimension > Direction;
32 SPBasicPartition (
const MultiIndex &begin,
const MultiIndex &end ) : bound_{{ begin, end }} {}
34 const MultiIndex &begin ()
const {
return bound( 0 ); }
35 const MultiIndex &end ()
const {
return bound( 1 ); }
37 const MultiIndex &bound (
unsigned int b )
const { assert( b == (b & 1) );
return bound_[ b ]; }
39 int bound (
unsigned int b,
int i,
unsigned int d )
const
41 assert( d == (d & 1) );
42 return bound( b )[ i ] - (2*b-1) * ((bound( b )[ i ] ^ d) & 1);
45 int bound (
const SPNormalId< dimension > &
id )
const {
return bound(
id.face() & 1 )[
id.axis() ]; }
47 This intersect (
const This &other )
const
49 return This( std::max( begin(), other.begin() ), std::min( end(), other.end() ) );
52 bool contains (
const MultiIndex &
id )
const;
55 bool empty ( Direction dir )
const;
58 MultiIndex width ()
const;
59 int width (
int i )
const {
return std::max( (end()[ i ]+1)/2 - begin()[ i ]/2, 0 ); }
61 template<
class char_type,
class traits >
62 void print ( std::basic_ostream< char_type, traits > &out )
const;
64 template<
class char_type,
class traits >
65 void print ( std::basic_ostream< char_type, traits > &out,
const int i )
const;
68 std::array< MultiIndex, 2 > bound_;
78 :
public SPBasicPartition< dim >
80 typedef SPPartition< dim > This;
81 typedef SPBasicPartition< dim > Base;
83 typedef unsigned int Flags;
86 static const int dimension = dim;
88 typedef typename Base::MultiIndex MultiIndex;
89 typedef SPMesh< dimension > Mesh;
91 SPPartition (
const Base &base,
const unsigned int number );
92 SPPartition (
const MultiIndex &begin,
const MultiIndex &end,
93 const unsigned int number );
94 SPPartition (
const MultiIndex &begin,
const MultiIndex &end,
95 const Mesh &globalMesh,
const unsigned int number );
97 unsigned int number ()
const;
98 const unsigned int &neighbor (
const int face )
const;
99 unsigned int &neighbor (
const int face );
101 bool hasNeighbor (
const int face )
const;
102 Flags boundary ()
const;
103 bool boundary (
const int face )
const;
106 unsigned int number_;
107 unsigned int neighbor_[ 2*dimension ];
117 inline bool SPBasicPartition< dim >::contains (
const MultiIndex &
id )
const
119 bool contains =
true;
120 for(
int i = 0; i < dimension; ++i )
121 contains &= (
id[ i ] >= begin()[ i ]) && (
id[ i ] <= end()[ i ]);
127 inline bool SPBasicPartition< dim >::empty ()
const
130 for(
int i = 0; i < dimension; ++i )
131 empty |= (begin()[ i ] > end()[ i ]);
137 inline bool SPBasicPartition< dim >::empty ( Direction dir )
const
140 for(
int i = 0; i < dimension; ++i )
141 empty |= (bound( 0, i, dir[ i ] ) > bound( 1, i, dir[ i ] ));
147 inline int SPBasicPartition< dim >::volume ()
const
150 for(
int i = 0; i < dimension; ++i )
151 volume *= width( i );
157 inline typename SPBasicPartition< dim >::MultiIndex
158 SPBasicPartition< dim >::width ()
const
161 for(
int i = 0; i < dimension; ++i )
168 template<
class char_type,
class traits >
169 inline void SPBasicPartition< dim >
170 ::print ( std::basic_ostream< char_type, traits > &out )
const
173 for(
int i = 1; i < dimension; ++i )
182 template<
class char_type,
class traits >
183 inline void SPBasicPartition< dim >
184 ::print ( std::basic_ostream< char_type, traits > &out,
const int i )
const
186 const int b = begin()[ i ];
187 const int e= end()[ i ];
189 const char left =
'[' + (b & 1)*(
']'-
'[');
190 const char right =
']' + (e & 1)*(
'['-
']');
192 out << left <<
' ' << (b/2) <<
", " << ((e+1)/2) <<
' ' << right;
201 SPPartition< dim >::SPPartition (
const Base &base,
const unsigned int number )
204 boundary_( ((Flags( 1 ) << (2*dimension-1))-1) | (Flags( 1 ) << (2*dimension-1)) )
206 for(
int face = 0; face < 2*dimension; ++face )
213 ::SPPartition (
const MultiIndex &begin,
const MultiIndex &end,
214 const unsigned int number )
215 : Base( begin, end ),
217 boundary_( ((Flags( 1 ) << (2*dimension-1))-1) | (Flags( 1 ) << (2*dimension-1)) )
219 for(
int face = 0; face < 2*dimension; ++face )
226 ::SPPartition (
const MultiIndex &begin,
const MultiIndex &end,
227 const Mesh &globalMesh,
const unsigned int number )
228 : Base( begin, end ),
232 for(
int i = 0; i < dimension; ++i )
235 boundary_ |= Flags( begin[ i ] == 2*globalMesh.begin()[ i ] ) << (2*i);
236 boundary_ |= Flags( end[ i ] == 2*globalMesh.end()[ i ] ) << (2*i+1);
242 inline unsigned int SPPartition< dim >::number ()
const
249 inline const unsigned int &
250 SPPartition< dim >::neighbor (
const int face )
const
252 assert( (face >= 0) && (face < 2*dimension) );
253 return neighbor_[ face ];
258 inline unsigned int &
259 SPPartition< dim >::neighbor (
const int face )
261 assert( (face >= 0) && (face < 2*dimension) );
262 return neighbor_[ face ];
267 inline bool SPPartition< dim >::hasNeighbor (
const int face )
const
274 inline typename SPPartition< dim >::Flags
275 SPPartition< dim >::boundary ()
const
282 inline bool SPPartition< dim >::boundary (
const int face )
const
284 assert( (face >= 0) && (face < 2*dimension) );
285 return bool( (boundary_ >> face) & 1 );
293 template<
class char_type,
class traits,
int dim >
294 inline std::basic_ostream< char_type, traits > &
295 operator<< ( std::basic_ostream< char_type, traits > &out,
296 const SPBasicPartition< dim > &partition )
298 partition.print( out );
std::ostream & operator<<(std::ostream &s, const DenseVector< V > &v)
Write a DenseVector to an output stream.
Definition: densevector.hh:749
auto max(ADLTag< 0 >, const V &v1, const V &v2)
implements binary Simd::max()
Definition: defaults.hh:81
Dune namespace.
Definition: alignedallocator.hh:13