dune-grid  2.2.0
algebra.hh
Go to the documentation of this file.
1 #ifndef DUNE_ALBERTA_ALGEBRA_HH
2 #define DUNE_ALBERTA_ALGEBRA_HH
3 
4 #include <dune/common/misc.hh>
5 #include <dune/common/fvector.hh>
6 #include <dune/common/fmatrix.hh>
7 
8 namespace Dune
9 {
10 
11  namespace Alberta
12  {
13 
14  template< class K >
15  inline static FieldVector< K, 3 >
16  vectorProduct ( const FieldVector< K, 3 > &u, const FieldVector< K, 3 > &v )
17  {
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 ];
22  return w;
23  }
24 
25 
26  template< class K, int m >
27  inline static K determinant ( const FieldMatrix< K, 0, m > &matrix )
28  {
29  return K( 1 );
30  }
31 
32  template< class K >
33  inline static K determinant ( const FieldMatrix< K, 1, 1 > &matrix )
34  {
35  return matrix[ 0 ][ 0 ];
36  }
37 
38  template< class K, int m >
39  inline static K determinant ( const FieldMatrix< K, 1, m > &matrix )
40  {
41  K sum = SQR( matrix[ 0 ][ 0 ] );
42  for( int i = 1; i < m; ++i )
43  sum += SQR( matrix[ 0 ][ i ] );
44  return sqrt( sum );
45  }
46 
47  template< class K >
48  inline static K determinant ( const FieldMatrix< K, 2, 2 > &matrix )
49  {
50  return matrix[ 0 ][ 0 ] * matrix[ 1 ][ 1 ] - matrix[ 0 ][ 1 ] * matrix[ 1 ][ 0 ];
51  }
52 
53  template< class K >
54  inline static K determinant ( const FieldMatrix< K, 2, 3 > &matrix )
55  {
56  return vectorProduct( matrix[ 0 ], matrix[ 1 ] ).two_norm();
57  }
58 
59  template< class K, int m >
60  inline static K determinant ( const FieldMatrix< K, 2, m > &matrix )
61  {
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 ) );
66  }
67 
68  template< class K >
69  inline static K determinant ( const FieldMatrix< K, 3, 3 > &matrix )
70  {
71  return matrix[ 0 ] * vectorProduct( matrix[ 1 ], matrix[ 2 ] );
72  }
73 
74 
75  template< class K, int m >
76  inline static K invert ( const FieldMatrix< K, 0, m > &matrix,
77  FieldMatrix< K, m, 0 > &inverse )
78  {
79  return K( 1 );
80  }
81 
82  template< class K >
83  inline static K invert ( const FieldMatrix< K, 1, 1 > &matrix,
84  FieldMatrix< K, 1, 1 > &inverse )
85  {
86  inverse[ 0 ][ 0 ] = K( 1 ) / matrix[ 0 ][ 0 ];
87  return matrix[ 0 ][ 0 ];
88  }
89 
90  template< class K, int m >
91  inline static K invert ( const FieldMatrix< K, 1, m > &matrix,
92  FieldMatrix< K, m, 1 > &inverse )
93  {
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 );
99  }
100 
101  template< class K >
102  inline static K invert ( const FieldMatrix< K, 2, 2 > &matrix,
103  FieldMatrix< K, 2, 2 > &inverse )
104  {
105  K det = determinant( matrix );
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 ];
111  return det;
112  }
113 
114  template< class K, int m >
115  inline static K invert ( const FieldMatrix< K, 2, m > &matrix,
116  FieldMatrix< K, m, 2 > &inverse )
117  {
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 )
124  {
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 ]);
127  }
128  return sqrt( detSqr );
129  }
130 
131  template< class K >
132  inline static K invert ( const FieldMatrix< K, 3, 3 > &matrix,
133  FieldMatrix< K, 3, 3 > &inverse )
134  {
135  return FMatrixHelp::invertMatrix( matrix, inverse );
136  }
137  }
138 
139 }
140 
141 #endif // #ifndef DUNE_ALBERTA_ALGEBRA_HH