void SpinAdapted::diagonalise(Matrix& sym, DiagonalMatrix& d, Matrix& vec) { int nrows = sym.Nrows(); int ncols = sym.Ncols(); assert(nrows == ncols); d.ReSize(nrows); vec.ReSize(nrows, nrows); Matrix workmat; workmat = sym; vector<double> workquery(1); int info = 0; double* dptr = d.Store(); int query = -1; DSYEV('V', 'L', nrows, workmat.Store(), nrows, dptr, &(workquery[0]), query, info); // do query to find best size int optlength = static_cast<int>(workquery[0]); vector<double> workspace(optlength); DSYEV('V', 'U', nrows, workmat.Store(), nrows, dptr, &(workspace[0]), optlength, info); // do query to find best size if (info > 0) { pout << "failed to converge " << endl; abort(); } for (int i = 0; i < nrows; ++i) for (int j = 0; j < ncols; ++j) vec(j+1,i+1) = workmat(i+1,j+1); }
/* DSYEV computes all eigenvalues and, optionally, eigenvectors of a * real symmetric matrix A. */ void wrap_dsyev(char jobz, char uplo, int n, double *a, int lda, double *w, int *info) { #ifdef HAVE_ACML DSYEV(jobz, uplo, n, a, lda, w, info); #else int lwork=-1; double work1; DSYEV(&jobz, &uplo, &n, a, &lda, w, &work1, &lwork, info); ASSERT(*info==0); ASSERT(work1>0); lwork=(int) work1; double* work=new double[lwork]; DSYEV(&jobz, &uplo, &n, a, &lda, w, work, &lwork, info); delete[] work; #endif }
void Diagonalize(double *pEw, double *pH, uint ldH, uint N) { FORTINT info = 0, nWork = 128*N; double *pWork = (double*)::malloc(sizeof(double)*nWork); DSYEV('V', 'L', N, pH, ldH, pEw, pWork, nWork, info ); ::free(pWork); if ( info != 0 ) throw std::runtime_error("dsyev failed."); };
void ProtoMol::Lapack::dsyev(char *jobz, char *uplo, int *n, double *a, int *lda, double *w, double *work, int *lwork, int *info) { FAHCheckIn(); #if defined(HAVE_LAPACK) dsyev_(jobz, uplo, n, a, lda, w, work, lwork, info); #elif defined(HAVE_SIMTK_LAPACK) dsyev_(*jobz, *uplo, *n, a, *lda, w, work, *lwork, *info); #elif defined(HAVE_MKL_LAPACK) DSYEV(jobz, uplo, n, a, lda, w, work, lwork, info); #else THROW(std::string(__func__) + " not supported"); #endif }
inline static void f( char * JOBZ, char * UPLO, INTEGER * N, double * A, INTEGER * LDA, double * W, double * WORK, INTEGER * LWORK, INTEGER * INFO) { DSYEV( JOBZ, UPLO, N, A, LDA, W, WORK, LWORK, INFO ); }