1 /*---------------------------------------------------------------------------*\
3 \\ / F ield | foam-extend: Open Source CFD
4 \\ / O peration | Version: 3.2
5 \\ / A nd | Web: http://www.foam-extend.org
6 \\/ M anipulation | For copyright notice see file Copyright
7 -------------------------------------------------------------------------------
9 This file is part of foam-extend.
11 foam-extend 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 3 of the License, or (at your
14 option) any later version.
16 foam-extend is distributed in the hope that it will be useful, but
17 WITHOUT ANY WARRANTY; without even the implied warranty of
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 General Public License for more details.
21 You should have received a copy of the GNU General Public License
22 along with foam-extend. 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 // ************************************************************************* //