1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148
|
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation
\\/ M anipulation |
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
OpenFOAM is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
Description
Create intermediate mesh files from PROSTAR files
\*---------------------------------------------------------------------------*/
#include "starMesh.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
void Foam::starMesh::fixCollapsedEdges()
{
cellFaces_.setSize(cellShapes_.size());
forAll(cellShapes_, celli)
{
cellFaces_[celli] = cellShapes_[celli].faces();
}
// go through the faces and find if there exist faces with duplicate
// vertices. If so, purge the duplicates and mark the mesh as a polyMesh
forAll(cellFaces_, celli)
{
faceList& curFaces = cellFaces_[celli];
forAll(curFaces, facei)
{
face& vertexLabels = curFaces[facei];
bool duplicatesFound = false;
forAll(vertexLabels, vI)
{
label curLabel = vertexLabels[vI];
label nFound = 0;
forAll(vertexLabels, searchI)
{
if (vertexLabels[searchI] == curLabel)
{
nFound++;
}
}
if (nFound > 1)
{
duplicatesFound = true;
break;
}
}
if (duplicatesFound)
{
// this mesh cannot be described as a shapeMesh
isShapeMesh_ = false;
// I am not allowed to reset the shape pointer to unknown
// here as the shape is still needed to determine which face
// of the shape is used in potential couple matches. This
// will be done in the end using the purgeShapes()
//
// create a new face without duplicates and replace original
face newFace(vertexLabels.size());
label nNewVertices = 0;
forAll(vertexLabels, vI)
{
// In order for a face to be a valid entity, duplicate
// vertices can only be consecutive (othervise, the
// collapse creates an invalid face). We shall use this
// property in the creation of the collapsed face
label curLabel = vertexLabels[vI];
bool found = false;
// search through all vertices from the new face. If the
// current label has not been added, add it to the end.
for (label searchI = 0; searchI < nNewVertices; searchI++)
{
if (newFace[searchI] == curLabel)
{
found = true;
break;
}
}
if (!found)
{
newFace[nNewVertices] = curLabel;
nNewVertices++;
}
}
newFace.setSize(nNewVertices);
// If the number of non-duplicate labels in the face is less
// than three, the face has been collapsed in an invalid
// manner. Error.
if (nNewVertices < 3)
{
FatalErrorInFunction
<< "Face " << facei << " of cell " << celli
<< " is colapsed down to a point or edge, which is "
<< "not permitted" << endl
<< "original face: " << vertexLabels << endl
<< "purged face: " << newFace << endl
<< abort(FatalError);
}
else
{
vertexLabels = newFace;
}
}
}
}
}
// ************************************************************************* //
|