opm-simulators
elementborderlistfromgrid.hh
Go to the documentation of this file.
1 // -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
2 // vi: set et ts=4 sw=4 sts=4:
3 /*
4  This file is part of the Open Porous Media project (OPM).
5 
6  OPM is free software: you can redistribute it and/or modify
7  it under the terms of the GNU General Public License as published by
8  the Free Software Foundation, either version 2 of the License, or
9  (at your option) any later version.
10 
11  OPM is distributed in the hope that it will be useful,
12  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  GNU General Public License for more details.
15 
16  You should have received a copy of the GNU General Public License
17  along with OPM. If not, see <http://www.gnu.org/licenses/>.
18 
19  Consult the COPYING file in the top-level source directory of this
20  module for the precise wording of the license and the list of
21  copyright holders.
22 */
27 #ifndef EWOMS_ELEMENT_BORDER_LIST_FROM_GRID_HH
28 #define EWOMS_ELEMENT_BORDER_LIST_FROM_GRID_HH
29 
30 #include "overlaptypes.hh"
31 #include "blacklist.hh"
32 
33 #include <dune/grid/common/datahandleif.hh>
34 #include <dune/grid/common/gridenums.hh>
35 #include <dune/grid/common/partitionset.hh>
36 #include <dune/common/version.hh>
37 
38 #include <set>
39 
40 namespace Opm {
41 namespace Linear {
47 template <class GridView, class ElementMapper>
49 {
51  using PeerBlackList = BlackList::PeerBlackList;
52  using PeerBlackLists = BlackList::PeerBlackLists;
53 
54  using Element = typename GridView::template Codim<0>::Entity;
55 
56  class BorderListHandle_
57  : public Dune::CommDataHandleIF<BorderListHandle_, ProcessRank>
58  {
59  public:
60  BorderListHandle_(const GridView& gridView,
61  const ElementMapper& map,
62  BlackList& blackList,
63  BorderList& borderList)
64  : gridView_(gridView)
65  , map_(map)
66  , blackList_(blackList)
67  , borderList_(borderList)
68  {
69  for (const auto& elem : elements(gridView_)) {
70  if (elem.partitionType() != Dune::InteriorEntity) {
71  Index elemIdx = static_cast<Index>(map_.index(elem));
72  blackList_.addIndex(elemIdx);
73  }
74  }
75  }
76 
77  // data handle methods
78  bool contains(int, int codim) const
79  { return codim == 0; }
80 
81  bool fixedSize(int, int) const
82  { return true; }
83 
84  template <class EntityType>
85  size_t size(const EntityType&) const
86  { return 2; }
87 
88  template <class MessageBufferImp, class EntityType>
89  void gather(MessageBufferImp& buff, const EntityType& e) const
90  {
91  unsigned myIdx = static_cast<unsigned>(map_.index(e));
92  buff.write(static_cast<unsigned>(gridView_.comm().rank()));
93  buff.write(myIdx);
94  }
95 
96  template <class MessageBufferImp>
97  void scatter(MessageBufferImp& buff,
98  const Element& e,
99  size_t)
100  {
101  // discard the index if it is not on the process boundary
102  bool isInteriorNeighbor = false;
103  auto isIt = gridView_.ibegin(e);
104  const auto& isEndIt = gridView_.iend(e);
105  for (; isIt != isEndIt; ++isIt) {
106  if (!isIt->neighbor())
107  continue;
108  else if (isIt->outside().partitionType() == Dune::InteriorEntity) {
109  isInteriorNeighbor = true;
110  break;
111  }
112  }
113  if (!isInteriorNeighbor)
114  return;
115 
116  BorderIndex bIdx;
117 
118  bIdx.localIdx = static_cast<Index>(map_.index(e));
119  {
120  ProcessRank tmp;
121  buff.read(tmp);
122  bIdx.peerRank = tmp;
123  peerSet_.insert(tmp);
124  }
125  {
126  unsigned tmp;
127  buff.read(tmp);
128  bIdx.peerIdx = static_cast<Index>(tmp);
129  }
130  bIdx.borderDistance = 1;
131 
132  borderList_.push_back(bIdx);
133  }
134 
135  // this template method is needed because the above one only works for codim-0
136  // entities (i.e., elements) but the dune grid uses some code which causes the
137  // compiler to invoke the scatter method for every codim...
138  template <class MessageBufferImp, class EntityType>
139  void scatter(MessageBufferImp&,
140  const EntityType&,
141  size_t)
142  { }
143 
144  const std::set<ProcessRank>& peerSet() const
145  { return peerSet_; }
146 
147  private:
148  GridView gridView_;
149  const ElementMapper& map_;
150  std::set<ProcessRank> peerSet_;
151  BlackList& blackList_;
152  BorderList& borderList_;
153  };
154 
155  class PeerBlackListHandle_
156  : public Dune::CommDataHandleIF<PeerBlackListHandle_, int>
157  {
158  public:
159  PeerBlackListHandle_(const GridView& gridView,
160  const ElementMapper& map,
161  PeerBlackLists& peerBlackLists)
162  : gridView_(gridView)
163  , map_(map)
164  , peerBlackLists_(peerBlackLists)
165  {}
166 
167  // data handle methods
168  bool contains(int, int codim) const
169  { return codim == 0; }
170 
171  bool fixedSize(int, int) const
172  { return true; }
173 
174  template <class EntityType>
175  size_t size(const EntityType&) const
176  { return 2; }
177 
178  template <class MessageBufferImp, class EntityType>
179  void gather(MessageBufferImp& buff, const EntityType& e) const
180  {
181  buff.write(static_cast<int>(gridView_.comm().rank()));
182  buff.write(static_cast<int>(map_.index(e)));
183  }
184 
185  template <class MessageBufferImp, class EntityType>
186  void scatter(MessageBufferImp& buff, const EntityType& e, size_t)
187  {
188  int peerRank;
189  int peerIdx;
190  Index localIdx;
191 
192  buff.read(peerRank);
193  buff.read(peerIdx);
194  localIdx = static_cast<Index>(map_.index(e));
195 
197  pIdx.nativeIndexOfPeer = static_cast<Index>(peerIdx);
198  pIdx.myOwnNativeIndex = static_cast<Index>(localIdx);
199 
200  peerBlackLists_[static_cast<ProcessRank>(peerRank)].push_back(pIdx);
201  }
202 
203  const PeerBlackList& peerBlackList(ProcessRank peerRank) const
204  { return peerBlackLists_.at(peerRank); }
205 
206  private:
207  GridView gridView_;
208  const ElementMapper& map_;
209  PeerBlackLists peerBlackLists_;
210  };
211 
212 public:
213  ElementBorderListFromGrid(const GridView& gridView, const ElementMapper& map)
214  : gridView_(gridView)
215  , map_(map)
216  {
217  BorderListHandle_ blh(gridView, map, blackList_, borderList_);
218  gridView.communicate(blh,
219  Dune::InteriorBorder_All_Interface,
220  Dune::BackwardCommunication);
221 
222  PeerBlackListHandle_ pblh(gridView, map, peerBlackLists_);
223  gridView.communicate(pblh,
224  Dune::InteriorBorder_All_Interface,
225  Dune::BackwardCommunication);
226 
227  auto peerIt = blh.peerSet().begin();
228  const auto& peerEndIt = blh.peerSet().end();
229  for (; peerIt != peerEndIt; ++peerIt) {
230  blackList_.setPeerList(*peerIt, pblh.peerBlackList(*peerIt));
231  }
232  }
233 
234  // Access to the border list.
235  const BorderList& borderList() const
236  { return borderList_; }
237 
238  // Access to the black-list indices.
239  const BlackList& blackList() const
240  { return blackList_; }
241 
242 private:
243  const GridView gridView_;
244  const ElementMapper& map_;
245 
246  BorderList borderList_;
247 
248  BlackList blackList_;
249  PeerBlackLists peerBlackLists_;
250 };
251 
252 } // namespace Linear
253 } // namespace Opm
254 
255 #endif
A single index intersecting with the process boundary.
Definition: overlaptypes.hh:101
Expresses which degrees of freedom are blacklisted for the parallel linear solvers and which domestic...
This file contains a set of helper functions used by VFPProd / VFPInj.
Definition: blackoilbioeffectsmodules.hh:45
Uses communication on the grid to find the initial seed list of indices for methods which use element...
Definition: elementborderlistfromgrid.hh:48
Index peerIdx
Index of the entity for the peer process.
Definition: overlaptypes.hh:107
This files provides several data structures for storing tuples of indices of remote and/or local proc...
unsigned ProcessRank
The type of the rank of a process.
Definition: overlaptypes.hh:49
Expresses which degrees of freedom are blacklisted for the parallel linear solvers and which domestic...
Definition: blacklist.hh:48
Index localIdx
Index of the entity for the local process.
Definition: overlaptypes.hh:104
BorderDistance borderDistance
Distance to the process border for the peer (in hops)
Definition: overlaptypes.hh:113
ProcessRank peerRank
Rank of the peer process.
Definition: overlaptypes.hh:110
std::list< BorderIndex > BorderList
This class managages a list of indices which are on the border of a process&#39; partition of the grid...
Definition: overlaptypes.hh:120
int Index
The type of an index of a degree of freedom.
Definition: overlaptypes.hh:44