Loading [MathJax]/extensions/tex2jax.js

DUNE-GRID-GLUE (2.10)

computeintersection.hh
1// SPDX-FileCopyrightInfo: Copyright © DUNE Project contributors, see file LICENSE.md in module root
2// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-GPL-2.0-only-with-dune-grid-glue-exception
3#ifndef DUNE_GRIDGLUE_MERGING_COMPUTEINTERSECTION_HH
4#define DUNE_GRIDGLUE_MERGING_COMPUTEINTERSECTION_HH
5
6#include <dune/common/fvector.hh>
7#include <dune/common/fmatrix.hh>
8
9namespace Dune {
10namespace GridGlue {
11
12template<int dimWorld, int dim1, int dim2, typename T = double>
13class ComputationMethod {
14public:
15 typedef FieldVector<T, dimWorld> Vector;
16 static const int grid1Dimension = dim1;
17 static const int grid2Dimension = dim2;
18 static const int intersectionDimension = (dim1 < dim2)?(dim1):(dim2);
19
20 static bool computeIntersectionPoints(const std::vector<Vector> X,
21 const std::vector<Vector> Y,
22 std::vector<std::vector<int> >& SX,
23 std::vector<std::vector<int> >& SY,
24 std::vector<Vector>& P);
25 static void grid1_subdivisions(const std::vector<Vector> elementCorners,
26 std::vector<std::vector<unsigned int> >& subElements,
27 std::vector<std::vector<int> >& faceIds);
28 static void grid2_subdivisions(const std::vector<Vector> elementCorners,
29 std::vector<std::vector<unsigned int> >& subElements,
30 std::vector<std::vector<int> >& faceIds);
31};
32
38template<class CM>
40private:
41 typedef typename CM::Vector V;
42 const int dimWorld = V::dimension;
43 const int dim1 = CM::grid1Dimension;
44 const int dim2 = CM::grid2Dimension;
45public:
59 static bool computeIntersection(const std::vector<V>& X,
60 const std::vector<V>& Y,
61 std::vector<std::vector<int> >& SX,
62 std::vector<std::vector<int> >& SY,
63 std::vector<V>& P);
64
74 template<int isDim, int dW>
75 static void orderPoints(const V& centroid,
76 const std::vector<std::vector<int> >& SX,
77 const std::vector<std::vector<int> >& SY,
78 const std::vector<V>& P,
79 std::vector<std::vector<int> >& H)
80 {
81 if (isDim > 1)
82 orderPoints_(std::integral_constant<int,isDim>(),std::integral_constant<int,dW>(),
83 centroid, SX, SY, P,H);
84 }
85
86private:
87 static void orderPoints_(std::integral_constant<int,1>,
88 std::integral_constant<int,1>,
89 const V& centroid,
90 const std::vector<std::vector<int> >& SX,
91 const std::vector<std::vector<int> >& SY,
92 const std::vector<V>& P,
93 std::vector<std::vector<int> >& H) {}
94 static void orderPoints_(std::integral_constant<int,1>,
95 std::integral_constant<int,2>,
96 const V& centroid,
97 const std::vector<std::vector<int> >& SX,
98 const std::vector<std::vector<int> >& SY,
99 const std::vector<V>& P,
100 std::vector<std::vector<int> >& H) {}
101 static void orderPoints_(std::integral_constant<int,1>,
102 std::integral_constant<int,3>,
103 const V& centroid,
104 const std::vector<std::vector<int> >& SX,
105 const std::vector<std::vector<int> >& SY,
106 const std::vector<V>& P,
107 std::vector<std::vector<int> >& H) {}
108 static void orderPoints_(std::integral_constant<int,2>,
109 std::integral_constant<int,2>,
110 const V& centroid,
111 const std::vector<std::vector<int> >& SX,
112 const std::vector<std::vector<int> >& SY,
113 const std::vector<V>& P,
114 std::vector<std::vector<int> >& H);
115 static void orderPoints_(std::integral_constant<int,2>,
116 std::integral_constant<int,3>,
117 const V& centroid,
118 const std::vector<std::vector<int> >& SX,
119 const std::vector<std::vector<int> >& SY,
120 const std::vector<V>& P,
121 std::vector<std::vector<int> >& H);
122 static void orderPoints_(std::integral_constant<int,3>,
123 std::integral_constant<int,3>,
124 const V& centroid,
125 const std::vector<std::vector<int> >& SX,
126 const std::vector<std::vector<int> >& SY,
127 const std::vector<V>& P,
128 std::vector<std::vector<int> > & H);
129
137 static void orderPointsCC(std::integral_constant<int,2>,
138 const V& centroid,
139 std::vector<int> &id,
140 const std::vector<V>& P);
141 static void orderPointsCC(std::integral_constant<int,3>,
142 const V& centroid,
143 std::vector<int> &id,
144 const std::vector<V>& P);
145
150 static void removeDuplicates( std::vector<int> & p);
151
159 static bool newFace3D(const std::vector<int>& id,
160 const std::vector<std::vector<int> >& H);
161};
162
163template<class V>
164inline int insertPoint(const V p, std::vector<V>& P)
165{
166 double eps= 1e-8; // tolerance for identical nodes
167 std::size_t k=0 ;
168
169 if (P.size()>0) {
170
171 while ((k<P.size())&&
172 ((p - P[k]).infinity_norm()>eps*(P[k].infinity_norm()) &&
173 (p - P[k]).infinity_norm()>eps*(p.infinity_norm())) &&
174 !(p.infinity_norm() < eps && P[k].infinity_norm() <eps &&
175 (p - P[k]).infinity_norm() < eps))
176 k++ ;
177
178 if (k>=P.size())
179 P.push_back(p) ; // new node is not contained in P
180
181 }
182 else
183 P.push_back(p);
184
185 return k ;
186}
187
188
189} /* namespace Dune::GridGlue */
190} /* namespace Dune */
191
192#include "simplexintersection.cc"
193#include "computeintersection.cc"
194
195#endif
Intersection computation method for two elements of arbitrary dimension.
Definition: computeintersection.hh:39
static void orderPoints(const V &centroid, const std::vector< std::vector< int > > &SX, const std::vector< std::vector< int > > &SY, const std::vector< V > &P, std::vector< std::vector< int > > &H)
Order Points in the point list P face-wise such that a subsimplex subdivision can be constructed.
Definition: computeintersection.hh:75
static bool computeIntersection(const std::vector< V > &X, const std::vector< V > &Y, std::vector< std::vector< int > > &SX, std::vector< std::vector< int > > &SY, std::vector< V > &P)
Compute the intersection of two elements X and Y Compute the intersection of two elements X and Y,...
Definition: computeintersection.cc:14
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden & Uni Heidelberg  |  generated with Hugo v0.111.3 (Apr 10, 22:40, 2025)