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