xref: /petsc/src/ksp/pc/impls/shell/ftn-custom/zshellpcf.c (revision 6895c4454d0419b7d1cef7fe2938cafebbe2c313)
1ce0a2cd1SBarry Smith #include "private/fortranimpl.h"
2e54e4138SSatish Balay #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
91d2e4005SSatish Balay #define pcshellsetname_            PCSHELLSETNAME
10*6895c445SBarry Smith #define pcshellsetcontext_         PCSHELLSETCONTEXT
11*6895c445SBarry Smith #define pcshellgetcontext_         PCSHELLGETCONTEXT
12e54e4138SSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
13e54e4138SSatish Balay #define pcshellsetapply_           pcshellsetapply
14e54e4138SSatish Balay #define pcshellsetapplyrichardson_ pcshellsetapplyrichardson
15e54e4138SSatish Balay #define pcshellsetapplytranspose_  pcshellsetapplytranspose
16e54e4138SSatish Balay #define pcshellsetsetup_           pcshellsetsetup
171d2e4005SSatish Balay #define pcshellsetname_            pcshellsetname
18*6895c445SBarry Smith #define pcshellsetcontext_         pcshellsetcontext
19*6895c445SBarry Smith #define pcshellgetcontext_         pcshellgetcontext
20e54e4138SSatish Balay #endif
21e54e4138SSatish Balay 
22e54e4138SSatish Balay /* These are not extern C because they are passed into non-extern C user level functions */
23e54e4138SSatish Balay static PetscErrorCode ourshellapply(void *ctx,Vec x,Vec y)
24e54e4138SSatish Balay {
25e54e4138SSatish Balay   PetscErrorCode ierr = 0;
26*6895c445SBarry Smith   PC             pc = (PC)ctx;
27*6895c445SBarry Smith   void           *mctx = (void*) ((PetscObject)pc)->fortran_func_pointers[0];
28*6895c445SBarry Smith   (*(void (PETSC_STDCALL *)(void*,Vec*,Vec*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[1]))(mctx,&x,&y,&ierr);CHKERRQ(ierr);
29e54e4138SSatish Balay   return 0;
30e54e4138SSatish Balay }
31e54e4138SSatish Balay 
32e54e4138SSatish Balay static PetscErrorCode ourapplyrichardson(void *ctx,Vec x,Vec y,Vec w,PetscReal rtol,PetscReal abstol,PetscReal dtol,PetscInt m)
33e54e4138SSatish Balay {
34e54e4138SSatish Balay   PetscErrorCode ierr = 0;
35e54e4138SSatish Balay 
36*6895c445SBarry Smith   PC             pc = (PC)ctx;
37*6895c445SBarry Smith   void           *mctx = (void*) ((PetscObject)pc)->fortran_func_pointers[0];
38*6895c445SBarry Smith   (*(void (PETSC_STDCALL *)(void*,Vec*,Vec*,Vec*,PetscReal*,PetscReal*,PetscReal*,PetscInt*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[2]))(mctx,&x,&y,&w,&rtol,&abstol,&dtol,&m,&ierr);CHKERRQ(ierr);
39e54e4138SSatish Balay   return 0;
40e54e4138SSatish Balay }
41e54e4138SSatish Balay 
42e54e4138SSatish Balay static PetscErrorCode ourshellapplytranspose(void *ctx,Vec x,Vec y)
43e54e4138SSatish Balay {
44e54e4138SSatish Balay   PetscErrorCode ierr = 0;
45*6895c445SBarry Smith   PC             pc = (PC)ctx;
46*6895c445SBarry Smith   void           *mctx = (void*) ((PetscObject)pc)->fortran_func_pointers[0];
47*6895c445SBarry Smith   (*(void (PETSC_STDCALL *)(void*,Vec*,Vec*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[3]))(mctx,&x,&y,&ierr);CHKERRQ(ierr);
48e54e4138SSatish Balay   return 0;
49e54e4138SSatish Balay }
50e54e4138SSatish Balay 
51e54e4138SSatish Balay static PetscErrorCode ourshellsetup(void *ctx)
52e54e4138SSatish Balay {
53e54e4138SSatish Balay   PetscErrorCode ierr = 0;
54e54e4138SSatish Balay 
55*6895c445SBarry Smith   PC             pc = (PC)ctx;
56*6895c445SBarry Smith   void           *mctx = (void*) ((PetscObject)pc)->fortran_func_pointers[0];
57*6895c445SBarry Smith   (*(void (PETSC_STDCALL *)(void*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[4]))(mctx,&ierr);CHKERRQ(ierr);
58e54e4138SSatish Balay   return 0;
59e54e4138SSatish Balay }
60e54e4138SSatish Balay 
61e54e4138SSatish Balay EXTERN_C_BEGIN
62e54e4138SSatish Balay 
63*6895c445SBarry Smith void PETSC_STDCALL   pcshellsetcontext_(PC *pc,void*ctx, int *__ierr )
64e54e4138SSatish Balay {
65*6895c445SBarry Smith   /* the Fortran context is stored in the func_pointer container, while pc is used as the context */
66*6895c445SBarry Smith   ((PetscObject)*pc)->fortran_func_pointers[0] = (PetscVoidFunction)ctx;
67*6895c445SBarry Smith   *__ierr = PCShellSetContext(*pc,*pc);
68e54e4138SSatish Balay }
69e54e4138SSatish Balay 
70*6895c445SBarry Smith void PETSC_STDCALL   pcshellgetcontext_(PC *pc,void**ctx, int *__ierr )
71e54e4138SSatish Balay {
72*6895c445SBarry Smith   /* the Fortran context is stored in the func_pointer container, while pc is used as the context */
73*6895c445SBarry Smith   *ctx = (void*) ((PetscObject)*pc)->fortran_func_pointers[0];
74e54e4138SSatish Balay }
75e54e4138SSatish Balay 
76*6895c445SBarry Smith void PETSC_STDCALL pcshellsetapply_(PC *pc,void (PETSC_STDCALL *apply)(void*,Vec *,Vec *,PetscErrorCode*),PetscErrorCode *ierr)
77e54e4138SSatish Balay {
78*6895c445SBarry Smith   PetscObjectAllocateFortranPointers(*pc,5);
79*6895c445SBarry Smith   ((PetscObject)*pc)->fortran_func_pointers[1] = (PetscVoidFunction)apply;
80*6895c445SBarry Smith   *ierr = PCShellSetApply(*pc,ourshellapply);if (*ierr) return;
81*6895c445SBarry Smith   *ierr = PCShellSetContext(*pc,*pc);
82*6895c445SBarry Smith }
83*6895c445SBarry Smith 
84*6895c445SBarry Smith void PETSC_STDCALL pcshellsetapplyrichardson_(PC *pc,void (PETSC_STDCALL *apply)(void*,Vec *,Vec *,Vec *,PetscReal*,PetscReal*,PetscReal*,PetscInt*,PetscErrorCode*),PetscErrorCode *ierr)
85*6895c445SBarry Smith {
86*6895c445SBarry Smith   PetscObjectAllocateFortranPointers(*pc,5);
87*6895c445SBarry Smith   ((PetscObject)*pc)->fortran_func_pointers[2] = (PetscVoidFunction)apply;
88*6895c445SBarry Smith   *ierr = PCShellSetApplyRichardson(*pc,ourapplyrichardson);if (*ierr) return;
89*6895c445SBarry Smith   *ierr = PCShellSetContext(*pc,*pc);
90*6895c445SBarry Smith }
91*6895c445SBarry Smith 
92*6895c445SBarry Smith void PETSC_STDCALL pcshellsetapplytranspose_(PC *pc,void (PETSC_STDCALL *applytranspose)(void*,Vec *,Vec *,PetscErrorCode*), PetscErrorCode *ierr)
93*6895c445SBarry Smith {
94*6895c445SBarry Smith   PetscObjectAllocateFortranPointers(*pc,5);
95*6895c445SBarry Smith   ((PetscObject)*pc)->fortran_func_pointers[3] = (PetscVoidFunction)applytranspose;
96*6895c445SBarry Smith   *ierr = PCShellSetApplyTranspose(*pc,ourshellapplytranspose);if (*ierr) return;
97*6895c445SBarry Smith   *ierr = PCShellSetContext(*pc,*pc);
98e54e4138SSatish Balay }
99e54e4138SSatish Balay 
100e54e4138SSatish Balay void PETSC_STDCALL pcshellsetsetup_(PC *pc,void (PETSC_STDCALL *setup)(void*,PetscErrorCode*),PetscErrorCode *ierr)
101e54e4138SSatish Balay {
102*6895c445SBarry Smith   PetscObjectAllocateFortranPointers(*pc,5);
103*6895c445SBarry Smith   ((PetscObject)*pc)->fortran_func_pointers[4] = (PetscVoidFunction)setup;
104*6895c445SBarry Smith   *ierr = PCShellSetSetUp(*pc,ourshellsetup);if (*ierr) return;
105*6895c445SBarry Smith   *ierr = PCShellSetContext(*pc,*pc);
106e54e4138SSatish Balay }
107e54e4138SSatish Balay 
1081d2e4005SSatish Balay void PETSC_STDCALL pcshellsetname_(PC *pc,CHAR name PETSC_MIXED_LEN(len), PetscErrorCode *ierr PETSC_END_LEN(len))
1091d2e4005SSatish Balay {
1101d2e4005SSatish Balay   char *c;
1111d2e4005SSatish Balay   FIXCHAR(name,len,c);
1121d2e4005SSatish Balay   *ierr = PCShellSetName(*pc,c);
1131d2e4005SSatish Balay   FREECHAR(name,c);
1141d2e4005SSatish Balay }
1151d2e4005SSatish Balay 
116e54e4138SSatish Balay /* -----------------------------------------------------------------*/
117e54e4138SSatish Balay 
118e54e4138SSatish Balay EXTERN_C_END
119