1#ifndef DUNE_SPGRID_PARTITION_HH
2#define DUNE_SPGRID_PARTITION_HH
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);
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_;
83 typedef unsigned int Flags;
86 static const int dimension = dim;
93 const unsigned int number );
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 ];
119 bool contains =
true;
120 for(
int i = 0; i < dimension; ++i )
121 contains &= (
id[ i ] >= begin()[ i ]) && (
id[ i ] <= end()[ i ]);
130 for(
int i = 0; i < dimension; ++i )
131 empty |= (begin()[ i ] > end()[ i ]);
140 for(
int i = 0; i < dimension; ++i )
141 empty |= (bound( 0, i, dir[ i ] ) > bound( 1, i, dir[ i ] ));
150 for(
int i = 0; i < dimension; ++i )
151 volume *= width( i );
161 for(
int i = 0; i < dimension; ++i )
168 template<
class char_type,
class traits >
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 >
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;
204 boundary_( ((Flags( 1 ) << (2*dimension-1))-1) | (Flags( 1 ) << (2*dimension-1)) )
206 for(
int face = 0; face < 2*
dimension; ++face )
207 neighbor_[ face ] = std::numeric_limits< unsigned int >::max();
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 )
220 neighbor_[ face ] = std::numeric_limits< unsigned int >::max();
227 const Mesh &globalMesh,
const unsigned int number )
228 :
Base( begin, end ),
234 neighbor_[ 2*i ] = neighbor_[ 2*i+1 ] = std::numeric_limits< unsigned int >::max();
235 boundary_ |= Flags(
begin[ i ] == 2*globalMesh.
begin()[ i ] ) << (2*i);
236 boundary_ |= Flags(
end[ i ] == 2*globalMesh.
end()[ i ] ) << (2*i+1);
249 inline const unsigned int &
252 assert( (face >= 0) && (face < 2*dimension) );
253 return neighbor_[ face ];
258 inline unsigned int &
261 assert( (face >= 0) && (face < 2*dimension) );
262 return neighbor_[ face ];
269 return (neighbor( face ) < std::numeric_limits< unsigned int >::max());
274 inline typename SPPartition< dim >::Flags
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,
298 partition.
print( out );
Dune::SPMultiIndex< dim > min(const Dune::SPMultiIndex< dim > &a, const Dune::SPMultiIndex< dim > &b)
Definition: multiindex.hh:296
Dune::SPMultiIndex< dim > max(const Dune::SPMultiIndex< dim > &a, const Dune::SPMultiIndex< dim > &b)
Definition: multiindex.hh:307
Definition: iostream.hh:7
std::basic_ostream< char_type, traits > & operator<<(std::basic_ostream< char_type, traits > &out, const SPCube< ct, dim > &cube)
Definition: cube.hh:148
Definition: direction.hh:18
const MultiIndex & begin() const
Definition: mesh.hh:36
const MultiIndex & end() const
Definition: mesh.hh:37
Definition: partition.hh:22
SPBasicPartition(const MultiIndex &begin, const MultiIndex &end)
Definition: partition.hh:32
const MultiIndex & end() const
Definition: partition.hh:35
void print(std::basic_ostream< char_type, traits > &out) const
Definition: partition.hh:170
SPDirection< dimension > Direction
Definition: partition.hh:30
int bound(unsigned int b, int i, unsigned int d) const
Definition: partition.hh:39
SPMultiIndex< dimension > MultiIndex
Definition: partition.hh:28
const MultiIndex & bound(unsigned int b) const
Definition: partition.hh:37
int width(int i) const
Definition: partition.hh:59
This intersect(const This &other) const
Definition: partition.hh:47
const MultiIndex & begin() const
Definition: partition.hh:34
static const int dimension
Definition: partition.hh:26
int bound(const SPNormalId< dimension > &id) const
Definition: partition.hh:45
Definition: partition.hh:79
unsigned int number() const
Definition: partition.hh:242
bool hasNeighbor(const int face) const
Definition: partition.hh:267
const unsigned int & neighbor(const int face) const
Definition: partition.hh:250
SPMesh< dimension > Mesh
Definition: partition.hh:89
Flags boundary() const
Definition: partition.hh:275
static const int dimension
Definition: partition.hh:86
Base::MultiIndex MultiIndex
Definition: partition.hh:88