1c6db04a5SJed Brown #include <private/fortranimpl.h> 2c6db04a5SJed Brown #include <petscsnes.h> 38e27ec22SSatish Balay 48e27ec22SSatish Balay #if defined(PETSC_HAVE_FORTRAN_CAPS) 5df66969eSBarry Smith #define matmffdcomputejacobian_ MATMFFDCOMPUTEJACOBIAN 66ce558aeSBarry Smith #define snessolve_ SNESSOLVE 78e27ec22SSatish Balay #define snesdefaultcomputejacobian_ SNESDEFAULTCOMPUTEJACOBIAN 88e27ec22SSatish Balay #define snesdefaultcomputejacobiancolor_ SNESDEFAULTCOMPUTEJACOBIANCOLOR 98e27ec22SSatish Balay #define snesdacomputejacobian_ SNESDACOMPUTEJACOBIAN 108e27ec22SSatish Balay #define snesdacomputejacobianwithadifor_ SNESDACOMPUTEJACOBIANWITHADIFOR 118e27ec22SSatish Balay #define snessetjacobian_ SNESSETJACOBIAN 128e27ec22SSatish Balay #define snesgetoptionsprefix_ SNESGETOPTIONSPREFIX 138e27ec22SSatish Balay #define snesgettype_ SNESGETTYPE 148e27ec22SSatish Balay #define snesdaformfunction_ SNESDAFORMFUNCTION 158e27ec22SSatish Balay #define snessetfunction_ SNESSETFUNCTION 16*c79ef259SPeter Brune #define snessetgs_ SNESSETGS 178e27ec22SSatish Balay #define snesgetfunction_ SNESGETFUNCTION 18*c79ef259SPeter Brune #define snesgetgs_ SNESGETGS 198e27ec22SSatish Balay #define snessetconvergencetest_ SNESSETCONVERGENCETEST 203f149594SLisandro Dalcin #define snesdefaultconverged_ SNESDEFAULTCONVERGED 213f149594SLisandro Dalcin #define snesskipconverged_ SNESSKIPCONVERGED 228e27ec22SSatish Balay #define snesview_ SNESVIEW 238e27ec22SSatish Balay #define snesgetconvergencehistory_ SNESGETCONVERGENCEHISTORY 248e27ec22SSatish Balay #define snesgetjacobian_ SNESGETJACOBIAN 258e27ec22SSatish Balay #define snessettype_ SNESSETTYPE 268e27ec22SSatish Balay #define snesappendoptionsprefix_ SNESAPPENDOPTIONSPREFIX 278e27ec22SSatish Balay #define snessetoptionsprefix_ SNESSETOPTIONSPREFIX 28a6570f20SBarry Smith #define snesmonitordefault_ SNESMONITORDEFAULT 29a6570f20SBarry Smith #define snesmonitorsolution_ SNESMONITORSOLUTION 30a6570f20SBarry Smith #define snesmonitorlg_ SNESMONITORLG 31a6570f20SBarry Smith #define snesmonitorsolutionupdate_ SNESMONITORSOLUTIONUPDATE 32a6570f20SBarry Smith #define snesmonitorset_ SNESMONITORSET 338e27ec22SSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE) 34df66969eSBarry Smith #define matmffdcomputejacobian_ matmffdcomputejacobian 356ce558aeSBarry Smith #define snessolve_ snessolve 368e27ec22SSatish Balay #define snesdefaultcomputejacobian_ snesdefaultcomputejacobian 378e27ec22SSatish Balay #define snesdefaultcomputejacobiancolor_ snesdefaultcomputejacobiancolor 388e27ec22SSatish Balay #define snesdacomputejacobian_ snesdacomputejacobian 398e27ec22SSatish Balay #define snesdacomputejacobianwithadifor_ snesdacomputejacobianwithadifor 408e27ec22SSatish Balay #define snessetjacobian_ snessetjacobian 418e27ec22SSatish Balay #define snesgetoptionsprefix_ snesgetoptionsprefix 428e27ec22SSatish Balay #define snesgettype_ snesgettype 438e27ec22SSatish Balay #define snesdaformfunction_ snesdaformfunction 448e27ec22SSatish Balay #define snessetfunction_ snessetfunction 45*c79ef259SPeter Brune #define snessetgs_ snessetgs 468e27ec22SSatish Balay #define snesgetfunction_ snesgetfunction 47*c79ef259SPeter Brune #define snesgetgs_ snesgetgs 488e27ec22SSatish Balay #define snessetconvergencetest_ snessetconvergencetest 493f149594SLisandro Dalcin #define snesdefaultconverged_ snesdefaultconverged 503f149594SLisandro Dalcin #define snesskipconverged_ snesskipconverged 518e27ec22SSatish Balay #define snesview_ snesview 528e27ec22SSatish Balay #define snesgetjacobian_ snesgetjacobian 538e27ec22SSatish Balay #define snesgetconvergencehistory_ snesgetconvergencehistory 548e27ec22SSatish Balay #define snessettype_ snessettype 558e27ec22SSatish Balay #define snesappendoptionsprefix_ snesappendoptionsprefix 568e27ec22SSatish Balay #define snessetoptionsprefix_ snessetoptionsprefix 57a6570f20SBarry Smith #define snesmonitorlg_ snesmonitorlg 58a6570f20SBarry Smith #define snesmonitordefault_ snesmonitordefault 59a6570f20SBarry Smith #define snesmonitorsolution_ snesmonitorsolution 60a6570f20SBarry Smith #define snesmonitorsolutionupdate_ snesmonitorsolutionupdate 61a6570f20SBarry Smith #define snesmonitorset_ snesmonitorset 628e27ec22SSatish Balay #endif 638e27ec22SSatish Balay 648e27ec22SSatish Balay static PetscErrorCode oursnesfunction(SNES snes,Vec x,Vec f,void *ctx) 658e27ec22SSatish Balay { 668e27ec22SSatish Balay PetscErrorCode ierr = 0; 67b8ebb45fSBarry Smith (*(void (PETSC_STDCALL *)(SNES*,Vec*,Vec*,void*,PetscErrorCode*))(((PetscObject)snes)->fortran_func_pointers[0]))(&snes,&x,&f,ctx,&ierr);CHKERRQ(ierr); 688e27ec22SSatish Balay return 0; 698e27ec22SSatish Balay } 70b8ebb45fSBarry Smith 7106ee9f85SBarry Smith static PetscErrorCode oursnestest(SNES snes,PetscInt it,PetscReal a,PetscReal d,PetscReal c,SNESConvergedReason*reason,void*ctx) 728e27ec22SSatish Balay { 738e27ec22SSatish Balay PetscErrorCode ierr = 0; 746895c445SBarry Smith void *mctx = (void*) ((PetscObject)snes)->fortran_func_pointers[11]; 756895c445SBarry Smith (*(void (PETSC_STDCALL *)(SNES*,PetscInt*,PetscReal*,PetscReal*,PetscReal*,SNESConvergedReason*,void*,PetscErrorCode*))(((PetscObject)snes)->fortran_func_pointers[1]))(&snes,&it,&a,&d,&c,reason,mctx,&ierr);CHKERRQ(ierr); 767f7931b9SBarry Smith return 0; 777f7931b9SBarry Smith } 787f7931b9SBarry Smith 797f7931b9SBarry Smith static PetscErrorCode ourdestroy(void*ctx) 807f7931b9SBarry Smith { 817f7931b9SBarry Smith PetscErrorCode ierr = 0; 827f7931b9SBarry Smith SNES snes = (SNES)ctx; 836895c445SBarry Smith void *mctx = (void*) ((PetscObject)snes)->fortran_func_pointers[11]; 846895c445SBarry Smith (*(void (PETSC_STDCALL *)(void*,PetscErrorCode*))(((PetscObject)snes)->fortran_func_pointers[10]))(mctx,&ierr);CHKERRQ(ierr); 858e27ec22SSatish Balay return 0; 868e27ec22SSatish Balay } 878e27ec22SSatish Balay 888e27ec22SSatish Balay static PetscErrorCode oursnesjacobian(SNES snes,Vec x,Mat* m,Mat* p,MatStructure* type,void*ctx) 898e27ec22SSatish Balay { 908e27ec22SSatish Balay PetscErrorCode ierr = 0; 91b8ebb45fSBarry Smith (*(void (PETSC_STDCALL *)(SNES*,Vec*,Mat*,Mat*,MatStructure*,void*,PetscErrorCode*))(((PetscObject)snes)->fortran_func_pointers[2]))(&snes,&x,m,p,type,ctx,&ierr);CHKERRQ(ierr); 928e27ec22SSatish Balay return 0; 938e27ec22SSatish Balay } 948e27ec22SSatish Balay static PetscErrorCode oursnesmonitor(SNES snes,PetscInt i,PetscReal d,void*ctx) 958e27ec22SSatish Balay { 968e27ec22SSatish Balay PetscErrorCode ierr = 0; 978e27ec22SSatish Balay 986895c445SBarry Smith void *mctx = (void*)((PetscObject)snes)->fortran_func_pointers[4]; 996895c445SBarry Smith (*(void (PETSC_STDCALL *)(SNES*,PetscInt*,PetscReal*,void*,PetscErrorCode*))(((PetscObject)snes)->fortran_func_pointers[3]))(&snes,&i,&d,mctx,&ierr);CHKERRQ(ierr); 1008e27ec22SSatish Balay return 0; 1018e27ec22SSatish Balay } 102c2efdce3SBarry Smith static PetscErrorCode ourmondestroy(void** ctx) 1038e27ec22SSatish Balay { 1048e27ec22SSatish Balay PetscErrorCode ierr = 0; 105c2efdce3SBarry Smith SNES snes = *(SNES*)ctx; 1066895c445SBarry Smith void *mctx = (void*) ((PetscObject)snes)->fortran_func_pointers[4]; 1076895c445SBarry Smith (*(void (PETSC_STDCALL *)(void*,PetscErrorCode*))(((PetscObject)snes)->fortran_func_pointers[5]))(mctx,&ierr);CHKERRQ(ierr); 1088e27ec22SSatish Balay return 0; 1098e27ec22SSatish Balay } 1108e27ec22SSatish Balay 1118e27ec22SSatish Balay EXTERN_C_BEGIN 1128e27ec22SSatish Balay /* ---------------------------------------------------------*/ 1138e27ec22SSatish Balay /* 1148e27ec22SSatish Balay snesdefaultcomputejacobian() and snesdefaultcomputejacobiancolor() 1158e27ec22SSatish Balay These can be used directly from Fortran but are mostly so that 1168e27ec22SSatish Balay Fortran SNESSetJacobian() will properly handle the defaults being passed in. 1178e27ec22SSatish Balay 1188e27ec22SSatish Balay functions, hence no STDCALL 1198e27ec22SSatish Balay */ 120df66969eSBarry Smith void matmffdcomputejacobian_(SNES *snes,Vec *x,Mat *m,Mat *p,MatStructure* type,void *ctx,PetscErrorCode *ierr) 121df66969eSBarry Smith { 122df66969eSBarry Smith *ierr = MatMFFDComputeJacobian(*snes,*x,m,p,type,ctx); 123df66969eSBarry Smith } 1248e27ec22SSatish Balay void snesdefaultcomputejacobian_(SNES *snes,Vec *x,Mat *m,Mat *p,MatStructure* type,void *ctx,PetscErrorCode *ierr) 1258e27ec22SSatish Balay { 1268e27ec22SSatish Balay *ierr = SNESDefaultComputeJacobian(*snes,*x,m,p,type,ctx); 1278e27ec22SSatish Balay } 1288e27ec22SSatish Balay void snesdefaultcomputejacobiancolor_(SNES *snes,Vec *x,Mat *m,Mat *p,MatStructure* type,void *ctx,PetscErrorCode *ierr) 1298e27ec22SSatish Balay { 1308e27ec22SSatish Balay *ierr = SNESDefaultComputeJacobianColor(*snes,*x,m,p,type,*(MatFDColoring*)ctx); 1318e27ec22SSatish Balay } 1328e27ec22SSatish Balay 1338e27ec22SSatish Balay void snesdacomputejacobianwithadifor_(SNES *snes,Vec *X,Mat *m,Mat *p,MatStructure* type,void *ctx,PetscErrorCode *ierr) 1348e27ec22SSatish Balay { 1358e27ec22SSatish Balay (*PetscErrorPrintf)("Cannot call this function from Fortran"); 1368e27ec22SSatish Balay *ierr = 1; 1378e27ec22SSatish Balay } 1388e27ec22SSatish Balay 1398e27ec22SSatish Balay void snesdacomputejacobian_(SNES *snes,Vec *X,Mat *m,Mat *p,MatStructure* type,void *ctx,PetscErrorCode *ierr) 1408e27ec22SSatish Balay { 1418e27ec22SSatish Balay (*PetscErrorPrintf)("Cannot call this function from Fortran"); 1428e27ec22SSatish Balay *ierr = 1; 1438e27ec22SSatish Balay } 1448e27ec22SSatish Balay 1458e27ec22SSatish Balay void PETSC_STDCALL snessetjacobian_(SNES *snes,Mat *A,Mat *B,void (PETSC_STDCALL *func)(SNES*,Vec*,Mat*,Mat*, 1468e27ec22SSatish Balay MatStructure*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr) 1478e27ec22SSatish Balay { 1488e27ec22SSatish Balay CHKFORTRANNULLOBJECT(ctx); 149f5b6597dSBarry Smith CHKFORTRANNULLFUNCTION(func); 1507f7931b9SBarry Smith PetscObjectAllocateFortranPointers(*snes,12); 151f68b968cSBarry Smith if ((PetscVoidFunction)func == (PetscVoidFunction)snesdefaultcomputejacobian_) { 1528e27ec22SSatish Balay *ierr = SNESSetJacobian(*snes,*A,*B,SNESDefaultComputeJacobian,ctx); 153f68b968cSBarry Smith } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesdefaultcomputejacobiancolor_) { 1548e27ec22SSatish Balay *ierr = SNESSetJacobian(*snes,*A,*B,SNESDefaultComputeJacobianColor,*(MatFDColoring*)ctx); 155f68b968cSBarry Smith } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesdacomputejacobianwithadifor_) { 1568e27ec22SSatish Balay *ierr = SNESSetJacobian(*snes,*A,*B,SNESDAComputeJacobianWithAdifor,ctx); 157f68b968cSBarry Smith } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesdacomputejacobian_) { 1588e27ec22SSatish Balay *ierr = SNESSetJacobian(*snes,*A,*B,SNESDAComputeJacobian,ctx); 159df66969eSBarry Smith } else if ((PetscVoidFunction)func == (PetscVoidFunction)matmffdcomputejacobian_) { 160df66969eSBarry Smith *ierr = SNESSetJacobian(*snes,*A,*B,MatMFFDComputeJacobian,ctx); 161f5b6597dSBarry Smith } else if (!func) { 162f5b6597dSBarry Smith *ierr = SNESSetJacobian(*snes,*A,*B,0,ctx); 1638e27ec22SSatish Balay } else { 164b8ebb45fSBarry Smith ((PetscObject)*snes)->fortran_func_pointers[2] = (PetscVoidFunction)func; 1658e27ec22SSatish Balay *ierr = SNESSetJacobian(*snes,*A,*B,oursnesjacobian,ctx); 1668e27ec22SSatish Balay } 1678e27ec22SSatish Balay } 1688e27ec22SSatish Balay /* -------------------------------------------------------------*/ 1698e27ec22SSatish Balay 1706ce558aeSBarry Smith void PETSC_STDCALL snessolve_(SNES *snes,Vec *b,Vec *x, int *__ierr ) 1716ce558aeSBarry Smith { 1726ce558aeSBarry Smith Vec B = *b; 1736ce558aeSBarry Smith if (*b == PETSC_NULL_OBJECT_Fortran) B = PETSC_NULL; 1746ce558aeSBarry Smith *__ierr = SNESSolve(*snes,B,*x); 1756ce558aeSBarry Smith } 1766ce558aeSBarry Smith 177e1d034e4SBarry Smith void PETSC_STDCALL snesgetoptionsprefix_(SNES *snes,CHAR prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len)) 1788e27ec22SSatish Balay { 1798e27ec22SSatish Balay const char *tname; 1808e27ec22SSatish Balay 1818e27ec22SSatish Balay *ierr = SNESGetOptionsPrefix(*snes,&tname); 1828e27ec22SSatish Balay *ierr = PetscStrncpy(prefix,tname,len);if (*ierr) return; 1838e27ec22SSatish Balay } 1848e27ec22SSatish Balay 1857f7931b9SBarry Smith void PETSC_STDCALL snesgettype_(SNES *snes,CHAR name PETSC_MIXED_LEN(len), PetscErrorCode *ierr PETSC_END_LEN(len)) 1868e27ec22SSatish Balay { 1878e27ec22SSatish Balay const char *tname; 1888e27ec22SSatish Balay 1898e27ec22SSatish Balay *ierr = SNESGetType(*snes,&tname); 1908e27ec22SSatish Balay *ierr = PetscStrncpy(name,tname,len);if (*ierr) return; 1917c363081SBarry Smith FIXRETURNCHAR(PETSC_TRUE,name,len); 1928e27ec22SSatish Balay } 193e3da1266SHong Zhang 1948e27ec22SSatish Balay /* ---------------------------------------------------------*/ 1958e27ec22SSatish Balay 1968e27ec22SSatish Balay /* 1978e27ec22SSatish Balay These are not usually called from Fortran but allow Fortran users 1988e27ec22SSatish Balay to transparently set these monitors from .F code 1998e27ec22SSatish Balay 2008e27ec22SSatish Balay functions, hence no STDCALL 2018e27ec22SSatish Balay */ 2028e27ec22SSatish Balay void snesdaformfunction_(SNES *snes,Vec *X, Vec *F,void *ptr,PetscErrorCode *ierr) 2038e27ec22SSatish Balay { 2048e27ec22SSatish Balay *ierr = SNESDAFormFunction(*snes,*X,*F,ptr); 2058e27ec22SSatish Balay } 2068e27ec22SSatish Balay 2072613ca53SBarry Smith void PETSC_STDCALL snessetfunction_(SNES *snes,Vec *r,void (PETSC_STDCALL *func)(SNES*,Vec*,Vec*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr) 2088e27ec22SSatish Balay { 2098e27ec22SSatish Balay CHKFORTRANNULLOBJECT(ctx); 2107f7931b9SBarry Smith PetscObjectAllocateFortranPointers(*snes,12); 211f68b968cSBarry Smith if ((PetscVoidFunction)func == (PetscVoidFunction)snesdaformfunction_) { 2128e27ec22SSatish Balay *ierr = SNESSetFunction(*snes,*r,SNESDAFormFunction,ctx); 2138e27ec22SSatish Balay } else { 214b8ebb45fSBarry Smith ((PetscObject)*snes)->fortran_func_pointers[0] = (PetscVoidFunction)func; 2158e27ec22SSatish Balay *ierr = SNESSetFunction(*snes,*r,oursnesfunction,ctx); 2168e27ec22SSatish Balay } 2178e27ec22SSatish Balay } 218*c79ef259SPeter Brune 219*c79ef259SPeter Brune 220*c79ef259SPeter Brune void PETSC_STDCALL snessetgs_(SNES *snes,void (PETSC_STDCALL *func)(SNES*,Vec*,Vec*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr) 221*c79ef259SPeter Brune { 222*c79ef259SPeter Brune CHKFORTRANNULLOBJECT(ctx); 223*c79ef259SPeter Brune PetscObjectAllocateFortranPointers(*snes,12); 224*c79ef259SPeter Brune if ((PetscVoidFunction)func == (PetscVoidFunction)snesdaformfunction_) { 225*c79ef259SPeter Brune *ierr = SNESSetGS(*snes,SNESDAFormFunction,ctx); 226*c79ef259SPeter Brune } else { 227*c79ef259SPeter Brune ((PetscObject)*snes)->fortran_func_pointers[0] = (PetscVoidFunction)func; 228*c79ef259SPeter Brune *ierr = SNESSetGS(*snes,oursnesfunction,ctx); 229*c79ef259SPeter Brune } 230*c79ef259SPeter Brune } 2318e27ec22SSatish Balay /* ---------------------------------------------------------*/ 2328e27ec22SSatish Balay 2338e27ec22SSatish Balay /* the func argument is ignored */ 2348e27ec22SSatish Balay void PETSC_STDCALL snesgetfunction_(SNES *snes,Vec *r,void *func,void **ctx,PetscErrorCode *ierr) 2358e27ec22SSatish Balay { 2368e27ec22SSatish Balay CHKFORTRANNULLINTEGER(ctx); 2378e27ec22SSatish Balay CHKFORTRANNULLOBJECT(r); 2388e27ec22SSatish Balay *ierr = SNESGetFunction(*snes,r,PETSC_NULL,ctx); 2398e27ec22SSatish Balay } 240*c79ef259SPeter Brune 241*c79ef259SPeter Brune void PETSC_STDCALL snesgetgs_(SNES *snes,void *func,void **ctx,PetscErrorCode *ierr) 242*c79ef259SPeter Brune { 243*c79ef259SPeter Brune CHKFORTRANNULLINTEGER(ctx); 244*c79ef259SPeter Brune *ierr = SNESGetGS(*snes,PETSC_NULL,ctx); 245*c79ef259SPeter Brune } 246*c79ef259SPeter Brune 2478e27ec22SSatish Balay /*----------------------------------------------------------------------*/ 2488e27ec22SSatish Balay 2497f7931b9SBarry Smith void snesdefaultconverged_(SNES *snes,PetscInt *it,PetscReal *a,PetscReal *b,PetscReal *c,SNESConvergedReason *r, void *ct,PetscErrorCode *ierr) 2503f149594SLisandro Dalcin { 2513f149594SLisandro Dalcin *ierr = SNESDefaultConverged(*snes,*it,*a,*b,*c,r,ct); 2523f149594SLisandro Dalcin } 2533f149594SLisandro Dalcin 2543f149594SLisandro Dalcin void snesskipconverged_(SNES *snes,PetscInt *it,PetscReal *a,PetscReal *b,PetscReal *c,SNESConvergedReason *r, 2553f149594SLisandro Dalcin void *ct,PetscErrorCode *ierr) 2563f149594SLisandro Dalcin { 2573f149594SLisandro Dalcin *ierr = SNESSkipConverged(*snes,*it,*a,*b,*c,r,ct); 2583f149594SLisandro Dalcin } 2593f149594SLisandro Dalcin 2607f7931b9SBarry Smith void PETSC_STDCALL snessetconvergencetest_(SNES *snes,void (PETSC_STDCALL *func)(SNES*,PetscInt*,PetscReal*,PetscReal*,PetscReal*,SNESConvergedReason*,void*,PetscErrorCode*), void *cctx,void (PETSC_STDCALL *destroy)(void*),PetscErrorCode *ierr) 2618e27ec22SSatish Balay { 2628e27ec22SSatish Balay CHKFORTRANNULLOBJECT(cctx); 2633f22127dSBarry Smith CHKFORTRANNULLFUNCTION(destroy); 2647f7931b9SBarry Smith PetscObjectAllocateFortranPointers(*snes,12); 2653f149594SLisandro Dalcin 2663f149594SLisandro Dalcin if ((PetscVoidFunction)func == (PetscVoidFunction)snesdefaultconverged_){ 2677f7931b9SBarry Smith *ierr = SNESSetConvergenceTest(*snes,SNESDefaultConverged,0,0); 2683f149594SLisandro Dalcin } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesskipconverged_){ 2697f7931b9SBarry Smith *ierr = SNESSetConvergenceTest(*snes,SNESSkipConverged,0,0); 2708e27ec22SSatish Balay } else { 271b8ebb45fSBarry Smith ((PetscObject)*snes)->fortran_func_pointers[1] = (PetscVoidFunction)func; 2727f7931b9SBarry Smith ((PetscObject)*snes)->fortran_func_pointers[11] = (PetscVoidFunction)cctx; 2733f22127dSBarry Smith if (!destroy) { 2747f7931b9SBarry Smith *ierr = SNESSetConvergenceTest(*snes,oursnestest,*snes,PETSC_NULL); 2757f7931b9SBarry Smith } else { 2767f7931b9SBarry Smith ((PetscObject)*snes)->fortran_func_pointers[10] = (PetscVoidFunction)destroy; 2777f7931b9SBarry Smith *ierr = SNESSetConvergenceTest(*snes,oursnestest,*snes,ourdestroy); 2787f7931b9SBarry Smith } 2798e27ec22SSatish Balay } 2808e27ec22SSatish Balay } 2818e27ec22SSatish Balay /*----------------------------------------------------------------------*/ 2828e27ec22SSatish Balay 2838e27ec22SSatish Balay void PETSC_STDCALL snesview_(SNES *snes,PetscViewer *viewer, PetscErrorCode *ierr) 2848e27ec22SSatish Balay { 2858e27ec22SSatish Balay PetscViewer v; 2868e27ec22SSatish Balay PetscPatchDefaultViewers_Fortran(viewer,v); 2878e27ec22SSatish Balay *ierr = SNESView(*snes,v); 2888e27ec22SSatish Balay } 2898e27ec22SSatish Balay 2908e27ec22SSatish Balay /* func is currently ignored from Fortran */ 2918e27ec22SSatish Balay void PETSC_STDCALL snesgetjacobian_(SNES *snes,Mat *A,Mat *B,int *func,void **ctx,PetscErrorCode *ierr) 2928e27ec22SSatish Balay { 2938e27ec22SSatish Balay CHKFORTRANNULLINTEGER(ctx); 2948e27ec22SSatish Balay CHKFORTRANNULLOBJECT(A); 2958e27ec22SSatish Balay CHKFORTRANNULLOBJECT(B); 2968e27ec22SSatish Balay *ierr = SNESGetJacobian(*snes,A,B,0,ctx); 2978e27ec22SSatish Balay } 2988e27ec22SSatish Balay 2998e27ec22SSatish Balay void PETSC_STDCALL snesgetconvergencehistory_(SNES *snes,PetscInt *na,PetscErrorCode *ierr) 3008e27ec22SSatish Balay { 3018e27ec22SSatish Balay *ierr = SNESGetConvergenceHistory(*snes,PETSC_NULL,PETSC_NULL,na); 3028e27ec22SSatish Balay } 3038e27ec22SSatish Balay 3047f7931b9SBarry Smith void PETSC_STDCALL snessettype_(SNES *snes,CHAR type PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len)) 3058e27ec22SSatish Balay { 3068e27ec22SSatish Balay char *t; 3078e27ec22SSatish Balay 3088e27ec22SSatish Balay FIXCHAR(type,len,t); 3098e27ec22SSatish Balay *ierr = SNESSetType(*snes,t); 3108e27ec22SSatish Balay FREECHAR(type,t); 3118e27ec22SSatish Balay } 3128e27ec22SSatish Balay 3137f7931b9SBarry Smith void PETSC_STDCALL snesappendoptionsprefix_(SNES *snes,CHAR prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len)) 3148e27ec22SSatish Balay { 3158e27ec22SSatish Balay char *t; 3168e27ec22SSatish Balay 3178e27ec22SSatish Balay FIXCHAR(prefix,len,t); 3188e27ec22SSatish Balay *ierr = SNESAppendOptionsPrefix(*snes,t); 3198e27ec22SSatish Balay FREECHAR(prefix,t); 3208e27ec22SSatish Balay } 3218e27ec22SSatish Balay 3227f7931b9SBarry Smith void PETSC_STDCALL snessetoptionsprefix_(SNES *snes,CHAR prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len)) 3238e27ec22SSatish Balay { 3248e27ec22SSatish Balay char *t; 3258e27ec22SSatish Balay 3268e27ec22SSatish Balay FIXCHAR(prefix,len,t); 3278e27ec22SSatish Balay *ierr = SNESSetOptionsPrefix(*snes,t); 3288e27ec22SSatish Balay FREECHAR(prefix,t); 3298e27ec22SSatish Balay } 3308e27ec22SSatish Balay 3318e27ec22SSatish Balay /*----------------------------------------------------------------------*/ 3328e27ec22SSatish Balay /* functions, hence no STDCALL */ 3338e27ec22SSatish Balay 334a6570f20SBarry Smith void snesmonitorlg_(SNES *snes,PetscInt *its,PetscReal *fgnorm,void *dummy,PetscErrorCode *ierr) 3358e27ec22SSatish Balay { 336a6570f20SBarry Smith *ierr = SNESMonitorLG(*snes,*its,*fgnorm,dummy); 3378e27ec22SSatish Balay } 3388e27ec22SSatish Balay 339a6570f20SBarry Smith void snesmonitordefault_(SNES *snes,PetscInt *its,PetscReal *fgnorm,void *dummy,PetscErrorCode *ierr) 3408e27ec22SSatish Balay { 341a6570f20SBarry Smith *ierr = SNESMonitorDefault(*snes,*its,*fgnorm,dummy); 3428e27ec22SSatish Balay } 3438e27ec22SSatish Balay 344a6570f20SBarry Smith void snesmonitorsolution_(SNES *snes,PetscInt *its,PetscReal *fgnorm,void *dummy,PetscErrorCode *ierr) 3458e27ec22SSatish Balay { 346a6570f20SBarry Smith *ierr = SNESMonitorSolution(*snes,*its,*fgnorm,dummy); 3478e27ec22SSatish Balay } 3488e27ec22SSatish Balay 349a6570f20SBarry Smith void snesmonitorsolutionupdate_(SNES *snes,PetscInt *its,PetscReal *fgnorm,void *dummy,PetscErrorCode *ierr) 3508e27ec22SSatish Balay { 351a6570f20SBarry Smith *ierr = SNESMonitorSolutionUpdate(*snes,*its,*fgnorm,dummy); 3528e27ec22SSatish Balay } 3538e27ec22SSatish Balay 3548e27ec22SSatish Balay 3556895c445SBarry Smith void PETSC_STDCALL snesmonitorset_(SNES *snes,void (PETSC_STDCALL *func)(SNES*,PetscInt*,PetscReal*,void*,PetscErrorCode*),void *mctx,void (PETSC_STDCALL *mondestroy)(void*,PetscErrorCode*),PetscErrorCode *ierr) 3568e27ec22SSatish Balay { 3578e27ec22SSatish Balay CHKFORTRANNULLOBJECT(mctx); 3587f7931b9SBarry Smith PetscObjectAllocateFortranPointers(*snes,12); 359a6570f20SBarry Smith if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitordefault_) { 360a6570f20SBarry Smith *ierr = SNESMonitorSet(*snes,SNESMonitorDefault,0,0); 361a6570f20SBarry Smith } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorsolution_) { 362a6570f20SBarry Smith *ierr = SNESMonitorSet(*snes,SNESMonitorSolution,0,0); 363a6570f20SBarry Smith } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorsolutionupdate_) { 364a6570f20SBarry Smith *ierr = SNESMonitorSet(*snes,SNESMonitorSolutionUpdate,0,0); 365a6570f20SBarry Smith } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorlg_) { 366a6570f20SBarry Smith *ierr = SNESMonitorSet(*snes,SNESMonitorLG,0,0); 3678e27ec22SSatish Balay } else { 368b8ebb45fSBarry Smith ((PetscObject)*snes)->fortran_func_pointers[3] = (PetscVoidFunction)func; 369b8ebb45fSBarry Smith ((PetscObject)*snes)->fortran_func_pointers[4] = (PetscVoidFunction)mctx; 370b8ebb45fSBarry Smith 3718e27ec22SSatish Balay if (FORTRANNULLFUNCTION(mondestroy)){ 3727f7931b9SBarry Smith *ierr = SNESMonitorSet(*snes,oursnesmonitor,*snes,PETSC_NULL); 3738e27ec22SSatish Balay } else { 3745d4ebb51SBarry Smith CHKFORTRANNULLFUNCTION(mondestroy); 375b8ebb45fSBarry Smith ((PetscObject)*snes)->fortran_func_pointers[5] = (PetscVoidFunction)mondestroy; 376b8ebb45fSBarry Smith *ierr = SNESMonitorSet(*snes,oursnesmonitor,*snes,ourmondestroy); 3778e27ec22SSatish Balay } 3788e27ec22SSatish Balay } 3798e27ec22SSatish Balay } 3808e27ec22SSatish Balay 3818e27ec22SSatish Balay 3828e27ec22SSatish Balay 3838e27ec22SSatish Balay EXTERN_C_END 384