dune-fem  2.4.1-rc
fieldmatrixhelper.hh
Go to the documentation of this file.
1 #ifndef DUNE_FEM_FIELDMATRIXHELPER_HH
2 #define DUNE_FEM_FIELDMATRIXHELPER_HH
3 
4 #include <dune/common/fvector.hh>
5 #include <dune/common/fmatrix.hh>
6 #include <dune/common/dynmatrix.hh>
7 
8 namespace Dune
9 {
10 
11  namespace Fem
12  {
13 
14  namespace FieldMatrixHelper
15  {
16 
17  template< class Field1, class Field2, class Field3, int m, int n >
18  inline void multiply ( const FieldMatrix< Field1, m, n > &A,
19  const FieldVector< Field2, n > &x,
20  FieldVector< Field3, m > &y )
21  {
22  for( int i = 0; i < m; ++i )
23  {
24  Field3 &value = y[ i ];
25 
26  value = 0;
27  for( int j = 0; j < n; ++j )
28  value += A[ i ][ j ] * x[ j ];
29  }
30  }
31 
32 
33 
34  template< class Field1, class Field2, class Field3, int m, int n, int p >
35  inline void multiply ( const FieldMatrix< Field1, m, n > &A,
36  const FieldMatrix< Field2, n, p > &B,
37  FieldMatrix< Field3, m, p > &C )
38  {
39  for( int i = 0; i < m; ++i )
40  {
41  for( int j = 0; j < p; ++j )
42  {
43  Field3 &value = C[ i ][ j ];
44 
45  value = 0;
46  for( int k = 0; k < n; ++k )
47  value += A[ i ][ k ] * B[ k ][ j ];
48  }
49  }
50  }
51 
52  template< class Field1, class Field2, class Field3 >
53  inline void multiply ( const DynamicMatrix< Field1 >& A,
54  const DynamicMatrix< Field2 >& B,
55  DynamicMatrix< Field3 >& C )
56  {
57  const int m = A.rows();
58  const int n = A.cols();
59  const int p = B.cols();
60 
61  C.resize( m, p );
62 
63  assert( A.cols() == B.rows() );
64  assert( A.rows() == C.rows() );
65  assert( B.cols() == C.cols() );
66 
67  for( int i = 0; i < m; ++i )
68  {
69  for( int j = 0; j < p; ++j )
70  {
71  Field3 &value = C[ i ][ j ];
72 
73  value = 0;
74  for( int k = 0; k < n; ++k )
75  value += A[ i ][ k ] * B[ k ][ j ];
76  }
77  }
78  }
79 
80  template< class Field1, class Field2, class Field3, int m, int n, int p >
81  inline void multiply ( const FieldMatrix< Field1, m, n > &A,
82  const FieldMatrix< Field2, n, p > &B,
83  Field3* C)
84  {
85  for( int i = 0, ip = 0; i < m; ++i )
86  {
87  for( int j = 0; j < p; ++j , ++ ip )
88  {
89  Field3 &value = C[ ip ];
90  value = 0;
91  for( int k = 0; k < n; ++k )
92  value += A[ i ][ k ] * B[ k ][ j ];
93  }
94  }
95  }
96 
97  }
98 
99  } // namespace Fem
100 
101 } // namespace Dune
102 
103 #endif // #ifndef DUNE_FEM_FIELDMATRIXHELPER_HH
void multiply(const FieldMatrix< Field1, m, n > &A, const FieldVector< Field2, n > &x, FieldVector< Field3, m > &y)
Definition: fieldmatrixhelper.hh:18
Definition: coordinate.hh:4