1e54e4138SSatish Balay #include "zpetsc.h" 2e54e4138SSatish Balay #include "petscpc.h" 3e54e4138SSatish Balay 4e54e4138SSatish Balay #if defined(PETSC_HAVE_FORTRAN_CAPS) 5e54e4138SSatish Balay #define pcshellsetapply_ PCSHELLSETAPPLY 6e54e4138SSatish Balay #define pcshellsetapplyrichardson_ PCSHELLSETAPPLYRICHARDSON 7e54e4138SSatish Balay #define pcshellsetapplytranspose_ PCSHELLSETAPPLYTRANSPOSE 8e54e4138SSatish Balay #define pcshellsetsetup_ PCSHELLSETSETUP 9*1d2e4005SSatish Balay #define pcshellsetname_ PCSHELLSETNAME 10e54e4138SSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE) 11e54e4138SSatish Balay #define pcshellsetapply_ pcshellsetapply 12e54e4138SSatish Balay #define pcshellsetapplyrichardson_ pcshellsetapplyrichardson 13e54e4138SSatish Balay #define pcshellsetapplytranspose_ pcshellsetapplytranspose 14e54e4138SSatish Balay #define pcshellsetsetup_ pcshellsetsetup 15*1d2e4005SSatish Balay #define pcshellsetname_ pcshellsetname 16e54e4138SSatish Balay #endif 17e54e4138SSatish Balay 18e54e4138SSatish Balay EXTERN_C_BEGIN 19e54e4138SSatish Balay static void (PETSC_STDCALL *f1)(void*,Vec*,Vec*,PetscErrorCode*); 20e54e4138SSatish Balay static void (PETSC_STDCALL *f2)(void*,Vec*,Vec*,Vec*,PetscReal*,PetscReal*,PetscReal*,PetscInt*,PetscErrorCode*); 21e54e4138SSatish Balay static void (PETSC_STDCALL *f3)(void*,Vec*,Vec*,PetscErrorCode*); 22e54e4138SSatish Balay static void (PETSC_STDCALL *f9)(void*,PetscErrorCode*); 23e54e4138SSatish Balay EXTERN_C_END 24e54e4138SSatish Balay 25e54e4138SSatish Balay /* These are not extern C because they are passed into non-extern C user level functions */ 26e54e4138SSatish Balay static PetscErrorCode ourshellapply(void *ctx,Vec x,Vec y) 27e54e4138SSatish Balay { 28e54e4138SSatish Balay PetscErrorCode ierr = 0; 29e54e4138SSatish Balay (*f1)(ctx,&x,&y,&ierr);CHKERRQ(ierr); 30e54e4138SSatish Balay return 0; 31e54e4138SSatish Balay } 32e54e4138SSatish Balay 33e54e4138SSatish Balay static PetscErrorCode ourapplyrichardson(void *ctx,Vec x,Vec y,Vec w,PetscReal rtol,PetscReal abstol,PetscReal dtol,PetscInt m) 34e54e4138SSatish Balay { 35e54e4138SSatish Balay PetscErrorCode ierr = 0; 36e54e4138SSatish Balay 37e54e4138SSatish Balay (*f2)(ctx,&x,&y,&w,&rtol,&abstol,&dtol,&m,&ierr);CHKERRQ(ierr); 38e54e4138SSatish Balay return 0; 39e54e4138SSatish Balay } 40e54e4138SSatish Balay 41e54e4138SSatish Balay static PetscErrorCode ourshellapplytranspose(void *ctx,Vec x,Vec y) 42e54e4138SSatish Balay { 43e54e4138SSatish Balay PetscErrorCode ierr = 0; 44e54e4138SSatish Balay (*f3)(ctx,&x,&y,&ierr);CHKERRQ(ierr); 45e54e4138SSatish Balay return 0; 46e54e4138SSatish Balay } 47e54e4138SSatish Balay 48e54e4138SSatish Balay static PetscErrorCode ourshellsetup(void *ctx) 49e54e4138SSatish Balay { 50e54e4138SSatish Balay PetscErrorCode ierr = 0; 51e54e4138SSatish Balay 52e54e4138SSatish Balay (*f9)(ctx,&ierr);CHKERRQ(ierr); 53e54e4138SSatish Balay return 0; 54e54e4138SSatish Balay } 55e54e4138SSatish Balay 56e54e4138SSatish Balay EXTERN_C_BEGIN 57e54e4138SSatish Balay 58e54e4138SSatish Balay void PETSC_STDCALL pcshellsetapply_(PC *pc,void (PETSC_STDCALL *apply)(void*,Vec *,Vec *,PetscErrorCode*), 59e54e4138SSatish Balay PetscErrorCode *ierr) 60e54e4138SSatish Balay { 61e54e4138SSatish Balay f1 = apply; 62e54e4138SSatish Balay *ierr = PCShellSetApply(*pc,ourshellapply); 63e54e4138SSatish Balay } 64e54e4138SSatish Balay 65e54e4138SSatish Balay void PETSC_STDCALL pcshellsetapplyrichardson_(PC *pc, 66e54e4138SSatish Balay void (PETSC_STDCALL *apply)(void*,Vec *,Vec *,Vec *,PetscReal*,PetscReal*,PetscReal*,PetscInt*,PetscErrorCode*), 67e54e4138SSatish Balay PetscErrorCode *ierr) 68e54e4138SSatish Balay { 69e54e4138SSatish Balay f2 = apply; 70e54e4138SSatish Balay *ierr = PCShellSetApplyRichardson(*pc,ourapplyrichardson); 71e54e4138SSatish Balay } 72e54e4138SSatish Balay 73e54e4138SSatish Balay void PETSC_STDCALL pcshellsetapplytranspose_(PC *pc,void (PETSC_STDCALL *applytranspose)(void*,Vec *,Vec *,PetscErrorCode*), 74e54e4138SSatish Balay PetscErrorCode *ierr) 75e54e4138SSatish Balay { 76e54e4138SSatish Balay f3 = applytranspose; 77e54e4138SSatish Balay *ierr = PCShellSetApplyTranspose(*pc,ourshellapplytranspose); 78e54e4138SSatish Balay } 79e54e4138SSatish Balay 80e54e4138SSatish Balay void PETSC_STDCALL pcshellsetsetup_(PC *pc,void (PETSC_STDCALL *setup)(void*,PetscErrorCode*),PetscErrorCode *ierr) 81e54e4138SSatish Balay { 82e54e4138SSatish Balay f9 = setup; 83e54e4138SSatish Balay *ierr = PCShellSetSetUp(*pc,ourshellsetup); 84e54e4138SSatish Balay } 85e54e4138SSatish Balay 86*1d2e4005SSatish Balay void PETSC_STDCALL pcshellsetname_(PC *pc,CHAR name PETSC_MIXED_LEN(len), PetscErrorCode *ierr PETSC_END_LEN(len)) 87*1d2e4005SSatish Balay { 88*1d2e4005SSatish Balay char *c; 89*1d2e4005SSatish Balay FIXCHAR(name,len,c); 90*1d2e4005SSatish Balay *ierr = PCShellSetName(*pc,c); 91*1d2e4005SSatish Balay FREECHAR(name,c); 92*1d2e4005SSatish Balay } 93*1d2e4005SSatish Balay 94e54e4138SSatish Balay /* -----------------------------------------------------------------*/ 95e54e4138SSatish Balay 96e54e4138SSatish Balay EXTERN_C_END 97