ENH: Multiple updates to function objects

Updated objects
- corrected Peclet number for compressible cases
- propagated log flag and resultName across objects

New function objects
- new fluxSummary:
  - calculates positive, negative, absolute and net flux across face
    zones
- new runTimeControl
  - abort the calculation when a user-defined metric is achieved.
    Available options include:
    - average value remains unchanged wrt a given threshold
    - equation initial residual exceeds a threshold - useful to abort
      diverging cases
    - equation max iterations exceeds a threshold - useful to abort
      diverging cases
    - min/max of a function object value
    - min time step exceeds a threshold - useful to abort diverging
      cases
- new valueAverage:
  - average singular values from other function objects, e.g. Cd, Cl and
    Cm from the forceCoeffs function object
This commit is contained in:
Andrew Heather
2015-11-25 17:19:06 +00:00
parent f4de5d17e4
commit 6838df9cd2
129 changed files with 9233 additions and 3546 deletions

View File

@ -0,0 +1,49 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2015 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/>.
Typedef
Foam::IOrunTimeControl
Description
Instance of the generic IOOutputFilter for runTimeControl.
\*---------------------------------------------------------------------------*/
#ifndef IOrunTimeControl_H
#define IOrunTimeControl_H
#include "runTimeControl.H"
#include "IOOutputFilter.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
typedef IOOutputFilter<runTimeControl> IOrunTimeControl;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //

View File

@ -0,0 +1,179 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2015 OpenFOAM Foundation
\\/ M anipulation | Copyright (C) 2015 OpenCFD Ltd.
-------------------------------------------------------------------------------
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 "averageCondition.H"
#include "addToRunTimeSelectionTable.H"
#include "Time.H"
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
namespace Foam
{
defineTypeNameAndDebug(averageCondition, 0);
addToRunTimeSelectionTable(runTimeCondition, averageCondition, dictionary);
}
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
Foam::averageCondition::averageCondition
(
const word& name,
const objectRegistry& obr,
const dictionary& dict,
functionObjectState& state
)
:
runTimeCondition(name, obr, dict, state),
functionObjectName_(dict.lookup("functionObjectName")),
fieldNames_(dict.lookup("fields")),
tolerance_(readScalar(dict.lookup("tolerance"))),
window_(dict.lookupOrDefault<scalar>("window", -1)),
totalTime_(fieldNames_.size(), obr_.time().deltaTValue()),
resetOnRestart_(false)
{
if (resetOnRestart_)
{
const dictionary& dict = conditionDict();
forAll(fieldNames_, fieldI)
{
const word& fieldName = fieldNames_[fieldI];
if (dict.found(fieldName))
{
const dictionary& valueDict = dict.subDict(fieldName);
totalTime_[fieldI] = readScalar(valueDict.lookup("totalTime"));
}
}
}
}
// * * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * //
Foam::averageCondition::~averageCondition()
{}
// * * * * * * * * * * * * * * Public Member Functions * * * * * * * * * * * //
bool Foam::averageCondition::apply()
{
bool satisfied = true;
if (!active_)
{
return satisfied;
}
scalar dt = obr_.time().deltaTValue();
if (log_) Info<< " " << type() << ": " << name_ << " averages:" << nl;
DynamicList<label> unprocessedFields(fieldNames_.size());
forAll(fieldNames_, fieldI)
{
const word& fieldName(fieldNames_[fieldI]);
scalar Dt = totalTime_[fieldI];
scalar alpha = (Dt - dt)/Dt;
scalar beta = dt/Dt;
if (window_ > 0)
{
if (Dt - dt >= window_)
{
alpha = (window_ - dt)/window_;
beta = dt/window_;
}
else
{
// Ensure that averaging is performed over window time
// before condition can be satisfied
satisfied = false;
}
}
bool processed = false;
calc<scalar>(fieldName, alpha, beta, satisfied, processed);
calc<vector>(fieldName, alpha, beta, satisfied, processed);
calc<sphericalTensor>(fieldName, alpha, beta, satisfied, processed);
calc<symmTensor>(fieldName, alpha, beta, satisfied, processed);
calc<tensor>(fieldName, alpha, beta, satisfied, processed);
if (!processed)
{
unprocessedFields.append(fieldI);
}
totalTime_[fieldI] += dt;
}
if (unprocessedFields.size())
{
WarningIn("bool Foam::averageCondition::apply()")
<< "From function object: " << functionObjectName_ << nl
<< "Unprocessed fields:" << nl;
forAll(unprocessedFields, i)
{
label fieldI = unprocessedFields[i];
Info<< " " << fieldNames_[fieldI] << nl;
}
}
if (log_) Info<< endl;
return satisfied;
}
void Foam::averageCondition::write()
{
dictionary& conditionDict = this->conditionDict();
forAll(fieldNames_, fieldI)
{
const word& fieldName = fieldNames_[fieldI];
// value dictionary should be present - mean values are written there
if (conditionDict.found(fieldName))
{
dictionary& valueDict = conditionDict.subDict(fieldName);
valueDict.add("totalTime", totalTime_[fieldI], true);
}
else
{
dictionary valueDict;
valueDict.add("totalTime", totalTime_[fieldI], true);
conditionDict.add(fieldName, valueDict);
}
}
}
// ************************************************************************* //

View File

@ -0,0 +1,136 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2015 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::averageCondition
Description
Average run time condition - satisfied when average does not change by
more than a given value.
SourceFiles
averageCondition.H
averageCondition.C
\*---------------------------------------------------------------------------*/
#ifndef averageCondition_H
#define averageCondition_H
#include "runTimeCondition.H"
#include "Switch.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
/*---------------------------------------------------------------------------*\
Class averageCondition Declaration
\*---------------------------------------------------------------------------*/
class averageCondition
:
public runTimeCondition
{
protected:
// Protected data
//- Name of function object to retrueve data from
word functionObjectName_;
//- List of fields on which to operate
wordList fieldNames_;
//- Satisfied when difference in mean values is less than this value
const scalar tolerance_;
//- Averaging window
const scalar window_;
//- Average time per field
List<scalar> totalTime_;
//- Reset the averaging process on restart flag
Switch resetOnRestart_;
// Protected Member Functions
//- Templated function to calculate the average
template<class Type>
void calc
(
const word& fieldName,
const scalar alpha,
const scalar beta,
bool& satisfied,
bool& processed
);
public:
//- Runtime type information
TypeName("average");
//- Constructor
averageCondition
(
const word& name,
const objectRegistry& obr,
const dictionary& dict,
functionObjectState& state
);
//- Destructor
virtual ~averageCondition();
// Public Member Functions
//- Apply the condition
virtual bool apply();
//- Write
virtual void write();
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#ifdef NoRepository
#include "averageConditionTemplates.C"
#endif
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //

View File

@ -0,0 +1,73 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2015 OpenFOAM Foundation
\\/ M anipulation | Copyright (C) 2015 OpenCFD Ltd.
-------------------------------------------------------------------------------
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/>.
\*---------------------------------------------------------------------------*/
// * * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * //
template<class Type>
void Foam::averageCondition::calc
(
const word& fieldName,
const scalar alpha,
const scalar beta,
bool& satisfied,
bool& processed
)
{
const word valueType =
state_.objectResultType(functionObjectName_, fieldName);
if (pTraits<Type>::typeName != valueType)
{
return;
}
Type currentValue =
state_.getObjectResult<Type>(functionObjectName_, fieldName);
const word meanName(fieldName + "Mean");
Type meanValue = state_.getResult<Type>(meanName);
meanValue = alpha*meanValue + beta*currentValue;
scalar delta = mag(meanValue - currentValue);
if (log_)
{
Info<< " " << meanName << ": " << meanValue
<< ", delta: " << delta << nl;
}
state_.setResult(meanName, meanValue);
if (delta > tolerance_)
{
satisfied = false;
}
processed = true;
}
// ************************************************************************* //

View File

@ -0,0 +1,222 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2015 OpenFOAM Foundation
\\/ M anipulation | Copyright (C) 2015 OpenCFD Ltd.
-------------------------------------------------------------------------------
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 "equationInitialResidualCondition.H"
#include "addToRunTimeSelectionTable.H"
#include "fvMesh.H"
#include "Time.H"
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
namespace Foam
{
defineTypeNameAndDebug(equationInitialResidualCondition, 0);
addToRunTimeSelectionTable
(
runTimeCondition,
equationInitialResidualCondition,
dictionary
);
template<>
const char* Foam::NamedEnum
<
equationInitialResidualCondition::operatingMode,
2
>::names[] =
{
"minimum",
"maximum"
};
const NamedEnum<Foam::equationInitialResidualCondition::operatingMode, 2>
Foam::equationInitialResidualCondition::operatingModeNames;
}
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
Foam::equationInitialResidualCondition::equationInitialResidualCondition
(
const word& name,
const objectRegistry& obr,
const dictionary& dict,
functionObjectState& state
)
:
runTimeCondition(name, obr, dict, state),
fieldNames_(dict.lookup("fields")),
value_(readScalar(dict.lookup("value"))),
timeStart_(dict.lookupOrDefault("timeStart", -GREAT)),
mode_(operatingModeNames.read(dict.lookup("mode")))
{
if (!fieldNames_.size())
{
WarningIn
(
"Foam::equationInitialResidualCondition::"
"equationInitialResidualCondition"
"("
"const word&, "
"const objectRegistry&, "
"const dictionary&, "
"functionObjectState&"
")"
)
<< "No fields supplied: deactivating" << endl;
active_ = false;
}
}
// * * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * //
Foam::equationInitialResidualCondition::
~equationInitialResidualCondition()
{}
// * * * * * * * * * * * * * * Public Member Functions * * * * * * * * * * * //
bool Foam::equationInitialResidualCondition::apply()
{
bool satisfied = false;
if (!active_)
{
return true;
}
if ((obr_.time().timeIndex() < 3) || (obr_.time().value() < timeStart_))
{
// Do not start checking until reached start time
return false;
}
const fvMesh& mesh = refCast<const fvMesh>(obr_);
const dictionary& solverDict = mesh.solverPerformanceDict();
List<scalar> result(fieldNames_.size(), -VGREAT);
forAll(fieldNames_, fieldI)
{
const word& fieldName = fieldNames_[fieldI];
if (solverDict.found(fieldName))
{
const List<solverPerformance> sp(solverDict.lookup(fieldName));
const scalar residual = sp.first().initialResidual();
result[fieldI] = residual;
switch (mode_)
{
case omMin:
{
if (residual < value_)
{
satisfied = true;
}
break;
}
case omMax:
{
if (residual > value_)
{
satisfied = true;
}
break;
}
default:
{
FatalErrorIn
(
"bool Foam::equationInitialResidualCondition::apply()"
)
<< "Unhandled enumeration "
<< operatingModeNames[mode_]
<< abort(FatalError);
}
}
}
}
bool valid = false;
forAll(result, i)
{
if (result[i] < 0)
{
WarningIn("bool Foam::equationInitialResidualCondition::apply()")
<< "Initial residual data not found for field "
<< fieldNames_[i] << endl;
}
else
{
valid = true;
}
}
if (!valid)
{
WarningIn("bool Foam::equationInitialResidualCondition::apply()")
<< "Initial residual data not found for any fields: "
<< "deactivating" << endl;
active_ = false;
}
if (satisfied && valid)
{
if (log_)
{
Info<< type() << ": " << name_
<< ": satisfied using threshold value: " << value_ << nl;
}
forAll(result, resultI)
{
if (result[resultI] > 0)
{
if (log_)
{
Info<< " field: " << fieldNames_[resultI]
<< ", residual: " << result[resultI] << nl;
}
}
}
if (log_) Info<< endl;
}
return satisfied;
}
void Foam::equationInitialResidualCondition::write()
{
// do nothing
}
// ************************************************************************* //

View File

@ -0,0 +1,119 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2015 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::equationInitialResidualCondition
Description
Minimum or maximum initial residual run time condition
SourceFiles
equationInitialResidualCondition.H
equationInitialResidualCondition.C
\*---------------------------------------------------------------------------*/
#ifndef equationInitialResidualCondition_H
#define equationInitialResidualCondition_H
#include "runTimeCondition.H"
#include "NamedEnum.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
/*---------------------------------------------------------------------------*\
Class equationInitialResidualCondition Declaration
\*---------------------------------------------------------------------------*/
class equationInitialResidualCondition
:
public runTimeCondition
{
public:
enum operatingMode
{
omMin,
omMax
};
static const NamedEnum<operatingMode, 2> operatingModeNames;
protected:
// Protected data
//- Field name
const wordList fieldNames_;
//- Value to compare
const scalar value_;
//- Start checking from time - always skips first iteration
scalar timeStart_;
//- Operating mode
operatingMode mode_;
public:
//- Runtime type information
TypeName("equationInitialResidual");
//- Constructor
equationInitialResidualCondition
(
const word& name,
const objectRegistry& obr,
const dictionary& dict,
functionObjectState& state
);
//- Destructor
virtual ~equationInitialResidualCondition();
// Public Member Functions
//- Apply the condition
virtual bool apply();
//- Write
virtual void write();
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //

View File

@ -0,0 +1,183 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2015 OpenFOAM Foundation
\\/ M anipulation | Copyright (C) 2015 OpenCFD Ltd.
-------------------------------------------------------------------------------
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 "equationMaxIterCondition.H"
#include "addToRunTimeSelectionTable.H"
#include "fvMesh.H"
#include "Time.H"
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
namespace Foam
{
defineTypeNameAndDebug(equationMaxIterCondition, 0);
addToRunTimeSelectionTable
(
runTimeCondition,
equationMaxIterCondition,
dictionary
);
}
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
Foam::equationMaxIterCondition::equationMaxIterCondition
(
const word& name,
const objectRegistry& obr,
const dictionary& dict,
functionObjectState& state
)
:
runTimeCondition(name, obr, dict, state),
fieldNames_(dict.lookup("fields")),
threshold_(readLabel(dict.lookup("threshold"))),
startIter_(dict.lookupOrDefault("startIter", 2))
{
if (!fieldNames_.size())
{
WarningIn
(
"Foam::equationMaxIterCondition::"
"equationMaxIterCondition"
"("
"const word&, "
"const objectRegistry&, "
"const dictionary&, "
"functionObjectState&"
")"
)
<< "No fields supplied: deactivating" << endl;
active_ = false;
}
startIter_ = max(startIter_, 2);
}
// * * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * //
Foam::equationMaxIterCondition::~equationMaxIterCondition()
{}
// * * * * * * * * * * * * * * Public Member Functions * * * * * * * * * * * //
bool Foam::equationMaxIterCondition::apply()
{
bool satisfied = false;
if (!active_)
{
return true;
}
if (obr_.time().timeIndex() < startIter_)
{
// Do not start checking until start iter
return false;
}
const fvMesh& mesh = refCast<const fvMesh>(obr_);
const dictionary& solverDict = mesh.solverPerformanceDict();
List<label> result(fieldNames_.size(), -1);
forAll(fieldNames_, fieldI)
{
const word& fieldName = fieldNames_[fieldI];
if (solverDict.found(fieldName))
{
const List<solverPerformance> sp(solverDict.lookup(fieldName));
const label nIterations = sp.first().nIterations();
result[fieldI] = nIterations;
if (nIterations > threshold_)
{
satisfied = true;
}
}
}
bool valid = false;
forAll(result, i)
{
if (result[i] < 0)
{
WarningIn("bool Foam::equationMaxIterCondition::apply()")
<< "Number of iterations data not found for field "
<< fieldNames_[i] << endl;
}
else
{
valid = true;
}
}
if (!valid)
{
WarningIn("bool Foam::equationMaxIterCondition::apply()")
<< "Number of iterations data not found for any fields: "
<< "deactivating" << endl;
active_ = false;
}
if (satisfied && valid)
{
if (log_)
{
Info<< type() << ": " << name_
<< ": satisfied using threshold value: " << threshold_ << nl;
}
forAll(result, resultI)
{
if (result[resultI] != -1)
{
if (log_)
{
Info<< " field: " << fieldNames_[resultI]
<< ", iterations: " << result[resultI] << nl;
}
}
}
if (log_) Info<< endl;
}
return satisfied;
}
void Foam::equationMaxIterCondition::write()
{
// do nothing
}
// ************************************************************************* //

View File

@ -0,0 +1,105 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2015 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::equationMaxIterCondition
Description
Maximum number of equation iterations run time condition
SourceFiles
equationMaxIterCondition.H
equationMaxIterCondition.C
\*---------------------------------------------------------------------------*/
#ifndef equationMaxIterCondition_H
#define equationMaxIterCondition_H
#include "runTimeCondition.H"
#include "NamedEnum.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
/*---------------------------------------------------------------------------*\
Class equationMaxIterCondition Declaration
\*---------------------------------------------------------------------------*/
class equationMaxIterCondition
:
public runTimeCondition
{
protected:
// Protected data
//- Field name
const wordList fieldNames_;
//- Threshold for maximum number of iterations
const label threshold_;
//- Start checking from iteration - always skips first iteration
label startIter_;
public:
//- Runtime type information
TypeName("equationMaxIter");
//- Constructor
equationMaxIterCondition
(
const word& name,
const objectRegistry& obr,
const dictionary& dict,
functionObjectState& state
);
//- Destructor
virtual ~equationMaxIterCondition();
// Public Member Functions
//- Apply the condition
virtual bool apply();
//- Write
virtual void write();
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //

View File

@ -0,0 +1,165 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2015 OpenFOAM Foundation
\\/ M anipulation | Copyright (C) 2015 OpenCFD Ltd.
-------------------------------------------------------------------------------
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 "minMaxCondition.H"
#include "addToRunTimeSelectionTable.H"
#include "fieldTypes.H"
// * * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * //
template<>
void Foam::minMaxCondition::setValue<Foam::scalar>
(
const word& valueType,
const word& fieldName,
scalar& value
) const
{
state_.getObjectResult(functionObjectName_, fieldName, value);
}
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
namespace Foam
{
defineTypeNameAndDebug(minMaxCondition, 0);
addToRunTimeSelectionTable(runTimeCondition, minMaxCondition, dictionary);
template<>
const char* NamedEnum<minMaxCondition::modeType, 2>::names[] =
{
"minimum",
"maximum"
};
}
const Foam::NamedEnum<Foam::minMaxCondition::modeType, 2>
Foam::minMaxCondition::modeTypeNames_;
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
Foam::minMaxCondition::minMaxCondition
(
const word& name,
const objectRegistry& obr,
const dictionary& dict,
functionObjectState& state
)
:
runTimeCondition(name, obr, dict, state),
functionObjectName_(dict.lookup("functionObjectName")),
mode_(modeTypeNames_.read(dict.lookup("mode"))),
fieldNames_(dict.lookup("fields")),
value_(readScalar(dict.lookup("value")))
{}
// * * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * //
Foam::minMaxCondition::~minMaxCondition()
{}
// * * * * * * * * * * * * * * Public Member Functions * * * * * * * * * * * //
bool Foam::minMaxCondition::apply()
{
bool satisfied = true;
if (!active_)
{
return satisfied;
}
forAll(fieldNames_, fieldI)
{
const word& fieldName = fieldNames_[fieldI];
const word valueType =
state_.objectResultType(functionObjectName_, fieldName);
if (valueType == word::null)
{
WarningIn("bool Foam::minMaxCondition::apply()")
<< "Unable to find entry " << fieldName
<< " for function object " << functionObjectName_
<< ". Condition will not be applied."
<< endl;
continue;
}
scalar v = 0;
setValue<scalar>(valueType, fieldName, v);
setValue<vector>(valueType, fieldName, v);
setValue<sphericalTensor>(valueType, fieldName, v);
setValue<symmTensor>(valueType, fieldName, v);
setValue<tensor>(valueType, fieldName, v);
Switch ok = false;
switch (mode_)
{
case mdMin:
{
if (v < value_)
{
ok = true;
}
break;
}
case mdMax:
{
if (v > value_)
{
ok = true;
}
break;
}
}
if (log_)
{
Info<< " " << type() << ": " << modeTypeNames_[mode_] << " "
<< fieldName << ": value = " << v
<< ", threshold value = " << value_
<< ", satisfied = " << ok << endl;
}
satisfied = satisfied && ok;
}
return satisfied;
}
void Foam::minMaxCondition::write()
{
// do nothing
}
// ************************************************************************* //

View File

@ -0,0 +1,145 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2015 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::minMaxCondition
Description
Minimum/maximum run time conditions. If the value type is not scalar,
the magnitude of the value is used in the evaluation.
SourceFiles
minMaxCondition.H
minMaxCondition.C
\*---------------------------------------------------------------------------*/
#ifndef minMaxCondition_H
#define minMaxCondition_H
#include "runTimeCondition.H"
#include "NamedEnum.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
/*---------------------------------------------------------------------------*\
Class minMaxCondition Declaration
\*---------------------------------------------------------------------------*/
class minMaxCondition
:
public runTimeCondition
{
public:
// Public enumerations
// Mode type
enum modeType
{
mdMin,
mdMax
};
static const NamedEnum<modeType, 2> modeTypeNames_;
protected:
// Protected data
//- Name of function object to retrueve data from
word functionObjectName_;
//- Mode
modeType mode_;
//- Field names
const wordList fieldNames_;
//- Value to compare
const scalar value_;
//- Helper function to retrieve the value from the state dictionary
template<class Type>
void setValue
(
const word& valueType,
const word& fieldName,
scalar& value
) const;
public:
//- Runtime type information
TypeName("minMax");
//- Constructor
minMaxCondition
(
const word& name,
const objectRegistry& obr,
const dictionary& dict,
functionObjectState& state
);
//- Destructor
virtual ~minMaxCondition();
// Public Member Functions
//- Apply the condition
virtual bool apply();
//- Write
virtual void write();
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
template<>
void minMaxCondition::setValue<Foam::scalar>
(
const word& valueType,
const word& fieldName,
scalar& value
) const;
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#ifdef NoRepository
#include "minMaxConditionTemplates.C"
#endif
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //

View File

@ -0,0 +1,46 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2015 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/>.
\*---------------------------------------------------------------------------*/
// * * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * //
template<class Type>
void Foam::minMaxCondition::setValue
(
const word& valueType,
const word& fieldName,
scalar& value
) const
{
if (pTraits<Type>::typeName != valueType)
{
return;
}
Type v = state_.getObjectResult<Type>(functionObjectName_, fieldName);
value = mag(v);
}
// ************************************************************************* //

View File

@ -0,0 +1,91 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2015 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 "minTimeStepCondition.H"
#include "addToRunTimeSelectionTable.H"
#include "Time.H"
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
namespace Foam
{
defineTypeNameAndDebug(minTimeStepCondition, 0);
addToRunTimeSelectionTable
(
runTimeCondition,
minTimeStepCondition,
dictionary
);
}
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
Foam::minTimeStepCondition::minTimeStepCondition
(
const word& name,
const objectRegistry& obr,
const dictionary& dict,
functionObjectState& state
)
:
runTimeCondition(name, obr, dict, state),
minValue_(readScalar(dict.lookup("minValue")))
{}
// * * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * //
Foam::minTimeStepCondition::~minTimeStepCondition()
{}
// * * * * * * * * * * * * * * Public Member Functions * * * * * * * * * * * //
bool Foam::minTimeStepCondition::apply()
{
bool satisfied = false;
if (!active_)
{
return true;
}
if (obr_.time().deltaTValue() < minValue_)
{
satisfied = true;
}
return satisfied;
}
void Foam::minTimeStepCondition::write()
{
// do nothing
}
// ************************************************************************* //

View File

@ -0,0 +1,99 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2015 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::minTimeStepCondition
Description
Initial residual run time condition
SourceFiles
minTimeStepCondition.H
minTimeStepCondition.C
\*---------------------------------------------------------------------------*/
#ifndef minTimeStepCondition_H
#define minTimeStepCondition_H
#include "runTimeCondition.H"
#include "NamedEnum.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
/*---------------------------------------------------------------------------*\
Class minTimeStepCondition Declaration
\*---------------------------------------------------------------------------*/
class minTimeStepCondition
:
public runTimeCondition
{
protected:
// Protected data
//- Minumim time step value to compare
const scalar minValue_;
public:
//- Runtime type information
TypeName("minTimeStep");
//- Constructor
minTimeStepCondition
(
const word& name,
const objectRegistry& obr,
const dictionary& dict,
functionObjectState& state
);
//- Destructor
virtual ~minTimeStepCondition();
// Public Member Functions
//- Apply the condition
virtual bool apply();
//- Write
virtual void write();
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //

View File

@ -0,0 +1,110 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2015 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 "runTimeCondition.H"
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
namespace Foam
{
defineTypeNameAndDebug(runTimeCondition, 0);
defineRunTimeSelectionTable(runTimeCondition, dictionary);
}
// * * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * //
Foam::dictionary& Foam::runTimeCondition::setConditionDict()
{
dictionary& propertyDict = state_.propertyDict();
if (!propertyDict.found(name_))
{
propertyDict.add(name_, dictionary());
}
return propertyDict.subDict(name_);
}
const Foam::dictionary& Foam::runTimeCondition::conditionDict() const
{
return conditionDict_;
}
Foam::dictionary& Foam::runTimeCondition::conditionDict()
{
return conditionDict_;
}
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
Foam::runTimeCondition::runTimeCondition
(
const word& name,
const objectRegistry& obr,
const dictionary& dict,
functionObjectState& state
)
:
name_(name),
obr_(obr),
state_(state),
active_(dict.lookupOrDefault<bool>("active", true)),
conditionDict_(setConditionDict()),
log_(dict.lookupOrDefault("log", true)),
groupID_(dict.lookupOrDefault("groupID", -1))
{}
// * * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * //
Foam::runTimeCondition::~runTimeCondition()
{}
// * * * * * * * * * * * * * * Public Member Functions * * * * * * * * * * * //
const Foam::word& Foam::runTimeCondition::name() const
{
return name_;
}
bool Foam::runTimeCondition::active() const
{
return active_;
}
Foam::label Foam::runTimeCondition::groupID() const
{
return groupID_;
}
// ************************************************************************* //

View File

@ -0,0 +1,167 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2015 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::runTimeCondition
Description
Base class for run time conditions
SourceFiles
runTimeCondition.C
runTimeConditionNew.C
runTimeCondition.H
\*---------------------------------------------------------------------------*/
#ifndef runTimeCondition_H
#define runTimeCondition_H
#include "functionObjectState.H"
#include "dictionary.H"
#include "autoPtr.H"
#include "runTimeSelectionTables.H"
#include "Switch.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
/*---------------------------------------------------------------------------*\
Class runTimeCondition Declaration
\*---------------------------------------------------------------------------*/
class runTimeCondition
{
protected:
// Protected data
//- Condition name
word name_;
//- Reference to the object registry
const objectRegistry& obr_;
//- State
functionObjectState& state_;
//- On/off switch
bool active_;
//- Reference to the condition dictionary
dictionary& conditionDict_;
//- Switch to send output to Info
Switch log_;
//- Group index - if applied, all conditions in a group must be
// satisfield before condition is met
label groupID_;
// Protected Member Functions
//- Set the condition dictionary (create if necessary)
dictionary& setConditionDict();
//- Return const access to the conditions dictionary
const dictionary& conditionDict() const;
//- Return non-const access to the conditions dictionary
dictionary& conditionDict();
public:
//- Runtime type information
TypeName("runTimeCondition");
//- Declare runtime constructor selection table
declareRunTimeSelectionTable
(
autoPtr,
runTimeCondition,
dictionary,
(
const word& name,
const objectRegistry& obr,
const dictionary& dict,
functionObjectState& state
),
(name, obr, dict, state)
);
//- Constructor
runTimeCondition
(
const word& name,
const objectRegistry& obr,
const dictionary& dict,
functionObjectState& state
);
//- Destructor
virtual ~runTimeCondition();
//- Selector
static autoPtr<runTimeCondition> New
(
const word& conditionName,
const objectRegistry& obr,
const dictionary& dict,
functionObjectState& state
);
// Public Member Functions
//- Return the condition name
virtual const word& name() const;
//- Return the active flag
virtual bool active() const;
//- Return the group index
virtual label groupID() const;
//- Apply the condition
virtual bool apply() = 0;
//- Write
virtual void write() = 0;
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //

View File

@ -0,0 +1,70 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2015 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 "runTimeCondition.H"
// * * * * * * * * * * * * * * * * * Selectors * * * * * * * * * * * * * * * //
Foam::autoPtr<Foam::runTimeCondition> Foam::runTimeCondition::New
(
const word& conditionName,
const objectRegistry& obr,
const dictionary& dict,
functionObjectState& state
)
{
word conditionType(dict.lookup("type"));
Info<< "Selecting runTimeCondition " << conditionType << endl;
dictionaryConstructorTable::iterator cstrIter =
dictionaryConstructorTablePtr_->find(conditionType);
if (cstrIter == dictionaryConstructorTablePtr_->end())
{
FatalErrorIn
(
"runTimeCondition::New"
"("
"const word&, "
"const objectRegistry&, "
"const dictionary&, "
"functionObjectState&"
")"
) << "Unknown runTimeCondition type "
<< conditionType << nl << nl
<< "Valid runTimeCondition types are:" << nl
<< dictionaryConstructorTablePtr_->sortedToc()
<< exit(FatalError);
}
return autoPtr<runTimeCondition>
(
cstrIter()(conditionName, obr, dict, state)
);
}
// ************************************************************************* //

View File

@ -0,0 +1,264 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2015 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 "runTimeControl.H"
#include "dictionary.H"
#include "runTimeCondition.H"
#include "fvMesh.H"
#include "Time.H"
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
namespace Foam
{
defineTypeNameAndDebug(runTimeControl, 0);
}
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
Foam::runTimeControl::runTimeControl
(
const word& name,
const objectRegistry& obr,
const dictionary& dict,
const bool loadFromFiles
)
:
functionObjectState(obr, name),
obr_(obr),
conditions_(),
groupMap_(),
nWriteStep_(0),
writeStepI_(0)
{
// Check if the available mesh is an fvMesh, otherwise deactivate
if (setActive<fvMesh>())
{
read(dict);
// Check that some conditions are set
if (conditions_.empty())
{
Info<< type() << " " << name_ << " output:" << nl
<< " No conditions present - deactivating" << nl
<< endl;
active_ = false;
}
else
{
// Check that at least one condition is active
active_ = false;
forAll(conditions_, conditionI)
{
if (conditions_[conditionI].active())
{
active_ = true;
break;
}
}
if (!active_)
{
Info<< type() << " " << name_ << " output:" << nl
<< " All conditions inactive - deactivating" << nl
<< endl;
}
}
}
}
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
Foam::runTimeControl::~runTimeControl()
{}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
void Foam::runTimeControl::read(const dictionary& dict)
{
if (active_)
{
const dictionary& conditionsDict = dict.subDict("conditions");
const wordList conditionNames(conditionsDict.toc());
conditions_.setSize(conditionNames.size());
label uniqueGroupI = 0;
forAll(conditionNames, conditionI)
{
const word& conditionName = conditionNames[conditionI];
const dictionary& dict = conditionsDict.subDict(conditionName);
conditions_.set
(
conditionI,
runTimeCondition::New(conditionName, obr_, dict, *this)
);
label groupI = conditions_[conditionI].groupID();
if (groupMap_.insert(groupI, uniqueGroupI))
{
uniqueGroupI++;
}
}
dict.readIfPresent("nWriteStep", nWriteStep_);
}
}
void Foam::runTimeControl::execute()
{
if (!active_)
{
return;
}
Info<< type() << " " << name_ << " output:" << nl;
// IDs of satisfied conditions
DynamicList<label> IDs(conditions_.size());
// Run stops only if all conditions within a group are satisfied
List<bool> groupSatisfied(groupMap_.size(), true);
List<bool> groupActive(groupMap_.size(), false);
forAll(conditions_, conditionI)
{
runTimeCondition& condition = conditions_[conditionI];
if (condition.active())
{
bool conditionSatisfied = condition.apply();
label groupI = condition.groupID();
Map<label>::const_iterator conditionIter = groupMap_.find(groupI);
if (conditionIter == groupMap_.end())
{
FatalErrorIn("void Foam::runTimeControl::execute()")
<< "group " << groupI << " not found in map"
<< abort(FatalError);
}
if (conditionSatisfied)
{
IDs.append(conditionI);
groupActive[conditionIter()] = true;
if (groupI == -1)
{
// Condition not part of a group - only requires this to be
// satisfied for completion flag to be set
groupSatisfied[conditionIter()] = true;
break;
}
}
else
{
groupSatisfied[conditionIter()] = false;
}
}
}
bool done = false;
forAll(groupSatisfied, groupI)
{
if (groupSatisfied[groupI] && groupActive[groupI])
{
done = true;
break;
}
}
if (done)
{
forAll(IDs, conditionI)
{
Info<< " " << conditions_[conditionI].type() << ": "
<< conditions_[conditionI].name()
<< " condition satisfied" << nl;
}
// Set to write a data dump or finalise the calculation
Time& time = const_cast<Time&>(obr_.time());
if (writeStepI_ < nWriteStep_ - 1)
{
writeStepI_++;
Info<< " Writing fields - step " << writeStepI_ << nl;
time.writeNow();
}
else
{
Info<< " Stopping calculation" << nl
<< " Writing fields - final step" << nl;
time.writeAndEnd();
}
}
else
{
Info<< " Conditions not met - calculations proceeding" << nl;
}
Info<< endl;
}
void Foam::runTimeControl::end()
{
if (active_)
{
execute();
}
}
void Foam::runTimeControl::timeSet()
{
// Do nothing
}
void Foam::runTimeControl::write()
{
if (active_)
{
forAll(conditions_, conditionI)
{
conditions_[conditionI].write();
}
}
}
// ************************************************************************* //

View File

@ -0,0 +1,161 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2015 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::runTimeControl
Group
grpJobControlFunctionObjects
Description
This function object controls when the calculation is terminated based on
satisfying user-specified conditions.
Optionally specify a number of write steps before the calculation is
terminated. Here, a write is performed each time that all conditons are
satisfied.
SourceFiles
runTimeControl.C
IOrunTimeControl.H
\*---------------------------------------------------------------------------*/
#ifndef runTimeControl_H
#define runTimeControl_H
#include "functionObjectState.H"
#include "Map.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
// Forward declaration of classes
class objectRegistry;
class dictionary;
class polyMesh;
class mapPolyMesh;
class runTimeCondition;
/*---------------------------------------------------------------------------*\
Class runTimeControl Declaration
\*---------------------------------------------------------------------------*/
class runTimeControl
:
public functionObjectState
{
// Private data
//- Reference to the database
const objectRegistry& obr_;
//- List of conditions to satisfy
PtrList<runTimeCondition> conditions_;
//- Map to define group IDs
Map<label> groupMap_;
//- Number of write steps before exiting
label nWriteStep_;
//- Current number of steps written
label writeStepI_;
// Private Member Functions
//- Disallow default bitwise copy construct
runTimeControl(const runTimeControl&);
//- Disallow default bitwise assignment
void operator=(const runTimeControl&);
public:
//- Runtime type information
TypeName("runTimeControl");
// Constructors
//- Construct for given objectRegistry and dictionary.
// Allow the possibility to load fields from files
runTimeControl
(
const word& name,
const objectRegistry&,
const dictionary&,
const bool loadFromFiles = false
);
//- Destructor
virtual ~runTimeControl();
// Member Functions
//- Return name of the set of runTimeControl
virtual const word& name() const
{
return name_;
}
//- Read the runTimeControl data
virtual void read(const dictionary&);
//- Execute, currently does nothing
virtual void execute();
//- Execute at the final time-loop, currently does nothing
virtual void end();
//- Called when time was set at the end of the Time::operator++
virtual void timeSet();
//- Calculate the runTimeControl and write
virtual void write();
//- Update for changes of mesh
virtual void updateMesh(const mapPolyMesh&)
{}
//- Update for changes of mesh
virtual void movePoints(const polyMesh&)
{}
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //

View File

@ -0,0 +1,42 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2015 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 "runTimeControlFunctionObject.H"
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
namespace Foam
{
defineNamedTemplateTypeNameAndDebug(runTimeControlFunctionObject, 0);
addToRunTimeSelectionTable
(
functionObject,
runTimeControlFunctionObject,
dictionary
);
}
// ************************************************************************* //

View File

@ -0,0 +1,54 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2015 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/>.
Typedef
Foam::runTimeControlFunctionObject
Description
FunctionObject wrapper around runTimeControl to allow it to be created
via the functions entry within controlDict.
SourceFiles
runTimeControlFunctionObject.C
\*---------------------------------------------------------------------------*/
#ifndef runTimeControlFunctionObject_H
#define runTimeControlFunctionObject_H
#include "runTimeControl.H"
#include "OutputFilterFunctionObject.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
typedef OutputFilterFunctionObject<runTimeControl>
runTimeControlFunctionObject;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //