initial commit for version 1.6.x patch release
[OpenFOAM-1.6.x.git] / src / OpenFOAM / matrices / lduMatrix / preconditioners / GAMGPreconditioner / GAMGPreconditioner.C
blobd185242e49982c50d27047b8e13f8e4c9675d3e4
1 /*---------------------------------------------------------------------------*\
2   =========                 |
3   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
4    \\    /   O peration     |
5     \\  /    A nd           | Copyright (C) 1991-2009 OpenCFD Ltd.
6      \\/     M anipulation  |
7 -------------------------------------------------------------------------------
8 License
9     This file is part of OpenFOAM.
11     OpenFOAM is free software; you can redistribute it and/or modify it
12     under the terms of the GNU General Public License as published by the
13     Free Software Foundation; either version 2 of the License, or (at your
14     option) any later version.
16     OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
17     ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
18     FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
19     for more details.
21     You should have received a copy of the GNU General Public License
22     along with OpenFOAM; if not, write to the Free Software Foundation,
23     Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
25 \*---------------------------------------------------------------------------*/
27 #include "GAMGPreconditioner.H"
29 // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
31 namespace Foam
33     defineTypeNameAndDebug(GAMGPreconditioner, 0);
35     lduMatrix::preconditioner::addsymMatrixConstructorToTable
36     <GAMGPreconditioner> addGAMGPreconditionerSymMatrixConstructorToTable_;
38     lduMatrix::preconditioner::addasymMatrixConstructorToTable
39     <GAMGPreconditioner> addGAMGPreconditionerAsymMatrixConstructorToTable_;
43 // * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
45 Foam::GAMGPreconditioner::GAMGPreconditioner
47     const lduMatrix::solver& sol,
48     const dictionary& solverControls
51     GAMGSolver
52     (
53         sol.fieldName(),
54         sol.matrix(),
55         sol.interfaceBouCoeffs(),
56         sol.interfaceIntCoeffs(),
57         sol.interfaces(),
58         solverControls
59     ),
60     lduMatrix::preconditioner(sol),
61     nVcycles_(2)
63     readControls();
67 // * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
69 Foam::GAMGPreconditioner::~GAMGPreconditioner()
73 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
75 void Foam::GAMGPreconditioner::readControls()
77     GAMGSolver::readControls();
78     nVcycles_ = controlDict_.lookupOrDefault<label>("nVcycles", 2);
82 void Foam::GAMGPreconditioner::precondition
84     scalarField& wA,
85     const scalarField& rA,
86     const direction cmpt
87 ) const
89     wA = 0.0;
90     scalarField AwA(wA.size());
91     scalarField finestCorrection(wA.size());
92     scalarField finestResidual(rA);
94     // Create coarse grid correction fields
95     PtrList<scalarField> coarseCorrFields;
97     // Create coarse grid sources
98     PtrList<scalarField> coarseSources;
100     // Create the smoothers for all levels
101     PtrList<lduMatrix::smoother> smoothers;
103     // Initialise the above data structures
104     initVcycle(coarseCorrFields, coarseSources, smoothers);
106     for (label cycle=0; cycle<nVcycles_; cycle++)
107     {
108         Vcycle
109         (
110             smoothers,
111             wA,
112             rA,
113             AwA,
114             finestCorrection,
115             finestResidual,
116             coarseCorrFields,
117             coarseSources,
118             cmpt
119         );
121         if (cycle < nVcycles_-1)
122         {
123             // Calculate finest level residual field
124             matrix_.Amul(AwA, wA, interfaceBouCoeffs_, interfaces_, cmpt);
125             finestResidual = rA;
126             finestResidual -= AwA;
127         }
128     }
132 // ************************************************************************* //