From 7a80ddc6e081afb9252c1f15339a95be0b6a7315 Mon Sep 17 00:00:00 2001
From: Mark Olesen <Mark.Olesen@esi-group.com>
Date: Thu, 7 Apr 2022 11:25:57 +0200
Subject: [PATCH] ENH: relocate/refactor fvMeshSubset

- direct construct and reset method for creating a zero-sized (dummy)
  subMesh. Has no exposed faces and no parallel synchronization
  required.

- core mapping (interpolate) functionality with direct handling
  of subsetting in fvMeshSubset (src/finiteVolume).
  Does not use dynamicMesh topology changes

- two-step subsetting as fvMeshSubsetter (src/dynamicMesh).
  Does use dynamicMesh topology changes.
  This is apparently only needed by the subsetMesh application itself.

DEFEATURE: remove deprecated setLargeCellSubset() method

- was deprecated JUL-2018, now removed (see issue #951)
---
 .../mesh/manipulation/subsetMesh/subsetMesh.C |  21 +-
 .../redistributePar/redistributePar.C         |   5 +-
 src/dynamicMesh/Make/files                    |   3 +-
 .../fvMeshDistribute/fvMeshDistribute.C       |   1 +
 .../fvMeshSubset/fvMeshSubsetter.C            | 201 +++++++
 .../fvMeshSubset/fvMeshSubsetter.H            | 144 +++++
 .../meshSubsetHelper.H                        |   0
 .../polyTopoChange/removeCells.C              |  15 +-
 .../polyTopoChange/removeCells.H              |  16 +-
 src/dynamicMesh/zoneSubSet/zoneSubSet.C       |   4 +-
 src/dynamicMesh/zoneSubSet/zoneSubSet.H       |   4 +-
 src/finiteVolume/Make/files                   |   3 +
 src/finiteVolume/Make/options                 |   4 +-
 .../fvMesh}/fvMeshSubset/fvMeshSubset.C       | 520 +++++++++---------
 .../fvMesh}/fvMeshSubset/fvMeshSubset.H       | 357 +++++-------
 .../fvMesh}/fvMeshSubset/fvMeshSubsetI.H      |  22 +-
 .../fvMesh/fvMeshSubset}/fvMeshSubsetProxy.C  |   2 +-
 .../fvMesh/fvMeshSubset}/fvMeshSubsetProxy.H  |   6 +-
 .../fvMeshSubsetProxyTemplates.C              |   0
 .../fvMeshSubset/fvMeshSubsetTemplates.C}     |  17 +-
 .../ensightWrite/ensightWriteUpdate.C         |   4 +-
 .../utilities/vtkWrite/vtkWriteUpdate.C       |   4 +-
 .../polyTopoChange/polyTopoChangeTemplates.C  |  34 +-
 src/renumber/renumberMethods/Make/options     |   2 -
 24 files changed, 828 insertions(+), 561 deletions(-)
 create mode 100644 src/dynamicMesh/fvMeshSubset/fvMeshSubsetter.C
 create mode 100644 src/dynamicMesh/fvMeshSubset/fvMeshSubsetter.H
 rename src/dynamicMesh/{fvMeshSubsetProxy => fvMeshSubset}/meshSubsetHelper.H (100%)
 rename src/{dynamicMesh => finiteVolume/fvMesh}/fvMeshSubset/fvMeshSubset.C (82%)
 rename src/{dynamicMesh => finiteVolume/fvMesh}/fvMeshSubset/fvMeshSubset.H (59%)
 rename src/{dynamicMesh => finiteVolume/fvMesh}/fvMeshSubset/fvMeshSubsetI.H (87%)
 rename src/{dynamicMesh/fvMeshSubsetProxy => finiteVolume/fvMesh/fvMeshSubset}/fvMeshSubsetProxy.C (98%)
 rename src/{dynamicMesh/fvMeshSubsetProxy => finiteVolume/fvMesh/fvMeshSubset}/fvMeshSubsetProxy.H (99%)
 rename src/{dynamicMesh/fvMeshSubsetProxy => finiteVolume/fvMesh/fvMeshSubset}/fvMeshSubsetProxyTemplates.C (100%)
 rename src/{dynamicMesh/fvMeshSubset/fvMeshSubsetInterpolate.C => finiteVolume/fvMesh/fvMeshSubset/fvMeshSubsetTemplates.C} (96%)

diff --git a/applications/utilities/mesh/manipulation/subsetMesh/subsetMesh.C b/applications/utilities/mesh/manipulation/subsetMesh/subsetMesh.C
index d09c36f7a46..e808e56ec21 100644
--- a/applications/utilities/mesh/manipulation/subsetMesh/subsetMesh.C
+++ b/applications/utilities/mesh/manipulation/subsetMesh/subsetMesh.C
@@ -6,7 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2011-2016 OpenFOAM Foundation
-    Copyright (C) 2016-2021 OpenCFD Ltd.
+    Copyright (C) 2016-2022 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -42,7 +42,7 @@ Description
 
 \*---------------------------------------------------------------------------*/
 
-#include "fvMeshSubset.H"
+#include "fvMeshSubsetter.H"  // Not fvMeshSubset (need two-step subsetting)
 #include "argList.H"
 #include "IOobjectList.H"
 #include "volFields.H"
@@ -517,8 +517,8 @@ int main(int argc, char *argv[])
     }
 
 
-    // Mesh subsetting engine
-    fvMeshSubset subsetter(mesh);
+    // Two-step mesh subsetting engine
+    fvMeshSubsetter subsetter(mesh);
 
     {
         bitSet selectedCells =
@@ -530,13 +530,8 @@ int main(int argc, char *argv[])
 
         if (exposedPatchIDs.size() == 1)
         {
-            // Single patch for exposed faces
-            subsetter.setCellSubset
-            (
-                selectedCells,
-                exposedPatchIDs.first(),
-                true
-            );
+            // Single patch for exposed faces (syncPar)
+            subsetter.reset(selectedCells, exposedPatchIDs.first(), true);
         }
         else
         {
@@ -545,7 +540,7 @@ int main(int argc, char *argv[])
 
             labelList exposedFaces
             (
-                subsetter.getExposedFaces(selectedCells, true)
+                subsetter.getExposedFaces(selectedCells, true)  // syncPar
             );
 
             subsetter.setCellSubset
@@ -553,7 +548,7 @@ int main(int argc, char *argv[])
                 selectedCells,
                 exposedFaces,
                 labelUIndList(nearestExposedPatch, exposedFaces)(),
-                true
+                true  // syncPar
             );
         }
 
diff --git a/applications/utilities/parallelProcessing/redistributePar/redistributePar.C b/applications/utilities/parallelProcessing/redistributePar/redistributePar.C
index 788cfc42524..c12f538ffe3 100644
--- a/applications/utilities/parallelProcessing/redistributePar/redistributePar.C
+++ b/applications/utilities/parallelProcessing/redistributePar/redistributePar.C
@@ -1031,10 +1031,7 @@ autoPtr<mapDistributePolyMesh> redistributeAndWrite
 
             // Subset 0 cells, no parallel comms.
             // This is used to create zero-sized fields.
-            subsetterPtr.reset
-            (
-                new fvMeshSubset(mesh, bitSet(), nonProcI, false)
-            );
+            subsetterPtr.reset(new fvMeshSubset(mesh, zero{}));
         }
 
 
diff --git a/src/dynamicMesh/Make/files b/src/dynamicMesh/Make/files
index 8a511222983..aaabab87124 100644
--- a/src/dynamicMesh/Make/files
+++ b/src/dynamicMesh/Make/files
@@ -86,8 +86,7 @@ polyMeshAdder/polyMeshAdder.C
 
 fvMeshTools/fvMeshTools.C
 
-fvMeshSubset/fvMeshSubset.C
-fvMeshSubsetProxy/fvMeshSubsetProxy.C
+fvMeshSubset/fvMeshSubsetter.C
 
 motionSmoother/motionSmoother.C
 motionSmoother/motionSmootherAlgo.C
diff --git a/src/dynamicMesh/fvMeshDistribute/fvMeshDistribute.C b/src/dynamicMesh/fvMeshDistribute/fvMeshDistribute.C
index 69c6c08313a..783971c731e 100644
--- a/src/dynamicMesh/fvMeshDistribute/fvMeshDistribute.C
+++ b/src/dynamicMesh/fvMeshDistribute/fvMeshDistribute.C
@@ -28,6 +28,7 @@ License
 
 #include "fvMeshDistribute.H"
 #include "fvMeshAdder.H"
+#include "fvMeshSubset.H"
 #include "faceCoupleInfo.H"
 #include "processorFvPatchField.H"
 #include "processorFvsPatchField.H"
diff --git a/src/dynamicMesh/fvMeshSubset/fvMeshSubsetter.C b/src/dynamicMesh/fvMeshSubset/fvMeshSubsetter.C
new file mode 100644
index 00000000000..0a98637c69c
--- /dev/null
+++ b/src/dynamicMesh/fvMeshSubset/fvMeshSubsetter.C
@@ -0,0 +1,201 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | www.openfoam.com
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+    Copyright (C) 2011-2017 OpenFOAM Foundation
+    Copyright (C) 2015-2022 OpenCFD Ltd.
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+#include "fvMeshSubsetter.H"
+#include "mapPolyMesh.H"
+#include "polyTopoChange.H"
+#include "removeCells.H"
+
+// * * * * * * * * * * * * * * * Local Functions * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+// Helper: extract cells-to-remove from cells-to-keep
+static bitSet invertCellSelection
+(
+    const label nCells,
+    const bitSet& selectedCells
+)
+{
+    // Work on a copy
+    bitSet cellsToRemove(selectedCells);
+
+    // Ensure we have the full range
+    cellsToRemove.resize(nCells, false);
+
+    // Invert the selection
+    cellsToRemove.flip();
+
+    return cellsToRemove;
+}
+
+
+// Helper: extract cells-to-remove from cells-to-keep
+static inline bitSet invertCellSelection
+(
+    const label nCells,
+    const label regioni,
+    const labelUList& regions
+)
+{
+    return BitSetOps::create
+    (
+        nCells,
+        regioni,
+        regions,
+        false  // on=false: invert return cells to remove
+    );
+}
+
+} // End namespace Foam
+
+
+// * * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * //
+
+void Foam::fvMeshSubsetter::removeCellsImpl
+(
+    const bitSet& cellsToRemove,
+    const labelList& exposedFaces,
+    const labelList& patchIDs,
+    const bool syncPar
+)
+{
+    // Clear out all existing maps
+    clear();
+
+    // Mesh changing engine.
+    polyTopoChange meshMod(baseMesh());
+
+    removeCells cellRemover(baseMesh(), syncPar);
+
+    cellRemover.setRefinement
+    (
+        cellsToRemove,
+        exposedFaces,
+        patchIDs,
+        meshMod
+    );
+
+    // Create mesh, return map from old to new mesh.
+    autoPtr<fvMesh> newMeshPtr;
+    autoPtr<mapPolyMesh> map = meshMod.makeMesh
+    (
+        newMeshPtr,
+        IOobject
+        (
+            baseMesh().name(),
+            baseMesh().time().timeName(),
+            baseMesh().time(),
+            IOobject::READ_IF_PRESENT,  // read fv* if present
+            IOobject::NO_WRITE
+        ),
+        baseMesh(),
+        syncPar
+    );
+
+    reset
+    (
+        std::move(newMeshPtr),
+        labelList(map().pointMap()),
+        labelList(map().faceMap()),
+        labelList(map().cellMap()),
+        identity(baseMesh().boundaryMesh().size())
+    );
+}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+Foam::labelList Foam::fvMeshSubsetter::getExposedFaces
+(
+    const bitSet& selectedCells,
+    const bool syncPar
+) const
+{
+    return
+        Foam::removeCells(baseMesh(), syncPar).getExposedFaces
+        (
+            invertCellSelection(baseMesh().nCells(), selectedCells)
+        );
+}
+
+
+Foam::labelList Foam::fvMeshSubsetter::getExposedFaces
+(
+    const label regioni,
+    const labelUList& regions,
+    const bool syncPar
+) const
+{
+    return
+        Foam::removeCells(baseMesh(), syncPar).getExposedFaces
+        (
+            invertCellSelection(baseMesh().nCells(), regioni, regions)
+        );
+}
+
+
+void Foam::fvMeshSubsetter::setCellSubset
+(
+    const bitSet& selectedCells,
+    const labelList& exposedFaces,
+    const labelList& patchIDs,
+    const bool syncPar
+)
+{
+    removeCellsImpl
+    (
+        invertCellSelection(baseMesh().nCells(), selectedCells),
+        exposedFaces,
+        patchIDs,
+        syncPar
+    );
+}
+
+
+void Foam::fvMeshSubsetter::setCellSubset
+(
+    const label regioni,
+    const labelList& regions,
+    const labelList& exposedFaces,
+    const labelList& patchIDs,
+    const bool syncCouples
+)
+{
+    removeCellsImpl
+    (
+        invertCellSelection(baseMesh().nCells(), regioni, regions),
+        exposedFaces,
+        patchIDs,
+        syncCouples
+    );
+}
+
+
+// ************************************************************************* //
diff --git a/src/dynamicMesh/fvMeshSubset/fvMeshSubsetter.H b/src/dynamicMesh/fvMeshSubset/fvMeshSubsetter.H
new file mode 100644
index 00000000000..e4c34a6360f
--- /dev/null
+++ b/src/dynamicMesh/fvMeshSubset/fvMeshSubsetter.H
@@ -0,0 +1,144 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | www.openfoam.com
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+    Copyright (C) 2011-2017 OpenFOAM Foundation
+    Copyright (C) 2016-2022 OpenCFD Ltd.
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+Class
+    Foam::fvMeshSubsetter
+
+Description
+    Extends Foam::fvMeshSubset with two-step subsetting
+    (uses polyTopoChange modification).
+
+SourceFiles
+    fvMeshSubsetter.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef Foam_fvMeshSubsetter_H
+#define Foam_fvMeshSubsetter_H
+
+#include "fvMeshSubset.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+/*---------------------------------------------------------------------------*\
+                       Class fvMeshSubsetter Declaration
+\*---------------------------------------------------------------------------*/
+
+class fvMeshSubsetter
+:
+    public fvMeshSubset
+{
+    // Private Member Functions
+
+        //- Forwarding to Foam::removeCells
+        void removeCellsImpl
+        (
+            const bitSet& cellsToRemove,
+            const labelList& exposedFaces,
+            const labelList& patchIDs,
+            const bool syncPar
+        );
+
+        //- No copy construct
+        fvMeshSubsetter(const fvMeshSubsetter&) = delete;
+
+        //- No copy assignment
+        void operator=(const fvMeshSubset&) = delete;
+
+public:
+
+    // Constructors
+
+        //- Inherit constructors from fvMeshSubset
+        using fvMeshSubset::fvMeshSubset;
+
+
+    // Member Functions
+
+        //- Inherit all one-step subsetting
+        using fvMeshSubset::setCellSubset;
+
+
+    // Two-step subsetting
+
+        //- Get labels of exposed faces.
+        //  These are
+        //  - internal faces that become boundary faces
+        //  - coupled faces that become uncoupled (since one of the
+        //    sides gets deleted)
+        labelList getExposedFaces
+        (
+            const bitSet& selectedCells,
+            const bool syncPar = true
+        ) const;
+
+        //- Get labels of exposed faces.
+        //  These are
+        //  - internal faces that become boundary faces
+        //  - coupled faces that become uncoupled (since one of the
+        //    sides gets deleted)
+        labelList getExposedFaces
+        (
+            const label regioni,
+            const labelUList& regions,
+            const bool syncPar = true
+        ) const;
+
+        //- For every exposed face (from above getExposedFaces)
+        //  Uses supplied (existing!) patches
+        void setCellSubset
+        (
+            const bitSet& selectedCells,
+            const labelList& exposedFaces,
+            const labelList& patchIDs,
+            const bool syncPar = true
+        );
+
+        //- For every exposed face (from above getExposedFaces)
+        //  Uses supplied (existing!) patches
+        void setCellSubset
+        (
+            const label regioni,
+            const labelList& regions,
+            const labelList& exposedFaces,
+            const labelList& patchIDs,
+            const bool syncPar = true
+        );
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/dynamicMesh/fvMeshSubsetProxy/meshSubsetHelper.H b/src/dynamicMesh/fvMeshSubset/meshSubsetHelper.H
similarity index 100%
rename from src/dynamicMesh/fvMeshSubsetProxy/meshSubsetHelper.H
rename to src/dynamicMesh/fvMeshSubset/meshSubsetHelper.H
diff --git a/src/dynamicMesh/polyTopoChange/polyTopoChange/removeCells.C b/src/dynamicMesh/polyTopoChange/polyTopoChange/removeCells.C
index 10a2d14638a..8be969216cc 100644
--- a/src/dynamicMesh/polyTopoChange/polyTopoChange/removeCells.C
+++ b/src/dynamicMesh/polyTopoChange/polyTopoChange/removeCells.C
@@ -71,20 +71,7 @@ inline void decrCount(const Foam::labelUList& list, Foam::labelList& counter)
 
 // * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
 
-Foam::removeCells::removeCells
-(
-    const polyMesh& mesh
-)
-:
-    removeCells(mesh, true)
-{}
-
-
-Foam::removeCells::removeCells
-(
-    const polyMesh& mesh,
-    const bool syncPar
-)
+Foam::removeCells::removeCells(const polyMesh& mesh, const bool syncPar)
 :
     mesh_(mesh),
     syncPar_(syncPar)
diff --git a/src/dynamicMesh/polyTopoChange/polyTopoChange/removeCells.H b/src/dynamicMesh/polyTopoChange/polyTopoChange/removeCells.H
index e3d0ec431e3..d3a3bb0cc2d 100644
--- a/src/dynamicMesh/polyTopoChange/polyTopoChange/removeCells.H
+++ b/src/dynamicMesh/polyTopoChange/polyTopoChange/removeCells.H
@@ -6,7 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2011 OpenFOAM Foundation
-    Copyright (C) 2018 OpenCFD Ltd.
+    Copyright (C) 2018-2022 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -40,8 +40,8 @@ SourceFiles
 
 \*---------------------------------------------------------------------------*/
 
-#ifndef removeCells_H
-#define removeCells_H
+#ifndef Foam_removeCells_H
+#define Foam_removeCells_H
 
 #include "labelList.H"
 #include "typeInfo.H"
@@ -63,7 +63,7 @@ class mapPolyMesh;
 
 class removeCells
 {
-    // Private data
+    // Private Data
 
         //- Reference to mesh
         const polyMesh& mesh_;
@@ -71,6 +71,7 @@ class removeCells
         //- Whether or not to synchronize parallel case.
         const bool syncPar_;
 
+
 public:
 
     //- Runtime type information
@@ -79,11 +80,8 @@ public:
 
     // Constructors
 
-        //- Construct from mesh. With parallel synchronization.
-        explicit removeCells(const polyMesh& mesh);
-
-        //- Construct from mesh, optionally with parallel synchronization.
-        removeCells(const polyMesh& mesh, const bool syncPar);
+        //- Construct from mesh. Parallel synchronized by default
+        explicit removeCells(const polyMesh& mesh, const bool syncPar = true);
 
 
     //- Destructor
diff --git a/src/dynamicMesh/zoneSubSet/zoneSubSet.C b/src/dynamicMesh/zoneSubSet/zoneSubSet.C
index 34b60e6c2d1..2aaa14fea61 100644
--- a/src/dynamicMesh/zoneSubSet/zoneSubSet.C
+++ b/src/dynamicMesh/zoneSubSet/zoneSubSet.C
@@ -5,7 +5,7 @@
     \\  /    A nd           | www.openfoam.com
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
-    Copyright (C) 2021 OpenCFD Ltd.
+    Copyright (C) 2021-2022 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -95,7 +95,7 @@ bool Foam::Detail::zoneSubSet::correct()
             << endl;
     }
 
-    subsetter_.setCellSubset(selectedCells.addressing());
+    subsetter_.reset(selectedCells.addressing());
 
     return true;
 }
diff --git a/src/dynamicMesh/zoneSubSet/zoneSubSet.H b/src/dynamicMesh/zoneSubSet/zoneSubSet.H
index 6a87af2025e..438fd85df72 100644
--- a/src/dynamicMesh/zoneSubSet/zoneSubSet.H
+++ b/src/dynamicMesh/zoneSubSet/zoneSubSet.H
@@ -62,8 +62,8 @@ SourceFiles
 
 \*---------------------------------------------------------------------------*/
 
-#ifndef zoneSubSet_H
-#define zoneSubSet_H
+#ifndef Foam_zoneSubSet_H
+#define Foam_zoneSubSet_H
 
 #include "fvMeshSubset.H"
 
diff --git a/src/finiteVolume/Make/files b/src/finiteVolume/Make/files
index 93d591a8924..a27e5e4be2b 100644
--- a/src/finiteVolume/Make/files
+++ b/src/finiteVolume/Make/files
@@ -12,6 +12,9 @@ $(fvGeometryScheme)/stabilised/stabilisedFvGeometryScheme.C
 surfaceInterpolation = interpolation/surfaceInterpolation
 $(surfaceInterpolation)/surfaceInterpolation/surfaceInterpolation.C
 
+fvMesh/fvMeshSubset/fvMeshSubset.C
+fvMesh/fvMeshSubset/fvMeshSubsetProxy.C
+
 fvMesh/singleCellFvMesh/singleCellFvMesh.C
 
 fvMesh/simplifiedFvMesh/simplifiedFvMesh/simplifiedFvMesh.C
diff --git a/src/finiteVolume/Make/options b/src/finiteVolume/Make/options
index 0927690c0d2..851f94b6b39 100644
--- a/src/finiteVolume/Make/options
+++ b/src/finiteVolume/Make/options
@@ -1,12 +1,10 @@
 EXE_INC = \
     -I$(LIB_SRC)/fileFormats/lnInclude \
     -I$(LIB_SRC)/surfMesh/lnInclude \
-    -I$(LIB_SRC)/meshTools/lnInclude \
-    -I$(LIB_SRC)/dynamicMesh/lnInclude
+    -I$(LIB_SRC)/meshTools/lnInclude
 
 LIB_LIBS = \
     -lOpenFOAM \
     -lfileFormats \
     -lsurfMesh \
     -lmeshTools
-
diff --git a/src/dynamicMesh/fvMeshSubset/fvMeshSubset.C b/src/finiteVolume/fvMesh/fvMeshSubset/fvMeshSubset.C
similarity index 82%
rename from src/dynamicMesh/fvMeshSubset/fvMeshSubset.C
rename to src/finiteVolume/fvMesh/fvMeshSubset/fvMeshSubset.C
index a60e2055214..2466022c828 100644
--- a/src/dynamicMesh/fvMeshSubset/fvMeshSubset.C
+++ b/src/finiteVolume/fvMesh/fvMeshSubset/fvMeshSubset.C
@@ -27,15 +27,15 @@ License
 \*---------------------------------------------------------------------------*/
 
 #include "fvMeshSubset.H"
-#include "boolList.H"
 #include "BitOps.H"
-#include "pointIndList.H"
 #include "Pstream.H"
-#include "emptyPolyPatch.H"
 #include "cyclicPolyPatch.H"
-#include "removeCells.H"
-#include "polyTopoChange.H"
-#include "mapPolyMesh.H"
+#include "emptyPolyPatch.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+Foam::word Foam::fvMeshSubset::exposedPatchName("oldInternalFaces");
+
 
 // * * * * * * * * * * * * * * * Local Functions * * * * * * * * * * * * * * //
 
@@ -58,20 +58,63 @@ inline void markUsed
 } // End anonymous namespace
 
 
-// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+namespace Foam
+{
 
-Foam::word Foam::fvMeshSubset::exposedPatchName("oldInternalFaces");
+// Perform a subset of a subset
+static labelList subsetSubset
+(
+    const label nElems,
+    const labelUList& selectedElements, // First subset
+    const labelUList& subsetMap         // Subset within first subset
+)
+{
+    if (selectedElements.empty() || subsetMap.empty())
+    {
+        // Trivial case
+        return labelList();
+    }
+
+    // Mark selected elements.
+    const bitSet selected(nElems, selectedElements);
+
+    // Count subset of selected elements
+    label n = 0;
+    forAll(subsetMap, i)
+    {
+        if (selected[subsetMap[i]])
+        {
+            ++n;
+        }
+    }
+
+    // Collect selected elements
+    labelList subsettedElements(n);
+    n = 0;
+
+    forAll(subsetMap, i)
+    {
+        if (selected[subsetMap[i]])
+        {
+            subsettedElements[n] = i;
+            ++n;
+        }
+    }
+
+    return subsettedElements;
+}
 
+} // End namespace Foam
 
-// * * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * //
 
-bool Foam::fvMeshSubset::checkCellSubset() const
+// * * * * * * * * * * * * Protected Member Functions  * * * * * * * * * * * //
+
+bool Foam::fvMeshSubset::checkHasSubMesh() const
 {
-    if (!fvMeshSubsetPtr_)
+    if (!subMeshPtr_)
     {
         FatalErrorInFunction
-            << "setCellSubset()" << nl
-            << "before attempting to access subset data"
+            << "Mesh is not subsetted!" << nl
             << abort(FatalError);
 
         return false;
@@ -118,7 +161,7 @@ void Foam::fvMeshSubset::calcFaceFlipMap() const
 void Foam::fvMeshSubset::doCoupledPatches
 (
     const bool syncPar,
-    labelList& nCellsUsingFace
+    labelUList& nCellsUsingFace
 ) const
 {
     // Synchronize facesToSubset on both sides of coupled patches.
@@ -186,8 +229,8 @@ void Foam::fvMeshSubset::doCoupledPatches
                          && nbrCellsUsingFace[i] == 0
                         )
                         {
-                            // Face's neighbour is no longer there. Mark face
-                            // off as coupled
+                            // Face's neighbour is no longer there.
+                            // Mark face off as coupled
                             nCellsUsingFace[pp.start()+i] = 3;
                             ++nUncoupled;
                         }
@@ -229,7 +272,7 @@ void Foam::fvMeshSubset::doCoupledPatches
         reduce(nUncoupled, sumOp<label>());
     }
 
-    if (nUncoupled > 0)
+    if (nUncoupled)
     {
         Info<< "Uncoupled " << nUncoupled << " faces on coupled patches. "
             << "(processorPolyPatch, cyclicPolyPatch)" << endl;
@@ -237,107 +280,32 @@ void Foam::fvMeshSubset::doCoupledPatches
 }
 
 
-void Foam::fvMeshSubset::removeCellsImpl
-(
-    const bitSet& cellsToRemove,
-    const labelList& exposedFaces,
-    const labelList& patchIDs,
-    const bool syncCouples
-)
-{
-    // Mesh changing engine.
-    polyTopoChange meshMod(baseMesh());
-
-    removeCells cellRemover(baseMesh(), syncCouples);
-
-    cellRemover.setRefinement
-    (
-        cellsToRemove,
-        exposedFaces,
-        patchIDs,
-        meshMod
-    );
-
-    // Create mesh, return map from old to new mesh.
-    autoPtr<mapPolyMesh> map = meshMod.makeMesh
-    (
-        fvMeshSubsetPtr_,
-        IOobject
-        (
-            baseMesh().name(),
-            baseMesh().time().timeName(),
-            baseMesh().time(),
-            IOobject::READ_IF_PRESENT,  // read fv* if present
-            IOobject::NO_WRITE
-        ),
-        baseMesh(),
-        syncCouples
-    );
-
-    pointMap_ = map().pointMap();
-    faceMap_ = map().faceMap();
-    cellMap_ = map().cellMap();
-    patchMap_ = identity(baseMesh().boundaryMesh().size());
-}
-
-
-Foam::labelList Foam::fvMeshSubset::subsetSubset
-(
-    const label nElems,
-    const labelUList& selectedElements,
-    const labelUList& subsetMap
-)
-{
-    // Mark selected elements.
-    const bitSet selected(nElems, selectedElements);
-
-    // Count subset of selected elements
-    label n = 0;
-    forAll(subsetMap, i)
-    {
-        if (selected[subsetMap[i]])
-        {
-            ++n;
-        }
-    }
-
-    // Collect selected elements
-    labelList subsettedElements(n);
-    n = 0;
-
-    forAll(subsetMap, i)
-    {
-        if (selected[subsetMap[i]])
-        {
-            subsettedElements[n] = i;
-            ++n;
-        }
-    }
-
-    return subsettedElements;
-}
-
-
 void Foam::fvMeshSubset::subsetZones()
 {
     // Keep all zones, even if zero size.
 
+    #ifdef FULLDEBUG
+    checkHasSubMesh();
+    #endif
+
+    auto& newSubMesh = subMeshPtr_();
+
     // PointZones
 
     const pointZoneMesh& pointZones = baseMesh().pointZones();
 
-    List<pointZone*> pZonePtrs(pointZones.size());
+    List<pointZone*> pZones(pointZones.size());
 
     forAll(pointZones, zonei)
     {
         const pointZone& pz = pointZones[zonei];
 
-        pZonePtrs[zonei] = new pointZone
+        pZones[zonei] = new pointZone
         (
             pz.name(),
             subsetSubset(baseMesh().nPoints(), pz, pointMap()),
             zonei,
-            fvMeshSubsetPtr_().pointZones()
+            newSubMesh.pointZones()
         );
     }
 
@@ -348,7 +316,7 @@ void Foam::fvMeshSubset::subsetZones()
 
     const faceZoneMesh& faceZones = baseMesh().faceZones();
 
-    List<faceZone*> fZonePtrs(faceZones.size());
+    List<faceZone*> fZones(faceZones.size());
 
     forAll(faceZones, zonei)
     {
@@ -361,14 +329,7 @@ void Foam::fvMeshSubset::subsetZones()
         labelList zone(baseMesh().nFaces(), Zero);
         forAll(fz, j)
         {
-            if (fz.flipMap()[j])
-            {
-                zone[fz[j]] = 1;
-            }
-            else
-            {
-                zone[fz[j]] = -1;
-            }
+            zone[fz[j]] = (fz.flipMap()[j] ? 1 : -1);
         }
 
         // Select faces
@@ -400,72 +361,38 @@ void Foam::fvMeshSubset::subsetZones()
             }
         }
 
-        fZonePtrs[zonei] = new faceZone
+        fZones[zonei] = new faceZone
         (
             fz.name(),
             subAddressing,
             subFlipStatus,
             zonei,
-            fvMeshSubsetPtr_().faceZones()
+            newSubMesh.faceZones()
         );
     }
 
+
     // Cell Zones
 
     const cellZoneMesh& cellZones = baseMesh().cellZones();
 
-    List<cellZone*> cZonePtrs(cellZones.size());
+    List<cellZone*> cZones(cellZones.size());
 
     forAll(cellZones, zonei)
     {
         const cellZone& cz = cellZones[zonei];
 
-        cZonePtrs[zonei] = new cellZone
+        cZones[zonei] = new cellZone
         (
             cz.name(),
             subsetSubset(baseMesh().nCells(), cz, cellMap()),
             zonei,
-            fvMeshSubsetPtr_().cellZones()
+            newSubMesh.cellZones()
         );
     }
 
-
     // Add the zones
-    fvMeshSubsetPtr_().addZones(pZonePtrs, fZonePtrs, cZonePtrs);
-}
-
-
-Foam::bitSet Foam::fvMeshSubset::getCellsToRemove
-(
-    const bitSet& selectedCells
-) const
-{
-    // Work on a copy
-    bitSet cellsToRemove(selectedCells);
-
-    // Ensure we have the full range
-    cellsToRemove.resize(baseMesh().nCells(), false);
-
-    // Invert the selection
-    cellsToRemove.flip();
-
-    return cellsToRemove;
-}
-
-
-Foam::bitSet Foam::fvMeshSubset::getCellsToRemove
-(
-    const label regioni,
-    const labelUList& regions
-) const
-{
-    return BitSetOps::create
-    (
-        baseMesh().nCells(),
-        regioni,
-        regions,
-        false  // on=false: invert return cells to remove
-    );
+    newSubMesh.addZones(pZones, fZones, cZones);
 }
 
 
@@ -474,7 +401,7 @@ Foam::bitSet Foam::fvMeshSubset::getCellsToRemove
 Foam::fvMeshSubset::fvMeshSubset(const fvMesh& baseMesh)
 :
     baseMesh_(baseMesh),
-    fvMeshSubsetPtr_(nullptr),
+    subMeshPtr_(nullptr),
     faceFlipMapPtr_(nullptr),
     pointMap_(),
     faceMap_(),
@@ -483,45 +410,53 @@ Foam::fvMeshSubset::fvMeshSubset(const fvMesh& baseMesh)
 {}
 
 
+Foam::fvMeshSubset::fvMeshSubset(const fvMesh& baseMesh, const Foam::zero)
+:
+    fvMeshSubset(baseMesh)
+{
+    reset(Foam::zero{});
+}
+
+
 Foam::fvMeshSubset::fvMeshSubset
 (
     const fvMesh& baseMesh,
     const bitSet& selectedCells,
     const label patchID,
-    const bool syncCouples
+    const bool syncPar
 )
 :
     fvMeshSubset(baseMesh)
 {
-    setCellSubset(selectedCells, patchID, syncCouples);
+    reset(selectedCells, patchID, syncPar);
 }
 
 
 Foam::fvMeshSubset::fvMeshSubset
 (
     const fvMesh& baseMesh,
-    const labelHashSet& selectedCells,
+    const labelUList& selectedCells,
     const label patchID,
-    const bool syncCouples
+    const bool syncPar
 )
 :
     fvMeshSubset(baseMesh)
 {
-    setCellSubset(selectedCells, patchID, syncCouples);
+    reset(selectedCells, patchID, syncPar);
 }
 
 
 Foam::fvMeshSubset::fvMeshSubset
 (
     const fvMesh& baseMesh,
-    const labelUList& selectedCells,
+    const labelHashSet& selectedCells,
     const label patchID,
-    const bool syncCouples
+    const bool syncPar
 )
 :
     fvMeshSubset(baseMesh)
 {
-    setCellSubset(selectedCells, patchID, syncCouples);
+    reset(selectedCells, patchID, syncPar);
 }
 
 
@@ -531,12 +466,12 @@ Foam::fvMeshSubset::fvMeshSubset
     const label regioni,
     const labelUList& regions,
     const label patchID,
-    const bool syncCouples
+    const bool syncPar
 )
 :
     fvMeshSubset(baseMesh)
 {
-    setCellSubset(regioni, regions, patchID, syncCouples);
+    reset(regioni, regions, patchID, syncPar);
 }
 
 
@@ -544,7 +479,7 @@ Foam::fvMeshSubset::fvMeshSubset
 
 void Foam::fvMeshSubset::clear()
 {
-    fvMeshSubsetPtr_.reset(nullptr);
+    subMeshPtr_.reset(nullptr);
     faceFlipMapPtr_.reset(nullptr);
 
     pointMap_.clear();
@@ -554,13 +489,104 @@ void Foam::fvMeshSubset::clear()
 }
 
 
-void Foam::fvMeshSubset::setCellSubset
+void Foam::fvMeshSubset::reset()
+{
+    clear();
+}
+
+
+void Foam::fvMeshSubset::reset
+(
+    autoPtr<fvMesh>&& subMeshPtr,
+    labelList&& pointMap,
+    labelList&& faceMap,
+    labelList&& cellMap,
+    labelList&& patchMap
+)
+{
+    subMeshPtr_.reset(std::move(subMeshPtr));
+    faceFlipMapPtr_.reset(nullptr);
+
+    pointMap_ = std::move(pointMap);
+    faceMap_ = std::move(faceMap);
+    cellMap_ = std::move(cellMap);
+    patchMap_ = std::move(patchMap);
+
+    // Sanity
+    if (!subMeshPtr_)
+    {
+        clear();
+    }
+}
+
+
+void Foam::fvMeshSubset::reset(const Foam::zero)
+{
+    clear();
+
+    // Create zero-sized subMesh
+    subMeshPtr_.reset
+    (
+        new fvMesh
+        (
+            IOobject
+            (
+                baseMesh_.name(),
+                baseMesh_.time().timeName(),
+                baseMesh_.time(),
+                IOobject::READ_IF_PRESENT,  // Read fv* if present
+                IOobject::NO_WRITE
+            ),
+            Foam::zero{}                    // zero-sized
+            // Uses syncPar (bounds) - should generally be OK
+        )
+    );
+    auto& newSubMesh = subMeshPtr_();
+
+
+    // Clone non-processor patches
+    {
+        const polyBoundaryMesh& oldBoundary = baseMesh_.boundaryMesh();
+        const polyBoundaryMesh& newBoundary = newSubMesh.boundaryMesh();
+
+        polyPatchList newPatches(oldBoundary.nNonProcessor());
+
+        patchMap_ = identity(newPatches.size());
+
+        forAll(newPatches, patchi)
+        {
+            newPatches.set
+            (
+                patchi,
+                oldBoundary[patchi].clone
+                (
+                    newBoundary,
+                    patchi,
+                    0,  // patch size
+                    0   // patch start
+                )
+            );
+        }
+
+        newSubMesh.addFvPatches(newPatches);
+    }
+
+
+    // Add the zones
+    subsetZones();
+}
+
+
+void Foam::fvMeshSubset::reset
 (
     const bitSet& selectedCells,
     const label patchID,
     const bool syncPar
 )
 {
+    // Clear all old maps and pointers
+    clear();
+
     const cellList& oldCells = baseMesh().cells();
     const faceList& oldFaces = baseMesh().faces();
     const pointField& oldPoints = baseMesh().points();
@@ -587,9 +613,6 @@ void Foam::fvMeshSubset::setCellSubset
             << abort(FatalError);
     }
 
-    // Clear all old maps and pointers
-    clear();
-
     // The selected cells - sorted in ascending order
     cellMap_ = selectedCells.sortedToc();
 
@@ -623,6 +646,7 @@ void Foam::fvMeshSubset::setCellSubset
     labelList nCellsUsingFace(oldFaces.size(), Zero);
 
     label nFacesInSet = 0;
+
     forAll(oldFaces, oldFacei)
     {
         bool faceUsed = false;
@@ -648,7 +672,7 @@ void Foam::fvMeshSubset::setCellSubset
             ++nFacesInSet;
         }
     }
-    faceMap_.setSize(nFacesInSet);
+    faceMap_.resize(nFacesInSet);
 
     // Handle coupled faces. Modifies patch faces to be uncoupled to 3.
     doCoupledPatches(syncPar, nCellsUsingFace);
@@ -878,7 +902,7 @@ void Foam::fvMeshSubset::setCellSubset
     //
     // Create new points
     //
-    pointField newPoints(pointUIndList(oldPoints, pointMap_));
+    pointField newPoints(oldPoints, pointMap_);
 
 
     //
@@ -972,7 +996,7 @@ void Foam::fvMeshSubset::setCellSubset
     // surfaceInterpolation cannot find its fvSchemes.
     // It will try to read, for example.  "system/region0SubSet/fvSchemes"
     //
-    fvMeshSubsetPtr_ = autoPtr<fvMesh>::New
+    subMeshPtr_ = autoPtr<fvMesh>::New
     (
         IOobject
         (
@@ -991,8 +1015,8 @@ void Foam::fvMeshSubset::setCellSubset
 
 
     // Add old patches
-    List<polyPatch*> newBoundary(nbSize);
-    patchMap_.setSize(nbSize);
+    polyPatchList newBoundary(nbSize);
+    patchMap_.resize(nbSize);
     label nNewPatches = 0;
     label patchStart = nInternalFaces;
 
@@ -1065,24 +1089,32 @@ void Foam::fvMeshSubset::setCellSubset
                 map[patchFacei] = oldPatches[oldPatchi].whichFace(oldFacei);
             }
 
-            newBoundary[nNewPatches] = oldPatches[oldPatchi].clone
+            newBoundary.set
             (
-                fvMeshSubsetPtr_().boundaryMesh(),
                 nNewPatches,
-                map,
-                patchStart
-            ).ptr();
+                oldPatches[oldPatchi].clone
+                (
+                    subMeshPtr_().boundaryMesh(),
+                    nNewPatches,
+                    map,
+                    patchStart
+                )
+            );
         }
         else
         {
             // Clone (even if 0 size)
-            newBoundary[nNewPatches] = oldPatches[oldPatchi].clone
+            newBoundary.set
             (
-                fvMeshSubsetPtr_().boundaryMesh(),
                 nNewPatches,
-                newSize,
-                patchStart
-            ).ptr();
+                oldPatches[oldPatchi].clone
+                (
+                    subMeshPtr_().boundaryMesh(),
+                    nNewPatches,
+                    newSize,
+                    patchStart
+                )
+            );
         }
 
         patchStart += newSize;
@@ -1104,14 +1136,18 @@ void Foam::fvMeshSubset::setCellSubset
         // Newly created patch so is at end. Check if any faces in it.
         if (oldInternalSize > 0)
         {
-            newBoundary[nNewPatches] = new emptyPolyPatch
+            newBoundary.set
             (
-                exposedPatchName,
-                boundaryPatchSizes[oldInternalPatchID],
-                patchStart,
                 nNewPatches,
-                fvMeshSubsetPtr_().boundaryMesh(),
-                emptyPolyPatch::typeName
+                new emptyPolyPatch
+                (
+                    exposedPatchName,
+                    boundaryPatchSizes[oldInternalPatchID],
+                    patchStart,
+                    nNewPatches,
+                    subMeshPtr_().boundaryMesh(),
+                    emptyPolyPatch::typeName
+                )
             );
 
             //Pout<< "    " << exposedPatchName << " : "
@@ -1148,24 +1184,32 @@ void Foam::fvMeshSubset::setCellSubset
                 map[patchFacei] = oldPatches[oldPatchi].whichFace(oldFacei);
             }
 
-            newBoundary[nNewPatches] = oldPatches[oldPatchi].clone
+            newBoundary.set
             (
-                fvMeshSubsetPtr_().boundaryMesh(),
                 nNewPatches,
-                map,
-                patchStart
-            ).ptr();
+                oldPatches[oldPatchi].clone
+                (
+                    subMeshPtr_().boundaryMesh(),
+                    nNewPatches,
+                    map,
+                    patchStart
+                )
+            );
         }
         else
         {
             // Patch still exists. Add it
-            newBoundary[nNewPatches] = oldPatches[oldPatchi].clone
+            newBoundary.set
             (
-                fvMeshSubsetPtr_().boundaryMesh(),
                 nNewPatches,
-                newSize,
-                patchStart
-            ).ptr();
+                oldPatches[oldPatchi].clone
+                (
+                    subMeshPtr_().boundaryMesh(),
+                    nNewPatches,
+                    newSize,
+                    patchStart
+                )
+            );
         }
 
         //Pout<< "    " << oldPatches[oldPatchi].name() << " : "
@@ -1178,26 +1222,26 @@ void Foam::fvMeshSubset::setCellSubset
 
 
     // Reset the patch lists
-    newBoundary.setSize(nNewPatches);
-    patchMap_.setSize(nNewPatches);
+    newBoundary.resize(nNewPatches);
+    patchMap_.resize(nNewPatches);
 
 
     // Add the fvPatches
-    fvMeshSubsetPtr_().addFvPatches(newBoundary, syncPar);
+    subMeshPtr_().addFvPatches(newBoundary, syncPar);
 
     // Subset and add any zones
     subsetZones();
 }
 
 
-void Foam::fvMeshSubset::setCellSubset
+void Foam::fvMeshSubset::reset
 (
     const labelUList& selectedCells,
     const label patchID,
     const bool syncPar
 )
 {
-    setCellSubset
+    reset
     (
         BitSetOps::create(baseMesh().nCells(), selectedCells),
         patchID,
@@ -1206,14 +1250,14 @@ void Foam::fvMeshSubset::setCellSubset
 }
 
 
-void Foam::fvMeshSubset::setCellSubset
+void Foam::fvMeshSubset::reset
 (
     const labelHashSet& selectedCells,
     const label patchID,
     const bool syncPar
 )
 {
-    setCellSubset
+    reset
     (
         BitSetOps::create(baseMesh().nCells(), selectedCells),
         patchID,
@@ -1222,7 +1266,7 @@ void Foam::fvMeshSubset::setCellSubset
 }
 
 
-void Foam::fvMeshSubset::setCellSubset
+void Foam::fvMeshSubset::reset
 (
     const label regioni,
     const labelUList& regions,
@@ -1230,7 +1274,7 @@ void Foam::fvMeshSubset::setCellSubset
     const bool syncPar
 )
 {
-    setCellSubset
+    reset
     (
         BitSetOps::create(baseMesh().nCells(), regioni, regions),
         patchID,
@@ -1239,66 +1283,4 @@ void Foam::fvMeshSubset::setCellSubset
 }
 
 
-Foam::labelList Foam::fvMeshSubset::getExposedFaces
-(
-    const bitSet& selectedCells,
-    const bool syncCouples
-) const
-{
-    return
-        removeCells(baseMesh(), syncCouples)
-       .getExposedFaces(getCellsToRemove(selectedCells));
-}
-
-
-Foam::labelList Foam::fvMeshSubset::getExposedFaces
-(
-    const label regioni,
-    const labelUList& regions,
-    const bool syncCouples
-) const
-{
-    return
-        removeCells(baseMesh(), syncCouples)
-       .getExposedFaces(getCellsToRemove(regioni, regions));
-}
-
-
-void Foam::fvMeshSubset::setCellSubset
-(
-    const bitSet& selectedCells,
-    const labelList& exposedFaces,
-    const labelList& patchIDs,
-    const bool syncCouples
-)
-{
-    removeCellsImpl
-    (
-        getCellsToRemove(selectedCells),
-        exposedFaces,
-        patchIDs,
-        syncCouples
-    );
-}
-
-
-void Foam::fvMeshSubset::setCellSubset
-(
-    const label selectRegion,
-    const labelList& regions,
-    const labelList& exposedFaces,
-    const labelList& patchIDs,
-    const bool syncCouples
-)
-{
-    removeCellsImpl
-    (
-        getCellsToRemove(selectRegion, regions),
-        exposedFaces,
-        patchIDs,
-        syncCouples
-    );
-}
-
-
 // ************************************************************************* //
diff --git a/src/dynamicMesh/fvMeshSubset/fvMeshSubset.H b/src/finiteVolume/fvMesh/fvMeshSubset/fvMeshSubset.H
similarity index 59%
rename from src/dynamicMesh/fvMeshSubset/fvMeshSubset.H
rename to src/finiteVolume/fvMesh/fvMeshSubset/fvMeshSubset.H
index 9ae47a8cde7..bedb48e4434 100644
--- a/src/dynamicMesh/fvMeshSubset/fvMeshSubset.H
+++ b/src/finiteVolume/fvMesh/fvMeshSubset/fvMeshSubset.H
@@ -6,7 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2011-2017 OpenFOAM Foundation
-    Copyright (C) 2016-2020 OpenCFD Ltd.
+    Copyright (C) 2016-2022 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -28,19 +28,23 @@ Class
     Foam::fvMeshSubset
 
 Description
-    Given the original mesh and the list of selected cells, it creates the
-    mesh consisting only of the desired cells, with the mapping list for
-    points, faces, and cells.
+    Holds a reference to the original mesh (the baseMesh)
+    and optionally to a subset of that mesh (the subMesh)
+    with mapping lists for points, faces, and cells.
 
-    Puts all exposed internal faces into either
+    Can be constructed or reset to subset on the list of selected cells,
+    which it creates as subMesh consisting only of the desired cells,
+    with the mapping list for points, faces, and cells.
+
+    Places all exposed internal faces into either
     - a user supplied patch
     - a newly created patch "oldInternalFaces"
 
-    - setCellSubset does coupled patch subsetting as well. If it detects
-      a face on a coupled patch 'losing' its neighbour it will move the
-      face into the oldInternalFaces patch.
+    - reset() does coupled patch subsetting as well.
+      If it detects a face on a coupled patch 'losing' its neighbour
+      it will move the face into the oldInternalFaces patch.
 
-    - if a user supplied patch is used it is up to the destination
+    - if a user supplied patch is used, it is up to the destination
       patchField to handle exposed internal faces (mapping from face -1).
       If not provided the default is to assign the internalField. All the
       basic patch field types (e.g. fixedValue) will give a warning and
@@ -49,18 +53,20 @@ Description
 
 SourceFiles
     fvMeshSubset.C
+    fvMeshSubsetI.H
+    fvMeshSubsetTemplates.C
 
 \*---------------------------------------------------------------------------*/
 
-#ifndef fvMeshSubset_H
-#define fvMeshSubset_H
+#ifndef Foam_fvMeshSubset_H
+#define Foam_fvMeshSubset_H
 
 #include "fvMesh.H"
 #include "pointMesh.H"
+#include "surfaceMesh.H"
 #include "GeometricField.H"
 #include "bitSet.H"
 #include "HashSet.H"
-#include "surfaceMesh.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
@@ -75,11 +81,11 @@ class fvMeshSubset
 {
     // Private Data
 
-        //- Mesh to subset from
+        //- The base mesh to subset from
         const fvMesh& baseMesh_;
 
-        //- Demand-driven subset mesh pointer
-        autoPtr<fvMesh> fvMeshSubsetPtr_;
+        //- Demand-driven subset mesh (pointer)
+        autoPtr<fvMesh> subMeshPtr_;
 
         //- Optional face mapping array with flip encoded (-1/+1)
         mutable autoPtr<labelList> faceFlipMapPtr_;
@@ -99,53 +105,26 @@ class fvMeshSubset
 
     // Private Member Functions
 
-        //- Check if subset has been performed
-        bool checkCellSubset() const;
-
-        //- Calculate face flip map
-        void calcFaceFlipMap() const;
-
-        //- Adapt nCellsUsingFace for coupled faces becoming 'uncoupled'.
+        //- Modify nCellsUsingFace for coupled faces becoming 'uncoupled.
         void doCoupledPatches
         (
             const bool syncPar,
-            labelList& nCellsUsingFace
+            labelUList& nCellsUsingFace
         ) const;
 
-        //- Forwarding to Foam::removeCells
-        void removeCellsImpl
-        (
-            const bitSet& cellsToRemove,
-            const labelList& exposedFaces,
-            const labelList& patchIDs,
-            const bool syncCouples
-        );
-
+        //- Create zones for subMesh
+        void subsetZones();
 
-        //- Subset of subset
-        static labelList subsetSubset
-        (
-            const label nElems,
-            const labelUList& selectedElements,
-            const labelUList& subsetMap
-        );
+        //- Calculate face flip map
+        void calcFaceFlipMap() const;
 
-        //- Create zones for submesh
-        void subsetZones();
 
-        //- Helper: extract cells-to-remove from cells-to-keep
-        bitSet getCellsToRemove
-        (
-            const bitSet& selectedCells
-        ) const;
+protected:
 
-        //- Helper: extract cells-to-remove from cells-to-keep
-        bitSet getCellsToRemove
-        (
-            const label regioni,
-            const labelUList& regions
-        ) const;
+    // Protected Member Functions
 
+        //- FatalError if subset has not been performed
+        bool checkHasSubMesh() const;
 
         //- No copy construct
         fvMeshSubset(const fvMeshSubset&) = delete;
@@ -164,11 +143,14 @@ public:
 
     // Constructors
 
-        //- Construct given a mesh to subset
+        //- Construct using the entire mesh (no subset)
         explicit fvMeshSubset(const fvMesh& baseMesh);
 
+        //- Construct a zero-sized subset mesh, non-processor patches only
+        fvMeshSubset(const fvMesh& baseMesh, const Foam::zero);
+
         //- Construct for a cell-subset of the given mesh
-        //  See setCellSubset() for more details.
+        //  See reset() for more details.
         fvMeshSubset
         (
             const fvMesh& baseMesh,
@@ -178,7 +160,7 @@ public:
         );
 
         //- Construct for a cell-subset of the given mesh
-        //  See setCellSubset() for more details.
+        //  See reset() for more details.
         fvMeshSubset
         (
             const fvMesh& baseMesh,
@@ -188,7 +170,7 @@ public:
         );
 
         //- Construct for a cell-subset of the given mesh
-        //  See setCellSubset() for more details.
+        //  See reset() for more details.
         fvMeshSubset
         (
             const fvMesh& baseMesh,
@@ -198,7 +180,7 @@ public:
         );
 
         //- Construct for a cell-subset of the given mesh
-        //  See setCellSubset() for more details.
+        //  See reset() for more details.
         fvMeshSubset
         (
             const fvMesh& baseMesh,
@@ -246,42 +228,59 @@ public:
 
     // Edit
 
-        //- Reset maps and subsetting
+        //- Reset subMesh and all maps
         void clear();
 
+        //- Reset subMesh and all maps. Same as clear()
+        void reset();
 
-        //- Define cell subset based on the selectedCells.
-        //  Create "oldInternalFaces" patch for exposed
-        //  internal faces (patchID==-1) or use supplied patch.
-        //  Handles coupled patches if necessary by making coupled patch
-        //  face part of patchID (so uncoupled)
-        void setCellSubset
+        //- Reset to a zero-sized subset mesh, non-processor patches only
+        void reset(const Foam::zero);
+
+        //- Reset from components
+        void reset
+        (
+            autoPtr<fvMesh>&& subMeshPtr,   //!< Mesh subset
+            labelList&& pointMap,           //!< Point mapping
+            labelList&& faceMap,            //!< Face mapping
+            labelList&& cellMap,            //!< Cell mapping
+            labelList&& patchMap            //!< Patch mapping
+        );
+
+        //- Use the specified subset of cells.
+        //
+        //  \par selectedCells The subset of cells to use
+        //  \par patchID Patch id for exposed internal faces.
+        //       Uses existing or creates "oldInternalFaces" for patchID == -1.
+        //  \par syncPar
+        //
+        //  \note Handles coupled patches if necessary by making
+        //      coupled patch faces part of patchID (ie, uncoupled)
+        void reset
         (
             const bitSet& selectedCells,
             const label patchID = -1,
             const bool syncPar = true
         );
 
-        //- Define cell subset, using the specified cells
-        //- to define the selection
-        void setCellSubset
+        //- Use the specified subset of cells.
+        void reset
         (
             const labelUList& selectedCells,
             const label patchID = -1,
             const bool syncPar = true
         );
 
-        //- Define cell subset, using the specified cells
-        //- labelHashSet to define the selection
-        void setCellSubset
+        //- Use the specified subset of cells.
+        void reset
         (
             const labelHashSet& selectedCells,
             const label patchID = -1,
             const bool syncPar = true
         );
 
-        //- Define cell subset, using the cells for which region == regioni.
-        void setCellSubset
+        //- Use the cells of cells corresponding to where region == regioni.
+        void reset
         (
             const label regioni,
             const labelUList& regions,
@@ -290,79 +289,83 @@ public:
         );
 
 
-    // Two-step subsetting
+    // Legacy method names (v2112 and earlier)
 
-        //- Get labels of exposed faces.
-        //  These are
-        //  - internal faces that become boundary faces
-        //  - coupled faces that become uncoupled (since one of the
-        //    sides gets deleted)
-        labelList getExposedFaces
+        //- Use the specified subset of cells. Same as reset()
+        void setCellSubset
         (
             const bitSet& selectedCells,
-            const bool syncCouples = true
-        ) const;
+            const label patchID = -1,
+            const bool syncPar = true
+        )
+        {
+            reset(selectedCells, patchID, syncPar);
+        }
 
-        //- Get labels of exposed faces.
-        //  These are
-        //  - internal faces that become boundary faces
-        //  - coupled faces that become uncoupled (since one of the
-        //    sides gets deleted)
-        labelList getExposedFaces
+        //- Use the specified subset of cells. Same as reset()
+        void setCellSubset
         (
-            const label regioni,
-            const labelUList& regions,
-            const bool syncCouples = true
-        ) const;
+            const labelUList& selectedCells,
+            const label patchID = -1,
+            const bool syncPar = true
+        )
+        {
+            reset(selectedCells, patchID, syncPar);
+        }
 
-        //- For every exposed face (from above getExposedFaces)
-        //  used supplied (existing!) patch
+        //- Use the specified subset of cells. Same as reset()
         void setCellSubset
         (
-            const bitSet& selectedCells,
-            const labelList& exposedFaces,
-            const labelList& patchIDs,
-            const bool syncCouples = true
-        );
+            const labelHashSet& selectedCells,
+            const label patchID = -1,
+            const bool syncPar = true
+        )
+        {
+            reset(selectedCells, patchID, syncPar);
+        }
 
-        //- For every exposed face (from above getExposedFaces)
-        //  used supplied (existing!) patch
+        //- Use the specified subset of cells. Same as reset()
         void setCellSubset
         (
             const label regioni,
-            const labelList& regions,
-            const labelList& exposedFaces,
-            const labelList& patchIDs,
-            const bool syncCouples = true
-        );
+            const labelUList& regions,
+            const label patchID = -1,
+            const bool syncPar = true
+        )
+        {
+            reset(regioni, regions, patchID, syncPar);
+        }
 
 
-    // Field Mapping
+    // Field Mapping (static functions)
 
-        //- Map volume field. Optionally allow unmapped faces not to produce
-        //  a warning
+        //- Map volume internal (dimensioned) field
         template<class Type>
-        static tmp<GeometricField<Type, fvPatchField, volMesh>>
+        static tmp<DimensionedField<Type, volMesh>>
         interpolate
         (
-            const GeometricField<Type, fvPatchField, volMesh>&,
+            const DimensionedField<Type, volMesh>&,
             const fvMesh& sMesh,
-            const labelUList& patchMap,
-            const labelUList& cellMap,
-            const labelUList& faceMap,
-            const bool allowUnmapped = false
+            const labelUList& cellMap
         );
 
+        //- Map volume field.
+        //  Optionally allow unmapped faces not to produce a warning
         template<class Type>
-        tmp<GeometricField<Type, fvPatchField, volMesh>>
+        static tmp<GeometricField<Type, fvPatchField, volMesh>>
         interpolate
         (
             const GeometricField<Type, fvPatchField, volMesh>&,
+            const fvMesh& sMesh,
+            const labelUList& patchMap,
+            const labelUList& cellMap,
+            const labelUList& faceMap,
             const bool allowUnmapped = false
-        ) const;
+        );
 
-        //- Map surface field. Optionally negates value if flipping
-        //  a face (from exposing an internal face)
+        //- Map surface field.
+        //  Optionally negates value if flipping a face
+        //  (from exposing an internal face)
         template<class Type>
         static tmp<GeometricField<Type, fvsPatchField, surfaceMesh>>
         interpolate
@@ -374,16 +377,6 @@ public:
             const labelUList& faceMap
         );
 
-        //- Map surface field. Optionally allow unmapped faces not to produce
-        //  a warning (not currently used)
-        template<class Type>
-        tmp<GeometricField<Type, fvsPatchField, surfaceMesh>>
-        interpolate
-        (
-            const GeometricField<Type, fvsPatchField, surfaceMesh>&,
-            const bool allowUnmapped = false
-        ) const;
-
         //- Map point field
         template<class Type>
         static tmp<GeometricField<Type, pointPatchField, pointMesh>>
@@ -395,102 +388,50 @@ public:
             const labelUList& pointMap
         );
 
-        //- Map point field. Optionally allow unmapped points not to produce
-        //  a warning (not currently used)
+
+    // Field Mapping
+
+        //- Map volume internal (dimensioned) field
+        //- Optional unmapped argument (currently unused)
         template<class Type>
-        tmp<GeometricField<Type, pointPatchField, pointMesh>>
+        tmp<DimensionedField<Type, volMesh>>
         interpolate
         (
-            const GeometricField<Type, pointPatchField, pointMesh>&,
+            const DimensionedField<Type, volMesh>&,
             const bool allowUnmapped = false
         ) const;
 
-        //- Map dimensioned field
+        //- Map volume field.
+        //  Optionally allow unmapped faces not to produce a warning
         template<class Type>
-        static tmp<DimensionedField<Type, volMesh>>
+        tmp<GeometricField<Type, fvPatchField, volMesh>>
         interpolate
         (
-            const DimensionedField<Type, volMesh>&,
-            const fvMesh& sMesh,
-            const labelUList& cellMap
-        );
+            const GeometricField<Type, fvPatchField, volMesh>&,
+            const bool allowUnmapped = false
+        ) const;
 
-        //- Map Dimensioned. Optional unmapped argument not used
+        //- Map surface field.
+        //  Optionally allow unmapped faces not to produce a warning
+        //  (currently unused)
         template<class Type>
-        tmp<DimensionedField<Type, volMesh>>
+        tmp<GeometricField<Type, fvsPatchField, surfaceMesh>>
         interpolate
         (
-            const DimensionedField<Type, volMesh>&,
+            const GeometricField<Type, fvsPatchField, surfaceMesh>&,
             const bool allowUnmapped = false
         ) const;
 
-
-    // Compatibility
-
-        //- Deprecated(2018-07) old method name and old parameter ordering.
-        //  \deprecated(2018-07) - use setCellSubset() method
-        inline void setLargeCellSubset
-        (
-            const labelUList& region,
-            const label currentRegion,
-            const label patchID = -1,
-            const bool syncCouples = true
-        )
-        {
-            Info<< "WARNING: using highly deprecated method: "
-                << "fvMeshSubset::setLargeCellSubset()" << nl;
-
-            setCellSubset
-            (
-                currentRegion,
-                region,
-                patchID,
-                syncCouples
-            );
-        }
-
-
-        //- Deprecated(2018-07) old method name
-        //  \deprecated(2018-07) - use setCellSubset() method
-        inline void setLargeCellSubset
-        (
-            const labelHashSet& globalCellMap,
-            const label patchID = -1,
-            const bool syncPar = true
-        )
-        {
-            Info<< "WARNING: using highly deprecated method: "
-                << "fvMeshSubset::setLargeCellSubset()" << nl;
-
-            setCellSubset(globalCellMap, patchID, syncPar);
-        }
-
-
-        //- Deprecated(2018-07) method
-        //  For every exposed face (from getExposedFaces) use supplied
-        //  (existing!) patch ids
-        //  \deprecated(2018-07) - use setCellSubset() method
-        inline void setLargeCellSubset
+        //- Map point field.
+        //  Optionally allow unmapped points not to produce a warning
+        //  (currently unused)
+        template<class Type>
+        tmp<GeometricField<Type, pointPatchField, pointMesh>>
+        interpolate
         (
-            const labelList& regions,
-            const label regioni,
-            const labelList& exposedFaces,
-            const labelList& patchIDs,
-            const bool syncCouples = true
-        )
-        {
-            Info<< "WARNING: using highly deprecated method: "
-                << "fvMeshSubset::setLargeCellSubset()" << nl;
-
-            setCellSubset
-            (
-                regioni,
-                regions,
-                exposedFaces,
-                patchIDs,
-                syncCouples
-            );
-        }
+            const GeometricField<Type, pointPatchField, pointMesh>&,
+            const bool allowUnmapped = false
+        ) const;
 };
 
 
@@ -505,7 +446,7 @@ public:
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 #ifdef NoRepository
-    #include "fvMeshSubsetInterpolate.C"
+    #include "fvMeshSubsetTemplates.C"
 #endif
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
diff --git a/src/dynamicMesh/fvMeshSubset/fvMeshSubsetI.H b/src/finiteVolume/fvMesh/fvMeshSubset/fvMeshSubsetI.H
similarity index 87%
rename from src/dynamicMesh/fvMeshSubset/fvMeshSubsetI.H
rename to src/finiteVolume/fvMesh/fvMeshSubset/fvMeshSubsetI.H
index b0f8bd9f86d..c1bef91d564 100644
--- a/src/dynamicMesh/fvMeshSubset/fvMeshSubsetI.H
+++ b/src/finiteVolume/fvMesh/fvMeshSubset/fvMeshSubsetI.H
@@ -5,7 +5,7 @@
     \\  /    A nd           | www.openfoam.com
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
-    Copyright (C) 2018-2020 OpenCFD Ltd.
+    Copyright (C) 2018-2022 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -35,35 +35,35 @@ inline const Foam::fvMesh& Foam::fvMeshSubset::baseMesh() const noexcept
 
 inline const Foam::fvMesh& Foam::fvMeshSubset::mesh() const noexcept
 {
-    return fvMeshSubsetPtr_ ? *fvMeshSubsetPtr_ : baseMesh_;
+    return subMeshPtr_ ? *subMeshPtr_ : baseMesh_;
 }
 
 
 inline bool Foam::fvMeshSubset::hasSubMesh() const noexcept
 {
-    return bool(fvMeshSubsetPtr_);
+    return bool(subMeshPtr_);
 }
 
 
 inline const Foam::fvMesh& Foam::fvMeshSubset::subMesh() const
 {
-    checkCellSubset();
+    checkHasSubMesh();
 
-    return *fvMeshSubsetPtr_;
+    return *subMeshPtr_;
 }
 
 
 inline Foam::fvMesh& Foam::fvMeshSubset::subMesh()
 {
-    checkCellSubset();
+    checkHasSubMesh();
 
-    return *fvMeshSubsetPtr_;
+    return *subMeshPtr_;
 }
 
 
 inline const Foam::labelList& Foam::fvMeshSubset::pointMap() const
 {
-    checkCellSubset();
+    checkHasSubMesh();
 
     return pointMap_;
 }
@@ -71,7 +71,7 @@ inline const Foam::labelList& Foam::fvMeshSubset::pointMap() const
 
 inline const Foam::labelList& Foam::fvMeshSubset::faceMap() const
 {
-    checkCellSubset();
+    checkHasSubMesh();
 
     return faceMap_;
 }
@@ -90,7 +90,7 @@ inline const Foam::labelList& Foam::fvMeshSubset::faceFlipMap() const
 
 inline const Foam::labelList& Foam::fvMeshSubset::cellMap() const
 {
-    checkCellSubset();
+    checkHasSubMesh();
 
     return cellMap_;
 }
@@ -98,7 +98,7 @@ inline const Foam::labelList& Foam::fvMeshSubset::cellMap() const
 
 inline const Foam::labelList& Foam::fvMeshSubset::patchMap() const
 {
-    checkCellSubset();
+    checkHasSubMesh();
 
     return patchMap_;
 }
diff --git a/src/dynamicMesh/fvMeshSubsetProxy/fvMeshSubsetProxy.C b/src/finiteVolume/fvMesh/fvMeshSubset/fvMeshSubsetProxy.C
similarity index 98%
rename from src/dynamicMesh/fvMeshSubsetProxy/fvMeshSubsetProxy.C
rename to src/finiteVolume/fvMesh/fvMeshSubset/fvMeshSubsetProxy.C
index e428291236f..3c4cb75a38f 100644
--- a/src/dynamicMesh/fvMeshSubsetProxy/fvMeshSubsetProxy.C
+++ b/src/finiteVolume/fvMesh/fvMeshSubset/fvMeshSubsetProxy.C
@@ -197,7 +197,7 @@ bool Foam::fvMeshSubsetProxy::correct(bool verbose)
 
     if (changed || selectedCells_.empty())
     {
-        subsetter_.setCellSubset(selectedCells_, exposedPatchId_);
+        subsetter_.reset(selectedCells_, exposedPatchId_);
     }
 
     return returnReduce(changed, orOp<bool>());
diff --git a/src/dynamicMesh/fvMeshSubsetProxy/fvMeshSubsetProxy.H b/src/finiteVolume/fvMesh/fvMeshSubset/fvMeshSubsetProxy.H
similarity index 99%
rename from src/dynamicMesh/fvMeshSubsetProxy/fvMeshSubsetProxy.H
rename to src/finiteVolume/fvMesh/fvMeshSubset/fvMeshSubsetProxy.H
index 153177a385c..27b81fa44e0 100644
--- a/src/dynamicMesh/fvMeshSubsetProxy/fvMeshSubsetProxy.H
+++ b/src/finiteVolume/fvMesh/fvMeshSubset/fvMeshSubsetProxy.H
@@ -37,11 +37,11 @@ SourceFiles
 
 \*---------------------------------------------------------------------------*/
 
-#ifndef fvMeshSubsetProxy_H
-#define fvMeshSubsetProxy_H
+#ifndef Foam_fvMeshSubsetProxy_H
+#define Foam_fvMeshSubsetProxy_H
 
-#include "wordRes.H"
 #include "fvMeshSubset.H"
+#include "wordRes.H"
 #include "zeroGradientFvPatchField.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
diff --git a/src/dynamicMesh/fvMeshSubsetProxy/fvMeshSubsetProxyTemplates.C b/src/finiteVolume/fvMesh/fvMeshSubset/fvMeshSubsetProxyTemplates.C
similarity index 100%
rename from src/dynamicMesh/fvMeshSubsetProxy/fvMeshSubsetProxyTemplates.C
rename to src/finiteVolume/fvMesh/fvMeshSubset/fvMeshSubsetProxyTemplates.C
diff --git a/src/dynamicMesh/fvMeshSubset/fvMeshSubsetInterpolate.C b/src/finiteVolume/fvMesh/fvMeshSubset/fvMeshSubsetTemplates.C
similarity index 96%
rename from src/dynamicMesh/fvMeshSubset/fvMeshSubsetInterpolate.C
rename to src/finiteVolume/fvMesh/fvMeshSubset/fvMeshSubsetTemplates.C
index b9af0753c61..c410c56296c 100644
--- a/src/dynamicMesh/fvMeshSubset/fvMeshSubsetInterpolate.C
+++ b/src/finiteVolume/fvMesh/fvMeshSubset/fvMeshSubsetTemplates.C
@@ -34,7 +34,7 @@ License
 #include "directPointPatchFieldMapper.H"
 #include "flipOp.H"
 
-// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+// * * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * //
 
 template<class Type>
 Foam::tmp
@@ -145,6 +145,7 @@ Foam::fvMeshSubset::interpolate
 
             // allowUnmapped : special mode for if we do not want to be
             // warned for unmapped faces (e.g. from fvMeshDistribute).
+
             const bool hasUnmapped = mapper.hasUnmapped();
             if (allowUnmapped)
             {
@@ -190,6 +191,8 @@ Foam::fvMeshSubset::interpolate
 }
 
 
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
 template<class Type>
 Foam::tmp
 <
@@ -213,6 +216,8 @@ Foam::fvMeshSubset::interpolate
 }
 
 
+// * * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * //
+
 template<class Type>
 Foam::tmp
 <
@@ -375,6 +380,8 @@ Foam::fvMeshSubset::interpolate
 }
 
 
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
 template<class Type>
 Foam::tmp
 <
@@ -397,6 +404,8 @@ Foam::fvMeshSubset::interpolate
 }
 
 
+// * * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * //
+
 template<class Type>
 Foam::tmp
 <
@@ -528,6 +537,8 @@ Foam::fvMeshSubset::interpolate
 }
 
 
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
 template<class Type>
 Foam::tmp
 <
@@ -549,6 +560,8 @@ Foam::fvMeshSubset::interpolate
 }
 
 
+// * * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * //
+
 template<class Type>
 Foam::tmp
 <
@@ -581,6 +594,8 @@ Foam::fvMeshSubset::interpolate
 }
 
 
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
 template<class Type>
 Foam::tmp
 <
diff --git a/src/functionObjects/utilities/ensightWrite/ensightWriteUpdate.C b/src/functionObjects/utilities/ensightWrite/ensightWriteUpdate.C
index 7898063c976..4730797f870 100644
--- a/src/functionObjects/utilities/ensightWrite/ensightWriteUpdate.C
+++ b/src/functionObjects/utilities/ensightWrite/ensightWriteUpdate.C
@@ -5,7 +5,7 @@
     \\  /    A nd           | www.openfoam.com
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
-    Copyright (C) 2018-2020 OpenCFD Ltd.
+    Copyright (C) 2018-2022 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -125,7 +125,7 @@ bool Foam::functionObjects::ensightWrite::updateSubset
         }
     }
 
-    subsetter.setCellSubset(cellsToSelect.addressing());
+    subsetter.reset(cellsToSelect.addressing());
 
     return true;
 }
diff --git a/src/functionObjects/utilities/vtkWrite/vtkWriteUpdate.C b/src/functionObjects/utilities/vtkWrite/vtkWriteUpdate.C
index b627e692a73..bca349bbfcd 100644
--- a/src/functionObjects/utilities/vtkWrite/vtkWriteUpdate.C
+++ b/src/functionObjects/utilities/vtkWrite/vtkWriteUpdate.C
@@ -5,7 +5,7 @@
     \\  /    A nd           | www.openfoam.com
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
-    Copyright (C) 2018-2020 OpenCFD Ltd.
+    Copyright (C) 2018-2022 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -123,7 +123,7 @@ bool Foam::functionObjects::vtkWrite::updateSubset
         }
     }
 
-    subsetter.setCellSubset(cellsToSelect.addressing());
+    subsetter.reset(cellsToSelect.addressing());
 
     return true;
 }
diff --git a/src/meshTools/polyTopoChange/polyTopoChangeTemplates.C b/src/meshTools/polyTopoChange/polyTopoChangeTemplates.C
index 0423b2e65bf..9cc1362b439 100644
--- a/src/meshTools/polyTopoChange/polyTopoChangeTemplates.C
+++ b/src/meshTools/polyTopoChange/polyTopoChangeTemplates.C
@@ -6,7 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2011-2016 OpenFOAM Foundation
-    Copyright (C) 2017-2021 OpenCFD Ltd.
+    Copyright (C) 2017-2022 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -242,7 +242,7 @@ Foam::autoPtr<Foam::mapPolyMesh> Foam::polyTopoChange::makeMesh
     {
         const polyBoundaryMesh& oldPatches = mesh.boundaryMesh();
 
-        List<polyPatch*> newBoundary(patchMap.size());
+        polyPatchList newBoundary(patchMap.size());
 
         forAll(patchMap, patchi)
         {
@@ -250,25 +250,33 @@ Foam::autoPtr<Foam::mapPolyMesh> Foam::polyTopoChange::makeMesh
 
             if (oldPatchi != -1)
             {
-                newBoundary[patchi] = oldPatches[oldPatchi].clone
+                newBoundary.set
                 (
-                    newMesh.boundaryMesh(),
                     patchi,
-                    patchSizes[patchi],
-                    patchStarts[patchi]
-                ).ptr();
+                    oldPatches[oldPatchi].clone
+                    (
+                        newMesh.boundaryMesh(),
+                        patchi,
+                        patchSizes[patchi],
+                        patchStarts[patchi]
+                    )
+                );
             }
             else
             {
                 // Added patch
-                newBoundary[patchi] = new emptyPolyPatch
+                newBoundary.set
                 (
-                    "patch" + Foam::name(patchi),
-                    patchSizes[patchi],
-                    patchStarts[patchi],
                     patchi,
-                    newMesh.boundaryMesh(),
-                    word::null
+                    new emptyPolyPatch
+                    (
+                        "patch" + Foam::name(patchi),
+                        patchSizes[patchi],
+                        patchStarts[patchi],
+                        patchi,
+                        newMesh.boundaryMesh(),
+                        word::null
+                    )
                 );
             }
         }
diff --git a/src/renumber/renumberMethods/Make/options b/src/renumber/renumberMethods/Make/options
index dcfea82205a..560a74d85a2 100644
--- a/src/renumber/renumberMethods/Make/options
+++ b/src/renumber/renumberMethods/Make/options
@@ -1,10 +1,8 @@
 EXE_INC = \
     -I$(LIB_SRC)/finiteVolume/lnInclude \
     -I$(LIB_SRC)/meshTools/lnInclude \
-    -I$(LIB_SRC)/dynamicMesh/lnInclude \
     -I$(LIB_SRC)/parallel/decompose/decompositionMethods/lnInclude
 
 LIB_LIBS = \
     -lmeshTools \
-    -ldynamicMesh \
     -ldecompositionMethods
-- 
GitLab