1 /*---------------------------------------------------------------------------*\
3 \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
5 \\ / A nd | Copyright (C) 2011 OpenFOAM Foundation
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
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
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 "prismMatcher.H"
27 #include "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 Foam::prismMatcher::prismMatcher()
50 // * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
52 Foam::prismMatcher::~prismMatcher()
55 // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
57 bool Foam::prismMatcher::matchShape
60 const faceList& faces,
61 const labelList& owner,
63 const labelList& myFaces
66 if (!faceSizeMatch(faces, myFaces))
71 // Calculate localFaces_ and mapping pointMap_, faceMap_
72 label numVert = calcLocalFaces(faces, myFaces);
74 if (numVert != vertPerCell)
79 // Set up 'edge' to face mapping.
80 calcEdgeAddressing(numVert);
82 // Set up point on face to index-in-face mapping
85 // Storage for maps -vertex to mesh and -face to mesh
86 vertLabels_.setSize(vertPerCell);
87 faceLabels_.setSize(facePerCell);
90 // Try first triangular face.
91 // Only need to try one orientation of this face since prism is
96 forAll(faceSize_, faceI)
98 if (faceSize_[faceI] == 3)
105 const face& face0 = localFaces_[face0I];
106 label face0vert0 = 0;
109 // Try to follow prespecified path on faces of cell,
110 // starting at face0vert0
113 vertLabels_[0] = pointMap_[face0[face0vert0]];
114 faceLabels_[0] = faceMap_[face0I];
115 //Info<< endl << "Prism vertex 0: vertex " << face0[face0vert0]
116 // << " at position " << face0vert0 << " in face " << face0
119 // Walk face 0 from vertex 0 to 1
125 !(owner[faceMap_[face0I]] == cellI)
127 vertLabels_[1] = pointMap_[face0[face0vert1]];
128 //Info<< "Prism vertex 1: vertex " << face0[face0vert1]
129 // << " at position " << face0vert1 << " in face " << face0
132 // Jump edge from face0 to face4
141 const face& face4 = localFaces_[face4I];
142 //Info<< "Stepped to prism face 4 " << face4
143 // << " across edge " << face0[face0vert0] << " "
144 // << face0[face0vert1]
147 if (faceSize_[face4I] != 4)
149 //Info<< "Cannot be Prism Face 4 since size="
150 // << faceSize_[face4I] << endl;
153 faceLabels_[4] = faceMap_[face4I];
155 label face4vert1 = pointFaceIndex_[face0[face0vert1]][face4I];
157 //Info<< "Prism vertex 1 also: vertex " << face4[face4vert1]
158 // << " at position " << face4vert1 << " in face " << face4
161 // Walk face 4 from vertex 1 to 4
167 (owner[faceMap_[face4I]] == cellI)
169 vertLabels_[4] = pointMap_[face4[face4vert4]];
170 //Info<< "Prism vertex 4: vertex " << face4[face4vert4]
171 // << " at position " << face4vert4 << " in face " << face4
174 // Walk face 4 from vertex 1 to 3
180 (owner[faceMap_[face4I]] == cellI)
182 vertLabels_[3] = pointMap_[face4[face4vert3]];
183 //Info<< "Prism vertex 3: vertex " << face4[face4vert3]
184 // << " at position " << face4vert3 << " in face " << face4
187 // Jump edge from face4 to face1
196 //const face& face1 = localFaces_[face1I];
197 //Info<< "Stepped to prism face 1 " << face1
198 // << " across edge " << face4[face4vert3] << " "
199 // << face4[face4vert4]
202 if (faceSize_[face1I] != 3)
204 //Info<< "Cannot be Prism Face 1 since size="
205 // << faceSize_[face1I] << endl;
209 // Is prism for sure now
215 faceLabels_[1] = faceMap_[face1I];
219 // Walk to other faces and assign mapping.
223 // Walk face 0 from vertex 1 to 2
229 !(owner[faceMap_[face0I]] == cellI)
231 vertLabels_[2] = pointMap_[face0[face0vert2]];
232 //Info<< "Prism vertex 2: vertex " << face0[face0vert2]
233 // << " at position " << face0vert2 << " in face " << face0
236 // Jump edge from face0 to face3
245 faceLabels_[3] = faceMap_[face3I];
246 const face& face3 = localFaces_[face3I];
247 //Info<< "Stepped to prism face 3 " << face3
248 // << " across edge " << face0[face0vert1] << " "
249 // << face0[face0vert2]
252 label face3vert2 = pointFaceIndex_[face0[face0vert2]][face3I];
254 //Info<< "Prism vertex 2 also: vertex " << face3[face3vert2]
255 // << " at position " << face3vert2 << " in face " << face3
263 (owner[faceMap_[face3I]] == cellI)
265 vertLabels_[5] = pointMap_[face3[face3vert5]];
266 //Info<< "Prism vertex 5: vertex " << face3[face3vert5]
267 // << " at position " << face3vert5 << " in face " << face3
270 // Jump edge from face0 to face2
279 faceLabels_[2] = faceMap_[face2I];
280 //const face& face2 = localFaces_[face2I];
281 //Info<< "Stepped to prism face 2 " << face2
282 // << " across edge " << face0[face0vert2] << " "
283 // << face0[face0vert0]
286 //label face2vert2 = pointFaceIndex_[face0[face0vert2]][face2I];
287 //Info<< "Prism vertex 2 also: vertex " << face2[face2vert2]
288 // << " at position " << face2vert2 << " in face " << face2
295 Foam::label Foam::prismMatcher::faceHashValue() const
301 bool Foam::prismMatcher::faceSizeMatch
303 const faceList& faces,
304 const labelList& myFaces
307 if (myFaces.size() != 5)
315 forAll(myFaces, myFaceI)
317 label size = faces[myFaces[myFaceI]].size();
332 if ((nTris == 2) && (nQuads == 3))
343 bool Foam::prismMatcher::isA(const primitiveMesh& mesh, const label cellI)
356 bool Foam::prismMatcher::isA(const faceList& faces)
358 // Do as if mesh with one cell only
362 faces, // all faces in mesh
363 labelList(faces.size(), 0), // cell 0 is owner of all faces
365 identity(faces.size()) // faces of cell 0
370 bool Foam::prismMatcher::matches
372 const primitiveMesh& mesh,
389 shape = cellShape(model(), vertLabels());
400 // ************************************************************************* //