25 #ifndef EIGEN_UMFPACKSUPPORT_H
26 #define EIGEN_UMFPACKSUPPORT_H
35 { umfpack_di_free_numeric(Numeric); *Numeric = 0; }
38 { umfpack_zi_free_numeric(Numeric); *Numeric = 0; }
41 { umfpack_di_free_symbolic(Symbolic); *Symbolic = 0; }
44 { umfpack_zi_free_symbolic(Symbolic); *Symbolic = 0; }
47 const int Ap[],
const int Ai[],
const double Ax[],
void **Symbolic,
48 const double Control [UMFPACK_CONTROL],
double Info [UMFPACK_INFO])
50 return umfpack_di_symbolic(n_row,n_col,Ap,Ai,Ax,Symbolic,Control,Info);
54 const int Ap[],
const int Ai[],
const std::complex<double> Ax[],
void **Symbolic,
55 const double Control [UMFPACK_CONTROL],
double Info [UMFPACK_INFO])
57 return umfpack_zi_symbolic(n_row,n_col,Ap,Ai,&
internal::real_ref(Ax[0]),0,Symbolic,Control,Info);
61 void *Symbolic,
void **Numeric,
62 const double Control[UMFPACK_CONTROL],
double Info [UMFPACK_INFO])
64 return umfpack_di_numeric(Ap,Ai,Ax,Symbolic,Numeric,Control,Info);
67 inline int umfpack_numeric(
const int Ap[],
const int Ai[],
const std::complex<double> Ax[],
68 void *Symbolic,
void **Numeric,
69 const double Control[UMFPACK_CONTROL],
double Info [UMFPACK_INFO])
71 return umfpack_zi_numeric(Ap,Ai,&
internal::real_ref(Ax[0]),0,Symbolic,Numeric,Control,Info);
74 inline int umfpack_solve(
int sys,
const int Ap[],
const int Ai[],
const double Ax[],
75 double X[],
const double B[],
void *Numeric,
76 const double Control[UMFPACK_CONTROL],
double Info[UMFPACK_INFO])
78 return umfpack_di_solve(sys,Ap,Ai,Ax,X,B,Numeric,Control,Info);
81 inline int umfpack_solve(
int sys,
const int Ap[],
const int Ai[],
const std::complex<double> Ax[],
82 std::complex<double> X[],
const std::complex<double> B[],
void *Numeric,
83 const double Control[UMFPACK_CONTROL],
double Info[UMFPACK_INFO])
85 return umfpack_zi_solve(sys,Ap,Ai,&
internal::real_ref(Ax[0]),0,&
internal::real_ref(X[0]),0,&
internal::real_ref(B[0]),0,Numeric,Control,Info);
88 inline int umfpack_get_lunz(
int *lnz,
int *unz,
int *n_row,
int *n_col,
int *nz_udiag,
void *Numeric,
double)
90 return umfpack_di_get_lunz(lnz,unz,n_row,n_col,nz_udiag,Numeric);
93 inline int umfpack_get_lunz(
int *lnz,
int *unz,
int *n_row,
int *n_col,
int *nz_udiag,
void *Numeric, std::complex<double>)
95 return umfpack_zi_get_lunz(lnz,unz,n_row,n_col,nz_udiag,Numeric);
99 int P[],
int Q[],
double Dx[],
int *do_recip,
double Rs[],
void *Numeric)
101 return umfpack_di_get_numeric(Lp,Lj,Lx,Up,Ui,Ux,P,Q,Dx,do_recip,Rs,Numeric);
104 inline int umfpack_get_numeric(
int Lp[],
int Lj[], std::complex<double> Lx[],
int Up[],
int Ui[], std::complex<double> Ux[],
105 int P[],
int Q[], std::complex<double> Dx[],
int *do_recip,
double Rs[],
void *Numeric)
110 return umfpack_zi_get_numeric(Lp,Lj,Lx?&lx0_real:0,0,Up,Ui,Ux?&ux0_real:0,0,P,Q,
111 Dx?&dx0_real:0,0,do_recip,Rs,Numeric);
116 return umfpack_di_get_determinant(Mx,Ex,NumericHandle,User_Info);
119 inline int umfpack_get_determinant(std::complex<double> *Mx,
double *Ex,
void *NumericHandle,
double User_Info [UMFPACK_INFO])
122 return umfpack_zi_get_determinant(&mx_real,0,Ex,NumericHandle,User_Info);
138 template<
typename _MatrixType>
143 typedef typename MatrixType::Scalar
Scalar;
145 typedef typename MatrixType::Index
Index;
220 template<
typename Rhs>
225 &&
"UmfPackLU::solve(): invalid number of rows of the right hand side matrix b");
226 return internal::solve_retval<UmfPackLU, Rhs>(*
this, b.derived());
289 #ifndef EIGEN_PARSED_BY_DOXYGEN
291 template<
typename BDerived,
typename XDerived>
356 template<
typename MatrixType>
359 if (m_extractedDataAreDirty)
362 int lnz, unz, rows, cols, nz_udiag;
366 m_l.resize(rows,(std::min)(rows,cols));
367 m_l.resizeNonZeros(lnz);
369 m_u.resize((std::min)(rows,cols),cols);
370 m_u.resizeNonZeros(unz);
377 m_u.outerIndexPtr(), m_u.innerIndexPtr(), m_u.valuePtr(),
378 m_p.data(), m_q.data(), 0, 0, 0, m_numeric);
380 m_extractedDataAreDirty =
false;
384 template<
typename MatrixType>
392 template<
typename MatrixType>
393 template<
typename BDerived,
typename XDerived>
396 const int rhsCols = b.cols();
398 eigen_assert((XDerived::Flags&
RowMajorBit)==0 &&
"UmfPackLU backend does not support non col-major result yet");
401 for (
int j=0; j<rhsCols; ++j)
404 m_outerIndexPtr, m_innerIndexPtr, m_valuePtr,
405 &x.
col(j).coeffRef(0), &b.const_cast_derived().
col(j).coeffRef(0), m_numeric, 0, 0);
416 template<
typename _MatrixType,
typename Rhs>
417 struct solve_retval<UmfPackLU<_MatrixType>, Rhs>
418 : solve_retval_base<UmfPackLU<_MatrixType>, Rhs>
420 typedef UmfPackLU<_MatrixType> Dec;
423 template<typename Dest>
void evalTo(Dest& dst)
const
425 dec()._solve(rhs(),dst);
429 template<
typename _MatrixType,
typename Rhs>
430 struct sparse_solve_retval<UmfPackLU<_MatrixType>, Rhs>
431 : sparse_solve_retval_base<UmfPackLU<_MatrixType>, Rhs>
433 typedef UmfPackLU<_MatrixType> Dec;
436 template<typename Dest>
void evalTo(Dest& dst)
const
438 dec()._solve(rhs(),dst);
446 #endif // EIGEN_UMFPACKSUPPORT_H