From 58d09dd5e5bca4c6d3ad07b02720354a6d029261 Mon Sep 17 00:00:00 2001
From: mark <mark@opencfd>
Date: Thu, 19 Oct 2017 18:04:24 +0200
Subject: [PATCH] ENH: emit number of blocks for decomposedBlockData in header

- better documentation of the file contents.
- quicker to obtain number of blocks without reading an entire file.
---
 .../decomposedBlockData/decomposedBlockData.C | 26 +++++++++++++++++--
 .../collatedFileOperation.C                   |  2 +-
 2 files changed, 25 insertions(+), 3 deletions(-)

diff --git a/src/OpenFOAM/db/IOobjects/decomposedBlockData/decomposedBlockData.C b/src/OpenFOAM/db/IOobjects/decomposedBlockData/decomposedBlockData.C
index d5a9336338..21ad121dfb 100644
--- a/src/OpenFOAM/db/IOobjects/decomposedBlockData/decomposedBlockData.C
+++ b/src/OpenFOAM/db/IOobjects/decomposedBlockData/decomposedBlockData.C
@@ -30,8 +30,9 @@ License
 #include "Fstream.H"
 #include "StringStream.H"
 #include "dictionary.H"
-#include <sys/time.h>
 #include "objectRegistry.H"
+#include "foamVersion.H"
+#include <sys/time.h>
 
 // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
 
@@ -204,6 +205,20 @@ void Foam::decomposedBlockData::writeHeader
         << "    version     " << version << ";\n"
         << "    format      " << format << ";\n"
         << "    class       " << type << ";\n";
+
+    // This may be useful to have as well
+    /*
+    if (os.format() == IOstream::BINARY)
+    {
+        os  << "    arch        " << Foam::FOAMbuildArch << ";\n";
+    }
+    */
+
+    if (Pstream::parRun())
+    {
+        os  << "    blocks      " << Pstream::nProcs() << ";\n";
+    }
+
     if (note.size())
     {
         os  << "    note        " << note << ";\n";
@@ -938,7 +953,7 @@ Foam::label Foam::decomposedBlockData::numBlocks(const fileName& fName)
         return nBlocks;
     }
 
-    // Skip header
+    // FoamFile header
     token firstToken(is);
 
     if
@@ -951,8 +966,15 @@ Foam::label Foam::decomposedBlockData::numBlocks(const fileName& fName)
         dictionary headerDict(is);
         is.version(headerDict.lookup("version"));
         is.format(headerDict.lookup("format"));
+
+        // Obtain number of blocks directly
+        if (headerDict.readIfPresent("blocks", nBlocks))
+        {
+            return nBlocks;
+        }
     }
 
+    // Fallback to brute force read of each data block
     List<char> data;
     while (is.good())
     {
diff --git a/src/OpenFOAM/global/fileOperations/collatedFileOperation/collatedFileOperation.C b/src/OpenFOAM/global/fileOperations/collatedFileOperation/collatedFileOperation.C
index b5dbb13517..dd105496a4 100644
--- a/src/OpenFOAM/global/fileOperations/collatedFileOperation/collatedFileOperation.C
+++ b/src/OpenFOAM/global/fileOperations/collatedFileOperation/collatedFileOperation.C
@@ -200,7 +200,7 @@ Foam::fileOperations::collatedFileOperation::collatedFileOperation
                 << "         may \"hang\".  If thread support cannot be "
                    "enabled, deactivate threading" << nl
                 << "         by setting maxThreadFileBufferSize to 0 in "
-                   "$FOAM_ETC/controlDict"
+                   "the OpenFOAM etc/controlDict"
                 << endl;
         }
 
-- 
GitLab