xref: /petsc/src/ksp/pc/impls/shell/ftn-custom/zshellpcf.c (revision fe81eab70d2f9a1cde3bf293206813218998c640)
1b45d2f2cSJed Brown #include <petsc-private/fortranimpl.h>
2c6db04a5SJed Brown #include <petscpc.h>
3e54e4138SSatish Balay 
4e54e4138SSatish Balay #if defined(PETSC_HAVE_FORTRAN_CAPS)
5e54e4138SSatish Balay #define pcshellsetapply_           PCSHELLSETAPPLY
6e54e4138SSatish Balay #define pcshellsetapplyrichardson_ PCSHELLSETAPPLYRICHARDSON
7e54e4138SSatish Balay #define pcshellsetapplytranspose_  PCSHELLSETAPPLYTRANSPOSE
8e54e4138SSatish Balay #define pcshellsetsetup_           PCSHELLSETSETUP
97c54600cSBarry Smith #define pcshellsetdestroy_         PCSHELLSETDESTROY
101d2e4005SSatish Balay #define pcshellsetname_            PCSHELLSETNAME
11e63f14baSBarry Smith #define pcshellgetname_            PCSHELLGETNAME
126895c445SBarry Smith #define pcshellsetcontext_         PCSHELLSETCONTEXT
136895c445SBarry Smith #define pcshellgetcontext_         PCSHELLGETCONTEXT
14e54e4138SSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
15e54e4138SSatish Balay #define pcshellsetapply_           pcshellsetapply
16e54e4138SSatish Balay #define pcshellsetapplyrichardson_ pcshellsetapplyrichardson
17e54e4138SSatish Balay #define pcshellsetapplytranspose_  pcshellsetapplytranspose
18e54e4138SSatish Balay #define pcshellsetsetup_           pcshellsetsetup
197c54600cSBarry Smith #define pcshellsetdestroy_         pcshellsetdestroy
201d2e4005SSatish Balay #define pcshellsetname_            pcshellsetname
21e63f14baSBarry Smith #define pcshellgetname_            pcshellgetname
226895c445SBarry Smith #define pcshellsetcontext_         pcshellsetcontext
236895c445SBarry Smith #define pcshellgetcontext_         pcshellgetcontext
24e54e4138SSatish Balay #endif
25e54e4138SSatish Balay 
26e54e4138SSatish Balay /* These are not extern C because they are passed into non-extern C user level functions */
276891c3e4SJed Brown static PetscErrorCode ourshellapply(PC pc,Vec x,Vec y)
28e54e4138SSatish Balay {
29e54e4138SSatish Balay   PetscErrorCode ierr = 0;
306891c3e4SJed Brown   (*(void (PETSC_STDCALL *)(PC*,Vec*,Vec*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[0]))(&pc,&x,&y,&ierr);CHKERRQ(ierr);
31e54e4138SSatish Balay   return 0;
32e54e4138SSatish Balay }
33e54e4138SSatish Balay 
34*fe81eab7SBarry Smith static PetscErrorCode ourshellapplyctx(PC pc,Vec x,Vec y)
35*fe81eab7SBarry Smith {
36*fe81eab7SBarry Smith   PetscErrorCode ierr = 0;
37*fe81eab7SBarry Smith   void           *ctx;
38*fe81eab7SBarry Smith   ierr = PCShellGetContext(pc,&ctx);CHKERRQ(ierr);
39*fe81eab7SBarry Smith   (*(void (PETSC_STDCALL *)(PC*,void*,Vec*,Vec*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[0]))(&pc,ctx,&x,&y,&ierr);CHKERRQ(ierr);
40*fe81eab7SBarry Smith   return 0;
41*fe81eab7SBarry Smith }
42*fe81eab7SBarry Smith 
43ace3abfcSBarry 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)
44e54e4138SSatish Balay {
45e54e4138SSatish Balay   PetscErrorCode ierr = 0;
46ace3abfcSBarry Smith   (*(void (PETSC_STDCALL *)(PC*,Vec*,Vec*,Vec*,PetscReal*,PetscReal*,PetscReal*,PetscInt*,PetscBool *,PetscInt*,PCRichardsonConvergedReason*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[1]))(&pc,&x,&y,&w,&rtol,&abstol,&dtol,&m,&guesszero,outits,reason,&ierr);CHKERRQ(ierr);
47e54e4138SSatish Balay   return 0;
48e54e4138SSatish Balay }
49e54e4138SSatish Balay 
506891c3e4SJed Brown static PetscErrorCode ourshellapplytranspose(PC pc,Vec x,Vec y)
51e54e4138SSatish Balay {
52e54e4138SSatish Balay   PetscErrorCode ierr = 0;
536891c3e4SJed Brown   (*(void (PETSC_STDCALL *)(void*,Vec*,Vec*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[2]))(&pc,&x,&y,&ierr);CHKERRQ(ierr);
54e54e4138SSatish Balay   return 0;
55e54e4138SSatish Balay }
56e54e4138SSatish Balay 
576891c3e4SJed Brown static PetscErrorCode ourshellsetup(PC pc)
58e54e4138SSatish Balay {
59e54e4138SSatish Balay   PetscErrorCode ierr = 0;
606891c3e4SJed Brown   (*(void (PETSC_STDCALL *)(PC*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[3]))(&pc,&ierr);CHKERRQ(ierr);
61e54e4138SSatish Balay   return 0;
62e54e4138SSatish Balay }
63e54e4138SSatish Balay 
64*fe81eab7SBarry Smith static PetscErrorCode ourshellsetupctx(PC pc)
65*fe81eab7SBarry Smith {
66*fe81eab7SBarry Smith   PetscErrorCode ierr = 0;
67*fe81eab7SBarry Smith   void           *ctx;
68*fe81eab7SBarry Smith   ierr = PCShellGetContext(pc,&ctx);CHKERRQ(ierr);
69*fe81eab7SBarry Smith   (*(void (PETSC_STDCALL *)(PC*,void*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[3]))(&pc,ctx,&ierr);CHKERRQ(ierr);
70*fe81eab7SBarry Smith   return 0;
71*fe81eab7SBarry Smith }
72*fe81eab7SBarry Smith 
736891c3e4SJed Brown static PetscErrorCode ourshelldestroy(PC pc)
747c54600cSBarry Smith {
757c54600cSBarry Smith   PetscErrorCode ierr = 0;
766891c3e4SJed Brown   (*(void (PETSC_STDCALL *)(void*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[4]))(&pc,&ierr);CHKERRQ(ierr);
777c54600cSBarry Smith   return 0;
787c54600cSBarry Smith }
797c54600cSBarry Smith 
808cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL pcshellgetcontext_(PC *pc,void **ctx,PetscErrorCode *ierr)
81e54e4138SSatish Balay {
826891c3e4SJed Brown   *ierr = PCShellGetContext(*pc,ctx);
83e54e4138SSatish Balay }
84e54e4138SSatish Balay 
858cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL pcshellsetapply_(PC *pc,void (PETSC_STDCALL *apply)(void*,Vec*,Vec*,PetscErrorCode*),PetscErrorCode *ierr)
86e54e4138SSatish Balay {
876891c3e4SJed Brown   PetscObjectAllocateFortranPointers(*pc,5);
886891c3e4SJed Brown   ((PetscObject)*pc)->fortran_func_pointers[0] = (PetscVoidFunction)apply;
892fa5cd67SKarl Rupp 
906891c3e4SJed Brown   *ierr = PCShellSetApply(*pc,ourshellapply);
916895c445SBarry Smith }
926895c445SBarry Smith 
93*fe81eab7SBarry Smith PETSC_EXTERN void PETSC_STDCALL pcshellsetapplyctx_(PC *pc,void (PETSC_STDCALL *apply)(void*,void*,Vec*,Vec*,PetscErrorCode*),PetscErrorCode *ierr)
94*fe81eab7SBarry Smith {
95*fe81eab7SBarry Smith   PetscObjectAllocateFortranPointers(*pc,5);
96*fe81eab7SBarry Smith   ((PetscObject)*pc)->fortran_func_pointers[0] = (PetscVoidFunction)apply;
97*fe81eab7SBarry Smith 
98*fe81eab7SBarry Smith   *ierr = PCShellSetApply(*pc,ourshellapplyctx);
99*fe81eab7SBarry Smith }
100*fe81eab7SBarry Smith 
1018cc058d9SJed 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)
1026895c445SBarry Smith {
1036891c3e4SJed Brown   PetscObjectAllocateFortranPointers(*pc,5);
1046891c3e4SJed Brown   ((PetscObject)*pc)->fortran_func_pointers[1] = (PetscVoidFunction)apply;
1056891c3e4SJed Brown   *ierr = PCShellSetApplyRichardson(*pc,ourapplyrichardson);
1066895c445SBarry Smith }
1076895c445SBarry Smith 
1088cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL pcshellsetapplytranspose_(PC *pc,void (PETSC_STDCALL *applytranspose)(void*,Vec *,Vec *,PetscErrorCode*), PetscErrorCode *ierr)
1096895c445SBarry Smith {
1106891c3e4SJed Brown   PetscObjectAllocateFortranPointers(*pc,5);
1116891c3e4SJed Brown   ((PetscObject)*pc)->fortran_func_pointers[2] = (PetscVoidFunction)applytranspose;
1122fa5cd67SKarl Rupp 
1136891c3e4SJed Brown   *ierr = PCShellSetApplyTranspose(*pc,ourshellapplytranspose);
114e54e4138SSatish Balay }
115e54e4138SSatish Balay 
116*fe81eab7SBarry Smith PETSC_EXTERN void PETSC_STDCALL pcshellsetsetupctx_(PC *pc,void (PETSC_STDCALL *setup)(void*,void*,PetscErrorCode*),PetscErrorCode *ierr)
117*fe81eab7SBarry Smith {
118*fe81eab7SBarry Smith   PetscObjectAllocateFortranPointers(*pc,5);
119*fe81eab7SBarry Smith   ((PetscObject)*pc)->fortran_func_pointers[3] = (PetscVoidFunction)setup;
120*fe81eab7SBarry Smith 
121*fe81eab7SBarry Smith   *ierr = PCShellSetSetUp(*pc,ourshellsetupctx);
122*fe81eab7SBarry Smith }
123*fe81eab7SBarry Smith 
1248cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL pcshellsetsetup_(PC *pc,void (PETSC_STDCALL *setup)(void*,PetscErrorCode*),PetscErrorCode *ierr)
125e54e4138SSatish Balay {
1266891c3e4SJed Brown   PetscObjectAllocateFortranPointers(*pc,5);
1276891c3e4SJed Brown   ((PetscObject)*pc)->fortran_func_pointers[3] = (PetscVoidFunction)setup;
1282fa5cd67SKarl Rupp 
1296891c3e4SJed Brown   *ierr = PCShellSetSetUp(*pc,ourshellsetup);
130e54e4138SSatish Balay }
131e54e4138SSatish Balay 
1328cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL pcshellsetdestroy_(PC *pc,void (PETSC_STDCALL *setup)(void*,PetscErrorCode*),PetscErrorCode *ierr)
1337c54600cSBarry Smith {
134b2e6f011SJed Brown   PetscObjectAllocateFortranPointers(*pc,5);
1356891c3e4SJed Brown   ((PetscObject)*pc)->fortran_func_pointers[4] = (PetscVoidFunction)setup;
1362fa5cd67SKarl Rupp 
1376891c3e4SJed Brown   *ierr = PCShellSetDestroy(*pc,ourshelldestroy);
1387c54600cSBarry Smith }
1397c54600cSBarry Smith 
1408cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL pcshellsetname_(PC *pc,CHAR name PETSC_MIXED_LEN(len), PetscErrorCode *ierr PETSC_END_LEN(len))
1411d2e4005SSatish Balay {
1421d2e4005SSatish Balay   char *c;
1431d2e4005SSatish Balay   FIXCHAR(name,len,c);
1441d2e4005SSatish Balay   *ierr = PCShellSetName(*pc,c);
1451d2e4005SSatish Balay   FREECHAR(name,c);
1461d2e4005SSatish Balay }
1471d2e4005SSatish Balay 
1488cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL pcshellgetname_(PC *pc,CHAR name PETSC_MIXED_LEN(len), PetscErrorCode *ierr PETSC_END_LEN(len))
149e63f14baSBarry Smith {
150ccaf0856SBarry Smith   const char *c;
151e63f14baSBarry Smith 
152e63f14baSBarry Smith   *ierr = PCShellGetName(*pc,&c);if (*ierr) return;
153e63f14baSBarry Smith   *ierr = PetscStrncpy(name,c,len);
154e63f14baSBarry Smith }
155e63f14baSBarry Smith 
156e54e4138SSatish Balay /* -----------------------------------------------------------------*/
157e54e4138SSatish Balay 
158