xref: /petsc/src/ksp/pc/impls/shell/ftn-custom/zshellpcf.c (revision 2f519dc99eeb00f7326b786080f2f8b105ff3d29)
1b45d2f2cSJed Brown #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
14*2f519dc9SElliott 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
28*2f519dc9SElliott 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 
43ccf40c83SElliott Sales de Andrade static PetscErrorCode ourshellapplyba(PC pc,PCSide side,Vec x,Vec y,Vec work)
44ccf40c83SElliott Sales de Andrade {
45ccf40c83SElliott Sales de Andrade   PetscErrorCode ierr = 0;
46ccf40c83SElliott 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);
47ccf40c83SElliott Sales de Andrade   return 0;
48ccf40c83SElliott Sales de Andrade }
49ccf40c83SElliott Sales de Andrade 
50ace3abfcSBarry 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)
51e54e4138SSatish Balay {
52e54e4138SSatish Balay   PetscErrorCode ierr = 0;
53ccf40c83SElliott 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);
54e54e4138SSatish Balay   return 0;
55e54e4138SSatish Balay }
56e54e4138SSatish Balay 
576891c3e4SJed Brown static PetscErrorCode ourshellapplytranspose(PC pc,Vec x,Vec y)
58e54e4138SSatish Balay {
59e54e4138SSatish Balay   PetscErrorCode ierr = 0;
60ccf40c83SElliott Sales de Andrade   (*(void (PETSC_STDCALL *)(void*,Vec*,Vec*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[3]))(&pc,&x,&y,&ierr);CHKERRQ(ierr);
61e54e4138SSatish Balay   return 0;
62e54e4138SSatish Balay }
63e54e4138SSatish Balay 
646891c3e4SJed Brown static PetscErrorCode ourshellsetup(PC pc)
65e54e4138SSatish Balay {
66e54e4138SSatish Balay   PetscErrorCode ierr = 0;
67ccf40c83SElliott Sales de Andrade   (*(void (PETSC_STDCALL *)(PC*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[4]))(&pc,&ierr);CHKERRQ(ierr);
68e54e4138SSatish Balay   return 0;
69e54e4138SSatish Balay }
70e54e4138SSatish Balay 
716891c3e4SJed Brown static PetscErrorCode ourshelldestroy(PC pc)
727c54600cSBarry Smith {
737c54600cSBarry Smith   PetscErrorCode ierr = 0;
74ccf40c83SElliott Sales de Andrade   (*(void (PETSC_STDCALL *)(void*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[5]))(&pc,&ierr);CHKERRQ(ierr);
757c54600cSBarry Smith   return 0;
767c54600cSBarry Smith }
777c54600cSBarry Smith 
78a425a105SElliott Sales de Andrade static PetscErrorCode ourshellpresolve(PC pc,KSP ksp,Vec x,Vec y)
79a425a105SElliott Sales de Andrade {
80a425a105SElliott Sales de Andrade   PetscErrorCode ierr = 0;
81ccf40c83SElliott Sales de Andrade   (*(void (PETSC_STDCALL *)(PC*,KSP*,Vec*,Vec*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[6]))(&pc,&ksp,&x,&y,&ierr);CHKERRQ(ierr);
82a425a105SElliott Sales de Andrade   return 0;
83a425a105SElliott Sales de Andrade }
84a425a105SElliott Sales de Andrade 
85a425a105SElliott Sales de Andrade static PetscErrorCode ourshellpostsolve(PC pc,KSP ksp,Vec x,Vec y)
86a425a105SElliott Sales de Andrade {
87a425a105SElliott Sales de Andrade   PetscErrorCode ierr = 0;
88ccf40c83SElliott Sales de Andrade   (*(void (PETSC_STDCALL *)(PC*,KSP*,Vec*,Vec*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[7]))(&pc,&ksp,&x,&y,&ierr);CHKERRQ(ierr);
89a425a105SElliott Sales de Andrade   return 0;
90a425a105SElliott Sales de Andrade }
91a425a105SElliott Sales de Andrade 
92*2f519dc9SElliott Sales de Andrade static PetscErrorCode ourshellview(PC pc,PetscViewer view)
93*2f519dc9SElliott Sales de Andrade {
94*2f519dc9SElliott Sales de Andrade   PetscErrorCode ierr = 0;
95*2f519dc9SElliott Sales de Andrade   (*(void (PETSC_STDCALL *)(PC*,PetscViewer*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[8]))(&pc,&view,&ierr);CHKERRQ(ierr);
96*2f519dc9SElliott Sales de Andrade   return 0;
97*2f519dc9SElliott Sales de Andrade }
98*2f519dc9SElliott Sales de Andrade 
998cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL pcshellgetcontext_(PC *pc,void **ctx,PetscErrorCode *ierr)
100e54e4138SSatish Balay {
1016891c3e4SJed Brown   *ierr = PCShellGetContext(*pc,ctx);
102e54e4138SSatish Balay }
103e54e4138SSatish Balay 
1048cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL pcshellsetapply_(PC *pc,void (PETSC_STDCALL *apply)(void*,Vec*,Vec*,PetscErrorCode*),PetscErrorCode *ierr)
105e54e4138SSatish Balay {
106*2f519dc9SElliott Sales de Andrade   PetscObjectAllocateFortranPointers(*pc,9);
1076891c3e4SJed Brown   ((PetscObject)*pc)->fortran_func_pointers[0] = (PetscVoidFunction)apply;
1082fa5cd67SKarl Rupp 
1096891c3e4SJed Brown   *ierr = PCShellSetApply(*pc,ourshellapply);
1106895c445SBarry Smith }
1116895c445SBarry Smith 
112ccf40c83SElliott Sales de Andrade PETSC_EXTERN void PETSC_STDCALL pcshellsetapplyba_(PC *pc,void (PETSC_STDCALL *apply)(void*,PCSide*,Vec*,Vec*,Vec*,PetscErrorCode*),PetscErrorCode *ierr)
113ccf40c83SElliott Sales de Andrade {
114*2f519dc9SElliott Sales de Andrade   PetscObjectAllocateFortranPointers(*pc,9);
115ccf40c83SElliott Sales de Andrade   ((PetscObject)*pc)->fortran_func_pointers[1] = (PetscVoidFunction)apply;
116ccf40c83SElliott Sales de Andrade 
117ccf40c83SElliott Sales de Andrade   *ierr = PCShellSetApplyBA(*pc,ourshellapplyba);
118ccf40c83SElliott Sales de Andrade }
119ccf40c83SElliott Sales de Andrade 
1208cc058d9SJed 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)
1216895c445SBarry Smith {
122*2f519dc9SElliott Sales de Andrade   PetscObjectAllocateFortranPointers(*pc,9);
123ccf40c83SElliott Sales de Andrade   ((PetscObject)*pc)->fortran_func_pointers[2] = (PetscVoidFunction)apply;
1246891c3e4SJed Brown   *ierr = PCShellSetApplyRichardson(*pc,ourapplyrichardson);
1256895c445SBarry Smith }
1266895c445SBarry Smith 
1278cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL pcshellsetapplytranspose_(PC *pc,void (PETSC_STDCALL *applytranspose)(void*,Vec *,Vec *,PetscErrorCode*), PetscErrorCode *ierr)
1286895c445SBarry Smith {
129*2f519dc9SElliott Sales de Andrade   PetscObjectAllocateFortranPointers(*pc,9);
130ccf40c83SElliott Sales de Andrade   ((PetscObject)*pc)->fortran_func_pointers[3] = (PetscVoidFunction)applytranspose;
1312fa5cd67SKarl Rupp 
1326891c3e4SJed Brown   *ierr = PCShellSetApplyTranspose(*pc,ourshellapplytranspose);
133e54e4138SSatish Balay }
134e54e4138SSatish Balay 
1358cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL pcshellsetsetup_(PC *pc,void (PETSC_STDCALL *setup)(void*,PetscErrorCode*),PetscErrorCode *ierr)
136e54e4138SSatish Balay {
137*2f519dc9SElliott Sales de Andrade   PetscObjectAllocateFortranPointers(*pc,9);
138ccf40c83SElliott Sales de Andrade   ((PetscObject)*pc)->fortran_func_pointers[4] = (PetscVoidFunction)setup;
1392fa5cd67SKarl Rupp 
1406891c3e4SJed Brown   *ierr = PCShellSetSetUp(*pc,ourshellsetup);
141e54e4138SSatish Balay }
142e54e4138SSatish Balay 
1438cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL pcshellsetdestroy_(PC *pc,void (PETSC_STDCALL *setup)(void*,PetscErrorCode*),PetscErrorCode *ierr)
1447c54600cSBarry Smith {
145*2f519dc9SElliott Sales de Andrade   PetscObjectAllocateFortranPointers(*pc,9);
146ccf40c83SElliott Sales de Andrade   ((PetscObject)*pc)->fortran_func_pointers[5] = (PetscVoidFunction)setup;
1472fa5cd67SKarl Rupp 
1486891c3e4SJed Brown   *ierr = PCShellSetDestroy(*pc,ourshelldestroy);
1497c54600cSBarry Smith }
1507c54600cSBarry Smith 
151a425a105SElliott Sales de Andrade PETSC_EXTERN void PETSC_STDCALL pcshellsetpresolve_(PC *pc,void (PETSC_STDCALL *presolve)(void*,void*,Vec*,Vec*,PetscErrorCode*),PetscErrorCode *ierr)
152a425a105SElliott Sales de Andrade {
153*2f519dc9SElliott Sales de Andrade   PetscObjectAllocateFortranPointers(*pc,9);
154ccf40c83SElliott Sales de Andrade   ((PetscObject)*pc)->fortran_func_pointers[6] = (PetscVoidFunction)presolve;
155a425a105SElliott Sales de Andrade 
156a425a105SElliott Sales de Andrade   *ierr = PCShellSetPreSolve(*pc,ourshellpresolve);
157a425a105SElliott Sales de Andrade }
158a425a105SElliott Sales de Andrade 
159a425a105SElliott Sales de Andrade PETSC_EXTERN void PETSC_STDCALL pcshellsetpostsolve_(PC *pc,void (PETSC_STDCALL *postsolve)(void*,void*,Vec*,Vec*,PetscErrorCode*),PetscErrorCode *ierr)
160a425a105SElliott Sales de Andrade {
161*2f519dc9SElliott Sales de Andrade   PetscObjectAllocateFortranPointers(*pc,9);
162ccf40c83SElliott Sales de Andrade   ((PetscObject)*pc)->fortran_func_pointers[7] = (PetscVoidFunction)postsolve;
163a425a105SElliott Sales de Andrade 
164a425a105SElliott Sales de Andrade   *ierr = PCShellSetPostSolve(*pc,ourshellpostsolve);
165a425a105SElliott Sales de Andrade }
166a425a105SElliott Sales de Andrade 
167*2f519dc9SElliott Sales de Andrade PETSC_EXTERN void PETSC_STDCALL pcshellsetview_(PC *pc,void (PETSC_STDCALL *view)(void*,PetscViewer*,PetscErrorCode*),PetscErrorCode *ierr)
168*2f519dc9SElliott Sales de Andrade {
169*2f519dc9SElliott Sales de Andrade   PetscObjectAllocateFortranPointers(*pc,9);
170*2f519dc9SElliott Sales de Andrade   ((PetscObject)*pc)->fortran_func_pointers[8] = (PetscVoidFunction)view;
171*2f519dc9SElliott Sales de Andrade 
172*2f519dc9SElliott Sales de Andrade   *ierr = PCShellSetView(*pc,ourshellview);
173*2f519dc9SElliott Sales de Andrade }
174*2f519dc9SElliott Sales de Andrade 
1758cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL pcshellsetname_(PC *pc,CHAR name PETSC_MIXED_LEN(len), PetscErrorCode *ierr PETSC_END_LEN(len))
1761d2e4005SSatish Balay {
1771d2e4005SSatish Balay   char *c;
1781d2e4005SSatish Balay   FIXCHAR(name,len,c);
1791d2e4005SSatish Balay   *ierr = PCShellSetName(*pc,c);
1801d2e4005SSatish Balay   FREECHAR(name,c);
1811d2e4005SSatish Balay }
1821d2e4005SSatish Balay 
1838cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL pcshellgetname_(PC *pc,CHAR name PETSC_MIXED_LEN(len), PetscErrorCode *ierr PETSC_END_LEN(len))
184e63f14baSBarry Smith {
185ccaf0856SBarry Smith   const char *c;
186e63f14baSBarry Smith 
187e63f14baSBarry Smith   *ierr = PCShellGetName(*pc,&c);if (*ierr) return;
188e63f14baSBarry Smith   *ierr = PetscStrncpy(name,c,len);
189e63f14baSBarry Smith }
190e63f14baSBarry Smith 
191e54e4138SSatish Balay /* -----------------------------------------------------------------*/
192e54e4138SSatish Balay 
193