From 08a9d05ccd0ea9200f390e27da88b6fb430772fa Mon Sep 17 00:00:00 2001
From: mattijs <mattijs>
Date: Tue, 17 Dec 2013 09:02:25 +0000
Subject: [PATCH] ENH: polyMesh: update pointMesh.

---
 src/OpenFOAM/meshes/polyMesh/polyMesh.C       | 10 ++---
 src/OpenFOAM/meshes/polyMesh/polyMesh.H       | 27 +++++++-----
 src/OpenFOAM/meshes/polyMesh/polyMeshClear.C  | 24 +++++++++--
 .../meshes/polyMesh/polyMeshFromShapeMesh.C   |  4 +-
 .../dynamicRefineFvMesh/dynamicRefineFvMesh.C | 31 +++++++++++++-
 .../polyTopoChange/polyTopoChange.C           |  6 ++-
 src/finiteVolume/fvMesh/fvMesh.C              | 41 +++++++++++++++++--
 src/finiteVolume/fvMesh/fvMesh.H              |  2 +-
 .../rawTopoChangerFvMesh.C                    | 10 +++--
 9 files changed, 122 insertions(+), 33 deletions(-)

diff --git a/src/OpenFOAM/meshes/polyMesh/polyMesh.C b/src/OpenFOAM/meshes/polyMesh/polyMesh.C
index af15b5edf56..162e8951709 100644
--- a/src/OpenFOAM/meshes/polyMesh/polyMesh.C
+++ b/src/OpenFOAM/meshes/polyMesh/polyMesh.C
@@ -265,7 +265,7 @@ Foam::polyMesh::polyMesh(const IOobject& io)
     ),
     globalMeshDataPtr_(NULL),
     moving_(false),
-    changing_(false),
+    topoChanging_(false),
     curMotionTimeIndex_(time().timeIndex()),
     oldPointsPtr_(NULL)
 {
@@ -447,7 +447,7 @@ Foam::polyMesh::polyMesh
     ),
     globalMeshDataPtr_(NULL),
     moving_(false),
-    changing_(false),
+    topoChanging_(false),
     curMotionTimeIndex_(time().timeIndex()),
     oldPointsPtr_(NULL)
 {
@@ -606,7 +606,7 @@ Foam::polyMesh::polyMesh
     ),
     globalMeshDataPtr_(NULL),
     moving_(false),
-    changing_(false),
+    topoChanging_(false),
     curMotionTimeIndex_(time().timeIndex()),
     oldPointsPtr_(NULL)
 {
@@ -673,8 +673,8 @@ void Foam::polyMesh::resetPrimitives
     const bool validBoundary
 )
 {
-    // Clear addressing. Keep geometric props for mapping.
-    clearAddressing();
+    // Clear addressing. Keep geometric props and updateable props for mapping.
+    clearAddressing(true);
 
     // Take over new primitive data.
     // Optimized to avoid overwriting data at all
diff --git a/src/OpenFOAM/meshes/polyMesh/polyMesh.H b/src/OpenFOAM/meshes/polyMesh/polyMesh.H
index 47fe014d60c..5d95d9cfb87 100644
--- a/src/OpenFOAM/meshes/polyMesh/polyMesh.H
+++ b/src/OpenFOAM/meshes/polyMesh/polyMesh.H
@@ -172,8 +172,8 @@ private:
             //- Is the mesh moving
             bool moving_;
 
-            //- Is the mesh changing (moving and/or topology changing)
-            bool changing_;
+            //- Is the mesh topology changing
+            bool topoChanging_;
 
             //- Current time index for mesh motion
             mutable label curMotionTimeIndex_;
@@ -489,24 +489,29 @@ public:
             {
                 bool m0 = moving_;
                 moving_ = m;
-                changing_ = changing_ || moving_;
                 return m0;
             }
 
-            //- Is mesh changing (topology changing and/or moving)
-            bool changing() const
+            //- Is mesh topology changing
+            bool topoChanging() const
             {
-                return changing_;
+                return topoChanging_;
             }
 
-            //- Set the mesh to be changing
-            bool changing(const bool c)
+            //- Set the mesh topology to be changing
+            bool topoChanging(const bool c)
             {
-                bool c0 = changing_;
-                changing_ = c;
+                bool c0 = topoChanging_;
+                topoChanging_ = c;
                 return c0;
             }
 
+            //- Is mesh changing (topology changing and/or moving)
+            bool changing() const
+            {
+                return moving()||topoChanging();
+            }
+
             //- Move points, returns volumes swept by faces in motion
             virtual tmp<scalarField> movePoints(const pointField&);
 
@@ -580,7 +585,7 @@ public:
             void clearGeom();
 
             //- Clear addressing
-            void clearAddressing();
+            void clearAddressing(const bool isMeshUpdate = false);
 
             //- Clear all geometry and addressing unnecessary for CFD
             void clearOut();
diff --git a/src/OpenFOAM/meshes/polyMesh/polyMeshClear.C b/src/OpenFOAM/meshes/polyMesh/polyMeshClear.C
index 7a9558187d5..96297ed3e10 100644
--- a/src/OpenFOAM/meshes/polyMesh/polyMeshClear.C
+++ b/src/OpenFOAM/meshes/polyMesh/polyMeshClear.C
@@ -60,6 +60,7 @@ void Foam::polyMesh::clearGeom()
             << endl;
     }
 
+    // Clear all geometric mesh objects
     meshObject::clear<polyMesh, GeometricMeshObject>(*this);
 
     primitiveMesh::clearGeom();
@@ -93,16 +94,33 @@ void Foam::polyMesh::clearAdditionalGeom()
 }
 
 
-void Foam::polyMesh::clearAddressing()
+void Foam::polyMesh::clearAddressing(const bool isMeshUpdate)
 {
     if (debug)
     {
         Info<< "void polyMesh::clearAddressing() : "
-            << "clearing topology"
+            << "clearing topology  isMeshUpdate:" << isMeshUpdate
             << endl;
     }
 
-    meshObject::clear<polyMesh, TopologicalMeshObject>(*this);
+    if (isMeshUpdate)
+    {
+        // Part of a mesh update. Keep meshObjects that have an updateMesh
+        // callback
+        meshObject::clearUpto
+        <
+            polyMesh,
+            TopologicalMeshObject,
+            UpdateableMeshObject
+        >
+        (
+            *this
+        );
+    }
+    else
+    {
+        meshObject::clear<polyMesh, TopologicalMeshObject>(*this);
+    }
 
     primitiveMesh::clearAddressing();
 
diff --git a/src/OpenFOAM/meshes/polyMesh/polyMeshFromShapeMesh.C b/src/OpenFOAM/meshes/polyMesh/polyMeshFromShapeMesh.C
index 43d55876cac..ef5ee9956c3 100644
--- a/src/OpenFOAM/meshes/polyMesh/polyMeshFromShapeMesh.C
+++ b/src/OpenFOAM/meshes/polyMesh/polyMeshFromShapeMesh.C
@@ -553,7 +553,7 @@ Foam::polyMesh::polyMesh
     ),
     globalMeshDataPtr_(NULL),
     moving_(false),
-    changing_(false),
+    topoChanging_(false),
     curMotionTimeIndex_(time().timeIndex()),
     oldPointsPtr_(NULL)
 {
@@ -837,7 +837,7 @@ Foam::polyMesh::polyMesh
     ),
     globalMeshDataPtr_(NULL),
     moving_(false),
-    changing_(false),
+    topoChanging_(false),
     curMotionTimeIndex_(time().timeIndex()),
     oldPointsPtr_(NULL)
 {
diff --git a/src/dynamicFvMesh/dynamicRefineFvMesh/dynamicRefineFvMesh.C b/src/dynamicFvMesh/dynamicRefineFvMesh/dynamicRefineFvMesh.C
index 77fc1f26ca7..bfc6b567f45 100644
--- a/src/dynamicFvMesh/dynamicRefineFvMesh/dynamicRefineFvMesh.C
+++ b/src/dynamicFvMesh/dynamicRefineFvMesh/dynamicRefineFvMesh.C
@@ -32,6 +32,7 @@ License
 #include "syncTools.H"
 #include "pointFields.H"
 #include "sigFpe.H"
+#include "cellSet.H"
 
 // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
 
@@ -1072,6 +1073,26 @@ Foam::dynamicRefineFvMesh::dynamicRefineFvMesh(const IOobject& io)
     {
         protectedCell_.clear();
     }
+    else
+    {
+
+        cellSet protectedCells(*this, "protectedCells", nProtected);
+        forAll(protectedCell_, cellI)
+        {
+            if (protectedCell_[cellI])
+            {
+                protectedCells.insert(cellI);
+            }
+        }
+
+        Info<< "Detected " << returnReduce(nProtected, sumOp<label>())
+            << " cells that are projected from refinement."
+            << " Writing these to cellSet "
+            << protectedCells.name()
+            << "." << endl;
+
+        protectedCells.write();
+    }
 }
 
 
@@ -1110,7 +1131,7 @@ bool Foam::dynamicRefineFvMesh::update()
 
     if (refineInterval == 0)
     {
-        changing(hasChanged);
+        topoChanging(hasChanged);
 
         return false;
     }
@@ -1279,7 +1300,13 @@ bool Foam::dynamicRefineFvMesh::update()
         nRefinementIterations_++;
     }
 
-    changing(hasChanged);
+    topoChanging(hasChanged);
+    if (hasChanged)
+    {
+        // Reset moving flag (if any). If not using inflation we'll not move,
+        // if are using inflation any follow on movePoints will set it.
+        moving(false);
+    }
 
     return hasChanged;
 }
diff --git a/src/dynamicMesh/polyTopoChange/polyTopoChange/polyTopoChange.C b/src/dynamicMesh/polyTopoChange/polyTopoChange/polyTopoChange.C
index bb53ef1aa02..f35ebd881ce 100644
--- a/src/dynamicMesh/polyTopoChange/polyTopoChange/polyTopoChange.C
+++ b/src/dynamicMesh/polyTopoChange/polyTopoChange/polyTopoChange.C
@@ -3184,7 +3184,9 @@ Foam::autoPtr<Foam::mapPolyMesh> Foam::polyTopoChange::changeMesh
             syncParallel
         );
 
-        mesh.changing(true);
+        mesh.topoChanging(true);
+        // Note: could already set moving flag as well
+        //       mesh.moving(true);
     }
     else
     {
@@ -3199,7 +3201,7 @@ Foam::autoPtr<Foam::mapPolyMesh> Foam::polyTopoChange::changeMesh
             patchStarts,
             syncParallel
         );
-        mesh.changing(true);
+        mesh.topoChanging(true);
     }
 
     // Clear out primitives
diff --git a/src/finiteVolume/fvMesh/fvMesh.C b/src/finiteVolume/fvMesh/fvMesh.C
index 26c3b334238..8f99d1f6178 100644
--- a/src/finiteVolume/fvMesh/fvMesh.C
+++ b/src/finiteVolume/fvMesh/fvMesh.C
@@ -110,10 +110,42 @@ void Foam::fvMesh::clearGeom()
 }
 
 
-void Foam::fvMesh::clearAddressing()
+void Foam::fvMesh::clearAddressing(const bool isMeshUpdate)
 {
-    meshObject::clear<fvMesh, TopologicalMeshObject>(*this);
-    meshObject::clear<lduMesh, TopologicalMeshObject>(*this);
+    if (debug)
+    {
+        Info<< "fvMesh::clearAddressing(const bool) :"
+            << " isMeshUpdate:" << isMeshUpdate << endl;
+    }
+
+    if (isMeshUpdate)
+    {
+        // Part of a mesh update. Keep meshObjects that have an updateMesh
+        // callback
+        meshObject::clearUpto
+        <
+            fvMesh,
+            TopologicalMeshObject,
+            UpdateableMeshObject
+        >
+        (
+            *this
+        );
+        meshObject::clearUpto
+        <
+            lduMesh,
+            TopologicalMeshObject,
+            UpdateableMeshObject
+        >
+        (
+            *this
+        );
+    }
+    else
+    {
+        meshObject::clear<fvMesh, TopologicalMeshObject>(*this);
+        meshObject::clear<lduMesh, TopologicalMeshObject>(*this);
+    }
     deleteDemandDrivenData(lduPtr_);
 }
 
@@ -806,7 +838,8 @@ void Foam::fvMesh::updateMesh(const mapPolyMesh& mpm)
     // Clear the current volume and other geometry factors
     surfaceInterpolation::clearOut();
 
-    clearAddressing();
+    // Clear any non-updateable addressing
+    clearAddressing(true);
 
     meshObject::updateMesh<fvMesh>(*this, mpm);
     meshObject::updateMesh<lduMesh>(*this, mpm);
diff --git a/src/finiteVolume/fvMesh/fvMesh.H b/src/finiteVolume/fvMesh/fvMesh.H
index c6c234c4958..47c03db1156 100644
--- a/src/finiteVolume/fvMesh/fvMesh.H
+++ b/src/finiteVolume/fvMesh/fvMesh.H
@@ -141,7 +141,7 @@ class fvMesh
             void clearGeom();
 
             //- Clear addressing
-            void clearAddressing();
+            void clearAddressing(const bool isMeshUpdate = false);
 
             //- Preserve old volume(s)
             void storeOldVol(const scalarField&);
diff --git a/src/topoChangerFvMesh/rawTopoChangerFvMesh/rawTopoChangerFvMesh.C b/src/topoChangerFvMesh/rawTopoChangerFvMesh/rawTopoChangerFvMesh.C
index 2234cf18089..a2fb50dc403 100644
--- a/src/topoChangerFvMesh/rawTopoChangerFvMesh/rawTopoChangerFvMesh.C
+++ b/src/topoChangerFvMesh/rawTopoChangerFvMesh/rawTopoChangerFvMesh.C
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2011 OpenFOAM Foundation
+    \\  /    A nd           | Copyright (C) 2011-2013 OpenFOAM Foundation
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -65,6 +65,12 @@ bool Foam::rawTopoChangerFvMesh::update()
     // Do mesh changes (use inflation - put new points in topoChangeMap)
     Info<< "rawTopoChangerFvMesh : Checking for topology changes..."
         << endl;
+
+    // Mesh not moved/changed yet
+    moving(false);
+    topoChanging(false);
+
+    // Do any topology changes. Sets topoChanging (through polyTopoChange)
     autoPtr<mapPolyMesh> topoChangeMap = topoChanger_.changeMesh(true);
 
     bool hasChanged = topoChangeMap.valid();
@@ -170,8 +176,6 @@ bool Foam::rawTopoChangerFvMesh::update()
         //    << " no topology changes..." << endl;
     }
 
-    changing(hasChanged);
-
     return hasChanged;
 }
 
-- 
GitLab