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 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 171d2e4005SSatish Balay #define pcshellsetname_ PCSHELLSETNAME 18e63f14baSBarry Smith #define pcshellgetname_ PCSHELLGETNAME 196895c445SBarry Smith #define pcshellsetcontext_ PCSHELLSETCONTEXT 206895c445SBarry Smith #define pcshellgetcontext_ PCSHELLGETCONTEXT 21e54e4138SSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE) 22e54e4138SSatish Balay #define pcshellsetapply_ pcshellsetapply 23ccf40c83SElliott Sales de Andrade #define pcshellsetapplyba_ pcshellsetapplyba 24e54e4138SSatish Balay #define pcshellsetapplyrichardson_ pcshellsetapplyrichardson 25e54e4138SSatish Balay #define pcshellsetapplytranspose_ pcshellsetapplytranspose 26e54e4138SSatish Balay #define pcshellsetsetup_ pcshellsetsetup 277c54600cSBarry Smith #define pcshellsetdestroy_ pcshellsetdestroy 28a425a105SElliott Sales de Andrade #define pcshellsetpresolve_ pcshellsetpresolve 29a425a105SElliott Sales de Andrade #define pcshellsetpostsolve_ pcshellsetpostsolve 302f519dc9SElliott Sales de Andrade #define pcshellsetview_ pcshellsetview 311d2e4005SSatish Balay #define pcshellsetname_ pcshellsetname 32e63f14baSBarry Smith #define pcshellgetname_ pcshellgetname 336895c445SBarry Smith #define pcshellsetcontext_ pcshellsetcontext 346895c445SBarry Smith #define pcshellgetcontext_ pcshellgetcontext 35e54e4138SSatish Balay #endif 36e54e4138SSatish Balay 37e54e4138SSatish Balay /* These are not extern C because they are passed into non-extern C user level functions */ 386891c3e4SJed Brown static PetscErrorCode ourshellapply(PC pc, Vec x, Vec y) 39e54e4138SSatish Balay { 409566063dSJacob Faibussowitsch PetscCallFortranVoidFunction((*(void (*)(PC *, Vec *, Vec *, PetscErrorCode *))(((PetscObject)pc)->fortran_func_pointers[0]))(&pc, &x, &y, &ierr)); 41*3ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 42e54e4138SSatish Balay } 43e54e4138SSatish Balay 441b581b66SBarry Smith static PetscErrorCode ourshellapplysymmetricleft(PC pc, Vec x, Vec y) 451b581b66SBarry Smith { 469566063dSJacob Faibussowitsch PetscCallFortranVoidFunction((*(void (*)(PC *, Vec *, Vec *, PetscErrorCode *))(((PetscObject)pc)->fortran_func_pointers[9]))(&pc, &x, &y, &ierr)); 47*3ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 481b581b66SBarry Smith } 491b581b66SBarry Smith 501b581b66SBarry Smith static PetscErrorCode ourshellapplysymmetricright(PC pc, Vec x, Vec y) 511b581b66SBarry Smith { 529566063dSJacob Faibussowitsch PetscCallFortranVoidFunction((*(void (*)(PC *, Vec *, Vec *, PetscErrorCode *))(((PetscObject)pc)->fortran_func_pointers[10]))(&pc, &x, &y, &ierr)); 53*3ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 541b581b66SBarry Smith } 551b581b66SBarry Smith 56fe81eab7SBarry Smith static PetscErrorCode ourshellapplyctx(PC pc, Vec x, Vec y) 57fe81eab7SBarry Smith { 58fe81eab7SBarry Smith void *ctx; 599566063dSJacob Faibussowitsch PetscCall(PCShellGetContext(pc, &ctx)); 609566063dSJacob Faibussowitsch PetscCallFortranVoidFunction((*(void (*)(PC *, void *, Vec *, Vec *, PetscErrorCode *))(((PetscObject)pc)->fortran_func_pointers[0]))(&pc, ctx, &x, &y, &ierr)); 61*3ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 62fe81eab7SBarry Smith } 63fe81eab7SBarry Smith 64ccf40c83SElliott Sales de Andrade static PetscErrorCode ourshellapplyba(PC pc, PCSide side, Vec x, Vec y, Vec work) 65ccf40c83SElliott Sales de Andrade { 669566063dSJacob Faibussowitsch PetscCallFortranVoidFunction((*(void (*)(PC *, PCSide *, Vec *, Vec *, Vec *, PetscErrorCode *))(((PetscObject)pc)->fortran_func_pointers[1]))(&pc, &side, &x, &y, &work, &ierr)); 67*3ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 68ccf40c83SElliott Sales de Andrade } 69ccf40c83SElliott Sales de Andrade 70ace3abfcSBarry 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) 71e54e4138SSatish Balay { 729566063dSJacob 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)); 73*3ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 74e54e4138SSatish Balay } 75e54e4138SSatish Balay 766891c3e4SJed Brown static PetscErrorCode ourshellapplytranspose(PC pc, Vec x, Vec y) 77e54e4138SSatish Balay { 789566063dSJacob Faibussowitsch PetscCallFortranVoidFunction((*(void (*)(void *, Vec *, Vec *, PetscErrorCode *))(((PetscObject)pc)->fortran_func_pointers[3]))(&pc, &x, &y, &ierr)); 79*3ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 80e54e4138SSatish Balay } 81e54e4138SSatish Balay 826891c3e4SJed Brown static PetscErrorCode ourshellsetup(PC pc) 83e54e4138SSatish Balay { 849566063dSJacob Faibussowitsch PetscCallFortranVoidFunction((*(void (*)(PC *, PetscErrorCode *))(((PetscObject)pc)->fortran_func_pointers[4]))(&pc, &ierr)); 85*3ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 86e54e4138SSatish Balay } 87e54e4138SSatish Balay 88fe81eab7SBarry Smith static PetscErrorCode ourshellsetupctx(PC pc) 89fe81eab7SBarry Smith { 90fe81eab7SBarry Smith void *ctx; 919566063dSJacob Faibussowitsch PetscCall(PCShellGetContext(pc, &ctx)); 929566063dSJacob Faibussowitsch PetscCallFortranVoidFunction((*(void (*)(PC *, void *, PetscErrorCode *))(((PetscObject)pc)->fortran_func_pointers[4]))(&pc, ctx, &ierr)); 93*3ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 94fe81eab7SBarry Smith } 95fe81eab7SBarry Smith 966891c3e4SJed Brown static PetscErrorCode ourshelldestroy(PC pc) 977c54600cSBarry Smith { 989566063dSJacob Faibussowitsch PetscCallFortranVoidFunction((*(void (*)(void *, PetscErrorCode *))(((PetscObject)pc)->fortran_func_pointers[5]))(&pc, &ierr)); 99*3ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 1007c54600cSBarry Smith } 1017c54600cSBarry Smith 102a425a105SElliott Sales de Andrade static PetscErrorCode ourshellpresolve(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[6]))(&pc, &ksp, &x, &y, &ierr)); 105*3ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 106a425a105SElliott Sales de Andrade } 107a425a105SElliott Sales de Andrade 108a425a105SElliott Sales de Andrade static PetscErrorCode ourshellpostsolve(PC pc, KSP ksp, Vec x, Vec y) 109a425a105SElliott Sales de Andrade { 1109566063dSJacob Faibussowitsch PetscCallFortranVoidFunction((*(void (*)(PC *, KSP *, Vec *, Vec *, PetscErrorCode *))(((PetscObject)pc)->fortran_func_pointers[7]))(&pc, &ksp, &x, &y, &ierr)); 111*3ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 112a425a105SElliott Sales de Andrade } 113a425a105SElliott Sales de Andrade 1142f519dc9SElliott Sales de Andrade static PetscErrorCode ourshellview(PC pc, PetscViewer view) 1152f519dc9SElliott Sales de Andrade { 1169566063dSJacob Faibussowitsch PetscCallFortranVoidFunction((*(void (*)(PC *, PetscViewer *, PetscErrorCode *))(((PetscObject)pc)->fortran_func_pointers[8]))(&pc, &view, &ierr)); 117*3ba16761SJacob Faibussowitsch return PETSC_SUCCESS; 118e54e4138SSatish Balay } 119e54e4138SSatish Balay 12019caf8f3SSatish Balay PETSC_EXTERN void pcshellgetcontext_(PC *pc,void **ctx,PetscErrorCode *ierr) 121e54e4138SSatish Balay { 1226891c3e4SJed Brown *ierr = PCShellGetContext(*pc,ctx); 123e54e4138SSatish Balay } 124e54e4138SSatish Balay 12519caf8f3SSatish Balay PETSC_EXTERN void pcshellsetapply_(PC *pc,void (*apply)(void*,Vec*,Vec*,PetscErrorCode*),PetscErrorCode *ierr) 126e54e4138SSatish Balay { 1271b581b66SBarry Smith PetscObjectAllocateFortranPointers(*pc,11); 1286891c3e4SJed Brown ((PetscObject)*pc)->fortran_func_pointers[0] = (PetscVoidFunction)apply; 1292fa5cd67SKarl Rupp 1306891c3e4SJed Brown *ierr = PCShellSetApply(*pc,ourshellapply); 1316895c445SBarry Smith } 1326895c445SBarry Smith 13319caf8f3SSatish Balay PETSC_EXTERN void pcshellsetapplysymmetricleft_(PC *pc,void (*apply)(void*,Vec*,Vec*,PetscErrorCode*),PetscErrorCode *ierr) 1341b581b66SBarry Smith { 1351b581b66SBarry Smith PetscObjectAllocateFortranPointers(*pc,11); 1361b581b66SBarry Smith ((PetscObject)*pc)->fortran_func_pointers[9] = (PetscVoidFunction)apply; 1371b581b66SBarry Smith 1381b581b66SBarry Smith *ierr = PCShellSetApplySymmetricLeft(*pc,ourshellapplysymmetricleft); 1391b581b66SBarry Smith } 1401b581b66SBarry Smith 14119caf8f3SSatish Balay PETSC_EXTERN void pcshellsetapplysymmetricright_(PC *pc,void (*apply)(void*,Vec*,Vec*,PetscErrorCode*),PetscErrorCode *ierr) 1421b581b66SBarry Smith { 1431b581b66SBarry Smith PetscObjectAllocateFortranPointers(*pc,11); 1441b581b66SBarry Smith ((PetscObject)*pc)->fortran_func_pointers[10] = (PetscVoidFunction)apply; 1451b581b66SBarry Smith 1461b581b66SBarry Smith *ierr = PCShellSetApplySymmetricRight(*pc,ourshellapplysymmetricright); 1471b581b66SBarry Smith } 1481b581b66SBarry Smith 14919caf8f3SSatish Balay PETSC_EXTERN void pcshellsetapplyctx_(PC *pc,void (*apply)(void*,void*,Vec*,Vec*,PetscErrorCode*),PetscErrorCode *ierr) 150fe81eab7SBarry Smith { 1511b581b66SBarry Smith PetscObjectAllocateFortranPointers(*pc,11); 152fe81eab7SBarry Smith ((PetscObject)*pc)->fortran_func_pointers[0] = (PetscVoidFunction)apply; 153fe81eab7SBarry Smith 154fe81eab7SBarry Smith *ierr = PCShellSetApply(*pc,ourshellapplyctx); 155fe81eab7SBarry Smith } 156fe81eab7SBarry Smith 15719caf8f3SSatish Balay PETSC_EXTERN void pcshellsetapplyba_(PC *pc,void (*apply)(void*,PCSide*,Vec*,Vec*,Vec*,PetscErrorCode*),PetscErrorCode *ierr) 158ccf40c83SElliott Sales de Andrade { 1591b581b66SBarry Smith PetscObjectAllocateFortranPointers(*pc,11); 160ccf40c83SElliott Sales de Andrade ((PetscObject)*pc)->fortran_func_pointers[1] = (PetscVoidFunction)apply; 161ccf40c83SElliott Sales de Andrade 162ccf40c83SElliott Sales de Andrade *ierr = PCShellSetApplyBA(*pc,ourshellapplyba); 163ccf40c83SElliott Sales de Andrade } 164ccf40c83SElliott Sales de Andrade 16519caf8f3SSatish Balay PETSC_EXTERN void pcshellsetapplyrichardson_(PC *pc,void (*apply)(void*,Vec*,Vec*,Vec*,PetscReal*,PetscReal*,PetscReal*,PetscInt*,PetscBool*,PetscInt*,PCRichardsonConvergedReason*,PetscErrorCode*),PetscErrorCode *ierr) 1666895c445SBarry Smith { 1671b581b66SBarry Smith PetscObjectAllocateFortranPointers(*pc,11); 168ccf40c83SElliott Sales de Andrade ((PetscObject)*pc)->fortran_func_pointers[2] = (PetscVoidFunction)apply; 1696891c3e4SJed Brown *ierr = PCShellSetApplyRichardson(*pc,ourapplyrichardson); 1706895c445SBarry Smith } 1716895c445SBarry Smith 17219caf8f3SSatish Balay PETSC_EXTERN void pcshellsetapplytranspose_(PC *pc,void (*applytranspose)(void*,Vec *,Vec *,PetscErrorCode*), PetscErrorCode *ierr) 1736895c445SBarry Smith { 1741b581b66SBarry Smith PetscObjectAllocateFortranPointers(*pc,11); 175ccf40c83SElliott Sales de Andrade ((PetscObject)*pc)->fortran_func_pointers[3] = (PetscVoidFunction)applytranspose; 1762fa5cd67SKarl Rupp 1776891c3e4SJed Brown *ierr = PCShellSetApplyTranspose(*pc,ourshellapplytranspose); 178e54e4138SSatish Balay } 179e54e4138SSatish Balay 18019caf8f3SSatish Balay PETSC_EXTERN void pcshellsetsetupctx_(PC *pc,void (*setup)(void*,void*,PetscErrorCode*),PetscErrorCode *ierr) 181fe81eab7SBarry Smith { 1821b581b66SBarry Smith PetscObjectAllocateFortranPointers(*pc,11); 18348cdcd6bSElliott Sales de Andrade ((PetscObject)*pc)->fortran_func_pointers[4] = (PetscVoidFunction)setup; 184fe81eab7SBarry Smith 185fe81eab7SBarry Smith *ierr = PCShellSetSetUp(*pc,ourshellsetupctx); 186fe81eab7SBarry Smith } 187fe81eab7SBarry Smith 18819caf8f3SSatish Balay PETSC_EXTERN void pcshellsetsetup_(PC *pc,void (*setup)(void*,PetscErrorCode*),PetscErrorCode *ierr) 189e54e4138SSatish Balay { 1901b581b66SBarry Smith PetscObjectAllocateFortranPointers(*pc,11); 191ccf40c83SElliott Sales de Andrade ((PetscObject)*pc)->fortran_func_pointers[4] = (PetscVoidFunction)setup; 1922fa5cd67SKarl Rupp 1936891c3e4SJed Brown *ierr = PCShellSetSetUp(*pc,ourshellsetup); 194e54e4138SSatish Balay } 195e54e4138SSatish Balay 19619caf8f3SSatish Balay PETSC_EXTERN void pcshellsetdestroy_(PC *pc,void (*setup)(void*,PetscErrorCode*),PetscErrorCode *ierr) 1977c54600cSBarry Smith { 1981b581b66SBarry Smith PetscObjectAllocateFortranPointers(*pc,11); 199ccf40c83SElliott Sales de Andrade ((PetscObject)*pc)->fortran_func_pointers[5] = (PetscVoidFunction)setup; 2002fa5cd67SKarl Rupp 2016891c3e4SJed Brown *ierr = PCShellSetDestroy(*pc,ourshelldestroy); 2027c54600cSBarry Smith } 2037c54600cSBarry Smith 20419caf8f3SSatish Balay PETSC_EXTERN void pcshellsetpresolve_(PC *pc,void (*presolve)(void*,void*,Vec*,Vec*,PetscErrorCode*),PetscErrorCode *ierr) 205a425a105SElliott Sales de Andrade { 2061b581b66SBarry Smith PetscObjectAllocateFortranPointers(*pc,11); 207ccf40c83SElliott Sales de Andrade ((PetscObject)*pc)->fortran_func_pointers[6] = (PetscVoidFunction)presolve; 208a425a105SElliott Sales de Andrade 209a425a105SElliott Sales de Andrade *ierr = PCShellSetPreSolve(*pc,ourshellpresolve); 210a425a105SElliott Sales de Andrade } 211a425a105SElliott Sales de Andrade 21219caf8f3SSatish Balay PETSC_EXTERN void pcshellsetpostsolve_(PC *pc,void (*postsolve)(void*,void*,Vec*,Vec*,PetscErrorCode*),PetscErrorCode *ierr) 213a425a105SElliott Sales de Andrade { 2141b581b66SBarry Smith PetscObjectAllocateFortranPointers(*pc,11); 215ccf40c83SElliott Sales de Andrade ((PetscObject)*pc)->fortran_func_pointers[7] = (PetscVoidFunction)postsolve; 216a425a105SElliott Sales de Andrade 217a425a105SElliott Sales de Andrade *ierr = PCShellSetPostSolve(*pc,ourshellpostsolve); 218a425a105SElliott Sales de Andrade } 219a425a105SElliott Sales de Andrade 22019caf8f3SSatish Balay PETSC_EXTERN void pcshellsetview_(PC *pc,void (*view)(void*,PetscViewer*,PetscErrorCode*),PetscErrorCode *ierr) 2212f519dc9SElliott Sales de Andrade { 2221b581b66SBarry Smith PetscObjectAllocateFortranPointers(*pc,11); 2232f519dc9SElliott Sales de Andrade ((PetscObject)*pc)->fortran_func_pointers[8] = (PetscVoidFunction)view; 2242f519dc9SElliott Sales de Andrade 2252f519dc9SElliott Sales de Andrade *ierr = PCShellSetView(*pc,ourshellview); 2262f519dc9SElliott Sales de Andrade } 2272f519dc9SElliott Sales de Andrade 22819caf8f3SSatish Balay PETSC_EXTERN void pcshellsetname_(PC *pc,char* name, PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len) 2291d2e4005SSatish Balay { 2301d2e4005SSatish Balay char *c; 2311d2e4005SSatish Balay FIXCHAR(name,len,c); 232d49bb8f9SBarry Smith *ierr = PCShellSetName(*pc,c);if (*ierr) return; 2331d2e4005SSatish Balay FREECHAR(name,c); 2341d2e4005SSatish Balay } 2351d2e4005SSatish Balay 23619caf8f3SSatish Balay PETSC_EXTERN void pcshellgetname_(PC *pc,char* name, PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len) 237e63f14baSBarry Smith { 238ccaf0856SBarry Smith const char *c; 239e63f14baSBarry Smith 240e63f14baSBarry Smith *ierr = PCShellGetName(*pc,&c);if (*ierr) return; 241d49bb8f9SBarry Smith *ierr = PetscStrncpy(name,c,len);if (*ierr) return; 242d6a8cea5SBarry Smith FIXRETURNCHAR(PETSC_TRUE,name,len); 243e63f14baSBarry Smith } 244