dune-grid-glue 2.8-git
computeintersection.hh
Go to the documentation of this file.
1#ifndef DUNE_GRIDGLUE_MERGING_COMPUTEINTERSECTION_HH
2#define DUNE_GRIDGLUE_MERGING_COMPUTEINTERSECTION_HH
3
4#include <dune/common/fvector.hh>
5#include <dune/common/fmatrix.hh>
6
7namespace Dune {
8namespace GridGlue {
9
10template<int dimWorld, int dim1, int dim2, typename T = double>
12public:
13 typedef FieldVector<T, dimWorld> Vector;
14 static const int grid1Dimension = dim1;
15 static const int grid2Dimension = dim2;
16 static const int intersectionDimension = (dim1 < dim2)?(dim1):(dim2);
17
18 static bool computeIntersectionPoints(const std::vector<Vector> X,
19 const std::vector<Vector> Y,
20 std::vector<std::vector<int> >& SX,
21 std::vector<std::vector<int> >& SY,
22 std::vector<Vector>& P);
23 static void grid1_subdivisions(const std::vector<Vector> elementCorners,
24 std::vector<std::vector<unsigned int> >& subElements,
25 std::vector<std::vector<int> >& faceIds);
26 static void grid2_subdivisions(const std::vector<Vector> elementCorners,
27 std::vector<std::vector<unsigned int> >& subElements,
28 std::vector<std::vector<int> >& faceIds);
29};
30
36template<class CM>
38private:
39 typedef typename CM::Vector V;
40 const int dimWorld = V::dimension;
41 const int dim1 = CM::grid1Dimension;
42 const int dim2 = CM::grid2Dimension;
43public:
57 static bool computeIntersection(const std::vector<V>& X,
58 const std::vector<V>& Y,
59 std::vector<std::vector<int> >& SX,
60 std::vector<std::vector<int> >& SY,
61 std::vector<V>& P);
62
72 template<int isDim, int dW>
73 static void orderPoints(const V& centroid,
74 const std::vector<std::vector<int> >& SX,
75 const std::vector<std::vector<int> >& SY,
76 const std::vector<V>& P,
77 std::vector<std::vector<int> >& H)
78 {
79 if (isDim > 1)
80 orderPoints_(std::integral_constant<int,isDim>(),std::integral_constant<int,dW>(),
81 centroid, SX, SY, P,H);
82 }
83
84private:
85 static void orderPoints_(std::integral_constant<int,1>,
86 std::integral_constant<int,1>,
87 const V& centroid,
88 const std::vector<std::vector<int> >& SX,
89 const std::vector<std::vector<int> >& SY,
90 const std::vector<V>& P,
91 std::vector<std::vector<int> >& H) {}
92 static void orderPoints_(std::integral_constant<int,1>,
93 std::integral_constant<int,2>,
94 const V& centroid,
95 const std::vector<std::vector<int> >& SX,
96 const std::vector<std::vector<int> >& SY,
97 const std::vector<V>& P,
98 std::vector<std::vector<int> >& H) {}
99 static void orderPoints_(std::integral_constant<int,1>,
100 std::integral_constant<int,3>,
101 const V& centroid,
102 const std::vector<std::vector<int> >& SX,
103 const std::vector<std::vector<int> >& SY,
104 const std::vector<V>& P,
105 std::vector<std::vector<int> >& H) {}
106 static void orderPoints_(std::integral_constant<int,2>,
107 std::integral_constant<int,2>,
108 const V& centroid,
109 const std::vector<std::vector<int> >& SX,
110 const std::vector<std::vector<int> >& SY,
111 const std::vector<V>& P,
112 std::vector<std::vector<int> >& H);
113 static void orderPoints_(std::integral_constant<int,2>,
114 std::integral_constant<int,3>,
115 const V& centroid,
116 const std::vector<std::vector<int> >& SX,
117 const std::vector<std::vector<int> >& SY,
118 const std::vector<V>& P,
119 std::vector<std::vector<int> >& H);
120 static void orderPoints_(std::integral_constant<int,3>,
121 std::integral_constant<int,3>,
122 const V& centroid,
123 const std::vector<std::vector<int> >& SX,
124 const std::vector<std::vector<int> >& SY,
125 const std::vector<V>& P,
126 std::vector<std::vector<int> > & H);
127
135 static void orderPointsCC(std::integral_constant<int,2>,
136 const V& centroid,
137 std::vector<int> &id,
138 const std::vector<V>& P);
139 static void orderPointsCC(std::integral_constant<int,3>,
140 const V& centroid,
141 std::vector<int> &id,
142 const std::vector<V>& P);
143
148 static void removeDuplicates( std::vector<int> & p);
149
157 static bool newFace3D(const std::vector<int>& id,
158 const std::vector<std::vector<int> >& H);
159};
160
161template<class V>
162inline int insertPoint(const V p, std::vector<V>& P)
163{
164 double eps= 1e-8; // tolerance for identical nodes
165 std::size_t k=0 ;
166
167 if (P.size()>0) {
168
169 while ((k<P.size())&&
170 ((p - P[k]).infinity_norm()>eps*(P[k].infinity_norm()) &&
171 (p - P[k]).infinity_norm()>eps*(p.infinity_norm())) &&
172 !(p.infinity_norm() < eps && P[k].infinity_norm() <eps &&
173 (p - P[k]).infinity_norm() < eps))
174 k++ ;
175
176 if (k>=P.size())
177 P.push_back(p) ; // new node is not contained in P
178
179 }
180 else
181 P.push_back(p);
182
183 return k ;
184}
185
186
187} /* namespace Dune::GridGlue */
188} /* namespace Dune */
189
190#include "simplexintersection.cc"
191#include "computeintersection.cc"
192
193#endif
Definition: gridglue.hh:35
int insertPoint(const V p, std::vector< V > &P)
Definition: computeintersection.hh:162
Definition: computeintersection.hh:11
static void grid2_subdivisions(const std::vector< Vector > elementCorners, std::vector< std::vector< unsigned int > > &subElements, std::vector< std::vector< int > > &faceIds)
static bool computeIntersectionPoints(const std::vector< Vector > X, const std::vector< Vector > Y, std::vector< std::vector< int > > &SX, std::vector< std::vector< int > > &SY, std::vector< Vector > &P)
FieldVector< T, dimWorld > Vector
Definition: computeintersection.hh:13
static const int grid1Dimension
Definition: computeintersection.hh:14
static void grid1_subdivisions(const std::vector< Vector > elementCorners, std::vector< std::vector< unsigned int > > &subElements, std::vector< std::vector< int > > &faceIds)
static const int grid2Dimension
Definition: computeintersection.hh:15
static const int intersectionDimension
Definition: computeintersection.hh:16
Intersection computation method for two elements of arbitrary dimension.
Definition: computeintersection.hh:37
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:73
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:12