xref: /petsc/src/snes/interface/ftn-custom/zsnesf.c (revision 665c2ded495bb9782a7454dcfef3abf1536c3670)
1b45d2f2cSJed Brown #include <petsc-private/fortranimpl.h>
2c6db04a5SJed Brown #include <petscsnes.h>
3*665c2dedSJed Brown #include <petscviewer.h>
48e27ec22SSatish Balay 
58e27ec22SSatish Balay #if defined(PETSC_HAVE_FORTRAN_CAPS)
6df66969eSBarry Smith #define matmffdcomputejacobian_          MATMFFDCOMPUTEJACOBIAN
76ce558aeSBarry Smith #define snessolve_                       SNESSOLVE
88e27ec22SSatish Balay #define snesdefaultcomputejacobian_      SNESDEFAULTCOMPUTEJACOBIAN
98e27ec22SSatish Balay #define snesdefaultcomputejacobiancolor_ SNESDEFAULTCOMPUTEJACOBIANCOLOR
108e27ec22SSatish Balay #define snessetjacobian_                 SNESSETJACOBIAN
118e27ec22SSatish Balay #define snesgetoptionsprefix_            SNESGETOPTIONSPREFIX
128e27ec22SSatish Balay #define snesgettype_                     SNESGETTYPE
138e27ec22SSatish Balay #define snessetfunction_                 SNESSETFUNCTION
14c79ef259SPeter Brune #define snessetgs_                       SNESSETGS
158e27ec22SSatish Balay #define snesgetfunction_                 SNESGETFUNCTION
16c79ef259SPeter Brune #define snesgetgs_                       SNESGETGS
178e27ec22SSatish Balay #define snessetconvergencetest_          SNESSETCONVERGENCETEST
183f149594SLisandro Dalcin #define snesdefaultconverged_            SNESDEFAULTCONVERGED
193f149594SLisandro Dalcin #define snesskipconverged_               SNESSKIPCONVERGED
208e27ec22SSatish Balay #define snesview_                        SNESVIEW
218e27ec22SSatish Balay #define snesgetconvergencehistory_       SNESGETCONVERGENCEHISTORY
228e27ec22SSatish Balay #define snesgetjacobian_                 SNESGETJACOBIAN
238e27ec22SSatish Balay #define snessettype_                     SNESSETTYPE
248e27ec22SSatish Balay #define snesappendoptionsprefix_         SNESAPPENDOPTIONSPREFIX
258e27ec22SSatish Balay #define snessetoptionsprefix_            SNESSETOPTIONSPREFIX
26a6570f20SBarry Smith #define snesmonitordefault_              SNESMONITORDEFAULT
27a6570f20SBarry Smith #define snesmonitorsolution_             SNESMONITORSOLUTION
284619e776SBarry Smith #define snesmonitorlgresidualnorm_       SNESMONITORLGRESIDUALNORM
29a6570f20SBarry Smith #define snesmonitorsolutionupdate_       SNESMONITORSOLUTIONUPDATE
30a6570f20SBarry Smith #define snesmonitorset_                  SNESMONITORSET
31d20b5d95SPeter Brune #define snesgetsneslinesearch_           SNESGETSNESLINESEARCH
328e27ec22SSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
33df66969eSBarry Smith #define matmffdcomputejacobian_          matmffdcomputejacobian
346ce558aeSBarry Smith #define snessolve_                       snessolve
358e27ec22SSatish Balay #define snesdefaultcomputejacobian_      snesdefaultcomputejacobian
368e27ec22SSatish Balay #define snesdefaultcomputejacobiancolor_ snesdefaultcomputejacobiancolor
378e27ec22SSatish Balay #define snessetjacobian_                 snessetjacobian
388e27ec22SSatish Balay #define snesgetoptionsprefix_            snesgetoptionsprefix
398e27ec22SSatish Balay #define snesgettype_                     snesgettype
408e27ec22SSatish Balay #define snessetfunction_                 snessetfunction
41c79ef259SPeter Brune #define snessetgs_                       snessetgs
428e27ec22SSatish Balay #define snesgetfunction_                 snesgetfunction
43c79ef259SPeter Brune #define snesgetgs_                       snesgetgs
448e27ec22SSatish Balay #define snessetconvergencetest_          snessetconvergencetest
453f149594SLisandro Dalcin #define snesdefaultconverged_            snesdefaultconverged
463f149594SLisandro Dalcin #define snesskipconverged_               snesskipconverged
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
583b229b18SJed Brown #define snesgetsneslinesearch_           snesgetsneslinesearch
598e27ec22SSatish Balay #endif
608e27ec22SSatish Balay 
61f6291634SJed Brown static struct {
62f6291634SJed Brown   PetscFortranCallbackId function;
63f6291634SJed Brown   PetscFortranCallbackId test;
64f6291634SJed Brown   PetscFortranCallbackId destroy;
65f6291634SJed Brown   PetscFortranCallbackId jacobian;
66f6291634SJed Brown   PetscFortranCallbackId monitor;
67f6291634SJed Brown   PetscFortranCallbackId mondestroy;
68f6291634SJed Brown   PetscFortranCallbackId gs;
69f6291634SJed Brown } _cb;
7090b77ac2SPeter Brune 
71de64c4c2SJed Brown #undef __FUNCT__
72de64c4c2SJed Brown #define __FUNCT__ "oursnesfunction"
738e27ec22SSatish Balay static PetscErrorCode oursnesfunction(SNES snes,Vec x,Vec f,void *ctx)
748e27ec22SSatish Balay {
75f6291634SJed Brown   PetscObjectUseFortranCallback(snes,_cb.function,(SNES*,Vec*,Vec*,void*,PetscErrorCode*),(&snes,&x,&f,_ctx,&ierr));
768e27ec22SSatish Balay   return 0;
778e27ec22SSatish Balay }
78b8ebb45fSBarry Smith 
79de64c4c2SJed Brown #undef __FUNCT__
80de64c4c2SJed Brown #define __FUNCT__ "oursnestest"
8106ee9f85SBarry Smith static PetscErrorCode oursnestest(SNES snes,PetscInt it,PetscReal a,PetscReal d,PetscReal c,SNESConvergedReason *reason,void *ctx)
828e27ec22SSatish Balay {
83f6291634SJed Brown   PetscObjectUseFortranCallback(snes,_cb.test,(SNES*,PetscInt*,PetscReal*,PetscReal*,PetscReal*,SNESConvergedReason*,void*,PetscErrorCode*),(&snes,&it,&a,&d,&c,reason,_ctx,&ierr));
847f7931b9SBarry Smith   return 0;
857f7931b9SBarry Smith }
867f7931b9SBarry Smith 
87de64c4c2SJed Brown #undef __FUNCT__
88de64c4c2SJed Brown #define __FUNCT__ "ourdestroy"
897f7931b9SBarry Smith static PetscErrorCode ourdestroy(void *ctx)
907f7931b9SBarry Smith {
91f6291634SJed Brown   PetscObjectUseFortranCallback(ctx,_cb.destroy,(void*,PetscErrorCode*),(_ctx,&ierr));
928e27ec22SSatish Balay   return 0;
938e27ec22SSatish Balay }
948e27ec22SSatish Balay 
95de64c4c2SJed Brown #undef __FUNCT__
96de64c4c2SJed Brown #define __FUNCT__ "oursnesjacobian"
978e27ec22SSatish Balay static PetscErrorCode oursnesjacobian(SNES snes,Vec x,Mat *m,Mat *p,MatStructure *type,void *ctx)
988e27ec22SSatish Balay {
99f6291634SJed Brown   PetscObjectUseFortranCallback(snes,_cb.jacobian,(SNES*,Vec*,Mat*,Mat*,MatStructure*,void*,PetscErrorCode*),(&snes,&x,m,p,type,_ctx,&ierr));
1008e27ec22SSatish Balay   return 0;
1018e27ec22SSatish Balay }
102f6291634SJed Brown 
103de64c4c2SJed Brown #undef __FUNCT__
104de64c4c2SJed Brown #define __FUNCT__ "oursnesgs"
10590b77ac2SPeter Brune static PetscErrorCode oursnesgs(SNES snes,Vec x,Vec b,void *ctx)
10690b77ac2SPeter Brune {
107f6291634SJed Brown   PetscObjectUseFortranCallback(snes,_cb.gs,(SNES*,Vec*,Vec*,void*,PetscErrorCode*),(&snes,&x,&b,_ctx,&ierr));
10890b77ac2SPeter Brune   return 0;
10990b77ac2SPeter Brune }
110de64c4c2SJed Brown #undef __FUNCT__
111de64c4c2SJed Brown #define __FUNCT__ "oursnesmonitor"
1128e27ec22SSatish Balay static PetscErrorCode oursnesmonitor(SNES snes,PetscInt i,PetscReal d,void *ctx)
1138e27ec22SSatish Balay {
114f6291634SJed Brown   PetscObjectUseFortranCallback(snes,_cb.monitor,(SNES*,PetscInt*,PetscReal*,void*,PetscErrorCode*),(&snes,&i,&d,_ctx,&ierr));
1158e27ec22SSatish Balay   return 0;
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   return 0;
1248e27ec22SSatish Balay }
1258e27ec22SSatish Balay 
1268e27ec22SSatish Balay EXTERN_C_BEGIN
1278e27ec22SSatish Balay /* ---------------------------------------------------------*/
1288e27ec22SSatish Balay /*
1298e27ec22SSatish Balay      snesdefaultcomputejacobian() and snesdefaultcomputejacobiancolor()
1308e27ec22SSatish Balay   These can be used directly from Fortran but are mostly so that
1318e27ec22SSatish Balay   Fortran SNESSetJacobian() will properly handle the defaults being passed in.
1328e27ec22SSatish Balay 
1338e27ec22SSatish Balay   functions, hence no STDCALL
1348e27ec22SSatish Balay */
135df66969eSBarry Smith void matmffdcomputejacobian_(SNES *snes,Vec *x,Mat *m,Mat *p,MatStructure *type,void *ctx,PetscErrorCode *ierr)
136df66969eSBarry Smith {
137df66969eSBarry Smith   *ierr = MatMFFDComputeJacobian(*snes,*x,m,p,type,ctx);
138df66969eSBarry Smith }
1398e27ec22SSatish Balay void snesdefaultcomputejacobian_(SNES *snes,Vec *x,Mat *m,Mat *p,MatStructure *type,void *ctx,PetscErrorCode *ierr)
1408e27ec22SSatish Balay {
1418e27ec22SSatish Balay   *ierr = SNESDefaultComputeJacobian(*snes,*x,m,p,type,ctx);
1428e27ec22SSatish Balay }
1438e27ec22SSatish Balay void  snesdefaultcomputejacobiancolor_(SNES *snes,Vec *x,Mat *m,Mat *p,MatStructure *type,void *ctx,PetscErrorCode *ierr)
1448e27ec22SSatish Balay {
1458e27ec22SSatish Balay   *ierr = SNESDefaultComputeJacobianColor(*snes,*x,m,p,type,*(MatFDColoring*)ctx);
1468e27ec22SSatish Balay }
1478e27ec22SSatish Balay 
148f5af7f23SKarl Rupp void PETSC_STDCALL snessetjacobian_(SNES *snes,Mat *A,Mat *B,
149f5af7f23SKarl Rupp                                     void (PETSC_STDCALL *func)(SNES*,Vec*,Mat*,Mat*,MatStructure*,void*,PetscErrorCode*),
150f5af7f23SKarl Rupp                                     void *ctx,PetscErrorCode *ierr)
1518e27ec22SSatish Balay {
1528e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(ctx);
153f5b6597dSBarry Smith   CHKFORTRANNULLFUNCTION(func);
154f68b968cSBarry Smith   if ((PetscVoidFunction)func == (PetscVoidFunction)snesdefaultcomputejacobian_) {
1558e27ec22SSatish Balay     *ierr = SNESSetJacobian(*snes,*A,*B,SNESDefaultComputeJacobian,ctx);
156f68b968cSBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesdefaultcomputejacobiancolor_) {
1578e27ec22SSatish Balay     *ierr = SNESSetJacobian(*snes,*A,*B,SNESDefaultComputeJacobianColor,*(MatFDColoring*)ctx);
158df66969eSBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)matmffdcomputejacobian_) {
159df66969eSBarry Smith     *ierr = SNESSetJacobian(*snes,*A,*B,MatMFFDComputeJacobian,ctx);
160f5b6597dSBarry Smith   } else if (!func) {
161f5b6597dSBarry Smith     *ierr = SNESSetJacobian(*snes,*A,*B,0,ctx);
1628e27ec22SSatish Balay   } else {
163f6291634SJed Brown     *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.jacobian,(PetscVoidFunction)func,ctx);
1640298fd71SBarry Smith     if (!*ierr) *ierr = SNESSetJacobian(*snes,*A,*B,oursnesjacobian,NULL);
1658e27ec22SSatish Balay   }
1668e27ec22SSatish Balay }
1678e27ec22SSatish Balay /* -------------------------------------------------------------*/
1688e27ec22SSatish Balay 
1696ce558aeSBarry Smith void PETSC_STDCALL   snessolve_(SNES *snes,Vec *b,Vec *x, int *__ierr)
1706ce558aeSBarry Smith {
171a69afd8bSBarry Smith   Vec B = *b,X = *x;
1720298fd71SBarry Smith   if (FORTRANNULLOBJECT(b)) B = NULL;
1730298fd71SBarry Smith   if (FORTRANNULLOBJECT(x)) X = NULL;
174a69afd8bSBarry Smith   *__ierr = SNESSolve(*snes,B,X);
1756ce558aeSBarry Smith }
1766ce558aeSBarry Smith 
177e1d034e4SBarry Smith void PETSC_STDCALL snesgetoptionsprefix_(SNES *snes,CHAR prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
1788e27ec22SSatish Balay {
1798e27ec22SSatish Balay   const char *tname;
1808e27ec22SSatish Balay 
1818e27ec22SSatish Balay   *ierr = SNESGetOptionsPrefix(*snes,&tname);
1828e27ec22SSatish Balay   *ierr = PetscStrncpy(prefix,tname,len);if (*ierr) return;
1838e27ec22SSatish Balay }
1848e27ec22SSatish Balay 
1857f7931b9SBarry Smith void PETSC_STDCALL snesgettype_(SNES *snes,CHAR name PETSC_MIXED_LEN(len), PetscErrorCode *ierr PETSC_END_LEN(len))
1868e27ec22SSatish Balay {
1878e27ec22SSatish Balay   const char *tname;
1888e27ec22SSatish Balay 
1898e27ec22SSatish Balay   *ierr = SNESGetType(*snes,&tname);
1908e27ec22SSatish Balay   *ierr = PetscStrncpy(name,tname,len);if (*ierr) return;
1917c363081SBarry Smith   FIXRETURNCHAR(PETSC_TRUE,name,len);
1928e27ec22SSatish Balay }
193e3da1266SHong Zhang 
1948e27ec22SSatish Balay /* ---------------------------------------------------------*/
1958e27ec22SSatish Balay 
1968e27ec22SSatish Balay /*
1978e27ec22SSatish Balay    These are not usually called from Fortran but allow Fortran users
1988e27ec22SSatish Balay    to transparently set these monitors from .F code
1998e27ec22SSatish Balay 
2008e27ec22SSatish Balay    functions, hence no STDCALL
2018e27ec22SSatish Balay */
2028e27ec22SSatish Balay 
2032613ca53SBarry Smith void PETSC_STDCALL snessetfunction_(SNES *snes,Vec *r,void (PETSC_STDCALL *func)(SNES*,Vec*,Vec*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr)
2048e27ec22SSatish Balay {
2058e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(ctx);
206f6291634SJed Brown   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.function,(PetscVoidFunction)func,ctx);
2070298fd71SBarry Smith   if (!*ierr) *ierr = SNESSetFunction(*snes,*r,oursnesfunction,NULL);
2088e27ec22SSatish Balay }
209c79ef259SPeter Brune 
210c79ef259SPeter Brune 
211c79ef259SPeter Brune void PETSC_STDCALL snessetgs_(SNES *snes,void (PETSC_STDCALL *func)(SNES*,Vec*,Vec*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr)
212c79ef259SPeter Brune {
213c79ef259SPeter Brune   CHKFORTRANNULLOBJECT(ctx);
214f6291634SJed Brown   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.gs,(PetscVoidFunction)func,ctx);
2150298fd71SBarry Smith   if (!*ierr) *ierr = SNESSetGS(*snes,oursnesgs,NULL);
216c79ef259SPeter Brune }
2178e27ec22SSatish Balay /* ---------------------------------------------------------*/
2188e27ec22SSatish Balay 
2198e27ec22SSatish Balay /* the func argument is ignored */
2208e27ec22SSatish Balay void PETSC_STDCALL snesgetfunction_(SNES *snes,Vec *r,void *func,void **ctx,PetscErrorCode *ierr)
2218e27ec22SSatish Balay {
2228e27ec22SSatish Balay   CHKFORTRANNULLINTEGER(ctx);
2238e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(r);
2240298fd71SBarry Smith   *ierr = SNESGetFunction(*snes,r,NULL,NULL); if (*ierr) return;
2250298fd71SBarry Smith   *ierr = PetscObjectGetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.function,NULL,ctx);
2268e27ec22SSatish Balay }
227c79ef259SPeter Brune 
228c79ef259SPeter Brune void PETSC_STDCALL snesgetgs_(SNES *snes,void *func,void **ctx,PetscErrorCode *ierr)
229c79ef259SPeter Brune {
230c79ef259SPeter Brune   CHKFORTRANNULLINTEGER(ctx);
2310298fd71SBarry Smith   *ierr = PetscObjectGetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.gs,NULL,ctx);
232c79ef259SPeter Brune }
233c79ef259SPeter Brune 
2348e27ec22SSatish Balay /*----------------------------------------------------------------------*/
2358e27ec22SSatish Balay 
2367f7931b9SBarry Smith void snesdefaultconverged_(SNES *snes,PetscInt *it,PetscReal *a,PetscReal *b,PetscReal *c,SNESConvergedReason *r, void *ct,PetscErrorCode *ierr)
2373f149594SLisandro Dalcin {
2383f149594SLisandro Dalcin   *ierr = SNESDefaultConverged(*snes,*it,*a,*b,*c,r,ct);
2393f149594SLisandro Dalcin }
2403f149594SLisandro Dalcin 
241f5af7f23SKarl Rupp void snesskipconverged_(SNES *snes,PetscInt *it,PetscReal *a,PetscReal *b,PetscReal *c,SNESConvergedReason *r,void *ct,PetscErrorCode *ierr)
2423f149594SLisandro Dalcin {
2433f149594SLisandro Dalcin   *ierr = SNESSkipConverged(*snes,*it,*a,*b,*c,r,ct);
2443f149594SLisandro Dalcin }
2453f149594SLisandro Dalcin 
2467f7931b9SBarry Smith 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)
2478e27ec22SSatish Balay {
2488e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(cctx);
2493f22127dSBarry Smith   CHKFORTRANNULLFUNCTION(destroy);
2503f149594SLisandro Dalcin 
2513f149594SLisandro Dalcin   if ((PetscVoidFunction)func == (PetscVoidFunction)snesdefaultconverged_) {
2527f7931b9SBarry Smith     *ierr = SNESSetConvergenceTest(*snes,SNESDefaultConverged,0,0);
2533f149594SLisandro Dalcin   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesskipconverged_) {
2547f7931b9SBarry Smith     *ierr = SNESSetConvergenceTest(*snes,SNESSkipConverged,0,0);
2558e27ec22SSatish Balay   } else {
256f6291634SJed Brown     *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.test,(PetscVoidFunction)func,cctx);
257f6291634SJed Brown     if (*ierr) return;
2583f22127dSBarry Smith     if (!destroy) {
2590298fd71SBarry Smith       *ierr = SNESSetConvergenceTest(*snes,oursnestest,*snes,NULL);
2607f7931b9SBarry Smith     } else {
261f6291634SJed Brown       *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.destroy,(PetscVoidFunction)destroy,cctx);
262f6291634SJed Brown       if (!*ierr) *ierr = SNESSetConvergenceTest(*snes,oursnestest,*snes,ourdestroy);
2637f7931b9SBarry Smith     }
2648e27ec22SSatish Balay   }
2658e27ec22SSatish Balay }
2668e27ec22SSatish Balay /*----------------------------------------------------------------------*/
2678e27ec22SSatish Balay 
2688e27ec22SSatish Balay void PETSC_STDCALL snesview_(SNES *snes,PetscViewer *viewer, PetscErrorCode *ierr)
2698e27ec22SSatish Balay {
2708e27ec22SSatish Balay   PetscViewer v;
2718e27ec22SSatish Balay   PetscPatchDefaultViewers_Fortran(viewer,v);
2728e27ec22SSatish Balay   *ierr = SNESView(*snes,v);
2738e27ec22SSatish Balay }
2748e27ec22SSatish Balay 
2758e27ec22SSatish Balay /*  func is currently ignored from Fortran */
2768e27ec22SSatish Balay void PETSC_STDCALL snesgetjacobian_(SNES *snes,Mat *A,Mat *B,int *func,void **ctx,PetscErrorCode *ierr)
2778e27ec22SSatish Balay {
2788e27ec22SSatish Balay   CHKFORTRANNULLINTEGER(ctx);
2798e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(A);
2808e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(B);
2810298fd71SBarry Smith   *ierr = SNESGetJacobian(*snes,A,B,0,NULL); if (*ierr) return;
2820298fd71SBarry Smith   *ierr = PetscObjectGetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.jacobian,NULL,ctx);
283f2e0d3f1SJed Brown 
2848e27ec22SSatish Balay }
2858e27ec22SSatish Balay 
2868e27ec22SSatish Balay void PETSC_STDCALL snesgetconvergencehistory_(SNES *snes,PetscInt *na,PetscErrorCode *ierr)
2878e27ec22SSatish Balay {
2880298fd71SBarry Smith   *ierr = SNESGetConvergenceHistory(*snes,NULL,NULL,na);
2898e27ec22SSatish Balay }
2908e27ec22SSatish Balay 
2917f7931b9SBarry Smith void PETSC_STDCALL snessettype_(SNES *snes,CHAR type PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
2928e27ec22SSatish Balay {
2938e27ec22SSatish Balay   char *t;
2948e27ec22SSatish Balay 
2958e27ec22SSatish Balay   FIXCHAR(type,len,t);
2968e27ec22SSatish Balay   *ierr = SNESSetType(*snes,t);
2978e27ec22SSatish Balay   FREECHAR(type,t);
2988e27ec22SSatish Balay }
2998e27ec22SSatish Balay 
3007f7931b9SBarry Smith void PETSC_STDCALL snesappendoptionsprefix_(SNES *snes,CHAR prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
3018e27ec22SSatish Balay {
3028e27ec22SSatish Balay   char *t;
3038e27ec22SSatish Balay 
3048e27ec22SSatish Balay   FIXCHAR(prefix,len,t);
3058e27ec22SSatish Balay   *ierr = SNESAppendOptionsPrefix(*snes,t);
3068e27ec22SSatish Balay   FREECHAR(prefix,t);
3078e27ec22SSatish Balay }
3088e27ec22SSatish Balay 
3097f7931b9SBarry Smith void PETSC_STDCALL snessetoptionsprefix_(SNES *snes,CHAR prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
3108e27ec22SSatish Balay {
3118e27ec22SSatish Balay   char *t;
3128e27ec22SSatish Balay 
3138e27ec22SSatish Balay   FIXCHAR(prefix,len,t);
3148e27ec22SSatish Balay   *ierr = SNESSetOptionsPrefix(*snes,t);
3158e27ec22SSatish Balay   FREECHAR(prefix,t);
3168e27ec22SSatish Balay }
3178e27ec22SSatish Balay 
3188e27ec22SSatish Balay /*----------------------------------------------------------------------*/
3198e27ec22SSatish Balay /* functions, hence no STDCALL */
3208e27ec22SSatish Balay 
3214619e776SBarry Smith void snesmonitorlgresidualnorm_(SNES *snes,PetscInt *its,PetscReal *fgnorm,void *dummy,PetscErrorCode *ierr)
3228e27ec22SSatish Balay {
3234619e776SBarry Smith   *ierr = SNESMonitorLGResidualNorm(*snes,*its,*fgnorm,dummy);
3248e27ec22SSatish Balay }
3258e27ec22SSatish Balay 
326a6570f20SBarry Smith void snesmonitordefault_(SNES *snes,PetscInt *its,PetscReal *fgnorm,void *dummy,PetscErrorCode *ierr)
3278e27ec22SSatish Balay {
328a6570f20SBarry Smith   *ierr = SNESMonitorDefault(*snes,*its,*fgnorm,dummy);
3298e27ec22SSatish Balay }
3308e27ec22SSatish Balay 
331a6570f20SBarry Smith void snesmonitorsolution_(SNES *snes,PetscInt *its,PetscReal *fgnorm,void *dummy,PetscErrorCode *ierr)
3328e27ec22SSatish Balay {
333a6570f20SBarry Smith   *ierr = SNESMonitorSolution(*snes,*its,*fgnorm,dummy);
3348e27ec22SSatish Balay }
3358e27ec22SSatish Balay 
336a6570f20SBarry Smith void snesmonitorsolutionupdate_(SNES *snes,PetscInt *its,PetscReal *fgnorm,void *dummy,PetscErrorCode *ierr)
3378e27ec22SSatish Balay {
338a6570f20SBarry Smith   *ierr = SNESMonitorSolutionUpdate(*snes,*its,*fgnorm,dummy);
3398e27ec22SSatish Balay }
3408e27ec22SSatish Balay 
3418e27ec22SSatish Balay 
3426895c445SBarry Smith 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)
3438e27ec22SSatish Balay {
3448e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(mctx);
345a6570f20SBarry Smith   if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitordefault_) {
346a6570f20SBarry Smith     *ierr = SNESMonitorSet(*snes,SNESMonitorDefault,0,0);
347a6570f20SBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorsolution_) {
348a6570f20SBarry Smith     *ierr = SNESMonitorSet(*snes,SNESMonitorSolution,0,0);
349a6570f20SBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorsolutionupdate_) {
350a6570f20SBarry Smith     *ierr = SNESMonitorSet(*snes,SNESMonitorSolutionUpdate,0,0);
3514619e776SBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorlgresidualnorm_) {
3524619e776SBarry Smith     *ierr = SNESMonitorSet(*snes,SNESMonitorLGResidualNorm,0,0);
3538e27ec22SSatish Balay   } else {
354f6291634SJed Brown     *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.monitor,(PetscVoidFunction)func,mctx);
355f6291634SJed Brown     if (*ierr) return;
3568e27ec22SSatish Balay     if (FORTRANNULLFUNCTION(mondestroy)) {
3570298fd71SBarry Smith       *ierr = SNESMonitorSet(*snes,oursnesmonitor,*snes,NULL);
3588e27ec22SSatish Balay     } else {
3595d4ebb51SBarry Smith       CHKFORTRANNULLFUNCTION(mondestroy);
360f6291634SJed Brown       *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.mondestroy,(PetscVoidFunction)mondestroy,mctx);
361f6291634SJed Brown       if (!*ierr) *ierr = SNESMonitorSet(*snes,oursnesmonitor,*snes,ourmondestroy);
3628e27ec22SSatish Balay     }
3638e27ec22SSatish Balay   }
3648e27ec22SSatish Balay }
3658e27ec22SSatish Balay 
366a6dfd86eSKarl Rupp void PETSC_STDCALL  snesgetsneslinesearch_(SNES *snes,SNESLineSearch *linesearch, int *__ierr)
367a6dfd86eSKarl Rupp {
368f1c6b773SPeter Brune   *__ierr = SNESGetSNESLineSearch(*snes, linesearch);
369ea5d4fccSPeter Brune }
3708e27ec22SSatish Balay 
3718e27ec22SSatish Balay EXTERN_C_END
372