Loading [MathJax]/extensions/tex2jax.js
ug4
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
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
40namespace ug{
41
42template<typename TMatrix, typename TInverseMatrixType, typename TVector>
43void 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
58template<typename TMatrix, typename TVector>
59void InverseFromInverseType(TMatrix &mat, TMatrix &inv, TVector &x, TVector &e)
60{
61 mat = inv;
62}
63
64template<typename T>
65bool InvertNdyn(DenseMatrix<T> &mat)
66{
67 typename block_traits<DenseMatrix<T> >::inverse_type inv;
68 if(!GetInverse(inv, mat)) return false;
69
70 DenseVector<VariableArray1<typename DenseMatrix<T>::value_type > > e, x;
71
72 InverseFromInverseType(mat, inv, x, e);
73
74 return true;
75}
76
77template<typename T, size_t TUnknowns>
78bool 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
83 DenseVector<FixedArray1<typename DenseMatrix<T>::value_type , TUnknowns > > e, x;
84 InverseFromInverseType(mat, inv, x, e);
85
86 return true;
87}
88
89
90}
91
92
93#endif /* NOLAPACK_INVERT_H_ */
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