23#include <boost/signals2.hpp>
25#include "dune/grid/common/grid.hh"
26#include "dune/grid/common/entitypointer.hh"
27#include "dune/grid/common/entity.hh"
28#include "dune/grid/io/file/dgfparser/dgfparser.hh"
29#include "dune/istl/matrix.hh"
30#include "dune/istl/bcrsmatrix.hh"
31#include "dune/common/fmatrix.hh"
32#include "dune/common/iteratorfacades.hh"
47template<
class Gr
idImp,
class ValueType >
49:
public Dune::ForwardIteratorFacade< FullHierarchicIterator<GridImp,ValueType>, ValueType >
55 typedef typename GridImp::template Codim<codimension>::LevelIterator
LevelIterator ;
60 grid( &grid_ ), coarseGridIt( grid_.levelGridView(0).template begin<0>() ),
61 coarseGridEnd( grid_.levelGridView(0).template end<0>() ), hierIt( coarseGridIt->hbegin(maxlevel_) ),
62 hierEnd( coarseGridIt->hend(maxlevel_) ), maxlevel( maxlevel_ ), coarse(true)
64 if( end ) coarseGridIt = coarseGridEnd ;
68 grid(other.grid), coarseGridIt(other.coarseGridIt), coarseGridEnd(other.coarseGridEnd), hierIt(other.hierIt),
69 hierEnd(other.hierEnd), maxlevel(other.maxlevel), coarse(other.coarse)
82 hierIt = coarseGridIt->hbegin(maxlevel) ;
83 hierEnd = coarseGridIt->hend(maxlevel) ;
90 if( hierIt == hierEnd )
100 if( coarse || maxlevel==0 )
return *coarseGridIt ;
106 if( coarse || maxlevel==0 )
return 0 ;
107 return hierIt.level() ;
112 if( rhs.maxlevel != maxlevel || rhs.grid != grid )
return false ;
113 if( rhs.coarse ==
true && coarse ==
true )
return ( rhs.coarseGridIt == coarseGridIt ) ;
114 return ( rhs.coarseGridIt == coarseGridIt && rhs.hierIt == hierIt ) ;
118 operator typename GridImp::template Codim<0>::Entity ()
120 if( coarse || maxlevel==0 )
return typename GridImp::template Codim<0>::Entity( coarseGridIt ) ;
121 return typename GridImp::template Codim<0>::Entity( hierIt ) ;
125 const GridImp* grid ;
142template<
class Gr
id >
146 static const int dim = Grid::dimension;
149 typedef typename Grid::Traits::LevelIndexSet LevelIndexSet ;
156 template <Dune::PartitionIteratorType pitype>
167 gridMan( gridMan_ ), grid(gridMan_.grid() ), maxlevel( gridMan_.maxLevel() ),connectMe( connectMe_ ), rtf(*this)
175 gridMan( gridMan_ ), grid(gridMan_.grid() ), maxlevel( maxlevel_ ), connectMe(connectMe_), rtf(*this)
183 gridMan( other.gridMan ), grid(other.grid ), maxlevel( other.maxlevel ), connectMe(other.connectMe), rtf(*this)
192 gridMan = other.gridMan ;
194 maxlevel = other.maxlevel ;
195 connectMe = other.connectMe ;
203 refConnection.disconnect() ;
210 std::vector< std::vector<int> > tmp( maxlevel+1, std::vector<int>(1, -1) ) ;
212 if( indices.size() > 0 ) indices.clear() ;
213 if( numEntities.size() > 0 ) numEntities.clear() ;
215 indices.resize( 4, tmp ) ;
216 numEntities.resize( 4, 0 ) ;
222 maxlevel = maxlevel_ ;
223 for(
int i = 0 ; i < 4 ; i++ ) indices[i].resize( maxlevel+1, std::vector<int>(1,-1) ) ;
229 LevelIndexSet
const& coarseLevelIndexSet = grid.levelIndexSet(0) ;
231 for( ElementLevelIterator it = grid.levelGridView( 0 ).template begin<0>();
232 it != grid.levelGridView( 0 ).template end<0>(); ++it )
235 for(
int codim = 0 ; codim <= dim ; codim++ )
237 int nSubentities = FixDuneDetail::GetNumberOfSubEntities<dim>::value( *it, codim ) ;
238 for(
int k = 0 ; k < nSubentities ; k++ )
240 int subindex = FixDuneDetail::GetIndexOfSubEntity<dim>::value(*it, codim, k, coarseLevelIndexSet ) ;
241 if( subindex >= indices[codim][0].
size() ) indices[codim][0].resize( subindex+1, -1 ) ;
242 if( indices[codim][0][subindex] == -1 )
244 indices[codim][0][subindex] = numEntities[codim] ;
245 numEntities[codim]++ ;
251 HierarchicIterator
end = it->hend(maxlevel);
252 for( HierarchicIterator hi = it->hbegin(maxlevel); hi !=
end; ++hi)
254 int level = hi.level() ;
255 LevelIndexSet
const& levelIndexSet = grid.levelIndexSet( level ) ;
257 for(
int codim = 0 ; codim <= dim ; codim++ )
259 int nSubentities = FixDuneDetail::GetNumberOfSubEntities<dim>::value( *hi, codim ) ;
260 for(
int k = 0 ; k < nSubentities ; k++ )
262 int subindex = FixDuneDetail::GetIndexOfSubEntity<dim>::value( *hi, codim, k, levelIndexSet ) ;
263 if( subindex >= indices[codim][level].
size() ) indices[codim][level].resize( subindex+1, -1 ) ;
264 if( indices[codim][level][subindex] == -1 )
266 indices[codim][level][subindex] = numEntities[codim] ;
267 numEntities[codim]++ ;
275 if( geometryTypes.size() > 0 ) geometryTypes.clear() ;
276 geometryTypes.resize( numEntities.size(), std::vector<Dune::GeometryType>(0) ) ;
277 std::vector<Dune::GeometryType> geotmp ;
278 for(
int codim = 0; codim <= dim ; codim++ )
280 for(
int level = 0 ; level <= maxlevel ; level++ )
282 geotmp = grid.levelIndexSet(level).geomTypes(codim) ;
283 geometryTypes[codim].insert( geometryTypes[codim].
end(), geotmp.begin(), geotmp.end() ) ;
285 std::sort( geometryTypes[codim].
begin(), geometryTypes[codim].
end() ) ;
286 std::vector<Dune::GeometryType>::iterator it
287 = std::unique( geometryTypes[codim].
begin(), geometryTypes[codim].
end() ) ;
288 geometryTypes[codim].resize( it-geometryTypes[codim].
begin() ) ;
296 int idx = grid.levelIndexSet(e.level()).index(e) ;
297 int level = e.level() ;
298 assert( level < indices[cc].
size() ) ;
299 assert( idx < indices[cc][level].
size() );
300 return indices[cc][level][idx] ;
303 template<
class EntityType >
304 int index(
const EntityType &e )
const
306 int idx = grid.levelIndexSet(e.level()).index(e) ;
307 int level = e.level() ;
308 assert( level < indices[EntityType::codimension].
size() ) ;
309 assert( idx < indices[EntityType::codimension][level].
size() );
310 return indices[EntityType::codimension][level][idx] ;
316 int sidx = grid.levelIndexSet(e.level()).template subIndex<cc>(e,i) ;
317 int level = e.level() ;
318 assert( level < indices[cc].
size() ) ;
319 assert( sidx < indices[cc][level].
size() ) ;
320 return indices[cc][level][sidx] ;
323 const std::vector<Dune::GeometryType>&
geomTypes(
int codim )
const
325 assert( codim < geometryTypes.size() ) ;
326 return geometryTypes[codim] ;
329 int size( Dune::GeometryType type )
const
332 for(
int level = 0 ; level <= maxlevel ; level++ )
334 s += grid.levelIndexSet(level).size(type) ;
341 assert( codim < numEntities.size() ) ;
342 return numEntities[codim] ;
345 template<
class EntityType>
348 int level = e.level() ;
349 if( level > maxlevel )
return false ;
350 int lindex = grid.levelIndexSet(level).index(e) ;
351 int codim = EntityType::codimension ;
352 if( lindex > indices[codim][level].
size() )
return false ;
353 if( indices[codim][level][lindex] > -1 )
return true ;
358 template<
int cd, Dune::PartitionIteratorType pitype>
364 template<
int cd, Dune::PartitionIteratorType pitype>
371 void out(std::ostream& o)
const
373 for(
int i = 0 ; i < indices.size() ; i++ )
375 o <<
"\nCODIM " << i <<
"\n" ;
376 for(
int j = 0 ; j < indices[i].size() ; j++ )
378 for(
int k = 0 ; k < indices[i][j].size() ; k++ )
379 o << indices[i][j][k] <<
"\t" ;
388 struct ReactToRefinement
390 ReactToRefinement(
Self &is_) : is(is_) {}
394 if(ref==GridSignals::AfterRefinement) is.update( is.gridMan.grid().maxLevel() ) ;
401 std::vector< std::vector< std::vector<int> > > indices ;
402 std::vector< int > numEntities ;
408 ReactToRefinement rtf;
409 boost::signals2::connection refConnection;
411 std::vector< std::vector<Dune::GeometryType> > geometryTypes ;
449template<
class Space,
class Gr
id>
457 : gridMan( gridMan_ ), order(order_), startlevel(startlevel_)
460 typename Grid::LevelGridView gv = gridMan.
grid().levelView(startlevel);
462 for(
int level=startlevel ; level < gridMan.
grid().maxLevel() ; level++ )
464 Space fatherSpace( gridMan, gridMan.
grid().levelView(level+1), order ) ;
468 multilevelCoarseningPolicy.
update(level+1) ;
474 for(
int i = 0 ; i < matrices.size() ; i++ )
delete matrices[i] ;
477 void out(std::ostream& o)
const
479 for(
int level=startlevel ; level < gridMan.
grid().maxLevel() ; level++ )
481 o <<
"prolongation " << level <<
"->" << level+1 <<
"\n" ;
482 matrices[level-startlevel]->out(o) ;
489 return matrices[level-startlevel] ;
493 template <
class StorageValue>
496 std::unique_ptr<Dune::BlockVector<StorageValue> > newCoeff = matrices[level-startlevel]->apply(oldCoeff) ;
504 std::vector<typename TransferData<Space,MultilevelCoarseningPolicy>::TransferMatrix* > matrices ;
GridImp::template Codim< codimension >::LevelIterator LevelIterator
FullHierarchicIterator(GridImp const &grid_, int maxlevel_, bool end=false)
static const int codimension
ValueType & dereference() const
bool equals(FullHierarchicIterator const &rhs) const
GridImp::template Codim< codimension >::HierarchicIterator HierarchicIterator
FullHierarchicIterator(FullHierarchicIterator const &other)
int size(Dune::GeometryType type) const
int index(const typename Grid::Traits::template Codim< cc >::Entity &e) const
bool contains(const EntityType &e) const
HierarchicIndexSet(GridManager< Grid > &gridMan_, int maxlevel_, bool connectMe_=true)
void update(int maxlevel_)
update hierarchic index set, e.g. after grid change
int index(const EntityType &e) const
Codim< cd >::template Partition< pitype >::Iterator begin() const
int size(int codim) const
HierarchicIndexSet & operator=(const HierarchicIndexSet &other)
int subIndex(const typename Grid::Traits::template Codim< 0 >::Entity &e, int i) const
HierarchicIndexSet(GridManager< Grid > &gridMan_, bool connectMe_=true)
const std::vector< Dune::GeometryType > & geomTypes(int codim) const
HierarchicIndexSet(const HierarchicIndexSet &other)
void out(std::ostream &o) const
HierarchicIndexSet< Grid > Self
Codim< cd >::template Partition< pitype >::Iterator end() const
Grid const & grid() const
Returns a const reference on the owned grid.
Matrix that transforms a data vector v_1 corresponding to the old grid to a data vector v_2 correspon...
A class storing data collected before grid adaptation that is necessary to transfer FE functions....
std::unique_ptr< TransferMatrix > transferMatrix() const
Create a TransferMatrix.
MultilevelTransfer(GridManager< Grid > &gridMan_, int order_=1, int startlevel_=0)
TransferData< Space, MultilevelCoarseningPolicy >::TransferMatrix * operator[](int level) const
Access transfer matrix.
std::unique_ptr< Dune::BlockVector< StorageValue > > apply(int level, Dune::BlockVector< StorageValue > const &oldCoeff) const
Apply transfer matrix to coefficients.
void out(std::ostream &o) const
Tools for transfer of data between grids.
This file contains various utility functions that augment the basic functionality of Dune.
boost::signals2::signal< void(Status)> informAboutRefinement
A signal that is emitted thrice on grid modifications, once before adaptation takes place and twice a...
Status
The argument type of the signal that is emitted before and after grid adaptation.
Class for transformations between ancestors and their children.
FullHierarchicIterator< Grid, Entity > Iterator
policy class for LocalTransfer These two structures are used for determining whether to perform a "no...