Exemple #1
0
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);
}
Exemple #2
0
/*  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
}
Exemple #3
0
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.");
};
Exemple #4
0
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 );
 }