50 std::vector<T> &real_part_eigenvalues,
51 std::vector<T> &imag_part_eigenvalues,
52 std::vector<T> &left_eigenvectors,
53 std::vector<T> &right_eigenvectors,
54 std::vector<T> &real_work,
59 static_assert(std::is_same_v<T, double> || std::is_same_v<T, float>,
60 "Only implemented for double and float");
61 Assert(
matrix.size() ==
static_cast<std::size_t
>(n_rows * n_rows),
63 Assert(
static_cast<std::size_t
>(n_rows) <= real_part_eigenvalues.size(),
65 Assert(
static_cast<std::size_t
>(n_rows) <= imag_part_eigenvalues.size(),
68 Assert(
static_cast<std::size_t
>(n_rows * n_rows) <=
69 left_eigenvectors.size(),
72 Assert(
static_cast<std::size_t
>(n_rows * n_rows) <=
73 right_eigenvectors.size(),
76 static_cast<std::size_t
>(2 *
n_rows) <= real_work.size(),
85 real_part_eigenvalues.data(),
86 imag_part_eigenvalues.data(),
87 left_eigenvectors.data(),
89 right_eigenvectors.data(),
106 std::vector<std::complex<T>> &left_eigenvectors,
107 std::vector<std::complex<T>> &right_eigenvectors,
108 std::vector<std::complex<T>> &complex_work,
109 std::vector<T> &real_work,
114 std::is_same_v<T, double> || std::is_same_v<T, float>,
115 "Only implemented for std::complex<double> and std::complex<float>");
116 Assert(
matrix.size() ==
static_cast<std::size_t
>(n_rows * n_rows),
121 Assert(
static_cast<std::size_t
>(n_rows * n_rows) <=
122 left_eigenvectors.size(),
125 Assert(
static_cast<std::size_t
>(n_rows * n_rows) <=
126 right_eigenvectors.size(),
140 left_eigenvectors.data(),
142 right_eigenvectors.data(),
152 template <
typename T>
158 std::vector<T> &singular_values,
161 std::vector<T> &real_work,
163 std::vector<types::blas_int> &integer_work,
167 Assert(job ==
'A' || job ==
'S' || job ==
'O' || job ==
'N',
176 static_cast<std::size_t
>(work_flag) <= real_work.size(),
183 singular_values.data(),
186 right_vectors.
data(),
196 template <
typename T>
202 std::vector<T> &singular_values,
205 std::vector<std::complex<T>> &work,
206 std::vector<T> &real_work,
207 std::vector<types::blas_int> &integer_work,
211 Assert(job ==
'A' || job ==
'S' || job ==
'O' || job ==
'N',
216 singular_values.size(),
221 static_cast<std::size_t
>(work_flag) <= real_work.size(),
229 singular_values.data(),
232 right_vectors.
data(),
245template <
typename number>
254template <
typename number>
263template <
typename number>
272template <
typename number>
284template <
typename number>
294template <
typename number>
303 (*
this)(i, j) = copy(i, j);
308template <
typename number>
311 const std::array<number, 3> &csr,
324 const number t =
A(i, j);
325 A(i, j) = csr[0] *
A(i, j) + csr[1] *
A(k, j);
326 A(k, j) = -csr[1] * t + csr[0] *
A(k, j);
333 const number t =
A(j, i);
334 A(j, i) = csr[0] *
A(j, i) + csr[1] *
A(j, k);
335 A(j, k) = -csr[1] * t + csr[0] *
A(j, k);
342template <
typename number>
358 const size_type jj = (j < col ? j : j + 1);
361 const size_type ii = (i < row ? i : i + 1);
362 (*this)(i, j) = copy(ii, jj);
369template <
typename number>
379template <
typename number>
380template <
typename number2>
388 (*
this)(i, j) = M(i, j);
397template <
typename number>
398template <
typename number2>
406 (*
this)(i, j) = M.
el(i, j);
415template <
typename number>
430template <
typename number>
439 const char type =
'G';
440 const number cfrom = 1.;
447 number *
values = this->values.data();
449 lascl(&type, &kl, &kl, &cfrom, &factor, &
m, &
n,
values, &lda, &info);
459template <
typename number>
470 const char type =
'G';
471 const number cto = 1.;
478 number *
values = this->values.data();
480 lascl(&type, &kl, &kl, &factor, &cto, &
m, &
n,
values, &lda, &info);
490template <
typename number>
508 number *
values = this->values.data();
509 const number *values_A =
A.values.data();
518 template <
typename number>
547 const std::array<number, 3> csr =
553 const number t =
A(i, k);
554 A(i, k) = csr[0] *
A(i, k) + csr[1] * z(i);
555 z(i) = -csr[1] * t + csr[0] * z(i);
590 const std::array<number, 3> csr =
596 const number t =
A(i, k);
597 A(i, k) = csr[0] *
A(i, k) - csr[1] * z(i);
598 z(i) = -csr[1] * t + csr[0] * z(i);
605 template <
typename number>
608 const std::complex<number> ,
609 const Vector<std::complex<number>> & )
617template <
typename number>
636 syr(&uplo, &
N, &a, v.
begin(), &incx, this->values.begin(), &lda);
645 (*
this)(i, j) = (*
this)(j, i);
649 cholesky_rank1(*
this, a, v);
657template <
typename number>
661 const bool adding)
const
665 const number alpha = 1.;
666 const number beta = (adding ? 1. : 0.);
667 const number null = 0.;
678 const char diag =
'N';
679 const char trans =
'N';
690 &uplo, &trans, &diag, &
N, this->values.data(), &lda, w.data(), &incx);
718 std::lock_guard<std::mutex> lock(
mutex);
742 svd_u->values.data(),
753 std::lock_guard<std::mutex> lock(mutex);
762 svd_u->values.data(),
770 for (size_type i = 0; i < wr.size(); ++i)
777 svd_vt->values.data(),
793template <
typename number>
797 const bool adding)
const
801 const number alpha = 1.;
802 const number beta = (adding ? 1. : 0.);
803 const number null = 0.;
814 const char diag =
'N';
815 const char trans =
'T';
826 &uplo, &trans, &diag, &
N, this->values.data(), &lda, w.data(), &incx);
855 std::lock_guard<std::mutex> lock(mutex);
865 svd_u->values.data(),
891 std::lock_guard<std::mutex> lock(mutex);
901 svd_vt->values.data(),
909 for (size_type i = 0; i < wr.size(); ++i)
916 svd_u->values.data(),
932template <
typename number>
942template <
typename number>
952template <
typename number>
956 const bool adding)
const
967 const number alpha = 1.;
968 const number beta = (adding ? 1. : 0.);
987template <
typename number>
991 const bool adding)
const
1001 const number alpha = 1.;
1002 const number beta = (adding ? 1. : 0.);
1014 this->values.data(),
1023template <
typename number>
1028 const bool adding)
const
1050 std::lock_guard<std::mutex> lock(
mutex);
1052 work.resize(kk * nn);
1061 work[j * kk + i] =
V(i) * B(i, j);
1065 const number alpha = 1.;
1066 const number beta = (adding ? 1. : 0.);
1074 this->values.data(),
1085template <
typename number>
1094#ifdef DEAL_II_LAPACK_WITH_MKL
1095 const number
one = 1.;
1106template <
typename number>
1123template <
typename number>
1127 const bool adding)
const
1138 const number alpha = 1.;
1139 const number beta = (adding ? 1. : 0.);
1148 this->values.data(),
1169 this->values.data(),
1181template <
typename number>
1185 const bool adding)
const
1195 const number alpha = 1.;
1196 const number beta = (adding ? 1. : 0.);
1208 this->values.data(),
1217template <
typename number>
1221 const bool adding)
const
1232 const number alpha = 1.;
1233 const number beta = (adding ? 1. : 0.);
1242 this->values.data(),
1263 this->values.data(),
1275template <
typename number>
1279 const bool adding)
const
1289 const number alpha = 1.;
1290 const number beta = (adding ? 1. : 0.);
1302 this->values.data(),
1311template <
typename number>
1315 const bool adding)
const
1326 const number alpha = 1.;
1327 const number beta = (adding ? 1. : 0.);
1335 this->values.data(),
1346template <
typename number>
1350 const bool adding)
const
1360 const number alpha = 1.;
1361 const number beta = (adding ? 1. : 0.);
1373 this->values.data(),
1382template <
typename number>
1391 number *
const values = this->values.data();
1406template <
typename number>
1415template <
typename number>
1419 const char type(
'O');
1425template <
typename number>
1429 const char type(
'I');
1435template <
typename number>
1439 const char type(
'F');
1445template <
typename number>
1449 std::lock_guard<std::mutex> lock(
mutex);
1453 ExcMessage(
"norms can be called in matrix state only."));
1457 const number *
const values = this->values.data();
1478template <
typename number>
1484 ExcMessage(
"Trace can be called in matrix state only."));
1489 tr += (*
this)(i, i);
1496template <
typename number>
1508 number *
const values = this->values.data();
1522template <
typename number>
1526 std::lock_guard<std::mutex> lock(
mutex);
1531 const number *
values = this->values.data();
1555template <
typename number>
1559 std::lock_guard<std::mutex> lock(
mutex);
1565 const number *
const values = this->values.data();
1571 const char norm =
'1';
1572 const char diag =
'N';
1593template <
typename number>
1603 std::fill(
wr.begin(),
wr.end(), 0.);
1604 ipiv.resize(8 * mm);
1606 svd_u = std::make_unique<LAPACKFullMatrix<number>>(mm, mm);
1607 svd_vt = std::make_unique<LAPACKFullMatrix<number>>(nn, nn);
1615 std::vector<typename numbers::NumberTraits<number>::real_type> real_work;
1619 std::size_t min =
std::min(this->
m(), this->n());
1620 std::size_t max =
std::max(this->
m(), this->n());
1622 std::max(5 * min * min + 5 * min, 2 * max * min + 2 * min * min + min));
1670template <
typename number>
1680 const double lim =
std::abs(
wr[0]) * threshold;
1693template <
typename number>
1696 const unsigned int kernel_size)
1704 const unsigned int n_wr =
wr.size();
1705 for (
size_type i = 0; i < n_wr - kernel_size; ++i)
1707 for (
size_type i = n_wr - kernel_size; i < n_wr; ++i)
1714template <
typename number>
1723 number *
const values = this->values.data();
1746 this->
el(i, j) = this->
el(j, i);
1757template <
typename number>
1763 const char *trans = transposed ? &
T : &
N;
1765 const number *
const values = this->values.data();
1786 &uplo, trans,
"N", &nn, &n_rhs,
values, &lda, v.
begin(), &ldb, &info);
1792 "The matrix has to be either factorized or triangular."));
1800template <
typename number>
1803 const bool transposed)
const
1809 const char *trans = transposed ? &
T : &
N;
1811 const number *
const values = this->values.data();
1860 "The matrix has to be either factorized or triangular."));
1868template <
typename number>
1900template <
typename number>
1915 const char jobvr = (right) ?
V :
N;
1916 const char jobvl = (left) ?
V :
N;
1930 std::vector<typename numbers::NumberTraits<number>::real_type> real_work;
1933 real_work.resize(2 * this->
m());
1956 real_work.resize(lwork);
1977 std::to_string(-info) +
1979 " parameter had an illegal value."));
1986 "Lapack error in geev: the QR algorithm failed to compute "
1987 "all the eigenvalues, and no eigenvectors have been computed."));
2005 template <
typename RealNumber>
2007 unpack_lapack_eigenvector_and_increment_index(
2008 const std::vector<RealNumber> &vr,
2009 const std::complex<RealNumber> &eigenvalue,
2010 FullMatrix<std::complex<RealNumber>> &result,
2011 unsigned int &index)
2013 const std::size_t n = result.n();
2014 if (eigenvalue.imag() != 0.)
2016 for (std::size_t j = 0; j < n; ++j)
2018 result(j, index).real(vr[index * n + j]);
2019 result(j, index + 1).real(vr[index * n + j]);
2020 result(j, index).imag(vr[(index + 1) * n + j]);
2021 result(j, index + 1).imag(-vr[(index + 1) * n + j]);
2030 for (
unsigned int j = 0; j < n; ++j)
2031 result(j, index).real(vr[index * n + j]);
2040 template <
typename ComplexNumber>
2042 unpack_lapack_eigenvector_and_increment_index(
2043 const std::vector<ComplexNumber> &vr,
2044 const ComplexNumber &,
2046 unsigned int &index)
2048 const std::size_t n = result.
n();
2049 for (
unsigned int j = 0; j < n; ++j)
2050 result(j, index) = vr[
index * n + j];
2059template <
typename number>
2064 Assert(
vr.size() == this->n_rows() * this->n_cols(),
2065 ExcMessage(
"Right eigenvectors are not available! Did you "
2066 "set the associated flag in compute_eigenvalues()?"));
2071 for (
unsigned int i = 0; i <
n();)
2072 unpack_lapack_eigenvector_and_increment_index(
vr,
eigenvalue(i), result, i);
2079template <
typename number>
2084 Assert(
vl.size() == this->n_rows() * this->n_cols(),
2085 ExcMessage(
"Left eigenvectors are not available! Did you "
2086 "set the associated flag in compute_eigenvalues()?"));
2091 for (
unsigned int i = 0; i <
n();)
2092 unpack_lapack_eigenvector_and_increment_index(
vl,
eigenvalue(i), result, i);
2099template <
typename number>
2102 const number lower_bound,
2103 const number upper_bound,
2104 const number abs_accuracy,
2115 number *
const values_A = this->values.data();
2116 number *
const values_eigenvectors = matrix_eigenvectors.
values.
data();
2119 const char *
const jobz(&
V);
2120 const char *
const uplo(&
U);
2121 const char *
const range(&
V);
2123 std::vector<types::blas_int>
iwork(
static_cast<size_type>(5 * nn));
2124 std::vector<types::blas_int> ifail(
static_cast<size_type>(nn));
2151 values_eigenvectors,
2180 values_eigenvectors,
2194 std::to_string(-info) +
2196 " parameter had an illegal value."));
2198 else if ((info > 0) && (info <= nn))
2202 "Lapack error in syevx: " + std::to_string(info) +
2203 " eigenvectors failed to converge."
2204 " (You may need to scale the abs_accuracy according"
2205 " to your matrix norm.)"));
2210 ExcMessage(
"Lapack error in syevx: unknown error."));
2216 for (
size_type i = 0; i < static_cast<size_type>(n_eigenpairs); ++i)
2220 for (
size_type j = 0; j < static_cast<size_type>(nn); ++j)
2222 eigenvectors(j, i) = values_eigenvectors[col_begin + j];
2231template <
typename number>
2235 const number lower_bound,
2236 const number upper_bound,
2237 const number abs_accuracy,
2251 number *
const values_A = this->values.data();
2253 number *
const values_eigenvectors = matrix_eigenvectors.
values.
data();
2256 const char *
const jobz(&
V);
2257 const char *
const uplo(&
U);
2258 const char *
const range(&
V);
2261 std::vector<types::blas_int> ifail(
static_cast<size_type>(nn));
2291 values_eigenvectors,
2325 values_eigenvectors,
2339 std::to_string(-info) +
2341 " parameter had an illegal value."));
2343 else if ((info > 0) && (info <= nn))
2348 "Lapack error in sygvx: ssyevx/dsyevx failed to converge, and " +
2349 std::to_string(info) +
2350 " eigenvectors failed to converge."
2351 " (You may need to scale the abs_accuracy"
2352 " according to the norms of matrices A and B.)"));
2354 else if ((info > nn) && (info <= 2 * nn))
2358 "Lapack error in sygvx: the leading minor of order " +
2359 std::to_string(info - nn) +
2360 " of matrix B is not positive-definite."
2361 " The factorization of B could not be completed and"
2362 " no eigenvalues or eigenvectors were computed."));
2367 ExcMessage(
"Lapack error in sygvx: unknown error."));
2373 for (
size_type i = 0; i < static_cast<size_type>(n_eigenpairs); ++i)
2378 for (
size_type j = 0; j < static_cast<size_type>(nn); ++j)
2380 eigenvectors[i](j) = values_eigenvectors[col_begin + j];
2389template <
typename number>
2402 ExcMessage(
"eigenvectors.size() > matrix.n()"));
2408 number *
const values_A = this->values.data();
2413 const char *
const jobz = (
eigenvectors.size() > 0) ? (&
V) : (&
N);
2414 const char *
const uplo = (&
U);
2469 std::to_string(-info) +
2471 " parameter had an illegal value."));
2473 else if ((info > 0) && (info <= nn))
2478 "Lapack error in sygv: ssyev/dsyev failed to converge, and " +
2479 std::to_string(info) +
2480 " off-diagonal elements of an intermediate "
2481 " tridiagonal did not converge to zero."
2482 " (You may need to scale the abs_accuracy"
2483 " according to the norms of matrices A and B.)"));
2485 else if ((info > nn) && (info <= 2 * nn))
2489 "Lapack error in sygv: the leading minor of order " +
2490 std::to_string(info - nn) +
2491 " of matrix B is not positive-definite."
2492 " The factorization of B could not be completed and"
2493 " no eigenvalues or eigenvectors were computed."));
2498 ExcMessage(
"Lapack error in sygv: unknown error."));
2505 for (
size_type j = 0; j < static_cast<size_type>(nn); ++j)
2515template <
typename number>
2518 const unsigned int precision,
2519 const bool scientific,
2520 const unsigned int width_,
2521 const char *zero_string,
2522 const double denominator,
2523 const double threshold,
2524 const char *separator)
const
2526 unsigned int width = width_;
2536 std::ios::fmtflags old_flags = out.flags();
2537 std::streamsize old_precision = out.precision(precision);
2541 out.setf(std::ios::scientific, std::ios::floatfield);
2543 width = precision + 7;
2547 out.setf(std::ios::fixed, std::ios::floatfield);
2549 width = precision + 2;
2560 out << std::setw(width) << (*this)(i, j) << separator;
2561 else if (
std::abs(this->
el(i, j)) > threshold)
2562 out << std::setw(width) << this->
el(i, j) * denominator << separator;
2564 out << std::setw(width) << zero_string << separator;
2570 out.flags(old_flags);
2571 out.precision(old_precision);
2576template <
typename number>
2586template <
typename number>
2595template <
typename number>
2605template <
typename number>
2611 matrix->solve(dst,
false);
2615template <
typename number>
2621 matrix->solve(dst,
true);
2625template <
typename number>
2633 matrix->solve(*aux,
false);
2638template <
typename number>
2646 matrix->solve(*aux,
true);
2652#include "lac/lapack_full_matrix.inst"
void omatcopy(char, char, ::types::blas_int, ::types::blas_int, const number1, const number2 *, ::types::blas_int, number3 *, ::types::blas_int)
EnableObserverPointer & operator=(const EnableObserverPointer &)
LAPACKFullMatrix< number > & operator*=(const number factor)
number reciprocal_condition_number() const
void Tmmult(LAPACKFullMatrix< number > &C, const LAPACKFullMatrix< number > &B, const bool adding=false) const
void scale_rows(const Vector< number > &V)
FullMatrix< std::complex< typename numbers::NumberTraits< number >::real_type > > get_right_eigenvectors() const
void add(const number a, const LAPACKFullMatrix< number > &B)
void Tvmult(Vector< number2 > &w, const Vector< number2 > &v, const bool adding=false) const
void transpose(LAPACKFullMatrix< number > &B) const
void mTmult(LAPACKFullMatrix< number > &C, const LAPACKFullMatrix< number > &B, const bool adding=false) const
std::vector< typename numbers::NumberTraits< typename MatrixType::value_type >::real_type > wr
LAPACKSupport::State get_state() const
void compute_eigenvalues_symmetric(const number lower_bound, const number upper_bound, const number abs_accuracy, Vector< number > &eigenvalues, FullMatrix< number > &eigenvectors)
void vmult(Vector< number2 > &w, const Vector< number2 > &v, const bool adding=false) const
void reinit(const size_type size)
void compute_cholesky_factorization()
LAPACKFullMatrix< number > & operator=(const LAPACKFullMatrix< number > &)
void compute_lu_factorization()
FullMatrix< std::complex< typename numbers::NumberTraits< number >::real_type > > get_left_eigenvectors() const
std::unique_ptr< LAPACKFullMatrix< typename MatrixType::value_type > > svd_vt
std::vector< typename MatrixType::value_type > work
void grow_or_shrink(const size_type size)
void apply_givens_rotation(const std::array< number, 3 > &csr, const size_type i, const size_type k, const bool left=true)
void set_property(const LAPACKSupport::Property property)
std::complex< typename numbers::NumberTraits< number >::real_type > eigenvalue(const size_type i) const
number norm(const char type) const
void solve(Vector< number > &v, const bool transposed=false) const
void compute_eigenvalues(const bool right_eigenvectors=false, const bool left_eigenvectors=false)
LAPACKSupport::State state
std::make_unsigned_t< types::blas_int > size_type
std::vector< number > inv_work
number frobenius_norm() const
LAPACKFullMatrix(const size_type size=0)
LAPACKSupport::Property property
void compute_inverse_svd(const double threshold=0.)
void compute_generalized_eigenvalues_symmetric(LAPACKFullMatrix< number > &B, const number lower_bound, const number upper_bound, const number abs_accuracy, Vector< number > &eigenvalues, std::vector< Vector< number > > &eigenvectors, const types::blas_int itype=1)
void vmult_add(Vector< number2 > &w, const Vector< number2 > &v) const
number linfty_norm() const
void TmTmult(LAPACKFullMatrix< number > &C, const LAPACKFullMatrix< number > &B, const bool adding=false) const
std::unique_ptr< LAPACKFullMatrix< typename MatrixType::value_type > > svd_u
std::vector< typename MatrixType::value_type > vr
void compute_inverse_svd_with_kernel(const unsigned int kernel_size)
void Tvmult_add(Vector< number2 > &w, const Vector< number2 > &v) const
std::vector< types::blas_int > iwork
void rank1_update(const number a, const Vector< number > &v)
std::vector< types::blas_int > ipiv
void remove_row_and_column(const size_type row, const size_type col)
LAPACKFullMatrix< number > & operator/=(const number factor)
number determinant() const
std::vector< typename MatrixType::value_type > vl
void mmult(LAPACKFullMatrix< number > &C, const LAPACKFullMatrix< number > &B, const bool adding=false) const
void print_formatted(std::ostream &out, const unsigned int precision=3, const bool scientific=true, const unsigned int width=0, const char *zero_string=" ", const double denominator=1., const double threshold=0., const char *separator=" ") const
void vmult(Vector< number > &, const Vector< number > &) const
void initialize(const LAPACKFullMatrix< number > &)
void Tvmult(Vector< number > &, const Vector< number > &) const
ObserverPointer< VectorMemory< Vector< number > >, PreconditionLU< number > > mem
ObserverPointer< const LAPACKFullMatrix< number >, PreconditionLU< number > > matrix
number el(const size_type i, const size_type j) const
AlignedVector< number > values
size_type n_elements() const
void reinit(const size_type size1, const size_type size2, const bool omit_default_initialization=false)
reference el(const size_type i, const size_type j)
virtual size_type size() const override
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_NAMESPACE_CLOSE
static ::ExceptionBase & ExcIO()
static ::ExceptionBase & ExcZero()
static ::ExceptionBase & ExcNotImplemented()
static ::ExceptionBase & ExcErrorCode(std::string arg1, types::blas_int arg2)
static ::ExceptionBase & ExcScalarAssignmentOnlyForZeroValue()
static ::ExceptionBase & ExcProperty(Property arg1)
#define Assert(cond, exc)
static ::ExceptionBase & ExcSingular()
#define AssertIsFinite(number)
#define AssertDimension(dim1, dim2)
#define AssertIndexRange(index, range)
static ::ExceptionBase & ExcInternalError()
static ::ExceptionBase & ExcDimensionMismatch(std::size_t arg1, std::size_t arg2)
static ::ExceptionBase & ExcNotInitialized()
static ::ExceptionBase & ExcNotQuadratic()
static ::ExceptionBase & ExcInvalidState()
static ::ExceptionBase & ExcMessage(std::string arg1)
static ::ExceptionBase & ExcState(State arg1)
#define AssertThrow(cond, exc)
void getrs(const char *, const ::types::blas_int *, const ::types::blas_int *, const number1 *, const ::types::blas_int *, const ::types::blas_int *, number2 *, const ::types::blas_int *, ::types::blas_int *)
void syrk(const char *, const char *, const ::types::blas_int *, const ::types::blas_int *, const number1 *, const number2 *, const ::types::blas_int *, const number3 *, number4 *, const ::types::blas_int *)
void geev(const char *, const char *, const ::types::blas_int *, number1 *, const ::types::blas_int *, number2 *, number3 *, number4 *, const ::types::blas_int *, number5 *, const ::types::blas_int *, number6 *, const ::types::blas_int *, ::types::blas_int *)
void gemm(const char *, const char *, const ::types::blas_int *, const ::types::blas_int *, const ::types::blas_int *, const number1 *, const number2 *, const ::types::blas_int *, const number3 *, const ::types::blas_int *, const number4 *, number5 *, const ::types::blas_int *)
void pocon(const char *, const ::types::blas_int *, const number1 *, const ::types::blas_int *, const number2 *, number3 *, number4 *, ::types::blas_int *, ::types::blas_int *)
void lascl(const char *, const ::types::blas_int *, const ::types::blas_int *, const number1 *, const number2 *, const ::types::blas_int *, const ::types::blas_int *, number3 *, const ::types::blas_int *, ::types::blas_int *)
void syr(const char *, const ::types::blas_int *, const number1 *, const number2 *, const ::types::blas_int *, number3 *, const ::types::blas_int *)
void trtrs(const char *, const char *, const char *, const ::types::blas_int *, const ::types::blas_int *, const number1 *, const ::types::blas_int *, number2 *, const ::types::blas_int *, ::types::blas_int *)
void syevx(const char *, const char *, const char *, const ::types::blas_int *, number1 *, const ::types::blas_int *, const number2 *, const number3 *, const ::types::blas_int *, const ::types::blas_int *, const number4 *, ::types::blas_int *, number5 *, number6 *, const ::types::blas_int *, number7 *, const ::types::blas_int *, ::types::blas_int *, ::types::blas_int *, ::types::blas_int *)
void trcon(const char *, const char *, const char *, const ::types::blas_int *, const number1 *, const ::types::blas_int *, number2 *, number3 *, ::types::blas_int *, ::types::blas_int *)
void gesdd(const char *, const ::types::blas_int *, const ::types::blas_int *, number1 *, const ::types::blas_int *, number2 *, number3 *, const ::types::blas_int *, number4 *, const ::types::blas_int *, number5 *, const ::types::blas_int *, ::types::blas_int *, ::types::blas_int *)
void axpy(const ::types::blas_int *, const number1 *, const number2 *, const ::types::blas_int *, number3 *, const ::types::blas_int *)
void trmv(const char *, const char *, const char *, const ::types::blas_int *, const number1 *, const ::types::blas_int *, number2 *, const ::types::blas_int *)
void sygvx(const ::types::blas_int *, const char *, const char *, const char *, const ::types::blas_int *, number1 *, const ::types::blas_int *, number2 *, const ::types::blas_int *, const number3 *, const number4 *, const ::types::blas_int *, const ::types::blas_int *, const number5 *, ::types::blas_int *, number6 *, number7 *, const ::types::blas_int *, number8 *, const ::types::blas_int *, ::types::blas_int *, ::types::blas_int *, ::types::blas_int *)
void gemv(const char *, const ::types::blas_int *, const ::types::blas_int *, const number1 *, const number2 *, const ::types::blas_int *, const number3 *, const ::types::blas_int *, const number4 *, number5 *, const ::types::blas_int *)
number1 lange(const char *, const ::types::blas_int *, const ::types::blas_int *, const number1 *, const ::types::blas_int *, number2 *)
void potrs(const char *, const ::types::blas_int *, const ::types::blas_int *, const number1 *, const ::types::blas_int *, number2 *, const ::types::blas_int *, ::types::blas_int *)
void sygv(const ::types::blas_int *, const char *, const char *, const ::types::blas_int *, number1 *, const ::types::blas_int *, number2 *, const ::types::blas_int *, number3 *, number4 *, const ::types::blas_int *, ::types::blas_int *)
void potri(const char *, const ::types::blas_int *, number1 *, const ::types::blas_int *, ::types::blas_int *)
number1 lansy(const char *, const char *, const ::types::blas_int *, const number1 *, const ::types::blas_int *, number2 *)
void potrf(const char *, const ::types::blas_int *, number1 *, const ::types::blas_int *, ::types::blas_int *)
void getrf(const ::types::blas_int *, const ::types::blas_int *, number1 *, const ::types::blas_int *, ::types::blas_int *, ::types::blas_int *)
void getri(const ::types::blas_int *, number1 *, const ::types::blas_int *, const ::types::blas_int *, number2 *, const ::types::blas_int *, ::types::blas_int *)
@ cholesky
Contents is a Cholesky decomposition.
@ lu
Contents is an LU decomposition.
@ matrix
Contents is actually a matrix.
@ unusable
Contents is something useless.
@ inverse_matrix
Contents is the inverse of a matrix.
@ svd
Matrix contains singular value decomposition,.
@ inverse_svd
Matrix is the inverse of a singular value decomposition.
@ eigenvalues
Eigenvalue vector is filled.
@ symmetric
Matrix is symmetric.
@ upper_triangular
Matrix is upper triangular.
@ lower_triangular
Matrix is lower triangular.
@ general
No special properties.
constexpr types::blas_int one
std::array< NumberType, 3 > givens_rotation(const NumberType &x, const NumberType &y)
std::array< NumberType, 3 > hyperbolic_rotation(const NumberType &x, const NumberType &y)
void gesdd_helper(const char job, const types::blas_int n_rows, const types::blas_int n_cols, AlignedVector< T > &matrix, std::vector< T > &singular_values, AlignedVector< T > &left_vectors, AlignedVector< T > &right_vectors, std::vector< T > &real_work, std::vector< T > &, std::vector< types::blas_int > &integer_work, const types::blas_int work_flag, types::blas_int &info)
void geev_helper(const char vl, const char vr, AlignedVector< T > &matrix, const types::blas_int n_rows, std::vector< T > &real_part_eigenvalues, std::vector< T > &imag_part_eigenvalues, std::vector< T > &left_eigenvectors, std::vector< T > &right_eigenvectors, std::vector< T > &real_work, std::vector< T > &, const types::blas_int work_flag, types::blas_int &info)
bool is_nan(const double x)
::VectorizedArray< Number, width > min(const ::VectorizedArray< Number, width > &, const ::VectorizedArray< Number, width > &)
::VectorizedArray< Number, width > max(const ::VectorizedArray< Number, width > &, const ::VectorizedArray< Number, width > &)
::VectorizedArray< Number, width > sqrt(const ::VectorizedArray< Number, width > &)
::VectorizedArray< Number, width > abs(const ::VectorizedArray< Number, width > &)
static bool equal(const T *p1, const T *p2)
static constexpr const number & conjugate(const number &x)
static constexpr bool is_complex
std::array< std::pair< Number, Tensor< 1, dim, Number > >, dim > eigenvectors(const SymmetricTensor< 2, dim, Number > &T, const SymmetricTensorEigenvectorMethod method=SymmetricTensorEigenvectorMethod::ql_implicit_shifts)