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 / vector4 / tensor4I.H
blob2b51158b5bef2f951311aa7bd4797002bad343df
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     tensor4
27 Description
28     TensorN of 4 scalars.
30 \*---------------------------------------------------------------------------*/
32 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
34 namespace Foam
37 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
39 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
42 //- Return the determinant of a tensor
43 inline scalar det(const tensor4& t)
45     return
46     (
47         t[3]*t[6]*t[9]*t[12]  - t[2]*t[7]*t[9]*t[12]  - t[3]*t[5]*t[10]*t[12] + t[1]*t[7]*t[10]*t[12] +
48         t[2]*t[5]*t[11]*t[12] - t[1]*t[6]*t[11]*t[12] - t[3]*t[6]*t[8]*t[13]  + t[2]*t[7]*t[8]*t[13]  +
49         t[3]*t[4]*t[10]*t[13] - t[0]*t[7]*t[10]*t[13] - t[2]*t[4]*t[11]*t[13] + t[0]*t[6]*t[11]*t[13] +
50         t[3]*t[5]*t[8]*t[14]  - t[1]*t[7]*t[8]*t[14]  - t[3]*t[4]*t[9]*t[14]  + t[0]*t[7]*t[9]*t[14]  +
51         t[1]*t[4]*t[11]*t[14] - t[0]*t[5]*t[11]*t[14] - t[2]*t[5]*t[8]*t[15]  + t[1]*t[6]*t[8]*t[15]  +
52         t[2]*t[4]*t[9]*t[15]  - t[0]*t[6]*t[9]*t[15]  - t[1]*t[4]*t[10]*t[15] + t[0]*t[5]*t[10]*t[15]
53     );
57 //- Return the inverse of a tensor given the determinant
58 inline tensor4 inv(const tensor4& t)
60     tensor4 cofactor;
62     cofactor[0] =   t[6]*t[11]*t[13] - t[7]*t[10]*t[13] + t[7]*t[9]*t[14]
63                   - t[5]*t[11]*t[14] - t[6]*t[9]*t[15]  + t[5]*t[10]*t[15];
64     cofactor[1] =   t[3]*t[10]*t[13] - t[2]*t[11]*t[13] - t[3]*t[9]*t[14]
65                   + t[1]*t[11]*t[14] + t[2]*t[9]*t[15]  - t[1]*t[10]*t[15];
66     cofactor[2] =   t[2]*t[7]*t[13]  - t[3]*t[6]*t[13]  + t[3]*t[5]*t[14]
67                   - t[1]*t[7]*t[14]  - t[2]*t[5]*t[15]  + t[1]*t[6]*t[15];
68     cofactor[3] =   t[3]*t[6]*t[9]   - t[2]*t[7]*t[9]   - t[3]*t[5]*t[10]
69                   + t[1]*t[7]*t[10]  + t[2]*t[5]*t[11]  - t[1]*t[6]*t[11];
70     cofactor[4] =   t[7]*t[10]*t[12] - t[6]*t[11]*t[12] - t[7]*t[8]*t[14]
71                   + t[4]*t[11]*t[14] + t[6]*t[8]*t[15]  - t[4]*t[10]*t[15];
72     cofactor[5] =   t[2]*t[11]*t[12] - t[3]*t[10]*t[12] + t[3]*t[8]*t[14]
73                   - t[0]*t[11]*t[14] - t[2]*t[8]*t[15]  + t[0]*t[10]*t[15];
74     cofactor[6] =   t[3]*t[6]*t[12]  - t[2]*t[7]*t[12]  - t[3]*t[4]*t[14]
75                   + t[0]*t[7]*t[14]  + t[2]*t[4]*t[15]  - t[0]*t[6]*t[15];
76     cofactor[7] =   t[2]*t[7]*t[8]   - t[3]*t[6]*t[8]   + t[3]*t[4]*t[10]
77                   - t[0]*t[7]*t[10]  - t[2]*t[4]*t[11]  + t[0]*t[6]*t[11];
78     cofactor[8] =   t[5]*t[11]*t[12] - t[7]*t[9]*t[12]  + t[7]*t[8]*t[13]
79                   - t[4]*t[11]*t[13] - t[5]*t[8]*t[15]  + t[4]*t[9]*t[15];
80     cofactor[9] =   t[3]*t[9]*t[12]  - t[1]*t[11]*t[12] - t[3]*t[8]*t[13]
81                   + t[0]*t[11]*t[13] + t[1]*t[8]*t[15]  - t[0]*t[9]*t[15];
82     cofactor[10] =  t[1]*t[7]*t[12]  - t[3]*t[5]*t[12]  + t[3]*t[4]*t[13]
83                   - t[0]*t[7]*t[13]  - t[1]*t[4]*t[15]  + t[0]*t[5]*t[15];
84     cofactor[11] =  t[3]*t[5]*t[8]   - t[1]*t[7]*t[8]   - t[3]*t[4]*t[9]
85                   + t[0]*t[7]*t[9]   + t[1]*t[4]*t[11]  - t[0]*t[5]*t[11];
86     cofactor[12] =  t[6]*t[9]*t[12]  - t[5]*t[10]*t[12] - t[6]*t[8]*t[13]
87                   + t[4]*t[10]*t[13] + t[5]*t[8]*t[14]  - t[4]*t[9]*t[14];
88     cofactor[13] =  t[1]*t[10]*t[12] - t[2]*t[9]*t[12]  + t[2]*t[8]*t[13]
89                   - t[0]*t[10]*t[13] - t[1]*t[8]*t[14]  + t[0]*t[9]*t[14];
90     cofactor[14] =  t[2]*t[5]*t[12]  - t[1]*t[6]*t[12]  - t[2]*t[4]*t[13]
91                   + t[0]*t[6]*t[13]  + t[1]*t[4]*t[14]  - t[0]*t[5]*t[14];
92     cofactor[15] =  t[1]*t[6]*t[8]   - t[2]*t[5]*t[8]   + t[2]*t[4]*t[9]
93                   - t[0]*t[6]*t[9]   - t[1]*t[4]*t[10]  + t[0]*t[5]*t[10];
95     return cofactor/det(t);
98 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
100 } // End namespace Foam
102 // ************************************************************************* //