opm-grid
Intersection.hpp
1 //===========================================================================
2 //
3 // File: Intersection.hpp
4 //
5 // Created: Tue Jun 9 11:17:13 2009
6 //
7 // Author(s): Atgeirr F Rasmussen <atgeirr@sintef.no>
8 // Bård Skaflestad <bard.skaflestad@sintef.no>
9 //
10 // $Date$
11 //
12 // $Revision$
13 //
14 //===========================================================================
15 
16 /*
17  Copyright 2009, 2010 SINTEF ICT, Applied Mathematics.
18  Copyright 2009, 2010, 2022 Equinor ASA.
19 
20  This file is part of The Open Porous Media project (OPM).
21 
22  OPM is free software: you can redistribute it and/or modify
23  it under the terms of the GNU General Public License as published by
24  the Free Software Foundation, either version 3 of the License, or
25  (at your option) any later version.
26 
27  OPM is distributed in the hope that it will be useful,
28  but WITHOUT ANY WARRANTY; without even the implied warranty of
29  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
30  GNU General Public License for more details.
31 
32  You should have received a copy of the GNU General Public License
33  along with OPM. If not, see <http://www.gnu.org/licenses/>.
34 */
35 
36 #ifndef OPM_INTERSECTION_HEADER
37 #define OPM_INTERSECTION_HEADER
38 
39 #include <dune/grid/common/gridenums.hh>
40 #include <opm/grid/utility/ErrorMacros.hpp>
41 
42 // The next statement is a layering violation: we only #include
43 // preprocess.h to get at its "enum face_tag" definition. Enum
44 // face_tag is needed in method Intersection::boundaryId(). This hack
45 // is in dire need of a better solution!
47 
48 #include "Geometry.hpp"
49 #include "OrientedEntityTable.hpp"
50 
51 namespace Dune
52 {
53  namespace cpgrid
54  {
55  template<int>
56  class Entity;
57  class CpGridData;
58 
63  {
64  public:
67  enum { dimension = 3 };
68  enum { dimensionworld = 3 };
69  enum { mydimension = 2 };
75  typedef double ctype;
76  typedef FieldVector<ctype, 2> LocalCoordinate;
77  typedef FieldVector<ctype, 3> GlobalCoordinate;
78 
83  : pgrid_(0),
84  index_(-1),
85  subindex_(-1),
86  faces_of_cell_(),
87  nbcell_(-1), // Init to self, which is invalid.
88  is_on_boundary_(false)
89  {
90  }
94  Intersection(const CpGridData& grid, const EntityRep<0>& cell, int subindex, bool update_now = true);
95 
100  bool operator==(const Intersection& other) const
101  {
102  return subindex_ == other.subindex_ && index_ == other.index_ && pgrid_ == other.pgrid_;
103  }
104 
109  bool operator!=(const Intersection& other) const
110  {
111  return !operator==(other);
112  }
113 
118  bool boundary() const
119  {
120  return is_on_boundary_;
121  }
122 
124  int boundaryId() const;
125 
126 
128  int boundarySegmentIndex() const;
129 
133  bool neighbor() const
134  {
135  return !boundary() && nbcell_!=std::numeric_limits<int>::max();
136  }
137 
141  Entity inside() const;
142 
146  Entity outside() const;
147 
151  bool conforming() const
152  {
153  return boundary(); // I.e. we are assuming all nonconforming interior.
154  }
155 
156  // Geometrical information about this intersection in
157  // local coordinates of the inside() entity.
162  {
163  OPM_THROW(std::runtime_error, "This intersection class does not support geometryInInside().");
164  }
165 
166  // Geometrical information about this intersection in
167  // local coordinates of the outside() entity.
172  {
173  if (boundary()) {
174  OPM_THROW(std::runtime_error, "Cannot access geometryInOutside(), intersection is at a boundary.");
175  }
176  OPM_THROW(std::runtime_error, "This intersection class does not support geometryInOutside().");
177  }
178 
182  Geometry geometry() const;
183 
187  GeometryType type() const
188  {
189  return geometry().type();
190  }
191 
194  int indexInInside() const;
195 
198  int indexInOutside() const
199  {
200  int in_inside = indexInInside();
201  if (in_inside == -1) {
202  // NNC face, return -1 here as well.
203  return -1;
204  }
205  return in_inside + ((in_inside % 2) ? -1 : 1);
206  }
207 
212  FieldVector<ctype, 3> outerNormal(const FieldVector<ctype, 2>&) const;
213 
218  FieldVector<ctype, 3> integrationOuterNormal(const FieldVector<ctype, 2>& unused) const;
219 
224  FieldVector<ctype, 3> unitOuterNormal(const FieldVector<ctype, 2>&) const;
225 
230  FieldVector<ctype, 3> centerUnitOuterNormal() const;
231 
232  int id() const
233  {
234  const EntityRep<1>& face = faces_of_cell_[subindex_];
235  return face.index();
236  }
237 
238  protected:
239  const CpGridData* pgrid_;
240  int index_;
241  int subindex_;
242  OrientedEntityTable<0,1>::row_type faces_of_cell_;
243  int nbcell_;
244  bool is_on_boundary_;
245 
246  void increment();
247 
248  void update();
249 
250  void setAtEnd()
251  {
252  subindex_ = faces_of_cell_.size();
253  }
254 
255  bool isAtEnd() const
256  {
257  return subindex_ == faces_of_cell_.size();
258  }
259 
260  int nbcell() const
261  {
262  if (is_on_boundary_) {
263  OPM_THROW(std::runtime_error, "There is no outside cell, intersection is at boundary.");
264  }
265  if(nbcell_==std::numeric_limits<int>::max())
266  OPM_THROW(std::runtime_error, "There is no outside cell, intersection is at processor boundary.");
267  return nbcell_;
268  }
269  };
270 
271 
272 
273 
274 
276  {
277  public:
279 
281  : Intersection()
282  {
283  }
284 
285  IntersectionIterator(const CpGridData& grid, const EntityRep<0>& cell, bool at_end)
286  : Intersection(grid, cell, 0, !at_end)
287  {
288  if (at_end) {
289  Intersection::setAtEnd();
290  } else {
291  Intersection::update();
292  }
293  }
294 
295  IntersectionIterator& operator++()
296  {
297  Intersection::increment();
298  return *this;
299  }
300 
301  IntersectionIterator operator++(int)
302  {
303  IntersectionIterator tmp(*this);
304  ++(*this);
305  return tmp;
306  }
307 
308  const Intersection* operator->() const
309  {
310  assert(!Intersection::isAtEnd());
311  return this;
312  }
313 
314  const Intersection& operator*() const
315  {
316  assert(!Intersection::isAtEnd());
317  return *this;
318  }
319 
320  };
321 
322 
323 
324 
325 
326  } // namespace cpgrid
327 } // namespace Dune
328 
329 namespace std
330 {
331  template<>
332  struct iterator_traits< Dune::cpgrid::IntersectionIterator >
333  {
335  typedef ptrdiff_t difference_type;
336  typedef typename Iterator::Intersection value_type;
337  typedef value_type* pointer;
338  typedef value_type& reference;
339  typedef forward_iterator_tag iterator_category;
340  };
341 
342 } // namespace std
343 
344 #endif // OPM_INTERSECTION_HEADER
const LocalGeometry & geometryInOutside() const
Definition: Intersection.hpp:171
int index() const
The (positive) index of an entity.
Definition: EntityRep.hpp:125
bool conforming() const
Definition: Intersection.hpp:151
Intersection()
Definition: Intersection.hpp:82
Entity outside() const
Definition: Intersection.cpp:181
bool operator==(const Intersection &other) const
Definition: Intersection.hpp:100
The namespace Dune is the main namespace for all Dune code.
Definition: CartesianIndexMapper.hpp:9
const LocalGeometry & geometryInInside() const
Definition: Intersection.hpp:161
Definition: Intersection.hpp:329
Definition: Intersection.hpp:62
FieldVector< ctype, 3 > centerUnitOuterNormal() const
Definition: Intersection.cpp:171
This class encapsulates geometry for vertices, intersections, and cells.
Definition: CpGridData.hpp:94
Struct that hods all the data needed to represent a Cpgrid.
Definition: CpGridData.hpp:117
cpgrid::Entity< 0 > Entity
Definition: Intersection.hpp:72
int indexInInside() const
Local index of codim 1 entity in the inside() entity where intersection is contained in...
Definition: Intersection.cpp:128
FieldVector< ctype, 3 > integrationOuterNormal(const FieldVector< ctype, 2 > &unused) const
Definition: Intersection.cpp:160
Geometry geometry() const
Definition: Intersection.cpp:186
int boundaryId() const
Returns the boundary id of this intersection.
Definition: Intersection.cpp:47
bool neighbor() const
Definition: Intersection.hpp:133
FieldVector< ctype, 3 > outerNormal(const FieldVector< ctype, 2 > &) const
Definition: Intersection.cpp:155
GeometryType type() const
Definition: Intersection.hpp:187
FieldVector< ctype, 3 > unitOuterNormal(const FieldVector< ctype, 2 > &) const
Definition: Intersection.cpp:166
int indexInOutside() const
Local index of codim 1 entity in outside() entity where intersection is contained in...
Definition: Intersection.hpp:198
bool operator!=(const Intersection &other) const
Definition: Intersection.hpp:109
Entity inside() const
Definition: Intersection.cpp:176
int boundarySegmentIndex() const
Returns the boundary segment index of this intersection.
Definition: Intersection.cpp:85
Low-level corner-point processing routines and supporting data structures.
Represents an entity of a given codim, with positive or negative orientation.
Definition: CpGridData.hpp:96
Definition: Intersection.hpp:275
bool boundary() const
Definition: Intersection.hpp:118