xref: /petsc/src/snes/linesearch/interface/ftn-custom/zlinesearchf.c (revision 8434afd195968570cfdb5bc7b9cfc0a316d974ae)
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 {
255f80ce2aSJacob Faibussowitsch   PetscFunctionBegin;
269566063dSJacob Faibussowitsch   PetscCallFortranVoidFunction((*(void (*)(SNESLineSearch *, Vec *, Vec *, PetscBool *, void *, PetscErrorCode *))(((PetscObject)linesearch)->fortran_func_pointers[1]))(&linesearch, &X, &Y, changed, ctx, &ierr));
273ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
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 {
325f80ce2aSJacob Faibussowitsch   PetscFunctionBegin;
339566063dSJacob Faibussowitsch   PetscCallFortranVoidFunction((*(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));
343ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
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);
425975b3b6SBarry Smith   *ierr = PetscStrncpy(name, tname, len);
435975b3b6SBarry Smith   if (*ierr) return;
44a80ff896SJed Brown   FIXRETURNCHAR(PETSC_TRUE, name, len);
45a80ff896SJed Brown }
46a80ff896SJed Brown 
4719caf8f3SSatish Balay PETSC_EXTERN void sneslinesearchsettype_(SNESLineSearch *linesearch, char *type, PetscErrorCode *ierr, PETSC_FORTRAN_CHARLEN_T len)
48ea5d4fccSPeter Brune {
49ea5d4fccSPeter Brune   char *t;
50ea5d4fccSPeter Brune 
51ea5d4fccSPeter Brune   FIXCHAR(type, len, t);
525975b3b6SBarry Smith   *ierr = SNESLineSearchSetType(*linesearch, t);
535975b3b6SBarry Smith   if (*ierr) return;
54ea5d4fccSPeter Brune   FREECHAR(type, t);
55ea5d4fccSPeter Brune }
56c87759e9SPeter Brune 
5719caf8f3SSatish Balay PETSC_EXTERN void sneslinesearchsetprecheck_(SNESLineSearch *linesearch, void (*func)(SNESLineSearch *, Vec *, Vec *, PetscBool *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
58c87759e9SPeter Brune {
59c87759e9SPeter Brune   PetscObjectAllocateFortranPointers(*linesearch, 3);
60*8434afd1SBarry Smith   ((PetscObject)*linesearch)->fortran_func_pointers[1] = (PetscVoidFn *)func;
61f5af7f23SKarl Rupp 
62f1c6b773SPeter Brune   *ierr = SNESLineSearchSetPreCheck(*linesearch, oursneslinesearchprecheck, ctx);
63c87759e9SPeter Brune }
64c87759e9SPeter Brune 
6519caf8f3SSatish Balay PETSC_EXTERN void sneslinesearchsetpostcheck_(SNESLineSearch *linesearch, void (*func)(SNESLineSearch *, Vec *, Vec *, Vec *, PetscBool *, PetscBool *, PetscErrorCode *, void *), void *ctx, PetscErrorCode *ierr)
66c87759e9SPeter Brune {
67c87759e9SPeter Brune   PetscObjectAllocateFortranPointers(*linesearch, 3);
68*8434afd1SBarry Smith   ((PetscObject)*linesearch)->fortran_func_pointers[2] = (PetscVoidFn *)func;
69f5af7f23SKarl Rupp 
70f1c6b773SPeter Brune   *ierr = SNESLineSearchSetPostCheck(*linesearch, oursneslinesearchpostcheck, ctx);
71c87759e9SPeter Brune }
72