mirror of
https://develop.openfoam.com/Development/openfoam.git
synced 2025-11-28 03:28:01 +00:00
ENH: Ability to read in surface-independent features.
Sensible featureEdgeMesh constructor. Rearrangement of functions.
This commit is contained in:
@ -301,17 +301,26 @@ int main(int argc, char *argv[])
|
|||||||
Pout<< nl << "Writing featureEdgeMesh to constant/featureEdgeMesh."
|
Pout<< nl << "Writing featureEdgeMesh to constant/featureEdgeMesh."
|
||||||
<< endl;
|
<< endl;
|
||||||
|
|
||||||
|
fileName sFeatFileName = surfFileName.lessExt().name();
|
||||||
|
|
||||||
featureEdgeMesh feMesh
|
featureEdgeMesh feMesh
|
||||||
(
|
(
|
||||||
newSet,
|
IOobject
|
||||||
runTime,
|
(
|
||||||
surfFileName.lessExt().name() + ".featureEdgeMesh"
|
sFeatFileName + ".featureEdgeMesh",
|
||||||
|
runTime.constant(),
|
||||||
|
"featureEdgeMesh",
|
||||||
|
runTime,
|
||||||
|
IOobject::NO_READ,
|
||||||
|
IOobject::NO_WRITE
|
||||||
|
),
|
||||||
|
newSet
|
||||||
);
|
);
|
||||||
|
|
||||||
feMesh.writeObj(surfFileName.lessExt().name());
|
|
||||||
|
|
||||||
feMesh.write();
|
feMesh.write();
|
||||||
|
|
||||||
|
feMesh.writeObj(sFeatFileName);
|
||||||
|
|
||||||
Info<< "End\n" << endl;
|
Info<< "End\n" << endl;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
@ -54,6 +54,97 @@ Foam::label Foam::featureEdgeMesh::nPointTypes = 4;
|
|||||||
Foam::label Foam::featureEdgeMesh::nEdgeTypes = 5;
|
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 * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
Foam::featureEdgeMesh::featureEdgeMesh(const IOobject& io)
|
Foam::featureEdgeMesh::featureEdgeMesh(const IOobject& io)
|
||||||
@ -189,23 +280,11 @@ Foam::featureEdgeMesh::featureEdgeMesh
|
|||||||
|
|
||||||
Foam::featureEdgeMesh::featureEdgeMesh
|
Foam::featureEdgeMesh::featureEdgeMesh
|
||||||
(
|
(
|
||||||
const surfaceFeatures& sFeat,
|
const IOobject& io,
|
||||||
const objectRegistry& obr,
|
const surfaceFeatures& sFeat
|
||||||
const fileName& sFeatFileName
|
|
||||||
)
|
)
|
||||||
:
|
:
|
||||||
regIOobject
|
regIOobject(io),
|
||||||
(
|
|
||||||
IOobject
|
|
||||||
(
|
|
||||||
sFeatFileName,
|
|
||||||
obr.time().constant(),
|
|
||||||
"featureEdgeMesh",
|
|
||||||
obr,
|
|
||||||
IOobject::NO_READ,
|
|
||||||
IOobject::NO_WRITE
|
|
||||||
)
|
|
||||||
),
|
|
||||||
edgeMesh(pointField(0), edgeList(0)),
|
edgeMesh(pointField(0), edgeList(0)),
|
||||||
concaveStart_(-1),
|
concaveStart_(-1),
|
||||||
mixedStart_(-1),
|
mixedStart_(-1),
|
||||||
@ -367,9 +446,8 @@ Foam::featureEdgeMesh::featureEdgeMesh
|
|||||||
(
|
(
|
||||||
"Foam::featureEdgeMesh::featureEdgeMesh"
|
"Foam::featureEdgeMesh::featureEdgeMesh"
|
||||||
"("
|
"("
|
||||||
" const surfaceFeatures& sFeat,"
|
"const IOobject& io, "
|
||||||
" const objectRegistry& obr,"
|
"const surfaceFeatures& sFeat"
|
||||||
" const fileName& sFeatFileName"
|
|
||||||
")"
|
")"
|
||||||
)
|
)
|
||||||
<< nl << "classifyEdge returned NONE on edge "
|
<< nl << "classifyEdge returned NONE on edge "
|
||||||
@ -444,9 +522,8 @@ Foam::featureEdgeMesh::featureEdgeMesh
|
|||||||
(
|
(
|
||||||
"Foam::featureEdgeMesh::featureEdgeMesh"
|
"Foam::featureEdgeMesh::featureEdgeMesh"
|
||||||
"("
|
"("
|
||||||
" const surfaceFeatures& sFeat,"
|
"const IOobject& io, "
|
||||||
" const objectRegistry& obr,"
|
"const surfaceFeatures& sFeat"
|
||||||
" const fileName& sFeatFileName"
|
|
||||||
")"
|
")"
|
||||||
)
|
)
|
||||||
<< nl << "classifyFeaturePoint returned NONFEATURE on point at "
|
<< 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 * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
void Foam::featureEdgeMesh::nearestFeatureEdge
|
void Foam::featureEdgeMesh::nearestFeatureEdge
|
||||||
|
|||||||
@ -27,10 +27,10 @@ Class
|
|||||||
Description
|
Description
|
||||||
|
|
||||||
Feature points are a sorted subset at the start of the overall points list:
|
Feature points are a sorted subset at the start of the overall points list:
|
||||||
0 .. concaveStart_-1 : convex points (w.r.t normals)
|
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
|
mixedStart_ .. nonFeatureStart_ : mixed internal/external points
|
||||||
nonFeatureStart_ .. size-1 : non-feature points
|
nonFeatureStart_ .. size-1 : non-feature points
|
||||||
|
|
||||||
Feature edges are the edgeList of the edgeMesh and are sorted:
|
Feature edges are the edgeList of the edgeMesh and are sorted:
|
||||||
0 .. internalStart_-1 : external edges (convex w.r.t normals)
|
0 .. internalStart_-1 : external edges (convex w.r.t normals)
|
||||||
@ -55,11 +55,9 @@ SourceFiles
|
|||||||
|
|
||||||
#include "edgeMesh.H"
|
#include "edgeMesh.H"
|
||||||
#include "surfaceFeatures.H"
|
#include "surfaceFeatures.H"
|
||||||
#include "objectRegistry.H"
|
|
||||||
#include "IOdictionary.H"
|
#include "IOdictionary.H"
|
||||||
#include "indexedOctree.H"
|
#include "indexedOctree.H"
|
||||||
#include "treeDataEdge.H"
|
#include "treeDataEdge.H"
|
||||||
#include "pointIndexHit.H"
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
@ -202,14 +200,12 @@ public:
|
|||||||
const Xfer<edgeList>&
|
const Xfer<edgeList>&
|
||||||
);
|
);
|
||||||
|
|
||||||
//- Construct (read) given surfaceFeatures, an objectRegistry and a
|
//- Construct given surfaceFeatures, extracts, classifies and reorders
|
||||||
// fileName to write to. Extracts, classifies and reorders the data
|
// the data.
|
||||||
// from surfaceFeatures.
|
|
||||||
featureEdgeMesh
|
featureEdgeMesh
|
||||||
(
|
(
|
||||||
const surfaceFeatures& sFeat,
|
const IOobject& io,
|
||||||
const objectRegistry& obr,
|
const surfaceFeatures& sFeat
|
||||||
const fileName& sFeatFileName
|
|
||||||
);
|
);
|
||||||
|
|
||||||
//- Construct from all components
|
//- Construct from all components
|
||||||
|
|||||||
@ -54,17 +54,25 @@ Foam::conformationSurfaces::conformationSurfaces
|
|||||||
surfaceConformationDict.subDict("geometryToConformTo")
|
surfaceConformationDict.subDict("geometryToConformTo")
|
||||||
);
|
);
|
||||||
|
|
||||||
|
const dictionary& additionalFeaturesDict
|
||||||
|
(
|
||||||
|
surfaceConformationDict.subDict("additionalFeatures")
|
||||||
|
);
|
||||||
|
|
||||||
Info<< nl << "Reading geometryToConformTo" << endl;
|
Info<< nl << "Reading geometryToConformTo" << endl;
|
||||||
|
|
||||||
surfaces_.setSize(surfacesDict.size());
|
surfaces_.setSize(surfacesDict.size(), -1);
|
||||||
|
|
||||||
allGeometryToSurfaces_.setSize(allGeometry_.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;
|
label surfI = 0;
|
||||||
|
|
||||||
@ -84,6 +92,8 @@ Foam::conformationSurfaces::conformationSurfaces
|
|||||||
<< exit(FatalError);
|
<< exit(FatalError);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Info<< nl << " " << iter().keyword() << endl;
|
||||||
|
|
||||||
patchOffsets_[surfI] = patchNames_.size();
|
patchOffsets_[surfI] = patchNames_.size();
|
||||||
|
|
||||||
patchNames_.append(allGeometry.regionNames()[surfaces_[surfI]]);
|
patchNames_.append(allGeometry.regionNames()[surfaces_[surfI]]);
|
||||||
@ -105,9 +115,11 @@ Foam::conformationSurfaces::conformationSurfaces
|
|||||||
{
|
{
|
||||||
fileName feMeshName(surfaceSubDict.lookup("featureEdgeMesh"));
|
fileName feMeshName(surfaceSubDict.lookup("featureEdgeMesh"));
|
||||||
|
|
||||||
|
Info<< " features: " << feMeshName<< endl;
|
||||||
|
|
||||||
features_.set
|
features_.set
|
||||||
(
|
(
|
||||||
surfI,
|
featureI++,
|
||||||
new featureEdgeMesh
|
new featureEdgeMesh
|
||||||
(
|
(
|
||||||
IOobject
|
IOobject
|
||||||
@ -115,7 +127,8 @@ Foam::conformationSurfaces::conformationSurfaces
|
|||||||
feMeshName,
|
feMeshName,
|
||||||
cvMesh_.time().findInstance
|
cvMesh_.time().findInstance
|
||||||
(
|
(
|
||||||
"featureEdgeMesh", feMeshName
|
"featureEdgeMesh",
|
||||||
|
feMeshName
|
||||||
),
|
),
|
||||||
"featureEdgeMesh",
|
"featureEdgeMesh",
|
||||||
cvMesh_.time(),
|
cvMesh_.time(),
|
||||||
@ -135,25 +148,25 @@ Foam::conformationSurfaces::conformationSurfaces
|
|||||||
}
|
}
|
||||||
else if (featureMethod == "none")
|
else if (featureMethod == "none")
|
||||||
{
|
{
|
||||||
fileName feMeshName(surfaceName + "_noFeatures");
|
// fileName feMeshName(surfaceName + "_noFeatures");
|
||||||
|
|
||||||
features_.set
|
// features_.set
|
||||||
(
|
// (
|
||||||
surfI,
|
// featureI++,
|
||||||
new featureEdgeMesh
|
// new featureEdgeMesh
|
||||||
(
|
// (
|
||||||
IOobject
|
// IOobject
|
||||||
(
|
// (
|
||||||
feMeshName,
|
// feMeshName,
|
||||||
cvMesh_.time().constant(),
|
// cvMesh_.time().constant(),
|
||||||
"featureEdgeMesh",
|
// "featureEdgeMesh",
|
||||||
cvMesh_.time(),
|
// cvMesh_.time(),
|
||||||
IOobject::NO_READ,
|
// IOobject::NO_READ,
|
||||||
IOobject::NO_WRITE,
|
// IOobject::NO_WRITE,
|
||||||
false
|
// false
|
||||||
)
|
// )
|
||||||
)
|
// )
|
||||||
);
|
// );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -166,6 +179,60 @@ Foam::conformationSurfaces::conformationSurfaces
|
|||||||
surfI++;
|
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_);
|
bounds_ = searchableSurfacesQueries::bounds(allGeometry_, surfaces_);
|
||||||
|
|
||||||
spanMag_ = bounds_.mag();
|
spanMag_ = bounds_.mag();
|
||||||
|
|||||||
Reference in New Issue
Block a user