dolfin team mailing list archive
-
dolfin team
-
Mailing list archive
-
Message #23191
[Bug 768233] Re: PETScUserPreconditioner does not work with PETScKrylovMatrix
** Changed in: dolfin
Assignee: (unassigned) => Garth Wells (garth-wells)
--
You received this bug notification because you are a member of DOLFIN
Team, which is subscribed to DOLFIN.
https://bugs.launchpad.net/bugs/768233
Title:
PETScUserPreconditioner does not work with PETScKrylovMatrix
Status in DOLFIN:
Confirmed
Bug description:
There seems to be a problem with passing matrix-free preconditioners
to PETSc: The combination of PETScKrylovMatrix and
PETScUserPreconditioner fails with the following error:
[0]PETSC ERROR: No support for this operation for this object type!
[0]PETSC ERROR: Matrix format shell does not have a built-in PETSc direct solver!
Here's a minimal example which triggers the error:
from dolfin import *
mesh = UnitSquare(32, 32)
V = FunctionSpace(mesh, 'CG', 1)
bc = DirichletBC(V, Constant(0.0), lambda x, on_boundary: on_boundary)
u = TrialFunction(V); v = TestFunction(V);
A, b = assemble_system( inner(grad(u), grad(v))*dx, Constant(1.0)*v*dx, bc)
class KrylovMatrix(PETScKrylovMatrix) :
def __init__(self) :
PETScKrylovMatrix.__init__(self, V.dim(), V.dim())
def mult(self, *args) :
y = PETScVector(V.dim())
A.mult(args[0],y)
args[1].set_local(y.array())
class IdentityPreconditioner(PETScUserPreconditioner) :
def __init__(self) :
PETScUserPreconditioner.__init__(self)
def solve(self, *args) :
args[0].set_local(args[1])
y = Function(V)
solve(A,y.vector(),b)
x_petsc = PETScVector(V.dim())
MyPrecon = IdentityPreconditioner()
KrylovSolver = PETScKrylovSolver("cg", MyPrecon)
KrylovSolver.solve(KrylovMatrix(), x_petsc, down_cast(b)) # fails
KrylovSolver.solve(A, x_petsc, down_cast(b)) # works
References