1b45d2f2cSJed Brown #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; 24f1c6b773SPeter Brune (*(void (PETSC_STDCALL*)(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; 31f1c6b773SPeter Brune (*(void (PETSC_STDCALL*)(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*8cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL sneslinesearchsettype_(SNESLineSearch *linesearch,CHAR type PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len)) 37ea5d4fccSPeter Brune { 38ea5d4fccSPeter Brune char *t; 39ea5d4fccSPeter Brune 40ea5d4fccSPeter Brune FIXCHAR(type,len,t); 41f1c6b773SPeter Brune *ierr = SNESLineSearchSetType(*linesearch,t); 42ea5d4fccSPeter Brune FREECHAR(type,t); 43ea5d4fccSPeter Brune } 44c87759e9SPeter Brune 45c87759e9SPeter Brune 46*8cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL sneslinesearchsetprecheck_(SNESLineSearch *linesearch,void (PETSC_STDCALL*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*8cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL sneslinesearchsetpostcheck_(SNESLineSearch *linesearch,void (PETSC_STDCALL*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