xref: /petsc/src/ksp/pc/impls/shell/ftn-custom/zshellpcf.c (revision 4d0a8057dc766494e73f985a8c029a3f3edde3ad)
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
97c54600cSBarry Smith #define pcshellsetdestroy_         PCSHELLSETDESTROY
101d2e4005SSatish Balay #define pcshellsetname_            PCSHELLSETNAME
116895c445SBarry Smith #define pcshellsetcontext_         PCSHELLSETCONTEXT
126895c445SBarry Smith #define pcshellgetcontext_         PCSHELLGETCONTEXT
13e54e4138SSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
14e54e4138SSatish Balay #define pcshellsetapply_           pcshellsetapply
15e54e4138SSatish Balay #define pcshellsetapplyrichardson_ pcshellsetapplyrichardson
16e54e4138SSatish Balay #define pcshellsetapplytranspose_  pcshellsetapplytranspose
17e54e4138SSatish Balay #define pcshellsetsetup_           pcshellsetsetup
187c54600cSBarry Smith #define pcshellsetdestroy_         pcshellsetdestroy
191d2e4005SSatish Balay #define pcshellsetname_            pcshellsetname
206895c445SBarry Smith #define pcshellsetcontext_         pcshellsetcontext
216895c445SBarry Smith #define pcshellgetcontext_         pcshellgetcontext
22e54e4138SSatish Balay #endif
23e54e4138SSatish Balay 
24e54e4138SSatish Balay /* These are not extern C because they are passed into non-extern C user level functions */
25e54e4138SSatish Balay static PetscErrorCode ourshellapply(void *ctx,Vec x,Vec y)
26e54e4138SSatish Balay {
27e54e4138SSatish Balay   PetscErrorCode ierr = 0;
286895c445SBarry Smith   PC             pc = (PC)ctx;
296895c445SBarry Smith   void           *mctx = (void*) ((PetscObject)pc)->fortran_func_pointers[0];
306895c445SBarry Smith   (*(void (PETSC_STDCALL *)(void*,Vec*,Vec*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[1]))(mctx,&x,&y,&ierr);CHKERRQ(ierr);
31e54e4138SSatish Balay   return 0;
32e54e4138SSatish Balay }
33e54e4138SSatish Balay 
34*4d0a8057SBarry Smith static PetscErrorCode ourapplyrichardson(void *ctx,Vec x,Vec y,Vec w,PetscReal rtol,PetscReal abstol,PetscReal dtol,PetscInt m,PetscInt *outits,PCRichardsonConvergedReason *reason)
35e54e4138SSatish Balay {
36e54e4138SSatish Balay   PetscErrorCode ierr = 0;
37e54e4138SSatish Balay 
386895c445SBarry Smith   PC             pc = (PC)ctx;
396895c445SBarry Smith   void           *mctx = (void*) ((PetscObject)pc)->fortran_func_pointers[0];
40*4d0a8057SBarry Smith   (*(void (PETSC_STDCALL *)(void*,Vec*,Vec*,Vec*,PetscReal*,PetscReal*,PetscReal*,PetscInt*,PetscInt*,PCRichardsonConvergedReason*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[2]))(mctx,&x,&y,&w,&rtol,&abstol,&dtol,&m,outits,reason,&ierr);CHKERRQ(ierr);
41e54e4138SSatish Balay   return 0;
42e54e4138SSatish Balay }
43e54e4138SSatish Balay 
44e54e4138SSatish Balay static PetscErrorCode ourshellapplytranspose(void *ctx,Vec x,Vec y)
45e54e4138SSatish Balay {
46e54e4138SSatish Balay   PetscErrorCode ierr = 0;
476895c445SBarry Smith   PC             pc = (PC)ctx;
486895c445SBarry Smith   void           *mctx = (void*) ((PetscObject)pc)->fortran_func_pointers[0];
496895c445SBarry Smith   (*(void (PETSC_STDCALL *)(void*,Vec*,Vec*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[3]))(mctx,&x,&y,&ierr);CHKERRQ(ierr);
50e54e4138SSatish Balay   return 0;
51e54e4138SSatish Balay }
52e54e4138SSatish Balay 
53e54e4138SSatish Balay static PetscErrorCode ourshellsetup(void *ctx)
54e54e4138SSatish Balay {
55e54e4138SSatish Balay   PetscErrorCode ierr = 0;
56e54e4138SSatish Balay 
576895c445SBarry Smith   PC             pc = (PC)ctx;
586895c445SBarry Smith   void           *mctx = (void*) ((PetscObject)pc)->fortran_func_pointers[0];
596895c445SBarry Smith   (*(void (PETSC_STDCALL *)(void*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[4]))(mctx,&ierr);CHKERRQ(ierr);
60e54e4138SSatish Balay   return 0;
61e54e4138SSatish Balay }
62e54e4138SSatish Balay 
637c54600cSBarry Smith static PetscErrorCode ourshelldestroy(void *ctx)
647c54600cSBarry Smith {
657c54600cSBarry Smith   PetscErrorCode ierr = 0;
667c54600cSBarry Smith 
677c54600cSBarry Smith   PC             pc = (PC)ctx;
687c54600cSBarry Smith   void           *mctx = (void*) ((PetscObject)pc)->fortran_func_pointers[0];
697c54600cSBarry Smith   (*(void (PETSC_STDCALL *)(void*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[5]))(mctx,&ierr);CHKERRQ(ierr);
707c54600cSBarry Smith   return 0;
717c54600cSBarry Smith }
727c54600cSBarry Smith 
73e54e4138SSatish Balay EXTERN_C_BEGIN
74e54e4138SSatish Balay 
757c54600cSBarry Smith void PETSC_STDCALL   pcshellsetcontext_(PC *pc,void*ctx, int *ierr )
76e54e4138SSatish Balay {
776895c445SBarry Smith   /* the Fortran context is stored in the func_pointer container, while pc is used as the context */
787c54600cSBarry Smith   PetscObjectAllocateFortranPointers(*pc,6);
796895c445SBarry Smith   ((PetscObject)*pc)->fortran_func_pointers[0] = (PetscVoidFunction)ctx;
807c54600cSBarry Smith   *ierr = PCShellSetContext(*pc,*pc);
81e54e4138SSatish Balay }
82e54e4138SSatish Balay 
836895c445SBarry Smith void PETSC_STDCALL   pcshellgetcontext_(PC *pc,void**ctx, int *__ierr )
84e54e4138SSatish Balay {
856895c445SBarry Smith   /* the Fortran context is stored in the func_pointer container, while pc is used as the context */
866895c445SBarry Smith   *ctx = (void*) ((PetscObject)*pc)->fortran_func_pointers[0];
87e54e4138SSatish Balay }
88e54e4138SSatish Balay 
896895c445SBarry Smith void PETSC_STDCALL pcshellsetapply_(PC *pc,void (PETSC_STDCALL *apply)(void*,Vec *,Vec *,PetscErrorCode*),PetscErrorCode *ierr)
90e54e4138SSatish Balay {
917c54600cSBarry Smith   PetscObjectAllocateFortranPointers(*pc,6);
926895c445SBarry Smith   ((PetscObject)*pc)->fortran_func_pointers[1] = (PetscVoidFunction)apply;
936895c445SBarry Smith   *ierr = PCShellSetApply(*pc,ourshellapply);if (*ierr) return;
946895c445SBarry Smith   *ierr = PCShellSetContext(*pc,*pc);
956895c445SBarry Smith }
966895c445SBarry Smith 
97*4d0a8057SBarry Smith void PETSC_STDCALL pcshellsetapplyrichardson_(PC *pc,void (PETSC_STDCALL *apply)(void*,Vec *,Vec *,Vec *,PetscReal*,PetscReal*,PetscReal*,PetscInt*,PetscInt*,PCRichardsonConvergedReason*,PetscErrorCode*),PetscErrorCode *ierr)
986895c445SBarry Smith {
997c54600cSBarry Smith   PetscObjectAllocateFortranPointers(*pc,6);
1006895c445SBarry Smith   ((PetscObject)*pc)->fortran_func_pointers[2] = (PetscVoidFunction)apply;
1016895c445SBarry Smith   *ierr = PCShellSetApplyRichardson(*pc,ourapplyrichardson);if (*ierr) return;
1026895c445SBarry Smith   *ierr = PCShellSetContext(*pc,*pc);
1036895c445SBarry Smith }
1046895c445SBarry Smith 
1056895c445SBarry Smith void PETSC_STDCALL pcshellsetapplytranspose_(PC *pc,void (PETSC_STDCALL *applytranspose)(void*,Vec *,Vec *,PetscErrorCode*), PetscErrorCode *ierr)
1066895c445SBarry Smith {
1077c54600cSBarry Smith   PetscObjectAllocateFortranPointers(*pc,6);
1086895c445SBarry Smith   ((PetscObject)*pc)->fortran_func_pointers[3] = (PetscVoidFunction)applytranspose;
1096895c445SBarry Smith   *ierr = PCShellSetApplyTranspose(*pc,ourshellapplytranspose);if (*ierr) return;
1106895c445SBarry Smith   *ierr = PCShellSetContext(*pc,*pc);
111e54e4138SSatish Balay }
112e54e4138SSatish Balay 
113e54e4138SSatish Balay void PETSC_STDCALL pcshellsetsetup_(PC *pc,void (PETSC_STDCALL *setup)(void*,PetscErrorCode*),PetscErrorCode *ierr)
114e54e4138SSatish Balay {
1157c54600cSBarry Smith   PetscObjectAllocateFortranPointers(*pc,6);
1166895c445SBarry Smith   ((PetscObject)*pc)->fortran_func_pointers[4] = (PetscVoidFunction)setup;
1176895c445SBarry Smith   *ierr = PCShellSetSetUp(*pc,ourshellsetup);if (*ierr) return;
1186895c445SBarry Smith   *ierr = PCShellSetContext(*pc,*pc);
119e54e4138SSatish Balay }
120e54e4138SSatish Balay 
1217c54600cSBarry Smith void PETSC_STDCALL pcshellsetdestroy_(PC *pc,void (PETSC_STDCALL *setup)(void*,PetscErrorCode*),PetscErrorCode *ierr)
1227c54600cSBarry Smith {
1237c54600cSBarry Smith   PetscObjectAllocateFortranPointers(*pc,6);
1247c54600cSBarry Smith   ((PetscObject)*pc)->fortran_func_pointers[5] = (PetscVoidFunction)setup;
1257c54600cSBarry Smith   *ierr = PCShellSetDestroy(*pc,ourshelldestroy);if (*ierr) return;
1267c54600cSBarry Smith   *ierr = PCShellSetContext(*pc,*pc);
1277c54600cSBarry Smith }
1287c54600cSBarry Smith 
1291d2e4005SSatish Balay void PETSC_STDCALL pcshellsetname_(PC *pc,CHAR name PETSC_MIXED_LEN(len), PetscErrorCode *ierr PETSC_END_LEN(len))
1301d2e4005SSatish Balay {
1311d2e4005SSatish Balay   char *c;
1321d2e4005SSatish Balay   FIXCHAR(name,len,c);
1331d2e4005SSatish Balay   *ierr = PCShellSetName(*pc,c);
1341d2e4005SSatish Balay   FREECHAR(name,c);
1351d2e4005SSatish Balay }
1361d2e4005SSatish Balay 
137e54e4138SSatish Balay /* -----------------------------------------------------------------*/
138e54e4138SSatish Balay 
139e54e4138SSatish Balay EXTERN_C_END
140