1ce0a2cd1SBarry Smith #include "private/fortranimpl.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 91d2e4005SSatish Balay #define pcshellsetname_ PCSHELLSETNAME 10*6895c445SBarry Smith #define pcshellsetcontext_ PCSHELLSETCONTEXT 11*6895c445SBarry Smith #define pcshellgetcontext_ PCSHELLGETCONTEXT 12e54e4138SSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE) 13e54e4138SSatish Balay #define pcshellsetapply_ pcshellsetapply 14e54e4138SSatish Balay #define pcshellsetapplyrichardson_ pcshellsetapplyrichardson 15e54e4138SSatish Balay #define pcshellsetapplytranspose_ pcshellsetapplytranspose 16e54e4138SSatish Balay #define pcshellsetsetup_ pcshellsetsetup 171d2e4005SSatish Balay #define pcshellsetname_ pcshellsetname 18*6895c445SBarry Smith #define pcshellsetcontext_ pcshellsetcontext 19*6895c445SBarry Smith #define pcshellgetcontext_ pcshellgetcontext 20e54e4138SSatish Balay #endif 21e54e4138SSatish Balay 22e54e4138SSatish Balay /* These are not extern C because they are passed into non-extern C user level functions */ 23e54e4138SSatish Balay static PetscErrorCode ourshellapply(void *ctx,Vec x,Vec y) 24e54e4138SSatish Balay { 25e54e4138SSatish Balay PetscErrorCode ierr = 0; 26*6895c445SBarry Smith PC pc = (PC)ctx; 27*6895c445SBarry Smith void *mctx = (void*) ((PetscObject)pc)->fortran_func_pointers[0]; 28*6895c445SBarry Smith (*(void (PETSC_STDCALL *)(void*,Vec*,Vec*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[1]))(mctx,&x,&y,&ierr);CHKERRQ(ierr); 29e54e4138SSatish Balay return 0; 30e54e4138SSatish Balay } 31e54e4138SSatish Balay 32e54e4138SSatish Balay static PetscErrorCode ourapplyrichardson(void *ctx,Vec x,Vec y,Vec w,PetscReal rtol,PetscReal abstol,PetscReal dtol,PetscInt m) 33e54e4138SSatish Balay { 34e54e4138SSatish Balay PetscErrorCode ierr = 0; 35e54e4138SSatish Balay 36*6895c445SBarry Smith PC pc = (PC)ctx; 37*6895c445SBarry Smith void *mctx = (void*) ((PetscObject)pc)->fortran_func_pointers[0]; 38*6895c445SBarry Smith (*(void (PETSC_STDCALL *)(void*,Vec*,Vec*,Vec*,PetscReal*,PetscReal*,PetscReal*,PetscInt*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[2]))(mctx,&x,&y,&w,&rtol,&abstol,&dtol,&m,&ierr);CHKERRQ(ierr); 39e54e4138SSatish Balay return 0; 40e54e4138SSatish Balay } 41e54e4138SSatish Balay 42e54e4138SSatish Balay static PetscErrorCode ourshellapplytranspose(void *ctx,Vec x,Vec y) 43e54e4138SSatish Balay { 44e54e4138SSatish Balay PetscErrorCode ierr = 0; 45*6895c445SBarry Smith PC pc = (PC)ctx; 46*6895c445SBarry Smith void *mctx = (void*) ((PetscObject)pc)->fortran_func_pointers[0]; 47*6895c445SBarry Smith (*(void (PETSC_STDCALL *)(void*,Vec*,Vec*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[3]))(mctx,&x,&y,&ierr);CHKERRQ(ierr); 48e54e4138SSatish Balay return 0; 49e54e4138SSatish Balay } 50e54e4138SSatish Balay 51e54e4138SSatish Balay static PetscErrorCode ourshellsetup(void *ctx) 52e54e4138SSatish Balay { 53e54e4138SSatish Balay PetscErrorCode ierr = 0; 54e54e4138SSatish Balay 55*6895c445SBarry Smith PC pc = (PC)ctx; 56*6895c445SBarry Smith void *mctx = (void*) ((PetscObject)pc)->fortran_func_pointers[0]; 57*6895c445SBarry Smith (*(void (PETSC_STDCALL *)(void*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[4]))(mctx,&ierr);CHKERRQ(ierr); 58e54e4138SSatish Balay return 0; 59e54e4138SSatish Balay } 60e54e4138SSatish Balay 61e54e4138SSatish Balay EXTERN_C_BEGIN 62e54e4138SSatish Balay 63*6895c445SBarry Smith void PETSC_STDCALL pcshellsetcontext_(PC *pc,void*ctx, int *__ierr ) 64e54e4138SSatish Balay { 65*6895c445SBarry Smith /* the Fortran context is stored in the func_pointer container, while pc is used as the context */ 66*6895c445SBarry Smith ((PetscObject)*pc)->fortran_func_pointers[0] = (PetscVoidFunction)ctx; 67*6895c445SBarry Smith *__ierr = PCShellSetContext(*pc,*pc); 68e54e4138SSatish Balay } 69e54e4138SSatish Balay 70*6895c445SBarry Smith void PETSC_STDCALL pcshellgetcontext_(PC *pc,void**ctx, int *__ierr ) 71e54e4138SSatish Balay { 72*6895c445SBarry Smith /* the Fortran context is stored in the func_pointer container, while pc is used as the context */ 73*6895c445SBarry Smith *ctx = (void*) ((PetscObject)*pc)->fortran_func_pointers[0]; 74e54e4138SSatish Balay } 75e54e4138SSatish Balay 76*6895c445SBarry Smith void PETSC_STDCALL pcshellsetapply_(PC *pc,void (PETSC_STDCALL *apply)(void*,Vec *,Vec *,PetscErrorCode*),PetscErrorCode *ierr) 77e54e4138SSatish Balay { 78*6895c445SBarry Smith PetscObjectAllocateFortranPointers(*pc,5); 79*6895c445SBarry Smith ((PetscObject)*pc)->fortran_func_pointers[1] = (PetscVoidFunction)apply; 80*6895c445SBarry Smith *ierr = PCShellSetApply(*pc,ourshellapply);if (*ierr) return; 81*6895c445SBarry Smith *ierr = PCShellSetContext(*pc,*pc); 82*6895c445SBarry Smith } 83*6895c445SBarry Smith 84*6895c445SBarry Smith void PETSC_STDCALL pcshellsetapplyrichardson_(PC *pc,void (PETSC_STDCALL *apply)(void*,Vec *,Vec *,Vec *,PetscReal*,PetscReal*,PetscReal*,PetscInt*,PetscErrorCode*),PetscErrorCode *ierr) 85*6895c445SBarry Smith { 86*6895c445SBarry Smith PetscObjectAllocateFortranPointers(*pc,5); 87*6895c445SBarry Smith ((PetscObject)*pc)->fortran_func_pointers[2] = (PetscVoidFunction)apply; 88*6895c445SBarry Smith *ierr = PCShellSetApplyRichardson(*pc,ourapplyrichardson);if (*ierr) return; 89*6895c445SBarry Smith *ierr = PCShellSetContext(*pc,*pc); 90*6895c445SBarry Smith } 91*6895c445SBarry Smith 92*6895c445SBarry Smith void PETSC_STDCALL pcshellsetapplytranspose_(PC *pc,void (PETSC_STDCALL *applytranspose)(void*,Vec *,Vec *,PetscErrorCode*), PetscErrorCode *ierr) 93*6895c445SBarry Smith { 94*6895c445SBarry Smith PetscObjectAllocateFortranPointers(*pc,5); 95*6895c445SBarry Smith ((PetscObject)*pc)->fortran_func_pointers[3] = (PetscVoidFunction)applytranspose; 96*6895c445SBarry Smith *ierr = PCShellSetApplyTranspose(*pc,ourshellapplytranspose);if (*ierr) return; 97*6895c445SBarry Smith *ierr = PCShellSetContext(*pc,*pc); 98e54e4138SSatish Balay } 99e54e4138SSatish Balay 100e54e4138SSatish Balay void PETSC_STDCALL pcshellsetsetup_(PC *pc,void (PETSC_STDCALL *setup)(void*,PetscErrorCode*),PetscErrorCode *ierr) 101e54e4138SSatish Balay { 102*6895c445SBarry Smith PetscObjectAllocateFortranPointers(*pc,5); 103*6895c445SBarry Smith ((PetscObject)*pc)->fortran_func_pointers[4] = (PetscVoidFunction)setup; 104*6895c445SBarry Smith *ierr = PCShellSetSetUp(*pc,ourshellsetup);if (*ierr) return; 105*6895c445SBarry Smith *ierr = PCShellSetContext(*pc,*pc); 106e54e4138SSatish Balay } 107e54e4138SSatish Balay 1081d2e4005SSatish Balay void PETSC_STDCALL pcshellsetname_(PC *pc,CHAR name PETSC_MIXED_LEN(len), PetscErrorCode *ierr PETSC_END_LEN(len)) 1091d2e4005SSatish Balay { 1101d2e4005SSatish Balay char *c; 1111d2e4005SSatish Balay FIXCHAR(name,len,c); 1121d2e4005SSatish Balay *ierr = PCShellSetName(*pc,c); 1131d2e4005SSatish Balay FREECHAR(name,c); 1141d2e4005SSatish Balay } 1151d2e4005SSatish Balay 116e54e4138SSatish Balay /* -----------------------------------------------------------------*/ 117e54e4138SSatish Balay 118e54e4138SSatish Balay EXTERN_C_END 119