xref: /petsc/src/snes/linesearch/interface/ftn-custom/zlinesearchf.c (revision 2be0bd48eafef65c41cfdf827dbc5de6d9225158)
1 #include <private/fortranimpl.h>
2 #include <petscsnes.h>
3 
4 #if defined(PETSC_HAVE_FORTRAN_CAPS)
5 #define petsclinesearchsettype_          PETSCLINESEARCHSETTYPE
6 #define petsclinesearchsetprecheck_      PETSCLINESEARCHSETPRECHECK
7 #define petsclinesearchgetprecheck_      PETSCLINESEARCHGETPRECHECK
8 #define petsclinesearchsetpostcheck_     PETSCLINESEARCHSETPOSTCHECK
9 #define petsclinesearchgetpostcheck_     PETSCLINESEARCHGETPOSTCHECK
10 #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
11 #define petsclinesearchsettype_          petsclinesearchsettype
12 #define petsclinesearchsetprecheck_      petsclinesearchsetprecheck
13 #define petsclinesearchgetprecheck_      petsclinesearchgetprecheck
14 #define petsclinesearchsetpostcheck_     petsclinesearchsetpostcheck
15 #define petsclinesearchgetpostcheck_     petsclinesearchgetpostcheck
16 
17 #endif
18 
19 /* fortranpointers go: shell, precheck, postcheck */
20 
21 static PetscErrorCode ourpetsclinesearchprecheck(PetscLineSearch linesearch, Vec X, Vec Y, PetscBool * changed, void * ctx)
22 {
23   PetscErrorCode ierr = 0;
24   (*(void (PETSC_STDCALL *)(PetscLineSearch*,Vec*, Vec*, PetscBool*,void*,PetscErrorCode*))(((PetscObject)linesearch)->fortran_func_pointers[1]))(&linesearch,&X,&Y,changed,ctx,&ierr);CHKERRQ(ierr);
25   return 0;
26 }
27 
28 static PetscErrorCode ourpetsclinesearchpostcheck(PetscLineSearch linesearch, Vec X, Vec Y, Vec W, PetscBool * changed_Y, PetscBool * changed_W, void * ctx)
29 {
30   PetscErrorCode ierr = 0;
31   (*(void (PETSC_STDCALL *)(PetscLineSearch*,Vec*,Vec*,Vec*,PetscBool*,PetscBool*,void*,PetscErrorCode*))
32    (((PetscObject)linesearch)->fortran_func_pointers[2]))(&linesearch,&X,&Y,&W,changed_Y,changed_W,ctx,&ierr);CHKERRQ(ierr);
33   return 0;
34 }
35 
36 EXTERN_C_BEGIN
37 
38 void PETSC_STDCALL petsclinesearchsettype_(PetscLineSearch *linesearch,CHAR type PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
39 {
40   char *t;
41 
42   FIXCHAR(type,len,t);
43   *ierr = PetscLineSearchSetType(*linesearch,t);
44   FREECHAR(type,t);
45 }
46 
47 
48 void PETSC_STDCALL petsclinesearchsetprecheck_(PetscLineSearch *linesearch,
49                                                void (PETSC_STDCALL *func)(PetscLineSearch*,Vec*,Vec*,PetscBool*,PetscErrorCode*),
50                                                void *ctx,
51                                                PetscErrorCode *ierr)
52 {
53   PetscObjectAllocateFortranPointers(*linesearch,3);
54   ((PetscObject)*linesearch)->fortran_func_pointers[1] = (PetscVoidFunction)func;
55   *ierr = PetscLineSearchSetPreCheck(*linesearch,ourpetsclinesearchprecheck,ctx);
56 }
57 
58 void PETSC_STDCALL petsclinesearchsetpostcheck_(PetscLineSearch *linesearch,
59                                                 void (PETSC_STDCALL *func)(PetscLineSearch*,Vec*,Vec*,Vec*,PetscBool*,PetscBool*,PetscErrorCode*,void*),
60                                                void *ctx,
61                                                PetscErrorCode *ierr)
62 {
63   PetscObjectAllocateFortranPointers(*linesearch,3);
64   ((PetscObject)*linesearch)->fortran_func_pointers[2] = (PetscVoidFunction)func;
65   *ierr = PetscLineSearchSetPostCheck(*linesearch,ourpetsclinesearchpostcheck,ctx);
66 }
67 
68 
69 EXTERN_C_END
70