/*
DFT++ is a density functional package developed by the research group
of Professor Tomas Arias
Copyright 1996-2003 Sohrab Ismail-Beigi
This file is part of DFT++.
DFT++ is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
DFT++ is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with DFT++; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Please see the file CREDITS for a list of authors.
For academic users, we request that publications using results obtained with
this software reference
"New algebraic formulation of density functional calculation," by Sohrab Ismail-Beigi
and T.A. Arias, Computer Physics Communications 128:1-2, 1-45 (June 2000).
and, if using the wavelet basis, further reference
"Multiresolution analysis of electronic structure: semicardinal and wavelet bases,"
T.A. Arias, Reviews of Modern Physics 71:1, 267-311 (January 1999).
and
"Robust ab initio calculation of condensed matter: transparent convergence through
semicardinal multiresolution analysis,'' I.P. Daykov, T.A. Arias, and
Torkel D. Engeness, Physical Review Letters, 90:21, 216402 (May 2003).
For your convenience, preprints of the above articles may be obtained from
http://arXiv.org/abs/cond-mat/9909130, 9805262, and 0204411, respectively.
*/
/*
* Sohrab Ismail-Beigi, April 8 1997
*
* This file contains C to FORTRAN 77 interface routines for diagonalization
* via LAPACK/ESSL routines. Clearly machine dependent, so have fun!
*
*/
#include "header.h"
#if defined DFT_USE_LAPACK
extern "C" void zheev_(char *JOBZ,char *UPLO,int *N,complex *evecs,
int *LDA,real *eigs,complex *WORK,int *LWORK,
complex *RWORK,int *INFO);
int diagch77_C(real *eigs,complex *evecs,complex *A,int *n)
{
/* Parameter values:
Note that LWORK (workspace size) has 2*(*n)-1 as absolute min,
but might give better performance if given more space */
char JOBZ='V',UPLO='U';
int N=*n,LDA=*n,LWORK=4*(*n);
int INFO;
/* Workspace */
complex *RWORK,*WORK;
/* Sanity checks */
if (sizeof(real)!=sizeof(double))
die("Trying to call double precision LAPACK routine with floats!\n\n");
/* Allocate/verify workspace */
if ( (RWORK=(complex *)malloc(sizeof(complex)*LWORK))==NULL )
die("Unable to allocate workspace in diagch77_C: %d",LWORK);
if ( (WORK=(complex *)malloc(sizeof(complex)*LWORK))==NULL )
die("Unable to allocate workspace in diagch77_C: %d",LWORK);
/* Copy *complex* input into LAPACK in/out data space */
for (int i=0; i<N*N; i++)
evecs[i]=A[i];
zheev_(&JOBZ,&UPLO,&N,evecs,&LDA,eigs,WORK,&LWORK,RWORK,&INFO);
if(INFO!=0)
die("Lapack routine zheev_ exited with error code %d.\n",INFO);
free(WORK);
free(RWORK);
return 0;
}
extern "C" void dsyev_(char *JOBZ,char *UPLO,int *N,real *evecs,
int *LDA,real *eigs,real *WORK,int *LWORK,
int *INFO);
int diagrs77_C(real *eigs,real *evecs,real *A,int *n)
{
/* Parameter values:
Note that LWORK (workspace size) has 3*(*n)-1 as absolute min,
but might give better performance if given more space */
char JOBZ='V',UPLO='U';
int N=*n,LDA=*n,LWORK=6*(*n);
int INFO;
/* Workspace */
real *WORK;
/* Sanity checks */
if (sizeof(real)!=sizeof(double))
die("Trying to call double precision LAPACK routine with floats!\n\n");
/* Allocate/verify workspace */
if ( (WORK=(real *)malloc(sizeof(real)*LWORK))==NULL )
die("Unable to allocate workspace in diagrs77_C: %d",LWORK);
/* Copy input into LAPACK in/out data space */
for (int i=0; i<N*N; i++)
evecs[i]=A[i];
dsyev_(&JOBZ,&UPLO,&N,evecs,&LDA,eigs,WORK,&LWORK,&INFO);
if(INFO!=0)
die("Lapack routine dsyev_ exited with error code %d.\n",INFO);
free(WORK);
return 0;
}
#elif defined DFT_USE_JACOBI
#else
#error got to use some scientific library, Lapack, Essl, ...
#endif
syntax highlighted by Code2HTML, v. 0.9.1