From 9ba219d0f3af3f897772afef92e3b7c53929d559 Mon Sep 17 00:00:00 2001 From: mattijs Date: Thu, 6 Jun 2013 06:04:00 +0100 Subject: [PATCH 1/2] ENH: MGridGen: enforce all coarse cells to be single connected region --- .../GAMGAgglomeration/GAMGAgglomeration.C | 119 ++++++++++++++++++ .../GAMGAgglomeration/GAMGAgglomeration.H | 10 ++ .../MGridGenGAMGAgglomerate.C | 22 +++- 3 files changed, 150 insertions(+), 1 deletion(-) diff --git a/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/GAMGAgglomerations/GAMGAgglomeration/GAMGAgglomeration.C b/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/GAMGAgglomerations/GAMGAgglomeration/GAMGAgglomeration.C index dd51eb645b..66a495f6b2 100644 --- a/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/GAMGAgglomerations/GAMGAgglomeration/GAMGAgglomeration.C +++ b/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/GAMGAgglomerations/GAMGAgglomeration/GAMGAgglomeration.C @@ -535,4 +535,123 @@ const Foam::labelListListList& Foam::GAMGAgglomeration::boundaryFaceMap } +bool Foam::GAMGAgglomeration::checkRestriction +( + labelList& newRestrict, + label& nNewCoarse, + const lduAddressing& fineAddressing, + const labelUList& restrict, + const label nCoarse +) +{ + if (fineAddressing.size() != restrict.size()) + { + FatalErrorIn + ( + "checkRestriction(..)" + ) << "nCells:" << fineAddressing.size() + << " agglom:" << restrict.size() + << abort(FatalError); + } + + // Seed (master) for every region + labelList master(identity(fineAddressing.size())); + + // Now loop and transport master through region + const labelUList& lower = fineAddressing.lowerAddr(); + const labelUList& upper = fineAddressing.upperAddr(); + + while (true) + { + label nChanged = 0; + + forAll(lower, faceI) + { + label own = lower[faceI]; + label nei = upper[faceI]; + + if (restrict[own] == restrict[nei]) + { + // coarse-mesh-internal face + + if (master[own] < master[nei]) + { + master[nei] = master[own]; + nChanged++; + } + else if (master[own] > master[nei]) + { + master[own] = master[nei]; + nChanged++; + } + } + } + + reduce(nChanged, sumOp