initial commit for version 1.6.x patch release
[OpenFOAM-1.6.x.git] / src / OpenFOAM / meshes / meshShapes / cellMatcher / tetWedgeMatcher.C
blob00aacad3ad32cca4bea904603d550b3aca771ddd
1 /*---------------------------------------------------------------------------*\
2   =========                 |
3   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
4    \\    /   O peration     |
5     \\  /    A nd           | Copyright (C) 1991-2009 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 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
19     for more details.
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 "tetWedgeMatcher.H"
28 #include "cellMatcher.H"
29 #include "primitiveMesh.H"
30 #include "primitiveMesh.H"
31 #include "cellModeller.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 // Construct null
43 Foam::tetWedgeMatcher::tetWedgeMatcher()
45     cellMatcher
46     (
47         vertPerCell,
48         facePerCell,
49         maxVertPerFace,
50        "tetWedge"
51     )
55 // * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
57 Foam::tetWedgeMatcher::~tetWedgeMatcher()
61 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
63 bool Foam::tetWedgeMatcher::matchShape
65     const bool checkOnly,
66     const faceList& faces,
67     const labelList& owner,
68     const label cellI,
69     const labelList& myFaces
72     if (!faceSizeMatch(faces, myFaces))
73     {
74         return false;
75     }
77     // Is tetWedge for sure now. No other shape has two tri, two quad
78     if (checkOnly)
79     {
80         return true;
81     }
83     // Calculate localFaces_ and mapping pointMap_, faceMap_
84     label numVert = calcLocalFaces(faces, myFaces);
86     if (numVert != vertPerCell)
87     {
88         return false;
89     }
91     // Set up 'edge' to face mapping.
92     calcEdgeAddressing(numVert);
94     // Set up point on face to index-in-face mapping
95     calcPointFaceIndex();
97     // Storage for maps -vertex to mesh and -face to mesh
98     vertLabels_.setSize(vertPerCell);
99     faceLabels_.setSize(facePerCell);
101     //
102     // Try first triangular face. Rotate in all directions.
103     // Walk path to other triangular face.
104     //
106     label face0I = -1;
107     forAll(faceSize_, faceI)
108     {
109         if (faceSize_[faceI] == 3)
110         {
111             face0I = faceI;
112             break;
113         }
114     }
116     const face& face0 = localFaces_[face0I];
118     // Try all rotations of this face
119     for(label face0vert0 = 0; face0vert0 < faceSize_[face0I]; face0vert0++)
120     {
121         //
122         // Try to follow prespecified path on faces of cell,
123         // starting at face0vert0
124         //
126         vertLabels_[0] = pointMap_[face0[face0vert0]];
127         faceLabels_[0] = faceMap_[face0I];
129         // Walk face 0 from vertex 0 to 1
130         label face0vert1 =
131             nextVert
132             (
133                 face0vert0,
134                 faceSize_[face0I],
135                 !(owner[faceMap_[face0I]] == cellI)
136             );
137         vertLabels_[1] = pointMap_[face0[face0vert1]];
139         // Jump edge from face0 to face1 (the other triangular face)
140         label face1I =
141             otherFace
142             (
143                 numVert,
144                 face0[face0vert0],
145                 face0[face0vert1],
146                 face0I
147             );
149         if (faceSize_[face1I] != 3)
150         {
151             continue;
152         }
153         faceLabels_[1] = faceMap_[face1I];
156         // Now correctly oriented tet-wedge for sure.
158         // Walk face 0 from vertex 1 to 2
159         label face0vert2 =
160             nextVert
161             (
162                 face0vert1,
163                 faceSize_[face0I],
164                 !(owner[faceMap_[face0I]] == cellI)
165             );
166         vertLabels_[2] = pointMap_[face0[face0vert2]];
168         // Jump edge from face0 to face3
169         label face3I =
170             otherFace
171             (
172                 numVert,
173                 face0[face0vert1],
174                 face0[face0vert2],
175                 face0I
176             );
177         faceLabels_[3] = faceMap_[face3I];
179         // Jump edge from face0 to face2
180         label face2I =
181             otherFace
182             (
183                 numVert,
184                 face0[face0vert2],
185                 face0[face0vert0],
186                 face0I
187             );
188         faceLabels_[2] = faceMap_[face2I];
190         // Get index of vertex 2 in face3
191         label face3vert2 = pointFaceIndex_[face0[face0vert2]][face3I];
193         // Walk face 3 from vertex 2 to 4
194         label face3vert4 =
195             nextVert
196             (
197                 face3vert2,
198                 faceSize_[face3I],
199                 (owner[faceMap_[face3I]] == cellI)
200             );
202         const face& face3 = localFaces_[face3I];
204         vertLabels_[4] = pointMap_[face3[face3vert4]];
206         // Walk face 3 from vertex 4 to 3
207         label face3vert3 =
208             nextVert
209             (
210                 face3vert4,
211                 faceSize_[face3I],
212                 (owner[faceMap_[face3I]] == cellI)
213             );
214         vertLabels_[3] = pointMap_[face3[face3vert3]];
216         return true;
217     }
219     // Tried all triangular faces, in all rotations but no match found
220     return false;
224 Foam::label Foam::tetWedgeMatcher::faceHashValue() const
226     return 2*3 + 2*4;
230 bool Foam::tetWedgeMatcher::faceSizeMatch
232     const faceList& faces,
233     const labelList& myFaces
234 ) const
236     if (myFaces.size() != 4)
237     {
238         return false;
239     }
241     label nTris = 0;
242     label nQuads = 0;
243     
244     forAll(myFaces, myFaceI)
245     {
246         label size = faces[myFaces[myFaceI]].size();
248         if (size == 3)
249         {
250             nTris++;
251         }
252         else if (size == 4)
253         {
254             nQuads++;
255         }
256         else
257         {
258             return false;
259         }
260     }
261     if ((nTris == 2) && (nQuads == 2))
262     {
263         return true;
264     }
265     else
266     {
267         return false;
268     }
272 bool Foam::tetWedgeMatcher::isA(const primitiveMesh& mesh, const label cellI)
274     return matchShape
275     (
276         true,
277         mesh.faces(),
278         mesh.faceOwner(),
279         cellI,
280         mesh.cells()[cellI]
281     );
285 bool Foam::tetWedgeMatcher::isA(const faceList& faces)
287     // Do as if mesh with one cell only
288     return matchShape
289     (
290         true,
291         faces,                      // all faces in mesh
292         labelList(faces.size(), 0), // cell 0 is owner of all faces
293         0,                          // cell label
294         makeIdentity(faces.size())  // faces of cell 0
295     );
299 bool Foam::tetWedgeMatcher::matches
301     const primitiveMesh& mesh,
302     const label cellI,
303     cellShape& shape
306     if
307     (
308         matchShape
309         (
310             false,
311             mesh.faces(),
312             mesh.faceOwner(),
313             cellI,
314             mesh.cells()[cellI]
315         )
316     )
317     {
318         shape = cellShape(model(), vertLabels());
320         return true;
321     }
322     else
323     {
324         return false;
325     }
329 // ************************************************************************* //