QMCPACK
VectorOps.h File Reference
+ Include dependency graph for VectorOps.h:

Go to the source code of this file.

Macros

#define F77_DZNRM2   F77_FUNC(dznrm2, DZNRM2)
 
#define F77_ZDSCAL   F77_FUNC(zdscal, ZDSCAL)
 
#define F77_ZDOTC   F77_FUNC(zdotc, ZDOTC)
 
#define F77_ZGEMV   F77_FUNC(zgemv, ZGEMV)
 
#define F77_ZAXPY   F77_FUNC(zaxpy, ZAXPY)
 

Typedefs

using Int3 = TinyVector< int, 3 >
 
using zVec = Array< std::complex< double >, 1 >
 
using zVecVec = Array< cVec3, 1 >
 
using zMatVec = Array< cMat3, 1 >
 

Functions

double F77_DZNRM2 (const int *N, const void *X, const int *INC)
 
void F77_ZDSCAL (const int *N, double *ALPHA, const void *X, const int *INC)
 
std::complex< double > F77_ZDOTC (const int *N, const void *X, const int *INCX, const void *Y, const int *INCY)
 
void F77_ZGEMV (char *TRANS, const int *M, const int *N, std::complex< double > *alpha, const void *A, const int *LDA, const void *X, const int *INCX, std::complex< double > *beta, const void *Y, const int *INCY)
 
void F77_ZAXPY (const int *N, std::complex< double > *ALPHA, void *X, int *INCX, void *Y, int *INCY)
 
void Normalize (zVec &c)
 
double norm (const zVec &c)
 
std::complex< double > conjdot (zVec &cA, zVec &cB)
 
void Orthogonalize (const Array< std::complex< double >, 2 > &A, zVec &x)
 
double realconjdot (zVec &cA, zVec &cB)
 
double mag (std::complex< double > x)
 
void Orthogonalize2 (Array< std::complex< double >, 2 > &A, zVec &x, int lastBand)
 
void OrthogExcluding (const Array< std::complex< double >, 2 > &A, zVec &x, int excluding)
 
void OrthogLower (const Array< std::complex< double >, 2 > &A, zVec &x, int currBand)
 
void GramSchmidt (Array< std::complex< double >, 2 > &A)
 
void Orthogonalize (Array< std::complex< double >, 2 > &A)
 
void CheckOrthog (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)
 

Macro Definition Documentation

◆ F77_DZNRM2

#define F77_DZNRM2   F77_FUNC(dznrm2, DZNRM2)

Definition at line 46 of file VectorOps.h.

Referenced by norm(), and Normalize().

◆ F77_ZAXPY

#define F77_ZAXPY   F77_FUNC(zaxpy, ZAXPY)

Definition at line 50 of file VectorOps.h.

◆ F77_ZDOTC

#define F77_ZDOTC   F77_FUNC(zdotc, ZDOTC)

Definition at line 48 of file VectorOps.h.

Referenced by conjdot().

◆ F77_ZDSCAL

#define F77_ZDSCAL   F77_FUNC(zdscal, ZDSCAL)

Definition at line 47 of file VectorOps.h.

Referenced by Normalize().

◆ F77_ZGEMV

#define F77_ZGEMV   F77_FUNC(zgemv, ZGEMV)

Definition at line 49 of file VectorOps.h.

Referenced by Orthogonalize().

Typedef Documentation

◆ Int3

using Int3 = TinyVector<int, 3>

Definition at line 30 of file VectorOps.h.

◆ zMatVec

using zMatVec = Array<cMat3, 1>

Definition at line 33 of file VectorOps.h.

◆ zVec

using zVec = Array<std::complex<double>, 1>

Definition at line 31 of file VectorOps.h.

◆ zVecVec

using zVecVec = Array<cVec3, 1>

Definition at line 32 of file VectorOps.h.

Function Documentation

◆ CheckOrthog()

void CheckOrthog ( const Array< std::complex< double >, 2 > &  A,
zVec x 
)
inline

Definition at line 298 of file VectorOps.h.

References qmcplusplus::Units::distance::A, Range::all(), conjdot(), qmcplusplus::Units::charge::e, mag(), and norm().

299 {
300  zVec Ai;
301  double normInv = 1.0 / norm(x);
302  for (int i = 0; i < A.rows(); i++)
303  {
304  Ai.reference(A(i, Range::all()));
305  if (normInv * mag(conjdot(Ai, x)) > 1.0e-13)
306  {
307  std::cerr << "CheckOrthog failed for i=" << i << ".\n";
308  exit(1);
309  }
310  }
311 }
std::complex< double > conjdot(zVec &cA, zVec &cB)
Definition: VectorOps.h:127
double mag(std::complex< double > x)
Definition: VectorOps.h:176
double norm(const zVec &c)
Definition: VectorOps.h:118
static auto all()
Definition: Blitz.h:176
A D-dimensional Array class based on PETE.
Definition: OhmmsArray.h:25

◆ conjdot()

std::complex<double> conjdot ( zVec cA,
zVec cB 
)
inline

Definition at line 127 of file VectorOps.h.

References Array< T, D, ALLOC >::data(), F77_ZDOTC, qmcplusplus::n, and Array< T, D, ALLOC >::size().

Referenced by CheckOrthog(), GramSchmidt(), OrthogExcluding(), OrthogLower(), Orthogonalize(), Orthogonalize2(), and realconjdot().

128 {
129  const int n = cA.size();
130  const int incA = 1;
131  const int incB = 1;
132  return F77_ZDOTC(&n, cA.data(), &incA, cB.data(), &incB);
133 
134  // std::complex<double> z;
135  // F77_ZDOTC (&z, &n, cA.data(), &incA, cB.data(), &incB);
136  // return z;
137 }
Type_t * data()
Definition: OhmmsArray.h:87
size_t size() const
Definition: OhmmsArray.h:57
#define F77_ZDOTC
Definition: VectorOps.h:48

◆ F77_DZNRM2()

double F77_DZNRM2 ( const int *  N,
const void *  X,
const int *  INC 
)

◆ F77_ZAXPY()

void F77_ZAXPY ( const int *  N,
std::complex< double > *  ALPHA,
void *  X,
int *  INCX,
void *  Y,
int *  INCY 
)

◆ F77_ZDOTC()

std::complex<double> F77_ZDOTC ( const int *  N,
const void *  X,
const int *  INCX,
const void *  Y,
const int *  INCY 
)

◆ F77_ZDSCAL()

void F77_ZDSCAL ( const int *  N,
double *  ALPHA,
const void *  X,
const int *  INC 
)

◆ F77_ZGEMV()

void F77_ZGEMV ( char *  TRANS,
const int *  M,
const int *  N,
std::complex< double > *  alpha,
const void *  A,
const int *  LDA,
const void *  X,
const int *  INCX,
std::complex< double > *  beta,
const void *  Y,
const int *  INCY 
)

◆ GramSchmidt()

void GramSchmidt ( Array< std::complex< double >, 2 > &  A)
inline

Definition at line 257 of file VectorOps.h.

References qmcplusplus::Units::distance::A, Range::all(), conjdot(), and Normalize().

258 {
259  zVec a, b;
260  for (int i = 0; i < A.rows(); i++)
261  {
262  a.reference(A(i, Range::all()));
263  Normalize(a);
264  for (int j = i + 1; j < A.rows(); j++)
265  {
266  b.reference(A(j, Range::all()));
267  b = b - (conjdot(a, b) * a);
268  Normalize(b);
269  }
270  }
271 }
std::complex< double > conjdot(zVec &cA, zVec &cB)
Definition: VectorOps.h:127
void Normalize(zVec &c)
Definition: VectorOps.h:108
static auto all()
Definition: Blitz.h:176
A D-dimensional Array class based on PETE.
Definition: OhmmsArray.h:25

◆ mag()

double mag ( std::complex< double >  x)
inline

Definition at line 176 of file VectorOps.h.

Referenced by CheckOrthog().

176 { return (x.real() * x.real() + x.imag() * x.imag()); }

◆ norm()

double norm ( const zVec c)
inline

Definition at line 118 of file VectorOps.h.

References Array< T, D, ALLOC >::data(), F77_DZNRM2, qmcplusplus::n, and Array< T, D, ALLOC >::size().

Referenced by EstimatorManagerBase::accumulate(), SODMCUpdatePbyPWithRejectionFast::advanceWalker(), SOVMCUpdatePbyP::advanceWalker(), VMCUpdatePbyP::advanceWalker(), DMCUpdatePbyPWithRejectionFast::advanceWalker(), DMCUpdatePbyPL2::advanceWalker(), CSVMCUpdatePbyP::advanceWalker(), VMCBatched::advanceWalkers(), DMCBatched::advanceWalkers(), RMCUpdatePbyPWithDrift::advanceWalkersRMC(), RMCUpdatePbyPWithDrift::advanceWalkersVMC(), NaNguard::checkOneParticleGradients(), NaNguard::checkOneParticleRatio(), CheckOrthog(), MPC::compute_g_G(), FiniteDifference::computeFiniteDiffRichardson(), SlaterDetBuilder::createMSDFast(), Eig(), EwaldHandler3D::evaldYkgstrain(), kSpaceJastrow::evaluateDerivatives(), ExampleHeComponent::evaluateLog(), kSpaceJastrow::evaluateLog(), kSpaceJastrow::evaluateRatiosAlltoOne(), LRHandlerSRCoulomb< Func, BreakupBasis >::evaluateSR_k0_dstrain(), SphericalTensor< T, Point_t, Tensor_t, GGG_t >::evaluateTest(), evaluateValueAndDerivative(), EwaldHandler3D::evalYkgstrain(), DiracParser::getSpinors(), MPC::init_spline(), DummyLRHandler< Func >::initBreakup(), syclSolverInverter< T_FP >::invert_transpose(), cuSolverInverter< T_FP >::invert_transpose(), rocSolverInverter< T_FP >::invert_transpose(), accumulator_set< FullPrecReal >::mean_and_variance(), Normalize(), kSpaceJastrow::ratio(), kSpaceJastrow::ratioGrad(), qmcplusplus::setScaledDriftPbyPandNodeCorr(), kSpaceJastrow::setupGvecs(), qmcplusplus::sphericalHarmonic(), qmcplusplus::sphericalHarmonicGrad(), qmcplusplus::TEST_CASE(), and accumulator_set< FullPrecReal >::variance().

119 {
120  double norm;
121  int n = c.size();
122  const int inc = 1;
123  return F77_DZNRM2(&n, c.data(), &inc);
124 }
Type_t * data()
Definition: OhmmsArray.h:87
double norm(const zVec &c)
Definition: VectorOps.h:118
size_t size() const
Definition: OhmmsArray.h:57
#define F77_DZNRM2
Definition: VectorOps.h:46

◆ Normalize()

void Normalize ( zVec c)
inline

Definition at line 108 of file VectorOps.h.

References Array< T, D, ALLOC >::data(), F77_DZNRM2, F77_ZDSCAL, qmcplusplus::n, norm(), and Array< T, D, ALLOC >::size().

Referenced by GramSchmidt(), and Orthogonalize().

109 {
110  const int inc = 1;
111  int n = c.size();
112  double norm = F77_DZNRM2(&n, c.data(), &inc);
113  norm = 1.0 / norm;
114  F77_ZDSCAL(&n, &norm, c.data(), &inc);
115 }
Type_t * data()
Definition: OhmmsArray.h:87
double norm(const zVec &c)
Definition: VectorOps.h:118
size_t size() const
Definition: OhmmsArray.h:57
#define F77_DZNRM2
Definition: VectorOps.h:46
#define F77_ZDSCAL
Definition: VectorOps.h:47

◆ OrthogExcluding()

void OrthogExcluding ( const Array< std::complex< double >, 2 > &  A,
zVec x,
int  excluding 
)
inline

Definition at line 205 of file VectorOps.h.

References qmcplusplus::Units::distance::A, Range::all(), conjdot(), qmcplusplus::imag(), qmcplusplus::Units::distance::m, qmcplusplus::n, and Array< T, D, ALLOC >::size().

206 {
207  int m = A.rows();
208  int n = A.cols();
209  assert(n == x.size());
210  zVec Ar;
211 
212 #ifndef __INTEL_COMPILER
213  std::complex<double> S[m];
214  for (int row = 0; row < m; row++)
215  {
216  Ar.reference(A(row, Range::all()));
217  S[row] = conjdot(Ar, x);
218  }
219  for (int row = 0; row < m; row++)
220  if (row != excluding)
221  x -= S[row] * A(row, Range::all());
222 #else
223 
224  double Sre[m], Sim[m];
225 
226  for (int row = 0; row < m; row++)
227  {
228  Ar.reference(A(row, Range::all()));
229  std::complex<double> S = conjdot(Ar, x);
230  Sre[row] = real(S);
231  Sim[row] = imag(S);
232  }
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());
236 #endif
237 }
QMCTraits::RealType real
std::complex< double > conjdot(zVec &cA, zVec &cB)
Definition: VectorOps.h:127
float imag(const float &c)
imaginary part of a scalar. Cannot be replaced by std::imag due to AFQMC specific needs...
size_t size() const
Definition: OhmmsArray.h:57
static auto all()
Definition: Blitz.h:176
A D-dimensional Array class based on PETE.
Definition: OhmmsArray.h:25

◆ OrthogLower()

void OrthogLower ( const Array< std::complex< double >, 2 > &  A,
zVec x,
int  currBand 
)
inline

Definition at line 240 of file VectorOps.h.

References qmcplusplus::Units::distance::A, Range::all(), conjdot(), qmcplusplus::Units::distance::m, qmcplusplus::n, and Array< T, D, ALLOC >::size().

241 {
242  int m = currBand;
243  int n = A.cols();
244  assert(n == x.size());
245  zVec Ar;
246  std::complex<double> S;
247 
248  for (int row = 0; row < m; row++)
249  {
250  Ar.reference(A(row, Range::all()));
251  S = conjdot(Ar, x);
252  x -= S * A(row, Range::all());
253  }
254 }
std::complex< double > conjdot(zVec &cA, zVec &cB)
Definition: VectorOps.h:127
size_t size() const
Definition: OhmmsArray.h:57
static auto all()
Definition: Blitz.h:176
A D-dimensional Array class based on PETE.
Definition: OhmmsArray.h:25

◆ Orthogonalize() [1/2]

void Orthogonalize ( const Array< std::complex< double >, 2 > &  A,
zVec x 
)
inline

Definition at line 139 of file VectorOps.h.

References qmcplusplus::Units::distance::A, Array< T, D, ALLOC >::data(), F77_ZGEMV, qmcplusplus::Units::distance::m, qmcplusplus::n, and Array< T, D, ALLOC >::size().

140 {
141  int m = A.rows();
142  int n = A.cols();
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);
148 
149  // Calculate overlaps
150  // Calling with column major and ConjTrans is equivalent to
151  // conjugate of untransposed row major
152  char trans = 'C';
153  const int inc = 1;
154 
155  F77_ZGEMV(&trans, &n, &m, &one, A.data(), &n, x.data(), &inc, &zero, S.data(), &inc);
156 
157  // cblas_zgemv(CblasColMajor, CblasConjTrans, n, m, &one,
158  // A.data(), n, x.data(), 1, &zero, S.data(), 1);
159 
160  // for (int i=0; i<m; i++) {
161  // fprintf (stderr, "S[%d] = %18.14f + %18.14fi\n",
162  // real(S[i]), imag(S[i]));
163 
164  // Now, subtract off components * overlaps
165  trans = 'T';
166  F77_ZGEMV(&trans, &m, &n, &minusone, A.data(), &n, S.data(), &inc, &one, x.data(), &inc);
167  // cblas_zgemv(CblasRowMajor, CblasTrans, m, n, &minusone,
168  // A.data(), n, S.data(), 1, &one, x.data(), 1);
169 }
Type_t * data()
Definition: OhmmsArray.h:87
size_t size() const
Definition: OhmmsArray.h:57
#define F77_ZGEMV
Definition: VectorOps.h:49
A D-dimensional Array class based on PETE.
Definition: OhmmsArray.h:25

◆ Orthogonalize() [2/2]

void Orthogonalize ( Array< std::complex< double >, 2 > &  A)
inline

Definition at line 273 of file VectorOps.h.

References qmcplusplus::Units::distance::A, Range::all(), conjdot(), and Normalize().

274 {
275  zVec x, y;
276  Array<std::complex<double>, 1> S(A.rows());
277  for (int iter = 0; iter < 40; iter++)
278  {
279  for (int i = 0; i < A.rows(); i++)
280  {
281  x.reference(A(i, Range::all()));
282  for (int j = i + 1; j < A.rows(); j++)
283  {
284  y.reference(A(j, Range::all()));
285  S(j) = conjdot(y, x);
286  }
287  for (int j = i + 1; j < A.rows(); j++)
288  {
289  y.reference(A(j, Range::all()));
290  x -= S(j) * y;
291  }
292  Normalize(x);
293  }
294  }
295 }
std::complex< double > conjdot(zVec &cA, zVec &cB)
Definition: VectorOps.h:127
void Normalize(zVec &c)
Definition: VectorOps.h:108
static auto all()
Definition: Blitz.h:176
A D-dimensional Array class based on PETE.
Definition: OhmmsArray.h:25

◆ Orthogonalize2()

void Orthogonalize2 ( Array< std::complex< double >, 2 > &  A,
zVec x,
int  lastBand 
)
inline

Definition at line 178 of file VectorOps.h.

References qmcplusplus::Units::distance::A, Range::all(), conjdot(), qmcplusplus::Units::distance::m, qmcplusplus::n, and Array< T, D, ALLOC >::size().

179 {
180  int m = A.rows();
181  int n = A.cols();
182  assert(n == x.size());
183  zVec Ar;
185 
186  for (int row = 0; row <= lastBand; row++)
187  {
188  Ar.reference(A(row, Range::all()));
189  S(row) = conjdot(Ar, x);
190  }
191  for (int row = 0; row <= lastBand; row++)
192  x -= S(row) * A(row, Range::all());
193  // for (int row=0; row<=lastBand; row++) {
194  // Ar.reference (A(row,Range::all()));
195  // S(row) = conjdot (Ar, x);
196  // if (mag(S(row)) > 1.0e-14) {
197  // std::cerr << "row = " << row << " lastband = " << lastBand << std::endl;
198  // std::cerr << "Error in Orthogonalize2!, s = " << S(row) << std::endl;
199  // double norm = realconjdot (Ar, Ar);
200  // std::cerr << "norm = " << norm << std::endl;
201  // }
202  // }
203 }
std::complex< double > conjdot(zVec &cA, zVec &cB)
Definition: VectorOps.h:127
size_t size() const
Definition: OhmmsArray.h:57
static auto all()
Definition: Blitz.h:176
A D-dimensional Array class based on PETE.
Definition: OhmmsArray.h:25

◆ realconjdot()

double realconjdot ( zVec cA,
zVec cB 
)
inline

Definition at line 173 of file VectorOps.h.

References conjdot().

173 { return conjdot(cA, cB).real(); }
std::complex< double > conjdot(zVec &cA, zVec &cB)
Definition: VectorOps.h:127

◆ zaxpy()

void zaxpy ( std::complex< double >  alpha,
const Array< std::complex< double >, 1 > &  x,
const std::complex< double >  y,
Array< std::complex< double >, 1 > &  axpy 
)
inline

Definition at line 313 of file VectorOps.h.

317 {}