xref: /petsc/src/ksp/pc/impls/shell/ftn-custom/zshellpcf.c (revision 48cdcd6b53bc91835c082adca72c212f70eee222)
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
7ccf40c83SElliott Sales de Andrade #define pcshellsetapplyba_         PCSHELLSETAPPLYBA
8e54e4138SSatish Balay #define pcshellsetapplyrichardson_ PCSHELLSETAPPLYRICHARDSON
9e54e4138SSatish Balay #define pcshellsetapplytranspose_  PCSHELLSETAPPLYTRANSPOSE
10e54e4138SSatish Balay #define pcshellsetsetup_           PCSHELLSETSETUP
117c54600cSBarry Smith #define pcshellsetdestroy_         PCSHELLSETDESTROY
12a425a105SElliott Sales de Andrade #define pcshellsetpresolve_        PCSHELLSETPRESOLVE
13a425a105SElliott Sales de Andrade #define pcshellsetpostsolve_       PCSHELLSETPOSTSOLVE
142f519dc9SElliott Sales de Andrade #define pcshellsetview_            PCSHELLSETVIEW
151d2e4005SSatish Balay #define pcshellsetname_            PCSHELLSETNAME
16e63f14baSBarry Smith #define pcshellgetname_            PCSHELLGETNAME
176895c445SBarry Smith #define pcshellsetcontext_         PCSHELLSETCONTEXT
186895c445SBarry Smith #define pcshellgetcontext_         PCSHELLGETCONTEXT
19e54e4138SSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
20e54e4138SSatish Balay #define pcshellsetapply_           pcshellsetapply
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
291d2e4005SSatish Balay #define pcshellsetname_            pcshellsetname
30e63f14baSBarry Smith #define pcshellgetname_            pcshellgetname
316895c445SBarry Smith #define pcshellsetcontext_         pcshellsetcontext
326895c445SBarry Smith #define pcshellgetcontext_         pcshellgetcontext
33e54e4138SSatish Balay #endif
34e54e4138SSatish Balay 
35e54e4138SSatish Balay /* These are not extern C because they are passed into non-extern C user level functions */
366891c3e4SJed Brown static PetscErrorCode ourshellapply(PC pc,Vec x,Vec y)
37e54e4138SSatish Balay {
38e54e4138SSatish Balay   PetscErrorCode ierr = 0;
396891c3e4SJed Brown   (*(void (PETSC_STDCALL *)(PC*,Vec*,Vec*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[0]))(&pc,&x,&y,&ierr);CHKERRQ(ierr);
40e54e4138SSatish Balay   return 0;
41e54e4138SSatish Balay }
42e54e4138SSatish Balay 
43fe81eab7SBarry Smith static PetscErrorCode ourshellapplyctx(PC pc,Vec x,Vec y)
44fe81eab7SBarry Smith {
45fe81eab7SBarry Smith   PetscErrorCode ierr = 0;
46fe81eab7SBarry Smith   void           *ctx;
47fe81eab7SBarry Smith   ierr = PCShellGetContext(pc,&ctx);CHKERRQ(ierr);
48fe81eab7SBarry Smith   (*(void (PETSC_STDCALL *)(PC*,void*,Vec*,Vec*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[0]))(&pc,ctx,&x,&y,&ierr);CHKERRQ(ierr);
49fe81eab7SBarry Smith   return 0;
50fe81eab7SBarry Smith }
51fe81eab7SBarry Smith 
52ccf40c83SElliott Sales de Andrade static PetscErrorCode ourshellapplyba(PC pc,PCSide side,Vec x,Vec y,Vec work)
53ccf40c83SElliott Sales de Andrade {
54ccf40c83SElliott Sales de Andrade   PetscErrorCode ierr = 0;
55ccf40c83SElliott 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);
56ccf40c83SElliott Sales de Andrade   return 0;
57ccf40c83SElliott Sales de Andrade }
58ccf40c83SElliott Sales de Andrade 
59ace3abfcSBarry 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)
60e54e4138SSatish Balay {
61e54e4138SSatish Balay   PetscErrorCode ierr = 0;
62ccf40c83SElliott 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);
63e54e4138SSatish Balay   return 0;
64e54e4138SSatish Balay }
65e54e4138SSatish Balay 
666891c3e4SJed Brown static PetscErrorCode ourshellapplytranspose(PC pc,Vec x,Vec y)
67e54e4138SSatish Balay {
68e54e4138SSatish Balay   PetscErrorCode ierr = 0;
69ccf40c83SElliott Sales de Andrade   (*(void (PETSC_STDCALL *)(void*,Vec*,Vec*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[3]))(&pc,&x,&y,&ierr);CHKERRQ(ierr);
70e54e4138SSatish Balay   return 0;
71e54e4138SSatish Balay }
72e54e4138SSatish Balay 
736891c3e4SJed Brown static PetscErrorCode ourshellsetup(PC pc)
74e54e4138SSatish Balay {
75e54e4138SSatish Balay   PetscErrorCode ierr = 0;
76ccf40c83SElliott Sales de Andrade   (*(void (PETSC_STDCALL *)(PC*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[4]))(&pc,&ierr);CHKERRQ(ierr);
77e54e4138SSatish Balay   return 0;
78e54e4138SSatish Balay }
79e54e4138SSatish Balay 
80fe81eab7SBarry Smith static PetscErrorCode ourshellsetupctx(PC pc)
81fe81eab7SBarry Smith {
82fe81eab7SBarry Smith   PetscErrorCode ierr = 0;
83fe81eab7SBarry Smith   void           *ctx;
84fe81eab7SBarry Smith   ierr = PCShellGetContext(pc,&ctx);CHKERRQ(ierr);
85*48cdcd6bSElliott Sales de Andrade   (*(void (PETSC_STDCALL *)(PC*,void*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[4]))(&pc,ctx,&ierr);CHKERRQ(ierr);
86fe81eab7SBarry Smith   return 0;
87fe81eab7SBarry Smith }
88fe81eab7SBarry Smith 
896891c3e4SJed Brown static PetscErrorCode ourshelldestroy(PC pc)
907c54600cSBarry Smith {
917c54600cSBarry Smith   PetscErrorCode ierr = 0;
92ccf40c83SElliott Sales de Andrade   (*(void (PETSC_STDCALL *)(void*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[5]))(&pc,&ierr);CHKERRQ(ierr);
937c54600cSBarry Smith   return 0;
947c54600cSBarry Smith }
957c54600cSBarry Smith 
96a425a105SElliott Sales de Andrade static PetscErrorCode ourshellpresolve(PC pc,KSP ksp,Vec x,Vec y)
97a425a105SElliott Sales de Andrade {
98a425a105SElliott Sales de Andrade   PetscErrorCode ierr = 0;
99ccf40c83SElliott Sales de Andrade   (*(void (PETSC_STDCALL *)(PC*,KSP*,Vec*,Vec*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[6]))(&pc,&ksp,&x,&y,&ierr);CHKERRQ(ierr);
100a425a105SElliott Sales de Andrade   return 0;
101a425a105SElliott Sales de Andrade }
102a425a105SElliott Sales de Andrade 
103a425a105SElliott Sales de Andrade static PetscErrorCode ourshellpostsolve(PC pc,KSP ksp,Vec x,Vec y)
104a425a105SElliott Sales de Andrade {
105a425a105SElliott Sales de Andrade   PetscErrorCode ierr = 0;
106ccf40c83SElliott Sales de Andrade   (*(void (PETSC_STDCALL *)(PC*,KSP*,Vec*,Vec*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[7]))(&pc,&ksp,&x,&y,&ierr);CHKERRQ(ierr);
107a425a105SElliott Sales de Andrade   return 0;
108a425a105SElliott Sales de Andrade }
109a425a105SElliott Sales de Andrade 
1102f519dc9SElliott Sales de Andrade static PetscErrorCode ourshellview(PC pc,PetscViewer view)
1112f519dc9SElliott Sales de Andrade {
1122f519dc9SElliott Sales de Andrade   PetscErrorCode ierr = 0;
1132f519dc9SElliott Sales de Andrade   (*(void (PETSC_STDCALL *)(PC*,PetscViewer*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[8]))(&pc,&view,&ierr);CHKERRQ(ierr);
114e54e4138SSatish Balay   return 0;
115e54e4138SSatish Balay }
116e54e4138SSatish Balay 
1178cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL pcshellgetcontext_(PC *pc,void **ctx,PetscErrorCode *ierr)
118e54e4138SSatish Balay {
1196891c3e4SJed Brown   *ierr = PCShellGetContext(*pc,ctx);
120e54e4138SSatish Balay }
121e54e4138SSatish Balay 
1228cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL pcshellsetapply_(PC *pc,void (PETSC_STDCALL *apply)(void*,Vec*,Vec*,PetscErrorCode*),PetscErrorCode *ierr)
123e54e4138SSatish Balay {
1242f519dc9SElliott Sales de Andrade   PetscObjectAllocateFortranPointers(*pc,9);
1256891c3e4SJed Brown   ((PetscObject)*pc)->fortran_func_pointers[0] = (PetscVoidFunction)apply;
1262fa5cd67SKarl Rupp 
1276891c3e4SJed Brown   *ierr = PCShellSetApply(*pc,ourshellapply);
1286895c445SBarry Smith }
1296895c445SBarry Smith 
130fe81eab7SBarry Smith PETSC_EXTERN void PETSC_STDCALL pcshellsetapplyctx_(PC *pc,void (PETSC_STDCALL *apply)(void*,void*,Vec*,Vec*,PetscErrorCode*),PetscErrorCode *ierr)
131fe81eab7SBarry Smith {
132*48cdcd6bSElliott Sales de Andrade   PetscObjectAllocateFortranPointers(*pc,9);
133fe81eab7SBarry Smith   ((PetscObject)*pc)->fortran_func_pointers[0] = (PetscVoidFunction)apply;
134fe81eab7SBarry Smith 
135fe81eab7SBarry Smith   *ierr = PCShellSetApply(*pc,ourshellapplyctx);
136fe81eab7SBarry Smith }
137fe81eab7SBarry Smith 
138ccf40c83SElliott Sales de Andrade PETSC_EXTERN void PETSC_STDCALL pcshellsetapplyba_(PC *pc,void (PETSC_STDCALL *apply)(void*,PCSide*,Vec*,Vec*,Vec*,PetscErrorCode*),PetscErrorCode *ierr)
139ccf40c83SElliott Sales de Andrade {
1402f519dc9SElliott Sales de Andrade   PetscObjectAllocateFortranPointers(*pc,9);
141ccf40c83SElliott Sales de Andrade   ((PetscObject)*pc)->fortran_func_pointers[1] = (PetscVoidFunction)apply;
142ccf40c83SElliott Sales de Andrade 
143ccf40c83SElliott Sales de Andrade   *ierr = PCShellSetApplyBA(*pc,ourshellapplyba);
144ccf40c83SElliott Sales de Andrade }
145ccf40c83SElliott Sales de Andrade 
1468cc058d9SJed 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)
1476895c445SBarry Smith {
1482f519dc9SElliott Sales de Andrade   PetscObjectAllocateFortranPointers(*pc,9);
149ccf40c83SElliott Sales de Andrade   ((PetscObject)*pc)->fortran_func_pointers[2] = (PetscVoidFunction)apply;
1506891c3e4SJed Brown   *ierr = PCShellSetApplyRichardson(*pc,ourapplyrichardson);
1516895c445SBarry Smith }
1526895c445SBarry Smith 
1538cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL pcshellsetapplytranspose_(PC *pc,void (PETSC_STDCALL *applytranspose)(void*,Vec *,Vec *,PetscErrorCode*), PetscErrorCode *ierr)
1546895c445SBarry Smith {
1552f519dc9SElliott Sales de Andrade   PetscObjectAllocateFortranPointers(*pc,9);
156ccf40c83SElliott Sales de Andrade   ((PetscObject)*pc)->fortran_func_pointers[3] = (PetscVoidFunction)applytranspose;
1572fa5cd67SKarl Rupp 
1586891c3e4SJed Brown   *ierr = PCShellSetApplyTranspose(*pc,ourshellapplytranspose);
159e54e4138SSatish Balay }
160e54e4138SSatish Balay 
161fe81eab7SBarry Smith PETSC_EXTERN void PETSC_STDCALL pcshellsetsetupctx_(PC *pc,void (PETSC_STDCALL *setup)(void*,void*,PetscErrorCode*),PetscErrorCode *ierr)
162fe81eab7SBarry Smith {
163*48cdcd6bSElliott Sales de Andrade   PetscObjectAllocateFortranPointers(*pc,9);
164*48cdcd6bSElliott Sales de Andrade   ((PetscObject)*pc)->fortran_func_pointers[4] = (PetscVoidFunction)setup;
165fe81eab7SBarry Smith 
166fe81eab7SBarry Smith   *ierr = PCShellSetSetUp(*pc,ourshellsetupctx);
167fe81eab7SBarry Smith }
168fe81eab7SBarry Smith 
1698cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL pcshellsetsetup_(PC *pc,void (PETSC_STDCALL *setup)(void*,PetscErrorCode*),PetscErrorCode *ierr)
170e54e4138SSatish Balay {
1712f519dc9SElliott Sales de Andrade   PetscObjectAllocateFortranPointers(*pc,9);
172ccf40c83SElliott Sales de Andrade   ((PetscObject)*pc)->fortran_func_pointers[4] = (PetscVoidFunction)setup;
1732fa5cd67SKarl Rupp 
1746891c3e4SJed Brown   *ierr = PCShellSetSetUp(*pc,ourshellsetup);
175e54e4138SSatish Balay }
176e54e4138SSatish Balay 
1778cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL pcshellsetdestroy_(PC *pc,void (PETSC_STDCALL *setup)(void*,PetscErrorCode*),PetscErrorCode *ierr)
1787c54600cSBarry Smith {
1792f519dc9SElliott Sales de Andrade   PetscObjectAllocateFortranPointers(*pc,9);
180ccf40c83SElliott Sales de Andrade   ((PetscObject)*pc)->fortran_func_pointers[5] = (PetscVoidFunction)setup;
1812fa5cd67SKarl Rupp 
1826891c3e4SJed Brown   *ierr = PCShellSetDestroy(*pc,ourshelldestroy);
1837c54600cSBarry Smith }
1847c54600cSBarry Smith 
185a425a105SElliott Sales de Andrade PETSC_EXTERN void PETSC_STDCALL pcshellsetpresolve_(PC *pc,void (PETSC_STDCALL *presolve)(void*,void*,Vec*,Vec*,PetscErrorCode*),PetscErrorCode *ierr)
186a425a105SElliott Sales de Andrade {
1872f519dc9SElliott Sales de Andrade   PetscObjectAllocateFortranPointers(*pc,9);
188ccf40c83SElliott Sales de Andrade   ((PetscObject)*pc)->fortran_func_pointers[6] = (PetscVoidFunction)presolve;
189a425a105SElliott Sales de Andrade 
190a425a105SElliott Sales de Andrade   *ierr = PCShellSetPreSolve(*pc,ourshellpresolve);
191a425a105SElliott Sales de Andrade }
192a425a105SElliott Sales de Andrade 
193a425a105SElliott Sales de Andrade PETSC_EXTERN void PETSC_STDCALL pcshellsetpostsolve_(PC *pc,void (PETSC_STDCALL *postsolve)(void*,void*,Vec*,Vec*,PetscErrorCode*),PetscErrorCode *ierr)
194a425a105SElliott Sales de Andrade {
1952f519dc9SElliott Sales de Andrade   PetscObjectAllocateFortranPointers(*pc,9);
196ccf40c83SElliott Sales de Andrade   ((PetscObject)*pc)->fortran_func_pointers[7] = (PetscVoidFunction)postsolve;
197a425a105SElliott Sales de Andrade 
198a425a105SElliott Sales de Andrade   *ierr = PCShellSetPostSolve(*pc,ourshellpostsolve);
199a425a105SElliott Sales de Andrade }
200a425a105SElliott Sales de Andrade 
2012f519dc9SElliott Sales de Andrade PETSC_EXTERN void PETSC_STDCALL pcshellsetview_(PC *pc,void (PETSC_STDCALL *view)(void*,PetscViewer*,PetscErrorCode*),PetscErrorCode *ierr)
2022f519dc9SElliott Sales de Andrade {
2032f519dc9SElliott Sales de Andrade   PetscObjectAllocateFortranPointers(*pc,9);
2042f519dc9SElliott Sales de Andrade   ((PetscObject)*pc)->fortran_func_pointers[8] = (PetscVoidFunction)view;
2052f519dc9SElliott Sales de Andrade 
2062f519dc9SElliott Sales de Andrade   *ierr = PCShellSetView(*pc,ourshellview);
2072f519dc9SElliott Sales de Andrade }
2082f519dc9SElliott Sales de Andrade 
2098cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL pcshellsetname_(PC *pc,CHAR name PETSC_MIXED_LEN(len), PetscErrorCode *ierr PETSC_END_LEN(len))
2101d2e4005SSatish Balay {
2111d2e4005SSatish Balay   char *c;
2121d2e4005SSatish Balay   FIXCHAR(name,len,c);
2131d2e4005SSatish Balay   *ierr = PCShellSetName(*pc,c);
2141d2e4005SSatish Balay   FREECHAR(name,c);
2151d2e4005SSatish Balay }
2161d2e4005SSatish Balay 
2178cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL pcshellgetname_(PC *pc,CHAR name PETSC_MIXED_LEN(len), PetscErrorCode *ierr PETSC_END_LEN(len))
218e63f14baSBarry Smith {
219ccaf0856SBarry Smith   const char *c;
220e63f14baSBarry Smith 
221e63f14baSBarry Smith   *ierr = PCShellGetName(*pc,&c);if (*ierr) return;
222e63f14baSBarry Smith   *ierr = PetscStrncpy(name,c,len);
223e63f14baSBarry Smith }
224e63f14baSBarry Smith 
225e54e4138SSatish Balay /* -----------------------------------------------------------------*/
226e54e4138SSatish Balay 
227