Hermitian solve

Implementation

Solve \(AX=B\), \(A^T X = B\), or \(A^H X = B\) for \(X\) given a Hermitian matrix \(A\) and a right-hand side matrix \(B\). When \(A\) is dense, the default algorithm is Bunch-Kaufman, whereas, when \(A\) is sparse, the default approach embeds the problem in the same manner as LinearSolve(), though it is possible to override this behaviour and attempt a sparse \(LDL^H\) factorization which only dynamically pivots within supernodes.

Note

Only the lower-triangular storage case (uplo=LOWER) is supported by the following routines.

Python API

HermitianSolve(A, B[, tryLDL=False, uplo=LOWER, orient=NORMAL])
Parameters
  • A – Dense or sparse Hermitian matrix to solve against

  • B – Right-hand sides (which will be overwritten with the solution).

  • tryLDL – (optional) if a sparse \(LDL^H\) factorization without pivoting should be attempted instead of embedding in a QSD system

  • uplo – (optional) which triangle the data is explicitly stored in

  • orient – (optional) whether to use \(A\), \(A^T\), or \(A^H\)

Type of \(A\)

Type of B

Matrix

Matrix

AbstractDistMatrix

AbstractDistMatrix

SparseMatrix

Matrix

DistSparseMatrix

DistMultiVec

C++ API

void HermitianSolve(UpperOrLower uplo, Orientation orientation, const Matrix<F> &A, Matrix<F> &B, bool conjugate = false, const LDLPivotCtrl<Base<F>> &ctrl = LDLPivotCtrl<Base<F>>())
void HermitianSolve(UpperOrLower uplo, Orientation orientation, const AbstractDistMatrix<F> &A, AbstractDistMatrix<F> &B, bool conjugate = false, const LDLPivotCtrl<Base<F>> &ctrl = LDLPivotCtrl<Base<F>>())
void HermitianSolve(const SparseMatrix<F> &A, Matrix<F> &B, bool tryLDL = false, const BisectCtrl &ctrl = BisectCtrl())
void HermitianSolve(const DistSparseMatrix<F> &A, DistMultiVec<F> &B, bool tryLDL = false, const BisectCtrl &ctrl = BisectCtrl())

Dense versions which factor in-place

void herm_solve::Overwrite(UpperOrLower uplo, Orientation orientation, const Matrix<F> &A, Matrix<F> &B, bool conjugate = false, const LDLPivotCtrl<Base<F>> &ctrl = LDLPivotCtrl<Base<F>>())
void herm_solve::Overwrite(UpperOrLower uplo, Orientation orientation, const AbstractDistMatrix<F> &A, AbstractDistMatrix<F> &B, bool conjugate = false, const LDLPivotCtrl<Base<F>> &ctrl = LDLPivotCtrl<Base<F>>())

C API

Single-precision complex

ElError ElHermitianSolve_c(ElUpperOrLower uplo, ElOrientation orientation, ElConstMatrix_c A, ElMatrix_c B)
ElError ElHermitianSolveDist_c(ElUpperOrLower uplo, ElOrientation orientation, ElConstDistMatrix_c A, ElDistMatrix_c B)
ElError ElHermitianSolveSparse_c(ElConstSparseMatrix_c A, ElMatrix_c B, bool tryLDL)
ElError ElHermitianSolveDistSparse_c(ElConstDistSparseMatrix_c A, ElDistMultiVec_c B, bool tryLDL)

Double-precision complex

ElError ElHermitianSolve_z(ElUpperOrLower uplo, ElOrientation orientation, ElConstMatrix_z A, ElMatrix_z B)
ElError ElHermitianSolveDist_z(ElUpperOrLower uplo, ElOrientation orientation, ElConstDistMatrix_z A, ElDistMatrix_z B)
ElError ElHermitianSolveSparse_z(ElConstSparseMatrix_z A, ElMatrix_z B, bool tryLDL)
ElError ElHermitianSolveDistSparse_z(ElConstDistSparseMatrix_z A, ElDistMultiVec_z B, bool tryLDL)