From 4015a344cd12d0f0100a6ebd8b39642f10145a63 Mon Sep 17 00:00:00 2001 From: mattijs <mattijs> Date: Wed, 28 May 2014 15:23:56 +0100 Subject: [PATCH] ENH: dynamicRefineFvMesh: #1203 base unrefinement on max, not min of surrounding cells --- .../dynamicRefineFvMesh/dynamicRefineFvMesh.C | 48 ++++++++++++------- .../dynamicRefineFvMesh/dynamicRefineFvMesh.H | 10 ++-- 2 files changed, 35 insertions(+), 23 deletions(-) diff --git a/src/dynamicFvMesh/dynamicRefineFvMesh/dynamicRefineFvMesh.C b/src/dynamicFvMesh/dynamicRefineFvMesh/dynamicRefineFvMesh.C index 201e62b70a2..fc8fcce1723 100644 --- a/src/dynamicFvMesh/dynamicRefineFvMesh/dynamicRefineFvMesh.C +++ b/src/dynamicFvMesh/dynamicRefineFvMesh/dynamicRefineFvMesh.C @@ -59,7 +59,15 @@ Foam::label Foam::dynamicRefineFvMesh::count { n++; } + + // debug also serves to get-around Clang compiler trying to optimsie + // out this forAll loop under O3 optimisation + if (debug) + { + Info<< "n=" << n << endl; + } } + return n; } @@ -659,11 +667,11 @@ Foam::dynamicRefineFvMesh::maxPointField(const scalarField& pFld) const } -// Get min of connected cell +// Get max of connected cell Foam::scalarField -Foam::dynamicRefineFvMesh::minCellField(const volScalarField& vFld) const +Foam::dynamicRefineFvMesh::maxCellField(const volScalarField& vFld) const { - scalarField pFld(nPoints(), GREAT); + scalarField pFld(nPoints(), -GREAT); forAll(pointCells(), pointI) { @@ -671,7 +679,7 @@ Foam::dynamicRefineFvMesh::minCellField(const volScalarField& vFld) const forAll(pCells, i) { - pFld[pointI] = min(pFld[pointI], vFld[pCells[i]]); + pFld[pointI] = max(pFld[pointI], vFld[pCells[i]]); } } return pFld; @@ -774,10 +782,11 @@ Foam::labelList Foam::dynamicRefineFvMesh::selectRefineCells calculateProtectedCells(unrefineableCell); // Count current selection - label nCandidates = returnReduce(count(candidateCell, 1), sumOp<label>()); + label nLocalCandidates = count(candidateCell, 1); + label nCandidates = returnReduce(nLocalCandidates, sumOp<label>()); // Collect all cells - DynamicList<label> candidates(nCells()); + DynamicList<label> candidates(nLocalCandidates); if (nCandidates < nTotToRefine) { @@ -1263,25 +1272,28 @@ bool Foam::dynamicRefineFvMesh::update() readScalar(refineDict.lookup("lowerRefineLevel")); const scalar upperRefineLevel = readScalar(refineDict.lookup("upperRefineLevel")); - const scalar unrefineLevel = - readScalar(refineDict.lookup("unrefineLevel")); + const scalar unrefineLevel = refineDict.lookupOrDefault<scalar> + ( + "unrefineLevel", + GREAT + ); const label nBufferLayers = readLabel(refineDict.lookup("nBufferLayers")); // Cells marked for refinement or otherwise protected from unrefinement. PackedBoolList refineCell(nCells()); + // Determine candidates for refinement (looking at field only) + selectRefineCandidates + ( + lowerRefineLevel, + upperRefineLevel, + vFld, + refineCell + ); + if (globalData().nTotalCells() < maxCells) { - // Determine candidates for refinement (looking at field only) - selectRefineCandidates - ( - lowerRefineLevel, - upperRefineLevel, - vFld, - refineCell - ); - // Select subset of candidates. Take into account max allowable // cells, refinement level, protected cells. labelList cellsToRefine @@ -1352,7 +1364,7 @@ bool Foam::dynamicRefineFvMesh::update() ( unrefineLevel, refineCell, - minCellField(vFld) + maxCellField(vFld) ) ); diff --git a/src/dynamicFvMesh/dynamicRefineFvMesh/dynamicRefineFvMesh.H b/src/dynamicFvMesh/dynamicRefineFvMesh/dynamicRefineFvMesh.H index 7611b86c09a..fc4db3bf702 100644 --- a/src/dynamicFvMesh/dynamicRefineFvMesh/dynamicRefineFvMesh.H +++ b/src/dynamicFvMesh/dynamicRefineFvMesh/dynamicRefineFvMesh.H @@ -37,8 +37,8 @@ Description // Refine field inbetween lower..upper lowerRefineLevel 0.001; upperRefineLevel 0.999; - // If value < unrefineLevel unrefine - unrefineLevel 10; + // If value < unrefineLevel (default=GREAT) unrefine + //unrefineLevel 10; // Have slower than 2:1 refinement nBufferLayers 1; // Refine cells only up to maxRefinement levels @@ -79,7 +79,7 @@ namespace Foam { /*---------------------------------------------------------------------------*\ - Class dynamicRefineFvMesh Declaration + Class dynamicRefineFvMesh Declaration \*---------------------------------------------------------------------------*/ class dynamicRefineFvMesh @@ -139,8 +139,8 @@ protected: //- Get per cell max of connected point scalarField maxPointField(const scalarField&) const; - //- Get point min of connected cell - scalarField minCellField(const volScalarField&) const; + //- Get point max of connected cell + scalarField maxCellField(const volScalarField&) const; scalarField cellToPoint(const scalarField& vFld) const; -- GitLab