Macaulay2 Engine
Loading...
Searching...
No Matches

◆ eigenvalues_hermitian() [1/2]

bool Lapack::eigenvalues_hermitian ( const DMatCC * A,
DMatRR * eigenvals )
static

Definition at line 1366 of file lapack.cpp.

1367{
1368 int size = static_cast<int>(A->numRows());
1369 if (size != static_cast<int>(A->numColumns()))
1370 {
1371 ERROR("expected a square matrix");
1372 return false;
1373 }
1374
1375 if (size == 0)
1376 {
1377 eigvals->resize(0, 1);
1378 return true;
1379 }
1380
1381 bool ret = true;
1382 char dont = 'N';
1383 char triangle = 'U'; /* Upper triangular part makes symmetric matrix. */
1384
1385 int wsize = 2 * size - 1;
1386 double *workspace = new double[2*wsize];
1387 double *rwork = new double[3 * size - 2];
1388 int info;
1389
1390 std::vector<double> copyA = make_lapack_array(*A);
1391 std::vector<double> evals(size);
1392
1393 zheev_(&dont,
1394 &triangle,
1395 &size,
1396 copyA.data(),
1397 &size,
1398 evals.data(),
1399 workspace,
1400 &wsize,
1401 rwork,
1402 &info);
1403
1404 if (info < 0)
1405 {
1406 ERROR("argument passed to zheev had an illegal value");
1407 ret = false;
1408 }
1409 else if (info > 0)
1410 {
1411 ERROR("zheev did not converge");
1412 ret = false;
1413 }
1414 else
1415 {
1416 eigvals->resize(size, 1);
1417 fill_from_lapack_array(evals, *eigvals);
1418 }
1419
1420 delete[] workspace;
1421 delete[] rwork;
1422
1423 return ret;
1424}
size_t numRows() const
Definition dmat.hpp:144
size_t numColumns() const
Definition dmat.hpp:145
std::vector< double > make_lapack_array(const DMatRR &mat)
Definition lapack.cpp:20
void fill_from_lapack_array(const std::vector< double > &doubles, DMatRR &mat)
Definition lapack.cpp:45
int zheev_(char *n, char *n2, int *size, double *M, int *lda, double *eig, double *w, int *wsize, double *rwork, int *info)
const int ERROR
Definition m2-mem.cpp:55

References ERROR, fill_from_lapack_array(), make_lapack_array(), DMat< ACoeffRing >::numColumns(), DMat< ACoeffRing >::numRows(), DMat< ACoeffRing >::resize(), and zheev_().