1 /*---------------------------------------------------------------------------*\
3 \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
5 \\ / A nd | Copyright (C) 1991-2009 OpenCFD Ltd.
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 "prismMatcher.H"
28 #include <OpenFOAM/primitiveMesh.H>
30 // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
32 const Foam::label Foam::prismMatcher::vertPerCell = 6;
33 const Foam::label Foam::prismMatcher::facePerCell = 5;
34 const Foam::label Foam::prismMatcher::maxVertPerFace = 4;
37 // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
39 // Construct from components
40 Foam::prismMatcher::prismMatcher()
51 // * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
53 Foam::prismMatcher::~prismMatcher()
56 // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
58 bool Foam::prismMatcher::matchShape
61 const faceList& faces,
62 const labelList& owner,
64 const labelList& myFaces
67 if (!faceSizeMatch(faces, myFaces))
72 // Calculate localFaces_ and mapping pointMap_, faceMap_
73 label numVert = calcLocalFaces(faces, myFaces);
75 if (numVert != vertPerCell)
80 // Set up 'edge' to face mapping.
81 calcEdgeAddressing(numVert);
83 // Set up point on face to index-in-face mapping
86 // Storage for maps -vertex to mesh and -face to mesh
87 vertLabels_.setSize(vertPerCell);
88 faceLabels_.setSize(facePerCell);
91 // Try first triangular face.
92 // Only need to try one orientation of this face since prism is
97 forAll(faceSize_, faceI)
99 if (faceSize_[faceI] == 3)
106 const face& face0 = localFaces_[face0I];
107 label face0vert0 = 0;
110 // Try to follow prespecified path on faces of cell,
111 // starting at face0vert0
114 vertLabels_[0] = pointMap_[face0[face0vert0]];
115 faceLabels_[0] = faceMap_[face0I];
116 //Info<< endl << "Prism vertex 0: vertex " << face0[face0vert0]
117 // << " at position " << face0vert0 << " in face " << face0
120 // Walk face 0 from vertex 0 to 1
126 !(owner[faceMap_[face0I]] == cellI)
128 vertLabels_[1] = pointMap_[face0[face0vert1]];
129 //Info<< "Prism vertex 1: vertex " << face0[face0vert1]
130 // << " at position " << face0vert1 << " in face " << face0
133 // Jump edge from face0 to face4
142 const face& face4 = localFaces_[face4I];
143 //Info<< "Stepped to prism face 4 " << face4
144 // << " across edge " << face0[face0vert0] << " "
145 // << face0[face0vert1]
148 if (faceSize_[face4I] != 4)
150 //Info<< "Cannot be Prism Face 4 since size="
151 // << faceSize_[face4I] << endl;
154 faceLabels_[4] = faceMap_[face4I];
156 label face4vert1 = pointFaceIndex_[face0[face0vert1]][face4I];
158 //Info<< "Prism vertex 1 also: vertex " << face4[face4vert1]
159 // << " at position " << face4vert1 << " in face " << face4
162 // Walk face 4 from vertex 1 to 4
168 (owner[faceMap_[face4I]] == cellI)
170 vertLabels_[4] = pointMap_[face4[face4vert4]];
171 //Info<< "Prism vertex 4: vertex " << face4[face4vert4]
172 // << " at position " << face4vert4 << " in face " << face4
175 // Walk face 4 from vertex 1 to 3
181 (owner[faceMap_[face4I]] == cellI)
183 vertLabels_[3] = pointMap_[face4[face4vert3]];
184 //Info<< "Prism vertex 3: vertex " << face4[face4vert3]
185 // << " at position " << face4vert3 << " in face " << face4
188 // Jump edge from face4 to face1
197 //const face& face1 = localFaces_[face1I];
198 //Info<< "Stepped to prism face 1 " << face1
199 // << " across edge " << face4[face4vert3] << " "
200 // << face4[face4vert4]
203 if (faceSize_[face1I] != 3)
205 //Info<< "Cannot be Prism Face 1 since size="
206 // << faceSize_[face1I] << endl;
210 // Is prism for sure now
216 faceLabels_[1] = faceMap_[face1I];
220 // Walk to other faces and assign mapping.
224 // Walk face 0 from vertex 1 to 2
230 !(owner[faceMap_[face0I]] == cellI)
232 vertLabels_[2] = pointMap_[face0[face0vert2]];
233 //Info<< "Prism vertex 2: vertex " << face0[face0vert2]
234 // << " at position " << face0vert2 << " in face " << face0
237 // Jump edge from face0 to face3
246 faceLabels_[3] = faceMap_[face3I];
247 const face& face3 = localFaces_[face3I];
248 //Info<< "Stepped to prism face 3 " << face3
249 // << " across edge " << face0[face0vert1] << " "
250 // << face0[face0vert2]
253 label face3vert2 = pointFaceIndex_[face0[face0vert2]][face3I];
255 //Info<< "Prism vertex 2 also: vertex " << face3[face3vert2]
256 // << " at position " << face3vert2 << " in face " << face3
264 (owner[faceMap_[face3I]] == cellI)
266 vertLabels_[5] = pointMap_[face3[face3vert5]];
267 //Info<< "Prism vertex 5: vertex " << face3[face3vert5]
268 // << " at position " << face3vert5 << " in face " << face3
271 // Jump edge from face0 to face2
280 faceLabels_[2] = faceMap_[face2I];
281 //const face& face2 = localFaces_[face2I];
282 //Info<< "Stepped to prism face 2 " << face2
283 // << " across edge " << face0[face0vert2] << " "
284 // << face0[face0vert0]
287 //label face2vert2 = pointFaceIndex_[face0[face0vert2]][face2I];
288 //Info<< "Prism vertex 2 also: vertex " << face2[face2vert2]
289 // << " at position " << face2vert2 << " in face " << face2
296 Foam::label Foam::prismMatcher::faceHashValue() const
302 bool Foam::prismMatcher::faceSizeMatch
304 const faceList& faces,
305 const labelList& myFaces
308 if (myFaces.size() != 5)
316 forAll(myFaces, myFaceI)
318 label size = faces[myFaces[myFaceI]].size();
333 if ((nTris == 2) && (nQuads == 3))
344 bool Foam::prismMatcher::isA(const primitiveMesh& mesh, const label cellI)
357 bool Foam::prismMatcher::isA(const faceList& faces)
359 // Do as if mesh with one cell only
363 faces, // all faces in mesh
364 labelList(faces.size(), 0), // cell 0 is owner of all faces
366 makeIdentity(faces.size()) // faces of cell 0
371 bool Foam::prismMatcher::matches
373 const primitiveMesh& mesh,
390 shape = cellShape(model(), vertLabels());
401 // ************************ vim: set sw=4 sts=4 et: ************************ //