opm-grid
Loading...
Searching...
No Matches
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
51namespace 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 };
73 typedef cpgrid::Geometry<2,3> Geometry;
74 typedef cpgrid::Geometry<2,3> LocalGeometry;
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 }
91
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.
161 const LocalGeometry& geometryInInside() const
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.
171 const LocalGeometry& geometryInOutside() const
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
275 class IntersectionIterator : public Intersection
276 {
277 public:
278 typedef cpgrid::Intersection Intersection;
279
280 IntersectionIterator()
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
329namespace std
330{
331 template<>
332 struct iterator_traits< Dune::cpgrid::IntersectionIterator >
333 {
334 typedef Dune::cpgrid::IntersectionIterator Iterator;
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
Struct that hods all the data needed to represent a Cpgrid.
Definition CpGridData.hpp:118
Represents an entity of a given codim, with positive or negative orientation.
Definition EntityRep.hpp:98
int index() const
The (positive) index of an entity.
Definition EntityRep.hpp:125
Definition Entity.hpp:107
This class encapsulates geometry for vertices, intersections, and cells.
Definition Geometry.hpp:76
Definition Intersection.hpp:276
Definition Intersection.hpp:63
GeometryType type() const
Definition Intersection.hpp:187
const LocalGeometry & geometryInInside() const
Definition Intersection.hpp:161
int boundaryId() const
Returns the boundary id of this intersection.
Definition Intersection.cpp:47
bool neighbor() const
Definition Intersection.hpp:133
FieldVector< ctype, 3 > unitOuterNormal(const FieldVector< ctype, 2 > &) const
Definition Intersection.cpp:166
cpgrid::Entity< 0 > Entity
Definition Intersection.hpp:72
bool operator!=(const Intersection &other) const
Definition Intersection.hpp:109
int boundarySegmentIndex() const
Returns the boundary segment index of this intersection.
Definition Intersection.cpp:85
FieldVector< ctype, 3 > outerNormal(const FieldVector< ctype, 2 > &) const
Definition Intersection.cpp:155
Entity inside() const
Definition Intersection.cpp:176
bool operator==(const Intersection &other) const
Definition Intersection.hpp:100
const LocalGeometry & geometryInOutside() const
Definition Intersection.hpp:171
FieldVector< ctype, 3 > integrationOuterNormal(const FieldVector< ctype, 2 > &unused) const
Definition Intersection.cpp:160
FieldVector< ctype, 3 > centerUnitOuterNormal() const
Definition Intersection.cpp:171
int indexInInside() const
Local index of codim 1 entity in the inside() entity where intersection is contained in.
Definition Intersection.cpp:128
bool conforming() const
Definition Intersection.hpp:151
Intersection()
Definition Intersection.hpp:82
int indexInOutside() const
Local index of codim 1 entity in outside() entity where intersection is contained in.
Definition Intersection.hpp:198
Geometry geometry() const
Definition Intersection.cpp:186
bool boundary() const
Definition Intersection.hpp:118
Entity outside() const
Definition Intersection.cpp:181
Copyright 2019 Equinor AS.
Definition GridPartitioning.cpp:673
The namespace Dune is the main namespace for all Dune code.
Definition CartesianIndexMapper.hpp:10
Low-level corner-point processing routines and supporting data structures.