From 7379f4525f653608af2e330cffed32d4f65e3779 Mon Sep 17 00:00:00 2001 From: Henry Weller Date: Thu, 16 Jul 2020 17:44:51 +0100 Subject: [PATCH] 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/ where \c 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/ action | Action executed | no | nextWrite \endtable --- .../postProcessing/control/stopAtFile | 18 ++ src/functionObjects/utilities/Make/files | 3 +- src/functionObjects/utilities/abort/abort.C | 199 ------------------ src/functionObjects/utilities/stopAt/stopAt.C | 168 +++++++++++++++ src/functionObjects/utilities/stopAt/stopAt.H | 150 +++++++++++++ .../utilities/stopAt/stopAtFile/stopAtFile.C | 119 +++++++++++ .../stopAtFile/stopAtFile.H} | 80 +++---- 7 files changed, 483 insertions(+), 254 deletions(-) create mode 100644 etc/caseDicts/postProcessing/control/stopAtFile delete mode 100644 src/functionObjects/utilities/abort/abort.C create mode 100644 src/functionObjects/utilities/stopAt/stopAt.C create mode 100644 src/functionObjects/utilities/stopAt/stopAt.H create mode 100644 src/functionObjects/utilities/stopAt/stopAtFile/stopAtFile.C rename src/functionObjects/utilities/{abort/abort.H => stopAt/stopAtFile/stopAtFile.H} (68%) diff --git a/etc/caseDicts/postProcessing/control/stopAtFile b/etc/caseDicts/postProcessing/control/stopAtFile new file mode 100644 index 0000000000..fcd51670f2 --- /dev/null +++ b/etc/caseDicts/postProcessing/control/stopAtFile @@ -0,0 +1,18 @@ +/*--------------------------------*- C++ -*----------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | Website: https://openfoam.org + \\ / A nd | Version: dev + \\/ M anipulation | +------------------------------------------------------------------------------- +Description + Stops the run when the file "stop" is created in the case directory. + +\*---------------------------------------------------------------------------*/ + +type stopAtFile; +libs ("libutilityFunctionObjects.so"); + +file "$FOAM_CASE/stop"; + +// ************************************************************************* // diff --git a/src/functionObjects/utilities/Make/files b/src/functionObjects/utilities/Make/files index 94c6bab14f..dba261b06e 100644 --- a/src/functionObjects/utilities/Make/files +++ b/src/functionObjects/utilities/Make/files @@ -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 diff --git a/src/functionObjects/utilities/abort/abort.C b/src/functionObjects/utilities/abort/abort.C deleted file mode 100644 index 8e14be2a51..0000000000 --- a/src/functionObjects/utilities/abort/abort.C +++ /dev/null @@ -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 . - -\*---------------------------------------------------------------------------*/ - -#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()); - - 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()); - - 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; -} - - -// ************************************************************************* // diff --git a/src/functionObjects/utilities/stopAt/stopAt.C b/src/functionObjects/utilities/stopAt/stopAt.C new file mode 100644 index 0000000000..ea38444657 --- /dev/null +++ b/src/functionObjects/utilities/stopAt/stopAt.C @@ -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 . + +\*---------------------------------------------------------------------------*/ + +#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()); + + 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; +} + + +// ************************************************************************* // diff --git a/src/functionObjects/utilities/stopAt/stopAt.H b/src/functionObjects/utilities/stopAt/stopAt.H new file mode 100644 index 0000000000..00ec2b2c68 --- /dev/null +++ b/src/functionObjects/utilities/stopAt/stopAt.H @@ -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 . + +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 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 + +// ************************************************************************* // diff --git a/src/functionObjects/utilities/stopAt/stopAtFile/stopAtFile.C b/src/functionObjects/utilities/stopAt/stopAtFile/stopAtFile.C new file mode 100644 index 0000000000..d37f0edb64 --- /dev/null +++ b/src/functionObjects/utilities/stopAt/stopAtFile/stopAtFile.C @@ -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 . + +\*---------------------------------------------------------------------------*/ + +#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()); + + 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()); + 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; +} + + +// ************************************************************************* // diff --git a/src/functionObjects/utilities/abort/abort.H b/src/functionObjects/utilities/stopAt/stopAtFile/stopAtFile.H similarity index 68% rename from src/functionObjects/utilities/abort/abort.H rename to src/functionObjects/utilities/stopAt/stopAtFile/stopAtFile.H index e9cec3ba07..303b9c018b 100644 --- a/src/functionObjects/utilities/abort/abort.H +++ b/src/functionObjects/utilities/stopAt/stopAtFile/stopAtFile.H @@ -22,11 +22,10 @@ License along with OpenFOAM. If not, see . 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/ where \c 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/ 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 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; };