xref: /petsc/src/snes/linesearch/interface/ftn-custom/zlinesearchf.c (revision 5ebfa9e9f88b822c006efbb9b0cb198b91a2e84d)
16dd63270SBarry Smith #include <petsc/private/ftnimpl.h>
2ea5d4fccSPeter Brune #include <petscsnes.h>
3ea5d4fccSPeter Brune 
4ea5d4fccSPeter Brune #if defined(PETSC_HAVE_FORTRAN_CAPS)
5f1c6b773SPeter Brune   #define sneslinesearchsetprecheck_  SNESLINESEARCHSETPRECHECK
6f1c6b773SPeter Brune   #define sneslinesearchgetprecheck_  SNESLINESEARCHGETPRECHECK
7f1c6b773SPeter Brune   #define sneslinesearchsetpostcheck_ SNESLINESEARCHSETPOSTCHECK
8f1c6b773SPeter Brune   #define sneslinesearchgetpostcheck_ SNESLINESEARCHGETPOSTCHECK
9ea5d4fccSPeter Brune #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
10f1c6b773SPeter Brune   #define sneslinesearchsetprecheck_  sneslinesearchsetprecheck
11f1c6b773SPeter Brune   #define sneslinesearchgetprecheck_  sneslinesearchgetprecheck
12f1c6b773SPeter Brune   #define sneslinesearchsetpostcheck_ sneslinesearchsetpostcheck
13f1c6b773SPeter Brune   #define sneslinesearchgetpostcheck_ sneslinesearchgetpostcheck
14ea5d4fccSPeter Brune #endif
15ea5d4fccSPeter Brune 
16c87759e9SPeter Brune /* fortranpointers go: shell, precheck, postcheck */
17c87759e9SPeter Brune 
18f1c6b773SPeter Brune static PetscErrorCode oursneslinesearchprecheck(SNESLineSearch linesearch, Vec X, Vec Y, PetscBool *changed, void *ctx)
19c87759e9SPeter Brune {
205f80ce2aSJacob Faibussowitsch   PetscFunctionBegin;
219566063dSJacob Faibussowitsch   PetscCallFortranVoidFunction((*(void (*)(SNESLineSearch *, Vec *, Vec *, PetscBool *, void *, PetscErrorCode *))(((PetscObject)linesearch)->fortran_func_pointers[1]))(&linesearch, &X, &Y, changed, ctx, &ierr));
223ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
23c87759e9SPeter Brune }
24c87759e9SPeter Brune 
25f1c6b773SPeter Brune static PetscErrorCode oursneslinesearchpostcheck(SNESLineSearch linesearch, Vec X, Vec Y, Vec W, PetscBool *changed_Y, PetscBool *changed_W, void *ctx)
26c87759e9SPeter Brune {
275f80ce2aSJacob Faibussowitsch   PetscFunctionBegin;
289566063dSJacob Faibussowitsch   PetscCallFortranVoidFunction((*(void (*)(SNESLineSearch *, Vec *, Vec *, Vec *, PetscBool *, PetscBool *, void *, PetscErrorCode *))(((PetscObject)linesearch)->fortran_func_pointers[2]))(&linesearch, &X, &Y, &W, changed_Y, changed_W, ctx, &ierr));
293ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
30c87759e9SPeter Brune }
31c87759e9SPeter Brune 
3219caf8f3SSatish Balay PETSC_EXTERN void sneslinesearchsetprecheck_(SNESLineSearch *linesearch, void (*func)(SNESLineSearch *, Vec *, Vec *, PetscBool *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
33c87759e9SPeter Brune {
34c87759e9SPeter Brune   PetscObjectAllocateFortranPointers(*linesearch, 3);
35*5ebfa9e9SBarry Smith   ((PetscObject)*linesearch)->fortran_func_pointers[1] = (PetscFortranCallbackFn *)func;
36f5af7f23SKarl Rupp 
37f1c6b773SPeter Brune   *ierr = SNESLineSearchSetPreCheck(*linesearch, oursneslinesearchprecheck, ctx);
38c87759e9SPeter Brune }
39c87759e9SPeter Brune 
4019caf8f3SSatish Balay PETSC_EXTERN void sneslinesearchsetpostcheck_(SNESLineSearch *linesearch, void (*func)(SNESLineSearch *, Vec *, Vec *, Vec *, PetscBool *, PetscBool *, PetscErrorCode *, void *), void *ctx, PetscErrorCode *ierr)
41c87759e9SPeter Brune {
42c87759e9SPeter Brune   PetscObjectAllocateFortranPointers(*linesearch, 3);
43*5ebfa9e9SBarry Smith   ((PetscObject)*linesearch)->fortran_func_pointers[2] = (PetscFortranCallbackFn *)func;
44f5af7f23SKarl Rupp 
45f1c6b773SPeter Brune   *ierr = SNESLineSearchSetPostCheck(*linesearch, oursneslinesearchpostcheck, ctx);
46c87759e9SPeter Brune }
47