1af0996ceSBarry Smith #include <petsc/private/fortranimpl.h> 2c6db04a5SJed Brown #include <petscsnes.h> 3665c2dedSJed Brown #include <petscviewer.h> 48ad9143bSBarry Smith #include <petsc/private/f90impl.h> 58e27ec22SSatish Balay 68e27ec22SSatish Balay #if defined(PETSC_HAVE_FORTRAN_CAPS) 7df66969eSBarry Smith #define matmffdcomputejacobian_ MATMFFDCOMPUTEJACOBIAN 86ce558aeSBarry Smith #define snessolve_ SNESSOLVE 98d359177SBarry Smith #define snescomputejacobiandefault_ SNESCOMPUTEJACOBIANDEFAULT 108d359177SBarry Smith #define snescomputejacobiandefaultcolor_ SNESCOMPUTEJACOBIANDEFAULTCOLOR 118e27ec22SSatish Balay #define snessetjacobian_ SNESSETJACOBIAN 128e27ec22SSatish Balay #define snesgetoptionsprefix_ SNESGETOPTIONSPREFIX 138e27ec22SSatish Balay #define snesgettype_ SNESGETTYPE 148e27ec22SSatish Balay #define snessetfunction_ SNESSETFUNCTION 15be95d8f1SBarry Smith #define snessetngs_ SNESSETNGS 16dfef22ccSBarry Smith #define snessetupdate_ SNESSETUPDATE 178e27ec22SSatish Balay #define snesgetfunction_ SNESGETFUNCTION 18be95d8f1SBarry Smith #define snesgetngs_ SNESGETNGS 198e27ec22SSatish Balay #define snessetconvergencetest_ SNESSETCONVERGENCETEST 208d359177SBarry Smith #define snesconvergeddefault_ SNESCONVERGEDDEFAULT 21e07f7f94SSatish Balay #define snesconvergedskip_ SNESCONVERGEDSKIP 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 304619e776SBarry Smith #define snesmonitorlgresidualnorm_ SNESMONITORLGRESIDUALNORM 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 368d359177SBarry Smith #define snescomputejacobiandefault_ snescomputejacobiandefault 378d359177SBarry Smith #define snescomputejacobiandefaultcolor_ snescomputejacobiandefaultcolor 388e27ec22SSatish Balay #define snessetjacobian_ snessetjacobian 398e27ec22SSatish Balay #define snesgetoptionsprefix_ snesgetoptionsprefix 408e27ec22SSatish Balay #define snesgettype_ snesgettype 418e27ec22SSatish Balay #define snessetfunction_ snessetfunction 42be95d8f1SBarry Smith #define snessetngs_ snessetngs 43dfef22ccSBarry Smith #define snessetupdate_ snessetupdate 448e27ec22SSatish Balay #define snesgetfunction_ snesgetfunction 45be95d8f1SBarry Smith #define snesgetngs_ snesgetngs 468e27ec22SSatish Balay #define snessetconvergencetest_ snessetconvergencetest 478d359177SBarry Smith #define snesconvergeddefault_ snesconvergeddefault 48e07f7f94SSatish Balay #define snesconvergedskip_ snesconvergedskip 498e27ec22SSatish Balay #define snesview_ snesview 508e27ec22SSatish Balay #define snesgetjacobian_ snesgetjacobian 518e27ec22SSatish Balay #define snesgetconvergencehistory_ snesgetconvergencehistory 528e27ec22SSatish Balay #define snessettype_ snessettype 538e27ec22SSatish Balay #define snesappendoptionsprefix_ snesappendoptionsprefix 548e27ec22SSatish Balay #define snessetoptionsprefix_ snessetoptionsprefix 554619e776SBarry Smith #define snesmonitorlgresidualnorm_ snesmonitorlgresidualnorm 56a6570f20SBarry Smith #define snesmonitordefault_ snesmonitordefault 57a6570f20SBarry Smith #define snesmonitorsolution_ snesmonitorsolution 58a6570f20SBarry Smith #define snesmonitorsolutionupdate_ snesmonitorsolutionupdate 59a6570f20SBarry Smith #define snesmonitorset_ snesmonitorset 608e27ec22SSatish Balay #endif 618e27ec22SSatish Balay 62f6291634SJed Brown static struct { 63f6291634SJed Brown PetscFortranCallbackId function; 64f6291634SJed Brown PetscFortranCallbackId test; 65f6291634SJed Brown PetscFortranCallbackId destroy; 66f6291634SJed Brown PetscFortranCallbackId jacobian; 67f6291634SJed Brown PetscFortranCallbackId monitor; 68f6291634SJed Brown PetscFortranCallbackId mondestroy; 69be95d8f1SBarry Smith PetscFortranCallbackId ngs; 70dfef22ccSBarry Smith PetscFortranCallbackId update; 7189e00c7dSSatish Balay #if defined(PETSC_HAVE_F90_2PTR_ARG) 7289e00c7dSSatish Balay PetscFortranCallbackId function_pgiptr; 7389e00c7dSSatish Balay #endif 74f6291634SJed Brown } _cb; 7590b77ac2SPeter Brune 768e27ec22SSatish Balay static PetscErrorCode oursnesfunction(SNES snes,Vec x,Vec f,void *ctx) 778e27ec22SSatish Balay { 7889e00c7dSSatish Balay #if defined(PETSC_HAVE_F90_2PTR_ARG) 7989e00c7dSSatish Balay void* ptr; 8089e00c7dSSatish Balay PetscObjectGetFortranCallback((PetscObject)snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.function_pgiptr,NULL,&ptr); 8189e00c7dSSatish Balay #endif 8289e00c7dSSatish Balay PetscObjectUseFortranCallback(snes,_cb.function,(SNES*,Vec*,Vec*,void*,PetscErrorCode* PETSC_F90_2PTR_PROTO_NOVAR),(&snes,&x,&f,_ctx,&ierr PETSC_F90_2PTR_PARAM(ptr))); 838e27ec22SSatish Balay } 84b8ebb45fSBarry Smith 8506ee9f85SBarry Smith static PetscErrorCode oursnestest(SNES snes,PetscInt it,PetscReal a,PetscReal d,PetscReal c,SNESConvergedReason *reason,void *ctx) 868e27ec22SSatish Balay { 87f6291634SJed Brown PetscObjectUseFortranCallback(snes,_cb.test,(SNES*,PetscInt*,PetscReal*,PetscReal*,PetscReal*,SNESConvergedReason*,void*,PetscErrorCode*),(&snes,&it,&a,&d,&c,reason,_ctx,&ierr)); 887f7931b9SBarry Smith } 897f7931b9SBarry Smith 907f7931b9SBarry Smith static PetscErrorCode ourdestroy(void *ctx) 917f7931b9SBarry Smith { 92f6291634SJed Brown PetscObjectUseFortranCallback(ctx,_cb.destroy,(void*,PetscErrorCode*),(_ctx,&ierr)); 938e27ec22SSatish Balay } 948e27ec22SSatish Balay 95d1e9a80fSBarry Smith static PetscErrorCode oursnesjacobian(SNES snes,Vec x,Mat m,Mat p,void *ctx) 968e27ec22SSatish Balay { 97d1e9a80fSBarry Smith PetscObjectUseFortranCallback(snes,_cb.jacobian,(SNES*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),(&snes,&x,&m,&p,_ctx,&ierr)); 988e27ec22SSatish Balay } 99f6291634SJed Brown 100dfef22ccSBarry Smith static PetscErrorCode oursnesupdate(SNES snes,PetscInt i) 101dfef22ccSBarry Smith { 102dfef22ccSBarry Smith PetscObjectUseFortranCallback(snes,_cb.update,(SNES*,PetscInt *,PetscErrorCode*),(&snes,&i,&ierr)); 103dfef22ccSBarry Smith } 104be95d8f1SBarry Smith static PetscErrorCode oursnesngs(SNES snes,Vec x,Vec b,void *ctx) 10590b77ac2SPeter Brune { 106be95d8f1SBarry Smith PetscObjectUseFortranCallback(snes,_cb.ngs,(SNES*,Vec*,Vec*,void*,PetscErrorCode*),(&snes,&x,&b,_ctx,&ierr)); 10790b77ac2SPeter Brune } 1088e27ec22SSatish Balay static PetscErrorCode oursnesmonitor(SNES snes,PetscInt i,PetscReal d,void *ctx) 1098e27ec22SSatish Balay { 110f6291634SJed Brown PetscObjectUseFortranCallback(snes,_cb.monitor,(SNES*,PetscInt*,PetscReal*,void*,PetscErrorCode*),(&snes,&i,&d,_ctx,&ierr)); 1118e27ec22SSatish Balay } 112c2efdce3SBarry Smith static PetscErrorCode ourmondestroy(void **ctx) 1138e27ec22SSatish Balay { 114f6291634SJed Brown SNES snes = (SNES)*ctx; 115f6291634SJed Brown PetscObjectUseFortranCallback(snes,_cb.mondestroy,(void*,PetscErrorCode*),(_ctx,&ierr)); 1168e27ec22SSatish Balay } 1178e27ec22SSatish Balay 1188e27ec22SSatish Balay /* ---------------------------------------------------------*/ 1198e27ec22SSatish Balay /* 1208d359177SBarry Smith snescomputejacobiandefault() and snescomputejacobiandefaultcolor() 1218e27ec22SSatish Balay These can be used directly from Fortran but are mostly so that 1228e27ec22SSatish Balay Fortran SNESSetJacobian() will properly handle the defaults being passed in. 1238e27ec22SSatish Balay 1248e27ec22SSatish Balay functions, hence no STDCALL 1258e27ec22SSatish Balay */ 126d1e9a80fSBarry Smith PETSC_EXTERN void matmffdcomputejacobian_(SNES *snes,Vec *x,Mat *m,Mat *p,void *ctx,PetscErrorCode *ierr) 127df66969eSBarry Smith { 128d1e9a80fSBarry Smith *ierr = MatMFFDComputeJacobian(*snes,*x,*m,*p,ctx); 129df66969eSBarry Smith } 130d1e9a80fSBarry Smith PETSC_EXTERN void snescomputejacobiandefault_(SNES *snes,Vec *x,Mat *m,Mat *p,void *ctx,PetscErrorCode *ierr) 1318e27ec22SSatish Balay { 132d1e9a80fSBarry Smith *ierr = SNESComputeJacobianDefault(*snes,*x,*m,*p,ctx); 1338e27ec22SSatish Balay } 134d1e9a80fSBarry Smith PETSC_EXTERN void snescomputejacobiandefaultcolor_(SNES *snes,Vec *x,Mat *m,Mat *p,void *ctx,PetscErrorCode *ierr) 1358e27ec22SSatish Balay { 136d1e9a80fSBarry Smith *ierr = SNESComputeJacobianDefaultColor(*snes,*x,*m,*p,*(MatFDColoring*)ctx); 1378e27ec22SSatish Balay } 1388e27ec22SSatish Balay 1398cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snessetjacobian_(SNES *snes,Mat *A,Mat *B, 140d1e9a80fSBarry Smith void (PETSC_STDCALL *func)(SNES*,Vec*,Mat*,Mat*,void*,PetscErrorCode*), 141f5af7f23SKarl Rupp void *ctx,PetscErrorCode *ierr) 1428e27ec22SSatish Balay { 143f5b6597dSBarry Smith CHKFORTRANNULLFUNCTION(func); 1448d359177SBarry Smith if ((PetscVoidFunction)func == (PetscVoidFunction)snescomputejacobiandefault_) { 1458d359177SBarry Smith *ierr = SNESSetJacobian(*snes,*A,*B,SNESComputeJacobianDefault,ctx); 1468d359177SBarry Smith } else if ((PetscVoidFunction)func == (PetscVoidFunction)snescomputejacobiandefaultcolor_) { 147e025ade3SBarry Smith if (!ctx) { 148e025ade3SBarry Smith *ierr = PETSC_ERR_ARG_NULL; 149e025ade3SBarry Smith return; 150e025ade3SBarry Smith } 1518d359177SBarry Smith *ierr = SNESSetJacobian(*snes,*A,*B,SNESComputeJacobianDefaultColor,*(MatFDColoring*)ctx); 152df66969eSBarry Smith } else if ((PetscVoidFunction)func == (PetscVoidFunction)matmffdcomputejacobian_) { 153df66969eSBarry Smith *ierr = SNESSetJacobian(*snes,*A,*B,MatMFFDComputeJacobian,ctx); 1548e27ec22SSatish Balay } else { 155f6291634SJed Brown *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.jacobian,(PetscVoidFunction)func,ctx); 1560298fd71SBarry Smith if (!*ierr) *ierr = SNESSetJacobian(*snes,*A,*B,oursnesjacobian,NULL); 1578e27ec22SSatish Balay } 1588e27ec22SSatish Balay } 1598e27ec22SSatish Balay /* -------------------------------------------------------------*/ 1608e27ec22SSatish Balay 1611b266c99SBarry Smith PETSC_EXTERN void PETSC_STDCALL snessolve_(SNES *snes,Vec *b,Vec *x, int *ierr) 1626ce558aeSBarry Smith { 1631b266c99SBarry Smith CHKFORTRANNULLOBJECTDEREFERENCE(b); 1641b266c99SBarry Smith CHKFORTRANNULLOBJECTDEREFERENCE(x); 1651b266c99SBarry Smith *ierr = SNESSolve(*snes,*b,*x); 1666ce558aeSBarry Smith } 1676ce558aeSBarry Smith 168390e1bf2SBarry Smith PETSC_EXTERN void PETSC_STDCALL snesgetoptionsprefix_(SNES *snes,char* prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len)) 1698e27ec22SSatish Balay { 1708e27ec22SSatish Balay const char *tname; 1718e27ec22SSatish Balay 1728e27ec22SSatish Balay *ierr = SNESGetOptionsPrefix(*snes,&tname); 1738e27ec22SSatish Balay *ierr = PetscStrncpy(prefix,tname,len);if (*ierr) return; 174d6a8cea5SBarry Smith FIXRETURNCHAR(PETSC_TRUE,prefix,len); 1758e27ec22SSatish Balay } 1768e27ec22SSatish Balay 177390e1bf2SBarry Smith PETSC_EXTERN void PETSC_STDCALL snesgettype_(SNES *snes,char* name PETSC_MIXED_LEN(len), PetscErrorCode *ierr PETSC_END_LEN(len)) 1788e27ec22SSatish Balay { 1798e27ec22SSatish Balay const char *tname; 1808e27ec22SSatish Balay 1818e27ec22SSatish Balay *ierr = SNESGetType(*snes,&tname); 1828e27ec22SSatish Balay *ierr = PetscStrncpy(name,tname,len);if (*ierr) return; 1837c363081SBarry Smith FIXRETURNCHAR(PETSC_TRUE,name,len); 1848e27ec22SSatish Balay } 185e3da1266SHong Zhang 1868e27ec22SSatish Balay /* ---------------------------------------------------------*/ 1878e27ec22SSatish Balay 1888e27ec22SSatish Balay /* 1898e27ec22SSatish Balay These are not usually called from Fortran but allow Fortran users 1908e27ec22SSatish Balay to transparently set these monitors from .F code 1918e27ec22SSatish Balay 1928e27ec22SSatish Balay functions, hence no STDCALL 1938e27ec22SSatish Balay */ 1948e27ec22SSatish Balay 19589e00c7dSSatish Balay PETSC_EXTERN void PETSC_STDCALL snessetfunction_(SNES *snes,Vec *r,void (PETSC_STDCALL *func)(SNES*,Vec*,Vec*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(ptr)) 1968e27ec22SSatish Balay { 197aecf964fSBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.function,(PetscVoidFunction)func,ctx);if (*ierr) return; 19889e00c7dSSatish Balay #if defined(PETSC_HAVE_F90_2PTR_ARG) 199aecf964fSBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.function_pgiptr,NULL,ptr);if (*ierr) return; 20089e00c7dSSatish Balay #endif 201aecf964fSBarry Smith *ierr = SNESSetFunction(*snes,*r,oursnesfunction,NULL); 2028e27ec22SSatish Balay } 203c79ef259SPeter Brune 204c79ef259SPeter Brune 205be95d8f1SBarry Smith PETSC_EXTERN void PETSC_STDCALL snessetngs_(SNES *snes,void (PETSC_STDCALL *func)(SNES*,Vec*,Vec*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr) 206c79ef259SPeter Brune { 207aecf964fSBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.ngs,(PetscVoidFunction)func,ctx);if (*ierr) return; 208aecf964fSBarry Smith *ierr = SNESSetNGS(*snes,oursnesngs,NULL); 209c79ef259SPeter Brune } 210dfef22ccSBarry Smith PETSC_EXTERN void PETSC_STDCALL snessetupdate_(SNES *snes,void (PETSC_STDCALL *func)(SNES*,PetscInt*,PetscErrorCode*),PetscErrorCode *ierr) 211dfef22ccSBarry Smith { 212aecf964fSBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.update,(PetscVoidFunction)func,NULL);if (*ierr) return; 213aecf964fSBarry Smith *ierr = SNESSetUpdate(*snes,oursnesupdate); 214dfef22ccSBarry Smith } 2158e27ec22SSatish Balay /* ---------------------------------------------------------*/ 2168e27ec22SSatish Balay 2178e27ec22SSatish Balay /* the func argument is ignored */ 218*146935d7SSatish Balay PETSC_EXTERN void PETSC_STDCALL snesgetfunction_(SNES *snes,Vec *r,void (PETSC_STDCALL *func)(SNES,Vec,Vec,void*),void **ctx,PetscErrorCode *ierr) 2198e27ec22SSatish Balay { 2208e27ec22SSatish Balay CHKFORTRANNULLOBJECT(r); 2210298fd71SBarry Smith *ierr = SNESGetFunction(*snes,r,NULL,NULL); if (*ierr) return; 222*146935d7SSatish Balay if ((PetscVoidFunction)func == (PetscVoidFunction)PETSC_NULL_FUNCTION_Fortran) return; 2230298fd71SBarry Smith *ierr = PetscObjectGetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.function,NULL,ctx); 2248e27ec22SSatish Balay } 225c79ef259SPeter Brune 226be95d8f1SBarry Smith PETSC_EXTERN void PETSC_STDCALL snesgetngs_(SNES *snes,void *func,void **ctx,PetscErrorCode *ierr) 227c79ef259SPeter Brune { 228be95d8f1SBarry Smith *ierr = PetscObjectGetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.ngs,NULL,ctx); 229c79ef259SPeter Brune } 230c79ef259SPeter Brune 2318e27ec22SSatish Balay /*----------------------------------------------------------------------*/ 2328e27ec22SSatish Balay 23369c1e2abSSatish Balay PETSC_EXTERN void snesconvergeddefault_(SNES *snes,PetscInt *it,PetscReal *a,PetscReal *b,PetscReal *c,SNESConvergedReason *r, void *ct,PetscErrorCode *ierr) 2343f149594SLisandro Dalcin { 2358d359177SBarry Smith *ierr = SNESConvergedDefault(*snes,*it,*a,*b,*c,r,ct); 2363f149594SLisandro Dalcin } 2373f149594SLisandro Dalcin 238e07f7f94SSatish Balay PETSC_EXTERN void snesconvergedskip_(SNES *snes,PetscInt *it,PetscReal *a,PetscReal *b,PetscReal *c,SNESConvergedReason *r,void *ct,PetscErrorCode *ierr) 2393f149594SLisandro Dalcin { 240e2a6519dSDmitry Karpeev *ierr = SNESConvergedSkip(*snes,*it,*a,*b,*c,r,ct); 2413f149594SLisandro Dalcin } 2423f149594SLisandro Dalcin 2438cc058d9SJed Brown PETSC_EXTERN 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) 2448e27ec22SSatish Balay { 2458e27ec22SSatish Balay CHKFORTRANNULLOBJECT(cctx); 2463f22127dSBarry Smith CHKFORTRANNULLFUNCTION(destroy); 2473f149594SLisandro Dalcin 2488d359177SBarry Smith if ((PetscVoidFunction)func == (PetscVoidFunction)snesconvergeddefault_) { 2498d359177SBarry Smith *ierr = SNESSetConvergenceTest(*snes,SNESConvergedDefault,0,0); 250e07f7f94SSatish Balay } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesconvergedskip_) { 251e2a6519dSDmitry Karpeev *ierr = SNESSetConvergenceTest(*snes,SNESConvergedSkip,0,0); 2528e27ec22SSatish Balay } else { 253aecf964fSBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.test,(PetscVoidFunction)func,cctx);if (*ierr) return; 254aecf964fSBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.destroy,(PetscVoidFunction)destroy,cctx);if (*ierr) return; 255aecf964fSBarry Smith *ierr = SNESSetConvergenceTest(*snes,oursnestest,*snes,ourdestroy); 2568e27ec22SSatish Balay } 2578e27ec22SSatish Balay } 2588e27ec22SSatish Balay /*----------------------------------------------------------------------*/ 2598e27ec22SSatish Balay 2608cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snesview_(SNES *snes,PetscViewer *viewer, PetscErrorCode *ierr) 2618e27ec22SSatish Balay { 2628e27ec22SSatish Balay PetscViewer v; 2638e27ec22SSatish Balay PetscPatchDefaultViewers_Fortran(viewer,v); 2648e27ec22SSatish Balay *ierr = SNESView(*snes,v); 2658e27ec22SSatish Balay } 2668e27ec22SSatish Balay 2678e27ec22SSatish Balay /* func is currently ignored from Fortran */ 2688cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snesgetjacobian_(SNES *snes,Mat *A,Mat *B,int *func,void **ctx,PetscErrorCode *ierr) 2698e27ec22SSatish Balay { 2708e27ec22SSatish Balay CHKFORTRANNULLINTEGER(ctx); 2718e27ec22SSatish Balay CHKFORTRANNULLOBJECT(A); 2728e27ec22SSatish Balay CHKFORTRANNULLOBJECT(B); 2730298fd71SBarry Smith *ierr = SNESGetJacobian(*snes,A,B,0,NULL); if (*ierr) return; 2740298fd71SBarry Smith *ierr = PetscObjectGetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.jacobian,NULL,ctx); 275f2e0d3f1SJed Brown 2768e27ec22SSatish Balay } 2778e27ec22SSatish Balay 2788cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snesgetconvergencehistory_(SNES *snes,PetscInt *na,PetscErrorCode *ierr) 2798e27ec22SSatish Balay { 2800298fd71SBarry Smith *ierr = SNESGetConvergenceHistory(*snes,NULL,NULL,na); 2818e27ec22SSatish Balay } 2828e27ec22SSatish Balay 283390e1bf2SBarry Smith PETSC_EXTERN void PETSC_STDCALL snessettype_(SNES *snes,char* type PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len)) 2848e27ec22SSatish Balay { 2858e27ec22SSatish Balay char *t; 2868e27ec22SSatish Balay 2878e27ec22SSatish Balay FIXCHAR(type,len,t); 2888e27ec22SSatish Balay *ierr = SNESSetType(*snes,t); 2898e27ec22SSatish Balay FREECHAR(type,t); 2908e27ec22SSatish Balay } 2918e27ec22SSatish Balay 292390e1bf2SBarry Smith PETSC_EXTERN void PETSC_STDCALL snesappendoptionsprefix_(SNES *snes,char* prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len)) 2938e27ec22SSatish Balay { 2948e27ec22SSatish Balay char *t; 2958e27ec22SSatish Balay 2968e27ec22SSatish Balay FIXCHAR(prefix,len,t); 2978e27ec22SSatish Balay *ierr = SNESAppendOptionsPrefix(*snes,t); 2988e27ec22SSatish Balay FREECHAR(prefix,t); 2998e27ec22SSatish Balay } 3008e27ec22SSatish Balay 301390e1bf2SBarry Smith PETSC_EXTERN void PETSC_STDCALL snessetoptionsprefix_(SNES *snes,char* prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len)) 3028e27ec22SSatish Balay { 3038e27ec22SSatish Balay char *t; 3048e27ec22SSatish Balay 3058e27ec22SSatish Balay FIXCHAR(prefix,len,t); 3068e27ec22SSatish Balay *ierr = SNESSetOptionsPrefix(*snes,t); 3078e27ec22SSatish Balay FREECHAR(prefix,t); 3088e27ec22SSatish Balay } 3098e27ec22SSatish Balay 3108e27ec22SSatish Balay /*----------------------------------------------------------------------*/ 3118e27ec22SSatish Balay /* functions, hence no STDCALL */ 3128e27ec22SSatish Balay 3139611d799SBarry Smith PETSC_EXTERN void snesmonitorlgresidualnorm_(SNES *snes,PetscInt *its,PetscReal *fgnorm,PetscObject *dummy,PetscErrorCode *ierr) 3148e27ec22SSatish Balay { 3154619e776SBarry Smith *ierr = SNESMonitorLGResidualNorm(*snes,*its,*fgnorm,dummy); 3168e27ec22SSatish Balay } 3178e27ec22SSatish Balay 31852f0073cSBarry Smith PETSC_EXTERN void snesmonitordefault_(SNES *snes,PetscInt *its,PetscReal *fgnorm,PetscViewerAndFormat **dummy,PetscErrorCode *ierr) 3198e27ec22SSatish Balay { 320410efd14SBarry Smith *ierr = SNESMonitorDefault(*snes,*its,*fgnorm,*dummy); 3218e27ec22SSatish Balay } 3228e27ec22SSatish Balay 32352f0073cSBarry Smith PETSC_EXTERN void snesmonitorsolution_(SNES *snes,PetscInt *its,PetscReal *fgnorm,PetscViewerAndFormat **dummy,PetscErrorCode *ierr) 3248e27ec22SSatish Balay { 325410efd14SBarry Smith *ierr = SNESMonitorSolution(*snes,*its,*fgnorm,*dummy); 3268e27ec22SSatish Balay } 3278e27ec22SSatish Balay 32852f0073cSBarry Smith PETSC_EXTERN void snesmonitorsolutionupdate_(SNES *snes,PetscInt *its,PetscReal *fgnorm,PetscViewerAndFormat **dummy,PetscErrorCode *ierr) 3298e27ec22SSatish Balay { 330410efd14SBarry Smith *ierr = SNESMonitorSolutionUpdate(*snes,*its,*fgnorm,*dummy); 3318e27ec22SSatish Balay } 3328e27ec22SSatish Balay 3338e27ec22SSatish Balay 3348cc058d9SJed Brown PETSC_EXTERN 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) 3358e27ec22SSatish Balay { 3368e27ec22SSatish Balay CHKFORTRANNULLOBJECT(mctx); 337aecf964fSBarry Smith CHKFORTRANNULLFUNCTION(mondestroy); 338a6570f20SBarry Smith if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitordefault_) { 3391cb03803SBarry Smith *ierr = SNESMonitorSet(*snes,(PetscErrorCode (*)(SNES,PetscInt,PetscReal,void*))SNESMonitorDefault,*(PetscViewerAndFormat**)mctx,(PetscErrorCode (*)(void **))PetscViewerAndFormatDestroy); 340a6570f20SBarry Smith } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorsolution_) { 3411cb03803SBarry Smith *ierr = SNESMonitorSet(*snes,(PetscErrorCode (*)(SNES,PetscInt,PetscReal,void*))SNESMonitorSolution,*(PetscViewerAndFormat**)mctx,(PetscErrorCode (*)(void **))PetscViewerAndFormatDestroy); 342a6570f20SBarry Smith } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorsolutionupdate_) { 3431cb03803SBarry Smith *ierr = SNESMonitorSet(*snes,(PetscErrorCode (*)(SNES,PetscInt,PetscReal,void*))SNESMonitorSolutionUpdate,*(PetscViewerAndFormat**)mctx,(PetscErrorCode (*)(void **))PetscViewerAndFormatDestroy); 3444619e776SBarry Smith } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorlgresidualnorm_) { 3453e7ff0edSBarry Smith *ierr = SNESMonitorSet(*snes,(PetscErrorCode (*)(SNES,PetscInt,PetscReal,void*))SNESMonitorLGResidualNorm,0,0); 3468e27ec22SSatish Balay } else { 347aecf964fSBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.monitor,(PetscVoidFunction)func,mctx);if (*ierr) return; 348aecf964fSBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.mondestroy,(PetscVoidFunction)mondestroy,mctx);if (*ierr) return; 349aecf964fSBarry Smith *ierr = SNESMonitorSet(*snes,oursnesmonitor,*snes,ourmondestroy); 3508e27ec22SSatish Balay } 3518e27ec22SSatish Balay } 3528e27ec22SSatish Balay 353