1 #include <petsc/private/fortranimpl.h> 2 #include <petscsnes.h> 3 4 #if defined(PETSC_HAVE_FORTRAN_CAPS) 5 #define sneslinesearchsetprecheck_ SNESLINESEARCHSETPRECHECK 6 #define sneslinesearchgetprecheck_ SNESLINESEARCHGETPRECHECK 7 #define sneslinesearchsetpostcheck_ SNESLINESEARCHSETPOSTCHECK 8 #define sneslinesearchgetpostcheck_ SNESLINESEARCHGETPOSTCHECK 9 #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE) 10 #define sneslinesearchsetprecheck_ sneslinesearchsetprecheck 11 #define sneslinesearchgetprecheck_ sneslinesearchgetprecheck 12 #define sneslinesearchsetpostcheck_ sneslinesearchsetpostcheck 13 #define sneslinesearchgetpostcheck_ sneslinesearchgetpostcheck 14 15 #endif 16 17 /* fortranpointers go: shell, precheck, postcheck */ 18 19 static PetscErrorCode oursneslinesearchprecheck(SNESLineSearch linesearch, Vec X, Vec Y, PetscBool *changed, void *ctx) 20 { 21 PetscFunctionBegin; 22 PetscCallFortranVoidFunction((*(void (*)(SNESLineSearch *, Vec *, Vec *, PetscBool *, void *, PetscErrorCode *))(((PetscObject)linesearch)->fortran_func_pointers[1]))(&linesearch, &X, &Y, changed, ctx, &ierr)); 23 PetscFunctionReturn(PETSC_SUCCESS); 24 } 25 26 static PetscErrorCode oursneslinesearchpostcheck(SNESLineSearch linesearch, Vec X, Vec Y, Vec W, PetscBool *changed_Y, PetscBool *changed_W, void *ctx) 27 { 28 PetscFunctionBegin; 29 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)); 30 PetscFunctionReturn(PETSC_SUCCESS); 31 } 32 33 PETSC_EXTERN void sneslinesearchsetprecheck_(SNESLineSearch *linesearch, void (*func)(SNESLineSearch *, Vec *, Vec *, PetscBool *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr) 34 { 35 PetscObjectAllocateFortranPointers(*linesearch, 3); 36 ((PetscObject)*linesearch)->fortran_func_pointers[1] = (PetscVoidFn *)func; 37 38 *ierr = SNESLineSearchSetPreCheck(*linesearch, oursneslinesearchprecheck, ctx); 39 } 40 41 PETSC_EXTERN void sneslinesearchsetpostcheck_(SNESLineSearch *linesearch, void (*func)(SNESLineSearch *, Vec *, Vec *, Vec *, PetscBool *, PetscBool *, PetscErrorCode *, void *), void *ctx, PetscErrorCode *ierr) 42 { 43 PetscObjectAllocateFortranPointers(*linesearch, 3); 44 ((PetscObject)*linesearch)->fortran_func_pointers[2] = (PetscVoidFn *)func; 45 46 *ierr = SNESLineSearchSetPostCheck(*linesearch, oursneslinesearchpostcheck, ctx); 47 } 48