ENH: Ability to read in surface-independent features.

Sensible featureEdgeMesh constructor.  Rearrangement of functions.
This commit is contained in:
graham
2010-12-20 11:27:22 +00:00
parent 5286e15524
commit dfa58157b2
4 changed files with 211 additions and 153 deletions

View File

@ -301,17 +301,26 @@ int main(int argc, char *argv[])
Pout<< nl << "Writing featureEdgeMesh to constant/featureEdgeMesh."
<< endl;
fileName sFeatFileName = surfFileName.lessExt().name();
featureEdgeMesh feMesh
(
newSet,
IOobject
(
sFeatFileName + ".featureEdgeMesh",
runTime.constant(),
"featureEdgeMesh",
runTime,
surfFileName.lessExt().name() + ".featureEdgeMesh"
IOobject::NO_READ,
IOobject::NO_WRITE
),
newSet
);
feMesh.writeObj(surfFileName.lessExt().name());
feMesh.write();
feMesh.writeObj(sFeatFileName);
Info<< "End\n" << endl;
return 0;

View File

@ -54,6 +54,97 @@ Foam::label Foam::featureEdgeMesh::nPointTypes = 4;
Foam::label Foam::featureEdgeMesh::nEdgeTypes = 5;
// * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * * //
Foam::featureEdgeMesh::pointStatus Foam::featureEdgeMesh::classifyFeaturePoint
(
label ptI
) const
{
labelList ptEds(pointEdges()[ptI]);
label nPtEds = ptEds.size();
label nExternal = 0;
label nInternal = 0;
if (nPtEds == 0)
{
// There are no edges attached to the point, this is a problem
return NONFEATURE;
}
forAll(ptEds, i)
{
edgeStatus edStat = getEdgeStatus(ptEds[i]);
if (edStat == EXTERNAL)
{
nExternal++;
}
else if (edStat == INTERNAL)
{
nInternal++;
}
}
if (nExternal == nPtEds)
{
return CONVEX;
}
else if (nInternal == nPtEds)
{
return CONCAVE;
}
else
{
return MIXED;
}
}
Foam::featureEdgeMesh::edgeStatus Foam::featureEdgeMesh::classifyEdge
(
const List<vector>& norms,
const labelList& edNorms,
const vector& fC0tofC1
) const
{
label nEdNorms = edNorms.size();
if (nEdNorms == 1)
{
return OPEN;
}
else if (nEdNorms == 2)
{
const vector n0(norms[edNorms[0]]);
const vector n1(norms[edNorms[1]]);
if ((n0 & n1) > cosNormalAngleTol_)
{
return FLAT;
}
else if ((fC0tofC1 & n0) > 0.0)
{
return INTERNAL;
}
else
{
return EXTERNAL;
}
}
else if (nEdNorms > 2)
{
return MULTIPLE;
}
else
{
// There is a problem - the edge has no normals
return NONE;
}
}
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
Foam::featureEdgeMesh::featureEdgeMesh(const IOobject& io)
@ -189,23 +280,11 @@ Foam::featureEdgeMesh::featureEdgeMesh
Foam::featureEdgeMesh::featureEdgeMesh
(
const surfaceFeatures& sFeat,
const objectRegistry& obr,
const fileName& sFeatFileName
const IOobject& io,
const surfaceFeatures& sFeat
)
:
regIOobject
(
IOobject
(
sFeatFileName,
obr.time().constant(),
"featureEdgeMesh",
obr,
IOobject::NO_READ,
IOobject::NO_WRITE
)
),
regIOobject(io),
edgeMesh(pointField(0), edgeList(0)),
concaveStart_(-1),
mixedStart_(-1),
@ -367,9 +446,8 @@ Foam::featureEdgeMesh::featureEdgeMesh
(
"Foam::featureEdgeMesh::featureEdgeMesh"
"("
" const surfaceFeatures& sFeat,"
" const objectRegistry& obr,"
" const fileName& sFeatFileName"
"const IOobject& io, "
"const surfaceFeatures& sFeat"
")"
)
<< nl << "classifyEdge returned NONE on edge "
@ -444,9 +522,8 @@ Foam::featureEdgeMesh::featureEdgeMesh
(
"Foam::featureEdgeMesh::featureEdgeMesh"
"("
" const surfaceFeatures& sFeat,"
" const objectRegistry& obr,"
" const fileName& sFeatFileName"
"const IOobject& io, "
"const surfaceFeatures& sFeat"
")"
)
<< nl << "classifyFeaturePoint returned NONFEATURE on point at "
@ -586,97 +663,6 @@ Foam::featureEdgeMesh::~featureEdgeMesh()
{}
// * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * * //
Foam::featureEdgeMesh::pointStatus Foam::featureEdgeMesh::classifyFeaturePoint
(
label ptI
) const
{
labelList ptEds(pointEdges()[ptI]);
label nPtEds = ptEds.size();
label nExternal = 0;
label nInternal = 0;
if (nPtEds == 0)
{
// There are no edges attached to the point, this is a problem
return NONFEATURE;
}
forAll(ptEds, i)
{
edgeStatus edStat = getEdgeStatus(ptEds[i]);
if (edStat == EXTERNAL)
{
nExternal++;
}
else if (edStat == INTERNAL)
{
nInternal++;
}
}
if (nExternal == nPtEds)
{
return CONVEX;
}
else if (nInternal == nPtEds)
{
return CONCAVE;
}
else
{
return MIXED;
}
}
Foam::featureEdgeMesh::edgeStatus Foam::featureEdgeMesh::classifyEdge
(
const List<vector>& norms,
const labelList& edNorms,
const vector& fC0tofC1
) const
{
label nEdNorms = edNorms.size();
if (nEdNorms == 1)
{
return OPEN;
}
else if (nEdNorms == 2)
{
const vector n0(norms[edNorms[0]]);
const vector n1(norms[edNorms[1]]);
if ((n0 & n1) > cosNormalAngleTol_)
{
return FLAT;
}
else if ((fC0tofC1 & n0) > 0.0)
{
return INTERNAL;
}
else
{
return EXTERNAL;
}
}
else if (nEdNorms > 2)
{
return MULTIPLE;
}
else
{
// There is a problem - the edge has no normals
return NONE;
}
}
// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * //
void Foam::featureEdgeMesh::nearestFeatureEdge

View File

@ -28,7 +28,7 @@ Description
Feature points are a sorted subset at the start of the overall points list:
0 .. concaveStart_-1 : convex points (w.r.t normals)
concaveStart_-1 .. mixedStart_-1 : concave points
concaveStart_ .. mixedStart_-1 : concave points
mixedStart_ .. nonFeatureStart_ : mixed internal/external points
nonFeatureStart_ .. size-1 : non-feature points
@ -55,11 +55,9 @@ SourceFiles
#include "edgeMesh.H"
#include "surfaceFeatures.H"
#include "objectRegistry.H"
#include "IOdictionary.H"
#include "indexedOctree.H"
#include "treeDataEdge.H"
#include "pointIndexHit.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
@ -202,14 +200,12 @@ public:
const Xfer<edgeList>&
);
//- Construct (read) given surfaceFeatures, an objectRegistry and a
// fileName to write to. Extracts, classifies and reorders the data
// from surfaceFeatures.
//- Construct given surfaceFeatures, extracts, classifies and reorders
// the data.
featureEdgeMesh
(
const surfaceFeatures& sFeat,
const objectRegistry& obr,
const fileName& sFeatFileName
const IOobject& io,
const surfaceFeatures& sFeat
);
//- Construct from all components

View File

@ -54,17 +54,25 @@ Foam::conformationSurfaces::conformationSurfaces
surfaceConformationDict.subDict("geometryToConformTo")
);
const dictionary& additionalFeaturesDict
(
surfaceConformationDict.subDict("additionalFeatures")
);
Info<< nl << "Reading geometryToConformTo" << endl;
surfaces_.setSize(surfacesDict.size());
surfaces_.setSize(surfacesDict.size(), -1);
allGeometryToSurfaces_.setSize(allGeometry_.size(), -1);
baffleSurfaces_.setSize(surfacesDict.size());
baffleSurfaces_.setSize(surfacesDict.size(), false);
features_.setSize(surfacesDict.size());
// Features may be attached to host surfaces or independent
features_.setSize(surfacesDict.size() + additionalFeaturesDict.size());
patchOffsets_.setSize(surfacesDict.size());
label featureI = 0;
patchOffsets_.setSize(surfacesDict.size(), -1);
label surfI = 0;
@ -84,6 +92,8 @@ Foam::conformationSurfaces::conformationSurfaces
<< exit(FatalError);
}
Info<< nl << " " << iter().keyword() << endl;
patchOffsets_[surfI] = patchNames_.size();
patchNames_.append(allGeometry.regionNames()[surfaces_[surfI]]);
@ -105,9 +115,11 @@ Foam::conformationSurfaces::conformationSurfaces
{
fileName feMeshName(surfaceSubDict.lookup("featureEdgeMesh"));
Info<< " features: " << feMeshName<< endl;
features_.set
(
surfI,
featureI++,
new featureEdgeMesh
(
IOobject
@ -115,7 +127,8 @@ Foam::conformationSurfaces::conformationSurfaces
feMeshName,
cvMesh_.time().findInstance
(
"featureEdgeMesh", feMeshName
"featureEdgeMesh",
feMeshName
),
"featureEdgeMesh",
cvMesh_.time(),
@ -135,25 +148,25 @@ Foam::conformationSurfaces::conformationSurfaces
}
else if (featureMethod == "none")
{
fileName feMeshName(surfaceName + "_noFeatures");
// fileName feMeshName(surfaceName + "_noFeatures");
features_.set
(
surfI,
new featureEdgeMesh
(
IOobject
(
feMeshName,
cvMesh_.time().constant(),
"featureEdgeMesh",
cvMesh_.time(),
IOobject::NO_READ,
IOobject::NO_WRITE,
false
)
)
);
// features_.set
// (
// featureI++,
// new featureEdgeMesh
// (
// IOobject
// (
// feMeshName,
// cvMesh_.time().constant(),
// "featureEdgeMesh",
// cvMesh_.time(),
// IOobject::NO_READ,
// IOobject::NO_WRITE,
// false
// )
// )
// );
}
else
{
@ -166,6 +179,60 @@ Foam::conformationSurfaces::conformationSurfaces
surfI++;
}
if (!additionalFeaturesDict.empty())
{
Info<< nl << "Reading additionalFeatures" << endl;
}
forAllConstIter(dictionary, additionalFeaturesDict, iter)
{
word featureName = iter().keyword();
Info<< nl << " " << iter().keyword() << endl;
const dictionary& featureSubDict
(
additionalFeaturesDict.subDict(featureName)
);
word featureMethod = featureSubDict.lookupOrDefault
(
"featureMethod",
word("none")
);
if (featureMethod == "featureEdgeMesh")
{
fileName feMeshName(featureSubDict.lookup("featureEdgeMesh"));
Info<< " features: " << feMeshName << endl;
features_.set
(
featureI++,
new featureEdgeMesh
(
IOobject
(
feMeshName,
cvMesh_.time().findInstance
(
"featureEdgeMesh",
feMeshName
),
"featureEdgeMesh",
cvMesh_.time(),
IOobject::MUST_READ,
IOobject::NO_WRITE
)
)
);
}
}
// Remove unnecessary space from the features list
features_.setSize(featureI);
bounds_ = searchableSurfacesQueries::bounds(allGeometry_, surfaces_);
spanMag_ = bounds_.mag();