xref: /petsc/src/ksp/pc/impls/shell/ftn-custom/zshellpcf.c (revision 1d2e40055fe3bf783df36eeeccf2d7d5fcfab0fd)
1e54e4138SSatish Balay #include "zpetsc.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
9*1d2e4005SSatish Balay #define pcshellsetname_            PCSHELLSETNAME
10e54e4138SSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
11e54e4138SSatish Balay #define pcshellsetapply_           pcshellsetapply
12e54e4138SSatish Balay #define pcshellsetapplyrichardson_ pcshellsetapplyrichardson
13e54e4138SSatish Balay #define pcshellsetapplytranspose_  pcshellsetapplytranspose
14e54e4138SSatish Balay #define pcshellsetsetup_           pcshellsetsetup
15*1d2e4005SSatish Balay #define pcshellsetname_            pcshellsetname
16e54e4138SSatish Balay #endif
17e54e4138SSatish Balay 
18e54e4138SSatish Balay EXTERN_C_BEGIN
19e54e4138SSatish Balay static void (PETSC_STDCALL *f1)(void*,Vec*,Vec*,PetscErrorCode*);
20e54e4138SSatish Balay static void (PETSC_STDCALL *f2)(void*,Vec*,Vec*,Vec*,PetscReal*,PetscReal*,PetscReal*,PetscInt*,PetscErrorCode*);
21e54e4138SSatish Balay static void (PETSC_STDCALL *f3)(void*,Vec*,Vec*,PetscErrorCode*);
22e54e4138SSatish Balay static void (PETSC_STDCALL *f9)(void*,PetscErrorCode*);
23e54e4138SSatish Balay EXTERN_C_END
24e54e4138SSatish Balay 
25e54e4138SSatish Balay /* These are not extern C because they are passed into non-extern C user level functions */
26e54e4138SSatish Balay static PetscErrorCode ourshellapply(void *ctx,Vec x,Vec y)
27e54e4138SSatish Balay {
28e54e4138SSatish Balay   PetscErrorCode ierr = 0;
29e54e4138SSatish Balay   (*f1)(ctx,&x,&y,&ierr);CHKERRQ(ierr);
30e54e4138SSatish Balay   return 0;
31e54e4138SSatish Balay }
32e54e4138SSatish Balay 
33e54e4138SSatish Balay static PetscErrorCode ourapplyrichardson(void *ctx,Vec x,Vec y,Vec w,PetscReal rtol,PetscReal abstol,PetscReal dtol,PetscInt m)
34e54e4138SSatish Balay {
35e54e4138SSatish Balay   PetscErrorCode ierr = 0;
36e54e4138SSatish Balay 
37e54e4138SSatish Balay   (*f2)(ctx,&x,&y,&w,&rtol,&abstol,&dtol,&m,&ierr);CHKERRQ(ierr);
38e54e4138SSatish Balay   return 0;
39e54e4138SSatish Balay }
40e54e4138SSatish Balay 
41e54e4138SSatish Balay static PetscErrorCode ourshellapplytranspose(void *ctx,Vec x,Vec y)
42e54e4138SSatish Balay {
43e54e4138SSatish Balay   PetscErrorCode ierr = 0;
44e54e4138SSatish Balay   (*f3)(ctx,&x,&y,&ierr);CHKERRQ(ierr);
45e54e4138SSatish Balay   return 0;
46e54e4138SSatish Balay }
47e54e4138SSatish Balay 
48e54e4138SSatish Balay static PetscErrorCode ourshellsetup(void *ctx)
49e54e4138SSatish Balay {
50e54e4138SSatish Balay   PetscErrorCode ierr = 0;
51e54e4138SSatish Balay 
52e54e4138SSatish Balay   (*f9)(ctx,&ierr);CHKERRQ(ierr);
53e54e4138SSatish Balay   return 0;
54e54e4138SSatish Balay }
55e54e4138SSatish Balay 
56e54e4138SSatish Balay EXTERN_C_BEGIN
57e54e4138SSatish Balay 
58e54e4138SSatish Balay void PETSC_STDCALL pcshellsetapply_(PC *pc,void (PETSC_STDCALL *apply)(void*,Vec *,Vec *,PetscErrorCode*),
59e54e4138SSatish Balay                                     PetscErrorCode *ierr)
60e54e4138SSatish Balay {
61e54e4138SSatish Balay   f1 = apply;
62e54e4138SSatish Balay   *ierr = PCShellSetApply(*pc,ourshellapply);
63e54e4138SSatish Balay }
64e54e4138SSatish Balay 
65e54e4138SSatish Balay void PETSC_STDCALL pcshellsetapplyrichardson_(PC *pc,
66e54e4138SSatish Balay          void (PETSC_STDCALL *apply)(void*,Vec *,Vec *,Vec *,PetscReal*,PetscReal*,PetscReal*,PetscInt*,PetscErrorCode*),
67e54e4138SSatish Balay          PetscErrorCode *ierr)
68e54e4138SSatish Balay {
69e54e4138SSatish Balay   f2 = apply;
70e54e4138SSatish Balay   *ierr = PCShellSetApplyRichardson(*pc,ourapplyrichardson);
71e54e4138SSatish Balay }
72e54e4138SSatish Balay 
73e54e4138SSatish Balay void PETSC_STDCALL pcshellsetapplytranspose_(PC *pc,void (PETSC_STDCALL *applytranspose)(void*,Vec *,Vec *,PetscErrorCode*),
74e54e4138SSatish Balay                                              PetscErrorCode *ierr)
75e54e4138SSatish Balay {
76e54e4138SSatish Balay   f3 = applytranspose;
77e54e4138SSatish Balay   *ierr = PCShellSetApplyTranspose(*pc,ourshellapplytranspose);
78e54e4138SSatish Balay }
79e54e4138SSatish Balay 
80e54e4138SSatish Balay void PETSC_STDCALL pcshellsetsetup_(PC *pc,void (PETSC_STDCALL *setup)(void*,PetscErrorCode*),PetscErrorCode *ierr)
81e54e4138SSatish Balay {
82e54e4138SSatish Balay   f9 = setup;
83e54e4138SSatish Balay   *ierr = PCShellSetSetUp(*pc,ourshellsetup);
84e54e4138SSatish Balay }
85e54e4138SSatish Balay 
86*1d2e4005SSatish Balay void PETSC_STDCALL pcshellsetname_(PC *pc,CHAR name PETSC_MIXED_LEN(len), PetscErrorCode *ierr PETSC_END_LEN(len))
87*1d2e4005SSatish Balay {
88*1d2e4005SSatish Balay   char *c;
89*1d2e4005SSatish Balay   FIXCHAR(name,len,c);
90*1d2e4005SSatish Balay   *ierr = PCShellSetName(*pc,c);
91*1d2e4005SSatish Balay   FREECHAR(name,c);
92*1d2e4005SSatish Balay }
93*1d2e4005SSatish Balay 
94e54e4138SSatish Balay /* -----------------------------------------------------------------*/
95e54e4138SSatish Balay 
96e54e4138SSatish Balay EXTERN_C_END
97