1#ifndef DUNE_SPGRID_REFINEMENT_HH
2#define DUNE_SPGRID_REFINEMENT_HH
7#include <dune/common/fvector.hh>
10#include <dune/grid/common/grid.hh>
35 unsigned int factor (
const int i )
const
40 static std::string
type () {
return "isotropic"; }
42 template<
class char_type,
class traits >
43 friend std::basic_ostream< char_type, traits > &
44 operator<< ( std::basic_ostream< char_type, traits > &out,
const This &policy )
49 template<
class char_type,
class traits >
50 friend std::basic_istream< char_type, traits > &
83 return refDir_.count();
86 unsigned int factor (
const int i )
const
89 return refDir_[ i ]+1;
92 static std::string
type () {
return "anisotropic"; }
94 template<
class char_type,
class traits >
95 friend std::basic_ostream< char_type, traits > &
96 operator<< ( std::basic_ostream< char_type, traits > &out,
const This &policy )
98 return out << policy.refDir_.to_ulong();
101 template<
class char_type,
class traits >
102 friend std::basic_istream< char_type, traits > &
105 unsigned long refDir;
108 policy.refDir_ = refDir;
113 std::bitset< dimension > refDir_;
139 DUNE_THROW( GridError,
"Trying to create bisection refinement policy for invalid direction " << dir <<
"." );
144 : dir_( policy.dir_ < 0 ? (father.dir_ + 1) %
dimension : policy.dir_ )
153 unsigned int factor (
const int i )
const
156 return (i == dir_ ? 2 : 1);
159 static std::string
type () {
return "bisection"; }
161 template<
class char_type,
class traits >
162 friend std::basic_ostream< char_type, traits > &
163 operator<< ( std::basic_ostream< char_type, traits > &out,
const This &policy )
165 assert( (policy.dir_ >= 0) && (policy.dir_ <
dimension) );
166 return out << (1u << policy.dir_);
169 template<
class char_type,
class traits >
170 friend std::basic_istream< char_type, traits > &
173 unsigned long rd( 0 );
175 std::bitset< dimension > refDir( rd );
178 if( refDir.count() != 1 )
179 DUNE_THROW( GridError,
"Trying to create bisection refinement with multiple refined directions." );
180 for( policy.dir_ = 0; !refDir[ policy.dir_ ]; ++policy.dir_ )
208 DUNE_THROW( GridError,
"Trying to create arbitrary refinement policy with non-positive factor." );
218 if( factor_[ i ] <= 0 )
219 DUNE_THROW( GridError,
"Trying to create arbitrary refinement policy with non-positive factor." );
225 unsigned int factor (
int i )
const {
return factor_[ i ]; }
227 static std::string
type () {
return "arbitrary"; }
229 template<
class char_type,
class traits >
230 friend std::basic_ostream< char_type, traits > &
231 operator<< ( std::basic_ostream< char_type, traits > &out,
const This &policy )
233 return out << policy.factor_;
236 template<
class char_type,
class traits >
237 friend std::basic_istream< char_type, traits > &
240 return in >> policy.factor_;
268 static std::string
type () {
return Policy::type(); }
283 id[ i ] = (
id[ i ] /
factor( i )) | (
id[ i ] & 1);
299 const unsigned int alpha =
factor( i );
300 id[ i ] = ((
id[ i ] + (index % alpha)) * alpha) - (alpha - 1);
307 unsigned int index = 0;
310 const unsigned int alpha =
factor( i );
311 index = (index * alpha) + ((
id[ i ] >> 1) % alpha);
320 id[ i ] = (
factor( i ) * (
id[ i ] & ~1)) | (
id[ i ] & 1);
327 const unsigned int alpha =
factor( i );
328 const int step = 2*(
id[ i ] & 1);
330 if( ((
id[ i ] % (2*alpha)) & ~1) != 0 )
332 id[ i ] -= alpha*step;
342 const unsigned int alpha =
factor( i );
343 copy &= (alpha == 1) | ((
id[ i ] % (2*alpha)) == 0);
348 template<
class ctype >
351 FieldVector< ctype, dimension > h;
353 h[ i ] = ctype( 1 ) / ctype(
factor( i ) );
357 template<
class ctype >
360 FieldVector< ctype, dimension > origin;
363 const unsigned int alpha =
factor( i );
364 origin[ i ] = ctype( index % alpha ) / ctype( alpha );
412 const unsigned int alpha =
factor( i );
413 id[ i ] = alpha*
id[ i ] - (alpha / 2)*(
id[ i ] & 1);
423 id[ i ] ^= 2*(
id[ i ] & 1);
424 if( (
id[ i ] & 2) != 0 )
434 copy &= (
factor( i ) == 1) | ((
id[ i ] & 3) == 0);
542 const int dir =
policy().dir_;
544 id[ dir ] = (
id[ dir ] / 2) | (
id[ dir ] & 1);
549 const int dir =
policy().dir_;
551 return ((
id[ dir ] & 3) != 2);
557 const int dir =
policy().dir_;
559 id[ dir ] = 2*(
id[ dir ] + index) - 1;
564 const int dir =
policy().dir_;
566 const unsigned int index = (
id[ dir ] >> 1) % 2;
573 const int dir =
policy().dir_;
575 id[ dir ] = 2*
id[ dir ] - (
id[ dir ] & 1);
580 const int dir =
policy().dir_;
582 id[ dir ] ^= 2*(
id[ dir ] & 1);
583 return ((
id[ dir ] & 2) != 0);
588 const int dir =
policy().dir_;
590 return ((
id[ dir ] & 3) == 0);
miscellaneous helper functions
Definition: iostream.hh:7
iostream::Match< typename iostream::MatchTraits< T >::Type > match(const T &value)
Definition: iostream.hh:87
each element is split into 2dim children.
Definition: refinement.hh:453
constexpr unsigned int numChildren() const
Definition: refinement.hh:466
SPIsotropicRefinement(const This &father, const Policy &policy)
Definition: refinement.hh:464
Base::Policy Policy
Definition: refinement.hh:460
SPIsotropicRefinement()
Definition: refinement.hh:462
the user may choose freely along which axes the grid should be refined
Definition: refinement.hh:483
SPAnisotropicRefinement(const This &father, const Policy &policy)
Definition: refinement.hh:494
unsigned int numChildren() const
Definition: refinement.hh:498
SPAnisotropicRefinement()
Definition: refinement.hh:492
Base::Policy Policy
Definition: refinement.hh:490
each element is split into 2 children.
Definition: refinement.hh:517
bool nextChild(MultiIndex &id) const
Definition: refinement.hh:578
SPBisectionRefinement()
Definition: refinement.hh:527
void child(MultiIndex &id, unsigned int index) const
Definition: refinement.hh:554
unsigned int numChildren() const
Definition: refinement.hh:535
bool hasFather(const MultiIndex &id) const
Definition: refinement.hh:547
void firstChild(MultiIndex &id) const
Definition: refinement.hh:571
Base::MultiIndex MultiIndex
Definition: refinement.hh:524
bool isCopy(const MultiIndex id) const
Definition: refinement.hh:586
SPBisectionRefinement(const This &father, const Policy &policy)
Definition: refinement.hh:529
Base::Policy Policy
Definition: refinement.hh:525
unsigned int childIndex(const MultiIndex &id) const
Definition: refinement.hh:562
void father(MultiIndex &id) const
Definition: refinement.hh:540
Definition: refinement.hh:24
static const int dimension
Definition: refinement.hh:28
friend std::basic_istream< char_type, traits > & operator>>(std::basic_istream< char_type, traits > &in, This &policy)
Definition: refinement.hh:51
unsigned int weight() const
Definition: refinement.hh:30
static std::string type()
Definition: refinement.hh:40
friend std::basic_ostream< char_type, traits > & operator<<(std::basic_ostream< char_type, traits > &out, const This &policy)
Definition: refinement.hh:44
unsigned int factor(const int i) const
Definition: refinement.hh:35
Definition: refinement.hh:65
static std::string type()
Definition: refinement.hh:92
friend std::basic_istream< char_type, traits > & operator>>(std::basic_istream< char_type, traits > &in, This &policy)
Definition: refinement.hh:103
SPAnisotropicRefinementPolicy()
Definition: refinement.hh:73
unsigned int factor(const int i) const
Definition: refinement.hh:86
unsigned int weight() const
Definition: refinement.hh:81
SPAnisotropicRefinementPolicy(std::bitset< dimension > refDir)
Definition: refinement.hh:77
static const int dimension
Definition: refinement.hh:71
friend std::basic_ostream< char_type, traits > & operator<<(std::basic_ostream< char_type, traits > &out, const This &policy)
Definition: refinement.hh:96
Definition: refinement.hh:123
static std::string type()
Definition: refinement.hh:159
friend std::basic_istream< char_type, traits > & operator>>(std::basic_istream< char_type, traits > &in, This &policy)
Definition: refinement.hh:171
SPBisectionRefinementPolicy(int dir)
Definition: refinement.hh:135
static const int dimension
Definition: refinement.hh:129
unsigned int weight() const
Definition: refinement.hh:148
SPBisectionRefinementPolicy()
Definition: refinement.hh:131
unsigned int factor(const int i) const
Definition: refinement.hh:153
friend std::basic_ostream< char_type, traits > & operator<<(std::basic_ostream< char_type, traits > &out, const This &policy)
Definition: refinement.hh:163
Definition: refinement.hh:197
SPArbitraryRefinementPolicy(int factor=2)
Definition: refinement.hh:205
friend std::basic_istream< char_type, traits > & operator>>(std::basic_istream< char_type, traits > &in, This &policy)
Definition: refinement.hh:238
SPMultiIndex< dimension > MultiIndex
Definition: refinement.hh:203
static const int dimension
Definition: refinement.hh:201
SPArbitraryRefinementPolicy(const MultiIndex &factor)
Definition: refinement.hh:213
constexpr unsigned int weight() const
Definition: refinement.hh:223
static std::string type()
Definition: refinement.hh:227
friend std::basic_ostream< char_type, traits > & operator<<(std::basic_ostream< char_type, traits > &out, const This &policy)
Definition: refinement.hh:231
unsigned int factor(int i) const
Definition: refinement.hh:225
Definition: refinement.hh:254
static const int dimension
Definition: refinement.hh:260
SPDefaultRefinement(const This &father, const Policy &policy)
Definition: refinement.hh:266
bool isCopy(const MultiIndex id) const
Definition: refinement.hh:337
const Policy & policy() const
Definition: refinement.hh:370
void father(MultiIndex &id) const
Definition: refinement.hh:280
unsigned int childIndex(const MultiIndex &id) const
Definition: refinement.hh:305
unsigned int factor(int i) const
Definition: refinement.hh:270
bool hasFather(const MultiIndex &id) const
Definition: refinement.hh:286
P Policy
Definition: refinement.hh:258
FieldVector< ctype, dimension > originInFather(unsigned int index) const
Definition: refinement.hh:358
SPMultiIndex< dimension > MultiIndex
Definition: refinement.hh:262
void child(MultiIndex &id, unsigned int index) const
Definition: refinement.hh:294
bool nextChild(MultiIndex &id) const
Definition: refinement.hh:323
FieldVector< ctype, dimension > hInFather() const
Definition: refinement.hh:349
static std::string type()
Definition: refinement.hh:268
SPDefaultRefinement(const Policy &policy=Policy())
Definition: refinement.hh:264
unsigned int numChildren() const
Definition: refinement.hh:272
void firstChild(MultiIndex &id) const
Definition: refinement.hh:317
Definition: refinement.hh:384
Base::Policy Policy
Definition: refinement.hh:391
bool nextChild(MultiIndex &id) const
Definition: refinement.hh:417
static const int dimension
Definition: refinement.hh:260
SPBinaryRefinement(const Policy &policy=Policy())
Definition: refinement.hh:394
SPBinaryRefinement(const This &father, const Policy &policy)
Definition: refinement.hh:396
Base::MultiIndex MultiIndex
Definition: refinement.hh:392
void firstChild(MultiIndex &id) const
Definition: refinement.hh:408
unsigned int factor(int i) const
Definition: refinement.hh:270
bool hasFather(const MultiIndex &id) const
Definition: refinement.hh:400
bool isCopy(const MultiIndex id) const
Definition: refinement.hh:430
Definition: refinement.hh:602
SPArbitraryRefinement()
Definition: refinement.hh:609
SPArbitraryRefinement(const This &father, const Policy &policy)
Definition: refinement.hh:611
Base::Policy Policy
Definition: refinement.hh:607