diff --git a/src/finiteVolume/Make/files b/src/finiteVolume/Make/files index f8aac2551b9f9565a3f80789b8d2ab1fcf526a15..95ca51d2f6ae317721c9fbc1fe88fc8ff5b8e5b3 100644 --- a/src/finiteVolume/Make/files +++ b/src/finiteVolume/Make/files @@ -352,6 +352,8 @@ general = cfdTools/general $(general)/findRefCell/findRefCell.C $(general)/adjustPhi/adjustPhi.C $(general)/bound/bound.C +$(general)/solutionControl/solutionControl.C +$(general)/simpleControl/simpleControl.C $(general)/pimpleControl/pimpleControl.C porousMedia = $(general)/porousMedia diff --git a/src/finiteVolume/cfdTools/general/simpleControl/simpleControl.C b/src/finiteVolume/cfdTools/general/simpleControl/simpleControl.C new file mode 100644 index 0000000000000000000000000000000000000000..b20efd658c4d0a409bcfacdff916bf7018dcd133 --- /dev/null +++ b/src/finiteVolume/cfdTools/general/simpleControl/simpleControl.C @@ -0,0 +1,117 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2011-2011 OpenCFD Ltd. + \\/ 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 "simpleControl.H" +#include "Time.H" + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +namespace Foam +{ + defineTypeNameAndDebug(simpleControl, 0); +} + + +// * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * // + +void Foam::simpleControl::read() +{ + solutionControl::read(true); +} + + +bool Foam::simpleControl::criteriaSatisfied() +{ + if (residualControl_.empty()) + { + return false; + } + + bool achieved = true; + const dictionary& solverDict = mesh_.solverPerformanceDict(); + + forAllConstIter(dictionary, solverDict, iter) + { + const word& variableName = iter().keyword(); + label fieldI = applyToField(variableName); + if (fieldI != -1) + { + const List<lduMatrix::solverPerformance> sp(iter().stream()); + const scalar residual = sp.first().initialResidual(); + + bool absCheck = residual < residualControl_[fieldI].absTol; + achieved = achieved && absCheck; + + if (debug) + { + Info<< dictName_ << " solution statistics:" << endl; + + Info<< " " << variableName << ": abs tol = " << residual + << " (" << residualControl_[fieldI].absTol << ")" + << endl; + } + } + } + + return achieved; +} + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::simpleControl::simpleControl(fvMesh& mesh) +: + solutionControl(mesh, "SIMPLE"), + initialised_(false) +{ + read(); + + if (residualControl_.size() > 0) + { + Info<< dictName_ << " convergence criteria" << endl; + forAll(residualControl_, i) + { + Info<< " field " << residualControl_[i].name << token::TAB + << " absTol " << residualControl_[i].absTol + << nl; + } + Info<< endl; + } + else + { + Info<< "No " << dictName_ << " convergence criteria found. " + << "Calculations will run for " << mesh_.time().endTime().value() + << " steps." << nl << endl; + } +} + + +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +Foam::simpleControl::~simpleControl() +{} + + +// ************************************************************************* // diff --git a/src/finiteVolume/cfdTools/general/simpleControl/simpleControl.H b/src/finiteVolume/cfdTools/general/simpleControl/simpleControl.H new file mode 100644 index 0000000000000000000000000000000000000000..e8e76f42d85b323a8752ca60d8f0a69aebce5871 --- /dev/null +++ b/src/finiteVolume/cfdTools/general/simpleControl/simpleControl.H @@ -0,0 +1,115 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2011-2011 OpenCFD Ltd. + \\/ 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::simpleControl + +Description + SIMPLE control class to supply convergence information/checks for + the SIMPLE loop. + +\*---------------------------------------------------------------------------*/ + +#ifndef simpleControl_H +#define simpleControl_H + +#include "solutionControl.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +/*---------------------------------------------------------------------------*\ + Class simpleControl Declaration +\*---------------------------------------------------------------------------*/ + +class simpleControl +: + public solutionControl +{ + +protected: + + // Protected Data + + //- Initialised flag + bool initialised_; + + + // Protected Member Functions + + //- Read constrols from fvSolution dictionary + void read(); + + //- Return true if all convergence checks are satified + bool criteriaSatisfied(); + + //- Disallow default bitwise copy construct + simpleControl(const simpleControl&); + + //- Disallow default bitwise assignment + void operator=(const simpleControl&); + + +public: + + + // Static Data Members + + //- Run-time type information + TypeName("simpleControl"); + + + // Constructors + + //- Construct from mesh + simpleControl(fvMesh& mesh); + + + //- Destructor + virtual ~simpleControl(); + + + // Member Functions + + // Solution control + + //- Loop loop + inline bool loop(); +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#include "simpleControlI.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/finiteVolume/cfdTools/general/simpleControl/simpleControlI.H b/src/finiteVolume/cfdTools/general/simpleControl/simpleControlI.H new file mode 100644 index 0000000000000000000000000000000000000000..b7f053da37b7e612e5a9de696e18d3d1f9517965 --- /dev/null +++ b/src/finiteVolume/cfdTools/general/simpleControl/simpleControlI.H @@ -0,0 +1,56 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2011-2011 OpenCFD Ltd. + \\/ 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 "Time.H" + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +inline bool Foam::simpleControl::loop() +{ + read(); + + Time& time = const_cast<Time&>(mesh_.time()); + + if (initialised_) + { + if (criteriaSatisfied()) + { + Info<< dictName_ << " solution converged in " << time.timeName() + << " iterations" << nl << endl; + + // Set to finalise calculation + time.writeAndEnd(); + } + } + else + { + initialised_ = true; + } + + return time.loop(); +} + + +// ************************************************************************* //