/usr/include/dune/grid/albertagrid/entity.hh is in libdune-grid-dev 2.2.1-2.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 | #ifndef DUNE_ALBERTA_ENTITY_HH
#define DUNE_ALBERTA_ENTITY_HH
#include <dune/grid/common/entity.hh>
#include <dune/grid/albertagrid/elementinfo.hh>
#include <dune/grid/albertagrid/entityseed.hh>
#include <dune/grid/albertagrid/geometry.hh>
#if HAVE_ALBERTA
namespace Dune
{
// Forward Declarations
// --------------------
template< int codim, class GridImp >
class AlbertaGridEntityPointer;
template< int codim, class GridImp, bool leafIterator >
class AlbertaGridTreeIterator;
template< class GridImp >
class AlbertaGridHierarchicIterator;
template< class GridImp >
class AlbertaGridLeafIntersection;
template< class GridImp >
class AlbertaGridLeafIntersectionIterator;
// AlbertaGridEntity
// -----------------
/*!
A Grid is a container of grid entities. An entity is parametrized by the codimension.
An entity of codimension c in dimension d is a d-c dimensional object.
Here: the general template
*/
template< int codim, int dim, class GridImp >
class AlbertaGridEntity
: public EntityDefaultImplementation< codim, dim, GridImp, AlbertaGridEntity >
{
typedef AlbertaGridEntity< codim, dim, GridImp > This;
enum { dimworld = GridImp::dimensionworld };
friend class AlbertaGrid< dim , dimworld >;
friend class AlbertaGridEntity< 0, dim, GridImp>;
template< int, class, bool > friend class AlbertaGridTreeIterator;
friend class AlbertaGridEntityPointer< codim, GridImp >;
public:
static const int dimension = dim;
static const int codimension = codim;
static const int mydimension = dimension - codimension;
template< int cd >
struct Codim
{
typedef typename GridImp::template Codim< cd >::EntityPointer EntityPointer;
};
typedef typename GridImp::template Codim< codim >::Entity Entity;
typedef typename GridImp::template Codim< codim >::EntitySeed EntitySeed;
typedef typename GridImp::template Codim< codim >::Geometry Geometry;
typedef typename GridImp::template Codim< codim >::LevelIterator LevelIterator;
typedef Alberta::ElementInfo< dimension > ElementInfo;
private:
//typedef MakeableInterfaceObject< Geometry > GeometryObject;
//typedef typename GeometryObject::ImplementationType GeometryImp;
typedef typename GridImp::Traits::template Codim< codim >::GeometryImpl GeometryImpl;
public:
//! constructor
explicit AlbertaGridEntity ( const GridImp &grid );
//! contructor
AlbertaGridEntity ( const GridImp &grid, const ElementInfo &elementInfo, int subEntity );
//! level of this element
int level () const;
//! return partition type of this entity ( see grid.hh )
PartitionType partitionType() const;
//! geometry of this entity
Geometry geometry () const;
//! type of geometry of this entity
GeometryType type () const;
//! obtain entity seed
EntitySeed seed () const { return EntitySeed( elementInfo(), subEntity() ); }
//***********************************************
// end of interface methods
//***********************************************
//! needed for the LevelIterator and LeafIterator
ALBERTA EL_INFO *getElInfo () const;
const ElementInfo &elementInfo () const { return elementInfo_; }
//! equality of entities
bool equals ( const This &other ) const;
void clearElement ();
void setElement ( const ElementInfo &elementInfo, int subEntity );
// same as setElInfo just with a entity given
void setEntity ( const This &other );
//! obtain a reference to the grid
const GridImp &grid () const
{
return *grid_;
}
//! obtain number of the subentity within the element (in ALBERTA numbering)
int subEntity () const
{
return subEntity_;
}
//! obtain twist
int twist () const
{
return elementInfo().template twist< codimension >( subEntity() );
}
private:
// grid this entity belong to
const GridImp *grid_;
// ALBERTA element info
ElementInfo elementInfo_;
// number of the subentity within the element (in ALBERTA numbering)
int subEntity_;
};
// AlbertaGridEntity for codimension 0
// -----------------------------------
/*!
A Grid is a container of grid entities. An entity is parametrized by the codimension.
An entity of codimension c in dimension d is a d-c dimensional object.
Entities of codimension 0 ("elements") are defined through template specialization. Note
that this specialization has an extended interface compared to the general case
Entities of codimension 0 allow to visit all neighbors, where
a neighbor is an entity of codimension 0 which has a common entity of codimension 1 with the
These neighbors are accessed via an iterator. This allows the implementation of
non-matching meshes. The number of neigbors may be different from the number of faces/edges
of an element!
*/
template< int dim, class GridImp >
class AlbertaGridEntity< 0, dim, GridImp >
: public EntityDefaultImplementation< 0, dim, GridImp, AlbertaGridEntity >
{
typedef AlbertaGridEntity< 0, dim, GridImp > This;
static const int dimworld = GridImp::dimensionworld;
friend class AlbertaGrid< dim, dimworld >;
friend class AlbertaGridLeafIntersection< GridImp >;
friend class AlbertaGridHierarchicIterator< GridImp >;
template< int, class, bool > friend class AlbertaGridTreeIterator;
friend class AlbertaGridEntityPointer<0,GridImp>;
public:
static const int dimension = dim;
static const int codimension = 0;
static const int mydimension = dimension - codimension;
template< int codim >
struct Codim
{
typedef typename GridImp::template Codim< codim >::EntityPointer
EntityPointer;
};
typedef typename GridImp::template Codim< 0 >::Entity Entity;
typedef typename GridImp::template Codim< 0 >::EntitySeed EntitySeed;
typedef typename GridImp::template Codim< 0 >::Geometry Geometry;
typedef typename GridImp::template Codim< 0 >::LocalGeometry LocalGeometry;
typedef typename GridImp::Traits::template Codim< 0 >::GeometryImpl GeometryImpl;
typedef typename GridImp::template Codim<0>::LevelIterator LevelIterator;
typedef typename GridImp::HierarchicIterator HierarchicIterator;
typedef typename GridImp::template Codim<0>::EntityPointer EntityPointer;
typedef Dune::AlbertaGridLeafIntersectionIterator< GridImp > AlbertaGridLeafIntersectionIterator;
typedef AlbertaGridLeafIntersectionIterator AlbertaGridLevelIntersectionIterator;
typedef Alberta::ElementInfo< dimension > ElementInfo;
//! constructor
explicit AlbertaGridEntity ( const GridImp &grid );
//! constructor
AlbertaGridEntity ( const GridImp &grid, const ElementInfo &elementInfo, int subEntity );
//! level of this element
int level () const;
//! index of the boundary which is associated with the entity, 0 for inner entities
int boundaryId () const;
//! geometry of this entity
Geometry geometry () const;
//! type of geometry of this entity
GeometryType type () const;
//! obtain entity seed
EntitySeed seed () const { return EntitySeed( elementInfo() ); }
/** obtain the number of subentities of a codimension
*
* \tparam codim codimension
*
* \returns the number of subentities of the given codimension
*/
template< int codim >
int count () const
{
return Alberta::NumSubEntities< dimension, codim >::value;
}
/** obtain a subentity
*
* \tparam codim codimension of the desired subentity
*
* \param[in] i number of the subentity (in generic numbering)
*
* \returns an EntityPointer to the subentity
*
* \note: The subentities are numbered 0, ..., count< codim >-1
*/
template< int codim >
typename Codim< codim >::EntityPointer subEntity ( int i ) const;
/*! Intra-level access to intersection with neighboring elements.
A neighbor is an entity of codimension 0
which has an entity of codimension 1 in commen with this entity. Access to neighbors
is provided using iterators. This allows meshes to be nonmatching. Returns iterator
referencing the first neighbor. */
AlbertaGridLeafIntersectionIterator ileafbegin () const;
//! Reference to one past the last intersection with neighbor
AlbertaGridLeafIntersectionIterator ileafend () const;
AlbertaGridLevelIntersectionIterator ilevelbegin () const
{
if( grid().maxLevel() == 0 )
return ileafbegin();
else
{
DUNE_THROW( NotImplemented, "method ilevelbegin not implemented for AlbertaGrid." );
return ileafend();
}
}
AlbertaGridLevelIntersectionIterator ilevelend () const
{
return ileafend();
}
//! returns true if entity is leaf entity, i.e. has no children
bool isLeaf () const;
//! Inter-level access to father element on coarser grid.
//! Assumes that meshes are nested.
EntityPointer father () const;
//! returns true if father entity exists
bool hasFather () const
{
return (this->level()>0);
}
/** \brief Location of this element relative to the father's reference element
*
* This information is sufficient to interpolate all dofs in conforming case.
* Nonconforming may require access to neighbors of father and computations
* with local coordinates.
* On the fly case is somewhat inefficient since dofs are visited several
* times. If we store interpolation matrices, this is tolerable.
*/
LocalGeometry geometryInFather () const;
/*! Inter-level access to son elements on higher levels<=maxlevel.
This is provided for sparsely stored nested unstructured meshes.
Returns iterator to first son.
*/
HierarchicIterator hbegin (int maxlevel) const;
//! Returns iterator to one past the last son
HierarchicIterator hend (int maxlevel) const;
/** \brief Was the entity created during the last adaptation cycle? */
bool isNew () const;
/**\brief Might the entity vanish during the next adaptation cycle? */
bool mightVanish () const;
/**\brief Returns true, if entity has intersections with boundary
*/
bool hasBoundaryIntersections () const ;
//! return partition type of this entity ( see grid.hh )
PartitionType partitionType() const;
//! equality of entities
bool equals ( const AlbertaGridEntity<0,dim,GridImp> & i) const;
// needed for LevelIterator to compare
ALBERTA EL_INFO *getElInfo () const;
const ElementInfo &elementInfo () const
{
return elementInfo_;
}
void clearElement ();
void setElement ( const ElementInfo &elementInfo, int subEntity );
// same as setElInfo just with a entity given
void setEntity ( const This &other );
//! obtain a reference to the grid
const GridImp &grid () const
{
return *grid_;
}
//! obtain number of the subentity within the element (in ALBERTA numbering)
int subEntity () const
{
return 0;
}
//! obtain twist
int twist () const
{
return elementInfo().template twist< codimension >( subEntity() );
}
//! obtain twist of a subentity
template< int codim >
int twist ( int i ) const
{
return elementInfo().template twist< codim >( grid().generic2alberta( codim, i ) );
}
private:
//! return which number of child we are, i.e. 0 or 1
int nChild () const;
//! the corresponding grid
const GridImp *grid_;
// Alberta element info
ElementInfo elementInfo_;
// local coordinates within father
typedef MakeableInterfaceObject< Geometry > GeometryObject;
};
} // namespace Dune
#endif // #if HAVE_ALBERTA
#endif // #ifndef DUNE_ALBERTA_ENTITY_HH
|