| 273 | } |
| 274 | |
| 275 | void petsc_nls_module(nb::module_& m) |
| 276 | { |
| 277 | // dolfinx::NewtonSolver |
| 278 | nb::class_<dolfinx::nls::petsc::NewtonSolver>(m, "NewtonSolver") |
| 279 | .def( |
| 280 | "__init__", |
| 281 | [](dolfinx::nls::petsc::NewtonSolver* ns, |
| 282 | const dolfinx_wrappers::MPICommWrapper comm) |
| 283 | { |
| 284 | new (ns) dolfinx::nls::petsc::NewtonSolver(comm.get()); |
| 285 | std::cerr << "NewtonSolver is deprecated, and will be removed in a " |
| 286 | "future release.\n"; |
| 287 | }, |
| 288 | nb::arg("comm")) |
| 289 | .def_prop_ro("krylov_solver", |
| 290 | [](const dolfinx::nls::petsc::NewtonSolver& self) |
| 291 | { |
| 292 | KSP ksp = self.get_krylov_solver().ksp(); |
| 293 | PyObject* obj = PyPetscKSP_New(ksp); |
| 294 | return nb::steal(obj); |
| 295 | }) |
| 296 | .def("setF", &dolfinx::nls::petsc::NewtonSolver::setF, nb::arg("F"), |
| 297 | nb::arg("b")) |
| 298 | .def("setJ", &dolfinx::nls::petsc::NewtonSolver::setJ, nb::arg("J"), |
| 299 | nb::arg("Jmat")) |
| 300 | .def("setP", &dolfinx::nls::petsc::NewtonSolver::setP, nb::arg("P"), |
| 301 | nb::arg("Pmat")) |
| 302 | .def( |
| 303 | "set_update", |
| 304 | [](dolfinx::nls::petsc::NewtonSolver& self, |
| 305 | const std::function<void( |
| 306 | const dolfinx::nls::petsc::NewtonSolver* solver, const Vec, |
| 307 | Vec)>& |
| 308 | update) // See |
| 309 | // https://github.com/wjakob/nanobind/discussions/361 |
| 310 | // on why we pass NewtonSolver* rather than |
| 311 | // NewtonSolver& |
| 312 | { |
| 313 | self.set_update( |
| 314 | [update](const dolfinx::nls::petsc::NewtonSolver& solver, |
| 315 | const Vec dx, Vec x) { update(&solver, dx, x); }); |
| 316 | }, |
| 317 | nb::arg("update")) |
| 318 | .def( |
| 319 | "set_convergence_check", |
| 320 | [](dolfinx::nls::petsc::NewtonSolver& self, |
| 321 | const std::function<std::pair<double, bool>( |
| 322 | const dolfinx::nls::petsc::NewtonSolver* solver, const Vec)>& |
| 323 | convergence_check) // See |
| 324 | // https://github.com/wjakob/nanobind/discussions/361 |
| 325 | // on why we pass NewtonSolver* rather than |
| 326 | // NewtonSolver& |
| 327 | { |
| 328 | self.set_convergence_check( |
| 329 | [convergence_check]( |
| 330 | const dolfinx::nls::petsc::NewtonSolver& solver, |
| 331 | const Vec r) { return convergence_check(&solver, r); }); |
| 332 | }, |
no test coverage detected