lduMatrix now takes a dictionary instead of an Istream for the solver controls

- can now use dictionary substitutions and regular expressions in
    system/fvSolution

  - foamUpgradeFvSolution application to convert system/fvSolution
    (with -test option)

motion solver syntax left as-is.
This commit is contained in:
Mark Olesen
2008-12-08 17:22:01 +01:00
parent 507e7a1b98
commit 4f1bb8345f
56 changed files with 575 additions and 394 deletions

View File

@ -0,0 +1,3 @@
foamUpgradeFvSolution.C
EXE = $(FOAM_APPBIN)/foamUpgradeFvSolution

View File

@ -0,0 +1,104 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 1991-2008 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 2 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, write to the Free Software Foundation,
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Application
foamUpgradeFvSolution
Description
Simple tool to upgrade the syntax of system/fvSolution::solvers
Usage
- foamUpgradeFvSolution [OPTION]
@param -test \n
Suppress writing the updated fvSolution file
\*---------------------------------------------------------------------------*/
#include "argList.H"
#include "Time.H"
#include "IOdictionary.H"
#include "solution.H"
using namespace Foam;
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
// Main program:
int main(int argc, char *argv[])
{
argList::noParallel();
argList::validOptions.insert("test", "");
# include "setRootCase.H"
# include "createTime.H"
IOdictionary solutionDict
(
IOobject
(
"fvSolution",
runTime.system(),
runTime,
IOobject::MUST_READ,
IOobject::NO_WRITE,
false
)
);
label nChanged = 0;
entry* e = solutionDict.lookupEntryPtr("solvers", false, false);
if (e && e->isDict())
{
nChanged = solution::upgradeSolverDict(e->dict(), true);
}
Info<< nChanged << " solver settings changed" << nl << endl;
if (nChanged)
{
if (args.options().found("test"))
{
Info<< "-test option: no changes made" << nl << endl;
}
else
{
mv
(
solutionDict.objectPath(),
solutionDict.objectPath() + ".old"
);
solutionDict.regIOobject::write();
Info<< "Backup to " << (solutionDict.objectPath() + ".old") << nl
<< "Write to " << solutionDict.objectPath() << nl << endl;
}
}
return 0;
}
// ************************************************************************* //

View File

@ -259,7 +259,7 @@ public:
const FieldField<Field, scalar>& interfaceBouCoeffs,
const FieldField<Field, scalar>& interfaceIntCoeffs,
const lduInterfaceFieldPtrsList& interfaces,
Istream& solverData
const dictionary& solverControls
),
(
fieldName,
@ -267,7 +267,7 @@ public:
interfaceBouCoeffs,
interfaceIntCoeffs,
interfaces,
solverData
solverControls
)
);
@ -282,7 +282,7 @@ public:
const FieldField<Field, scalar>& interfaceBouCoeffs,
const FieldField<Field, scalar>& interfaceIntCoeffs,
const lduInterfaceFieldPtrsList& interfaces,
Istream& solverData
const dictionary& solverControls
),
(
fieldName,
@ -290,7 +290,7 @@ public:
interfaceBouCoeffs,
interfaceIntCoeffs,
interfaces,
solverData
solverControls
)
);
@ -304,7 +304,7 @@ public:
const FieldField<Field, scalar>& interfaceBouCoeffs,
const FieldField<Field, scalar>& interfaceIntCoeffs,
const lduInterfaceFieldPtrsList& interfaces,
Istream& solverData
const dictionary& solverControls
);
// Selectors
@ -317,7 +317,7 @@ public:
const FieldField<Field, scalar>& interfaceBouCoeffs,
const FieldField<Field, scalar>& interfaceIntCoeffs,
const lduInterfaceFieldPtrsList& interfaces,
Istream& solverData
const dictionary& solverControls
);
@ -359,7 +359,7 @@ public:
//- Read and reset the solver parameters from the given stream
virtual void read(Istream& solverData);
virtual void read(const dictionary&);
virtual solverPerformance solve
(
@ -467,7 +467,7 @@ public:
const FieldField<Field, scalar>& interfaceBouCoeffs,
const FieldField<Field, scalar>& interfaceIntCoeffs,
const lduInterfaceFieldPtrsList& interfaces,
Istream& smootherData
const dictionary& solverControls
);
@ -531,6 +531,9 @@ public:
public:
//- Find the preconditioner name (directly or from a sub-dictionary)
static word getName(const dictionary&);
//- Runtime type information
virtual const word& type() const = 0;
@ -544,9 +547,9 @@ public:
symMatrix,
(
const solver& sol,
Istream& preconditionerData
const dictionary& solverControls
),
(sol, preconditionerData)
(sol, solverControls)
);
declareRunTimeSelectionTable
@ -556,9 +559,9 @@ public:
asymMatrix,
(
const solver& sol,
Istream& preconditionerData
const dictionary& solverControls
),
(sol, preconditionerData)
(sol, solverControls)
);
@ -579,7 +582,7 @@ public:
static autoPtr<preconditioner> New
(
const solver& sol,
Istream& preconditionerData
const dictionary& solverControls
);
@ -593,7 +596,7 @@ public:
//- Read and reset the preconditioner parameters
// from the given stream
virtual void read(Istream& preconditionerData)
virtual void read(const dictionary&)
{}
//- Return wA the preconditioned form of residual rA

View File

@ -37,29 +37,66 @@ namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
Foam::word
Foam::lduMatrix::preconditioner::getName
(
const dictionary& solverControls
)
{
word name;
// handle primitive or dictionary entry
const entry& e = solverControls.lookupEntry("preconditioner", false, false);
if (e.isDict())
{
e.dict().lookup("preconditioner") >> name;
}
else
{
e.stream() >> name;
}
return name;
}
Foam::autoPtr<Foam::lduMatrix::preconditioner>
Foam::lduMatrix::preconditioner::New
(
const solver& sol,
Istream& preconditionerData
const dictionary& solverControls
)
{
word preconditionerName(preconditionerData);
word name;
// handle primitive or dictionary entry
const entry& e = solverControls.lookupEntry("preconditioner", false, false);
if (e.isDict())
{
e.dict().lookup("preconditioner") >> name;
}
else
{
e.stream() >> name;
}
const dictionary& controls = e.isDict() ? e.dict() : dictionary::null;
if (sol.matrix().symmetric())
{
symMatrixConstructorTable::iterator constructorIter =
symMatrixConstructorTablePtr_->find(preconditionerName);
symMatrixConstructorTablePtr_->find(name);
if (constructorIter == symMatrixConstructorTablePtr_->end())
{
FatalIOErrorIn
(
"lduMatrix::preconditioner::New(const solver&, Istream&)",
preconditionerData
"lduMatrix::preconditioner::New"
"(const solver&, const dictionary&)",
controls
) << "Unknown symmetric matrix preconditioner "
<< preconditionerName << endl << endl
<< "Valid symmetric matrix preconditioners are :" << endl
<< name << nl << nl
<< "Valid symmetric matrix preconditioners :" << endl
<< symMatrixConstructorTablePtr_->toc()
<< exit(FatalIOError);
}
@ -69,24 +106,25 @@ Foam::lduMatrix::preconditioner::New
constructorIter()
(
sol,
preconditionerData
controls
)
);
}
else if (sol.matrix().asymmetric())
{
asymMatrixConstructorTable::iterator constructorIter =
asymMatrixConstructorTablePtr_->find(preconditionerName);
asymMatrixConstructorTablePtr_->find(name);
if (constructorIter == asymMatrixConstructorTablePtr_->end())
{
FatalIOErrorIn
(
"lduMatrix::preconditioner::New(const solver&, Istream&)",
preconditionerData
"lduMatrix::preconditioner::New"
"(const solver&, const dictionary&)",
controls
) << "Unknown asymmetric matrix preconditioner "
<< preconditionerName << endl << endl
<< "Valid asymmetric matrix preconditioners are :" << endl
<< name << nl << nl
<< "Valid asymmetric matrix preconditioners :" << endl
<< asymMatrixConstructorTablePtr_->toc()
<< exit(FatalIOError);
}
@ -96,7 +134,7 @@ Foam::lduMatrix::preconditioner::New
constructorIter()
(
sol,
preconditionerData
controls
)
);
}
@ -104,9 +142,10 @@ Foam::lduMatrix::preconditioner::New
{
FatalIOErrorIn
(
"lduMatrix::preconditioner::New(const solver&, Istream&)",
preconditionerData
) << "cannot preconditione incomplete matrix, "
"lduMatrix::preconditioner::New"
"(const solver&, const dictionary&)",
controls
) << "cannot solve incomplete matrix, "
"no diagonal or off-diagonal coefficient"
<< exit(FatalIOError);

View File

@ -34,7 +34,6 @@ namespace Foam
defineRunTimeSelectionTable(lduMatrix::smoother, asymMatrix);
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
Foam::autoPtr<Foam::lduMatrix::smoother> Foam::lduMatrix::smoother::New
@ -44,23 +43,37 @@ Foam::autoPtr<Foam::lduMatrix::smoother> Foam::lduMatrix::smoother::New
const FieldField<Field, scalar>& interfaceBouCoeffs,
const FieldField<Field, scalar>& interfaceIntCoeffs,
const lduInterfaceFieldPtrsList& interfaces,
Istream& smootherData
const dictionary& solverControls
)
{
word smootherName(smootherData);
word name;
// handle primitive or dictionary entry
const entry& e = solverControls.lookupEntry("smoother", false, false);
if (e.isDict())
{
e.dict().lookup("smoother") >> name;
}
else
{
e.stream() >> name;
}
// not (yet?) needed:
// const dictionary& controls = e.isDict() ? e.dict() : dictionary::null;
if (matrix.symmetric())
{
symMatrixConstructorTable::iterator constructorIter =
symMatrixConstructorTablePtr_->find(smootherName);
symMatrixConstructorTablePtr_->find(name);
if (constructorIter == symMatrixConstructorTablePtr_->end())
{
FatalIOErrorIn
(
"lduMatrix::smoother::New", smootherData
) << "Unknown symmetric matrix smoother " << smootherName
<< endl << endl
"lduMatrix::smoother::New", solverControls
) << "Unknown symmetric matrix smoother "
<< name << nl << nl
<< "Valid symmetric matrix smoothers are :" << endl
<< symMatrixConstructorTablePtr_->toc()
<< exit(FatalIOError);
@ -81,15 +94,15 @@ Foam::autoPtr<Foam::lduMatrix::smoother> Foam::lduMatrix::smoother::New
else if (matrix.asymmetric())
{
asymMatrixConstructorTable::iterator constructorIter =
asymMatrixConstructorTablePtr_->find(smootherName);
asymMatrixConstructorTablePtr_->find(name);
if (constructorIter == asymMatrixConstructorTablePtr_->end())
{
FatalIOErrorIn
(
"lduMatrix::smoother::New", smootherData
) << "Unknown asymmetric matrix smoother " << smootherName
<< endl << endl
"lduMatrix::smoother::New", solverControls
) << "Unknown asymmetric matrix smoother "
<< name << nl << nl
<< "Valid asymmetric matrix smoothers are :" << endl
<< asymMatrixConstructorTablePtr_->toc()
<< exit(FatalIOError);
@ -111,8 +124,9 @@ Foam::autoPtr<Foam::lduMatrix::smoother> Foam::lduMatrix::smoother::New
{
FatalIOErrorIn
(
"lduMatrix::smoother::New", smootherData
) << "cannot solve incomplete matrix, no off-diagonal coefficients"
"lduMatrix::smoother::New", solverControls
) << "cannot solve incomplete matrix, "
"no diagonal or off-diagonal coefficient"
<< exit(FatalIOError);
return autoPtr<lduMatrix::smoother>(NULL);

View File

@ -45,10 +45,10 @@ Foam::autoPtr<Foam::lduMatrix::solver> Foam::lduMatrix::solver::New
const FieldField<Field, scalar>& interfaceBouCoeffs,
const FieldField<Field, scalar>& interfaceIntCoeffs,
const lduInterfaceFieldPtrsList& interfaces,
Istream& solverData
const dictionary& solverControls
)
{
word solverName(solverData);
word name(solverControls.lookup("solver"));
if (matrix.diagonal())
{
@ -61,22 +61,21 @@ Foam::autoPtr<Foam::lduMatrix::solver> Foam::lduMatrix::solver::New
interfaceBouCoeffs,
interfaceIntCoeffs,
interfaces,
solverData
solverControls
)
);
}
else if (matrix.symmetric())
{
symMatrixConstructorTable::iterator constructorIter =
symMatrixConstructorTablePtr_->find(solverName);
symMatrixConstructorTablePtr_->find(name);
if (constructorIter == symMatrixConstructorTablePtr_->end())
{
FatalIOErrorIn
(
"lduMatrix::solver::New", solverData
) << "Unknown symmetric matrix solver " << solverName
<< endl << endl
"lduMatrix::solver::New", solverControls
) << "Unknown symmetric matrix solver " << name << nl << nl
<< "Valid symmetric matrix solvers are :" << endl
<< symMatrixConstructorTablePtr_->toc()
<< exit(FatalIOError);
@ -91,22 +90,21 @@ Foam::autoPtr<Foam::lduMatrix::solver> Foam::lduMatrix::solver::New
interfaceBouCoeffs,
interfaceIntCoeffs,
interfaces,
solverData
solverControls
)
);
}
else if (matrix.asymmetric())
{
asymMatrixConstructorTable::iterator constructorIter =
asymMatrixConstructorTablePtr_->find(solverName);
asymMatrixConstructorTablePtr_->find(name);
if (constructorIter == asymMatrixConstructorTablePtr_->end())
{
FatalIOErrorIn
(
"lduMatrix::solver::New", solverData
) << "Unknown asymmetric matrix solver " << solverName
<< endl << endl
"lduMatrix::solver::New", solverControls
) << "Unknown asymmetric matrix solver " << name << nl << nl
<< "Valid asymmetric matrix solvers are :" << endl
<< asymMatrixConstructorTablePtr_->toc()
<< exit(FatalIOError);
@ -121,7 +119,7 @@ Foam::autoPtr<Foam::lduMatrix::solver> Foam::lduMatrix::solver::New
interfaceBouCoeffs,
interfaceIntCoeffs,
interfaces,
solverData
solverControls
)
);
}
@ -129,7 +127,7 @@ Foam::autoPtr<Foam::lduMatrix::solver> Foam::lduMatrix::solver::New
{
FatalIOErrorIn
(
"lduMatrix::solver::New", solverData
"lduMatrix::solver::New", solverControls
) << "cannot solve incomplete matrix, "
"no diagonal or off-diagonal coefficient"
<< exit(FatalIOError);
@ -148,7 +146,7 @@ Foam::lduMatrix::solver::solver
const FieldField<Field, scalar>& interfaceBouCoeffs,
const FieldField<Field, scalar>& interfaceIntCoeffs,
const lduInterfaceFieldPtrsList& interfaces,
Istream& solverData
const dictionary& solverControls
)
:
fieldName_(fieldName),
@ -156,12 +154,7 @@ Foam::lduMatrix::solver::solver
interfaceBouCoeffs_(interfaceBouCoeffs),
interfaceIntCoeffs_(interfaceIntCoeffs),
interfaces_(interfaces),
controlDict_(solverData),
maxIter_(1000),
tolerance_(1e-6),
relTol_(0)
controlDict_(solverControls)
{
readControls();
}
@ -171,16 +164,15 @@ Foam::lduMatrix::solver::solver
void Foam::lduMatrix::solver::readControls()
{
controlDict_.readIfPresent("maxIter", maxIter_);
controlDict_.readIfPresent("tolerance", tolerance_);
controlDict_.readIfPresent("relTol", relTol_);
maxIter_ = controlDict_.lookupOrDefault<label>("maxIter", 1000);
tolerance_ = controlDict_.lookupOrDefault<scalar>("tolerance", 1e-6);
relTol_ = controlDict_.lookupOrDefault<scalar>("relTol", 0);
}
void Foam::lduMatrix::solver::read(Istream& solverData)
void Foam::lduMatrix::solver::read(const dictionary& solverControls)
{
word solverName(solverData);
solverData >> controlDict_;
controlDict_ = solverControls;
readControls();
}

View File

@ -43,7 +43,7 @@ namespace Foam
Foam::DICPreconditioner::DICPreconditioner
(
const lduMatrix::solver& sol,
Istream&
const dictionary&
)
:
lduMatrix::preconditioner(sol),

View File

@ -67,11 +67,11 @@ public:
// Constructors
//- Construct from matrix components and preconditioner data stream
//- Construct from matrix components and preconditioner solver controls
DICPreconditioner
(
const lduMatrix::solver& sol,
Istream& preconditionerData
const lduMatrix::solver&,
const dictionary& solverControlsUnused
);

View File

@ -43,7 +43,7 @@ namespace Foam
Foam::DILUPreconditioner::DILUPreconditioner
(
const lduMatrix::solver& sol,
Istream&
const dictionary&
)
:
lduMatrix::preconditioner(sol),

View File

@ -67,11 +67,11 @@ public:
// Constructors
//- Construct from matrix components and preconditioner data stream
//- Construct from matrix components and preconditioner solver controls
DILUPreconditioner
(
const lduMatrix::solver& sol,
Istream& preconditionerData
const lduMatrix::solver&,
const dictionary& solverControlsUnused
);
@ -94,8 +94,7 @@ public:
const direction cmpt=0
) const;
//- Return wT the transpose-matrix preconditioned form of
// residual rT.
//- Return wT the transpose-matrix preconditioned form of residual rT.
virtual void preconditionT
(
scalarField& wT,

View File

@ -43,7 +43,7 @@ namespace Foam
Foam::FDICPreconditioner::FDICPreconditioner
(
const lduMatrix::solver& sol,
Istream&
const dictionary&
)
:
lduMatrix::preconditioner(sol),
@ -164,7 +164,7 @@ void Foam::FDICPreconditioner::precondition
__builtin_prefetch (&uPtr[face+96],0,0);
__builtin_prefetch (&lPtr[face+96],0,0);
__builtin_prefetch (&rDuUpperPtr[face+96],0,0);
__builtin_prefetch (&wAPtr[uPtr[face+32]],0,1);
__builtin_prefetch (&wAPtr[uPtr[face+32]],0,1);
__builtin_prefetch (&wAPtr[lPtr[face+32]],0,1);
#endif

View File

@ -80,11 +80,11 @@ public:
// Constructors
//- Construct from matrix components and preconditioner data stream
//- Construct from matrix components and preconditioner solver controls
FDICPreconditioner
(
const lduMatrix::solver& sol,
Istream& preconditionerData
const lduMatrix::solver&,
const dictionary& solverControlsUnused
);

View File

@ -45,7 +45,7 @@ namespace Foam
Foam::GAMGPreconditioner::GAMGPreconditioner
(
const lduMatrix::solver& sol,
Istream& preconditionerData
const dictionary& solverControls
)
:
GAMGSolver
@ -55,7 +55,7 @@ Foam::GAMGPreconditioner::GAMGPreconditioner
sol.interfaceBouCoeffs(),
sol.interfaceIntCoeffs(),
sol.interfaces(),
preconditionerData
solverControls
),
lduMatrix::preconditioner(sol),
nVcycles_(2)
@ -75,13 +75,7 @@ Foam::GAMGPreconditioner::~GAMGPreconditioner()
void Foam::GAMGPreconditioner::readControls()
{
GAMGSolver::readControls();
controlDict_.readIfPresent("nVcycles", nVcycles_);
}
void Foam::GAMGPreconditioner::read(Istream& solverData)
{
GAMGSolver::read(solverData);
nVcycles_ = controlDict_.lookupOrDefault<label>("nVcycles", 2);
}

View File

@ -55,17 +55,14 @@ class GAMGPreconditioner
public GAMGSolver,
public lduMatrix::preconditioner
{
// Private data
protected:
// Protected data
//- Number of V-cycles to perform
label nVcycles_;
// Private member functions
//- Read control parameters from the control dictionary
void readControls();
//- Read the control parameters from the controlDict_
virtual void readControls();
public:
@ -75,11 +72,11 @@ public:
// Constructors
//- Construct for given solver and preconditioner data stream
//- Construct from matrix components and preconditioner solver controls
GAMGPreconditioner
(
const lduMatrix::solver& sol,
Istream& preconditionerData
const lduMatrix::solver&,
const dictionary& solverControls
);
@ -90,9 +87,6 @@ public:
// Member Functions
//- Read and reset the preconditioner parameters from the given stream
virtual void read(Istream& preconditionerData);
//- Return wA the preconditioned form of residual rA
virtual void precondition
(

View File

@ -47,7 +47,7 @@ namespace Foam
Foam::diagonalPreconditioner::diagonalPreconditioner
(
const lduMatrix::solver& sol,
Istream&
const dictionary&
)
:
lduMatrix::preconditioner(sol),
@ -77,10 +77,6 @@ Foam::diagonalPreconditioner::diagonalPreconditioner
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
void Foam::diagonalPreconditioner::read(Istream&)
{}
void Foam::diagonalPreconditioner::precondition
(
scalarField& wA,

View File

@ -56,7 +56,7 @@ class diagonalPreconditioner
{
// Private data
//- The reciprocal diagonal
//- The reciprocal diagonal
scalarField rD;
@ -77,11 +77,11 @@ public:
// Constructors
//- Construct from matrix components and preconditioner data stream
//- Construct from matrix components and preconditioner solver controls
diagonalPreconditioner
(
const lduMatrix::solver& sol,
Istream& preconditionerData
const lduMatrix::solver&,
const dictionary& solverControlsUnused
);
@ -93,9 +93,6 @@ public:
// Member Functions
//- Read and reset the preconditioner parameters from the given stream
virtual void read(Istream& preconditionerData);
//- Return wA the preconditioned form of residual rA
virtual void precondition
(
@ -104,8 +101,7 @@ public:
const direction cmpt=0
) const;
//- Return wT the transpose-matrix preconditioned form of
// residual rT.
//- Return wT the transpose-matrix preconditioned form of residual rT.
virtual void preconditionT
(
scalarField& wT,
@ -113,7 +109,7 @@ public:
const direction cmpt=0
) const
{
return(precondition(wT, rT, cmpt));
return precondition(wT, rT, cmpt);
}
};

View File

@ -47,7 +47,7 @@ namespace Foam
Foam::noPreconditioner::noPreconditioner
(
const lduMatrix::solver& sol,
Istream&
const dictionary&
)
:
lduMatrix::preconditioner(sol)
@ -56,10 +56,6 @@ Foam::noPreconditioner::noPreconditioner
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
void Foam::noPreconditioner::read(Istream&)
{}
void Foam::noPreconditioner::precondition
(
scalarField& wA,

View File

@ -68,11 +68,11 @@ public:
// Constructors
//- Construct from matrix components and preconditioner data stream
//- Construct from matrix components and preconditioner solver controls
noPreconditioner
(
const lduMatrix::solver& sol,
Istream& preconditionerData
const lduMatrix::solver&,
const dictionary& solverControlsUnused
);
@ -84,9 +84,6 @@ public:
// Member Functions
//- Read and reset the preconditioner parameters from the given stream
virtual void read(Istream& preconditionerData);
//- Return wA the preconditioned form of residual rA
virtual void precondition
(
@ -95,8 +92,7 @@ public:
const direction cmpt=0
) const;
//- Return wT the transpose-matrix preconditioned form of
// residual rT.
//- Return wT the transpose-matrix preconditioned form of residual rT.
virtual void preconditionT
(
scalarField& wT,
@ -104,7 +100,7 @@ public:
const direction cmpt=0
) const
{
return(precondition(wT, rT, cmpt));
return precondition(wT, rT, cmpt);
}
};

View File

@ -27,8 +27,10 @@ Class
Description
Simplified diagonal-based incomplete Cholesky smoother for symmetric
matrices. In order to improve efficiency the residual is evaluated after
every nSweeps sweeps.
matrices.
To improve efficiency, the residual is evaluated after every nSweeps
sweeps.
SourceFiles
DICSmoother.C

View File

@ -26,9 +26,9 @@ Class
Foam::DICGaussSeidelSmoother
Description
Combined DIC/GaussSeidel smoother for symmetric
matrices in which DIC smoothing is followed by GaussSeidel to ensure that
any "spikes" created by the DIC sweeps are smoothed-out.
Combined DIC/GaussSeidel smoother for symmetric matrices in which DIC
smoothing is followed by GaussSeidel to ensure that any "spikes" created
by the DIC sweeps are smoothed-out.
SourceFiles
DICGaussSeidelSmoother.C
@ -47,7 +47,7 @@ namespace Foam
{
/*---------------------------------------------------------------------------*\
Class DICGaussSeidelSmoother Declaration
Class DICGaussSeidelSmoother Declaration
\*---------------------------------------------------------------------------*/
class DICGaussSeidelSmoother
@ -57,6 +57,7 @@ class DICGaussSeidelSmoother
// Private data
DICSmoother dicSmoother_;
GaussSeidelSmoother gsSmoother_;

View File

@ -27,8 +27,9 @@ Class
Description
Simplified diagonal-based incomplete LU smoother for asymmetric matrices.
In order to improve efficiency the residual is evaluated after every
nSweeps sweeps.
To improve efficiency, the residual is evaluated after every nSweeps
sweeps.
SourceFiles
DILUSmoother.C
@ -46,7 +47,7 @@ namespace Foam
{
/*---------------------------------------------------------------------------*\
Class DILUSmoother Declaration
Class DILUSmoother Declaration
\*---------------------------------------------------------------------------*/
class DILUSmoother

View File

@ -26,9 +26,9 @@ Class
Foam::DILUGaussSeidelSmoother
Description
Combined DILU/GaussSeidel smoother for asymmetric
matrices in which DILU smoothing is followed by GaussSeidel to ensure that
any "spikes" created by the DILU sweeps are smoothed-out.
Combined DILU/GaussSeidel smoother for asymmetric matrices in which
DILU smoothing is followed by GaussSeidel to ensure that any "spikes"
created by the DILU sweeps are smoothed-out.
SourceFiles
DILUGaussSeidelSmoother.C
@ -47,7 +47,7 @@ namespace Foam
{
/*---------------------------------------------------------------------------*\
Class DILUGaussSeidelSmoother Declaration
Class DILUGaussSeidelSmoother Declaration
\*---------------------------------------------------------------------------*/
class DILUGaussSeidelSmoother
@ -57,6 +57,7 @@ class DILUGaussSeidelSmoother
// Private data
DILUSmoother diluSmoother_;
GaussSeidelSmoother gsSmoother_;

View File

@ -37,36 +37,31 @@ namespace Foam
}
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
// * * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * //
Foam::IStringStream Foam::BICCG::solverDataStream
Foam::dictionary Foam::BICCG::solverDict
(
const scalar tolerance,
const scalar tol,
const scalar relTol
) const
)
{
return IStringStream
(
"{ preconditioner DILU;"
" tolerance " + name(tolerance) + "; relTol " + name(relTol) + "; }"
);
dictionary dict(IStringStream("solver PBiCG; preconditioner DILU;")());
dict.add("tolerance", tol);
dict.add("relTol", relTol);
return dict;
}
Foam::IStringStream Foam::BICCG::solverDataStream
Foam::dictionary Foam::BICCG::solverDict
(
const word& solverName,
Istream& solverData
) const
Istream& is
)
{
scalar tolerance(readScalar(solverData));
scalar relTol(readScalar(solverData));
scalar tol(readScalar(is));
scalar relTol(readScalar(is));
return IStringStream
(
solverName + "{ preconditioner DILU;"
" tolerance " + name(tolerance) + "; relTol " + name(relTol) + "; }"
);
return solverDict(tol, relTol);
}
@ -79,8 +74,7 @@ Foam::BICCG::BICCG
const FieldField<Field, scalar>& interfaceBouCoeffs,
const FieldField<Field, scalar>& interfaceIntCoeffs,
const lduInterfaceFieldPtrsList& interfaces,
const scalar tolerance,
const scalar relTol
const dictionary& solverControls
)
:
PBiCG
@ -90,7 +84,7 @@ Foam::BICCG::BICCG
interfaceBouCoeffs,
interfaceIntCoeffs,
interfaces,
solverDataStream(tolerance, relTol)()
solverControls
)
{}
@ -102,7 +96,8 @@ Foam::BICCG::BICCG
const FieldField<Field, scalar>& interfaceBouCoeffs,
const FieldField<Field, scalar>& interfaceIntCoeffs,
const lduInterfaceFieldPtrsList& interfaces,
Istream& solverData
const scalar tolerance,
const scalar relTol
)
:
PBiCG
@ -112,18 +107,8 @@ Foam::BICCG::BICCG
interfaceBouCoeffs,
interfaceIntCoeffs,
interfaces,
solverDataStream(word::null, solverData)()
solverDict(tolerance, relTol)
)
{}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
void Foam::BICCG::read(Istream& solverData)
{
word solverName(solverData);
PBiCG::read(solverDataStream(solverName, solverData)());
}
// ************************************************************************* //

View File

@ -32,7 +32,7 @@ Description
Deprecated
This solver is present for backward-compatibility and the PBiCG solver
should be used for preference.
should be used instead.
SourceFiles
BICCG.C
@ -65,31 +65,39 @@ class BICCG
//- Disallow default bitwise assignment
void operator=(const BICCG&);
//- Return the dictionary data-stream constructed from the components.
// Needed for backward compatibility
IStringStream solverDataStream
(
const scalar tolerance,
const scalar relTol
) const;
//- Return the dictionary data-stream constructed from the old-style
// data-stream. Needed for backward compatibility
IStringStream solverDataStream
(
const word& solverName,
Istream& solverData
) const;
public:
//- Return the dictionary constructed from the components.
// Needed for backward compatibility
static dictionary solverDict
(
const scalar tol,
const scalar relTol
);
//- Return the dictionary constructed from the old-style data-stream.
// Needed for backward compatibility
static dictionary solverDict(Istream&);
//- Runtime type information
TypeName("BICCG");
// Constructors
//- Construct from matrix components and solver data stream
BICCG
(
const word& fieldName,
const lduMatrix& matrix,
const FieldField<Field, scalar>& interfaceBouCoeffs,
const FieldField<Field, scalar>& interfaceIntCoeffs,
const lduInterfaceFieldPtrsList& interfaces,
const dictionary& solverControls
);
//- Construct from matrix components and tolerances
BICCG
(
@ -102,28 +110,11 @@ public:
const scalar relTol = 0.0
);
//- Construct from matrix components and solver data stream
BICCG
(
const word& fieldName,
const lduMatrix& matrix,
const FieldField<Field, scalar>& interfaceBouCoeffs,
const FieldField<Field, scalar>& interfaceIntCoeffs,
const lduInterfaceFieldPtrsList& interfaces,
Istream& solverData
);
// Destructor
virtual ~BICCG()
{}
// Member Functions
//- Read and reset the solver parameters from the given stream
void read(Istream& solverData);
};

View File

@ -49,7 +49,7 @@ Foam::GAMGSolver::GAMGSolver
const FieldField<Field, scalar>& interfaceBouCoeffs,
const FieldField<Field, scalar>& interfaceIntCoeffs,
const lduInterfaceFieldPtrsList& interfaces,
Istream& solverData
const dictionary& solverControls
)
:
lduMatrix::solver
@ -59,7 +59,7 @@ Foam::GAMGSolver::GAMGSolver
interfaceBouCoeffs,
interfaceIntCoeffs,
interfaces,
solverData
solverControls
),
// Default values for all controls
@ -112,7 +112,7 @@ Foam::GAMGSolver::GAMGSolver
"const FieldField<Field, scalar>& interfaceBouCoeffs,"
"const FieldField<Field, scalar>& interfaceIntCoeffs,"
"const lduInterfaceFieldPtrsList& interfaces,"
"Istream& solverData"
"const dictionary& solverControls"
")"
) << "No coarse levels created, either matrix too small for GAMG"
" or nCellsInCoarsestLevel too large.\n"
@ -154,6 +154,7 @@ void Foam::GAMGSolver::readControls()
{
lduMatrix::solver::readControls();
// we could also consider supplying defaults here too
controlDict_.readIfPresent("cacheAgglomeration", cacheAgglomeration_);
controlDict_.readIfPresent("nPreSweeps", nPreSweeps_);
controlDict_.readIfPresent("nPostSweeps", nPostSweeps_);

View File

@ -212,7 +212,7 @@ public:
// Constructors
//- Construct from lduMatrix
//- Construct from lduMatrix and solver controls
GAMGSolver
(
const word& fieldName,
@ -220,7 +220,7 @@ public:
const FieldField<Field, scalar>& interfaceBouCoeffs,
const FieldField<Field, scalar>& interfaceIntCoeffs,
const lduInterfaceFieldPtrsList& interfaces,
Istream& solverData
const dictionary& solverControls
);

View File

@ -374,7 +374,7 @@ void Foam::GAMGSolver::initVcycle
interfaceBouCoeffs_,
interfaceIntCoeffs_,
interfaces_,
controlDict_.lookup("smoother")
controlDict_
)
);
@ -408,7 +408,7 @@ void Foam::GAMGSolver::initVcycle
interfaceLevelsBouCoeffs_[leveli],
interfaceLevelsIntCoeffs_[leveli],
interfaceLevels_[leveli],
controlDict_.lookup("smoother")
controlDict_
)
);
}

View File

@ -36,40 +36,33 @@ namespace Foam
addICCGSymMatrixConstructorToTable_;
}
// * * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * //
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
Foam::IStringStream Foam::ICCG::solverDataStream
Foam::dictionary Foam::ICCG::solverDict
(
const scalar tolerance,
const scalar tol,
const scalar relTol
) const
)
{
return IStringStream
(
"{ preconditioner DIC;"
" tolerance " + name(tolerance) + "; relTol " + name(relTol) + "; }"
);
dictionary dict(IStringStream("solver PCG; preconditioner DIC;")());
dict.add("tolerance", tol);
dict.add("relTol", relTol);
return dict;
}
Foam::IStringStream Foam::ICCG::solverDataStream
Foam::dictionary Foam::ICCG::solverDict
(
const word& solverName,
Istream& solverData
) const
Istream& is
)
{
scalar tolerance(readScalar(solverData));
scalar relTol(readScalar(solverData));
scalar tol(readScalar(is));
scalar relTol(readScalar(is));
return IStringStream
(
solverName + "{ preconditioner DIC;"
" tolerance " + name(tolerance) + "; relTol " + name(relTol) + "; }"
);
return solverDict(tol, relTol);
}
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
Foam::ICCG::ICCG
@ -79,8 +72,7 @@ Foam::ICCG::ICCG
const FieldField<Field, scalar>& interfaceBouCoeffs,
const FieldField<Field, scalar>& interfaceIntCoeffs,
const lduInterfaceFieldPtrsList& interfaces,
const scalar tolerance,
const scalar relTol
const dictionary& solverControls
)
:
PCG
@ -90,7 +82,7 @@ Foam::ICCG::ICCG
interfaceBouCoeffs,
interfaceIntCoeffs,
interfaces,
solverDataStream(tolerance, relTol)()
solverControls
)
{}
@ -102,7 +94,8 @@ Foam::ICCG::ICCG
const FieldField<Field, scalar>& interfaceBouCoeffs,
const FieldField<Field, scalar>& interfaceIntCoeffs,
const lduInterfaceFieldPtrsList& interfaces,
Istream& solverData
const scalar tolerance,
const scalar relTol
)
:
PCG
@ -112,18 +105,8 @@ Foam::ICCG::ICCG
interfaceBouCoeffs,
interfaceIntCoeffs,
interfaces,
solverDataStream(word::null, solverData)()
solverDict(tolerance, relTol)
)
{}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
void Foam::ICCG::read(Istream& solverData)
{
word solverName(solverData);
PCG::read(solverDataStream(solverName, solverData)());
}
// ************************************************************************* //

View File

@ -65,31 +65,38 @@ class ICCG
//- Disallow default bitwise assignment
void operator=(const ICCG&);
//- Return the dictionary data-stream constructed from the components.
// Needed for backward compatibility
IStringStream solverDataStream
(
const scalar tolerance,
const scalar relTol
) const;
//- Return the dictionary data-stream constructed from the old-style
// data-stream. Needed for backward compatibility
IStringStream solverDataStream
(
const word& solverName,
Istream& solverData
) const;
public:
//- Return the dictionary constructed from the components.
// Needed for backward compatibility
static dictionary solverDict
(
const scalar tol,
const scalar relTol
);
//- Return the dictionary constructed from the old-style data-stream.
// Needed for backward compatibility
static dictionary solverDict(Istream&);
//- Runtime type information
TypeName("ICCG");
// Constructors
//- Construct from matrix components and solver data stream
ICCG
(
const word& fieldName,
const lduMatrix& matrix,
const FieldField<Field, scalar>& interfaceBouCoeffs,
const FieldField<Field, scalar>& interfaceIntCoeffs,
const lduInterfaceFieldPtrsList& interfaces,
const dictionary& solverControls
);
//- Construct from matrix components and tolerances
ICCG
(
@ -102,28 +109,11 @@ public:
const scalar relTol = 0.0
);
//- Construct from matrix components and solver data stream
ICCG
(
const word& fieldName,
const lduMatrix& matrix,
const FieldField<Field, scalar>& interfaceBouCoeffs,
const FieldField<Field, scalar>& interfaceIntCoeffs,
const lduInterfaceFieldPtrsList& interfaces,
Istream& solverData
);
// Destructor
virtual ~ICCG()
{}
// Member Functions
//- Read and reset the solver parameters from the given stream
void read(Istream& solverData);
};

View File

@ -46,7 +46,7 @@ Foam::PBiCG::PBiCG
const FieldField<Field, scalar>& interfaceBouCoeffs,
const FieldField<Field, scalar>& interfaceIntCoeffs,
const lduInterfaceFieldPtrsList& interfaces,
Istream& solverData
const dictionary& solverControls
)
:
lduMatrix::solver
@ -56,7 +56,7 @@ Foam::PBiCG::PBiCG
interfaceBouCoeffs,
interfaceIntCoeffs,
interfaces,
solverData
solverControls
)
{}
@ -70,12 +70,10 @@ Foam::lduMatrix::solverPerformance Foam::PBiCG::solve
const direction cmpt
) const
{
word preconditionerName(controlDict_.lookup("preconditioner"));
// --- Setup class containing solver performance data
lduMatrix::solverPerformance solverPerf
(
preconditionerName + typeName,
lduMatrix::preconditioner::getName(controlDict_) + typeName,
fieldName_
);
@ -128,7 +126,7 @@ Foam::lduMatrix::solverPerformance Foam::PBiCG::solve
lduMatrix::preconditioner::New
(
*this,
controlDict_.lookup("preconditioner")
controlDict_
);
// --- Solver iteration

View File

@ -77,7 +77,7 @@ public:
const FieldField<Field, scalar>& interfaceBouCoeffs,
const FieldField<Field, scalar>& interfaceIntCoeffs,
const lduInterfaceFieldPtrsList& interfaces,
Istream& solverData
const dictionary& solverControls
);

View File

@ -46,7 +46,7 @@ Foam::PCG::PCG
const FieldField<Field, scalar>& interfaceBouCoeffs,
const FieldField<Field, scalar>& interfaceIntCoeffs,
const lduInterfaceFieldPtrsList& interfaces,
Istream& solverData
const dictionary& solverControls
)
:
lduMatrix::solver
@ -56,7 +56,7 @@ Foam::PCG::PCG
interfaceBouCoeffs,
interfaceIntCoeffs,
interfaces,
solverData
solverControls
)
{}
@ -70,12 +70,10 @@ Foam::lduMatrix::solverPerformance Foam::PCG::solve
const direction cmpt
) const
{
word preconditionerName(controlDict_.lookup("preconditioner"));
// --- Setup class containing solver performance data
lduMatrix::solverPerformance solverPerf
(
preconditionerName + typeName,
lduMatrix::preconditioner::getName(controlDict_) + typeName,
fieldName_
);
@ -119,7 +117,7 @@ Foam::lduMatrix::solverPerformance Foam::PCG::solve
lduMatrix::preconditioner::New
(
*this,
controlDict_.lookup("preconditioner")
controlDict_
);
// --- Solver iteration

View File

@ -27,7 +27,7 @@ Class
Description
Preconditioned conjugate gradient solver for symmetric lduMatrices
using a run-time selectable preconditiioner.
using a run-time selectable preconditioner.
SourceFiles
PCG.C
@ -69,7 +69,7 @@ public:
// Constructors
//- Construct from matrix components and solver data stream
//- Construct from matrix components and solver controls
PCG
(
const word& fieldName,
@ -77,7 +77,7 @@ public:
const FieldField<Field, scalar>& interfaceBouCoeffs,
const FieldField<Field, scalar>& interfaceIntCoeffs,
const lduInterfaceFieldPtrsList& interfaces,
Istream& solverData
const dictionary& solverControls
);

View File

@ -43,7 +43,7 @@ Foam::diagonalSolver::diagonalSolver
const FieldField<Field, scalar>& interfaceBouCoeffs,
const FieldField<Field, scalar>& interfaceIntCoeffs,
const lduInterfaceFieldPtrsList& interfaces,
Istream& solverData
const dictionary& solverControls
)
:
lduMatrix::solver
@ -53,19 +53,13 @@ Foam::diagonalSolver::diagonalSolver
interfaceBouCoeffs,
interfaceIntCoeffs,
interfaces,
solverData
solverControls
)
{}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
void Foam::diagonalSolver::read(Istream& solverData)
{
word solverName(solverData);
}
Foam::lduMatrix::solverPerformance Foam::diagonalSolver::solve
(
scalarField& psi,

View File

@ -68,7 +68,7 @@ public:
// Constructors
//- Construct from matrix
//- Construct from matrix and solver controls
diagonalSolver
(
const word& fieldName,
@ -76,14 +76,15 @@ public:
const FieldField<Field, scalar>& interfaceBouCoeffs,
const FieldField<Field, scalar>& interfaceIntCoeffs,
const lduInterfaceFieldPtrsList& interfaces,
Istream& solverData
const dictionary& solverControls
);
// Member Functions
//- Read and reset the solver parameters from the given stream
void read(Istream& solverData);
void read(const dictionary&)
{}
//- Solve the matrix with this solver
lduMatrix::solverPerformance solve

View File

@ -49,7 +49,7 @@ Foam::smoothSolver::smoothSolver
const FieldField<Field, scalar>& interfaceBouCoeffs,
const FieldField<Field, scalar>& interfaceIntCoeffs,
const lduInterfaceFieldPtrsList& interfaces,
Istream& solverData
const dictionary& solverControls
)
:
lduMatrix::solver
@ -59,9 +59,8 @@ Foam::smoothSolver::smoothSolver
interfaceBouCoeffs,
interfaceIntCoeffs,
interfaces,
solverData
),
nSweeps_(1)
solverControls
)
{
readControls();
}
@ -72,7 +71,7 @@ Foam::smoothSolver::smoothSolver
void Foam::smoothSolver::readControls()
{
lduMatrix::solver::readControls();
controlDict_.readIfPresent("nSweeps", nSweeps_);
nSweeps_ = controlDict_.lookupOrDefault<label>("nSweeps", 1);
}
@ -96,7 +95,7 @@ Foam::lduMatrix::solverPerformance Foam::smoothSolver::solve
interfaceBouCoeffs_,
interfaceIntCoeffs_,
interfaces_,
controlDict_.lookup("smoother")
controlDict_
);
smootherPtr->smooth
@ -144,7 +143,7 @@ Foam::lduMatrix::solverPerformance Foam::smoothSolver::solve
interfaceBouCoeffs_,
interfaceIntCoeffs_,
interfaces_,
controlDict_.lookup("smoother")
controlDict_
);
// Smoothing loop

View File

@ -66,7 +66,6 @@ protected:
//- Read the control parameters from the controlDict_
virtual void readControls();
public:
//- Runtime type information
@ -75,7 +74,7 @@ public:
// Constructors
//- Construct from matrix components and solver data stream
//- Construct from matrix components and solver controls
smoothSolver
(
const word& fieldName,
@ -83,10 +82,15 @@ public:
const FieldField<Field, scalar>& interfaceBouCoeffs,
const FieldField<Field, scalar>& interfaceIntCoeffs,
const lduInterfaceFieldPtrsList& interfaces,
Istream& solverData
const dictionary& solverControls
);
// Destructor
virtual ~smoothSolver()
{}
// Member Functions
//- Solve the matrix with this solver

View File

@ -27,9 +27,12 @@ License
#include "solution.H"
#include "Time.H"
// these two are for old syntax compatibility:
#include "BICCG.H"
#include "ICCG.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
int Foam::solution::debug(Foam::debug::debugSwitch("solution", false));
int Foam::solution::debug(::Foam::debug::debugSwitch("solution", 0));
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
@ -55,6 +58,83 @@ Foam::solution::solution(const objectRegistry& obr, const fileName& dictName)
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
Foam::label Foam::solution::upgradeSolverDict
(
dictionary& dict,
const bool verbose
)
{
label nChanged = 0;
// backward compatibility:
// recast primitive entries into dictionary entries
forAllIter(dictionary, dict, iter)
{
if (!iter().isDict())
{
Istream& is = iter().stream();
word name(is);
dictionary subdict;
if (name == "BICCG")
{
// special treatment for very old syntax
subdict = BICCG::solverDict(is);
}
else if (name == "ICCG")
{
// special treatment for very old syntax
subdict = ICCG::solverDict(is);
}
else
{
subdict.add("solver", name);
subdict <<= dictionary(is);
// preconditioner can be a primitiveEntry w/o settings,
// or a dictionaryEntry.
// transform primitiveEntry with settings -> dictionaryEntry
entry* precond = subdict.lookupEntryPtr
(
"preconditioner",
false,
false
);
if (precond && !precond->isDict())
{
Istream& is = precond->stream();
is >> name;
if (!is.eof())
{
dictionary precondDict;
precondDict.add("preconditioner", name);
precondDict <<= dictionary(is);
subdict.set("preconditioner", precondDict);
}
}
}
// write out information to help people adjust to the new syntax
if (verbose)
{
Info<< "// using new solver syntax:\n"
<< iter().keyword() << subdict << endl;
}
// overwrite with dictionary entry
dict.set(iter().keyword(), subdict);
nChanged++;
}
}
return nChanged;
}
bool Foam::solution::read()
{
if (regIOobject::read())
@ -69,6 +149,7 @@ bool Foam::solution::read()
if (dict.found("solvers"))
{
solvers_ = dict.subDict("solvers");
upgradeSolverDict(solvers_);
}
return true;
@ -97,7 +178,7 @@ bool Foam::solution::relax(const word& name) const
{
if (debug)
{
Info<< "Lookup relax for " << name << endl;
Info<< "Find relax for " << name << endl;
}
return relaxationFactors_.found(name);
@ -127,7 +208,7 @@ const Foam::dictionary& Foam::solution::solverDict(const word& name) const
}
Foam::ITstream& Foam::solution::solver(const word& name) const
const Foam::dictionary& Foam::solution::solver(const word& name) const
{
if (debug)
{
@ -135,7 +216,7 @@ Foam::ITstream& Foam::solution::solver(const word& name) const
<< "Lookup solver for " << name << endl;
}
return solvers_.lookup(name);
return solvers_.subDict(name);
}

View File

@ -44,7 +44,7 @@ namespace Foam
{
/*---------------------------------------------------------------------------*\
Class solution Declaration
Class solution Declaration
\*---------------------------------------------------------------------------*/
class solution
@ -59,7 +59,6 @@ class solution
//- Dictionary of solver parameters for all the fields
dictionary solvers_;
// Private Member Functions
//- Disallow default bitwise copy construct and assignment
@ -69,6 +68,11 @@ class solution
public:
//- Update from older solver controls syntax
// Usually verbose, since we want to know about the changes
// Returns the number of settings changed
static label upgradeSolverDict(dictionary& dict, const bool verbose=true);
//- Debug switch
static int debug;
@ -84,7 +88,7 @@ public:
// Access
//- Return the selected sub-dictionary of solvers if the "select"
// keyword is given othewise return the complete dictionary
// keyword is given, otherwise return the complete dictionary
const dictionary& solutionDict() const;
//- Return true if the relaxation factor is given for the field
@ -93,13 +97,11 @@ public:
//- Return the relaxation factor for the given field
scalar relaxationFactor(const word& name) const;
//- Return the dictionary of solver parameters for the given field
//- Return the solver controls dictionary for the given field
const dictionary& solverDict(const word& name) const;
//- Return the stream of solver parameters for the given field
// @deprecated Backward compatibility only - should use solverDict
ITstream& solver(const word& name) const;
//- Return the solver controls dictionary for the given field
const dictionary& solver(const word& name) const;
// Read

View File

@ -336,8 +336,8 @@ Foam::fvMatrix<Type>::fvMatrix
{
if (debug)
{
Info<< "fvMatrix<Type>(GeometricField<Type, fvPatchField, volMesh>&,"
" Istream&) : "
Info<< "fvMatrix<Type>"
"(GeometricField<Type, fvPatchField, volMesh>&, Istream&) : "
"constructing fvMatrix<Type> for field " << psi_.name()
<< endl;
}
@ -1257,7 +1257,7 @@ template<class Type>
Foam::lduMatrix::solverPerformance Foam::solve
(
fvMatrix<Type>& fvm,
Istream& solverControls
const dictionary& solverControls
)
{
return fvm.solve(solverControls);
@ -1267,7 +1267,7 @@ template<class Type>
Foam::lduMatrix::solverPerformance Foam::solve
(
const tmp<fvMatrix<Type> >& tfvm,
Istream& solverControls
const dictionary& solverControls
)
{
lduMatrix::solverPerformance solverPerf =

View File

@ -220,8 +220,8 @@ public:
// Member functions
//- Solve returning the solution statistics.
// Solver controls read from Istream
lduMatrix::solverPerformance solve(Istream&);
// Use the given solver controls
lduMatrix::solverPerformance solve(const dictionary&);
//- Solve returning the solution statistics.
// Solver controls read from fvSolution
@ -359,16 +359,16 @@ public:
);
//- Construct and return the solver
// Solver controls read from Istream
autoPtr<fvSolver> solver(Istream&);
// Use the given solver controls
autoPtr<fvSolver> solver(const dictionary&);
//- Construct and return the solver
// Solver controls read from fvSolution
autoPtr<fvSolver> solver();
//- Solve returning the solution statistics.
// Solver controls read from Istream
lduMatrix::solverPerformance solve(Istream&);
// Use the given solver controls
lduMatrix::solverPerformance solve(const dictionary&);
//- Solve returning the solution statistics.
// Solver controls read from fvSolution
@ -518,16 +518,20 @@ void checkMethod
//- Solve returning the solution statistics given convergence tolerance
// Solver controls read Istream
// Use the given solver controls
template<class Type>
lduMatrix::solverPerformance solve(fvMatrix<Type>&, Istream&);
lduMatrix::solverPerformance solve(fvMatrix<Type>&, const dictionary&);
//- Solve returning the solution statistics given convergence tolerance,
// deleting temporary matrix after solution.
// Solver controls read Istream
// Use the given solver controls
template<class Type>
lduMatrix::solverPerformance solve(const tmp<fvMatrix<Type> >&, Istream&);
lduMatrix::solverPerformance solve
(
const tmp<fvMatrix<Type> >&,
const dictionary&
);
//- Solve returning the solution statistics given convergence tolerance

View File

@ -53,12 +53,12 @@ void Foam::fvMatrix<Type>::setComponentReference
template<class Type>
Foam::lduMatrix::solverPerformance Foam::fvMatrix<Type>::solve
(
Istream& solverControls
const dictionary& solverControls
)
{
if (debug)
{
Info<< "fvMatrix<Type>::solve(Istream& solverControls) : "
Info<< "fvMatrix<Type>::solve(const dictionary& solverControls) : "
"solving fvMatrix<Type>"
<< endl;
}
@ -108,7 +108,7 @@ Foam::lduMatrix::solverPerformance Foam::fvMatrix<Type>::solve
internalCoeffs_.component(cmpt)
);
lduInterfaceFieldPtrsList interfaces =
lduInterfaceFieldPtrsList interfaces =
psi_.boundaryField().interfaces();
// Use the initMatrixInterfaces and updateMatrixInterfaces to correct
@ -142,7 +142,7 @@ Foam::lduMatrix::solverPerformance Foam::fvMatrix<Type>::solve
bouCoeffsCmpt,
intCoeffsCmpt,
interfaces,
solverControls.rewind()
solverControls
)->solve(psiCmpt, sourceCmpt, cmpt);
solverPerf.print();
@ -170,20 +170,20 @@ template<class Type>
Foam::autoPtr<typename Foam::fvMatrix<Type>::fvSolver>
Foam::fvMatrix<Type>::solver()
{
return solver(psi_.mesh().solver(psi_.name()));
return solver(psi_.mesh().solverDict(psi_.name()));
}
template<class Type>
Foam::lduMatrix::solverPerformance Foam::fvMatrix<Type>::fvSolver::solve()
{
return solve(psi_.mesh().solver(psi_.name()));
return solve(psi_.mesh().solverDict(psi_.name()));
}
template<class Type>
Foam::lduMatrix::solverPerformance Foam::fvMatrix<Type>::solve()
{
return solve(psi_.mesh().solver(psi_.name()));
return solve(psi_.mesh().solverDict(psi_.name()));
}

View File

@ -45,7 +45,7 @@ void Foam::fvMatrix<Foam::scalar>::setComponentReference
internalCoeffs_[patchi][facei] +=
diag()[psi_.mesh().boundary()[patchi].faceCells()[facei]];
boundaryCoeffs_[patchi][facei] +=
boundaryCoeffs_[patchi][facei] +=
diag()[psi_.mesh().boundary()[patchi].faceCells()[facei]]
*value;
}
@ -57,12 +57,12 @@ template<>
Foam::autoPtr<Foam::fvMatrix<Foam::scalar>::fvSolver>
Foam::fvMatrix<Foam::scalar>::solver
(
Istream& solverControls
const dictionary& solverControls
)
{
if (debug)
{
Info<< "fvMatrix<scalar>::solver(Istream& solverControls) : "
Info<< "fvMatrix<scalar>::solver(const dictionary& solverControls) : "
"solver for fvMatrix<scalar>"
<< endl;
}
@ -96,7 +96,7 @@ Foam::fvMatrix<Foam::scalar>::solver
template<>
Foam::lduMatrix::solverPerformance Foam::fvMatrix<Foam::scalar>::fvSolver::solve
(
Istream& solverControls
const dictionary& solverControls
)
{
scalarField saveDiag = fvMat_.diag();
@ -105,8 +105,10 @@ Foam::lduMatrix::solverPerformance Foam::fvMatrix<Foam::scalar>::fvSolver::solve
scalarField totalSource = fvMat_.source();
fvMat_.addBoundarySource(totalSource, false);
// assign new solver controls
solver_->read(solverControls);
lduMatrix::solverPerformance solverPerf =
lduMatrix::solverPerformance solverPerf =
solver_->solve(fvMat_.psi().internalField(), totalSource);
solverPerf.print();
@ -122,12 +124,12 @@ Foam::lduMatrix::solverPerformance Foam::fvMatrix<Foam::scalar>::fvSolver::solve
template<>
Foam::lduMatrix::solverPerformance Foam::fvMatrix<Foam::scalar>::solve
(
Istream& solverControls
const dictionary& solverControls
)
{
if (debug)
{
Info<< "fvMatrix<scalar>::solve(Istream& solverControls) : "
Info<< "fvMatrix<scalar>::solve(const dictionary& solverControls) : "
"solving fvMatrix<scalar>"
<< endl;
}

View File

@ -23,9 +23,10 @@ License
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
InClass
Foam::fvScalarMatrix
Foam::fvMatrix
Description
A scalar instance of fvMatrix
SourceFiles
fvScalarMatrix.C
@ -56,13 +57,22 @@ void fvMatrix<scalar>::setComponentReference
);
template<>
autoPtr<fvMatrix<scalar>::fvSolver> fvMatrix<scalar>::solver(Istream&);
autoPtr<fvMatrix<scalar>::fvSolver> fvMatrix<scalar>::solver
(
const dictionary&
);
template<>
lduMatrix::solverPerformance fvMatrix<scalar>::fvSolver::solve(Istream&);
lduMatrix::solverPerformance fvMatrix<scalar>::fvSolver::solve
(
const dictionary&
);
template<>
lduMatrix::solverPerformance fvMatrix<scalar>::solve(Istream&);
lduMatrix::solverPerformance fvMatrix<scalar>::solve
(
const dictionary&
);
template<>
tmp<scalarField> fvMatrix<scalar>::residual() const;

View File

@ -142,8 +142,8 @@ void Foam::MULES::implicitSolve
{
const fvMesh& mesh = psi.mesh();
dictionary MULESSolver(mesh.solver(psi.name()));
const dictionary& MULEScontrols = MULESSolver.subDict("MULESImplicit");
const dictionary& MULEScontrols =
mesh.solverDict(psi.name()).subDict("MULESImplicit");
label maxIter
(

View File

@ -55,7 +55,7 @@ namespace Foam
Foam::displacementSBRStressFvMotionSolver::displacementSBRStressFvMotionSolver
(
const polyMesh& mesh,
Istream& msData
Istream&
)
:
fvMotionSolver(mesh),

View File

@ -93,8 +93,8 @@ public:
//- Construct from polyMesh and data stream
displacementSBRStressFvMotionSolver
(
const polyMesh& mesh,
Istream& msData
const polyMesh&,
Istream& msDataUnused
);

View File

@ -107,9 +107,10 @@ public:
// Constructors
//- Construct from polyMesh and data stream
displacementComponentLaplacianFvMotionSolver
(
const polyMesh& mesh,
const polyMesh&,
Istream& msData
);

View File

@ -58,7 +58,7 @@ Foam::displacementInterpolationFvMotionSolver::
displacementInterpolationFvMotionSolver
(
const polyMesh& mesh,
Istream& msData
Istream&
)
:
fvMotionSolver(mesh),

View File

@ -115,10 +115,11 @@ public:
// Constructors
//- Construct from polyMesh and data stream
displacementInterpolationFvMotionSolver
(
const polyMesh& mesh,
Istream& msData
const polyMesh&,
Istream& msDataUnused
);

View File

@ -53,7 +53,7 @@ namespace Foam
Foam::displacementLaplacianFvMotionSolver::displacementLaplacianFvMotionSolver
(
const polyMesh& mesh,
Istream& msData
Istream&
)
:
fvMotionSolver(mesh),

View File

@ -101,8 +101,8 @@ public:
//- Construct from polyMesh and data stream
displacementLaplacianFvMotionSolver
(
const polyMesh& mesh,
Istream& msData
const polyMesh&,
Istream& msDataUnused
);

View File

@ -93,9 +93,10 @@ public:
// Constructors
//- Construct from polyMesh and data stream (provides component)
velocityComponentLaplacianFvMotionSolver
(
const polyMesh& mesh,
const polyMesh&,
Istream& msData
);

View File

@ -50,7 +50,7 @@ namespace Foam
Foam::velocityLaplacianFvMotionSolver::velocityLaplacianFvMotionSolver
(
const polyMesh& mesh,
Istream& msData
Istream&
)
:
fvMotionSolver(mesh),

View File

@ -88,7 +88,11 @@ public:
// Constructors
//- Construct from polyMesh and data stream
velocityLaplacianFvMotionSolver(const polyMesh& mesh, Istream& msData);
velocityLaplacianFvMotionSolver
(
const polyMesh&,
Istream& msDataUnused
);
// Destructor