functionObjects::stopAt: New abstract base class for run stop conditions

By default the case stops following the next write but stopping immediately with
or without writing are also options.

The stopAtFile functionObject derived from stopAt stops the run when a file
predefined file is created in the case directory:

Description
    Stops the run when the specified file is created in the case directory.

    The default name of the trigger file is \c $FOAM_CASE/<name> where \c
    <name> is the name of the functionObject entry and the default action is \c
    nextWrite.

    Currently the following action types are supported:
    - noWriteNow
    - writeNow
    - nextWrite

    Examples of function object specification:
    \verbatim
    stop
    {
        type stopAtFile;
        libs ("libutilityFunctionObjects.so");
    }
    \endverbatim
    will stop the run at the next write after the file "stop" is created in the
    case directory.

    \verbatim
    stop
    {
        type stopAtFile;
        libs ("libutilityFunctionObjects.so");
        file "$FOAM_CASE/stop";
        action writeNow;
    }
    \endverbatim
    will write the fields and stop the run when the file "stop" is created in
    the case directory.

Usage
    \table
        Property | Description            | Required | Default value
        type     | type name: stopAtFile  | yes      |
        file     | Trigger file path name | no       | $FOAM_CASE/<name>
        action   | Action executed        | no       | nextWrite
    \endtable
This commit is contained in:
Henry Weller
2020-07-16 17:44:51 +01:00
parent c140e681cb
commit 7379f4525f
7 changed files with 483 additions and 254 deletions

View File

@ -3,7 +3,8 @@ residuals/residuals.C
timeActivatedFileUpdate/timeActivatedFileUpdate.C
setTimeStep/setTimeStepFunctionObject.C
systemCall/systemCall.C
abort/abort.C
stopAt/stopAt.C
stopAt/stopAtFile/stopAtFile.C
removeRegisteredObject/removeRegisteredObject.C
writeDictionary/writeDictionary.C
writeObjects/writeObjects.C

View File

@ -1,199 +0,0 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org
\\ / A nd | Copyright (C) 2011-2018 OpenFOAM Foundation
\\/ M anipulation |
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
OpenFOAM is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
\*---------------------------------------------------------------------------*/
#include "abort.H"
#include "dictionary.H"
#include "error.H"
#include "Time.H"
#include "OSspecific.H"
#include "PstreamReduceOps.H"
#include "addToRunTimeSelectionTable.H"
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
namespace Foam
{
namespace functionObjects
{
defineTypeNameAndDebug(abort, 0);
addToRunTimeSelectionTable
(
functionObject,
abort,
dictionary
);
}
}
template<>
const char* Foam::NamedEnum
<
Foam::functionObjects::abort::actionType,
3
>::names[] =
{
"noWriteNow",
"writeNow",
"nextWrite"
};
const Foam::NamedEnum
<
Foam::functionObjects::abort::actionType,
3
> Foam::functionObjects::abort::actionTypeNames_;
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
void Foam::functionObjects::abort::removeFile() const
{
bool hasAbort = isFile(abortFile_);
reduce(hasAbort, orOp<bool>());
if (hasAbort && Pstream::master())
{
// Cleanup ABORT file (on master only)
rm(abortFile_);
}
}
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
Foam::functionObjects::abort::abort
(
const word& name,
const Time& runTime,
const dictionary& dict
)
:
functionObject(name),
time_(runTime),
abortFile_("$FOAM_CASE/" + name),
action_(actionType::nextWrite)
{
abortFile_.expand();
read(dict);
// Remove any old files from previous runs
removeFile();
}
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
Foam::functionObjects::abort::~abort()
{}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
bool Foam::functionObjects::abort::read(const dictionary& dict)
{
if (dict.found("action"))
{
action_ = actionTypeNames_.read(dict.lookup("action"));
}
else
{
action_ = actionType::nextWrite;
}
if (dict.readIfPresent("file", abortFile_))
{
abortFile_.expand();
}
return true;
}
bool Foam::functionObjects::abort::execute()
{
bool hasAbort = isFile(abortFile_);
reduce(hasAbort, orOp<bool>());
if (hasAbort)
{
switch (action_)
{
case actionType::noWriteNow :
{
if (time_.stopAt(Time::stopAtControl::noWriteNow))
{
Info<< "USER REQUESTED ABORT (timeIndex="
<< time_.timeIndex()
<< "): stop without writing data"
<< endl;
}
break;
}
case actionType::writeNow :
{
if (time_.stopAt(Time::stopAtControl::writeNow))
{
Info<< "USER REQUESTED ABORT (timeIndex="
<< time_.timeIndex()
<< "): stop+write data"
<< endl;
}
break;
}
case actionType::nextWrite :
{
if (time_.stopAt(Time::stopAtControl::nextWrite))
{
Info<< "USER REQUESTED ABORT (timeIndex="
<< time_.timeIndex()
<< "): stop after next data write"
<< endl;
}
break;
}
}
}
return true;
}
bool Foam::functionObjects::abort::write()
{
return true;
}
bool Foam::functionObjects::abort::end()
{
removeFile();
return true;
}
// ************************************************************************* //

View File

@ -0,0 +1,168 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org
\\ / A nd | Copyright (C) 2020 OpenFOAM Foundation
\\/ M anipulation |
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
OpenFOAM is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
\*---------------------------------------------------------------------------*/
#include "stopAt.H"
#include "Time.H"
#include "addToRunTimeSelectionTable.H"
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
namespace Foam
{
namespace functionObjects
{
defineTypeNameAndDebug(stopAt, 0);
}
}
template<>
const char* Foam::NamedEnum
<
Foam::functionObjects::stopAt::actionType,
3
>::names[] =
{
"noWriteNow",
"writeNow",
"nextWrite"
};
const Foam::NamedEnum
<
Foam::functionObjects::stopAt::actionType,
3
> Foam::functionObjects::stopAt::actionTypeNames_;
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
Foam::functionObjects::stopAt::stopAt
(
const word& name,
const Time& runTime,
const dictionary& dict
)
:
functionObject(name),
time_(runTime),
action_(actionType::nextWrite),
stopped_(false)
{
read(dict);
}
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
Foam::functionObjects::stopAt::~stopAt()
{}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
bool Foam::functionObjects::stopAt::read(const dictionary& dict)
{
if (dict.found("action"))
{
action_ = actionTypeNames_.read(dict.lookup("action"));
}
else
{
action_ = actionType::nextWrite;
}
return true;
}
bool Foam::functionObjects::stopAt::execute()
{
if (!stopped_)
{
bool stopCondition = condition();
reduce(stopCondition, orOp<bool>());
if (stopCondition)
{
switch (action_)
{
case actionType::noWriteNow :
{
if (time_.stopAt(Time::stopAtControl::noWriteNow))
{
Info<< type() << "(timeIndex="
<< time_.timeIndex()
<< "): stopping now without writing"
<< endl;
}
break;
}
case actionType::writeNow :
{
if (time_.stopAt(Time::stopAtControl::writeNow))
{
Info<< type() << "(timeIndex="
<< time_.timeIndex()
<< "): stopping now after writing"
<< endl;
}
break;
}
case actionType::nextWrite :
{
if (time_.stopAt(Time::stopAtControl::nextWrite))
{
Info<< type() << "(timeIndex="
<< time_.timeIndex()
<< "): stopping after next write"
<< endl;
}
break;
}
}
stopped_ = true;
}
}
return true;
}
bool Foam::functionObjects::stopAt::write()
{
return true;
}
bool Foam::functionObjects::stopAt::end()
{
return true;
}
// ************************************************************************* //

View File

@ -0,0 +1,150 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org
\\ / A nd | Copyright (C) 2020 OpenFOAM Foundation
\\/ M anipulation |
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
OpenFOAM is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
Class
Foam::functionObjects::stopAt
Description
Abstract base class for stop conditions.
Currently the following actions are supported:
- noWriteNow
- writeNow
- nextWrite
SourceFiles
stopAt.C
\*---------------------------------------------------------------------------*/
#ifndef functionObjects_stopAt_H
#define functionObjects_stopAt_H
#include "functionObject.H"
#include "NamedEnum.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
namespace functionObjects
{
/*---------------------------------------------------------------------------*\
Class stopAt Declaration
\*---------------------------------------------------------------------------*/
class stopAt
:
public functionObject
{
public:
//- Enumeration defining the type of action
enum class actionType
{
noWriteNow, //!< stop immediately without writing data
writeNow, //!< write data and stop immediately
nextWrite //!< stop the next time data are written
};
protected:
// Protected data
//- Reference to the Time
const Time& time_;
//- Action type names
static const NamedEnum<actionType, 3> actionTypeNames_;
//- The type of action
actionType action_;
//- Set true when the stop action has executed
bool stopped_;
// Protected Member Functions
//- Return true when the stop condition is achieved
virtual bool condition() const = 0;
public:
//- Runtime type information
TypeName("stopAt");
// Constructors
//- Construct from Time and dictionary
stopAt
(
const word& name,
const Time& runTime,
const dictionary&
);
//- Disallow default bitwise copy construction
stopAt(const stopAt&) = delete;
//- Destructor
virtual ~stopAt();
// Member Functions
//- Read the dictionary settings
virtual bool read(const dictionary&);
//- Execute, check existence of stopAt file and take action
virtual bool execute();
//- Execute, check existence of stopAt file and take action
virtual bool write();
//- Execute at the final time-loop, used for cleanup
virtual bool end();
// Member Operators
//- Disallow default bitwise assignment
void operator=(const stopAt&) = delete;
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace functionObjects
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //

View File

@ -0,0 +1,119 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org
\\ / A nd | Copyright (C) 2011-2020 OpenFOAM Foundation
\\/ M anipulation |
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
OpenFOAM is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
\*---------------------------------------------------------------------------*/
#include "stopAtFile.H"
#include "dictionary.H"
#include "OSspecific.H"
#include "PstreamReduceOps.H"
#include "addToRunTimeSelectionTable.H"
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
namespace Foam
{
namespace functionObjects
{
defineTypeNameAndDebug(stopAtFile, 0);
addToRunTimeSelectionTable
(
functionObject,
stopAtFile,
dictionary
);
}
}
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
void Foam::functionObjects::stopAtFile::removeFile() const
{
bool fileExists = isFile(stopAtFileFile_);
reduce(fileExists, orOp<bool>());
if (fileExists && Pstream::master())
{
// Cleanup ABORT file (on master only)
rm(stopAtFileFile_);
}
}
bool Foam::functionObjects::stopAtFile::condition() const
{
bool fileExists = isFile(stopAtFileFile_);
reduce(fileExists, orOp<bool>());
return fileExists;
}
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
Foam::functionObjects::stopAtFile::stopAtFile
(
const word& name,
const Time& runTime,
const dictionary& dict
)
:
stopAt(name, runTime, dict),
stopAtFileFile_("$FOAM_CASE/" + name)
{
stopAtFileFile_.expand();
read(dict);
// Remove any old files from previous runs
removeFile();
}
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
Foam::functionObjects::stopAtFile::~stopAtFile()
{}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
bool Foam::functionObjects::stopAtFile::read(const dictionary& dict)
{
if (dict.readIfPresent("file", stopAtFileFile_))
{
stopAtFileFile_.expand();
}
return true;
}
bool Foam::functionObjects::stopAtFile::end()
{
removeFile();
return true;
}
// ************************************************************************* //

View File

@ -22,11 +22,10 @@ License
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
Class
Foam::functionObjects::abort
Foam::functionObjects::stopAtFile
Description
Watches for presence of the named file in the $FOAM_CASE directory
and aborts the calculation if it is present.
Stops the run when the specified file is created in the case directory.
The default name of the trigger file is \c $FOAM_CASE/<name> where \c
<name> is the name of the functionObject entry and the default action is \c
@ -39,19 +38,19 @@ Description
Examples of function object specification:
\verbatim
abort
stop
{
type abort;
type stopAtFile;
libs ("libutilityFunctionObjects.so");
}
\endverbatim
will stop the run at the next write after the file "abort" is created in the
will stop the run at the next write after the file "stop" is created in the
case directory.
\verbatim
abort
stop
{
type abort;
type stopAtFile;
libs ("libutilityFunctionObjects.so");
file "$FOAM_CASE/stop";
action writeNow;
@ -63,21 +62,20 @@ Description
Usage
\table
Property | Description | Required | Default value
type | type name: abort | yes |
type | type name: stopAtFile | yes |
file | Trigger file path name | no | $FOAM_CASE/<name>
action | Action executed | no | nextWrite
\endtable
SourceFiles
abort.C
stopAtFile.C
\*---------------------------------------------------------------------------*/
#ifndef functionObjects_abort_H
#define functionObjects_abort_H
#ifndef functionObjects_stopAtFile_H
#define functionObjects_stopAtFile_H
#include "functionObject.H"
#include "NamedEnum.H"
#include "stopAt.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
@ -87,58 +85,38 @@ namespace functionObjects
{
/*---------------------------------------------------------------------------*\
Class abort Declaration
Class stopAtFile Declaration
\*---------------------------------------------------------------------------*/
class abort
class stopAtFile
:
public functionObject
public stopAt
{
public:
// Public data
//- Enumeration defining the type of action
enum class actionType
{
noWriteNow, //!< stop immediately without writing data
writeNow, //!< write data and stop immediately
nextWrite //!< stop the next time data are written
};
private:
// Private Data
//- Reference to the Time
const Time& time_;
//- The fully-qualified name of the abort file
fileName abortFile_;
//- Action type names
static const NamedEnum<actionType, 3> actionTypeNames_;
//- The type of action
actionType action_;
//- The fully-qualified name of the stopAtFile file
fileName stopAtFileFile_;
// Private Member Functions
//- Remove abort file.
//- Remove stopAtFile file.
void removeFile() const;
//- Return true when the stop condition is achieved
virtual bool condition() const;
public:
//- Runtime type information
TypeName("abort");
TypeName("stopAtFile");
// Constructors
//- Construct from Time and dictionary
abort
stopAtFile
(
const word& name,
const Time& runTime,
@ -146,11 +124,11 @@ public:
);
//- Disallow default bitwise copy construction
abort(const abort&) = delete;
stopAtFile(const stopAtFile&) = delete;
//- Destructor
virtual ~abort();
virtual ~stopAtFile();
// Member Functions
@ -158,12 +136,6 @@ public:
//- Read the dictionary settings
virtual bool read(const dictionary&);
//- Execute, check existence of abort file and take action
virtual bool execute();
//- Execute, check existence of abort file and take action
virtual bool write();
//- Execute at the final time-loop, used for cleanup
virtual bool end();
@ -171,7 +143,7 @@ public:
// Member Operators
//- Disallow default bitwise assignment
void operator=(const abort&) = delete;
void operator=(const stopAtFile&) = delete;
};