Merge branch 'master' of ssh://git.code.sf.net/p/foam-extend/foam-extend-3.2
[foam-extend-3.2.git] / src / foam / matrices / constraint / constraint.H
bloba555cdfe45c528317a50b21133f3bcb52a890cb9
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     constraint
27 Description
28     A storage mechanism which allows setting of the fixed value and
29     consequently recovering the equation for a single row of the matrix as
30     well as the source. The equation is taken out of the matrix using a
31     variant of compact matrix storage mechanism.
33 SourceFiles
34     constraint.C
36 \*---------------------------------------------------------------------------*/
38 #ifndef constraint_H
39 #define constraint_H
41 #include "labelList.H"
42 #include "scalarField.H"
44 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
46 namespace Foam
49 template<class Type>
50 class constraint;
52 template<class Type>
53 Ostream& operator<<(Ostream&, const constraint<Type>&);
56 /*---------------------------------------------------------------------------*\
57                         Class constraint Declaration
58 \*---------------------------------------------------------------------------*/
60 template<class Type>
61 class constraint
63     // Private data
65         //- Matrix row ID
66         label rowID_;
68         //- Fixed value
69         Type value_;
71         //- Fixed components (0-1) 1 = fixed, 0 = free
72         Type fixedComponents_;
74         //- Are matrix coefficients set?
75         bool matrixCoeffsSet_;
77         //- Diagonal coefficient
78         scalar diagCoeff_;
80         //- Source
81         Type source_;
83         //- Upper coefficients
84         scalarField* upperCoeffsOwnerPtr_;
86         scalarField* upperCoeffsNeighbourPtr_;
88         //- Lower coefficients
89         scalarField* lowerCoeffsOwnerPtr_;
91         scalarField* lowerCoeffsNeighbourPtr_;
93     // Private Member Functions
95         //- Return scalar component of value. Used to simplify templating
96         scalar componentOfValue(const Type&, const direction) const;
99 public:
102     // Constructors
104         //- Construct from components
105         constraint
106         (
107             const label row,
108             const Type value,
109             const Type& fixedCmpts = pTraits<Type>::one
110         );
112         //- Construct from matrix and other components
113         template<template<class> class Matrix>
114         constraint
115         (
116             const Matrix<Type>&,
117             const label row,
118             const Type value,
119             const Type& fixedCmpts = pTraits<Type>::one
120         );
122         //- Construct as copy
123         constraint(const constraint&);
125         //- Construct from Istream
126         constraint(Istream&);
129     // Destructor
131         ~constraint();
134     // Member Functions
136         //- Return matrix row ID
137         label rowID() const
138         {
139             return rowID_;
140         }
142         //- Return fixed value
143         Type value() const
144         {
145             return value_;
146         }
148         //- Return map of fixed components
149         const Type& fixedComponents() const
150         {
151             return fixedComponents_;
152         }
154         //- Return diagonal coefficient
155         scalar diagCoeff() const;
157         //- Return source
158         Type source() const;
160         //- Return off-diagonal coefficients
161         const scalarField& upperCoeffsOwner() const;
163         const scalarField& upperCoeffsNeighbour() const;
165         const scalarField& lowerCoeffsOwner() const;
167         const scalarField& lowerCoeffsNeighbour() const;
169         //- Combine with existing equation
170         void combine(const constraint&);
172         //- Set matrix coefficients
173         template<template<class> class Matrix>
174         void setMatrix(const Matrix<Type>&);
177         //- Eliminate equation
178         template<template<class> class Matrix>
179         static void eliminateEquation(Matrix<Type>&, const label, const Type&);
181         //- Eliminate equation
182         template<template<class> class Matrix>
183         void eliminateEquation(Matrix<Type>&) const;
185         //- Eliminate component equation with given direction and
186         //  component source
187         template<template<class> class Matrix>
188         void eliminateEquation
189         (
190             Matrix<Type>&,
191             const direction,
192             scalarField&
193         ) const;
196         //- Set source in eliminated equation
197         template<template<class> class Matrix>
198         static void setSource(Matrix<Type>&, const label, const Type&);
200         //- Set source in eliminated equation
201         template<template<class> class Matrix>
202         void setSource(Matrix<Type>&) const;
204         //- Set source and diagonal in eliminated equation
205         template<template<class> class Matrix>
206         void setSourceDiag
207         (
208             Matrix<Type>&,
209             const direction,
210             scalarField& psiCmpt,
211             scalarField& sourceCmpt
212         ) const;
215         //- Reconstruct matrix coefficients
216         template<template<class> class Matrix>
217         void reconstructMatrix(Matrix<Type>&) const;
219         //- Clear matrix coefficients
220         void clearMatrix();
223     // Member Operators
225         void operator=(const constraint<Type>&);
228     // Ostream Operator
230         friend Ostream& operator<< <Type>
231         (
232             Ostream&,
233             const constraint<Type>&
234         );
238 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
240 } // End namespace Foam
242 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
244 #ifdef NoRepository
245 #    include "constraint.C"
246 #    include "constraintTools.C"
247 #endif
249 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
251 #include "scalarConstraint.H"
253 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
255 #endif
257 // ************************************************************************* //