1af0996ceSBarry Smith #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 142f519dc9SElliott 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 282f519dc9SElliott 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 43fe81eab7SBarry Smith static PetscErrorCode ourshellapplyctx(PC pc,Vec x,Vec y) 44fe81eab7SBarry Smith { 45fe81eab7SBarry Smith PetscErrorCode ierr = 0; 46fe81eab7SBarry Smith void *ctx; 47fe81eab7SBarry Smith ierr = PCShellGetContext(pc,&ctx);CHKERRQ(ierr); 48fe81eab7SBarry Smith (*(void (PETSC_STDCALL *)(PC*,void*,Vec*,Vec*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[0]))(&pc,ctx,&x,&y,&ierr);CHKERRQ(ierr); 49fe81eab7SBarry Smith return 0; 50fe81eab7SBarry Smith } 51fe81eab7SBarry Smith 52ccf40c83SElliott Sales de Andrade static PetscErrorCode ourshellapplyba(PC pc,PCSide side,Vec x,Vec y,Vec work) 53ccf40c83SElliott Sales de Andrade { 54ccf40c83SElliott Sales de Andrade PetscErrorCode ierr = 0; 55ccf40c83SElliott 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); 56ccf40c83SElliott Sales de Andrade return 0; 57ccf40c83SElliott Sales de Andrade } 58ccf40c83SElliott Sales de Andrade 59ace3abfcSBarry 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) 60e54e4138SSatish Balay { 61e54e4138SSatish Balay PetscErrorCode ierr = 0; 62ccf40c83SElliott 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); 63e54e4138SSatish Balay return 0; 64e54e4138SSatish Balay } 65e54e4138SSatish Balay 666891c3e4SJed Brown static PetscErrorCode ourshellapplytranspose(PC pc,Vec x,Vec y) 67e54e4138SSatish Balay { 68e54e4138SSatish Balay PetscErrorCode ierr = 0; 69ccf40c83SElliott Sales de Andrade (*(void (PETSC_STDCALL *)(void*,Vec*,Vec*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[3]))(&pc,&x,&y,&ierr);CHKERRQ(ierr); 70e54e4138SSatish Balay return 0; 71e54e4138SSatish Balay } 72e54e4138SSatish Balay 736891c3e4SJed Brown static PetscErrorCode ourshellsetup(PC pc) 74e54e4138SSatish Balay { 75e54e4138SSatish Balay PetscErrorCode ierr = 0; 76ccf40c83SElliott Sales de Andrade (*(void (PETSC_STDCALL *)(PC*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[4]))(&pc,&ierr);CHKERRQ(ierr); 77e54e4138SSatish Balay return 0; 78e54e4138SSatish Balay } 79e54e4138SSatish Balay 80fe81eab7SBarry Smith static PetscErrorCode ourshellsetupctx(PC pc) 81fe81eab7SBarry Smith { 82fe81eab7SBarry Smith PetscErrorCode ierr = 0; 83fe81eab7SBarry Smith void *ctx; 84fe81eab7SBarry Smith ierr = PCShellGetContext(pc,&ctx);CHKERRQ(ierr); 85*48cdcd6bSElliott Sales de Andrade (*(void (PETSC_STDCALL *)(PC*,void*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[4]))(&pc,ctx,&ierr);CHKERRQ(ierr); 86fe81eab7SBarry Smith return 0; 87fe81eab7SBarry Smith } 88fe81eab7SBarry Smith 896891c3e4SJed Brown static PetscErrorCode ourshelldestroy(PC pc) 907c54600cSBarry Smith { 917c54600cSBarry Smith PetscErrorCode ierr = 0; 92ccf40c83SElliott Sales de Andrade (*(void (PETSC_STDCALL *)(void*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[5]))(&pc,&ierr);CHKERRQ(ierr); 937c54600cSBarry Smith return 0; 947c54600cSBarry Smith } 957c54600cSBarry Smith 96a425a105SElliott Sales de Andrade static PetscErrorCode ourshellpresolve(PC pc,KSP ksp,Vec x,Vec y) 97a425a105SElliott Sales de Andrade { 98a425a105SElliott Sales de Andrade PetscErrorCode ierr = 0; 99ccf40c83SElliott Sales de Andrade (*(void (PETSC_STDCALL *)(PC*,KSP*,Vec*,Vec*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[6]))(&pc,&ksp,&x,&y,&ierr);CHKERRQ(ierr); 100a425a105SElliott Sales de Andrade return 0; 101a425a105SElliott Sales de Andrade } 102a425a105SElliott Sales de Andrade 103a425a105SElliott Sales de Andrade static PetscErrorCode ourshellpostsolve(PC pc,KSP ksp,Vec x,Vec y) 104a425a105SElliott Sales de Andrade { 105a425a105SElliott Sales de Andrade PetscErrorCode ierr = 0; 106ccf40c83SElliott Sales de Andrade (*(void (PETSC_STDCALL *)(PC*,KSP*,Vec*,Vec*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[7]))(&pc,&ksp,&x,&y,&ierr);CHKERRQ(ierr); 107a425a105SElliott Sales de Andrade return 0; 108a425a105SElliott Sales de Andrade } 109a425a105SElliott Sales de Andrade 1102f519dc9SElliott Sales de Andrade static PetscErrorCode ourshellview(PC pc,PetscViewer view) 1112f519dc9SElliott Sales de Andrade { 1122f519dc9SElliott Sales de Andrade PetscErrorCode ierr = 0; 1132f519dc9SElliott Sales de Andrade (*(void (PETSC_STDCALL *)(PC*,PetscViewer*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[8]))(&pc,&view,&ierr);CHKERRQ(ierr); 114e54e4138SSatish Balay return 0; 115e54e4138SSatish Balay } 116e54e4138SSatish Balay 1178cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL pcshellgetcontext_(PC *pc,void **ctx,PetscErrorCode *ierr) 118e54e4138SSatish Balay { 1196891c3e4SJed Brown *ierr = PCShellGetContext(*pc,ctx); 120e54e4138SSatish Balay } 121e54e4138SSatish Balay 1228cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL pcshellsetapply_(PC *pc,void (PETSC_STDCALL *apply)(void*,Vec*,Vec*,PetscErrorCode*),PetscErrorCode *ierr) 123e54e4138SSatish Balay { 1242f519dc9SElliott Sales de Andrade PetscObjectAllocateFortranPointers(*pc,9); 1256891c3e4SJed Brown ((PetscObject)*pc)->fortran_func_pointers[0] = (PetscVoidFunction)apply; 1262fa5cd67SKarl Rupp 1276891c3e4SJed Brown *ierr = PCShellSetApply(*pc,ourshellapply); 1286895c445SBarry Smith } 1296895c445SBarry Smith 130fe81eab7SBarry Smith PETSC_EXTERN void PETSC_STDCALL pcshellsetapplyctx_(PC *pc,void (PETSC_STDCALL *apply)(void*,void*,Vec*,Vec*,PetscErrorCode*),PetscErrorCode *ierr) 131fe81eab7SBarry Smith { 132*48cdcd6bSElliott Sales de Andrade PetscObjectAllocateFortranPointers(*pc,9); 133fe81eab7SBarry Smith ((PetscObject)*pc)->fortran_func_pointers[0] = (PetscVoidFunction)apply; 134fe81eab7SBarry Smith 135fe81eab7SBarry Smith *ierr = PCShellSetApply(*pc,ourshellapplyctx); 136fe81eab7SBarry Smith } 137fe81eab7SBarry Smith 138ccf40c83SElliott Sales de Andrade PETSC_EXTERN void PETSC_STDCALL pcshellsetapplyba_(PC *pc,void (PETSC_STDCALL *apply)(void*,PCSide*,Vec*,Vec*,Vec*,PetscErrorCode*),PetscErrorCode *ierr) 139ccf40c83SElliott Sales de Andrade { 1402f519dc9SElliott Sales de Andrade PetscObjectAllocateFortranPointers(*pc,9); 141ccf40c83SElliott Sales de Andrade ((PetscObject)*pc)->fortran_func_pointers[1] = (PetscVoidFunction)apply; 142ccf40c83SElliott Sales de Andrade 143ccf40c83SElliott Sales de Andrade *ierr = PCShellSetApplyBA(*pc,ourshellapplyba); 144ccf40c83SElliott Sales de Andrade } 145ccf40c83SElliott Sales de Andrade 1468cc058d9SJed 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) 1476895c445SBarry Smith { 1482f519dc9SElliott Sales de Andrade PetscObjectAllocateFortranPointers(*pc,9); 149ccf40c83SElliott Sales de Andrade ((PetscObject)*pc)->fortran_func_pointers[2] = (PetscVoidFunction)apply; 1506891c3e4SJed Brown *ierr = PCShellSetApplyRichardson(*pc,ourapplyrichardson); 1516895c445SBarry Smith } 1526895c445SBarry Smith 1538cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL pcshellsetapplytranspose_(PC *pc,void (PETSC_STDCALL *applytranspose)(void*,Vec *,Vec *,PetscErrorCode*), PetscErrorCode *ierr) 1546895c445SBarry Smith { 1552f519dc9SElliott Sales de Andrade PetscObjectAllocateFortranPointers(*pc,9); 156ccf40c83SElliott Sales de Andrade ((PetscObject)*pc)->fortran_func_pointers[3] = (PetscVoidFunction)applytranspose; 1572fa5cd67SKarl Rupp 1586891c3e4SJed Brown *ierr = PCShellSetApplyTranspose(*pc,ourshellapplytranspose); 159e54e4138SSatish Balay } 160e54e4138SSatish Balay 161fe81eab7SBarry Smith PETSC_EXTERN void PETSC_STDCALL pcshellsetsetupctx_(PC *pc,void (PETSC_STDCALL *setup)(void*,void*,PetscErrorCode*),PetscErrorCode *ierr) 162fe81eab7SBarry Smith { 163*48cdcd6bSElliott Sales de Andrade PetscObjectAllocateFortranPointers(*pc,9); 164*48cdcd6bSElliott Sales de Andrade ((PetscObject)*pc)->fortran_func_pointers[4] = (PetscVoidFunction)setup; 165fe81eab7SBarry Smith 166fe81eab7SBarry Smith *ierr = PCShellSetSetUp(*pc,ourshellsetupctx); 167fe81eab7SBarry Smith } 168fe81eab7SBarry Smith 1698cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL pcshellsetsetup_(PC *pc,void (PETSC_STDCALL *setup)(void*,PetscErrorCode*),PetscErrorCode *ierr) 170e54e4138SSatish Balay { 1712f519dc9SElliott Sales de Andrade PetscObjectAllocateFortranPointers(*pc,9); 172ccf40c83SElliott Sales de Andrade ((PetscObject)*pc)->fortran_func_pointers[4] = (PetscVoidFunction)setup; 1732fa5cd67SKarl Rupp 1746891c3e4SJed Brown *ierr = PCShellSetSetUp(*pc,ourshellsetup); 175e54e4138SSatish Balay } 176e54e4138SSatish Balay 1778cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL pcshellsetdestroy_(PC *pc,void (PETSC_STDCALL *setup)(void*,PetscErrorCode*),PetscErrorCode *ierr) 1787c54600cSBarry Smith { 1792f519dc9SElliott Sales de Andrade PetscObjectAllocateFortranPointers(*pc,9); 180ccf40c83SElliott Sales de Andrade ((PetscObject)*pc)->fortran_func_pointers[5] = (PetscVoidFunction)setup; 1812fa5cd67SKarl Rupp 1826891c3e4SJed Brown *ierr = PCShellSetDestroy(*pc,ourshelldestroy); 1837c54600cSBarry Smith } 1847c54600cSBarry Smith 185a425a105SElliott Sales de Andrade PETSC_EXTERN void PETSC_STDCALL pcshellsetpresolve_(PC *pc,void (PETSC_STDCALL *presolve)(void*,void*,Vec*,Vec*,PetscErrorCode*),PetscErrorCode *ierr) 186a425a105SElliott Sales de Andrade { 1872f519dc9SElliott Sales de Andrade PetscObjectAllocateFortranPointers(*pc,9); 188ccf40c83SElliott Sales de Andrade ((PetscObject)*pc)->fortran_func_pointers[6] = (PetscVoidFunction)presolve; 189a425a105SElliott Sales de Andrade 190a425a105SElliott Sales de Andrade *ierr = PCShellSetPreSolve(*pc,ourshellpresolve); 191a425a105SElliott Sales de Andrade } 192a425a105SElliott Sales de Andrade 193a425a105SElliott Sales de Andrade PETSC_EXTERN void PETSC_STDCALL pcshellsetpostsolve_(PC *pc,void (PETSC_STDCALL *postsolve)(void*,void*,Vec*,Vec*,PetscErrorCode*),PetscErrorCode *ierr) 194a425a105SElliott Sales de Andrade { 1952f519dc9SElliott Sales de Andrade PetscObjectAllocateFortranPointers(*pc,9); 196ccf40c83SElliott Sales de Andrade ((PetscObject)*pc)->fortran_func_pointers[7] = (PetscVoidFunction)postsolve; 197a425a105SElliott Sales de Andrade 198a425a105SElliott Sales de Andrade *ierr = PCShellSetPostSolve(*pc,ourshellpostsolve); 199a425a105SElliott Sales de Andrade } 200a425a105SElliott Sales de Andrade 2012f519dc9SElliott Sales de Andrade PETSC_EXTERN void PETSC_STDCALL pcshellsetview_(PC *pc,void (PETSC_STDCALL *view)(void*,PetscViewer*,PetscErrorCode*),PetscErrorCode *ierr) 2022f519dc9SElliott Sales de Andrade { 2032f519dc9SElliott Sales de Andrade PetscObjectAllocateFortranPointers(*pc,9); 2042f519dc9SElliott Sales de Andrade ((PetscObject)*pc)->fortran_func_pointers[8] = (PetscVoidFunction)view; 2052f519dc9SElliott Sales de Andrade 2062f519dc9SElliott Sales de Andrade *ierr = PCShellSetView(*pc,ourshellview); 2072f519dc9SElliott Sales de Andrade } 2082f519dc9SElliott Sales de Andrade 2098cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL pcshellsetname_(PC *pc,CHAR name PETSC_MIXED_LEN(len), PetscErrorCode *ierr PETSC_END_LEN(len)) 2101d2e4005SSatish Balay { 2111d2e4005SSatish Balay char *c; 2121d2e4005SSatish Balay FIXCHAR(name,len,c); 2131d2e4005SSatish Balay *ierr = PCShellSetName(*pc,c); 2141d2e4005SSatish Balay FREECHAR(name,c); 2151d2e4005SSatish Balay } 2161d2e4005SSatish Balay 2178cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL pcshellgetname_(PC *pc,CHAR name PETSC_MIXED_LEN(len), PetscErrorCode *ierr PETSC_END_LEN(len)) 218e63f14baSBarry Smith { 219ccaf0856SBarry Smith const char *c; 220e63f14baSBarry Smith 221e63f14baSBarry Smith *ierr = PCShellGetName(*pc,&c);if (*ierr) return; 222e63f14baSBarry Smith *ierr = PetscStrncpy(name,c,len); 223e63f14baSBarry Smith } 224e63f14baSBarry Smith 225e54e4138SSatish Balay /* -----------------------------------------------------------------*/ 226e54e4138SSatish Balay 227