1af0996ceSBarry Smith #include <petsc/private/fortranimpl.h> 2ea5d4fccSPeter Brune #include <petscsnes.h> 3ea5d4fccSPeter Brune 4ea5d4fccSPeter Brune #if defined(PETSC_HAVE_FORTRAN_CAPS) 5f1c6b773SPeter Brune #define sneslinesearchsettype_ SNESLINESEARCHSETTYPE 6f1c6b773SPeter Brune #define sneslinesearchsetprecheck_ SNESLINESEARCHSETPRECHECK 7f1c6b773SPeter Brune #define sneslinesearchgetprecheck_ SNESLINESEARCHGETPRECHECK 8f1c6b773SPeter Brune #define sneslinesearchsetpostcheck_ SNESLINESEARCHSETPOSTCHECK 9f1c6b773SPeter Brune #define sneslinesearchgetpostcheck_ SNESLINESEARCHGETPOSTCHECK 10ea5d4fccSPeter Brune #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE) 11f1c6b773SPeter Brune #define sneslinesearchsettype_ sneslinesearchsettype 12f1c6b773SPeter Brune #define sneslinesearchsetprecheck_ sneslinesearchsetprecheck 13f1c6b773SPeter Brune #define sneslinesearchgetprecheck_ sneslinesearchgetprecheck 14f1c6b773SPeter Brune #define sneslinesearchsetpostcheck_ sneslinesearchsetpostcheck 15f1c6b773SPeter Brune #define sneslinesearchgetpostcheck_ sneslinesearchgetpostcheck 16c87759e9SPeter Brune 17ea5d4fccSPeter Brune #endif 18ea5d4fccSPeter Brune 19c87759e9SPeter Brune /* fortranpointers go: shell, precheck, postcheck */ 20c87759e9SPeter Brune 21f1c6b773SPeter Brune static PetscErrorCode oursneslinesearchprecheck(SNESLineSearch linesearch, Vec X, Vec Y, PetscBool * changed, void * ctx) 22c87759e9SPeter Brune { 23c87759e9SPeter Brune PetscErrorCode ierr = 0; 24*19caf8f3SSatish Balay (*(void (*)(SNESLineSearch*,Vec*, Vec*, PetscBool*,void*,PetscErrorCode*))(((PetscObject)linesearch)->fortran_func_pointers[1]))(&linesearch,&X,&Y,changed,ctx,&ierr);CHKERRQ(ierr); 25c87759e9SPeter Brune return 0; 26c87759e9SPeter Brune } 27c87759e9SPeter Brune 28f1c6b773SPeter Brune static PetscErrorCode oursneslinesearchpostcheck(SNESLineSearch linesearch, Vec X, Vec Y, Vec W, PetscBool * changed_Y, PetscBool * changed_W, void * ctx) 29c87759e9SPeter Brune { 30c87759e9SPeter Brune PetscErrorCode ierr = 0; 31*19caf8f3SSatish Balay (*(void (*)(SNESLineSearch*,Vec*,Vec*,Vec*,PetscBool*,PetscBool*,void*,PetscErrorCode*)) 32c87759e9SPeter Brune (((PetscObject)linesearch)->fortran_func_pointers[2]))(&linesearch,&X,&Y,&W,changed_Y,changed_W,ctx,&ierr);CHKERRQ(ierr); 33c87759e9SPeter Brune return 0; 34c87759e9SPeter Brune } 35c87759e9SPeter Brune 36*19caf8f3SSatish Balay PETSC_EXTERN void sneslinesearchsettype_(SNESLineSearch *linesearch,char* type,PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len) 37ea5d4fccSPeter Brune { 38ea5d4fccSPeter Brune char *t; 39ea5d4fccSPeter Brune 40ea5d4fccSPeter Brune FIXCHAR(type,len,t); 41d49bb8f9SBarry Smith *ierr = SNESLineSearchSetType(*linesearch,t);if (*ierr) return; 42ea5d4fccSPeter Brune FREECHAR(type,t); 43ea5d4fccSPeter Brune } 44c87759e9SPeter Brune 45c87759e9SPeter Brune 46*19caf8f3SSatish Balay PETSC_EXTERN void sneslinesearchsetprecheck_(SNESLineSearch *linesearch,void (*func)(SNESLineSearch*,Vec*,Vec*,PetscBool*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr) 47c87759e9SPeter Brune { 48c87759e9SPeter Brune PetscObjectAllocateFortranPointers(*linesearch,3); 49c87759e9SPeter Brune ((PetscObject)*linesearch)->fortran_func_pointers[1] = (PetscVoidFunction)func; 50f5af7f23SKarl Rupp 51f1c6b773SPeter Brune *ierr = SNESLineSearchSetPreCheck(*linesearch,oursneslinesearchprecheck,ctx); 52c87759e9SPeter Brune } 53c87759e9SPeter Brune 54*19caf8f3SSatish Balay PETSC_EXTERN void sneslinesearchsetpostcheck_(SNESLineSearch *linesearch,void (*func)(SNESLineSearch*,Vec*,Vec*,Vec*,PetscBool*,PetscBool*,PetscErrorCode*,void*),void *ctx,PetscErrorCode *ierr) 55c87759e9SPeter Brune { 56c87759e9SPeter Brune PetscObjectAllocateFortranPointers(*linesearch,3); 57c87759e9SPeter Brune ((PetscObject)*linesearch)->fortran_func_pointers[2] = (PetscVoidFunction)func; 58f5af7f23SKarl Rupp 59f1c6b773SPeter Brune *ierr = SNESLineSearchSetPostCheck(*linesearch,oursneslinesearchpostcheck,ctx); 60c87759e9SPeter Brune } 61c87759e9SPeter Brune 62