7#ifndef DUNE_FUNCTIONS_COMMON_SUBDOMAIN_HH
8#define DUNE_FUNCTIONS_COMMON_SUBDOMAIN_HH
17#include <dune/common/exceptions.hh>
18#include <dune/common/iteratorfacades.hh>
19#include <dune/common/iteratorrange.hh>
20#include <dune/common/rangeutilities.hh>
22#include <dune/geometry/type.hh>
23#include <dune/geometry/typeindex.hh>
25#include <dune/grid/common/mcmgmapper.hh>
26#include <dune/grid/common/partitionset.hh>
32 template<
class Gr
idView>
33 using GlobalIntersectionIteratorTraits = Dune::DefaultIteratorTraits<
34 std::forward_iterator_tag,
35 decltype(*std::declval<typename GridView::IntersectionIterator>())>;
38 template<
class GV,
class ContainsCallback>
39 class GlobalIntersectionIt
40 :
public Dune::IteratorFacadeForTraits<GlobalIntersectionIt<GV, ContainsCallback>, GlobalIntersectionIteratorTraits<GV>>
42 using Facade = Dune::IteratorFacadeForTraits<GlobalIntersectionIt<GV, ContainsCallback>, GlobalIntersectionIteratorTraits<GV>>;
47 using Element =
typename GridView::template Codim<0>::Entity;
48 using ElementIterator =
typename GridView::template Codim<0>::Iterator;
49 using IntersectionIterator =
typename GridView::IntersectionIterator;
51 class SentinelIterator
54 GlobalIntersectionIt(
const GridView& gridView,
const ContainsCallback& contains, ElementIterator elementIt, ElementIterator elementEnd)
57 , elementIt_(std::move(elementIt))
58 , elementEnd_(std::move(elementEnd))
60 if (elementIt_ != elementEnd_)
62 element_ = *elementIt_;
63 iIt_ = gridView_.ibegin(element_);
64 iEnd_ = gridView_.iend(element_);
65 if (not contains_(*iIt_))
70 using reference =
typename Facade::reference;
72 reference operator*()
const
77 GlobalIntersectionIt& operator++()
85 if (elementIt_ == elementEnd_)
87 element_ = *elementIt_;
88 iIt_ = gridView_.ibegin(element_);
89 iIt_ = gridView_.ibegin(element_);
90 iEnd_ = gridView_.iend(element_);
98 friend bool operator==(
const GlobalIntersectionIt& it1,
const GlobalIntersectionIt& it2)
100 if (it1.elementIt_ != it2.elementIt_)
102 if (it1.elementIt_ == it1.elementEnd_)
104 return (it1.iIt_ == it2.iIt_);
107 friend bool operator==(
const GlobalIntersectionIt& it1,
const SentinelIterator& it2)
109 return it1.elementIt_ == it1.elementEnd_;
114 ContainsCallback contains_;
115 ElementIterator elementIt_;
116 ElementIterator elementEnd_;
118 IntersectionIterator iIt_;
119 IntersectionIterator iEnd_;
149 using HostGridView = HGV;
153 using Grid =
typename HostGridView::Grid;
154 using Types = std::vector<Dune::GeometryType>;
171 using AllEntityMapper = Dune::MultipleCodimMultipleGeomTypeMapper<HostGridView>;
173 static auto allCodimLayout()
175 return [](Dune::GeometryType, int) {
return true; };
178 static constexpr auto typeIndexSize = Dune::GlobalGeometryTypeIndex::size(
dimension);
179 static constexpr auto unusesIndex = std::numeric_limits<IndexType>::max();
197 return sizePerGT_[Dune::GlobalGeometryTypeIndex::index(gt)];
205 template<
class Entity>
209 if (
index==unusesIndex)
210 DUNE_THROW(Dune::InvalidStateException,
"Accessing nonexisting entry using SubDomainIndexSet::index()!");
220 template<
class Entity>
224 if (
index==unusesIndex)
225 DUNE_THROW(Dune::InvalidStateException,
"Accessing nonexisting entry using SubDomainIndexSet::subIndex()!");
235 template<
class Entity >
259 const auto& re = referenceElement(element);
260 for (
auto codim : Dune::range(0,
dimension+1))
262 for (
auto subEntity : Dune::range(re.size(codim)))
265 if (
index==unusesIndex)
267 const auto& type = re.type(subEntity, codim);
268 const auto typeIndex = Dune::GlobalGeometryTypeIndex::index(type);
326 class NonImplementedIterator
329 NonImplementedIterator()
331 static_assert(codim==0,
"SubDomainGridView::Codim::Iterator<codim> is only implemented for codim=0");
335 template<PartitionIteratorType pit>
336 class ElementIterator
341 using HostElementIterator =
typename HGV::template
Codim<0>::template Partition<pit>::Iterator;
345 , hostIt_(std::move(it))
346 , hostEndIt_(std::move(endIt))
348 while ((hostIt_!= hostEndIt_) and (not
indexSet_->contains(*hostIt_)))
352 ElementIterator& operator++()
355 while ((hostIt_!= hostEndIt_) and (not
indexSet_->contains(*hostIt_)))
360 const Element& operator*()
const
365 friend bool operator==(
const ElementIterator& a,
const ElementIterator& b)
367 return a.hostIt_==b.hostIt_;
371 HostElementIterator hostIt_;
372 HostElementIterator hostEndIt_;
380 using Grid =
typename HostGridView::Grid;
394 using Iterator = std::conditional_t<codim==0, ElementIterator<All_Partition>, NonImplementedIterator<codim>>;
396 template<PartitionIteratorType pit>
399 using Iterator = std::conditional_t<codim==0, ElementIterator<pit>, NonImplementedIterator<codim>>;
427 int size(Dune::GeometryType gt)
const
432 template<
class Entity>
439 template<
int codim, PartitionIteratorType pit = All_Partition>
440 typename Codim<codim>::template Partition<pit>::Iterator
begin()
const
442 static_assert(codim==0,
"SubDomainGridView::begin<codim> is only implemented for codim=0");
447 template<
int codim, PartitionIteratorType pit = All_Partition>
448 typename Codim<codim>::template Partition<pit>::Iterator
end()
const
450 static_assert(codim==0,
"SubDomainGridView::end<codim> is only implemented for codim=0");
486 template<
class HostGr
idView>
489 return Dune::IteratorRange(subDomainGridView.template begin<0>(), subDomainGridView.template end<0>());
497 template<
class HostGr
idView,
unsigned int partitions>
500 constexpr auto pit = partitionSet.partitionIterator();
501 return Dune::IteratorRange(subDomainGridView.template begin<0, pit>(), subDomainGridView.template end<0, pit>());
509 template<
class HostGr
idView,
class Element>
512 return Dune::IteratorRange(subDomainGridView.
ibegin(element), subDomainGridView.
iend(element));
538 using Grid =
typename HostGridView::Grid;
573 return indexSet_.hostGridView();
579 indexSet_.insertElement(element);
585 return indexSet_.contains(element);
599 template<
class SubDomainA,
class SubDomainB>
603 std::is_same_v<typename SubDomainA::GridView::Intersection, typename SubDomainB::GridView::Intersection>,
604 "SubDomainInterface requires that both SubDomain types have the same Intersection type");
618 : subDomainA_(subDomainA)
619 , subDomainB_(subDomainB)
633 if (is.boundary() or not(is.neighbor()))
635 return (subDomainA_.contains(is.inside()) && subDomainB_.contains(is.outside()))
636 || (subDomainA_.contains(is.outside()) && subDomainB_.contains(is.inside()));
649 if (is.boundary() or not(is.neighbor()))
651 return (subDomainA_.contains(is.inside()) && subDomainB_.contains(is.outside()));
662 return Impl::GlobalIntersectionIt(subDomainA_.gridView(), [&](
const auto& is) {
663 if (is.boundary() or not(is.neighbor()))
665 return subDomainB_.indexSet().contains(is.outside());
666 }, subDomainA_.gridView().template
begin<0>(), subDomainA_.gridView().template
end<0>());
672 return typename decltype(
begin())::SentinelIterator();
676 const SubDomainA& subDomainA_;
677 const SubDomainB& subDomainB_;
687 template<
class SubDomain>
696 : subDomain_(subDomain)
702 if (is.boundary() or not(is.neighbor()))
704 return subDomain_.contains(is.inside()) and subDomain_.contains(is.outside());
auto elements(const SubDomainGridView< HostGridView > &subDomainGridView)
ADL findable access to element range for a SubDomainGridView.
Definition subdomain.hh:487
auto intersections(const SubDomainGridView< HostGridView > &subDomainGridView, const Element &element)
ADL findable access to intersection range for an element of a SubDomainGridView.
Definition subdomain.hh:510
Definition subdomain.hh:28
An IndexSet for a sub-domain.
Definition subdomain.hh:148
SubDomainIndexSet(const HostGridView &hostGridView)
Construct SubDomainIndexSet for underlying host grid view.
Definition subdomain.hh:184
std::array< std::size_t, typeIndexSize > sizePerGT_
Definition subdomain.hh:297
std::vector< IndexType > indices_
Definition subdomain.hh:304
IndexType index(const typename Codim< cc >::Entity &entity) const
Definition subdomain.hh:215
@ dimension
Definition subdomain.hh:167
IndexType index(const Entity &entity) const
Definition subdomain.hh:206
IndexType size(int codim) const
Definition subdomain.hh:200
AllEntityMapper allEntityMapper_
Definition subdomain.hh:301
IndexType size(Dune::GeometryType gt) const
Definition subdomain.hh:195
void insertElement(const typename Codim< 0 >::Entity &element)
Insert element and all its sub-entities into SubDomainIndexSet.
Definition subdomain.hh:257
Types types(int codim) const
Definition subdomain.hh:241
std::vector< Dune::GeometryType > Types
Definition subdomain.hh:154
IndexType subIndex(const typename Codim< cc >::Entity &entity, int subEntity, unsigned int codim) const
Definition subdomain.hh:230
HostGridView hostGridView_
Definition subdomain.hh:294
std::array< std::size_t, dimension+1 > sizePerCodim_
Definition subdomain.hh:298
typename HostGridView::Grid Grid
Definition subdomain.hh:153
const HostGridView & hostGridView() const
Definition subdomain.hh:251
void clear()
Definition subdomain.hh:282
bool contains(const Entity &entity) const
Definition subdomain.hh:236
std::array< Types, dimension+1 > typesPerCodim_
Definition subdomain.hh:299
std::size_t IndexType
Definition subdomain.hh:155
IndexType subIndex(const Entity &entity, int subEntity, unsigned int codim) const
Definition subdomain.hh:221
Codim specific typedefs.
Definition subdomain.hh:160
typename Grid::template Codim< codim >::EntitySeed EntitySeed
Definition subdomain.hh:162
typename Grid::template Codim< codim >::Geometry Geometry
Definition subdomain.hh:163
typename Grid::template Codim< codim >::LocalGeometry LocalGeometry
Definition subdomain.hh:164
typename Grid::template Codim< codim >::Entity Entity
Definition subdomain.hh:161
A GridView for a sub-domain.
Definition subdomain.hh:323
@ dimensionworld
Definition subdomain.hh:404
typename HostGridView::Grid Grid
Definition subdomain.hh:380
Codim< codim >::template Partition< pit >::Iterator end() const
Create an iterator pointing to the end of the range.
Definition subdomain.hh:448
bool contains(const Entity &entity) const
Definition subdomain.hh:433
const IndexSet * indexSet_
Definition subdomain.hh:476
const IndexSet & indexSet() const
Definition subdomain.hh:417
SubDomainGridView(const SubDomainGridView &other)=default
const Grid & grid() const
Definition subdomain.hh:412
@ dimension
Definition subdomain.hh:403
typename Grid::ctype ctype
Definition subdomain.hh:381
typename HostGridView::IntersectionIterator IntersectionIterator
Definition subdomain.hh:384
const HostGridView & hostGridView() const
Access underlying host grid view.
Definition subdomain.hh:470
SubDomainIndexSet< HostGridView > IndexSet
Definition subdomain.hh:382
typename HostGridView::Intersection Intersection
Definition subdomain.hh:383
decltype(auto) comm() const
Definition subdomain.hh:454
int size(int codim) const
Definition subdomain.hh:422
decltype(auto) ibegin(const typename Codim< 0 >::Entity &element) const
Definition subdomain.hh:459
int size(Dune::GeometryType gt) const
Definition subdomain.hh:427
decltype(auto) iend(const typename Codim< 0 >::Entity &element) const
Definition subdomain.hh:464
HGV HostGridView
Definition subdomain.hh:378
Codim< codim >::template Partition< pit >::Iterator begin() const
Create an iterator pointing to the begin of the range.
Definition subdomain.hh:440
SubDomainGridView(const IndexSet &indexSet)
Definition subdomain.hh:406
Codim specific typedefs.
Definition subdomain.hh:389
typename Grid::template Codim< codim >::Entity Entity
Definition subdomain.hh:390
typename Grid::template Codim< codim >::Geometry Geometry
Definition subdomain.hh:392
typename Grid::template Codim< codim >::LocalGeometry LocalGeometry
Definition subdomain.hh:393
typename Grid::template Codim< codim >::EntitySeed EntitySeed
Definition subdomain.hh:391
std::conditional_t< codim==0, ElementIterator< All_Partition >, NonImplementedIterator< codim > > Iterator
Definition subdomain.hh:394
Definition subdomain.hh:398
std::conditional_t< codim==0, ElementIterator< pit >, NonImplementedIterator< codim > > Iterator
Definition subdomain.hh:399
Class representing a sub-domain of a GridView.
Definition subdomain.hh:534
void insertElement(const typename Codim< 0 >::Entity &element)
Insert element and all its sub-entities into SubDomain.
Definition subdomain.hh:577
GridView gridView() const
Create grid view representing the SubDomain.
Definition subdomain.hh:565
const IndexSet & indexSet() const
Definition subdomain.hh:559
SubDomainGridView< HostGridView > GridView
Definition subdomain.hh:540
@ dimension
Definition subdomain.hh:552
HostGridView hostGridView() const
Access underlying host grid view.
Definition subdomain.hh:571
SubDomain(const HostGridView &hostGridView)
Construct SubDomain for underlying host grid view.
Definition subdomain.hh:555
typename HostGridView::Grid Grid
Definition subdomain.hh:538
bool contains(const typename Codim< 0 >::Entity &element) const
Check if element is contained in SubDomain.
Definition subdomain.hh:583
SubDomainIndexSet< HostGridView > IndexSet
Definition subdomain.hh:539
HGV HostGridView
Definition subdomain.hh:537
Codim specific typedefs.
Definition subdomain.hh:545
typename Grid::template Codim< codim >::Geometry Geometry
Definition subdomain.hh:548
typename Grid::template Codim< codim >::Entity Entity
Definition subdomain.hh:546
typename Grid::template Codim< codim >::LocalGeometry LocalGeometry
Definition subdomain.hh:549
typename Grid::template Codim< codim >::EntitySeed EntitySeed
Definition subdomain.hh:547
const auto end() const
End iterator (sentinel).
Definition subdomain.hh:670
bool contains(const Intersection &is) const
Check if intersection is contained in the interface between the subdomains.
Definition subdomain.hh:631
const auto begin() const
Begin iterator over all intersection between the subdomains.
Definition subdomain.hh:660
SubDomainInterface(const SubDomainA &subDomainA, const SubDomainB &subDomainB)
Create interface between two subdomains.
Definition subdomain.hh:617
bool isOriented(const Intersection &is) const
Check if intersection is oriented.
Definition subdomain.hh:647
typename SubDomainA::GridView::Intersection Intersection
Definition subdomain.hh:608
SubDomainSkeleton(const SubDomain &subDomain)
Create skeleton of a subdomain.
Definition subdomain.hh:695
bool contains(const Intersection &is) const
Check if intersection is contained in the skeleton of the subdomain.
Definition subdomain.hh:700
typename SubDomain::GridView::Intersection Intersection
Definition subdomain.hh:692