1b45d2f2cSJed Brown #include <petsc-private/fortranimpl.h> 2c6db04a5SJed Brown #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 11e63f14baSBarry Smith #define pcshellgetname_ PCSHELLGETNAME 126895c445SBarry Smith #define pcshellsetcontext_ PCSHELLSETCONTEXT 136895c445SBarry Smith #define pcshellgetcontext_ PCSHELLGETCONTEXT 14e54e4138SSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE) 15e54e4138SSatish Balay #define pcshellsetapply_ pcshellsetapply 16e54e4138SSatish Balay #define pcshellsetapplyrichardson_ pcshellsetapplyrichardson 17e54e4138SSatish Balay #define pcshellsetapplytranspose_ pcshellsetapplytranspose 18e54e4138SSatish Balay #define pcshellsetsetup_ pcshellsetsetup 197c54600cSBarry Smith #define pcshellsetdestroy_ pcshellsetdestroy 201d2e4005SSatish Balay #define pcshellsetname_ pcshellsetname 21e63f14baSBarry Smith #define pcshellgetname_ pcshellgetname 226895c445SBarry Smith #define pcshellsetcontext_ pcshellsetcontext 236895c445SBarry Smith #define pcshellgetcontext_ pcshellgetcontext 24e54e4138SSatish Balay #endif 25e54e4138SSatish Balay 26e54e4138SSatish Balay /* These are not extern C because they are passed into non-extern C user level functions */ 276891c3e4SJed Brown static PetscErrorCode ourshellapply(PC pc,Vec x,Vec y) 28e54e4138SSatish Balay { 29e54e4138SSatish Balay PetscErrorCode ierr = 0; 306891c3e4SJed Brown (*(void (PETSC_STDCALL *)(PC*,Vec*,Vec*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[0]))(&pc,&x,&y,&ierr);CHKERRQ(ierr); 31e54e4138SSatish Balay return 0; 32e54e4138SSatish Balay } 33e54e4138SSatish Balay 34*fe81eab7SBarry Smith static PetscErrorCode ourshellapplyctx(PC pc,Vec x,Vec y) 35*fe81eab7SBarry Smith { 36*fe81eab7SBarry Smith PetscErrorCode ierr = 0; 37*fe81eab7SBarry Smith void *ctx; 38*fe81eab7SBarry Smith ierr = PCShellGetContext(pc,&ctx);CHKERRQ(ierr); 39*fe81eab7SBarry Smith (*(void (PETSC_STDCALL *)(PC*,void*,Vec*,Vec*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[0]))(&pc,ctx,&x,&y,&ierr);CHKERRQ(ierr); 40*fe81eab7SBarry Smith return 0; 41*fe81eab7SBarry Smith } 42*fe81eab7SBarry Smith 43ace3abfcSBarry Smith static PetscErrorCode ourapplyrichardson(PC pc,Vec x,Vec y,Vec w,PetscReal rtol,PetscReal abstol,PetscReal dtol,PetscInt m,PetscBool guesszero,PetscInt *outits,PCRichardsonConvergedReason *reason) 44e54e4138SSatish Balay { 45e54e4138SSatish Balay PetscErrorCode ierr = 0; 46ace3abfcSBarry Smith (*(void (PETSC_STDCALL *)(PC*,Vec*,Vec*,Vec*,PetscReal*,PetscReal*,PetscReal*,PetscInt*,PetscBool *,PetscInt*,PCRichardsonConvergedReason*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[1]))(&pc,&x,&y,&w,&rtol,&abstol,&dtol,&m,&guesszero,outits,reason,&ierr);CHKERRQ(ierr); 47e54e4138SSatish Balay return 0; 48e54e4138SSatish Balay } 49e54e4138SSatish Balay 506891c3e4SJed Brown static PetscErrorCode ourshellapplytranspose(PC pc,Vec x,Vec y) 51e54e4138SSatish Balay { 52e54e4138SSatish Balay PetscErrorCode ierr = 0; 536891c3e4SJed Brown (*(void (PETSC_STDCALL *)(void*,Vec*,Vec*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[2]))(&pc,&x,&y,&ierr);CHKERRQ(ierr); 54e54e4138SSatish Balay return 0; 55e54e4138SSatish Balay } 56e54e4138SSatish Balay 576891c3e4SJed Brown static PetscErrorCode ourshellsetup(PC pc) 58e54e4138SSatish Balay { 59e54e4138SSatish Balay PetscErrorCode ierr = 0; 606891c3e4SJed Brown (*(void (PETSC_STDCALL *)(PC*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[3]))(&pc,&ierr);CHKERRQ(ierr); 61e54e4138SSatish Balay return 0; 62e54e4138SSatish Balay } 63e54e4138SSatish Balay 64*fe81eab7SBarry Smith static PetscErrorCode ourshellsetupctx(PC pc) 65*fe81eab7SBarry Smith { 66*fe81eab7SBarry Smith PetscErrorCode ierr = 0; 67*fe81eab7SBarry Smith void *ctx; 68*fe81eab7SBarry Smith ierr = PCShellGetContext(pc,&ctx);CHKERRQ(ierr); 69*fe81eab7SBarry Smith (*(void (PETSC_STDCALL *)(PC*,void*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[3]))(&pc,ctx,&ierr);CHKERRQ(ierr); 70*fe81eab7SBarry Smith return 0; 71*fe81eab7SBarry Smith } 72*fe81eab7SBarry Smith 736891c3e4SJed Brown static PetscErrorCode ourshelldestroy(PC pc) 747c54600cSBarry Smith { 757c54600cSBarry Smith PetscErrorCode ierr = 0; 766891c3e4SJed Brown (*(void (PETSC_STDCALL *)(void*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[4]))(&pc,&ierr);CHKERRQ(ierr); 777c54600cSBarry Smith return 0; 787c54600cSBarry Smith } 797c54600cSBarry Smith 808cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL pcshellgetcontext_(PC *pc,void **ctx,PetscErrorCode *ierr) 81e54e4138SSatish Balay { 826891c3e4SJed Brown *ierr = PCShellGetContext(*pc,ctx); 83e54e4138SSatish Balay } 84e54e4138SSatish Balay 858cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL pcshellsetapply_(PC *pc,void (PETSC_STDCALL *apply)(void*,Vec*,Vec*,PetscErrorCode*),PetscErrorCode *ierr) 86e54e4138SSatish Balay { 876891c3e4SJed Brown PetscObjectAllocateFortranPointers(*pc,5); 886891c3e4SJed Brown ((PetscObject)*pc)->fortran_func_pointers[0] = (PetscVoidFunction)apply; 892fa5cd67SKarl Rupp 906891c3e4SJed Brown *ierr = PCShellSetApply(*pc,ourshellapply); 916895c445SBarry Smith } 926895c445SBarry Smith 93*fe81eab7SBarry Smith PETSC_EXTERN void PETSC_STDCALL pcshellsetapplyctx_(PC *pc,void (PETSC_STDCALL *apply)(void*,void*,Vec*,Vec*,PetscErrorCode*),PetscErrorCode *ierr) 94*fe81eab7SBarry Smith { 95*fe81eab7SBarry Smith PetscObjectAllocateFortranPointers(*pc,5); 96*fe81eab7SBarry Smith ((PetscObject)*pc)->fortran_func_pointers[0] = (PetscVoidFunction)apply; 97*fe81eab7SBarry Smith 98*fe81eab7SBarry Smith *ierr = PCShellSetApply(*pc,ourshellapplyctx); 99*fe81eab7SBarry Smith } 100*fe81eab7SBarry Smith 1018cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL pcshellsetapplyrichardson_(PC *pc,void (PETSC_STDCALL *apply)(void*,Vec*,Vec*,Vec*,PetscReal*,PetscReal*,PetscReal*,PetscInt*,PetscBool*,PetscInt*,PCRichardsonConvergedReason*,PetscErrorCode*),PetscErrorCode *ierr) 1026895c445SBarry Smith { 1036891c3e4SJed Brown PetscObjectAllocateFortranPointers(*pc,5); 1046891c3e4SJed Brown ((PetscObject)*pc)->fortran_func_pointers[1] = (PetscVoidFunction)apply; 1056891c3e4SJed Brown *ierr = PCShellSetApplyRichardson(*pc,ourapplyrichardson); 1066895c445SBarry Smith } 1076895c445SBarry Smith 1088cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL pcshellsetapplytranspose_(PC *pc,void (PETSC_STDCALL *applytranspose)(void*,Vec *,Vec *,PetscErrorCode*), PetscErrorCode *ierr) 1096895c445SBarry Smith { 1106891c3e4SJed Brown PetscObjectAllocateFortranPointers(*pc,5); 1116891c3e4SJed Brown ((PetscObject)*pc)->fortran_func_pointers[2] = (PetscVoidFunction)applytranspose; 1122fa5cd67SKarl Rupp 1136891c3e4SJed Brown *ierr = PCShellSetApplyTranspose(*pc,ourshellapplytranspose); 114e54e4138SSatish Balay } 115e54e4138SSatish Balay 116*fe81eab7SBarry Smith PETSC_EXTERN void PETSC_STDCALL pcshellsetsetupctx_(PC *pc,void (PETSC_STDCALL *setup)(void*,void*,PetscErrorCode*),PetscErrorCode *ierr) 117*fe81eab7SBarry Smith { 118*fe81eab7SBarry Smith PetscObjectAllocateFortranPointers(*pc,5); 119*fe81eab7SBarry Smith ((PetscObject)*pc)->fortran_func_pointers[3] = (PetscVoidFunction)setup; 120*fe81eab7SBarry Smith 121*fe81eab7SBarry Smith *ierr = PCShellSetSetUp(*pc,ourshellsetupctx); 122*fe81eab7SBarry Smith } 123*fe81eab7SBarry Smith 1248cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL pcshellsetsetup_(PC *pc,void (PETSC_STDCALL *setup)(void*,PetscErrorCode*),PetscErrorCode *ierr) 125e54e4138SSatish Balay { 1266891c3e4SJed Brown PetscObjectAllocateFortranPointers(*pc,5); 1276891c3e4SJed Brown ((PetscObject)*pc)->fortran_func_pointers[3] = (PetscVoidFunction)setup; 1282fa5cd67SKarl Rupp 1296891c3e4SJed Brown *ierr = PCShellSetSetUp(*pc,ourshellsetup); 130e54e4138SSatish Balay } 131e54e4138SSatish Balay 1328cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL pcshellsetdestroy_(PC *pc,void (PETSC_STDCALL *setup)(void*,PetscErrorCode*),PetscErrorCode *ierr) 1337c54600cSBarry Smith { 134b2e6f011SJed Brown PetscObjectAllocateFortranPointers(*pc,5); 1356891c3e4SJed Brown ((PetscObject)*pc)->fortran_func_pointers[4] = (PetscVoidFunction)setup; 1362fa5cd67SKarl Rupp 1376891c3e4SJed Brown *ierr = PCShellSetDestroy(*pc,ourshelldestroy); 1387c54600cSBarry Smith } 1397c54600cSBarry Smith 1408cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL pcshellsetname_(PC *pc,CHAR name PETSC_MIXED_LEN(len), PetscErrorCode *ierr PETSC_END_LEN(len)) 1411d2e4005SSatish Balay { 1421d2e4005SSatish Balay char *c; 1431d2e4005SSatish Balay FIXCHAR(name,len,c); 1441d2e4005SSatish Balay *ierr = PCShellSetName(*pc,c); 1451d2e4005SSatish Balay FREECHAR(name,c); 1461d2e4005SSatish Balay } 1471d2e4005SSatish Balay 1488cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL pcshellgetname_(PC *pc,CHAR name PETSC_MIXED_LEN(len), PetscErrorCode *ierr PETSC_END_LEN(len)) 149e63f14baSBarry Smith { 150ccaf0856SBarry Smith const char *c; 151e63f14baSBarry Smith 152e63f14baSBarry Smith *ierr = PCShellGetName(*pc,&c);if (*ierr) return; 153e63f14baSBarry Smith *ierr = PetscStrncpy(name,c,len); 154e63f14baSBarry Smith } 155e63f14baSBarry Smith 156e54e4138SSatish Balay /* -----------------------------------------------------------------*/ 157e54e4138SSatish Balay 158