Mechanics of Defect Evolution Library
Loading...
Searching...
No Matches
model::SchurComplementSolver Class Reference

Solves the system of equations in block-form: More...

#include <SchurComplementSolver.h>

Collaboration diagram for model::SchurComplementSolver:

Public Member Functions

 SchurComplementSolver (const Eigen::MatrixXd &KQQ, const Eigen::MatrixXd &KPQ, const Eigen::VectorXd &Fq, const Eigen::VectorXd &Fp)
 SchurComplementSolver (const Eigen::MatrixXd &KQQ, const Eigen::MatrixXd &KPQ, const Eigen::VectorXd &Fq)

Public Attributes

const Eigen::LLT< Eigen::MatrixXd > llt
 The LLT decomposition of KQQ.
const Eigen::PartialPivLU< Eigen::MatrixXd > pplu
 the partial-pivot LU decomposition of KPQ*inv(KQQ)*KPQ^T
Eigen::VectorXd L
 The vector of Lagrange multipliers.
Eigen::VectorXd X
 The solution vector.

Detailed Description

Solves the system of equations in block-form:

\[ \left[ \begin{array}{ll} K_{qq} & K_{pq}^T\\ K_{pq} & 0\\ \end{array} \right] \left[ \begin{array}{l} X_q\\ L_p \end{array} \right] = \left[ \begin{array}{l} F_q\\ F_p \end{array} \right] \]

where the matrix \(K_{qq}\) is a symmetric positive definite matrix and \(K_{pq}\) is a full row-rank matrix.

The full system is symmetric but not necessarely poisitive-definite, therefore Cholesky decomposition (LLT) cannot be used. However, since \(K_{qq}\) is symmetric and positive-definite, LLT can be used for the decomposition of \(K_{qq}\). In order to take advantage of LLT and reduce the size of the overall matrix decomposition, the solution is found in the form:

\[ \left\{ \begin{array}{l} L_p=\left(K_{pq}K_{qq}^{-1}K_{pq}^T\right)^{-1}\left(K_{pq}K_{qq}^{-1}F_q-F_p\right)\\ X_q=K_{qq}^{-1}\left(F_q-K_{pq}^TL_p\right) \end{array} \right. \]

Numerically this is implemented as:

Eigen::LLT<Eigen::MatrixXd> llt(KQQ);
Eigen::PartialPivLU<Eigen::MatrixXd> pplu(KPQ*llt.solve(KPQ.transpose()));
Eigen::VectorXd Lp = pplu.solve(KPQ*llt.solve(Fq)-Fp);
Xq = llt.solve(Fq-KPQ.transpose()*Lp);
const Eigen::LLT< Eigen::MatrixXd > llt
The LLT decomposition of KQQ.
const Eigen::PartialPivLU< Eigen::MatrixXd > pplu
the partial-pivot LU decomposition of KPQ*inv(KQQ)*KPQ^T

Definition at line 61 of file SchurComplementSolver.h.

Constructor & Destructor Documentation

◆ SchurComplementSolver() [1/2]

model::SchurComplementSolver::SchurComplementSolver ( const Eigen::MatrixXd & KQQ,
const Eigen::MatrixXd & KPQ,
const Eigen::VectorXd & Fq,
const Eigen::VectorXd & Fp )

Definition at line 33 of file SchurComplementSolver.cpp.

◆ SchurComplementSolver() [2/2]

model::SchurComplementSolver::SchurComplementSolver ( const Eigen::MatrixXd & KQQ,
const Eigen::MatrixXd & KPQ,
const Eigen::VectorXd & Fq )

Definition at line 43 of file SchurComplementSolver.cpp.

Member Data Documentation

◆ L

Eigen::VectorXd model::SchurComplementSolver::L

The vector of Lagrange multipliers.

Definition at line 75 of file SchurComplementSolver.h.

◆ llt

const Eigen::LLT<Eigen::MatrixXd> model::SchurComplementSolver::llt

The LLT decomposition of KQQ.

Definition at line 69 of file SchurComplementSolver.h.

◆ pplu

const Eigen::PartialPivLU<Eigen::MatrixXd> model::SchurComplementSolver::pplu

the partial-pivot LU decomposition of KPQ*inv(KQQ)*KPQ^T

Definition at line 72 of file SchurComplementSolver.h.

◆ X

Eigen::VectorXd model::SchurComplementSolver::X

The solution vector.

Definition at line 78 of file SchurComplementSolver.h.


The documentation for this class was generated from the following files: