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; };