LduMatrix: Added support for both component-coupled and component-independent forms of PCG and PBiCG

This commit is contained in:
Henry
2012-04-26 11:41:06 +01:00
parent 4305e7dd6b
commit 4ff7ac3efe
12 changed files with 87 additions and 62 deletions

View File

@ -102,7 +102,7 @@ int main(int argc, char *argv[])
"{" "{"
" /*solver SmoothSolver;*/" " /*solver SmoothSolver;*/"
" smoother GaussSeidel;" " smoother GaussSeidel;"
" solver PBiCG;" " solver PBiCCCG;"
" preconditioner DILU;" " preconditioner DILU;"
" tolerance (1e-7 1e-7 1);" " tolerance (1e-7 1e-7 1);"
" relTol (0 0 0);" " relTol (0 0 0);"

View File

@ -365,7 +365,7 @@ scalar sumProd(const UList<Type>& f1, const UList<Type>& f2)
if (f1.size() && (f1.size() == f2.size())) if (f1.size() && (f1.size() == f2.size()))
{ {
scalar SumProd = 0.0; scalar SumProd = 0.0;
TFOR_ALL_S_OP_F_OP_F(scalar, SumProd, +=, Type, f1, *, Type, f2) TFOR_ALL_S_OP_F_OP_F(scalar, SumProd, +=, Type, f1, &&, Type, f2)
return SumProd; return SumProd;
} }
else else
@ -498,7 +498,7 @@ template<class Type>
scalar gSumProd(const UList<Type>& f1, const UList<Type>& f2) scalar gSumProd(const UList<Type>& f1, const UList<Type>& f2)
{ {
scalar SumProd = sumProd(f1, f2); scalar SumProd = sumProd(f1, f2);
reduce(SumProd, sumOp<Type>()); reduce(SumProd, sumOp<scalar>());
return SumProd; return SumProd;
} }

View File

@ -23,8 +23,6 @@ License
\*---------------------------------------------------------------------------*/ \*---------------------------------------------------------------------------*/
#include "scalarField.H"
#define TEMPLATE template<class Type> #define TEMPLATE template<class Type>
#include "FieldFunctionsM.H" #include "FieldFunctionsM.H"
@ -332,5 +330,6 @@ PRODUCT_OPERATOR(scalarProduct, &&, dotdot)
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#include "undefFieldFunctionsM.H" #include "undefFieldFunctionsM.H"
#include "scalarField.H"
// ************************************************************************* // // ************************************************************************* //

View File

@ -86,6 +86,24 @@ tmp<scalarField> stabilise(const tmp<scalarField>& tsf, const scalar s)
} }
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
template<>
scalar sumProd(const UList<scalar>& f1, const UList<scalar>& f2)
{
if (f1.size() && (f1.size() == f2.size()))
{
scalar SumProd = 0.0;
TFOR_ALL_S_OP_F_OP_F(scalar, SumProd, +=, scalar, f1, *, scalar, f2)
return SumProd;
}
else
{
return 0.0;
}
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
BINARY_TYPE_OPERATOR(scalar, scalar, scalar, +, add) BINARY_TYPE_OPERATOR(scalar, scalar, scalar, +, add)

View File

@ -72,6 +72,12 @@ tmp<scalarField> stabilise(const UList<scalar>&, const scalar s);
tmp<scalarField> stabilise(const tmp<scalarField>&, const scalar s); tmp<scalarField> stabilise(const tmp<scalarField>&, const scalar s);
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
template<>
scalar sumProd(const UList<scalar>& f1, const UList<scalar>& f2);
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
BINARY_TYPE_OPERATOR(scalar, scalar, scalar, +, add) BINARY_TYPE_OPERATOR(scalar, scalar, scalar, +, add)

View File

@ -23,12 +23,12 @@ License
\*---------------------------------------------------------------------------*/ \*---------------------------------------------------------------------------*/
#include "TPBiCG.H" #include "PBiCCCG.H"
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
template<class Type, class DType, class LUType> template<class Type, class DType, class LUType>
Foam::TPBiCG<Type, DType, LUType>::TPBiCG Foam::PBiCCCG<Type, DType, LUType>::PBiCCCG
( (
const word& fieldName, const word& fieldName,
const LduMatrix<Type, DType, LUType>& matrix, const LduMatrix<Type, DType, LUType>& matrix,
@ -48,7 +48,7 @@ Foam::TPBiCG<Type, DType, LUType>::TPBiCG
template<class Type, class DType, class LUType> template<class Type, class DType, class LUType>
typename Foam::LduMatrix<Type, DType, LUType>::solverPerformance typename Foam::LduMatrix<Type, DType, LUType>::solverPerformance
Foam::TPBiCG<Type, DType, LUType>::solve Foam::PBiCCCG<Type, DType, LUType>::solve
( (
Field<Type>& psi Field<Type>& psi
) const ) const
@ -125,8 +125,7 @@ Foam::TPBiCG<Type, DType, LUType>::solve
preconPtr->preconditionT(wT, rT); preconPtr->preconditionT(wT, rT);
// --- Update search directions: // --- Update search directions:
//wArT = gSumProd(wA, rT); wArT = gSumProd(wA, rT);
wArT = gSum(wA && rT);
if (solverPerf.nIterations() == 0) if (solverPerf.nIterations() == 0)
{ {
@ -152,14 +151,14 @@ Foam::TPBiCG<Type, DType, LUType>::solve
this->matrix_.Amul(wA, pA); this->matrix_.Amul(wA, pA);
this->matrix_.Tmul(wT, pT); this->matrix_.Tmul(wT, pT);
scalar wApT = gSum(wA && pT); scalar wApT = gSumProd(wA, pT);
// --- Test for singularity // --- Test for singularity
if if
( (
solverPerf.checkSingularity solverPerf.checkSingularity
( (
cmptDivide(Type::one*mag(wApT), normFactor) cmptDivide(pTraits<Type>::one*mag(wApT), normFactor)
) )
) )
{ {

View File

@ -22,19 +22,19 @@ License
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
Class Class
Foam::TPBiCG Foam::PBiCCCG
Description Description
Preconditioned bi-conjugate gradient solver for asymmetric lduMatrices Preconditioned bi-conjugate gradient solver for asymmetric lduMatrices
using a run-time selectable preconditiioner. using a run-time selectable preconditiioner.
SourceFiles SourceFiles
TPBiCG.C PBiCCCG.C
\*---------------------------------------------------------------------------*/ \*---------------------------------------------------------------------------*/
#ifndef TPBiCG_H #ifndef PBiCCCG_H
#define TPBiCG_H #define PBiCCCG_H
#include "LduMatrix.H" #include "LduMatrix.H"
@ -44,33 +44,33 @@ namespace Foam
{ {
/*---------------------------------------------------------------------------*\ /*---------------------------------------------------------------------------*\
Class TPBiCG Declaration Class PBiCCCG Declaration
\*---------------------------------------------------------------------------*/ \*---------------------------------------------------------------------------*/
template<class Type, class DType, class LUType> template<class Type, class DType, class LUType>
class TPBiCG class PBiCCCG
: :
public LduMatrix<Type, DType, LUType>::solver public LduMatrix<Type, DType, LUType>::solver
{ {
// Private Member Functions // Private Member Functions
//- Disallow default bitwise copy construct //- Disallow default bitwise copy construct
TPBiCG(const TPBiCG&); PBiCCCG(const PBiCCCG&);
//- Disallow default bitwise assignment //- Disallow default bitwise assignment
void operator=(const TPBiCG&); void operator=(const PBiCCCG&);
public: public:
//- Runtime type information //- Runtime type information
TypeName("PBiCG"); TypeName("PBiCCCG");
// Constructors // Constructors
//- Construct from matrix components and solver data dictionary //- Construct from matrix components and solver data dictionary
TPBiCG PBiCCCG
( (
const word& fieldName, const word& fieldName,
const LduMatrix<Type, DType, LUType>& matrix, const LduMatrix<Type, DType, LUType>& matrix,
@ -80,7 +80,7 @@ public:
// Destructor // Destructor
virtual ~TPBiCG() virtual ~PBiCCCG()
{} {}
@ -101,7 +101,7 @@ public:
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#ifdef NoRepository #ifdef NoRepository
# include "TPBiCG.C" # include "PBiCCCG.C"
#endif #endif
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

View File

@ -23,12 +23,12 @@ License
\*---------------------------------------------------------------------------*/ \*---------------------------------------------------------------------------*/
#include "TPBiCG.H" #include "PBiCICG.H"
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
template<class Type, class DType, class LUType> template<class Type, class DType, class LUType>
Foam::TPBiCG<Type, DType, LUType>::TPBiCG Foam::PBiCICG<Type, DType, LUType>::PBiCICG
( (
const word& fieldName, const word& fieldName,
const LduMatrix<Type, DType, LUType>& matrix, const LduMatrix<Type, DType, LUType>& matrix,
@ -48,7 +48,7 @@ Foam::TPBiCG<Type, DType, LUType>::TPBiCG
template<class Type, class DType, class LUType> template<class Type, class DType, class LUType>
typename Foam::LduMatrix<Type, DType, LUType>::solverPerformance typename Foam::LduMatrix<Type, DType, LUType>::solverPerformance
Foam::TPBiCG<Type, DType, LUType>::solve(Field<Type>& psi) const Foam::PBiCICG<Type, DType, LUType>::solve(Field<Type>& psi) const
{ {
word preconditionerName(this->controlDict_.lookup("preconditioner")); word preconditionerName(this->controlDict_.lookup("preconditioner"));

View File

@ -22,19 +22,19 @@ License
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
Class Class
Foam::TPBiCG Foam::PBiCICG
Description Description
Preconditioned bi-conjugate gradient solver for asymmetric lduMatrices Preconditioned bi-conjugate gradient solver for asymmetric lduMatrices
using a run-time selectable preconditiioner. using a run-time selectable preconditiioner.
SourceFiles SourceFiles
TPBiCG.C PBiCICG.C
\*---------------------------------------------------------------------------*/ \*---------------------------------------------------------------------------*/
#ifndef TPBiCG_H #ifndef PBiCICG_H
#define TPBiCG_H #define PBiCICG_H
#include "LduMatrix.H" #include "LduMatrix.H"
@ -44,33 +44,33 @@ namespace Foam
{ {
/*---------------------------------------------------------------------------*\ /*---------------------------------------------------------------------------*\
Class TPBiCG Declaration Class PBiCICG Declaration
\*---------------------------------------------------------------------------*/ \*---------------------------------------------------------------------------*/
template<class Type, class DType, class LUType> template<class Type, class DType, class LUType>
class TPBiCG class PBiCICG
: :
public LduMatrix<Type, DType, LUType>::solver public LduMatrix<Type, DType, LUType>::solver
{ {
// Private Member Functions // Private Member Functions
//- Disallow default bitwise copy construct //- Disallow default bitwise copy construct
TPBiCG(const TPBiCG&); PBiCICG(const PBiCICG&);
//- Disallow default bitwise assignment //- Disallow default bitwise assignment
void operator=(const TPBiCG&); void operator=(const PBiCICG&);
public: public:
//- Runtime type information //- Runtime type information
TypeName("PBiCG"); TypeName("PBiCICG");
// Constructors // Constructors
//- Construct from matrix components and solver data dictionary //- Construct from matrix components and solver data dictionary
TPBiCG PBiCICG
( (
const word& fieldName, const word& fieldName,
const LduMatrix<Type, DType, LUType>& matrix, const LduMatrix<Type, DType, LUType>& matrix,
@ -80,7 +80,7 @@ public:
// Destructor // Destructor
virtual ~TPBiCG() virtual ~PBiCICG()
{} {}
@ -101,7 +101,7 @@ public:
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#ifdef NoRepository #ifdef NoRepository
# include "PBiCGScalarAlpha.C" # include "PBiCICG.C"
#endif #endif
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

View File

@ -23,12 +23,12 @@ License
\*---------------------------------------------------------------------------*/ \*---------------------------------------------------------------------------*/
#include "TPCG.H" #include "PCICG.H"
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
template<class Type, class DType, class LUType> template<class Type, class DType, class LUType>
Foam::TPCG<Type, DType, LUType>::TPCG Foam::PCICG<Type, DType, LUType>::PCICG
( (
const word& fieldName, const word& fieldName,
const LduMatrix<Type, DType, LUType>& matrix, const LduMatrix<Type, DType, LUType>& matrix,
@ -48,7 +48,7 @@ Foam::TPCG<Type, DType, LUType>::TPCG
template<class Type, class DType, class LUType> template<class Type, class DType, class LUType>
typename Foam::LduMatrix<Type, DType, LUType>::solverPerformance typename Foam::LduMatrix<Type, DType, LUType>::solverPerformance
Foam::TPCG<Type, DType, LUType>::solve(Field<Type>& psi) const Foam::PCICG<Type, DType, LUType>::solve(Field<Type>& psi) const
{ {
word preconditionerName(this->controlDict_.lookup("preconditioner")); word preconditionerName(this->controlDict_.lookup("preconditioner"));

View File

@ -22,19 +22,19 @@ License
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
Class Class
Foam::TPCG Foam::PCICG
Description Description
Preconditioned conjugate gradient solver for symmetric lduMatrices Preconditioned conjugate gradient solver for symmetric lduMatrices
using a run-time selectable preconditiioner. using a run-time selectable preconditiioner.
SourceFiles SourceFiles
TPCG.C PCICG.C
\*---------------------------------------------------------------------------*/ \*---------------------------------------------------------------------------*/
#ifndef TPCG_H #ifndef PCICG_H
#define TPCG_H #define PCICG_H
#include "LduMatrix.H" #include "LduMatrix.H"
@ -44,33 +44,33 @@ namespace Foam
{ {
/*---------------------------------------------------------------------------*\ /*---------------------------------------------------------------------------*\
Class TPCG Declaration Class PCICG Declaration
\*---------------------------------------------------------------------------*/ \*---------------------------------------------------------------------------*/
template<class Type, class DType, class LUType> template<class Type, class DType, class LUType>
class TPCG class PCICG
: :
public LduMatrix<Type, DType, LUType>::solver public LduMatrix<Type, DType, LUType>::solver
{ {
// Private Member Functions // Private Member Functions
//- Disallow default bitwise copy construct //- Disallow default bitwise copy construct
TPCG(const TPCG&); PCICG(const PCICG&);
//- Disallow default bitwise assignment //- Disallow default bitwise assignment
void operator=(const TPCG&); void operator=(const PCICG&);
public: public:
//- Runtime type information //- Runtime type information
TypeName("PCG"); TypeName("PCICG");
// Constructors // Constructors
//- Construct from matrix components and solver data dictionary //- Construct from matrix components and solver data dictionary
TPCG PCICG
( (
const word& fieldName, const word& fieldName,
const LduMatrix<Type, DType, LUType>& matrix, const LduMatrix<Type, DType, LUType>& matrix,
@ -80,7 +80,7 @@ public:
// Destructor // Destructor
virtual ~TPCG() virtual ~PCICG()
{} {}
@ -101,7 +101,7 @@ public:
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#ifdef NoRepository #ifdef NoRepository
# include "TPCG.C" # include "PCICG.C"
#endif #endif
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

View File

@ -23,9 +23,9 @@ License
\*---------------------------------------------------------------------------*/ \*---------------------------------------------------------------------------*/
#include "TPCG.H" #include "PCICG.H"
//#include "TPBiCG.H" #include "PBiCCCG.H"
#include "PBiCGScalarAlpha.H" #include "PBiCICG.H"
#include "SmoothSolver.H" #include "SmoothSolver.H"
#include "fieldTypes.H" #include "fieldTypes.H"
@ -35,11 +35,14 @@ License
makeLduSymSolver(DiagonalSolver, Type, DType, LUType); \ makeLduSymSolver(DiagonalSolver, Type, DType, LUType); \
makeLduAsymSolver(DiagonalSolver, Type, DType, LUType); \ makeLduAsymSolver(DiagonalSolver, Type, DType, LUType); \
\ \
makeLduSolver(TPCG, Type, DType, LUType); \ makeLduSolver(PCICG, Type, DType, LUType); \
makeLduSymSolver(TPCG, Type, DType, LUType); \ makeLduSymSolver(PCICG, Type, DType, LUType); \
\ \
makeLduSolver(TPBiCG, Type, DType, LUType); \ makeLduSolver(PBiCCCG, Type, DType, LUType); \
makeLduAsymSolver(TPBiCG, Type, DType, LUType); \ makeLduAsymSolver(PBiCCCG, Type, DType, LUType); \
\
makeLduSolver(PBiCICG, Type, DType, LUType); \
makeLduAsymSolver(PBiCICG, Type, DType, LUType); \
\ \
makeLduSolver(SmoothSolver, Type, DType, LUType); \ makeLduSolver(SmoothSolver, Type, DType, LUType); \
makeLduSymSolver(SmoothSolver, Type, DType, LUType); \ makeLduSymSolver(SmoothSolver, Type, DType, LUType); \
@ -47,7 +50,7 @@ License
namespace Foam namespace Foam
{ {
//makeLduSolvers(scalar, scalar, scalar); makeLduSolvers(scalar, scalar, scalar);
makeLduSolvers(vector, scalar, scalar); makeLduSolvers(vector, scalar, scalar);
makeLduSolvers(sphericalTensor, scalar, scalar); makeLduSolvers(sphericalTensor, scalar, scalar);
makeLduSolvers(symmTensor, scalar, scalar); makeLduSolvers(symmTensor, scalar, scalar);