xref: /petsc/src/snes/linesearch/interface/ftn-custom/zlinesearchf.c (revision e0b7e82fd3cf27fce84cc3e37e8d70a5c36a2d4e)
1 #include <petsc/private/fortranimpl.h>
2 #include <petscsnes.h>
3 
4 #if defined(PETSC_HAVE_FORTRAN_CAPS)
5   #define sneslinesearchsetprecheck_  SNESLINESEARCHSETPRECHECK
6   #define sneslinesearchgetprecheck_  SNESLINESEARCHGETPRECHECK
7   #define sneslinesearchsetpostcheck_ SNESLINESEARCHSETPOSTCHECK
8   #define sneslinesearchgetpostcheck_ SNESLINESEARCHGETPOSTCHECK
9 #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
10   #define sneslinesearchsetprecheck_  sneslinesearchsetprecheck
11   #define sneslinesearchgetprecheck_  sneslinesearchgetprecheck
12   #define sneslinesearchsetpostcheck_ sneslinesearchsetpostcheck
13   #define sneslinesearchgetpostcheck_ sneslinesearchgetpostcheck
14 
15 #endif
16 
17 /* fortranpointers go: shell, precheck, postcheck */
18 
19 static PetscErrorCode oursneslinesearchprecheck(SNESLineSearch linesearch, Vec X, Vec Y, PetscBool *changed, void *ctx)
20 {
21   PetscFunctionBegin;
22   PetscCallFortranVoidFunction((*(void (*)(SNESLineSearch *, Vec *, Vec *, PetscBool *, void *, PetscErrorCode *))(((PetscObject)linesearch)->fortran_func_pointers[1]))(&linesearch, &X, &Y, changed, ctx, &ierr));
23   PetscFunctionReturn(PETSC_SUCCESS);
24 }
25 
26 static PetscErrorCode oursneslinesearchpostcheck(SNESLineSearch linesearch, Vec X, Vec Y, Vec W, PetscBool *changed_Y, PetscBool *changed_W, void *ctx)
27 {
28   PetscFunctionBegin;
29   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));
30   PetscFunctionReturn(PETSC_SUCCESS);
31 }
32 
33 PETSC_EXTERN void sneslinesearchsetprecheck_(SNESLineSearch *linesearch, void (*func)(SNESLineSearch *, Vec *, Vec *, PetscBool *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
34 {
35   PetscObjectAllocateFortranPointers(*linesearch, 3);
36   ((PetscObject)*linesearch)->fortran_func_pointers[1] = (PetscVoidFn *)func;
37 
38   *ierr = SNESLineSearchSetPreCheck(*linesearch, oursneslinesearchprecheck, ctx);
39 }
40 
41 PETSC_EXTERN void sneslinesearchsetpostcheck_(SNESLineSearch *linesearch, void (*func)(SNESLineSearch *, Vec *, Vec *, Vec *, PetscBool *, PetscBool *, PetscErrorCode *, void *), void *ctx, PetscErrorCode *ierr)
42 {
43   PetscObjectAllocateFortranPointers(*linesearch, 3);
44   ((PetscObject)*linesearch)->fortran_func_pointers[2] = (PetscVoidFn *)func;
45 
46   *ierr = SNESLineSearchSetPostCheck(*linesearch, oursneslinesearchpostcheck, ctx);
47 }
48