mirror of
https://develop.openfoam.com/Development/openfoam.git
synced 2025-11-28 03:28:01 +00:00
ENH: snappyHexMesh: added debug switch
This commit is contained in:
@ -418,9 +418,9 @@ addLayersControls
|
|||||||
// default is 0.
|
// default is 0.
|
||||||
//nSmoothDisplacement 90;
|
//nSmoothDisplacement 90;
|
||||||
|
|
||||||
// Optional: do not extrude any point where all surrounding faces
|
// (wip)Optional: do not extrude a point if none of the surrounding points is
|
||||||
// have at least one point not extruded. Default is true.
|
// not extruded. Default is false.
|
||||||
//detectExtrusionIsland false;
|
//detectExtrusionIsland true;
|
||||||
|
|
||||||
|
|
||||||
// Mesh shrinking
|
// Mesh shrinking
|
||||||
@ -488,7 +488,9 @@ meshQualityControls
|
|||||||
//(
|
//(
|
||||||
// mesh // write intermediate meshes
|
// mesh // write intermediate meshes
|
||||||
// intersections // write current mesh intersections as .obj files
|
// intersections // write current mesh intersections as .obj files
|
||||||
// featureSeeds // write information about explicit feature edge refinement
|
// featureSeeds // write information about explicit feature edge
|
||||||
|
// // refinement
|
||||||
|
// attraction // write attraction as .obj files
|
||||||
// layerInfo // write information about layers
|
// layerInfo // write information about layers
|
||||||
//);
|
//);
|
||||||
//
|
//
|
||||||
|
|||||||
@ -41,7 +41,7 @@ Description
|
|||||||
#include "mapPolyMesh.H"
|
#include "mapPolyMesh.H"
|
||||||
#include "addPatchCellLayer.H"
|
#include "addPatchCellLayer.H"
|
||||||
#include "mapDistributePolyMesh.H"
|
#include "mapDistributePolyMesh.H"
|
||||||
#include "OFstream.H"
|
#include "OBJstream.H"
|
||||||
#include "layerParameters.H"
|
#include "layerParameters.H"
|
||||||
#include "combineFaces.H"
|
#include "combineFaces.H"
|
||||||
#include "IOmanip.H"
|
#include "IOmanip.H"
|
||||||
@ -80,37 +80,25 @@ void Foam::autoLayerDriver::dumpDisplacement
|
|||||||
const List<extrudeMode>& extrudeStatus
|
const List<extrudeMode>& extrudeStatus
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
OFstream dispStr(prefix + "_disp.obj");
|
OBJstream dispStr(prefix + "_disp.obj");
|
||||||
Info<< "Writing all displacements to " << dispStr.name() << endl;
|
Info<< "Writing all displacements to " << dispStr.name() << endl;
|
||||||
|
|
||||||
label vertI = 0;
|
|
||||||
|
|
||||||
forAll(patchDisp, patchPointI)
|
forAll(patchDisp, patchPointI)
|
||||||
{
|
{
|
||||||
const point& pt = pp.localPoints()[patchPointI];
|
const point& pt = pp.localPoints()[patchPointI];
|
||||||
|
dispStr.write(linePointRef(pt, pt + patchDisp[patchPointI]));
|
||||||
meshTools::writeOBJ(dispStr, pt); vertI++;
|
|
||||||
meshTools::writeOBJ(dispStr, pt + patchDisp[patchPointI]); vertI++;
|
|
||||||
|
|
||||||
dispStr << "l " << vertI-1 << ' ' << vertI << nl;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
OFstream illStr(prefix + "_illegal.obj");
|
OBJstream illStr(prefix + "_illegal.obj");
|
||||||
Info<< "Writing invalid displacements to " << illStr.name() << endl;
|
Info<< "Writing invalid displacements to " << illStr.name() << endl;
|
||||||
|
|
||||||
vertI = 0;
|
|
||||||
|
|
||||||
forAll(patchDisp, patchPointI)
|
forAll(patchDisp, patchPointI)
|
||||||
{
|
{
|
||||||
if (extrudeStatus[patchPointI] != EXTRUDE)
|
if (extrudeStatus[patchPointI] != EXTRUDE)
|
||||||
{
|
{
|
||||||
const point& pt = pp.localPoints()[patchPointI];
|
const point& pt = pp.localPoints()[patchPointI];
|
||||||
|
illStr.write(linePointRef(pt, pt + patchDisp[patchPointI]));
|
||||||
meshTools::writeOBJ(illStr, pt); vertI++;
|
|
||||||
meshTools::writeOBJ(illStr, pt + patchDisp[patchPointI]); vertI++;
|
|
||||||
|
|
||||||
illStr << "l " << vertI-1 << ' ' << vertI << nl;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -441,13 +429,12 @@ void Foam::autoLayerDriver::handleFeatureAngle
|
|||||||
point::max // null value
|
point::max // null value
|
||||||
);
|
);
|
||||||
|
|
||||||
label vertI = 0;
|
autoPtr<OBJstream> str;
|
||||||
autoPtr<OFstream> str;
|
|
||||||
if (debug&meshRefinement::MESH)
|
if (debug&meshRefinement::MESH)
|
||||||
{
|
{
|
||||||
str.reset
|
str.reset
|
||||||
(
|
(
|
||||||
new OFstream
|
new OBJstream
|
||||||
(
|
(
|
||||||
mesh.time().path()
|
mesh.time().path()
|
||||||
/ "featureEdges_"
|
/ "featureEdges_"
|
||||||
@ -497,11 +484,9 @@ void Foam::autoLayerDriver::handleFeatureAngle
|
|||||||
|
|
||||||
if (str.valid())
|
if (str.valid())
|
||||||
{
|
{
|
||||||
meshTools::writeOBJ(str(), pp.localPoints()[e[0]]);
|
const point& p0 = pp.localPoints()[e[0]];
|
||||||
vertI++;
|
const point& p1 = pp.localPoints()[e[1]];
|
||||||
meshTools::writeOBJ(str(), pp.localPoints()[e[1]]);
|
str().write(linePointRef(p0, p1));
|
||||||
vertI++;
|
|
||||||
str()<< "l " << vertI-1 << ' ' << vertI << nl;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1542,7 +1527,7 @@ void Foam::autoLayerDriver::getPatchDisplacement
|
|||||||
|
|
||||||
if (!meshTools::visNormal(n, faceNormals, pointFaces[patchPointI]))
|
if (!meshTools::visNormal(n, faceNormals, pointFaces[patchPointI]))
|
||||||
{
|
{
|
||||||
if (debug&meshRefinement::OBJINTERSECTIONS)
|
if (debug&meshRefinement::ATTRACTION)
|
||||||
{
|
{
|
||||||
Pout<< "No valid normal for point " << meshPointI
|
Pout<< "No valid normal for point " << meshPointI
|
||||||
<< ' ' << pp.points()[meshPointI]
|
<< ' ' << pp.points()[meshPointI]
|
||||||
@ -1582,7 +1567,7 @@ void Foam::autoLayerDriver::getPatchDisplacement
|
|||||||
|
|
||||||
if (nPoints > 0)
|
if (nPoints > 0)
|
||||||
{
|
{
|
||||||
if (debug&meshRefinement::OBJINTERSECTIONS)
|
if (debug&meshRefinement::ATTRACTION)
|
||||||
{
|
{
|
||||||
Pout<< "Displacement at illegal point "
|
Pout<< "Displacement at illegal point "
|
||||||
<< localPoints[patchPointI]
|
<< localPoints[patchPointI]
|
||||||
|
|||||||
@ -94,7 +94,7 @@ Foam::label Foam::autoRefineDriver::featureEdgeRefine
|
|||||||
(
|
(
|
||||||
meshRefiner_.refineCandidates
|
meshRefiner_.refineCandidates
|
||||||
(
|
(
|
||||||
refineParams.keepPoints()[0], // For now only use one.
|
refineParams.keepPoints(),
|
||||||
refineParams.curvature(),
|
refineParams.curvature(),
|
||||||
refineParams.planarAngle(),
|
refineParams.planarAngle(),
|
||||||
|
|
||||||
@ -207,7 +207,7 @@ Foam::label Foam::autoRefineDriver::surfaceOnlyRefine
|
|||||||
(
|
(
|
||||||
meshRefiner_.refineCandidates
|
meshRefiner_.refineCandidates
|
||||||
(
|
(
|
||||||
refineParams.keepPoints()[0],
|
refineParams.keepPoints(),
|
||||||
refineParams.curvature(),
|
refineParams.curvature(),
|
||||||
refineParams.planarAngle(),
|
refineParams.planarAngle(),
|
||||||
|
|
||||||
@ -341,7 +341,7 @@ Foam::label Foam::autoRefineDriver::gapOnlyRefine
|
|||||||
(
|
(
|
||||||
meshRefiner_.refineCandidates
|
meshRefiner_.refineCandidates
|
||||||
(
|
(
|
||||||
refineParams.keepPoints()[0],
|
refineParams.keepPoints(),
|
||||||
refineParams.curvature(),
|
refineParams.curvature(),
|
||||||
refineParams.planarAngle(),
|
refineParams.planarAngle(),
|
||||||
|
|
||||||
@ -753,7 +753,7 @@ Foam::label Foam::autoRefineDriver::shellRefine
|
|||||||
(
|
(
|
||||||
meshRefiner_.refineCandidates
|
meshRefiner_.refineCandidates
|
||||||
(
|
(
|
||||||
refineParams.keepPoints()[0],
|
refineParams.keepPoints(),
|
||||||
refineParams.curvature(),
|
refineParams.curvature(),
|
||||||
refineParams.planarAngle(),
|
refineParams.planarAngle(),
|
||||||
|
|
||||||
|
|||||||
@ -1279,7 +1279,7 @@ void Foam::autoSnapDriver::detectNearSurfaces
|
|||||||
|
|
||||||
|
|
||||||
autoPtr<OBJstream> gapStr;
|
autoPtr<OBJstream> gapStr;
|
||||||
if (debug&meshRefinement::OBJINTERSECTIONS)
|
if (debug&meshRefinement::ATTRACTION)
|
||||||
{
|
{
|
||||||
gapStr.reset
|
gapStr.reset
|
||||||
(
|
(
|
||||||
@ -3089,7 +3089,7 @@ void Foam::autoSnapDriver::doSnap
|
|||||||
meshMover.setDisplacement(disp);
|
meshMover.setDisplacement(disp);
|
||||||
|
|
||||||
|
|
||||||
if (debug&meshRefinement::OBJINTERSECTIONS)
|
if (debug&meshRefinement::ATTRACTION)
|
||||||
{
|
{
|
||||||
dumpMove
|
dumpMove
|
||||||
(
|
(
|
||||||
@ -3120,13 +3120,6 @@ void Foam::autoSnapDriver::doSnap
|
|||||||
<< " surfaces but the"
|
<< " surfaces but the"
|
||||||
<< " resulting mesh will not satisfy your quality"
|
<< " resulting mesh will not satisfy your quality"
|
||||||
<< " constraints" << nl << endl;
|
<< " constraints" << nl << endl;
|
||||||
//Info<< "Did not succesfully snap mesh. Giving up."
|
|
||||||
// << nl << endl;
|
|
||||||
//
|
|
||||||
//// Use current mesh as base mesh
|
|
||||||
//meshMover.correct();
|
|
||||||
//
|
|
||||||
//break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (debug&meshRefinement::MESH)
|
if (debug&meshRefinement::MESH)
|
||||||
|
|||||||
@ -422,7 +422,7 @@ void Foam::autoSnapDriver::calcNearestFace
|
|||||||
^ faceSurfaceNormal[faceI];
|
^ faceSurfaceNormal[faceI];
|
||||||
}
|
}
|
||||||
|
|
||||||
if (debug&meshRefinement::OBJINTERSECTIONS)
|
if (debug&meshRefinement::ATTRACTION)
|
||||||
{
|
{
|
||||||
dumpMove
|
dumpMove
|
||||||
(
|
(
|
||||||
@ -1037,7 +1037,7 @@ void Foam::autoSnapDriver::featureAttractionUsingReconstruction
|
|||||||
{
|
{
|
||||||
autoPtr<OBJstream> feStr;
|
autoPtr<OBJstream> feStr;
|
||||||
autoPtr<OBJstream> fpStr;
|
autoPtr<OBJstream> fpStr;
|
||||||
if (debug&meshRefinement::OBJINTERSECTIONS)
|
if (debug&meshRefinement::ATTRACTION)
|
||||||
{
|
{
|
||||||
feStr.reset
|
feStr.reset
|
||||||
(
|
(
|
||||||
@ -1331,7 +1331,7 @@ void Foam::autoSnapDriver::releasePointsNextToMultiPatch
|
|||||||
) const
|
) const
|
||||||
{
|
{
|
||||||
autoPtr<OBJstream> multiPatchStr;
|
autoPtr<OBJstream> multiPatchStr;
|
||||||
if (debug&meshRefinement::OBJINTERSECTIONS)
|
if (debug&meshRefinement::ATTRACTION)
|
||||||
{
|
{
|
||||||
multiPatchStr.reset
|
multiPatchStr.reset
|
||||||
(
|
(
|
||||||
@ -1809,7 +1809,7 @@ void Foam::autoSnapDriver::determineFeatures
|
|||||||
autoPtr<OBJstream> missedEdgeStr;
|
autoPtr<OBJstream> missedEdgeStr;
|
||||||
autoPtr<OBJstream> featurePointStr;
|
autoPtr<OBJstream> featurePointStr;
|
||||||
|
|
||||||
if (debug&meshRefinement::OBJINTERSECTIONS)
|
if (debug&meshRefinement::ATTRACTION)
|
||||||
{
|
{
|
||||||
featureEdgeStr.reset
|
featureEdgeStr.reset
|
||||||
(
|
(
|
||||||
@ -2263,7 +2263,7 @@ void Foam::autoSnapDriver::determineBaffleFeatures
|
|||||||
|
|
||||||
|
|
||||||
autoPtr<OBJstream> baffleEdgeStr;
|
autoPtr<OBJstream> baffleEdgeStr;
|
||||||
if (debug&meshRefinement::OBJINTERSECTIONS)
|
if (debug&meshRefinement::ATTRACTION)
|
||||||
{
|
{
|
||||||
baffleEdgeStr.reset
|
baffleEdgeStr.reset
|
||||||
(
|
(
|
||||||
@ -2865,7 +2865,7 @@ void Foam::autoSnapDriver::featureAttractionUsingFeatureEdges
|
|||||||
|
|
||||||
|
|
||||||
// Dump
|
// Dump
|
||||||
if (debug&meshRefinement::OBJINTERSECTIONS)
|
if (debug&meshRefinement::ATTRACTION)
|
||||||
{
|
{
|
||||||
OBJstream featureEdgeStr
|
OBJstream featureEdgeStr
|
||||||
(
|
(
|
||||||
@ -2962,7 +2962,7 @@ void Foam::autoSnapDriver::featureAttractionUsingFeatureEdges
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (debug&meshRefinement::OBJINTERSECTIONS)
|
if (debug&meshRefinement::ATTRACTION)
|
||||||
{
|
{
|
||||||
dumpMove
|
dumpMove
|
||||||
(
|
(
|
||||||
@ -3380,7 +3380,7 @@ Foam::vectorField Foam::autoSnapDriver::calcNearestSurfaceFeature
|
|||||||
// Re-add normal component
|
// Re-add normal component
|
||||||
tangPatchDisp += (pointNormals & patchDisp) * pointNormals;
|
tangPatchDisp += (pointNormals & patchDisp) * pointNormals;
|
||||||
|
|
||||||
if (debug&meshRefinement::OBJINTERSECTIONS)
|
if (debug&meshRefinement::ATTRACTION)
|
||||||
{
|
{
|
||||||
dumpMove
|
dumpMove
|
||||||
(
|
(
|
||||||
|
|||||||
@ -67,13 +67,14 @@ namespace Foam
|
|||||||
const char* Foam::NamedEnum
|
const char* Foam::NamedEnum
|
||||||
<
|
<
|
||||||
Foam::meshRefinement::IOdebugType,
|
Foam::meshRefinement::IOdebugType,
|
||||||
4
|
5
|
||||||
>::names[] =
|
>::names[] =
|
||||||
{
|
{
|
||||||
"mesh",
|
"mesh",
|
||||||
//"scalarLevels",
|
//"scalarLevels",
|
||||||
"intersections",
|
"intersections",
|
||||||
"featureSeeds",
|
"featureSeeds",
|
||||||
|
"attraction",
|
||||||
"layerInfo"
|
"layerInfo"
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -102,7 +103,7 @@ namespace Foam
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const Foam::NamedEnum<Foam::meshRefinement::IOdebugType, 4>
|
const Foam::NamedEnum<Foam::meshRefinement::IOdebugType, 5>
|
||||||
Foam::meshRefinement::IOdebugTypeNames;
|
Foam::meshRefinement::IOdebugTypeNames;
|
||||||
|
|
||||||
const Foam::NamedEnum<Foam::meshRefinement::IOoutputType, 1>
|
const Foam::NamedEnum<Foam::meshRefinement::IOoutputType, 1>
|
||||||
|
|||||||
@ -92,15 +92,17 @@ public:
|
|||||||
//IOSCALARLEVELS,
|
//IOSCALARLEVELS,
|
||||||
IOOBJINTERSECTIONS,
|
IOOBJINTERSECTIONS,
|
||||||
IOFEATURESEEDS,
|
IOFEATURESEEDS,
|
||||||
|
IOATTRACTION,
|
||||||
IOLAYERINFO
|
IOLAYERINFO
|
||||||
};
|
};
|
||||||
static const NamedEnum<IOdebugType, 4> IOdebugTypeNames;
|
static const NamedEnum<IOdebugType, 5> IOdebugTypeNames;
|
||||||
enum debugType
|
enum debugType
|
||||||
{
|
{
|
||||||
MESH = 1<<IOMESH,
|
MESH = 1<<IOMESH,
|
||||||
//SCALARLEVELS = 1<<IOSCALARLEVELS,
|
//SCALARLEVELS = 1<<IOSCALARLEVELS,
|
||||||
OBJINTERSECTIONS = 1<<IOOBJINTERSECTIONS,
|
OBJINTERSECTIONS = 1<<IOOBJINTERSECTIONS,
|
||||||
FEATURESEEDS = 1<<IOFEATURESEEDS,
|
FEATURESEEDS = 1<<IOFEATURESEEDS,
|
||||||
|
ATTRACTION = 1<< IOATTRACTION,
|
||||||
LAYERINFO = 1<<IOLAYERINFO
|
LAYERINFO = 1<<IOLAYERINFO
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -256,7 +258,7 @@ private:
|
|||||||
// (or -1 if not passed through). Uses tracking.
|
// (or -1 if not passed through). Uses tracking.
|
||||||
void markFeatureCellLevel
|
void markFeatureCellLevel
|
||||||
(
|
(
|
||||||
const point& keepPoint,
|
const pointField& keepPoints,
|
||||||
labelList& maxFeatureLevel
|
labelList& maxFeatureLevel
|
||||||
) const;
|
) const;
|
||||||
|
|
||||||
@ -264,7 +266,7 @@ private:
|
|||||||
// features.
|
// features.
|
||||||
label markFeatureRefinement
|
label markFeatureRefinement
|
||||||
(
|
(
|
||||||
const point& keepPoint,
|
const pointField& keepPoints,
|
||||||
const label nAllowRefine,
|
const label nAllowRefine,
|
||||||
|
|
||||||
labelList& refineCell,
|
labelList& refineCell,
|
||||||
@ -779,7 +781,7 @@ public:
|
|||||||
//- Calculate list of cells to refine.
|
//- Calculate list of cells to refine.
|
||||||
labelList refineCandidates
|
labelList refineCandidates
|
||||||
(
|
(
|
||||||
const point& keepPoint,
|
const pointField& keepPoints,
|
||||||
const scalar curvature,
|
const scalar curvature,
|
||||||
const scalar planarAngle,
|
const scalar planarAngle,
|
||||||
|
|
||||||
@ -914,7 +916,7 @@ public:
|
|||||||
//- Select coupled faces that are not collocated
|
//- Select coupled faces that are not collocated
|
||||||
void selectSeparatedCoupledFaces(boolList&) const;
|
void selectSeparatedCoupledFaces(boolList&) const;
|
||||||
|
|
||||||
//- Find region cell is in. Uses optional perturbation to re-test.
|
//- Find region point is in. Uses optional perturbation to re-test.
|
||||||
static label findRegion
|
static label findRegion
|
||||||
(
|
(
|
||||||
const polyMesh&,
|
const polyMesh&,
|
||||||
@ -1018,6 +1020,8 @@ public:
|
|||||||
const labelHashSet& set
|
const labelHashSet& set
|
||||||
) const;
|
) const;
|
||||||
|
|
||||||
|
//- Merge edges, maintain mesh quality. Return global number
|
||||||
|
// of edges merged
|
||||||
label mergeEdgesUndo
|
label mergeEdgesUndo
|
||||||
(
|
(
|
||||||
const scalar minCos,
|
const scalar minCos,
|
||||||
|
|||||||
@ -313,7 +313,7 @@ bool Foam::meshRefinement::markForRefine
|
|||||||
|
|
||||||
void Foam::meshRefinement::markFeatureCellLevel
|
void Foam::meshRefinement::markFeatureCellLevel
|
||||||
(
|
(
|
||||||
const point& keepPoint,
|
const pointField& keepPoints,
|
||||||
labelList& maxFeatureLevel
|
labelList& maxFeatureLevel
|
||||||
) const
|
) const
|
||||||
{
|
{
|
||||||
@ -345,106 +345,111 @@ void Foam::meshRefinement::markFeatureCellLevel
|
|||||||
// what to seed. Do this on only the processor that
|
// what to seed. Do this on only the processor that
|
||||||
// holds the keepPoint.
|
// holds the keepPoint.
|
||||||
|
|
||||||
label cellI = -1;
|
forAll(keepPoints, i)
|
||||||
label tetFaceI = -1;
|
|
||||||
label tetPtI = -1;
|
|
||||||
|
|
||||||
mesh_.findCellFacePt(keepPoint, cellI, tetFaceI, tetPtI);
|
|
||||||
|
|
||||||
if (cellI != -1)
|
|
||||||
{
|
{
|
||||||
// I am the processor that holds the keepPoint
|
const point& keepPoint = keepPoints[i];
|
||||||
|
|
||||||
forAll(features_, featI)
|
label cellI = -1;
|
||||||
|
label tetFaceI = -1;
|
||||||
|
label tetPtI = -1;
|
||||||
|
|
||||||
|
mesh_.findCellFacePt(keepPoint, cellI, tetFaceI, tetPtI);
|
||||||
|
|
||||||
|
if (cellI != -1)
|
||||||
{
|
{
|
||||||
const edgeMesh& featureMesh = features_[featI];
|
// I am the processor that holds the keepPoint
|
||||||
const label featureLevel = features_.levels()[featI][0];
|
|
||||||
const labelListList& pointEdges = featureMesh.pointEdges();
|
|
||||||
|
|
||||||
// Find regions on edgeMesh
|
forAll(features_, featI)
|
||||||
labelList edgeRegion;
|
|
||||||
label nRegions = featureMesh.regions(edgeRegion);
|
|
||||||
|
|
||||||
|
|
||||||
PackedBoolList regionVisited(nRegions);
|
|
||||||
|
|
||||||
|
|
||||||
// 1. Seed all 'knots' in edgeMesh
|
|
||||||
|
|
||||||
|
|
||||||
forAll(pointEdges, pointI)
|
|
||||||
{
|
{
|
||||||
if (pointEdges[pointI].size() != 2)
|
const edgeMesh& featureMesh = features_[featI];
|
||||||
|
const label featureLevel = features_.levels()[featI][0];
|
||||||
|
const labelListList& pointEdges = featureMesh.pointEdges();
|
||||||
|
|
||||||
|
// Find regions on edgeMesh
|
||||||
|
labelList edgeRegion;
|
||||||
|
label nRegions = featureMesh.regions(edgeRegion);
|
||||||
|
|
||||||
|
|
||||||
|
PackedBoolList regionVisited(nRegions);
|
||||||
|
|
||||||
|
|
||||||
|
// 1. Seed all 'knots' in edgeMesh
|
||||||
|
|
||||||
|
|
||||||
|
forAll(pointEdges, pointI)
|
||||||
{
|
{
|
||||||
if (debug&meshRefinement::FEATURESEEDS)
|
if (pointEdges[pointI].size() != 2)
|
||||||
{
|
{
|
||||||
Pout<< "Adding particle from point:" << pointI
|
if (debug&meshRefinement::FEATURESEEDS)
|
||||||
<< " coord:" << featureMesh.points()[pointI]
|
{
|
||||||
<< " since number of emanating edges:"
|
Pout<< "Adding particle from point:" << pointI
|
||||||
<< pointEdges[pointI].size()
|
<< " coord:" << featureMesh.points()[pointI]
|
||||||
<< endl;
|
<< " since number of emanating edges:"
|
||||||
}
|
<< pointEdges[pointI].size()
|
||||||
|
<< endl;
|
||||||
|
}
|
||||||
|
|
||||||
// Non-manifold point. Create particle.
|
// Non-manifold point. Create particle.
|
||||||
startPointCloud.addParticle
|
startPointCloud.addParticle
|
||||||
(
|
|
||||||
new trackedParticle
|
|
||||||
(
|
(
|
||||||
mesh_,
|
new trackedParticle
|
||||||
keepPoint,
|
(
|
||||||
cellI,
|
mesh_,
|
||||||
tetFaceI,
|
keepPoint,
|
||||||
tetPtI,
|
cellI,
|
||||||
featureMesh.points()[pointI], // endpos
|
tetFaceI,
|
||||||
featureLevel, // level
|
tetPtI,
|
||||||
featI, // featureMesh
|
featureMesh.points()[pointI], // endpos
|
||||||
pointI // end point
|
featureLevel, // level
|
||||||
)
|
featI, // featureMesh
|
||||||
);
|
pointI // end point
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
// Mark
|
// Mark
|
||||||
if (pointEdges[pointI].size() > 0)
|
if (pointEdges[pointI].size() > 0)
|
||||||
{
|
{
|
||||||
label e0 = pointEdges[pointI][0];
|
label e0 = pointEdges[pointI][0];
|
||||||
label regionI = edgeRegion[e0];
|
label regionI = edgeRegion[e0];
|
||||||
regionVisited[regionI] = 1u;
|
regionVisited[regionI] = 1u;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// 2. Any regions that have not been visited at all? These can
|
// 2. Any regions that have not been visited at all? These can
|
||||||
// only be circular regions!
|
// only be circular regions!
|
||||||
forAll(featureMesh.edges(), edgeI)
|
forAll(featureMesh.edges(), edgeI)
|
||||||
{
|
|
||||||
if (regionVisited.set(edgeRegion[edgeI], 1u))
|
|
||||||
{
|
{
|
||||||
const edge& e = featureMesh.edges()[edgeI];
|
if (regionVisited.set(edgeRegion[edgeI], 1u))
|
||||||
label pointI = e.start();
|
|
||||||
if (debug&meshRefinement::FEATURESEEDS)
|
|
||||||
{
|
{
|
||||||
Pout<< "Adding particle from point:" << pointI
|
const edge& e = featureMesh.edges()[edgeI];
|
||||||
<< " coord:" << featureMesh.points()[pointI]
|
label pointI = e.start();
|
||||||
<< " on circular region:" << edgeRegion[edgeI]
|
if (debug&meshRefinement::FEATURESEEDS)
|
||||||
<< endl;
|
{
|
||||||
}
|
Pout<< "Adding particle from point:" << pointI
|
||||||
|
<< " coord:" << featureMesh.points()[pointI]
|
||||||
|
<< " on circular region:" << edgeRegion[edgeI]
|
||||||
|
<< endl;
|
||||||
|
}
|
||||||
|
|
||||||
// Non-manifold point. Create particle.
|
// Non-manifold point. Create particle.
|
||||||
startPointCloud.addParticle
|
startPointCloud.addParticle
|
||||||
(
|
|
||||||
new trackedParticle
|
|
||||||
(
|
(
|
||||||
mesh_,
|
new trackedParticle
|
||||||
keepPoint,
|
(
|
||||||
cellI,
|
mesh_,
|
||||||
tetFaceI,
|
keepPoint,
|
||||||
tetPtI,
|
cellI,
|
||||||
featureMesh.points()[pointI], // endpos
|
tetFaceI,
|
||||||
featureLevel, // level
|
tetPtI,
|
||||||
featI, // featureMesh
|
featureMesh.points()[pointI], // endpos
|
||||||
pointI // end point
|
featureLevel, // level
|
||||||
)
|
featI, // featureMesh
|
||||||
);
|
pointI // end point
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -628,7 +633,7 @@ void Foam::meshRefinement::markFeatureCellLevel
|
|||||||
// Calculates list of cells to refine based on intersection with feature edge.
|
// Calculates list of cells to refine based on intersection with feature edge.
|
||||||
Foam::label Foam::meshRefinement::markFeatureRefinement
|
Foam::label Foam::meshRefinement::markFeatureRefinement
|
||||||
(
|
(
|
||||||
const point& keepPoint,
|
const pointField& keepPoints,
|
||||||
const label nAllowRefine,
|
const label nAllowRefine,
|
||||||
|
|
||||||
labelList& refineCell,
|
labelList& refineCell,
|
||||||
@ -637,7 +642,7 @@ Foam::label Foam::meshRefinement::markFeatureRefinement
|
|||||||
{
|
{
|
||||||
// Largest refinement level of any feature passed through
|
// Largest refinement level of any feature passed through
|
||||||
labelList maxFeatureLevel;
|
labelList maxFeatureLevel;
|
||||||
markFeatureCellLevel(keepPoint, maxFeatureLevel);
|
markFeatureCellLevel(keepPoints, maxFeatureLevel);
|
||||||
|
|
||||||
// See which cells to refine. maxFeatureLevel will hold highest level
|
// See which cells to refine. maxFeatureLevel will hold highest level
|
||||||
// of any feature edge that passed through.
|
// of any feature edge that passed through.
|
||||||
@ -2009,7 +2014,7 @@ Foam::label Foam::meshRefinement::markProximityRefinement
|
|||||||
// hitting overall limit maxGlobalCells.
|
// hitting overall limit maxGlobalCells.
|
||||||
Foam::labelList Foam::meshRefinement::refineCandidates
|
Foam::labelList Foam::meshRefinement::refineCandidates
|
||||||
(
|
(
|
||||||
const point& keepPoint,
|
const pointField& keepPoints,
|
||||||
const scalar curvature,
|
const scalar curvature,
|
||||||
const scalar planarAngle,
|
const scalar planarAngle,
|
||||||
|
|
||||||
@ -2077,7 +2082,7 @@ Foam::labelList Foam::meshRefinement::refineCandidates
|
|||||||
{
|
{
|
||||||
label nFeatures = markFeatureRefinement
|
label nFeatures = markFeatureRefinement
|
||||||
(
|
(
|
||||||
keepPoint,
|
keepPoints,
|
||||||
nAllowRefine,
|
nAllowRefine,
|
||||||
|
|
||||||
refineCell,
|
refineCell,
|
||||||
|
|||||||
Reference in New Issue
Block a user