xref: /petsc/src/snes/interface/ftn-custom/zsnesf.c (revision d1e9a80f72efc361583d2fc822de9783b227627d)
1b45d2f2cSJed Brown #include <petsc-private/fortranimpl.h>
2c6db04a5SJed Brown #include <petscsnes.h>
3665c2dedSJed Brown #include <petscviewer.h>
48e27ec22SSatish Balay 
58e27ec22SSatish Balay #if defined(PETSC_HAVE_FORTRAN_CAPS)
6df66969eSBarry Smith #define matmffdcomputejacobian_          MATMFFDCOMPUTEJACOBIAN
76ce558aeSBarry Smith #define snessolve_                       SNESSOLVE
88d359177SBarry Smith #define snescomputejacobiandefault_      SNESCOMPUTEJACOBIANDEFAULT
98d359177SBarry Smith #define snescomputejacobiandefaultcolor_ SNESCOMPUTEJACOBIANDEFAULTCOLOR
108e27ec22SSatish Balay #define snessetjacobian_                 SNESSETJACOBIAN
118e27ec22SSatish Balay #define snesgetoptionsprefix_            SNESGETOPTIONSPREFIX
128e27ec22SSatish Balay #define snesgettype_                     SNESGETTYPE
138e27ec22SSatish Balay #define snessetfunction_                 SNESSETFUNCTION
14c79ef259SPeter Brune #define snessetgs_                       SNESSETGS
158e27ec22SSatish Balay #define snesgetfunction_                 SNESGETFUNCTION
16c79ef259SPeter Brune #define snesgetgs_                       SNESGETGS
178e27ec22SSatish Balay #define snessetconvergencetest_          SNESSETCONVERGENCETEST
188d359177SBarry Smith #define snesconvergeddefault_            SNESCONVERGEDDEFAULT
19e07f7f94SSatish Balay #define snesconvergedskip_               SNESCONVERGEDSKIP
208e27ec22SSatish Balay #define snesview_                        SNESVIEW
218e27ec22SSatish Balay #define snesgetconvergencehistory_       SNESGETCONVERGENCEHISTORY
228e27ec22SSatish Balay #define snesgetjacobian_                 SNESGETJACOBIAN
238e27ec22SSatish Balay #define snessettype_                     SNESSETTYPE
248e27ec22SSatish Balay #define snesappendoptionsprefix_         SNESAPPENDOPTIONSPREFIX
258e27ec22SSatish Balay #define snessetoptionsprefix_            SNESSETOPTIONSPREFIX
26a6570f20SBarry Smith #define snesmonitordefault_              SNESMONITORDEFAULT
27a6570f20SBarry Smith #define snesmonitorsolution_             SNESMONITORSOLUTION
284619e776SBarry Smith #define snesmonitorlgresidualnorm_       SNESMONITORLGRESIDUALNORM
29a6570f20SBarry Smith #define snesmonitorsolutionupdate_       SNESMONITORSOLUTIONUPDATE
30a6570f20SBarry Smith #define snesmonitorset_                  SNESMONITORSET
318e27ec22SSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
32df66969eSBarry Smith #define matmffdcomputejacobian_          matmffdcomputejacobian
336ce558aeSBarry Smith #define snessolve_                       snessolve
348d359177SBarry Smith #define snescomputejacobiandefault_      snescomputejacobiandefault
358d359177SBarry Smith #define snescomputejacobiandefaultcolor_ snescomputejacobiandefaultcolor
368e27ec22SSatish Balay #define snessetjacobian_                 snessetjacobian
378e27ec22SSatish Balay #define snesgetoptionsprefix_            snesgetoptionsprefix
388e27ec22SSatish Balay #define snesgettype_                     snesgettype
398e27ec22SSatish Balay #define snessetfunction_                 snessetfunction
40c79ef259SPeter Brune #define snessetgs_                       snessetgs
418e27ec22SSatish Balay #define snesgetfunction_                 snesgetfunction
42c79ef259SPeter Brune #define snesgetgs_                       snesgetgs
438e27ec22SSatish Balay #define snessetconvergencetest_          snessetconvergencetest
448d359177SBarry Smith #define snesconvergeddefault_            snesconvergeddefault
45e07f7f94SSatish Balay #define snesconvergedskip_               snesconvergedskip
468e27ec22SSatish Balay #define snesview_                        snesview
478e27ec22SSatish Balay #define snesgetjacobian_                 snesgetjacobian
488e27ec22SSatish Balay #define snesgetconvergencehistory_       snesgetconvergencehistory
498e27ec22SSatish Balay #define snessettype_                     snessettype
508e27ec22SSatish Balay #define snesappendoptionsprefix_         snesappendoptionsprefix
518e27ec22SSatish Balay #define snessetoptionsprefix_            snessetoptionsprefix
524619e776SBarry Smith #define snesmonitorlgresidualnorm_       snesmonitorlgresidualnorm
53a6570f20SBarry Smith #define snesmonitordefault_              snesmonitordefault
54a6570f20SBarry Smith #define snesmonitorsolution_             snesmonitorsolution
55a6570f20SBarry Smith #define snesmonitorsolutionupdate_       snesmonitorsolutionupdate
56a6570f20SBarry Smith #define snesmonitorset_                  snesmonitorset
578e27ec22SSatish Balay #endif
588e27ec22SSatish Balay 
59f6291634SJed Brown static struct {
60f6291634SJed Brown   PetscFortranCallbackId function;
61f6291634SJed Brown   PetscFortranCallbackId test;
62f6291634SJed Brown   PetscFortranCallbackId destroy;
63f6291634SJed Brown   PetscFortranCallbackId jacobian;
64f6291634SJed Brown   PetscFortranCallbackId monitor;
65f6291634SJed Brown   PetscFortranCallbackId mondestroy;
66f6291634SJed Brown   PetscFortranCallbackId gs;
67f6291634SJed Brown } _cb;
6890b77ac2SPeter Brune 
69de64c4c2SJed Brown #undef __FUNCT__
70de64c4c2SJed Brown #define __FUNCT__ "oursnesfunction"
718e27ec22SSatish Balay static PetscErrorCode oursnesfunction(SNES snes,Vec x,Vec f,void *ctx)
728e27ec22SSatish Balay {
73f6291634SJed Brown   PetscObjectUseFortranCallback(snes,_cb.function,(SNES*,Vec*,Vec*,void*,PetscErrorCode*),(&snes,&x,&f,_ctx,&ierr));
748e27ec22SSatish Balay   return 0;
758e27ec22SSatish Balay }
76b8ebb45fSBarry Smith 
77de64c4c2SJed Brown #undef __FUNCT__
78de64c4c2SJed Brown #define __FUNCT__ "oursnestest"
7906ee9f85SBarry Smith static PetscErrorCode oursnestest(SNES snes,PetscInt it,PetscReal a,PetscReal d,PetscReal c,SNESConvergedReason *reason,void *ctx)
808e27ec22SSatish Balay {
81f6291634SJed Brown   PetscObjectUseFortranCallback(snes,_cb.test,(SNES*,PetscInt*,PetscReal*,PetscReal*,PetscReal*,SNESConvergedReason*,void*,PetscErrorCode*),(&snes,&it,&a,&d,&c,reason,_ctx,&ierr));
827f7931b9SBarry Smith   return 0;
837f7931b9SBarry Smith }
847f7931b9SBarry Smith 
85de64c4c2SJed Brown #undef __FUNCT__
86de64c4c2SJed Brown #define __FUNCT__ "ourdestroy"
877f7931b9SBarry Smith static PetscErrorCode ourdestroy(void *ctx)
887f7931b9SBarry Smith {
89f6291634SJed Brown   PetscObjectUseFortranCallback(ctx,_cb.destroy,(void*,PetscErrorCode*),(_ctx,&ierr));
908e27ec22SSatish Balay   return 0;
918e27ec22SSatish Balay }
928e27ec22SSatish Balay 
93de64c4c2SJed Brown #undef __FUNCT__
94de64c4c2SJed Brown #define __FUNCT__ "oursnesjacobian"
95*d1e9a80fSBarry Smith static PetscErrorCode oursnesjacobian(SNES snes,Vec x,Mat m,Mat p,void *ctx)
968e27ec22SSatish Balay {
97*d1e9a80fSBarry Smith   PetscObjectUseFortranCallback(snes,_cb.jacobian,(SNES*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),(&snes,&x,&m,&p,_ctx,&ierr));
988e27ec22SSatish Balay   return 0;
998e27ec22SSatish Balay }
100f6291634SJed Brown 
101de64c4c2SJed Brown #undef __FUNCT__
102de64c4c2SJed Brown #define __FUNCT__ "oursnesgs"
10390b77ac2SPeter Brune static PetscErrorCode oursnesgs(SNES snes,Vec x,Vec b,void *ctx)
10490b77ac2SPeter Brune {
105f6291634SJed Brown   PetscObjectUseFortranCallback(snes,_cb.gs,(SNES*,Vec*,Vec*,void*,PetscErrorCode*),(&snes,&x,&b,_ctx,&ierr));
10690b77ac2SPeter Brune   return 0;
10790b77ac2SPeter Brune }
108de64c4c2SJed Brown #undef __FUNCT__
109de64c4c2SJed Brown #define __FUNCT__ "oursnesmonitor"
1108e27ec22SSatish Balay static PetscErrorCode oursnesmonitor(SNES snes,PetscInt i,PetscReal d,void *ctx)
1118e27ec22SSatish Balay {
112f6291634SJed Brown   PetscObjectUseFortranCallback(snes,_cb.monitor,(SNES*,PetscInt*,PetscReal*,void*,PetscErrorCode*),(&snes,&i,&d,_ctx,&ierr));
1138e27ec22SSatish Balay   return 0;
1148e27ec22SSatish Balay }
115de64c4c2SJed Brown #undef __FUNCT__
116de64c4c2SJed Brown #define __FUNCT__ "ourmondestroy"
117c2efdce3SBarry Smith static PetscErrorCode ourmondestroy(void **ctx)
1188e27ec22SSatish Balay {
119f6291634SJed Brown   SNES snes = (SNES)*ctx;
120f6291634SJed Brown   PetscObjectUseFortranCallback(snes,_cb.mondestroy,(void*,PetscErrorCode*),(_ctx,&ierr));
1218e27ec22SSatish Balay   return 0;
1228e27ec22SSatish Balay }
1238e27ec22SSatish Balay 
1248e27ec22SSatish Balay /* ---------------------------------------------------------*/
1258e27ec22SSatish Balay /*
1268d359177SBarry Smith      snescomputejacobiandefault() and snescomputejacobiandefaultcolor()
1278e27ec22SSatish Balay   These can be used directly from Fortran but are mostly so that
1288e27ec22SSatish Balay   Fortran SNESSetJacobian() will properly handle the defaults being passed in.
1298e27ec22SSatish Balay 
1308e27ec22SSatish Balay   functions, hence no STDCALL
1318e27ec22SSatish Balay */
132*d1e9a80fSBarry Smith PETSC_EXTERN void matmffdcomputejacobian_(SNES *snes,Vec *x,Mat *m,Mat *p,void *ctx,PetscErrorCode *ierr)
133df66969eSBarry Smith {
134*d1e9a80fSBarry Smith   *ierr = MatMFFDComputeJacobian(*snes,*x,*m,*p,ctx);
135df66969eSBarry Smith }
136*d1e9a80fSBarry Smith PETSC_EXTERN void snescomputejacobiandefault_(SNES *snes,Vec *x,Mat *m,Mat *p,void *ctx,PetscErrorCode *ierr)
1378e27ec22SSatish Balay {
138*d1e9a80fSBarry Smith   *ierr = SNESComputeJacobianDefault(*snes,*x,*m,*p,ctx);
1398e27ec22SSatish Balay }
140*d1e9a80fSBarry Smith PETSC_EXTERN void  snescomputejacobiandefaultcolor_(SNES *snes,Vec *x,Mat *m,Mat *p,void *ctx,PetscErrorCode *ierr)
1418e27ec22SSatish Balay {
142*d1e9a80fSBarry Smith   *ierr = SNESComputeJacobianDefaultColor(*snes,*x,*m,*p,*(MatFDColoring*)ctx);
1438e27ec22SSatish Balay }
1448e27ec22SSatish Balay 
1458cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snessetjacobian_(SNES *snes,Mat *A,Mat *B,
146*d1e9a80fSBarry Smith                                     void (PETSC_STDCALL *func)(SNES*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),
147f5af7f23SKarl Rupp                                     void *ctx,PetscErrorCode *ierr)
1488e27ec22SSatish Balay {
1498e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(ctx);
150f5b6597dSBarry Smith   CHKFORTRANNULLFUNCTION(func);
1518d359177SBarry Smith   if ((PetscVoidFunction)func == (PetscVoidFunction)snescomputejacobiandefault_) {
1528d359177SBarry Smith     *ierr = SNESSetJacobian(*snes,*A,*B,SNESComputeJacobianDefault,ctx);
1538d359177SBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snescomputejacobiandefaultcolor_) {
1548d359177SBarry Smith     *ierr = SNESSetJacobian(*snes,*A,*B,SNESComputeJacobianDefaultColor,*(MatFDColoring*)ctx);
155df66969eSBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)matmffdcomputejacobian_) {
156df66969eSBarry Smith     *ierr = SNESSetJacobian(*snes,*A,*B,MatMFFDComputeJacobian,ctx);
157f5b6597dSBarry Smith   } else if (!func) {
158f5b6597dSBarry Smith     *ierr = SNESSetJacobian(*snes,*A,*B,0,ctx);
1598e27ec22SSatish Balay   } else {
160f6291634SJed Brown     *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.jacobian,(PetscVoidFunction)func,ctx);
1610298fd71SBarry Smith     if (!*ierr) *ierr = SNESSetJacobian(*snes,*A,*B,oursnesjacobian,NULL);
1628e27ec22SSatish Balay   }
1638e27ec22SSatish Balay }
1648e27ec22SSatish Balay /* -------------------------------------------------------------*/
1658e27ec22SSatish Balay 
1668cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snessolve_(SNES *snes,Vec *b,Vec *x, int *__ierr)
1676ce558aeSBarry Smith {
168a69afd8bSBarry Smith   Vec B = *b,X = *x;
1690298fd71SBarry Smith   if (FORTRANNULLOBJECT(b)) B = NULL;
1700298fd71SBarry Smith   if (FORTRANNULLOBJECT(x)) X = NULL;
171a69afd8bSBarry Smith   *__ierr = SNESSolve(*snes,B,X);
1726ce558aeSBarry Smith }
1736ce558aeSBarry Smith 
1748cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snesgetoptionsprefix_(SNES *snes,CHAR prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
1758e27ec22SSatish Balay {
1768e27ec22SSatish Balay   const char *tname;
1778e27ec22SSatish Balay 
1788e27ec22SSatish Balay   *ierr = SNESGetOptionsPrefix(*snes,&tname);
1798e27ec22SSatish Balay   *ierr = PetscStrncpy(prefix,tname,len);if (*ierr) return;
1808e27ec22SSatish Balay }
1818e27ec22SSatish Balay 
1828cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snesgettype_(SNES *snes,CHAR name PETSC_MIXED_LEN(len), PetscErrorCode *ierr PETSC_END_LEN(len))
1838e27ec22SSatish Balay {
1848e27ec22SSatish Balay   const char *tname;
1858e27ec22SSatish Balay 
1868e27ec22SSatish Balay   *ierr = SNESGetType(*snes,&tname);
1878e27ec22SSatish Balay   *ierr = PetscStrncpy(name,tname,len);if (*ierr) return;
1887c363081SBarry Smith   FIXRETURNCHAR(PETSC_TRUE,name,len);
1898e27ec22SSatish Balay }
190e3da1266SHong Zhang 
1918e27ec22SSatish Balay /* ---------------------------------------------------------*/
1928e27ec22SSatish Balay 
1938e27ec22SSatish Balay /*
1948e27ec22SSatish Balay    These are not usually called from Fortran but allow Fortran users
1958e27ec22SSatish Balay    to transparently set these monitors from .F code
1968e27ec22SSatish Balay 
1978e27ec22SSatish Balay    functions, hence no STDCALL
1988e27ec22SSatish Balay */
1998e27ec22SSatish Balay 
2008cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snessetfunction_(SNES *snes,Vec *r,void (PETSC_STDCALL *func)(SNES*,Vec*,Vec*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr)
2018e27ec22SSatish Balay {
2028e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(ctx);
203f6291634SJed Brown   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.function,(PetscVoidFunction)func,ctx);
2040298fd71SBarry Smith   if (!*ierr) *ierr = SNESSetFunction(*snes,*r,oursnesfunction,NULL);
2058e27ec22SSatish Balay }
206c79ef259SPeter Brune 
207c79ef259SPeter Brune 
2088cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snessetgs_(SNES *snes,void (PETSC_STDCALL *func)(SNES*,Vec*,Vec*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr)
209c79ef259SPeter Brune {
210c79ef259SPeter Brune   CHKFORTRANNULLOBJECT(ctx);
211f6291634SJed Brown   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.gs,(PetscVoidFunction)func,ctx);
2120298fd71SBarry Smith   if (!*ierr) *ierr = SNESSetGS(*snes,oursnesgs,NULL);
213c79ef259SPeter Brune }
2148e27ec22SSatish Balay /* ---------------------------------------------------------*/
2158e27ec22SSatish Balay 
2168e27ec22SSatish Balay /* the func argument is ignored */
2178cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snesgetfunction_(SNES *snes,Vec *r,void *func,void **ctx,PetscErrorCode *ierr)
2188e27ec22SSatish Balay {
2198e27ec22SSatish Balay   CHKFORTRANNULLINTEGER(ctx);
2208e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(r);
2210298fd71SBarry Smith   *ierr = SNESGetFunction(*snes,r,NULL,NULL); if (*ierr) return;
2220298fd71SBarry Smith   *ierr = PetscObjectGetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.function,NULL,ctx);
2238e27ec22SSatish Balay }
224c79ef259SPeter Brune 
2258cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snesgetgs_(SNES *snes,void *func,void **ctx,PetscErrorCode *ierr)
226c79ef259SPeter Brune {
227c79ef259SPeter Brune   CHKFORTRANNULLINTEGER(ctx);
2280298fd71SBarry Smith   *ierr = PetscObjectGetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.gs,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 {
253f6291634SJed Brown     *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.test,(PetscVoidFunction)func,cctx);
254f6291634SJed Brown     if (*ierr) return;
2553f22127dSBarry Smith     if (!destroy) {
2560298fd71SBarry Smith       *ierr = SNESSetConvergenceTest(*snes,oursnestest,*snes,NULL);
2577f7931b9SBarry Smith     } else {
258f6291634SJed Brown       *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.destroy,(PetscVoidFunction)destroy,cctx);
259f6291634SJed Brown       if (!*ierr) *ierr = SNESSetConvergenceTest(*snes,oursnestest,*snes,ourdestroy);
2607f7931b9SBarry Smith     }
2618e27ec22SSatish Balay   }
2628e27ec22SSatish Balay }
2638e27ec22SSatish Balay /*----------------------------------------------------------------------*/
2648e27ec22SSatish Balay 
2658cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snesview_(SNES *snes,PetscViewer *viewer, PetscErrorCode *ierr)
2668e27ec22SSatish Balay {
2678e27ec22SSatish Balay   PetscViewer v;
2688e27ec22SSatish Balay   PetscPatchDefaultViewers_Fortran(viewer,v);
2698e27ec22SSatish Balay   *ierr = SNESView(*snes,v);
2708e27ec22SSatish Balay }
2718e27ec22SSatish Balay 
2728e27ec22SSatish Balay /*  func is currently ignored from Fortran */
2738cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snesgetjacobian_(SNES *snes,Mat *A,Mat *B,int *func,void **ctx,PetscErrorCode *ierr)
2748e27ec22SSatish Balay {
2758e27ec22SSatish Balay   CHKFORTRANNULLINTEGER(ctx);
2768e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(A);
2778e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(B);
2780298fd71SBarry Smith   *ierr = SNESGetJacobian(*snes,A,B,0,NULL); if (*ierr) return;
2790298fd71SBarry Smith   *ierr = PetscObjectGetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.jacobian,NULL,ctx);
280f2e0d3f1SJed Brown 
2818e27ec22SSatish Balay }
2828e27ec22SSatish Balay 
2838cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snesgetconvergencehistory_(SNES *snes,PetscInt *na,PetscErrorCode *ierr)
2848e27ec22SSatish Balay {
2850298fd71SBarry Smith   *ierr = SNESGetConvergenceHistory(*snes,NULL,NULL,na);
2868e27ec22SSatish Balay }
2878e27ec22SSatish Balay 
2888cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snessettype_(SNES *snes,CHAR type PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
2898e27ec22SSatish Balay {
2908e27ec22SSatish Balay   char *t;
2918e27ec22SSatish Balay 
2928e27ec22SSatish Balay   FIXCHAR(type,len,t);
2938e27ec22SSatish Balay   *ierr = SNESSetType(*snes,t);
2948e27ec22SSatish Balay   FREECHAR(type,t);
2958e27ec22SSatish Balay }
2968e27ec22SSatish Balay 
2978cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snesappendoptionsprefix_(SNES *snes,CHAR prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
2988e27ec22SSatish Balay {
2998e27ec22SSatish Balay   char *t;
3008e27ec22SSatish Balay 
3018e27ec22SSatish Balay   FIXCHAR(prefix,len,t);
3028e27ec22SSatish Balay   *ierr = SNESAppendOptionsPrefix(*snes,t);
3038e27ec22SSatish Balay   FREECHAR(prefix,t);
3048e27ec22SSatish Balay }
3058e27ec22SSatish Balay 
3068cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snessetoptionsprefix_(SNES *snes,CHAR prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
3078e27ec22SSatish Balay {
3088e27ec22SSatish Balay   char *t;
3098e27ec22SSatish Balay 
3108e27ec22SSatish Balay   FIXCHAR(prefix,len,t);
3118e27ec22SSatish Balay   *ierr = SNESSetOptionsPrefix(*snes,t);
3128e27ec22SSatish Balay   FREECHAR(prefix,t);
3138e27ec22SSatish Balay }
3148e27ec22SSatish Balay 
3158e27ec22SSatish Balay /*----------------------------------------------------------------------*/
3168e27ec22SSatish Balay /* functions, hence no STDCALL */
3178e27ec22SSatish Balay 
31869c1e2abSSatish Balay PETSC_EXTERN void snesmonitorlgresidualnorm_(SNES *snes,PetscInt *its,PetscReal *fgnorm,void *dummy,PetscErrorCode *ierr)
3198e27ec22SSatish Balay {
3204619e776SBarry Smith   *ierr = SNESMonitorLGResidualNorm(*snes,*its,*fgnorm,dummy);
3218e27ec22SSatish Balay }
3228e27ec22SSatish Balay 
32369c1e2abSSatish Balay PETSC_EXTERN void snesmonitordefault_(SNES *snes,PetscInt *its,PetscReal *fgnorm,void *dummy,PetscErrorCode *ierr)
3248e27ec22SSatish Balay {
325a6570f20SBarry Smith   *ierr = SNESMonitorDefault(*snes,*its,*fgnorm,dummy);
3268e27ec22SSatish Balay }
3278e27ec22SSatish Balay 
32869c1e2abSSatish Balay PETSC_EXTERN void snesmonitorsolution_(SNES *snes,PetscInt *its,PetscReal *fgnorm,void *dummy,PetscErrorCode *ierr)
3298e27ec22SSatish Balay {
330a6570f20SBarry Smith   *ierr = SNESMonitorSolution(*snes,*its,*fgnorm,dummy);
3318e27ec22SSatish Balay }
3328e27ec22SSatish Balay 
33369c1e2abSSatish Balay PETSC_EXTERN void snesmonitorsolutionupdate_(SNES *snes,PetscInt *its,PetscReal *fgnorm,void *dummy,PetscErrorCode *ierr)
3348e27ec22SSatish Balay {
335a6570f20SBarry Smith   *ierr = SNESMonitorSolutionUpdate(*snes,*its,*fgnorm,dummy);
3368e27ec22SSatish Balay }
3378e27ec22SSatish Balay 
3388e27ec22SSatish Balay 
3398cc058d9SJed 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)
3408e27ec22SSatish Balay {
3418e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(mctx);
342a6570f20SBarry Smith   if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitordefault_) {
343a6570f20SBarry Smith     *ierr = SNESMonitorSet(*snes,SNESMonitorDefault,0,0);
344a6570f20SBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorsolution_) {
345a6570f20SBarry Smith     *ierr = SNESMonitorSet(*snes,SNESMonitorSolution,0,0);
346a6570f20SBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorsolutionupdate_) {
347a6570f20SBarry Smith     *ierr = SNESMonitorSet(*snes,SNESMonitorSolutionUpdate,0,0);
3484619e776SBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorlgresidualnorm_) {
3494619e776SBarry Smith     *ierr = SNESMonitorSet(*snes,SNESMonitorLGResidualNorm,0,0);
3508e27ec22SSatish Balay   } else {
351f6291634SJed Brown     *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.monitor,(PetscVoidFunction)func,mctx);
352f6291634SJed Brown     if (*ierr) return;
3538e27ec22SSatish Balay     if (FORTRANNULLFUNCTION(mondestroy)) {
3540298fd71SBarry Smith       *ierr = SNESMonitorSet(*snes,oursnesmonitor,*snes,NULL);
3558e27ec22SSatish Balay     } else {
3565d4ebb51SBarry Smith       CHKFORTRANNULLFUNCTION(mondestroy);
357f6291634SJed Brown       *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.mondestroy,(PetscVoidFunction)mondestroy,mctx);
358f6291634SJed Brown       if (!*ierr) *ierr = SNESMonitorSet(*snes,oursnesmonitor,*snes,ourmondestroy);
3598e27ec22SSatish Balay     }
3608e27ec22SSatish Balay   }
3618e27ec22SSatish Balay }
3628e27ec22SSatish Balay 
363