xref: /petsc/src/binding/petsc4py/demo/legacy/wrap-cython/Bratu3D.pyx (revision 55a74a43bb44613d95e937906bec3b8c3581b432)
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