BUGFIX: Seg-fault in multiphaseInterFoam. Author: Henrik Rusche. Merge: Hrvoje Jasak
[foam-extend-3.2.git] / src / lduSolvers / amg / amgPolicy / amgPolicy.H
blob679aaab5930a4a8b9d59d466b1fcf5a3d2dfe5b1
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     amgPolicy
27 Description
28     Virtual base class for AMG coarsening policy
30 Author
31     Hrvoje Jasak, Wikki Ltd.  All rights reserved
33 SourceFiles
34     amgPolicy.C
36 \*---------------------------------------------------------------------------*/
38 #ifndef amgPolicy_H
39 #define amgPolicy_H
41 #include "runTimeSelectionTables.H"
42 #include "primitiveFieldsFwd.H"
43 #include "FieldFields.H"
44 #include "lduInterfaceFieldPtrsList.H"
46 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
48 namespace Foam
51 class lduMatrix;
52 class amgMatrix;
54 /*---------------------------------------------------------------------------*\
55                            Class amgPolicy Declaration
56 \*---------------------------------------------------------------------------*/
58 class amgPolicy
60     // Private Data
62         //- Group size
63         label groupSize_;
65         //- Minimum number of coarse level equations
66         label minCoarseEqns_;
69     // Private Member Functions
71         //- Disallow default bitwise copy construct
72         amgPolicy(const amgPolicy&);
74         //- Disallow default bitwise assignment
75         void operator=(const amgPolicy&);
78 public:
80         //- Runtime type information
81         virtual const word& type() const = 0;
84         // Declare run-time constructor selection tables
86             declareRunTimeSelectionTable
87             (
88                 autoPtr,
89                 amgPolicy,
90                 matrix,
91                 (
92                     const lduMatrix& matrix,
93                     const label groupSize,
94                     const label minCoarseEqns
95                 ),
96                 (matrix, groupSize, minCoarseEqns)
97             );
100     // Selectors
102         //- Select given name, group size and matrix
103         static autoPtr<amgPolicy> New
104         (
105             const word& policyType,
106             const lduMatrix& matrix,
107             const label groupSize,
108             const label minCoarseEqns
109         );
112     // Constructors
114         //- Construct from components
115         amgPolicy
116         (
117             const label groupSize,
118             const label minCoarseEqns
119         )
120         :
121             groupSize_(groupSize),
122             minCoarseEqns_(minCoarseEqns)
123         {}
126     // Destructor
128         virtual ~amgPolicy()
129         {}
132     // Member Functions
134         //- Return group size
135         label groupSize() const
136         {
137             return groupSize_;
138         }
140         //- Return minimum number of coarse level equations
141         label minCoarseEqns() const
142         {
143             return minCoarseEqns_;
144         }
146         //- Can a coarse level be constructed?
147         virtual bool coarsen() const = 0;
149         //- Restrict matrix
150         virtual autoPtr<amgMatrix> restrictMatrix
151         (
152             const FieldField<Field, scalar>& bouCoeffs,
153             const FieldField<Field, scalar>& intCoeffs,
154             const lduInterfaceFieldPtrsList& interfaces
155         ) const = 0;
157         //- Restrict residual
158         virtual void restrictResidual
159         (
160             const scalarField& res,
161             scalarField& coarseRes
162         ) const = 0;
164         //- Prolongate correction
165         virtual void prolongateCorrection
166         (
167             scalarField& x,
168             const scalarField& coarseX
169         ) const = 0;
173 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
175 } // End namespace Foam
177 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
179 #endif
181 // ************************************************************************* //