xref: /petsc/src/snes/interface/ftn-custom/zsnesf.c (revision 3e7ff0edd3573be01c8c0fa32db97c3db8fa5c8d)
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
14be95d8f1SBarry Smith #define snessetngs_                       SNESSETNGS
158e27ec22SSatish Balay #define snesgetfunction_                 SNESGETFUNCTION
16be95d8f1SBarry Smith #define snesgetngs_                       SNESGETNGS
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
40be95d8f1SBarry Smith #define snessetngs_                       snessetngs
418e27ec22SSatish Balay #define snesgetfunction_                 snesgetfunction
42be95d8f1SBarry Smith #define snesgetngs_                       snesgetngs
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;
66be95d8f1SBarry Smith   PetscFortranCallbackId ngs;
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 }
75b8ebb45fSBarry Smith 
76de64c4c2SJed Brown #undef __FUNCT__
77de64c4c2SJed Brown #define __FUNCT__ "oursnestest"
7806ee9f85SBarry Smith static PetscErrorCode oursnestest(SNES snes,PetscInt it,PetscReal a,PetscReal d,PetscReal c,SNESConvergedReason *reason,void *ctx)
798e27ec22SSatish Balay {
80f6291634SJed Brown   PetscObjectUseFortranCallback(snes,_cb.test,(SNES*,PetscInt*,PetscReal*,PetscReal*,PetscReal*,SNESConvergedReason*,void*,PetscErrorCode*),(&snes,&it,&a,&d,&c,reason,_ctx,&ierr));
817f7931b9SBarry Smith }
827f7931b9SBarry Smith 
83de64c4c2SJed Brown #undef __FUNCT__
84de64c4c2SJed Brown #define __FUNCT__ "ourdestroy"
857f7931b9SBarry Smith static PetscErrorCode ourdestroy(void *ctx)
867f7931b9SBarry Smith {
87f6291634SJed Brown   PetscObjectUseFortranCallback(ctx,_cb.destroy,(void*,PetscErrorCode*),(_ctx,&ierr));
888e27ec22SSatish Balay }
898e27ec22SSatish Balay 
90de64c4c2SJed Brown #undef __FUNCT__
91de64c4c2SJed Brown #define __FUNCT__ "oursnesjacobian"
92d1e9a80fSBarry Smith static PetscErrorCode oursnesjacobian(SNES snes,Vec x,Mat m,Mat p,void *ctx)
938e27ec22SSatish Balay {
94d1e9a80fSBarry Smith   PetscObjectUseFortranCallback(snes,_cb.jacobian,(SNES*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),(&snes,&x,&m,&p,_ctx,&ierr));
958e27ec22SSatish Balay }
96f6291634SJed Brown 
97de64c4c2SJed Brown #undef __FUNCT__
98be95d8f1SBarry Smith #define __FUNCT__ "oursnesngs"
99be95d8f1SBarry Smith static PetscErrorCode oursnesngs(SNES snes,Vec x,Vec b,void *ctx)
10090b77ac2SPeter Brune {
101be95d8f1SBarry Smith   PetscObjectUseFortranCallback(snes,_cb.ngs,(SNES*,Vec*,Vec*,void*,PetscErrorCode*),(&snes,&x,&b,_ctx,&ierr));
10290b77ac2SPeter Brune }
103de64c4c2SJed Brown #undef __FUNCT__
104de64c4c2SJed Brown #define __FUNCT__ "oursnesmonitor"
1058e27ec22SSatish Balay static PetscErrorCode oursnesmonitor(SNES snes,PetscInt i,PetscReal d,void *ctx)
1068e27ec22SSatish Balay {
107f6291634SJed Brown   PetscObjectUseFortranCallback(snes,_cb.monitor,(SNES*,PetscInt*,PetscReal*,void*,PetscErrorCode*),(&snes,&i,&d,_ctx,&ierr));
1088e27ec22SSatish Balay }
109de64c4c2SJed Brown #undef __FUNCT__
110de64c4c2SJed Brown #define __FUNCT__ "ourmondestroy"
111c2efdce3SBarry Smith static PetscErrorCode ourmondestroy(void **ctx)
1128e27ec22SSatish Balay {
113f6291634SJed Brown   SNES snes = (SNES)*ctx;
114f6291634SJed Brown   PetscObjectUseFortranCallback(snes,_cb.mondestroy,(void*,PetscErrorCode*),(_ctx,&ierr));
1158e27ec22SSatish Balay }
1168e27ec22SSatish Balay 
1178e27ec22SSatish Balay /* ---------------------------------------------------------*/
1188e27ec22SSatish Balay /*
1198d359177SBarry Smith      snescomputejacobiandefault() and snescomputejacobiandefaultcolor()
1208e27ec22SSatish Balay   These can be used directly from Fortran but are mostly so that
1218e27ec22SSatish Balay   Fortran SNESSetJacobian() will properly handle the defaults being passed in.
1228e27ec22SSatish Balay 
1238e27ec22SSatish Balay   functions, hence no STDCALL
1248e27ec22SSatish Balay */
125d1e9a80fSBarry Smith PETSC_EXTERN void matmffdcomputejacobian_(SNES *snes,Vec *x,Mat *m,Mat *p,void *ctx,PetscErrorCode *ierr)
126df66969eSBarry Smith {
127d1e9a80fSBarry Smith   *ierr = MatMFFDComputeJacobian(*snes,*x,*m,*p,ctx);
128df66969eSBarry Smith }
129d1e9a80fSBarry Smith PETSC_EXTERN void snescomputejacobiandefault_(SNES *snes,Vec *x,Mat *m,Mat *p,void *ctx,PetscErrorCode *ierr)
1308e27ec22SSatish Balay {
131d1e9a80fSBarry Smith   *ierr = SNESComputeJacobianDefault(*snes,*x,*m,*p,ctx);
1328e27ec22SSatish Balay }
133d1e9a80fSBarry Smith PETSC_EXTERN void  snescomputejacobiandefaultcolor_(SNES *snes,Vec *x,Mat *m,Mat *p,void *ctx,PetscErrorCode *ierr)
1348e27ec22SSatish Balay {
135d1e9a80fSBarry Smith   *ierr = SNESComputeJacobianDefaultColor(*snes,*x,*m,*p,*(MatFDColoring*)ctx);
1368e27ec22SSatish Balay }
1378e27ec22SSatish Balay 
1388cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snessetjacobian_(SNES *snes,Mat *A,Mat *B,
139d1e9a80fSBarry Smith                                     void (PETSC_STDCALL *func)(SNES*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),
140f5af7f23SKarl Rupp                                     void *ctx,PetscErrorCode *ierr)
1418e27ec22SSatish Balay {
1428e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(ctx);
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_) {
1478d359177SBarry Smith     *ierr = SNESSetJacobian(*snes,*A,*B,SNESComputeJacobianDefaultColor,*(MatFDColoring*)ctx);
148df66969eSBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)matmffdcomputejacobian_) {
149df66969eSBarry Smith     *ierr = SNESSetJacobian(*snes,*A,*B,MatMFFDComputeJacobian,ctx);
150f5b6597dSBarry Smith   } else if (!func) {
151f5b6597dSBarry Smith     *ierr = SNESSetJacobian(*snes,*A,*B,0,ctx);
1528e27ec22SSatish Balay   } else {
153f6291634SJed Brown     *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.jacobian,(PetscVoidFunction)func,ctx);
1540298fd71SBarry Smith     if (!*ierr) *ierr = SNESSetJacobian(*snes,*A,*B,oursnesjacobian,NULL);
1558e27ec22SSatish Balay   }
1568e27ec22SSatish Balay }
1578e27ec22SSatish Balay /* -------------------------------------------------------------*/
1588e27ec22SSatish Balay 
1598cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snessolve_(SNES *snes,Vec *b,Vec *x, int *__ierr)
1606ce558aeSBarry Smith {
161a69afd8bSBarry Smith   Vec B = *b,X = *x;
1620298fd71SBarry Smith   if (FORTRANNULLOBJECT(b)) B = NULL;
1630298fd71SBarry Smith   if (FORTRANNULLOBJECT(x)) X = NULL;
164a69afd8bSBarry Smith   *__ierr = SNESSolve(*snes,B,X);
1656ce558aeSBarry Smith }
1666ce558aeSBarry Smith 
1678cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snesgetoptionsprefix_(SNES *snes,CHAR prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
1688e27ec22SSatish Balay {
1698e27ec22SSatish Balay   const char *tname;
1708e27ec22SSatish Balay 
1718e27ec22SSatish Balay   *ierr = SNESGetOptionsPrefix(*snes,&tname);
1728e27ec22SSatish Balay   *ierr = PetscStrncpy(prefix,tname,len);if (*ierr) return;
1738e27ec22SSatish Balay }
1748e27ec22SSatish Balay 
1758cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snesgettype_(SNES *snes,CHAR name PETSC_MIXED_LEN(len), PetscErrorCode *ierr PETSC_END_LEN(len))
1768e27ec22SSatish Balay {
1778e27ec22SSatish Balay   const char *tname;
1788e27ec22SSatish Balay 
1798e27ec22SSatish Balay   *ierr = SNESGetType(*snes,&tname);
1808e27ec22SSatish Balay   *ierr = PetscStrncpy(name,tname,len);if (*ierr) return;
1817c363081SBarry Smith   FIXRETURNCHAR(PETSC_TRUE,name,len);
1828e27ec22SSatish Balay }
183e3da1266SHong Zhang 
1848e27ec22SSatish Balay /* ---------------------------------------------------------*/
1858e27ec22SSatish Balay 
1868e27ec22SSatish Balay /*
1878e27ec22SSatish Balay    These are not usually called from Fortran but allow Fortran users
1888e27ec22SSatish Balay    to transparently set these monitors from .F code
1898e27ec22SSatish Balay 
1908e27ec22SSatish Balay    functions, hence no STDCALL
1918e27ec22SSatish Balay */
1928e27ec22SSatish Balay 
1938cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snessetfunction_(SNES *snes,Vec *r,void (PETSC_STDCALL *func)(SNES*,Vec*,Vec*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr)
1948e27ec22SSatish Balay {
1958e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(ctx);
196f6291634SJed Brown   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.function,(PetscVoidFunction)func,ctx);
1970298fd71SBarry Smith   if (!*ierr) *ierr = SNESSetFunction(*snes,*r,oursnesfunction,NULL);
1988e27ec22SSatish Balay }
199c79ef259SPeter Brune 
200c79ef259SPeter Brune 
201be95d8f1SBarry Smith PETSC_EXTERN void PETSC_STDCALL snessetngs_(SNES *snes,void (PETSC_STDCALL *func)(SNES*,Vec*,Vec*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr)
202c79ef259SPeter Brune {
203c79ef259SPeter Brune   CHKFORTRANNULLOBJECT(ctx);
204be95d8f1SBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.ngs,(PetscVoidFunction)func,ctx);
205be95d8f1SBarry Smith   if (!*ierr) *ierr = SNESSetNGS(*snes,oursnesngs,NULL);
206c79ef259SPeter Brune }
2078e27ec22SSatish Balay /* ---------------------------------------------------------*/
2088e27ec22SSatish Balay 
2098e27ec22SSatish Balay /* the func argument is ignored */
2108cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snesgetfunction_(SNES *snes,Vec *r,void *func,void **ctx,PetscErrorCode *ierr)
2118e27ec22SSatish Balay {
2128e27ec22SSatish Balay   CHKFORTRANNULLINTEGER(ctx);
2138e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(r);
2140298fd71SBarry Smith   *ierr = SNESGetFunction(*snes,r,NULL,NULL); if (*ierr) return;
2150298fd71SBarry Smith   *ierr = PetscObjectGetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.function,NULL,ctx);
2168e27ec22SSatish Balay }
217c79ef259SPeter Brune 
218be95d8f1SBarry Smith PETSC_EXTERN void PETSC_STDCALL snesgetngs_(SNES *snes,void *func,void **ctx,PetscErrorCode *ierr)
219c79ef259SPeter Brune {
220c79ef259SPeter Brune   CHKFORTRANNULLINTEGER(ctx);
221be95d8f1SBarry Smith   *ierr = PetscObjectGetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.ngs,NULL,ctx);
222c79ef259SPeter Brune }
223c79ef259SPeter Brune 
2248e27ec22SSatish Balay /*----------------------------------------------------------------------*/
2258e27ec22SSatish Balay 
22669c1e2abSSatish Balay PETSC_EXTERN void snesconvergeddefault_(SNES *snes,PetscInt *it,PetscReal *a,PetscReal *b,PetscReal *c,SNESConvergedReason *r, void *ct,PetscErrorCode *ierr)
2273f149594SLisandro Dalcin {
2288d359177SBarry Smith   *ierr = SNESConvergedDefault(*snes,*it,*a,*b,*c,r,ct);
2293f149594SLisandro Dalcin }
2303f149594SLisandro Dalcin 
231e07f7f94SSatish Balay PETSC_EXTERN void snesconvergedskip_(SNES *snes,PetscInt *it,PetscReal *a,PetscReal *b,PetscReal *c,SNESConvergedReason *r,void *ct,PetscErrorCode *ierr)
2323f149594SLisandro Dalcin {
233e2a6519dSDmitry Karpeev   *ierr = SNESConvergedSkip(*snes,*it,*a,*b,*c,r,ct);
2343f149594SLisandro Dalcin }
2353f149594SLisandro Dalcin 
2368cc058d9SJed 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)
2378e27ec22SSatish Balay {
2388e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(cctx);
2393f22127dSBarry Smith   CHKFORTRANNULLFUNCTION(destroy);
2403f149594SLisandro Dalcin 
2418d359177SBarry Smith   if ((PetscVoidFunction)func == (PetscVoidFunction)snesconvergeddefault_) {
2428d359177SBarry Smith     *ierr = SNESSetConvergenceTest(*snes,SNESConvergedDefault,0,0);
243e07f7f94SSatish Balay   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesconvergedskip_) {
244e2a6519dSDmitry Karpeev     *ierr = SNESSetConvergenceTest(*snes,SNESConvergedSkip,0,0);
2458e27ec22SSatish Balay   } else {
246f6291634SJed Brown     *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.test,(PetscVoidFunction)func,cctx);
247f6291634SJed Brown     if (*ierr) return;
2483f22127dSBarry Smith     if (!destroy) {
2490298fd71SBarry Smith       *ierr = SNESSetConvergenceTest(*snes,oursnestest,*snes,NULL);
2507f7931b9SBarry Smith     } else {
251f6291634SJed Brown       *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.destroy,(PetscVoidFunction)destroy,cctx);
252f6291634SJed Brown       if (!*ierr) *ierr = SNESSetConvergenceTest(*snes,oursnestest,*snes,ourdestroy);
2537f7931b9SBarry Smith     }
2548e27ec22SSatish Balay   }
2558e27ec22SSatish Balay }
2568e27ec22SSatish Balay /*----------------------------------------------------------------------*/
2578e27ec22SSatish Balay 
2588cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snesview_(SNES *snes,PetscViewer *viewer, PetscErrorCode *ierr)
2598e27ec22SSatish Balay {
2608e27ec22SSatish Balay   PetscViewer v;
2618e27ec22SSatish Balay   PetscPatchDefaultViewers_Fortran(viewer,v);
2628e27ec22SSatish Balay   *ierr = SNESView(*snes,v);
2638e27ec22SSatish Balay }
2648e27ec22SSatish Balay 
2658e27ec22SSatish Balay /*  func is currently ignored from Fortran */
2668cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snesgetjacobian_(SNES *snes,Mat *A,Mat *B,int *func,void **ctx,PetscErrorCode *ierr)
2678e27ec22SSatish Balay {
2688e27ec22SSatish Balay   CHKFORTRANNULLINTEGER(ctx);
2698e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(A);
2708e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(B);
2710298fd71SBarry Smith   *ierr = SNESGetJacobian(*snes,A,B,0,NULL); if (*ierr) return;
2720298fd71SBarry Smith   *ierr = PetscObjectGetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.jacobian,NULL,ctx);
273f2e0d3f1SJed Brown 
2748e27ec22SSatish Balay }
2758e27ec22SSatish Balay 
2768cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snesgetconvergencehistory_(SNES *snes,PetscInt *na,PetscErrorCode *ierr)
2778e27ec22SSatish Balay {
2780298fd71SBarry Smith   *ierr = SNESGetConvergenceHistory(*snes,NULL,NULL,na);
2798e27ec22SSatish Balay }
2808e27ec22SSatish Balay 
2818cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snessettype_(SNES *snes,CHAR type PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
2828e27ec22SSatish Balay {
2838e27ec22SSatish Balay   char *t;
2848e27ec22SSatish Balay 
2858e27ec22SSatish Balay   FIXCHAR(type,len,t);
2868e27ec22SSatish Balay   *ierr = SNESSetType(*snes,t);
2878e27ec22SSatish Balay   FREECHAR(type,t);
2888e27ec22SSatish Balay }
2898e27ec22SSatish Balay 
2908cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snesappendoptionsprefix_(SNES *snes,CHAR prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
2918e27ec22SSatish Balay {
2928e27ec22SSatish Balay   char *t;
2938e27ec22SSatish Balay 
2948e27ec22SSatish Balay   FIXCHAR(prefix,len,t);
2958e27ec22SSatish Balay   *ierr = SNESAppendOptionsPrefix(*snes,t);
2968e27ec22SSatish Balay   FREECHAR(prefix,t);
2978e27ec22SSatish Balay }
2988e27ec22SSatish Balay 
2998cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snessetoptionsprefix_(SNES *snes,CHAR prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
3008e27ec22SSatish Balay {
3018e27ec22SSatish Balay   char *t;
3028e27ec22SSatish Balay 
3038e27ec22SSatish Balay   FIXCHAR(prefix,len,t);
3048e27ec22SSatish Balay   *ierr = SNESSetOptionsPrefix(*snes,t);
3058e27ec22SSatish Balay   FREECHAR(prefix,t);
3068e27ec22SSatish Balay }
3078e27ec22SSatish Balay 
3088e27ec22SSatish Balay /*----------------------------------------------------------------------*/
3098e27ec22SSatish Balay /* functions, hence no STDCALL */
3108e27ec22SSatish Balay 
31169c1e2abSSatish Balay PETSC_EXTERN void snesmonitorlgresidualnorm_(SNES *snes,PetscInt *its,PetscReal *fgnorm,void *dummy,PetscErrorCode *ierr)
3128e27ec22SSatish Balay {
3134619e776SBarry Smith   *ierr = SNESMonitorLGResidualNorm(*snes,*its,*fgnorm,dummy);
3148e27ec22SSatish Balay }
3158e27ec22SSatish Balay 
31669c1e2abSSatish Balay PETSC_EXTERN void snesmonitordefault_(SNES *snes,PetscInt *its,PetscReal *fgnorm,void *dummy,PetscErrorCode *ierr)
3178e27ec22SSatish Balay {
318a6570f20SBarry Smith   *ierr = SNESMonitorDefault(*snes,*its,*fgnorm,dummy);
3198e27ec22SSatish Balay }
3208e27ec22SSatish Balay 
32169c1e2abSSatish Balay PETSC_EXTERN void snesmonitorsolution_(SNES *snes,PetscInt *its,PetscReal *fgnorm,void *dummy,PetscErrorCode *ierr)
3228e27ec22SSatish Balay {
323a6570f20SBarry Smith   *ierr = SNESMonitorSolution(*snes,*its,*fgnorm,dummy);
3248e27ec22SSatish Balay }
3258e27ec22SSatish Balay 
32669c1e2abSSatish Balay PETSC_EXTERN void snesmonitorsolutionupdate_(SNES *snes,PetscInt *its,PetscReal *fgnorm,void *dummy,PetscErrorCode *ierr)
3278e27ec22SSatish Balay {
328a6570f20SBarry Smith   *ierr = SNESMonitorSolutionUpdate(*snes,*its,*fgnorm,dummy);
3298e27ec22SSatish Balay }
3308e27ec22SSatish Balay 
3318e27ec22SSatish Balay 
3328cc058d9SJed 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)
3338e27ec22SSatish Balay {
3348e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(mctx);
335a6570f20SBarry Smith   if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitordefault_) {
336a6570f20SBarry Smith     *ierr = SNESMonitorSet(*snes,SNESMonitorDefault,0,0);
337a6570f20SBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorsolution_) {
338a6570f20SBarry Smith     *ierr = SNESMonitorSet(*snes,SNESMonitorSolution,0,0);
339a6570f20SBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorsolutionupdate_) {
340a6570f20SBarry Smith     *ierr = SNESMonitorSet(*snes,SNESMonitorSolutionUpdate,0,0);
3414619e776SBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorlgresidualnorm_) {
342*3e7ff0edSBarry Smith     *ierr = SNESMonitorSet(*snes,(PetscErrorCode (*)(SNES,PetscInt,PetscReal,void*))SNESMonitorLGResidualNorm,0,0);
3438e27ec22SSatish Balay   } else {
344f6291634SJed Brown     *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.monitor,(PetscVoidFunction)func,mctx);
345f6291634SJed Brown     if (*ierr) return;
3468e27ec22SSatish Balay     if (FORTRANNULLFUNCTION(mondestroy)) {
3470298fd71SBarry Smith       *ierr = SNESMonitorSet(*snes,oursnesmonitor,*snes,NULL);
3488e27ec22SSatish Balay     } else {
3495d4ebb51SBarry Smith       CHKFORTRANNULLFUNCTION(mondestroy);
350f6291634SJed Brown       *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.mondestroy,(PetscVoidFunction)mondestroy,mctx);
351f6291634SJed Brown       if (!*ierr) *ierr = SNESMonitorSet(*snes,oursnesmonitor,*snes,ourmondestroy);
3528e27ec22SSatish Balay     }
3538e27ec22SSatish Balay   }
3548e27ec22SSatish Balay }
3558e27ec22SSatish Balay 
356