13#ifndef UMFPACK_SOLVE_HH
14#define UMFPACK_SOLVE_HH
29template<
class Scalar,
class UMFPackIndex=
int>
34 UMFSymbolic(std::vector<UMFPackIndex>
const & Ap,
35 std::vector<UMFPackIndex>
const & Ai,
36 std::vector<Scalar>
const & Az,
42 void* getMem() {
return mem; }
45 UMFPackIndex* getAp() {
return &lAp[0]; }
46 UMFPackIndex* getAi() {
return &lAi[0]; }
50 std::vector<UMFPackIndex> lAp;
51 std::vector<UMFPackIndex> lAi;
55template<
class Scalar,
class UMFPackIndex=
int>
56class UMFFactorizationSpace
59 UMFFactorizationSpace(std::vector<UMFPackIndex>
const& Ap,
60 std::vector<UMFPackIndex>
const& Ai,
61 std::vector<Scalar>
const& Az);
62 ~UMFFactorizationSpace();
65 void* getMem() {
return mem; }
68 UMFPackIndex* getAp() {
return symbolic.getAp(); }
69 UMFPackIndex* getAi() {
return symbolic.getAi(); }
72 UMFSymbolic<Scalar,UMFPackIndex> symbolic;
87template <
class Scalar,
class UMFPackIndex =
int>
102 std::vector<UMFPackIndex>
const& ridx,
103 std::vector<UMFPackIndex>
const& cidx,
104 std::vector<Scalar>
const& values,
110 assert(cidx.size()==N && values.size()==N);
113 std::vector<UMFPackIndex> Ap(n+1), Ai(N);
115 ridx, cidx, values, Ap, Ai, Az);
116 factorization.reset(
new UMFFactorizationSpace<Scalar,UMFPackIndex>(Ap,Ai,Az));
130 std::unique_ptr<std::vector<UMFPackIndex>>
const ridx,
131 std::unique_ptr<std::vector<UMFPackIndex>>
const cidx,
132 std::unique_ptr<std::vector<Scalar>>
const values,
138 assert(cidx->size()==N && values->size()==N);
141 std::vector<UMFPackIndex> Ap(n+1), Ai(N);
143 ridx, cidx, values, Ap, Ai, Az);
150 factorization.reset(
new UMFFactorizationSpace<Scalar,UMFPackIndex>(Ap,Ai,Az));
158 void solve(std::vector<Scalar>
const& b, std::vector<Scalar>& x,
bool transposed =
false)
const
160 assert(b.size() >= n);
162 solve_internal(&b[0],&x[0],transposed);
165 void solve(Scalar
const* b, Scalar* x,
bool transposed =
false)
const
167 solve_internal(b,x,transposed);
170 void solve(std::vector<Scalar>
const& b, std::vector<Scalar>& x,
int nr,
bool transposed =
false)
const
172 assert(b.size()>=n*nr);
174 for(
int i=0; i<nr; ++i)
175 solve_internal(&b[i*n],&x[i*n],transposed);
184 void solve(std::vector<Scalar>& b)
const
186 assert(b.size() >= n);
187 std::vector<Scalar> x(n);
200 std::vector<Scalar> x(n);
202 std::copy(x.begin(),x.end(),b);
216 virtual void solve_internal(Scalar
const* bp, Scalar* xp,
bool transposed)
const;
220 std::vector<Scalar> Az;
221 std::unique_ptr<UMFFactorizationSpace<Scalar,UMFPackIndex>> factorization;
226 std::vector<int>
const& cidx,
227 std::vector<double>
const& values,
228 std::vector<double>
const& b,
229 std::vector<double>& x);
Abstract base class for matrix factorizations.
Factorization of sparse linear systems with UMFPack.
void solve(Scalar *b) const
Solves the system for the given right hand side.
void solve(std::vector< Scalar > const &b, std::vector< Scalar > &x, bool transposed=false) const
void solve(std::vector< Scalar > &b) const
Solves the system for the given right hand side.
UMFFactorization(UMFPackIndex n_, std::unique_ptr< std::vector< UMFPackIndex > > const ridx, std::unique_ptr< std::vector< UMFPackIndex > > const cidx, std::unique_ptr< std::vector< Scalar > > const values, FactorizationOptions opt)
Constructor destroying input data before factorization: more memory efficient.
virtual size_t size() const
reports the dimension of the system
void solve(std::vector< Scalar > const &b, std::vector< Scalar > &x, int nr, bool transposed=false) const
void solve(Scalar const *b, Scalar *x, bool transposed=false) const
Solves the system for the given right hand side .
UMFFactorization(UMFPackIndex n_, std::vector< UMFPackIndex > const &ridx, std::vector< UMFPackIndex > const &cidx, std::vector< Scalar > const &values, FactorizationOptions opt)
Constructor keeping input data in triplet format (aka coordinate format) constant....
void tripletToCompressedColumn(Index nRows, Index nCols, size_t nNonZeros, std::vector< Index > const &ridx, std::vector< Index > const &cidx, std::vector< Scalar > const &values, std::vector< Index > &Ap, std::vector< Index > &Ai, std::vector< Scalar > &Az)
Converts a matrix in triplet format to a compressed column format.
void umfpack_solve(std::vector< int > const &ridx, std::vector< int > const &cidx, std::vector< double > const &values, std::vector< double > const &b, std::vector< double > &x)
The Options struct allows to specify several options of factorization.