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