Skip to content
Snippets Groups Projects
Commit 241a5177 authored by Robert Klöfkorn's avatar Robert Klöfkorn
Browse files

example implementation for const grid iterators.

example here LevelIterator.

[[Imported from SVN: r1372]]
parent 10b62317
No related branches found
No related tags found
No related merge requests found
......@@ -312,10 +312,10 @@ namespace Dune
//! return the global unique index in grid
int global_index() const ;
AlbertaGridEntity(AlbertaGrid<dim,dimworld> &grid, int level,
AlbertaGridEntity(const AlbertaGrid<dim,dimworld> &grid, int level,
ALBERTA TRAVERSE_STACK * travStack);
AlbertaGridEntity(AlbertaGrid<dim,dimworld> &grid, int level);
AlbertaGridEntity(const AlbertaGrid<dim,dimworld> &grid, int level);
//! geometry of this entity
AlbertaGridElement<dim-codim,dimworld>& geometry () const;
......@@ -344,7 +344,7 @@ namespace Dune
// private Methods
void makeDescription();
AlbertaGrid<dim,dimworld> &grid_;
const AlbertaGrid<dim,dimworld> &grid_;
// private Members
ALBERTA EL_INFO *elInfo_;
......@@ -550,7 +550,7 @@ namespace Dune
void makeDescription();
//! the corresponding grid
AlbertaGrid<dim,dimworld> &grid_;
AlbertaGrid<dim,dimworld> & grid_;
//! the level of the entity
int level_;
......@@ -879,11 +879,17 @@ namespace Dune
bool operator!= (const AlbertaGridLevelIteratorType & i) const;
//! dereferencing
AlbertaGridEntity<codim,dim,dimworld>& operator*() ;
AlbertaGridEntity<codim,dim,dimworld>& operator *() ;
//! arrow
AlbertaGridEntity<codim,dim,dimworld>* operator->() ;
//! dereferencing
const AlbertaGridEntity<codim,dim,dimworld>& operator *() const ;
//! arrow
const AlbertaGridEntity<codim,dim,dimworld>* operator->() const ;
//! ask for level of entity
int level () const;
......@@ -915,7 +921,7 @@ namespace Dune
ALBERTA MACRO_EL * nextGhostMacro(ALBERTA MACRO_EL *mel);
//! the grid were it all comes from
AlbertaGrid<dim,dimworld> &grid_;
AlbertaGrid<dim,dimworld> & grid_;
//! level :)
int level_;
......@@ -953,6 +959,7 @@ namespace Dune
//**********************************************************************
//
// --AlbertaGrid
// --Grid
//
//**********************************************************************
......@@ -989,6 +996,56 @@ namespace Dune
// The Interface Methods
//**********************************************************
public:
//! remember the types of template parameters
template <int codim>
struct Traits
{
//! Please doc me!
typedef albertCtype CoordType;
//! Please doc me!
typedef AlbertaGrid<dim,dimworld> ImpGrid;
//! Please doc me!
typedef AlbertaGridLevelIterator<codim,dim,dimworld,All_Partition> LevelIterator;
//! Please doc me!
typedef AlbertaGridLevelIterator<codim,dim,dimworld,Interior_Partition> InteriorLevelIterator;
//! Please doc me!
typedef AlbertaGridLevelIterator<codim,dim,dimworld,InteriorBorder_Partition> InteriorBorderLevelIterator;
//! Please doc me!
typedef AlbertaGridLevelIterator<codim,dim,dimworld,Overlap_Partition> OverlapLevelIterator;
//! Please doc me!
typedef AlbertaGridLevelIterator<codim,dim,dimworld,OverlapFront_Partition> OverlapFrontLevelIterator;
//! Please doc me!
typedef AlbertaGridLevelIterator<codim,dim,dimworld,Ghost_Partition> GhostLevelIterator;
//! Please doc me!
typedef ConstLevelIteratorWrapper<AlbertaGridLevelIterator<codim,dim,dimworld,All_Partition> > ConstLevelIterator;
//! Please doc me!
typedef ConstLevelIteratorWrapper<AlbertaGridLevelIterator<codim,dim,dimworld,Interior_Partition> > ConstInteriorLevelIterator;
//! Please doc me!
typedef ConstLevelIteratorWrapper<AlbertaGridLevelIterator<codim,dim,dimworld,InteriorBorder_Partition> > ConstInteriorBorderLevelIterator;
//! Please doc me!
typedef ConstLevelIteratorWrapper<AlbertaGridLevelIterator<codim,dim,dimworld,Overlap_Partition> > ConstOverlapLevelIterator;
//! Please doc me!
typedef ConstLevelIteratorWrapper<AlbertaGridLevelIterator<codim,dim,dimworld,OverlapFront_Partition> > ConstOverlapFrontLevelIterator;
//! Please doc me!
typedef ConstLevelIteratorWrapper<AlbertaGridLevelIterator<codim,dim,dimworld,Ghost_Partition> > ConstGhostLevelIterator;
//! Please doc me!
typedef AlbertaGridEntity<codim,dim,dimworld> Entity;
};
typedef AlbertaGridLevelIterator<0,dim,dimworld,All_Partition> LeafIterator;
typedef AlbertaGridReferenceElement<dim> ReferenceElement;
......@@ -996,6 +1053,16 @@ namespace Dune
typedef std::pair < ObjectStreamType * ,
AlbertaGridEntity<0,dim,dimworld> * > DataCollectorParamType;
template<int codim, PartitionIteratorType pitype>
struct ConstAlbertaGridLevelIterator
{
typedef ConstLevelIteratorWrapper<
AlbertaGridLevelIterator<codim,dim,dimworld,pitype> > IteratorType;
};
typedef typename ConstAlbertaGridLevelIterator<0,All_Partition> :: IteratorType Const0LevelIteratorType;
typedef typename ConstAlbertaGridLevelIterator<dim,All_Partition> :: IteratorType ConstDimLevelIteratorType;
//! we always have dim+1 codimensions since we use only simplices
enum { numCodim = dim+1 };
......@@ -1043,6 +1110,28 @@ namespace Dune
template<int codim> AlbertaGridLevelIterator<codim,dim,dimworld,All_Partition>
lend (int level, int proc = -1 );
// the const versions
//! Iterator to first entity of given codim on level
template<int codim, PartitionIteratorType pitype>
typename ConstAlbertaGridLevelIterator <codim,pitype> :: IteratorType
lbegin (int level, int proc = -1 ) const;
//! one past the end on this level
template<int codim, PartitionIteratorType pitype>
typename ConstAlbertaGridLevelIterator <codim,pitype> :: IteratorType
lend (int level, int proc = -1 ) const;
//! Iterator to first entity of given codim on level
template<int codim>
typename ConstAlbertaGridLevelIterator <codim,All_Partition> :: IteratorType
lbegin (int level, int proc = -1 ) const;
//! one past the end on this level
template<int codim>
typename ConstAlbertaGridLevelIterator <codim,All_Partition> :: IteratorType
lend (int level, int proc = -1 ) const;
/** \brief Number of grid entities per level and codim
* because lbegin and lend are none const, and we need this methods
* counting the entities on each level, you know.
......@@ -1183,7 +1272,7 @@ namespace Dune
//! map the global index from the Albert Mesh to the local index on Level
template <int codim>
int indexOnLevel(int globalIndex, int level ) ;
int indexOnLevel(int globalIndex, int level ) const ;
// pointer to the real number of elements or vertices
// i.e. points to mesh->n_hier_elements or mesh->n_vertices
......
......@@ -839,7 +839,7 @@ namespace Dune
template<int codim, int dim, int dimworld>
inline AlbertaGridEntity < codim, dim ,dimworld >::
AlbertaGridEntity(AlbertaGrid<dim,dimworld> &grid, int level,
AlbertaGridEntity(const AlbertaGrid<dim,dimworld> &grid, int level,
ALBERTA TRAVERSE_STACK * travStack) : grid_(grid)
, level_ ( level )
, geo_ (false)
......@@ -858,7 +858,7 @@ namespace Dune
template<int codim, int dim, int dimworld>
inline AlbertaGridEntity < codim, dim ,dimworld >::
AlbertaGridEntity(AlbertaGrid<dim,dimworld> &grid, int level) :
AlbertaGridEntity(const AlbertaGrid<dim,dimworld> &grid, int level) :
grid_(grid)
, level_ (level)
, geo_ ( false )
......@@ -898,6 +898,7 @@ namespace Dune
inline int AlbertaGridEntity < codim, dim ,dimworld >::
index() const
{
assert(elNum_ >= 0);
return elNum_;
}
......@@ -1107,12 +1108,13 @@ namespace Dune
template< int dim, int dimworld>
inline AlbertaGridEntity < 0, dim ,dimworld >::
AlbertaGridEntity(AlbertaGrid<dim,dimworld> &grid, int level) : grid_(grid)
, level_ (level)
, vxEntity_ ( grid_ , -1, 0, 0, 0, 0, 0)
, travStack_ (0) , elInfo_ (0)
, geo_(false)
, builtgeometry_ (false)
AlbertaGridEntity(AlbertaGrid<dim,dimworld> &grid, int level)
: grid_(grid)
, level_ (level)
, vxEntity_ ( grid_ , -1, 0, 0, 0, 0, 0)
, travStack_ (0) , elInfo_ (0)
, geo_(false)
, builtgeometry_ (false)
{}
//*****************************************************************8
......@@ -2122,7 +2124,8 @@ namespace Dune
inline AlbertaGridLevelIterator<codim,dim,dimworld,pitype>::
AlbertaGridLevelIterator(AlbertaGrid<dim,dimworld> &grid, int travLevel,
int proc, bool leafIt ) :
grid_(grid), level_ (travLevel) , virtualEntity_(grid,travLevel)
grid_(grid), level_ (travLevel) ,
virtualEntity_(grid,travLevel)
,leafIt_(leafIt) , proc_(proc)
{
makeIterator();
......@@ -2133,7 +2136,8 @@ namespace Dune
inline AlbertaGridLevelIterator<codim,dim,dimworld,pitype>::
AlbertaGridLevelIterator(AlbertaGrid<dim,dimworld> &grid, int level,
ALBERTA EL_INFO *elInfo,int elNum,int face,int edge,int vertex) :
grid_(grid), level_ (level) , virtualEntity_(grid,level) , elNum_ ( elNum ) , face_ ( face ) ,
grid_(grid), level_ (level)
, virtualEntity_(grid,level) , elNum_ ( elNum ) , face_ ( face ) ,
edge_ ( edge ), vertex_ ( vertex ) , leafIt_(false) ,
proc_(-1)
{
......@@ -2292,6 +2296,22 @@ namespace Dune
return &virtualEntity_;
}
template<int codim, int dim, int dimworld,PartitionIteratorType pitype>
inline const AlbertaGridEntity<codim,dim,dimworld> &
AlbertaGridLevelIterator<codim,dim,dimworld,pitype>::operator *() const
{
assert(virtualEntity_.getElInfo() != 0);
return virtualEntity_;
}
template<int codim, int dim, int dimworld,PartitionIteratorType pitype>
inline const AlbertaGridEntity< codim,dim,dimworld >*
AlbertaGridLevelIterator<codim,dim,dimworld,pitype>::operator ->() const
{
assert(virtualEntity_.getElInfo() != 0);
return &virtualEntity_;
}
template<int codim, int dim, int dimworld,PartitionIteratorType pitype>
inline ALBERTA EL_INFO * AlbertaGridLevelIterator<codim,dim,dimworld,pitype>::
......@@ -3197,6 +3217,53 @@ namespace Dune
return it;
}
//**********************************************
// the const versions of LevelIterator
//**********************************************
template < int dim, int dimworld > template<int codim, PartitionIteratorType pitype>
inline typename AlbertaGrid < dim, dimworld > :: template ConstAlbertaGridLevelIterator<codim,pitype> :: IteratorType
AlbertaGrid < dim, dimworld >::lbegin (int level, int proc) const
{
// const_cast ok, because constness of object is preserved via const iterator
AlbertaGrid<dim,dimworld> & mygrid = const_cast<AlbertaGrid<dim,dimworld> &> (*this);
AlbertaGridLevelIterator<codim,dim,dimworld,pitype> it( mygrid ,vertexMarker_,level,proc);
typename ConstAlbertaGridLevelIterator<codim,pitype> :: IteratorType cit ( it );
return cit;
}
template < int dim, int dimworld > template<int codim, PartitionIteratorType pitype>
inline typename AlbertaGrid < dim, dimworld >::template ConstAlbertaGridLevelIterator<codim,pitype> :: IteratorType
AlbertaGrid < dim, dimworld >::lend (int level, int proc ) const
{
// const_cast ok, because constness of object is preserved via const iterator
AlbertaGrid<dim,dimworld> & mygrid = const_cast<AlbertaGrid<dim,dimworld> &> (*this);
AlbertaGridLevelIterator<codim,dim,dimworld,pitype> it( mygrid ,level,proc);
typename ConstAlbertaGridLevelIterator<codim,pitype> :: IteratorType cit ( it );
return cit;
}
template < int dim, int dimworld > template<int codim>
inline typename AlbertaGrid < dim, dimworld >:: template ConstAlbertaGridLevelIterator<codim,All_Partition> :: IteratorType
AlbertaGrid < dim, dimworld >::lbegin (int level, int proc) const
{
// const_cast ok, because constness of object is preserved via const iterator
AlbertaGrid<dim,dimworld> & mygrid = const_cast<AlbertaGrid<dim,dimworld> &> (*this);
AlbertaGridLevelIterator<codim,dim,dimworld,All_Partition> it( mygrid ,vertexMarker_,level,proc);
typename ConstAlbertaGridLevelIterator<codim,All_Partition> :: IteratorType cit ( it );
return cit;
}
template < int dim, int dimworld > template<int codim>
inline typename AlbertaGrid < dim, dimworld >:: template ConstAlbertaGridLevelIterator<codim,All_Partition> :: IteratorType
AlbertaGrid < dim, dimworld >::lend (int level, int proc ) const
{
// const_cast ok, because constness of object is preserved via const iterator
AlbertaGrid<dim,dimworld> & mygrid = const_cast<AlbertaGrid<dim,dimworld> &> (*this);
AlbertaGridLevelIterator<codim,dim,dimworld,All_Partition> it( mygrid ,level,proc);
typename ConstAlbertaGridLevelIterator<codim,All_Partition> :: IteratorType cit ( it );
return cit;
}
//*****************************************************************
template < int dim, int dimworld >
inline AlbertaGridLevelIterator<0,dim,dimworld,All_Partition>
......@@ -3617,7 +3684,7 @@ namespace Dune
template < int dim, int dimworld > template <int codim>
inline int AlbertaGrid < dim, dimworld >::
indexOnLevel(int globalIndex, int level)
indexOnLevel(int globalIndex, int level) const
{
assert(hasLevelIndex_ == true);
// level = 0 is not interesting for this implementation
......
// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
// vi: set et ts=4 sw=2 sts=2:
#ifndef __DUNE_CONSTGRIDITERATORS_HH__
#define __DUNE_CONSTGRIDITERATORS_HH__
#include <string>
#include <dune/common/matvec.hh>
#include <dune/common/exceptions.hh>
namespace Dune {
/** @defgroup GridCommon Grid Interface
These Iterators define wrapper for const versions
of all interface grid iterators.
@{
*/
//************************************************************************
// C O N S T L E V E L I T E R A T O R
//************************************************************************
/** \brief Enables iteration over all entities of a given codimension and level of a grid.
*/
template <class LevelIteratorImp>
class ConstLevelIteratorWrapper
{
typedef ConstLevelIteratorWrapper<LevelIteratorImp> ConstLevelIteratorType;
public:
struct Traits
{
/** \todo Please doc me! */
typedef typename LevelIteratorImp:: Traits :: CoordType CoordType;
/** \todo Please doc me! */
typedef const typename LevelIteratorImp :: Traits :: Entity Entity;
//! Please doc me!
typedef const typename LevelIteratorImp :: Traits :: LevelIterator LevelIterator;
//! Please doc me!
typedef const typename LevelIteratorImp :: Traits :: InteriorLevelIterator InteriorLevelIterator;
//! Please doc me!
typedef const typename LevelIteratorImp :: Traits :: InteriorBorderLevelIterator InteriorBorderLevelIterator;
//! Please doc me!
typedef const typename LevelIteratorImp :: Traits :: OverlapLevelIterator OverlapLevelIterator;
//! Please doc me!
typedef const typename LevelIteratorImp :: Traits :: OverlapFrontLevelIterator OverlapFrontLevelIterator;
//! Please doc me!
typedef const typename LevelIteratorImp :: Traits :: GhostLevelIterator GhostLevelIterator;
};
//! know your own codimension
enum { codimension = LevelIteratorImp :: codimension };
//! know your own dimension
enum { dimension = LevelIteratorImp :: dimension };
//! know your own dimension of world
enum { dimensionworld = LevelIteratorImp :: dimensionworld };
//! copy the normal LevelIterator, this is ok because the normal
//! interface method lbegin uses copy aswell
ConstLevelIteratorWrapper ( LevelIteratorImp & lit);
//! prefix increment
ConstLevelIteratorType & operator ++ ();
//! equality
bool operator== (const ConstLevelIteratorType & i) const;
//! inequality
bool operator!= (const ConstLevelIteratorType & i) const;
//! dereferencing
typename Traits :: Entity & operator*() const;
//! arrow
typename Traits :: Entity * operator->() const;
//! ask for level of entity
int level () const;
protected:
LevelIteratorImp it_;
};
template <class LevelIteratorImp>
inline ConstLevelIteratorWrapper<LevelIteratorImp> ::
ConstLevelIteratorWrapper( LevelIteratorImp & lit ) : it_ ( lit ) {}
template <class LevelIteratorImp>
inline ConstLevelIteratorWrapper<LevelIteratorImp> &
ConstLevelIteratorWrapper<LevelIteratorImp> :: operator++()
{
++it_;
return (*this);
}
template <class LevelIteratorImp>
inline bool ConstLevelIteratorWrapper<LevelIteratorImp> ::
operator == ( const ConstLevelIteratorWrapper<LevelIteratorImp> & i) const
{
return it_ == i.it_;
}
template <class LevelIteratorImp>
inline bool ConstLevelIteratorWrapper<LevelIteratorImp> ::
operator != ( const ConstLevelIteratorWrapper<LevelIteratorImp> & i) const
{
return it_ != i.it_;
}
template <class LevelIteratorImp>
inline typename ConstLevelIteratorWrapper<LevelIteratorImp> :: Traits :: Entity &
ConstLevelIteratorWrapper<LevelIteratorImp> :: operator * () const
{
return *it_;
}
template <class LevelIteratorImp>
inline typename ConstLevelIteratorWrapper<LevelIteratorImp> :: Traits :: Entity *
ConstLevelIteratorWrapper<LevelIteratorImp> :: operator -> () const
{
return it_.operator -> ();
}
template <class LevelIteratorImp>
inline int ConstLevelIteratorWrapper<LevelIteratorImp> ::
level () const
{
return it_.level();
}
/** @} */
}
#endif
......@@ -1591,5 +1591,6 @@ namespace Dune {
}
#include "grid.cc"
#include "constgriditerators.hh"
#endif
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment