xref: /petsc/src/ksp/pc/impls/shell/ftn-custom/zshellpcf.c (revision b2e6f0117d79d226cb6319fb704e23ba4d13701f)
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 */
256891c3e4SJed Brown static PetscErrorCode ourshellapply(PC pc,Vec x,Vec y)
26e54e4138SSatish Balay {
27e54e4138SSatish Balay   PetscErrorCode ierr = 0;
286891c3e4SJed Brown   (*(void (PETSC_STDCALL *)(PC*,Vec*,Vec*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[0]))(&pc,&x,&y,&ierr);CHKERRQ(ierr);
29e54e4138SSatish Balay   return 0;
30e54e4138SSatish Balay }
31e54e4138SSatish Balay 
326891c3e4SJed Brown static PetscErrorCode ourapplyrichardson(PC pc,Vec x,Vec y,Vec w,PetscReal rtol,PetscReal abstol,PetscReal dtol,PetscInt m,PetscInt *outits,PCRichardsonConvergedReason *reason)
33e54e4138SSatish Balay {
34e54e4138SSatish Balay   PetscErrorCode ierr = 0;
356891c3e4SJed Brown   (*(void (PETSC_STDCALL *)(PC*,Vec*,Vec*,Vec*,PetscReal*,PetscReal*,PetscReal*,PetscInt*,PetscInt*,PCRichardsonConvergedReason*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[1]))(&pc,&x,&y,&w,&rtol,&abstol,&dtol,&m,outits,reason,&ierr);CHKERRQ(ierr);
36e54e4138SSatish Balay   return 0;
37e54e4138SSatish Balay }
38e54e4138SSatish Balay 
396891c3e4SJed Brown static PetscErrorCode ourshellapplytranspose(PC pc,Vec x,Vec y)
40e54e4138SSatish Balay {
41e54e4138SSatish Balay   PetscErrorCode ierr = 0;
426891c3e4SJed Brown   (*(void (PETSC_STDCALL *)(void*,Vec*,Vec*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[2]))(&pc,&x,&y,&ierr);CHKERRQ(ierr);
43e54e4138SSatish Balay   return 0;
44e54e4138SSatish Balay }
45e54e4138SSatish Balay 
466891c3e4SJed Brown static PetscErrorCode ourshellsetup(PC pc)
47e54e4138SSatish Balay {
48e54e4138SSatish Balay   PetscErrorCode ierr = 0;
496891c3e4SJed Brown   (*(void (PETSC_STDCALL *)(PC*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[3]))(&pc,&ierr);CHKERRQ(ierr);
50e54e4138SSatish Balay   return 0;
51e54e4138SSatish Balay }
52e54e4138SSatish Balay 
536891c3e4SJed Brown static PetscErrorCode ourshelldestroy(PC pc)
547c54600cSBarry Smith {
557c54600cSBarry Smith   PetscErrorCode ierr = 0;
566891c3e4SJed Brown   (*(void (PETSC_STDCALL *)(void*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[4]))(&pc,&ierr);CHKERRQ(ierr);
577c54600cSBarry Smith   return 0;
587c54600cSBarry Smith }
597c54600cSBarry Smith 
60e54e4138SSatish Balay EXTERN_C_BEGIN
61e54e4138SSatish Balay 
626891c3e4SJed Brown void PETSC_STDCALL pcshellsetcontext_(PC *pc,void *ctx,PetscErrorCode *ierr){
636891c3e4SJed Brown   *ierr = PCShellSetContext(*pc,ctx);
64e54e4138SSatish Balay }
65e54e4138SSatish Balay 
666891c3e4SJed Brown void PETSC_STDCALL pcshellgetcontext_(PC *pc,void **ctx,PetscErrorCode *ierr)
67e54e4138SSatish Balay {
686891c3e4SJed Brown   *ierr = PCShellGetContext(*pc,ctx);
69e54e4138SSatish Balay }
70e54e4138SSatish Balay 
716895c445SBarry Smith void PETSC_STDCALL pcshellsetapply_(PC *pc,void (PETSC_STDCALL *apply)(void*,Vec *,Vec *,PetscErrorCode*),PetscErrorCode *ierr)
72e54e4138SSatish Balay {
736891c3e4SJed Brown   PetscObjectAllocateFortranPointers(*pc,5);
746891c3e4SJed Brown   ((PetscObject)*pc)->fortran_func_pointers[0] = (PetscVoidFunction)apply;
756891c3e4SJed Brown   *ierr = PCShellSetApply(*pc,ourshellapply);
766895c445SBarry Smith }
776895c445SBarry Smith 
784d0a8057SBarry Smith void PETSC_STDCALL pcshellsetapplyrichardson_(PC *pc,void (PETSC_STDCALL *apply)(void*,Vec *,Vec *,Vec *,PetscReal*,PetscReal*,PetscReal*,PetscInt*,PetscInt*,PCRichardsonConvergedReason*,PetscErrorCode*),PetscErrorCode *ierr)
796895c445SBarry Smith {
806891c3e4SJed Brown   PetscObjectAllocateFortranPointers(*pc,5);
816891c3e4SJed Brown   ((PetscObject)*pc)->fortran_func_pointers[1] = (PetscVoidFunction)apply;
826891c3e4SJed Brown   *ierr = PCShellSetApplyRichardson(*pc,ourapplyrichardson);
836895c445SBarry Smith }
846895c445SBarry Smith 
856895c445SBarry Smith void PETSC_STDCALL pcshellsetapplytranspose_(PC *pc,void (PETSC_STDCALL *applytranspose)(void*,Vec *,Vec *,PetscErrorCode*), PetscErrorCode *ierr)
866895c445SBarry Smith {
876891c3e4SJed Brown   PetscObjectAllocateFortranPointers(*pc,5);
886891c3e4SJed Brown   ((PetscObject)*pc)->fortran_func_pointers[2] = (PetscVoidFunction)applytranspose;
896891c3e4SJed Brown   *ierr = PCShellSetApplyTranspose(*pc,ourshellapplytranspose);
90e54e4138SSatish Balay }
91e54e4138SSatish Balay 
92e54e4138SSatish Balay void PETSC_STDCALL pcshellsetsetup_(PC *pc,void (PETSC_STDCALL *setup)(void*,PetscErrorCode*),PetscErrorCode *ierr)
93e54e4138SSatish Balay {
946891c3e4SJed Brown   PetscObjectAllocateFortranPointers(*pc,5);
956891c3e4SJed Brown   ((PetscObject)*pc)->fortran_func_pointers[3] = (PetscVoidFunction)setup;
966891c3e4SJed Brown   *ierr = PCShellSetSetUp(*pc,ourshellsetup);
97e54e4138SSatish Balay }
98e54e4138SSatish Balay 
997c54600cSBarry Smith void PETSC_STDCALL pcshellsetdestroy_(PC *pc,void (PETSC_STDCALL *setup)(void*,PetscErrorCode*),PetscErrorCode *ierr)
1007c54600cSBarry Smith {
101*b2e6f011SJed Brown   PetscObjectAllocateFortranPointers(*pc,5);
1026891c3e4SJed Brown   ((PetscObject)*pc)->fortran_func_pointers[4] = (PetscVoidFunction)setup;
1036891c3e4SJed Brown   *ierr = PCShellSetDestroy(*pc,ourshelldestroy);
1047c54600cSBarry Smith }
1057c54600cSBarry Smith 
1061d2e4005SSatish Balay void PETSC_STDCALL pcshellsetname_(PC *pc,CHAR name PETSC_MIXED_LEN(len), PetscErrorCode *ierr PETSC_END_LEN(len))
1071d2e4005SSatish Balay {
1081d2e4005SSatish Balay   char *c;
1091d2e4005SSatish Balay   FIXCHAR(name,len,c);
1101d2e4005SSatish Balay   *ierr = PCShellSetName(*pc,c);
1111d2e4005SSatish Balay   FREECHAR(name,c);
1121d2e4005SSatish Balay }
1131d2e4005SSatish Balay 
114e54e4138SSatish Balay /* -----------------------------------------------------------------*/
115e54e4138SSatish Balay 
116e54e4138SSatish Balay EXTERN_C_END
117