Merge branch 'master' of ssh://git.code.sf.net/p/foam-extend/foam-extend-3.2
[foam-extend-3.2.git] / src / foam / primitives / VectorN / vector2 / tensor2I.H
blobf28fae527726709a27d1ab4f5c5a50229b324163
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 Type
25     tensor2
27 Description
28     TensorN of 2 scalars.
30 \*---------------------------------------------------------------------------*/
32 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
34 namespace Foam
37 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
39 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
41 //- Return tensor transpose
42 template<>
43 inline tensor2 tensor2::T() const
45     tensor2 transpose;
47     transpose[0] = this->operator[](0);
48     transpose[1] = this->operator[](2);
49     transpose[2] = this->operator[](1);
50     transpose[3] = this->operator[](3);
52     return transpose;
56 //- Assign to a sphericalTensor2
57 template<>
58 inline void tensor2::operator=(const sphericalTensor2& st)
60     this->v_[0] = st[0];
61     this->v_[1] = 0.0;
62     this->v_[2] = 0.0;
63     this->v_[3] = st[0];
67 //- Assign to a diagTensor2
68 template<>
69 inline void tensor2::operator=(const diagTensor2& dt)
71     this->v_[0] = dt[0];
72     this->v_[1] = 0.0;
73     this->v_[2] = 0.0;
74     this->v_[3] = dt[1];
77 // * * * * * * * * * * * * * * * Global Operators  * * * * * * * * * * * * * //
79 //- Inner-product between two tensors
80 inline tensor2
81 operator&(const tensor2& t1, const tensor2& t2)
83     tensor2 result;
85     result[0] = t1[0]*t2[0] + t1[1]*t2[2];
86     result[1] = t1[0]*t2[1] + t1[1]*t2[3];
87     result[2] = t1[2]*t2[0] + t1[3]*t2[2];
88     result[3] = t1[2]*t2[1] + t1[3]*t2[3];
90     return result;
94 //- Inner-product between a diagonal tensors and a tensor
95 inline tensor2
96 operator&(const diagTensor2& dt1, const tensor2& t2)
98     tensor2 result;
100     result[0] = dt1[0]*t2[0];
101     result[1] = dt1[0]*t2[1];
102     result[2] = dt1[1]*t2[2];
103     result[3] = dt1[1]*t2[3];
105     return result;
108 //- Inner-product between a tensor and diagonal tensor
109 inline tensor2
110 operator&(const tensor2& t1, const diagTensor2& dt2)
112     tensor2 result;
114     result[0] = t1[0]*dt2[0];
115     result[1] = t1[1]*dt2[1];
116     result[2] = t1[2]*dt2[0];
117     result[3] = t1[3]*dt2[1];
119     return result;
123 //- Inner-product between a spherical tensor and a tensor
124 inline tensor2
125 operator&(const sphericalTensor2& st1, const tensor2& t2)
127     tensor2 result;
129     result[0] = st1[0]*t2[0];
130     result[1] = st1[0]*t2[1];
131     result[2] = st1[0]*t2[2];
132     result[3] = st1[0]*t2[3];
134     return result;
137 //- Inner-product between a tensor and spherical tensor
138 inline tensor2
139 operator&(const tensor2& t1, const sphericalTensor2& st2)
141     tensor2 result;
143     result[0] = t1[0]*st2[0];
144     result[1] = t1[1]*st2[0];
145     result[2] = t1[2]*st2[0];
146     result[3] = t1[3]*st2[0];
148     return result;
152 //- Inner-product between a tensor and a vector
153 inline vector2
154 operator&(const tensor2& t, const vector2& v)
156     vector2 result;
158     result[0] = t[0]*v[0] + t[1]*v[1];
159     result[1] = t[2]*v[0] + t[3]*v[1];
161     return result;
165 //- Inner-product between a vector and a tensor
166 inline vector2
167 operator&(const vector2& v, const tensor2& t)
169     vector2 result;
171     result[0] = v[0]*t[0] + v[1]*t[2];
172     result[1] = v[0]*t[1] + v[1]*t[3];
174     return result;
178 //- Outer-product between two vectors
179 inline tensor2
180 operator*(const vector2& v1, const vector2& v2)
182     tensor2 result;
184     result[0] = v1[0]*v2[0];
185     result[1] = v1[0]*v2[1];
186     result[2] = v1[1]*v2[0];
187     result[3] = v1[1]*v2[1];
189     return result;
193 //- Return the determinant of a tensor
194 inline scalar det(const tensor2& t)
196     return
197     (
198         t[0]*t[3]-t[1]*t[2]
199     );
202 //- Return the inverse of a tensor given the determinant
203 inline tensor2 inv(const tensor2& t)
205     tensor2 cofactor;
207     cofactor[0] = t[3];
208     cofactor[1] = -t[1];
209     cofactor[2] = -t[2];
210     cofactor[3] = t[0];
212     return cofactor/det(t);
216 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
218 } // End namespace Foam
220 // ************************************************************************* //