From: guido Date: Mon, 6 Jan 2003 14:55:47 +0000 (+0000) Subject: unifying preconditioners X-Git-Url: https://gitweb.dealii.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d878d48dfca241bf9654aca7f7398356358978bd;p=dealii-svn.git unifying preconditioners git-svn-id: https://svn.dealii.org/trunk@6868 0785d39b-7218-0410-832d-ea1e28bc413d --- diff --git a/deal.II/lac/include/lac/precondition.h b/deal.II/lac/include/lac/precondition.h index a8cc49fe60..62e6652285 100644 --- a/deal.II/lac/include/lac/precondition.h +++ b/deal.II/lac/include/lac/precondition.h @@ -2,7 +2,7 @@ // $Id$ // Version: $Name$ // -// Copyright (C) 1998, 1999, 2000, 2001, 2002 by the deal.II authors +// Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 by the deal.II authors // // This file is subject to QPL and may not be distributed // without copyright and license information. Please refer @@ -167,6 +167,23 @@ template > class PreconditionRelaxation : public Subscriptor { public: + /** + * Class for parameters. + */ + class AdditionalData + { + public: + /** + * Constructor. + */ + AdditionalData (const double relaxation = 1.); + + /** + * Relaxation parameter. + */ + double relaxation; + }; + /** * Initialize matrix and * relaxation parameter. The @@ -177,7 +194,8 @@ class PreconditionRelaxation : public Subscriptor * than 2 for numerical * reasons. It defaults to 1. */ - void initialize (const MATRIX& A, const double omega = 1.); + void initialize (const MATRIX& A, + AdditionalData parameters = AdditionalData()); protected: /** @@ -188,7 +206,7 @@ class PreconditionRelaxation : public Subscriptor /** * Relaxation parameter. */ - double omega; + double relaxation; }; @@ -531,10 +549,10 @@ PreconditionIdentity::Tvmult_add (VECTOR& dst, const VECTOR& src) const template inline void PreconditionRelaxation::initialize (const MATRIX &rA, - const double o) + AdditionalData parameters) { A = &rA; - omega = o; + relaxation = parameters.relaxation; } //----------------------------------------------------------------------// @@ -545,7 +563,7 @@ inline void PreconditionJacobi::vmult (VECTOR& dst, const VECTOR& src) const { Assert (this->A!=0, ExcNotInitialized()); - this->A->precondition_Jacobi (dst, src, this->omega); + this->A->precondition_Jacobi (dst, src, this->relaxation); } @@ -556,7 +574,7 @@ inline void PreconditionJacobi::Tvmult (VECTOR& dst, const VECTOR& src) const { Assert (this->A!=0, ExcNotInitialized()); - this->A->precondition_Jacobi (dst, src, this->omega); + this->A->precondition_Jacobi (dst, src, this->relaxation); } @@ -568,7 +586,7 @@ inline void PreconditionSOR::vmult (VECTOR& dst, const VECTOR& src) const { Assert (this->A!=0, ExcNotInitialized()); - this->A->precondition_SOR (dst, src, this->omega); + this->A->precondition_SOR (dst, src, this->relaxation); } @@ -579,7 +597,7 @@ inline void PreconditionSOR::Tvmult (VECTOR& dst, const VECTOR& src) const { Assert (this->A!=0, ExcNotInitialized()); - this->A->precondition_TSOR (dst, src, this->omega); + this->A->precondition_TSOR (dst, src, this->relaxation); } @@ -591,7 +609,7 @@ inline void PreconditionSSOR::vmult (VECTOR& dst, const VECTOR& src) const { Assert (this->A!=0, ExcNotInitialized()); - this->A->precondition_SSOR (dst, src, this->omega); + this->A->precondition_SSOR (dst, src, this->relaxation); } @@ -602,7 +620,7 @@ inline void PreconditionSSOR::Tvmult (VECTOR& dst, const VECTOR& src) const { Assert (this->A!=0, ExcNotInitialized()); - this->A->precondition_SSOR (dst, src, this->omega); + this->A->precondition_SSOR (dst, src, this->relaxation); } @@ -626,6 +644,18 @@ PreconditionUseMatrix::vmult (VECTOR& dst, (matrix.*precondition)(dst, src); } +//----------------------------------------------------------------------// + +template +inline +PreconditionRelaxation::AdditionalData:: +AdditionalData (const double relaxation) + : + relaxation (relaxation) +{} + + + ////////////////////////////////////////////////////////////////////// template diff --git a/deal.II/lac/include/lac/precondition_block.h b/deal.II/lac/include/lac/precondition_block.h index 37dab620a8..4d2f8d2ffc 100644 --- a/deal.II/lac/include/lac/precondition_block.h +++ b/deal.II/lac/include/lac/precondition_block.h @@ -85,6 +85,33 @@ class PreconditionBlock : public virtual Subscriptor typedef typename MATRIX::value_type number; public: + /** + * Parameters for block preconditioners. + */ + class AdditionalData + { + public: + /** + * Constructor. Block size + * must be given since there + * is no reasonable default + * parameter. + */ + AdditionalData (const unsigned int block_size, + const double relaxation = 1.); + + /** + * Relaxation parameter. + */ + double relaxation; + + /** + * Block size. + */ + unsigned int block_size; + }; + + /** * Constructor. */ @@ -108,9 +135,7 @@ class PreconditionBlock : public virtual Subscriptor * parameter for derived classes * may be provided. */ - void initialize (const MATRIX& A, - const unsigned int block_size, - const double relaxation = 1.); + void initialize (const MATRIX& A, AdditionalData parameters); /** * Deletes the inverse diagonal @@ -556,6 +581,17 @@ class PreconditionBlockSSOR : public virtual Subscriptor, //----------------------------------------------------------------------// +template +inline +PreconditionBlock::AdditionalData:: +AdditionalData (const unsigned int block_size, + const double relaxation) + : + relaxation (relaxation), + block_size(block_size) +{} + + template inline bool PreconditionBlock::empty () const diff --git a/deal.II/lac/include/lac/precondition_block.templates.h b/deal.II/lac/include/lac/precondition_block.templates.h index bac456a051..790cc4f2ff 100644 --- a/deal.II/lac/include/lac/precondition_block.templates.h +++ b/deal.II/lac/include/lac/precondition_block.templates.h @@ -2,7 +2,7 @@ // $Id$ // Version: $Name$ // -// Copyright (C) 1998, 1999, 2000, 2001, 2002 by the deal.II authors +// Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 by the deal.II authors // // This file is subject to QPL and may not be distributed // without copyright and license information. Please refer @@ -57,17 +57,19 @@ void PreconditionBlock::clear () template -void PreconditionBlock::initialize (const MATRIX &M, - const unsigned int bsize, - const double relax) +void PreconditionBlock::initialize ( + const MATRIX &M, + AdditionalData parameters) { + const unsigned int bsize = parameters.block_size; + clear(); Assert (M.m() == M.n(), ExcMatrixNotSquare()); A = &M; Assert (bsize>0, ExcIndexRange(bsize, 1, M.m())); Assert (A->m()%bsize==0, ExcWrongBlockSize(bsize, A->m())); blocksize=bsize; - relaxation = relax; + relaxation = parameters.relaxation; }