6 #include <dune/common/unused.hh> 7 #include <dune/common/version.hh> 8 #include <dune/grid/common/datahandleif.hh> 13 template <
int dim>
class UGGrid;
29 :
public Dune::CommDataHandleIF<UniqueBorderPartition<Grid>, int>
31 using IdSet =
typename Grid::GlobalIdSet;
32 using IdType =
typename IdSet::IdType;
35 using EntitySet = std::set<IdType>;
50 , idSet_(grid.globalIdSet())
54 bool contains(
int ,
int )
const {
return true; }
57 bool fixedSize(
int ,
int )
const {
return true; }
60 template <
class Entity>
61 std::size_t size(Entity
const& e)
const {
return 1; }
63 template <
class MessageBuffer,
class Entity>
64 void gather(MessageBuffer& buff, Entity
const& e)
const 69 template <
class MessageBuffer,
class Entity>
70 void scatter(MessageBuffer& buff, Entity
const& e, std::size_t n)
72 scatterImpl(buff, e, n, int_t<Entity::codimension>{});
78 return notOwner_.count(
id) == 0;
89 template <
class MessageBuffer,
class Entity,
int cd>
90 void scatterImpl(MessageBuffer& buff, Entity
const& e, [[maybe_unused]] std::size_t n, int_t<cd>)
100 notOwner_.insert(idSet_.id(e));
103 template <
class MessageBuffer,
class Entity>
104 void scatterImpl(MessageBuffer& buff, Entity
const& e, [[maybe_unused]] std::size_t n, int_t<0>)
113 if (rank > myrank_) {
114 for (
int codim = 1; codim <= Grid::dimension; ++codim) {
115 for (
int i = 0; i <
int(e.subEntities(codim)); ++i) {
116 notOwner_.insert(idSet_.subId(e, i, codim));
132 :
public Dune::CommDataHandleIF<UniqueBorderPartition<Dune::UGGrid<dim>>, int>
134 using Grid = Dune::UGGrid<dim>;
135 using IdSet =
typename Grid::LocalIdSet;
136 using IdType =
typename IdSet::IdType;
139 using EntitySet = std::set<IdType>;
154 , idSet_(grid.localIdSet())
158 bool contains(
int ,
int codim)
const {
return true; }
161 bool fixedSize(
int ,
int codim)
const {
return codim != 0; }
164 template <
class Entity>
165 std::size_t size(Entity
const& e)
const 167 if (Entity::codimension != 0)
171 for (
int codim = 1; codim <= Grid::dimension; ++codim)
172 s += e.subEntities(codim);
176 template <
class MessageBuffer,
class Entity>
177 void gather(MessageBuffer& buff, Entity
const& e)
const 179 gatherImpl(buff, e, int_t<Entity::codimension>{});
182 template <
class MessageBuffer,
class Entity>
183 void scatter(MessageBuffer& buff, Entity
const& e, std::size_t n)
185 scatterImpl(buff, e, n, int_t<Entity::codimension>{});
189 bool contains(IdType
const&
id)
const 191 return entityToRank_[id] == myrank_;
195 int numIterations()
const 197 return Grid::dimension;
201 template <
class MessageBuffer,
class Entity,
int cd>
202 void gatherImpl(MessageBuffer& buff, Entity
const& e, int_t<cd>)
const 204 int& rank = entityToRank_[idSet_.id(e)];
205 rank = std::max(rank, myrank_);
209 template <
class MessageBuffer,
class Entity>
210 void gatherImpl(MessageBuffer& buff, Entity
const& e, int_t<0>)
const 213 for (
int codim = 1; codim <= Grid::dimension; ++codim) {
214 for (
int i = 0; i <
int(e.subEntities(codim)); ++i) {
215 int& rank = entityToRank_[idSet_.subId(e, i, codim)];
216 rank = std::max(rank, myrank_);
222 template <
class MessageBuffer,
class Entity,
int cd>
223 void scatterImpl(MessageBuffer& buff, Entity
const& e, [[maybe_unused]] std::size_t n, int_t<cd>)
230 int& storedRank = entityToRank_[idSet_.id(e)];
231 storedRank = std::max(rank, storedRank);
234 template <
class MessageBuffer,
class Entity>
235 void scatterImpl(MessageBuffer& buff, Entity
const& e, std::size_t n, int_t<0>)
238 for (
int codim = 1; codim <= Grid::dimension; ++codim) {
239 for (
int i = 0; i <
int(e.subEntities(codim)); ++i, ++j) {
244 int& storedRank = entityToRank_[idSet_.subId(e, i, codim)];
245 storedRank = std::max(rank, storedRank);
252 mutable std::map<IdType, int> entityToRank_;
Definition: AdaptiveGrid.hpp:373
Definition: AdaptBase.hpp:6
int numIterations() const
Number of iterations to perform the communication in order to collect all neighboring entities...
Definition: UniqueBorderPartition.hpp:82
UniqueBorderPartition(int rank, Grid const &grid)
Construct a UniqueBorderPartition DataHandle to be used in a GridView communicator.
Definition: UniqueBorderPartition.hpp:48
bool contains(IdType const &id) const
Returns whether id is owned by this rank.
Definition: UniqueBorderPartition.hpp:76
Determine for each border entity which processor owns it.
Definition: UniqueBorderPartition.hpp:28