xref: /petsc/src/ksp/pc/impls/shell/ftn-custom/zshellpcf.c (revision a425a105cfbb4816f5955d7198d53f7b86fd1b96)
1b45d2f2cSJed Brown #include <petsc-private/fortranimpl.h>
2c6db04a5SJed Brown #include <petscpc.h>
3*a425a105SElliott Sales de Andrade #include <petscksp.h>
4e54e4138SSatish Balay 
5e54e4138SSatish Balay #if defined(PETSC_HAVE_FORTRAN_CAPS)
6e54e4138SSatish Balay #define pcshellsetapply_           PCSHELLSETAPPLY
7e54e4138SSatish Balay #define pcshellsetapplyrichardson_ PCSHELLSETAPPLYRICHARDSON
8e54e4138SSatish Balay #define pcshellsetapplytranspose_  PCSHELLSETAPPLYTRANSPOSE
9e54e4138SSatish Balay #define pcshellsetsetup_           PCSHELLSETSETUP
107c54600cSBarry Smith #define pcshellsetdestroy_         PCSHELLSETDESTROY
11*a425a105SElliott Sales de Andrade #define pcshellsetpresolve_        PCSHELLSETPRESOLVE
12*a425a105SElliott Sales de Andrade #define pcshellsetpostsolve_       PCSHELLSETPOSTSOLVE
131d2e4005SSatish Balay #define pcshellsetname_            PCSHELLSETNAME
14e63f14baSBarry Smith #define pcshellgetname_            PCSHELLGETNAME
156895c445SBarry Smith #define pcshellsetcontext_         PCSHELLSETCONTEXT
166895c445SBarry Smith #define pcshellgetcontext_         PCSHELLGETCONTEXT
17e54e4138SSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
18e54e4138SSatish Balay #define pcshellsetapply_           pcshellsetapply
19e54e4138SSatish Balay #define pcshellsetapplyrichardson_ pcshellsetapplyrichardson
20e54e4138SSatish Balay #define pcshellsetapplytranspose_  pcshellsetapplytranspose
21e54e4138SSatish Balay #define pcshellsetsetup_           pcshellsetsetup
227c54600cSBarry Smith #define pcshellsetdestroy_         pcshellsetdestroy
23*a425a105SElliott Sales de Andrade #define pcshellsetpresolve_        pcshellsetpresolve
24*a425a105SElliott Sales de Andrade #define pcshellsetpostsolve_       pcshellsetpostsolve
251d2e4005SSatish Balay #define pcshellsetname_            pcshellsetname
26e63f14baSBarry Smith #define pcshellgetname_            pcshellgetname
276895c445SBarry Smith #define pcshellsetcontext_         pcshellsetcontext
286895c445SBarry Smith #define pcshellgetcontext_         pcshellgetcontext
29e54e4138SSatish Balay #endif
30e54e4138SSatish Balay 
31e54e4138SSatish Balay /* These are not extern C because they are passed into non-extern C user level functions */
326891c3e4SJed Brown static PetscErrorCode ourshellapply(PC pc,Vec x,Vec y)
33e54e4138SSatish Balay {
34e54e4138SSatish Balay   PetscErrorCode ierr = 0;
356891c3e4SJed Brown   (*(void (PETSC_STDCALL *)(PC*,Vec*,Vec*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[0]))(&pc,&x,&y,&ierr);CHKERRQ(ierr);
36e54e4138SSatish Balay   return 0;
37e54e4138SSatish Balay }
38e54e4138SSatish Balay 
39ace3abfcSBarry 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)
40e54e4138SSatish Balay {
41e54e4138SSatish Balay   PetscErrorCode ierr = 0;
42ace3abfcSBarry 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);
43e54e4138SSatish Balay   return 0;
44e54e4138SSatish Balay }
45e54e4138SSatish Balay 
466891c3e4SJed Brown static PetscErrorCode ourshellapplytranspose(PC pc,Vec x,Vec y)
47e54e4138SSatish Balay {
48e54e4138SSatish Balay   PetscErrorCode ierr = 0;
496891c3e4SJed Brown   (*(void (PETSC_STDCALL *)(void*,Vec*,Vec*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[2]))(&pc,&x,&y,&ierr);CHKERRQ(ierr);
50e54e4138SSatish Balay   return 0;
51e54e4138SSatish Balay }
52e54e4138SSatish Balay 
536891c3e4SJed Brown static PetscErrorCode ourshellsetup(PC pc)
54e54e4138SSatish Balay {
55e54e4138SSatish Balay   PetscErrorCode ierr = 0;
566891c3e4SJed Brown   (*(void (PETSC_STDCALL *)(PC*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[3]))(&pc,&ierr);CHKERRQ(ierr);
57e54e4138SSatish Balay   return 0;
58e54e4138SSatish Balay }
59e54e4138SSatish Balay 
606891c3e4SJed Brown static PetscErrorCode ourshelldestroy(PC pc)
617c54600cSBarry Smith {
627c54600cSBarry Smith   PetscErrorCode ierr = 0;
636891c3e4SJed Brown   (*(void (PETSC_STDCALL *)(void*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[4]))(&pc,&ierr);CHKERRQ(ierr);
647c54600cSBarry Smith   return 0;
657c54600cSBarry Smith }
667c54600cSBarry Smith 
67*a425a105SElliott Sales de Andrade static PetscErrorCode ourshellpresolve(PC pc,KSP ksp,Vec x,Vec y)
68*a425a105SElliott Sales de Andrade {
69*a425a105SElliott Sales de Andrade   PetscErrorCode ierr = 0;
70*a425a105SElliott Sales de Andrade   (*(void (PETSC_STDCALL *)(PC*,KSP*,Vec*,Vec*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[5]))(&pc,&ksp,&x,&y,&ierr);CHKERRQ(ierr);
71*a425a105SElliott Sales de Andrade   return 0;
72*a425a105SElliott Sales de Andrade }
73*a425a105SElliott Sales de Andrade 
74*a425a105SElliott Sales de Andrade static PetscErrorCode ourshellpostsolve(PC pc,KSP ksp,Vec x,Vec y)
75*a425a105SElliott Sales de Andrade {
76*a425a105SElliott Sales de Andrade   PetscErrorCode ierr = 0;
77*a425a105SElliott Sales de Andrade   (*(void (PETSC_STDCALL *)(PC*,KSP*,Vec*,Vec*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[6]))(&pc,&ksp,&x,&y,&ierr);CHKERRQ(ierr);
78*a425a105SElliott Sales de Andrade   return 0;
79*a425a105SElliott Sales de Andrade }
80*a425a105SElliott Sales de Andrade 
818cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL pcshellgetcontext_(PC *pc,void **ctx,PetscErrorCode *ierr)
82e54e4138SSatish Balay {
836891c3e4SJed Brown   *ierr = PCShellGetContext(*pc,ctx);
84e54e4138SSatish Balay }
85e54e4138SSatish Balay 
868cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL pcshellsetapply_(PC *pc,void (PETSC_STDCALL *apply)(void*,Vec*,Vec*,PetscErrorCode*),PetscErrorCode *ierr)
87e54e4138SSatish Balay {
88*a425a105SElliott Sales de Andrade   PetscObjectAllocateFortranPointers(*pc,7);
896891c3e4SJed Brown   ((PetscObject)*pc)->fortran_func_pointers[0] = (PetscVoidFunction)apply;
902fa5cd67SKarl Rupp 
916891c3e4SJed Brown   *ierr = PCShellSetApply(*pc,ourshellapply);
926895c445SBarry Smith }
936895c445SBarry Smith 
948cc058d9SJed 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)
956895c445SBarry Smith {
96*a425a105SElliott Sales de Andrade   PetscObjectAllocateFortranPointers(*pc,7);
976891c3e4SJed Brown   ((PetscObject)*pc)->fortran_func_pointers[1] = (PetscVoidFunction)apply;
986891c3e4SJed Brown   *ierr = PCShellSetApplyRichardson(*pc,ourapplyrichardson);
996895c445SBarry Smith }
1006895c445SBarry Smith 
1018cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL pcshellsetapplytranspose_(PC *pc,void (PETSC_STDCALL *applytranspose)(void*,Vec *,Vec *,PetscErrorCode*), PetscErrorCode *ierr)
1026895c445SBarry Smith {
103*a425a105SElliott Sales de Andrade   PetscObjectAllocateFortranPointers(*pc,7);
1046891c3e4SJed Brown   ((PetscObject)*pc)->fortran_func_pointers[2] = (PetscVoidFunction)applytranspose;
1052fa5cd67SKarl Rupp 
1066891c3e4SJed Brown   *ierr = PCShellSetApplyTranspose(*pc,ourshellapplytranspose);
107e54e4138SSatish Balay }
108e54e4138SSatish Balay 
1098cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL pcshellsetsetup_(PC *pc,void (PETSC_STDCALL *setup)(void*,PetscErrorCode*),PetscErrorCode *ierr)
110e54e4138SSatish Balay {
111*a425a105SElliott Sales de Andrade   PetscObjectAllocateFortranPointers(*pc,7);
1126891c3e4SJed Brown   ((PetscObject)*pc)->fortran_func_pointers[3] = (PetscVoidFunction)setup;
1132fa5cd67SKarl Rupp 
1146891c3e4SJed Brown   *ierr = PCShellSetSetUp(*pc,ourshellsetup);
115e54e4138SSatish Balay }
116e54e4138SSatish Balay 
1178cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL pcshellsetdestroy_(PC *pc,void (PETSC_STDCALL *setup)(void*,PetscErrorCode*),PetscErrorCode *ierr)
1187c54600cSBarry Smith {
119*a425a105SElliott Sales de Andrade   PetscObjectAllocateFortranPointers(*pc,7);
1206891c3e4SJed Brown   ((PetscObject)*pc)->fortran_func_pointers[4] = (PetscVoidFunction)setup;
1212fa5cd67SKarl Rupp 
1226891c3e4SJed Brown   *ierr = PCShellSetDestroy(*pc,ourshelldestroy);
1237c54600cSBarry Smith }
1247c54600cSBarry Smith 
125*a425a105SElliott Sales de Andrade PETSC_EXTERN void PETSC_STDCALL pcshellsetpresolve_(PC *pc,void (PETSC_STDCALL *presolve)(void*,void*,Vec*,Vec*,PetscErrorCode*),PetscErrorCode *ierr)
126*a425a105SElliott Sales de Andrade {
127*a425a105SElliott Sales de Andrade   PetscObjectAllocateFortranPointers(*pc,7);
128*a425a105SElliott Sales de Andrade   ((PetscObject)*pc)->fortran_func_pointers[5] = (PetscVoidFunction)presolve;
129*a425a105SElliott Sales de Andrade 
130*a425a105SElliott Sales de Andrade   *ierr = PCShellSetPreSolve(*pc,ourshellpresolve);
131*a425a105SElliott Sales de Andrade }
132*a425a105SElliott Sales de Andrade 
133*a425a105SElliott Sales de Andrade PETSC_EXTERN void PETSC_STDCALL pcshellsetpostsolve_(PC *pc,void (PETSC_STDCALL *postsolve)(void*,void*,Vec*,Vec*,PetscErrorCode*),PetscErrorCode *ierr)
134*a425a105SElliott Sales de Andrade {
135*a425a105SElliott Sales de Andrade   PetscObjectAllocateFortranPointers(*pc,7);
136*a425a105SElliott Sales de Andrade   ((PetscObject)*pc)->fortran_func_pointers[6] = (PetscVoidFunction)postsolve;
137*a425a105SElliott Sales de Andrade 
138*a425a105SElliott Sales de Andrade   *ierr = PCShellSetPostSolve(*pc,ourshellpostsolve);
139*a425a105SElliott Sales de Andrade }
140*a425a105SElliott Sales de Andrade 
1418cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL pcshellsetname_(PC *pc,CHAR name PETSC_MIXED_LEN(len), PetscErrorCode *ierr PETSC_END_LEN(len))
1421d2e4005SSatish Balay {
1431d2e4005SSatish Balay   char *c;
1441d2e4005SSatish Balay   FIXCHAR(name,len,c);
1451d2e4005SSatish Balay   *ierr = PCShellSetName(*pc,c);
1461d2e4005SSatish Balay   FREECHAR(name,c);
1471d2e4005SSatish Balay }
1481d2e4005SSatish Balay 
1498cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL pcshellgetname_(PC *pc,CHAR name PETSC_MIXED_LEN(len), PetscErrorCode *ierr PETSC_END_LEN(len))
150e63f14baSBarry Smith {
151ccaf0856SBarry Smith   const char *c;
152e63f14baSBarry Smith 
153e63f14baSBarry Smith   *ierr = PCShellGetName(*pc,&c);if (*ierr) return;
154e63f14baSBarry Smith   *ierr = PetscStrncpy(name,c,len);
155e63f14baSBarry Smith }
156e63f14baSBarry Smith 
157e54e4138SSatish Balay /* -----------------------------------------------------------------*/
158e54e4138SSatish Balay 
159