Skip to content

Commit

Permalink
[SofaCaribou] Minor adjustments to linear solver bindings
Browse files Browse the repository at this point in the history
  • Loading branch information
jnbrunet committed Oct 7, 2021
1 parent 0e3da02 commit 2b00ae6
Show file tree
Hide file tree
Showing 9 changed files with 52 additions and 36 deletions.
10 changes: 9 additions & 1 deletion src/SofaCaribou/Python/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,15 @@ set(PYTHON_TEST_FILES
)

find_package(SofaPython3 REQUIRED)
find_package(MKL REQUIRED)

if (CARIBOU_WITH_MKL)
set(MKL_STATIC ON)
if (NOT CARIBOU_WITH_OPENMP)
set(MKL_THREADING_VENDOR SEQUENTIAL)
endif()
find_package(MKL REQUIRED QUIET)
endif()

caribou_add_python_module(SofaCaribou
TARGET_NAME ${PROJECT_NAME}
TARGET_ALIAS Caribou::Python.SofaCaribou
Expand Down
16 changes: 8 additions & 8 deletions src/SofaCaribou/Python/Solver/ConjugateGradientSolver.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,26 +13,26 @@ namespace SofaCaribou::solver::python {
template <typename EigenMatrix>
void bind_ConjugateGradientSolver(pybind11::module & m) {
namespace py = pybind11;
using SOLVER = ConjugateGradientSolver<EigenMatrix>;
py::class_<SOLVER, sofa::core::objectmodel::BaseObject, sofapython3::py_shared_ptr<SOLVER>> c(m, "ConjugateGradientSolver");
using SolverType = ConjugateGradientSolver<EigenMatrix>;
py::class_<SolverType, sofa::core::objectmodel::BaseObject, sofapython3::py_shared_ptr<SolverType>> c(m, "ConjugateGradientSolver");

c.def("A", [](SOLVER & solver){return solver.A()->matrix();});
c.def("A", [](const SolverType & solver){return solver.A()->matrix();});

c.def("x", [](SOLVER & solver){return solver.x()->vector();});
c.def("x", [](const SolverType & solver){return solver.x()->vector();});

c.def("b", [](SOLVER & solver){return solver.b()->vector();});
c.def("b", [](const SolverType & solver){return solver.b()->vector();});


c.def("assemble", [](SOLVER & solver, double m, double b, double k) {
c.def("assemble", [](SolverType & solver, double m, double b, double k) {
sofa::core::MechanicalParams mparams;
mparams.setMFactor(m);
mparams.setBFactor(b);
mparams.setKFactor(k);
solver.assemble(&mparams);
}, py::arg("m") = static_cast<double>(1), py::arg("b") = static_cast<double>(1), py::arg("k") = static_cast<double>(1));

sofapython3::PythonFactory::registerType<SOLVER>([](sofa::core::objectmodel::Base* o) {
return py::cast(dynamic_cast<SOLVER*>(o));
sofapython3::PythonFactory::registerType<SolverType>([](sofa::core::objectmodel::Base* o) {
return py::cast(dynamic_cast<SolverType*>(o));
});
}

Expand Down
1 change: 0 additions & 1 deletion src/SofaCaribou/Python/Solver/LDLTSolver.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ namespace SofaCaribou::solver::python {

void addLDLTSolver(py::module & m) {
bind_LDLTSolver<Eigen::SimplicialLDLT<Eigen::SparseMatrix<FLOATING_POINT_TYPE, Eigen::ColMajor, int>, Eigen::Lower, Eigen::AMDOrdering<int>>>(m);

}

} // namespace SofaCaribou::solver::python
16 changes: 8 additions & 8 deletions src/SofaCaribou/Python/Solver/LDLTSolver.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,26 +14,26 @@ namespace SofaCaribou::solver::python {
template <typename EigenSolver>
void bind_LDLTSolver(pybind11::module & m) {
namespace py = pybind11;
using SOLVER = SofaCaribou::solver::LDLTSolver<EigenSolver>;
py::class_<SOLVER, sofa::core::objectmodel::BaseObject, sofapython3::py_shared_ptr<SOLVER>> c(m, "LDLTSolver");
using SolverType = SofaCaribou::solver::LDLTSolver<EigenSolver>;
py::class_<SolverType, sofa::core::objectmodel::BaseObject, sofapython3::py_shared_ptr<SolverType>> c(m, "LDLTSolver");

c.def("A", [](SOLVER & solver){return solver.A()->matrix();});
c.def("A", [](const SolverType & solver){return solver.A()->matrix();});

c.def("x", [](SOLVER & solver){return solver.x()->vector();});
c.def("x", [](const SolverType & solver){return solver.x()->vector();});

c.def("b", [](SOLVER & solver){return solver.b()->vector();});
c.def("b", [](const SolverType & solver){return solver.b()->vector();});


c.def("assemble", [](SOLVER & solver, double m, double b, double k) {
c.def("assemble", [](SolverType & solver, double m, double b, double k) {
sofa::core::MechanicalParams mparams;
mparams.setMFactor(m);
mparams.setBFactor(b);
mparams.setKFactor(k);
solver.assemble(&mparams);
}, py::arg("m") = static_cast<double>(1), py::arg("b") = static_cast<double>(1), py::arg("k") = static_cast<double>(1));

sofapython3::PythonFactory::registerType<SOLVER>([](sofa::core::objectmodel::Base* o) {
return py::cast(dynamic_cast<SOLVER*>(o));
sofapython3::PythonFactory::registerType<SolverType>([](sofa::core::objectmodel::Base* o) {
return py::cast(dynamic_cast<SolverType*>(o));
});
}

Expand Down
1 change: 0 additions & 1 deletion src/SofaCaribou/Python/Solver/LLTSolver.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ namespace SofaCaribou::solver::python {

void addLLTSolver(py::module & m) {
bind_LLTSolver<Eigen::SimplicialLLT<Eigen::SparseMatrix<FLOATING_POINT_TYPE, Eigen::ColMajor, int>, Eigen::Lower, Eigen::AMDOrdering<int>>>(m);

}

} // namespace SofaCaribou::solver::python
16 changes: 8 additions & 8 deletions src/SofaCaribou/Python/Solver/LLTSolver.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,25 +14,25 @@ namespace SofaCaribou::solver::python {
template <typename EigenSolver>
void bind_LLTSolver(pybind11::module & m) {
namespace py = pybind11;
using SOLVER = LLTSolver<EigenSolver>;
py::class_<SOLVER, sofa::core::objectmodel::BaseObject, sofapython3::py_shared_ptr<SOLVER>> c(m, "LLTSolver");
using SolverType = LLTSolver<EigenSolver>;
py::class_<SolverType, sofa::core::objectmodel::BaseObject, sofapython3::py_shared_ptr<SolverType>> c(m, "LLTSolver");

c.def("A", [](SOLVER & solver){return solver.A()->matrix();});
c.def("A", [](const SolverType & solver){return solver.A()->matrix();});

c.def("x", [](SOLVER & solver){return solver.x()->vector();});
c.def("x", [](const SolverType & solver){return solver.x()->vector();});

c.def("b", [](SOLVER & solver){return solver.b()->vector();});
c.def("b", [](const SolverType & solver){return solver.b()->vector();});

c.def("assemble", [](SOLVER & solver, double m, double b, double k) {
c.def("assemble", [](SolverType & solver, double m, double b, double k) {
sofa::core::MechanicalParams mparams;
mparams.setMFactor(m);
mparams.setBFactor(b);
mparams.setKFactor(k);
solver.assemble(&mparams);
}, py::arg("m") = static_cast<double>(1), py::arg("b") = static_cast<double>(1), py::arg("k") = static_cast<double>(1));

sofapython3::PythonFactory::registerType<SOLVER>([](sofa::core::objectmodel::Base* o) {
return py::cast(dynamic_cast<SOLVER*>(o));
sofapython3::PythonFactory::registerType<SolverType>([](sofa::core::objectmodel::Base* o) {
return py::cast(dynamic_cast<SolverType*>(o));
});
}

Expand Down
1 change: 0 additions & 1 deletion src/SofaCaribou/Python/Solver/LUSolver.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ namespace SofaCaribou::solver::python {

void addLUSolver(py::module & m) {
bind_LUSolver<Eigen::SparseLU<Eigen::SparseMatrix<FLOATING_POINT_TYPE, Eigen::ColMajor, int>, Eigen::AMDOrdering<int>>>(m);

}

} // namespace SofaCaribou::solver::python
16 changes: 8 additions & 8 deletions src/SofaCaribou/Python/Solver/LUSolver.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,25 +14,25 @@ namespace SofaCaribou::solver::python {
template <typename EigenSolver>
void bind_LUSolver(pybind11::module & m) {
namespace py = pybind11;
using SOLVER = LUSolver<EigenSolver>;
py::class_<SOLVER, sofa::core::objectmodel::BaseObject, sofapython3::py_shared_ptr<SOLVER>> c(m, "LUSolver");
using SolverType = LUSolver<EigenSolver>;
py::class_<SolverType, sofa::core::objectmodel::BaseObject, sofapython3::py_shared_ptr<SolverType>> c(m, "LUSolver");

c.def("A", [](SOLVER & solver){return solver.A()->matrix();});
c.def("A", [](const SolverType & solver){return solver.A()->matrix();});

c.def("x", [](SOLVER & solver){return solver.x()->vector();});
c.def("x", [](const SolverType & solver){return solver.x()->vector();});

c.def("b", [](SOLVER & solver){return solver.b()->vector();});
c.def("b", [](const SolverType & solver){return solver.b()->vector();});

c.def("assemble", [](SOLVER & solver, double m, double b, double k) {
c.def("assemble", [](SolverType & solver, double m, double b, double k) {
sofa::core::MechanicalParams mparams;
mparams.setMFactor(m);
mparams.setBFactor(b);
mparams.setKFactor(k);
solver.assemble(&mparams);
}, py::arg("m") = static_cast<double>(1), py::arg("b") = static_cast<double>(1), py::arg("k") = static_cast<double>(1));

sofapython3::PythonFactory::registerType<SOLVER>([](sofa::core::objectmodel::Base* o) {
return py::cast(dynamic_cast<SOLVER*>(o));
sofapython3::PythonFactory::registerType<SolverType>([](sofa::core::objectmodel::Base* o) {
return py::cast(dynamic_cast<SolverType*>(o));
});
}

Expand Down
11 changes: 11 additions & 0 deletions src/SofaCaribou/SofaCaribouConfig.cmake.in
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
# OPTIONS
set(CARIBOU_WITH_OPENMP "@CARIBOU_WITH_OPENMP@")
set(CARIBOU_WITH_SP3 "@CARIBOU_WITH_SP3@")
set(CARIBOU_WITH_MKL "@CARIBOU_WITH_MKL@")

# Caribou
find_package(Caribou COMPONENTS Algebra Geometry Topology Mechanics REQUIRED)
Expand All @@ -13,6 +14,16 @@ if (CARIBOU_WITH_SP3)
find_package(Caribou COMPONENTS Python REQUIRED)
endif()

# MKL support
if (CARIBOU_WITH_MKL)
set(MKL_STATIC ON)
if (NOT CARIBOU_WITH_OPENMP)
set(MKL_THREADING_VENDOR SEQUENTIAL)
endif()
find_package(MKL REQUIRED QUIET)
endif()


# Sofa's packages
find_package(SOFA COMPONENTS SofaFramework SofaBaseLinearSolver SofaBaseTopology SofaEigen2Solver QUIET MODULE REQUIRED)

Expand Down

0 comments on commit 2b00ae6

Please sign in to comment.