1 /*---------------------------------------------------------------------------*\
3 \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
5 \\ / A nd | Copyright (C) 1991-2009 OpenCFD Ltd.
7 -------------------------------------------------------------------------------
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
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 * * * * * * * * * * * * * //
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
55 sol.interfaceBouCoeffs(),
56 sol.interfaceIntCoeffs(),
60 lduMatrix::preconditioner(sol),
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
85 const scalarField& rA,
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++)
121 if (cycle < nVcycles_-1)
123 // Calculate finest level residual field
124 matrix_.Amul(AwA, wA, interfaceBouCoeffs_, interfaces_, cmpt);
126 finestResidual -= AwA;
132 // ************************************************************************* //