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