about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorPjotr Prins2018-08-25 06:40:10 +0000
committerPjotr Prins2018-08-25 06:40:10 +0000
commitd8928658e81082a0ad00e6d02103e85173e41339 (patch)
treeec84a46ae6869c25335392c0c2b2838357722974 /src
parent70f419673d5d3e49a3eada70c70c2d284b502d7b (diff)
downloadpangemma-d8928658e81082a0ad00e6d02103e85173e41339.tar.gz
eigenvalues: some error checking added
Diffstat (limited to 'src')
-rw-r--r--src/lapack.cpp19
1 files changed, 8 insertions, 11 deletions
diff --git a/src/lapack.cpp b/src/lapack.cpp
index d15446b..187daa8 100644
--- a/src/lapack.cpp
+++ b/src/lapack.cpp
@@ -147,7 +147,7 @@ void lapack_dgemm(char *TransA, char *TransB, double alpha, const gsl_matrix *A,
 // 'eval'. Also returns matrix 'evec' (U).
 void lapack_eigen_symmv(gsl_matrix *A, gsl_vector *eval, gsl_matrix *evec,
                         const size_t flag_largematrix) {
-  if (flag_largematrix == 1) {
+  if (flag_largematrix == 1) { // not sure this flag is used!
     int N = A->size1, LDA = A->size1, INFO, LWORK = -1;
     char JOBZ = 'V', UPLO = 'L';
 
@@ -172,6 +172,7 @@ void lapack_eigen_symmv(gsl_matrix *A, gsl_vector *eval, gsl_matrix *evec,
 
     delete[] WORK;
   } else {
+    // entering here
     int N = A->size1, LDA = A->size1, LDZ = A->size1, INFO;
     int LWORK = -1, LIWORK = -1;
     char JOBZ = 'V', UPLO = 'L', RANGE = 'A';
@@ -192,14 +193,14 @@ void lapack_eigen_symmv(gsl_matrix *A, gsl_vector *eval, gsl_matrix *evec,
     double WORK_temp[1];
     int IWORK_temp[1];
 
+    // DSYEVR - computes selected eigenvalues and, optionally,
+    // eigenvectors of a real symmetric matrix
+    // Here compute both (JOBZ is V), all eigenvalues (RANGE is A)
+    // Lower triangle is stored (UPLO is L)
     dsyevr_(&JOBZ, &RANGE, &UPLO, &N, A->data, &LDA, &VL, &VU, &IL, &IU,
             &ABSTOL, &M, eval->data, evec->data, &LDZ, ISUPPZ, WORK_temp,
             &LWORK, IWORK_temp, &LIWORK, &INFO);
-    if (INFO != 0) {
-      cout << "Work space estimate unsuccessful in "
-           << "lapack_eigen_symmv." << endl;
-      return;
-    }
+    enforce_msg(INFO != 0, "lapack_eigen_symmv failed");
     LWORK = (int)WORK_temp[0];
     LIWORK = (int)IWORK_temp[0];
 
@@ -209,11 +210,7 @@ void lapack_eigen_symmv(gsl_matrix *A, gsl_vector *eval, gsl_matrix *evec,
     dsyevr_(&JOBZ, &RANGE, &UPLO, &N, A->data, &LDA, &VL, &VU, &IL, &IU,
             &ABSTOL, &M, eval->data, evec->data, &LDZ, ISUPPZ, WORK, &LWORK,
             IWORK, &LIWORK, &INFO);
-    if (INFO != 0) {
-      cout << "Eigen decomposition unsuccessful in "
-           << "lapack_eigen_symmv." << endl;
-      return;
-    }
+    enforce_msg(INFO != 0, "lapack_eigen_symmv failed");
 
     gsl_matrix_transpose(evec);