import petsc4py, sys petsc4py.init(sys.argv) From petsc4py import PETSc class MyMat: def __init__(self): self.x_i = None def mult(self, A, v, y): # J(x)*v = 2*x*v y[...] = 2 * self.x_i * v def fun(snes, x, f): # F = x**2 f[...] = x * x def jac(snes, x, J, P): # J(x)*v = 2*x*v msh = J.getPythonContext() msh.x_i = x.copy(msh.x_i) return False # same nz pattern N = 1 msh = MyMat() J = PETSc.Mat().createPython(N, msh) J.setUp() x, f = J.getVecs() b = f.duplicate() snes = PETSc.SNES().create() ksp = snes.getKSP() pc = ksp.getPC() pc.setType(PETSc.PC.Type.NONE) snes.setFunction(fun, f) snes.setJacobian(jac, J, J) snes.setFromOptions() x[...] = 1 b[...] = 4 snes.solve(b,x)