xref: /petsc/src/snes/linesearch/interface/ftn-custom/zlinesearchf.c (revision 5b6bfdb9644f185dbf5e5a09b808ec241507e1e7)
1 #include <petsc/private/fortranimpl.h>
2 #include <petscsnes.h>
3 
4 #if defined(PETSC_HAVE_FORTRAN_CAPS)
5 #define sneslinesearchsettype_          SNESLINESEARCHSETTYPE
6 #define sneslinesearchsetprecheck_      SNESLINESEARCHSETPRECHECK
7 #define sneslinesearchgetprecheck_      SNESLINESEARCHGETPRECHECK
8 #define sneslinesearchsetpostcheck_     SNESLINESEARCHSETPOSTCHECK
9 #define sneslinesearchgetpostcheck_     SNESLINESEARCHGETPOSTCHECK
10 #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
11 #define sneslinesearchsettype_          sneslinesearchsettype
12 #define sneslinesearchsetprecheck_      sneslinesearchsetprecheck
13 #define sneslinesearchgetprecheck_      sneslinesearchgetprecheck
14 #define sneslinesearchsetpostcheck_     sneslinesearchsetpostcheck
15 #define sneslinesearchgetpostcheck_     sneslinesearchgetpostcheck
16 
17 #endif
18 
19 /* fortranpointers go: shell, precheck, postcheck */
20 
21 static PetscErrorCode oursneslinesearchprecheck(SNESLineSearch linesearch, Vec X, Vec Y, PetscBool * changed, void * ctx)
22 {
23   PetscErrorCode ierr = 0;
24   (*(void (PETSC_STDCALL*)(SNESLineSearch*,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 oursneslinesearchpostcheck(SNESLineSearch linesearch, Vec X, Vec Y, Vec W, PetscBool * changed_Y, PetscBool * changed_W, void * ctx)
29 {
30   PetscErrorCode ierr = 0;
31   (*(void (PETSC_STDCALL*)(SNESLineSearch*,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 PETSC_EXTERN void PETSC_STDCALL sneslinesearchsettype_(SNESLineSearch *linesearch,char* type PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
37 {
38   char *t;
39 
40   FIXCHAR(type,len,t);
41   *ierr = SNESLineSearchSetType(*linesearch,t);
42   FREECHAR(type,t);
43 }
44 
45 
46 PETSC_EXTERN void PETSC_STDCALL sneslinesearchsetprecheck_(SNESLineSearch *linesearch,void (PETSC_STDCALL*func)(SNESLineSearch*,Vec*,Vec*,PetscBool*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr)
47 {
48   PetscObjectAllocateFortranPointers(*linesearch,3);
49   ((PetscObject)*linesearch)->fortran_func_pointers[1] = (PetscVoidFunction)func;
50 
51   *ierr = SNESLineSearchSetPreCheck(*linesearch,oursneslinesearchprecheck,ctx);
52 }
53 
54 PETSC_EXTERN void PETSC_STDCALL sneslinesearchsetpostcheck_(SNESLineSearch *linesearch,void (PETSC_STDCALL*func)(SNESLineSearch*,Vec*,Vec*,Vec*,PetscBool*,PetscBool*,PetscErrorCode*,void*),void *ctx,PetscErrorCode *ierr)
55 {
56   PetscObjectAllocateFortranPointers(*linesearch,3);
57   ((PetscObject)*linesearch)->fortran_func_pointers[2] = (PetscVoidFunction)func;
58 
59   *ierr = SNESLineSearchSetPostCheck(*linesearch,oursneslinesearchpostcheck,ctx);
60 }
61 
62