28 #include "../config.h" 39 #include <mkl_cblas.h> 46 #define F77_DZNRM2 F77_FUNC(dznrm2, DZNRM2) 47 #define F77_ZDSCAL F77_FUNC(zdscal, ZDSCAL) 48 #define F77_ZDOTC F77_FUNC(zdotc, ZDOTC) 49 #define F77_ZGEMV F77_FUNC(zgemv, ZGEMV) 50 #define F77_ZAXPY F77_FUNC(zaxpy, ZAXPY) 52 extern "C" double F77_DZNRM2(
const int*
N,
const void* X,
const int* INC);
53 extern "C" void F77_ZDSCAL(
const int*
N,
double* ALPHA,
const void* X,
const int* INC);
57 extern "C" std::complex<double>
F77_ZDOTC(
const int*
N,
const void* X,
const int*
INCX,
const void* Y,
const int*
INCY);
61 std::complex<double>* alpha,
66 std::complex<double>* beta,
70 extern "C" void F77_ZAXPY(
const int*
N, std::complex<double>* ALPHA,
void* X,
int*
INCX,
void* Y,
int*
INCY);
82 inline double norm(
const zVec& c) {
return cblas_dznrm2(c.
size(), c.
data(), 1); }
86 std::complex<double> z;
87 cblas_zdotc_sub(cA.
size(), cA.
data(), 1, cB.
data(), 1, &z);
95 assert(
n == x.
size());
96 std::complex<double> zero(0.0, 0.0);
97 std::complex<double> one(1.0, 0.0);
98 std::complex<double> minusone(-1.0, 0.0);
102 cblas_zgemv(CblasColMajor, CblasConjTrans,
n,
m, &one,
A.data(),
n, x.
data(), 1, &zero, S.data(), 1);
103 cblas_zgemv(CblasRowMajor, CblasTrans,
m,
n, &minusone,
A.data(),
n, S.data(), 1, &one, x.
data(), 1);
129 const int n = cA.
size();
143 assert(
n == x.
size());
144 std::complex<double> zero(0.0, 0.0);
145 std::complex<double> one(1.0, 0.0);
146 std::complex<double> minusone(-1.0, 0.0);
155 F77_ZGEMV(&trans, &
n, &
m, &one,
A.data(), &
n, x.
data(), &inc, &zero, S.
data(), &inc);
166 F77_ZGEMV(&trans, &
m, &
n, &minusone,
A.data(), &
n, S.
data(), &inc, &one, x.
data(), &inc);
176 inline double mag(std::complex<double> x) {
return (x.real() * x.real() + x.imag() * x.imag()); }
182 assert(
n == x.
size());
186 for (
int row = 0; row <= lastBand; row++)
191 for (
int row = 0; row <= lastBand; row++)
209 assert(
n == x.
size());
212 #ifndef __INTEL_COMPILER 213 std::complex<double> S[
m];
214 for (
int row = 0; row <
m; row++)
219 for (
int row = 0; row <
m; row++)
220 if (row != excluding)
224 double Sre[
m], Sim[
m];
226 for (
int row = 0; row <
m; row++)
229 std::complex<double> S =
conjdot(Ar, x);
233 for (
int row = 0; row <
m; row++)
234 if (row != excluding)
235 x -= std::complex<double>(Sre[row], Sim[row]) *
A(row,
Range::all());
244 assert(
n == x.
size());
246 std::complex<double> S;
248 for (
int row = 0; row <
m; row++)
260 for (
int i = 0; i <
A.rows(); i++)
264 for (
int j = i + 1; j <
A.rows(); j++)
277 for (
int iter = 0; iter < 40; iter++)
279 for (
int i = 0; i <
A.rows(); i++)
282 for (
int j = i + 1; j <
A.rows(); j++)
287 for (
int j = i + 1; j <
A.rows(); j++)
301 double normInv = 1.0 /
norm(x);
302 for (
int i = 0; i <
A.rows(); i++)
307 std::cerr <<
"CheckOrthog failed for i=" << i <<
".\n";
313 inline void zaxpy(std::complex<double> alpha,
314 const Array<std::complex<double>, 1>& x,
315 const std::complex<double> y,
void GramSchmidt(Array< std::complex< double >, 2 > &A)
double realconjdot(zVec &cA, zVec &cB)
void CheckOrthog(const Array< std::complex< double >, 2 > &A, zVec &x)
void OrthogExcluding(const Array< std::complex< double >, 2 > &A, zVec &x, int excluding)
std::complex< double > conjdot(zVec &cA, zVec &cB)
double mag(std::complex< double > x)
float imag(const float &c)
imaginary part of a scalar. Cannot be replaced by std::imag due to AFQMC specific needs...
double norm(const zVec &c)
void Orthogonalize(const Array< std::complex< double >, 2 > &A, zVec &x)
void zaxpy(std::complex< double > alpha, const Array< std::complex< double >, 1 > &x, const std::complex< double > y, Array< std::complex< double >, 1 > &axpy)
void Orthogonalize2(Array< std::complex< double >, 2 > &A, zVec &x, int lastBand)
static void axpy(int n, double x, const double *a, double *b)
void OrthogLower(const Array< std::complex< double >, 2 > &A, zVec &x, int currBand)
A D-dimensional Array class based on PETE.