Dune Core Modules (2.6.0)

dynmatrix.hh
Go to the documentation of this file.
1 // -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2 // vi: set et ts=4 sw=2 sts=2:
3 #ifndef DUNE_DYNMATRIX_HH
4 #define DUNE_DYNMATRIX_HH
5 
6 #include <cmath>
7 #include <cstddef>
8 #include <iostream>
9 #include <initializer_list>
10 
13 #include <dune/common/dynvector.hh>
16 
17 namespace Dune
18 {
19 
29  template< class K > class DynamicMatrix;
30 
31  template< class K >
32  struct DenseMatVecTraits< DynamicMatrix<K> >
33  {
34  typedef DynamicMatrix<K> derived_type;
35 
36  typedef DynamicVector<K> row_type;
37 
38  typedef row_type &row_reference;
39  typedef const row_type &const_row_reference;
40 
41  typedef std::vector<K> container_type;
42  typedef K value_type;
43  typedef typename container_type::size_type size_type;
44  };
45 
46  template< class K >
47  struct FieldTraits< DynamicMatrix<K> >
48  {
49  typedef typename FieldTraits<K>::field_type field_type;
50  typedef typename FieldTraits<K>::real_type real_type;
51  };
52 
57  template<class K>
58  class DynamicMatrix : public DenseMatrix< DynamicMatrix<K> >
59  {
60  std::vector< DynamicVector<K> > _data;
62  public:
63  typedef typename Base::size_type size_type;
64  typedef typename Base::value_type value_type;
65  typedef typename Base::row_type row_type;
66 
67  //===== constructors
70 
72  DynamicMatrix (size_type r, size_type c, value_type v = value_type() ) :
73  _data(r, row_type(c, v) )
74  {}
75 
78  DynamicMatrix (std::initializer_list<DynamicVector<K>> const &ll)
79  : _data(ll)
80  {}
81 
82 
83  template <class T,
84  typename = std::enable_if_t<!Dune::IsNumber<T>::value && HasDenseMatrixAssigner<DynamicMatrix, T>::value>>
85  DynamicMatrix(T const& rhs)
86  {
87  *this = rhs;
88  }
89 
90  //==== resize related methods
104  void resize (size_type r, size_type c, value_type v = value_type() )
105  {
106  _data.resize(0);
107  _data.resize(r, row_type(c, v) );
108  }
109 
110  //===== assignment
111  // General assignment with resizing
112  template <typename T,
113  typename = std::enable_if_t<!Dune::IsNumber<T>::value>>
114  DynamicMatrix& operator=(T const& rhs) {
115  _data.resize(rhs.N());
116  std::fill(_data.begin(), _data.end(), row_type(rhs.M(), K(0)));
117  Base::operator=(rhs);
118  return *this;
119  }
120 
121  // Specialisation: scalar assignment (no resizing)
122  template <typename T,
123  typename = std::enable_if_t<Dune::IsNumber<T>::value>>
124  DynamicMatrix& operator=(T scalar) {
125  std::fill(_data.begin(), _data.end(), scalar);
126  return *this;
127  }
128 
129  // make this thing a matrix
130  size_type mat_rows() const { return _data.size(); }
131  size_type mat_cols() const {
132  assert(this->rows());
133  return _data.front().size();
134  }
135  row_type & mat_access(size_type i) {
136  DUNE_ASSERT_BOUNDS(i < _data.size());
137  return _data[i];
138  }
139  const row_type & mat_access(size_type i) const {
140  DUNE_ASSERT_BOUNDS(i < _data.size());
141  return _data[i];
142  }
143  };
144 
147 } // end namespace
148 
149 #endif
Macro for wrapping boundary checks.
A dense n x m matrix.
Definition: densematrix.hh:160
Traits::value_type value_type
export the type representing the field
Definition: densematrix.hh:174
size_type rows() const
number of rows
Definition: densematrix.hh:698
Traits::size_type size_type
The type used for the index access and size operation.
Definition: densematrix.hh:183
Construct a matrix with a dynamic size.
Definition: dynmatrix.hh:59
DynamicMatrix(std::initializer_list< DynamicVector< K >> const &ll)
Constructor initializing the matrix from a list of vector.
Definition: dynmatrix.hh:78
void resize(size_type r, size_type c, value_type v=value_type())
resize matrix to r × c
Definition: dynmatrix.hh:104
DynamicMatrix()
Default constructor.
Definition: dynmatrix.hh:69
DynamicMatrix(size_type r, size_type c, value_type v=value_type())
Constructor initializing the whole matrix with a scalar.
Definition: dynmatrix.hh:72
Construct a vector with a dynamic size.
Definition: dynvector.hh:57
Implements a matrix constructed from a given type representing a field and a compile-time given numbe...
A few common exception classes.
This file implements a dense vector with a dynamic size.
#define DUNE_ASSERT_BOUNDS(cond)
If DUNE_CHECK_BOUNDS is defined: check if condition cond holds; otherwise, do nothing.
Definition: boundschecking.hh:28
Dune namespace.
Definition: alignedallocator.hh:10
Traits for type conversions and type information.
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden  |  generated with Hugo v0.80.0 (Apr 24, 22:30, 2024)