From aebd79ff59ba31113928b36e5baf10d61496f1a0 Mon Sep 17 00:00:00 2001
From: Mark Olesen <Mark.Olesen@esi-group.com>
Date: Mon, 19 Dec 2022 16:05:12 +0100
Subject: [PATCH] BUG: parallel blocking writing surface noise output (fixes
 #2663)

- old logic (v2206 and earlier) always disabled writing on non-master,
  but other parts of the code were more recently updated to use lazy
  evaluation of surface data (with parallel communication)

- now retain full write/no-write logic identically on all ranks. Take
  care of master/non-master at the final output stage.
---
 .../noise/noiseModels/noiseModel/noiseModel.C | 28 +++++++--------
 .../noise/noiseModels/noiseModel/noiseModel.H | 14 ++------
 .../noise/noiseModels/pointNoise/pointNoise.C | 16 ++++++---
 .../noiseModels/surfaceNoise/surfaceNoise.C   | 34 +++++++++++--------
 4 files changed, 47 insertions(+), 45 deletions(-)

diff --git a/src/randomProcesses/noise/noiseModels/noiseModel/noiseModel.C b/src/randomProcesses/noise/noiseModels/noiseModel/noiseModel.C
index 7b7ca07052a..e2f1246b018 100644
--- a/src/randomProcesses/noise/noiseModels/noiseModel/noiseModel.C
+++ b/src/randomProcesses/noise/noiseModels/noiseModel/noiseModel.C
@@ -157,30 +157,28 @@ namespace Foam
 }
 
 
-// * * * * * * * * * * * * * Protected Member Functions  * * * * * * * * * * //
+// * * * * * * * * * * * * * * * Local Functions * * * * * * * * * * * * * * //
+
+namespace Foam
+{
 
-void Foam::noiseModel::readWriteOption
+// Get bool option (eg, read/write) and provide Info feedback
+static void readWriteOption
 (
     const dictionary& dict,
     const word& lookup,
     bool& option
-) const
+)
 {
     dict.readIfPresent(lookup, option);
 
-    // Only writing on the master process
-    option = option && Pstream::master();
-
-    if (option)
-    {
-        Info<< "        " << lookup << ": " << "yes" << endl;
-    }
-    else
-    {
-        Info<< "        " << lookup << ": " << "no" << endl;
-    }
+    Info<< "        " << lookup << ": " << (option ? "yes" : "no") << endl;
 }
 
+} // End namespace Foam
+
+
+// * * * * * * * * * * * * * Protected Member Functions  * * * * * * * * * * //
 
 Foam::scalar Foam::noiseModel::checkUniformTimeStep
 (
@@ -255,7 +253,7 @@ void Foam::noiseModel::writeFileHeader
     Ostream& os,
     const string& x,
     const string& y,
-    const List<Tuple2<string, token>>& headerValues
+    const UList<Tuple2<string, token>>& headerValues
 ) const
 {
     writeHeader(os, x + " vs " + y);
diff --git a/src/randomProcesses/noise/noiseModels/noiseModel/noiseModel.H b/src/randomProcesses/noise/noiseModels/noiseModel/noiseModel.H
index aa57a599dac..7a937fe8573 100644
--- a/src/randomProcesses/noise/noiseModels/noiseModel/noiseModel.H
+++ b/src/randomProcesses/noise/noiseModels/noiseModel/noiseModel.H
@@ -76,8 +76,8 @@ SourceFiles
 
 \*---------------------------------------------------------------------------*/
 
-#ifndef noiseModel_H
-#define noiseModel_H
+#ifndef Foam_noiseModel_H
+#define Foam_noiseModel_H
 
 #include "writeFile.H"
 #include "dictionary.H"
@@ -220,14 +220,6 @@ protected:
 
     // Protected Member Functions
 
-        //- Helper function to read write options and provide info feedback
-        void readWriteOption
-        (
-            const dictionary& dict,
-            const word& lookup,
-            bool& option
-        ) const;
-
         //- Check and return uniform time step
         scalar checkUniformTimeStep
         (
@@ -257,7 +249,7 @@ protected:
             Ostream& os,
             const string& x,
             const string& y,
-            const List<Tuple2<string, token>>& headerValues = {}
+            const UList<Tuple2<string, token>>& headerValues = {}
         ) const;
 
         // Write frequency-based data to file
diff --git a/src/randomProcesses/noise/noiseModels/pointNoise/pointNoise.C b/src/randomProcesses/noise/noiseModels/pointNoise/pointNoise.C
index 2554c52219b..88b741efb9a 100644
--- a/src/randomProcesses/noise/noiseModels/pointNoise/pointNoise.C
+++ b/src/randomProcesses/noise/noiseModels/pointNoise/pointNoise.C
@@ -74,6 +74,14 @@ void pointNoise::processData
     const Function1Types::CSV<scalar>& data
 )
 {
+    if (!Pstream::master())
+    {
+        // Only ever called on master, report if we have odd logic...
+        WarningInFunction
+            << "Currently only to be called from master process..." << endl;
+        return;
+    }
+
     Info<< "Reading data file: "
         << fileObr_.time().relativePath(data.fName()) << endl;
 
@@ -131,7 +139,7 @@ void pointNoise::processData
         auto filePtr = newFile(outDir/"PSD_f");
         auto& os = filePtr();
 
-        Info<< "    Writing " << os.name() << endl;
+        Info<< "    Writing " << os.relativeName() << endl;
 
         writeFileHeader(os, "f [Hz]", "PSD(f) [PaPa_Hz]");
         writeFreqDataToFile(os, f, PSDf);
@@ -143,7 +151,7 @@ void pointNoise::processData
         auto filePtr = newFile(outDir/"PSD_dB_Hz_f");
         auto& os = filePtr();
 
-        Info<< "    Writing " << os.name() << endl;
+        Info<< "    Writing " << os.relativeName() << endl;
 
         writeFileHeader(os, "f [Hz]", "PSD(f) [dB_Hz]");
         writeFreqDataToFile(os, f, PSD(PSDf));
@@ -155,7 +163,7 @@ void pointNoise::processData
         auto filePtr = newFile(outDir/"SPL_dB_f");
         auto& os = filePtr();
 
-        Info<< "    Writing " << os.name() << endl;
+        Info<< "    Writing " << os.relativeName() << endl;
 
         writeFileHeader
         (
@@ -190,7 +198,7 @@ void pointNoise::processData
         auto filePtr = newFile(outDir/"SPL13_dB_fm");
         auto& os = filePtr();
 
-        Info<< "    Writing " << os.name() << endl;
+        Info<< "    Writing " << os.relativeName() << endl;
 
         writeFileHeader
         (
diff --git a/src/randomProcesses/noise/noiseModels/surfaceNoise/surfaceNoise.C b/src/randomProcesses/noise/noiseModels/surfaceNoise/surfaceNoise.C
index b5ed3794a19..806b815d817 100644
--- a/src/randomProcesses/noise/noiseModels/surfaceNoise/surfaceNoise.C
+++ b/src/randomProcesses/noise/noiseModels/surfaceNoise/surfaceNoise.C
@@ -362,7 +362,7 @@ scalar surfaceNoise::writeSurfaceData
                 areaAverage = sum(allData)/(allData.size() + ROOTVSMALL);
             }
 
-            if (writeSurface)
+            // (writeSurface == true)
             {
                 // Time-aware, with time spliced into the output path
                 writerPtr_->beginTime(freqInst);
@@ -397,7 +397,7 @@ scalar surfaceNoise::writeSurfaceData
             areaAverage = sum(data)/(data.size() + ROOTVSMALL);
         }
 
-        if (writeSurface)
+        // (writeSurface == true)
         {
             // Time-aware, with time spliced into the output path
             writerPtr_->beginTime(freqInst);
@@ -693,15 +693,19 @@ void surfaceNoise::calculate()
             surfArea = sum(surf.magSf());
             surfSize = surf.size();
         }
-        Pstream::broadcast(surfArea);
-        Pstream::broadcast(surfSize);
+        Pstream::broadcasts
+        (
+            UPstream::worldComm,
+            surfArea,
+            surfSize
+        );
 
-        List<Tuple2<string, token>> commonInfo =
-            {
-                {"Area average", token(word(Switch::name(areaAverage_)))},
-                {"Area sum", token(surfArea)},
-                {"Number of faces", token(surfSize)}
-            };
+        List<Tuple2<string, token>> commonInfo
+        ({
+            {"Area average", token(word(Switch::name(areaAverage_)))},
+            {"Area sum", token(surfArea)},
+            {"Number of faces", token(surfSize)}
+        });
 
         {
             fileName outDir(outDirBase/"fft");
@@ -782,7 +786,7 @@ void surfaceNoise::calculate()
                     auto filePtr = newFile(outDir/"Average_Prms_f");
                     auto& os = filePtr();
 
-                    Info<< "    Writing " << os.name() << endl;
+                    Info<< "    Writing " << os.relativeName() << endl;
 
                     writeFileHeader(os, "f [Hz]", "P(f) [Pa]", commonInfo);
                     writeFreqDataToFile(os, fOut, PrmsfAve);
@@ -791,7 +795,7 @@ void surfaceNoise::calculate()
                     auto filePtr = newFile(outDir/"Average_PSD_f_f");
                     auto& os = filePtr();
 
-                    Info<< "    Writing " << os.name() << endl;
+                    Info<< "    Writing " << os.relativeName() << endl;
 
                     writeFileHeader
                     (
@@ -806,7 +810,7 @@ void surfaceNoise::calculate()
                     auto filePtr = newFile(outDir/"Average_PSD_dB_Hz_f");
                     auto& os = filePtr();
 
-                    Info<< "    Writing " << os.name() << endl;
+                    Info<< "    Writing " << os.relativeName() << endl;
 
                     writeFileHeader
                     (
@@ -821,7 +825,7 @@ void surfaceNoise::calculate()
                     auto filePtr = newFile(outDir/"Average_SPL_dB_f");
                     auto& os = filePtr();
 
-                    Info<< "    Writing " << os.name() << endl;
+                    Info<< "    Writing " << os.relativeName() << endl;
 
                     writeFileHeader
                     (
@@ -866,7 +870,7 @@ void surfaceNoise::calculate()
                 auto filePtr = newFile(outDir/"Average_SPL13_dB_fm");
                 auto& os = filePtr();
 
-                Info<< "    Writing " << os.name() << endl;
+                Info<< "    Writing " << os.relativeName() << endl;
 
                 writeFileHeader
                 (
-- 
GitLab