From 708c1b5c416152dd7a299e9b170733906244e03f Mon Sep 17 00:00:00 2001
From: Mark Olesen <Mark.Olesen@esi-group.com>
Date: Mon, 8 May 2017 11:21:44 +0200
Subject: [PATCH] ENH: simplify ensightCells/ensightFaces with labelRange

- can avoid allocating/reallocating SubList

STYLE: don't need NamedEnum for ensightCells, ensightFaces lookup
---
 src/fileFormats/ensight/part/ensightCells.C  |  92 +++++----------
 src/fileFormats/ensight/part/ensightCells.H  |  40 +++----
 src/fileFormats/ensight/part/ensightCellsI.H |  26 +++--
 src/fileFormats/ensight/part/ensightFaces.C  | 112 ++++++-------------
 src/fileFormats/ensight/part/ensightFaces.H  |  41 +++----
 src/fileFormats/ensight/part/ensightFacesI.H |  28 +++--
 6 files changed, 136 insertions(+), 203 deletions(-)

diff --git a/src/fileFormats/ensight/part/ensightCells.C b/src/fileFormats/ensight/part/ensightCells.C
index d08996ad857..3b1161ad984 100644
--- a/src/fileFormats/ensight/part/ensightCells.C
+++ b/src/fileFormats/ensight/part/ensightCells.C
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2016 OpenCFD Ltd.
+    \\  /    A nd           | Copyright (C) 2016-2017 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -27,24 +27,13 @@ License
 #include "error.H"
 #include "polyMesh.H"
 #include "cellModeller.H"
-#include "demandDrivenData.H"
 
 // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
 
 const Foam::label Foam::ensightCells::nTypes = 5;
 
-namespace Foam
-{
-    template<>
-    const char* Foam::NamedEnum
-    <
-        Foam::ensightCells::elemType,
-        5
-    >::names[] = { "tetra4", "pyramid5", "penta6", "hexa8", "nfaced" };
-}
-
-const Foam::NamedEnum<Foam::ensightCells::elemType, 5>
-    Foam::ensightCells::elemEnum;
+const char* Foam::ensightCells::elemNames[5] =
+    { "tetra4", "pyramid5", "penta6", "hexa8", "nfaced" };
 
 
 // * * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * //
@@ -63,9 +52,8 @@ void Foam::ensightCells::resizeAll()
     n = 0;
     forAll(sizes_, typei)
     {
-        deleteDemandDrivenData(lists_[typei]);
-
-        lists_[typei] = new SubList<label>(address_, sizes_[typei], n);
+        slices_[typei].setStart(n);
+        slices_[typei].setSize(sizes_[typei]);
 
         n += sizes_[typei];
     }
@@ -78,16 +66,10 @@ Foam::ensightCells::ensightCells(const label partIndex)
 :
     index_(partIndex),
     address_(),
-    sizes_(Zero),
-    lists_()
+    slices_(),
+    sizes_(Zero)
 {
-    // Ensure sub-lists are properly initialized to nullptr
-    forAll(lists_, typei)
-    {
-        lists_[typei] = nullptr;
-    }
-
-    resizeAll(); // adjust allocation
+    resizeAll(); // adjust allocation/sizing
 }
 
 
@@ -95,22 +77,16 @@ Foam::ensightCells::ensightCells(const ensightCells& obj)
 :
     index_(obj.index_),
     address_(obj.address_),
-    sizes_(),
-    lists_()
+    slices_(),
+    sizes_()
 {
-    // Ensure sub-lists are properly initialized to nullptr
-    forAll(lists_, typei)
-    {
-        lists_[typei] = nullptr;
-    }
-
-    // Total (reduced) sizes
+    // Save the total (reduced) sizes
     FixedList<label, 5> totSizes = obj.sizes_;
 
-    // Local sizes
+    // Need local sizes for the resize operation
     this->sizes_ = obj.sizes();
 
-    resizeAll(); // adjust allocation
+    resizeAll(); // adjust allocation/sizing
 
     // Restore total (reduced) sizes
     this->sizes_ = totSizes;
@@ -120,13 +96,7 @@ Foam::ensightCells::ensightCells(const ensightCells& obj)
 // * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
 
 Foam::ensightCells::~ensightCells()
-{
-    forAll(lists_, typei)
-    {
-        deleteDemandDrivenData(lists_[typei]);
-    }
-    address_.clear();
-}
+{}
 
 
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
@@ -134,27 +104,15 @@ Foam::ensightCells::~ensightCells()
 Foam::FixedList<Foam::label, 5> Foam::ensightCells::sizes() const
 {
     FixedList<label, 5> count;
-    forAll(lists_, typei)
+    forAll(slices_, typei)
     {
-        count[typei] = lists_[typei]->size();
+        count[typei] = slices_[typei].size();
     }
 
     return count;
 }
 
 
-Foam::label Foam::ensightCells::offset(const enum elemType what) const
-{
-    label n = 0;
-    for (label typei = 0; typei < label(what); ++typei)
-    {
-        n += lists_[typei]->size();
-    }
-
-    return n;
-}
-
-
 Foam::label Foam::ensightCells::total() const
 {
     label n = 0;
@@ -175,9 +133,10 @@ void Foam::ensightCells::clear()
 
 void Foam::ensightCells::reduce()
 {
+    // No listCombineGather, listCombineScatter for FixedList
     forAll(sizes_, typei)
     {
-        sizes_[typei] = lists_[typei]->size();
+        sizes_[typei] = slices_[typei].size();
         Foam::reduce(sizes_[typei], sumOp<label>());
     }
 }
@@ -185,9 +144,13 @@ void Foam::ensightCells::reduce()
 
 void Foam::ensightCells::sort()
 {
-    forAll(lists_, typei)
+    forAll(slices_, typei)
     {
-        Foam::sort(*(lists_[typei]));
+        if (slices_[typei].size())
+        {
+            SubList<label> idLst(address_, slices_[typei]);
+            Foam::sort(idLst);
+        }
     }
 }
 
@@ -240,7 +203,7 @@ void Foam::ensightCells::classify
     }
 
     resizeAll();    // adjust allocation
-    sizes_ = Zero;  // reset sizes
+    sizes_ = Zero;  // reset sizes - use for local indexing here
 
     // Assign cell-id per shape type
     for (label listi = 0; listi < sz; ++listi)
@@ -267,7 +230,10 @@ void Foam::ensightCells::classify
         }
 
         // eg, the processor local cellId
-        lists_[what]->operator[](sizes_[what]++) = id;
+        UList<label> slice = address_[slices_[what]];
+
+        slice[sizes_[what]] = id;
+        sizes_[what]++;
     }
 }
 
diff --git a/src/fileFormats/ensight/part/ensightCells.H b/src/fileFormats/ensight/part/ensightCells.H
index 33bc98a2f47..cef7c4b2edd 100644
--- a/src/fileFormats/ensight/part/ensightCells.H
+++ b/src/fileFormats/ensight/part/ensightCells.H
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2016 OpenCFD Ltd.
+    \\  /    A nd           | Copyright (C) 2016-2017 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -35,8 +35,6 @@ Description
 
 #include "labelList.H"
 #include "FixedList.H"
-#include "SubList.H"
-#include "NamedEnum.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
@@ -58,18 +56,18 @@ public:
         //- Addressable ensight element types
         enum elemType
         {
-            TETRA4,
-            PYRAMID5,
-            PENTA6,
-            HEXA8,
-            NFACED
+            TETRA4,     //!< "tetra4"
+            PYRAMID5,   //!< "pyramid5"
+            PENTA6,     //!< "penta6"
+            HEXA8,      //!< "hexa8"
+            NFACED      //!< "nfaced"
         };
 
         //- Number of element types (5)
         static const label nTypes;
 
-        //- The Ensight names for each element type
-        static const NamedEnum<elemType, 5> elemEnum;
+        //- The ensight element type names
+        static const char* elemNames[5];
 
 
     // Static Member Functions
@@ -86,17 +84,16 @@ private:
         //  The ensight part number is typically this value +1.
         label index_;
 
-        //- Linear list of ids, sub-sectioned per element type via SubLists
+        //- Linear list of ids, sub-sectioned per element type by sub-lists
         labelList address_;
 
+        //- Slices (sub-lists) of the address ids for each element type.
+        FixedList<labelRange, 5> slices_;
+
         //- List of global sizes for each element type.
         //  Used temporarily for local sizes when building the element lists.
         FixedList<label, 5> sizes_;
 
-        //- List of ids for each element type.
-        //  Managed via pointers, since a SubList cannot be relocated/resized.
-        FixedList<SubList<label>*, 5> lists_;
-
 
     // Private Member Functions
 
@@ -115,7 +112,7 @@ public:
         ensightCells(label partIndex = 0);
 
         //- Copy constructor. Needed for lists etc.
-        ensightCells(const ensightCells&);
+        ensightCells(const ensightCells& obj);
 
 
     //- Destructor
@@ -135,6 +132,9 @@ public:
         //- The processor local size of all elements.
         inline label size() const;
 
+        //- The processor local size of the specified element type.
+        inline label size(const enum elemType) const;
+
         //- The global number of the specified element type.
         //  This value is only meaningful after a reduce operation.
         inline label total(const enum elemType) const;
@@ -151,23 +151,23 @@ public:
         FixedList<label, 5> sizes() const;
 
         //- Processor local starting offset of element type.
-        label offset(const enum elemType what) const;
+        inline label offset(const enum elemType what) const;
 
         //- Return the (local) cell ids of the specified element type
-        inline const labelUList& cellIds(const enum elemType) const;
+        inline const labelUList cellIds(const enum elemType) const;
 
         //- Return the cell ids of all elements
         inline const labelUList& cellIds() const;
 
 
-    // Edit
+      // Edit
 
         //- Classify cell types and set the element lists.
         //  The optional indirect addressing can be used when classifying
         //  groups of cells (eg, from a cellZone etc).
         void classify
         (
-            const polyMesh&,
+            const polyMesh& mesh,
             const labelUList& addressing = labelUList::null()
         );
 
diff --git a/src/fileFormats/ensight/part/ensightCellsI.H b/src/fileFormats/ensight/part/ensightCellsI.H
index 88e01683222..ff03b8fdfde 100644
--- a/src/fileFormats/ensight/part/ensightCellsI.H
+++ b/src/fileFormats/ensight/part/ensightCellsI.H
@@ -29,7 +29,7 @@ License
 
 inline const char* Foam::ensightCells::key(const enum elemType what)
 {
-    return elemEnum[what];
+    return elemNames[what];
 }
 
 
@@ -63,20 +63,24 @@ inline Foam::label Foam::ensightCells::total(const enum elemType what) const
 }
 
 
-inline const Foam::labelUList& Foam::ensightCells::cellIds
+inline Foam::label Foam::ensightCells::size(const enum elemType what) const
+{
+    return slices_[what].size();
+}
+
+
+inline Foam::label Foam::ensightCells::offset(const enum elemType what) const
+{
+    return slices_[what].start();
+}
+
+
+inline const Foam::labelUList Foam::ensightCells::cellIds
 (
     const enum elemType what
 ) const
 {
-    if (!lists_[what])
-    {
-        FatalErrorInFunction
-            << "Accessing unallocated sublist for elem-type: "
-            << elemEnum[what]
-            << exit(FatalError);
-    }
-
-    return *(lists_[what]);
+    return address_[slices_[what]];
 }
 
 
diff --git a/src/fileFormats/ensight/part/ensightFaces.C b/src/fileFormats/ensight/part/ensightFaces.C
index 65117d3cd60..db64d85adbc 100644
--- a/src/fileFormats/ensight/part/ensightFaces.C
+++ b/src/fileFormats/ensight/part/ensightFaces.C
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2016 OpenCFD Ltd.
+    \\  /    A nd           | Copyright (C) 2016-2017 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -27,24 +27,13 @@ License
 #include "error.H"
 #include "polyMesh.H"
 #include "ListOps.H"
-#include "demandDrivenData.H"
 
 // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
 
 const Foam::label Foam::ensightFaces::nTypes = 3;
 
-namespace Foam
-{
-    template<>
-    const char* Foam::NamedEnum
-    <
-        Foam::ensightFaces::elemType,
-        3
-    >::names[] = { "tria3", "quad4", "nsided" };
-}
-
-const Foam::NamedEnum<Foam::ensightFaces::elemType, 3>
-    Foam::ensightFaces::elemEnum;
+const char* Foam::ensightFaces::elemNames[3] =
+    { "tria3", "quad4", "nsided" };
 
 
 // * * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * //
@@ -99,9 +88,8 @@ void Foam::ensightFaces::resizeAll()
     n = 0;
     forAll(sizes_, typei)
     {
-        deleteDemandDrivenData(lists_[typei]);
-
-        lists_[typei] = new SubList<label>(address_, sizes_[typei], n);
+        slices_[typei].setStart(n);
+        slices_[typei].setSize(sizes_[typei]);
 
         n += sizes_[typei];
     }
@@ -118,16 +106,10 @@ Foam::ensightFaces::ensightFaces(label partIndex)
     index_(partIndex),
     address_(),
     flipMap_(),
-    sizes_(Zero),
-    lists_()
+    slices_(),
+    sizes_(Zero)
 {
-    // Ensure sub-lists are properly initialized to nullptr
-    forAll(lists_, typei)
-    {
-        lists_[typei] = nullptr;
-    }
-
-    resizeAll(); // adjust allocation
+    resizeAll(); // adjust allocation/sizing
 }
 
 
@@ -136,22 +118,16 @@ Foam::ensightFaces::ensightFaces(const ensightFaces& obj)
     index_(obj.index_),
     address_(obj.address_),
     flipMap_(obj.flipMap_),
-    sizes_(),
-    lists_()
+    slices_(),
+    sizes_()
 {
-    // Ensure sub-lists are properly initialized to nullptr
-    forAll(lists_, typei)
-    {
-        lists_[typei] = nullptr;
-    }
-
-    // Total (reduced) sizes
+    // Save the total (reduced) sizes
     FixedList<label, 3> totSizes = obj.sizes_;
 
-    // Local sizes
+    // Need local sizes for the resize operation
     this->sizes_ = obj.sizes();
 
-    resizeAll(); // adjust allocation
+    resizeAll(); // adjust allocation/sizing
 
     // Restore total (reduced) sizes
     this->sizes_ = totSizes;
@@ -161,14 +137,7 @@ Foam::ensightFaces::ensightFaces(const ensightFaces& obj)
 // * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
 
 Foam::ensightFaces::~ensightFaces()
-{
-    forAll(lists_, typei)
-    {
-        deleteDemandDrivenData(lists_[typei]);
-    }
-    address_.clear();
-    flipMap_.clear();
-}
+{}
 
 
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
@@ -176,27 +145,15 @@ Foam::ensightFaces::~ensightFaces()
 Foam::FixedList<Foam::label, 3> Foam::ensightFaces::sizes() const
 {
     FixedList<label, 3> count;
-    forAll(lists_, typei)
+    forAll(slices_, typei)
     {
-        count[typei] = lists_[typei]->size();
+        count[typei] = slices_[typei].size();
     }
 
     return count;
 }
 
 
-Foam::label Foam::ensightFaces::offset(const enum elemType what) const
-{
-    label n = 0;
-    for (label typei = 0; typei < label(what); ++typei)
-    {
-        n += lists_[typei]->size();
-    }
-
-    return n;
-}
-
-
 Foam::label Foam::ensightFaces::total() const
 {
     label n = 0;
@@ -217,9 +174,10 @@ void Foam::ensightFaces::clear()
 
 void Foam::ensightFaces::reduce()
 {
+    // No listCombineGather, listCombineScatter for FixedList
     forAll(sizes_, typei)
     {
-        sizes_[typei] = lists_[typei]->size();
+        sizes_[typei] = slices_[typei].size();
         Foam::reduce(sizes_[typei], sumOp<label>());
     }
 }
@@ -229,20 +187,15 @@ void Foam::ensightFaces::sort()
 {
     if (flipMap_.size() == address_.size())
     {
-        // sort flip map too
-
+        // Must sort flip map as well
         labelList order;
-        label start = 0;
 
-        forAll(lists_, typei)
+        forAll(slices_, typei)
         {
-            SubList<label>& idLst = *(lists_[typei]);
-            const label sz = idLst.size();
-
-            if (sz)
+            if (slices_[typei].size())
             {
-                SubList<bool> flip(flipMap_, sz, start);
-                start += sz; // for next sub-list
+                SubList<label> idLst(address_, slices_[typei]);
+                SubList<bool>  flip(flipMap_, slices_[typei]);
 
                 Foam::sortedOrder(idLst, order);
 
@@ -254,11 +207,16 @@ void Foam::ensightFaces::sort()
     else
     {
         // no flip-maps, simpler to sort
-        forAll(lists_, typei)
+        forAll(slices_, typei)
         {
-            Foam::sort(*(lists_[typei]));
+            if (slices_[typei].size())
+            {
+                SubList<label> idLst(address_, slices_[typei]);
+                Foam::sort(idLst);
+            }
         }
-        flipMap_.clear();  // for safety
+
+        flipMap_.clear();  // for extra safety
     }
 }
 
@@ -278,7 +236,7 @@ void Foam::ensightFaces::classify(const faceList& faces)
     }
 
     resizeAll();    // adjust allocation
-    sizes_ = Zero;  // reset sizes
+    sizes_ = Zero;  // reset sizes - use for local indexing here
 
     // Assign face-id per shape type
     for (label listi = 0; listi < sz; ++listi)
@@ -318,7 +276,7 @@ void Foam::ensightFaces::classify
     }
 
     resizeAll();    // adjust allocation
-    sizes_ = Zero;  // reset sizes
+    sizes_ = Zero;  // reset sizes - use for local indexing here
 
     if (useFlip)
     {
@@ -330,11 +288,11 @@ void Foam::ensightFaces::classify
     for (label listi = 0; listi < sz; ++listi)
     {
         const label faceId = addressing[listi];
-        const bool flip = useFlip && flipMap[listi];
+        const bool  doFlip = useFlip && flipMap[listi];
 
         if (!exclude[faceId])
         {
-            add(faces[faceId], faceId, flip);
+            add(faces[faceId], faceId, doFlip);
         }
     }
 }
diff --git a/src/fileFormats/ensight/part/ensightFaces.H b/src/fileFormats/ensight/part/ensightFaces.H
index 844a03e9b35..bd7b3e8c40e 100644
--- a/src/fileFormats/ensight/part/ensightFaces.H
+++ b/src/fileFormats/ensight/part/ensightFaces.H
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2016 OpenCFD Ltd.
+    \\  /    A nd           | Copyright (C) 2016-2017 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -37,7 +37,6 @@ Description
 #include "faceList.H"
 #include "FixedList.H"
 #include "PackedBoolList.H"
-#include "NamedEnum.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
@@ -57,16 +56,16 @@ public:
         //- Addressable ensight element types
         enum elemType
         {
-            TRIA3,
-            QUAD4,
-            NSIDED
+            TRIA3,      //!< "tria3"
+            QUAD4,      //!< "quad4"
+            NSIDED      //!< "nsided"
         };
 
         //- Number of element types (3)
         static const label nTypes;
 
-        //- The Ensight names for each element type
-        static const NamedEnum<elemType, 3> elemEnum;
+        //- The ensight element type names
+        static const char* elemNames[3];
 
 
     // Static Member Functions
@@ -83,28 +82,27 @@ private:
         //  The ensight part number is typically this value +1.
         label index_;
 
-        //- Linear list of ids, sub-sectioned per element type via SubLists
+        //- Linear list of ids, sub-sectioned per element type by sub-lists
         labelList address_;
 
         //- Linear list of face-flips
         boolList flipMap_;
 
+        //- Slices (sub-lists) of the address and flips for each element type.
+        FixedList<labelRange, 3> slices_;
+
         //- List of global sizes for each element type.
         //  Used temporarily for local sizes when building the element lists.
         FixedList<label, 3> sizes_;
 
-        //- SubLists of ids for each element type.
-        //  Managed via pointers, since a SubList cannot be relocated/resized.
-        FixedList<SubList<label>*, 3> lists_;
-
 
     // Private Member Functions
 
         //- Simple classifier
-        inline static elemType whatType(const face&);
+        inline static elemType whatType(const face& f);
 
         //- Low-level internal addition routine
-        inline void add(const face&, const label id, const bool flip = false);
+        inline void add(const face& f, const label id, const bool flip = false);
 
         //- Use temporarily stored sizes to redimension the element lists
         void resizeAll();
@@ -121,7 +119,7 @@ public:
         ensightFaces(label partIndex = 0);
 
         //- Copy constructor. Needed for lists etc.
-        ensightFaces(const ensightFaces&);
+        ensightFaces(const ensightFaces& obj);
 
 
     //- Destructor
@@ -141,14 +139,17 @@ public:
         //- The processor local size of all elements.
         inline label size() const;
 
-        //- The global number of the specified element type.
-        //  This value is only meaningful after a reduce operation.
-        inline label total(const enum elemType) const;
+        //- The processor local size of the specified element type.
+        inline label size(const enum elemType) const;
 
         //- The global number of all element types.
         //  This value is only meaningful after a reduce operation.
         label total() const;
 
+        //- The global number of the specified element type.
+        //  This value is only meaningful after a reduce operation.
+        inline label total(const enum elemType) const;
+
         //- The global numbers per element type.
         //  This value is only meaningful after a reduce operation.
         inline const FixedList<label, 3>& totals() const;
@@ -157,10 +158,10 @@ public:
         FixedList<label, 3> sizes() const;
 
         //- Processor local starting offset of element type.
-        label offset(const enum elemType what) const;
+        inline label offset(const enum elemType what) const;
 
         //- Return the (local) face ids of the specified element type
-        inline const labelUList& faceIds(const enum elemType) const;
+        inline const labelUList faceIds(const enum elemType) const;
 
         //- Return the processor local face ids of all elements
         inline const labelUList& faceIds() const;
diff --git a/src/fileFormats/ensight/part/ensightFacesI.H b/src/fileFormats/ensight/part/ensightFacesI.H
index 4b32a373dbe..78048c1c90b 100644
--- a/src/fileFormats/ensight/part/ensightFacesI.H
+++ b/src/fileFormats/ensight/part/ensightFacesI.H
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2016 OpenCFD Ltd.
+    \\  /    A nd           | Copyright (C) 2016-2017 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -29,7 +29,7 @@ License
 
 inline const char* Foam::ensightFaces::key(const enum elemType what)
 {
-    return elemEnum[what];
+    return elemNames[what];
 }
 
 
@@ -63,20 +63,24 @@ inline Foam::label Foam::ensightFaces::total(const enum elemType what) const
 }
 
 
-inline const Foam::labelUList& Foam::ensightFaces::faceIds
+inline Foam::label Foam::ensightFaces::size(const enum elemType what) const
+{
+    return slices_[what].size();
+}
+
+
+inline Foam::label Foam::ensightFaces::offset(const enum elemType what) const
+{
+    return slices_[what].start();
+}
+
+
+inline const Foam::labelUList Foam::ensightFaces::faceIds
 (
     const enum elemType what
 ) const
 {
-    if (!lists_[what])
-    {
-        FatalErrorInFunction
-            << "Accessing unallocated sublist for elem-type: "
-            << elemEnum[what]
-            << exit(FatalError);
-    }
-
-    return *(lists_[what]);
+    return address_[slices_[what]];
 }
 
 
-- 
GitLab