xref: /petsc/src/snes/interface/ftn-custom/zsnesf.c (revision 390e1bf27627d887df99a9f4d0d0ad68037f55ec)
1af0996ceSBarry Smith #include <petsc/private/fortranimpl.h>
2c6db04a5SJed Brown #include <petscsnes.h>
3665c2dedSJed Brown #include <petscviewer.h>
489e00c7dSSatish Balay #include <../src/sys/f90-src/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);
154f5b6597dSBarry Smith   } else if (!func) {
155f5b6597dSBarry Smith     *ierr = SNESSetJacobian(*snes,*A,*B,0,ctx);
1568e27ec22SSatish Balay   } else {
157f6291634SJed Brown     *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.jacobian,(PetscVoidFunction)func,ctx);
1580298fd71SBarry Smith     if (!*ierr) *ierr = SNESSetJacobian(*snes,*A,*B,oursnesjacobian,NULL);
1598e27ec22SSatish Balay   }
1608e27ec22SSatish Balay }
1618e27ec22SSatish Balay /* -------------------------------------------------------------*/
1628e27ec22SSatish Balay 
1631b266c99SBarry Smith PETSC_EXTERN void PETSC_STDCALL snessolve_(SNES *snes,Vec *b,Vec *x, int *ierr)
1646ce558aeSBarry Smith {
1651b266c99SBarry Smith   CHKFORTRANNULLOBJECTDEREFERENCE(b);
1661b266c99SBarry Smith   CHKFORTRANNULLOBJECTDEREFERENCE(x);
1671b266c99SBarry Smith   *ierr = SNESSolve(*snes,*b,*x);
1686ce558aeSBarry Smith }
1696ce558aeSBarry Smith 
170*390e1bf2SBarry Smith PETSC_EXTERN void PETSC_STDCALL snesgetoptionsprefix_(SNES *snes,char* prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
1718e27ec22SSatish Balay {
1728e27ec22SSatish Balay   const char *tname;
1738e27ec22SSatish Balay 
1748e27ec22SSatish Balay   *ierr = SNESGetOptionsPrefix(*snes,&tname);
1758e27ec22SSatish Balay   *ierr = PetscStrncpy(prefix,tname,len);if (*ierr) return;
176d6a8cea5SBarry Smith   FIXRETURNCHAR(PETSC_TRUE,prefix,len);
1778e27ec22SSatish Balay }
1788e27ec22SSatish Balay 
179*390e1bf2SBarry Smith PETSC_EXTERN void PETSC_STDCALL snesgettype_(SNES *snes,char* name PETSC_MIXED_LEN(len), PetscErrorCode *ierr PETSC_END_LEN(len))
1808e27ec22SSatish Balay {
1818e27ec22SSatish Balay   const char *tname;
1828e27ec22SSatish Balay 
1838e27ec22SSatish Balay   *ierr = SNESGetType(*snes,&tname);
1848e27ec22SSatish Balay   *ierr = PetscStrncpy(name,tname,len);if (*ierr) return;
1857c363081SBarry Smith   FIXRETURNCHAR(PETSC_TRUE,name,len);
1868e27ec22SSatish Balay }
187e3da1266SHong Zhang 
1888e27ec22SSatish Balay /* ---------------------------------------------------------*/
1898e27ec22SSatish Balay 
1908e27ec22SSatish Balay /*
1918e27ec22SSatish Balay    These are not usually called from Fortran but allow Fortran users
1928e27ec22SSatish Balay    to transparently set these monitors from .F code
1938e27ec22SSatish Balay 
1948e27ec22SSatish Balay    functions, hence no STDCALL
1958e27ec22SSatish Balay */
1968e27ec22SSatish Balay 
19789e00c7dSSatish 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))
1988e27ec22SSatish Balay {
199f6291634SJed Brown   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.function,(PetscVoidFunction)func,ctx);
20089e00c7dSSatish Balay #if defined(PETSC_HAVE_F90_2PTR_ARG)
20189e00c7dSSatish Balay   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.function_pgiptr,PETSC_NULL,ptr);
20289e00c7dSSatish Balay #endif
2030298fd71SBarry Smith   if (!*ierr) *ierr = SNESSetFunction(*snes,*r,oursnesfunction,NULL);
2048e27ec22SSatish Balay }
205c79ef259SPeter Brune 
206c79ef259SPeter Brune 
207be95d8f1SBarry Smith PETSC_EXTERN void PETSC_STDCALL snessetngs_(SNES *snes,void (PETSC_STDCALL *func)(SNES*,Vec*,Vec*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr)
208c79ef259SPeter Brune {
209be95d8f1SBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.ngs,(PetscVoidFunction)func,ctx);
210be95d8f1SBarry Smith   if (!*ierr) *ierr = SNESSetNGS(*snes,oursnesngs,NULL);
211c79ef259SPeter Brune }
212dfef22ccSBarry Smith PETSC_EXTERN void PETSC_STDCALL snessetupdate_(SNES *snes,void (PETSC_STDCALL *func)(SNES*,PetscInt*,PetscErrorCode*),PetscErrorCode *ierr)
213dfef22ccSBarry Smith {
214dfef22ccSBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.update,(PetscVoidFunction)func,NULL);
215dfef22ccSBarry Smith   if (!*ierr) *ierr = SNESSetUpdate(*snes,oursnesupdate);
216dfef22ccSBarry Smith }
2178e27ec22SSatish Balay /* ---------------------------------------------------------*/
2188e27ec22SSatish Balay 
2198e27ec22SSatish Balay /* the func argument is ignored */
2208cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snesgetfunction_(SNES *snes,Vec *r,void *func,void **ctx,PetscErrorCode *ierr)
2218e27ec22SSatish Balay {
2228e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(r);
2230298fd71SBarry Smith   *ierr = SNESGetFunction(*snes,r,NULL,NULL); if (*ierr) return;
2240298fd71SBarry Smith   *ierr = PetscObjectGetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.function,NULL,ctx);
2258e27ec22SSatish Balay }
226c79ef259SPeter Brune 
227be95d8f1SBarry Smith PETSC_EXTERN void PETSC_STDCALL snesgetngs_(SNES *snes,void *func,void **ctx,PetscErrorCode *ierr)
228c79ef259SPeter Brune {
229be95d8f1SBarry Smith   *ierr = PetscObjectGetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.ngs,NULL,ctx);
230c79ef259SPeter Brune }
231c79ef259SPeter Brune 
2328e27ec22SSatish Balay /*----------------------------------------------------------------------*/
2338e27ec22SSatish Balay 
23469c1e2abSSatish Balay PETSC_EXTERN void snesconvergeddefault_(SNES *snes,PetscInt *it,PetscReal *a,PetscReal *b,PetscReal *c,SNESConvergedReason *r, void *ct,PetscErrorCode *ierr)
2353f149594SLisandro Dalcin {
2368d359177SBarry Smith   *ierr = SNESConvergedDefault(*snes,*it,*a,*b,*c,r,ct);
2373f149594SLisandro Dalcin }
2383f149594SLisandro Dalcin 
239e07f7f94SSatish Balay PETSC_EXTERN void snesconvergedskip_(SNES *snes,PetscInt *it,PetscReal *a,PetscReal *b,PetscReal *c,SNESConvergedReason *r,void *ct,PetscErrorCode *ierr)
2403f149594SLisandro Dalcin {
241e2a6519dSDmitry Karpeev   *ierr = SNESConvergedSkip(*snes,*it,*a,*b,*c,r,ct);
2423f149594SLisandro Dalcin }
2433f149594SLisandro Dalcin 
2448cc058d9SJed 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)
2458e27ec22SSatish Balay {
2468e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(cctx);
2473f22127dSBarry Smith   CHKFORTRANNULLFUNCTION(destroy);
2483f149594SLisandro Dalcin 
2498d359177SBarry Smith   if ((PetscVoidFunction)func == (PetscVoidFunction)snesconvergeddefault_) {
2508d359177SBarry Smith     *ierr = SNESSetConvergenceTest(*snes,SNESConvergedDefault,0,0);
251e07f7f94SSatish Balay   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesconvergedskip_) {
252e2a6519dSDmitry Karpeev     *ierr = SNESSetConvergenceTest(*snes,SNESConvergedSkip,0,0);
2538e27ec22SSatish Balay   } else {
254f6291634SJed Brown     *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.test,(PetscVoidFunction)func,cctx);
255f6291634SJed Brown     if (*ierr) return;
2563f22127dSBarry Smith     if (!destroy) {
2570298fd71SBarry Smith       *ierr = SNESSetConvergenceTest(*snes,oursnestest,*snes,NULL);
2587f7931b9SBarry Smith     } else {
259f6291634SJed Brown       *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.destroy,(PetscVoidFunction)destroy,cctx);
260f6291634SJed Brown       if (!*ierr) *ierr = SNESSetConvergenceTest(*snes,oursnestest,*snes,ourdestroy);
2617f7931b9SBarry Smith     }
2628e27ec22SSatish Balay   }
2638e27ec22SSatish Balay }
2648e27ec22SSatish Balay /*----------------------------------------------------------------------*/
2658e27ec22SSatish Balay 
2668cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snesview_(SNES *snes,PetscViewer *viewer, PetscErrorCode *ierr)
2678e27ec22SSatish Balay {
2688e27ec22SSatish Balay   PetscViewer v;
2698e27ec22SSatish Balay   PetscPatchDefaultViewers_Fortran(viewer,v);
2708e27ec22SSatish Balay   *ierr = SNESView(*snes,v);
2718e27ec22SSatish Balay }
2728e27ec22SSatish Balay 
2738e27ec22SSatish Balay /*  func is currently ignored from Fortran */
2748cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snesgetjacobian_(SNES *snes,Mat *A,Mat *B,int *func,void **ctx,PetscErrorCode *ierr)
2758e27ec22SSatish Balay {
2768e27ec22SSatish Balay   CHKFORTRANNULLINTEGER(ctx);
2778e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(A);
2788e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(B);
2790298fd71SBarry Smith   *ierr = SNESGetJacobian(*snes,A,B,0,NULL); if (*ierr) return;
2800298fd71SBarry Smith   *ierr = PetscObjectGetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.jacobian,NULL,ctx);
281f2e0d3f1SJed Brown 
2828e27ec22SSatish Balay }
2838e27ec22SSatish Balay 
2848cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snesgetconvergencehistory_(SNES *snes,PetscInt *na,PetscErrorCode *ierr)
2858e27ec22SSatish Balay {
2860298fd71SBarry Smith   *ierr = SNESGetConvergenceHistory(*snes,NULL,NULL,na);
2878e27ec22SSatish Balay }
2888e27ec22SSatish Balay 
289*390e1bf2SBarry Smith PETSC_EXTERN void PETSC_STDCALL snessettype_(SNES *snes,char* type PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
2908e27ec22SSatish Balay {
2918e27ec22SSatish Balay   char *t;
2928e27ec22SSatish Balay 
2938e27ec22SSatish Balay   FIXCHAR(type,len,t);
2948e27ec22SSatish Balay   *ierr = SNESSetType(*snes,t);
2958e27ec22SSatish Balay   FREECHAR(type,t);
2968e27ec22SSatish Balay }
2978e27ec22SSatish Balay 
298*390e1bf2SBarry Smith PETSC_EXTERN void PETSC_STDCALL snesappendoptionsprefix_(SNES *snes,char* prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
2998e27ec22SSatish Balay {
3008e27ec22SSatish Balay   char *t;
3018e27ec22SSatish Balay 
3028e27ec22SSatish Balay   FIXCHAR(prefix,len,t);
3038e27ec22SSatish Balay   *ierr = SNESAppendOptionsPrefix(*snes,t);
3048e27ec22SSatish Balay   FREECHAR(prefix,t);
3058e27ec22SSatish Balay }
3068e27ec22SSatish Balay 
307*390e1bf2SBarry Smith PETSC_EXTERN void PETSC_STDCALL snessetoptionsprefix_(SNES *snes,char* prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
3088e27ec22SSatish Balay {
3098e27ec22SSatish Balay   char *t;
3108e27ec22SSatish Balay 
3118e27ec22SSatish Balay   FIXCHAR(prefix,len,t);
3128e27ec22SSatish Balay   *ierr = SNESSetOptionsPrefix(*snes,t);
3138e27ec22SSatish Balay   FREECHAR(prefix,t);
3148e27ec22SSatish Balay }
3158e27ec22SSatish Balay 
3168e27ec22SSatish Balay /*----------------------------------------------------------------------*/
3178e27ec22SSatish Balay /* functions, hence no STDCALL */
3188e27ec22SSatish Balay 
3199611d799SBarry Smith PETSC_EXTERN void snesmonitorlgresidualnorm_(SNES *snes,PetscInt *its,PetscReal *fgnorm,PetscObject *dummy,PetscErrorCode *ierr)
3208e27ec22SSatish Balay {
3214619e776SBarry Smith   *ierr = SNESMonitorLGResidualNorm(*snes,*its,*fgnorm,dummy);
3228e27ec22SSatish Balay }
3238e27ec22SSatish Balay 
32452f0073cSBarry Smith PETSC_EXTERN void snesmonitordefault_(SNES *snes,PetscInt *its,PetscReal *fgnorm,PetscViewerAndFormat **dummy,PetscErrorCode *ierr)
3258e27ec22SSatish Balay {
326410efd14SBarry Smith   *ierr = SNESMonitorDefault(*snes,*its,*fgnorm,*dummy);
3278e27ec22SSatish Balay }
3288e27ec22SSatish Balay 
32952f0073cSBarry Smith PETSC_EXTERN void snesmonitorsolution_(SNES *snes,PetscInt *its,PetscReal *fgnorm,PetscViewerAndFormat **dummy,PetscErrorCode *ierr)
3308e27ec22SSatish Balay {
331410efd14SBarry Smith   *ierr = SNESMonitorSolution(*snes,*its,*fgnorm,*dummy);
3328e27ec22SSatish Balay }
3338e27ec22SSatish Balay 
33452f0073cSBarry Smith PETSC_EXTERN void snesmonitorsolutionupdate_(SNES *snes,PetscInt *its,PetscReal *fgnorm,PetscViewerAndFormat **dummy,PetscErrorCode *ierr)
3358e27ec22SSatish Balay {
336410efd14SBarry Smith   *ierr = SNESMonitorSolutionUpdate(*snes,*its,*fgnorm,*dummy);
3378e27ec22SSatish Balay }
3388e27ec22SSatish Balay 
3398e27ec22SSatish Balay 
3408cc058d9SJed 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)
3418e27ec22SSatish Balay {
3428e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(mctx);
343a6570f20SBarry Smith   if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitordefault_) {
3441cb03803SBarry Smith     *ierr = SNESMonitorSet(*snes,(PetscErrorCode (*)(SNES,PetscInt,PetscReal,void*))SNESMonitorDefault,*(PetscViewerAndFormat**)mctx,(PetscErrorCode (*)(void **))PetscViewerAndFormatDestroy);
345a6570f20SBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorsolution_) {
3461cb03803SBarry Smith     *ierr = SNESMonitorSet(*snes,(PetscErrorCode (*)(SNES,PetscInt,PetscReal,void*))SNESMonitorSolution,*(PetscViewerAndFormat**)mctx,(PetscErrorCode (*)(void **))PetscViewerAndFormatDestroy);
347a6570f20SBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorsolutionupdate_) {
3481cb03803SBarry Smith     *ierr = SNESMonitorSet(*snes,(PetscErrorCode (*)(SNES,PetscInt,PetscReal,void*))SNESMonitorSolutionUpdate,*(PetscViewerAndFormat**)mctx,(PetscErrorCode (*)(void **))PetscViewerAndFormatDestroy);
3494619e776SBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorlgresidualnorm_) {
3503e7ff0edSBarry Smith     *ierr = SNESMonitorSet(*snes,(PetscErrorCode (*)(SNES,PetscInt,PetscReal,void*))SNESMonitorLGResidualNorm,0,0);
3518e27ec22SSatish Balay   } else {
352f6291634SJed Brown     *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.monitor,(PetscVoidFunction)func,mctx);
353f6291634SJed Brown     if (*ierr) return;
3548e27ec22SSatish Balay     if (FORTRANNULLFUNCTION(mondestroy)) {
3550298fd71SBarry Smith       *ierr = SNESMonitorSet(*snes,oursnesmonitor,*snes,NULL);
3568e27ec22SSatish Balay     } else {
3575d4ebb51SBarry Smith       CHKFORTRANNULLFUNCTION(mondestroy);
358f6291634SJed Brown       *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.mondestroy,(PetscVoidFunction)mondestroy,mctx);
359f6291634SJed Brown       if (!*ierr) *ierr = SNESMonitorSet(*snes,oursnesmonitor,*snes,ourmondestroy);
3608e27ec22SSatish Balay     }
3618e27ec22SSatish Balay   }
3628e27ec22SSatish Balay }
3638e27ec22SSatish Balay 
364