dune-grid-glue  2.8.0
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 
7 namespace Dune {
8 namespace GridGlue {
9 
10 template<int dimWorld, int dim1, int dim2, typename T = double>
12 public:
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 
36 template<class CM>
38 private:
39  typedef typename CM::Vector V;
40  const int dimWorld = V::dimension;
41  const int dim1 = CM::grid1Dimension;
42  const int dim2 = CM::grid2Dimension;
43 public:
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 
84 private:
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 
161 template<class V>
162 inline 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