BUGFIX: Seg-fault in multiphaseInterFoam. Author: Henrik Rusche. Merge: Hrvoje Jasak
[foam-extend-3.2.git] / src / lduSolvers / amg / amgMatrix.H
blob90fa4002f9c1f173b5039e6f72fd5326972b9b48
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     amgMatrix
27 Description
28     Matrix wrapper class containing ldu addressing, matrix, coupling interfaces
29     coupling interface fields and coupling coefficients
31 Author
32     Hrvoje Jasak, Wikki Ltd.  All rights reserved
34 SourceFiles
35     amgMatrixI.H
36     amgMatrix.C
37     amgMatrixIO.C
39 \*---------------------------------------------------------------------------*/
41 #ifndef amgMatrix_H
42 #define amgMatrix_H
44 #include "lduPrimitiveMesh.H"
45 #include "demandDrivenData.H"
47 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
49 namespace Foam
52 /*---------------------------------------------------------------------------*\
53                          Class amgMatrix Declaration
54 \*---------------------------------------------------------------------------*/
56 class amgMatrix
58     // Private data
60         //- Matrix addressing object
61         lduPrimitiveMesh* addrPtr_;
63         //- Coupling interfaces fields
64         lduInterfacePtrsList* interfacesPtr_;
66          //- LDU matrix
67         lduMatrix* matrixPtr_;
69         //- Coupling interface fields
70         lduInterfaceFieldPtrsList* interfaceFieldsPtr_;
72         //- Coupling coefficients, upper
73         FieldField<Field, scalar>* coupleBouCoeffsPtr_;
75         //- Coupling coefficients, lower
76         FieldField<Field, scalar>* coupleIntCoeffsPtr_;
79     // Private Member Functions
81         //- Disallow default bitwise copy construct
82         amgMatrix(const amgMatrix&);
84         //- Disallow default bitwise assignment
85         void operator=(const amgMatrix&);
88 public:
90     // Static data members
93     // Constructors
95         //- Construct from components
96         amgMatrix
97         (
98             lduPrimitiveMesh* addrPtr,
99             lduInterfacePtrsList* interfacesPtr,
100             lduMatrix* matrixPtr,
101             FieldField<Field, scalar>* coupleBouCoeffsPtr,
102             FieldField<Field, scalar>* coupleIntCoeffsPtr,
103             lduInterfaceFieldPtrsList* interfaceFieldsPtr
104         )
105         :
106             addrPtr_(addrPtr),
107             interfacesPtr_(interfacesPtr),
108             matrixPtr_(matrixPtr),
109             interfaceFieldsPtr_(interfaceFieldsPtr),
110             coupleBouCoeffsPtr_(coupleBouCoeffsPtr),
111             coupleIntCoeffsPtr_(coupleIntCoeffsPtr)
112         {}
115     // Destructor
117         ~amgMatrix()
118         {
119             deleteDemandDrivenData(addrPtr_);
121             // Clear the interface storage by hand.  It is a list of ptrs
122             // not a PtrList for consistency of the interface
123             if (interfacesPtr_)
124             {
125                 lduInterfacePtrsList& curLevel = *interfacesPtr_;
127                 forAll (curLevel, i)
128                 {
129                     if (curLevel.set(i))
130                     {
131                         delete curLevel(i);
132                     }
133                 }
134             }
136             deleteDemandDrivenData(interfacesPtr_);
138             deleteDemandDrivenData(matrixPtr_);
140             // Clear the interface field storage by hand.  It is a list of ptrs
141             // not a PtrList for consistency of the interface
142             if (interfaceFieldsPtr_)
143             {
144                 lduInterfaceFieldPtrsList& curLevelField = *interfaceFieldsPtr_;
146                 forAll (curLevelField, i)
147                 {
148                     if (curLevelField.set(i))
149                     {
150                         delete curLevelField(i);
151                     }
152                 }
153             }
155             deleteDemandDrivenData(interfaceFieldsPtr_);
156             deleteDemandDrivenData(coupleBouCoeffsPtr_);
157             deleteDemandDrivenData(coupleIntCoeffsPtr_);
158         }
161     // Member Functions
163         //- Return size
164         label size() const
165         {
166             return addrPtr_->size();
167         }
169         //- Return matrix
170         const lduMatrix& matrix() const
171         {
172             return *matrixPtr_;
173         }
175         //- Return coupling interfaces
176         const lduInterfacePtrsList& interfaces() const
177         {
178             return *interfacesPtr_;
179         }
181         //- Return coupling interfaceFields
182         const lduInterfaceFieldPtrsList& interfaceFields() const
183         {
184             return *interfaceFieldsPtr_;
185         }
187         //- Return boundary coefficients
188         const FieldField<Field, scalar>& coupleBouCoeffs() const
189         {
190             return *coupleBouCoeffsPtr_;
191         }
193         //- Return internal coefficients
194         const FieldField<Field, scalar>& coupleIntCoeffs() const
195         {
196             return *coupleIntCoeffsPtr_;
197         }
201 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
203 } // End namespace Foam
205 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
207 #endif
209 // ************************************************************************* //