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