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 return sizePerGT_[Dune::GlobalGeometryTypeIndex::index(gt)];
240 }
241
242 IndexType size(int codim) const
243 {
244 return sizePerCodim_[codim];
245 }
246
247 template<class Entity>
248 IndexType index(const Entity& entity) const
249 {
250 auto index = indices_[allEntityMapper_.index(entity)];
251 if (index==unusesIndex)
252 DUNE_THROW(Dune::InvalidStateException, "Accessing nonexisting entry using SubDomainIndexSet::index()!");
253 return index;
254 }
255
256 template<int cc>
257 IndexType index(const typename Codim<cc>::Entity& entity) const
258 {
259 return index<typename Codim<cc>::Entity>(entity);
260 }
261
262 template<class Entity>
263 IndexType subIndex(const Entity& entity, int subEntity, unsigned int codim) const
264 {
265 auto index = indices_[allEntityMapper_.subIndex(entity, subEntity, codim)];
266 if (index==unusesIndex)
267 DUNE_THROW(Dune::InvalidStateException, "Accessing nonexisting entry using SubDomainIndexSet::subIndex()!");
268 return index;
269 }
270
271 template<int cc>
272 IndexType subIndex(const typename Codim<cc>::Entity& entity, int subEntity, unsigned int codim) const
273 {
274 return subIndex<typename Codim<cc>::Entity>(entity, subEntity, codim);
275 }
276
277 template<class Entity >
278 bool contains(const Entity& entity) const
279 {
280 return (indices_[allEntityMapper_.index(entity)] != unusesIndex);
281 }
282
283 Types types(int codim) const
284 {
285 return typesPerCodim_[codim];
286 }
287
288 // *********************************
289 // Extended methods
290 // *********************************
291
293 const HostGridView& hostGridView() const
294 {
295 return hostGridView_;
296 }
297
299 void insertElement(const typename Codim<0>::Entity& element)
300 {
301 const auto& re = referenceElement(element);
302 for (auto codim : Dune::range(0, dimension+1))
303 {
304 for (auto subEntity : Dune::range(re.size(codim)))
305 {
306 auto& index = indices_[allEntityMapper_.subIndex(element, subEntity, codim)];
307 if (index==unusesIndex)
308 {
309 const auto& type = re.type(subEntity, codim);
310 const auto typeIndex = Dune::GlobalGeometryTypeIndex::index(type);
311 index = sizePerGT_[typeIndex];
312 if (sizePerGT_[typeIndex]==0)
313 typesPerCodim_[codim].push_back(type);
314 sizePerGT_[typeIndex]++;
315 sizePerCodim_[codim]++;
316 }
317 }
318 }
319 }
320
321 protected:
322
323 // Clear all data
324 void clear()
325 {
326 for(auto& size : sizePerGT_)
327 size = 0;
328 for(auto& size : sizePerCodim_)
329 size = 0;
330 for(auto& types : typesPerCodim_)
331 types.clear();
332 indices_.clear();
333 indices_.resize(allEntityMapper_.size(), unusesIndex);
334 }
335
336 HostGridView hostGridView_;
337
338 // Global size information
339 std::array<std::size_t, typeIndexSize> sizePerGT_;
340 std::array<std::size_t, dimension+1> sizePerCodim_;
341 std::array<Types, dimension+1> typesPerCodim_;
342
343 AllEntityMapper allEntityMapper_;
344
345 // Index map
346 std::vector<IndexType> indices_;
347 };
348
349
350
363 template<class HGV>
365 {
366
367 template<int codim>
368 class NonImplementedIterator
369 {
370 public:
371 NonImplementedIterator()
372 {
373 static_assert(codim==0, "SubDomainGridView::Codim::Iterator<codim> is only implemented for codim=0");
374 }
375 };
376
377 template<PartitionIteratorType pit>
378 class ElementIterator
379 {
380 using Element = typename HGV::template Codim<0>::Entity;
381 public:
382
383 using HostElementIterator = typename HGV::template Codim<0>::template Partition<pit>::Iterator;
384
385 ElementIterator(const SubDomainIndexSet<HGV>& indexSet, HostElementIterator&& it, HostElementIterator&& endIt)
386 : indexSet_(&indexSet)
387 , hostIt_(std::move(it))
388 , hostEndIt_(std::move(endIt))
389 {
390 while ((hostIt_!= hostEndIt_) and (not indexSet_->contains(*hostIt_)))
391 ++hostIt_;
392 }
393
394 ElementIterator& operator++()
395 {
396 ++hostIt_;
397 while ((hostIt_!= hostEndIt_) and (not indexSet_->contains(*hostIt_)))
398 ++hostIt_;
399 return *this;
400 }
401
402 const Element& operator*() const
403 {
404 return *hostIt_;
405 }
406
407 friend bool operator==(const ElementIterator& a, const ElementIterator& b)
408 {
409 return a.hostIt_==b.hostIt_;
410 }
411
412 private:
413 HostElementIterator hostIt_;
414 HostElementIterator hostEndIt_;
415 const SubDomainIndexSet<HGV>* indexSet_;
416 };
417
418 public:
419
420 using HostGridView = HGV;
421
422 using Grid = typename HostGridView::Grid;
423 using ctype = typename Grid::ctype;
425 using Intersection = typename HostGridView::Intersection;
426 using IntersectionIterator = typename HostGridView::IntersectionIterator;
427
429 template<int codim>
430 struct Codim
431 {
432 using Entity = typename Grid::template Codim<codim>::Entity;
433 using EntitySeed = typename Grid::template Codim<codim>::EntitySeed;
434 using Geometry = typename Grid::template Codim<codim>::Geometry;
435 using LocalGeometry = typename Grid::template Codim<codim>::LocalGeometry;
436 using Iterator = std::conditional_t<codim==0, ElementIterator<All_Partition>, NonImplementedIterator<codim>>;
437
438 template<PartitionIteratorType pit>
439 struct Partition
440 {
441 using Iterator = std::conditional_t<codim==0, ElementIterator<pit>, NonImplementedIterator<codim>>;
442 };
443 };
444
445 enum {dimension = Grid::dimension};
446 enum {dimensionworld = Grid::dimensionworld};
447
448 SubDomainGridView(const IndexSet& indexSet)
449 : indexSet_(&indexSet)
450 {}
451
452 SubDomainGridView(const SubDomainGridView& other) = default;
453
454 const Grid& grid() const
455 {
456 return indexSet_->hostGridView().grid();
457 }
458
459 const IndexSet& indexSet() const
460 {
461 return *indexSet_;
462 }
463
464 int size(int codim) const
465 {
466 return indexSet_->size(codim);
467 }
468
469 int size(Dune::GeometryType gt) const
470 {
471 return indexSet_->size(gt);
472 }
473
474 template<class Entity>
475 bool contains(const Entity& entity) const
476 {
477 return indexSet_->contains(entity);
478 }
479
481 template<int codim, PartitionIteratorType pit = All_Partition>
482 typename Codim<codim>::template Partition<pit>::Iterator begin() const
483 {
484 static_assert(codim==0, "SubDomainGridView::begin<codim> is only implemented for codim=0");
485 return {indexSet(), hostGridView().template begin<codim, pit>(), hostGridView().template end<codim, pit>()};
486 }
487
489 template<int codim, PartitionIteratorType pit = All_Partition>
490 typename Codim<codim>::template Partition<pit>::Iterator end() const
491 {
492 static_assert(codim==0, "SubDomainGridView::end<codim> is only implemented for codim=0");
493 return {indexSet(), hostGridView().template end<codim, pit>(), hostGridView().template end<codim, pit>()};
494 }
495
496 decltype(auto) comm() const
497 {
498 return hostGridView().comm();
499 }
500
501 decltype(auto) ibegin(const typename Codim<0>::Entity& element) const
502 {
503 return hostGridView().ibegin(element);
504 }
505
506 decltype(auto) iend(const typename Codim<0>::Entity& element) const
507 {
508 return hostGridView().iend(element);
509 }
510
512 const HostGridView& hostGridView() const
513 {
514 return indexSet_->hostGridView();
515 }
516
517 protected:
518 const IndexSet* indexSet_;
519 };
520
521
522
528 template<class HostGridView>
529 auto elements(const SubDomainGridView<HostGridView>& subDomainGridView)
530 {
531 return Dune::IteratorRange(subDomainGridView.template begin<0>(), subDomainGridView.template end<0>());
532 }
533
539 template<class HostGridView, unsigned int partitions>
541 {
542 constexpr auto pit = partitionSet.partitionIterator();
543 return Dune::IteratorRange(subDomainGridView.template begin<0, pit>(), subDomainGridView.template end<0, pit>());
544 }
545
551 template<class HostGridView, class Element>
552 auto intersections(const SubDomainGridView<HostGridView>& subDomainGridView, const Element& element)
553 {
554 return Dune::IteratorRange(subDomainGridView.ibegin(element), subDomainGridView.iend(element));
555 }
556
557
558
574 template<class HGV>
576 {
577 public:
578
579 using HostGridView = HGV;
580 using Grid = typename HostGridView::Grid;
583
585 template<int codim>
586 struct Codim
587 {
588 using Entity = typename Grid::template Codim<codim>::Entity;
589 using EntitySeed = typename Grid::template Codim<codim>::EntitySeed;
590 using Geometry = typename Grid::template Codim<codim>::Geometry;
591 using LocalGeometry = typename Grid::template Codim<codim>::LocalGeometry;
592 };
593
594 enum {dimension = Grid::dimension};
595
597 SubDomain(const HostGridView& hostGridView)
598 : indexSet_(hostGridView)
599 {}
600
601 const IndexSet& indexSet() const
602 {
603 return indexSet_;
604 }
605
608 {
609 return GridView(indexSet_);
610 }
611
613 HostGridView hostGridView() const
614 {
615 return indexSet_.hostGridView();
616 }
617
619 void insertElement(const typename Codim<0>::Entity& element)
620 {
621 indexSet_.insertElement(element);
622 }
623
625 bool contains(const typename Codim<0>::Entity& element) const
626 {
627 return indexSet_.contains(element);
628 }
629
630 private:
631 IndexSet indexSet_;
632 };
633
634
635
641 template<class SubDomainA, class SubDomainB>
643 {
644 static_assert(
645 std::is_same_v<typename SubDomainA::GridView::Intersection, typename SubDomainB::GridView::Intersection>,
646 "SubDomainInterface requires that both SubDomain types have the same Intersection type");
647
648 public:
649
650 using Intersection = typename SubDomainA::GridView::Intersection;
651
659 SubDomainInterface(const SubDomainA& subDomainA, const SubDomainB& subDomainB)
660 : subDomainA_(subDomainA)
661 , subDomainB_(subDomainB)
662 {}
663
673 bool contains(const Intersection& is) const
674 {
675 if (is.boundary() or not(is.neighbor()))
676 return false;
677 return (subDomainA_.contains(is.inside()) && subDomainB_.contains(is.outside()))
678 || (subDomainA_.contains(is.outside()) && subDomainB_.contains(is.inside()));
679 }
680
689 bool isOriented(const Intersection& is) const
690 {
691 if (is.boundary() or not(is.neighbor()))
692 return false;
693 return (subDomainA_.contains(is.inside()) && subDomainB_.contains(is.outside()));
694 }
695
702 const auto begin() const
703 {
704 return Impl::GlobalIntersectionIt(subDomainA_.gridView(), [&](const auto& is) {
705 if (is.boundary() or not(is.neighbor()))
706 return false;
707 return subDomainB_.indexSet().contains(is.outside());
708 });
709 }
710
712 const auto end() const
713 {
714 return typename decltype(begin())::SentinelIterator();
715 }
716
717 private:
718 const SubDomainA& subDomainA_;
719 const SubDomainB& subDomainB_;
720 };
721
722
723
729 template<class SubDomain>
731 {
732 public:
733
734 using Intersection = typename SubDomain::GridView::Intersection;
735
737 SubDomainSkeleton(const SubDomain& subDomain)
738 : subDomain_(subDomain)
739 {}
740
742 bool contains(const Intersection& is) const
743 {
744 if (is.boundary() or not(is.neighbor()))
745 return false;
746 return subDomain_.contains(is.inside()) and subDomain_.contains(is.outside());
747 }
748
749 private:
750 const SubDomain& subDomain_;
751 };
752
753
754
755} // namespace Dune::Functions::Experimental
756
757#endif// DUNE_FUNCTIONS_COMMON_SUBDOMAIN_HH
Wrapper class for entities.
Definition: entity.hh:66
A GridView for a sub-domain.
Definition: subdomain.hh:365
Codim< codim >::template Partition< pit >::Iterator end() const
Create an iterator pointing to the end of the range.
Definition: subdomain.hh:490
const HostGridView & hostGridView() const
Access underlying host grid view.
Definition: subdomain.hh:512
Codim< codim >::template Partition< pit >::Iterator begin() const
Create an iterator pointing to the begin of the range.
Definition: subdomain.hh:482
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:299
const HostGridView & hostGridView() const
Access underlying host grid view.
Definition: subdomain.hh:293
Class representing the intersection between two subdomains.
Definition: subdomain.hh:643
const auto end() const
End iterator (sentinel)
Definition: subdomain.hh:712
bool contains(const Intersection &is) const
Check if intersection is contained in the interface between the subdomains.
Definition: subdomain.hh:673
const auto begin() const
Begin iterator over all intersection between the subdomains.
Definition: subdomain.hh:702
SubDomainInterface(const SubDomainA &subDomainA, const SubDomainB &subDomainB)
Create interface between two subdomains.
Definition: subdomain.hh:659
bool isOriented(const Intersection &is) const
Check if intersection is oriented.
Definition: subdomain.hh:689
Class representing the skeleton of a subdomain.
Definition: subdomain.hh:731
SubDomainSkeleton(const SubDomain &subDomain)
Create skeleton of a subdomain.
Definition: subdomain.hh:737
bool contains(const Intersection &is) const
Check if intersection is contained in the skeleton of the subdomain.
Definition: subdomain.hh:742
Class representing a sub-domain of a GridView.
Definition: subdomain.hh:576
void insertElement(const typename Codim< 0 >::Entity &element)
Insert element and all its sub-entities into SubDomain.
Definition: subdomain.hh:619
GridView gridView() const
Create grid view representing the SubDomain.
Definition: subdomain.hh:607
HostGridView hostGridView() const
Access underlying host grid view.
Definition: subdomain.hh:613
SubDomain(const HostGridView &hostGridView)
Construct SubDomain for underlying host grid view.
Definition: subdomain.hh:597
bool contains(const typename Codim< 0 >::Entity &element) const
Check if element is contained in SubDomain.
Definition: subdomain.hh:625
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:375
static constexpr int dimension
The dimension of the grid.
Definition: grid.hh:387
static constexpr int dimensionworld
The dimension of the world the grid lives in.
Definition: grid.hh:390
ct ctype
Define type used for coordinates in grid module.
Definition: grid.hh:518
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:204
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:185
Index index(const EntityType &e) const
Map entity to starting index in array for dof block.
Definition: mcmgmapper.hh:171
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
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:288
auto elements(const SubDomainGridView< HostGridView > &subDomainGridView, Dune::PartitionSet< partitions > partitionSet)
ADL findable access to element range for a SubDomainGridView.
Definition: subdomain.hh:540
auto intersections(const SubDomainGridView< HostGridView > &subDomainGridView, const Element &element)
ADL findable access to intersection range for an element of a SubDomainGridView.
Definition: subdomain.hh:552
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
constexpr bool operator==(const HybridMultiIndex< S... > &lhs, const HybridMultiIndex< T... > &rhs)
Compare two HybridMultiIndexs for value equality.
Definition: hybridmultiindex.hh:383
STL namespace.
Utilities for reduction like operations on ranges.
Static tag representing a codimension.
Definition: dimension.hh:24
Codim specific typedefs.
Definition: subdomain.hh:431
Codim specific typedefs.
Definition: subdomain.hh:202
Codim specific typedefs.
Definition: subdomain.hh:587
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 (Apr 21, 12:01, 2026)