1#ifndef DUNE_SPGRID_HIERARCHICSEARCH_HH
2#define DUNE_SPGRID_HIERARCHICSEARCH_HH
4#include <dune/common/fvector.hh>
5#include <dune/common/exceptions.hh>
7#include <dune/grid/common/indexidset.hh>
8#include <dune/grid/common/gridenums.hh>
20 template<
class Gr
id >
23 template<
class Gr
id,
class IndexSet >
31 template<
class Gr
id >
35 typedef typename Grid::ctype
ctype;
36 typedef typename Grid::template Codim< 0 >::Entity
Entity;
49 typedef typename Grid::GridLevel GridLevel;
50 typedef typename GridLevel::PartitionList PartitionList;
52 assert(
grid_.domain().contains( global ) );
53 const GridLevel &gridLevel =
grid_.gridLevel( level );
54 const PartitionList &partitionList = gridLevel.template partition< All_Partition >();
59 gridLevel.template geometryCache< 0 >( *dirIt ).jacobianInverseTransposed().mv( y, z );
61 typename GridLevel::MultiIndex id;
63 id[ i ] = 2*
int( z[ i ] ) + 1;
65 const typename PartitionList::Partition *partition = partitionList.findPartition(
id );
67 return Entity( EntityImpl( gridLevel,
id, partition->number() ) );
73 if(
id[ i ] - 1 == 2*gridLevel.localMesh().bound( 1 )[ i ] )
74 id[ i ] = 2*int( z[ i ] ) - 1;
76 const typename PartitionList::Partition *leftPartition = partitionList.findPartition(
id );
79 return Entity( EntityImpl( gridLevel,
id, leftPartition->number() ) );
81 DUNE_THROW( GridError,
"Coordinate " << global <<
" is outside the grid." );
94 template<
class Gr
id,
class IndexSet >
110 indexSet_( indexSet )
116 return (indexSet_.contains( e ) ? e : hFindEntity( e, global ));
121 typedef typename Entity::HierarchicIterator HierarchicIterator;
126 const HierarchicIterator end = e.hend( e.level()+1 );
127 for( HierarchicIterator it = e.hbegin( e.level()+1 ); it != end; ++it )
129 const Entity &child = *it;
130 LocalVector local = child.geometry().local( global );
131 if( ReferenceElements< ctype, dimension >::cube().checkInside( local ) )
132 return (indexSet_.contains( child ) ? child : hFindEntity( child, global ));
134 DUNE_THROW( Exception,
"Unexpected internal Error" );
141 const IndexSet &indexSet_;
149 template<
class Gr
id >
163 indexSet_( indexSet )
172 const IndexSet &indexSet_;
180 template<
class Gr
id >
189 :
Base( grid, static_cast< const
SPIndexSet< Grid > & >( indexSet ) )
198 template<
class ct,
int dim,
template<
int >
class Ref,
class Comm,
class IndexSet >
210 :
Base( grid, indexSet )
215 return Base::findEntity( global );
218 template< PartitionIteratorType pitype >
221 const Entity entity = Base::findEntity( global );
222 if( !contains< pitype >( entity.partitionType() ) )
223 DUNE_THROW( GridError,
"Coordinate " << global <<
" does not belong to partition " << pitype );
228 template< PartitionIteratorType pitype >
229 static bool contains (
const PartitionType partitionType )
233 case Interior_Partition:
234 return ( partitionType == InteriorEntity );
236 case InteriorBorder_Partition:
237 return ( partitionType == InteriorEntity || partitionType == BorderEntity );
239 case Overlap_Partition:
240 return ( partitionType != FrontEntity && partitionType != GhostEntity );
242 case OverlapFront_Partition:
243 return ( partitionType != GhostEntity );
248 case Ghost_Partition:
249 return ( partitionType == GhostEntity );
252 DUNE_THROW( InvalidStateException,
"wrong PartitionIteratorType: " << pitype <<
"." );
Definition: iostream.hh:7
structured, parallel DUNE grid
Definition: grid.hh:136
Definition: direction.hh:157
Definition: entity.hh:146
Definition: indexset.hh:19
Base::IndexType IndexType
Definition: indexset.hh:26
Definition: hierarchicsearch.hh:24
Definition: hierarchicsearch.hh:33
Grid::template Codim< 0 >::Entity Entity
Definition: hierarchicsearch.hh:36
static const int dimension
Definition: hierarchicsearch.hh:38
FieldVector< ctype, dimension > GlobalVector
Definition: hierarchicsearch.hh:40
SPBasicHierarchicSearch(const Grid &grid)
Definition: hierarchicsearch.hh:42
Grid::ctype ctype
Definition: hierarchicsearch.hh:35
const Grid & grid_
Definition: hierarchicsearch.hh:86
Entity findEntity(const GlobalVector &global, int level) const
Definition: hierarchicsearch.hh:46
Definition: hierarchicsearch.hh:97
Base::Entity Entity
Definition: hierarchicsearch.hh:102
Base::GlobalVector GlobalVector
Definition: hierarchicsearch.hh:106
SPHierarchicSearch(const Grid &grid, const IndexSet &indexSet)
Definition: hierarchicsearch.hh:108
Entity findEntity(const GlobalVector &global) const
Definition: hierarchicsearch.hh:113
Base::ctype ctype
Definition: hierarchicsearch.hh:101
Base::Entity Entity
Definition: hierarchicsearch.hh:157
Base::GlobalVector GlobalVector
Definition: hierarchicsearch.hh:159
Entity findEntity(const GlobalVector &global) const
Definition: hierarchicsearch.hh:166
SPHierarchicSearch(const Grid &grid, const IndexSet &indexSet)
Definition: hierarchicsearch.hh:161
SPHierarchicSearch(const Grid &grid, const IndexSet &indexSet)
Definition: hierarchicsearch.hh:188
Base::Entity Entity
Definition: hierarchicsearch.hh:206
HierarchicSearch(const Grid &grid, const IndexSet &indexSet)
Definition: hierarchicsearch.hh:209
Base::GlobalVector GlobalVector
Definition: hierarchicsearch.hh:207
Entity findEntity(const GlobalVector &global) const
Definition: hierarchicsearch.hh:213
Entity findEntity(const GlobalVector &global) const
Definition: hierarchicsearch.hh:219