xref: /petsc/src/snes/interface/ftn-custom/zsnesf.c (revision 89e00c7d532eb645161aa09c4a076766d0a0a682)
1b45d2f2cSJed Brown #include <petsc-private/fortranimpl.h>
2c6db04a5SJed Brown #include <petscsnes.h>
3665c2dedSJed Brown #include <petscviewer.h>
4*89e00c7dSSatish 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
168e27ec22SSatish Balay #define snesgetfunction_                 SNESGETFUNCTION
17be95d8f1SBarry Smith #define snesgetngs_                       SNESGETNGS
188e27ec22SSatish Balay #define snessetconvergencetest_          SNESSETCONVERGENCETEST
198d359177SBarry Smith #define snesconvergeddefault_            SNESCONVERGEDDEFAULT
20e07f7f94SSatish Balay #define snesconvergedskip_               SNESCONVERGEDSKIP
218e27ec22SSatish Balay #define snesview_                        SNESVIEW
228e27ec22SSatish Balay #define snesgetconvergencehistory_       SNESGETCONVERGENCEHISTORY
238e27ec22SSatish Balay #define snesgetjacobian_                 SNESGETJACOBIAN
248e27ec22SSatish Balay #define snessettype_                     SNESSETTYPE
258e27ec22SSatish Balay #define snesappendoptionsprefix_         SNESAPPENDOPTIONSPREFIX
268e27ec22SSatish Balay #define snessetoptionsprefix_            SNESSETOPTIONSPREFIX
27a6570f20SBarry Smith #define snesmonitordefault_              SNESMONITORDEFAULT
28a6570f20SBarry Smith #define snesmonitorsolution_             SNESMONITORSOLUTION
294619e776SBarry Smith #define snesmonitorlgresidualnorm_       SNESMONITORLGRESIDUALNORM
30a6570f20SBarry Smith #define snesmonitorsolutionupdate_       SNESMONITORSOLUTIONUPDATE
31a6570f20SBarry Smith #define snesmonitorset_                  SNESMONITORSET
328e27ec22SSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
33df66969eSBarry Smith #define matmffdcomputejacobian_          matmffdcomputejacobian
346ce558aeSBarry Smith #define snessolve_                       snessolve
358d359177SBarry Smith #define snescomputejacobiandefault_      snescomputejacobiandefault
368d359177SBarry Smith #define snescomputejacobiandefaultcolor_ snescomputejacobiandefaultcolor
378e27ec22SSatish Balay #define snessetjacobian_                 snessetjacobian
388e27ec22SSatish Balay #define snesgetoptionsprefix_            snesgetoptionsprefix
398e27ec22SSatish Balay #define snesgettype_                     snesgettype
408e27ec22SSatish Balay #define snessetfunction_                 snessetfunction
41be95d8f1SBarry Smith #define snessetngs_                       snessetngs
428e27ec22SSatish Balay #define snesgetfunction_                 snesgetfunction
43be95d8f1SBarry Smith #define snesgetngs_                       snesgetngs
448e27ec22SSatish Balay #define snessetconvergencetest_          snessetconvergencetest
458d359177SBarry Smith #define snesconvergeddefault_            snesconvergeddefault
46e07f7f94SSatish Balay #define snesconvergedskip_               snesconvergedskip
478e27ec22SSatish Balay #define snesview_                        snesview
488e27ec22SSatish Balay #define snesgetjacobian_                 snesgetjacobian
498e27ec22SSatish Balay #define snesgetconvergencehistory_       snesgetconvergencehistory
508e27ec22SSatish Balay #define snessettype_                     snessettype
518e27ec22SSatish Balay #define snesappendoptionsprefix_         snesappendoptionsprefix
528e27ec22SSatish Balay #define snessetoptionsprefix_            snessetoptionsprefix
534619e776SBarry Smith #define snesmonitorlgresidualnorm_       snesmonitorlgresidualnorm
54a6570f20SBarry Smith #define snesmonitordefault_              snesmonitordefault
55a6570f20SBarry Smith #define snesmonitorsolution_             snesmonitorsolution
56a6570f20SBarry Smith #define snesmonitorsolutionupdate_       snesmonitorsolutionupdate
57a6570f20SBarry Smith #define snesmonitorset_                  snesmonitorset
588e27ec22SSatish Balay #endif
598e27ec22SSatish Balay 
60f6291634SJed Brown static struct {
61f6291634SJed Brown   PetscFortranCallbackId function;
62f6291634SJed Brown   PetscFortranCallbackId test;
63f6291634SJed Brown   PetscFortranCallbackId destroy;
64f6291634SJed Brown   PetscFortranCallbackId jacobian;
65f6291634SJed Brown   PetscFortranCallbackId monitor;
66f6291634SJed Brown   PetscFortranCallbackId mondestroy;
67be95d8f1SBarry Smith   PetscFortranCallbackId ngs;
68*89e00c7dSSatish Balay #if defined(PETSC_HAVE_F90_2PTR_ARG)
69*89e00c7dSSatish Balay   PetscFortranCallbackId function_pgiptr;
70*89e00c7dSSatish Balay #endif
71f6291634SJed Brown } _cb;
7290b77ac2SPeter Brune 
73de64c4c2SJed Brown #undef __FUNCT__
74de64c4c2SJed Brown #define __FUNCT__ "oursnesfunction"
758e27ec22SSatish Balay static PetscErrorCode oursnesfunction(SNES snes,Vec x,Vec f,void *ctx)
768e27ec22SSatish Balay {
77*89e00c7dSSatish Balay #if defined(PETSC_HAVE_F90_2PTR_ARG)
78*89e00c7dSSatish Balay   void* ptr;
79*89e00c7dSSatish Balay   PetscObjectGetFortranCallback((PetscObject)snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.function_pgiptr,NULL,&ptr);
80*89e00c7dSSatish Balay #endif
81*89e00c7dSSatish 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)));
828e27ec22SSatish Balay }
83b8ebb45fSBarry Smith 
84de64c4c2SJed Brown #undef __FUNCT__
85de64c4c2SJed Brown #define __FUNCT__ "oursnestest"
8606ee9f85SBarry Smith static PetscErrorCode oursnestest(SNES snes,PetscInt it,PetscReal a,PetscReal d,PetscReal c,SNESConvergedReason *reason,void *ctx)
878e27ec22SSatish Balay {
88f6291634SJed Brown   PetscObjectUseFortranCallback(snes,_cb.test,(SNES*,PetscInt*,PetscReal*,PetscReal*,PetscReal*,SNESConvergedReason*,void*,PetscErrorCode*),(&snes,&it,&a,&d,&c,reason,_ctx,&ierr));
897f7931b9SBarry Smith }
907f7931b9SBarry Smith 
91de64c4c2SJed Brown #undef __FUNCT__
92de64c4c2SJed Brown #define __FUNCT__ "ourdestroy"
937f7931b9SBarry Smith static PetscErrorCode ourdestroy(void *ctx)
947f7931b9SBarry Smith {
95f6291634SJed Brown   PetscObjectUseFortranCallback(ctx,_cb.destroy,(void*,PetscErrorCode*),(_ctx,&ierr));
968e27ec22SSatish Balay }
978e27ec22SSatish Balay 
98de64c4c2SJed Brown #undef __FUNCT__
99de64c4c2SJed Brown #define __FUNCT__ "oursnesjacobian"
100d1e9a80fSBarry Smith static PetscErrorCode oursnesjacobian(SNES snes,Vec x,Mat m,Mat p,void *ctx)
1018e27ec22SSatish Balay {
102d1e9a80fSBarry Smith   PetscObjectUseFortranCallback(snes,_cb.jacobian,(SNES*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),(&snes,&x,&m,&p,_ctx,&ierr));
1038e27ec22SSatish Balay }
104f6291634SJed Brown 
105de64c4c2SJed Brown #undef __FUNCT__
106be95d8f1SBarry Smith #define __FUNCT__ "oursnesngs"
107be95d8f1SBarry Smith static PetscErrorCode oursnesngs(SNES snes,Vec x,Vec b,void *ctx)
10890b77ac2SPeter Brune {
109be95d8f1SBarry Smith   PetscObjectUseFortranCallback(snes,_cb.ngs,(SNES*,Vec*,Vec*,void*,PetscErrorCode*),(&snes,&x,&b,_ctx,&ierr));
11090b77ac2SPeter Brune }
111de64c4c2SJed Brown #undef __FUNCT__
112de64c4c2SJed Brown #define __FUNCT__ "oursnesmonitor"
1138e27ec22SSatish Balay static PetscErrorCode oursnesmonitor(SNES snes,PetscInt i,PetscReal d,void *ctx)
1148e27ec22SSatish Balay {
115f6291634SJed Brown   PetscObjectUseFortranCallback(snes,_cb.monitor,(SNES*,PetscInt*,PetscReal*,void*,PetscErrorCode*),(&snes,&i,&d,_ctx,&ierr));
1168e27ec22SSatish Balay }
117de64c4c2SJed Brown #undef __FUNCT__
118de64c4c2SJed Brown #define __FUNCT__ "ourmondestroy"
119c2efdce3SBarry Smith static PetscErrorCode ourmondestroy(void **ctx)
1208e27ec22SSatish Balay {
121f6291634SJed Brown   SNES snes = (SNES)*ctx;
122f6291634SJed Brown   PetscObjectUseFortranCallback(snes,_cb.mondestroy,(void*,PetscErrorCode*),(_ctx,&ierr));
1238e27ec22SSatish Balay }
1248e27ec22SSatish Balay 
1258e27ec22SSatish Balay /* ---------------------------------------------------------*/
1268e27ec22SSatish Balay /*
1278d359177SBarry Smith      snescomputejacobiandefault() and snescomputejacobiandefaultcolor()
1288e27ec22SSatish Balay   These can be used directly from Fortran but are mostly so that
1298e27ec22SSatish Balay   Fortran SNESSetJacobian() will properly handle the defaults being passed in.
1308e27ec22SSatish Balay 
1318e27ec22SSatish Balay   functions, hence no STDCALL
1328e27ec22SSatish Balay */
133d1e9a80fSBarry Smith PETSC_EXTERN void matmffdcomputejacobian_(SNES *snes,Vec *x,Mat *m,Mat *p,void *ctx,PetscErrorCode *ierr)
134df66969eSBarry Smith {
135d1e9a80fSBarry Smith   *ierr = MatMFFDComputeJacobian(*snes,*x,*m,*p,ctx);
136df66969eSBarry Smith }
137d1e9a80fSBarry Smith PETSC_EXTERN void snescomputejacobiandefault_(SNES *snes,Vec *x,Mat *m,Mat *p,void *ctx,PetscErrorCode *ierr)
1388e27ec22SSatish Balay {
139d1e9a80fSBarry Smith   *ierr = SNESComputeJacobianDefault(*snes,*x,*m,*p,ctx);
1408e27ec22SSatish Balay }
141d1e9a80fSBarry Smith PETSC_EXTERN void  snescomputejacobiandefaultcolor_(SNES *snes,Vec *x,Mat *m,Mat *p,void *ctx,PetscErrorCode *ierr)
1428e27ec22SSatish Balay {
143d1e9a80fSBarry Smith   *ierr = SNESComputeJacobianDefaultColor(*snes,*x,*m,*p,*(MatFDColoring*)ctx);
1448e27ec22SSatish Balay }
1458e27ec22SSatish Balay 
1468cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snessetjacobian_(SNES *snes,Mat *A,Mat *B,
147d1e9a80fSBarry Smith                                     void (PETSC_STDCALL *func)(SNES*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),
148f5af7f23SKarl Rupp                                     void *ctx,PetscErrorCode *ierr)
1498e27ec22SSatish Balay {
1508e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(ctx);
151f5b6597dSBarry Smith   CHKFORTRANNULLFUNCTION(func);
1528d359177SBarry Smith   if ((PetscVoidFunction)func == (PetscVoidFunction)snescomputejacobiandefault_) {
1538d359177SBarry Smith     *ierr = SNESSetJacobian(*snes,*A,*B,SNESComputeJacobianDefault,ctx);
1548d359177SBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snescomputejacobiandefaultcolor_) {
1558d359177SBarry Smith     *ierr = SNESSetJacobian(*snes,*A,*B,SNESComputeJacobianDefaultColor,*(MatFDColoring*)ctx);
156df66969eSBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)matmffdcomputejacobian_) {
157df66969eSBarry Smith     *ierr = SNESSetJacobian(*snes,*A,*B,MatMFFDComputeJacobian,ctx);
158f5b6597dSBarry Smith   } else if (!func) {
159f5b6597dSBarry Smith     *ierr = SNESSetJacobian(*snes,*A,*B,0,ctx);
1608e27ec22SSatish Balay   } else {
161f6291634SJed Brown     *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.jacobian,(PetscVoidFunction)func,ctx);
1620298fd71SBarry Smith     if (!*ierr) *ierr = SNESSetJacobian(*snes,*A,*B,oursnesjacobian,NULL);
1638e27ec22SSatish Balay   }
1648e27ec22SSatish Balay }
1658e27ec22SSatish Balay /* -------------------------------------------------------------*/
1668e27ec22SSatish Balay 
1678cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snessolve_(SNES *snes,Vec *b,Vec *x, int *__ierr)
1686ce558aeSBarry Smith {
169a69afd8bSBarry Smith   Vec B = *b,X = *x;
1700298fd71SBarry Smith   if (FORTRANNULLOBJECT(b)) B = NULL;
1710298fd71SBarry Smith   if (FORTRANNULLOBJECT(x)) X = NULL;
172a69afd8bSBarry Smith   *__ierr = SNESSolve(*snes,B,X);
1736ce558aeSBarry Smith }
1746ce558aeSBarry Smith 
1758cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snesgetoptionsprefix_(SNES *snes,CHAR prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
1768e27ec22SSatish Balay {
1778e27ec22SSatish Balay   const char *tname;
1788e27ec22SSatish Balay 
1798e27ec22SSatish Balay   *ierr = SNESGetOptionsPrefix(*snes,&tname);
1808e27ec22SSatish Balay   *ierr = PetscStrncpy(prefix,tname,len);if (*ierr) return;
1818e27ec22SSatish Balay }
1828e27ec22SSatish Balay 
1838cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snesgettype_(SNES *snes,CHAR name PETSC_MIXED_LEN(len), PetscErrorCode *ierr PETSC_END_LEN(len))
1848e27ec22SSatish Balay {
1858e27ec22SSatish Balay   const char *tname;
1868e27ec22SSatish Balay 
1878e27ec22SSatish Balay   *ierr = SNESGetType(*snes,&tname);
1888e27ec22SSatish Balay   *ierr = PetscStrncpy(name,tname,len);if (*ierr) return;
1897c363081SBarry Smith   FIXRETURNCHAR(PETSC_TRUE,name,len);
1908e27ec22SSatish Balay }
191e3da1266SHong Zhang 
1928e27ec22SSatish Balay /* ---------------------------------------------------------*/
1938e27ec22SSatish Balay 
1948e27ec22SSatish Balay /*
1958e27ec22SSatish Balay    These are not usually called from Fortran but allow Fortran users
1968e27ec22SSatish Balay    to transparently set these monitors from .F code
1978e27ec22SSatish Balay 
1988e27ec22SSatish Balay    functions, hence no STDCALL
1998e27ec22SSatish Balay */
2008e27ec22SSatish Balay 
201*89e00c7dSSatish 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))
2028e27ec22SSatish Balay {
2038e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(ctx);
204f6291634SJed Brown   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.function,(PetscVoidFunction)func,ctx);
205*89e00c7dSSatish Balay #if defined(PETSC_HAVE_F90_2PTR_ARG)
206*89e00c7dSSatish Balay   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.function_pgiptr,PETSC_NULL,ptr);
207*89e00c7dSSatish Balay #endif
2080298fd71SBarry Smith   if (!*ierr) *ierr = SNESSetFunction(*snes,*r,oursnesfunction,NULL);
2098e27ec22SSatish Balay }
210c79ef259SPeter Brune 
211c79ef259SPeter Brune 
212be95d8f1SBarry Smith PETSC_EXTERN void PETSC_STDCALL snessetngs_(SNES *snes,void (PETSC_STDCALL *func)(SNES*,Vec*,Vec*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr)
213c79ef259SPeter Brune {
214c79ef259SPeter Brune   CHKFORTRANNULLOBJECT(ctx);
215be95d8f1SBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.ngs,(PetscVoidFunction)func,ctx);
216be95d8f1SBarry Smith   if (!*ierr) *ierr = SNESSetNGS(*snes,oursnesngs,NULL);
217c79ef259SPeter Brune }
2188e27ec22SSatish Balay /* ---------------------------------------------------------*/
2198e27ec22SSatish Balay 
2208e27ec22SSatish Balay /* the func argument is ignored */
2218cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snesgetfunction_(SNES *snes,Vec *r,void *func,void **ctx,PetscErrorCode *ierr)
2228e27ec22SSatish Balay {
2238e27ec22SSatish Balay   CHKFORTRANNULLINTEGER(ctx);
2248e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(r);
2250298fd71SBarry Smith   *ierr = SNESGetFunction(*snes,r,NULL,NULL); if (*ierr) return;
2260298fd71SBarry Smith   *ierr = PetscObjectGetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.function,NULL,ctx);
2278e27ec22SSatish Balay }
228c79ef259SPeter Brune 
229be95d8f1SBarry Smith PETSC_EXTERN void PETSC_STDCALL snesgetngs_(SNES *snes,void *func,void **ctx,PetscErrorCode *ierr)
230c79ef259SPeter Brune {
231c79ef259SPeter Brune   CHKFORTRANNULLINTEGER(ctx);
232be95d8f1SBarry Smith   *ierr = PetscObjectGetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.ngs,NULL,ctx);
233c79ef259SPeter Brune }
234c79ef259SPeter Brune 
2358e27ec22SSatish Balay /*----------------------------------------------------------------------*/
2368e27ec22SSatish Balay 
23769c1e2abSSatish Balay PETSC_EXTERN void snesconvergeddefault_(SNES *snes,PetscInt *it,PetscReal *a,PetscReal *b,PetscReal *c,SNESConvergedReason *r, void *ct,PetscErrorCode *ierr)
2383f149594SLisandro Dalcin {
2398d359177SBarry Smith   *ierr = SNESConvergedDefault(*snes,*it,*a,*b,*c,r,ct);
2403f149594SLisandro Dalcin }
2413f149594SLisandro Dalcin 
242e07f7f94SSatish Balay PETSC_EXTERN void snesconvergedskip_(SNES *snes,PetscInt *it,PetscReal *a,PetscReal *b,PetscReal *c,SNESConvergedReason *r,void *ct,PetscErrorCode *ierr)
2433f149594SLisandro Dalcin {
244e2a6519dSDmitry Karpeev   *ierr = SNESConvergedSkip(*snes,*it,*a,*b,*c,r,ct);
2453f149594SLisandro Dalcin }
2463f149594SLisandro Dalcin 
2478cc058d9SJed 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)
2488e27ec22SSatish Balay {
2498e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(cctx);
2503f22127dSBarry Smith   CHKFORTRANNULLFUNCTION(destroy);
2513f149594SLisandro Dalcin 
2528d359177SBarry Smith   if ((PetscVoidFunction)func == (PetscVoidFunction)snesconvergeddefault_) {
2538d359177SBarry Smith     *ierr = SNESSetConvergenceTest(*snes,SNESConvergedDefault,0,0);
254e07f7f94SSatish Balay   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesconvergedskip_) {
255e2a6519dSDmitry Karpeev     *ierr = SNESSetConvergenceTest(*snes,SNESConvergedSkip,0,0);
2568e27ec22SSatish Balay   } else {
257f6291634SJed Brown     *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.test,(PetscVoidFunction)func,cctx);
258f6291634SJed Brown     if (*ierr) return;
2593f22127dSBarry Smith     if (!destroy) {
2600298fd71SBarry Smith       *ierr = SNESSetConvergenceTest(*snes,oursnestest,*snes,NULL);
2617f7931b9SBarry Smith     } else {
262f6291634SJed Brown       *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.destroy,(PetscVoidFunction)destroy,cctx);
263f6291634SJed Brown       if (!*ierr) *ierr = SNESSetConvergenceTest(*snes,oursnestest,*snes,ourdestroy);
2647f7931b9SBarry Smith     }
2658e27ec22SSatish Balay   }
2668e27ec22SSatish Balay }
2678e27ec22SSatish Balay /*----------------------------------------------------------------------*/
2688e27ec22SSatish Balay 
2698cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snesview_(SNES *snes,PetscViewer *viewer, PetscErrorCode *ierr)
2708e27ec22SSatish Balay {
2718e27ec22SSatish Balay   PetscViewer v;
2728e27ec22SSatish Balay   PetscPatchDefaultViewers_Fortran(viewer,v);
2738e27ec22SSatish Balay   *ierr = SNESView(*snes,v);
2748e27ec22SSatish Balay }
2758e27ec22SSatish Balay 
2768e27ec22SSatish Balay /*  func is currently ignored from Fortran */
2778cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snesgetjacobian_(SNES *snes,Mat *A,Mat *B,int *func,void **ctx,PetscErrorCode *ierr)
2788e27ec22SSatish Balay {
2798e27ec22SSatish Balay   CHKFORTRANNULLINTEGER(ctx);
2808e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(A);
2818e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(B);
2820298fd71SBarry Smith   *ierr = SNESGetJacobian(*snes,A,B,0,NULL); if (*ierr) return;
2830298fd71SBarry Smith   *ierr = PetscObjectGetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.jacobian,NULL,ctx);
284f2e0d3f1SJed Brown 
2858e27ec22SSatish Balay }
2868e27ec22SSatish Balay 
2878cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snesgetconvergencehistory_(SNES *snes,PetscInt *na,PetscErrorCode *ierr)
2888e27ec22SSatish Balay {
2890298fd71SBarry Smith   *ierr = SNESGetConvergenceHistory(*snes,NULL,NULL,na);
2908e27ec22SSatish Balay }
2918e27ec22SSatish Balay 
2928cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snessettype_(SNES *snes,CHAR type PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
2938e27ec22SSatish Balay {
2948e27ec22SSatish Balay   char *t;
2958e27ec22SSatish Balay 
2968e27ec22SSatish Balay   FIXCHAR(type,len,t);
2978e27ec22SSatish Balay   *ierr = SNESSetType(*snes,t);
2988e27ec22SSatish Balay   FREECHAR(type,t);
2998e27ec22SSatish Balay }
3008e27ec22SSatish Balay 
3018cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snesappendoptionsprefix_(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 = SNESAppendOptionsPrefix(*snes,t);
3078e27ec22SSatish Balay   FREECHAR(prefix,t);
3088e27ec22SSatish Balay }
3098e27ec22SSatish Balay 
3108cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snessetoptionsprefix_(SNES *snes,CHAR prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
3118e27ec22SSatish Balay {
3128e27ec22SSatish Balay   char *t;
3138e27ec22SSatish Balay 
3148e27ec22SSatish Balay   FIXCHAR(prefix,len,t);
3158e27ec22SSatish Balay   *ierr = SNESSetOptionsPrefix(*snes,t);
3168e27ec22SSatish Balay   FREECHAR(prefix,t);
3178e27ec22SSatish Balay }
3188e27ec22SSatish Balay 
3198e27ec22SSatish Balay /*----------------------------------------------------------------------*/
3208e27ec22SSatish Balay /* functions, hence no STDCALL */
3218e27ec22SSatish Balay 
32269c1e2abSSatish Balay PETSC_EXTERN void snesmonitorlgresidualnorm_(SNES *snes,PetscInt *its,PetscReal *fgnorm,void *dummy,PetscErrorCode *ierr)
3238e27ec22SSatish Balay {
3244619e776SBarry Smith   *ierr = SNESMonitorLGResidualNorm(*snes,*its,*fgnorm,dummy);
3258e27ec22SSatish Balay }
3268e27ec22SSatish Balay 
32769c1e2abSSatish Balay PETSC_EXTERN void snesmonitordefault_(SNES *snes,PetscInt *its,PetscReal *fgnorm,void *dummy,PetscErrorCode *ierr)
3288e27ec22SSatish Balay {
329a6570f20SBarry Smith   *ierr = SNESMonitorDefault(*snes,*its,*fgnorm,dummy);
3308e27ec22SSatish Balay }
3318e27ec22SSatish Balay 
33269c1e2abSSatish Balay PETSC_EXTERN void snesmonitorsolution_(SNES *snes,PetscInt *its,PetscReal *fgnorm,void *dummy,PetscErrorCode *ierr)
3338e27ec22SSatish Balay {
334a6570f20SBarry Smith   *ierr = SNESMonitorSolution(*snes,*its,*fgnorm,dummy);
3358e27ec22SSatish Balay }
3368e27ec22SSatish Balay 
33769c1e2abSSatish Balay PETSC_EXTERN void snesmonitorsolutionupdate_(SNES *snes,PetscInt *its,PetscReal *fgnorm,void *dummy,PetscErrorCode *ierr)
3388e27ec22SSatish Balay {
339a6570f20SBarry Smith   *ierr = SNESMonitorSolutionUpdate(*snes,*its,*fgnorm,dummy);
3408e27ec22SSatish Balay }
3418e27ec22SSatish Balay 
3428e27ec22SSatish Balay 
3438cc058d9SJed 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)
3448e27ec22SSatish Balay {
3458e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(mctx);
346a6570f20SBarry Smith   if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitordefault_) {
347a6570f20SBarry Smith     *ierr = SNESMonitorSet(*snes,SNESMonitorDefault,0,0);
348a6570f20SBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorsolution_) {
349a6570f20SBarry Smith     *ierr = SNESMonitorSet(*snes,SNESMonitorSolution,0,0);
350a6570f20SBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorsolutionupdate_) {
351a6570f20SBarry Smith     *ierr = SNESMonitorSet(*snes,SNESMonitorSolutionUpdate,0,0);
3524619e776SBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorlgresidualnorm_) {
3534619e776SBarry Smith     *ierr = SNESMonitorSet(*snes,SNESMonitorLGResidualNorm,0,0);
3548e27ec22SSatish Balay   } else {
355f6291634SJed Brown     *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.monitor,(PetscVoidFunction)func,mctx);
356f6291634SJed Brown     if (*ierr) return;
3578e27ec22SSatish Balay     if (FORTRANNULLFUNCTION(mondestroy)) {
3580298fd71SBarry Smith       *ierr = SNESMonitorSet(*snes,oursnesmonitor,*snes,NULL);
3598e27ec22SSatish Balay     } else {
3605d4ebb51SBarry Smith       CHKFORTRANNULLFUNCTION(mondestroy);
361f6291634SJed Brown       *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.mondestroy,(PetscVoidFunction)mondestroy,mctx);
362f6291634SJed Brown       if (!*ierr) *ierr = SNESMonitorSet(*snes,oursnesmonitor,*snes,ourmondestroy);
3638e27ec22SSatish Balay     }
3648e27ec22SSatish Balay   }
3658e27ec22SSatish Balay }
3668e27ec22SSatish Balay 
367