From 498fa94cb35f6fc042d34bf00a25acf903ca7e84 Mon Sep 17 00:00:00 2001 From: mattijs <mattijs> Date: Thu, 6 Apr 2017 14:45:16 +0100 Subject: [PATCH] ENH: timeActivatedFileUpdate: avoid copying on master; simplified logic; Fixes #420. --- src/OpenFOAM/db/Time/Time.C | 1 + src/OpenFOAM/db/Time/TimePaths.C | 3 +++ src/OpenFOAM/db/Time/TimePaths.H | 9 +++++++++ src/OpenFOAM/global/argList/argList.C | 12 +++++++----- src/OpenFOAM/global/argList/argList.H | 5 +++++ src/OpenFOAM/global/argList/argListI.H | 8 +++++++- .../timeActivatedFileUpdate.C | 11 +++++++---- 7 files changed, 39 insertions(+), 10 deletions(-) diff --git a/src/OpenFOAM/db/Time/Time.C b/src/OpenFOAM/db/Time/Time.C index 59d09611e5f..b1a67daf308 100644 --- a/src/OpenFOAM/db/Time/Time.C +++ b/src/OpenFOAM/db/Time/Time.C @@ -468,6 +468,7 @@ Foam::Time::Time ( args.parRunControl().parRun(), args.rootPath(), + args.distributed(), args.globalCaseName(), args.caseName(), systemName, diff --git a/src/OpenFOAM/db/Time/TimePaths.C b/src/OpenFOAM/db/Time/TimePaths.C index ae5b5d182f9..05126252c6d 100644 --- a/src/OpenFOAM/db/Time/TimePaths.C +++ b/src/OpenFOAM/db/Time/TimePaths.C @@ -70,6 +70,7 @@ Foam::TimePaths::TimePaths : processorCase_(false), rootPath_(rootPath), + distributed_(false), globalCaseName_(caseName), case_(caseName), system_(systemName), @@ -84,6 +85,7 @@ Foam::TimePaths::TimePaths ( const bool processorCase, const fileName& rootPath, + const bool distributed, const fileName& globalCaseName, const fileName& caseName, const word& systemName, @@ -92,6 +94,7 @@ Foam::TimePaths::TimePaths : processorCase_(processorCase), rootPath_(rootPath), + distributed_(distributed), globalCaseName_(globalCaseName), case_(caseName), system_(systemName), diff --git a/src/OpenFOAM/db/Time/TimePaths.H b/src/OpenFOAM/db/Time/TimePaths.H index f7bbc25d295..32674008b23 100644 --- a/src/OpenFOAM/db/Time/TimePaths.H +++ b/src/OpenFOAM/db/Time/TimePaths.H @@ -53,6 +53,7 @@ class TimePaths bool processorCase_; const fileName rootPath_; + bool distributed_; fileName globalCaseName_; fileName case_; const word system_; @@ -84,6 +85,7 @@ public: ( const bool processorCase, const fileName& rootPath, + const bool distributed, const fileName& globalCaseName, const fileName& caseName, const word& systemName, @@ -139,6 +141,13 @@ public: return constant_; } + //- Is case running with parallel distributed directories + // (i.e. not NFS mounted) + bool distributed() const + { + return distributed_; + } + //- Return constant name for the case // which for parallel runs returns ../constant() fileName caseConstant() const; diff --git a/src/OpenFOAM/global/argList/argList.C b/src/OpenFOAM/global/argList/argList.C index 1139bbb8f16..264d75d2e10 100644 --- a/src/OpenFOAM/global/argList/argList.C +++ b/src/OpenFOAM/global/argList/argList.C @@ -429,7 +429,8 @@ Foam::argList::argList ) : args_(argc), - options_(argc) + options_(argc), + distributed_(false) { // Check if this run is a parallel run by searching for any parallel option // If found call runPar which might filter argv @@ -669,6 +670,7 @@ void Foam::argList::parse label dictNProcs = -1; if (options_.found("roots")) { + distributed_ = true; source = "-roots"; IStringStream is(options_["roots"]); roots = readList<fileName>(is); @@ -700,7 +702,7 @@ void Foam::argList::parse decompDict.lookup("numberOfSubdomains") ); - if (decompDict.lookupOrDefault("distributed", false)) + if (decompDict.lookupOrDefault("distributed", distributed_)) { decompDict.lookup("roots") >> roots; } @@ -771,7 +773,7 @@ void Foam::argList::parse options_.set("case", roots[slave-1]/globalCase_); OPstream toSlave(Pstream::scheduled, slave); - toSlave << args_ << options_; + toSlave << args_ << options_ << roots.size(); } options_.erase("case"); @@ -818,7 +820,7 @@ void Foam::argList::parse ) { OPstream toSlave(Pstream::scheduled, slave); - toSlave << args_ << options_; + toSlave << args_ << options_ << roots.size(); } } } @@ -826,7 +828,7 @@ void Foam::argList::parse { // Collect the master's argument list IPstream fromMaster(Pstream::scheduled, Pstream::masterNo()); - fromMaster >> args_ >> options_; + fromMaster >> args_ >> options_ >> distributed_; // Establish rootPath_/globalCase_/case_ for slave getRootCase(); diff --git a/src/OpenFOAM/global/argList/argList.H b/src/OpenFOAM/global/argList/argList.H index f2635744536..8ff04458c4d 100644 --- a/src/OpenFOAM/global/argList/argList.H +++ b/src/OpenFOAM/global/argList/argList.H @@ -109,6 +109,7 @@ class argList word executable_; fileName rootPath_; + bool distributed_; fileName globalCase_; fileName case_; string argListStr_; @@ -221,6 +222,10 @@ public: //- Return root path inline const fileName& rootPath() const; + //- Return distributed flag (i.e. are rootPaths different on + // different machines) + inline bool distributed() const; + //- Return case name (parallel run) or global case (serial run) inline const fileName& caseName() const; diff --git a/src/OpenFOAM/global/argList/argListI.H b/src/OpenFOAM/global/argList/argListI.H index 47ad29a58eb..28caff6acbc 100644 --- a/src/OpenFOAM/global/argList/argListI.H +++ b/src/OpenFOAM/global/argList/argListI.H @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2011-2013 OpenFOAM Foundation - \\/ M anipulation | + \\/ M anipulation | Copyright (C) 2017 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -39,6 +39,12 @@ inline const Foam::fileName& Foam::argList::rootPath() const } +inline bool Foam::argList::distributed() const +{ + return distributed_; +} + + inline const Foam::fileName& Foam::argList::caseName() const { return case_; diff --git a/src/functionObjects/utilities/timeActivatedFileUpdate/timeActivatedFileUpdate.C b/src/functionObjects/utilities/timeActivatedFileUpdate/timeActivatedFileUpdate.C index cd74fc9ae10..ed48e24fcf4 100644 --- a/src/functionObjects/utilities/timeActivatedFileUpdate/timeActivatedFileUpdate.C +++ b/src/functionObjects/utilities/timeActivatedFileUpdate/timeActivatedFileUpdate.C @@ -67,11 +67,14 @@ void Foam::functionObjects::timeActivatedFileUpdate::updateFile() Log << nl << type() << ": copying file" << nl << timeVsFile_[i].second() << nl << "to:" << nl << fileToUpdate_ << nl << endl; - fileName destFile(fileToUpdate_ + Foam::name(pid())); - cp(timeVsFile_[i].second(), destFile); - mv(destFile, fileToUpdate_); + if (Pstream::master() || time_.distributed()) + { + // Slaves do not copy if running non-distributed + fileName destFile(fileToUpdate_ + Foam::name(pid())); + cp(timeVsFile_[i].second(), destFile); + mv(destFile, fileToUpdate_); + } lastIndex_ = i; - modified_ = true; } } -- GitLab