diff --git a/applications/utilities/parallelProcessing/redistributePar/redistributePar.C b/applications/utilities/parallelProcessing/redistributePar/redistributePar.C index baf3104190d430ce905a3c000c7aa3d7588dc303..e463f8d4933da6757962425327666b9e807a1e57 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 999562fa03e584676a68f332ca303eabaa6abd13..e66c6fc019fa8700a0cf6a6d38d27ec8521e9cc4 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 f3887fc056dc8dbd94514e51d6c5bd5f7ae3ac54..6f1f2c64f06e6be0db9aad00cfbd0ceb0e7638d1 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 f96ea886a7a7a286326f2afa416b4c13d6083c01..297627b84d9f7f8f0991dac2ab6320c3b30b0cf4 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 6cc63a868e830dbf35888c11215bfe223a7fbf28..09f9e7f62437cca991230178896c17f4351e6922 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: