libMesh::DenseSubMatrix< T > Class Template Reference

#include <dense_submatrix.h>

Inheritance diagram for libMesh::DenseSubMatrix< T >:

Public Member Functions

 DenseSubMatrix (DenseMatrix< T > &new_parent, const unsigned int ioff=0, const unsigned int joff=0, const unsigned int m=0, const unsigned int n=0)
 
 DenseSubMatrix (const DenseSubMatrix< T > &other_matrix)
 
virtual ~DenseSubMatrix ()
 
DenseMatrix< T > & parent ()
 
virtual void zero () libmesh_override
 
operator() (const unsigned int i, const unsigned int j) const
 
T & operator() (const unsigned int i, const unsigned int j)
 
virtual T el (const unsigned int i, const unsigned int j) const libmesh_override
 
virtual T & el (const unsigned int i, const unsigned int j) libmesh_override
 
virtual void left_multiply (const DenseMatrixBase< T > &M2) libmesh_override
 
virtual void right_multiply (const DenseMatrixBase< T > &M3) libmesh_override
 
void reposition (const unsigned int ioff, const unsigned int joff, const unsigned int new_m, const unsigned int new_n)
 
unsigned int i_off () const
 
unsigned int j_off () const
 
void condense (const unsigned int i, const unsigned int j, const T val, DenseSubVector< T > &rhs)
 
unsigned int m () const
 
unsigned int n () const
 
void print (std::ostream &os=libMesh::out) const
 
void print_scientific (std::ostream &os, unsigned precision=8) const
 
template<typename T2 , typename T3 >
boostcopy::enable_if_c< ScalarTraits< T2 >::value, void >::type add (const T2 factor, const DenseMatrixBase< T3 > &mat)
 

Protected Member Functions

void condense (const unsigned int i, const unsigned int j, const T val, DenseVectorBase< T > &rhs)
 

Static Protected Member Functions

static void multiply (DenseMatrixBase< T > &M1, const DenseMatrixBase< T > &M2, const DenseMatrixBase< T > &M3)
 

Protected Attributes

unsigned int _m
 
unsigned int _n
 

Private Attributes

DenseMatrix< T > & _parent_matrix
 
unsigned int _i_off
 
unsigned int _j_off
 

Detailed Description

template<typename T>
class libMesh::DenseSubMatrix< T >

Defines a dense submatrix for use in Finite Element-type computations. Useful for storing element stiffness matrices before summation into a global matrix, particularly when you have systems of equations. All overridden virtual functions are documented in dense_matrix_base.h.

Author
Benjamin S. Kirk
Date
2003

Definition at line 44 of file dense_submatrix.h.

Constructor & Destructor Documentation

template<typename T >
libMesh::DenseSubMatrix< T >::DenseSubMatrix ( DenseMatrix< T > &  new_parent,
const unsigned int  ioff = 0,
const unsigned int  joff = 0,
const unsigned int  m = 0,
const unsigned int  n = 0 
)
inline

Constructor. Creates a dense submatrix of the matrix parent. The submatrix has dimensions $(m \times n)$, and the $(0,0)$ entry of the submatrix is located at the $(ioff,joff)$ location in the parent matrix.

Definition at line 158 of file dense_submatrix.h.

References libMesh::DenseSubMatrix< T >::reposition().

162  :
163  DenseMatrixBase<T>(new_m,new_n),
164  _parent_matrix(new_parent)
165 {
166  this->reposition (ioff, joff, new_m, new_n);
167 }
void reposition(const unsigned int ioff, const unsigned int joff, const unsigned int new_m, const unsigned int new_n)
DenseMatrix< T > & _parent_matrix
template<typename T >
libMesh::DenseSubMatrix< T >::DenseSubMatrix ( const DenseSubMatrix< T > &  other_matrix)
inline

Copy Constructor.

Definition at line 173 of file dense_submatrix.h.

References libMesh::DenseSubMatrix< T >::_i_off, and libMesh::DenseSubMatrix< T >::_j_off.

173  :
174  DenseMatrixBase<T>(other_matrix._m, other_matrix._n),
175  _parent_matrix(other_matrix._parent_matrix)
176 {
177  _i_off = other_matrix._i_off;
178  _j_off = other_matrix._j_off;
179 }
DenseMatrix< T > & _parent_matrix
template<typename T>
virtual libMesh::DenseSubMatrix< T >::~DenseSubMatrix ( )
inlinevirtual

Destructor. Empty.

Definition at line 68 of file dense_submatrix.h.

68 {}

Member Function Documentation

template<typename T >
template<typename T2 , typename T3 >
boostcopy::enable_if_c< ScalarTraits< T2 >::value, void >::type libMesh::DenseMatrixBase< T >::add ( const T2  factor,
const DenseMatrixBase< T3 > &  mat 
)
inlineinherited

Adds factor to every element in the matrix. This should only work if T += T2 * T3 is valid C++ and if T2 is scalar. Return type is void

Definition at line 183 of file dense_matrix_base.h.

References libMesh::DenseMatrixBase< T >::el(), libMesh::DenseMatrixBase< T >::m(), and libMesh::DenseMatrixBase< T >::n().

185 {
186  libmesh_assert_equal_to (this->m(), mat.m());
187  libmesh_assert_equal_to (this->n(), mat.n());
188 
189  for (unsigned int j=0; j<this->n(); j++)
190  for (unsigned int i=0; i<this->m(); i++)
191  this->el(i,j) += factor*mat.el(i,j);
192 }
unsigned int n() const
unsigned int m() const
virtual T el(const unsigned int i, const unsigned int j) const =0
template<typename T>
void libMesh::DenseSubMatrix< T >::condense ( const unsigned int  i,
const unsigned int  j,
const T  val,
DenseSubVector< T > &  rhs 
)
inline

Condense-out the (i,j) entry of the matrix, forcing it to take on the value val. This is useful in numerical simulations for applying boundary conditions. Preserves the symmetry of the matrix.

Definition at line 125 of file dense_submatrix.h.

References libMesh::DenseSubMatrix< T >::i_off(), libMesh::DenseSubMatrix< T >::j_off(), libMesh::DenseSubVector< T >::parent(), and libMesh::DenseSubMatrix< T >::parent().

129  {
130  this->parent().condense(this->i_off()+i,
131  this->j_off()+j,
132  val, rhs.parent());
133  }
DenseMatrix< T > & parent()
unsigned int i_off() const
unsigned int j_off() const
template<typename T >
void libMesh::DenseMatrixBase< T >::condense ( const unsigned int  i,
const unsigned int  j,
const T  val,
DenseVectorBase< T > &  rhs 
)
protectedinherited

Condense-out the (i,j) entry of the matrix, forcing it to take on the value val. This is useful in numerical simulations for applying boundary conditions. Preserves the symmetry of the matrix.

Definition at line 58 of file dense_matrix_base.C.

References libMesh::DenseVectorBase< T >::el(), and libMesh::DenseVectorBase< T >::size().

Referenced by libMesh::DenseMatrix< Number >::condense().

62 {
63  libmesh_assert_equal_to (this->_m, rhs.size());
64  libmesh_assert_equal_to (iv, jv);
65 
66 
67  // move the known value into the RHS
68  // and zero the column
69  for (unsigned int i=0; i<this->m(); i++)
70  {
71  rhs.el(i) -= this->el(i,jv)*val;
72  this->el(i,jv) = 0.;
73  }
74 
75  // zero the row
76  for (unsigned int j=0; j<this->n(); j++)
77  this->el(iv,j) = 0.;
78 
79  this->el(iv,jv) = 1.;
80  rhs.el(iv) = val;
81 
82 }
unsigned int n() const
unsigned int m() const
virtual T el(const unsigned int i, const unsigned int j) const =0
template<typename T>
virtual T libMesh::DenseSubMatrix< T >::el ( const unsigned int  i,
const unsigned int  j 
) const
inlinevirtual
Returns
The (i,j) element of the matrix. Since internal data representations may differ, you must redefine this function.

Implements libMesh::DenseMatrixBase< T >.

Definition at line 89 of file dense_submatrix.h.

91  { return (*this)(i,j); }
template<typename T>
virtual T& libMesh::DenseSubMatrix< T >::el ( const unsigned int  i,
const unsigned int  j 
)
inlinevirtual
Returns
The (i,j) element of the matrix as a writable reference. Since internal data representations may differ, you must redefine this function.

Implements libMesh::DenseMatrixBase< T >.

Definition at line 93 of file dense_submatrix.h.

References libMesh::DenseSubMatrix< T >::left_multiply(), libMesh::DenseSubMatrix< T >::reposition(), and libMesh::DenseSubMatrix< T >::right_multiply().

95  { return (*this)(i,j); }
template<typename T>
unsigned int libMesh::DenseSubMatrix< T >::i_off ( ) const
inline
template<typename T>
unsigned int libMesh::DenseSubMatrix< T >::j_off ( ) const
inline
template<typename T >
void libMesh::DenseSubMatrix< T >::left_multiply ( const DenseMatrixBase< T > &  M2)
virtual

Performs the operation: (*this) <- M2 * (*this)

Implements libMesh::DenseMatrixBase< T >.

Definition at line 31 of file dense_submatrix.C.

Referenced by libMesh::DenseSubMatrix< T >::el().

32 {
33  // (*this) <- M2 * M3
34  // Where:
35  // (*this) = (m x n),
36  // M2 = (m x p),
37  // M3 = (p x n)
38 
39  // M3 is a simply a copy of *this
40  DenseSubMatrix<T> M3(*this);
41 
42  // Call the multiply function in the base class
43  this->multiply(*this, M2, M3);
44 }
static void multiply(DenseMatrixBase< T > &M1, const DenseMatrixBase< T > &M2, const DenseMatrixBase< T > &M3)
template<typename T>
unsigned int libMesh::DenseMatrixBase< T >::m ( ) const
inlineinherited
Returns
The row-dimension of the matrix.

Definition at line 97 of file dense_matrix_base.h.

References libMesh::DenseMatrixBase< T >::_m.

Referenced by libMesh::DenseMatrix< T >::_multiply_blas(), libMesh::DenseMatrix< T >::_svd_solve_lapack(), libMesh::DenseMatrixBase< T >::add(), libMesh::DenseMatrix< T >::add(), libMesh::PetscMatrix< T >::add_block_matrix(), libMesh::SparseMatrix< T >::add_block_matrix(), libMesh::EigenSparseMatrix< T >::add_matrix(), libMesh::LaspackMatrix< T >::add_matrix(), libMesh::EpetraMatrix< T >::add_matrix(), libMesh::PetscMatrix< T >::add_matrix(), libMesh::DofMap::build_constraint_matrix(), libMesh::DofMap::build_constraint_matrix_and_vector(), libMesh::DofMap::constrain_element_dyad_matrix(), libMesh::DofMap::constrain_element_matrix(), libMesh::DofMap::constrain_element_matrix_and_vector(), libMesh::DofMap::constrain_element_vector(), libMesh::DofMap::extract_local_vector(), libMesh::DenseMatrix< T >::get_transpose(), libMesh::DofMap::heterogenously_constrain_element_matrix_and_vector(), libMesh::DofMap::heterogenously_constrain_element_vector(), libMesh::DenseMatrix< T >::left_multiply(), libMesh::DenseMatrix< T >::left_multiply_transpose(), libMesh::DofMap::max_constraint_error(), libMesh::DenseMatrixBase< T >::multiply(), libMesh::DenseSubMatrix< T >::operator()(), libMesh::WeightedPatchRecoveryErrorEstimator::EstimateError::operator()(), libMesh::PatchRecoveryErrorEstimator::EstimateError::operator()(), libMesh::DenseMatrix< T >::operator=(), libMesh::DenseSubMatrix< T >::reposition(), libMesh::DenseMatrix< T >::right_multiply(), libMesh::DenseMatrix< T >::right_multiply_transpose(), libMesh::DenseMatrix< T >::scale_column(), and libMesh::DenseSubMatrix< T >::zero().

97 { return _m; }
template<typename T >
void libMesh::DenseMatrixBase< T >::multiply ( DenseMatrixBase< T > &  M1,
const DenseMatrixBase< T > &  M2,
const DenseMatrixBase< T > &  M3 
)
staticprotectedinherited

Helper function - Performs the computation M1 = M2 * M3 where: M1 = (m x n) M2 = (m x p) M3 = (p x n)

Definition at line 31 of file dense_matrix_base.C.

References libMesh::DenseMatrixBase< T >::el(), libMesh::DenseMatrixBase< T >::m(), and libMesh::DenseMatrixBase< T >::n().

34 {
35  // Assertions to make sure we have been
36  // passed matrices of the correct dimension.
37  libmesh_assert_equal_to (M1.m(), M2.m());
38  libmesh_assert_equal_to (M1.n(), M3.n());
39  libmesh_assert_equal_to (M2.n(), M3.m());
40 
41  const unsigned int m_s = M2.m();
42  const unsigned int p_s = M2.n();
43  const unsigned int n_s = M1.n();
44 
45  // Do it this way because there is a
46  // decent chance (at least for constraint matrices)
47  // that M3(k,j) = 0. when right-multiplying.
48  for (unsigned int k=0; k<p_s; k++)
49  for (unsigned int j=0; j<n_s; j++)
50  if (M3.el(k,j) != 0.)
51  for (unsigned int i=0; i<m_s; i++)
52  M1.el(i,j) += M2.el(i,k) * M3.el(k,j);
53 }
template<typename T>
unsigned int libMesh::DenseMatrixBase< T >::n ( ) const
inlineinherited
Returns
The column-dimension of the matrix.

Definition at line 102 of file dense_matrix_base.h.

References libMesh::DenseMatrixBase< T >::_n, libMesh::out, and libMesh::DenseMatrixBase< T >::print().

Referenced by libMesh::DenseMatrix< T >::_multiply_blas(), libMesh::DenseMatrix< T >::_svd_solve_lapack(), libMesh::DenseMatrixBase< T >::add(), libMesh::DenseMatrix< T >::add(), libMesh::PetscMatrix< T >::add_block_matrix(), libMesh::SparseMatrix< T >::add_block_matrix(), libMesh::EigenSparseMatrix< T >::add_matrix(), libMesh::LaspackMatrix< T >::add_matrix(), libMesh::EpetraMatrix< T >::add_matrix(), libMesh::PetscMatrix< T >::add_matrix(), libMesh::DofMap::build_constraint_matrix(), libMesh::DofMap::build_constraint_matrix_and_vector(), libMesh::DofMap::constrain_element_dyad_matrix(), libMesh::DofMap::constrain_element_matrix(), libMesh::DofMap::constrain_element_matrix_and_vector(), libMesh::DofMap::constrain_element_vector(), libMesh::DofMap::extract_local_vector(), libMesh::DenseMatrix< T >::get_transpose(), libMesh::DofMap::heterogenously_constrain_element_matrix_and_vector(), libMesh::DofMap::heterogenously_constrain_element_vector(), libMesh::DenseMatrix< T >::left_multiply(), libMesh::DenseMatrix< T >::left_multiply_transpose(), libMesh::DofMap::max_constraint_error(), libMesh::DenseMatrixBase< T >::multiply(), libMesh::DenseSubMatrix< T >::operator()(), libMesh::WeightedPatchRecoveryErrorEstimator::EstimateError::operator()(), libMesh::PatchRecoveryErrorEstimator::EstimateError::operator()(), libMesh::DenseMatrix< T >::operator=(), libMesh::DenseSubMatrix< T >::reposition(), libMesh::DenseMatrix< T >::right_multiply(), libMesh::DenseMatrix< T >::right_multiply_transpose(), and libMesh::DenseSubMatrix< T >::zero().

102 { return _n; }
template<typename T >
T libMesh::DenseSubMatrix< T >::operator() ( const unsigned int  i,
const unsigned int  j 
) const
inline
Returns
The (i,j) element of the submatrix.

Definition at line 215 of file dense_submatrix.h.

References libMesh::DenseSubMatrix< T >::_parent_matrix, libMesh::DenseSubMatrix< T >::i_off(), libMesh::DenseSubMatrix< T >::j_off(), libMesh::DenseMatrixBase< T >::m(), and libMesh::DenseMatrixBase< T >::n().

Referenced by libMesh::DenseSubMatrix< T >::parent().

217 {
218  libmesh_assert_less (i, this->m());
219  libmesh_assert_less (j, this->n());
220  libmesh_assert_less (i + this->i_off(), _parent_matrix.m());
221  libmesh_assert_less (j + this->j_off(), _parent_matrix.n());
222 
223  return _parent_matrix (i + this->i_off(),
224  j + this->j_off());
225 }
unsigned int n() const
unsigned int m() const
unsigned int i_off() const
unsigned int j_off() const
DenseMatrix< T > & _parent_matrix
template<typename T >
T & libMesh::DenseSubMatrix< T >::operator() ( const unsigned int  i,
const unsigned int  j 
)
inline
Returns
The (i,j) element of the submatrix as a writable reference.

Definition at line 230 of file dense_submatrix.h.

References libMesh::DenseSubMatrix< T >::_parent_matrix, libMesh::DenseSubMatrix< T >::i_off(), libMesh::DenseSubMatrix< T >::j_off(), libMesh::DenseMatrixBase< T >::m(), and libMesh::DenseMatrixBase< T >::n().

232 {
233  libmesh_assert_less (i, this->m());
234  libmesh_assert_less (j, this->n());
235  libmesh_assert_less (i + this->i_off(), _parent_matrix.m());
236  libmesh_assert_less (j + this->j_off(), _parent_matrix.n());
237 
238  return _parent_matrix (i + this->i_off(),
239  j + this->j_off());
240 }
unsigned int n() const
unsigned int m() const
unsigned int i_off() const
unsigned int j_off() const
DenseMatrix< T > & _parent_matrix
template<typename T>
DenseMatrix<T>& libMesh::DenseSubMatrix< T >::parent ( )
inline
Returns
A reference to the parent matrix.

Definition at line 73 of file dense_submatrix.h.

References libMesh::DenseSubMatrix< T >::_parent_matrix, libMesh::DenseSubMatrix< T >::operator()(), and libMesh::DenseSubMatrix< T >::zero().

Referenced by libMesh::DenseSubMatrix< T >::condense().

73 { return _parent_matrix; }
DenseMatrix< T > & _parent_matrix
template<typename T >
void libMesh::DenseMatrixBase< T >::print ( std::ostream &  os = libMesh::out) const
inherited

Pretty-print the matrix, by default to libMesh::out.

Definition at line 128 of file dense_matrix_base.C.

Referenced by libMesh::DenseMatrixBase< T >::n().

129 {
130  for (unsigned int i=0; i<this->m(); i++)
131  {
132  for (unsigned int j=0; j<this->n(); j++)
133  os << std::setw(8)
134  << this->el(i,j) << " ";
135 
136  os << std::endl;
137  }
138 
139  return;
140 }
unsigned int n() const
unsigned int m() const
virtual T el(const unsigned int i, const unsigned int j) const =0
template<typename T >
void libMesh::DenseMatrixBase< T >::print_scientific ( std::ostream &  os,
unsigned  precision = 8 
) const
inherited

Prints the matrix entries with more decimal places in scientific notation.

Definition at line 86 of file dense_matrix_base.C.

87 {
88 #ifndef LIBMESH_BROKEN_IOSTREAM
89 
90  // save the initial format flags
91  std::ios_base::fmtflags os_flags = os.flags();
92 
93  // Print the matrix entries.
94  for (unsigned int i=0; i<this->m(); i++)
95  {
96  for (unsigned int j=0; j<this->n(); j++)
97  os << std::setw(15)
98  << std::scientific
99  << std::setprecision(precision)
100  << this->el(i,j) << " ";
101 
102  os << std::endl;
103  }
104 
105  // reset the original format flags
106  os.flags(os_flags);
107 
108 #else
109 
110  // Print the matrix entries.
111  for (unsigned int i=0; i<this->m(); i++)
112  {
113  for (unsigned int j=0; j<this->n(); j++)
114  os << std::setprecision(precision)
115  << this->el(i,j)
116  << " ";
117 
118  os << std::endl;
119  }
120 
121 
122 #endif
123 }
unsigned int n() const
unsigned int m() const
virtual T el(const unsigned int i, const unsigned int j) const =0
template<typename T >
void libMesh::DenseSubMatrix< T >::reposition ( const unsigned int  ioff,
const unsigned int  joff,
const unsigned int  new_m,
const unsigned int  new_n 
)
inline

Changes the location of the submatrix in the parent matrix.

Definition at line 184 of file dense_submatrix.h.

References libMesh::DenseSubMatrix< T >::_i_off, libMesh::DenseSubMatrix< T >::_j_off, libMesh::DenseMatrixBase< T >::_m, libMesh::DenseMatrixBase< T >::_n, libMesh::DenseSubMatrix< T >::_parent_matrix, libMesh::DenseSubMatrix< T >::i_off(), libMesh::DenseSubMatrix< T >::j_off(), libMesh::DenseMatrixBase< T >::m(), and libMesh::DenseMatrixBase< T >::n().

Referenced by libMesh::DenseSubMatrix< T >::DenseSubMatrix(), and libMesh::DenseSubMatrix< T >::el().

188 {
189  _i_off = ioff;
190  _j_off = joff;
191  this->_m = new_m;
192  this->_n = new_n;
193 
194  // Make sure we still fit in the parent matrix.
195  libmesh_assert_less_equal ((this->i_off() + this->m()), _parent_matrix.m());
196  libmesh_assert_less_equal ((this->j_off() + this->n()), _parent_matrix.n());
197 }
unsigned int n() const
unsigned int m() const
unsigned int i_off() const
unsigned int j_off() const
DenseMatrix< T > & _parent_matrix
template<typename T >
void libMesh::DenseSubMatrix< T >::right_multiply ( const DenseMatrixBase< T > &  M3)
virtual

Performs the operation: (*this) <- (*this) * M3

Implements libMesh::DenseMatrixBase< T >.

Definition at line 49 of file dense_submatrix.C.

Referenced by libMesh::DenseSubMatrix< T >::el().

50 {
51  // (*this) <- M2 * M3
52  // Where:
53  // (*this) = (m x n),
54  // M2 = (m x p),
55  // M3 = (p x n)
56 
57  // M2 is simply a copy of *this
58  DenseSubMatrix<T> M2(*this);
59 
60  // Call the multiply function in the base class
61  this->multiply(*this, M2, M3);
62 }
static void multiply(DenseMatrixBase< T > &M1, const DenseMatrixBase< T > &M2, const DenseMatrixBase< T > &M3)
template<typename T >
void libMesh::DenseSubMatrix< T >::zero ( )
inlinevirtual

Set every element in the matrix to 0. You must redefine what you mean by zeroing the matrix since it depends on how your values are stored.

Implements libMesh::DenseMatrixBase< T >.

Definition at line 203 of file dense_submatrix.h.

References libMesh::DenseSubMatrix< T >::_parent_matrix, libMesh::DenseSubMatrix< T >::i_off(), libMesh::DenseSubMatrix< T >::j_off(), libMesh::DenseMatrixBase< T >::m(), and libMesh::DenseMatrixBase< T >::n().

Referenced by libMesh::DenseSubMatrix< T >::parent().

204 {
205  for (unsigned int i=0; i<this->m(); i++)
206  for (unsigned int j=0; j<this->n(); j++)
207  _parent_matrix(i + this->i_off(),
208  j + this->j_off()) = 0.;
209 }
unsigned int n() const
unsigned int m() const
unsigned int i_off() const
unsigned int j_off() const
DenseMatrix< T > & _parent_matrix

Member Data Documentation

template<typename T>
unsigned int libMesh::DenseSubMatrix< T >::_i_off
private
template<typename T>
unsigned int libMesh::DenseSubMatrix< T >::_j_off
private

The column offset into the parent matrix.

Definition at line 150 of file dense_submatrix.h.

Referenced by libMesh::DenseSubMatrix< T >::DenseSubMatrix(), libMesh::DenseSubMatrix< T >::j_off(), and libMesh::DenseSubMatrix< T >::reposition().

template<typename T>
DenseMatrix<T>& libMesh::DenseSubMatrix< T >::_parent_matrix
private

The documentation for this class was generated from the following files: