template<class TMatrix, class TVector, class TThreadManager = NoThreadManager>
class sofa::component::linearsolver::direct::AsyncSparseLDLSolver< TMatrix, TVector, TThreadManager >
This linear solver is based on SparseLDLSolver, a direct linear solver which factorizes the linear system matrix. Its particularity is its asynchronous factorization.
The synchronous version performs the following operations (synchronously): 1) Build the matrix 2) Factorize the matrix 3) Solve the system based on the factorization
In the asynchronous version, the factorization is performed asynchronously. A consequence is that the solving process uses a factorization which may not be up to date. In practice, the factorization is at least one time step old. Because of this, the solver computes an approximation of the solution, based on an old factorization. It changes the behavior compared to a synchronous version, but it also changes the behavior depending on the duration of the factorization step. It may introduce instabilities.
|
| SOFA_CLASS (SOFA_TEMPLATE3(AsyncSparseLDLSolver, TMatrix, TVector, TThreadManager), SOFA_TEMPLATE3(SparseLDLSolver, TMatrix, TVector, TThreadManager)) |
|
bool | isAsyncSolver () override |
|
void | init () override |
|
void | setSystemMBKMatrix (const core::MechanicalParams *mparams) override |
|
void | solveSystem () override |
|
void | solve (Matrix &M, Vector &x, Vector &b) override |
|
void | invert (TMatrix &M) override |
|
bool | addJMInvJtLocal (TMatrix *M, ResMatrixType *result, const JMatrixType *J, SReal fact) override |
|
bool | hasUpdatedMatrix () override |
|
void | updateSystemMatrix () override |
|
| ~AsyncSparseLDLSolver () override |
|
| SOFA_CLASS (SOFA_TEMPLATE3(SparseLDLSolver, TMatrix, TVector, NoThreadManager), SOFA_TEMPLATE3(SparseLDLSolverImpl, TMatrix, TVector, NoThreadManager)) |
|
void | init () override |
|
void | parse (sofa::core::objectmodel::BaseObjectDescription *arg) override |
|
void | solve (Matrix &M, Vector &x, Vector &b) override |
|
void | invert (Matrix &M) override |
|
bool | doAddJMInvJtLocal (ResMatrixType *result, const JMatrixType *J, SReal fact, InvertData *data) |
|
bool | addJMInvJtLocal (TMatrix *M, ResMatrixType *result, const JMatrixType *J, SReal fact) override |
|
MatrixInvertData * | createInvertData () override |
|
| SOFA_CLASS (SOFA_TEMPLATE3(SparseLDLSolverImpl, TMatrix, TVector, NoThreadManager),) |
|
| SOFA_CLASS (OrderingMethodAccessor, TBase) |
|
| OrderingMethodAccessor () |
|
| ~OrderingMethodAccessor () override=default |
|
void | init () override |
|
void | parse (sofa::core::objectmodel::BaseObjectDescription *arg) override |
|
|
bool | isAsyncFactorizationFinished () const |
| Return true if an asynchronous factorization has been launched and is finished. More...
|
|
void | launchAsyncFactorization () |
|
void | asyncFactorization () |
|
void | swapInvertData () |
| Copy the invert data from the async thread to the main thread. More...
|
|
| SparseLDLSolver () |
|
bool | factorize (Matrix &M, InvertData *invertData) |
|
void | showInvalidSystemMessage (const std::string &reason) const |
|
| SparseLDLSolverImpl () |
|
void | solve_cpu (Real *x, const Real *b, SparseLDLImplInvertData< VecInt, VecReal > *data) |
|
void | LDL_ordering (int n, int nnz, int *M_colptr, int *M_rowind, Real *M_values, int *perm, int *invperm) |
|
void | LDL_symbolic (int n, int *M_colptr, int *M_rowind, int *colptr, int *perm, int *invperm, int *Parent) |
|
void | LDL_numeric (int n, int *M_colptr, int *M_rowind, Real *M_values, int *colptr, int *rowind, Real *values, Real *D, int *perm, int *invperm, int *Parent) |
|
void | factorize (int n, int *M_colptr, int *M_rowind, Real *M_values, SparseLDLImplInvertData< VecInt, VecReal > *data) |
|