1#ifndef DUNE_MULTIDOMAINGRID_MULTIDOMAINGRID_HH
2#define DUNE_MULTIDOMAINGRID_MULTIDOMAINGRID_HH
7#include <dune/grid/common/grid.hh>
33template<
typename HostGr
id,
typename MDGr
idTraits>
36template<
typename HostGr
id,
typename MDGr
idTraits>
41 static const int dim = HostGrid::dimension;
42 static const int dimw = HostGrid::dimensionworld;
56 typename HostGrid::LeafGridView::Intersection
64 typename HostGrid::LevelGridView::Intersection
72 typename HostGrid::LeafGridView::IntersectionIterator
76 typename HostGrid::LeafGridView::Intersection
84 typename HostGrid::LevelGridView::IntersectionIterator
88 typename HostGrid::LevelGridView::Intersection
109 using Entity = Dune::Entity<cd, dim, const Grid, EntityWrapper>;
113 template <PartitionIteratorType pitype>
121 typename HostGrid::LevelGridView,
132 typename HostGrid::LeafGridView,
158 typename HostGrid::Traits::GlobalIdSet
160 typename HostGrid::Traits::GlobalIdSet::IdType
167 typename HostGrid::Traits::LocalIdSet
169 typename HostGrid::Traits::LocalIdSet::IdType
186 template<
typename Gr
id,
typename SI,
bool max_subdomain_index_is_static>
187 struct MaxSubDomainIndexProvider
190 typedef SI SubDomainIndex;
192 const SubDomainIndex maxSubDomainIndex()
const
194 return static_cast<const Grid*
>(
this)->traits().maxSubDomainIndex();
199 template<
typename Gr
id,
typename SI>
200 struct MaxSubDomainIndexProvider<Grid,SI,true>
203 typedef SI SubDomainIndex;
205 static constexpr SubDomainIndex maxSubDomainIndex()
207 return Grid::MDGridTraits::maxSubDomainIndex();
223 typename MDGridTraitsType
226 :
public GridDefaultImplementation<HostGrid_::dimension,
227 HostGrid_::dimensionworld,
228 typename HostGrid_::ctype,
229 MultiDomainGridFamily<
234 public Impl::MaxSubDomainIndexProvider<MultiDomainGrid<
238 typename MDGridTraitsType::SubDomainIndex,
239 MDGridTraitsType::maxSubDomainIndexIsStatic()
250 template<
int codim,
int dim,
typename Gr
idImp>
253 template<
typename,
int,PartitionIteratorType,
typename>
256 template<
typename Gr
idImp>
259 template<
int mydim,
int coorddim,
typename Gr
idImp>
262 template<
int mydim,
int coorddim,
typename Gr
idImp>
265 template<
typename Gr
idImp,
typename WrappedIndexSet>
268 template<
typename Gr
idImp,
typename WrappedIdSet>
271 template<
typename Gr
idImp>
272 friend struct detail::HostGridAccessor;
274 template<
typename,
typename>
277 template<
typename,
typename>
286 template<
int,
int,
typename>
289 template<
int,
int,
typename>
304 template<
typename,
typename,
typename,
typename>
307 template<
typename,
typename,
typename>
310 template<
typename,
typename,
typename>
319 typedef GridDefaultImplementation<HostGrid::dimension,
320 HostGrid::dimensionworld,
321 typename HostGrid::ctype,
335 enum State { stateFixed, stateMarking, statePreUpdate, statePostUpdate, statePreAdapt, statePostAdapt };
337 typedef GridImp ThisType;
339 using Base = GridDefaultImplementation<
341 HostGrid::dimensionworld,
342 typename HostGrid::ctype,
351 using Base::dimension;
352 using Base::dimensionworld;
357 typedef typename HostGrid::ctype
ctype;
361 typedef std::map<typename Traits::LocalIdSet::IdType,typename MDGridTraits::template Codim<0>::SubDomainSet> AdaptationStateMap;
363 typedef std::map<typename Traits::GlobalIdSet::IdType,typename MDGridTraits::template Codim<0>::SubDomainSet> LoadBalanceStateMap;
367 template<
typename Entity>
369 typedef typename HostGrid::Traits::template Codim<Entity::codimension>::Entity type;
374 template<
typename Entity>
375 struct MultiDomainEntity {
376 typedef typename Traits::template Codim<Entity::codimension>::Entity type;
395 return _traits.maxSubDomainIndex();
401 return MDGridTraits::maxSubDomainIndexIsStatic();
431 _leafIndexSet(*this,hostGrid.leafGridView()),
435 _adaptState(stateFixed),
437 _maxAssignedSubDomainIndex(0)
452 _leafIndexSet(*this,hostGrid.leafGridView()),
456 _adaptState(stateFixed),
458 _maxAssignedSubDomainIndex(0)
468 template<
typename EntitySeed>
469 typename Traits::template Codim<EntitySeed::codimension>::Entity
470 entity(
const EntitySeed& entitySeed)
const
477 return _hostGrid.maxLevel();
481 typename Traits::template Codim<codim>::LevelIterator
lbegin(
int level)
const {
484 typename HostGrid::LevelGridView,
488 >(_hostGrid.levelGridView(level).template begin<codim>())
493 typename Traits::template Codim<codim>::LevelIterator
lend(
int level)
const {
496 typename HostGrid::LevelGridView,
500 >(_hostGrid.levelGridView(level).template end<codim>())
504 template<
int codim, PartitionIteratorType pitype>
505 typename Traits::template Codim<codim>::template Partition<pitype>::LevelIterator
lbegin(
int level)
const {
508 typename HostGrid::LevelGridView,
512 >(_hostGrid.levelGridView(level).template begin<codim,pitype>())
516 template<
int codim, PartitionIteratorType pitype>
517 typename Traits::template Codim<codim>::template Partition<pitype>::LevelIterator
lend(
int level)
const {
520 typename HostGrid::LevelGridView,
524 >(_hostGrid.levelGridView(level).template end<codim,pitype>())
529 typename Traits::template Codim<codim>::LeafIterator
leafbegin()
const {
532 typename HostGrid::LeafGridView,
536 >(_hostGrid.leafGridView().template begin<codim>())
541 typename Traits::template Codim<codim>::LeafIterator
leafend()
const {
544 typename HostGrid::LeafGridView,
548 >(_hostGrid.leafGridView().template end<codim>())
552 template<
int codim, PartitionIteratorType pitype>
553 typename Traits::template Codim<codim>::template Partition<pitype>::LeafIterator
leafbegin()
const {
556 typename HostGrid::LeafGridView,
560 >(_hostGrid.leafGridView().template begin<codim,pitype>())
564 template<
int codim, PartitionIteratorType pitype>
565 typename Traits::template Codim<codim>::template Partition<pitype>::LeafIterator
leafend()
const {
568 typename HostGrid::LeafGridView,
572 >(_hostGrid.leafGridView().template end<codim,pitype>())
677 int size(
int level,
int codim)
const {
678 return _hostGrid.size(level,codim);
682 return _hostGrid.size(codim);
685 int size(
int level, GeometryType type)
const {
686 return _hostGrid.size(level,type);
689 int size(GeometryType type)
const {
690 return _hostGrid.size(type);
702 if (!_supportLevelIndexSets) {
703 DUNE_THROW(GridError,
"level index set support not enabled for this grid");
706 return *_levelIndexSets[level];
710 return _leafIndexSet;
714 saveMultiDomainState();
715 _hostGrid.globalRefine(refCount);
717 restoreMultiDomainState();
720 bool mark(
int refCount,
const typename Traits::template Codim<0>::Entity& e) {
721 assert(_state == stateFixed);
722 return _hostGrid.mark(refCount,
hostEntity(e));
725 int getMark(
const typename Traits::template Codim<0>::Entity& e) {
726 assert(_state == stateFixed);
731 assert(_state == stateFixed && _adaptState == stateFixed);
732 _adaptState = statePreAdapt;
733 bool result = _hostGrid.preAdapt();
738 assert(_state == stateFixed && _adaptState == statePreAdapt);
739 _adaptState = statePostAdapt;
740 saveMultiDomainState();
741 bool result = _hostGrid.adapt();
743 restoreMultiDomainState();
748 assert(_state == stateFixed && _adaptState == statePostAdapt);
749 _adaptState = stateFixed;
750 _hostGrid.postAdapt();
754 return _hostGrid.overlapSize(level,codim);
758 return _hostGrid.overlapSize(codim);
762 return _hostGrid.ghostSize(level,codim);
766 return _hostGrid.ghostSize(codim);
770 return _hostGrid.comm();
773 template<
typename DataHandleImp,
typename DataTypeImp>
774 void communicate (CommDataHandleIF<DataHandleImp,DataTypeImp> &data,
775 InterfaceType iftype,
776 CommunicationDirection dir,
779 DataHandleWrapper<CommDataHandleIF<DataHandleImp,DataTypeImp> > datahandle(data,*
this);
780 _hostGrid.levelGridView(level).communicate(datahandle,iftype,dir);
783 template<
typename DataHandleImp,
typename DataTypeImp>
784 void communicate (CommDataHandleIF<DataHandleImp,DataTypeImp> &data,
785 InterfaceType iftype,
786 CommunicationDirection dir)
const
788 DataHandleWrapper<CommDataHandleIF<DataHandleImp,DataTypeImp> > datahandle(data,*
this);
789 _hostGrid.leafGridView().communicate(datahandle,iftype,dir);
792 template<
typename DataHandle>
796 GV gv = this->leafGridView();
797 typedef typename GV::template Codim<0>::Iterator Iterator;
798 typedef typename GV::template Codim<0>::Entity Entity;
799 typedef typename MDGridTraits::template Codim<0>::SubDomainSet SubDomainSet;
800 for (Iterator it = gv.template begin<0>(); it != gv.template end<0>(); ++it) {
801 const Entity& e = *it;
802 const SubDomainSet& subDomains = gv.indexSet().subDomains(e);
803 _loadBalanceStateMap[
globalIdSet().id(e)] = subDomains;
806 LoadBalancingDataHandle<DataHandle> dataHandleWrapper(*
this,dataHandle);
807 if (!_hostGrid.loadBalance(dataHandleWrapper))
812 for (Iterator it = gv.template begin<0>(); it != gv.template end<0>(); ++it) {
813 _leafIndexSet.addToSubDomains(_loadBalanceStateMap[
globalIdSet().
id(*it)],*it);
820 _loadBalanceStateMap.clear();
827 EmptyDataHandle emptyDataHandle;
833 return _hostGrid.numBoundarySegments();
850 assert(_state == stateFixed && _adaptState == stateFixed);
852 _tmpLeafIndexSet->reset(
false);
853 _state = stateMarking;
865 assert(_state == stateMarking && _adaptState == stateFixed);
866 if (_supportLevelIndexSets) {
867 for (
int l = 0; l <=
maxLevel(); ++l) {
868 _tmpLevelIndexSets.push_back(std::make_shared<LevelIndexSetImp>(*
this,_hostGrid.levelGridView(l)));
871 _tmpLeafIndexSet->update(_tmpLevelIndexSets,
true);
872 _state = statePreUpdate;
880 assert(_state == statePreUpdate && _adaptState == stateFixed);
881 _leafIndexSet.swap(*_tmpLeafIndexSet);
882 if (_supportLevelIndexSets) {
883 for (
int l = 0; l <=
maxLevel(); ++l) {
884 _levelIndexSets[l]->swap(*_tmpLevelIndexSets[l]);
887 _state = statePostUpdate;
892 assert(_state == statePostUpdate && _adaptState == stateFixed);
893 _tmpLevelIndexSets.clear();
894 _tmpLeafIndexSet.reset(
nullptr);
900 assert(_state == stateMarking);
902 assert(e.partitionType() == Dune::InteriorEntity);
903 _maxAssignedSubDomainIndex = std::max(_maxAssignedSubDomainIndex,
subDomain);
904 _tmpLeafIndexSet->addToSubDomain(
subDomain,e);
909 assert(_state == stateMarking);
911 assert(e.partitionType() == Dune::InteriorEntity);
912 _tmpLeafIndexSet->removeFromSubDomain(
subDomain,e);
917 assert(_state == stateMarking);
919 assert(e.partitionType() == Dune::InteriorEntity);
920 _maxAssignedSubDomainIndex = std::max(_maxAssignedSubDomainIndex,
subDomain);
921 _tmpLeafIndexSet->assignToSubDomain(
subDomain,e);
926 assert(_state == stateMarking);
928 assert(e.partitionType() == Dune::InteriorEntity);
929 _tmpLeafIndexSet->removeFromAllSubDomains(e);
937 std::shared_ptr<SubDomainGrid>& subGridPointer = _subDomainGrids[
subDomain];
938 if (!subGridPointer) {
941 return *subGridPointer;
946 std::shared_ptr<SubDomainGrid>& subGridPointer = _subDomainGrids[
subDomain];
947 if (!subGridPointer) {
950 return *subGridPointer;
962 return _maxAssignedSubDomainIndex;
967 return _supportLevelIndexSets;
978 template<
typename EntityType>
979 static const typename HostEntity<EntityType>::type&
hostEntity(
const EntityType& e)
981 return e.impl().hostEntity();
984 template<
typename EntityType>
985 static const typename MultiDomainEntity<EntityType>::type&
multiDomainEntity(
const EntityType& e)
987 return e.impl().multiDomainEntity();
990 template<
typename IntersectionType>
1014 const MDGridTraitsType _traits;
1016 std::vector<std::shared_ptr<LevelIndexSetImp> > _levelIndexSets;
1017 LeafIndexSetImp _leafIndexSet;
1019 std::vector<std::shared_ptr<LevelIndexSetImp> > _tmpLevelIndexSets;
1020 std::unique_ptr<LeafIndexSetImp> _tmpLeafIndexSet;
1022 GlobalIdSetImp _globalIdSet;
1023 LocalIdSetImp _localIdSet;
1027 const bool _supportLevelIndexSets;
1029 mutable std::map<SubDomainIndex,std::shared_ptr<SubDomainGrid> > _subDomainGrids;
1032 AdaptationStateMap _adaptationStateMap;
1033 LoadBalanceStateMap _loadBalanceStateMap;
1035 void updateIndexSets() {
1037 if (_supportLevelIndexSets) {
1038 while (
static_cast<int>(_levelIndexSets.size()) <=
maxLevel()) {
1039 _levelIndexSets.push_back(std::make_shared<LevelIndexSetImp>(*
this,_hostGrid.levelGridView(_levelIndexSets.size())));
1042 if (
static_cast<int>(_levelIndexSets.size()) >
maxLevel() + 1)
1044 _levelIndexSets.resize(
maxLevel() + 1);
1048 _leafIndexSet.reset(
true);
1049 _leafIndexSet.update(_levelIndexSets,
true);
1051 _globalIdSet.update(_hostGrid.globalIdSet());
1052 _localIdSet.update(_hostGrid.localIdSet());
1055 for (
auto& subGridPair : _subDomainGrids)
1056 subGridPair.second->update();
1059 void saveMultiDomainState() {
1060 typedef typename ThisType::LeafGridView GV;
1061 GV gv = this->leafGridView();
1062 typedef typename GV::template Codim<0>::Entity Entity;
1063 typedef typename MDGridTraits::template Codim<0>::SubDomainSet SubDomainSet;
1064 for (
const auto& e : elements(gv)) {
1065 const SubDomainSet& subDomains = gv.indexSet().subDomains(e);
1066 _adaptationStateMap[
localIdSet().id(e)] = subDomains;
1068 while (he.mightVanish()) {
1070 typename Traits::LocalIdSet::IdType
id =
localIdSet().id(he);
1073 if (!_adaptationStateMap.insert(
typename AdaptationStateMap::value_type(
id,subDomains)).second) {
1075 _adaptationStateMap[id].addAll(subDomains);
1081 void restoreMultiDomainState() {
1082 typedef typename ThisType::LeafGridView GV;
1083 GV gv = this->leafGridView();
1084 typedef typename GV::template Codim<0>::Entity Entity;
1085 for (
const auto& e : elements(gv)) {
1088 while (he.isNew()) {
1093 typename AdaptationStateMap::iterator asmit = _adaptationStateMap.find(
localIdSet().
id(he));
1094 while(asmit == _adaptationStateMap.end()) {
1096 asmit = _adaptationStateMap.find(
localIdSet().
id(he));
1098 _leafIndexSet.addToSubDomains(asmit->second, e);
1100 _leafIndexSet.update(_levelIndexSets,
false);
1101 _adaptationStateMap.clear();
1104 template<
typename Gr
idView,
typename HostGr
idView>
1105 static typename GridView::IntersectionIterator multiDomainIntersectionIterator(
typename HostGridView::IntersectionIterator iit) {
1106 typedef decltype(std::declval<typename GridView::IntersectionIterator>().impl()) Implementation;
1107 return Implementation(iit);
1112 template<
typename Entity>
1113 typename Traits::template Codim<Entity::codimension>::Entity
wrapHostEntity(
const Entity& e)
const {
1114 return wrapHostEntity<Entity::codimension>(e);
1118 typename Traits::template Codim<codim>::Entity
wrapHostEntity(
const typename HostGrid::template Codim<codim>::Entity& e)
const
1126 template<
typename Impl>
1127 struct DataHandleWrapper
1128 :
public Dune::CommDataHandleIF<DataHandleWrapper<Impl>,
1129 typename Impl::DataType
1133 bool contains(
int dim,
int codim)
const
1135 return _impl.contains(dim,codim);
1138 bool fixedSize(
int dim,
int codim)
const
1140 return _impl.fixedSize(dim,codim);
1143 template<
typename Entity>
1144 std::size_t size(
const Entity& e)
const
1146 return _impl.size(_grid.wrapHostEntity(e));
1149 template<
typename MessageBufferImp,
typename Entity>
1150 void gather(MessageBufferImp& buf,
const Entity& e)
const
1152 _impl.gather(buf,_grid.wrapHostEntity(e));
1155 template<
typename MessageBufferImp,
typename Entity>
1156 void scatter(MessageBufferImp& buf,
const Entity& e, std::size_t n)
1158 _impl.scatter(buf,_grid.wrapHostEntity(e),n);
1161 DataHandleWrapper(Impl& impl,
const MultiDomainGrid<HostGrid,MDGridTraitsType>& grid)
1167 const MultiDomainGrid<HostGrid,MDGridTraitsType>& _grid;
1172 template<
typename WrappedDataHandle>
1173 struct LoadBalancingDataHandle
1174 :
public Dune::CommDataHandleIF<LoadBalancingDataHandle<WrappedDataHandle>,
1175 typename WrappedDataHandle::DataType
1185 static_assert(
sizeof(WrappedDataHandle::DataType) >=
sizeof(
SubDomainIndex),
1186 "During load balancing, the data type has to be large enough to contain MultiDomaingrid::SubDomainIndex");
1188 bool contains(
int dim,
int codim)
const
1191 || _wrappedDataHandle.contains(dim,codim);
1194 bool fixedSize(
int dim,
int codim)
const
1199 template<
typename Entity>
1200 std::size_t size(
const Entity& e)
const
1202 if (_grid.leafGridView().indexSet().contains(e) && e.partitionType() == Dune::InteriorEntity)
1203 return _grid.leafGridView().indexSet().subDomains(e).size() + 1 + _wrappedDataHandle.size(e);
1205 return _wrappedDataHandle.size(e);
1208 template<
typename MessageBufferImp,
typename Entity>
1209 void gather(MessageBufferImp& buf,
const Entity& e)
const
1211 assert(Entity::codimension == 0);
1212 if (e.partitionType() == Dune::InteriorEntity && _grid.leafGridView().indexSet().contains(e))
1214 typedef typename MDGridTraits::template Codim<0>::SubDomainSet SubDomainSet;
1215 const SubDomainSet& subDomains = _grid.leafGridView().indexSet().subDomains(e);
1216 Data size = { subDomains.size() };
1217 buf.write(size.buffer);
1218 for (
typename SubDomainSet::const_iterator it = subDomains.begin(); it != subDomains.end(); ++it)
1224 _wrappedDataHandle.gather(buf,e);
1227 template<
typename MessageBufferImp,
typename Entity>
1228 void scatter(MessageBufferImp& buf,
const Entity& e, std::size_t n)
1230 if (e.partitionType() != Dune::InteriorEntity && _grid.leafGridView().indexSet().contains(e))
1232 Data subDomains = { 0 };
1233 buf.read(subDomains.buffer);
1234 for (
int i = 0; i < subDomains.data; ++i)
1238 _grid._loadBalanceStateMap[_grid.globalIdSet().id(e)].add(
subDomain.data);
1240 _wrappedDataHandle.scatter(buf,e,n - (subDomains.data + 1));
1243 _wrappedDataHandle.scatter(buf,e,n);
1246 LoadBalancingDataHandle(
const MultiDomainGrid& grid, WrappedDataHandle& wrappedDataHandle)
1248 , _wrappedDataHandle(wrappedDataHandle)
1251 const MultiDomainGrid& _grid;
1252 WrappedDataHandle& _wrappedDataHandle;
1256 struct EmptyDataHandle
1257 :
public Dune::CommDataHandleIF<EmptyDataHandle,
1262 bool contains(
int dim,
int codim)
const
1267 bool fixedSize(
int dim,
int codim)
const
1272 template<
typename Entity>
1273 std::size_t size(
const Entity& e)
const
1278 template<
typename MessageBufferImp,
typename Entity>
1279 void gather(MessageBufferImp& buf,
const Entity& e)
const
1283 template<
typename MessageBufferImp,
typename Entity>
1284 void scatter(MessageBufferImp& buf,
const Entity& e, std::size_t n)
1299template<
class HostGr
id,
typename MDGr
idTraits>
1304template<
class MDGr
id>
Definition: multidomaingrid.hh:8
MultiDomainGridType
Definition: multidomaingrid/multidomaingrid.hh:1292
@ other
Definition: multidomaingrid/multidomaingrid.hh:1292
@ subDomainGrid
Definition: multidomaingrid/multidomaingrid.hh:1292
@ multiDomainGrid
Definition: multidomaingrid/multidomaingrid.hh:1292
Definition: allsubdomaininterfacesiterator.hh:149
Definition: allsubdomaininterfacesiterator.hh:182
Definition: entity.hh:144
Definition: hierarchiciterator.hh:13
Definition: intersectioniterator.hh:16
A meta grid for dividing an existing DUNE grid into subdomains that can be accessed as a grid in thei...
Definition: multidomaingrid/multidomaingrid.hh:241
static const MultiDomainEntity< EntityType >::type & multiDomainEntity(const EntityType &e)
Definition: multidomaingrid/multidomaingrid.hh:985
Traits::LeafAllSubDomainInterfacesIterator LeafAllSubDomainInterfacesIterator
The type of the iterators over the codim 1 interfaces between all subdomains on the leaf view.
Definition: multidomaingrid/multidomaingrid.hh:415
const Traits::GlobalIdSet & globalIdSet() const
Definition: multidomaingrid/multidomaingrid.hh:693
Traits::LevelAllSubDomainInterfacesIterator LevelAllSubDomainInterfacesIterator
The type of the iterators over the codim 1 interfaces between all subdomains on a level view.
Definition: multidomaingrid/multidomaingrid.hh:418
LevelAllSubDomainInterfacesIterator levelAllSubDomainInterfacesBegin(int level) const
Returns an iterator over all subdomain interfaces on the requested level view.
Definition: multidomaingrid/multidomaingrid.hh:662
void postAdapt()
Definition: multidomaingrid/multidomaingrid.hh:747
const Traits::LeafIndexSet & leafIndexSet() const
Definition: multidomaingrid/multidomaingrid.hh:709
MultiDomainGrid(HostGrid &hostGrid, const MDGridTraitsType &traits, bool supportLevelIndexSets=true)
Constructs a new MultiDomainGrid from the given host grid.
Definition: multidomaingrid/multidomaingrid.hh:449
int ghostSize(int codim) const
Definition: multidomaingrid/multidomaingrid.hh:765
Traits::LevelSubDomainInterfaceIterator LevelSubDomainInterfaceIterator
The type of the iterators over the codim 1 interface between two subdomains on a level view.
Definition: multidomaingrid/multidomaingrid.hh:412
static const HostEntity< EntityType >::type & hostEntity(const EntityType &e)
Returns a reference to the corresponding host entity.
Definition: multidomaingrid/multidomaingrid.hh:979
void startSubDomainMarking()
Prepares the grid for (re-)assigning cells to subdomains.
Definition: multidomaingrid/multidomaingrid.hh:849
void updateSubDomains()
Switches the subdomain layout over to the new layout.
Definition: multidomaingrid/multidomaingrid.hh:879
const MDGridTraits & traits() const
Definition: multidomaingrid/multidomaingrid.hh:996
bool loadBalance()
Definition: multidomaingrid/multidomaingrid.hh:825
int size(int codim) const
Definition: multidomaingrid/multidomaingrid.hh:681
int overlapSize(int codim) const
Definition: multidomaingrid/multidomaingrid.hh:757
int size(int level, int codim) const
Definition: multidomaingrid/multidomaingrid.hh:677
const Traits::LocalIdSet & localIdSet() const
Definition: multidomaingrid/multidomaingrid.hh:697
Traits::template Codim< codim >::template Partition< pitype >::LevelIterator lend(int level) const
Definition: multidomaingrid/multidomaingrid.hh:517
const SubDomainIndex maxSubDomainIndex() const
The largest allowed index for a subdomain.
Definition: multidomaingrid/multidomaingrid.hh:393
bool adapt()
Definition: multidomaingrid/multidomaingrid.hh:737
void postUpdateSubDomains()
clears the saved state of the subdomain layout that was active before the last call to updateSubDomai...
Definition: multidomaingrid/multidomaingrid.hh:891
int maxLevel() const
The current maximum level of the grid.
Definition: multidomaingrid/multidomaingrid.hh:476
static const auto & multiDomainIntersection(const IntersectionType &is)
Definition: multidomaingrid/multidomaingrid.hh:991
MDGridTraitsType MDGridTraits
Definition: multidomaingrid/multidomaingrid.hh:356
MDGridTraits::SubDomainIndex SubDomainIndex
The (integer) type used to identify subdomains.
Definition: multidomaingrid/multidomaingrid.hh:382
HostGrid::ctype ctype
Definition: multidomaingrid/multidomaingrid.hh:357
bool supportLevelIndexSets() const
Indicates whether this MultiDomainGrid instance supports level index sets on its SubDomainGrids.
Definition: multidomaingrid/multidomaingrid.hh:966
LeafSubDomainInterfaceIterator leafSubDomainInterfaceEnd(SubDomainIndex subDomain1, SubDomainIndex subDomain2) const
Returns the corresponding end iterator for leafSubDomainInterfaceBegin().
Definition: multidomaingrid/multidomaingrid.hh:594
LevelAllSubDomainInterfacesIterator levelAllSubDomainInterfacesEnd(int level) const
Returns the corresponding end iterator for levelAllSubDomainInterfacesBegin().
Definition: multidomaingrid/multidomaingrid.hh:670
void communicate(CommDataHandleIF< DataHandleImp, DataTypeImp > &data, InterfaceType iftype, CommunicationDirection dir) const
Definition: multidomaingrid/multidomaingrid.hh:784
size_t numBoundarySegments() const
Definition: multidomaingrid/multidomaingrid.hh:831
int size(int level, GeometryType type) const
Definition: multidomaingrid/multidomaingrid.hh:685
Traits::template Codim< codim >::template Partition< pitype >::LeafIterator leafbegin() const
Definition: multidomaingrid/multidomaingrid.hh:553
Traits::template Codim< codim >::LeafIterator leafend() const
Definition: multidomaingrid/multidomaingrid.hh:541
Traits::template Codim< codim >::LeafIterator leafbegin() const
Definition: multidomaingrid/multidomaingrid.hh:529
SubDomainIndex maxAssignedSubDomainIndex() const
Returns the largest subdomain index that was ever assigned to a cell in this grid.
Definition: multidomaingrid/multidomaingrid.hh:960
const Traits::LevelIndexSet & levelIndexSet(int level) const
Definition: multidomaingrid/multidomaingrid.hh:701
int getMark(const typename Traits::template Codim< 0 >::Entity &e)
Definition: multidomaingrid/multidomaingrid.hh:725
int overlapSize(int level, int codim) const
Definition: multidomaingrid/multidomaingrid.hh:753
Traits::template Codim< codim >::template Partition< pitype >::LevelIterator lbegin(int level) const
Definition: multidomaingrid/multidomaingrid.hh:505
Traits::template Codim< codim >::template Partition< pitype >::LeafIterator leafend() const
Definition: multidomaingrid/multidomaingrid.hh:565
const Traits::CollectiveCommunication & comm() const
Definition: multidomaingrid/multidomaingrid.hh:769
int ghostSize(int level, int codim) const
Definition: multidomaingrid/multidomaingrid.hh:761
void assignToSubDomain(SubDomainIndex subDomain, const typename Traits::template Codim< 0 >::Entity &e)
Assigns the given leaf entity to the specified subdomain, clearing any previous subdomain assignments...
Definition: multidomaingrid/multidomaingrid.hh:916
bool mark(int refCount, const typename Traits::template Codim< 0 >::Entity &e)
Definition: multidomaingrid/multidomaingrid.hh:720
LevelSubDomainInterfaceIterator levelSubDomainInterfaceBegin(SubDomainIndex subDomain1, SubDomainIndex subDomain2, int level) const
Returns an iterator over the interface of two subdomains at the given level.
Definition: multidomaingrid/multidomaingrid.hh:609
int size(GeometryType type) const
Definition: multidomaingrid/multidomaingrid.hh:689
LeafSubDomainInterfaceIterator leafSubDomainInterfaceBegin(SubDomainIndex subDomain1, SubDomainIndex subDomain2) const
Returns an iterator over the leaf interface of two subdomains.
Definition: multidomaingrid/multidomaingrid.hh:589
void removeFromSubDomain(SubDomainIndex subDomain, const typename Traits::template Codim< 0 >::Entity &e)
Removes the given leaf entity from the specified subdomain.
Definition: multidomaingrid/multidomaingrid.hh:908
Traits::template Codim< codim >::LevelIterator lbegin(int level) const
Definition: multidomaingrid/multidomaingrid.hh:481
Traits::template Codim< codim >::Entity wrapHostEntity(const typename HostGrid::template Codim< codim >::Entity &e) const
Definition: multidomaingrid/multidomaingrid.hh:1118
SubDomainGrid & subDomain(SubDomainIndex subDomain)
Returns a reference to the SubDomainGrid associated with the given subdomain.
Definition: multidomaingrid/multidomaingrid.hh:945
static const std::size_t maxNumberOfSubDomains
The largest number of subdomains any given grid cell may belong to.
Definition: multidomaingrid/multidomaingrid.hh:385
friend class LeafGridView
Definition: multidomaingrid/multidomaingrid.hh:314
subdomain::SubDomainGrid< ThisType > SubDomainGrid
The type used for representing the grid of a subdomain, always a specialization of Dune::mdgrid::subd...
Definition: multidomaingrid/multidomaingrid.hh:405
Traits::template Codim< codim >::LevelIterator lend(int level) const
Definition: multidomaingrid/multidomaingrid.hh:493
void addToSubDomain(SubDomainIndex subDomain, const typename Traits::template Codim< 0 >::Entity &e)
Adds the given leaf entity to the specified subdomain.
Definition: multidomaingrid/multidomaingrid.hh:899
void globalRefine(int refCount)
Definition: multidomaingrid/multidomaingrid.hh:713
Traits::template Codim< Entity::codimension >::Entity wrapHostEntity(const Entity &e) const
Definition: multidomaingrid/multidomaingrid.hh:1113
Traits::LeafSubDomainInterfaceIterator LeafSubDomainInterfaceIterator
The type of the iterators over the codim 1 interface between two subdomains on the leaf view.
Definition: multidomaingrid/multidomaingrid.hh:409
LeafAllSubDomainInterfacesIterator leafAllSubDomainInterfacesEnd() const
Returns the corresponding end iterator for leafAllSubDomainInterfacesBegin().
Definition: multidomaingrid/multidomaingrid.hh:641
void preUpdateSubDomains()
Calculates the new subdomain layout, but does not update the current subdomains yet.
Definition: multidomaingrid/multidomaingrid.hh:864
GridFamily::Traits Traits
Definition: multidomaingrid/multidomaingrid.hh:355
void communicate(CommDataHandleIF< DataHandleImp, DataTypeImp > &data, InterfaceType iftype, CommunicationDirection dir, int level) const
Definition: multidomaingrid/multidomaingrid.hh:774
void removeFromAllSubDomains(const typename Traits::template Codim< 0 >::Entity &e)
Removes the given leaf entity from all subdomains it currently belongs to.
Definition: multidomaingrid/multidomaingrid.hh:925
bool preAdapt()
Definition: multidomaingrid/multidomaingrid.hh:730
const SubDomainGrid & subDomain(SubDomainIndex subDomain) const
Returns a reference to the SubDomainGrid associated with the given subdomain.
Definition: multidomaingrid/multidomaingrid.hh:936
HostGrid_ HostGrid
Definition: multidomaingrid/multidomaingrid.hh:245
MultiDomainGridFamily< HostGrid, MDGridTraitsType > GridFamily
Definition: multidomaingrid/multidomaingrid.hh:354
bool loadBalance(DataHandle &dataHandle)
Definition: multidomaingrid/multidomaingrid.hh:793
LevelSubDomainInterfaceIterator levelSubDomainInterfaceEnd(SubDomainIndex subDomain1, SubDomainIndex subDomain2, int level) const
Returns the corresponding end iterator for levelSubDomainInterfaceBegin().
Definition: multidomaingrid/multidomaingrid.hh:617
MultiDomainGrid(HostGrid &hostGrid, bool supportLevelIndexSets=true)
Constructs a new MultiDomainGrid from the given host grid.
Definition: multidomaingrid/multidomaingrid.hh:428
Traits::template Codim< EntitySeed::codimension >::Entity entity(const EntitySeed &entitySeed) const
Definition: multidomaingrid/multidomaingrid.hh:470
LeafAllSubDomainInterfacesIterator leafAllSubDomainInterfacesBegin() const
Returns an iterator over all subdomain interfaces on the leaf view.
Definition: multidomaingrid/multidomaingrid.hh:636
static constexpr bool maxSubDomainIndexIsStatic()
Definition: multidomaingrid/multidomaingrid.hh:399
Definition: gridview.hh:17
Definition: gridview.hh:63
Definition: geometry.hh:12
Definition: indexsets.hh:236
Definition: intersection.hh:18
Definition: iterator.hh:19
Definition: localgeometry.hh:13
Definition: multidomaingrid/multidomaingrid.hh:37
Definition: multidomaingrid/multidomaingrid.hh:47
Dune::GridView< LevelGridViewTraits< const Grid > > LevelGridView
Definition: multidomaingrid/multidomaingrid.hh:148
Dune::IntersectionIterator< const Grid, IntersectionIteratorWrapper< const Grid, typename HostGrid::LevelGridView::IntersectionIterator >, IntersectionWrapper< const Grid, typename HostGrid::LevelGridView::Intersection > > LevelIntersectionIterator
Definition: multidomaingrid/multidomaingrid.hh:90
IdSet< const Grid, IdSetWrapper< const Grid, typename HostGrid::Traits::LocalIdSet >, typename HostGrid::Traits::LocalIdSet::IdType > LocalIdSet
Definition: multidomaingrid/multidomaingrid.hh:170
MultiDomainGrid< HostGrid, MDGridTraits > Grid
The type that implementing the grid.
Definition: multidomaingrid/multidomaingrid.hh:49
Dune::Intersection< const Grid, IntersectionWrapper< const Grid, typename HostGrid::LeafGridView::Intersection > > LeafIntersection
Definition: multidomaingrid/multidomaingrid.hh:58
Dune::Intersection< const Grid, IntersectionWrapper< const Grid, typename HostGrid::LevelGridView::Intersection > > LevelIntersection
Definition: multidomaingrid/multidomaingrid.hh:66
IdSet< const Grid, IdSetWrapper< const Grid, typename HostGrid::Traits::GlobalIdSet >, typename HostGrid::Traits::GlobalIdSet::IdType > GlobalIdSet
Definition: multidomaingrid/multidomaingrid.hh:161
Dune::IntersectionIterator< const Grid, IntersectionIteratorWrapper< const Grid, typename HostGrid::LeafGridView::IntersectionIterator >, IntersectionWrapper< const Grid, typename HostGrid::LeafGridView::Intersection > > LeafIntersectionIterator
Definition: multidomaingrid/multidomaingrid.hh:78
Dune::GridView< LeafGridViewTraits< const Grid > > LeafGridView
Definition: multidomaingrid/multidomaingrid.hh:149
typename HostGrid::CollectiveCommunication CollectiveCommunication
Definition: multidomaingrid/multidomaingrid.hh:172
Dune::EntityIterator< 0, const Grid, HierarchicIteratorWrapper< const Grid > > HierarchicIterator
Definition: multidomaingrid/multidomaingrid.hh:99
Definition: multidomaingrid/multidomaingrid.hh:104
Dune::Entity< cd, dim, const Grid, EntityWrapper > Entity
Definition: multidomaingrid/multidomaingrid.hh:109
Dune::Geometry< dim-cd, dimw, const Grid, LocalGeometryWrapper > LocalGeometry
Definition: multidomaingrid/multidomaingrid.hh:107
typename Partition< All_Partition >::LevelIterator LevelIterator
Definition: multidomaingrid/multidomaingrid.hh:141
Dune::Geometry< dim-cd, dimw, const Grid, GeometryWrapper > Geometry
Definition: multidomaingrid/multidomaingrid.hh:106
typename Partition< All_Partition >::LeafIterator LeafIterator
Definition: multidomaingrid/multidomaingrid.hh:140
Definition: multidomaingrid/multidomaingrid.hh:115
Dune::EntityIterator< cd, const Grid, IteratorWrapper< typename HostGrid::LeafGridView, cd, pitype, const Grid > > LeafIterator
Definition: multidomaingrid/multidomaingrid.hh:137
Dune::EntityIterator< cd, const Grid, IteratorWrapper< typename HostGrid::LevelGridView, cd, pitype, const Grid > > LevelIterator
Definition: multidomaingrid/multidomaingrid.hh:126
Definition: multidomaingrid/multidomaingrid.hh:1180
WrappedDataHandle::DataType buffer
Definition: multidomaingrid/multidomaingrid.hh:1182
SubDomainIndex data
Definition: multidomaingrid/multidomaingrid.hh:1181
Definition: multidomaingrid/multidomaingrid.hh:1295
static const MultiDomainGridType v
Definition: multidomaingrid/multidomaingrid.hh:1296
Definition: subdomaingrid/entity.hh:157
Definition: subdomaingrid/intersectioniterator.hh:19
Definition: subdomaingrid.hh:203
static const auto & multiDomainIntersection(const typename Traits::LeafIntersection &is)
Definition: subdomaingrid.hh:636
Definition: subdomaingrid/entity.hh:79
Definition: subdomaingrid/intersection.hh:19
Definition: subdomaingrid.hh:39
An intersection that forms part of the interface between two subdomains.
Definition: subdomaininterfaceiterator.hh:32
Definition: subdomaintosubdomaininterfaceiterator.hh:113
Definition: subdomaintosubdomaininterfaceiterator.hh:148