1 /*---------------------------------------------------------------------------*\
3 \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
5 \\ / A nd | Copyright held by original author
7 -------------------------------------------------------------------------------
9 This file is part of OpenFOAM.
11 OpenFOAM is free software; you can redistribute it and/or modify it
12 under the terms of the GNU General Public License as published by the
13 Free Software Foundation; either version 2 of the License, or (at your
14 option) any later version.
16 OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
17 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
18 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
21 You should have received a copy of the GNU General Public License
22 along with OpenFOAM; if not, write to the Free Software Foundation,
23 Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
25 \*---------------------------------------------------------------------------*/
27 #include "wedgeMatcher.H"
28 #include "primitiveMesh.H"
31 // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
33 const Foam::label Foam::wedgeMatcher::vertPerCell = 7;
34 const Foam::label Foam::wedgeMatcher::facePerCell = 6;
35 const Foam::label Foam::wedgeMatcher::maxVertPerFace = 4;
38 // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
41 Foam::wedgeMatcher::wedgeMatcher()
53 // * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
55 Foam::wedgeMatcher::~wedgeMatcher()
59 // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
61 bool Foam::wedgeMatcher::matchShape
64 const faceList& faces,
65 const labelList& owner,
67 const labelList& myFaces
70 if (!faceSizeMatch(faces, myFaces))
75 // Calculate localFaces_ and mapping pointMap_, faceMap_
76 label numVert = calcLocalFaces(faces, myFaces);
78 if (numVert != vertPerCell)
83 // Set up 'edge' to face mapping.
84 calcEdgeAddressing(numVert);
86 // Set up point on face to index-in-face mapping
89 // Storage for maps -vertex to mesh and -face to mesh
90 vertLabels_.setSize(vertPerCell);
91 faceLabels_.setSize(facePerCell);
94 // Try first triangular face. Rotate in all directions.
95 // Walk path to other triangular face.
99 forAll(faceSize_, faceI)
101 if (faceSize_[faceI] == 3)
108 const face& face0 = localFaces_[face0I];
110 // Try all rotations of this face
111 for(label face0vert0 = 0; face0vert0 < faceSize_[face0I]; face0vert0++)
114 // Try to follow prespecified path on faces of cell,
115 // starting at face0vert0
118 vertLabels_[0] = pointMap_[face0[face0vert0]];
119 faceLabels_[0] = faceMap_[face0I];
120 //Info<< endl << "Wedge vertex 0: vertex " << face0[face0vert0]
121 // << " at position " << face0vert0 << " in face " << face0
124 // Walk face 0 from vertex 0 to 1
130 !(owner[faceMap_[face0I]] == cellI)
132 vertLabels_[1] = pointMap_[face0[face0vert1]];
133 //Info<< "Wedge vertex 1: vertex " << face0[face0vert1]
134 // << " at position " << face0vert1 << " in face " << face0
137 // Jump edge from face0 to face4
146 const face& face4 = localFaces_[face4I];
147 //Info<< "Stepped to wedge face 4 " << face4
148 // << " across edge " << face0[face0vert0] << " "
149 // << face0[face0vert1]
152 if (faceSize_[face4I] != 4)
154 //Info<< "Cannot be Wedge Face 4 since size="
155 // << faceSize_[face4I] << endl;
159 // Is wedge for sure now
165 faceLabels_[4] = faceMap_[face4I];
167 // Get index of vertex 0 in face4
168 label face4vert0 = pointFaceIndex_[face0[face0vert0]][face4I];
170 //Info<< "Wedge vertex 0 also: vertex " << face4[face4vert0]
171 // << " at position " << face4vert0 << " in face " << face4
174 // Walk face 4 from vertex 4 to 3
180 !(owner[faceMap_[face4I]] == cellI)
182 vertLabels_[3] = pointMap_[face4[face4vert3]];
183 //Info<< "Wedge vertex 3: vertex " << face4[face4vert3]
184 // << " at position " << face4vert3 << " in face " << face4
188 // Jump edge from face4 to face2
197 const face& face2 = localFaces_[face2I];
198 //Info<< "Stepped to wedge face 2 " << face2
199 // << " across edge " << face4[face4vert0] << " "
200 // << face4[face4vert3]
203 if (faceSize_[face2I] != 3)
205 //Info<< "Cannot be Wedge Face 2 since size="
206 // << faceSize_[face2I] << endl;
209 faceLabels_[2] = faceMap_[face2I];
211 // Is wedge for sure now
212 //Info<< "** WEDGE **" << endl;
216 // Walk to other faces and vertices and assign mapping.
220 label face2vert3 = pointFaceIndex_[face4[face4vert3]][face2I];
222 // Walk face 2 from vertex 3 to 6
228 (owner[faceMap_[face2I]] == cellI)
230 vertLabels_[6] = pointMap_[face2[face2vert6]];
232 // Jump edge from face2 to face1
241 faceLabels_[1] = faceMap_[face1I];
242 const face& face1 = localFaces_[face1I];
243 //Info<< "Stepped to wedge face 1 " << face1
244 // << " across edge " << face2[face2vert3] << " "
245 // << face2[face2vert6]
248 label face1vert6 = pointFaceIndex_[face2[face2vert6]][face1I];
250 // Walk face 1 from vertex 6 to 5
256 !(owner[faceMap_[face1I]] == cellI)
258 vertLabels_[5] = pointMap_[face1[face1vert5]];
260 // Walk face 1 from vertex 5 to 4
266 !(owner[faceMap_[face1I]] == cellI)
268 vertLabels_[4] = pointMap_[face1[face1vert4]];
270 // Walk face 0 from vertex 1 to 2
276 !(owner[faceMap_[face0I]] == cellI)
278 vertLabels_[2] = pointMap_[face0[face0vert2]];
279 //Info<< "Wedge vertex 2: vertex " << face0[face0vert2]
280 // << " at position " << face0vert2 << " in face " << face0
283 // Jump edge from face0 to face3
292 faceLabels_[3] = faceMap_[face3I];
293 //const face& face3 = localFaces_[face3I];
294 //Info<< "Stepped to wedge face 3 " << face3
295 // << " across edge " << face0[face0vert1] << " "
296 // << face0[face0vert2]
300 // Jump edge from face0 to face5
309 faceLabels_[5] = faceMap_[face5I];
310 //const face& face5 = localFaces_[face5I];
311 //Info<< "Stepped to wedge face 5 " << face5
312 // << " across edge " << face0[face0vert2] << " "
313 // << face0[face0vert0]
319 // Tried all triangular faces, in all rotations but no match found
324 Foam::label Foam::wedgeMatcher::faceHashValue() const
330 bool Foam::wedgeMatcher::faceSizeMatch
332 const faceList& faces,
333 const labelList& myFaces
336 if (myFaces.size() != 6)
344 forAll(myFaces, myFaceI)
346 label size = faces[myFaces[myFaceI]].size();
361 if ((nTris == 2) && (nQuads == 4))
372 bool Foam::wedgeMatcher::isA(const primitiveMesh& mesh, const label cellI)
385 bool Foam::wedgeMatcher::isA(const faceList& faces)
387 // Do as if mesh with one cell only
391 faces, // all faces in mesh
392 labelList(faces.size(), 0), // cell 0 is owner of all faces
394 makeIdentity(faces.size()) // faces of cell 0
399 bool Foam::wedgeMatcher::matches
401 const primitiveMesh& mesh,
418 shape = cellShape(model(), vertLabels());
429 // ************************************************************************* //