1#ifndef DUNE_MULTIDOMAINGRID_SUBDOMAINGRID_HH
2#define DUNE_MULTIDOMAINGRID_SUBDOMAINGRID_HH
7#include <dune/common/exceptions.hh>
30template<
typename,
typename>
35template<
typename MDGr
id>
38template<
typename MDGr
id>
43 static const int dim = MDGrid::dimension;
44 static const int dimw = MDGrid::dimensionworld;
60 typename MDGrid::LeafIndexSetImp
62 typename MDGrid::LeafGridView::Intersection
72 typename MDGrid::LevelIndexSetImp
74 typename MDGrid::LevelGridView::Intersection
84 typename MDGrid::LeafIndexSetImp
86 typename MDGrid::LeafGridView::IntersectionIterator
92 typename MDGrid::LeafIndexSetImp
94 typename MDGrid::LeafGridView::Intersection
104 typename MDGrid::LevelIndexSetImp
106 typename MDGrid::LevelGridView::IntersectionIterator
112 typename MDGrid::LevelIndexSetImp
114 typename MDGrid::LevelGridView::Intersection
118 using HierarchicIterator = Dune::EntityIterator< 0, const Grid, HierarchicIteratorWrapper< const Grid > >;
130 using Entity = Dune::Entity<cd, dim, const Grid, EntityWrapper>;
134 template <PartitionIteratorType pitype>
178 typename MDGrid::HostGrid::Traits::GlobalIdSet
180 typename MDGrid::HostGrid::Traits::GlobalIdSet::IdType
187 typename MDGrid::HostGrid::Traits::LocalIdSet
189 typename MDGrid::HostGrid::Traits::LocalIdSet::IdType
198template<
typename MDGr
id>
200 public GridDefaultImplementation<MDGrid::dimension,
201 MDGrid::dimensionworld,
202 typename MDGrid::ctype,
203 SubDomainGridFamily<MDGrid> > {
205 template<
typename,
typename>
206 friend class ::Dune::mdgrid::MultiDomainGrid;
208 template<
int codim,
int dim,
typename Gr
idImp>
211 template<
int codim,
int dim,
typename Gr
idImp>
214 template<
typename,
typename,
int codim, PartitionIteratorType pitype,
typename Gr
idImp>
217 template<
typename Gr
idImp>
220 template<
int mydim,
int coorddim,
typename Gr
idImp>
223 template<
int mydim,
int coorddim,
typename Gr
idImp>
226 template<
typename Gr
idImp,
typename WrappedIndexSet>
229 template<
typename Gr
idImp,
typename WrappedIdSet>
232 template<
typename Gr
idImp>
233 friend struct ::Dune::mdgrid::detail::HostGridAccessor;
235 template<
typename,
typename,
typename>
238 template<
typename,
typename,
typename>
247 typedef GridDefaultImplementation<MDGrid::dimension,
248 MDGrid::dimensionworld,
249 typename MDGrid::ctype,
277 typedef typename MDGrid::ctype
ctype;
284 using BaseT::dimension;
285 using BaseT::dimensionworld;
290 template<
typename EntitySeed>
291 typename Traits::template Codim<EntitySeed::codimension>::Entity
292 entity(
const EntitySeed& entitySeed)
const
297 typename MDGrid::template Codim<EntitySeed::codimension>::Entity(
298 _grid.entity(entitySeed)
304 return _grid.maxLevel();
308 typename Traits::template Codim<codim>::LevelIterator
lbegin(
int level)
const {
311 typename MultiDomainGrid::LevelGridView::template Codim<codim>::template Partition<All_Partition>::Iterator,
316 &this->levelGridView(level).indexSet(),
317 _grid.levelGridView(level).template begin<codim>(),
318 _grid.levelGridView(level).template end<codim>()
323 typename Traits::template Codim<codim>::LevelIterator
lend(
int level)
const {
326 typename MultiDomainGrid::LevelGridView::template Codim<codim>::template Partition<All_Partition>::Iterator,
331 &this->levelGridView(level).indexSet(),
332 _grid.levelGridView(level).template end<codim>(),
333 _grid.levelGridView(level).template end<codim>()
337 template<
int codim, PartitionIteratorType pitype>
338 typename Traits::template Codim<codim>::template Partition<pitype>::LevelIterator
lbegin(
int level)
const {
341 typename MultiDomainGrid::LevelGridView::template Codim<codim>::template Partition<pitype>::Iterator,
346 &this->levelGridView(level).indexSet(),
347 _grid.levelGridView(level).template begin<codim,pitype>(),
348 _grid.levelGridView(level).template end<codim,pitype>()
352 template<
int codim, PartitionIteratorType pitype>
353 typename Traits::template Codim<codim>::template Partition<pitype>::LevelIterator
lend(
int level)
const {
356 typename MultiDomainGrid::LevelGridView::template Codim<codim>::template Partition<pitype>::Iterator,
361 &this->levelGridView(level).indexSet(),
362 _grid.levelGridView(level).template end<codim,pitype>(),
363 _grid.levelGridView(level).template end<codim,pitype>()
368 typename Traits::template Codim<codim>::LeafIterator
leafbegin()
const {
371 typename MultiDomainGrid::LeafGridView::template Codim<codim>::template Partition<All_Partition>::Iterator,
376 &this->leafGridView().indexSet(),
377 _grid.leafGridView().template begin<codim>(),
378 _grid.leafGridView().template end<codim>()
383 typename Traits::template Codim<codim>::LeafIterator
leafend()
const {
386 typename MultiDomainGrid::LeafGridView::template Codim<codim>::template Partition<All_Partition>::Iterator,
391 &this->leafGridView().indexSet(),
392 _grid.leafGridView().template end<codim>(),
393 _grid.leafGridView().template end<codim>()
397 template<
int codim, PartitionIteratorType pitype>
398 typename Traits::template Codim<codim>::template Partition<pitype>::LeafIterator
leafbegin()
const {
401 typename MultiDomainGrid::LeafGridView::template Codim<codim>::template Partition<pitype>::Iterator,
406 &this->leafGridView().indexSet(),
407 _grid.leafGridView().template begin<codim,pitype>(),
408 _grid.leafGridView().template end<codim,pitype>()
412 template<
int codim, PartitionIteratorType pitype>
413 typename Traits::template Codim<codim>::template Partition<pitype>::LeafIterator
leafend()
const {
416 typename MultiDomainGrid::LeafGridView::template Codim<codim>::template Partition<pitype>::Iterator,
421 &this->leafGridView().indexSet(),
422 _grid.leafGridView().template end<codim,pitype>(),
423 _grid.leafGridView().template end<codim,pitype>()
427 int size(
int level,
int codim)
const {
429 return _levelIndexSets[level]->size(codim);
433 return _leafIndexSet.
size(codim);
436 int size(
int level, GeometryType type)
const {
438 return _levelIndexSets[level]->size(type);
441 int size(GeometryType type)
const {
443 return _leafIndexSet.
size(type);
455 if (!_grid.supportLevelIndexSets()) {
456 DUNE_THROW(GridError,
"level index set support not enabled for this grid");
459 assert(_levelIndexSets[level]);
460 return *_levelIndexSets[level];
464 return _leafIndexSet;
475 DUNE_THROW(NotImplemented,
"grid modification only allowed on the MultiDomainGrid");
489 bool mark(
int refCount,
const typename Traits::template Codim<0>::Entity& e) {
501 int getMark(
const typename Traits::template Codim<0>::Entity& e) {
513 DUNE_THROW(NotImplemented,
"grid modification only allowed on the MultiDomainGrid");
524 DUNE_THROW(NotImplemented,
"grid modification only allowed on the MultiDomainGrid");
535 DUNE_THROW(NotImplemented,
"grid modification only allowed on the MultiDomainGrid");
539 return _grid.overlapSize(level,codim);
543 return _grid.overlapSize(codim);
547 return _grid.ghostSize(level,codim);
551 return _grid.ghostSize(codim);
558 template<
typename DataHandleImp,
typename DataTypeImp>
559 void communicate (CommDataHandleIF<DataHandleImp,DataTypeImp> &data,
560 InterfaceType iftype,
561 CommunicationDirection dir,
564 DataHandleWrapper<CommDataHandleIF<DataHandleImp,DataTypeImp> > datahandle(data,*
this);
565 _grid._hostGrid.levelGridView(level).communicate(datahandle,iftype,dir);
568 template<
typename DataHandleImp,
typename DataTypeImp>
569 void communicate (CommDataHandleIF<DataHandleImp,DataTypeImp> &data,
570 InterfaceType iftype,
571 CommunicationDirection dir)
const
573 DataHandleWrapper<CommDataHandleIF<DataHandleImp,DataTypeImp> > datahandle(data,*
this);
574 _grid._hostGrid.leafGridView().communicate(datahandle,iftype,dir);
579 return _grid.numBoundarySegments();
595 if (_grid.supportLevelIndexSets()) {
596 while (_levelIndexSets.size() <=
static_cast<std::size_t
>(
maxLevel())) {
597 _levelIndexSets.push_back(std::make_shared<LevelIndexSetImp>(*
this,_grid.levelIndexSet(_levelIndexSets.size())));
603 return (&_grid == &rhs._grid && _subDomain == rhs._subDomain);
609 template<
typename EntityType>
610 typename Traits::template Codim<EntityType::codimension>::Entity
subDomainEntity(
const EntityType& mdEntity)
const {
617 std::enable_if_t<std::is_same_v<typename MDGrid::Traits::template Codim<EntityType::codimension>::Entity,EntityType>,
int> = 0>
618 static const EntityType&
625 std::enable_if_t<!std::is_same_v<typename MDGrid::Traits::template Codim<EntityType::codimension>::Entity,EntityType>,
int> = 0>
626 static const typename MDGrid::Traits::template Codim<EntityType::codimension>::Entity &
628 return e.impl().multiDomainEntity();
631 template<
typename EntityType>
632 static const typename MDGrid::template HostEntity<EntityType>::type&
hostEntity(
const EntityType& e) {
633 return e.impl().hostEntity();
637 return is.impl().multiDomainIntersection();
641 return is.impl().multiDomainIntersection();
647 assert(_subDomain == it->subDomain1() || _subDomain == it->subDomain2());
648 if (_subDomain == it->subDomain1())
651 typename GridImp::LeafGridView::IndexSet,
652 typename MDGrid::LeafGridView::IntersectionIterator
654 &this->leafGridView().indexSet(),
655 it->firstMultiDomainIntersectionIterator()
660 typename GridImp::LeafGridView::IndexSet,
661 typename MDGrid::LeafGridView::IntersectionIterator
663 &this->leafGridView().indexSet(),
664 it->secondMultiDomainIntersectionIterator()
669 assert(_subDomain == it->subDomain1() || _subDomain == it->subDomain2());
670 if (_subDomain == it->subDomain1())
673 typename GridImp::LevelGridView::IndexSet,
674 typename MDGrid::LevelGridView::IntersectionIterator
676 &this->levelGridView(it->firstMultiDomainIntersectionIterator()->inside().level()).indexSet(),
677 it->firstMultiDomainIntersectionIterator()
682 typename GridImp::LevelGridView::IndexSet,
683 typename MDGrid::LevelGridView::IntersectionIterator
685 &this->levelGridView(it->secondMultiDomainIntersectionIterator()->inside().level()).indexSet(),
686 it->secondMultiDomainIntersectionIterator()
690 template<
typename Intersection>
692 return intersection.impl().intersectionType();
699 GlobalIdSetImp _globalIdSet;
700 LocalIdSetImp _localIdSet;
701 LeafIndexSetImp _leafIndexSet;
702 std::vector<std::shared_ptr<LevelIndexSetImp> > _levelIndexSets;
706 _subDomain(subDomain),
708 _localIdSet(*this,grid._hostGrid.
localIdSet()),
714 template<
typename EntityType>
715 bool containsMultiDomainEntity(
const EntityType& e)
const {
716 if (_grid.supportLevelIndexSets())
717 return levelIndexSet(e.level()).containsMultiDomainEntity(e);
722 template<
typename EntityType>
723 bool containsHostEntity(
const EntityType& e)
const {
724 if (_grid.supportLevelIndexSets())
730 SubDomainGrid(
const SubDomainGrid& rv);
731 SubDomainGrid& operator=(
const SubDomainGrid& rv);
734 template<
typename Impl>
735 struct DataHandleWrapper
736 :
public Dune::CommDataHandleIF<DataHandleWrapper<Impl>,
737 typename Impl::DataType
741 bool contains(
int dim,
int codim)
const
743 return _impl.contains(dim,codim);
746 bool fixedSize(
int dim,
int codim)
const
752 template<
typename Entity>
753 std::size_t size(
const Entity& e)
const
755 if (_grid.containsHostEntity(e))
756 return _impl.size(_grid.subDomainEntity(_grid._grid.wrapHostEntity(e)));
761 template<
typename MessageBufferImp,
typename Entity>
762 void gather(MessageBufferImp& buf,
const Entity& e)
const
764 if (_grid.containsHostEntity(e))
765 _impl.gather(buf,_grid.subDomainEntity(_grid._grid.wrapHostEntity(e)));
768 template<
typename MessageBufferImp,
typename Entity>
769 void scatter(MessageBufferImp& buf,
const Entity& e, std::size_t n)
771 if (_grid.containsHostEntity(e))
772 _impl.scatter(buf,_grid.subDomainEntity(_grid._grid.wrapHostEntity(e)),n);
775 DataHandleWrapper(Impl& impl,
const SubDomainGrid<MDGrid>& grid)
781 const SubDomainGrid<MDGrid>& _grid;
Definition: multidomaingrid.hh:8
Definition: subdomaingrid/entity.hh:157
Definition: subdomaingrid/intersectioniterator.hh:19
Definition: subdomaingrid/hierarchiciterator.hh:17
Definition: subdomaingrid.hh:203
Traits::template Codim< codim >::LevelIterator lend(int level) const
Definition: subdomaingrid.hh:323
MDGrid MultiDomainGrid
Definition: subdomaingrid.hh:257
bool preAdapt()
Use MultiDomainGrid::preAdapt() instead of this method.
Definition: subdomaingrid.hh:512
int overlapSize(int codim) const
Definition: subdomaingrid.hh:542
bool adapt()
Use MultiDomainGrid::adapt() instead of this method.
Definition: subdomaingrid.hh:523
size_t numBoundarySegments() const
Definition: subdomaingrid.hh:577
static const MDGrid::Traits::template Codim< EntityType::codimension >::Entity & multiDomainEntity(const EntityType &e)
Definition: subdomaingrid.hh:627
Traits::template Codim< codim >::LeafIterator leafbegin() const
Definition: subdomaingrid.hh:368
Traits::template Codim< codim >::template Partition< pitype >::LevelIterator lend(int level) const
Definition: subdomaingrid.hh:353
const Traits::LocalIdSet & localIdSet() const
Definition: subdomaingrid.hh:450
int size(GeometryType type) const
Definition: subdomaingrid.hh:441
Traits::LeafIntersectionIterator subDomainIntersectionIterator(const typename MDGrid::LeafSubDomainInterfaceIterator it) const
Definition: subdomaingrid.hh:646
static const EntityType & multiDomainEntity(const EntityType &e)
specialization for -parent- multidomain entity
Definition: subdomaingrid.hh:619
Traits::template Codim< codim >::template Partition< pitype >::LeafIterator leafbegin() const
Definition: subdomaingrid.hh:398
static const auto & multiDomainIntersection(const typename Traits::LevelIntersection &is)
Definition: subdomaingrid.hh:640
int ghostSize(int codim) const
Definition: subdomaingrid.hh:550
IntersectionType
Definition: subdomaingrid.hh:282
@ foreign
Definition: subdomaingrid.hh:282
@ neighbor
Definition: subdomaingrid.hh:282
@ processor
Definition: subdomaingrid.hh:282
@ boundary
Definition: subdomaingrid.hh:282
Traits::template Codim< codim >::LeafIterator leafend() const
Definition: subdomaingrid.hh:383
void update()
Definition: subdomaingrid.hh:594
SubDomainIndex domain() const
Return our subdomain number.
Definition: subdomaingrid.hh:590
int size(int codim) const
Definition: subdomaingrid.hh:432
typename MDGrid::HostGrid HostGrid
Definition: subdomaingrid.hh:259
int size(int level, int codim) const
Definition: subdomaingrid.hh:427
Traits::template Codim< codim >::template Partition< pitype >::LevelIterator lbegin(int level) const
Definition: subdomaingrid.hh:338
Traits::LevelIntersectionIterator subDomainIntersectionIterator(const typename MDGrid::LevelSubDomainInterfaceIterator it) const
Definition: subdomaingrid.hh:668
void communicate(CommDataHandleIF< DataHandleImp, DataTypeImp > &data, InterfaceType iftype, CommunicationDirection dir) const
Definition: subdomaingrid.hh:569
int size(int level, GeometryType type) const
Definition: subdomaingrid.hh:436
void communicate(CommDataHandleIF< DataHandleImp, DataTypeImp > &data, InterfaceType iftype, CommunicationDirection dir, int level) const
Definition: subdomaingrid.hh:559
const Traits::CollectiveCommunication & comm() const
Definition: subdomaingrid.hh:554
const Traits::LeafIndexSet & leafIndexSet() const
Definition: subdomaingrid.hh:463
Traits::template Codim< EntityType::codimension >::Entity subDomainEntity(const EntityType &mdEntity) const
Definition: subdomaingrid.hh:610
bool operator==(const SubDomainGrid &rhs) const
Definition: subdomaingrid.hh:602
GridFamily::Traits Traits
Definition: subdomaingrid.hh:274
const Traits::GlobalIdSet & globalIdSet() const
Definition: subdomaingrid.hh:446
Traits::template Codim< codim >::LevelIterator lbegin(int level) const
Definition: subdomaingrid.hh:308
IntersectionType intersectionType(const Intersection &intersection) const
Definition: subdomaingrid.hh:691
bool mark(int refCount, const typename Traits::template Codim< 0 >::Entity &e)
Mark the entity e for grid refinement across ALL subdomains.
Definition: subdomaingrid.hh:489
MDGrid::SubDomainIndex SubDomainIndex
The type used for subdomain numbers.
Definition: subdomaingrid.hh:280
MDGrid::ctype ctype
The type used for coordinates.
Definition: subdomaingrid.hh:277
Traits::template Codim< codim >::template Partition< pitype >::LeafIterator leafend() const
Definition: subdomaingrid.hh:413
SubDomainGridFamily< MDGrid > GridFamily
Definition: subdomaingrid.hh:273
const MDGrid & multiDomainGrid() const
Get the MultiDomainGrid that we are part of.
Definition: subdomaingrid.hh:585
int maxLevel() const
Definition: subdomaingrid.hh:303
int overlapSize(int level, int codim) const
Definition: subdomaingrid.hh:538
void postAdapt()
Use MultiDomainGrid::postAdapt() instead of this method.
Definition: subdomaingrid.hh:534
const Traits::LevelIndexSet & levelIndexSet(int level) const
Definition: subdomaingrid.hh:454
Traits::template Codim< EntitySeed::codimension >::Entity entity(const EntitySeed &entitySeed) const
Definition: subdomaingrid.hh:292
void globalRefine(int refCount)
Use MultiDomainGrid::globalRefine() instead of this method.
Definition: subdomaingrid.hh:474
static const MDGrid::template HostEntity< EntityType >::type & hostEntity(const EntityType &e)
Definition: subdomaingrid.hh:632
int getMark(const typename Traits::template Codim< 0 >::Entity &e)
Retrieve the refinement mark of entity e.
Definition: subdomaingrid.hh:501
static const auto & multiDomainIntersection(const typename Traits::LeafIntersection &is)
Definition: subdomaingrid.hh:636
int ghostSize(int level, int codim) const
Definition: subdomaingrid.hh:546
Definition: subdomaingrid/gridview.hh:19
Definition: subdomaingrid/gridview.hh:69
Definition: subdomaingrid/entity.hh:38
Definition: subdomaingrid/entity.hh:79
Definition: subdomaingrid/geometry.hh:14
Definition: subdomaingrid/idsets.hh:21
Definition: subdomaingrid/indexsets.hh:31
IndexType size(GeometryType type) const
Definition: subdomaingrid/indexsets.hh:89
Definition: subdomaingrid/intersection.hh:19
Definition: subdomaingrid/iterator.hh:28
Definition: subdomaingrid/localgeometry.hh:14
Definition: subdomaingrid.hh:39
Definition: subdomaingrid.hh:49
Dune::EntityIterator< 0, const Grid, HierarchicIteratorWrapper< const Grid > > HierarchicIterator
Definition: subdomaingrid.hh:118
IdSet< const Grid, IdSetWrapper< const Grid, typename MDGrid::HostGrid::Traits::GlobalIdSet >, typename MDGrid::HostGrid::Traits::GlobalIdSet::IdType > GlobalIdSet
Definition: subdomaingrid.hh:181
Dune::IntersectionIterator< const Grid, IntersectionIteratorWrapper< const Grid, IndexSetWrapper< const Grid, typename MDGrid::LeafIndexSetImp >, typename MDGrid::LeafGridView::IntersectionIterator >, IntersectionWrapper< const Grid, IndexSetWrapper< const Grid, typename MDGrid::LeafIndexSetImp >, typename MDGrid::LeafGridView::Intersection > > LeafIntersectionIterator
Definition: subdomaingrid.hh:96
Dune::IntersectionIterator< const Grid, IntersectionIteratorWrapper< const Grid, IndexSetWrapper< const Grid, typename MDGrid::LevelIndexSetImp >, typename MDGrid::LevelGridView::IntersectionIterator >, IntersectionWrapper< const Grid, IndexSetWrapper< const Grid, typename MDGrid::LevelIndexSetImp >, typename MDGrid::LevelGridView::Intersection > > LevelIntersectionIterator
Definition: subdomaingrid.hh:116
typename MDGrid::CollectiveCommunication CollectiveCommunication
Definition: subdomaingrid.hh:192
Dune::GridView< LeafGridViewTraits< const Grid > > LeafGridView
Definition: subdomaingrid.hh:121
Dune::Intersection< const Grid, IntersectionWrapper< const Grid, IndexSetWrapper< const Grid, typename MDGrid::LeafIndexSetImp >, typename MDGrid::LeafGridView::Intersection > > LeafIntersection
Definition: subdomaingrid.hh:64
SubDomainGrid< MDGrid > Grid
The type that is implementing the grid.
Definition: subdomaingrid.hh:51
Dune::Intersection< const Grid, IntersectionWrapper< const Grid, IndexSetWrapper< const Grid, typename MDGrid::LevelIndexSetImp >, typename MDGrid::LevelGridView::Intersection > > LevelIntersection
Definition: subdomaingrid.hh:76
IdSet< const Grid, IdSetWrapper< const Grid, typename MDGrid::HostGrid::Traits::LocalIdSet >, typename MDGrid::HostGrid::Traits::LocalIdSet::IdType > LocalIdSet
Definition: subdomaingrid.hh:190
Dune::GridView< LevelGridViewTraits< const Grid > > LevelGridView
Definition: subdomaingrid.hh:120
Definition: subdomaingrid.hh:125
Dune::Entity< cd, dim, const Grid, EntityWrapper > Entity
Definition: subdomaingrid.hh:130
typename Partition< All_Partition >::LevelIterator LevelIterator
Definition: subdomaingrid.hh:164
typename Partition< All_Partition >::LeafIterator LeafIterator
Definition: subdomaingrid.hh:163
Dune::Geometry< dim-cd, dimw, const Grid, GeometryWrapper > Geometry
Definition: subdomaingrid.hh:127
Dune::Geometry< dim-cd, dim, const Grid, LocalGeometryWrapper > LocalGeometry
Definition: subdomaingrid.hh:128
Definition: subdomaingrid.hh:136
Dune::EntityIterator< cd, const Grid, IteratorWrapper< typename Traits::LeafGridView, typename MDGrid::LeafGridView::template Codim< cd >::template Partition< pitype >::Iterator, cd, pitype, const Grid > > LeafIterator
Definition: subdomaingrid.hh:160
Dune::EntityIterator< cd, const Grid, IteratorWrapper< typename Traits::LevelGridView, typename MDGrid::LevelGridView::template Codim< cd >::template Partition< pitype >::Iterator, cd, pitype, const Grid > > LevelIterator
Definition: subdomaingrid.hh:148