3#ifndef DUNE_MMESH_GRID_ENTITY_HH
4#define DUNE_MMESH_GRID_ENTITY_HH
11#include <dune/grid/common/grid.hh>
16template <
int codim,
int dim,
class Gr
idImp>
22#include <dune/mmesh/grid/polygoncutting.hh>
23#include <dune/mmesh/misc/partitionhelper.hh>
26template <
class Gr
idImp>
27class MMeshLeafIntersectionIterator;
29template <
class Gr
idImp>
30class MMeshHierarchicIterator;
45template <
int codim,
int dim,
class Gr
idImp>
47#ifndef DOXYGEN_SHOULD_SKIP_THIS
48 :
public EntityDefaultImplementation<codim, dim, GridImp, MMeshEntity>
51 template <
class Gr
idImp_>
52 friend class MMeshLeafIndexSet;
54 template <
class Gr
idImp_>
55 friend class MMeshLocalIdSet;
57 template <
class Gr
idImp_>
58 friend class MMeshGlobalIdSet;
60 friend struct HostGridAccess<typename
std::remove_const<GridImp>
::type>;
63 using IdType = MMeshImpl::MultiId;
66 typedef typename GridImp::ctype ctype;
69 typedef typename GridImp::template HostGridEntity<codim> HostGridEntity;
72 typedef typename GridImp::template Codim<codim>::Entity Entity;
86 MMeshEntity(
const GridImp* mMesh, HostGridEntity&&
hostEntity)
89 MMeshEntity(
const MMeshEntity& original)
90 : hostEntity_(original.hostEntity_), mMesh_(original.mMesh_) {}
92 MMeshEntity(MMeshEntity&& original)
93 : hostEntity_(
std::move(original.hostEntity_)), mMesh_(original.mMesh_) {}
95 MMeshEntity& operator=(
const MMeshEntity& original) {
96 if (
this != &original) {
97 mMesh_ = original.mMesh_;
98 hostEntity_ = original.hostEntity_;
103 MMeshEntity& operator=(MMeshEntity&& original) {
104 if (
this != &original) {
105 mMesh_ = original.mMesh_;
106 hostEntity_ = std::move(original.hostEntity_);
112 template <
int cc = codim>
113 std::enable_if_t<cc == dim, bool> equals(
const MMeshEntity& other)
const {
114 return hostEntity_ == other.hostEntity_;
118 template <
int cc = codim>
119 std::enable_if_t<cc == 1 && dim == 2, bool> equals(
120 const MMeshEntity& other)
const {
121 return (hostEntity_ == other.hostEntity_) ||
122 (mMesh_->getHostGrid().mirror_edge(hostEntity_) ==
127 template <
int cc = codim>
128 std::enable_if_t<cc == 1 && dim == 3, bool> equals(
129 const MMeshEntity& other)
const {
130 return (hostEntity_ == other.hostEntity_) ||
132 mMesh_->getHostGrid().mirror_facet(other.hostEntity_));
136 template <
int cc = codim>
137 std::enable_if_t<cc == 2 && dim == 3, bool> equals(
138 const MMeshEntity& other)
const {
139 const auto& v0 = hostEntity_.first->vertex(hostEntity_.second);
140 const auto& v1 = hostEntity_.first->vertex(hostEntity_.third);
141 const auto& w0 = other.hostEntity_.first->vertex(other.hostEntity_.second);
142 const auto& w1 = other.hostEntity_.first->vertex(other.hostEntity_.third);
143 return (v0 == w0 && v1 == w1) || (v0 == w1 && v1 == w0);
160 const auto& ph = mMesh_->partitionHelper();
161 if constexpr (codim == 0 || codim == dim)
162 return ph.partitionType(hostEntity_->info().partition);
164 return ph.partitionType(
grid().entity(hostEntity_));
170 int n = dim - codim + 1;
171 int k = dim - cc + 1;
175 for (
int i = n - k + 1; i <= n; i++) binomial *= i;
176 for (
long i = 2; i <= k; i++) binomial /= i;
183 std::enable_if_t<codim == 1 && cc == dim,
184 typename GridImp::template Codim<dim>::Entity>
187 const auto& cell = hostEntity_.first;
189 MMeshImpl::cgalFacetToDuneFacet<dim, HostGridEntity>(hostEntity_);
191 cgalIndex(MMeshImpl::ref<dim>().
subEntity(facetIdx, 1, i, dim));
195 typename GridImp::template HostGridEntity<dim>(cell->vertex(i0)));
200 std::enable_if_t<codim == 2 && cc == 3,
201 typename GridImp::template Codim<3>::Entity>
204 const auto& cell = hostEntity_.first;
207 MMeshImpl::cgalEdgeToDuneEdge<3, HostGridEntity>(hostEntity_);
210 cgalIndex(MMeshImpl::ref<dim>().
subEntity(edgeIdx, 2, i, 3));
214 typename GridImp::template HostGridEntity<dim>(cell->vertex(i0)));
219 std::enable_if_t<codim == dim && cc == dim,
220 typename GridImp::template Codim<dim>::Entity>
227 template <
bool enable = true>
228 std::enable_if_t<codim == dim && enable, MMeshIncidentIterator<GridImp>>
235 template <
bool enable = true>
236 std::enable_if_t<codim == dim && enable, MMeshIncidentIterator<GridImp>>
243 template <
bool enable = true>
244 std::enable_if_t<codim == dim - 1 && enable,
252 template <
bool enable = true>
253 std::enable_if_t<codim == dim - 1 && enable,
261 template <
bool enable = true>
262 std::enable_if_t<codim == dim && enable, MMeshIncidentFacetsIterator<GridImp>>
269 template <
bool enable = true>
270 std::enable_if_t<codim == dim && enable, MMeshIncidentFacetsIterator<GridImp>>
274 Impl(mMesh_, hostEntity_,
true));
278 template <
bool enable = true>
279 std::enable_if_t<codim == dim && enable,
285 Impl(mMesh_, hostEntity_, includeInfinite));
289 template <
bool enable = true>
290 std::enable_if_t<codim == dim && enable,
296 Impl(mMesh_, hostEntity_, includeInfinite,
true));
300 template <
int cd = codim>
302 if (codim == dim)
return hostEntity_->info().insertionLevel;
307 template <
int cd = codim>
313 this->
template subEntity<dim>(i).impl().insertionLevel());
319 if constexpr (codim == dim)
320 return hostEntity_->info().isInterface;
322 DUNE_THROW(NotImplemented,
"isInterface for codim != dim");
328 if constexpr (codim == dim)
329 return hostEntity_->info().boundaryFlag;
331 DUNE_THROW(NotImplemented,
"boudnaryFlag for codim != dim");
338 GeometryType
type()
const {
return GeometryTypes::simplex(dim - codim); }
341 const HostGridEntity&
hostEntity()
const {
return hostEntity_; }
347 const GridImp&
grid()
const {
return *mMesh_; }
352 if (id_ == IdType()) {
353 typename IdType::VT idlist(dim + 1 - codim);
354 for (std::size_t i = 0; i < this->
subEntities(dim); ++i)
356 this->
template subEntity<dim>(i).impl().hostEntity()->info().id;
357 std::sort(idlist.begin(), idlist.end());
358 id_ = IdType(idlist);
366 const auto cgalIndex(
const std::size_t& i)
const {
367 if constexpr (codim != dim)
368 return hostEntity_.first->info().cgalIndex[i];
370 DUNE_THROW(NotImplemented,
"cgalIndex(i) for codim != dim");
379 HostGridEntity hostEntity_;
382 const GridImp* mMesh_;
394template <
int dim,
class Gr
idImp>
396#ifndef DOXYGEN_SHOULD_SKIP_THIS
397 :
public EntityDefaultImplementation<0, dim, GridImp, MMeshEntity>
400 friend struct HostGridAccess<typename
std::remove_const<GridImp>
::type>;
402 typedef Entity<0, dim, GridImp, MMeshEntity> EntityType;
406 typedef typename GridImp::template HostGridEntity<0> HostGridEntity;
408 typedef typename GridImp::template Codim<0>
::Geometry Geometry;
410 typedef typename GridImp::template Codim<0>::LocalGeometry LocalGeometry;
413 typedef typename Geometry::GlobalCoordinate GlobalCoordinate;
416 typedef typename GridImp::ctype ctype;
419 typedef GridImp Grid;
442 : hostEntity_(
hostEntity), isLeaf_(true), mMesh_(mMesh) {}
444 MMeshEntity(
const GridImp* mMesh, HostGridEntity&&
hostEntity)
445 : hostEntity_(
std::move(
hostEntity)), isLeaf_(true), mMesh_(mMesh) {}
447 MMeshEntity(
const GridImp* mMesh,
const HostGridEntity&
hostEntity,
449 : hostEntity_(
hostEntity), id_(
id), isLeaf_(false), mMesh_(mMesh) {}
451 MMeshEntity(
const GridImp* mMesh,
const VertexStorage& vertex)
453 {std::size_t(-4), std::size_t(-3), std::size_t(-2)})),
458 MMeshEntity(
const MMeshEntity& original)
459 : hostEntity_(original.hostEntity_),
461 isLeaf_(original.isLeaf_),
462 mMesh_(original.mMesh_),
463 vertex_(original.vertex_) {}
465 MMeshEntity(MMeshEntity&& original)
466 : hostEntity_(
std::move(original.hostEntity_)),
468 isLeaf_(original.isLeaf_),
469 mMesh_(original.mMesh_),
470 vertex_(original.vertex_) {}
472 MMeshEntity& operator=(
const MMeshEntity& original) {
473 if (
this != &original) {
474 mMesh_ = original.mMesh_;
475 hostEntity_ = original.hostEntity_;
476 isLeaf_ = original.isLeaf_;
478 vertex_ = original.vertex_;
483 MMeshEntity& operator=(MMeshEntity&& original) {
484 if (
this != &original) {
485 mMesh_ = original.mMesh_;
486 hostEntity_ = std::move(original.hostEntity_);
487 isLeaf_ = original.isLeaf_;
489 vertex_ = original.vertex_;
496 return hostEntity_ == other.hostEntity_;
501 return this->equals(other);
506 return hostEntity_ < other.hostEntity_;
511 DUNE_THROW(InvalidStateException,
512 "MMesh entities do no have a father, but a connectedComponent "
522 const ConnectedComponent& connectedComponent()
const {
523 assert(isNew() ==
true);
524 return mMesh_->getConnectedComponent(*
this);
528 const bool isNew()
const {
return hostEntity_->info().isNew; }
531 void setIsNew(
bool isNew)
const { hostEntity_->info().isNew = isNew; }
534 const bool mightVanish()
const {
return hostEntity_->info().mightVanish; }
538 hostEntity_->info().mightVanish = mightVanish;
542 void mark(
int refCount)
const { hostEntity_->info().mark = refCount; }
545 int getMark()
const {
return hostEntity_->info().mark; }
559 if (hostEntity_ ==
decltype(hostEntity_)())
return InteriorEntity;
561 const auto& ph = mMesh_->partitionHelper();
562 return ph.partitionType(hostEntity_->info().partition);
573 void bindFather(
const EntityType& father) { father_ = &father; }
578 if constexpr (dim != 2)
579 DUNE_THROW(NotImplemented,
"geometryInFather() for dim != 2");
581 assert(father_ !=
nullptr);
583 auto thisPoints = this->vertex_;
586 for (
int i = 0; i < 3; ++i) thisPoints[i] =
geometry().corner(i);
588 std::array<GlobalCoordinate, 3> local;
589 for (
int i = 0; i < 3; ++i)
590 local[i] = father_->impl().geometry().local(thisPoints[i]);
592 return LocalGeometry(local);
598 return MMeshImpl::ref<dim>().size(cc);
605 std::enable_if_t<cc == 0, typename GridImp::template Codim<cc>::Entity>
612 std::enable_if_t<cc == dim, typename GridImp::template Codim<cc>::Entity>
615 if (hostEntity_ != HostGridEntity()) {
616 const auto i0 = cgalIndex(i);
619 auto vh = mMesh_->getHostGrid().infinite_vertex();
621 return MMeshEntity<cc, dim, GridImp>(mMesh_, vh);
626 std::enable_if_t<cc == 1, typename GridImp::template Codim<cc>::Entity>
629 auto second = MMeshImpl::duneFacetToCgalSecond<dim>(i, cgalIndex());
630 return MMeshEntity<cc, dim, GridImp>(
632 typename GridImp::template HostGridEntity<1>(hostEntity_, second));
636 std::enable_if_t<cc == 2 && dim == 3,
637 typename GridImp::template Codim<cc>::Entity>
641 const auto i0 = cgalIndex(MMeshImpl::ref<dim>().
subEntity(i, 2, 0, 3));
642 const auto i1 = cgalIndex(MMeshImpl::ref<dim>().
subEntity(i, 2, 1, 3));
644 return MMeshEntity<cc, dim, GridImp>(
646 typename GridImp::template HostGridEntity<2>(hostEntity_, i0, i1));
679 bool isLeaf()
const {
return isLeaf_ && !isNew(); }
688 GeometryType
type()
const {
return GeometryTypes::simplex(dim); }
691 std::size_t
domainMarker()
const {
return hostEntity_->info().domainMarker; }
694 const HostGridEntity&
hostEntity()
const {
return hostEntity_; }
700 const GridImp&
grid()
const {
return *mMesh_; }
706 typename IdType::VT idlist(dim + 1);
707 for (std::size_t i = 0; i < this->
subEntities(dim); ++i)
708 idlist[i] = hostEntity_->vertex(i)->info().id;
709 std::sort(idlist.begin(), idlist.end());
718 const auto& cgalIndex(
const std::size_t& i)
const {
719 return hostEntity_->info().cgalIndex[i];
723 const auto& cgalIndex()
const {
return hostEntity_->info().cgalIndex; }
726 HostGridEntity hostEntity_;
735 const GridImp* mMesh_;
741 const EntityType* father_;
The implementation of a connected component of entities in MMeshThe connected component stores a list...
Definition: connectedcomponent.hh:33
void mark(int refCount) const
mark entity for refine or coarse
Definition: entity.hh:542
GridImp::template Codim< 0 >::EntitySeed EntitySeed
The type of the EntitySeed interface class.
Definition: entity.hh:428
void setWillVanish(bool mightVanish) const
set if this entity will vanish after adaptation
Definition: entity.hh:537
MMeshLeafIntersectionIterator< GridImp > ileafbegin() const
First leaf intersection.
Definition: entity.hh:650
PartitionType partitionType() const
The partition type for parallel computing.
Definition: entity.hh:557
bool operator<(const MMeshEntity &other) const
returns true if host entities are equal
Definition: entity.hh:505
bool isLeaf() const
returns true if Entity has no children
Definition: entity.hh:679
const GridImp & grid() const
Return the host grid.
Definition: entity.hh:700
LocalGeometry geometryInFather() const
Definition: entity.hh:577
int getMark() const
get mark of entity
Definition: entity.hh:545
MMeshLeafIntersectionIterator< GridImp > ileafend() const
Reference to one past the last leaf intersection.
Definition: entity.hh:655
MMeshImpl::MultiId IdType
define the type used for persistent indices
Definition: entity.hh:434
const bool isNew() const
returns true if this entity is new after adaptation
Definition: entity.hh:528
const bool mightVanish() const
returns true if this entity will vanish after adaptation
Definition: entity.hh:534
int level() const
Level of this element.
Definition: entity.hh:551
std::size_t domainMarker() const
Return domain marker of entity.
Definition: entity.hh:691
IdType id() const
Return id computed by vertex ids.
Definition: entity.hh:703
bool equals(const MMeshEntity &other) const
returns true if host entities are equal
Definition: entity.hh:495
VertexStorage vertex_
the vertices of the host entity object of this entity (for caching entity)
Definition: entity.hh:739
bool wasRefined() const
returns if grid was refined
Definition: entity.hh:682
Geometry geometry() const
Geometry of this entity.
Definition: entity.hh:566
unsigned int subEntities(unsigned int cc) const
Return the number of subEntities of codimension cc.
Definition: entity.hh:597
std::array< GlobalCoordinate, dim+1 > VertexStorage
define the type used for storage the vertices of a caching entity
Definition: entity.hh:437
bool operator==(const MMeshEntity &other) const
returns true if host entities are equal
Definition: entity.hh:500
MMeshLeafIntersectionIterator< GridImp > ilevelbegin() const
We only have one level.
Definition: entity.hh:660
GeometryType type() const
returns the geometry type
Definition: entity.hh:688
bool mightBeCoarsened() const
returns if grid might be coarsened
Definition: entity.hh:685
MMeshHierarchicIterator< GridImp > hbegin(int maxlevel) const
First hierarchic entity, i.e. this entity, because we only have one level.
Definition: entity.hh:669
EntitySeed seed() const
Create EntitySeed.
Definition: entity.hh:548
MMeshEntity father() const
returns the father entity
Definition: entity.hh:510
const HostGridEntity & hostEntity() const
Return the host entity.
Definition: entity.hh:694
HostGridEntity & hostEntity()
Return the host entity.
Definition: entity.hh:697
bool hasFather() const
returns true if father entity exists
Definition: entity.hh:518
void setIsNew(bool isNew) const
set if this entity is new after adaptation
Definition: entity.hh:531
MMeshHierarchicIterator< GridImp > hend(int maxlevel) const
Reference to one past the last hierarchic entity.
Definition: entity.hh:674
std::enable_if_t< cc==0, typename GridImp::template Codim< cc >::Entity > subEntity(unsigned int i) const
Provide access to sub entity i of given codimension. Entities are numbered 0 ... subEntities(cc)-1.
Definition: entity.hh:606
The implementation of entities in a MMesh.
Definition: entity.hh:50
GridImp::template Codim< codim >::Geometry Geometry
The type of the Geometry interface class.
Definition: entity.hh:76
std::enable_if_t< cd !=dim, std::size_t > insertionLevel() const
Definition: entity.hh:308
std::enable_if_t< codim==dim &&cc==dim, typename GridImp::template Codim< dim >::Entity > subEntity(unsigned int i) const
Obtain a cc dim subEntity of a codim dim entity.
Definition: entity.hh:221
std::enable_if_t< codim==2 &&cc==3, typename GridImp::template Codim< 3 >::Entity > subEntity(unsigned int i) const
Obtain a cc 3 subEntity of a codim 2 entity (only for 3d)
Definition: entity.hh:202
Geometry geometry() const
geometry of this entity
Definition: entity.hh:335
std::enable_if_t< codim==1 &&cc==dim, typename GridImp::template Codim< dim >::Entity > subEntity(unsigned int i) const
Obtain a cc dim subEntity of a codim 1 entity.
Definition: entity.hh:185
GridImp::template Codim< codim >::EntitySeed EntitySeed
The type of the EntitySeed interface class.
Definition: entity.hh:79
const GridImp & grid() const
returns the grid
Definition: entity.hh:347
const HostGridEntity & hostEntity() const
returns the host entity
Definition: entity.hh:341
std::enable_if_t< codim==dim &&enable, MMeshIncidentVerticesIterator< GridImp > > incidentVerticesBegin(bool includeInfinite) const
First incident vertex.
Definition: entity.hh:281
unsigned int subEntities(unsigned int cc) const
Return the number of subEntities of codimension codim.
Definition: entity.hh:168
bool hasFather() const
returns true if father entity exists
Definition: entity.hh:147
bool isInterface() const
Return if vertex is part of the interface.
Definition: entity.hh:318
std::enable_if_t< cd==dim, std::size_t > insertionLevel() const
Return insertion level of vertex.
Definition: entity.hh:301
int boundaryFlag() const
Definition: entity.hh:327
EntitySeed seed() const
Return entity seed.
Definition: entity.hh:150
std::enable_if_t< codim==dim &&enable, MMeshIncidentVerticesIterator< GridImp > > incidentVerticesEnd(bool includeInfinite) const
Last incident vertex.
Definition: entity.hh:292
std::enable_if_t< codim==dim &&enable, MMeshIncidentIterator< GridImp > > incidentBegin() const
First incident element.
Definition: entity.hh:229
std::enable_if_t< codim==dim &&enable, MMeshIncidentFacetsIterator< GridImp > > incidentFacetsEnd() const
Last incident facet.
Definition: entity.hh:271
IdType id() const
returns id computed by vertex ids
Definition: entity.hh:350
std::enable_if_t< codim==dim &&enable, MMeshIncidentFacetsIterator< GridImp > > incidentFacetsBegin() const
First incident facet.
Definition: entity.hh:263
std::enable_if_t< codim==dim - 1 &&enable, MMeshEdgeIncidentIterator< GridImp > > incidentEnd() const
Last incident element.
Definition: entity.hh:255
HostGridEntity & hostEntity()
returns the host entity
Definition: entity.hh:344
std::enable_if_t< codim==dim - 1 &&enable, MMeshEdgeIncidentIterator< GridImp > > incidentBegin() const
First incident element.
Definition: entity.hh:246
GeometryType type() const
returns the geometry type
Definition: entity.hh:338
std::enable_if_t< codim==dim &&enable, MMeshIncidentIterator< GridImp > > incidentEnd() const
Last incident element.
Definition: entity.hh:237
PartitionType partitionType() const
The partition type for parallel computing.
Definition: entity.hh:159
int level() const
level of this element
Definition: entity.hh:153
Iterator over the descendants of an entity.Mesh entities of codimension 0 ("elements") allow to visit...
Definition: hierarchiciterator.hh:22
Iterator over all element neighborsMesh entities of codimension 0 ("elements") allow to visit all nei...
Definition: intersectioniterator.hh:28
The MMeshCachingEntity class.
The MMeshConnectedComponent class.
The MMeshIncidentIterator class.
EntityIterator< Grid::dimension, Grid, MMeshIncidentVerticesIteratorImp< Grid, Grid::dimensionworld > > MMeshIncidentVerticesIterator
The Incident Facets Iterator alias.
Definition: incidentiterator.hh:51
EntityIterator< 0, Grid, MMeshEdgeIncidentIteratorImp< Grid, Grid::dimension > > MMeshEdgeIncidentIterator
The Incident Entity Iterator alias for edges.
Definition: incidentiterator.hh:31
EntityIterator< 0, Grid, MMeshIncidentIteratorImp< Grid, Grid::dimension > > MMeshIncidentIterator
The Incident Entity Iterator alias.
Definition: incidentiterator.hh:21
EntityIterator< 1, Grid, MMeshIncidentFacetsIteratorImp< Grid, Grid::dimension > > MMeshIncidentFacetsIterator
The Incident Facets Iterator alias.
Definition: incidentiterator.hh:41