xref: /petsc/src/snes/linesearch/interface/ftn-custom/zlinesearchf.c (revision 5f80ce2ab25dff0f4601e710601cbbcecf323266)
1af0996ceSBarry Smith #include <petsc/private/fortranimpl.h>
2ea5d4fccSPeter Brune #include <petscsnes.h>
3ea5d4fccSPeter Brune 
4ea5d4fccSPeter Brune #if defined(PETSC_HAVE_FORTRAN_CAPS)
5a80ff896SJed Brown #define sneslinesearchgettype_          SNESLINESEARCHGETTYPE
6f1c6b773SPeter Brune #define sneslinesearchsettype_          SNESLINESEARCHSETTYPE
7f1c6b773SPeter Brune #define sneslinesearchsetprecheck_      SNESLINESEARCHSETPRECHECK
8f1c6b773SPeter Brune #define sneslinesearchgetprecheck_      SNESLINESEARCHGETPRECHECK
9f1c6b773SPeter Brune #define sneslinesearchsetpostcheck_     SNESLINESEARCHSETPOSTCHECK
10f1c6b773SPeter Brune #define sneslinesearchgetpostcheck_     SNESLINESEARCHGETPOSTCHECK
11ea5d4fccSPeter Brune #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
12a80ff896SJed Brown #define sneslinesearchgettype_          sneslinesearchgettype
13f1c6b773SPeter Brune #define sneslinesearchsettype_          sneslinesearchsettype
14f1c6b773SPeter Brune #define sneslinesearchsetprecheck_      sneslinesearchsetprecheck
15f1c6b773SPeter Brune #define sneslinesearchgetprecheck_      sneslinesearchgetprecheck
16f1c6b773SPeter Brune #define sneslinesearchsetpostcheck_     sneslinesearchsetpostcheck
17f1c6b773SPeter Brune #define sneslinesearchgetpostcheck_     sneslinesearchgetpostcheck
18c87759e9SPeter Brune 
19ea5d4fccSPeter Brune #endif
20ea5d4fccSPeter Brune 
21c87759e9SPeter Brune /* fortranpointers go: shell, precheck, postcheck */
22c87759e9SPeter Brune 
23f1c6b773SPeter Brune static PetscErrorCode oursneslinesearchprecheck(SNESLineSearch linesearch, Vec X, Vec Y, PetscBool * changed, void * ctx)
24c87759e9SPeter Brune {
25*5f80ce2aSJacob Faibussowitsch   PetscFunctionBegin;
26*5f80ce2aSJacob Faibussowitsch   CHKERR_FORTRAN_VOID_FUNCTION((*(void (*)(SNESLineSearch*,Vec*, Vec*, PetscBool*,void*,PetscErrorCode*))(((PetscObject)linesearch)->fortran_func_pointers[1]))(&linesearch,&X,&Y,changed,ctx,&ierr));
27*5f80ce2aSJacob Faibussowitsch   PetscFunctionReturn(0);
28c87759e9SPeter Brune }
29c87759e9SPeter Brune 
30f1c6b773SPeter Brune static PetscErrorCode oursneslinesearchpostcheck(SNESLineSearch linesearch, Vec X, Vec Y, Vec W, PetscBool * changed_Y, PetscBool * changed_W, void * ctx)
31c87759e9SPeter Brune {
32*5f80ce2aSJacob Faibussowitsch   PetscFunctionBegin;
33*5f80ce2aSJacob Faibussowitsch   CHKERR_FORTRAN_VOID_FUNCTION((*(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));
34*5f80ce2aSJacob Faibussowitsch   PetscFunctionReturn(0);
35c87759e9SPeter Brune }
36c87759e9SPeter Brune 
37a80ff896SJed Brown PETSC_EXTERN void sneslinesearchgettype_(SNESLineSearch *linesearch,char* name, PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len)
38a80ff896SJed Brown {
39a80ff896SJed Brown   const char *tname;
40a80ff896SJed Brown 
41a80ff896SJed Brown   *ierr = SNESLineSearchGetType(*linesearch,&tname);
42a80ff896SJed Brown   *ierr = PetscStrncpy(name,tname,len);if (*ierr) return;
43a80ff896SJed Brown   FIXRETURNCHAR(PETSC_TRUE,name,len);
44a80ff896SJed Brown }
45a80ff896SJed Brown 
4619caf8f3SSatish Balay PETSC_EXTERN void sneslinesearchsettype_(SNESLineSearch *linesearch,char* type,PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len)
47ea5d4fccSPeter Brune {
48ea5d4fccSPeter Brune   char *t;
49ea5d4fccSPeter Brune 
50ea5d4fccSPeter Brune   FIXCHAR(type,len,t);
51d49bb8f9SBarry Smith   *ierr = SNESLineSearchSetType(*linesearch,t);if (*ierr) return;
52ea5d4fccSPeter Brune   FREECHAR(type,t);
53ea5d4fccSPeter Brune }
54c87759e9SPeter Brune 
5519caf8f3SSatish Balay PETSC_EXTERN void sneslinesearchsetprecheck_(SNESLineSearch *linesearch,void (*func)(SNESLineSearch*,Vec*,Vec*,PetscBool*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr)
56c87759e9SPeter Brune {
57c87759e9SPeter Brune   PetscObjectAllocateFortranPointers(*linesearch,3);
58c87759e9SPeter Brune   ((PetscObject)*linesearch)->fortran_func_pointers[1] = (PetscVoidFunction)func;
59f5af7f23SKarl Rupp 
60f1c6b773SPeter Brune   *ierr = SNESLineSearchSetPreCheck(*linesearch,oursneslinesearchprecheck,ctx);
61c87759e9SPeter Brune }
62c87759e9SPeter Brune 
6319caf8f3SSatish Balay PETSC_EXTERN void sneslinesearchsetpostcheck_(SNESLineSearch *linesearch,void (*func)(SNESLineSearch*,Vec*,Vec*,Vec*,PetscBool*,PetscBool*,PetscErrorCode*,void*),void *ctx,PetscErrorCode *ierr)
64c87759e9SPeter Brune {
65c87759e9SPeter Brune   PetscObjectAllocateFortranPointers(*linesearch,3);
66c87759e9SPeter Brune   ((PetscObject)*linesearch)->fortran_func_pointers[2] = (PetscVoidFunction)func;
67f5af7f23SKarl Rupp 
68f1c6b773SPeter Brune   *ierr = SNESLineSearchSetPostCheck(*linesearch,oursneslinesearchpostcheck,ctx);
69c87759e9SPeter Brune }
70c87759e9SPeter Brune 
71