ug4
nolapack_invert.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2013-2015: G-CSC, Goethe University Frankfurt
3  * Author: Martin Rupp
4  *
5  * This file is part of UG4.
6  *
7  * UG4 is free software: you can redistribute it and/or modify it under the
8  * terms of the GNU Lesser General Public License version 3 (as published by the
9  * Free Software Foundation) with the following additional attribution
10  * requirements (according to LGPL/GPL v3 §7):
11  *
12  * (1) The following notice must be displayed in the Appropriate Legal Notices
13  * of covered and combined works: "Based on UG4 (www.ug4.org/license)".
14  *
15  * (2) The following notice must be displayed at a prominent place in the
16  * terminal output of covered works: "Based on UG4 (www.ug4.org/license)".
17  *
18  * (3) The following bibliography is recommended for citation and must be
19  * preserved in all covered files:
20  * "Reiter, S., Vogel, A., Heppner, I., Rupp, M., and Wittum, G. A massively
21  * parallel geometric multigrid solver on hierarchically distributed grids.
22  * Computing and visualization in science 16, 4 (2013), 151-164"
23  * "Vogel, A., Reiter, S., Rupp, M., Nägel, A., and Wittum, G. UG4 -- a novel
24  * flexible software system for simulating pde based models on high performance
25  * computers. Computing and visualization in science 16, 4 (2013), 165-179"
26  *
27  * This program is distributed in the hope that it will be useful,
28  * but WITHOUT ANY WARRANTY; without even the implied warranty of
29  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
30  * GNU Lesser General Public License for more details.
31  */
32 
33 #ifndef __H__UG__CPU_ALGEBRA__NOLAPACK_INVERT_H_
34 #define __H__UG__CPU_ALGEBRA__NOLAPACK_INVERT_H_
35 
36 #include "../small_matrix/densematrix.h"
37 #include "../small_matrix/densevector.h"
38 #include "../small_matrix/block_dense.h"
39 
40 namespace ug{
41 
42 template<typename TMatrix, typename TInverseMatrixType, typename TVector>
43 void InverseFromInverseType(TMatrix &mat, TInverseMatrixType &inv, TVector &x, TVector &e)
44 {
45  x.resize(mat.num_rows());
46  e.resize(mat.num_rows());
47  for(size_t c=0; c<mat.num_rows(); c++)
48  {
49  e = 0.0;
50  e[c] = 1.0;
51  MatMult(x, 1.0, inv, e);
52  for(size_t r=0; r<mat.num_cols(); r++)
53  mat(r, c) = x[r];
54  }
55 
56 }
57 
58 template<typename TMatrix, typename TVector>
59 void InverseFromInverseType(TMatrix &mat, TMatrix &inv, TVector &x, TVector &e)
60 {
61  mat = inv;
62 }
63 
64 template<typename T>
65 bool InvertNdyn(DenseMatrix<T> &mat)
66 {
67  typename block_traits<DenseMatrix<T> >::inverse_type inv;
68  if(!GetInverse(inv, mat)) return false;
69 
71 
72  InverseFromInverseType(mat, inv, x, e);
73 
74  return true;
75 }
76 
77 template<typename T, size_t TUnknowns>
78 bool Invert(DenseMatrix<FixedArray2<T, TUnknowns, TUnknowns> > &mat)
79 {
80  typename block_traits<DenseMatrix<T> >::inverse_type inv;
81  if(!GetInverse(inv, mat)) return false;
82 
84  InverseFromInverseType(mat, inv, x, e);
85 
86  return true;
87 }
88 
89 
90 }
91 
92 
93 #endif /* NOLAPACK_INVERT_H_ */
TStorage::value_type value_type
Definition: densevector.h:103
the ug namespace
bool GetInverse(block_traits< T >::inverse_type &inv, const T &m)
void InverseFromInverseType(TMatrix &mat, TInverseMatrixType &inv, TVector &x, TVector &e)
Definition: nolapack_invert.h:43
bool Invert(T &m)
bool InvertNdyn(DenseMatrix< T > &mat)
Definition: lapack_invert.h:47
bool MatMult(vector_t &dest, const number &beta1, const matrix_t &A1, const vector_t &w1)
calculates dest = beta1 * A1;
Definition: operations_mat.h:59