16dd63270SBarry Smith #include <petsc/private/ftnimpl.h> 2ea5d4fccSPeter Brune #include <petscsnes.h> 3ea5d4fccSPeter Brune 4ea5d4fccSPeter Brune #if defined(PETSC_HAVE_FORTRAN_CAPS) 5f1c6b773SPeter Brune #define sneslinesearchsetprecheck_ SNESLINESEARCHSETPRECHECK 6f1c6b773SPeter Brune #define sneslinesearchgetprecheck_ SNESLINESEARCHGETPRECHECK 7f1c6b773SPeter Brune #define sneslinesearchsetpostcheck_ SNESLINESEARCHSETPOSTCHECK 8f1c6b773SPeter Brune #define sneslinesearchgetpostcheck_ SNESLINESEARCHGETPOSTCHECK 9ea5d4fccSPeter Brune #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE) 10f1c6b773SPeter Brune #define sneslinesearchsetprecheck_ sneslinesearchsetprecheck 11f1c6b773SPeter Brune #define sneslinesearchgetprecheck_ sneslinesearchgetprecheck 12f1c6b773SPeter Brune #define sneslinesearchsetpostcheck_ sneslinesearchsetpostcheck 13f1c6b773SPeter Brune #define sneslinesearchgetpostcheck_ sneslinesearchgetpostcheck 14ea5d4fccSPeter Brune #endif 15ea5d4fccSPeter Brune 16c87759e9SPeter Brune /* fortranpointers go: shell, precheck, postcheck */ 17c87759e9SPeter Brune 18f1c6b773SPeter Brune static PetscErrorCode oursneslinesearchprecheck(SNESLineSearch linesearch, Vec X, Vec Y, PetscBool *changed, void *ctx) 19c87759e9SPeter Brune { 205f80ce2aSJacob Faibussowitsch PetscFunctionBegin; 219566063dSJacob Faibussowitsch PetscCallFortranVoidFunction((*(void (*)(SNESLineSearch *, Vec *, Vec *, PetscBool *, void *, PetscErrorCode *))(((PetscObject)linesearch)->fortran_func_pointers[1]))(&linesearch, &X, &Y, changed, ctx, &ierr)); 223ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 23c87759e9SPeter Brune } 24c87759e9SPeter Brune 25f1c6b773SPeter Brune static PetscErrorCode oursneslinesearchpostcheck(SNESLineSearch linesearch, Vec X, Vec Y, Vec W, PetscBool *changed_Y, PetscBool *changed_W, void *ctx) 26c87759e9SPeter Brune { 275f80ce2aSJacob Faibussowitsch PetscFunctionBegin; 289566063dSJacob 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)); 293ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 30c87759e9SPeter Brune } 31c87759e9SPeter Brune 3219caf8f3SSatish Balay PETSC_EXTERN void sneslinesearchsetprecheck_(SNESLineSearch *linesearch, void (*func)(SNESLineSearch *, Vec *, Vec *, PetscBool *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr) 33c87759e9SPeter Brune { 34c87759e9SPeter Brune PetscObjectAllocateFortranPointers(*linesearch, 3); 35*5ebfa9e9SBarry Smith ((PetscObject)*linesearch)->fortran_func_pointers[1] = (PetscFortranCallbackFn *)func; 36f5af7f23SKarl Rupp 37f1c6b773SPeter Brune *ierr = SNESLineSearchSetPreCheck(*linesearch, oursneslinesearchprecheck, ctx); 38c87759e9SPeter Brune } 39c87759e9SPeter Brune 4019caf8f3SSatish Balay PETSC_EXTERN void sneslinesearchsetpostcheck_(SNESLineSearch *linesearch, void (*func)(SNESLineSearch *, Vec *, Vec *, Vec *, PetscBool *, PetscBool *, PetscErrorCode *, void *), void *ctx, PetscErrorCode *ierr) 41c87759e9SPeter Brune { 42c87759e9SPeter Brune PetscObjectAllocateFortranPointers(*linesearch, 3); 43*5ebfa9e9SBarry Smith ((PetscObject)*linesearch)->fortran_func_pointers[2] = (PetscFortranCallbackFn *)func; 44f5af7f23SKarl Rupp 45f1c6b773SPeter Brune *ierr = SNESLineSearchSetPostCheck(*linesearch, oursneslinesearchpostcheck, ctx); 46c87759e9SPeter Brune } 47