Passing PETSc options to standard solve()


196
views
1
8 months ago by
Miguel  

How to pass PETSc options to the standard solve() in FEniCS? First solve (standard) doesn't see the options, whereas the PETScKrylovSolver does.

from dolfin import *

PETScOptions().set("ksp_monitor_true_residual", "")
PETScOptions().set("ksp_monitor_singular_value", "")

mesh = UnitSquareMesh(10,10)
V = FunctionSpace(mesh, 'CG', 1)

u = TrialFunction(V)
v = TestFunction(V)

a = inner(grad(u), grad(v))*dx + u*v*dx
f = Constant(5.0)
L = f*v*dx

u_sol = Function(V)

solve(a==L, u_sol, solver_parameters={"linear_solver":"cg"})

A = assemble(a)
b = assemble(L)

solver = PETScKrylovSolver()
solver.ksp().setFromOptions()
solver.set_operator(A)
solver.solve(u_sol.vector(), b)
Community: FEniCS Project
1
I feel like the generic solve method is just there to let people who don't want to care about the details to just "solve".  Is there a problem with using the more explicit wrapper functions to make you want to use "solve" instead?
written 8 months ago by pf4d  
yeah, dolfin-adjoint generates the adjoint using the regular solve.
written 8 months ago by Miguel  
That is a valid reason. I have used dolfin-adjoint for quite a few things, and it's great software, but it can't do everything. I feel like unless you are using the checkpointing, it is better to solve the adjoint manually.
written 8 months ago by pf4d  
Yeah, it seems that in the new generation dolfin-adjoint, pyadjoint https://bitbucket.org/dolfin-adjoint/pyadjoint/src the task of implementing your own linear solver is easier.
written 8 months ago by Miguel  
Please login to add an answer/comment or follow this question.

Similar posts:
Search »