Commit b7fb6d60 authored by Mark Olesen's avatar Mark Olesen
Browse files

ENH: limit file checks in the abort function object to the master process

- do not recheck the abort after it has been triggered once.
  This reduces the output clutter and file checks.
parent b890e5c0
......@@ -3,7 +3,7 @@
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2011-2017 OpenFOAM Foundation
\\/ M anipulation | Copyright (C) 2016 OpenCFD Ltd.
\\/ M anipulation | Copyright (C) 2016-2017 OpenCFD Ltd.
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
......@@ -61,19 +61,43 @@ Foam::functionObjects::abort::actionNames_
};
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
// * * * * * * * * * * * * * * * Local Functions * * * * * * * * * * * * * * //
void Foam::functionObjects::abort::removeFile() const
// file-scope
// Long description for the action name
namespace Foam
{
bool hasAbort = isFile(abortFile_);
reduce(hasAbort, orOp<bool>());
if (hasAbort && Pstream::master())
static std::string longDescription(const Time::stopAtControls ctrl)
{
switch (ctrl)
{
// Cleanup ABORT file (on master only)
rm(abortFile_);
case Foam::Time::saNoWriteNow :
{
return "stop without writing data";
break;
}
case Time::saWriteNow :
{
return "stop and write data";
break;
}
case Time::saNextWrite :
{
return "stop after next data write";
break;
}
default:
{
// Invalid choices already filtered out by Enum
return "abort";
break;
}
}
}
}
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
......@@ -88,13 +112,17 @@ Foam::functionObjects::abort::abort
functionObject(name),
time_(runTime),
abortFile_("$FOAM_CASE/" + name),
action_(Time::stopAtControls::saNextWrite)
action_(Time::stopAtControls::saNextWrite),
triggered_(false)
{
abortFile_.expand();
read(dict);
// Remove any old files from previous runs
removeFile();
// Cleanup old files from previous runs
if (Pstream::master())
{
Foam::rm(abortFile_);
}
}
......@@ -110,6 +138,13 @@ bool Foam::functionObjects::abort::read(const dictionary& dict)
{
functionObject::read(dict);
if (dict.readIfPresent("file", abortFile_))
{
abortFile_.expand();
}
const auto oldAction = action_;
action_ = actionNames_.lookupOrDefault
(
"action",
......@@ -117,64 +152,42 @@ bool Foam::functionObjects::abort::read(const dictionary& dict)
Time::stopAtControls::saNextWrite
);
if (dict.readIfPresent("file", abortFile_))
// User can change action and re-trigger the abort.
// eg, they had nextWrite, but actually wanted writeNow.
if (oldAction != action_)
{
abortFile_.expand();
triggered_ = false;
}
Info<< type() << " activated ("
<< longDescription(action_).c_str() <<")" << nl
<< " File: " << abortFile_ << endl;
return true;
}
bool Foam::functionObjects::abort::execute()
{
bool hasAbort = isFile(abortFile_);
reduce(hasAbort, orOp<bool>());
if (hasAbort)
// If it has been triggered (eg, nextWrite) don't need to check it again
if (!triggered_)
{
switch (action_)
{
case Time::saNoWriteNow :
{
if (time_.stopAt(action_))
{
Info<< "USER REQUESTED ABORT (timeIndex="
<< time_.timeIndex()
<< "): stop without writing data"
<< endl;
}
break;
}
bool hasAbort = (Pstream::master() && isFile(abortFile_));
Pstream::scatter(hasAbort);
case Time::saWriteNow :
{
if (time_.stopAt(action_))
{
Info<< "USER REQUESTED ABORT (timeIndex="
<< time_.timeIndex()
<< "): stop+write data"
<< endl;
}
break;
}
if (hasAbort)
{
triggered_ = time_.stopAt(action_);
case Time::saNextWrite :
if (triggered_)
{
if (time_.stopAt(action_))
{
Info<< "USER REQUESTED ABORT (timeIndex="
<< time_.timeIndex()
<< "): stop after next data write"
<< endl;
}
break;
Info<< "USER REQUESTED ABORT (timeIndex="
<< time_.timeIndex()
<< "): " << longDescription(action_).c_str()
<< endl;
}
default:
{
// Invalid choices already filtered out by Enum
}
Pstream::scatter(triggered_);
}
}
......@@ -190,7 +203,12 @@ bool Foam::functionObjects::abort::write()
bool Foam::functionObjects::abort::end()
{
removeFile();
// Cleanup ABORT file
if (Pstream::master())
{
Foam::rm(abortFile_);
}
return true;
}
......
......@@ -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.
......@@ -30,12 +30,21 @@ Group
Description
Watches for presence of the named file in the $FOAM_CASE directory
and aborts the calculation if it is present.
The presence of the abort file is only checked on the master process.
Currently the following action types are supported:
- noWriteNow
- writeNow
- nextWrite
\heading Function object usage
\table
Property | Description | Required | Default value
type | Type name: abort | yes |
file | The abort filename | no | $FOAM_CASE/name
action | Abort action | no | nextWrite
\endtable
SourceFiles
abort.C
......@@ -55,7 +64,7 @@ namespace functionObjects
{
/*---------------------------------------------------------------------------*\
Class abort Declaration
Class abort Declaration
\*---------------------------------------------------------------------------*/
class abort
......@@ -76,11 +85,11 @@ class abort
//- The type of action
Time::stopAtControls action_;
//- Only trigger action once
bool triggered_;
// Private Member Functions
//- Remove abort file.
void removeFile() const;
// Private Member Functions
//- Disallow default bitwise copy construct
abort(const abort&) = delete;
......@@ -102,7 +111,7 @@ public:
(
const word& name,
const Time& runTime,
const dictionary&
const dictionary& dict
);
......@@ -115,13 +124,13 @@ public:
//- Read the dictionary settings
virtual bool read(const dictionary& dict);
//- Execute, check existence of abort file and take action
//- Check existence of abort file and take action
virtual bool execute();
//- Execute, check existence of abort file and take action
//- No-op
virtual bool write();
//- Execute at the final time-loop, used for cleanup
//- Remove abort file after the final time-loop.
virtual bool end();
};
......
// OpenFOAM dictionary -*- C++ -*-
ABORT
{
type abort;
libs ("libutilityFunctionObjects.so");
//file "$FOAM_CASE/ABORT"; // default name
// action writeNow;
action nextWrite;
}
// ************************************************************************* //
......@@ -59,6 +59,7 @@ writeInterval 100;
functions
{
#include "abort"
#include "scalarTransport"
#include "sampling"
}
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment