From 70b12e0bd0e804d98b1c34fc8688529643ad2052 Mon Sep 17 00:00:00 2001
From: Mark Olesen <Mark.Olesen@esi-group.com>
Date: Fri, 26 Apr 2019 13:34:00 +0200
Subject: [PATCH] ENH: handle cellSet/cellZone updates in fvMeshSubsetProxy
 (#1294)

- now also track if the cellSet or cellZone has changed on point
  motion.
---
 .../fvMeshSubsetProxy/fvMeshSubsetProxy.C     | 43 +++++++++++++++----
 .../fvMeshSubsetProxy/fvMeshSubsetProxy.H     | 16 +++++--
 2 files changed, 47 insertions(+), 12 deletions(-)

diff --git a/src/dynamicMesh/fvMeshSubsetProxy/fvMeshSubsetProxy.C b/src/dynamicMesh/fvMeshSubsetProxy/fvMeshSubsetProxy.C
index 490cbceba35..740b6c584bb 100644
--- a/src/dynamicMesh/fvMeshSubsetProxy/fvMeshSubsetProxy.C
+++ b/src/dynamicMesh/fvMeshSubsetProxy/fvMeshSubsetProxy.C
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2016-2018 OpenCFD Ltd.
+    \\  /    A nd           | Copyright (C) 2016-2019 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -37,7 +37,8 @@ Foam::fvMeshSubsetProxy::fvMeshSubsetProxy(fvMesh& baseMesh)
     exposedPatchId_(-1),
     type_(NONE),
     name_(),
-    names_()
+    names_(),
+    selectedCells_()
 {
     if (useSubMesh())
     {
@@ -59,7 +60,8 @@ Foam::fvMeshSubsetProxy::fvMeshSubsetProxy
     exposedPatchId_(exposedPatchId),
     type_(selectionName.empty() ? NONE : type),
     name_(),
-    names_()
+    names_(),
+    selectedCells_()
 {
     if (type_ == ZONES)
     {
@@ -91,7 +93,8 @@ Foam::fvMeshSubsetProxy::fvMeshSubsetProxy
     exposedPatchId_(exposedPatchId),
     type_(ZONES),
     name_(),
-    names_(zoneNames)
+    names_(zoneNames),
+    selectedCells_()
 {
     if (useSubMesh())
     {
@@ -112,7 +115,8 @@ Foam::fvMeshSubsetProxy::fvMeshSubsetProxy
     exposedPatchId_(exposedPatchId),
     type_(ZONES),
     name_(),
-    names_(std::move(zoneNames))
+    names_(std::move(zoneNames)),
+    selectedCells_()
 {
     if (useSubMesh())
     {
@@ -123,12 +127,13 @@ Foam::fvMeshSubsetProxy::fvMeshSubsetProxy
 
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
-void Foam::fvMeshSubsetProxy::correct(bool verbose)
+bool Foam::fvMeshSubsetProxy::correct(bool verbose)
 {
     if (type_ == NONE)
     {
         subsetter_.clear();
-        return;
+        selectedCells_.clearStorage();
+        return false;
     }
 
     const label nCells = baseMesh_.nCells();
@@ -171,7 +176,18 @@ void Foam::fvMeshSubsetProxy::correct(bool verbose)
         selectedCells = baseMesh_.cellZones().selection(names_);
     }
 
-    subsetter_.setCellSubset(selectedCells, exposedPatchId_);
+
+    const bool changed = (selectedCells_ != selectedCells);
+
+    // Use as a cached value for next time
+    selectedCells_.transfer(selectedCells);
+
+    if (changed || selectedCells_.empty())
+    {
+        subsetter_.setCellSubset(selectedCells_, exposedPatchId_);
+    }
+
+    return returnReduce(changed, orOp<bool>());
 }
 
 
@@ -179,7 +195,16 @@ Foam::polyMesh::readUpdateState Foam::fvMeshSubsetProxy::readUpdate()
 {
     const polyMesh::readUpdateState meshState = baseMesh_.readUpdate();
 
-    if
+    if (meshState == polyMesh::POINTS_MOVED)
+    {
+        if (correct(true))
+        {
+            // The cellSet/cellZone changed on POINTS_MOVED,
+            // treat like TOPO_CHANGE
+            return polyMesh::TOPO_CHANGE;
+        }
+    }
+    else if
     (
         meshState == polyMesh::TOPO_CHANGE
      || meshState == polyMesh::TOPO_PATCH_CHANGE
diff --git a/src/dynamicMesh/fvMeshSubsetProxy/fvMeshSubsetProxy.H b/src/dynamicMesh/fvMeshSubsetProxy/fvMeshSubsetProxy.H
index 5d127b249db..e0403739107 100644
--- a/src/dynamicMesh/fvMeshSubsetProxy/fvMeshSubsetProxy.H
+++ b/src/dynamicMesh/fvMeshSubsetProxy/fvMeshSubsetProxy.H
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2016-2018 OpenCFD Ltd.
+    \\  /    A nd           | Copyright (C) 2016-2019 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
                             | Copyright (C) 2011-2016 OpenFOAM Foundation
@@ -91,6 +91,9 @@ private:
         //- Selection for multiple cell zones
         wordRes names_;
 
+        //- The (cached) cell selection
+        bitSet selectedCells_;
+
 
     // Private Member Functions
 
@@ -173,11 +176,18 @@ public:
             return name_;
         }
 
+        //- The current cell selection, when subsetting is active
+        inline const bitSet& selectedCells() const
+        {
+            return selectedCells_;
+        }
+
 
     // Edit
 
-        //- Update of mesh subset
-        void correct(bool verbose = false);
+        //- Update of mesh subset.
+        //  Return true if the subset changed from previous call.
+        bool correct(bool verbose = false);
 
         //- Read mesh. Correct on topo-change
         polyMesh::readUpdateState readUpdate();
-- 
GitLab