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