From 5d715694dd48ab0cc9b742f7d73598afcf96d068 Mon Sep 17 00:00:00 2001
From: Mark Olesen <Mark.Olesen@Germany>
Date: Wed, 30 Jul 2008 15:50:30 +0200
Subject: [PATCH] PV3FoamReader fixes

  - added printMemory() method to aid debugging memory used
  - call UpdateInformation() if the mesh has changed
  - automatic activation of "internalMesh", "p", "U"
    is suppressed if a fvMesh is cached. Otherwise,
    appearing/disappearing volFields can cause a crash

  Note:
  The message "had to make up a selection value" that sometimes occurs
  seems to be paraview related (see paraview mailing list),
---
 .../PV3FoamReader/vtkPV3Foam/vtkPV3Foam.C     |  69 +++++++++--
 .../PV3FoamReader/vtkPV3Foam/vtkPV3Foam.H     |   5 +-
 .../vtkPV3Foam/vtkPV3FoamAddLagrangianMesh.C  |   2 +
 .../vtkPV3Foam/vtkPV3FoamAddPatchMesh.C       |   2 +
 .../vtkPV3Foam/vtkPV3FoamAddSetMesh.C         |   4 +
 .../vtkPV3Foam/vtkPV3FoamAddVolumeMesh.C      |   2 +
 .../vtkPV3Foam/vtkPV3FoamAddZoneMesh.C        |   4 +
 .../vtkPV3Foam/vtkPV3FoamConvertMesh.C        |  18 +++
 .../vtkPV3Foam/vtkPV3FoamUpdate.C             |   8 ++
 .../vtkPV3Foam/vtkPV3FoamUpdateInformation.C  | 110 +++++++++++-------
 .../vtkPV3FoamUpdateInformationFields.H       |   2 +-
 11 files changed, 171 insertions(+), 55 deletions(-)

diff --git a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3Foam.C b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3Foam.C
index 7cc7fc8698c..8af700450c0 100644
--- a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3Foam.C
+++ b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3Foam.C
@@ -32,6 +32,7 @@ License
 #include "IOobjectList.H"
 #include "patchZones.H"
 #include "vtkPV3FoamReader.h"
+#include "IFstream.H"
 
 // VTK includes
 #include "vtkCharArray.h"
@@ -212,6 +213,8 @@ bool Foam::vtkPV3Foam::setTime(const double& requestedTime)
             if (meshPtr_->readUpdate() != polyMesh::UNCHANGED)
             {
                 meshChanged_ = true;
+                // patches, zones etc might have changed
+                UpdateInformation();
             }
         }
         else
@@ -396,7 +399,6 @@ Foam::stringList Foam::vtkPV3Foam::getSelectedArrayEntries
         Info<< " )" << endl;
     }
 
-
     selections.setSize(nElem);
     return selections;
 }
@@ -480,6 +482,7 @@ Foam::vtkPV3Foam::vtkPV3Foam
     if (debug)
     {
         Info<< "Foam::vtkPV3Foam::vtkPV3Foam - " << FileName << endl;
+        printMemory();
     }
 
     // avoid argList and get rootPath/caseName directly from the file
@@ -565,7 +568,7 @@ void Foam::vtkPV3Foam::UpdateInformation()
 
     stringList selectedEntries;
     // enable 'internalMesh' on the first call
-    if (arraySelection->GetNumberOfArrays() == 0)
+    if (arraySelection->GetNumberOfArrays() == 0 && !meshPtr_)
     {
         selectedEntries.setSize(1);
         selectedEntries[0] = "internalMesh";
@@ -647,6 +650,7 @@ void Foam::vtkPV3Foam::Update
         output->Print(cout);
 
         cout<< " has " << output->GetNumberOfBlocks() << " blocks\n";
+        printMemory();
     }
 
     // Set up region selection(s)
@@ -713,6 +717,7 @@ void Foam::vtkPV3Foam::Update
         output->GetInformation()->Print(cout);
 
         cout<<"ShouldIReleaseData :" << output->ShouldIReleaseData() << "\n";
+        printMemory();
     }
 
     meshChanged_ = fieldsChanged_ = false;
@@ -787,7 +792,7 @@ void Foam::vtkPV3Foam::addPatchNames(vtkRenderer* renderer)
 
     if (debug)
     {
-        Info<<"... add patches: " << selectedPatches <<endl;
+        Info<<"... add patches: " << selectedPatches << endl;
     }
 
     // Find the total number of zones
@@ -876,8 +881,8 @@ void Foam::vtkPV3Foam::addPatchNames(vtkRenderer* renderer)
 
     if (debug)
     {
-        Info<< "patch zone centres = " << zoneCentre << endl;
-        Info<< "zones per patch = " << nZones << endl;
+        Info<< "patch zone centres = " << zoneCentre << nl
+            << "zones per patch = " << nZones << endl;
     }
 
     // Set the size of the patch labels to max number of zones
@@ -898,9 +903,9 @@ void Foam::vtkPV3Foam::addPatchNames(vtkRenderer* renderer)
         {
             if (debug)
             {
-                Info<< "patch name = " << pp.name() << endl;
-                Info<< "anchor = " << zoneCentre[globalZoneI] << endl;
-                Info<< "globalZoneI = " << globalZoneI << endl;
+                Info<< "patch name = " << pp.name() << nl
+                    << "anchor = " << zoneCentre[globalZoneI] << nl
+                    << "globalZoneI = " << globalZoneI << endl;
             }
 
             vtkTextActor* txt = vtkTextActor::New();
@@ -967,14 +972,56 @@ void Foam::vtkPV3Foam::removePatchNames(vtkRenderer* renderer)
 void Foam::vtkPV3Foam::PrintSelf(ostream& os, vtkIndent indent) const
 {
     os  << indent << "Number of meshes: " << nMesh_ << "\n";
-    os  << indent << "Number of nodes: " 
+    os  << indent << "Number of nodes: "
         << (meshPtr_ ? meshPtr_->nPoints() : 0) << "\n";
-    
-    os  << indent << "Number of cells: " 
+
+    os  << indent << "Number of cells: "
         << (meshPtr_ ? meshPtr_->nCells() : 0) << "\n";
 
     os  << indent << "Number of available time steps: "
         << (dbPtr_.valid() ? dbPtr_().times().size() : 0) << endl;
 }
 
+
+// parse these bits of info from /proc/meminfo (Linux)
+//
+// MemTotal:      2062660 kB
+// MemFree:       1124400 kB
+//
+// used = MemTotal - MemFree is what the free(1) uses.
+//
+void Foam::vtkPV3Foam::printMemory()
+{
+    const char* meminfo = "/proc/meminfo";
+
+    if (exists(meminfo))
+    {
+        IFstream is(meminfo);
+        label memTotal = 0;
+        label memFree = 0;
+
+        string line;
+
+        while (is.getLine(line).good())
+        {
+            char tag[32];
+            int value;
+
+            if (sscanf(line.c_str(), "%30s %d", tag, &value) == 2)
+            {
+                if (!strcmp(tag, "MemTotal:"))
+                {
+                    memTotal = value;
+                }
+                else if (!strcmp(tag, "MemFree:"))
+                {
+                    memFree = value;
+                }
+            }
+        }
+
+        Info << "memUsed: " << (memTotal - memFree) << " kB\n";
+    }
+}
+
 // ************************************************************************* //
diff --git a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3Foam.H b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3Foam.H
index b8f75c6939a..0fbed64bfac 100644
--- a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3Foam.H
+++ b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3Foam.H
@@ -628,7 +628,7 @@ public:
 
     // Member Functions
 
-        //- Update 
+        //- Update
         void UpdateInformation();
 
         void Update(vtkMultiBlockDataSet* output);
@@ -653,6 +653,9 @@ public:
         //- Debug information
         void PrintSelf(ostream&, vtkIndent) const;
 
+        //- Simple memory used debugging information
+        static void printMemory();
+
 };
 
 
diff --git a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamAddLagrangianMesh.C b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamAddLagrangianMesh.C
index d4d31aa3cca..d4463109a9c 100644
--- a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamAddLagrangianMesh.C
+++ b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamAddLagrangianMesh.C
@@ -52,6 +52,7 @@ void Foam::vtkPV3Foam::addLagrangianMesh
     {
         Info<< "<beg> Foam::vtkPV3Foam::addLagrangianMesh - timePath "
             << mesh.time().timePath()/"lagrangian" << endl;
+        printMemory();
     }
 
     fileNameList cloudDirs
@@ -103,6 +104,7 @@ void Foam::vtkPV3Foam::addLagrangianMesh
     if (debug)
     {
         Info<< "<end> Foam::vtkPV3Foam::addLagrangianMesh" << endl;
+        printMemory();
     }
 }
 
diff --git a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamAddPatchMesh.C b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamAddPatchMesh.C
index 37392c905f7..7c8a586ebab 100644
--- a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamAddPatchMesh.C
+++ b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamAddPatchMesh.C
@@ -49,6 +49,7 @@ void Foam::vtkPV3Foam::addPatchMesh
     if (debug)
     {
         Info<< "<beg> Foam::vtkPV3Foam::addPatchMesh - " << p.name() << endl;
+        printMemory();
     }
 
     // Convert Foam mesh vertices to VTK
@@ -88,6 +89,7 @@ void Foam::vtkPV3Foam::addPatchMesh
     if (debug)
     {
         Info<< "<end> Foam::vtkPV3Foam::addPatchMesh - " << p.name() << endl;
+        printMemory();
     }
 }
 
diff --git a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamAddSetMesh.C b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamAddSetMesh.C
index 8b17ace1852..18835fe427f 100644
--- a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamAddSetMesh.C
+++ b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamAddSetMesh.C
@@ -50,6 +50,7 @@ void Foam::vtkPV3Foam::addFaceSetMesh
     if (debug)
     {
         Info<< "<beg> Foam::vtkPV3Foam::addFaceSetMesh" << endl;
+        printMemory();
     }
 
     // Construct primitivePatch of faces in fSet.
@@ -101,6 +102,7 @@ void Foam::vtkPV3Foam::addFaceSetMesh
     if (debug)
     {
         Info<< "<end> Foam::vtkPV3Foam::addFaceSetMesh" << endl;
+        printMemory();
     }
 }
 
@@ -115,6 +117,7 @@ void Foam::vtkPV3Foam::addPointSetMesh
     if (debug)
     {
         Info<< "<beg> Foam::vtkPV3Foam::addPointSetMesh" << endl;
+        printMemory();
     }
 
     const pointField& meshPoints = mesh.points();
@@ -133,6 +136,7 @@ void Foam::vtkPV3Foam::addPointSetMesh
     if (debug)
     {
         Info<< "<end> Foam::vtkPV3Foam::addPointSetMesh" << endl;
+        printMemory();
     }
 }
 
diff --git a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamAddVolumeMesh.C b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamAddVolumeMesh.C
index 5de9114eef4..292fb8d2a09 100644
--- a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamAddVolumeMesh.C
+++ b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamAddVolumeMesh.C
@@ -55,6 +55,7 @@ void Foam::vtkPV3Foam::addVolumeMesh
     if (debug)
     {
         Info<< "<beg> Foam::vtkPV3Foam::addVolumeMesh" << endl;
+        printMemory();
     }
 
     // Number of additional points needed by the decomposition of polyhedra
@@ -354,6 +355,7 @@ void Foam::vtkPV3Foam::addVolumeMesh
     if (debug)
     {
         Info<< "<end> Foam::vtkPV3Foam::addVolumeMesh" << endl;
+        printMemory();
     }
 }
 
diff --git a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamAddZoneMesh.C b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamAddZoneMesh.C
index b9c733eeed0..9c52624f0f9 100644
--- a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamAddZoneMesh.C
+++ b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamAddZoneMesh.C
@@ -49,6 +49,7 @@ void Foam::vtkPV3Foam::addFaceZoneMesh
     if (debug)
     {
         Info<< "<beg> Foam::vtkPV3Foam::addFaceZoneMesh" << endl;
+        printMemory();
     }
 
     // Construct primitivePatch of faces in fSet.
@@ -99,6 +100,7 @@ void Foam::vtkPV3Foam::addFaceZoneMesh
     if (debug)
     {
         Info<< "<end> Foam::vtkPV3Foam::addFaceZoneMesh" << endl;
+        printMemory();
     }
 }
 
@@ -114,6 +116,7 @@ void Foam::vtkPV3Foam::addPointZoneMesh
     if (debug)
     {
         Info<< "<beg> Foam::vtkPV3Foam::addPointZoneMesh" << endl;
+        printMemory();
     }
 
     const pointField& meshPoints = mesh.points();
@@ -132,6 +135,7 @@ void Foam::vtkPV3Foam::addPointZoneMesh
     if (debug)
     {
         Info<< "<beg> Foam::vtkPV3Foam::addPointZoneMesh" << endl;
+        printMemory();
     }
 }
 
diff --git a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamConvertMesh.C b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamConvertMesh.C
index 16e0c43b97b..33b5891f046 100644
--- a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamConvertMesh.C
+++ b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamConvertMesh.C
@@ -51,6 +51,7 @@ void Foam::vtkPV3Foam::convertMeshVolume
     if (debug)
     {
         Info<< "<beg> Foam::vtkPV3Foam::convertMeshVolume" << endl;
+        printMemory();
     }
 
     const selectionInfo& selector = selectInfoVolume_;
@@ -92,6 +93,7 @@ void Foam::vtkPV3Foam::convertMeshVolume
     if (debug)
     {
         Info<< "<end> Foam::vtkPV3Foam::convertMeshVolume" << endl;
+        printMemory();
     }
 }
 
@@ -104,6 +106,7 @@ void Foam::vtkPV3Foam::convertMeshLagrangian
     if (debug)
     {
         Info<< "<beg> Foam::vtkPV3Foam::convertMeshLagrangian" << endl;
+        printMemory();
     }
 
     const selectionInfo& selector = selectInfoLagrangian_;
@@ -139,6 +142,7 @@ void Foam::vtkPV3Foam::convertMeshLagrangian
     if (debug)
     {
         Info<< "<end> Foam::vtkPV3Foam::convertMeshLagrangian" << endl;
+        printMemory();
     }
 }
 
@@ -151,6 +155,7 @@ void Foam::vtkPV3Foam::convertMeshPatches
     if (debug)
     {
         Info<< "<beg> Foam::vtkPV3Foam::convertMeshPatches" << endl;
+        printMemory();
     }
 
     const selectionInfo& selector = selectInfoPatches_;
@@ -209,6 +214,7 @@ void Foam::vtkPV3Foam::convertMeshPatches
     if (debug)
     {
         Info<< "<end> Foam::vtkPV3Foam::convertMeshPatches" << endl;
+        printMemory();
     }
 }
 
@@ -221,6 +227,7 @@ void Foam::vtkPV3Foam::convertMeshCellZones
     if (debug)
     {
         Info<< "<beg> Foam::vtkPV3Foam::convertMeshCellZones" << endl;
+        printMemory();
     }
 
     const selectionInfo& selector = selectInfoCellZones_;
@@ -281,6 +288,7 @@ void Foam::vtkPV3Foam::convertMeshCellZones
     if (debug)
     {
         Info<< "<end> Foam::vtkPV3Foam::convertMeshCellZones" << endl;
+        printMemory();
     }
 }
 
@@ -293,6 +301,7 @@ void Foam::vtkPV3Foam::convertMeshCellSets
     if (debug)
     {
         Info<< "<beg> Foam::vtkPV3Foam::convertMeshCellSets" << endl;
+        printMemory();
     }
 
     const selectionInfo& selector = selectInfoCellSets_;
@@ -360,6 +369,7 @@ void Foam::vtkPV3Foam::convertMeshCellSets
     if (debug)
     {
         Info<< "<end> Foam::vtkPV3Foam::convertMeshCellSets" << endl;
+        printMemory();
     }
 }
 
@@ -372,6 +382,7 @@ void Foam::vtkPV3Foam::convertMeshFaceZones
     if (debug)
     {
         Info<< "<beg> Foam::vtkPV3Foam::convertMeshFaceZones" << endl;
+        printMemory();
     }
 
     const selectionInfo& selector = selectInfoFaceZones_;
@@ -422,6 +433,7 @@ void Foam::vtkPV3Foam::convertMeshFaceZones
     if (debug)
     {
         Info<< "<end> Foam::vtkPV3Foam::convertMeshFaceZones" << endl;
+        printMemory();
     }
 }
 
@@ -434,6 +446,7 @@ void Foam::vtkPV3Foam::convertMeshFaceSets
     if (debug)
     {
         Info<< "<beg> Foam::vtkPV3Foam::convertMeshFaceSets" << endl;
+        printMemory();
     }
 
     const selectionInfo& selector = selectInfoFaceSets_;
@@ -492,6 +505,7 @@ void Foam::vtkPV3Foam::convertMeshFaceSets
     if (debug)
     {
         Info<< "<end> Foam::vtkPV3Foam::convertMeshFaceSets" << endl;
+        printMemory();
     }
 }
 
@@ -504,6 +518,7 @@ void Foam::vtkPV3Foam::convertMeshPointZones
     if (debug)
     {
         Info<< "<beg> Foam::vtkPV3Foam::convertMeshPointZones" << endl;
+        printMemory();
     }
 
     const selectionInfo& selector = selectInfoPointZones_;
@@ -554,6 +569,7 @@ void Foam::vtkPV3Foam::convertMeshPointZones
     if (debug)
     {
         Info<< "<end> Foam::vtkPV3Foam::convertMeshPointZones" << endl;
+        printMemory();
     }
 }
 
@@ -567,6 +583,7 @@ void Foam::vtkPV3Foam::convertMeshPointSets
     if (debug)
     {
         Info<< "<beg> Foam::vtkPV3Foam::convertMeshPointSets" << endl;
+        printMemory();
     }
 
     const selectionInfo& selector = selectInfoPointSets_;
@@ -625,6 +642,7 @@ void Foam::vtkPV3Foam::convertMeshPointSets
     if (debug)
     {
         Info<< "<end> Foam::vtkPV3Foam::convertMeshPointSets" << endl;
+        printMemory();
     }
 }
 
diff --git a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamUpdate.C b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamUpdate.C
index 23562903c40..8f4a83c43f3 100644
--- a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamUpdate.C
+++ b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamUpdate.C
@@ -48,6 +48,7 @@ void Foam::vtkPV3Foam::updateFoamMesh()
     if (debug)
     {
         Info<< "<beg> Foam::vtkPV3Foam::updateFoamMesh" << endl;
+        printMemory();
     }
 
     if (!reader_->GetCacheMesh())
@@ -86,6 +87,7 @@ void Foam::vtkPV3Foam::updateFoamMesh()
     if (debug)
     {
         Info<< "<end> Foam::vtkPV3Foam::updateFoamMesh" << endl;
+        printMemory();
     }
 }
 
@@ -98,6 +100,7 @@ void Foam::vtkPV3Foam::updateVolFields
     if (debug)
     {
         Info<< "<beg> Foam::vtkPV3Foam::updateVolFields" << endl;
+        printMemory();
     }
 
     const fvMesh& mesh = *meshPtr_;
@@ -162,6 +165,7 @@ void Foam::vtkPV3Foam::updateVolFields
     if (debug)
     {
         Info<< "<end> Foam::vtkPV3Foam::updateVolFields" << endl;
+        printMemory();
     }
 }
 
@@ -174,6 +178,7 @@ void Foam::vtkPV3Foam::updatePointFields
     if (debug)
     {
         Info<< "<beg> Foam::vtkPV3Foam::updatePointFields" << endl;
+        printMemory();
     }
 
     const fvMesh& mesh = *meshPtr_;
@@ -213,6 +218,7 @@ void Foam::vtkPV3Foam::updatePointFields
     if (debug)
     {
         Info<< "<end> Foam::vtkPV3Foam::updatePointFields" << endl;
+        printMemory();
     }
 }
 
@@ -225,6 +231,7 @@ void Foam::vtkPV3Foam::updateLagrangianFields
     if (debug)
     {
         Info<< "<beg> Foam::vtkPV3Foam::updateLagrangianFields" << endl;
+        printMemory();
     }
 
     const fvMesh& mesh = *meshPtr_;
@@ -276,6 +283,7 @@ void Foam::vtkPV3Foam::updateLagrangianFields
     if (debug)
     {
         Info<< "<end> Foam::vtkPV3Foam::updateLagrangianFields" << endl;
+        printMemory();
     }
 }
 
diff --git a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamUpdateInformation.C b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamUpdateInformation.C
index a37224643c4..031d8aad58d 100644
--- a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamUpdateInformation.C
+++ b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamUpdateInformation.C
@@ -211,42 +211,68 @@ void Foam::vtkPV3Foam::updateInformationPatches()
     }
 
     vtkDataArraySelection *arraySelection = reader_->GetRegionSelection();
-
-    // Read patches
-    polyBoundaryMeshEntries patchEntries
-    (
-        IOobject
-        (
-            "boundary",
-            dbPtr_().findInstance(polyMesh::meshSubDir, "boundary"),
-            polyMesh::meshSubDir,
-            dbPtr_(),
-            IOobject::MUST_READ,
-            IOobject::NO_WRITE,
-            false
-        )
-    );
-
     selectInfoPatches_ = arraySelection->GetNumberOfArrays();
+
     int nPatches = 0;
 
-    // Start regions at patches
-    forAll (patchEntries, entryI)
+    if (meshPtr_)
     {
-        label nFaces(readLabel(patchEntries[entryI].dict().lookup("nFaces")));
-
-        // Valid patch if nFace > 0
-        if (nFaces)
+        const polyBoundaryMesh& patches = meshPtr_->boundaryMesh();
+        forAll (patches, patchI)
         {
-            // Add patch to GUI region list
-            arraySelection->AddArray
+            const polyPatch& pp = patches[patchI];
+
+            if (pp.size())
+            {
+                // Add patch to GUI region list
+                arraySelection->AddArray
+                (
+                    (pp.name() + " - patch").c_str()
+                );
+
+                ++nPatches;
+            }
+        }
+    }
+    else
+    {
+        // Read patches
+        polyBoundaryMeshEntries patchEntries
+        (
+            IOobject
             (
-                (patchEntries[entryI].keyword() + " - patch").c_str()
+                "boundary",
+                dbPtr_().findInstance(polyMesh::meshSubDir, "boundary"),
+                polyMesh::meshSubDir,
+                dbPtr_(),
+                IOobject::MUST_READ,
+                IOobject::NO_WRITE,
+                false
+            )
+        );
+
+        // Start regions at patches
+        forAll (patchEntries, entryI)
+        {
+            label nFaces
+            (
+                readLabel(patchEntries[entryI].dict().lookup("nFaces"))
             );
 
-            ++nPatches;
+            // Valid patch if nFace > 0
+            if (nFaces)
+            {
+                // Add patch to GUI region list
+                arraySelection->AddArray
+                (
+                    (patchEntries[entryI].keyword() + " - patch").c_str()
+                );
+
+                ++nPatches;
+            }
         }
     }
+
     selectInfoPatches_ += nPatches;
 
     if (debug)
@@ -269,26 +295,26 @@ void Foam::vtkPV3Foam::updateInformationZones()
 
     vtkDataArraySelection *arraySelection = reader_->GetRegionSelection();
 
-    wordList zoneNames;
+    wordList namesLst;
 
     //
     // cellZones information
     // ~~~~~~~~~~~~~~~~~~~~~
     if (meshPtr_)
     {
-        zoneNames = meshPtr_->cellZones().names();
+        namesLst = meshPtr_->cellZones().names();
     }
     else
     {
-        zoneNames = readZoneNames("cellZones");
+        namesLst = readZoneNames("cellZones");
     }
 
     selectInfoCellZones_ = arraySelection->GetNumberOfArrays();
-    forAll (zoneNames, zoneI)
+    forAll (namesLst, elemI)
     {
-        arraySelection->AddArray((zoneNames[zoneI] + " - cellZone").c_str());
+        arraySelection->AddArray((namesLst[elemI] + " - cellZone").c_str());
     }
-    selectInfoCellZones_ += zoneNames.size();
+    selectInfoCellZones_ += namesLst.size();
     zoneSuperCells_.setSize(selectInfoCellZones_.size());
 
 
@@ -297,19 +323,19 @@ void Foam::vtkPV3Foam::updateInformationZones()
     // ~~~~~~~~~~~~~~~~~~~~~
     if (meshPtr_)
     {
-        zoneNames = meshPtr_->faceZones().names();
+        namesLst = meshPtr_->faceZones().names();
     }
     else
     {
-        zoneNames = readZoneNames("faceZones");
+        namesLst = readZoneNames("faceZones");
     }
 
     selectInfoFaceZones_ = arraySelection->GetNumberOfArrays();
-    forAll (zoneNames, zoneI)
+    forAll (namesLst, elemI)
     {
-        arraySelection->AddArray((zoneNames[zoneI] + " - faceZone").c_str());
+        arraySelection->AddArray((namesLst[elemI] + " - faceZone").c_str());
     }
-    selectInfoFaceZones_ += zoneNames.size();
+    selectInfoFaceZones_ += namesLst.size();
 
 
     //
@@ -317,19 +343,19 @@ void Foam::vtkPV3Foam::updateInformationZones()
     // ~~~~~~~~~~~~~~~~~~~~~~
     if (meshPtr_)
     {
-        zoneNames = meshPtr_->pointZones().names();
+        namesLst = meshPtr_->pointZones().names();
     }
     else
     {
-        zoneNames = readZoneNames("pointZones");
+        namesLst = readZoneNames("pointZones");
     }
 
     selectInfoPointZones_ = arraySelection->GetNumberOfArrays();
-    forAll (zoneNames, zoneI)
+    forAll (namesLst, elemI)
     {
-        arraySelection->AddArray((zoneNames[zoneI] + " - pointZone").c_str());
+        arraySelection->AddArray((namesLst[elemI] + " - pointZone").c_str());
     }
-    selectInfoPointZones_ += zoneNames.size();
+    selectInfoPointZones_ += namesLst.size();
 
 
     if (debug)
diff --git a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamUpdateInformationFields.H b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamUpdateInformationFields.H
index a5c110e3b98..b9d7df9fa55 100644
--- a/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamUpdateInformationFields.H
+++ b/applications/utilities/postProcessing/graphics/PV3FoamReader/vtkPV3Foam/vtkPV3FoamUpdateInformationFields.H
@@ -45,7 +45,7 @@ void Foam::vtkPV3Foam::updateInformationFields
 
     stringList selectedEntries;
     // enable 'p' and 'U' on the first call
-    if (arraySelection->GetNumberOfArrays() == 0)
+    if (arraySelection->GetNumberOfArrays() == 0 && !meshPtr_)
     {
         selectedEntries.setSize(2);
         selectedEntries[0] = "p";
-- 
GitLab