1 #ifndef DUNE_ALBERTA_ALGEBRA_HH
2 #define DUNE_ALBERTA_ALGEBRA_HH
4 #include <dune/common/misc.hh>
5 #include <dune/common/fvector.hh>
6 #include <dune/common/fmatrix.hh>
15 inline static FieldVector< K, 3 >
16 vectorProduct (
const FieldVector< K, 3 > &u,
const FieldVector< K, 3 > &v )
18 FieldVector< K, 3 > w;
19 w[ 0 ] = u[ 1 ] * v[ 2 ] - u[ 2 ] * v[ 1 ];
20 w[ 1 ] = u[ 2 ] * v[ 0 ] - u[ 0 ] * v[ 2 ];
21 w[ 2 ] = u[ 0 ] * v[ 1 ] - u[ 1 ] * v[ 0 ];
26 template<
class K,
int m >
27 inline static K
determinant (
const FieldMatrix< K, 0, m > &matrix )
33 inline static K
determinant (
const FieldMatrix< K, 1, 1 > &matrix )
35 return matrix[ 0 ][ 0 ];
38 template<
class K,
int m >
39 inline static K
determinant (
const FieldMatrix< K, 1, m > &matrix )
41 K sum = SQR( matrix[ 0 ][ 0 ] );
42 for(
int i = 1; i < m; ++i )
43 sum += SQR( matrix[ 0 ][ i ] );
48 inline static K
determinant (
const FieldMatrix< K, 2, 2 > &matrix )
50 return matrix[ 0 ][ 0 ] * matrix[ 1 ][ 1 ] - matrix[ 0 ][ 1 ] * matrix[ 1 ][ 0 ];
54 inline static K
determinant (
const FieldMatrix< K, 2, 3 > &matrix )
59 template<
class K,
int m >
60 inline static K
determinant (
const FieldMatrix< K, 2, m > &matrix )
62 const K tmpA = matrix[ 0 ].two_norm2();
63 const K tmpB = matrix[ 1 ].two_norm2();
64 const K tmpC = matrix[ 0 ] * matrix[ 1 ];
65 return sqrt( tmpA * tmpB - SQR( tmpC ) );
69 inline static K
determinant (
const FieldMatrix< K, 3, 3 > &matrix )
71 return matrix[ 0 ] *
vectorProduct( matrix[ 1 ], matrix[ 2 ] );
75 template<
class K,
int m >
76 inline static K
invert (
const FieldMatrix< K, 0, m > &matrix,
77 FieldMatrix< K, m, 0 > &inverse )
83 inline static K
invert (
const FieldMatrix< K, 1, 1 > &matrix,
84 FieldMatrix< K, 1, 1 > &inverse )
86 inverse[ 0 ][ 0 ] = K( 1 ) / matrix[ 0 ][ 0 ];
87 return matrix[ 0 ][ 0 ];
90 template<
class K,
int m >
91 inline static K
invert (
const FieldMatrix< K, 1, m > &matrix,
92 FieldMatrix< K, m, 1 > &inverse )
94 K detSqr = matrix[ 0 ].two_norm2();
95 K invDetSqr = K( 1 ) / detSqr;
96 for(
int i = 0; i < m; ++i )
97 inverse[ i ][ 0 ] = invDetSqr * matrix[ 0 ][ i ];
98 return sqrt( detSqr );
102 inline static K
invert (
const FieldMatrix< K, 2, 2 > &matrix,
103 FieldMatrix< K, 2, 2 > &inverse )
106 K invDet = K( 1 ) / det;
107 inverse[ 0 ][ 0 ] = invDet * matrix[ 1 ][ 1 ];
108 inverse[ 0 ][ 1 ] = - invDet * matrix[ 0 ][ 1 ];
109 inverse[ 1 ][ 0 ] = - invDet * matrix[ 1 ][ 0 ];
110 inverse[ 1 ][ 1 ] = invDet * matrix[ 0 ][ 0 ];
114 template<
class K,
int m >
115 inline static K
invert (
const FieldMatrix< K, 2, m > &matrix,
116 FieldMatrix< K, m, 2 > &inverse )
118 const K tmpA = matrix[ 0 ].two_norm2();
119 const K tmpB = matrix[ 1 ].two_norm2();
120 const K tmpC = matrix[ 0 ] * matrix[ 1 ];
121 const K detSqr = tmpA * tmpB - SQR( tmpC );
122 const K invDetSqr = K( 1 ) / detSqr;
123 for(
int i = 0; i < m; ++i )
125 inverse[ i ][ 0 ] = invDetSqr * (tmpB * matrix[ 0 ][ i ] - tmpC * matrix[ 1 ][ i ]);
126 inverse[ i ][ 1 ] = invDetSqr * (tmpA * matrix[ 1 ][ i ] - tmpC * matrix[ 0 ][ i ]);
128 return sqrt( detSqr );
132 inline static K
invert (
const FieldMatrix< K, 3, 3 > &matrix,
133 FieldMatrix< K, 3, 3 > &inverse )
135 return FMatrixHelp::invertMatrix( matrix, inverse );
141 #endif // #ifndef DUNE_ALBERTA_ALGEBRA_HH