18 #include "petscblaslapack.h" 23 inverse(
const std::vector<std::vector<Real>> & m, std::vector<std::vector<Real>> & m_inv)
25 unsigned int n = m.size();
29 throw MooseException(
"Input matrix empty during matrix inversion.");
30 if (n != m_inv.size() || n != m[0].size() || n != m_inv[0].size())
31 throw MooseException(
"Input and output matrix are not same size square matrices.");
34 std::vector<PetscScalar> A;
35 for (
const auto & rowvec : m)
36 for (
const auto & matrix_entry : rowvec)
37 A.push_back(matrix_entry);
43 for (
auto & rowvec : m_inv)
44 for (
auto & inv_entry : rowvec)
49 inverse(std::vector<PetscScalar> & A,
unsigned int n)
51 mooseAssert(n >= 1,
"MatrixTools::inverse - n (leading dimension) needs to be positive");
53 "MatrixTools::inverse - n (leading dimension) too large");
55 std::vector<PetscBLASInt> ipiv(n);
56 std::vector<PetscScalar> buffer(n * 64);
61 PetscBLASInt return_value;
62 LAPACKgetrf_(reinterpret_cast<PetscBLASInt *>(&n),
63 reinterpret_cast<PetscBLASInt *>(&n),
65 reinterpret_cast<PetscBLASInt *>(&n),
69 if (return_value != 0)
73 " was invalid during LU factorization in MatrixTools::inverse." 75 " was exactly zero during LU factorization in MatrixTools::inverse.");
78 PetscBLASInt buffer_size = buffer.size();
79 LAPACKgetri_(reinterpret_cast<PetscBLASInt *>(&n),
81 reinterpret_cast<PetscBLASInt *>(&n),
87 if (return_value != 0)
90 " was invalid during invert in MatrixTools::inverse." 92 " was exactly zero during invert in MatrixTools::inverse.");
auto max(const L &left, const R &right)
std::string stringify(const T &t)
conversion to string
Provides a way for users to bail out of the current solve.