mirror of
https://develop.openfoam.com/Development/openfoam.git
synced 2025-11-28 03:28:01 +00:00
BUG: timeActivatedFileUpdate: was potentially rereading itself!
Fixed by setting flag which then gets queried by Time. Fixes #420.
This commit is contained in:
@ -943,6 +943,17 @@ bool Foam::Time::run() const
|
||||
addProfiling(functionObjects, "functionObjects.execute()");
|
||||
functionObjects_.execute();
|
||||
}
|
||||
|
||||
// Check if the execution of functionObjects require re-reading
|
||||
// any files. This moves effect of e.g. 'timeActivatedFileUpdate'
|
||||
// one time step forward. Note that we cannot call
|
||||
// readModifiedObjects from within timeActivatedFileUpdate since
|
||||
// it might re-read the functionObjects themselves (and delete
|
||||
// the timeActivatedFileUpdate one)
|
||||
if (functionObjects_.filesModified())
|
||||
{
|
||||
const_cast<Time&>(*this).readModifiedObjects();
|
||||
}
|
||||
}
|
||||
|
||||
// Update the "running" status following the
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation
|
||||
\\/ M anipulation |
|
||||
\\/ M anipulation | Copyright (C) 2017 OpenCFD Ltd.
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
@ -146,6 +146,12 @@ bool Foam::functionObject::adjustTimeStep()
|
||||
}
|
||||
|
||||
|
||||
bool Foam::functionObject::filesModified() const
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
void Foam::functionObject::updateMesh(const mapPolyMesh&)
|
||||
{}
|
||||
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation
|
||||
\\/ M anipulation |
|
||||
\\/ M anipulation | Copyright (C) 2017 OpenCFD Ltd.
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
@ -233,6 +233,9 @@ public:
|
||||
//- Called at the end of Time::adjustDeltaT() if adjustTime is true
|
||||
virtual bool adjustTimeStep();
|
||||
|
||||
//- Did any file get changed during execution?
|
||||
virtual bool filesModified() const;
|
||||
|
||||
//- Update for changes of mesh
|
||||
virtual void updateMesh(const mapPolyMesh& mpm);
|
||||
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation
|
||||
\\/ M anipulation | Copyright (C) 2015-2016 OpenCFD Ltd.
|
||||
\\/ M anipulation | Copyright (C) 2015-2017 OpenCFD Ltd.
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
@ -819,6 +819,21 @@ bool Foam::functionObjectList::read()
|
||||
}
|
||||
|
||||
|
||||
bool Foam::functionObjectList::filesModified() const
|
||||
{
|
||||
bool ok = false;
|
||||
if (execution_)
|
||||
{
|
||||
forAll(*this, objectI)
|
||||
{
|
||||
bool changed = operator[](objectI).filesModified();
|
||||
ok = ok || changed;
|
||||
}
|
||||
}
|
||||
return ok;
|
||||
}
|
||||
|
||||
|
||||
void Foam::functionObjectList::updateMesh(const mapPolyMesh& mpm)
|
||||
{
|
||||
if (execution_)
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation
|
||||
\\/ M anipulation | Copyright (C) 2015-2016 OpenCFD Ltd.
|
||||
\\/ M anipulation | Copyright (C) 2015-2017 OpenCFD Ltd.
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
@ -264,6 +264,9 @@ public:
|
||||
//- Called at the end of Time::adjustDeltaT() if adjustTime is true
|
||||
bool adjustTimeStep();
|
||||
|
||||
//- Did any file get changed during execution?
|
||||
bool filesModified() const;
|
||||
|
||||
//- Update for changes of mesh
|
||||
void updateMesh(const mapPolyMesh& mpm);
|
||||
|
||||
|
||||
@ -220,6 +220,17 @@ bool Foam::functionObjects::timeControl::read
|
||||
}
|
||||
|
||||
|
||||
bool Foam::functionObjects::timeControl::filesModified() const
|
||||
{
|
||||
bool mod = false;
|
||||
if (active())
|
||||
{
|
||||
mod = foPtr_->filesModified();
|
||||
}
|
||||
return mod;
|
||||
}
|
||||
|
||||
|
||||
void Foam::functionObjects::timeControl::updateMesh
|
||||
(
|
||||
const mapPolyMesh& mpm
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2016 OpenFOAM Foundation
|
||||
\\/ M anipulation |
|
||||
\\/ M anipulation | Copyright (C) 2017 OpenCFD Ltd.
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
@ -177,6 +177,9 @@ public:
|
||||
//- Called at the end of Time::adjustDeltaT() if adjustTime is true
|
||||
virtual bool adjustTimeStep();
|
||||
|
||||
//- Did any file get changed during execution?
|
||||
virtual bool filesModified() const;
|
||||
|
||||
//- Read and set the function object if its data have changed
|
||||
virtual bool read(const dictionary&);
|
||||
|
||||
|
||||
@ -48,11 +48,10 @@ namespace functionObjects
|
||||
|
||||
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
|
||||
|
||||
void Foam::functionObjects::timeActivatedFileUpdate::updateFile
|
||||
(
|
||||
const bool checkFiles
|
||||
)
|
||||
void Foam::functionObjects::timeActivatedFileUpdate::updateFile()
|
||||
{
|
||||
modified_ = false;
|
||||
|
||||
label i = lastIndex_;
|
||||
while
|
||||
(
|
||||
@ -73,14 +72,7 @@ void Foam::functionObjects::timeActivatedFileUpdate::updateFile
|
||||
mv(destFile, fileToUpdate_);
|
||||
lastIndex_ = i;
|
||||
|
||||
if (checkFiles)
|
||||
{
|
||||
// Do an early check to avoid an additional iteration before
|
||||
// any changes are picked up (see Time::run : does readModified
|
||||
// before executing FOs). Note we have to protect the read
|
||||
// constructor of *this from triggering this behaviour.
|
||||
const_cast<Time&>(time_).Time::readModifiedObjects();
|
||||
}
|
||||
modified_ = true;
|
||||
}
|
||||
}
|
||||
|
||||
@ -98,7 +90,8 @@ Foam::functionObjects::timeActivatedFileUpdate::timeActivatedFileUpdate
|
||||
time_(runTime),
|
||||
fileToUpdate_("unknown-fileToUpdate"),
|
||||
timeVsFile_(),
|
||||
lastIndex_(-1)
|
||||
lastIndex_(-1),
|
||||
modified_(false)
|
||||
{
|
||||
read(dict);
|
||||
}
|
||||
@ -142,8 +135,8 @@ bool Foam::functionObjects::timeActivatedFileUpdate::read
|
||||
<< timeVsFile_[i].second() << endl;
|
||||
}
|
||||
|
||||
// Copy starting files. Avoid recursion by not checking for modified files.
|
||||
updateFile(false);
|
||||
// Copy starting files
|
||||
updateFile();
|
||||
|
||||
return true;
|
||||
}
|
||||
@ -151,7 +144,7 @@ bool Foam::functionObjects::timeActivatedFileUpdate::read
|
||||
|
||||
bool Foam::functionObjects::timeActivatedFileUpdate::execute()
|
||||
{
|
||||
updateFile(true);
|
||||
updateFile();
|
||||
|
||||
return true;
|
||||
}
|
||||
@ -163,4 +156,10 @@ bool Foam::functionObjects::timeActivatedFileUpdate::write()
|
||||
}
|
||||
|
||||
|
||||
bool Foam::functionObjects::timeActivatedFileUpdate::filesModified() const
|
||||
{
|
||||
return modified_;
|
||||
}
|
||||
|
||||
|
||||
// ************************************************************************* //
|
||||
|
||||
@ -106,11 +106,14 @@ class timeActivatedFileUpdate
|
||||
//- Index of last file copied
|
||||
label lastIndex_;
|
||||
|
||||
//- Has anything been copied?
|
||||
bool modified_;
|
||||
|
||||
|
||||
// Private Member Functions
|
||||
|
||||
//- Update file
|
||||
void updateFile(const bool checkFiles);
|
||||
void updateFile();
|
||||
|
||||
//- Disallow default bitwise copy construct
|
||||
timeActivatedFileUpdate(const timeActivatedFileUpdate&);
|
||||
@ -150,6 +153,9 @@ public:
|
||||
|
||||
//- Do nothing
|
||||
virtual bool write();
|
||||
|
||||
//- Did any file get changed during execution?
|
||||
virtual bool filesModified() const;
|
||||
};
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user