Initial commit for version 2.0.x patch release
[OpenFOAM-2.0.x.git] / src / OpenFOAM / meshes / meshShapes / cellMatcher / tetWedgeMatcher.C
blob57a4435363a6e839775d21eb96f6c3e491f516f6
1 /*---------------------------------------------------------------------------*\
2   =========                 |
3   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
4    \\    /   O peration     |
5     \\  /    A nd           | Copyright (C) 2004-2010 OpenCFD Ltd.
6      \\/     M anipulation  |
7 -------------------------------------------------------------------------------
8 License
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
13     the Free Software Foundation, either version 3 of the License, or
14     (at your 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
19     for more details.
21     You should have received a copy of the GNU General Public License
22     along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
24 \*---------------------------------------------------------------------------*/
26 #include "tetWedgeMatcher.H"
27 #include "cellMatcher.H"
28 #include "primitiveMesh.H"
29 #include "primitiveMesh.H"
30 #include "cellModeller.H"
31 #include "ListOps.H"
33 // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
35 const Foam::label Foam::tetWedgeMatcher::vertPerCell = 5;
36 const Foam::label Foam::tetWedgeMatcher::facePerCell = 4;
37 const Foam::label Foam::tetWedgeMatcher::maxVertPerFace = 4;
40 // * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
42 Foam::tetWedgeMatcher::tetWedgeMatcher()
44     cellMatcher
45     (
46         vertPerCell,
47         facePerCell,
48         maxVertPerFace,
49        "tetWedge"
50     )
54 // * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
56 Foam::tetWedgeMatcher::~tetWedgeMatcher()
60 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
62 bool Foam::tetWedgeMatcher::matchShape
64     const bool checkOnly,
65     const faceList& faces,
66     const labelList& owner,
67     const label cellI,
68     const labelList& myFaces
71     if (!faceSizeMatch(faces, myFaces))
72     {
73         return false;
74     }
76     // Is tetWedge for sure now. No other shape has two tri, two quad
77     if (checkOnly)
78     {
79         return true;
80     }
82     // Calculate localFaces_ and mapping pointMap_, faceMap_
83     label numVert = calcLocalFaces(faces, myFaces);
85     if (numVert != vertPerCell)
86     {
87         return false;
88     }
90     // Set up 'edge' to face mapping.
91     calcEdgeAddressing(numVert);
93     // Set up point on face to index-in-face mapping
94     calcPointFaceIndex();
96     // Storage for maps -vertex to mesh and -face to mesh
97     vertLabels_.setSize(vertPerCell);
98     faceLabels_.setSize(facePerCell);
100     //
101     // Try first triangular face. Rotate in all directions.
102     // Walk path to other triangular face.
103     //
105     label face0I = -1;
106     forAll(faceSize_, faceI)
107     {
108         if (faceSize_[faceI] == 3)
109         {
110             face0I = faceI;
111             break;
112         }
113     }
115     const face& face0 = localFaces_[face0I];
117     // Try all rotations of this face
118     for (label face0vert0 = 0; face0vert0 < faceSize_[face0I]; face0vert0++)
119     {
120         //
121         // Try to follow prespecified path on faces of cell,
122         // starting at face0vert0
123         //
125         vertLabels_[0] = pointMap_[face0[face0vert0]];
126         faceLabels_[0] = faceMap_[face0I];
128         // Walk face 0 from vertex 0 to 1
129         label face0vert1 =
130             nextVert
131             (
132                 face0vert0,
133                 faceSize_[face0I],
134                 !(owner[faceMap_[face0I]] == cellI)
135             );
136         vertLabels_[1] = pointMap_[face0[face0vert1]];
138         // Jump edge from face0 to face1 (the other triangular face)
139         label face1I =
140             otherFace
141             (
142                 numVert,
143                 face0[face0vert0],
144                 face0[face0vert1],
145                 face0I
146             );
148         if (faceSize_[face1I] != 3)
149         {
150             continue;
151         }
152         faceLabels_[1] = faceMap_[face1I];
155         // Now correctly oriented tet-wedge for sure.
157         // Walk face 0 from vertex 1 to 2
158         label face0vert2 =
159             nextVert
160             (
161                 face0vert1,
162                 faceSize_[face0I],
163                 !(owner[faceMap_[face0I]] == cellI)
164             );
165         vertLabels_[2] = pointMap_[face0[face0vert2]];
167         // Jump edge from face0 to face3
168         label face3I =
169             otherFace
170             (
171                 numVert,
172                 face0[face0vert1],
173                 face0[face0vert2],
174                 face0I
175             );
176         faceLabels_[3] = faceMap_[face3I];
178         // Jump edge from face0 to face2
179         label face2I =
180             otherFace
181             (
182                 numVert,
183                 face0[face0vert2],
184                 face0[face0vert0],
185                 face0I
186             );
187         faceLabels_[2] = faceMap_[face2I];
189         // Get index of vertex 2 in face3
190         label face3vert2 = pointFaceIndex_[face0[face0vert2]][face3I];
192         // Walk face 3 from vertex 2 to 4
193         label face3vert4 =
194             nextVert
195             (
196                 face3vert2,
197                 faceSize_[face3I],
198                 (owner[faceMap_[face3I]] == cellI)
199             );
201         const face& face3 = localFaces_[face3I];
203         vertLabels_[4] = pointMap_[face3[face3vert4]];
205         // Walk face 3 from vertex 4 to 3
206         label face3vert3 =
207             nextVert
208             (
209                 face3vert4,
210                 faceSize_[face3I],
211                 (owner[faceMap_[face3I]] == cellI)
212             );
213         vertLabels_[3] = pointMap_[face3[face3vert3]];
215         return true;
216     }
218     // Tried all triangular faces, in all rotations but no match found
219     return false;
223 Foam::label Foam::tetWedgeMatcher::faceHashValue() const
225     return 2*3 + 2*4;
229 bool Foam::tetWedgeMatcher::faceSizeMatch
231     const faceList& faces,
232     const labelList& myFaces
233 ) const
235     if (myFaces.size() != 4)
236     {
237         return false;
238     }
240     label nTris = 0;
241     label nQuads = 0;
243     forAll(myFaces, myFaceI)
244     {
245         label size = faces[myFaces[myFaceI]].size();
247         if (size == 3)
248         {
249             nTris++;
250         }
251         else if (size == 4)
252         {
253             nQuads++;
254         }
255         else
256         {
257             return false;
258         }
259     }
260     if ((nTris == 2) && (nQuads == 2))
261     {
262         return true;
263     }
264     else
265     {
266         return false;
267     }
271 bool Foam::tetWedgeMatcher::isA(const primitiveMesh& mesh, const label cellI)
273     return matchShape
274     (
275         true,
276         mesh.faces(),
277         mesh.faceOwner(),
278         cellI,
279         mesh.cells()[cellI]
280     );
284 bool Foam::tetWedgeMatcher::isA(const faceList& faces)
286     // Do as if mesh with one cell only
287     return matchShape
288     (
289         true,
290         faces,                      // all faces in mesh
291         labelList(faces.size(), 0), // cell 0 is owner of all faces
292         0,                          // cell label
293         identity(faces.size())      // faces of cell 0
294     );
298 bool Foam::tetWedgeMatcher::matches
300     const primitiveMesh& mesh,
301     const label cellI,
302     cellShape& shape
305     if
306     (
307         matchShape
308         (
309             false,
310             mesh.faces(),
311             mesh.faceOwner(),
312             cellI,
313             mesh.cells()[cellI]
314         )
315     )
316     {
317         shape = cellShape(model(), vertLabels());
319         return true;
320     }
321     else
322     {
323         return false;
324     }
328 // ************************************************************************* //