34 std::vector<Real>& eigenvals,
38 assert(
A.rows() ==
A.cols());
39 assert(Nl == eigenvals.size());
40 assert(Nl == eigenvectors.
rows());
41 assert(Nl == eigenvectors.
cols());
44 for (
int i = 0; i < Nl; i++)
45 for (
int j = i + 1; j < Nl; j++)
47 std::swap(
A(i, j),
A(j, i));
48 std::swap(
B(i, j),
B(j, i));
54 std::vector<Real> alphar(Nl), alphai(Nl), beta(Nl);
58 std::vector<Real> work(1);
61 LAPACK::ggev(&jl, &jr, &Nl,
A.data(), &Nl,
B.data(), &Nl, alphar.data(), alphai.data(), beta.data(), &tt, &t,
62 eigenvectors.
data(), &Nl, work.data(), &lwork, &info);
66 LAPACK::ggev(&jl, &jr, &Nl,
A.data(), &Nl,
B.data(), &Nl, alphar.data(), alphai.data(), beta.data(), &tt, &t,
67 eigenvectors.
data(), &Nl, work.data(), &lwork, &info);
69 throw std::runtime_error(
"Invalid Matrix Diagonalization Function, ggev info = " + std::to_string(info));
71 for (
int i = 0; i < Nl; i++)
72 eigenvals[i] = alphar[i] / beta[i];
80 std::vector<Real>& eigenvals,
84 assert(
A.rows() ==
A.cols());
85 assert(Nl == eigenvals.size());
86 assert(Nl == eigenvectors.
rows());
87 assert(Nl == eigenvectors.
cols());
96 for (
int i = 0; i < Nl; i++)
97 for (
int j = i + 1; j < Nl; j++)
98 std::swap(prdMat(i, j), prdMat(j, i));
103 std::vector<Real> alphai(Nl);
107 std::vector<Real> work(1);
108 LAPACK::geev(&jl, &jr, &Nl, prdMat.
data(), &Nl, eigenvals.data(), alphai.data(), eigenD.
data(), &Nl,
109 eigenvectors.
data(), &Nl, work.data(), &lwork, &info);
110 lwork = int(work[0]);
113 LAPACK::geev(&jl, &jr, &Nl, prdMat.
data(), &Nl, eigenvals.data(), alphai.data(), eigenD.
data(), &Nl,
114 eigenvectors.
data(), &Nl, work.data(), &lwork, &info);
116 throw std::runtime_error(
"Invalid Matrix Diagonalization Function, geev info = " + std::to_string(info));
MatrixA::value_type invert_matrix(MatrixA &M, bool getdet=true)
invert a matrix
static void ggev(char *jobvl, char *jobvr, int *n, double *a, int *lda, double *b, int *ldb, double *alphar, double *alphai, double *beta, double *vl, int *ldvl, double *vr, int *ldvr, double *work, int *lwork, int *info)
helper functions for EinsplineSetBuilder
static void solveGeneralizedEigenvalues(Matrix< Real > &A, Matrix< Real > &B, std::vector< Real > &eigenvals, Matrix< Real > &eigenvectors)
Use generalized eigenvalue solver.
static void solveGeneralizedEigenvalues_Inv(Matrix< Real > &A, Matrix< Real > &B, std::vector< Real > &eigenvals, Matrix< Real > &eigenvectors)
Solve by explicitly inverting the overlap matrix.
void product(const Matrix< T > &A, const Matrix< T > &B, Matrix< T > &C)
static function to perform C=AB for real matrices
Define determinant operators.
double B(double x, int k, int i, const std::vector< double > &t)
static void geev(char *jobvl, char *jobvr, int *n, double *a, int *lda, double *alphar, double *alphai, double *vl, int *ldvl, double *vr, int *ldvr, double *work, int *lwork, int *info)