wedgeMatcher.C
Go to the documentation of this file.
1 /*---------------------------------------------------------------------------*\
2  ========= |
3  \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
4  \\ / O peration |
5  \\ / A nd | www.openfoam.com
6  \\/ M anipulation |
7 -------------------------------------------------------------------------------
8  Copyright (C) 2011-2016 OpenFOAM Foundation
9 -------------------------------------------------------------------------------
10 License
11  This file is part of OpenFOAM.
12 
13  OpenFOAM is free software: you can redistribute it and/or modify it
14  under the terms of the GNU General Public License as published by
15  the Free Software Foundation, either version 3 of the License, or
16  (at your option) any later version.
17 
18  OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
19  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
20  FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
21  for more details.
22 
23  You should have received a copy of the GNU General Public License
24  along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
25 
26 \*---------------------------------------------------------------------------*/
27 
28 #include "wedgeMatcher.H"
29 #include "primitiveMesh.H"
30 #include "ListOps.H"
31 
32 // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
33 
35 :
37  (
38  vertPerCell,
39  facePerCell,
40  maxVertPerFace,
41  "wedge" // same as cellModel::modelNames[cellModel::WEDGE]
42  )
43 {}
44 
45 
46 // * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
47 
49 {}
50 
51 
52 // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
53 
55 (
56  const bool checkOnly,
57  const faceList& faces,
58  const labelList& owner,
59  const label celli,
60  const labelList& myFaces
61 )
62 {
63  if (!faceSizeMatch(faces, myFaces))
64  {
65  return false;
66  }
67 
68  // Calculate localFaces_ and mapping pointMap_, faceMap_
69  label numVert = calcLocalFaces(faces, myFaces);
70 
71  if (numVert != vertPerCell)
72  {
73  return false;
74  }
75 
76  // Set up 'edge' to face mapping.
77  calcEdgeAddressing(numVert);
78 
79  // Set up point on face to index-in-face mapping
80  calcPointFaceIndex();
81 
82  // Storage for maps -vertex to mesh and -face to mesh
83  vertLabels_.setSize(vertPerCell);
84  faceLabels_.setSize(facePerCell);
85 
86  //
87  // Try first triangular face. Rotate in all directions.
88  // Walk path to other triangular face.
89  //
90 
91  label face0I = -1;
92  forAll(faceSize_, facei)
93  {
94  if (faceSize_[facei] == 3)
95  {
96  face0I = facei;
97  break;
98  }
99  }
100 
101  const face& face0 = localFaces_[face0I];
102 
103  // Try all rotations of this face
104  for (label face0vert0 = 0; face0vert0 < faceSize_[face0I]; face0vert0++)
105  {
106  //
107  // Try to follow prespecified path on faces of cell,
108  // starting at face0vert0
109  //
110 
111  vertLabels_[0] = pointMap_[face0[face0vert0]];
112  faceLabels_[0] = faceMap_[face0I];
113  //Info<< endl << "Wedge vertex 0: vertex " << face0[face0vert0]
114  // << " at position " << face0vert0 << " in face " << face0
115  // << endl;
116 
117  // Walk face 0 from vertex 0 to 1
118  label face0vert1 =
119  nextVert
120  (
121  face0vert0,
122  faceSize_[face0I],
123  !(owner[faceMap_[face0I]] == celli)
124  );
125  vertLabels_[1] = pointMap_[face0[face0vert1]];
126  //Info<< "Wedge vertex 1: vertex " << face0[face0vert1]
127  // << " at position " << face0vert1 << " in face " << face0
128  // << endl;
129 
130  // Jump edge from face0 to face4
131  label face4I =
132  otherFace
133  (
134  numVert,
135  face0[face0vert0],
136  face0[face0vert1],
137  face0I
138  );
139  const face& face4 = localFaces_[face4I];
140  //Info<< "Stepped to wedge face 4 " << face4
141  // << " across edge " << face0[face0vert0] << " "
142  // << face0[face0vert1]
143  // << endl;
144 
145  if (faceSize_[face4I] != 4)
146  {
147  //Info<< "Cannot be Wedge Face 4 since size="
148  // << faceSize_[face4I] << endl;
149  continue;
150  }
151 
152  // Is wedge for sure now
153  if (checkOnly)
154  {
155  return true;
156  }
157 
158  faceLabels_[4] = faceMap_[face4I];
159 
160  // Get index of vertex 0 in face4
161  label face4vert0 = pointFaceIndex_[face0[face0vert0]][face4I];
162 
163  //Info<< "Wedge vertex 0 also: vertex " << face4[face4vert0]
164  // << " at position " << face4vert0 << " in face " << face4
165  // << endl;
166 
167  // Walk face 4 from vertex 4 to 3
168  label face4vert3 =
169  nextVert
170  (
171  face4vert0,
172  faceSize_[face4I],
173  !(owner[faceMap_[face4I]] == celli)
174  );
175  vertLabels_[3] = pointMap_[face4[face4vert3]];
176  //Info<< "Wedge vertex 3: vertex " << face4[face4vert3]
177  // << " at position " << face4vert3 << " in face " << face4
178  // << endl;
179 
180 
181  // Jump edge from face4 to face2
182  label face2I =
183  otherFace
184  (
185  numVert,
186  face4[face4vert0],
187  face4[face4vert3],
188  face4I
189  );
190  const face& face2 = localFaces_[face2I];
191  //Info<< "Stepped to wedge face 2 " << face2
192  // << " across edge " << face4[face4vert0] << " "
193  // << face4[face4vert3]
194  // << endl;
195 
196  if (faceSize_[face2I] != 3)
197  {
198  //Info<< "Cannot be Wedge Face 2 since size="
199  // << faceSize_[face2I] << endl;
200  continue;
201  }
202  faceLabels_[2] = faceMap_[face2I];
203 
204  // Is wedge for sure now
205  //Info<< "** WEDGE **" << endl;
206 
207 
208  //
209  // Walk to other faces and vertices and assign mapping.
210  //
211 
212  // Vertex 6
213  label face2vert3 = pointFaceIndex_[face4[face4vert3]][face2I];
214 
215  // Walk face 2 from vertex 3 to 6
216  label face2vert6 =
217  nextVert
218  (
219  face2vert3,
220  faceSize_[face2I],
221  (owner[faceMap_[face2I]] == celli)
222  );
223  vertLabels_[6] = pointMap_[face2[face2vert6]];
224 
225  // Jump edge from face2 to face1
226  label face1I =
227  otherFace
228  (
229  numVert,
230  face2[face2vert3],
231  face2[face2vert6],
232  face2I
233  );
234  faceLabels_[1] = faceMap_[face1I];
235  const face& face1 = localFaces_[face1I];
236  //Info<< "Stepped to wedge face 1 " << face1
237  // << " across edge " << face2[face2vert3] << " "
238  // << face2[face2vert6]
239  // << endl;
240 
241  label face1vert6 = pointFaceIndex_[face2[face2vert6]][face1I];
242 
243  // Walk face 1 from vertex 6 to 5
244  label face1vert5 =
245  nextVert
246  (
247  face1vert6,
248  faceSize_[face1I],
249  !(owner[faceMap_[face1I]] == celli)
250  );
251  vertLabels_[5] = pointMap_[face1[face1vert5]];
252 
253  // Walk face 1 from vertex 5 to 4
254  label face1vert4 =
255  nextVert
256  (
257  face1vert5,
258  faceSize_[face1I],
259  !(owner[faceMap_[face1I]] == celli)
260  );
261  vertLabels_[4] = pointMap_[face1[face1vert4]];
262 
263  // Walk face 0 from vertex 1 to 2
264  label face0vert2 =
265  nextVert
266  (
267  face0vert1,
268  faceSize_[face0I],
269  !(owner[faceMap_[face0I]] == celli)
270  );
271  vertLabels_[2] = pointMap_[face0[face0vert2]];
272  //Info<< "Wedge vertex 2: vertex " << face0[face0vert2]
273  // << " at position " << face0vert2 << " in face " << face0
274  // << endl;
275 
276  // Jump edge from face0 to face3
277  label face3I =
278  otherFace
279  (
280  numVert,
281  face0[face0vert1],
282  face0[face0vert2],
283  face0I
284  );
285  faceLabels_[3] = faceMap_[face3I];
286  //const face& face3 = localFaces_[face3I];
287  //Info<< "Stepped to wedge face 3 " << face3
288  // << " across edge " << face0[face0vert1] << " "
289  // << face0[face0vert2]
290  // << endl;
291 
292 
293  // Jump edge from face0 to face5
294  label face5I =
295  otherFace
296  (
297  numVert,
298  face0[face0vert2],
299  face0[face0vert0],
300  face0I
301  );
302  faceLabels_[5] = faceMap_[face5I];
303  //const face& face5 = localFaces_[face5I];
304  //Info<< "Stepped to wedge face 5 " << face5
305  // << " across edge " << face0[face0vert2] << " "
306  // << face0[face0vert0]
307  // << endl;
308 
309  return true;
310  }
311 
312  // Tried all triangular faces, in all rotations but no match found
313  return false;
314 }
315 
316 
318 {
319  return 2*3 + 4*4;
320 }
321 
322 
324 (
325  const faceList& faces,
326  const labelList& myFaces
327 ) const
328 {
329  if (myFaces.size() != 6)
330  {
331  return false;
332  }
333 
334  label nTris = 0;
335  label nQuads = 0;
336 
337  for (const label facei : myFaces)
338  {
339  const label size = faces[facei].size();
340 
341  if (size == 3)
342  {
343  ++nTris;
344  }
345  else if (size == 4)
346  {
347  ++nQuads;
348  }
349  else
350  {
351  return false;
352  }
353  }
354 
355  return (nTris == 2 && nQuads == 4);
356 }
357 
358 
360 {
361  return matchShape
362  (
363  true,
364  mesh.faces(),
365  mesh.faceOwner(),
366  celli,
367  mesh.cells()[celli]
368  );
369 }
370 
371 
373 {
374  // Do as if mesh with one cell only
375  return matchShape
376  (
377  true,
378  faces, // all faces in mesh
379  labelList(faces.size(), Zero), // cell 0 is owner of all faces
380  0, // cell label
381  identity(faces.size()) // faces of cell 0
382  );
383 }
384 
385 
387 (
388  const primitiveMesh& mesh,
389  const label celli,
390  cellShape& shape
391 )
392 {
393  if
394  (
395  matchShape
396  (
397  false,
398  mesh.faces(),
399  mesh.faceOwner(),
400  celli,
401  mesh.cells()[celli]
402  )
403  )
404  {
405  shape = cellShape(model(), vertLabels());
406 
407  return true;
408  }
409 
410  return false;
411 }
412 
413 
414 // ************************************************************************* //
Foam::labelList
List< label > labelList
A List of labels.
Definition: List.H:74
Foam::wedgeMatcher::wedgeMatcher
wedgeMatcher()
Construct null.
Definition: wedgeMatcher.C:34
wedgeMatcher.H
Foam::meshTools::otherFace
label otherFace(const primitiveMesh &mesh, const label celli, const label facei, const label edgeI)
Return face on cell using edgeI but not facei. Throws error.
Definition: meshTools.C:555
Foam::Zero
static constexpr const zero Zero
Global zero.
Definition: zero.H:128
Foam::wedgeMatcher::matchShape
virtual bool matchShape(const bool checkOnly, const faceList &faces, const labelList &faceOwner, const label celli, const labelList &myFaces)
Low level shape recognition. Return true if matches.
Definition: wedgeMatcher.C:55
Foam::wedgeMatcher::faceSizeMatch
virtual bool faceSizeMatch(const faceList &, const labelList &) const
Check whether number of face sizes match the shape.
Definition: wedgeMatcher.C:324
Foam::primitiveMesh::cells
const cellList & cells() const
Definition: primitiveMeshCells.C:138
primitiveMesh.H
Foam::wedgeMatcher::isA
virtual bool isA(const primitiveMesh &mesh, const label celli)
Exact match. Uses faceSizeMatch.
Definition: wedgeMatcher.C:359
Foam::wedgeMatcher::faceHashValue
virtual label faceHashValue() const
Hash value of all face sizes of this shape. Can be used for.
Definition: wedgeMatcher.C:317
Foam::cellMatcher
Base class for cellshape matchers (hexMatch, prismMatch, etc.). These are classes which given a mesh ...
Definition: cellMatcher.H:101
forAll
#define forAll(list, i)
Loop across all elements in list.
Definition: stdFoam.H:290
Foam::label
intWM_LABEL_SIZE_t label
A label is an int32_t or int64_t as specified by the pre-processor macro WM_LABEL_SIZE.
Definition: label.H:62
Foam::polyMesh::faceOwner
virtual const labelList & faceOwner() const
Return face owner.
Definition: polyMesh.C:1076
mesh
dynamicFvMesh & mesh
Definition: createDynamicFvMesh.H:6
Foam::cellShape
An analytical geometric cellShape.
Definition: cellShape.H:71
Foam::wedgeMatcher::~wedgeMatcher
~wedgeMatcher()
Destructor.
Definition: wedgeMatcher.C:48
Foam::polyMesh::faces
virtual const faceList & faces() const
Return raw faces.
Definition: polyMesh.C:1063
Foam::List< face >
Foam::identity
labelList identity(const label len, label start=0)
Create identity map of the given length with (map[i] == i)
Definition: labelList.C:38
Foam::wedgeMatcher::matches
virtual bool matches(const primitiveMesh &mesh, const label celli, cellShape &shape)
Like isA but also constructs a cellShape (if shape matches)
Definition: wedgeMatcher.C:387
Foam::face
A face is a list of labels corresponding to mesh vertices.
Definition: face.H:74
ListOps.H
Various functions to operate on Lists.
Foam::primitiveMesh
Cell-face mesh analysis engine.
Definition: primitiveMesh.H:78