From d703f09d11a97d28a1e65f6566292ac308f533f7 Mon Sep 17 00:00:00 2001 From: mattijs <mattijs> Date: Tue, 29 May 2018 12:13:13 +0100 Subject: [PATCH] BUG: fileOperation: avoid par syn in uncollated. Fixes #846. --- .../redistributePar/redistributePar.C | 6 ++++++ .../fileOperation/fileOperation.C | 20 +++++++++++++++++-- .../fileOperation/fileOperation.H | 16 +++++++++++---- .../uncollatedFileOperation.C | 17 +++++++++++++++- .../uncollatedFileOperation.H | 11 +++++++++- 5 files changed, 62 insertions(+), 8 deletions(-) diff --git a/applications/utilities/parallelProcessing/redistributePar/redistributePar.C b/applications/utilities/parallelProcessing/redistributePar/redistributePar.C index baf3104190d..e463f8d4933 100644 --- a/applications/utilities/parallelProcessing/redistributePar/redistributePar.C +++ b/applications/utilities/parallelProcessing/redistributePar/redistributePar.C @@ -2396,7 +2396,10 @@ int main(int argc, char *argv[]) instantList timeDirs; if (Pstream::master()) { + const bool oldParRun = Pstream::parRun(); + Pstream::parRun() = false; timeDirs = Time::findTimes(args.path(), "constant"); + Pstream::parRun() = oldParRun; } Pstream::scatter(timeDirs); for (const instant& t : timeDirs) @@ -2432,7 +2435,10 @@ int main(int argc, char *argv[]) if (Pstream::master()) { + const bool oldParRun = Pstream::parRun(); + Pstream::parRun() = false; timeDirs = Time::findTimes(basePath, "constant"); + Pstream::parRun() = oldParRun; } Pstream::scatter(timeDirs); for (const instant& t : timeDirs) diff --git a/src/OpenFOAM/global/fileOperations/fileOperation/fileOperation.C b/src/OpenFOAM/global/fileOperations/fileOperation/fileOperation.C index 999562fa03e..e66c6fc019f 100644 --- a/src/OpenFOAM/global/fileOperations/fileOperation/fileOperation.C +++ b/src/OpenFOAM/global/fileOperations/fileOperation/fileOperation.C @@ -238,7 +238,11 @@ bool Foam::fileOperation::isFileOrDir(const bool isFile, const fileName& f) Foam::tmpNrc<Foam::fileOperation::dirIndexList> -Foam::fileOperation::lookupProcessorsPath(const fileName& fName) const +Foam::fileOperation::lookupAndCacheProcessorsPath +( + const fileName& fName, + const bool syncPar +) const { // If path is local to a processor (e.g. contains 'processor2') // find the corresponding actual processor directory (e.g. 'processors4') @@ -344,7 +348,11 @@ Foam::fileOperation::lookupProcessorsPath(const fileName& fName) const } } - if (returnReduce(procDirs.size(), sumOp<label>())) + if + ( + (syncPar && returnReduce(procDirs.size(), sumOp<label>())) + || (!syncPar && procDirs.size()) + ) { procsDirs_.insert(procPath, procDirs); @@ -362,6 +370,14 @@ Foam::fileOperation::lookupProcessorsPath(const fileName& fName) const } +Foam::tmpNrc<Foam::fileOperation::dirIndexList> +Foam::fileOperation::lookupProcessorsPath(const fileName& fName) const +{ + // Use parallel synchronisation + return lookupAndCacheProcessorsPath(fName, true); +} + + bool Foam::fileOperation::exists(IOobject& io) const { // Generate output filename for object diff --git a/src/OpenFOAM/global/fileOperations/fileOperation/fileOperation.H b/src/OpenFOAM/global/fileOperations/fileOperation/fileOperation.H index f3887fc056d..6f1f2c64f06 100644 --- a/src/OpenFOAM/global/fileOperations/fileOperation/fileOperation.H +++ b/src/OpenFOAM/global/fileOperations/fileOperation/fileOperation.H @@ -131,12 +131,20 @@ protected: //- Helper: check for file (isFile) or directory (!isFile) static bool isFileOrDir(const bool isFile, const fileName&); - //- Detect presence of processorsDDD - void cacheProcessorsPath(const fileName& fName) const; + //- Lookup name of processorsDDD using cache. Return empty fileName + // if not found. + tmpNrc<dirIndexList> lookupAndCacheProcessorsPath + ( + const fileName&, + const bool syncPar + ) const; //- Lookup name of processorsDDD using cache. Return empty fileName - // if not found - tmpNrc<dirIndexList> lookupProcessorsPath(const fileName&) const; + // if not found. To be called on all processors + virtual tmpNrc<dirIndexList> lookupProcessorsPath + ( + const fileName& + ) const; //- Does ioobject exist. Is either a directory (empty name()) or // a file diff --git a/src/OpenFOAM/global/fileOperations/uncollatedFileOperation/uncollatedFileOperation.C b/src/OpenFOAM/global/fileOperations/uncollatedFileOperation/uncollatedFileOperation.C index f96ea886a7a..297627b84d9 100644 --- a/src/OpenFOAM/global/fileOperations/uncollatedFileOperation/uncollatedFileOperation.C +++ b/src/OpenFOAM/global/fileOperations/uncollatedFileOperation/uncollatedFileOperation.C @@ -113,7 +113,11 @@ Foam::fileName Foam::fileOperations::uncollatedFileOperation::filePathInfo { tmpNrc<dirIndexList> pDirs ( - lookupProcessorsPath(io.objectPath()) + fileOperation::lookupAndCacheProcessorsPath + ( + io.objectPath(), + false + ) ); forAll(pDirs(), i) { @@ -159,6 +163,17 @@ Foam::fileName Foam::fileOperations::uncollatedFileOperation::filePathInfo } +Foam::tmpNrc<Foam::fileOperation::dirIndexList> +Foam::fileOperations::uncollatedFileOperation::lookupProcessorsPath +( + const fileName& fName +) const +{ + // Do not use parallel synchronisation + return lookupAndCacheProcessorsPath(fName, false); +} + + // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // Foam::fileOperations::uncollatedFileOperation::uncollatedFileOperation diff --git a/src/OpenFOAM/global/fileOperations/uncollatedFileOperation/uncollatedFileOperation.H b/src/OpenFOAM/global/fileOperations/uncollatedFileOperation/uncollatedFileOperation.H index 6cc63a868e8..09f9e7f6243 100644 --- a/src/OpenFOAM/global/fileOperations/uncollatedFileOperation/uncollatedFileOperation.H +++ b/src/OpenFOAM/global/fileOperations/uncollatedFileOperation/uncollatedFileOperation.H @@ -50,7 +50,9 @@ class uncollatedFileOperation : public fileOperation { - // Private Member Functions +protected: + + // Protected Member Functions //- Search for an object. // checkGlobal : also check undecomposed case @@ -63,6 +65,13 @@ class uncollatedFileOperation const bool search ) const; + //- Lookup name of processorsDDD using cache. Return empty fileName + // if not found. Do not use any parallel synchronisation + virtual tmpNrc<dirIndexList> lookupProcessorsPath + ( + const fileName& + ) const; + public: -- GitLab