QMCPACK
MatrixOps.h File Reference
+ Include dependency graph for MatrixOps.h:
+ This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

struct  lup
 

Functions

void LinearLeastSquares (Array< double, 2 > &A, Array< double, 1 > &x, Array< double, 1 > &b)
 
void MatVecProd (Array< double, 2 > &A, Array< double, 1 > &x, Array< double, 1 > &Ax)
 
void SVdecomp (Array< double, 2 > &A, Array< double, 2 > &U, Array< double, 1 > &S, Array< double, 2 > &V)
 
void SVdecomp (Array< std::complex< double >, 2 > &A, Array< std::complex< double >, 2 > &U, Array< double, 1 > &S, Array< std::complex< double >, 2 > &V)
 
void SymmEigenPairs (const Array< double, 2 > &A, int NumPairs, Array< double, 1 > &Vals, Array< double, 2 > &Vectors)
 
void SymmEigenPairs (const Array< std::complex< double >, 2 > &A, int NumPairs, Array< double, 1 > &Vals, Array< std::complex< double >, 2 > &Vectors)
 
void PolarOrthogonalize (Array< std::complex< double >, 2 > &A)
 
const Array< double, 2 > operator* (const Array< double, 2 > &A, const Array< double, 2 > &B)
 
double InnerProduct (const Array< double, 1 > &A, const Array< double, 1 > &B)
 
void OuterProduct (const Array< double, 1 > &A, const Array< double, 1 > &B, Array< double, 2 > &AB)
 
void MatMult (const Array< double, 2 > &A, const Array< double, 2 > &B, Array< double, 2 > &C)
 
void MatMult (const Array< std::complex< double >, 2 > &A, const Array< std::complex< double >, 2 > &B, Array< std::complex< double >, 2 > &C)
 
double Determinant (const Array< double, 2 > &A)
 
std::complex< double > Determinant (const Array< std::complex< double >, 2 > &A)
 
double DetCofactors (Array< double, 2 > &A, Array< double, 1 > &work)
 This function returns the determinant of A and replaces A with its cofactors. More...
 
int DetCofactorsWorksize (int N)
 This function returns the worksize needed by the previous function. More...
 
std::complex< double > ComplexDetCofactors (Array< std::complex< double >, 2 > &A, Array< std::complex< double >, 1 > &work)
 Complex versions of the functions above. More...
 
int ComplexDetCofactorsWorksize (int N)
 
double GJInverse (Array< double, 2 > &A)
 
double GJInversePartial (Array< double, 2 > &A)
 
Array< double, 2 > Inverse (Array< double, 2 > &A)
 
void OutOfPlaceTranspose (Array< double, 2 > &A)
 
void OutOfPlaceTranspose (Array< std::complex< double >, 2 > &A)
 
void Transpose (Array< double, 2 > &A)
 
void Transpose (Array< std::complex< double >, 2 > &A)
 
void Print (const Mat3 &A)
 
void CubicFormula (double a, double b, double c, double d, double &x1, double &x2, double &x3)
 
void TestCubicFormula ()
 
void EigVals (const Mat3 &M, double &lambda1, double &lambda2, double &lambda3)
 
void Eig (const Mat3 &M, Mat3 &U, Vec3 &Lambda)
 
double det (const Mat2 &C)
 
void CholeskyBig (Array< double, 2 > &A)
 
Mat3 Cholesky (Mat3 C)
 
void TestCholesky ()
 

Function Documentation

◆ Cholesky()

Mat3 Cholesky ( Mat3  C)
inline

Definition at line 360 of file MatrixOps.h.

References qmcplusplus::Units::charge::C, and qmcplusplus::sqrt().

Referenced by TestCholesky().

361 {
362  Mat3 L;
363  double L00Inv;
364  L = 0.0;
365  L(0, 0) = sqrt(C(0, 0));
366  L00Inv = 1.0 / L(0, 0);
367  L(1, 0) = C(1, 0) * L00Inv;
368  L(2, 0) = C(2, 0) * L00Inv;
369  L(1, 1) = sqrt(C(1, 1) - L(1, 0) * L(1, 0));
370  L(2, 1) = (C(2, 1) - L(2, 0) * L(1, 0)) / L(1, 1);
371  L(2, 2) = sqrt(C(2, 2) - (L(2, 0) * L(2, 0) + L(2, 1) * L(2, 1)));
372  return (L);
373 }
MakeReturn< UnaryNode< FnSqrt, typename CreateLeaf< Vector< T1, C1 > >::Leaf_t > >::Expression_t sqrt(const Vector< T1, C1 > &l)

◆ CholeskyBig()

void CholeskyBig ( Array< double, 2 > &  A)

◆ ComplexDetCofactors()

std::complex<double> ComplexDetCofactors ( Array< std::complex< double >, 2 > &  A,
Array< std::complex< double >, 1 > &  work 
)

Complex versions of the functions above.

◆ ComplexDetCofactorsWorksize()

int ComplexDetCofactorsWorksize ( int  N)

◆ CubicFormula()

void CubicFormula ( double  a,
double  b,
double  c,
double  d,
double &  x1,
double &  x2,
double &  x3 
)
inline

Definition at line 226 of file MatrixOps.h.

References qmcplusplus::Units::distance::A, qmcplusplus::acos(), B(), qmcplusplus::Units::charge::C, qmcplusplus::cos(), and qmcplusplus::sqrt().

Referenced by EigVals(), and TestCubicFormula().

227 {
228  double A = b / a;
229  double B = c / a;
230  double C = d / a;
231  double Q = (A * A - 3.0 * B) / 9.0;
232  double R = (2.0 * A * A * A - 9.0 * A * B + 27.0 * C) / 54.0;
233  //cerr << "Q = " << Q << " R = " << R << "\n";
234  if ((R * R) < (Q * Q * Q))
235  {
236  double theta = acos(R / sqrt(Q * Q * Q));
237  double twosqrtQ = 2.0 * sqrt(Q);
238  double third = 1.0 / 3.0;
239  double thirdA = third * A;
240  x1 = -twosqrtQ * cos(third * theta) - thirdA;
241  x2 = -twosqrtQ * cos(third * (theta + 2.0 * M_PI)) - thirdA;
242  x3 = -twosqrtQ * cos(third * (theta - 2.0 * M_PI)) - thirdA;
243  }
244  else
245  {
246  std::cerr << "Complex roots detected in CubicFormula.\n";
247  exit(1);
248  }
249 }
MakeReturn< UnaryNode< FnCos, typename CreateLeaf< Vector< T1, C1 > >::Leaf_t > >::Expression_t cos(const Vector< T1, C1 > &l)
MakeReturn< UnaryNode< FnArcCos, typename CreateLeaf< Vector< T1, C1 > >::Leaf_t > >::Expression_t acos(const Vector< T1, C1 > &l)
MakeReturn< UnaryNode< FnSqrt, typename CreateLeaf< Vector< T1, C1 > >::Leaf_t > >::Expression_t sqrt(const Vector< T1, C1 > &l)
double B(double x, int k, int i, const std::vector< double > &t)

◆ det()

double det ( const Mat2 C)
inline

Definition at line 299 of file MatrixOps.h.

References qmcplusplus::Units::charge::C.

299 { return (C(0, 0) * C(1, 1) - C(0, 1) * C(1, 0)); }

◆ DetCofactors()

double DetCofactors ( Array< double, 2 > &  A,
Array< double, 1 > &  work 
)

This function returns the determinant of A and replaces A with its cofactors.

◆ DetCofactorsWorksize()

int DetCofactorsWorksize ( int  N)

This function returns the worksize needed by the previous function.

◆ Determinant() [1/2]

double Determinant ( const Array< double, 2 > &  A)

◆ Determinant() [2/2]

std::complex<double> Determinant ( const Array< std::complex< double >, 2 > &  A)

◆ Eig()

void Eig ( const Mat3 M,
Mat3 U,
Vec3 Lambda 
)
inline

Definition at line 282 of file MatrixOps.h.

References EigVals(), norm(), and qmcplusplus::sqrt().

Referenced by TestCholesky().

283 {
284  EigVals(M, Lambda(0), Lambda(1), Lambda(2));
285  for (int i = 0; i < 3; i++)
286  {
287  double L = Lambda(i);
288  U(0, i) = 1.0;
289  U(1, i) = (M(1, 2) / M(0, 2) * (M(0, 0) - L) - M(1, 0)) / (M(1, 1) - M(1, 2) / M(0, 2) * M(0, 1) - L);
290  U(2, i) = ((L - M(1, 1)) * U(1, i) - M(1, 0)) / M(1, 2);
291  double norm = 1.0 / sqrt(U(0, i) * U(0, i) + U(1, i) * U(1, i) + U(2, i) * U(2, i));
292  U(0, i) *= norm;
293  U(1, i) *= norm;
294  U(2, i) *= norm;
295  }
296 }
double norm(const zVec &c)
Definition: VectorOps.h:118
MakeReturn< UnaryNode< FnSqrt, typename CreateLeaf< Vector< T1, C1 > >::Leaf_t > >::Expression_t sqrt(const Vector< T1, C1 > &l)
void EigVals(const Mat3 &M, double &lambda1, double &lambda2, double &lambda3)
Definition: MatrixOps.h:270

◆ EigVals()

void EigVals ( const Mat3 M,
double &  lambda1,
double &  lambda2,
double &  lambda3 
)
inline

Definition at line 270 of file MatrixOps.h.

References CubicFormula().

Referenced by Eig().

271 {
272  double a = -1.0;
273  double b = M(0, 0) + M(1, 1) + M(2, 2);
274  double c = (-M(0, 0) * M(1, 1) - M(0, 0) * M(2, 2) - M(1, 1) * M(2, 2) + M(0, 1) * M(1, 0) + M(0, 2) * M(2, 0) +
275  M(1, 2) * M(2, 1));
276  double d = (M(0, 0) * M(1, 1) * M(2, 2) + M(0, 1) * M(1, 2) * M(2, 0) + M(0, 2) * M(1, 0) * M(2, 1) -
277  M(0, 1) * M(1, 0) * M(2, 2) - M(0, 2) * M(1, 1) * M(2, 0) - M(0, 0) * M(1, 2) * M(2, 1));
278  CubicFormula(a, b, c, d, lambda1, lambda2, lambda3);
279 }
void CubicFormula(double a, double b, double c, double d, double &x1, double &x2, double &x3)
Definition: MatrixOps.h:226

◆ GJInverse()

double GJInverse ( Array< double, 2 > &  A)

◆ GJInversePartial()

double GJInversePartial ( Array< double, 2 > &  A)

◆ InnerProduct()

double InnerProduct ( const Array< double, 1 > &  A,
const Array< double, 1 > &  B 
)

◆ Inverse()

Array<double, 2> Inverse ( Array< double, 2 > &  A)

◆ LinearLeastSquares()

void LinearLeastSquares ( Array< double, 2 > &  A,
Array< double, 1 > &  x,
Array< double, 1 > &  b 
)

◆ MatMult() [1/2]

void MatMult ( const Array< double, 2 > &  A,
const Array< double, 2 > &  B,
Array< double, 2 > &  C 
)

◆ MatMult() [2/2]

void MatMult ( const Array< std::complex< double >, 2 > &  A,
const Array< std::complex< double >, 2 > &  B,
Array< std::complex< double >, 2 > &  C 
)

◆ MatVecProd()

void MatVecProd ( Array< double, 2 > &  A,
Array< double, 1 > &  x,
Array< double, 1 > &  Ax 
)

◆ operator*()

const Array<double, 2> operator* ( const Array< double, 2 > &  A,
const Array< double, 2 > &  B 
)

◆ OuterProduct()

void OuterProduct ( const Array< double, 1 > &  A,
const Array< double, 1 > &  B,
Array< double, 2 > &  AB 
)

◆ OutOfPlaceTranspose() [1/2]

void OutOfPlaceTranspose ( Array< double, 2 > &  A)
inline

Definition at line 166 of file MatrixOps.h.

References qmcplusplus::Units::distance::A, qmcplusplus::Units::distance::m, and qmcplusplus::n.

Referenced by Transpose().

167 {
168  int m = A.rows();
169  int n = A.cols();
170  Array<double, 2> Atrans(n, m);
171  for (int i = 0; i < m; i++)
172  for (int j = 0; j < n; j++)
173  Atrans(j, i) = A(i, j);
174  A.resize(n, m);
175  A = Atrans;
176 }

◆ OutOfPlaceTranspose() [2/2]

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

Definition at line 178 of file MatrixOps.h.

References qmcplusplus::Units::distance::A, qmcplusplus::Units::distance::m, and qmcplusplus::n.

179 {
180  int m = A.rows();
181  int n = A.cols();
182  Array<std::complex<double>, 2> Atrans(n, m);
183  for (int i = 0; i < m; i++)
184  for (int j = 0; j < n; j++)
185  Atrans(j, i) = A(i, j);
186  A.resize(n, m);
187  A = Atrans;
188 }
A D-dimensional Array class based on PETE.
Definition: OhmmsArray.h:25

◆ PolarOrthogonalize()

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

◆ Print()

void Print ( const Mat3 A)
inline

Definition at line 219 of file MatrixOps.h.

References qmcplusplus::Units::distance::A.

220 {
221  fprintf(stderr, "%14.6e %14.6e %14.6e\n", A(0, 0), A(0, 1), A(0, 2));
222  fprintf(stderr, "%14.6e %14.6e %14.6e\n", A(1, 0), A(1, 1), A(1, 2));
223  fprintf(stderr, "%14.6e %14.6e %14.6e\n", A(2, 0), A(2, 1), A(2, 2));
224 }

◆ SVdecomp() [1/2]

void SVdecomp ( Array< double, 2 > &  A,
Array< double, 2 > &  U,
Array< double, 1 > &  S,
Array< double, 2 > &  V 
)

◆ SVdecomp() [2/2]

void SVdecomp ( Array< std::complex< double >, 2 > &  A,
Array< std::complex< double >, 2 > &  U,
Array< double, 1 > &  S,
Array< std::complex< double >, 2 > &  V 
)

◆ SymmEigenPairs() [1/2]

void SymmEigenPairs ( const Array< double, 2 > &  A,
int  NumPairs,
Array< double, 1 > &  Vals,
Array< double, 2 > &  Vectors 
)

◆ SymmEigenPairs() [2/2]

void SymmEigenPairs ( const Array< std::complex< double >, 2 > &  A,
int  NumPairs,
Array< double, 1 > &  Vals,
Array< std::complex< double >, 2 > &  Vectors 
)

◆ TestCholesky()

void TestCholesky ( )
inline

Definition at line 376 of file MatrixOps.h.

References qmcplusplus::Units::charge::C, Cholesky(), Eig(), and Transpose().

377 {
378  Mat3 V, D, C, L;
379  V(0, 0) = 1.0;
380  V(0, 1) = 2.0;
381  V(0, 2) = 3.0;
382  V(1, 0) = 6.0;
383  V(1, 1) = 1.0;
384  V(1, 2) = 9.0;
385  V(2, 0) = 7.0;
386  V(2, 1) = 5.0;
387  V(2, 2) = 7.0;
388 
389  D(0, 0) = 1.0;
390  D(0, 1) = 0.0;
391  D(0, 2) = 0.0;
392  D(1, 0) = 0.0;
393  D(1, 1) = 2.0;
394  D(1, 2) = 0.0;
395  D(2, 0) = 0.0;
396  D(2, 1) = 0.0;
397  D(2, 2) = 3.0;
398 
399  C = V * D * Transpose(V);
400  std::cerr << "C = " << C << "\n";
401  std::cerr << "V = " << V << "\n";
402  L = Cholesky(C);
403  std::cerr << "L = " << L << "\n";
404  std::cerr << "L L^T = " << L * Transpose(L) << "\n";
405 
406  Mat3 E, U;
407  Vec3 Lambda;
408  for (int i = 0; i < 10000000; i++)
409  {
410  Eig(C, U, Lambda);
411  //E = Inverse(C);
412  //L = Cholesky (E);
413  }
414 }
Mat3 Cholesky(Mat3 C)
Definition: MatrixOps.h:360
void Eig(const Mat3 &M, Mat3 &U, Vec3 &Lambda)
Definition: MatrixOps.h:282
void Transpose(Array< double, 2 > &A)
Definition: MatrixOps.h:190

◆ TestCubicFormula()

void TestCubicFormula ( )
inline

Definition at line 252 of file MatrixOps.h.

References CubicFormula().

253 {
254  double x1 = 2.3;
255  double x2 = 1.1;
256  double x3 = 9.2;
257  double a = 1.0;
258  double b = -(x1 + x2 + x3);
259  double c = (x1 * x2 + x1 * x3 + x2 * x3);
260  double d = -x1 * x2 * x3;
261 
262  double y1, y2, y3;
263  CubicFormula(a, b, c, d, y1, y2, y3);
264  std::cerr << "y1 = " << y1 << "\n";
265  std::cerr << "y2 = " << y2 << "\n";
266  std::cerr << "y3 = " << y3 << "\n";
267 }
void CubicFormula(double a, double b, double c, double d, double &x1, double &x2, double &x3)
Definition: MatrixOps.h:226

◆ Transpose() [1/2]

void Transpose ( Array< double, 2 > &  A)
inline

Definition at line 190 of file MatrixOps.h.

References qmcplusplus::Units::distance::A, qmcplusplus::Units::distance::m, qmcplusplus::n, and OutOfPlaceTranspose().

Referenced by TestCholesky().

191 {
192  int m = A.rows();
193  int n = A.cols();
194  if (m != n)
196  else
197  {
198  for (int i = 0; i < m; i++)
199  for (int j = i + 1; j < m; j++)
200  std::swap(A(i, j), A(j, i));
201  }
202 }
void OutOfPlaceTranspose(Array< double, 2 > &A)
Definition: MatrixOps.h:166

◆ Transpose() [2/2]

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

Definition at line 204 of file MatrixOps.h.

References qmcplusplus::Units::distance::A, qmcplusplus::Units::distance::m, qmcplusplus::n, and OutOfPlaceTranspose().

205 {
206  int m = A.rows();
207  int n = A.cols();
208  if (m != n)
210  else
211  {
212  for (int i = 0; i < m; i++)
213  for (int j = i + 1; j < m; j++)
214  std::swap(A(i, j), A(j, i));
215  }
216 }
void OutOfPlaceTranspose(Array< double, 2 > &A)
Definition: MatrixOps.h:166