1 /*---------------------------------------------------------------------------*\
3 \\ / F ield | foam-extend: Open Source CFD
4 \\ / O peration | Version: 3.2
5 \\ / A nd | Web: http://www.foam-extend.org
6 \\/ M anipulation | For copyright notice see file Copyright
7 -------------------------------------------------------------------------------
9 This file is part of foam-extend.
11 foam-extend 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 3 of the License, or (at your
14 option) any later version.
16 foam-extend is distributed in the hope that it will be useful, but
17 WITHOUT ANY WARRANTY; without even the implied warranty of
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 General Public License for more details.
21 You should have received a copy of the GNU General Public License
22 along with foam-extend. If not, see <http://www.gnu.org/licenses/>.
24 \*---------------------------------------------------------------------------*/
26 #include "GAMGPreconditioner.H"
28 // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
32 defineTypeNameAndDebug(GAMGPreconditioner, 0);
34 lduPreconditioner::addsymMatrixConstructorToTable
35 <GAMGPreconditioner> addGAMGPreconditionerSymMatrixConstructorToTable_;
37 lduPreconditioner::addasymMatrixConstructorToTable
38 <GAMGPreconditioner> addGAMGPreconditionerAsymMatrixConstructorToTable_;
42 // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
44 Foam::GAMGPreconditioner::GAMGPreconditioner
46 const lduMatrix& matrix,
47 const FieldField<Field, scalar>& coupleBouCoeffs,
48 const FieldField<Field, scalar>& coupleIntCoeffs,
49 const lduInterfaceFieldPtrsList& interfaces,
50 const dictionary& dict
75 // * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
77 Foam::GAMGPreconditioner::~GAMGPreconditioner()
81 // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
83 void Foam::GAMGPreconditioner::readControls()
86 nVcycles_ = GAMG_.dict().lookupOrDefault<label>("nVcycles", 2);
90 void Foam::GAMGPreconditioner::precondition
93 const scalarField& rA,
98 scalarField AwA(wA.size());
99 scalarField finestCorrection(wA.size());
100 scalarField finestResidual(rA);
102 // Create coarse grid correction fields
103 PtrList<scalarField> coarseCorrX;
105 // Create coarse grid sources
106 PtrList<scalarField> coarseB;
108 // Create the smoothers for all levels
109 PtrList<lduSmoother> smoothers;
111 // Initialise the above data structures
112 GAMG_.initVcycle(coarseCorrX, coarseB, smoothers);
114 for (label cycle=0; cycle<nVcycles_; cycle++)
129 if (cycle < nVcycles_ - 1)
131 // Calculate finest level residual field
132 matrix_.Amul(AwA, wA, coupleBouCoeffs_, interfaces_, cmpt);
134 finestResidual -= AwA;
140 // ************************************************************************* //