From 3c41b80b38fe0095bb0d85d22f94173b308606df Mon Sep 17 00:00:00 2001
From: Mark Olesen <Mark.Olesen@Germany>
Date: Tue, 29 Nov 2016 17:24:26 +0100
Subject: [PATCH] ENH: change from triSurface to meshedSurface storage for
 iso-surfaces

- this makes it easier to reuse the code, and sampledSurface expect
  a face (not a labelledFace), so this also eliminates a translation
  level and simplifies memory management.

- before/after comparison of the sampled iso-surfaces tested with
  iso-surfaces from interFoam/RAS/angledDuct tutorial (serial and
  parallel)
---
 .../distanceSurface/distanceSurface.C         | 18 ++----
 .../distanceSurface/distanceSurface.H         | 19 +-----
 .../sampledSurface/isoSurface/isoSurface.C    | 43 +++++++++----
 .../sampledSurface/isoSurface/isoSurface.H    | 19 ++++--
 .../isoSurface/isoSurfaceCell.C               | 64 +++++++++++--------
 .../isoSurface/isoSurfaceCell.H               | 18 ++++--
 .../isoSurface/isoSurfaceCellTemplates.C      |  4 +-
 .../isoSurface/isoSurfaceTemplates.C          |  2 +-
 .../isoSurface/sampledIsoSurface.C            |  7 +-
 .../isoSurface/sampledIsoSurface.H            | 16 +----
 .../isoSurface/sampledIsoSurfaceCell.C        | 19 ++----
 .../isoSurface/sampledIsoSurfaceCell.H        | 25 ++------
 .../sampledCuttingPlane/sampledCuttingPlane.C | 15 ++---
 .../sampledCuttingPlane/sampledCuttingPlane.H | 16 +----
 .../sampledTriSurfaceMesh.C                   |  7 +-
 15 files changed, 130 insertions(+), 162 deletions(-)

diff --git a/src/sampling/sampledSurface/distanceSurface/distanceSurface.C b/src/sampling/sampledSurface/distanceSurface/distanceSurface.C
index 2df4a9b4bae..ebb16d8e371 100644
--- a/src/sampling/sampledSurface/distanceSurface/distanceSurface.C
+++ b/src/sampling/sampledSurface/distanceSurface/distanceSurface.C
@@ -3,7 +3,7 @@
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
     \\  /    A nd           | Copyright (C) 2011-2016 OpenFOAM Foundation
-     \\/     M anipulation  |
+     \\/     M anipulation  | Copyright (C) 2016 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -49,7 +49,6 @@ void Foam::distanceSurface::createGeometry()
     }
 
     // Clear any stored topologies
-    facesPtr_.clear();
     isoSurfCellPtr_.clear();
     isoSurfPtr_.clear();
 
@@ -339,8 +338,7 @@ Foam::distanceSurface::distanceSurface
     zoneKey_(keyType::null),
     needsUpdate_(true),
     isoSurfCellPtr_(nullptr),
-    isoSurfPtr_(nullptr),
-    facesPtr_(nullptr)
+    isoSurfPtr_(nullptr)
 {
 //    dict.readIfPresent("zone", zoneKey_);
 //
@@ -395,8 +393,7 @@ Foam::distanceSurface::distanceSurface
     zoneKey_(keyType::null),
     needsUpdate_(true),
     isoSurfCellPtr_(nullptr),
-    isoSurfPtr_(nullptr),
-    facesPtr_(nullptr)
+    isoSurfPtr_(nullptr)
 {}
 
 
@@ -419,13 +416,9 @@ bool Foam::distanceSurface::expire()
     if (debug)
     {
         Pout<< "distanceSurface::expire :"
-            << " have-facesPtr_:" << facesPtr_.valid()
-            << " needsUpdate_:" << needsUpdate_ << endl;
+            << " needsUpdate:" << needsUpdate_ << endl;
     }
 
-    // Clear any stored topologies
-    facesPtr_.clear();
-
     // Clear derived data
     clearGeom();
 
@@ -445,8 +438,7 @@ bool Foam::distanceSurface::update()
     if (debug)
     {
         Pout<< "distanceSurface::update :"
-            << " have-facesPtr_:" << facesPtr_.valid()
-            << " needsUpdate_:" << needsUpdate_ << endl;
+            << " needsUpdate:" << needsUpdate_ << endl;
     }
 
     if (!needsUpdate_)
diff --git a/src/sampling/sampledSurface/distanceSurface/distanceSurface.H b/src/sampling/sampledSurface/distanceSurface/distanceSurface.H
index 0ca56d08083..4f28ad9acdd 100644
--- a/src/sampling/sampledSurface/distanceSurface/distanceSurface.H
+++ b/src/sampling/sampledSurface/distanceSurface/distanceSurface.H
@@ -97,9 +97,6 @@ class distanceSurface
         //- Constructed iso surface
         autoPtr<isoSurface> isoSurfPtr_;
 
-        //- Triangles converted to faceList
-        mutable autoPtr<faceList> facesPtr_;
-
 
     // Private Member Functions
 
@@ -179,18 +176,7 @@ public:
         //- Faces of surface
         virtual const faceList& faces() const
         {
-            if (facesPtr_.empty())
-            {
-                const triSurface& s = surface();
-
-                facesPtr_.reset(new faceList(s.size()));
-
-                forAll(s, i)
-                {
-                    facesPtr_()[i] = s[i].triFaceFace();
-                }
-            }
-            return facesPtr_;
+            return surface().surfFaces();
         }
 
         //- Const access to per-face zone/region information
@@ -219,7 +205,7 @@ public:
 
 
         //- The underlying surface
-        const triSurface& surface() const
+        const meshedSurface& surface() const
         {
             if (cell_)
             {
@@ -231,6 +217,7 @@ public:
             }
         }
 
+
         //- Sample field on surface
         virtual tmp<scalarField> sample
         (
diff --git a/src/sampling/sampledSurface/isoSurface/isoSurface.C b/src/sampling/sampledSurface/isoSurface/isoSurface.C
index d5d8b7fbde5..4bb5d1549eb 100644
--- a/src/sampling/sampledSurface/isoSurface/isoSurface.C
+++ b/src/sampling/sampledSurface/isoSurface/isoSurface.C
@@ -37,6 +37,7 @@ License
 #include "surfaceIntersection.H"
 #include "intersectedSurface.H"
 #include "searchableBox.H"
+#include "triSurface.H"
 #include "triSurfaceMesh.H"
 #include "triPoints.H"
 
@@ -687,7 +688,6 @@ void Foam::isoSurface::calcSnappedPoint
 
     pointField collapsedPoint(mesh_.nPoints(), point::max);
 
-
     // Work arrays
     DynamicList<point, 64> localTriPoints(100);
 
@@ -1342,6 +1342,7 @@ Foam::isoSurface::isoSurface
     const scalar mergeTol
 )
 :
+    MeshStorage(),
     mesh_(cVals.mesh()),
     pVals_(pVals),
     iso_(iso),
@@ -1582,6 +1583,9 @@ Foam::isoSurface::isoSurface
     }
 
 
+    // Use a triSurface as a temporary for various operations
+    triSurface tmpsurf;
+
     {
         DynamicList<point> triPoints(3*nCutCells_);
         DynamicList<label> triMeshCells(nCutCells_);
@@ -1633,15 +1637,12 @@ Foam::isoSurface::isoSurface
 
         // Merge points and compact out non-valid triangles
         labelList triMap;           // merged to unmerged triangle
-        triSurface::operator=
+        tmpsurf = stitchTriPoints
         (
-            stitchTriPoints
-            (
-                true,               // check for duplicate tris
-                triPoints,
-                triPointMergeMap_,  // unmerged to merged point
-                triMap
-            )
+            true,               // check for duplicate tris
+            triPoints,
+            triPointMergeMap_,  // unmerged to merged point
+            triMap
         );
 
         if (debug)
@@ -1682,17 +1683,33 @@ Foam::isoSurface::isoSurface
 
     if (debug)
     {
-        Pout<< "isoSurface : checking " << size()
+        Pout<< "isoSurface : checking " << tmpsurf.size()
             << " triangles for validity." << endl;
 
-        forAll(*this, triI)
+        forAll(tmpsurf, facei)
         {
-            triSurfaceTools::validTri(*this, triI);
+            triSurfaceTools::validTri(tmpsurf, facei);
         }
 
         fileName stlFile = mesh_.time().path() + ".stl";
         Pout<< "Dumping surface to " << stlFile << endl;
-        triSurface::write(stlFile);
+        tmpsurf.write(stlFile);
+    }
+
+
+    // Transfer to mesh storage
+    {
+        faceList faces;
+        tmpsurf.triFaceFaces(faces);
+
+        // An iso-surface has no zones
+        surfZoneList zones(0);
+
+        // Reset primitive data (points, faces and zones)
+        this->MeshStorage::reset
+        (
+            tmpsurf.xferPoints(), faces.xfer(), zones.xfer()
+        );
     }
 }
 
diff --git a/src/sampling/sampledSurface/isoSurface/isoSurface.H b/src/sampling/sampledSurface/isoSurface/isoSurface.H
index e9474055663..d822fd100ed 100644
--- a/src/sampling/sampledSurface/isoSurface/isoSurface.H
+++ b/src/sampling/sampledSurface/isoSurface/isoSurface.H
@@ -3,7 +3,7 @@
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
     \\  /    A nd           | Copyright (C) 2011-2016 OpenFOAM Foundation
-     \\/     M anipulation  |
+     \\/     M anipulation  | Copyright (C) 2016 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -57,18 +57,18 @@ Description
 
 SourceFiles
     isoSurface.C
+    isoSurfaceTemplates.C
 
 \*---------------------------------------------------------------------------*/
 
 #ifndef isoSurface_H
 #define isoSurface_H
 
-#include "triSurface.H"
-#include "labelPair.H"
-#include "pointIndexHit.H"
 #include "PackedBoolList.H"
 #include "volFields.H"
 #include "slicedVolFields.H"
+#include "MeshedSurface.H"
+#include "MeshedSurfacesFwd.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
@@ -78,6 +78,7 @@ namespace Foam
 class fvMesh;
 class plane;
 class treeBoundBox;
+class triSurface;
 
 /*---------------------------------------------------------------------------*\
                        Class isoSurface Declaration
@@ -85,8 +86,12 @@ class treeBoundBox;
 
 class isoSurface
 :
-    public triSurface
+    public meshedSurface
 {
+    // Private typedefs for convenience
+    typedef meshedSurface MeshStorage;
+
+
     // Private data
 
         enum segmentCutType
@@ -379,7 +384,7 @@ class isoSurface
 
         static triSurface subsetMesh
         (
-            const triSurface& s,
+            const triSurface&,
             const labelList& newToOldFaces,
             labelList& oldToNewPoints,
             labelList& newToOldPoints
@@ -413,7 +418,7 @@ public:
 
     // Member Functions
 
-        //- For every triangle the original cell in mesh
+        //- For every face, the original cell in mesh
         const labelList& meshCells() const
         {
             return meshCells_;
diff --git a/src/sampling/sampledSurface/isoSurface/isoSurfaceCell.C b/src/sampling/sampledSurface/isoSurface/isoSurfaceCell.C
index 47ec36069f0..33f7ef6e4c8 100644
--- a/src/sampling/sampledSurface/isoSurface/isoSurfaceCell.C
+++ b/src/sampling/sampledSurface/isoSurface/isoSurfaceCell.C
@@ -3,7 +3,7 @@
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
     \\  /    A nd           | Copyright (C) 2011-2016 OpenFOAM Foundation
-     \\/     M anipulation  |
+     \\/     M anipulation  | Copyright (C) 2016 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -24,16 +24,17 @@ License
 \*---------------------------------------------------------------------------*/
 
 #include "isoSurfaceCell.H"
+#include "isoSurface.H"
 #include "dictionary.H"
 #include "polyMesh.H"
 #include "mergePoints.H"
 #include "tetMatcher.H"
 #include "syncTools.H"
+#include "triSurface.H"
 #include "triSurfaceTools.H"
-#include "addToRunTimeSelectionTable.H"
 #include "Time.H"
 #include "triPoints.H"
-#include "isoSurface.H"
+#include "addToRunTimeSelectionTable.H"
 
 // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
 
@@ -1310,6 +1311,7 @@ Foam::isoSurfaceCell::isoSurfaceCell
     const scalar mergeTol
 )
 :
+    MeshStorage(),
     mesh_(mesh),
     cVals_(cVals),
     pVals_(pVals),
@@ -1398,6 +1400,9 @@ Foam::isoSurfaceCell::isoSurfaceCell
     }
 
 
+    // Use a triSurface as a temporary for various operations
+    triSurface tmpsurf;
+
     {
         DynamicList<point> triPoints(nCutCells_);
         DynamicList<label> triMeshCells(nCutCells_);
@@ -1448,16 +1453,13 @@ Foam::isoSurfaceCell::isoSurfaceCell
 
 
         // Merge points and compact out non-valid triangles
-        labelList triMap;
-        triSurface::operator=
+        labelList triMap;           // merged to unmerged triangle
+        tmpsurf = stitchTriPoints
         (
-            stitchTriPoints
-            (
-                regularise,         // check for duplicate tris
-                triPoints,
-                triPointMergeMap_,  // unmerged to merged point
-                triMap              // merged to unmerged triangle
-            )
+            regularise,         // check for duplicate tris
+            triPoints,
+            triPointMergeMap_,  // unmerged to merged point
+            triMap              // merged to unmerged triangle
         );
 
         if (debug)
@@ -1498,12 +1500,12 @@ Foam::isoSurfaceCell::isoSurfaceCell
 
     if (debug)
     {
-        Pout<< "isoSurfaceCell : checking " << size()
+        Pout<< "isoSurfaceCell : checking " << tmpsurf.size()
             << " triangles for validity." << endl;
 
-        forAll(*this, triI)
+        forAll(tmpsurf, triI)
         {
-            triSurfaceTools::validTri(*this, triI);
+            triSurfaceTools::validTri(tmpsurf, triI);
         }
     }
 
@@ -1520,7 +1522,7 @@ Foam::isoSurfaceCell::isoSurfaceCell
             // Calculate addressing
             calcAddressing
             (
-                *this,
+                tmpsurf,
                 faceEdges,
                 edgeFace0,
                 edgeFace1,
@@ -1554,21 +1556,33 @@ Foam::isoSurfaceCell::isoSurfaceCell
 
             labelList subsetPointMap;
             labelList reversePointMap;
-            triSurface::operator=
+            tmpsurf = subsetMesh
             (
-                subsetMesh
-                (
-                    *this,
-                    subsetTriMap,
-                    reversePointMap,
-                    subsetPointMap
-                )
+                tmpsurf,
+                subsetTriMap,
+                reversePointMap,
+                subsetPointMap
             );
             meshCells_ = labelField(meshCells_, subsetTriMap);
             inplaceRenumber(reversePointMap, triPointMergeMap_);
         }
     }
-}
 
 
+    // Transfer to mesh storage
+    {
+        faceList faces;
+        tmpsurf.triFaceFaces(faces);
+
+        // An iso-surface has no zones
+        surfZoneList zones(0);
+
+        // Reset primitive data (points, faces and zones)
+        this->MeshStorage::reset
+        (
+            tmpsurf.xferPoints(), faces.xfer(), zones.xfer()
+        );
+    }
+}
+
 // ************************************************************************* //
diff --git a/src/sampling/sampledSurface/isoSurface/isoSurfaceCell.H b/src/sampling/sampledSurface/isoSurface/isoSurfaceCell.H
index f848cc47366..c2687f29f63 100644
--- a/src/sampling/sampledSurface/isoSurface/isoSurfaceCell.H
+++ b/src/sampling/sampledSurface/isoSurface/isoSurfaceCell.H
@@ -3,7 +3,7 @@
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
     \\  /    A nd           | Copyright (C) 2011-2016 OpenFOAM Foundation
-     \\/     M anipulation  |
+     \\/     M anipulation  | Copyright (C) 2016 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -38,17 +38,19 @@ Description
 
 SourceFiles
     isoSurfaceCell.C
+    isoSurfaceCellTemplates.C
 
 \*---------------------------------------------------------------------------*/
 
 #ifndef isoSurfaceCell_H
 #define isoSurfaceCell_H
 
-#include "triSurface.H"
 #include "labelPair.H"
 #include "pointIndexHit.H"
 #include "PackedBoolList.H"
 #include "boundBox.H"
+#include "MeshedSurface.H"
+#include "MeshedSurfacesFwd.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
@@ -56,7 +58,7 @@ namespace Foam
 {
 
 class polyMesh;
-class plane;
+class triSurface;
 
 /*---------------------------------------------------------------------------*\
                        Class isoSurfaceCell Declaration
@@ -64,8 +66,12 @@ class plane;
 
 class isoSurfaceCell
 :
-    public triSurface
+    public meshedSurface
 {
+    // Private typedefs for convenience
+    typedef meshedSurface MeshStorage;
+
+
     // Private data
 
         enum segmentCutType
@@ -301,7 +307,7 @@ class isoSurfaceCell
 
         static triSurface subsetMesh
         (
-            const triSurface& s,
+            const triSurface&,
             const labelList& newToOldFaces,
             labelList& oldToNewPoints,
             labelList& newToOldPoints
@@ -331,7 +337,7 @@ public:
 
     // Member Functions
 
-        //- For every face original cell in mesh
+        //- For every face, the original cell in mesh
         const labelList& meshCells() const
         {
             return meshCells_;
diff --git a/src/sampling/sampledSurface/isoSurface/isoSurfaceCellTemplates.C b/src/sampling/sampledSurface/isoSurface/isoSurfaceCellTemplates.C
index a359d37e92f..521ff41871b 100644
--- a/src/sampling/sampledSurface/isoSurface/isoSurfaceCellTemplates.C
+++ b/src/sampling/sampledSurface/isoSurface/isoSurfaceCellTemplates.C
@@ -24,9 +24,9 @@ License
 \*---------------------------------------------------------------------------*/
 
 #include "isoSurfaceCell.H"
+#include "isoSurface.H"
 #include "polyMesh.H"
 #include "tetMatcher.H"
-#include "isoSurface.H"
 
 // * * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * //
 
@@ -556,7 +556,7 @@ Foam::isoSurfaceCell::interpolate
 
     return isoSurface::interpolate
     (
-        points().size(),
+        this->points().size(),
         triPointMergeMap_,
         interpolatedPoints_,
         interpolatedOldPoints_,
diff --git a/src/sampling/sampledSurface/isoSurface/isoSurfaceTemplates.C b/src/sampling/sampledSurface/isoSurface/isoSurfaceTemplates.C
index d63ab06b1aa..af0de2ef93a 100644
--- a/src/sampling/sampledSurface/isoSurface/isoSurfaceTemplates.C
+++ b/src/sampling/sampledSurface/isoSurface/isoSurfaceTemplates.C
@@ -842,7 +842,7 @@ Foam::isoSurface::interpolate
 
     return interpolate
     (
-        points().size(),
+        this->points().size(),
         triPointMergeMap_,
         interpolatedPoints_,
         interpolatedOldPoints_,
diff --git a/src/sampling/sampledSurface/isoSurface/sampledIsoSurface.C b/src/sampling/sampledSurface/isoSurface/sampledIsoSurface.C
index 24b5a640e24..a63cd5132ed 100644
--- a/src/sampling/sampledSurface/isoSurface/sampledIsoSurface.C
+++ b/src/sampling/sampledSurface/isoSurface/sampledIsoSurface.C
@@ -3,7 +3,7 @@
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
     \\  /    A nd           | Copyright (C) 2011-2016 OpenFOAM Foundation
-     \\/     M anipulation  |
+     \\/     M anipulation  | Copyright (C) 2016 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -393,7 +393,6 @@ bool Foam::sampledIsoSurface::updateGeometry() const
 
     // Clear any stored topo
     surfPtr_.clear();
-    facesPtr_.clear();
 
     // Clear derived data
     clearGeom();
@@ -448,7 +447,7 @@ bool Foam::sampledIsoSurface::updateGeometry() const
                 << nl;
         }
         Pout<< "    points         : " << points().size() << nl
-            << "    tris           : " << surface().size() << nl
+            << "    faces          : " << surface().size() << nl
             << "    cut cells      : " << surface().meshCells().size()
             << endl;
     }
@@ -476,7 +475,6 @@ Foam::sampledIsoSurface::sampledIsoSurface
     zoneID_(dict.lookupOrDefault("zone", word::null), mesh.cellZones()),
     exposedPatchName_(word::null),
     surfPtr_(nullptr),
-    facesPtr_(nullptr),
     prevTimeIndex_(-1),
     storedVolFieldPtr_(nullptr),
     volFieldPtr_(nullptr),
@@ -535,7 +533,6 @@ bool Foam::sampledIsoSurface::needsUpdate() const
 bool Foam::sampledIsoSurface::expire()
 {
     surfPtr_.clear();
-    facesPtr_.clear();
     subMeshPtr_.clear();
 
     // Clear derived data
diff --git a/src/sampling/sampledSurface/isoSurface/sampledIsoSurface.H b/src/sampling/sampledSurface/isoSurface/sampledIsoSurface.H
index 8be9053eea6..1f7c2cb1bdc 100644
--- a/src/sampling/sampledSurface/isoSurface/sampledIsoSurface.H
+++ b/src/sampling/sampledSurface/isoSurface/sampledIsoSurface.H
@@ -83,9 +83,6 @@ class sampledIsoSurface
 
         mutable autoPtr<isoSurface> surfPtr_;
 
-        //- Triangles converted to faceList
-        mutable autoPtr<faceList> facesPtr_;
-
 
         // Recreated for every isoSurface
 
@@ -185,18 +182,7 @@ public:
         //- Faces of surface
         virtual const faceList& faces() const
         {
-            if (facesPtr_.empty())
-            {
-                const triSurface& s = surface();
-
-                facesPtr_.reset(new faceList(s.size()));
-
-                forAll(s, i)
-                {
-                    facesPtr_()[i] = s[i].triFaceFace();
-                }
-            }
-            return facesPtr_;
+            return surface().surfFaces();
         }
 
         //- Const access to per-face zone/region information
diff --git a/src/sampling/sampledSurface/isoSurface/sampledIsoSurfaceCell.C b/src/sampling/sampledSurface/isoSurface/sampledIsoSurfaceCell.C
index bc5697842eb..7b7628fdad8 100644
--- a/src/sampling/sampledSurface/isoSurface/sampledIsoSurfaceCell.C
+++ b/src/sampling/sampledSurface/isoSurface/sampledIsoSurfaceCell.C
@@ -3,7 +3,7 @@
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
     \\  /    A nd           | Copyright (C) 2011-2016 OpenFOAM Foundation
-     \\/     M anipulation  |
+     \\/     M anipulation  | Copyright (C) 2016 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -59,9 +59,6 @@ bool Foam::sampledIsoSurfaceCell::updateGeometry() const
 
     prevTimeIndex_ = fvm.time().timeIndex();
 
-    // Clear any stored topo
-    facesPtr_.clear();
-
     // Clear derived data
     sampledSurface::clearGeom();
 
@@ -142,7 +139,7 @@ bool Foam::sampledIsoSurfaceCell::updateGeometry() const
             cellAvg[celli] /= nPointCells[celli];
         }
 
-        const isoSurfaceCell iso
+        isoSurfaceCell iso
         (
             fvm,
             cellAvg,
@@ -155,13 +152,13 @@ bool Foam::sampledIsoSurfaceCell::updateGeometry() const
         const_cast<sampledIsoSurfaceCell&>
         (
             *this
-        ).triSurface::operator=(iso);
+        ).transfer(static_cast<meshedSurface&>(iso));
         meshCells_ = iso.meshCells();
     }
     else
     {
         //- Direct from cell field and point field. Gives bad continuity.
-        const isoSurfaceCell iso
+        isoSurfaceCell iso
         (
             fvm,
             cellFld.primitiveField(),
@@ -174,7 +171,7 @@ bool Foam::sampledIsoSurfaceCell::updateGeometry() const
         const_cast<sampledIsoSurfaceCell&>
         (
             *this
-        ).triSurface::operator=(iso);
+        ).transfer(static_cast<meshedSurface&>(iso));
         meshCells_ = iso.meshCells();
     }
 
@@ -189,7 +186,7 @@ bool Foam::sampledIsoSurfaceCell::updateGeometry() const
             << "    isoValue       : " << isoVal_ << nl
             << "    bounds         : " << bounds_ << nl
             << "    points         : " << points().size() << nl
-            << "    tris           : " << triSurface::size() << nl
+            << "    faces          : " << MeshStorage::size() << nl
             << "    cut cells      : " << meshCells_.size() << endl;
     }
 
@@ -207,13 +204,13 @@ Foam::sampledIsoSurfaceCell::sampledIsoSurfaceCell
 )
 :
     sampledSurface(name, mesh, dict),
+    MeshStorage(),
     isoField_(dict.lookup("isoField")),
     isoVal_(readScalar(dict.lookup("isoValue"))),
     bounds_(dict.lookupOrDefault("bounds", boundBox::greatBox)),
     regularise_(dict.lookupOrDefault("regularise", true)),
     average_(dict.lookupOrDefault("average", true)),
     zoneKey_(keyType::null),
-    facesPtr_(nullptr),
     prevTimeIndex_(-1),
     meshCells_(0)
 {}
@@ -237,8 +234,6 @@ bool Foam::sampledIsoSurfaceCell::needsUpdate() const
 
 bool Foam::sampledIsoSurfaceCell::expire()
 {
-    facesPtr_.clear();
-
     // Clear derived data
     sampledSurface::clearGeom();
 
diff --git a/src/sampling/sampledSurface/isoSurface/sampledIsoSurfaceCell.H b/src/sampling/sampledSurface/isoSurface/sampledIsoSurfaceCell.H
index 4d0952b2e65..d88bf87b55d 100644
--- a/src/sampling/sampledSurface/isoSurface/sampledIsoSurfaceCell.H
+++ b/src/sampling/sampledSurface/isoSurface/sampledIsoSurfaceCell.H
@@ -38,7 +38,8 @@ SourceFiles
 #define sampledIsoSurfaceCell_H
 
 #include "sampledSurface.H"
-#include "triSurface.H"
+#include "MeshedSurface.H"
+#include "MeshedSurfacesFwd.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
@@ -52,10 +53,10 @@ namespace Foam
 class sampledIsoSurfaceCell
 :
     public sampledSurface,
-    public triSurface
+    public meshedSurface
 {
-    //- Private typedef for convenience
-    typedef triSurface MeshStorage;
+    // Private typedefs for convenience
+    typedef meshedSurface MeshStorage;
 
     // Private data
 
@@ -77,9 +78,6 @@ class sampledIsoSurfaceCell
         //- If restricted to zones, name of this zone or a regular expression
         keyType zoneKey_;
 
-        //- Triangles converted to faceList
-        mutable autoPtr<faceList> facesPtr_;
-
 
         // Recreated for every isoSurface
 
@@ -154,18 +152,7 @@ public:
         //- Faces of surface
         virtual const faceList& faces() const
         {
-            if (facesPtr_.empty())
-            {
-                const triSurface& s = *this;
-
-                facesPtr_.reset(new faceList(s.size()));
-
-                forAll(s, i)
-                {
-                    facesPtr_()[i] = s[i].triFaceFace();
-                }
-            }
-            return facesPtr_;
+            return MeshStorage::surfFaces();
         }
 
         //- Const access to per-face zone/region information
diff --git a/src/sampling/sampledSurface/sampledCuttingPlane/sampledCuttingPlane.C b/src/sampling/sampledSurface/sampledCuttingPlane/sampledCuttingPlane.C
index e00b0a2f54b..875ee8ca777 100644
--- a/src/sampling/sampledSurface/sampledCuttingPlane/sampledCuttingPlane.C
+++ b/src/sampling/sampledSurface/sampledCuttingPlane/sampledCuttingPlane.C
@@ -3,7 +3,7 @@
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
     \\  /    A nd           | Copyright (C) 2011-2016 OpenFOAM Foundation
-     \\/     M anipulation  |
+     \\/     M anipulation  | Copyright (C) 2016 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -55,7 +55,6 @@ void Foam::sampledCuttingPlane::createGeometry()
     }
 
     // Clear any stored topologies
-    facesPtr_.clear();
     isoSurfPtr_.ptr();
     pointDistance_.clear();
     cellDistancePtr_.clear();
@@ -273,8 +272,7 @@ Foam::sampledCuttingPlane::sampledCuttingPlane
     needsUpdate_(true),
     subMeshPtr_(nullptr),
     cellDistancePtr_(nullptr),
-    isoSurfPtr_(nullptr),
-    facesPtr_(nullptr)
+    isoSurfPtr_(nullptr)
 {
     if (zoneID_.index() != -1)
     {
@@ -318,13 +316,9 @@ bool Foam::sampledCuttingPlane::expire()
     if (debug)
     {
         Pout<< "sampledCuttingPlane::expire :"
-            << " have-facesPtr_:" << facesPtr_.valid()
-            << " needsUpdate_:" << needsUpdate_ << endl;
+            << " needsUpdate:" << needsUpdate_ << endl;
     }
 
-    // Clear any stored topologies
-    facesPtr_.clear();
-
     // Clear derived data
     clearGeom();
 
@@ -344,8 +338,7 @@ bool Foam::sampledCuttingPlane::update()
     if (debug)
     {
         Pout<< "sampledCuttingPlane::update :"
-            << " have-facesPtr_:" << facesPtr_.valid()
-            << " needsUpdate_:" << needsUpdate_ << endl;
+            << " needsUpdate:" << needsUpdate_ << endl;
     }
 
     if (!needsUpdate_)
diff --git a/src/sampling/sampledSurface/sampledCuttingPlane/sampledCuttingPlane.H b/src/sampling/sampledSurface/sampledCuttingPlane/sampledCuttingPlane.H
index 6af60649219..05e9a2247ea 100644
--- a/src/sampling/sampledSurface/sampledCuttingPlane/sampledCuttingPlane.H
+++ b/src/sampling/sampledSurface/sampledCuttingPlane/sampledCuttingPlane.H
@@ -96,9 +96,6 @@ class sampledCuttingPlane
         //autoPtr<isoSurfaceCell> isoSurfPtr_;
         autoPtr<isoSurface> isoSurfPtr_;
 
-        //- Triangles converted to faceList
-        mutable autoPtr<faceList> facesPtr_;
-
 
     // Private Member Functions
 
@@ -168,18 +165,7 @@ public:
         //- Faces of surface
         virtual const faceList& faces() const
         {
-            if (facesPtr_.empty())
-            {
-                const triSurface& s = surface();
-
-                facesPtr_.reset(new faceList(s.size()));
-
-                forAll(s, i)
-                {
-                    facesPtr_()[i] = s[i].triFaceFace();
-                }
-            }
-            return facesPtr_;
+            return surface().surfFaces();
         }
 
         //- Const access to per-face zone/region information
diff --git a/src/sampling/sampledSurface/sampledTriSurfaceMesh/sampledTriSurfaceMesh.C b/src/sampling/sampledSurface/sampledTriSurfaceMesh/sampledTriSurfaceMesh.C
index 38fdc7c748f..7db0fb783e4 100644
--- a/src/sampling/sampledSurface/sampledTriSurfaceMesh/sampledTriSurfaceMesh.C
+++ b/src/sampling/sampledSurface/sampledTriSurfaceMesh/sampledTriSurfaceMesh.C
@@ -65,7 +65,6 @@ namespace Foam
 
     class nearestEqOp
     {
-
     public:
 
         void operator()(nearInfo& x, const nearInfo& y) const
@@ -110,6 +109,7 @@ Foam::sampledTriSurfaceMesh::nonCoupledboundaryTree() const
 
         treeBoundBox overallBb(mesh().points());
         Random rndGen(123456);
+        // Extend slightly and make 3D
         overallBb = overallBb.extend(rndGen, 1e-4);
         overallBb.min() -= point(ROOTVSMALL, ROOTVSMALL, ROOTVSMALL);
         overallBb.max() += point(ROOTVSMALL, ROOTVSMALL, ROOTVSMALL);
@@ -189,7 +189,7 @@ bool Foam::sampledTriSurfaceMesh::update(const meshSearch& meshSearcher)
         {
             if (cellTree.bb().contains(fc[triI]))
             {
-                label index = cellTree.findInside(fc[triI]);
+                const label index = cellTree.findInside(fc[triI]);
                 if (index != -1)
                 {
                     nearest[triI].first() = 0.0;
@@ -535,6 +535,7 @@ Foam::sampledTriSurfaceMesh::sampledTriSurfaceMesh
 )
 :
     sampledSurface(name, mesh),
+    MeshStorage(),
     surface_
     (
         IOobject
@@ -565,6 +566,7 @@ Foam::sampledTriSurfaceMesh::sampledTriSurfaceMesh
 )
 :
     sampledSurface(name, mesh, dict),
+    MeshStorage(),
     surface_
     (
         IOobject
@@ -596,6 +598,7 @@ Foam::sampledTriSurfaceMesh::sampledTriSurfaceMesh
 )
 :
     sampledSurface(name, mesh),
+    MeshStorage(),
     surface_
     (
         IOobject
-- 
GitLab