dynamicMesh/meshCut: Improved diagnostics and documentation

Patch provided by Bruno Santos
Resolves bug-report http://www.openfoam.org/mantisbt/view.php?id=1960
This commit is contained in:
Henry Weller
2016-01-03 11:43:10 +00:00
parent 65c98f27d6
commit 41f9e71c71
3 changed files with 48 additions and 71 deletions

View File

@ -2,7 +2,7 @@
========= | ========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | \\ / O peration |
\\ / A nd | Copyright (C) 2011-2015 OpenFOAM Foundation \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
@ -44,7 +44,6 @@ defineTypeNameAndDebug(cellCuts, 0);
// * * * * * * * * * * * * * Private Static Functions * * * * * * * * * * * // // * * * * * * * * * * * * * Private Static Functions * * * * * * * * * * * //
// Find val in first nElems elements of list.
Foam::label Foam::cellCuts::findPartIndex Foam::label Foam::cellCuts::findPartIndex
( (
const labelList& elems, const labelList& elems,
@ -96,7 +95,6 @@ Foam::scalarField Foam::cellCuts::expand
} }
// Find first point in lst not in map.
Foam::label Foam::cellCuts::firstUnique Foam::label Foam::cellCuts::firstUnique
( (
const labelList& lst, const labelList& lst,
@ -116,7 +114,6 @@ Foam::label Foam::cellCuts::firstUnique
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // // * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
// Write cell and raw cuts on any of the elements
void Foam::cellCuts::writeUncutOBJ void Foam::cellCuts::writeUncutOBJ
( (
const fileName& dir, const fileName& dir,
@ -223,7 +220,6 @@ void Foam::cellCuts::writeOBJ
} }
// Find face on cell using the two edges.
Foam::label Foam::cellCuts::edgeEdgeToFace Foam::label Foam::cellCuts::edgeEdgeToFace
( (
const label cellI, const label cellI,
@ -264,7 +260,6 @@ Foam::label Foam::cellCuts::edgeEdgeToFace
} }
// Find face on cell using an edge and a vertex.
Foam::label Foam::cellCuts::edgeVertexToFace Foam::label Foam::cellCuts::edgeVertexToFace
( (
const label cellI, const label cellI,
@ -304,7 +299,6 @@ Foam::label Foam::cellCuts::edgeVertexToFace
} }
// Find face using two vertices (guaranteed not to be along edge)
Foam::label Foam::cellCuts::vertexVertexToFace Foam::label Foam::cellCuts::vertexVertexToFace
( (
const label cellI, const label cellI,
@ -477,7 +471,6 @@ void Foam::cellCuts::calcFaceCuts() const
} }
// Find edge on face using two vertices
Foam::label Foam::cellCuts::findEdge Foam::label Foam::cellCuts::findEdge
( (
const label faceI, const label faceI,
@ -507,7 +500,6 @@ Foam::label Foam::cellCuts::findEdge
} }
// Check if there is a face on the cell on which all cuts are.
Foam::label Foam::cellCuts::loopFace Foam::label Foam::cellCuts::loopFace
( (
const label cellI, const label cellI,
@ -559,7 +551,6 @@ Foam::label Foam::cellCuts::loopFace
} }
// From point go into connected face
bool Foam::cellCuts::walkPoint bool Foam::cellCuts::walkPoint
( (
const label cellI, const label cellI,
@ -615,7 +606,6 @@ bool Foam::cellCuts::walkPoint
} }
// Cross cut (which is edge on faceI) onto next face
bool Foam::cellCuts::crossEdge bool Foam::cellCuts::crossEdge
( (
const label cellI, const label cellI,
@ -695,8 +685,6 @@ bool Foam::cellCuts::addCut
} }
// Walk across faceI, storing cuts as you go. Returns last two cuts visisted.
// Returns true if valid walk.
bool Foam::cellCuts::walkFace bool Foam::cellCuts::walkFace
( (
const label cellI, const label cellI,
@ -787,8 +775,6 @@ bool Foam::cellCuts::walkFace
// Walk across cuts (cut edges or cut vertices) of cell. Stops when hit cut
// already visited. Returns true when loop of 3 or more vertices found.
bool Foam::cellCuts::walkCell bool Foam::cellCuts::walkCell
( (
const label cellI, const label cellI,
@ -982,13 +968,14 @@ bool Foam::cellCuts::walkCell
} }
// Determine for every cut cell the loop (= face) it is cut by. Done by starting
// from a cut edge or cut vertex and walking across faces, from cut to cut,
// until starting cut hit.
// If multiple loops are possible across a cell circumference takes the first
// one found.
void Foam::cellCuts::calcCellLoops(const labelList& cutCells) void Foam::cellCuts::calcCellLoops(const labelList& cutCells)
{ {
// Determine for every cut cell the loop (= face) it is cut by. Done by
// starting from a cut edge or cut vertex and walking across faces, from
// cut to cut, until starting cut hit.
// If multiple loops are possible across a cell circumference takes the
// first one found.
// Calculate cuts per face. // Calculate cuts per face.
const labelListList& allFaceCuts = faceCuts(); const labelListList& allFaceCuts = faceCuts();
@ -1139,8 +1126,6 @@ void Foam::cellCuts::calcCellLoops(const labelList& cutCells)
} }
// Walk unset edges of single cell from starting point and marks visited
// edges and vertices with status.
void Foam::cellCuts::walkEdges void Foam::cellCuts::walkEdges
( (
const label cellI, const label cellI,
@ -1178,7 +1163,6 @@ void Foam::cellCuts::walkEdges
} }
// Invert anchor point selection.
Foam::labelList Foam::cellCuts::nonAnchorPoints Foam::labelList Foam::cellCuts::nonAnchorPoints
( (
const labelList& cellPoints, const labelList& cellPoints,
@ -1209,7 +1193,6 @@ Foam::labelList Foam::cellCuts::nonAnchorPoints
} }
//- Check anchor points on 'outside' of loop
bool Foam::cellCuts::loopAnchorConsistent bool Foam::cellCuts::loopAnchorConsistent
( (
const label cellI, const label cellI,
@ -1245,10 +1228,6 @@ bool Foam::cellCuts::loopAnchorConsistent
} }
// Determines set of anchor points given a loop. The loop should split the
// cell into (one or) two sets of vertices. The set of vertices that is
// on the 'normal' side of the loop is the anchor set.
// Returns true if valid set, false otherwise.
bool Foam::cellCuts::calcAnchors bool Foam::cellCuts::calcAnchors
( (
const label cellI, const label cellI,
@ -1612,7 +1591,6 @@ Foam::pointField Foam::cellCuts::loopPoints
} }
// Returns weights of loop. Inverse of loopPoints.
Foam::scalarField Foam::cellCuts::loopWeights(const labelList& loop) const Foam::scalarField Foam::cellCuts::loopWeights(const labelList& loop) const
{ {
scalarField weights(loop.size()); scalarField weights(loop.size());
@ -1636,7 +1614,6 @@ Foam::scalarField Foam::cellCuts::loopWeights(const labelList& loop) const
} }
// Check if cut edges in loop are compatible with ones in edgeIsCut_
bool Foam::cellCuts::validEdgeLoop bool Foam::cellCuts::validEdgeLoop
( (
const labelList& loop, const labelList& loop,
@ -1672,15 +1649,16 @@ bool Foam::cellCuts::validEdgeLoop
} }
// Counts cuts on face. Includes cuts through vertices and through edges.
// Assumes that if edge is cut both in edgeIsCut and in loop that the position
// of the cut is the same.
Foam::label Foam::cellCuts::countFaceCuts Foam::label Foam::cellCuts::countFaceCuts
( (
const label faceI, const label faceI,
const labelList& loop const labelList& loop
) const ) const
{ {
// Includes cuts through vertices and through edges.
// Assumes that if edge is cut both in edgeIsCut and in loop that the
// position of the cut is the same.
label nCuts = 0; label nCuts = 0;
// Count cut vertices // Count cut vertices
@ -1723,8 +1701,6 @@ Foam::label Foam::cellCuts::countFaceCuts
} }
// Determine compatibility of loop with existing cut pattern. Does not use
// cut-addressing (faceCuts_, cutCuts_)
bool Foam::cellCuts::conservativeValidLoop bool Foam::cellCuts::conservativeValidLoop
( (
const label cellI, const label cellI,
@ -1816,10 +1792,6 @@ bool Foam::cellCuts::conservativeValidLoop
} }
// Determine compatibility of loop with existing cut pattern. Does not use
// derived cut-addressing (faceCuts), only pointIsCut, edgeIsCut.
// Adds any cross-cuts found to newFaceSplitCut and sets cell points on
// one side of the loop in anchorPoints.
bool Foam::cellCuts::validLoop bool Foam::cellCuts::validLoop
( (
const label cellI, const label cellI,
@ -1830,6 +1802,11 @@ bool Foam::cellCuts::validLoop
labelList& anchorPoints labelList& anchorPoints
) const ) const
{ {
// Determine compatibility of loop with existing cut pattern. Does not use
// derived cut-addressing (faceCuts), only pointIsCut, edgeIsCut.
// Adds any cross-cuts found to newFaceSplitCut and sets cell points on
// one side of the loop in anchorPoints.
if (loop.size() < 2) if (loop.size() < 2)
{ {
return false; return false;
@ -1841,6 +1818,7 @@ bool Foam::cellCuts::validLoop
// cut per face is allowed. // cut per face is allowed.
if (!conservativeValidLoop(cellI, loop)) if (!conservativeValidLoop(cellI, loop))
{ {
Info << "Invalid conservative loop: " << loop << endl;
return false; return false;
} }
} }
@ -1984,9 +1962,6 @@ bool Foam::cellCuts::validLoop
} }
// Update basic cut information (pointIsCut, edgeIsCut) from cellLoops.
// Assumes cellLoops_ and edgeWeight_ already set and consistent.
// Does not use any other information.
void Foam::cellCuts::setFromCellLoops() void Foam::cellCuts::setFromCellLoops()
{ {
// 'Uncut' edges/vertices that are not used in loops. // 'Uncut' edges/vertices that are not used in loops.
@ -2071,8 +2046,6 @@ void Foam::cellCuts::setFromCellLoops()
} }
// Upate basic cut information from single cellLoop. Returns true if loop
// was valid.
bool Foam::cellCuts::setFromCellLoop bool Foam::cellCuts::setFromCellLoop
( (
const label cellI, const label cellI,
@ -2080,6 +2053,9 @@ bool Foam::cellCuts::setFromCellLoop
const scalarField& loopWeights const scalarField& loopWeights
) )
{ {
// Update basic cut information from single cellLoop. Returns true if loop
// was valid.
// Dump loop for debugging. // Dump loop for debugging.
if (debug) if (debug)
{ {
@ -2169,8 +2145,6 @@ bool Foam::cellCuts::setFromCellLoop
} }
// Update basic cut information from cellLoops. Checks for consistency with
// existing cut pattern.
void Foam::cellCuts::setFromCellLoops void Foam::cellCuts::setFromCellLoops
( (
const labelList& cellLabels, const labelList& cellLabels,
@ -2207,8 +2181,6 @@ void Foam::cellCuts::setFromCellLoops
} }
// Cut cells and update basic cut information from cellLoops. Checks each loop
// for consistency with existing cut pattern.
void Foam::cellCuts::setFromCellCutter void Foam::cellCuts::setFromCellCutter
( (
const cellLooper& cellCutter, const cellLooper& cellCutter,
@ -2266,6 +2238,17 @@ void Foam::cellCuts::setFromCellCutter
{ {
cellLoops_[cellI].setSize(0); cellLoops_[cellI].setSize(0);
WarningInFunction
<< "Found loop on cell " << cellI
<< " that resulted in an unexpected bad cut."
<< " Suggestions:" << nl
<< " - Turn on the debug switch for 'cellCuts' to get"
<< " geometry files that identify this cell." << nl
<< " - Also keep in mind to check the defined"
<< " reference directions, as these are most likely the"
<< " origin of the problem."
<< nl << endl;
// Discarded by validLoop // Discarded by validLoop
if (debug) if (debug)
{ {
@ -2324,7 +2307,6 @@ void Foam::cellCuts::setFromCellCutter
} }
// Same as one before but cut plane prescribed (instead of just normal)
void Foam::cellCuts::setFromCellCutter void Foam::cellCuts::setFromCellCutter
( (
const cellLooper& cellCutter, const cellLooper& cellCutter,
@ -2436,7 +2418,6 @@ void Foam::cellCuts::setFromCellCutter
} }
// Set orientation of loops
void Foam::cellCuts::orientPlanesAndLoops() void Foam::cellCuts::orientPlanesAndLoops()
{ {
// Determine anchorPoints if not yet done by validLoop. // Determine anchorPoints if not yet done by validLoop.
@ -2493,7 +2474,6 @@ void Foam::cellCuts::orientPlanesAndLoops()
} }
// Do all: calculate addressing, calculate loops splitting cells
void Foam::cellCuts::calcLoopsAndAddressing(const labelList& cutCells) void Foam::cellCuts::calcLoopsAndAddressing(const labelList& cutCells)
{ {
// Sanity check on weights // Sanity check on weights
@ -2682,7 +2662,6 @@ void Foam::cellCuts::check() const
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
// Construct from cells to cut and pattern of cuts
Foam::cellCuts::cellCuts Foam::cellCuts::cellCuts
( (
const polyMesh& mesh, const polyMesh& mesh,
@ -2727,8 +2706,6 @@ Foam::cellCuts::cellCuts
} }
// Construct from pattern of cuts. Finds out itself which cells are cut.
// (can go wrong if e.g. all neighbours of cell are refined)
Foam::cellCuts::cellCuts Foam::cellCuts::cellCuts
( (
const polyMesh& mesh, const polyMesh& mesh,
@ -2747,6 +2724,9 @@ Foam::cellCuts::cellCuts
nLoops_(-1), nLoops_(-1),
cellAnchorPoints_(mesh.nCells()) cellAnchorPoints_(mesh.nCells())
{ {
// Construct from pattern of cuts. Finds out itself which cells are cut.
// (can go wrong if e.g. all neighbours of cell are refined)
if (debug) if (debug)
{ {
Pout<< "cellCuts : constructor from cellLoops" << endl; Pout<< "cellCuts : constructor from cellLoops" << endl;
@ -2771,8 +2751,6 @@ Foam::cellCuts::cellCuts
} }
// Construct from complete cellLoops. Assumes correct cut pattern.
// Only constructs cut-cut addressing and cellAnchorPoints
Foam::cellCuts::cellCuts Foam::cellCuts::cellCuts
( (
const polyMesh& mesh, const polyMesh& mesh,
@ -2817,7 +2795,6 @@ Foam::cellCuts::cellCuts
} }
// Construct from list of cells to cut and cell cutter.
Foam::cellCuts::cellCuts Foam::cellCuts::cellCuts
( (
const polyMesh& mesh, const polyMesh& mesh,
@ -2861,7 +2838,6 @@ Foam::cellCuts::cellCuts
} }
// Construct from list of cells to cut, plane to cut with and cell cutter.
Foam::cellCuts::cellCuts Foam::cellCuts::cellCuts
( (
const polyMesh& mesh, const polyMesh& mesh,
@ -2908,7 +2884,6 @@ Foam::cellCuts::cellCuts
} }
// Construct from components
Foam::cellCuts::cellCuts Foam::cellCuts::cellCuts
( (
const polyMesh& mesh, const polyMesh& mesh,
@ -2980,7 +2955,6 @@ Foam::pointField Foam::cellCuts::loopPoints(const label cellI) const
} }
// Flip loop for cell
void Foam::cellCuts::flip(const label cellI) void Foam::cellCuts::flip(const label cellI)
{ {
labelList& loop = cellLoops_[cellI]; labelList& loop = cellLoops_[cellI];
@ -2998,7 +2972,6 @@ void Foam::cellCuts::flip(const label cellI)
} }
// Flip loop only
void Foam::cellCuts::flipLoopOnly(const label cellI) void Foam::cellCuts::flipLoopOnly(const label cellI)
{ {
labelList& loop = cellLoops_[cellI]; labelList& loop = cellLoops_[cellI];

View File

@ -2,7 +2,7 @@
========= | ========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | \\ / O peration |
\\ / A nd | Copyright (C) 2011-2015 OpenFOAM Foundation \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
@ -277,6 +277,7 @@ class cellCuts
//- Walk across faceI following cuts, starting at cut. Stores cuts //- Walk across faceI following cuts, starting at cut. Stores cuts
// visited // visited
// Returns true if valid walk.
bool walkFace bool walkFace
( (
const label cellI, const label cellI,
@ -374,8 +375,8 @@ class cellCuts
const labelList& loop const labelList& loop
) const; ) const;
//- Determines if loop through cellI consistent with existing //- Determine compatibility of loop with existing cut pattern.
// pattern. // Does not use cut-addressing (faceCuts_, cutCuts_)
bool conservativeValidLoop bool conservativeValidLoop
( (
const label cellI, const label cellI,
@ -395,8 +396,9 @@ class cellCuts
labelList& anchorPoints labelList& anchorPoints
) const; ) const;
//- Update basic cut information from cellLoops. Assumes cellLoops_ //- Update basic cut information from cellLoops.
// already set and consistent. // Assumes cellLoops_ and edgeWeight_ already set and consistent.
// Does not use any other information.
void setFromCellLoops(); void setFromCellLoops();
//- Update basic cut information for single cell from cellLoop. //- Update basic cut information for single cell from cellLoop.
@ -424,7 +426,8 @@ class cellCuts
const List<refineCell>& refCells const List<refineCell>& refCells
); );
//- Same as above but now cut with prescribed plane. //- Same as above but now cut with prescribed plane (instead of
// just normal).
void setFromCellCutter void setFromCellCutter
( (
const cellLooper&, const cellLooper&,
@ -436,6 +439,7 @@ class cellCuts
void orientPlanesAndLoops(); void orientPlanesAndLoops();
//- Top level driver: adressing calculation and loop detection //- Top level driver: adressing calculation and loop detection
// (loops splitting cells).
void calcLoopsAndAddressing(const labelList& cutCells); void calcLoopsAndAddressing(const labelList& cutCells);
//- Check various consistencies. //- Check various consistencies.

View File

@ -2,7 +2,7 @@
========= | ========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | \\ / O peration |
\\ / A nd | Copyright (C) 2011-2015 OpenFOAM Foundation \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
@ -126,10 +126,10 @@ Foam::Map<Foam::label> Foam::refinementIterator::setRefinement
OFstream cutsStream(cutsFile); OFstream cutsStream(cutsFile);
labelList refCells(currentRefCells.size()); labelList refCellsDebug(currentRefCells.size());
forAll(currentRefCells, i) forAll(currentRefCells, i)
{ {
refCells[i] = currentRefCells[i].cellNo(); refCellsDebug[i] = currentRefCells[i].cellNo();
} }
meshTools::writeOBJ meshTools::writeOBJ
( (
@ -137,7 +137,7 @@ Foam::Map<Foam::label> Foam::refinementIterator::setRefinement
mesh().cells(), mesh().cells(),
mesh().faces(), mesh().faces(),
mesh().points(), mesh().points(),
refCells refCellsDebug
); );
} }