xref: /petsc/src/snes/linesearch/interface/ftn-custom/zlinesearchf.c (revision b45d2f2cb7e031d9c0de5873eca80614ca7b863b)
1*b45d2f2cSJed Brown #include <petsc-private/fortranimpl.h>
2ea5d4fccSPeter Brune #include <petscsnes.h>
3ea5d4fccSPeter Brune 
4ea5d4fccSPeter Brune #if defined(PETSC_HAVE_FORTRAN_CAPS)
5f1c6b773SPeter Brune #define sneslinesearchsettype_          SNESLINESEARCHSETTYPE
6f1c6b773SPeter Brune #define sneslinesearchsetprecheck_      SNESLINESEARCHSETPRECHECK
7f1c6b773SPeter Brune #define sneslinesearchgetprecheck_      SNESLINESEARCHGETPRECHECK
8f1c6b773SPeter Brune #define sneslinesearchsetpostcheck_     SNESLINESEARCHSETPOSTCHECK
9f1c6b773SPeter Brune #define sneslinesearchgetpostcheck_     SNESLINESEARCHGETPOSTCHECK
10ea5d4fccSPeter Brune #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
11f1c6b773SPeter Brune #define sneslinesearchsettype_          sneslinesearchsettype
12f1c6b773SPeter Brune #define sneslinesearchsetprecheck_      sneslinesearchsetprecheck
13f1c6b773SPeter Brune #define sneslinesearchgetprecheck_      sneslinesearchgetprecheck
14f1c6b773SPeter Brune #define sneslinesearchsetpostcheck_     sneslinesearchsetpostcheck
15f1c6b773SPeter Brune #define sneslinesearchgetpostcheck_     sneslinesearchgetpostcheck
16c87759e9SPeter Brune 
17ea5d4fccSPeter Brune #endif
18ea5d4fccSPeter Brune 
19c87759e9SPeter Brune /* fortranpointers go: shell, precheck, postcheck */
20c87759e9SPeter Brune 
21f1c6b773SPeter Brune static PetscErrorCode oursneslinesearchprecheck(SNESLineSearch linesearch, Vec X, Vec Y, PetscBool * changed, void * ctx)
22c87759e9SPeter Brune {
23c87759e9SPeter Brune   PetscErrorCode ierr = 0;
24f1c6b773SPeter Brune   (*(void (PETSC_STDCALL *)(SNESLineSearch*,Vec*, Vec*, PetscBool*,void*,PetscErrorCode*))(((PetscObject)linesearch)->fortran_func_pointers[1]))(&linesearch,&X,&Y,changed,ctx,&ierr);CHKERRQ(ierr);
25c87759e9SPeter Brune   return 0;
26c87759e9SPeter Brune }
27c87759e9SPeter Brune 
28f1c6b773SPeter Brune static PetscErrorCode oursneslinesearchpostcheck(SNESLineSearch linesearch, Vec X, Vec Y, Vec W, PetscBool * changed_Y, PetscBool * changed_W, void * ctx)
29c87759e9SPeter Brune {
30c87759e9SPeter Brune   PetscErrorCode ierr = 0;
31f1c6b773SPeter Brune   (*(void (PETSC_STDCALL *)(SNESLineSearch*,Vec*,Vec*,Vec*,PetscBool*,PetscBool*,void*,PetscErrorCode*))
32c87759e9SPeter Brune    (((PetscObject)linesearch)->fortran_func_pointers[2]))(&linesearch,&X,&Y,&W,changed_Y,changed_W,ctx,&ierr);CHKERRQ(ierr);
33c87759e9SPeter Brune   return 0;
34c87759e9SPeter Brune }
35c87759e9SPeter Brune 
36ea5d4fccSPeter Brune EXTERN_C_BEGIN
37ea5d4fccSPeter Brune 
38f1c6b773SPeter Brune void PETSC_STDCALL sneslinesearchsettype_(SNESLineSearch *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);
43f1c6b773SPeter Brune   *ierr = SNESLineSearchSetType(*linesearch,t);
44ea5d4fccSPeter Brune   FREECHAR(type,t);
45ea5d4fccSPeter Brune }
46c87759e9SPeter Brune 
47c87759e9SPeter Brune 
48f1c6b773SPeter Brune void PETSC_STDCALL sneslinesearchsetprecheck_(SNESLineSearch *linesearch,
49f1c6b773SPeter Brune                                               void (PETSC_STDCALL *func)(SNESLineSearch*,Vec*,Vec*,PetscBool*,PetscErrorCode*),
50c87759e9SPeter Brune                                               void *ctx,
51c87759e9SPeter Brune                                               PetscErrorCode *ierr)
52c87759e9SPeter Brune {
53c87759e9SPeter Brune   PetscObjectAllocateFortranPointers(*linesearch,3);
54c87759e9SPeter Brune   ((PetscObject)*linesearch)->fortran_func_pointers[1] = (PetscVoidFunction)func;
55f1c6b773SPeter Brune   *ierr = SNESLineSearchSetPreCheck(*linesearch,oursneslinesearchprecheck,ctx);
56c87759e9SPeter Brune }
57c87759e9SPeter Brune 
58f1c6b773SPeter Brune void PETSC_STDCALL sneslinesearchsetpostcheck_(SNESLineSearch *linesearch,
59f1c6b773SPeter Brune                                                 void (PETSC_STDCALL *func)(SNESLineSearch*,Vec*,Vec*,Vec*,PetscBool*,PetscBool*,PetscErrorCode*,void*),
60c87759e9SPeter Brune                                                void *ctx,
61c87759e9SPeter Brune                                                PetscErrorCode *ierr)
62c87759e9SPeter Brune {
63c87759e9SPeter Brune   PetscObjectAllocateFortranPointers(*linesearch,3);
64c87759e9SPeter Brune   ((PetscObject)*linesearch)->fortran_func_pointers[2] = (PetscVoidFunction)func;
65f1c6b773SPeter Brune   *ierr = SNESLineSearchSetPostCheck(*linesearch,oursneslinesearchpostcheck,ctx);
66c87759e9SPeter Brune }
67c87759e9SPeter Brune 
68c87759e9SPeter Brune 
69ea5d4fccSPeter Brune EXTERN_C_END
70