Skip to content

Commit

Permalink
Stub out and implement solve on EigenSolver class.
Browse files Browse the repository at this point in the history
  • Loading branch information
dsteinmo committed Jan 22, 2018
1 parent 9a502a7 commit 747d17a
Show file tree
Hide file tree
Showing 2 changed files with 78 additions and 0 deletions.
19 changes: 19 additions & 0 deletions include/EigenSolver.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
#pragma once
#include <blitz/array.h>
#include <SparseMatrixConverter.hpp>

using namespace blitz;

class EigenSolver {
int N;
Array<double, 2> * A;
SparseMatrixConverter MatrixConverter;

public:
EigenSolver(Array<double, 2> * const &, SparseMatrixConverter const &);

void solve(Array<double,1> & eigenvalues, Array<double, 2> & eigenvectors);

~EigenSolver();
};

59 changes: 59 additions & 0 deletions src/EigenSolver.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
#include <EigenSolver.hpp>

/**
* Constructor. Takes a pointer reference to a blitz 2D array (The matrix A to be used by the solver in Ax=λx).
*/
EigenSolver::EigenSolver(Array<double, 2> * const & Ain, SparseMatrixConverter const & _matrixConverter) {
A = Ain;
MatrixConverter = _matrixConverter;
}

extern "C" {
void dsyevd_( char* jobz, char* uplo, int* n, double* a, int* lda,
double* w, double* work, int* lwork, int* iwork, int* liwork, int* info );
}

/**
* Solve Ax=λx using LAPACK. Eigenvalues are stored in reference 'eigenvalues' and eigenvectors are stored column-wise
* in reference 'eigenvectors.'
*/
void EigenSolver::solve(Array<double,1> & eigenvalues, Array<double, 2> & eigenvectors) {
Array<double,2> Aref = *A;

int sz = Aref.rows();
int lda = sz;
int iwkopt;

double ww[sz];
double wkopt;
int lwork = -1;
int liwork = -1;
int info;

char JOBZ = 'V';
char UPLO[] = "UP";

double * Apod = new double[sz*lda];

MatrixConverter.fullToPodArray(Aref, Apod);

/* Determining optimal workspace parameters */
dsyevd_( &JOBZ, UPLO, &sz, Apod, &lda, ww, &wkopt, &lwork, &iwkopt, &liwork, &info );

lwork = (int)wkopt;
double * work = new double[lwork];
liwork = iwkopt;
int * iwork = new int[liwork];

/* Solve eigenproblem */
dsyevd_( &JOBZ, UPLO, &sz, Apod, &lda, ww, work, &lwork, iwork, &liwork, &info );

MatrixConverter.podArrayToFull(Apod, eigenvectors);

for (int i=0; i < sz; i++)
eigenvalues(i) = ww[i];
}

EigenSolver::~EigenSolver() {

}

0 comments on commit 747d17a

Please sign in to comment.