1*55a74a43SLisandro Dalcinfrom petsc4py.PETSc cimport Vec, PetscVec 2*55a74a43SLisandro Dalcinfrom petsc4py.PETSc cimport Mat, PetscMat 3*55a74a43SLisandro Dalcinfrom petsc4py.PETSc cimport DM, PetscDM 4*55a74a43SLisandro Dalcinfrom petsc4py.PETSc cimport SNES, PetscSNES 5*55a74a43SLisandro Dalcin 6*55a74a43SLisandro Dalcinfrom petsc4py.PETSc import Error 7*55a74a43SLisandro Dalcin 8*55a74a43SLisandro Dalcincdef extern from "Bratu3Dimpl.h": 9*55a74a43SLisandro Dalcin ctypedef struct Params: 10*55a74a43SLisandro Dalcin double lambda_ 11*55a74a43SLisandro Dalcin int FormInitGuess(PetscDM da, PetscVec x, Params *p) 12*55a74a43SLisandro Dalcin int FormFunction (PetscDM da, PetscVec x, PetscVec F, Params *p) 13*55a74a43SLisandro Dalcin int FormJacobian (PetscDM da, PetscVec x, PetscMat J, Params *p) 14*55a74a43SLisandro Dalcin 15*55a74a43SLisandro Dalcindef formInitGuess(Vec x, DM da, double lambda_): 16*55a74a43SLisandro Dalcin cdef int ierr 17*55a74a43SLisandro Dalcin cdef Params p = {"lambda_" : lambda_} 18*55a74a43SLisandro Dalcin ierr = FormInitGuess(da.dm, x.vec, &p) 19*55a74a43SLisandro Dalcin if ierr != 0: raise Error(ierr) 20*55a74a43SLisandro Dalcin 21*55a74a43SLisandro Dalcindef formFunction(SNES snes, Vec x, Vec f, DM da, double lambda_): 22*55a74a43SLisandro Dalcin cdef int ierr 23*55a74a43SLisandro Dalcin cdef Params p = {"lambda_" : lambda_} 24*55a74a43SLisandro Dalcin ierr = FormFunction(da.dm, x.vec, f.vec, &p) 25*55a74a43SLisandro Dalcin if ierr != 0: raise Error(ierr) 26*55a74a43SLisandro Dalcin 27*55a74a43SLisandro Dalcindef formJacobian(SNES snes, Vec x, Mat J, Mat P, DM da, double lambda_): 28*55a74a43SLisandro Dalcin cdef int ierr 29*55a74a43SLisandro Dalcin cdef Params p = {"lambda_" : lambda_} 30*55a74a43SLisandro Dalcin ierr = FormJacobian(da.dm, x.vec, P.mat, &p) 31*55a74a43SLisandro Dalcin if ierr != 0: raise Error(ierr) 32*55a74a43SLisandro Dalcin if J != P: J.assemble() # for matrix-free operator 33*55a74a43SLisandro Dalcin return Mat.Structure.SAME_NONZERO_PATTERN 34