← Back to team overview

dolfin team mailing list archive

[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