23#ifndef EWOMS_MATRIX_BLOCK_HH
24#define EWOMS_MATRIX_BLOCK_HH
26#include <dune/common/dynmatrix.hh>
27#include <dune/common/fmatrix.hh>
28#include <dune/common/typetraits.hh>
30#include <dune/istl/superlu.hh>
31#include <dune/istl/umfpack.hh>
32#include <dune/istl/istlexception.hh>
33#include <dune/istl/matrixutils.hh>
35#include <opm/common/Exceptions.hpp>
42template <
typename K,
int m,
int n>
51 Dune::FieldMatrix<K,1,1> tmp(matrix);
58 Dune::FieldMatrix<K,2,2> tmp(matrix);
65 Dune::FieldMatrix<K,3,3> tmp(matrix);
71template <
template<
class K>
class Matrix,
typename K>
74 inverse[0][0] = matrix[1][1] * matrix[2][2] * matrix[3][3] -
75 matrix[1][1] * matrix[2][3] * matrix[3][2] -
76 matrix[2][1] * matrix[1][2] * matrix[3][3] +
77 matrix[2][1] * matrix[1][3] * matrix[3][2] +
78 matrix[3][1] * matrix[1][2] * matrix[2][3] -
79 matrix[3][1] * matrix[1][3] * matrix[2][2];
81 inverse[1][0] = -matrix[1][0] * matrix[2][2] * matrix[3][3] +
82 matrix[1][0] * matrix[2][3] * matrix[3][2] +
83 matrix[2][0] * matrix[1][2] * matrix[3][3] -
84 matrix[2][0] * matrix[1][3] * matrix[3][2] -
85 matrix[3][0] * matrix[1][2] * matrix[2][3] +
86 matrix[3][0] * matrix[1][3] * matrix[2][2];
88 inverse[2][0] = matrix[1][0] * matrix[2][1] * matrix[3][3] -
89 matrix[1][0] * matrix[2][3] * matrix[3][1] -
90 matrix[2][0] * matrix[1][1] * matrix[3][3] +
91 matrix[2][0] * matrix[1][3] * matrix[3][1] +
92 matrix[3][0] * matrix[1][1] * matrix[2][3] -
93 matrix[3][0] * matrix[1][3] * matrix[2][1];
95 inverse[3][0] = -matrix[1][0] * matrix[2][1] * matrix[3][2] +
96 matrix[1][0] * matrix[2][2] * matrix[3][1] +
97 matrix[2][0] * matrix[1][1] * matrix[3][2] -
98 matrix[2][0] * matrix[1][2] * matrix[3][1] -
99 matrix[3][0] * matrix[1][1] * matrix[2][2] +
100 matrix[3][0] * matrix[1][2] * matrix[2][1];
102 inverse[0][1]= -matrix[0][1] * matrix[2][2] * matrix[3][3] +
103 matrix[0][1] * matrix[2][3] * matrix[3][2] +
104 matrix[2][1] * matrix[0][2] * matrix[3][3] -
105 matrix[2][1] * matrix[0][3] * matrix[3][2] -
106 matrix[3][1] * matrix[0][2] * matrix[2][3] +
107 matrix[3][1] * matrix[0][3] * matrix[2][2];
109 inverse[1][1] = matrix[0][0] * matrix[2][2] * matrix[3][3] -
110 matrix[0][0] * matrix[2][3] * matrix[3][2] -
111 matrix[2][0] * matrix[0][2] * matrix[3][3] +
112 matrix[2][0] * matrix[0][3] * matrix[3][2] +
113 matrix[3][0] * matrix[0][2] * matrix[2][3] -
114 matrix[3][0] * matrix[0][3] * matrix[2][2];
116 inverse[2][1] = -matrix[0][0] * matrix[2][1] * matrix[3][3] +
117 matrix[0][0] * matrix[2][3] * matrix[3][1] +
118 matrix[2][0] * matrix[0][1] * matrix[3][3] -
119 matrix[2][0] * matrix[0][3] * matrix[3][1] -
120 matrix[3][0] * matrix[0][1] * matrix[2][3] +
121 matrix[3][0] * matrix[0][3] * matrix[2][1];
123 inverse[3][1] = matrix[0][0] * matrix[2][1] * matrix[3][2] -
124 matrix[0][0] * matrix[2][2] * matrix[3][1] -
125 matrix[2][0] * matrix[0][1] * matrix[3][2] +
126 matrix[2][0] * matrix[0][2] * matrix[3][1] +
127 matrix[3][0] * matrix[0][1] * matrix[2][2] -
128 matrix[3][0] * matrix[0][2] * matrix[2][1];
130 inverse[0][2] = matrix[0][1] * matrix[1][2] * matrix[3][3] -
131 matrix[0][1] * matrix[1][3] * matrix[3][2] -
132 matrix[1][1] * matrix[0][2] * matrix[3][3] +
133 matrix[1][1] * matrix[0][3] * matrix[3][2] +
134 matrix[3][1] * matrix[0][2] * matrix[1][3] -
135 matrix[3][1] * matrix[0][3] * matrix[1][2];
137 inverse[1][2] = -matrix[0][0] * matrix[1][2] * matrix[3][3] +
138 matrix[0][0] * matrix[1][3] * matrix[3][2] +
139 matrix[1][0] * matrix[0][2] * matrix[3][3] -
140 matrix[1][0] * matrix[0][3] * matrix[3][2] -
141 matrix[3][0] * matrix[0][2] * matrix[1][3] +
142 matrix[3][0] * matrix[0][3] * matrix[1][2];
144 inverse[2][2] = matrix[0][0] * matrix[1][1] * matrix[3][3] -
145 matrix[0][0] * matrix[1][3] * matrix[3][1] -
146 matrix[1][0] * matrix[0][1] * matrix[3][3] +
147 matrix[1][0] * matrix[0][3] * matrix[3][1] +
148 matrix[3][0] * matrix[0][1] * matrix[1][3] -
149 matrix[3][0] * matrix[0][3] * matrix[1][1];
151 inverse[3][2] = -matrix[0][0] * matrix[1][1] * matrix[3][2] +
152 matrix[0][0] * matrix[1][2] * matrix[3][1] +
153 matrix[1][0] * matrix[0][1] * matrix[3][2] -
154 matrix[1][0] * matrix[0][2] * matrix[3][1] -
155 matrix[3][0] * matrix[0][1] * matrix[1][2] +
156 matrix[3][0] * matrix[0][2] * matrix[1][1];
158 inverse[0][3] = -matrix[0][1] * matrix[1][2] * matrix[2][3] +
159 matrix[0][1] * matrix[1][3] * matrix[2][2] +
160 matrix[1][1] * matrix[0][2] * matrix[2][3] -
161 matrix[1][1] * matrix[0][3] * matrix[2][2] -
162 matrix[2][1] * matrix[0][2] * matrix[1][3] +
163 matrix[2][1] * matrix[0][3] * matrix[1][2];
165 inverse[1][3] = matrix[0][0] * matrix[1][2] * matrix[2][3] -
166 matrix[0][0] * matrix[1][3] * matrix[2][2] -
167 matrix[1][0] * matrix[0][2] * matrix[2][3] +
168 matrix[1][0] * matrix[0][3] * matrix[2][2] +
169 matrix[2][0] * matrix[0][2] * matrix[1][3] -
170 matrix[2][0] * matrix[0][3] * matrix[1][2];
172 inverse[2][3] = -matrix[0][0] * matrix[1][1] * matrix[2][3] +
173 matrix[0][0] * matrix[1][3] * matrix[2][1] +
174 matrix[1][0] * matrix[0][1] * matrix[2][3] -
175 matrix[1][0] * matrix[0][3] * matrix[2][1] -
176 matrix[2][0] * matrix[0][1] * matrix[1][3] +
177 matrix[2][0] * matrix[0][3] * matrix[1][1];
179 inverse[3][3] = matrix[0][0] * matrix[1][1] * matrix[2][2] -
180 matrix[0][0] * matrix[1][2] * matrix[2][1] -
181 matrix[1][0] * matrix[0][1] * matrix[2][2] +
182 matrix[1][0] * matrix[0][2] * matrix[2][1] +
183 matrix[2][0] * matrix[0][1] * matrix[1][2] -
184 matrix[2][0] * matrix[0][2] * matrix[1][1];
186 return matrix[0][0] * inverse[0][0] + matrix[0][1] * inverse[1][0] +
187 matrix[0][2] * inverse[2][0] + matrix[0][3] * inverse[3][0];
204template <
template<
class K>
class Matrix,
typename K>
207 const K det = adjugateMatrix4<Matrix, K>(matrix, inverse);
209 if (std::abs(det) < 1e-40) {
214 catch (
const Dune::FMatrixError&) {
215 inverse = std::numeric_limits<K>::quiet_NaN();
216 DUNE_THROW(Dune::MatrixBlockError,
"Singular matrix block");
220 inverse *= 1.0 / det;
226template<
class K>
using FMat4 = Dune::FieldMatrix<K,4,4>;
232 invertMatrix4<FMat4>(tmp, matrix);
243 if (matrix.rows() == 4) {
244 Dune::DynamicMatrix<K> A = matrix;
254template <
class Scalar,
int n,
int m>
260 using BaseType::operator= ;
261 using BaseType::rows;
262 using BaseType::cols;
276 {
return static_cast<const BaseType&
>(*this); }
279 {
return static_cast<BaseType&
>(*this); }
286template<
class K,
int n,
int m>
288 typename FieldMatrix<K, n, m>::size_type I,
289 typename FieldMatrix<K, n, m>::size_type J,
290 typename FieldMatrix<K, n, m>::size_type therow,
295template <
typename Scalar,
int n,
int m>
296struct MatrixDimension<
Opm::MatrixBlock<Scalar, n, m> >
297 :
public MatrixDimension<typename Opm::MatrixBlock<Scalar, n, m>::BaseType>
301#if HAVE_SUITESPARSE_UMFPACK
305template <
typename T,
typename A,
int n,
int m>
306class UMFPack<BCRSMatrix<
Opm::MatrixBlock<T, n, m>, A> >
307 :
public UMFPack<BCRSMatrix<FieldMatrix<T, n, m>, A> >
310 using Matrix = BCRSMatrix<FieldMatrix<T, n, m>, A>;
313 using RealMatrix = BCRSMatrix<Opm::MatrixBlock<T, n, m>, A>;
315 UMFPack(
const RealMatrix& matrix,
int verbose,
bool)
316 : Base(reinterpret_cast<const Matrix&>(matrix), verbose)
325template <
typename T,
typename A,
int n,
int m>
326class SuperLU<BCRSMatrix<
Opm::MatrixBlock<T, n, m>, A> >
327 :
public SuperLU<BCRSMatrix<FieldMatrix<T, n, m>, A> >
329 using Base = SuperLU<BCRSMatrix<FieldMatrix<T, n, m>, A> >;
330 using Matrix = BCRSMatrix<FieldMatrix<T, n, m>, A>;
333 using RealMatrix = BCRSMatrix<Opm::MatrixBlock<T, n, m>, A>;
335 SuperLU(
const RealMatrix& matrix,
int verb,
bool reuse=
true)
336 : Base(reinterpret_cast<const Matrix&>(matrix), verb, reuse)
341template<
typename T,
int n,
int m>
342struct IsNumber<
Opm::MatrixBlock<T, n, m>>
343 :
public IsNumber<Dune::FieldMatrix<T,n,m>>
346template<
typename T,
int n,
int m>
347struct FieldTraits<
Opm::MatrixBlock<T, n, m>>
348 :
public FieldTraits<Dune::FieldMatrix<T,n,m>>
Definition: MSWellHelpers.hpp:29
Definition: matrixblock.hh:256
void invert()
Definition: matrixblock.hh:272
BaseType & asBase()
Definition: matrixblock.hh:278
const BaseType & asBase() const
Definition: matrixblock.hh:275
MatrixBlock()
Definition: matrixblock.hh:264
Dune::FieldMatrix< Scalar, n, m > BaseType
Definition: matrixblock.hh:258
MatrixBlock(const Scalar value)
Definition: matrixblock.hh:268
Definition: fvbaseprimaryvariables.hh:161
void print_row(std::ostream &s, const Opm::MatrixBlock< K, n, m > &A, typename FieldMatrix< K, n, m >::size_type I, typename FieldMatrix< K, n, m >::size_type J, typename FieldMatrix< K, n, m >::size_type therow, int width, int precision)
Definition: matrixblock.hh:287
static void invertMatrix(Dune::FieldMatrix< K, m, n > &matrix)
Definition: matrixblock.hh:43
static K adjugateMatrix4(const Matrix< K > &matrix, Matrix< K > &inverse)
Definition: matrixblock.hh:72
static K invertMatrix4(const Matrix< K > &matrix, Matrix< K > &inverse)
Definition: matrixblock.hh:205
Dune::FieldMatrix< K, 4, 4 > FMat4
Definition: matrixblock.hh:226
static void invertMatrix(Dune::DynamicMatrix< K > &matrix)
Definition: matrixblock.hh:236
Definition: blackoilbioeffectsmodules.hh:45