2#ifndef _model_NullSpaceSolver_h_
3#define _model_NullSpaceSolver_h_
7#include <Eigen/SparseQR>
10#ifdef _MODEL_PARDISO_SOLVER_
11#include <Eigen/PardisoSupport>
17 template<
typename SparseMatrixType>
21 typedef typename SparseMatrixType::Scalar Scalar;
25 const SparseMatrixType KY;
34#ifdef _MODEL_PARDISO_SOLVER_
35 Eigen::PardisoLLT<SparseMatrixType> solver1;
36 Eigen::PardisoLLT<SparseMatrixType> solver2;
38 Eigen::SimplicialLLT<SparseMatrixType> solver1;
39 Eigen::SimplicialLLT<SparseMatrixType> solver2;
46 const SparseMatrixType& C) :
59 solver1.factorize(C*sNs.matrixY());
60 solver2.factorize(sNs.matrixZ().transpose()*K*sNs.matrixZ());
65 Eigen::VectorXd
solve(
const Eigen::VectorXd&
f,
const Eigen::VectorXd& g)
66 { _y=solver1.solve(g);
68 _z=solver2.solve((sNs.matrixZ().transpose()*(
f-KY*_y)).eval());
69 return sNs.matrixY()*_y+sNs.matrixZ()*_z;
73 Eigen::VectorXd
solve(
const Eigen::VectorXd&
f)
76 _y.setZero(sNs.matrixY().cols());
77 _z=solver2.solve((sNs.matrixZ().transpose()*
f).eval());
78 return sNs.matrixZ()*_z;
82 const Eigen::VectorXd&
y()
const
90 const Eigen::VectorXd&
z()
const
102 return sNs.matrixZ();
109 return sNs.matrixY();
Eigen::VectorXd solve(const Eigen::VectorXd &f)
const SparseMatrixType & matrixZ() const
NullSpaceSolver(const SparseMatrixType &K, const SparseMatrixType &C)
Eigen::VectorXd solve(const Eigen::VectorXd &f, const Eigen::VectorXd &g)
const Eigen::VectorXd & y() const
const SparseMatrixType & matrixY() const
const Eigen::VectorXd & z() const
function int_R syms a b c u real f