1 /*---------------------------------------------------------------------------*\
3 \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
5 \\ / A nd | Copyright (C) 2004-2010 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
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/>.
25 Create intermediate mesh files from SAMM files
27 \*---------------------------------------------------------------------------*/
31 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
33 void sammMesh::fixCollapsedEdges()
35 cellFaces_.setSize(cellShapes_.size());
37 forAll(cellShapes_, cellI)
39 cellFaces_[cellI] = cellShapes_[cellI].faces();
42 // go through the faces and find if there exist faces with duplicate
43 // vertices. If so, purge the duplicates and mark the mesh as a polyMesh
45 forAll(cellFaces_, cellI)
47 faceList& curFaces = cellFaces_[cellI];
49 forAll(curFaces, faceI)
51 face& vertexLabels = curFaces[faceI];
53 bool duplicatesFound = false;
55 forAll(vertexLabels, vI)
57 label curLabel = vertexLabels[vI];
61 forAll(vertexLabels, searchI)
63 if (vertexLabels[searchI] == curLabel)
71 duplicatesFound = true;
79 // this mesh cannot be described as a shapeMesh
82 // I am not allowed to reset the shape pointer to unknown
83 // here as the shape is still needed to determine which face
84 // of the shape is used in potential couple matches. This
85 // will be done in the end using the purgeShapes()
88 // create a new face without duplicates and replace original
89 face newFace(vertexLabels.size());
91 label nNewVertices = 0;
93 forAll(vertexLabels, vI)
95 // In order for a face to be a valid entity, duplicate
96 // vertices can only be consecutive (othervise, the
97 // collapse creates an invalid face). We shall use this
98 // property in the creation of the collapsed face
100 label curLabel = vertexLabels[vI];
104 // search through all vertices from the new face. If the
105 // current label has not been added, add it to the end.
106 for (label searchI = 0; searchI < nNewVertices; searchI++)
108 if (newFace[searchI] == curLabel)
118 newFace[nNewVertices] = curLabel;
123 newFace.setSize(nNewVertices);
125 // If the number of non-duplicate labels in the face is less
126 // than three, the face has been collapsed in an invalid
129 if (nNewVertices < 3)
131 FatalErrorIn("void sammMesh::fixCollapsedEdges()")
132 << "face " << faceI << " of cell " << cellI
133 << " is colapsed down to a point or edge, which is "
134 << "not permitted" << endl
135 << "original face: " << vertexLabels << endl
136 << "purged face: " << newFace << endl
137 << abort(FatalError);
141 vertexLabels = newFace;
149 // ************************************************************************* //