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 97c54600cSBarry Smith #define pcshellsetdestroy_ PCSHELLSETDESTROY 101d2e4005SSatish Balay #define pcshellsetname_ PCSHELLSETNAME 116895c445SBarry Smith #define pcshellsetcontext_ PCSHELLSETCONTEXT 126895c445SBarry Smith #define pcshellgetcontext_ PCSHELLGETCONTEXT 13e54e4138SSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE) 14e54e4138SSatish Balay #define pcshellsetapply_ pcshellsetapply 15e54e4138SSatish Balay #define pcshellsetapplyrichardson_ pcshellsetapplyrichardson 16e54e4138SSatish Balay #define pcshellsetapplytranspose_ pcshellsetapplytranspose 17e54e4138SSatish Balay #define pcshellsetsetup_ pcshellsetsetup 187c54600cSBarry Smith #define pcshellsetdestroy_ pcshellsetdestroy 191d2e4005SSatish Balay #define pcshellsetname_ pcshellsetname 206895c445SBarry Smith #define pcshellsetcontext_ pcshellsetcontext 216895c445SBarry Smith #define pcshellgetcontext_ pcshellgetcontext 22e54e4138SSatish Balay #endif 23e54e4138SSatish Balay 24e54e4138SSatish Balay /* These are not extern C because they are passed into non-extern C user level functions */ 25e54e4138SSatish Balay static PetscErrorCode ourshellapply(void *ctx,Vec x,Vec y) 26e54e4138SSatish Balay { 27e54e4138SSatish Balay PetscErrorCode ierr = 0; 286895c445SBarry Smith PC pc = (PC)ctx; 296895c445SBarry Smith void *mctx = (void*) ((PetscObject)pc)->fortran_func_pointers[0]; 306895c445SBarry Smith (*(void (PETSC_STDCALL *)(void*,Vec*,Vec*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[1]))(mctx,&x,&y,&ierr);CHKERRQ(ierr); 31e54e4138SSatish Balay return 0; 32e54e4138SSatish Balay } 33e54e4138SSatish Balay 34*4d0a8057SBarry Smith static PetscErrorCode ourapplyrichardson(void *ctx,Vec x,Vec y,Vec w,PetscReal rtol,PetscReal abstol,PetscReal dtol,PetscInt m,PetscInt *outits,PCRichardsonConvergedReason *reason) 35e54e4138SSatish Balay { 36e54e4138SSatish Balay PetscErrorCode ierr = 0; 37e54e4138SSatish Balay 386895c445SBarry Smith PC pc = (PC)ctx; 396895c445SBarry Smith void *mctx = (void*) ((PetscObject)pc)->fortran_func_pointers[0]; 40*4d0a8057SBarry Smith (*(void (PETSC_STDCALL *)(void*,Vec*,Vec*,Vec*,PetscReal*,PetscReal*,PetscReal*,PetscInt*,PetscInt*,PCRichardsonConvergedReason*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[2]))(mctx,&x,&y,&w,&rtol,&abstol,&dtol,&m,outits,reason,&ierr);CHKERRQ(ierr); 41e54e4138SSatish Balay return 0; 42e54e4138SSatish Balay } 43e54e4138SSatish Balay 44e54e4138SSatish Balay static PetscErrorCode ourshellapplytranspose(void *ctx,Vec x,Vec y) 45e54e4138SSatish Balay { 46e54e4138SSatish Balay PetscErrorCode ierr = 0; 476895c445SBarry Smith PC pc = (PC)ctx; 486895c445SBarry Smith void *mctx = (void*) ((PetscObject)pc)->fortran_func_pointers[0]; 496895c445SBarry Smith (*(void (PETSC_STDCALL *)(void*,Vec*,Vec*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[3]))(mctx,&x,&y,&ierr);CHKERRQ(ierr); 50e54e4138SSatish Balay return 0; 51e54e4138SSatish Balay } 52e54e4138SSatish Balay 53e54e4138SSatish Balay static PetscErrorCode ourshellsetup(void *ctx) 54e54e4138SSatish Balay { 55e54e4138SSatish Balay PetscErrorCode ierr = 0; 56e54e4138SSatish Balay 576895c445SBarry Smith PC pc = (PC)ctx; 586895c445SBarry Smith void *mctx = (void*) ((PetscObject)pc)->fortran_func_pointers[0]; 596895c445SBarry Smith (*(void (PETSC_STDCALL *)(void*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[4]))(mctx,&ierr);CHKERRQ(ierr); 60e54e4138SSatish Balay return 0; 61e54e4138SSatish Balay } 62e54e4138SSatish Balay 637c54600cSBarry Smith static PetscErrorCode ourshelldestroy(void *ctx) 647c54600cSBarry Smith { 657c54600cSBarry Smith PetscErrorCode ierr = 0; 667c54600cSBarry Smith 677c54600cSBarry Smith PC pc = (PC)ctx; 687c54600cSBarry Smith void *mctx = (void*) ((PetscObject)pc)->fortran_func_pointers[0]; 697c54600cSBarry Smith (*(void (PETSC_STDCALL *)(void*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[5]))(mctx,&ierr);CHKERRQ(ierr); 707c54600cSBarry Smith return 0; 717c54600cSBarry Smith } 727c54600cSBarry Smith 73e54e4138SSatish Balay EXTERN_C_BEGIN 74e54e4138SSatish Balay 757c54600cSBarry Smith void PETSC_STDCALL pcshellsetcontext_(PC *pc,void*ctx, int *ierr ) 76e54e4138SSatish Balay { 776895c445SBarry Smith /* the Fortran context is stored in the func_pointer container, while pc is used as the context */ 787c54600cSBarry Smith PetscObjectAllocateFortranPointers(*pc,6); 796895c445SBarry Smith ((PetscObject)*pc)->fortran_func_pointers[0] = (PetscVoidFunction)ctx; 807c54600cSBarry Smith *ierr = PCShellSetContext(*pc,*pc); 81e54e4138SSatish Balay } 82e54e4138SSatish Balay 836895c445SBarry Smith void PETSC_STDCALL pcshellgetcontext_(PC *pc,void**ctx, int *__ierr ) 84e54e4138SSatish Balay { 856895c445SBarry Smith /* the Fortran context is stored in the func_pointer container, while pc is used as the context */ 866895c445SBarry Smith *ctx = (void*) ((PetscObject)*pc)->fortran_func_pointers[0]; 87e54e4138SSatish Balay } 88e54e4138SSatish Balay 896895c445SBarry Smith void PETSC_STDCALL pcshellsetapply_(PC *pc,void (PETSC_STDCALL *apply)(void*,Vec *,Vec *,PetscErrorCode*),PetscErrorCode *ierr) 90e54e4138SSatish Balay { 917c54600cSBarry Smith PetscObjectAllocateFortranPointers(*pc,6); 926895c445SBarry Smith ((PetscObject)*pc)->fortran_func_pointers[1] = (PetscVoidFunction)apply; 936895c445SBarry Smith *ierr = PCShellSetApply(*pc,ourshellapply);if (*ierr) return; 946895c445SBarry Smith *ierr = PCShellSetContext(*pc,*pc); 956895c445SBarry Smith } 966895c445SBarry Smith 97*4d0a8057SBarry Smith void PETSC_STDCALL pcshellsetapplyrichardson_(PC *pc,void (PETSC_STDCALL *apply)(void*,Vec *,Vec *,Vec *,PetscReal*,PetscReal*,PetscReal*,PetscInt*,PetscInt*,PCRichardsonConvergedReason*,PetscErrorCode*),PetscErrorCode *ierr) 986895c445SBarry Smith { 997c54600cSBarry Smith PetscObjectAllocateFortranPointers(*pc,6); 1006895c445SBarry Smith ((PetscObject)*pc)->fortran_func_pointers[2] = (PetscVoidFunction)apply; 1016895c445SBarry Smith *ierr = PCShellSetApplyRichardson(*pc,ourapplyrichardson);if (*ierr) return; 1026895c445SBarry Smith *ierr = PCShellSetContext(*pc,*pc); 1036895c445SBarry Smith } 1046895c445SBarry Smith 1056895c445SBarry Smith void PETSC_STDCALL pcshellsetapplytranspose_(PC *pc,void (PETSC_STDCALL *applytranspose)(void*,Vec *,Vec *,PetscErrorCode*), PetscErrorCode *ierr) 1066895c445SBarry Smith { 1077c54600cSBarry Smith PetscObjectAllocateFortranPointers(*pc,6); 1086895c445SBarry Smith ((PetscObject)*pc)->fortran_func_pointers[3] = (PetscVoidFunction)applytranspose; 1096895c445SBarry Smith *ierr = PCShellSetApplyTranspose(*pc,ourshellapplytranspose);if (*ierr) return; 1106895c445SBarry Smith *ierr = PCShellSetContext(*pc,*pc); 111e54e4138SSatish Balay } 112e54e4138SSatish Balay 113e54e4138SSatish Balay void PETSC_STDCALL pcshellsetsetup_(PC *pc,void (PETSC_STDCALL *setup)(void*,PetscErrorCode*),PetscErrorCode *ierr) 114e54e4138SSatish Balay { 1157c54600cSBarry Smith PetscObjectAllocateFortranPointers(*pc,6); 1166895c445SBarry Smith ((PetscObject)*pc)->fortran_func_pointers[4] = (PetscVoidFunction)setup; 1176895c445SBarry Smith *ierr = PCShellSetSetUp(*pc,ourshellsetup);if (*ierr) return; 1186895c445SBarry Smith *ierr = PCShellSetContext(*pc,*pc); 119e54e4138SSatish Balay } 120e54e4138SSatish Balay 1217c54600cSBarry Smith void PETSC_STDCALL pcshellsetdestroy_(PC *pc,void (PETSC_STDCALL *setup)(void*,PetscErrorCode*),PetscErrorCode *ierr) 1227c54600cSBarry Smith { 1237c54600cSBarry Smith PetscObjectAllocateFortranPointers(*pc,6); 1247c54600cSBarry Smith ((PetscObject)*pc)->fortran_func_pointers[5] = (PetscVoidFunction)setup; 1257c54600cSBarry Smith *ierr = PCShellSetDestroy(*pc,ourshelldestroy);if (*ierr) return; 1267c54600cSBarry Smith *ierr = PCShellSetContext(*pc,*pc); 1277c54600cSBarry Smith } 1287c54600cSBarry Smith 1291d2e4005SSatish Balay void PETSC_STDCALL pcshellsetname_(PC *pc,CHAR name PETSC_MIXED_LEN(len), PetscErrorCode *ierr PETSC_END_LEN(len)) 1301d2e4005SSatish Balay { 1311d2e4005SSatish Balay char *c; 1321d2e4005SSatish Balay FIXCHAR(name,len,c); 1331d2e4005SSatish Balay *ierr = PCShellSetName(*pc,c); 1341d2e4005SSatish Balay FREECHAR(name,c); 1351d2e4005SSatish Balay } 1361d2e4005SSatish Balay 137e54e4138SSatish Balay /* -----------------------------------------------------------------*/ 138e54e4138SSatish Balay 139e54e4138SSatish Balay EXTERN_C_END 140