diff --git a/src/dynamicMesh/meshCut/cellCuts/cellCuts.C b/src/dynamicMesh/meshCut/cellCuts/cellCuts.C index 864faad5fd1974f8bdb2462a0bf35b38e18973a7..0d5d96ec712af21fd5902d3544a3fc2927e1679e 100644 --- a/src/dynamicMesh/meshCut/cellCuts/cellCuts.C +++ b/src/dynamicMesh/meshCut/cellCuts/cellCuts.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011-2015 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -44,7 +44,6 @@ defineTypeNameAndDebug(cellCuts, 0); // * * * * * * * * * * * * * Private Static Functions * * * * * * * * * * * // -// Find val in first nElems elements of list. Foam::label Foam::cellCuts::findPartIndex ( 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 ( const labelList& lst, @@ -116,7 +114,6 @@ Foam::label Foam::cellCuts::firstUnique // * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // -// Write cell and raw cuts on any of the elements void Foam::cellCuts::writeUncutOBJ ( const fileName& dir, @@ -223,7 +220,6 @@ void Foam::cellCuts::writeOBJ } -// Find face on cell using the two edges. Foam::label Foam::cellCuts::edgeEdgeToFace ( 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 ( 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 ( const label cellI, @@ -477,7 +471,6 @@ void Foam::cellCuts::calcFaceCuts() const } -// Find edge on face using two vertices Foam::label Foam::cellCuts::findEdge ( 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 ( const label cellI, @@ -559,7 +551,6 @@ Foam::label Foam::cellCuts::loopFace } -// From point go into connected face bool Foam::cellCuts::walkPoint ( 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 ( 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 ( 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 ( 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) { + // 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. 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 ( const label cellI, @@ -1178,7 +1163,6 @@ void Foam::cellCuts::walkEdges } -// Invert anchor point selection. Foam::labelList Foam::cellCuts::nonAnchorPoints ( const labelList& cellPoints, @@ -1209,7 +1193,6 @@ Foam::labelList Foam::cellCuts::nonAnchorPoints } -//- Check anchor points on 'outside' of loop bool Foam::cellCuts::loopAnchorConsistent ( 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 ( 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 { 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 ( 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 ( const label faceI, const labelList& loop ) 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; // 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 ( 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 ( const label cellI, @@ -1830,6 +1802,11 @@ bool Foam::cellCuts::validLoop labelList& anchorPoints ) 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) { return false; @@ -1841,6 +1818,7 @@ bool Foam::cellCuts::validLoop // cut per face is allowed. if (!conservativeValidLoop(cellI, loop)) { + Info << "Invalid conservative loop: " << loop << endl; 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() { // '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 ( const label cellI, @@ -2080,6 +2053,9 @@ bool Foam::cellCuts::setFromCellLoop const scalarField& loopWeights ) { + // Update basic cut information from single cellLoop. Returns true if loop + // was valid. + // Dump loop for debugging. 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 ( 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 ( const cellLooper& cellCutter, @@ -2266,6 +2238,17 @@ void Foam::cellCuts::setFromCellCutter { 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 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 ( const cellLooper& cellCutter, @@ -2436,7 +2418,6 @@ void Foam::cellCuts::setFromCellCutter } -// Set orientation of loops void Foam::cellCuts::orientPlanesAndLoops() { // 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) { // Sanity check on weights @@ -2682,7 +2662,6 @@ void Foam::cellCuts::check() const // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // -// Construct from cells to cut and pattern of cuts Foam::cellCuts::cellCuts ( 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 ( const polyMesh& mesh, @@ -2747,6 +2724,9 @@ Foam::cellCuts::cellCuts nLoops_(-1), 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) { 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 ( const polyMesh& mesh, @@ -2817,7 +2795,6 @@ Foam::cellCuts::cellCuts } -// Construct from list of cells to cut and cell cutter. Foam::cellCuts::cellCuts ( 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 ( const polyMesh& mesh, @@ -2908,7 +2884,6 @@ Foam::cellCuts::cellCuts } -// Construct from components Foam::cellCuts::cellCuts ( 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) { 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) { labelList& loop = cellLoops_[cellI]; diff --git a/src/dynamicMesh/meshCut/cellCuts/cellCuts.H b/src/dynamicMesh/meshCut/cellCuts/cellCuts.H index 4fb1173db620647dc44ee41203cd10ec8ce0f99a..30b1528b22a081e8d4f2ea41f612f4c6c5de911f 100644 --- a/src/dynamicMesh/meshCut/cellCuts/cellCuts.H +++ b/src/dynamicMesh/meshCut/cellCuts/cellCuts.H @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011-2015 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -277,6 +277,7 @@ class cellCuts //- Walk across faceI following cuts, starting at cut. Stores cuts // visited + // Returns true if valid walk. bool walkFace ( const label cellI, @@ -374,8 +375,8 @@ class cellCuts const labelList& loop ) const; - //- Determines if loop through cellI consistent with existing - // pattern. + //- Determine compatibility of loop with existing cut pattern. + // Does not use cut-addressing (faceCuts_, cutCuts_) bool conservativeValidLoop ( const label cellI, @@ -395,8 +396,9 @@ class cellCuts labelList& anchorPoints ) const; - //- Update basic cut information from cellLoops. Assumes cellLoops_ - // already set and consistent. + //- Update basic cut information from cellLoops. + // Assumes cellLoops_ and edgeWeight_ already set and consistent. + // Does not use any other information. void setFromCellLoops(); //- Update basic cut information for single cell from cellLoop. @@ -424,7 +426,8 @@ class cellCuts 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 ( const cellLooper&, @@ -436,6 +439,7 @@ class cellCuts void orientPlanesAndLoops(); //- Top level driver: adressing calculation and loop detection + // (loops splitting cells). void calcLoopsAndAddressing(const labelList& cutCells); //- Check various consistencies. diff --git a/src/dynamicMesh/meshCut/meshModifiers/refinementIterator/refinementIterator.C b/src/dynamicMesh/meshCut/meshModifiers/refinementIterator/refinementIterator.C index feec8ba08c2093865ef1f192467de305213fd7df..27ee747ae8d405ca6f6e15bd2ce86d6a5484f26a 100644 --- a/src/dynamicMesh/meshCut/meshModifiers/refinementIterator/refinementIterator.C +++ b/src/dynamicMesh/meshCut/meshModifiers/refinementIterator/refinementIterator.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011-2015 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -126,10 +126,10 @@ Foam::Map<Foam::label> Foam::refinementIterator::setRefinement OFstream cutsStream(cutsFile); - labelList refCells(currentRefCells.size()); + labelList refCellsDebug(currentRefCells.size()); forAll(currentRefCells, i) { - refCells[i] = currentRefCells[i].cellNo(); + refCellsDebug[i] = currentRefCells[i].cellNo(); } meshTools::writeOBJ ( @@ -137,7 +137,7 @@ Foam::Map<Foam::label> Foam::refinementIterator::setRefinement mesh().cells(), mesh().faces(), mesh().points(), - refCells + refCellsDebug ); }