xref: /petsc/src/snes/interface/ftn-custom/zsnesf.c (revision d6a8cea5419293b7d10e987177d1145f4c9c28b6)
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 
76de64c4c2SJed Brown #undef __FUNCT__
77de64c4c2SJed Brown #define __FUNCT__ "oursnesfunction"
788e27ec22SSatish Balay static PetscErrorCode oursnesfunction(SNES snes,Vec x,Vec f,void *ctx)
798e27ec22SSatish Balay {
8089e00c7dSSatish Balay #if defined(PETSC_HAVE_F90_2PTR_ARG)
8189e00c7dSSatish Balay   void* ptr;
8289e00c7dSSatish Balay   PetscObjectGetFortranCallback((PetscObject)snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.function_pgiptr,NULL,&ptr);
8389e00c7dSSatish Balay #endif
8489e00c7dSSatish 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)));
858e27ec22SSatish Balay }
86b8ebb45fSBarry Smith 
87de64c4c2SJed Brown #undef __FUNCT__
88de64c4c2SJed Brown #define __FUNCT__ "oursnestest"
8906ee9f85SBarry Smith static PetscErrorCode oursnestest(SNES snes,PetscInt it,PetscReal a,PetscReal d,PetscReal c,SNESConvergedReason *reason,void *ctx)
908e27ec22SSatish Balay {
91f6291634SJed Brown   PetscObjectUseFortranCallback(snes,_cb.test,(SNES*,PetscInt*,PetscReal*,PetscReal*,PetscReal*,SNESConvergedReason*,void*,PetscErrorCode*),(&snes,&it,&a,&d,&c,reason,_ctx,&ierr));
927f7931b9SBarry Smith }
937f7931b9SBarry Smith 
94de64c4c2SJed Brown #undef __FUNCT__
95de64c4c2SJed Brown #define __FUNCT__ "ourdestroy"
967f7931b9SBarry Smith static PetscErrorCode ourdestroy(void *ctx)
977f7931b9SBarry Smith {
98f6291634SJed Brown   PetscObjectUseFortranCallback(ctx,_cb.destroy,(void*,PetscErrorCode*),(_ctx,&ierr));
998e27ec22SSatish Balay }
1008e27ec22SSatish Balay 
101de64c4c2SJed Brown #undef __FUNCT__
102de64c4c2SJed Brown #define __FUNCT__ "oursnesjacobian"
103d1e9a80fSBarry Smith static PetscErrorCode oursnesjacobian(SNES snes,Vec x,Mat m,Mat p,void *ctx)
1048e27ec22SSatish Balay {
105d1e9a80fSBarry Smith   PetscObjectUseFortranCallback(snes,_cb.jacobian,(SNES*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),(&snes,&x,&m,&p,_ctx,&ierr));
1068e27ec22SSatish Balay }
107f6291634SJed Brown 
108de64c4c2SJed Brown #undef __FUNCT__
109dfef22ccSBarry Smith #define __FUNCT__ "oursnesupdate"
110dfef22ccSBarry Smith static PetscErrorCode oursnesupdate(SNES snes,PetscInt i)
111dfef22ccSBarry Smith {
112dfef22ccSBarry Smith   PetscObjectUseFortranCallback(snes,_cb.update,(SNES*,PetscInt *,PetscErrorCode*),(&snes,&i,&ierr));
113dfef22ccSBarry Smith }
114dfef22ccSBarry Smith #undef __FUNCT__
115be95d8f1SBarry Smith #define __FUNCT__ "oursnesngs"
116be95d8f1SBarry Smith static PetscErrorCode oursnesngs(SNES snes,Vec x,Vec b,void *ctx)
11790b77ac2SPeter Brune {
118be95d8f1SBarry Smith   PetscObjectUseFortranCallback(snes,_cb.ngs,(SNES*,Vec*,Vec*,void*,PetscErrorCode*),(&snes,&x,&b,_ctx,&ierr));
11990b77ac2SPeter Brune }
120de64c4c2SJed Brown #undef __FUNCT__
121de64c4c2SJed Brown #define __FUNCT__ "oursnesmonitor"
1228e27ec22SSatish Balay static PetscErrorCode oursnesmonitor(SNES snes,PetscInt i,PetscReal d,void *ctx)
1238e27ec22SSatish Balay {
124f6291634SJed Brown   PetscObjectUseFortranCallback(snes,_cb.monitor,(SNES*,PetscInt*,PetscReal*,void*,PetscErrorCode*),(&snes,&i,&d,_ctx,&ierr));
1258e27ec22SSatish Balay }
126de64c4c2SJed Brown #undef __FUNCT__
127de64c4c2SJed Brown #define __FUNCT__ "ourmondestroy"
128c2efdce3SBarry Smith static PetscErrorCode ourmondestroy(void **ctx)
1298e27ec22SSatish Balay {
130f6291634SJed Brown   SNES snes = (SNES)*ctx;
131f6291634SJed Brown   PetscObjectUseFortranCallback(snes,_cb.mondestroy,(void*,PetscErrorCode*),(_ctx,&ierr));
1328e27ec22SSatish Balay }
1338e27ec22SSatish Balay 
1348e27ec22SSatish Balay /* ---------------------------------------------------------*/
1358e27ec22SSatish Balay /*
1368d359177SBarry Smith      snescomputejacobiandefault() and snescomputejacobiandefaultcolor()
1378e27ec22SSatish Balay   These can be used directly from Fortran but are mostly so that
1388e27ec22SSatish Balay   Fortran SNESSetJacobian() will properly handle the defaults being passed in.
1398e27ec22SSatish Balay 
1408e27ec22SSatish Balay   functions, hence no STDCALL
1418e27ec22SSatish Balay */
142d1e9a80fSBarry Smith PETSC_EXTERN void matmffdcomputejacobian_(SNES *snes,Vec *x,Mat *m,Mat *p,void *ctx,PetscErrorCode *ierr)
143df66969eSBarry Smith {
144d1e9a80fSBarry Smith   *ierr = MatMFFDComputeJacobian(*snes,*x,*m,*p,ctx);
145df66969eSBarry Smith }
146d1e9a80fSBarry Smith PETSC_EXTERN void snescomputejacobiandefault_(SNES *snes,Vec *x,Mat *m,Mat *p,void *ctx,PetscErrorCode *ierr)
1478e27ec22SSatish Balay {
148d1e9a80fSBarry Smith   *ierr = SNESComputeJacobianDefault(*snes,*x,*m,*p,ctx);
1498e27ec22SSatish Balay }
150d1e9a80fSBarry Smith PETSC_EXTERN void  snescomputejacobiandefaultcolor_(SNES *snes,Vec *x,Mat *m,Mat *p,void *ctx,PetscErrorCode *ierr)
1518e27ec22SSatish Balay {
152d1e9a80fSBarry Smith   *ierr = SNESComputeJacobianDefaultColor(*snes,*x,*m,*p,*(MatFDColoring*)ctx);
1538e27ec22SSatish Balay }
1548e27ec22SSatish Balay 
1558cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snessetjacobian_(SNES *snes,Mat *A,Mat *B,
156d1e9a80fSBarry Smith                                     void (PETSC_STDCALL *func)(SNES*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),
157f5af7f23SKarl Rupp                                     void *ctx,PetscErrorCode *ierr)
1588e27ec22SSatish Balay {
1598e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(ctx);
160f5b6597dSBarry Smith   CHKFORTRANNULLFUNCTION(func);
1618d359177SBarry Smith   if ((PetscVoidFunction)func == (PetscVoidFunction)snescomputejacobiandefault_) {
1628d359177SBarry Smith     *ierr = SNESSetJacobian(*snes,*A,*B,SNESComputeJacobianDefault,ctx);
1638d359177SBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snescomputejacobiandefaultcolor_) {
164e025ade3SBarry Smith     if (!ctx) {
165e025ade3SBarry Smith       *ierr = PETSC_ERR_ARG_NULL;
166e025ade3SBarry Smith       return;
167e025ade3SBarry Smith     }
1688d359177SBarry Smith     *ierr = SNESSetJacobian(*snes,*A,*B,SNESComputeJacobianDefaultColor,*(MatFDColoring*)ctx);
169df66969eSBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)matmffdcomputejacobian_) {
170df66969eSBarry Smith     *ierr = SNESSetJacobian(*snes,*A,*B,MatMFFDComputeJacobian,ctx);
171f5b6597dSBarry Smith   } else if (!func) {
172f5b6597dSBarry Smith     *ierr = SNESSetJacobian(*snes,*A,*B,0,ctx);
1738e27ec22SSatish Balay   } else {
174f6291634SJed Brown     *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.jacobian,(PetscVoidFunction)func,ctx);
1750298fd71SBarry Smith     if (!*ierr) *ierr = SNESSetJacobian(*snes,*A,*B,oursnesjacobian,NULL);
1768e27ec22SSatish Balay   }
1778e27ec22SSatish Balay }
1788e27ec22SSatish Balay /* -------------------------------------------------------------*/
1798e27ec22SSatish Balay 
1808cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snessolve_(SNES *snes,Vec *b,Vec *x, int *__ierr)
1816ce558aeSBarry Smith {
182a69afd8bSBarry Smith   Vec B = *b,X = *x;
1830298fd71SBarry Smith   if (FORTRANNULLOBJECT(b)) B = NULL;
1840298fd71SBarry Smith   if (FORTRANNULLOBJECT(x)) X = NULL;
185a69afd8bSBarry Smith   *__ierr = SNESSolve(*snes,B,X);
1866ce558aeSBarry Smith }
1876ce558aeSBarry Smith 
1888cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snesgetoptionsprefix_(SNES *snes,CHAR prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
1898e27ec22SSatish Balay {
1908e27ec22SSatish Balay   const char *tname;
1918e27ec22SSatish Balay 
1928e27ec22SSatish Balay   *ierr = SNESGetOptionsPrefix(*snes,&tname);
1938e27ec22SSatish Balay   *ierr = PetscStrncpy(prefix,tname,len);if (*ierr) return;
194*d6a8cea5SBarry Smith   FIXRETURNCHAR(PETSC_TRUE,prefix,len);
1958e27ec22SSatish Balay }
1968e27ec22SSatish Balay 
1978cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snesgettype_(SNES *snes,CHAR name PETSC_MIXED_LEN(len), PetscErrorCode *ierr PETSC_END_LEN(len))
1988e27ec22SSatish Balay {
1998e27ec22SSatish Balay   const char *tname;
2008e27ec22SSatish Balay 
2018e27ec22SSatish Balay   *ierr = SNESGetType(*snes,&tname);
2028e27ec22SSatish Balay   *ierr = PetscStrncpy(name,tname,len);if (*ierr) return;
2037c363081SBarry Smith   FIXRETURNCHAR(PETSC_TRUE,name,len);
2048e27ec22SSatish Balay }
205e3da1266SHong Zhang 
2068e27ec22SSatish Balay /* ---------------------------------------------------------*/
2078e27ec22SSatish Balay 
2088e27ec22SSatish Balay /*
2098e27ec22SSatish Balay    These are not usually called from Fortran but allow Fortran users
2108e27ec22SSatish Balay    to transparently set these monitors from .F code
2118e27ec22SSatish Balay 
2128e27ec22SSatish Balay    functions, hence no STDCALL
2138e27ec22SSatish Balay */
2148e27ec22SSatish Balay 
21589e00c7dSSatish 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))
2168e27ec22SSatish Balay {
2178e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(ctx);
218f6291634SJed Brown   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.function,(PetscVoidFunction)func,ctx);
21989e00c7dSSatish Balay #if defined(PETSC_HAVE_F90_2PTR_ARG)
22089e00c7dSSatish Balay   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.function_pgiptr,PETSC_NULL,ptr);
22189e00c7dSSatish Balay #endif
2220298fd71SBarry Smith   if (!*ierr) *ierr = SNESSetFunction(*snes,*r,oursnesfunction,NULL);
2238e27ec22SSatish Balay }
224c79ef259SPeter Brune 
225c79ef259SPeter Brune 
226be95d8f1SBarry Smith PETSC_EXTERN void PETSC_STDCALL snessetngs_(SNES *snes,void (PETSC_STDCALL *func)(SNES*,Vec*,Vec*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr)
227c79ef259SPeter Brune {
228c79ef259SPeter Brune   CHKFORTRANNULLOBJECT(ctx);
229be95d8f1SBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.ngs,(PetscVoidFunction)func,ctx);
230be95d8f1SBarry Smith   if (!*ierr) *ierr = SNESSetNGS(*snes,oursnesngs,NULL);
231c79ef259SPeter Brune }
232dfef22ccSBarry Smith PETSC_EXTERN void PETSC_STDCALL snessetupdate_(SNES *snes,void (PETSC_STDCALL *func)(SNES*,PetscInt*,PetscErrorCode*),PetscErrorCode *ierr)
233dfef22ccSBarry Smith {
234dfef22ccSBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.update,(PetscVoidFunction)func,NULL);
235dfef22ccSBarry Smith   if (!*ierr) *ierr = SNESSetUpdate(*snes,oursnesupdate);
236dfef22ccSBarry Smith }
2378e27ec22SSatish Balay /* ---------------------------------------------------------*/
2388e27ec22SSatish Balay 
2398e27ec22SSatish Balay /* the func argument is ignored */
2408cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snesgetfunction_(SNES *snes,Vec *r,void *func,void **ctx,PetscErrorCode *ierr)
2418e27ec22SSatish Balay {
2428e27ec22SSatish Balay   CHKFORTRANNULLINTEGER(ctx);
2438e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(r);
2440298fd71SBarry Smith   *ierr = SNESGetFunction(*snes,r,NULL,NULL); if (*ierr) return;
2450298fd71SBarry Smith   *ierr = PetscObjectGetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.function,NULL,ctx);
2468e27ec22SSatish Balay }
247c79ef259SPeter Brune 
248be95d8f1SBarry Smith PETSC_EXTERN void PETSC_STDCALL snesgetngs_(SNES *snes,void *func,void **ctx,PetscErrorCode *ierr)
249c79ef259SPeter Brune {
250c79ef259SPeter Brune   CHKFORTRANNULLINTEGER(ctx);
251be95d8f1SBarry Smith   *ierr = PetscObjectGetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.ngs,NULL,ctx);
252c79ef259SPeter Brune }
253c79ef259SPeter Brune 
2548e27ec22SSatish Balay /*----------------------------------------------------------------------*/
2558e27ec22SSatish Balay 
25669c1e2abSSatish Balay PETSC_EXTERN void snesconvergeddefault_(SNES *snes,PetscInt *it,PetscReal *a,PetscReal *b,PetscReal *c,SNESConvergedReason *r, void *ct,PetscErrorCode *ierr)
2573f149594SLisandro Dalcin {
2588d359177SBarry Smith   *ierr = SNESConvergedDefault(*snes,*it,*a,*b,*c,r,ct);
2593f149594SLisandro Dalcin }
2603f149594SLisandro Dalcin 
261e07f7f94SSatish Balay PETSC_EXTERN void snesconvergedskip_(SNES *snes,PetscInt *it,PetscReal *a,PetscReal *b,PetscReal *c,SNESConvergedReason *r,void *ct,PetscErrorCode *ierr)
2623f149594SLisandro Dalcin {
263e2a6519dSDmitry Karpeev   *ierr = SNESConvergedSkip(*snes,*it,*a,*b,*c,r,ct);
2643f149594SLisandro Dalcin }
2653f149594SLisandro Dalcin 
2668cc058d9SJed 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)
2678e27ec22SSatish Balay {
2688e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(cctx);
2693f22127dSBarry Smith   CHKFORTRANNULLFUNCTION(destroy);
2703f149594SLisandro Dalcin 
2718d359177SBarry Smith   if ((PetscVoidFunction)func == (PetscVoidFunction)snesconvergeddefault_) {
2728d359177SBarry Smith     *ierr = SNESSetConvergenceTest(*snes,SNESConvergedDefault,0,0);
273e07f7f94SSatish Balay   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesconvergedskip_) {
274e2a6519dSDmitry Karpeev     *ierr = SNESSetConvergenceTest(*snes,SNESConvergedSkip,0,0);
2758e27ec22SSatish Balay   } else {
276f6291634SJed Brown     *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.test,(PetscVoidFunction)func,cctx);
277f6291634SJed Brown     if (*ierr) return;
2783f22127dSBarry Smith     if (!destroy) {
2790298fd71SBarry Smith       *ierr = SNESSetConvergenceTest(*snes,oursnestest,*snes,NULL);
2807f7931b9SBarry Smith     } else {
281f6291634SJed Brown       *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.destroy,(PetscVoidFunction)destroy,cctx);
282f6291634SJed Brown       if (!*ierr) *ierr = SNESSetConvergenceTest(*snes,oursnestest,*snes,ourdestroy);
2837f7931b9SBarry Smith     }
2848e27ec22SSatish Balay   }
2858e27ec22SSatish Balay }
2868e27ec22SSatish Balay /*----------------------------------------------------------------------*/
2878e27ec22SSatish Balay 
2888cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snesview_(SNES *snes,PetscViewer *viewer, PetscErrorCode *ierr)
2898e27ec22SSatish Balay {
2908e27ec22SSatish Balay   PetscViewer v;
2918e27ec22SSatish Balay   PetscPatchDefaultViewers_Fortran(viewer,v);
2928e27ec22SSatish Balay   *ierr = SNESView(*snes,v);
2938e27ec22SSatish Balay }
2948e27ec22SSatish Balay 
2958e27ec22SSatish Balay /*  func is currently ignored from Fortran */
2968cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snesgetjacobian_(SNES *snes,Mat *A,Mat *B,int *func,void **ctx,PetscErrorCode *ierr)
2978e27ec22SSatish Balay {
2988e27ec22SSatish Balay   CHKFORTRANNULLINTEGER(ctx);
2998e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(A);
3008e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(B);
3010298fd71SBarry Smith   *ierr = SNESGetJacobian(*snes,A,B,0,NULL); if (*ierr) return;
3020298fd71SBarry Smith   *ierr = PetscObjectGetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.jacobian,NULL,ctx);
303f2e0d3f1SJed Brown 
3048e27ec22SSatish Balay }
3058e27ec22SSatish Balay 
3068cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snesgetconvergencehistory_(SNES *snes,PetscInt *na,PetscErrorCode *ierr)
3078e27ec22SSatish Balay {
3080298fd71SBarry Smith   *ierr = SNESGetConvergenceHistory(*snes,NULL,NULL,na);
3098e27ec22SSatish Balay }
3108e27ec22SSatish Balay 
3118cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snessettype_(SNES *snes,CHAR type PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
3128e27ec22SSatish Balay {
3138e27ec22SSatish Balay   char *t;
3148e27ec22SSatish Balay 
3158e27ec22SSatish Balay   FIXCHAR(type,len,t);
3168e27ec22SSatish Balay   *ierr = SNESSetType(*snes,t);
3178e27ec22SSatish Balay   FREECHAR(type,t);
3188e27ec22SSatish Balay }
3198e27ec22SSatish Balay 
3208cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snesappendoptionsprefix_(SNES *snes,CHAR prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
3218e27ec22SSatish Balay {
3228e27ec22SSatish Balay   char *t;
3238e27ec22SSatish Balay 
3248e27ec22SSatish Balay   FIXCHAR(prefix,len,t);
3258e27ec22SSatish Balay   *ierr = SNESAppendOptionsPrefix(*snes,t);
3268e27ec22SSatish Balay   FREECHAR(prefix,t);
3278e27ec22SSatish Balay }
3288e27ec22SSatish Balay 
3298cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snessetoptionsprefix_(SNES *snes,CHAR prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
3308e27ec22SSatish Balay {
3318e27ec22SSatish Balay   char *t;
3328e27ec22SSatish Balay 
3338e27ec22SSatish Balay   FIXCHAR(prefix,len,t);
3348e27ec22SSatish Balay   *ierr = SNESSetOptionsPrefix(*snes,t);
3358e27ec22SSatish Balay   FREECHAR(prefix,t);
3368e27ec22SSatish Balay }
3378e27ec22SSatish Balay 
3388e27ec22SSatish Balay /*----------------------------------------------------------------------*/
3398e27ec22SSatish Balay /* functions, hence no STDCALL */
3408e27ec22SSatish Balay 
3419611d799SBarry Smith PETSC_EXTERN void snesmonitorlgresidualnorm_(SNES *snes,PetscInt *its,PetscReal *fgnorm,PetscObject *dummy,PetscErrorCode *ierr)
3428e27ec22SSatish Balay {
3434619e776SBarry Smith   *ierr = SNESMonitorLGResidualNorm(*snes,*its,*fgnorm,dummy);
3448e27ec22SSatish Balay }
3458e27ec22SSatish Balay 
34652f0073cSBarry Smith PETSC_EXTERN void snesmonitordefault_(SNES *snes,PetscInt *its,PetscReal *fgnorm,PetscViewerAndFormat **dummy,PetscErrorCode *ierr)
3478e27ec22SSatish Balay {
348410efd14SBarry Smith   *ierr = SNESMonitorDefault(*snes,*its,*fgnorm,*dummy);
3498e27ec22SSatish Balay }
3508e27ec22SSatish Balay 
35152f0073cSBarry Smith PETSC_EXTERN void snesmonitorsolution_(SNES *snes,PetscInt *its,PetscReal *fgnorm,PetscViewerAndFormat **dummy,PetscErrorCode *ierr)
3528e27ec22SSatish Balay {
353410efd14SBarry Smith   *ierr = SNESMonitorSolution(*snes,*its,*fgnorm,*dummy);
3548e27ec22SSatish Balay }
3558e27ec22SSatish Balay 
35652f0073cSBarry Smith PETSC_EXTERN void snesmonitorsolutionupdate_(SNES *snes,PetscInt *its,PetscReal *fgnorm,PetscViewerAndFormat **dummy,PetscErrorCode *ierr)
3578e27ec22SSatish Balay {
358410efd14SBarry Smith   *ierr = SNESMonitorSolutionUpdate(*snes,*its,*fgnorm,*dummy);
3598e27ec22SSatish Balay }
3608e27ec22SSatish Balay 
3618e27ec22SSatish Balay 
3628cc058d9SJed 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)
3638e27ec22SSatish Balay {
3648e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(mctx);
365a6570f20SBarry Smith   if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitordefault_) {
3661cb03803SBarry Smith     *ierr = SNESMonitorSet(*snes,(PetscErrorCode (*)(SNES,PetscInt,PetscReal,void*))SNESMonitorDefault,*(PetscViewerAndFormat**)mctx,(PetscErrorCode (*)(void **))PetscViewerAndFormatDestroy);
367a6570f20SBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorsolution_) {
3681cb03803SBarry Smith     *ierr = SNESMonitorSet(*snes,(PetscErrorCode (*)(SNES,PetscInt,PetscReal,void*))SNESMonitorSolution,*(PetscViewerAndFormat**)mctx,(PetscErrorCode (*)(void **))PetscViewerAndFormatDestroy);
369a6570f20SBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorsolutionupdate_) {
3701cb03803SBarry Smith     *ierr = SNESMonitorSet(*snes,(PetscErrorCode (*)(SNES,PetscInt,PetscReal,void*))SNESMonitorSolutionUpdate,*(PetscViewerAndFormat**)mctx,(PetscErrorCode (*)(void **))PetscViewerAndFormatDestroy);
3714619e776SBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorlgresidualnorm_) {
3723e7ff0edSBarry Smith     *ierr = SNESMonitorSet(*snes,(PetscErrorCode (*)(SNES,PetscInt,PetscReal,void*))SNESMonitorLGResidualNorm,0,0);
3738e27ec22SSatish Balay   } else {
374f6291634SJed Brown     *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.monitor,(PetscVoidFunction)func,mctx);
375f6291634SJed Brown     if (*ierr) return;
3768e27ec22SSatish Balay     if (FORTRANNULLFUNCTION(mondestroy)) {
3770298fd71SBarry Smith       *ierr = SNESMonitorSet(*snes,oursnesmonitor,*snes,NULL);
3788e27ec22SSatish Balay     } else {
3795d4ebb51SBarry Smith       CHKFORTRANNULLFUNCTION(mondestroy);
380f6291634SJed Brown       *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.mondestroy,(PetscVoidFunction)mondestroy,mctx);
381f6291634SJed Brown       if (!*ierr) *ierr = SNESMonitorSet(*snes,oursnesmonitor,*snes,ourmondestroy);
3828e27ec22SSatish Balay     }
3838e27ec22SSatish Balay   }
3848e27ec22SSatish Balay }
3858e27ec22SSatish Balay 
386