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