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 */ 256891c3e4SJed Brown static PetscErrorCode ourshellapply(PC pc,Vec x,Vec y) 26e54e4138SSatish Balay { 27e54e4138SSatish Balay PetscErrorCode ierr = 0; 286891c3e4SJed Brown (*(void (PETSC_STDCALL *)(PC*,Vec*,Vec*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[0]))(&pc,&x,&y,&ierr);CHKERRQ(ierr); 29e54e4138SSatish Balay return 0; 30e54e4138SSatish Balay } 31e54e4138SSatish Balay 326891c3e4SJed Brown static PetscErrorCode ourapplyrichardson(PC pc,Vec x,Vec y,Vec w,PetscReal rtol,PetscReal abstol,PetscReal dtol,PetscInt m,PetscInt *outits,PCRichardsonConvergedReason *reason) 33e54e4138SSatish Balay { 34e54e4138SSatish Balay PetscErrorCode ierr = 0; 356891c3e4SJed Brown (*(void (PETSC_STDCALL *)(PC*,Vec*,Vec*,Vec*,PetscReal*,PetscReal*,PetscReal*,PetscInt*,PetscInt*,PCRichardsonConvergedReason*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[1]))(&pc,&x,&y,&w,&rtol,&abstol,&dtol,&m,outits,reason,&ierr);CHKERRQ(ierr); 36e54e4138SSatish Balay return 0; 37e54e4138SSatish Balay } 38e54e4138SSatish Balay 396891c3e4SJed Brown static PetscErrorCode ourshellapplytranspose(PC pc,Vec x,Vec y) 40e54e4138SSatish Balay { 41e54e4138SSatish Balay PetscErrorCode ierr = 0; 426891c3e4SJed Brown (*(void (PETSC_STDCALL *)(void*,Vec*,Vec*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[2]))(&pc,&x,&y,&ierr);CHKERRQ(ierr); 43e54e4138SSatish Balay return 0; 44e54e4138SSatish Balay } 45e54e4138SSatish Balay 466891c3e4SJed Brown static PetscErrorCode ourshellsetup(PC pc) 47e54e4138SSatish Balay { 48e54e4138SSatish Balay PetscErrorCode ierr = 0; 496891c3e4SJed Brown (*(void (PETSC_STDCALL *)(PC*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[3]))(&pc,&ierr);CHKERRQ(ierr); 50e54e4138SSatish Balay return 0; 51e54e4138SSatish Balay } 52e54e4138SSatish Balay 536891c3e4SJed Brown static PetscErrorCode ourshelldestroy(PC pc) 547c54600cSBarry Smith { 557c54600cSBarry Smith PetscErrorCode ierr = 0; 566891c3e4SJed Brown (*(void (PETSC_STDCALL *)(void*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[4]))(&pc,&ierr);CHKERRQ(ierr); 577c54600cSBarry Smith return 0; 587c54600cSBarry Smith } 597c54600cSBarry Smith 60e54e4138SSatish Balay EXTERN_C_BEGIN 61e54e4138SSatish Balay 626891c3e4SJed Brown void PETSC_STDCALL pcshellsetcontext_(PC *pc,void *ctx,PetscErrorCode *ierr){ 636891c3e4SJed Brown *ierr = PCShellSetContext(*pc,ctx); 64e54e4138SSatish Balay } 65e54e4138SSatish Balay 666891c3e4SJed Brown void PETSC_STDCALL pcshellgetcontext_(PC *pc,void **ctx,PetscErrorCode *ierr) 67e54e4138SSatish Balay { 686891c3e4SJed Brown *ierr = PCShellGetContext(*pc,ctx); 69e54e4138SSatish Balay } 70e54e4138SSatish Balay 716895c445SBarry Smith void PETSC_STDCALL pcshellsetapply_(PC *pc,void (PETSC_STDCALL *apply)(void*,Vec *,Vec *,PetscErrorCode*),PetscErrorCode *ierr) 72e54e4138SSatish Balay { 736891c3e4SJed Brown PetscObjectAllocateFortranPointers(*pc,5); 746891c3e4SJed Brown ((PetscObject)*pc)->fortran_func_pointers[0] = (PetscVoidFunction)apply; 756891c3e4SJed Brown *ierr = PCShellSetApply(*pc,ourshellapply); 766895c445SBarry Smith } 776895c445SBarry Smith 784d0a8057SBarry Smith void PETSC_STDCALL pcshellsetapplyrichardson_(PC *pc,void (PETSC_STDCALL *apply)(void*,Vec *,Vec *,Vec *,PetscReal*,PetscReal*,PetscReal*,PetscInt*,PetscInt*,PCRichardsonConvergedReason*,PetscErrorCode*),PetscErrorCode *ierr) 796895c445SBarry Smith { 806891c3e4SJed Brown PetscObjectAllocateFortranPointers(*pc,5); 816891c3e4SJed Brown ((PetscObject)*pc)->fortran_func_pointers[1] = (PetscVoidFunction)apply; 826891c3e4SJed Brown *ierr = PCShellSetApplyRichardson(*pc,ourapplyrichardson); 836895c445SBarry Smith } 846895c445SBarry Smith 856895c445SBarry Smith void PETSC_STDCALL pcshellsetapplytranspose_(PC *pc,void (PETSC_STDCALL *applytranspose)(void*,Vec *,Vec *,PetscErrorCode*), PetscErrorCode *ierr) 866895c445SBarry Smith { 876891c3e4SJed Brown PetscObjectAllocateFortranPointers(*pc,5); 886891c3e4SJed Brown ((PetscObject)*pc)->fortran_func_pointers[2] = (PetscVoidFunction)applytranspose; 896891c3e4SJed Brown *ierr = PCShellSetApplyTranspose(*pc,ourshellapplytranspose); 90e54e4138SSatish Balay } 91e54e4138SSatish Balay 92e54e4138SSatish Balay void PETSC_STDCALL pcshellsetsetup_(PC *pc,void (PETSC_STDCALL *setup)(void*,PetscErrorCode*),PetscErrorCode *ierr) 93e54e4138SSatish Balay { 946891c3e4SJed Brown PetscObjectAllocateFortranPointers(*pc,5); 956891c3e4SJed Brown ((PetscObject)*pc)->fortran_func_pointers[3] = (PetscVoidFunction)setup; 966891c3e4SJed Brown *ierr = PCShellSetSetUp(*pc,ourshellsetup); 97e54e4138SSatish Balay } 98e54e4138SSatish Balay 997c54600cSBarry Smith void PETSC_STDCALL pcshellsetdestroy_(PC *pc,void (PETSC_STDCALL *setup)(void*,PetscErrorCode*),PetscErrorCode *ierr) 1007c54600cSBarry Smith { 101*b2e6f011SJed Brown PetscObjectAllocateFortranPointers(*pc,5); 1026891c3e4SJed Brown ((PetscObject)*pc)->fortran_func_pointers[4] = (PetscVoidFunction)setup; 1036891c3e4SJed Brown *ierr = PCShellSetDestroy(*pc,ourshelldestroy); 1047c54600cSBarry Smith } 1057c54600cSBarry Smith 1061d2e4005SSatish Balay void PETSC_STDCALL pcshellsetname_(PC *pc,CHAR name PETSC_MIXED_LEN(len), PetscErrorCode *ierr PETSC_END_LEN(len)) 1071d2e4005SSatish Balay { 1081d2e4005SSatish Balay char *c; 1091d2e4005SSatish Balay FIXCHAR(name,len,c); 1101d2e4005SSatish Balay *ierr = PCShellSetName(*pc,c); 1111d2e4005SSatish Balay FREECHAR(name,c); 1121d2e4005SSatish Balay } 1131d2e4005SSatish Balay 114e54e4138SSatish Balay /* -----------------------------------------------------------------*/ 115e54e4138SSatish Balay 116e54e4138SSatish Balay EXTERN_C_END 117