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