xref: /petsc/src/ksp/pc/impls/shell/ftn-custom/zshellpcf.c (revision 5ebfa9e9f88b822c006efbb9b0cb198b91a2e84d)
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