xref: /petsc/src/snes/interface/ftn-custom/zsnesf.c (revision 7cb011f58c32087171e6c65e6b5293ee2291f1f1)
1af0996ceSBarry Smith #include <petsc/private/fortranimpl.h>
2c6db04a5SJed Brown #include <petscsnes.h>
3665c2dedSJed Brown #include <petscviewer.h>
48ad9143bSBarry Smith #include <petsc/private/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
33*7cb011f5SBarry Smith #define snesnewtontrssetpostcheck_       SNESNEWTONTRSETPOSTCHECK
34*7cb011f5SBarry Smith #Elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
35df66969eSBarry Smith #define matmffdcomputejacobian_          matmffdcomputejacobian
366ce558aeSBarry Smith #define snessolve_                       snessolve
378d359177SBarry Smith #define snescomputejacobiandefault_      snescomputejacobiandefault
388d359177SBarry Smith #define snescomputejacobiandefaultcolor_ snescomputejacobiandefaultcolor
398e27ec22SSatish Balay #define snessetjacobian_                 snessetjacobian
408e27ec22SSatish Balay #define snesgetoptionsprefix_            snesgetoptionsprefix
418e27ec22SSatish Balay #define snesgettype_                     snesgettype
428e27ec22SSatish Balay #define snessetfunction_                 snessetfunction
43be95d8f1SBarry Smith #define snessetngs_                       snessetngs
44dfef22ccSBarry Smith #define snessetupdate_                    snessetupdate
458e27ec22SSatish Balay #define snesgetfunction_                 snesgetfunction
46be95d8f1SBarry Smith #define snesgetngs_                       snesgetngs
478e27ec22SSatish Balay #define snessetconvergencetest_          snessetconvergencetest
488d359177SBarry Smith #define snesconvergeddefault_            snesconvergeddefault
49e07f7f94SSatish Balay #define snesconvergedskip_               snesconvergedskip
508e27ec22SSatish Balay #define snesview_                        snesview
518e27ec22SSatish Balay #define snesgetjacobian_                 snesgetjacobian
528e27ec22SSatish Balay #define snesgetconvergencehistory_       snesgetconvergencehistory
538e27ec22SSatish Balay #define snessettype_                     snessettype
548e27ec22SSatish Balay #define snesappendoptionsprefix_         snesappendoptionsprefix
558e27ec22SSatish Balay #define snessetoptionsprefix_            snessetoptionsprefix
564619e776SBarry Smith #define snesmonitorlgresidualnorm_       snesmonitorlgresidualnorm
57a6570f20SBarry Smith #define snesmonitordefault_              snesmonitordefault
58a6570f20SBarry Smith #define snesmonitorsolution_             snesmonitorsolution
59a6570f20SBarry Smith #define snesmonitorsolutionupdate_       snesmonitorsolutionupdate
60a6570f20SBarry Smith #define snesmonitorset_                  snesmonitorset
61*7cb011f5SBarry Smith #define snesnewtontrssetpostcheck_       snesnewtontrssetpostcheck
628e27ec22SSatish Balay #endif
638e27ec22SSatish Balay 
64f6291634SJed Brown static struct {
65f6291634SJed Brown   PetscFortranCallbackId function;
66f6291634SJed Brown   PetscFortranCallbackId test;
67f6291634SJed Brown   PetscFortranCallbackId destroy;
68f6291634SJed Brown   PetscFortranCallbackId jacobian;
69f6291634SJed Brown   PetscFortranCallbackId monitor;
70f6291634SJed Brown   PetscFortranCallbackId mondestroy;
71be95d8f1SBarry Smith   PetscFortranCallbackId ngs;
72dfef22ccSBarry Smith   PetscFortranCallbackId update;
73*7cb011f5SBarry Smith   PetscFortranCallbackId trpostcheck;
7489e00c7dSSatish Balay #if defined(PETSC_HAVE_F90_2PTR_ARG)
7589e00c7dSSatish Balay   PetscFortranCallbackId function_pgiptr;
7689e00c7dSSatish Balay #endif
77f6291634SJed Brown } _cb;
7890b77ac2SPeter Brune 
79*7cb011f5SBarry Smith static PetscErrorCode ourtrpostcheckfunction(SNES snes,Vec x,Vec y,Vec w,PetscBool *changed_w,void *ctx)
80*7cb011f5SBarry Smith {
81*7cb011f5SBarry Smith #if defined(PETSC_HAVE_F90_2PTR_ARG)
82*7cb011f5SBarry Smith   void* ptr;
83*7cb011f5SBarry Smith   PetscObjectGetFortranCallback((PetscObject)snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.function_pgiptr,NULL,&ptr);
84*7cb011f5SBarry Smith #endif
85*7cb011f5SBarry Smith   PetscObjectUseFortranCallback(snes,_cb.trpostcheck,(SNES*,Vec*,Vec*,Vec *,PetscBool *,void*,PetscErrorCode* PETSC_F90_2PTR_PROTO_NOVAR),(&snes,&x,&y,&w,changed_w,_ctx,&ierr PETSC_F90_2PTR_PARAM(ptr)));
86*7cb011f5SBarry Smith }
87*7cb011f5SBarry Smith 
88*7cb011f5SBarry Smith PETSC_EXTERN void PETSC_STDCALL snesnewtontrsetpostcheck_(SNES *snes, void (PETSC_STDCALL *func)(SNES,Vec,Vec,Vec,PetscBool*,void*),void *ctx,PetscErrorCode *ierr)
89*7cb011f5SBarry Smith {
90*7cb011f5SBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.trpostcheck,(PetscVoidFunction)func,ctx);if (*ierr) return;
91*7cb011f5SBarry Smith #if defined(PETSC_HAVE_F90_2PTR_ARG)
92*7cb011f5SBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.function_pgiptr,NULL,ptr);if (*ierr) return;
93*7cb011f5SBarry Smith #endif
94*7cb011f5SBarry Smith   SNESNewtonTRSetPostCheck(*snes,ourtrpostcheckfunction,NULL);
95*7cb011f5SBarry Smith }
96*7cb011f5SBarry Smith 
97*7cb011f5SBarry Smith 
98*7cb011f5SBarry Smith 
998e27ec22SSatish Balay static PetscErrorCode oursnesfunction(SNES snes,Vec x,Vec f,void *ctx)
1008e27ec22SSatish Balay {
10189e00c7dSSatish Balay #if defined(PETSC_HAVE_F90_2PTR_ARG)
10289e00c7dSSatish Balay   void* ptr;
10389e00c7dSSatish Balay   PetscObjectGetFortranCallback((PetscObject)snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.function_pgiptr,NULL,&ptr);
10489e00c7dSSatish Balay #endif
10589e00c7dSSatish 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)));
1068e27ec22SSatish Balay }
107b8ebb45fSBarry Smith 
10806ee9f85SBarry Smith static PetscErrorCode oursnestest(SNES snes,PetscInt it,PetscReal a,PetscReal d,PetscReal c,SNESConvergedReason *reason,void *ctx)
1098e27ec22SSatish Balay {
110f6291634SJed Brown   PetscObjectUseFortranCallback(snes,_cb.test,(SNES*,PetscInt*,PetscReal*,PetscReal*,PetscReal*,SNESConvergedReason*,void*,PetscErrorCode*),(&snes,&it,&a,&d,&c,reason,_ctx,&ierr));
1117f7931b9SBarry Smith }
1127f7931b9SBarry Smith 
1137f7931b9SBarry Smith static PetscErrorCode ourdestroy(void *ctx)
1147f7931b9SBarry Smith {
115f6291634SJed Brown   PetscObjectUseFortranCallback(ctx,_cb.destroy,(void*,PetscErrorCode*),(_ctx,&ierr));
1168e27ec22SSatish Balay }
1178e27ec22SSatish Balay 
118d1e9a80fSBarry Smith static PetscErrorCode oursnesjacobian(SNES snes,Vec x,Mat m,Mat p,void *ctx)
1198e27ec22SSatish Balay {
120d1e9a80fSBarry Smith   PetscObjectUseFortranCallback(snes,_cb.jacobian,(SNES*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),(&snes,&x,&m,&p,_ctx,&ierr));
1218e27ec22SSatish Balay }
122f6291634SJed Brown 
123dfef22ccSBarry Smith static PetscErrorCode oursnesupdate(SNES snes,PetscInt i)
124dfef22ccSBarry Smith {
125dfef22ccSBarry Smith   PetscObjectUseFortranCallback(snes,_cb.update,(SNES*,PetscInt *,PetscErrorCode*),(&snes,&i,&ierr));
126dfef22ccSBarry Smith }
127be95d8f1SBarry Smith static PetscErrorCode oursnesngs(SNES snes,Vec x,Vec b,void *ctx)
12890b77ac2SPeter Brune {
129be95d8f1SBarry Smith   PetscObjectUseFortranCallback(snes,_cb.ngs,(SNES*,Vec*,Vec*,void*,PetscErrorCode*),(&snes,&x,&b,_ctx,&ierr));
13090b77ac2SPeter Brune }
1318e27ec22SSatish Balay static PetscErrorCode oursnesmonitor(SNES snes,PetscInt i,PetscReal d,void *ctx)
1328e27ec22SSatish Balay {
133f6291634SJed Brown   PetscObjectUseFortranCallback(snes,_cb.monitor,(SNES*,PetscInt*,PetscReal*,void*,PetscErrorCode*),(&snes,&i,&d,_ctx,&ierr));
1348e27ec22SSatish Balay }
135c2efdce3SBarry Smith static PetscErrorCode ourmondestroy(void **ctx)
1368e27ec22SSatish Balay {
137f6291634SJed Brown   SNES snes = (SNES)*ctx;
138f6291634SJed Brown   PetscObjectUseFortranCallback(snes,_cb.mondestroy,(void*,PetscErrorCode*),(_ctx,&ierr));
1398e27ec22SSatish Balay }
1408e27ec22SSatish Balay 
1418e27ec22SSatish Balay /* ---------------------------------------------------------*/
1428e27ec22SSatish Balay /*
1438d359177SBarry Smith      snescomputejacobiandefault() and snescomputejacobiandefaultcolor()
1448e27ec22SSatish Balay   These can be used directly from Fortran but are mostly so that
1458e27ec22SSatish Balay   Fortran SNESSetJacobian() will properly handle the defaults being passed in.
1468e27ec22SSatish Balay 
1478e27ec22SSatish Balay   functions, hence no STDCALL
1488e27ec22SSatish Balay */
149d1e9a80fSBarry Smith PETSC_EXTERN void matmffdcomputejacobian_(SNES *snes,Vec *x,Mat *m,Mat *p,void *ctx,PetscErrorCode *ierr)
150df66969eSBarry Smith {
151d1e9a80fSBarry Smith   *ierr = MatMFFDComputeJacobian(*snes,*x,*m,*p,ctx);
152df66969eSBarry Smith }
153d1e9a80fSBarry Smith PETSC_EXTERN void snescomputejacobiandefault_(SNES *snes,Vec *x,Mat *m,Mat *p,void *ctx,PetscErrorCode *ierr)
1548e27ec22SSatish Balay {
155d1e9a80fSBarry Smith   *ierr = SNESComputeJacobianDefault(*snes,*x,*m,*p,ctx);
1568e27ec22SSatish Balay }
157d1e9a80fSBarry Smith PETSC_EXTERN void  snescomputejacobiandefaultcolor_(SNES *snes,Vec *x,Mat *m,Mat *p,void *ctx,PetscErrorCode *ierr)
1588e27ec22SSatish Balay {
159d1e9a80fSBarry Smith   *ierr = SNESComputeJacobianDefaultColor(*snes,*x,*m,*p,*(MatFDColoring*)ctx);
1608e27ec22SSatish Balay }
1618e27ec22SSatish Balay 
1628cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snessetjacobian_(SNES *snes,Mat *A,Mat *B,
163d1e9a80fSBarry Smith                                     void (PETSC_STDCALL *func)(SNES*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),
164f5af7f23SKarl Rupp                                     void *ctx,PetscErrorCode *ierr)
1658e27ec22SSatish Balay {
166f5b6597dSBarry Smith   CHKFORTRANNULLFUNCTION(func);
1678d359177SBarry Smith   if ((PetscVoidFunction)func == (PetscVoidFunction)snescomputejacobiandefault_) {
1688d359177SBarry Smith     *ierr = SNESSetJacobian(*snes,*A,*B,SNESComputeJacobianDefault,ctx);
1698d359177SBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snescomputejacobiandefaultcolor_) {
170e025ade3SBarry Smith     if (!ctx) {
171e025ade3SBarry Smith       *ierr = PETSC_ERR_ARG_NULL;
172e025ade3SBarry Smith       return;
173e025ade3SBarry Smith     }
1748d359177SBarry Smith     *ierr = SNESSetJacobian(*snes,*A,*B,SNESComputeJacobianDefaultColor,*(MatFDColoring*)ctx);
175df66969eSBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)matmffdcomputejacobian_) {
176df66969eSBarry Smith     *ierr = SNESSetJacobian(*snes,*A,*B,MatMFFDComputeJacobian,ctx);
1778e27ec22SSatish Balay   } else {
178f6291634SJed Brown     *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.jacobian,(PetscVoidFunction)func,ctx);
1790298fd71SBarry Smith     if (!*ierr) *ierr = SNESSetJacobian(*snes,*A,*B,oursnesjacobian,NULL);
1808e27ec22SSatish Balay   }
1818e27ec22SSatish Balay }
1828e27ec22SSatish Balay /* -------------------------------------------------------------*/
1838e27ec22SSatish Balay 
184390e1bf2SBarry Smith PETSC_EXTERN void PETSC_STDCALL snesgetoptionsprefix_(SNES *snes,char* prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
1858e27ec22SSatish Balay {
1868e27ec22SSatish Balay   const char *tname;
1878e27ec22SSatish Balay 
1888e27ec22SSatish Balay   *ierr = SNESGetOptionsPrefix(*snes,&tname);
1898e27ec22SSatish Balay   *ierr = PetscStrncpy(prefix,tname,len);if (*ierr) return;
190d6a8cea5SBarry Smith   FIXRETURNCHAR(PETSC_TRUE,prefix,len);
1918e27ec22SSatish Balay }
1928e27ec22SSatish Balay 
193390e1bf2SBarry Smith PETSC_EXTERN void PETSC_STDCALL snesgettype_(SNES *snes,char* name PETSC_MIXED_LEN(len), PetscErrorCode *ierr PETSC_END_LEN(len))
1948e27ec22SSatish Balay {
1958e27ec22SSatish Balay   const char *tname;
1968e27ec22SSatish Balay 
1978e27ec22SSatish Balay   *ierr = SNESGetType(*snes,&tname);
1988e27ec22SSatish Balay   *ierr = PetscStrncpy(name,tname,len);if (*ierr) return;
1997c363081SBarry Smith   FIXRETURNCHAR(PETSC_TRUE,name,len);
2008e27ec22SSatish Balay }
201e3da1266SHong Zhang 
2028e27ec22SSatish Balay /* ---------------------------------------------------------*/
2038e27ec22SSatish Balay 
2048e27ec22SSatish Balay /*
2058e27ec22SSatish Balay    These are not usually called from Fortran but allow Fortran users
2068e27ec22SSatish Balay    to transparently set these monitors from .F code
2078e27ec22SSatish Balay 
2088e27ec22SSatish Balay    functions, hence no STDCALL
2098e27ec22SSatish Balay */
2108e27ec22SSatish Balay 
21189e00c7dSSatish 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))
2128e27ec22SSatish Balay {
213aecf964fSBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.function,(PetscVoidFunction)func,ctx);if (*ierr) return;
21489e00c7dSSatish Balay #if defined(PETSC_HAVE_F90_2PTR_ARG)
215aecf964fSBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.function_pgiptr,NULL,ptr);if (*ierr) return;
21689e00c7dSSatish Balay #endif
217aecf964fSBarry Smith   *ierr = SNESSetFunction(*snes,*r,oursnesfunction,NULL);
2188e27ec22SSatish Balay }
219c79ef259SPeter Brune 
220c79ef259SPeter Brune 
221be95d8f1SBarry Smith PETSC_EXTERN void PETSC_STDCALL snessetngs_(SNES *snes,void (PETSC_STDCALL *func)(SNES*,Vec*,Vec*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr)
222c79ef259SPeter Brune {
223aecf964fSBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.ngs,(PetscVoidFunction)func,ctx);if (*ierr) return;
224aecf964fSBarry Smith   *ierr = SNESSetNGS(*snes,oursnesngs,NULL);
225c79ef259SPeter Brune }
226dfef22ccSBarry Smith PETSC_EXTERN void PETSC_STDCALL snessetupdate_(SNES *snes,void (PETSC_STDCALL *func)(SNES*,PetscInt*,PetscErrorCode*),PetscErrorCode *ierr)
227dfef22ccSBarry Smith {
228aecf964fSBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.update,(PetscVoidFunction)func,NULL);if (*ierr) return;
229aecf964fSBarry Smith   *ierr = SNESSetUpdate(*snes,oursnesupdate);
230dfef22ccSBarry Smith }
2318e27ec22SSatish Balay /* ---------------------------------------------------------*/
2328e27ec22SSatish Balay 
2338e27ec22SSatish Balay /* the func argument is ignored */
234146935d7SSatish Balay PETSC_EXTERN void PETSC_STDCALL snesgetfunction_(SNES *snes,Vec *r,void (PETSC_STDCALL *func)(SNES,Vec,Vec,void*),void **ctx,PetscErrorCode *ierr)
2358e27ec22SSatish Balay {
2368e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(r);
2370298fd71SBarry Smith   *ierr = SNESGetFunction(*snes,r,NULL,NULL); if (*ierr) return;
238146935d7SSatish Balay   if ((PetscVoidFunction)func == (PetscVoidFunction)PETSC_NULL_FUNCTION_Fortran) return;
2390298fd71SBarry Smith   *ierr = PetscObjectGetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.function,NULL,ctx);
2408e27ec22SSatish Balay }
241c79ef259SPeter Brune 
242be95d8f1SBarry Smith PETSC_EXTERN void PETSC_STDCALL snesgetngs_(SNES *snes,void *func,void **ctx,PetscErrorCode *ierr)
243c79ef259SPeter Brune {
244be95d8f1SBarry Smith   *ierr = PetscObjectGetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.ngs,NULL,ctx);
245c79ef259SPeter Brune }
246c79ef259SPeter Brune 
2478e27ec22SSatish Balay /*----------------------------------------------------------------------*/
2488e27ec22SSatish Balay 
24969c1e2abSSatish Balay PETSC_EXTERN void snesconvergeddefault_(SNES *snes,PetscInt *it,PetscReal *a,PetscReal *b,PetscReal *c,SNESConvergedReason *r, void *ct,PetscErrorCode *ierr)
2503f149594SLisandro Dalcin {
2518d359177SBarry Smith   *ierr = SNESConvergedDefault(*snes,*it,*a,*b,*c,r,ct);
2523f149594SLisandro Dalcin }
2533f149594SLisandro Dalcin 
254e07f7f94SSatish Balay PETSC_EXTERN void snesconvergedskip_(SNES *snes,PetscInt *it,PetscReal *a,PetscReal *b,PetscReal *c,SNESConvergedReason *r,void *ct,PetscErrorCode *ierr)
2553f149594SLisandro Dalcin {
256e2a6519dSDmitry Karpeev   *ierr = SNESConvergedSkip(*snes,*it,*a,*b,*c,r,ct);
2573f149594SLisandro Dalcin }
2583f149594SLisandro Dalcin 
2598cc058d9SJed 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)
2608e27ec22SSatish Balay {
2613f22127dSBarry Smith   CHKFORTRANNULLFUNCTION(destroy);
2623f149594SLisandro Dalcin 
2638d359177SBarry Smith   if ((PetscVoidFunction)func == (PetscVoidFunction)snesconvergeddefault_) {
2648d359177SBarry Smith     *ierr = SNESSetConvergenceTest(*snes,SNESConvergedDefault,0,0);
265e07f7f94SSatish Balay   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesconvergedskip_) {
266e2a6519dSDmitry Karpeev     *ierr = SNESSetConvergenceTest(*snes,SNESConvergedSkip,0,0);
2678e27ec22SSatish Balay   } else {
268aecf964fSBarry Smith     *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.test,(PetscVoidFunction)func,cctx);if (*ierr) return;
269aecf964fSBarry Smith     *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.destroy,(PetscVoidFunction)destroy,cctx);if (*ierr) return;
270aecf964fSBarry Smith     *ierr = SNESSetConvergenceTest(*snes,oursnestest,*snes,ourdestroy);
2718e27ec22SSatish Balay   }
2728e27ec22SSatish Balay }
2738e27ec22SSatish Balay /*----------------------------------------------------------------------*/
2748e27ec22SSatish Balay 
2758cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snesview_(SNES *snes,PetscViewer *viewer, PetscErrorCode *ierr)
2768e27ec22SSatish Balay {
2778e27ec22SSatish Balay   PetscViewer v;
2788e27ec22SSatish Balay   PetscPatchDefaultViewers_Fortran(viewer,v);
2798e27ec22SSatish Balay   *ierr = SNESView(*snes,v);
2808e27ec22SSatish Balay }
2818e27ec22SSatish Balay 
2828e27ec22SSatish Balay /*  func is currently ignored from Fortran */
2838cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snesgetjacobian_(SNES *snes,Mat *A,Mat *B,int *func,void **ctx,PetscErrorCode *ierr)
2848e27ec22SSatish Balay {
2858e27ec22SSatish Balay   CHKFORTRANNULLINTEGER(ctx);
2868e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(A);
2878e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(B);
2880298fd71SBarry Smith   *ierr = SNESGetJacobian(*snes,A,B,0,NULL); if (*ierr) return;
2890298fd71SBarry Smith   *ierr = PetscObjectGetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.jacobian,NULL,ctx);
290f2e0d3f1SJed Brown 
2918e27ec22SSatish Balay }
2928e27ec22SSatish Balay 
2938cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snesgetconvergencehistory_(SNES *snes,PetscInt *na,PetscErrorCode *ierr)
2948e27ec22SSatish Balay {
2950298fd71SBarry Smith   *ierr = SNESGetConvergenceHistory(*snes,NULL,NULL,na);
2968e27ec22SSatish Balay }
2978e27ec22SSatish Balay 
298390e1bf2SBarry Smith PETSC_EXTERN void PETSC_STDCALL snessettype_(SNES *snes,char* type PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
2998e27ec22SSatish Balay {
3008e27ec22SSatish Balay   char *t;
3018e27ec22SSatish Balay 
3028e27ec22SSatish Balay   FIXCHAR(type,len,t);
303d49bb8f9SBarry Smith   *ierr = SNESSetType(*snes,t);if (*ierr) return;
3048e27ec22SSatish Balay   FREECHAR(type,t);
3058e27ec22SSatish Balay }
3068e27ec22SSatish Balay 
307390e1bf2SBarry Smith PETSC_EXTERN void PETSC_STDCALL snesappendoptionsprefix_(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);
312d49bb8f9SBarry Smith   *ierr = SNESAppendOptionsPrefix(*snes,t);if (*ierr) return;
3138e27ec22SSatish Balay   FREECHAR(prefix,t);
3148e27ec22SSatish Balay }
3158e27ec22SSatish Balay 
316390e1bf2SBarry Smith PETSC_EXTERN void PETSC_STDCALL snessetoptionsprefix_(SNES *snes,char* prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
3178e27ec22SSatish Balay {
3188e27ec22SSatish Balay   char *t;
3198e27ec22SSatish Balay 
3208e27ec22SSatish Balay   FIXCHAR(prefix,len,t);
321d49bb8f9SBarry Smith   *ierr = SNESSetOptionsPrefix(*snes,t);if (*ierr) return;
3228e27ec22SSatish Balay   FREECHAR(prefix,t);
3238e27ec22SSatish Balay }
3248e27ec22SSatish Balay 
3258e27ec22SSatish Balay /*----------------------------------------------------------------------*/
3268e27ec22SSatish Balay /* functions, hence no STDCALL */
3278e27ec22SSatish Balay 
3289611d799SBarry Smith PETSC_EXTERN void snesmonitorlgresidualnorm_(SNES *snes,PetscInt *its,PetscReal *fgnorm,PetscObject *dummy,PetscErrorCode *ierr)
3298e27ec22SSatish Balay {
3304619e776SBarry Smith   *ierr = SNESMonitorLGResidualNorm(*snes,*its,*fgnorm,dummy);
3318e27ec22SSatish Balay }
3328e27ec22SSatish Balay 
33352f0073cSBarry Smith PETSC_EXTERN void snesmonitordefault_(SNES *snes,PetscInt *its,PetscReal *fgnorm,PetscViewerAndFormat **dummy,PetscErrorCode *ierr)
3348e27ec22SSatish Balay {
335410efd14SBarry Smith   *ierr = SNESMonitorDefault(*snes,*its,*fgnorm,*dummy);
3368e27ec22SSatish Balay }
3378e27ec22SSatish Balay 
33852f0073cSBarry Smith PETSC_EXTERN void snesmonitorsolution_(SNES *snes,PetscInt *its,PetscReal *fgnorm,PetscViewerAndFormat **dummy,PetscErrorCode *ierr)
3398e27ec22SSatish Balay {
340410efd14SBarry Smith   *ierr = SNESMonitorSolution(*snes,*its,*fgnorm,*dummy);
3418e27ec22SSatish Balay }
3428e27ec22SSatish Balay 
34352f0073cSBarry Smith PETSC_EXTERN void snesmonitorsolutionupdate_(SNES *snes,PetscInt *its,PetscReal *fgnorm,PetscViewerAndFormat **dummy,PetscErrorCode *ierr)
3448e27ec22SSatish Balay {
345410efd14SBarry Smith   *ierr = SNESMonitorSolutionUpdate(*snes,*its,*fgnorm,*dummy);
3468e27ec22SSatish Balay }
3478e27ec22SSatish Balay 
3488e27ec22SSatish Balay 
3498cc058d9SJed 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)
3508e27ec22SSatish Balay {
351aecf964fSBarry Smith   CHKFORTRANNULLFUNCTION(mondestroy);
352a6570f20SBarry Smith   if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitordefault_) {
3531cb03803SBarry Smith     *ierr = SNESMonitorSet(*snes,(PetscErrorCode (*)(SNES,PetscInt,PetscReal,void*))SNESMonitorDefault,*(PetscViewerAndFormat**)mctx,(PetscErrorCode (*)(void **))PetscViewerAndFormatDestroy);
354a6570f20SBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorsolution_) {
3551cb03803SBarry Smith     *ierr = SNESMonitorSet(*snes,(PetscErrorCode (*)(SNES,PetscInt,PetscReal,void*))SNESMonitorSolution,*(PetscViewerAndFormat**)mctx,(PetscErrorCode (*)(void **))PetscViewerAndFormatDestroy);
356a6570f20SBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorsolutionupdate_) {
3571cb03803SBarry Smith     *ierr = SNESMonitorSet(*snes,(PetscErrorCode (*)(SNES,PetscInt,PetscReal,void*))SNESMonitorSolutionUpdate,*(PetscViewerAndFormat**)mctx,(PetscErrorCode (*)(void **))PetscViewerAndFormatDestroy);
3584619e776SBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorlgresidualnorm_) {
3593e7ff0edSBarry Smith     *ierr = SNESMonitorSet(*snes,(PetscErrorCode (*)(SNES,PetscInt,PetscReal,void*))SNESMonitorLGResidualNorm,0,0);
3608e27ec22SSatish Balay   } else {
361aecf964fSBarry Smith     *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.monitor,(PetscVoidFunction)func,mctx);if (*ierr) return;
362aecf964fSBarry Smith     *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.mondestroy,(PetscVoidFunction)mondestroy,mctx);if (*ierr) return;
363aecf964fSBarry Smith     *ierr = SNESMonitorSet(*snes,oursnesmonitor,*snes,ourmondestroy);
3648e27ec22SSatish Balay   }
3658e27ec22SSatish Balay }
3668e27ec22SSatish Balay 
367