1b45d2f2cSJed Brown #include <petsc-private/fortranimpl.h> 2c6db04a5SJed Brown #include <petscpc.h> 3a425a105SElliott Sales de Andrade #include <petscksp.h> 4e54e4138SSatish Balay 5e54e4138SSatish Balay #if defined(PETSC_HAVE_FORTRAN_CAPS) 6e54e4138SSatish Balay #define pcshellsetapply_ PCSHELLSETAPPLY 7ccf40c83SElliott Sales de Andrade #define pcshellsetapplyba_ PCSHELLSETAPPLYBA 8e54e4138SSatish Balay #define pcshellsetapplyrichardson_ PCSHELLSETAPPLYRICHARDSON 9e54e4138SSatish Balay #define pcshellsetapplytranspose_ PCSHELLSETAPPLYTRANSPOSE 10e54e4138SSatish Balay #define pcshellsetsetup_ PCSHELLSETSETUP 117c54600cSBarry Smith #define pcshellsetdestroy_ PCSHELLSETDESTROY 12a425a105SElliott Sales de Andrade #define pcshellsetpresolve_ PCSHELLSETPRESOLVE 13a425a105SElliott Sales de Andrade #define pcshellsetpostsolve_ PCSHELLSETPOSTSOLVE 14*2f519dc9SElliott Sales de Andrade #define pcshellsetview_ PCSHELLSETVIEW 151d2e4005SSatish Balay #define pcshellsetname_ PCSHELLSETNAME 16e63f14baSBarry Smith #define pcshellgetname_ PCSHELLGETNAME 176895c445SBarry Smith #define pcshellsetcontext_ PCSHELLSETCONTEXT 186895c445SBarry Smith #define pcshellgetcontext_ PCSHELLGETCONTEXT 19e54e4138SSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE) 20e54e4138SSatish Balay #define pcshellsetapply_ pcshellsetapply 21ccf40c83SElliott Sales de Andrade #define pcshellsetapplyba_ pcshellsetapplyba 22e54e4138SSatish Balay #define pcshellsetapplyrichardson_ pcshellsetapplyrichardson 23e54e4138SSatish Balay #define pcshellsetapplytranspose_ pcshellsetapplytranspose 24e54e4138SSatish Balay #define pcshellsetsetup_ pcshellsetsetup 257c54600cSBarry Smith #define pcshellsetdestroy_ pcshellsetdestroy 26a425a105SElliott Sales de Andrade #define pcshellsetpresolve_ pcshellsetpresolve 27a425a105SElliott Sales de Andrade #define pcshellsetpostsolve_ pcshellsetpostsolve 28*2f519dc9SElliott Sales de Andrade #define pcshellsetview_ pcshellsetview 291d2e4005SSatish Balay #define pcshellsetname_ pcshellsetname 30e63f14baSBarry Smith #define pcshellgetname_ pcshellgetname 316895c445SBarry Smith #define pcshellsetcontext_ pcshellsetcontext 326895c445SBarry Smith #define pcshellgetcontext_ pcshellgetcontext 33e54e4138SSatish Balay #endif 34e54e4138SSatish Balay 35e54e4138SSatish Balay /* These are not extern C because they are passed into non-extern C user level functions */ 366891c3e4SJed Brown static PetscErrorCode ourshellapply(PC pc,Vec x,Vec y) 37e54e4138SSatish Balay { 38e54e4138SSatish Balay PetscErrorCode ierr = 0; 396891c3e4SJed Brown (*(void (PETSC_STDCALL *)(PC*,Vec*,Vec*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[0]))(&pc,&x,&y,&ierr);CHKERRQ(ierr); 40e54e4138SSatish Balay return 0; 41e54e4138SSatish Balay } 42e54e4138SSatish Balay 43ccf40c83SElliott Sales de Andrade static PetscErrorCode ourshellapplyba(PC pc,PCSide side,Vec x,Vec y,Vec work) 44ccf40c83SElliott Sales de Andrade { 45ccf40c83SElliott Sales de Andrade PetscErrorCode ierr = 0; 46ccf40c83SElliott Sales de Andrade (*(void (PETSC_STDCALL *)(PC*,PCSide*,Vec*,Vec*,Vec*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[1]))(&pc,&side,&x,&y,&work,&ierr);CHKERRQ(ierr); 47ccf40c83SElliott Sales de Andrade return 0; 48ccf40c83SElliott Sales de Andrade } 49ccf40c83SElliott Sales de Andrade 50ace3abfcSBarry 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) 51e54e4138SSatish Balay { 52e54e4138SSatish Balay PetscErrorCode ierr = 0; 53ccf40c83SElliott Sales de Andrade (*(void (PETSC_STDCALL *)(PC*,Vec*,Vec*,Vec*,PetscReal*,PetscReal*,PetscReal*,PetscInt*,PetscBool *,PetscInt*,PCRichardsonConvergedReason*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[2]))(&pc,&x,&y,&w,&rtol,&abstol,&dtol,&m,&guesszero,outits,reason,&ierr);CHKERRQ(ierr); 54e54e4138SSatish Balay return 0; 55e54e4138SSatish Balay } 56e54e4138SSatish Balay 576891c3e4SJed Brown static PetscErrorCode ourshellapplytranspose(PC pc,Vec x,Vec y) 58e54e4138SSatish Balay { 59e54e4138SSatish Balay PetscErrorCode ierr = 0; 60ccf40c83SElliott Sales de Andrade (*(void (PETSC_STDCALL *)(void*,Vec*,Vec*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[3]))(&pc,&x,&y,&ierr);CHKERRQ(ierr); 61e54e4138SSatish Balay return 0; 62e54e4138SSatish Balay } 63e54e4138SSatish Balay 646891c3e4SJed Brown static PetscErrorCode ourshellsetup(PC pc) 65e54e4138SSatish Balay { 66e54e4138SSatish Balay PetscErrorCode ierr = 0; 67ccf40c83SElliott Sales de Andrade (*(void (PETSC_STDCALL *)(PC*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[4]))(&pc,&ierr);CHKERRQ(ierr); 68e54e4138SSatish Balay return 0; 69e54e4138SSatish Balay } 70e54e4138SSatish Balay 716891c3e4SJed Brown static PetscErrorCode ourshelldestroy(PC pc) 727c54600cSBarry Smith { 737c54600cSBarry Smith PetscErrorCode ierr = 0; 74ccf40c83SElliott Sales de Andrade (*(void (PETSC_STDCALL *)(void*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[5]))(&pc,&ierr);CHKERRQ(ierr); 757c54600cSBarry Smith return 0; 767c54600cSBarry Smith } 777c54600cSBarry Smith 78a425a105SElliott Sales de Andrade static PetscErrorCode ourshellpresolve(PC pc,KSP ksp,Vec x,Vec y) 79a425a105SElliott Sales de Andrade { 80a425a105SElliott Sales de Andrade PetscErrorCode ierr = 0; 81ccf40c83SElliott Sales de Andrade (*(void (PETSC_STDCALL *)(PC*,KSP*,Vec*,Vec*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[6]))(&pc,&ksp,&x,&y,&ierr);CHKERRQ(ierr); 82a425a105SElliott Sales de Andrade return 0; 83a425a105SElliott Sales de Andrade } 84a425a105SElliott Sales de Andrade 85a425a105SElliott Sales de Andrade static PetscErrorCode ourshellpostsolve(PC pc,KSP ksp,Vec x,Vec y) 86a425a105SElliott Sales de Andrade { 87a425a105SElliott Sales de Andrade PetscErrorCode ierr = 0; 88ccf40c83SElliott Sales de Andrade (*(void (PETSC_STDCALL *)(PC*,KSP*,Vec*,Vec*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[7]))(&pc,&ksp,&x,&y,&ierr);CHKERRQ(ierr); 89a425a105SElliott Sales de Andrade return 0; 90a425a105SElliott Sales de Andrade } 91a425a105SElliott Sales de Andrade 92*2f519dc9SElliott Sales de Andrade static PetscErrorCode ourshellview(PC pc,PetscViewer view) 93*2f519dc9SElliott Sales de Andrade { 94*2f519dc9SElliott Sales de Andrade PetscErrorCode ierr = 0; 95*2f519dc9SElliott Sales de Andrade (*(void (PETSC_STDCALL *)(PC*,PetscViewer*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[8]))(&pc,&view,&ierr);CHKERRQ(ierr); 96*2f519dc9SElliott Sales de Andrade return 0; 97*2f519dc9SElliott Sales de Andrade } 98*2f519dc9SElliott Sales de Andrade 998cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL pcshellgetcontext_(PC *pc,void **ctx,PetscErrorCode *ierr) 100e54e4138SSatish Balay { 1016891c3e4SJed Brown *ierr = PCShellGetContext(*pc,ctx); 102e54e4138SSatish Balay } 103e54e4138SSatish Balay 1048cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL pcshellsetapply_(PC *pc,void (PETSC_STDCALL *apply)(void*,Vec*,Vec*,PetscErrorCode*),PetscErrorCode *ierr) 105e54e4138SSatish Balay { 106*2f519dc9SElliott Sales de Andrade PetscObjectAllocateFortranPointers(*pc,9); 1076891c3e4SJed Brown ((PetscObject)*pc)->fortran_func_pointers[0] = (PetscVoidFunction)apply; 1082fa5cd67SKarl Rupp 1096891c3e4SJed Brown *ierr = PCShellSetApply(*pc,ourshellapply); 1106895c445SBarry Smith } 1116895c445SBarry Smith 112ccf40c83SElliott Sales de Andrade PETSC_EXTERN void PETSC_STDCALL pcshellsetapplyba_(PC *pc,void (PETSC_STDCALL *apply)(void*,PCSide*,Vec*,Vec*,Vec*,PetscErrorCode*),PetscErrorCode *ierr) 113ccf40c83SElliott Sales de Andrade { 114*2f519dc9SElliott Sales de Andrade PetscObjectAllocateFortranPointers(*pc,9); 115ccf40c83SElliott Sales de Andrade ((PetscObject)*pc)->fortran_func_pointers[1] = (PetscVoidFunction)apply; 116ccf40c83SElliott Sales de Andrade 117ccf40c83SElliott Sales de Andrade *ierr = PCShellSetApplyBA(*pc,ourshellapplyba); 118ccf40c83SElliott Sales de Andrade } 119ccf40c83SElliott Sales de Andrade 1208cc058d9SJed 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) 1216895c445SBarry Smith { 122*2f519dc9SElliott Sales de Andrade PetscObjectAllocateFortranPointers(*pc,9); 123ccf40c83SElliott Sales de Andrade ((PetscObject)*pc)->fortran_func_pointers[2] = (PetscVoidFunction)apply; 1246891c3e4SJed Brown *ierr = PCShellSetApplyRichardson(*pc,ourapplyrichardson); 1256895c445SBarry Smith } 1266895c445SBarry Smith 1278cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL pcshellsetapplytranspose_(PC *pc,void (PETSC_STDCALL *applytranspose)(void*,Vec *,Vec *,PetscErrorCode*), PetscErrorCode *ierr) 1286895c445SBarry Smith { 129*2f519dc9SElliott Sales de Andrade PetscObjectAllocateFortranPointers(*pc,9); 130ccf40c83SElliott Sales de Andrade ((PetscObject)*pc)->fortran_func_pointers[3] = (PetscVoidFunction)applytranspose; 1312fa5cd67SKarl Rupp 1326891c3e4SJed Brown *ierr = PCShellSetApplyTranspose(*pc,ourshellapplytranspose); 133e54e4138SSatish Balay } 134e54e4138SSatish Balay 1358cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL pcshellsetsetup_(PC *pc,void (PETSC_STDCALL *setup)(void*,PetscErrorCode*),PetscErrorCode *ierr) 136e54e4138SSatish Balay { 137*2f519dc9SElliott Sales de Andrade PetscObjectAllocateFortranPointers(*pc,9); 138ccf40c83SElliott Sales de Andrade ((PetscObject)*pc)->fortran_func_pointers[4] = (PetscVoidFunction)setup; 1392fa5cd67SKarl Rupp 1406891c3e4SJed Brown *ierr = PCShellSetSetUp(*pc,ourshellsetup); 141e54e4138SSatish Balay } 142e54e4138SSatish Balay 1438cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL pcshellsetdestroy_(PC *pc,void (PETSC_STDCALL *setup)(void*,PetscErrorCode*),PetscErrorCode *ierr) 1447c54600cSBarry Smith { 145*2f519dc9SElliott Sales de Andrade PetscObjectAllocateFortranPointers(*pc,9); 146ccf40c83SElliott Sales de Andrade ((PetscObject)*pc)->fortran_func_pointers[5] = (PetscVoidFunction)setup; 1472fa5cd67SKarl Rupp 1486891c3e4SJed Brown *ierr = PCShellSetDestroy(*pc,ourshelldestroy); 1497c54600cSBarry Smith } 1507c54600cSBarry Smith 151a425a105SElliott Sales de Andrade PETSC_EXTERN void PETSC_STDCALL pcshellsetpresolve_(PC *pc,void (PETSC_STDCALL *presolve)(void*,void*,Vec*,Vec*,PetscErrorCode*),PetscErrorCode *ierr) 152a425a105SElliott Sales de Andrade { 153*2f519dc9SElliott Sales de Andrade PetscObjectAllocateFortranPointers(*pc,9); 154ccf40c83SElliott Sales de Andrade ((PetscObject)*pc)->fortran_func_pointers[6] = (PetscVoidFunction)presolve; 155a425a105SElliott Sales de Andrade 156a425a105SElliott Sales de Andrade *ierr = PCShellSetPreSolve(*pc,ourshellpresolve); 157a425a105SElliott Sales de Andrade } 158a425a105SElliott Sales de Andrade 159a425a105SElliott Sales de Andrade PETSC_EXTERN void PETSC_STDCALL pcshellsetpostsolve_(PC *pc,void (PETSC_STDCALL *postsolve)(void*,void*,Vec*,Vec*,PetscErrorCode*),PetscErrorCode *ierr) 160a425a105SElliott Sales de Andrade { 161*2f519dc9SElliott Sales de Andrade PetscObjectAllocateFortranPointers(*pc,9); 162ccf40c83SElliott Sales de Andrade ((PetscObject)*pc)->fortran_func_pointers[7] = (PetscVoidFunction)postsolve; 163a425a105SElliott Sales de Andrade 164a425a105SElliott Sales de Andrade *ierr = PCShellSetPostSolve(*pc,ourshellpostsolve); 165a425a105SElliott Sales de Andrade } 166a425a105SElliott Sales de Andrade 167*2f519dc9SElliott Sales de Andrade PETSC_EXTERN void PETSC_STDCALL pcshellsetview_(PC *pc,void (PETSC_STDCALL *view)(void*,PetscViewer*,PetscErrorCode*),PetscErrorCode *ierr) 168*2f519dc9SElliott Sales de Andrade { 169*2f519dc9SElliott Sales de Andrade PetscObjectAllocateFortranPointers(*pc,9); 170*2f519dc9SElliott Sales de Andrade ((PetscObject)*pc)->fortran_func_pointers[8] = (PetscVoidFunction)view; 171*2f519dc9SElliott Sales de Andrade 172*2f519dc9SElliott Sales de Andrade *ierr = PCShellSetView(*pc,ourshellview); 173*2f519dc9SElliott Sales de Andrade } 174*2f519dc9SElliott Sales de Andrade 1758cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL pcshellsetname_(PC *pc,CHAR name PETSC_MIXED_LEN(len), PetscErrorCode *ierr PETSC_END_LEN(len)) 1761d2e4005SSatish Balay { 1771d2e4005SSatish Balay char *c; 1781d2e4005SSatish Balay FIXCHAR(name,len,c); 1791d2e4005SSatish Balay *ierr = PCShellSetName(*pc,c); 1801d2e4005SSatish Balay FREECHAR(name,c); 1811d2e4005SSatish Balay } 1821d2e4005SSatish Balay 1838cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL pcshellgetname_(PC *pc,CHAR name PETSC_MIXED_LEN(len), PetscErrorCode *ierr PETSC_END_LEN(len)) 184e63f14baSBarry Smith { 185ccaf0856SBarry Smith const char *c; 186e63f14baSBarry Smith 187e63f14baSBarry Smith *ierr = PCShellGetName(*pc,&c);if (*ierr) return; 188e63f14baSBarry Smith *ierr = PetscStrncpy(name,c,len); 189e63f14baSBarry Smith } 190e63f14baSBarry Smith 191e54e4138SSatish Balay /* -----------------------------------------------------------------*/ 192e54e4138SSatish Balay 193