1af0996ceSBarry Smith #include <petsc/private/fortranimpl.h> 2c6db04a5SJed Brown #include <petscpc.h> 3a425a105SElliott Sales de Andrade #include <petscksp.h> 4e54e4138SSatish Balay 5e54e4138SSatish Balay #if defined(PETSC_HAVE_FORTRAN_CAPS) 6e54e4138SSatish Balay #define pcshellsetapply_ PCSHELLSETAPPLY 7*1b581b66SBarry Smith #define pcshellsetapplysymmetricleft_ PCSHELLSETAPPLYSYMMETRICLEFT 8*1b581b66SBarry Smith #define pcshellsetapplysymmetricright_ PCSHELLSETAPPLYSYMMETRICRIGHT 9ccf40c83SElliott Sales de Andrade #define pcshellsetapplyba_ PCSHELLSETAPPLYBA 10e54e4138SSatish Balay #define pcshellsetapplyrichardson_ PCSHELLSETAPPLYRICHARDSON 11e54e4138SSatish Balay #define pcshellsetapplytranspose_ PCSHELLSETAPPLYTRANSPOSE 12e54e4138SSatish Balay #define pcshellsetsetup_ PCSHELLSETSETUP 137c54600cSBarry Smith #define pcshellsetdestroy_ PCSHELLSETDESTROY 14a425a105SElliott Sales de Andrade #define pcshellsetpresolve_ PCSHELLSETPRESOLVE 15a425a105SElliott Sales de Andrade #define pcshellsetpostsolve_ PCSHELLSETPOSTSOLVE 162f519dc9SElliott Sales de Andrade #define pcshellsetview_ PCSHELLSETVIEW 171d2e4005SSatish Balay #define pcshellsetname_ PCSHELLSETNAME 18e63f14baSBarry Smith #define pcshellgetname_ PCSHELLGETNAME 196895c445SBarry Smith #define pcshellsetcontext_ PCSHELLSETCONTEXT 206895c445SBarry Smith #define pcshellgetcontext_ PCSHELLGETCONTEXT 21e54e4138SSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE) 22e54e4138SSatish Balay #define pcshellsetapply_ pcshellsetapply 23ccf40c83SElliott Sales de Andrade #define pcshellsetapplyba_ pcshellsetapplyba 24e54e4138SSatish Balay #define pcshellsetapplyrichardson_ pcshellsetapplyrichardson 25e54e4138SSatish Balay #define pcshellsetapplytranspose_ pcshellsetapplytranspose 26e54e4138SSatish Balay #define pcshellsetsetup_ pcshellsetsetup 277c54600cSBarry Smith #define pcshellsetdestroy_ pcshellsetdestroy 28a425a105SElliott Sales de Andrade #define pcshellsetpresolve_ pcshellsetpresolve 29a425a105SElliott Sales de Andrade #define pcshellsetpostsolve_ pcshellsetpostsolve 302f519dc9SElliott Sales de Andrade #define pcshellsetview_ pcshellsetview 311d2e4005SSatish Balay #define pcshellsetname_ pcshellsetname 32e63f14baSBarry Smith #define pcshellgetname_ pcshellgetname 336895c445SBarry Smith #define pcshellsetcontext_ pcshellsetcontext 346895c445SBarry Smith #define pcshellgetcontext_ pcshellgetcontext 35e54e4138SSatish Balay #endif 36e54e4138SSatish Balay 37e54e4138SSatish Balay /* These are not extern C because they are passed into non-extern C user level functions */ 386891c3e4SJed Brown static PetscErrorCode ourshellapply(PC pc,Vec x,Vec y) 39e54e4138SSatish Balay { 40e54e4138SSatish Balay PetscErrorCode ierr = 0; 416891c3e4SJed Brown (*(void (PETSC_STDCALL *)(PC*,Vec*,Vec*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[0]))(&pc,&x,&y,&ierr);CHKERRQ(ierr); 42e54e4138SSatish Balay return 0; 43e54e4138SSatish Balay } 44e54e4138SSatish Balay 45*1b581b66SBarry Smith static PetscErrorCode ourshellapplysymmetricleft(PC pc,Vec x,Vec y) 46*1b581b66SBarry Smith { 47*1b581b66SBarry Smith PetscErrorCode ierr = 0; 48*1b581b66SBarry Smith (*(void (PETSC_STDCALL *)(PC*,Vec*,Vec*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[9]))(&pc,&x,&y,&ierr);CHKERRQ(ierr); 49*1b581b66SBarry Smith return 0; 50*1b581b66SBarry Smith } 51*1b581b66SBarry Smith 52*1b581b66SBarry Smith static PetscErrorCode ourshellapplysymmetricright(PC pc,Vec x,Vec y) 53*1b581b66SBarry Smith { 54*1b581b66SBarry Smith PetscErrorCode ierr = 0; 55*1b581b66SBarry Smith (*(void (PETSC_STDCALL *)(PC*,Vec*,Vec*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[10]))(&pc,&x,&y,&ierr);CHKERRQ(ierr); 56*1b581b66SBarry Smith return 0; 57*1b581b66SBarry Smith } 58*1b581b66SBarry Smith 59fe81eab7SBarry Smith static PetscErrorCode ourshellapplyctx(PC pc,Vec x,Vec y) 60fe81eab7SBarry Smith { 61fe81eab7SBarry Smith PetscErrorCode ierr = 0; 62fe81eab7SBarry Smith void *ctx; 63fe81eab7SBarry Smith ierr = PCShellGetContext(pc,&ctx);CHKERRQ(ierr); 64fe81eab7SBarry Smith (*(void (PETSC_STDCALL *)(PC*,void*,Vec*,Vec*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[0]))(&pc,ctx,&x,&y,&ierr);CHKERRQ(ierr); 65fe81eab7SBarry Smith return 0; 66fe81eab7SBarry Smith } 67fe81eab7SBarry Smith 68ccf40c83SElliott Sales de Andrade static PetscErrorCode ourshellapplyba(PC pc,PCSide side,Vec x,Vec y,Vec work) 69ccf40c83SElliott Sales de Andrade { 70ccf40c83SElliott Sales de Andrade PetscErrorCode ierr = 0; 71ccf40c83SElliott Sales de Andrade (*(void (PETSC_STDCALL *)(PC*,PCSide*,Vec*,Vec*,Vec*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[1]))(&pc,&side,&x,&y,&work,&ierr);CHKERRQ(ierr); 72ccf40c83SElliott Sales de Andrade return 0; 73ccf40c83SElliott Sales de Andrade } 74ccf40c83SElliott Sales de Andrade 75ace3abfcSBarry 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) 76e54e4138SSatish Balay { 77e54e4138SSatish Balay PetscErrorCode ierr = 0; 78ccf40c83SElliott Sales de Andrade (*(void (PETSC_STDCALL *)(PC*,Vec*,Vec*,Vec*,PetscReal*,PetscReal*,PetscReal*,PetscInt*,PetscBool *,PetscInt*,PCRichardsonConvergedReason*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[2]))(&pc,&x,&y,&w,&rtol,&abstol,&dtol,&m,&guesszero,outits,reason,&ierr);CHKERRQ(ierr); 79e54e4138SSatish Balay return 0; 80e54e4138SSatish Balay } 81e54e4138SSatish Balay 826891c3e4SJed Brown static PetscErrorCode ourshellapplytranspose(PC pc,Vec x,Vec y) 83e54e4138SSatish Balay { 84e54e4138SSatish Balay PetscErrorCode ierr = 0; 85ccf40c83SElliott Sales de Andrade (*(void (PETSC_STDCALL *)(void*,Vec*,Vec*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[3]))(&pc,&x,&y,&ierr);CHKERRQ(ierr); 86e54e4138SSatish Balay return 0; 87e54e4138SSatish Balay } 88e54e4138SSatish Balay 896891c3e4SJed Brown static PetscErrorCode ourshellsetup(PC pc) 90e54e4138SSatish Balay { 91e54e4138SSatish Balay PetscErrorCode ierr = 0; 92ccf40c83SElliott Sales de Andrade (*(void (PETSC_STDCALL *)(PC*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[4]))(&pc,&ierr);CHKERRQ(ierr); 93e54e4138SSatish Balay return 0; 94e54e4138SSatish Balay } 95e54e4138SSatish Balay 96fe81eab7SBarry Smith static PetscErrorCode ourshellsetupctx(PC pc) 97fe81eab7SBarry Smith { 98fe81eab7SBarry Smith PetscErrorCode ierr = 0; 99fe81eab7SBarry Smith void *ctx; 100fe81eab7SBarry Smith ierr = PCShellGetContext(pc,&ctx);CHKERRQ(ierr); 10148cdcd6bSElliott Sales de Andrade (*(void (PETSC_STDCALL *)(PC*,void*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[4]))(&pc,ctx,&ierr);CHKERRQ(ierr); 102fe81eab7SBarry Smith return 0; 103fe81eab7SBarry Smith } 104fe81eab7SBarry Smith 1056891c3e4SJed Brown static PetscErrorCode ourshelldestroy(PC pc) 1067c54600cSBarry Smith { 1077c54600cSBarry Smith PetscErrorCode ierr = 0; 108ccf40c83SElliott Sales de Andrade (*(void (PETSC_STDCALL *)(void*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[5]))(&pc,&ierr);CHKERRQ(ierr); 1097c54600cSBarry Smith return 0; 1107c54600cSBarry Smith } 1117c54600cSBarry Smith 112a425a105SElliott Sales de Andrade static PetscErrorCode ourshellpresolve(PC pc,KSP ksp,Vec x,Vec y) 113a425a105SElliott Sales de Andrade { 114a425a105SElliott Sales de Andrade PetscErrorCode ierr = 0; 115ccf40c83SElliott Sales de Andrade (*(void (PETSC_STDCALL *)(PC*,KSP*,Vec*,Vec*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[6]))(&pc,&ksp,&x,&y,&ierr);CHKERRQ(ierr); 116a425a105SElliott Sales de Andrade return 0; 117a425a105SElliott Sales de Andrade } 118a425a105SElliott Sales de Andrade 119a425a105SElliott Sales de Andrade static PetscErrorCode ourshellpostsolve(PC pc,KSP ksp,Vec x,Vec y) 120a425a105SElliott Sales de Andrade { 121a425a105SElliott Sales de Andrade PetscErrorCode ierr = 0; 122ccf40c83SElliott Sales de Andrade (*(void (PETSC_STDCALL *)(PC*,KSP*,Vec*,Vec*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[7]))(&pc,&ksp,&x,&y,&ierr);CHKERRQ(ierr); 123a425a105SElliott Sales de Andrade return 0; 124a425a105SElliott Sales de Andrade } 125a425a105SElliott Sales de Andrade 1262f519dc9SElliott Sales de Andrade static PetscErrorCode ourshellview(PC pc,PetscViewer view) 1272f519dc9SElliott Sales de Andrade { 1282f519dc9SElliott Sales de Andrade PetscErrorCode ierr = 0; 1292f519dc9SElliott Sales de Andrade (*(void (PETSC_STDCALL *)(PC*,PetscViewer*,PetscErrorCode*))(((PetscObject)pc)->fortran_func_pointers[8]))(&pc,&view,&ierr);CHKERRQ(ierr); 130e54e4138SSatish Balay return 0; 131e54e4138SSatish Balay } 132e54e4138SSatish Balay 1338cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL pcshellgetcontext_(PC *pc,void **ctx,PetscErrorCode *ierr) 134e54e4138SSatish Balay { 1356891c3e4SJed Brown *ierr = PCShellGetContext(*pc,ctx); 136e54e4138SSatish Balay } 137e54e4138SSatish Balay 1388cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL pcshellsetapply_(PC *pc,void (PETSC_STDCALL *apply)(void*,Vec*,Vec*,PetscErrorCode*),PetscErrorCode *ierr) 139e54e4138SSatish Balay { 140*1b581b66SBarry Smith PetscObjectAllocateFortranPointers(*pc,11); 1416891c3e4SJed Brown ((PetscObject)*pc)->fortran_func_pointers[0] = (PetscVoidFunction)apply; 1422fa5cd67SKarl Rupp 1436891c3e4SJed Brown *ierr = PCShellSetApply(*pc,ourshellapply); 1446895c445SBarry Smith } 1456895c445SBarry Smith 146*1b581b66SBarry Smith PETSC_EXTERN void PETSC_STDCALL pcshellsetapplysymmetricleft_(PC *pc,void (PETSC_STDCALL *apply)(void*,Vec*,Vec*,PetscErrorCode*),PetscErrorCode *ierr) 147*1b581b66SBarry Smith { 148*1b581b66SBarry Smith PetscObjectAllocateFortranPointers(*pc,11); 149*1b581b66SBarry Smith ((PetscObject)*pc)->fortran_func_pointers[9] = (PetscVoidFunction)apply; 150*1b581b66SBarry Smith 151*1b581b66SBarry Smith *ierr = PCShellSetApplySymmetricLeft(*pc,ourshellapplysymmetricleft); 152*1b581b66SBarry Smith } 153*1b581b66SBarry Smith 154*1b581b66SBarry Smith PETSC_EXTERN void PETSC_STDCALL pcshellsetapplysymmetricright_(PC *pc,void (PETSC_STDCALL *apply)(void*,Vec*,Vec*,PetscErrorCode*),PetscErrorCode *ierr) 155*1b581b66SBarry Smith { 156*1b581b66SBarry Smith PetscObjectAllocateFortranPointers(*pc,11); 157*1b581b66SBarry Smith ((PetscObject)*pc)->fortran_func_pointers[10] = (PetscVoidFunction)apply; 158*1b581b66SBarry Smith 159*1b581b66SBarry Smith *ierr = PCShellSetApplySymmetricRight(*pc,ourshellapplysymmetricright); 160*1b581b66SBarry Smith } 161*1b581b66SBarry Smith 162fe81eab7SBarry Smith PETSC_EXTERN void PETSC_STDCALL pcshellsetapplyctx_(PC *pc,void (PETSC_STDCALL *apply)(void*,void*,Vec*,Vec*,PetscErrorCode*),PetscErrorCode *ierr) 163fe81eab7SBarry Smith { 164*1b581b66SBarry Smith PetscObjectAllocateFortranPointers(*pc,11); 165fe81eab7SBarry Smith ((PetscObject)*pc)->fortran_func_pointers[0] = (PetscVoidFunction)apply; 166fe81eab7SBarry Smith 167fe81eab7SBarry Smith *ierr = PCShellSetApply(*pc,ourshellapplyctx); 168fe81eab7SBarry Smith } 169fe81eab7SBarry Smith 170ccf40c83SElliott Sales de Andrade PETSC_EXTERN void PETSC_STDCALL pcshellsetapplyba_(PC *pc,void (PETSC_STDCALL *apply)(void*,PCSide*,Vec*,Vec*,Vec*,PetscErrorCode*),PetscErrorCode *ierr) 171ccf40c83SElliott Sales de Andrade { 172*1b581b66SBarry Smith PetscObjectAllocateFortranPointers(*pc,11); 173ccf40c83SElliott Sales de Andrade ((PetscObject)*pc)->fortran_func_pointers[1] = (PetscVoidFunction)apply; 174ccf40c83SElliott Sales de Andrade 175ccf40c83SElliott Sales de Andrade *ierr = PCShellSetApplyBA(*pc,ourshellapplyba); 176ccf40c83SElliott Sales de Andrade } 177ccf40c83SElliott Sales de Andrade 1788cc058d9SJed 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) 1796895c445SBarry Smith { 180*1b581b66SBarry Smith PetscObjectAllocateFortranPointers(*pc,11); 181ccf40c83SElliott Sales de Andrade ((PetscObject)*pc)->fortran_func_pointers[2] = (PetscVoidFunction)apply; 1826891c3e4SJed Brown *ierr = PCShellSetApplyRichardson(*pc,ourapplyrichardson); 1836895c445SBarry Smith } 1846895c445SBarry Smith 1858cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL pcshellsetapplytranspose_(PC *pc,void (PETSC_STDCALL *applytranspose)(void*,Vec *,Vec *,PetscErrorCode*), PetscErrorCode *ierr) 1866895c445SBarry Smith { 187*1b581b66SBarry Smith PetscObjectAllocateFortranPointers(*pc,11); 188ccf40c83SElliott Sales de Andrade ((PetscObject)*pc)->fortran_func_pointers[3] = (PetscVoidFunction)applytranspose; 1892fa5cd67SKarl Rupp 1906891c3e4SJed Brown *ierr = PCShellSetApplyTranspose(*pc,ourshellapplytranspose); 191e54e4138SSatish Balay } 192e54e4138SSatish Balay 193fe81eab7SBarry Smith PETSC_EXTERN void PETSC_STDCALL pcshellsetsetupctx_(PC *pc,void (PETSC_STDCALL *setup)(void*,void*,PetscErrorCode*),PetscErrorCode *ierr) 194fe81eab7SBarry Smith { 195*1b581b66SBarry Smith PetscObjectAllocateFortranPointers(*pc,11); 19648cdcd6bSElliott Sales de Andrade ((PetscObject)*pc)->fortran_func_pointers[4] = (PetscVoidFunction)setup; 197fe81eab7SBarry Smith 198fe81eab7SBarry Smith *ierr = PCShellSetSetUp(*pc,ourshellsetupctx); 199fe81eab7SBarry Smith } 200fe81eab7SBarry Smith 2018cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL pcshellsetsetup_(PC *pc,void (PETSC_STDCALL *setup)(void*,PetscErrorCode*),PetscErrorCode *ierr) 202e54e4138SSatish Balay { 203*1b581b66SBarry Smith PetscObjectAllocateFortranPointers(*pc,11); 204ccf40c83SElliott Sales de Andrade ((PetscObject)*pc)->fortran_func_pointers[4] = (PetscVoidFunction)setup; 2052fa5cd67SKarl Rupp 2066891c3e4SJed Brown *ierr = PCShellSetSetUp(*pc,ourshellsetup); 207e54e4138SSatish Balay } 208e54e4138SSatish Balay 2098cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL pcshellsetdestroy_(PC *pc,void (PETSC_STDCALL *setup)(void*,PetscErrorCode*),PetscErrorCode *ierr) 2107c54600cSBarry Smith { 211*1b581b66SBarry Smith PetscObjectAllocateFortranPointers(*pc,11); 212ccf40c83SElliott Sales de Andrade ((PetscObject)*pc)->fortran_func_pointers[5] = (PetscVoidFunction)setup; 2132fa5cd67SKarl Rupp 2146891c3e4SJed Brown *ierr = PCShellSetDestroy(*pc,ourshelldestroy); 2157c54600cSBarry Smith } 2167c54600cSBarry Smith 217a425a105SElliott Sales de Andrade PETSC_EXTERN void PETSC_STDCALL pcshellsetpresolve_(PC *pc,void (PETSC_STDCALL *presolve)(void*,void*,Vec*,Vec*,PetscErrorCode*),PetscErrorCode *ierr) 218a425a105SElliott Sales de Andrade { 219*1b581b66SBarry Smith PetscObjectAllocateFortranPointers(*pc,11); 220ccf40c83SElliott Sales de Andrade ((PetscObject)*pc)->fortran_func_pointers[6] = (PetscVoidFunction)presolve; 221a425a105SElliott Sales de Andrade 222a425a105SElliott Sales de Andrade *ierr = PCShellSetPreSolve(*pc,ourshellpresolve); 223a425a105SElliott Sales de Andrade } 224a425a105SElliott Sales de Andrade 225a425a105SElliott Sales de Andrade PETSC_EXTERN void PETSC_STDCALL pcshellsetpostsolve_(PC *pc,void (PETSC_STDCALL *postsolve)(void*,void*,Vec*,Vec*,PetscErrorCode*),PetscErrorCode *ierr) 226a425a105SElliott Sales de Andrade { 227*1b581b66SBarry Smith PetscObjectAllocateFortranPointers(*pc,11); 228ccf40c83SElliott Sales de Andrade ((PetscObject)*pc)->fortran_func_pointers[7] = (PetscVoidFunction)postsolve; 229a425a105SElliott Sales de Andrade 230a425a105SElliott Sales de Andrade *ierr = PCShellSetPostSolve(*pc,ourshellpostsolve); 231a425a105SElliott Sales de Andrade } 232a425a105SElliott Sales de Andrade 2332f519dc9SElliott Sales de Andrade PETSC_EXTERN void PETSC_STDCALL pcshellsetview_(PC *pc,void (PETSC_STDCALL *view)(void*,PetscViewer*,PetscErrorCode*),PetscErrorCode *ierr) 2342f519dc9SElliott Sales de Andrade { 235*1b581b66SBarry Smith PetscObjectAllocateFortranPointers(*pc,11); 2362f519dc9SElliott Sales de Andrade ((PetscObject)*pc)->fortran_func_pointers[8] = (PetscVoidFunction)view; 2372f519dc9SElliott Sales de Andrade 2382f519dc9SElliott Sales de Andrade *ierr = PCShellSetView(*pc,ourshellview); 2392f519dc9SElliott Sales de Andrade } 2402f519dc9SElliott Sales de Andrade 2418cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL pcshellsetname_(PC *pc,CHAR name PETSC_MIXED_LEN(len), PetscErrorCode *ierr PETSC_END_LEN(len)) 2421d2e4005SSatish Balay { 2431d2e4005SSatish Balay char *c; 2441d2e4005SSatish Balay FIXCHAR(name,len,c); 2451d2e4005SSatish Balay *ierr = PCShellSetName(*pc,c); 2461d2e4005SSatish Balay FREECHAR(name,c); 2471d2e4005SSatish Balay } 2481d2e4005SSatish Balay 2498cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL pcshellgetname_(PC *pc,CHAR name PETSC_MIXED_LEN(len), PetscErrorCode *ierr PETSC_END_LEN(len)) 250e63f14baSBarry Smith { 251ccaf0856SBarry Smith const char *c; 252e63f14baSBarry Smith 253e63f14baSBarry Smith *ierr = PCShellGetName(*pc,&c);if (*ierr) return; 254e63f14baSBarry Smith *ierr = PetscStrncpy(name,c,len); 255e63f14baSBarry Smith } 256e63f14baSBarry Smith 257e54e4138SSatish Balay /* -----------------------------------------------------------------*/ 258e54e4138SSatish Balay 259