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