Mechanics of Defect Evolution Library
Loading...
Searching...
No Matches
NullSpaceSolver.h
Go to the documentation of this file.
1
2#ifndef _model_NullSpaceSolver_h_
3#define _model_NullSpaceSolver_h_
4
5#include <chrono>
6#include <Eigen/Sparse>
7#include <Eigen/SparseQR>
8#include <SparseNullSpace.h>
9
10#ifdef _MODEL_PARDISO_SOLVER_
11#include <Eigen/PardisoSupport>
12#endif
13
14namespace model
15{
16
17 template<typename SparseMatrixType>
19 {
20
21 typedef typename SparseMatrixType::Scalar Scalar;
22
23
25 const SparseMatrixType KY;
26 // SparseMatrixType CY;
27 // SparseMatrixType ZTKZ;
28
29 Eigen::VectorXd _y;
30 Eigen::VectorXd _z;
31
32
33
34#ifdef _MODEL_PARDISO_SOLVER_
35 Eigen::PardisoLLT<SparseMatrixType> solver1;
36 Eigen::PardisoLLT<SparseMatrixType> solver2;
37#else
38 Eigen::SimplicialLLT<SparseMatrixType> solver1;
39 Eigen::SimplicialLLT<SparseMatrixType> solver2;
40#endif
41
42 public:
43
44 /********************************************************/
45 NullSpaceSolver(const SparseMatrixType& K,
46 const SparseMatrixType& C) :
47 /* init */ sNs(C)
48 /* init */,KY(K*sNs.matrixY())
49 {
50
51
52
53 // CY=C*sNs.matrixY();
54 // ZTKZ=sNs.matrixZ().transpose()*K*sNs.matrixZ();
55 //
56 // solver1.factorize(CY);
57 // solver2.factorize(ZTKZ);
58
59 solver1.factorize(C*sNs.matrixY());
60 solver2.factorize(sNs.matrixZ().transpose()*K*sNs.matrixZ());
61
62 }
63
64 /********************************************************/
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;
70 }
71
72 /********************************************************/
73 Eigen::VectorXd solve(const Eigen::VectorXd& f)
74 {
76 _y.setZero(sNs.matrixY().cols());
77 _z=solver2.solve((sNs.matrixZ().transpose()*f).eval());
78 return sNs.matrixZ()*_z;
79 }
80
81 /********************************************************/
82 const Eigen::VectorXd& y() const
83 {
86 return _y;
87 }
88
89 /********************************************************/
90 const Eigen::VectorXd& z() const
91 {
94 return _z;
95 }
96
97 const SparseMatrixType& matrixZ() const
98 {
102 return sNs.matrixZ();
103 }
104
105 const SparseMatrixType& matrixY() const
106 {
109 return sNs.matrixY();
110 }
111 };
112
113}
114
115#endif
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
Definition int_R.m:4