DUNE PDELab (unstable)

subdomain.hh
1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2// vi: set et ts=4 sw=2 sts=2:
3
4// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file AUTHORS.md
5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR LGPL-3.0-or-later
6
7#ifndef DUNE_FUNCTIONS_COMMON_SUBDOMAIN_HH
8#define DUNE_FUNCTIONS_COMMON_SUBDOMAIN_HH
9
10#include <array>
11#include <cstddef>
12#include <limits>
13#include <optional>
14#include <type_traits>
15#include <utility>
16#include <variant>
17#include <vector>
18
21#include <dune/common/iteratorrange.hh>
23#include <dune/common/std/no_unique_address.hh>
24
25#include <dune/geometry/type.hh>
27
29#include <dune/grid/common/partitionset.hh>
30
31namespace Dune::Functions::Experimental {
32
33 namespace Impl {
34
35 template<class GV, class ContainsCallback>
36 class GlobalIntersectionIt
37 : public Dune::IteratorFacade<GlobalIntersectionIt<GV, ContainsCallback>, std::forward_iterator_tag, const typename GV::Intersection>
38 {
39 using Facade = Dune::IteratorFacade<GlobalIntersectionIt<GV, ContainsCallback>, std::forward_iterator_tag, const typename GV::Intersection>;
40
41 public:
42
43 using GridView = GV;
44 using Element = typename GridView::template Codim<0>::Entity;
45 using ElementIterator = typename GridView::template Codim<0>::Iterator;
46 using IntersectionIterator = typename GridView::IntersectionIterator;
47 using Intersection = typename GridView::Intersection;
48
49 private:
50 static constexpr bool cacheIntersection = not std::is_lvalue_reference_v<decltype(std::declval<IntersectionIterator>().operator*())>;
51 static constexpr bool cacheElement = not std::is_lvalue_reference_v<decltype(std::declval<ElementIterator>().operator*())>;
52
53 using ElementStorage = std::conditional_t<cacheElement, std::optional<Element>, std::monostate>;
54 using IntersectionStorage = std::conditional_t<cacheIntersection, std::optional<Intersection>, std::monostate>;
55
56 const Element& element() const
57 {
58 if constexpr (cacheElement)
59 return *element_;
60 else
61 return *elementIt_;
62 }
63
64 void updateElement()
65 {
66 if constexpr (cacheElement)
67 element_ = *elementIt_;
68 }
69
70 const Intersection& intersection() const
71 {
72 if constexpr (cacheIntersection)
73 return *intersection_;
74 else
75 return **iIt_;
76 }
77
78 void updateIntersection()
79 {
80 if constexpr (cacheIntersection)
81 intersection_ = **iIt_;
82 }
83
84 public:
85
86 class SentinelIterator
87 {};
88
89 GlobalIntersectionIt(const GridView& gridView, const ContainsCallback& contains, ElementIterator elementIt, ElementIterator elementEnd)
90 : gridView_(gridView)
91 , contains_(contains)
92 , elementIt_(std::move(elementIt))
93 , elementEnd_(std::move(elementEnd))
94 {
95 if (elementIt_ != elementEnd_)
96 {
97 updateElement();
98 iIt_ = gridView_.ibegin(element());
99 updateIntersection();
100 if (not contains_(intersection()))
101 ++(*this);
102 }
103 }
104
105 GlobalIntersectionIt(const GridView& gridView, const ContainsCallback& contains, ElementIterator elementIt)
106 : GlobalIntersectionIt(gridView, contains, elementIt, gridView.template end<0>())
107 {}
108
109 GlobalIntersectionIt(const GridView& gridView, const ContainsCallback& contains)
110 : GlobalIntersectionIt(gridView, contains, gridView.template begin<0>())
111 {}
112
113 using reference = typename Facade::reference;
114
115 reference operator*() const
116 {
117 return intersection();
118 }
119
120 GlobalIntersectionIt& operator++()
121 {
122 while(true)
123 {
124 ++(*iIt_);
125 if (*iIt_ == gridView_.iend(element()))
126 {
127 ++elementIt_;
128 if (elementIt_ == elementEnd_)
129 return *this;
130 updateElement();
131 iIt_ = gridView_.ibegin(element());
132 }
133 updateIntersection();
134 if (contains_(intersection()))
135 return *this;
136 }
137 return *this;
138 }
139
140 friend bool operator==(const GlobalIntersectionIt& it1, const GlobalIntersectionIt& it2)
141 {
142 if (it1.elementIt_ != it2.elementIt_)
143 return false;
144 if (it1.elementIt_ == it1.elementEnd_)
145 return true;
146 return (*(it1.iIt_) == *(it2.iIt_));
147 }
148
149 friend bool operator==(const GlobalIntersectionIt& it1, const SentinelIterator& it2)
150 {
151 return it1.elementIt_ == it1.elementEnd_;
152 }
153
154 private:
155 GridView gridView_;
156 ContainsCallback contains_;
157 ElementIterator elementIt_;
158 ElementIterator elementEnd_;
159 std::optional<IntersectionIterator> iIt_;
160 DUNE_NO_UNIQUE_ADDRESS ElementStorage element_;
161 DUNE_NO_UNIQUE_ADDRESS IntersectionStorage intersection_;
162 };
163
164 }
165
166
167
188 template<class HGV>
190 {
191 using HostGridView = HGV;
192
193 public:
194
195 using Grid = typename HostGridView::Grid;
196 using Types = std::vector<Dune::GeometryType>;
197 using IndexType = std::size_t;
198
200 template<int codim>
201 struct Codim
202 {
203 using Entity = typename Grid::template Codim<codim>::Entity;
204 using EntitySeed = typename Grid::template Codim<codim>::EntitySeed;
205 using Geometry = typename Grid::template Codim<codim>::Geometry;
206 using LocalGeometry = typename Grid::template Codim<codim>::LocalGeometry;
207 };
208
209 enum {dimension = Grid::dimension};
210
211 private:
212
214
215 static auto allCodimLayout()
216 {
217 return [](Dune::GeometryType, int) { return true; };
218 }
219
220 static constexpr auto typeIndexSize = Dune::GlobalGeometryTypeIndex::size(dimension);
221 static constexpr auto unusesIndex = std::numeric_limits<IndexType>::max();
222
223 public:
224
226 SubDomainIndexSet(const HostGridView& hostGridView)
227 : hostGridView_(hostGridView)
228 , allEntityMapper_(hostGridView_, allCodimLayout())
229 {
230 clear();
231 }
232
233 // *********************************
234 // IndexSet interface methods
235 // *********************************
236
237 IndexType size(Dune::GeometryType gt) const
238 {
239 if (gt.dim() <= dimension)
240 return sizePerGT_[Dune::GlobalGeometryTypeIndex::index(gt)];
241 else
242 return 0;
243 }
244
245 IndexType size(int codim) const
246 {
247 return sizePerCodim_[codim];
248 }
249
250 template<class Entity>
251 IndexType index(const Entity& entity) const
252 {
253 auto index = indices_[allEntityMapper_.index(entity)];
254 if (index==unusesIndex)
255 DUNE_THROW(Dune::InvalidStateException, "Accessing nonexisting entry using SubDomainIndexSet::index()!");
256 return index;
257 }
258
259 template<int cc>
260 IndexType index(const typename Codim<cc>::Entity& entity) const
261 {
262 return index<typename Codim<cc>::Entity>(entity);
263 }
264
265 template<class Entity>
266 IndexType subIndex(const Entity& entity, int subEntity, unsigned int codim) const
267 {
268 auto index = indices_[allEntityMapper_.subIndex(entity, subEntity, codim)];
269 if (index==unusesIndex)
270 DUNE_THROW(Dune::InvalidStateException, "Accessing nonexisting entry using SubDomainIndexSet::subIndex()!");
271 return index;
272 }
273
274 template<int cc>
275 IndexType subIndex(const typename Codim<cc>::Entity& entity, int subEntity, unsigned int codim) const
276 {
277 return subIndex<typename Codim<cc>::Entity>(entity, subEntity, codim);
278 }
279
280 template<class Entity >
281 bool contains(const Entity& entity) const
282 {
283 return (indices_[allEntityMapper_.index(entity)] != unusesIndex);
284 }
285
286 Types types(int codim) const
287 {
288 return typesPerCodim_[codim];
289 }
290
291 // *********************************
292 // Extended methods
293 // *********************************
294
296 const HostGridView& hostGridView() const
297 {
298 return hostGridView_;
299 }
300
302 void insertElement(const typename Codim<0>::Entity& element)
303 {
304 const auto& re = referenceElement(element);
305 for (auto codim : Dune::range(0, dimension+1))
306 {
307 for (auto subEntity : Dune::range(re.size(codim)))
308 {
309 auto& index = indices_[allEntityMapper_.subIndex(element, subEntity, codim)];
310 if (index==unusesIndex)
311 {
312 const auto& type = re.type(subEntity, codim);
313 const auto typeIndex = Dune::GlobalGeometryTypeIndex::index(type);
314 index = sizePerGT_[typeIndex];
315 if (sizePerGT_[typeIndex]==0)
316 typesPerCodim_[codim].push_back(type);
317 sizePerGT_[typeIndex]++;
318 sizePerCodim_[codim]++;
319 }
320 }
321 }
322 }
323
324 protected:
325
326 // Clear all data
327 void clear()
328 {
329 for(auto& size : sizePerGT_)
330 size = 0;
331 for(auto& size : sizePerCodim_)
332 size = 0;
333 for(auto& types : typesPerCodim_)
334 types.clear();
335 indices_.clear();
336 indices_.resize(allEntityMapper_.size(), unusesIndex);
337 }
338
339 HostGridView hostGridView_;
340
341 // Global size information
342 std::array<std::size_t, typeIndexSize> sizePerGT_;
343 std::array<std::size_t, dimension+1> sizePerCodim_;
344 std::array<Types, dimension+1> typesPerCodim_;
345
346 AllEntityMapper allEntityMapper_;
347
348 // Index map
349 std::vector<IndexType> indices_;
350 };
351
352
353
366 template<class HGV>
368 {
369
370 template<int codim>
371 class NonImplementedIterator
372 {
373 public:
374 NonImplementedIterator()
375 {
376 static_assert(codim==0, "SubDomainGridView::Codim::Iterator<codim> is only implemented for codim=0");
377 }
378 };
379
380 template<PartitionIteratorType pit>
381 class ElementIterator
382 {
383 using Element = typename HGV::template Codim<0>::Entity;
384 public:
385
386 using HostElementIterator = typename HGV::template Codim<0>::template Partition<pit>::Iterator;
387
388 ElementIterator(const SubDomainIndexSet<HGV>& indexSet, HostElementIterator&& it, HostElementIterator&& endIt)
389 : indexSet_(&indexSet)
390 , hostIt_(std::move(it))
391 , hostEndIt_(std::move(endIt))
392 {
393 while ((hostIt_!= hostEndIt_) and (not indexSet_->contains(*hostIt_)))
394 ++hostIt_;
395 }
396
397 ElementIterator& operator++()
398 {
399 ++hostIt_;
400 while ((hostIt_!= hostEndIt_) and (not indexSet_->contains(*hostIt_)))
401 ++hostIt_;
402 return *this;
403 }
404
405 const Element& operator*() const
406 {
407 return *hostIt_;
408 }
409
410 friend bool operator==(const ElementIterator& a, const ElementIterator& b)
411 {
412 return a.hostIt_==b.hostIt_;
413 }
414
415 private:
416 HostElementIterator hostIt_;
417 HostElementIterator hostEndIt_;
418 const SubDomainIndexSet<HGV>* indexSet_;
419 };
420
421 public:
422
423 using HostGridView = HGV;
424
425 using Grid = typename HostGridView::Grid;
426 using ctype = typename Grid::ctype;
428 using Intersection = typename HostGridView::Intersection;
429 using IntersectionIterator = typename HostGridView::IntersectionIterator;
430
432 template<int codim>
433 struct Codim
434 {
435 using Entity = typename Grid::template Codim<codim>::Entity;
436 using EntitySeed = typename Grid::template Codim<codim>::EntitySeed;
437 using Geometry = typename Grid::template Codim<codim>::Geometry;
438 using LocalGeometry = typename Grid::template Codim<codim>::LocalGeometry;
439 using Iterator = std::conditional_t<codim==0, ElementIterator<All_Partition>, NonImplementedIterator<codim>>;
440
441 template<PartitionIteratorType pit>
442 struct Partition
443 {
444 using Iterator = std::conditional_t<codim==0, ElementIterator<pit>, NonImplementedIterator<codim>>;
445 };
446 };
447
448 enum {dimension = Grid::dimension};
449 enum {dimensionworld = Grid::dimensionworld};
450
451 SubDomainGridView(const IndexSet& indexSet)
452 : indexSet_(&indexSet)
453 {}
454
455 SubDomainGridView(const SubDomainGridView& other) = default;
456
457 const Grid& grid() const
458 {
459 return indexSet_->hostGridView().grid();
460 }
461
462 const IndexSet& indexSet() const
463 {
464 return *indexSet_;
465 }
466
467 int size(int codim) const
468 {
469 return indexSet_->size(codim);
470 }
471
472 int size(Dune::GeometryType gt) const
473 {
474 return indexSet_->size(gt);
475 }
476
477 template<class Entity>
478 bool contains(const Entity& entity) const
479 {
480 return indexSet_->contains(entity);
481 }
482
484 template<int codim, PartitionIteratorType pit = All_Partition>
485 typename Codim<codim>::template Partition<pit>::Iterator begin() const
486 {
487 static_assert(codim==0, "SubDomainGridView::begin<codim> is only implemented for codim=0");
488 return {indexSet(), hostGridView().template begin<codim, pit>(), hostGridView().template end<codim, pit>()};
489 }
490
492 template<int codim, PartitionIteratorType pit = All_Partition>
493 typename Codim<codim>::template Partition<pit>::Iterator end() const
494 {
495 static_assert(codim==0, "SubDomainGridView::end<codim> is only implemented for codim=0");
496 return {indexSet(), hostGridView().template end<codim, pit>(), hostGridView().template end<codim, pit>()};
497 }
498
499 decltype(auto) comm() const
500 {
501 return hostGridView().comm();
502 }
503
504 decltype(auto) ibegin(const typename Codim<0>::Entity& element) const
505 {
506 return hostGridView().ibegin(element);
507 }
508
509 decltype(auto) iend(const typename Codim<0>::Entity& element) const
510 {
511 return hostGridView().iend(element);
512 }
513
515 const HostGridView& hostGridView() const
516 {
517 return indexSet_->hostGridView();
518 }
519
520 protected:
521 const IndexSet* indexSet_;
522 };
523
524
525
531 template<class HostGridView>
532 auto elements(const SubDomainGridView<HostGridView>& subDomainGridView)
533 {
534 return Dune::IteratorRange(subDomainGridView.template begin<0>(), subDomainGridView.template end<0>());
535 }
536
542 template<class HostGridView, unsigned int partitions>
544 {
545 constexpr auto pit = partitionSet.partitionIterator();
546 return Dune::IteratorRange(subDomainGridView.template begin<0, pit>(), subDomainGridView.template end<0, pit>());
547 }
548
554 template<class HostGridView, class Element>
555 auto intersections(const SubDomainGridView<HostGridView>& subDomainGridView, const Element& element)
556 {
557 return Dune::IteratorRange(subDomainGridView.ibegin(element), subDomainGridView.iend(element));
558 }
559
560
561
577 template<class HGV>
579 {
580 public:
581
582 using HostGridView = HGV;
583 using Grid = typename HostGridView::Grid;
586
588 template<int codim>
589 struct Codim
590 {
591 using Entity = typename Grid::template Codim<codim>::Entity;
592 using EntitySeed = typename Grid::template Codim<codim>::EntitySeed;
593 using Geometry = typename Grid::template Codim<codim>::Geometry;
594 using LocalGeometry = typename Grid::template Codim<codim>::LocalGeometry;
595 };
596
597 enum {dimension = Grid::dimension};
598
600 SubDomain(const HostGridView& hostGridView)
601 : indexSet_(hostGridView)
602 {}
603
604 const IndexSet& indexSet() const
605 {
606 return indexSet_;
607 }
608
611 {
612 return GridView(indexSet_);
613 }
614
616 HostGridView hostGridView() const
617 {
618 return indexSet_.hostGridView();
619 }
620
622 void insertElement(const typename Codim<0>::Entity& element)
623 {
624 indexSet_.insertElement(element);
625 }
626
628 bool contains(const typename Codim<0>::Entity& element) const
629 {
630 return indexSet_.contains(element);
631 }
632
633 private:
634 IndexSet indexSet_;
635 };
636
637
638
644 template<class SubDomainA, class SubDomainB>
646 {
647 static_assert(
648 std::is_same_v<typename SubDomainA::GridView::Intersection, typename SubDomainB::GridView::Intersection>,
649 "SubDomainInterface requires that both SubDomain types have the same Intersection type");
650
651 public:
652
653 using Intersection = typename SubDomainA::GridView::Intersection;
654
662 SubDomainInterface(const SubDomainA& subDomainA, const SubDomainB& subDomainB)
663 : subDomainA_(subDomainA)
664 , subDomainB_(subDomainB)
665 {}
666
676 bool contains(const Intersection& is) const
677 {
678 if (is.boundary() or not(is.neighbor()))
679 return false;
680 return (subDomainA_.contains(is.inside()) && subDomainB_.contains(is.outside()))
681 || (subDomainA_.contains(is.outside()) && subDomainB_.contains(is.inside()));
682 }
683
692 bool isOriented(const Intersection& is) const
693 {
694 if (is.boundary() or not(is.neighbor()))
695 return false;
696 return (subDomainA_.contains(is.inside()) && subDomainB_.contains(is.outside()));
697 }
698
705 const auto begin() const
706 {
707 return Impl::GlobalIntersectionIt(subDomainA_.gridView(), [&](const auto& is) {
708 if (is.boundary() or not(is.neighbor()))
709 return false;
710 return subDomainB_.indexSet().contains(is.outside());
711 });
712 }
713
715 const auto end() const
716 {
717 return typename decltype(begin())::SentinelIterator();
718 }
719
720 private:
721 const SubDomainA& subDomainA_;
722 const SubDomainB& subDomainB_;
723 };
724
725
726
732 template<class SubDomain>
734 {
735 public:
736
737 using Intersection = typename SubDomain::GridView::Intersection;
738
740 SubDomainSkeleton(const SubDomain& subDomain)
741 : subDomain_(subDomain)
742 {}
743
745 bool contains(const Intersection& is) const
746 {
747 if (is.boundary() or not(is.neighbor()))
748 return false;
749 return subDomain_.contains(is.inside()) and subDomain_.contains(is.outside());
750 }
751
752 private:
753 const SubDomain& subDomain_;
754 };
755
756
757
758} // namespace Dune::Functions::Experimental
759
760#endif// DUNE_FUNCTIONS_COMMON_SUBDOMAIN_HH
Wrapper class for entities.
Definition: entity.hh:66
A GridView for a sub-domain.
Definition: subdomain.hh:368
Codim< codim >::template Partition< pit >::Iterator end() const
Create an iterator pointing to the end of the range.
Definition: subdomain.hh:493
const HostGridView & hostGridView() const
Access underlying host grid view.
Definition: subdomain.hh:515
Codim< codim >::template Partition< pit >::Iterator begin() const
Create an iterator pointing to the begin of the range.
Definition: subdomain.hh:485
An IndexSet for a sub-domain.
Definition: subdomain.hh:190
SubDomainIndexSet(const HostGridView &hostGridView)
Construct SubDomainIndexSet for underlying host grid view.
Definition: subdomain.hh:226
void insertElement(const typename Codim< 0 >::Entity &element)
Insert element and all its sub-entities into SubDomainIndexSet.
Definition: subdomain.hh:302
const HostGridView & hostGridView() const
Access underlying host grid view.
Definition: subdomain.hh:296
Class representing the intersection between two subdomains.
Definition: subdomain.hh:646
const auto end() const
End iterator (sentinel)
Definition: subdomain.hh:715
bool contains(const Intersection &is) const
Check if intersection is contained in the interface between the subdomains.
Definition: subdomain.hh:676
const auto begin() const
Begin iterator over all intersection between the subdomains.
Definition: subdomain.hh:705
SubDomainInterface(const SubDomainA &subDomainA, const SubDomainB &subDomainB)
Create interface between two subdomains.
Definition: subdomain.hh:662
bool isOriented(const Intersection &is) const
Check if intersection is oriented.
Definition: subdomain.hh:692
Class representing the skeleton of a subdomain.
Definition: subdomain.hh:734
SubDomainSkeleton(const SubDomain &subDomain)
Create skeleton of a subdomain.
Definition: subdomain.hh:740
bool contains(const Intersection &is) const
Check if intersection is contained in the skeleton of the subdomain.
Definition: subdomain.hh:745
Class representing a sub-domain of a GridView.
Definition: subdomain.hh:579
void insertElement(const typename Codim< 0 >::Entity &element)
Insert element and all its sub-entities into SubDomain.
Definition: subdomain.hh:622
GridView gridView() const
Create grid view representing the SubDomain.
Definition: subdomain.hh:610
HostGridView hostGridView() const
Access underlying host grid view.
Definition: subdomain.hh:616
SubDomain(const HostGridView &hostGridView)
Construct SubDomain for underlying host grid view.
Definition: subdomain.hh:600
bool contains(const typename Codim< 0 >::Entity &element) const
Check if element is contained in SubDomain.
Definition: subdomain.hh:628
Unique label for each type of entities that can occur in DUNE grids.
Definition: type.hh:114
static constexpr std::size_t index(const GeometryType &gt)
Compute the index for the given geometry type over all dimensions.
Definition: typeindex.hh:138
static constexpr std::size_t size(std::size_t maxdim)
Compute total number of geometry types up to and including the given dimension.
Definition: typeindex.hh:125
Grid abstract base class.
Definition: grid.hh:393
static constexpr int dimension
The dimension of the grid.
Definition: grid.hh:405
static constexpr int dimensionworld
The dimension of the world the grid lives in.
Definition: grid.hh:408
ct ctype
Define type used for coordinates in grid module.
Definition: grid.hh:536
Index Set Interface base class.
Definition: indexidset.hh:78
Default exception if a function was called while the object is not in a valid state for that function...
Definition: exceptions.hh:375
CRTP-Mixing class for stl conformant iterators of given iterator category.
Definition: iteratorfacades.hh:1053
constexpr decltype(auto) operator*() const
Dereferencing operator.
Definition: iteratorfacades.hh:1119
constexpr decltype(auto) operator++()
Preincrement operator.
Definition: iteratorfacades.hh:1138
Simple range between a begin and an end iterator.
Definition: iteratorrange.hh:26
size_type size() const
Return total number of entities in the entity set managed by the mapper.
Definition: mcmgmapper.hh:246
Index subIndex(const typename GV::template Codim< 0 >::Entity &e, int i, unsigned int codim) const
Map subentity of codim 0 entity to starting index in array for dof block.
Definition: mcmgmapper.hh:227
Index index(const EntityType &e) const
Map entity to starting index in array for dof block.
Definition: mcmgmapper.hh:213
A few common exception classes.
#define DUNE_THROW(E,...)
Definition: exceptions.hh:314
bool gt(const T &first, const T &second, typename EpsilonType< T >::Type epsilon)
test if first greater than second
Definition: float_cmp.cc:158
Traits::IntersectionIterator IntersectionIterator
type of the intersection iterator
Definition: gridview.hh:92
Traits::Intersection Intersection
type of the intersection
Definition: gridview.hh:89
unspecified value type referenceElement(T &&... t)
Returns a reference element for the objects t....
constexpr auto max
Function object that returns the greater of the given values.
Definition: hybridutilities.hh:489
constexpr EnableIfInterOperable< T1, T2, bool >::type operator==(const ForwardIteratorFacade< T1, V1, R1, D > &lhs, const ForwardIteratorFacade< T2, V2, R2, D > &rhs)
Checks for equality.
Definition: iteratorfacades.hh:238
static constexpr IntegralRange< std::decay_t< T > > range(T &&from, U &&to) noexcept
free standing function for setting up a range based for loop over an integer range for (auto i: range...
Definition: rangeutilities.hh:293
auto elements(const SubDomainGridView< HostGridView > &subDomainGridView, Dune::PartitionSet< partitions > partitionSet)
ADL findable access to element range for a SubDomainGridView.
Definition: subdomain.hh:543
auto intersections(const SubDomainGridView< HostGridView > &subDomainGridView, const Element &element)
ADL findable access to intersection range for an element of a SubDomainGridView.
Definition: subdomain.hh:555
This file implements iterator facade classes for writing stl conformant iterators.
Mapper for multiple codim and multiple geometry types.
constexpr std::bool_constant<((II==value)||...)> contains(std::integer_sequence< T, II... >, std::integral_constant< T, value >)
Checks whether or not a given sequence contains a value.
Definition: integersequence.hh:137
STL namespace.
Utilities for reduction like operations on ranges.
Static tag representing a codimension.
Definition: dimension.hh:24
Codim specific typedefs.
Definition: subdomain.hh:434
Codim specific typedefs.
Definition: subdomain.hh:202
Codim specific typedefs.
Definition: subdomain.hh:590
A set of PartitionType values.
Definition: partitionset.hh:137
static constexpr PartitionIteratorType partitionIterator()
Returns the PartitionIteratorType that can be used to iterate over the partitions in the set.
Definition: partitionset.hh:182
A unique label for each type of element that can occur in a grid.
Helper classes to provide indices for geometrytypes for use in a vector.
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden & Uni Heidelberg  |  generated with Hugo v0.111.3 (Jun 10, 22:32, 2026)