Set krylov linear solver paramters in newton solver in C++

Hi,

I am working with FEniCS legacy (2019.1.0) in C++. I am solving a nonlinear problem with a Newton solver coupled with GMRES for the linear iterations between Newton steps. I would like to have more control over the linear solver and access to PETSc parameters. Specifically, I want to modify the GMRES restart.

This post answers my question for Python, but I have been struggling to implement it in C++
fenicsproject.discourse.group/t/set-krylov-linear-solver-paramters-in-newton-solver/1070/3

Thanks in advance.

Here are some linesof 2019.1.0 c++ code I have laying around for setting PETSc options while using a Newton solver. Is this helping you in the right direction?

	auto solver = std::make_shared<PETScKrylovSolver>("gmres");

	KSP ksp = solver->ksp();

	dolfin::PETScOptions::set("ksp_view");
	dolfin::PETScOptions::set("ksp_monitor_true_residual");
	KSPSetFromOptions(ksp);
1 Like

How do you “link” your Krylov solver to the Newton solver?

In my code, I am just declaring a Newton solver and then setting its parameters to use GMRES:

NewtonSolver newtonSolver_;
    parameters["maximum_iterations"] = 40;
    parameters["absolute_tolerance"] = 1e-8;
    parameters["relative_tolerance"] = 1e-8;
    parameters["convergence_criterion"] = "incremental";
    parameters["report"] = true;
    
    parameters["linear_solver"] = "gmres";
    parameters["preconditioner"] = "jacobi";
    
    parameters("krylov_solver")["relative_tolerance"] = 1e-8;
    parameters("krylov_solver")["absolute_tolerance"] = 1e-8;

Something like this:

	NewtonSolver newton_solver(MPI_COMM_WORLD, solver, PETScFactory::instance());
	newton_solver.parameters["maximum_iterations"] = 40;
	newton_solver.parameters["absolute_tolerance"] = 1.0e-8;
	newton_solver.parameters["relative_tolerance"] = 1.0e-8;

It worked! Thank you so much.