diff --git a/Sofa/Component/LinearSolver/Direct/tests/SparseLDLSolver_test.cpp b/Sofa/Component/LinearSolver/Direct/tests/SparseLDLSolver_test.cpp index 3d72df3da06..882c0cb34af 100644 --- a/Sofa/Component/LinearSolver/Direct/tests/SparseLDLSolver_test.cpp +++ b/Sofa/Component/LinearSolver/Direct/tests/SparseLDLSolver_test.cpp @@ -19,14 +19,14 @@ * * * Contact information: contact@sofa-framework.org * ******************************************************************************/ -#include -#include #include +#include #include +#include +#include #include #include -#include - +#include #include @@ -140,3 +140,76 @@ TEST(SparseLDLSolver, AssociatedLinearSystem) EXPECT_EQ(MatrixSystem::GetCustomTemplateName(), MatrixType::Name()); } + + +TEST(SparseLDLSolver, TestInvertingRandomMatrix) +{ + using MatrixType = sofa::linearalgebra::CompressedRowSparseMatrix; + using Solver = sofa::component::linearsolver::direct::SparseLDLSolver >; + const Solver::SPtr solver = sofa::core::objectmodel::New(); + + solver->init(); + + unsigned nbRows = 300; + unsigned nbCols = 300; + SReal reg = 5; + float sparsity = 0.05; + const auto nbNonZero = static_cast(sparsity * static_cast(nbRows*nbCols)); + + + sofa::linearalgebra::FullMatrix tempMatrix(nbRows,nbCols), finalTempMatrix; + tempMatrix.clear(); + + sofa::helper::RandomGenerator randomGenerator; + randomGenerator.initSeed(2807); + + + for (sofa::SignedIndex i = 0; i < nbNonZero; ++i) + { + const auto value = static_cast(fabs(sofa::helper::drand(2))); + const auto row = randomGenerator.random(0, nbRows); + const auto col = randomGenerator.random(0, nbCols); + tempMatrix.set(row,col,value); + } + + for (sofa::SignedIndex i = 0; i < nbRows; ++i) + { + tempMatrix.set(i,i,tempMatrix(i,i) + reg); + } + tempMatrix.mulT(finalTempMatrix, tempMatrix); + + sofa::linearalgebra::CompressedRowSparseMatrix matrix; + matrix.resize(nbRows, nbCols); + + unsigned nbNZ = 0; + for (unsigned i=0; i 1e-8) + matrix.set(i,j,finalTempMatrix(i,j)); + else + ++nbNZ; + } + + } + msg_info("TestInvertingRandomMatrix") << "REAL SPARSITY (#zeros/#elements) : " <<(nbNZ)/static_cast(nbRows*nbCols) ; + matrix.compress(); + + sofa::linearalgebra::FullVector known(nbCols), unknown(nbCols), rhs(nbRows); + for (unsigned i=0; i(sofa::helper::drand(1)); + known.set(i,value); + } + matrix.mul(rhs, known); + + solver->invert(matrix); + solver->solve(matrix, unknown, rhs); + + for (unsigned i=0; i