1#ifndef DUNE_SPGRID_MESH_HH
2#define DUNE_SPGRID_MESH_HH
7#include <dune/common/iostream.hh>
9#include <dune/grid/spgrid/multiindex.hh>
10#include <dune/grid/spgrid/refinement.hh>
11#include <dune/grid/spgrid/normal.hh>
22 typedef SPMesh< dim > This;
25 static const int dimension = dim;
29 explicit SPMesh (
const MultiIndex &width );
31 SPMesh (
const MultiIndex &begin,
const MultiIndex &end );
33 const This &operator+= (
const MultiIndex &shift );
34 const This &operator-= (
const MultiIndex &shift );
36 const MultiIndex &begin ()
const {
return bound( 0 ); }
37 const MultiIndex &end ()
const {
return bound( 1 ); }
39 const MultiIndex &bound (
int b )
const { assert( (b == 0) || (b == 1) );
return bound_[ b ]; }
41 int bound (
const SPNormalId< dimension > &
id )
const {
return bound(
id.face() & 1 )[
id.axis() ]; }
45 template<
class Refinement >
46 typename std::enable_if< Refinement::dimension == dim, SPMesh< dim > >::type
47 refine (
const Refinement &refinement )
const;
49 This grow (
int size )
const;
50 This grow (
const MultiIndex &size )
const;
52 This intersect (
const This &other )
const;
54 std::pair< This, This > split (
const int dir,
const int leftWeight,
const int rightWeight )
const;
58 MultiIndex width ()
const;
59 int width (
const int i )
const;
61 static This unitMesh ();
64 std::array< MultiIndex, 2 > bound_;
73 SPMesh< dim >::SPMesh (
const MultiIndex &width )
75 bound_[ 0 ] = MultiIndex::zero();
81 SPMesh< dim >::SPMesh (
const MultiIndex &begin,
const MultiIndex &end )
89 inline const typename SPMesh< dim >::This &
90 SPMesh< dim >::operator+= (
const MultiIndex &shift )
92 for(
int b = 0; b < 2; ++b )
99 inline const typename SPMesh< dim >::This &
100 SPMesh< dim >::operator-= (
const MultiIndex &shift )
102 for(
int b = 0; b < 2; ++b )
103 bound_[ b ] -= shift;
109 inline bool SPMesh< dim >::empty ()
const
112 for(
int i = 0; i < dimension; ++i )
113 empty |= (end()[ i ] < begin()[ i ]);
119 template<
class Refinement >
120 inline typename std::enable_if< Refinement::dimension == dim, SPMesh< dim > >::type
121 SPMesh< dim >::refine (
const Refinement &refinement )
const
123 MultiIndex childBegin, childEnd;
124 for(
int i = 0; i < dimension; ++i )
126 const int factor = refinement.factor( i );
127 childBegin[ i ] = factor * begin()[ i ];
128 childEnd[ i ] = factor * end()[ i ];
130 return This( childBegin, childEnd );
135 inline typename SPMesh< dim >::This SPMesh< dim >::grow (
int size )
const
137 MultiIndex begin, end;
138 for(
int i = 0; i < dim; ++i )
140 begin[ i ] = begin()[ i ] - size;
141 end[ i ] = end()[ i ] + size;
143 return This( begin, end );
148 inline typename SPMesh< dim >::This
149 SPMesh< dim >::grow (
const MultiIndex &size )
const
151 return This( begin() - size, end() + size );
156 inline typename SPMesh< dim >::This
157 SPMesh< dim >::intersect (
const This &other )
const
159 return This( std::max( begin(), other.begin() ), std::min( end(), other.end() ) );
164 inline std::pair< typename SPMesh< dim >::This,
typename SPMesh< dim >::This >
165 SPMesh< dim >::split (
const int dir,
const int leftFraction,
const int rightFraction )
const
167 const MultiIndex &lbegin = begin();
168 const MultiIndex &rend = end();
170 assert( (dir >= 0) && (dir < dimension) );
171 const int width = (rend[ dir ] - lbegin[ dir ]);
172 const int leftWidth = (leftFraction * width) / (leftFraction + rightFraction);
174 MultiIndex lend = rend;
175 MultiIndex rbegin = lbegin;
176 rbegin[ dir ] = lend[ dir ] = lbegin[ dir ] + leftWidth;
178 return std::make_pair( This( lbegin, lend ), This( rbegin, rend ) );
183 inline int SPMesh< dim >::volume ()
const
185 const MultiIndex &w = width();
187 for(
int i = 0; i < dimension; ++i )
194 inline typename SPMesh< dim >::MultiIndex SPMesh< dim >::width ()
const
197 for(
int i = 0; i < dimension; ++i )
204 inline int SPMesh< dim >::width (
const int i )
const
207 return end()[ i ] - begin()[ i ];
212 inline typename SPMesh< dim >::This
213 SPMesh< dim >::unitMesh ()
216 for(
int i = 0; i < dimension; ++i )
226 template<
class char_type,
class traits,
int dim >
227 inline std::basic_ostream< char_type, traits > &
228 operator<< ( std::basic_ostream< char_type, traits > &out,
const SPMesh< dim > &mesh )
230 return out <<
"[ " << mesh.begin() <<
", " << mesh.end() <<
" [";
236 operator+ (
const SPMesh< dim > &mesh,
const SPMultiIndex< dim > &shift )
238 SPMesh< dim > copy( mesh );
239 return copy += shift;
245 operator- (
const SPMesh< dim > &mesh,
const SPMultiIndex< dim > &shift )
247 SPMesh< dim > copy( mesh );
248 return copy -= shift;
Dune namespace.
Definition: alignedallocator.hh:13