xref: /petsc/src/ksp/pc/impls/shell/ftn-custom/zshellpcf.c (revision 1b581b665160bc053f1db6f623a6eaab6b98fcae)
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
7*1b581b66SBarry Smith #define pcshellsetapplysymmetricleft_       PCSHELLSETAPPLYSYMMETRICLEFT
8*1b581b66SBarry 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 {
40e54e4138SSatish Balay   PetscErrorCode ierr = 0;
416891c3e4SJed Brown   (*(void (PETSC_STDCALL *)(PC*,Vec*,Vec*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[0]))(&pc,&x,&y,&ierr);CHKERRQ(ierr);
42e54e4138SSatish Balay   return 0;
43e54e4138SSatish Balay }
44e54e4138SSatish Balay 
45*1b581b66SBarry Smith static PetscErrorCode ourshellapplysymmetricleft(PC pc,Vec x,Vec y)
46*1b581b66SBarry Smith {
47*1b581b66SBarry Smith   PetscErrorCode ierr = 0;
48*1b581b66SBarry Smith   (*(void (PETSC_STDCALL *)(PC*,Vec*,Vec*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[9]))(&pc,&x,&y,&ierr);CHKERRQ(ierr);
49*1b581b66SBarry Smith   return 0;
50*1b581b66SBarry Smith }
51*1b581b66SBarry Smith 
52*1b581b66SBarry Smith static PetscErrorCode ourshellapplysymmetricright(PC pc,Vec x,Vec y)
53*1b581b66SBarry Smith {
54*1b581b66SBarry Smith   PetscErrorCode ierr = 0;
55*1b581b66SBarry Smith   (*(void (PETSC_STDCALL *)(PC*,Vec*,Vec*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[10]))(&pc,&x,&y,&ierr);CHKERRQ(ierr);
56*1b581b66SBarry Smith   return 0;
57*1b581b66SBarry Smith }
58*1b581b66SBarry Smith 
59fe81eab7SBarry Smith static PetscErrorCode ourshellapplyctx(PC pc,Vec x,Vec y)
60fe81eab7SBarry Smith {
61fe81eab7SBarry Smith   PetscErrorCode ierr = 0;
62fe81eab7SBarry Smith   void           *ctx;
63fe81eab7SBarry Smith   ierr = PCShellGetContext(pc,&ctx);CHKERRQ(ierr);
64fe81eab7SBarry Smith   (*(void (PETSC_STDCALL *)(PC*,void*,Vec*,Vec*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[0]))(&pc,ctx,&x,&y,&ierr);CHKERRQ(ierr);
65fe81eab7SBarry Smith   return 0;
66fe81eab7SBarry Smith }
67fe81eab7SBarry Smith 
68ccf40c83SElliott Sales de Andrade static PetscErrorCode ourshellapplyba(PC pc,PCSide side,Vec x,Vec y,Vec work)
69ccf40c83SElliott Sales de Andrade {
70ccf40c83SElliott Sales de Andrade   PetscErrorCode ierr = 0;
71ccf40c83SElliott 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);
72ccf40c83SElliott Sales de Andrade   return 0;
73ccf40c83SElliott Sales de Andrade }
74ccf40c83SElliott Sales de Andrade 
75ace3abfcSBarry 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)
76e54e4138SSatish Balay {
77e54e4138SSatish Balay   PetscErrorCode ierr = 0;
78ccf40c83SElliott 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);
79e54e4138SSatish Balay   return 0;
80e54e4138SSatish Balay }
81e54e4138SSatish Balay 
826891c3e4SJed Brown static PetscErrorCode ourshellapplytranspose(PC pc,Vec x,Vec y)
83e54e4138SSatish Balay {
84e54e4138SSatish Balay   PetscErrorCode ierr = 0;
85ccf40c83SElliott Sales de Andrade   (*(void (PETSC_STDCALL *)(void*,Vec*,Vec*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[3]))(&pc,&x,&y,&ierr);CHKERRQ(ierr);
86e54e4138SSatish Balay   return 0;
87e54e4138SSatish Balay }
88e54e4138SSatish Balay 
896891c3e4SJed Brown static PetscErrorCode ourshellsetup(PC pc)
90e54e4138SSatish Balay {
91e54e4138SSatish Balay   PetscErrorCode ierr = 0;
92ccf40c83SElliott Sales de Andrade   (*(void (PETSC_STDCALL *)(PC*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[4]))(&pc,&ierr);CHKERRQ(ierr);
93e54e4138SSatish Balay   return 0;
94e54e4138SSatish Balay }
95e54e4138SSatish Balay 
96fe81eab7SBarry Smith static PetscErrorCode ourshellsetupctx(PC pc)
97fe81eab7SBarry Smith {
98fe81eab7SBarry Smith   PetscErrorCode ierr = 0;
99fe81eab7SBarry Smith   void           *ctx;
100fe81eab7SBarry Smith   ierr = PCShellGetContext(pc,&ctx);CHKERRQ(ierr);
10148cdcd6bSElliott Sales de Andrade   (*(void (PETSC_STDCALL *)(PC*,void*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[4]))(&pc,ctx,&ierr);CHKERRQ(ierr);
102fe81eab7SBarry Smith   return 0;
103fe81eab7SBarry Smith }
104fe81eab7SBarry Smith 
1056891c3e4SJed Brown static PetscErrorCode ourshelldestroy(PC pc)
1067c54600cSBarry Smith {
1077c54600cSBarry Smith   PetscErrorCode ierr = 0;
108ccf40c83SElliott Sales de Andrade   (*(void (PETSC_STDCALL *)(void*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[5]))(&pc,&ierr);CHKERRQ(ierr);
1097c54600cSBarry Smith   return 0;
1107c54600cSBarry Smith }
1117c54600cSBarry Smith 
112a425a105SElliott Sales de Andrade static PetscErrorCode ourshellpresolve(PC pc,KSP ksp,Vec x,Vec y)
113a425a105SElliott Sales de Andrade {
114a425a105SElliott Sales de Andrade   PetscErrorCode ierr = 0;
115ccf40c83SElliott Sales de Andrade   (*(void (PETSC_STDCALL *)(PC*,KSP*,Vec*,Vec*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[6]))(&pc,&ksp,&x,&y,&ierr);CHKERRQ(ierr);
116a425a105SElliott Sales de Andrade   return 0;
117a425a105SElliott Sales de Andrade }
118a425a105SElliott Sales de Andrade 
119a425a105SElliott Sales de Andrade static PetscErrorCode ourshellpostsolve(PC pc,KSP ksp,Vec x,Vec y)
120a425a105SElliott Sales de Andrade {
121a425a105SElliott Sales de Andrade   PetscErrorCode ierr = 0;
122ccf40c83SElliott Sales de Andrade   (*(void (PETSC_STDCALL *)(PC*,KSP*,Vec*,Vec*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[7]))(&pc,&ksp,&x,&y,&ierr);CHKERRQ(ierr);
123a425a105SElliott Sales de Andrade   return 0;
124a425a105SElliott Sales de Andrade }
125a425a105SElliott Sales de Andrade 
1262f519dc9SElliott Sales de Andrade static PetscErrorCode ourshellview(PC pc,PetscViewer view)
1272f519dc9SElliott Sales de Andrade {
1282f519dc9SElliott Sales de Andrade   PetscErrorCode ierr = 0;
1292f519dc9SElliott Sales de Andrade   (*(void (PETSC_STDCALL *)(PC*,PetscViewer*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[8]))(&pc,&view,&ierr);CHKERRQ(ierr);
130e54e4138SSatish Balay   return 0;
131e54e4138SSatish Balay }
132e54e4138SSatish Balay 
1338cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL pcshellgetcontext_(PC *pc,void **ctx,PetscErrorCode *ierr)
134e54e4138SSatish Balay {
1356891c3e4SJed Brown   *ierr = PCShellGetContext(*pc,ctx);
136e54e4138SSatish Balay }
137e54e4138SSatish Balay 
1388cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL pcshellsetapply_(PC *pc,void (PETSC_STDCALL *apply)(void*,Vec*,Vec*,PetscErrorCode*),PetscErrorCode *ierr)
139e54e4138SSatish Balay {
140*1b581b66SBarry Smith   PetscObjectAllocateFortranPointers(*pc,11);
1416891c3e4SJed Brown   ((PetscObject)*pc)->fortran_func_pointers[0] = (PetscVoidFunction)apply;
1422fa5cd67SKarl Rupp 
1436891c3e4SJed Brown   *ierr = PCShellSetApply(*pc,ourshellapply);
1446895c445SBarry Smith }
1456895c445SBarry Smith 
146*1b581b66SBarry Smith PETSC_EXTERN void PETSC_STDCALL pcshellsetapplysymmetricleft_(PC *pc,void (PETSC_STDCALL *apply)(void*,Vec*,Vec*,PetscErrorCode*),PetscErrorCode *ierr)
147*1b581b66SBarry Smith {
148*1b581b66SBarry Smith   PetscObjectAllocateFortranPointers(*pc,11);
149*1b581b66SBarry Smith   ((PetscObject)*pc)->fortran_func_pointers[9] = (PetscVoidFunction)apply;
150*1b581b66SBarry Smith 
151*1b581b66SBarry Smith   *ierr = PCShellSetApplySymmetricLeft(*pc,ourshellapplysymmetricleft);
152*1b581b66SBarry Smith }
153*1b581b66SBarry Smith 
154*1b581b66SBarry Smith PETSC_EXTERN void PETSC_STDCALL pcshellsetapplysymmetricright_(PC *pc,void (PETSC_STDCALL *apply)(void*,Vec*,Vec*,PetscErrorCode*),PetscErrorCode *ierr)
155*1b581b66SBarry Smith {
156*1b581b66SBarry Smith   PetscObjectAllocateFortranPointers(*pc,11);
157*1b581b66SBarry Smith   ((PetscObject)*pc)->fortran_func_pointers[10] = (PetscVoidFunction)apply;
158*1b581b66SBarry Smith 
159*1b581b66SBarry Smith   *ierr = PCShellSetApplySymmetricRight(*pc,ourshellapplysymmetricright);
160*1b581b66SBarry Smith }
161*1b581b66SBarry Smith 
162fe81eab7SBarry Smith PETSC_EXTERN void PETSC_STDCALL pcshellsetapplyctx_(PC *pc,void (PETSC_STDCALL *apply)(void*,void*,Vec*,Vec*,PetscErrorCode*),PetscErrorCode *ierr)
163fe81eab7SBarry Smith {
164*1b581b66SBarry Smith   PetscObjectAllocateFortranPointers(*pc,11);
165fe81eab7SBarry Smith   ((PetscObject)*pc)->fortran_func_pointers[0] = (PetscVoidFunction)apply;
166fe81eab7SBarry Smith 
167fe81eab7SBarry Smith   *ierr = PCShellSetApply(*pc,ourshellapplyctx);
168fe81eab7SBarry Smith }
169fe81eab7SBarry Smith 
170ccf40c83SElliott Sales de Andrade PETSC_EXTERN void PETSC_STDCALL pcshellsetapplyba_(PC *pc,void (PETSC_STDCALL *apply)(void*,PCSide*,Vec*,Vec*,Vec*,PetscErrorCode*),PetscErrorCode *ierr)
171ccf40c83SElliott Sales de Andrade {
172*1b581b66SBarry Smith   PetscObjectAllocateFortranPointers(*pc,11);
173ccf40c83SElliott Sales de Andrade   ((PetscObject)*pc)->fortran_func_pointers[1] = (PetscVoidFunction)apply;
174ccf40c83SElliott Sales de Andrade 
175ccf40c83SElliott Sales de Andrade   *ierr = PCShellSetApplyBA(*pc,ourshellapplyba);
176ccf40c83SElliott Sales de Andrade }
177ccf40c83SElliott Sales de Andrade 
1788cc058d9SJed 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)
1796895c445SBarry Smith {
180*1b581b66SBarry Smith   PetscObjectAllocateFortranPointers(*pc,11);
181ccf40c83SElliott Sales de Andrade   ((PetscObject)*pc)->fortran_func_pointers[2] = (PetscVoidFunction)apply;
1826891c3e4SJed Brown   *ierr = PCShellSetApplyRichardson(*pc,ourapplyrichardson);
1836895c445SBarry Smith }
1846895c445SBarry Smith 
1858cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL pcshellsetapplytranspose_(PC *pc,void (PETSC_STDCALL *applytranspose)(void*,Vec *,Vec *,PetscErrorCode*), PetscErrorCode *ierr)
1866895c445SBarry Smith {
187*1b581b66SBarry Smith   PetscObjectAllocateFortranPointers(*pc,11);
188ccf40c83SElliott Sales de Andrade   ((PetscObject)*pc)->fortran_func_pointers[3] = (PetscVoidFunction)applytranspose;
1892fa5cd67SKarl Rupp 
1906891c3e4SJed Brown   *ierr = PCShellSetApplyTranspose(*pc,ourshellapplytranspose);
191e54e4138SSatish Balay }
192e54e4138SSatish Balay 
193fe81eab7SBarry Smith PETSC_EXTERN void PETSC_STDCALL pcshellsetsetupctx_(PC *pc,void (PETSC_STDCALL *setup)(void*,void*,PetscErrorCode*),PetscErrorCode *ierr)
194fe81eab7SBarry Smith {
195*1b581b66SBarry Smith   PetscObjectAllocateFortranPointers(*pc,11);
19648cdcd6bSElliott Sales de Andrade   ((PetscObject)*pc)->fortran_func_pointers[4] = (PetscVoidFunction)setup;
197fe81eab7SBarry Smith 
198fe81eab7SBarry Smith   *ierr = PCShellSetSetUp(*pc,ourshellsetupctx);
199fe81eab7SBarry Smith }
200fe81eab7SBarry Smith 
2018cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL pcshellsetsetup_(PC *pc,void (PETSC_STDCALL *setup)(void*,PetscErrorCode*),PetscErrorCode *ierr)
202e54e4138SSatish Balay {
203*1b581b66SBarry Smith   PetscObjectAllocateFortranPointers(*pc,11);
204ccf40c83SElliott Sales de Andrade   ((PetscObject)*pc)->fortran_func_pointers[4] = (PetscVoidFunction)setup;
2052fa5cd67SKarl Rupp 
2066891c3e4SJed Brown   *ierr = PCShellSetSetUp(*pc,ourshellsetup);
207e54e4138SSatish Balay }
208e54e4138SSatish Balay 
2098cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL pcshellsetdestroy_(PC *pc,void (PETSC_STDCALL *setup)(void*,PetscErrorCode*),PetscErrorCode *ierr)
2107c54600cSBarry Smith {
211*1b581b66SBarry Smith   PetscObjectAllocateFortranPointers(*pc,11);
212ccf40c83SElliott Sales de Andrade   ((PetscObject)*pc)->fortran_func_pointers[5] = (PetscVoidFunction)setup;
2132fa5cd67SKarl Rupp 
2146891c3e4SJed Brown   *ierr = PCShellSetDestroy(*pc,ourshelldestroy);
2157c54600cSBarry Smith }
2167c54600cSBarry Smith 
217a425a105SElliott Sales de Andrade PETSC_EXTERN void PETSC_STDCALL pcshellsetpresolve_(PC *pc,void (PETSC_STDCALL *presolve)(void*,void*,Vec*,Vec*,PetscErrorCode*),PetscErrorCode *ierr)
218a425a105SElliott Sales de Andrade {
219*1b581b66SBarry Smith   PetscObjectAllocateFortranPointers(*pc,11);
220ccf40c83SElliott Sales de Andrade   ((PetscObject)*pc)->fortran_func_pointers[6] = (PetscVoidFunction)presolve;
221a425a105SElliott Sales de Andrade 
222a425a105SElliott Sales de Andrade   *ierr = PCShellSetPreSolve(*pc,ourshellpresolve);
223a425a105SElliott Sales de Andrade }
224a425a105SElliott Sales de Andrade 
225a425a105SElliott Sales de Andrade PETSC_EXTERN void PETSC_STDCALL pcshellsetpostsolve_(PC *pc,void (PETSC_STDCALL *postsolve)(void*,void*,Vec*,Vec*,PetscErrorCode*),PetscErrorCode *ierr)
226a425a105SElliott Sales de Andrade {
227*1b581b66SBarry Smith   PetscObjectAllocateFortranPointers(*pc,11);
228ccf40c83SElliott Sales de Andrade   ((PetscObject)*pc)->fortran_func_pointers[7] = (PetscVoidFunction)postsolve;
229a425a105SElliott Sales de Andrade 
230a425a105SElliott Sales de Andrade   *ierr = PCShellSetPostSolve(*pc,ourshellpostsolve);
231a425a105SElliott Sales de Andrade }
232a425a105SElliott Sales de Andrade 
2332f519dc9SElliott Sales de Andrade PETSC_EXTERN void PETSC_STDCALL pcshellsetview_(PC *pc,void (PETSC_STDCALL *view)(void*,PetscViewer*,PetscErrorCode*),PetscErrorCode *ierr)
2342f519dc9SElliott Sales de Andrade {
235*1b581b66SBarry Smith   PetscObjectAllocateFortranPointers(*pc,11);
2362f519dc9SElliott Sales de Andrade   ((PetscObject)*pc)->fortran_func_pointers[8] = (PetscVoidFunction)view;
2372f519dc9SElliott Sales de Andrade 
2382f519dc9SElliott Sales de Andrade   *ierr = PCShellSetView(*pc,ourshellview);
2392f519dc9SElliott Sales de Andrade }
2402f519dc9SElliott Sales de Andrade 
2418cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL pcshellsetname_(PC *pc,CHAR name PETSC_MIXED_LEN(len), PetscErrorCode *ierr PETSC_END_LEN(len))
2421d2e4005SSatish Balay {
2431d2e4005SSatish Balay   char *c;
2441d2e4005SSatish Balay   FIXCHAR(name,len,c);
2451d2e4005SSatish Balay   *ierr = PCShellSetName(*pc,c);
2461d2e4005SSatish Balay   FREECHAR(name,c);
2471d2e4005SSatish Balay }
2481d2e4005SSatish Balay 
2498cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL pcshellgetname_(PC *pc,CHAR name PETSC_MIXED_LEN(len), PetscErrorCode *ierr PETSC_END_LEN(len))
250e63f14baSBarry Smith {
251ccaf0856SBarry Smith   const char *c;
252e63f14baSBarry Smith 
253e63f14baSBarry Smith   *ierr = PCShellGetName(*pc,&c);if (*ierr) return;
254e63f14baSBarry Smith   *ierr = PetscStrncpy(name,c,len);
255e63f14baSBarry Smith }
256e63f14baSBarry Smith 
257e54e4138SSatish Balay /* -----------------------------------------------------------------*/
258e54e4138SSatish Balay 
259