dune-grid-glue  2.9
computeintersection.hh
Go to the documentation of this file.
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 
9 namespace Dune {
10 namespace GridGlue {
11 
12 template<int dimWorld, int dim1, int dim2, typename T = double>
14 public:
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 
38 template<class CM>
40 private:
41  typedef typename CM::Vector V;
42  const int dimWorld = V::dimension;
43  const int dim1 = CM::grid1Dimension;
44  const int dim2 = CM::grid2Dimension;
45 public:
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 
86 private:
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 
163 template<class V>
164 inline 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
Definition: gridglue.hh:37
int insertPoint(const V p, std::vector< V > &P)
Definition: computeintersection.hh:164
Definition: computeintersection.hh:13
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:15
static const int grid1Dimension
Definition: computeintersection.hh:16
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:17
static const int intersectionDimension
Definition: computeintersection.hh:18
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