xref: /petsc/src/binding/petsc4py/demo/legacy/wrap-cython/Bratu3D.pyx (revision 552edb6364df478b294b3111f33a8f37ca096b20)
155a74a43SLisandro Dalcinfrom petsc4py.PETSc cimport Vec,  PetscVec
255a74a43SLisandro Dalcinfrom petsc4py.PETSc cimport Mat,  PetscMat
355a74a43SLisandro Dalcinfrom petsc4py.PETSc cimport DM,   PetscDM
4*6f336411SStefano Zampinifrom petsc4py.PETSc cimport SNES
555a74a43SLisandro Dalcin
655a74a43SLisandro Dalcinfrom petsc4py.PETSc import Error
755a74a43SLisandro Dalcin
855a74a43SLisandro Dalcincdef extern from "Bratu3Dimpl.h":
955a74a43SLisandro Dalcin    ctypedef struct Params:
1055a74a43SLisandro Dalcin        double lambda_
1155a74a43SLisandro Dalcin    int FormInitGuess(PetscDM da, PetscVec x, Params *p)
1255a74a43SLisandro Dalcin    int FormFunction (PetscDM da, PetscVec x, PetscVec F, Params *p)
1355a74a43SLisandro Dalcin    int FormJacobian (PetscDM da, PetscVec x, PetscMat J, Params *p)
1455a74a43SLisandro Dalcin
15*6f336411SStefano Zampini
1655a74a43SLisandro Dalcindef formInitGuess(Vec x, DM da, double lambda_):
1755a74a43SLisandro Dalcin    cdef int ierr
1855a74a43SLisandro Dalcin    cdef Params p = {"lambda_" : lambda_}
1955a74a43SLisandro Dalcin    ierr = FormInitGuess(da.dm, x.vec, &p)
2055a74a43SLisandro Dalcin    if ierr != 0: raise Error(ierr)
2155a74a43SLisandro Dalcin
22*6f336411SStefano Zampini
2355a74a43SLisandro Dalcindef formFunction(SNES snes, Vec x, Vec f, DM da, double lambda_):
2455a74a43SLisandro Dalcin    cdef int ierr
2555a74a43SLisandro Dalcin    cdef Params p = {"lambda_" : lambda_}
2655a74a43SLisandro Dalcin    ierr = FormFunction(da.dm, x.vec, f.vec, &p)
2755a74a43SLisandro Dalcin    if ierr != 0: raise Error(ierr)
2855a74a43SLisandro Dalcin
29*6f336411SStefano Zampini
3055a74a43SLisandro Dalcindef formJacobian(SNES snes, Vec x, Mat J, Mat P, DM da, double lambda_):
3155a74a43SLisandro Dalcin    cdef int ierr
3255a74a43SLisandro Dalcin    cdef Params p = {"lambda_" : lambda_}
3355a74a43SLisandro Dalcin    ierr = FormJacobian(da.dm, x.vec, P.mat, &p)
3455a74a43SLisandro Dalcin    if ierr != 0: raise Error(ierr)
3555a74a43SLisandro Dalcin    if J != P: J.assemble() # for matrix-free operator
3655a74a43SLisandro Dalcin    return Mat.Structure.SAME_NONZERO_PATTERN
37