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