Merge remote-tracking branch 'origin/nr/multiSolverFix' into nextRelease
[foam-extend-3.2.git] / src / lduSolvers / amg / amgMatrix.H
blob4b09c5a17b2eadc221b1f4d1c66d28c09672f23d
1 /*---------------------------------------------------------------------------*\
2   =========                 |
3   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
4    \\    /   O peration     |
5     \\  /    A nd           | Copyright (C) 2004-6 H. Jasak All rights reserved
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 Class
26     amgMatrix
28 Description
29     Matrix wrapper class containing ldu addressing, matrix, coupling interfaces
30     coupling interface fields and coupling coefficients
32 Author
33     Hrvoje Jasak, Wikki Ltd.  All rights reserved
35 SourceFiles
36     amgMatrixI.H
37     amgMatrix.C
38     amgMatrixIO.C
40 \*---------------------------------------------------------------------------*/
42 #ifndef amgMatrix_H
43 #define amgMatrix_H
45 #include "lduPrimitiveMesh.H"
46 #include "demandDrivenData.H"
48 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
50 namespace Foam
53 /*---------------------------------------------------------------------------*\
54                          Class amgMatrix Declaration
55 \*---------------------------------------------------------------------------*/
57 class amgMatrix
59     // Private data
61         //- Matrix addressing object
62         lduPrimitiveMesh* addrPtr_;
64         //- Coupling interfaces fields
65         lduInterfacePtrsList* interfacesPtr_;
67          //- LDU matrix
68         lduMatrix* matrixPtr_;
70         //- Coupling interface fields
71         lduInterfaceFieldPtrsList* interfaceFieldsPtr_;
73         //- Coupling coefficients, upper
74         FieldField<Field, scalar>* coupleBouCoeffsPtr_;
76         //- Coupling coefficients, lower
77         FieldField<Field, scalar>* coupleIntCoeffsPtr_;
80     // Private Member Functions
82         //- Disallow default bitwise copy construct
83         amgMatrix(const amgMatrix&);
85         //- Disallow default bitwise assignment
86         void operator=(const amgMatrix&);
89 public:
91     // Static data members
94     // Constructors
96         //- Construct from components
97         amgMatrix
98         (
99             lduPrimitiveMesh* addrPtr,
100             lduInterfacePtrsList* interfacesPtr,
101             lduMatrix* matrixPtr,
102             FieldField<Field, scalar>* coupleBouCoeffsPtr,
103             FieldField<Field, scalar>* coupleIntCoeffsPtr,
104             lduInterfaceFieldPtrsList* interfaceFieldsPtr
105         )
106         :
107             addrPtr_(addrPtr),
108             interfacesPtr_(interfacesPtr),
109             matrixPtr_(matrixPtr),
110             interfaceFieldsPtr_(interfaceFieldsPtr),
111             coupleBouCoeffsPtr_(coupleBouCoeffsPtr),
112             coupleIntCoeffsPtr_(coupleIntCoeffsPtr)
113         {}
116     // Destructor
118         ~amgMatrix()
119         {
120             deleteDemandDrivenData(addrPtr_);
122             // Clear the interface storage by hand.  It is a list of ptrs
123             // not a PtrList for consistency of the interface
124             if (interfacesPtr_)
125             {
126                 lduInterfacePtrsList& curLevel = *interfacesPtr_;
128                 forAll (curLevel, i)
129                 {
130                     if (curLevel.set(i))
131                     {
132                         delete curLevel(i);
133                     }
134                 }
135             }
137             deleteDemandDrivenData(interfacesPtr_);
139             deleteDemandDrivenData(matrixPtr_);
141             // Clear the interface field storage by hand.  It is a list of ptrs
142             // not a PtrList for consistency of the interface
143             if (interfaceFieldsPtr_)
144             {
145                 lduInterfaceFieldPtrsList& curLevelField = *interfaceFieldsPtr_;
147                 forAll (curLevelField, i)
148                 {
149                     if (curLevelField.set(i))
150                     {
151                         delete curLevelField(i);
152                     }
153                 }
154             }
156             deleteDemandDrivenData(interfaceFieldsPtr_);
157             deleteDemandDrivenData(coupleBouCoeffsPtr_);
158             deleteDemandDrivenData(coupleIntCoeffsPtr_);
159         }
162     // Member Functions
164         //- Return size
165         label size() const
166         {
167             return addrPtr_->size();
168         }
170         //- Return matrix
171         const lduMatrix& matrix() const
172         {
173             return *matrixPtr_;
174         }
176         //- Return coupling interfaces
177         const lduInterfacePtrsList& interfaces() const
178         {
179             return *interfacesPtr_;
180         }
182         //- Return coupling interfaceFields
183         const lduInterfaceFieldPtrsList& interfaceFields() const
184         {
185             return *interfaceFieldsPtr_;
186         }
188         //- Return boundary coefficients
189         const FieldField<Field, scalar>& coupleBouCoeffs() const
190         {
191             return *coupleBouCoeffsPtr_;
192         }
194         //- Return internal coefficients
195         const FieldField<Field, scalar>& coupleIntCoeffs() const
196         {
197             return *coupleIntCoeffsPtr_;
198         }
202 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
204 } // End namespace Foam
206 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
208 #endif
210 // ************************************************************************* //