BUGFIX: Seg-fault in multiphaseInterFoam. Author: Henrik Rusche. Merge: Hrvoje Jasak
[foam-extend-3.2.git] / src / lduSolvers / amg / fineAmgLevel.H
blobc93d4eefd5650451f75636d825f51ea509f30249
1 /*---------------------------------------------------------------------------*\
2   =========                 |
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 -------------------------------------------------------------------------------
8 License
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 Class
25     fineAmgLevel
27 Description
28     Fine AMG level refers to matrix, x and b data from the solver or
29     preconditioner
31 Author
32     Hrvoje Jasak, Wikki Ltd.  All rights reserved
34 SourceFiles
35     fineAmgLevel.C
37 \*---------------------------------------------------------------------------*/
39 #ifndef fineAmgLevel_H
40 #define fineAmgLevel_H
42 #include "amgLevel.H"
44 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
46 namespace Foam
49 /*---------------------------------------------------------------------------*\
50                         Class fineAmgLevel Declaration
51 \*---------------------------------------------------------------------------*/
53 class fineAmgLevel
55     public amgLevel
57     // Private data
59          //- Reference to matrix
60         const lduMatrix& matrix_;
62         //- Coupling coefficients, upper
63         const FieldField<Field, scalar>& coupleBouCoeffs_;
65         //- Coupling coefficients, lower
66         const FieldField<Field, scalar>& coupleIntCoeffs_;
68         //- Coupling interface fields
69         const lduInterfaceFieldPtrsList& interfaceFields_;
71         //- Dictionary
72         const dictionary& dict_;
74         //- AMG policy
75         autoPtr<amgPolicy> policyPtr_;
77         //- Smoother
78         autoPtr<lduSmoother> smootherPtr_;
81     // Private Member Functions
83         //- Disallow default bitwise copy construct
84         fineAmgLevel(const fineAmgLevel&);
86         //- Disallow default bitwise assignment
87         void operator=(const fineAmgLevel&);
90 public:
92         //- Construct from components
93         fineAmgLevel
94         (
95             const lduMatrix& matrix,
96             const FieldField<Field, scalar>& coupleBouCoeffs,
97             const FieldField<Field, scalar>& coupleIntCoeffs,
98             const lduInterfaceFieldPtrsList& interfacesFields,
99             const dictionary& dict,
100             const word& policyType,
101             const label groupSize,
102             const label minCoarseEqns,
103             const word& smootherType
104         );
107     // Destructor
109         virtual ~fineAmgLevel()
110         {}
113     // Member Functions
115         //- Return reference to dictionary
116         const dictionary& dict() const
117         {
118             return dict_;
119         }
121         //- Return reference to x
122         virtual scalarField& x();
124         //- Return reference to b
125         virtual scalarField& b();
127         //- Calculate residual
128         virtual void residual
129         (
130             const scalarField& x,
131             const scalarField& b,
132             const direction cmpt,
133             scalarField& res
134         ) const;
136         //- Restrict residual
137         virtual void restrictResidual
138         (
139             const scalarField& x,
140             const scalarField& b,
141             const direction cmpt,
142             scalarField& xBuffer,
143             scalarField& coarseRes,
144             bool preSweepsDone
145         ) const;
147         //- Prolongate correction
148         virtual void prolongateCorrection
149         (
150             scalarField& x,
151             const scalarField& coarseX
152         ) const;
154         //- Smooth level
155         virtual void smooth
156         (
157             scalarField& x,
158             const scalarField& b,
159             const direction cmpt,
160             const label nSweeps
161         ) const;
163         //- Solve level
164         virtual void solve
165         (
166             scalarField& x,
167             const scalarField& b,
168             const direction cmpt,
169             const scalar tolerance,
170             const scalar relTol
171         ) const;
173         //- Scale x
174         virtual void scaleX
175         (
176             scalarField& x,
177             const scalarField& b,
178             const direction cmpt,
179             scalarField& xBuffer
180         ) const;
182         //- Create next level from current level
183         virtual autoPtr<amgLevel> makeNextLevel() const;
187 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
189 } // End namespace Foam
191 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
193 #endif
195 // ************************************************************************* //