16dd63270SBarry Smith #include <petsc/private/ftnimpl.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 71b581b66SBarry Smith #define pcshellsetapplysymmetricleft_ PCSHELLSETAPPLYSYMMETRICLEFT 81b581b66SBarry Smith #define pcshellsetapplysymmetricright_ PCSHELLSETAPPLYSYMMETRICRIGHT 9ccf40c83SElliott Sales de Andrade #define pcshellsetapplyba_ PCSHELLSETAPPLYBA 10e54e4138SSatish Balay #define pcshellsetapplyrichardson_ PCSHELLSETAPPLYRICHARDSON 11e54e4138SSatish Balay #define pcshellsetapplytranspose_ PCSHELLSETAPPLYTRANSPOSE 12e54e4138SSatish Balay #define pcshellsetsetup_ PCSHELLSETSETUP 137c54600cSBarry Smith #define pcshellsetdestroy_ PCSHELLSETDESTROY 14a425a105SElliott Sales de Andrade #define pcshellsetpresolve_ PCSHELLSETPRESOLVE 15a425a105SElliott Sales de Andrade #define pcshellsetpostsolve_ PCSHELLSETPOSTSOLVE 162f519dc9SElliott Sales de Andrade #define pcshellsetview_ PCSHELLSETVIEW 17e54e4138SSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE) 18e54e4138SSatish Balay #define pcshellsetapply_ pcshellsetapply 198a6b6cadSSatish Balay #define pcshellsetapplysymmetricleft_ pcshellsetapplysymmetricleft 208a6b6cadSSatish Balay #define pcshellsetapplysymmetricright_ pcshellsetapplysymmetricright 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 29e54e4138SSatish Balay #endif 30e54e4138SSatish Balay 31e54e4138SSatish Balay /* These are not extern C because they are passed into non-extern C user level functions */ 326891c3e4SJed Brown static PetscErrorCode ourshellapply(PC pc, Vec x, Vec y) 33e54e4138SSatish Balay { 349566063dSJacob Faibussowitsch PetscCallFortranVoidFunction((*(void (*)(PC *, Vec *, Vec *, PetscErrorCode *))(((PetscObject)pc)->fortran_func_pointers[0]))(&pc, &x, &y, &ierr)); 353ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 36e54e4138SSatish Balay } 37e54e4138SSatish Balay 381b581b66SBarry Smith static PetscErrorCode ourshellapplysymmetricleft(PC pc, Vec x, Vec y) 391b581b66SBarry Smith { 409566063dSJacob Faibussowitsch PetscCallFortranVoidFunction((*(void (*)(PC *, Vec *, Vec *, PetscErrorCode *))(((PetscObject)pc)->fortran_func_pointers[9]))(&pc, &x, &y, &ierr)); 413ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 421b581b66SBarry Smith } 431b581b66SBarry Smith 441b581b66SBarry Smith static PetscErrorCode ourshellapplysymmetricright(PC pc, Vec x, Vec y) 451b581b66SBarry Smith { 469566063dSJacob Faibussowitsch PetscCallFortranVoidFunction((*(void (*)(PC *, Vec *, Vec *, PetscErrorCode *))(((PetscObject)pc)->fortran_func_pointers[10]))(&pc, &x, &y, &ierr)); 473ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 481b581b66SBarry Smith } 491b581b66SBarry Smith 50fe81eab7SBarry Smith static PetscErrorCode ourshellapplyctx(PC pc, Vec x, Vec y) 51fe81eab7SBarry Smith { 52fe81eab7SBarry Smith void *ctx; 539566063dSJacob Faibussowitsch PetscCall(PCShellGetContext(pc, &ctx)); 549566063dSJacob Faibussowitsch PetscCallFortranVoidFunction((*(void (*)(PC *, void *, Vec *, Vec *, PetscErrorCode *))(((PetscObject)pc)->fortran_func_pointers[0]))(&pc, ctx, &x, &y, &ierr)); 553ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 56fe81eab7SBarry Smith } 57fe81eab7SBarry Smith 58ccf40c83SElliott Sales de Andrade static PetscErrorCode ourshellapplyba(PC pc, PCSide side, Vec x, Vec y, Vec work) 59ccf40c83SElliott Sales de Andrade { 609566063dSJacob Faibussowitsch PetscCallFortranVoidFunction((*(void (*)(PC *, PCSide *, Vec *, Vec *, Vec *, PetscErrorCode *))(((PetscObject)pc)->fortran_func_pointers[1]))(&pc, &side, &x, &y, &work, &ierr)); 613ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 62ccf40c83SElliott Sales de Andrade } 63ccf40c83SElliott Sales de Andrade 64ace3abfcSBarry 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) 65e54e4138SSatish Balay { 669566063dSJacob Faibussowitsch PetscCallFortranVoidFunction((*(void (*)(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)); 673ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 68e54e4138SSatish Balay } 69e54e4138SSatish Balay 706891c3e4SJed Brown static PetscErrorCode ourshellapplytranspose(PC pc, Vec x, Vec y) 71e54e4138SSatish Balay { 729566063dSJacob Faibussowitsch PetscCallFortranVoidFunction((*(void (*)(void *, Vec *, Vec *, PetscErrorCode *))(((PetscObject)pc)->fortran_func_pointers[3]))(&pc, &x, &y, &ierr)); 733ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 74e54e4138SSatish Balay } 75e54e4138SSatish Balay 766891c3e4SJed Brown static PetscErrorCode ourshellsetup(PC pc) 77e54e4138SSatish Balay { 789566063dSJacob Faibussowitsch PetscCallFortranVoidFunction((*(void (*)(PC *, PetscErrorCode *))(((PetscObject)pc)->fortran_func_pointers[4]))(&pc, &ierr)); 793ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 80e54e4138SSatish Balay } 81e54e4138SSatish Balay 82fe81eab7SBarry Smith static PetscErrorCode ourshellsetupctx(PC pc) 83fe81eab7SBarry Smith { 84fe81eab7SBarry Smith void *ctx; 859566063dSJacob Faibussowitsch PetscCall(PCShellGetContext(pc, &ctx)); 869566063dSJacob Faibussowitsch PetscCallFortranVoidFunction((*(void (*)(PC *, void *, PetscErrorCode *))(((PetscObject)pc)->fortran_func_pointers[4]))(&pc, ctx, &ierr)); 873ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 88fe81eab7SBarry Smith } 89fe81eab7SBarry Smith 906891c3e4SJed Brown static PetscErrorCode ourshelldestroy(PC pc) 917c54600cSBarry Smith { 929566063dSJacob Faibussowitsch PetscCallFortranVoidFunction((*(void (*)(void *, PetscErrorCode *))(((PetscObject)pc)->fortran_func_pointers[5]))(&pc, &ierr)); 933ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 947c54600cSBarry Smith } 957c54600cSBarry Smith 96a425a105SElliott Sales de Andrade static PetscErrorCode ourshellpresolve(PC pc, KSP ksp, Vec x, Vec y) 97a425a105SElliott Sales de Andrade { 989566063dSJacob Faibussowitsch PetscCallFortranVoidFunction((*(void (*)(PC *, KSP *, Vec *, Vec *, PetscErrorCode *))(((PetscObject)pc)->fortran_func_pointers[6]))(&pc, &ksp, &x, &y, &ierr)); 993ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 100a425a105SElliott Sales de Andrade } 101a425a105SElliott Sales de Andrade 102a425a105SElliott Sales de Andrade static PetscErrorCode ourshellpostsolve(PC pc, KSP ksp, Vec x, Vec y) 103a425a105SElliott Sales de Andrade { 1049566063dSJacob Faibussowitsch PetscCallFortranVoidFunction((*(void (*)(PC *, KSP *, Vec *, Vec *, PetscErrorCode *))(((PetscObject)pc)->fortran_func_pointers[7]))(&pc, &ksp, &x, &y, &ierr)); 1053ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 106a425a105SElliott Sales de Andrade } 107a425a105SElliott Sales de Andrade 1082f519dc9SElliott Sales de Andrade static PetscErrorCode ourshellview(PC pc, PetscViewer view) 1092f519dc9SElliott Sales de Andrade { 1109566063dSJacob Faibussowitsch PetscCallFortranVoidFunction((*(void (*)(PC *, PetscViewer *, PetscErrorCode *))(((PetscObject)pc)->fortran_func_pointers[8]))(&pc, &view, &ierr)); 1113ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 112e54e4138SSatish Balay } 113e54e4138SSatish Balay 11419caf8f3SSatish Balay PETSC_EXTERN void pcshellsetapply_(PC *pc, void (*apply)(void *, Vec *, Vec *, PetscErrorCode *), PetscErrorCode *ierr) 115e54e4138SSatish Balay { 1161b581b66SBarry Smith PetscObjectAllocateFortranPointers(*pc, 11); 117*5ebfa9e9SBarry Smith ((PetscObject)*pc)->fortran_func_pointers[0] = (PetscFortranCallbackFn *)apply; 1182fa5cd67SKarl Rupp 1196891c3e4SJed Brown *ierr = PCShellSetApply(*pc, ourshellapply); 1206895c445SBarry Smith } 1216895c445SBarry Smith 12219caf8f3SSatish Balay PETSC_EXTERN void pcshellsetapplysymmetricleft_(PC *pc, void (*apply)(void *, Vec *, Vec *, PetscErrorCode *), PetscErrorCode *ierr) 1231b581b66SBarry Smith { 1241b581b66SBarry Smith PetscObjectAllocateFortranPointers(*pc, 11); 125*5ebfa9e9SBarry Smith ((PetscObject)*pc)->fortran_func_pointers[9] = (PetscFortranCallbackFn *)apply; 1261b581b66SBarry Smith 1271b581b66SBarry Smith *ierr = PCShellSetApplySymmetricLeft(*pc, ourshellapplysymmetricleft); 1281b581b66SBarry Smith } 1291b581b66SBarry Smith 13019caf8f3SSatish Balay PETSC_EXTERN void pcshellsetapplysymmetricright_(PC *pc, void (*apply)(void *, Vec *, Vec *, PetscErrorCode *), PetscErrorCode *ierr) 1311b581b66SBarry Smith { 1321b581b66SBarry Smith PetscObjectAllocateFortranPointers(*pc, 11); 133*5ebfa9e9SBarry Smith ((PetscObject)*pc)->fortran_func_pointers[10] = (PetscFortranCallbackFn *)apply; 1341b581b66SBarry Smith 1351b581b66SBarry Smith *ierr = PCShellSetApplySymmetricRight(*pc, ourshellapplysymmetricright); 1361b581b66SBarry Smith } 1371b581b66SBarry Smith 13819caf8f3SSatish Balay PETSC_EXTERN void pcshellsetapplyctx_(PC *pc, void (*apply)(void *, void *, Vec *, Vec *, PetscErrorCode *), PetscErrorCode *ierr) 139fe81eab7SBarry Smith { 1401b581b66SBarry Smith PetscObjectAllocateFortranPointers(*pc, 11); 141*5ebfa9e9SBarry Smith ((PetscObject)*pc)->fortran_func_pointers[0] = (PetscFortranCallbackFn *)apply; 142fe81eab7SBarry Smith 143fe81eab7SBarry Smith *ierr = PCShellSetApply(*pc, ourshellapplyctx); 144fe81eab7SBarry Smith } 145fe81eab7SBarry Smith 14619caf8f3SSatish Balay PETSC_EXTERN void pcshellsetapplyba_(PC *pc, void (*apply)(void *, PCSide *, Vec *, Vec *, Vec *, PetscErrorCode *), PetscErrorCode *ierr) 147ccf40c83SElliott Sales de Andrade { 1481b581b66SBarry Smith PetscObjectAllocateFortranPointers(*pc, 11); 149*5ebfa9e9SBarry Smith ((PetscObject)*pc)->fortran_func_pointers[1] = (PetscFortranCallbackFn *)apply; 150ccf40c83SElliott Sales de Andrade 151ccf40c83SElliott Sales de Andrade *ierr = PCShellSetApplyBA(*pc, ourshellapplyba); 152ccf40c83SElliott Sales de Andrade } 153ccf40c83SElliott Sales de Andrade 15419caf8f3SSatish Balay PETSC_EXTERN void pcshellsetapplyrichardson_(PC *pc, void (*apply)(void *, Vec *, Vec *, Vec *, PetscReal *, PetscReal *, PetscReal *, PetscInt *, PetscBool *, PetscInt *, PCRichardsonConvergedReason *, PetscErrorCode *), PetscErrorCode *ierr) 1556895c445SBarry Smith { 1561b581b66SBarry Smith PetscObjectAllocateFortranPointers(*pc, 11); 157*5ebfa9e9SBarry Smith ((PetscObject)*pc)->fortran_func_pointers[2] = (PetscFortranCallbackFn *)apply; 1586891c3e4SJed Brown *ierr = PCShellSetApplyRichardson(*pc, ourapplyrichardson); 1596895c445SBarry Smith } 1606895c445SBarry Smith 16119caf8f3SSatish Balay PETSC_EXTERN void pcshellsetapplytranspose_(PC *pc, void (*applytranspose)(void *, Vec *, Vec *, PetscErrorCode *), PetscErrorCode *ierr) 1626895c445SBarry Smith { 1631b581b66SBarry Smith PetscObjectAllocateFortranPointers(*pc, 11); 164*5ebfa9e9SBarry Smith ((PetscObject)*pc)->fortran_func_pointers[3] = (PetscFortranCallbackFn *)applytranspose; 1652fa5cd67SKarl Rupp 1666891c3e4SJed Brown *ierr = PCShellSetApplyTranspose(*pc, ourshellapplytranspose); 167e54e4138SSatish Balay } 168e54e4138SSatish Balay 16919caf8f3SSatish Balay PETSC_EXTERN void pcshellsetsetupctx_(PC *pc, void (*setup)(void *, void *, PetscErrorCode *), PetscErrorCode *ierr) 170fe81eab7SBarry Smith { 1711b581b66SBarry Smith PetscObjectAllocateFortranPointers(*pc, 11); 172*5ebfa9e9SBarry Smith ((PetscObject)*pc)->fortran_func_pointers[4] = (PetscFortranCallbackFn *)setup; 173fe81eab7SBarry Smith 174fe81eab7SBarry Smith *ierr = PCShellSetSetUp(*pc, ourshellsetupctx); 175fe81eab7SBarry Smith } 176fe81eab7SBarry Smith 17719caf8f3SSatish Balay PETSC_EXTERN void pcshellsetsetup_(PC *pc, void (*setup)(void *, PetscErrorCode *), PetscErrorCode *ierr) 178e54e4138SSatish Balay { 1791b581b66SBarry Smith PetscObjectAllocateFortranPointers(*pc, 11); 180*5ebfa9e9SBarry Smith ((PetscObject)*pc)->fortran_func_pointers[4] = (PetscFortranCallbackFn *)setup; 1812fa5cd67SKarl Rupp 1826891c3e4SJed Brown *ierr = PCShellSetSetUp(*pc, ourshellsetup); 183e54e4138SSatish Balay } 184e54e4138SSatish Balay 18519caf8f3SSatish Balay PETSC_EXTERN void pcshellsetdestroy_(PC *pc, void (*setup)(void *, PetscErrorCode *), PetscErrorCode *ierr) 1867c54600cSBarry Smith { 1871b581b66SBarry Smith PetscObjectAllocateFortranPointers(*pc, 11); 188*5ebfa9e9SBarry Smith ((PetscObject)*pc)->fortran_func_pointers[5] = (PetscFortranCallbackFn *)setup; 1892fa5cd67SKarl Rupp 1906891c3e4SJed Brown *ierr = PCShellSetDestroy(*pc, ourshelldestroy); 1917c54600cSBarry Smith } 1927c54600cSBarry Smith 19319caf8f3SSatish Balay PETSC_EXTERN void pcshellsetpresolve_(PC *pc, void (*presolve)(void *, void *, Vec *, Vec *, PetscErrorCode *), PetscErrorCode *ierr) 194a425a105SElliott Sales de Andrade { 1951b581b66SBarry Smith PetscObjectAllocateFortranPointers(*pc, 11); 196*5ebfa9e9SBarry Smith ((PetscObject)*pc)->fortran_func_pointers[6] = (PetscFortranCallbackFn *)presolve; 197a425a105SElliott Sales de Andrade 198a425a105SElliott Sales de Andrade *ierr = PCShellSetPreSolve(*pc, ourshellpresolve); 199a425a105SElliott Sales de Andrade } 200a425a105SElliott Sales de Andrade 20119caf8f3SSatish Balay PETSC_EXTERN void pcshellsetpostsolve_(PC *pc, void (*postsolve)(void *, void *, Vec *, Vec *, PetscErrorCode *), PetscErrorCode *ierr) 202a425a105SElliott Sales de Andrade { 2031b581b66SBarry Smith PetscObjectAllocateFortranPointers(*pc, 11); 204*5ebfa9e9SBarry Smith ((PetscObject)*pc)->fortran_func_pointers[7] = (PetscFortranCallbackFn *)postsolve; 205a425a105SElliott Sales de Andrade 206a425a105SElliott Sales de Andrade *ierr = PCShellSetPostSolve(*pc, ourshellpostsolve); 207a425a105SElliott Sales de Andrade } 208a425a105SElliott Sales de Andrade 20919caf8f3SSatish Balay PETSC_EXTERN void pcshellsetview_(PC *pc, void (*view)(void *, PetscViewer *, PetscErrorCode *), PetscErrorCode *ierr) 2102f519dc9SElliott Sales de Andrade { 2111b581b66SBarry Smith PetscObjectAllocateFortranPointers(*pc, 11); 212*5ebfa9e9SBarry Smith ((PetscObject)*pc)->fortran_func_pointers[8] = (PetscFortranCallbackFn *)view; 2132f519dc9SElliott Sales de Andrade 2142f519dc9SElliott Sales de Andrade *ierr = PCShellSetView(*pc, ourshellview); 2152f519dc9SElliott Sales de Andrade } 216