xref: /petsc/src/snes/interface/ftn-custom/zsnesf.c (revision 0298fd7132830bec7daee99a80be0eddb2b310a5)
1b45d2f2cSJed Brown #include <petsc-private/fortranimpl.h>
2c6db04a5SJed Brown #include <petscsnes.h>
38e27ec22SSatish Balay 
48e27ec22SSatish Balay #if defined(PETSC_HAVE_FORTRAN_CAPS)
5df66969eSBarry Smith #define matmffdcomputejacobian_          MATMFFDCOMPUTEJACOBIAN
66ce558aeSBarry Smith #define snessolve_                       SNESSOLVE
78e27ec22SSatish Balay #define snesdefaultcomputejacobian_      SNESDEFAULTCOMPUTEJACOBIAN
88e27ec22SSatish Balay #define snesdefaultcomputejacobiancolor_ SNESDEFAULTCOMPUTEJACOBIANCOLOR
98e27ec22SSatish Balay #define snessetjacobian_                 SNESSETJACOBIAN
108e27ec22SSatish Balay #define snesgetoptionsprefix_            SNESGETOPTIONSPREFIX
118e27ec22SSatish Balay #define snesgettype_                     SNESGETTYPE
128e27ec22SSatish Balay #define snessetfunction_                 SNESSETFUNCTION
13c79ef259SPeter Brune #define snessetgs_                       SNESSETGS
148e27ec22SSatish Balay #define snesgetfunction_                 SNESGETFUNCTION
15c79ef259SPeter Brune #define snesgetgs_                       SNESGETGS
168e27ec22SSatish Balay #define snessetconvergencetest_          SNESSETCONVERGENCETEST
173f149594SLisandro Dalcin #define snesdefaultconverged_            SNESDEFAULTCONVERGED
183f149594SLisandro Dalcin #define snesskipconverged_               SNESSKIPCONVERGED
198e27ec22SSatish Balay #define snesview_                        SNESVIEW
208e27ec22SSatish Balay #define snesgetconvergencehistory_       SNESGETCONVERGENCEHISTORY
218e27ec22SSatish Balay #define snesgetjacobian_                 SNESGETJACOBIAN
228e27ec22SSatish Balay #define snessettype_                     SNESSETTYPE
238e27ec22SSatish Balay #define snesappendoptionsprefix_         SNESAPPENDOPTIONSPREFIX
248e27ec22SSatish Balay #define snessetoptionsprefix_            SNESSETOPTIONSPREFIX
25a6570f20SBarry Smith #define snesmonitordefault_              SNESMONITORDEFAULT
26a6570f20SBarry Smith #define snesmonitorsolution_             SNESMONITORSOLUTION
274619e776SBarry Smith #define snesmonitorlgresidualnorm_       SNESMONITORLGRESIDUALNORM
28a6570f20SBarry Smith #define snesmonitorsolutionupdate_       SNESMONITORSOLUTIONUPDATE
29a6570f20SBarry Smith #define snesmonitorset_                  SNESMONITORSET
30d20b5d95SPeter Brune #define snesgetsneslinesearch_           SNESGETSNESLINESEARCH
318e27ec22SSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
32df66969eSBarry Smith #define matmffdcomputejacobian_          matmffdcomputejacobian
336ce558aeSBarry Smith #define snessolve_                       snessolve
348e27ec22SSatish Balay #define snesdefaultcomputejacobian_      snesdefaultcomputejacobian
358e27ec22SSatish Balay #define snesdefaultcomputejacobiancolor_ snesdefaultcomputejacobiancolor
368e27ec22SSatish Balay #define snessetjacobian_                 snessetjacobian
378e27ec22SSatish Balay #define snesgetoptionsprefix_            snesgetoptionsprefix
388e27ec22SSatish Balay #define snesgettype_                     snesgettype
398e27ec22SSatish Balay #define snessetfunction_                 snessetfunction
40c79ef259SPeter Brune #define snessetgs_                       snessetgs
418e27ec22SSatish Balay #define snesgetfunction_                 snesgetfunction
42c79ef259SPeter Brune #define snesgetgs_                       snesgetgs
438e27ec22SSatish Balay #define snessetconvergencetest_          snessetconvergencetest
443f149594SLisandro Dalcin #define snesdefaultconverged_            snesdefaultconverged
453f149594SLisandro Dalcin #define snesskipconverged_               snesskipconverged
468e27ec22SSatish Balay #define snesview_                        snesview
478e27ec22SSatish Balay #define snesgetjacobian_                 snesgetjacobian
488e27ec22SSatish Balay #define snesgetconvergencehistory_       snesgetconvergencehistory
498e27ec22SSatish Balay #define snessettype_                     snessettype
508e27ec22SSatish Balay #define snesappendoptionsprefix_         snesappendoptionsprefix
518e27ec22SSatish Balay #define snessetoptionsprefix_            snessetoptionsprefix
524619e776SBarry Smith #define snesmonitorlgresidualnorm_       snesmonitorlgresidualnorm
53a6570f20SBarry Smith #define snesmonitordefault_              snesmonitordefault
54a6570f20SBarry Smith #define snesmonitorsolution_             snesmonitorsolution
55a6570f20SBarry Smith #define snesmonitorsolutionupdate_       snesmonitorsolutionupdate
56a6570f20SBarry Smith #define snesmonitorset_                  snesmonitorset
573b229b18SJed Brown #define snesgetsneslinesearch_           snesgetsneslinesearch
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;
67f6291634SJed Brown   PetscFortranCallbackId gs;
68f6291634SJed Brown } _cb;
6990b77ac2SPeter Brune 
70de64c4c2SJed Brown #undef __FUNCT__
71de64c4c2SJed Brown #define __FUNCT__ "oursnesfunction"
728e27ec22SSatish Balay static PetscErrorCode oursnesfunction(SNES snes,Vec x,Vec f,void *ctx)
738e27ec22SSatish Balay {
74f6291634SJed Brown   PetscObjectUseFortranCallback(snes,_cb.function,(SNES*,Vec*,Vec*,void*,PetscErrorCode*),(&snes,&x,&f,_ctx,&ierr));
758e27ec22SSatish Balay   return 0;
768e27ec22SSatish Balay }
77b8ebb45fSBarry Smith 
78de64c4c2SJed Brown #undef __FUNCT__
79de64c4c2SJed Brown #define __FUNCT__ "oursnestest"
8006ee9f85SBarry Smith static PetscErrorCode oursnestest(SNES snes,PetscInt it,PetscReal a,PetscReal d,PetscReal c,SNESConvergedReason *reason,void *ctx)
818e27ec22SSatish Balay {
82f6291634SJed Brown   PetscObjectUseFortranCallback(snes,_cb.test,(SNES*,PetscInt*,PetscReal*,PetscReal*,PetscReal*,SNESConvergedReason*,void*,PetscErrorCode*),(&snes,&it,&a,&d,&c,reason,_ctx,&ierr));
837f7931b9SBarry Smith   return 0;
847f7931b9SBarry Smith }
857f7931b9SBarry Smith 
86de64c4c2SJed Brown #undef __FUNCT__
87de64c4c2SJed Brown #define __FUNCT__ "ourdestroy"
887f7931b9SBarry Smith static PetscErrorCode ourdestroy(void *ctx)
897f7931b9SBarry Smith {
90f6291634SJed Brown   PetscObjectUseFortranCallback(ctx,_cb.destroy,(void*,PetscErrorCode*),(_ctx,&ierr));
918e27ec22SSatish Balay   return 0;
928e27ec22SSatish Balay }
938e27ec22SSatish Balay 
94de64c4c2SJed Brown #undef __FUNCT__
95de64c4c2SJed Brown #define __FUNCT__ "oursnesjacobian"
968e27ec22SSatish Balay static PetscErrorCode oursnesjacobian(SNES snes,Vec x,Mat *m,Mat *p,MatStructure *type,void *ctx)
978e27ec22SSatish Balay {
98f6291634SJed Brown   PetscObjectUseFortranCallback(snes,_cb.jacobian,(SNES*,Vec*,Mat*,Mat*,MatStructure*,void*,PetscErrorCode*),(&snes,&x,m,p,type,_ctx,&ierr));
998e27ec22SSatish Balay   return 0;
1008e27ec22SSatish Balay }
101f6291634SJed Brown 
102de64c4c2SJed Brown #undef __FUNCT__
103de64c4c2SJed Brown #define __FUNCT__ "oursnesgs"
10490b77ac2SPeter Brune static PetscErrorCode oursnesgs(SNES snes,Vec x,Vec b,void *ctx)
10590b77ac2SPeter Brune {
106f6291634SJed Brown   PetscObjectUseFortranCallback(snes,_cb.gs,(SNES*,Vec*,Vec*,void*,PetscErrorCode*),(&snes,&x,&b,_ctx,&ierr));
10790b77ac2SPeter Brune   return 0;
10890b77ac2SPeter Brune }
109de64c4c2SJed Brown #undef __FUNCT__
110de64c4c2SJed Brown #define __FUNCT__ "oursnesmonitor"
1118e27ec22SSatish Balay static PetscErrorCode oursnesmonitor(SNES snes,PetscInt i,PetscReal d,void *ctx)
1128e27ec22SSatish Balay {
113f6291634SJed Brown   PetscObjectUseFortranCallback(snes,_cb.monitor,(SNES*,PetscInt*,PetscReal*,void*,PetscErrorCode*),(&snes,&i,&d,_ctx,&ierr));
1148e27ec22SSatish Balay   return 0;
1158e27ec22SSatish Balay }
116de64c4c2SJed Brown #undef __FUNCT__
117de64c4c2SJed Brown #define __FUNCT__ "ourmondestroy"
118c2efdce3SBarry Smith static PetscErrorCode ourmondestroy(void **ctx)
1198e27ec22SSatish Balay {
120f6291634SJed Brown   SNES snes = (SNES)*ctx;
121f6291634SJed Brown   PetscObjectUseFortranCallback(snes,_cb.mondestroy,(void*,PetscErrorCode*),(_ctx,&ierr));
1228e27ec22SSatish Balay   return 0;
1238e27ec22SSatish Balay }
1248e27ec22SSatish Balay 
1258e27ec22SSatish Balay EXTERN_C_BEGIN
1268e27ec22SSatish Balay /* ---------------------------------------------------------*/
1278e27ec22SSatish Balay /*
1288e27ec22SSatish Balay      snesdefaultcomputejacobian() and snesdefaultcomputejacobiancolor()
1298e27ec22SSatish Balay   These can be used directly from Fortran but are mostly so that
1308e27ec22SSatish Balay   Fortran SNESSetJacobian() will properly handle the defaults being passed in.
1318e27ec22SSatish Balay 
1328e27ec22SSatish Balay   functions, hence no STDCALL
1338e27ec22SSatish Balay */
134df66969eSBarry Smith void matmffdcomputejacobian_(SNES *snes,Vec *x,Mat *m,Mat *p,MatStructure *type,void *ctx,PetscErrorCode *ierr)
135df66969eSBarry Smith {
136df66969eSBarry Smith   *ierr = MatMFFDComputeJacobian(*snes,*x,m,p,type,ctx);
137df66969eSBarry Smith }
1388e27ec22SSatish Balay void snesdefaultcomputejacobian_(SNES *snes,Vec *x,Mat *m,Mat *p,MatStructure *type,void *ctx,PetscErrorCode *ierr)
1398e27ec22SSatish Balay {
1408e27ec22SSatish Balay   *ierr = SNESDefaultComputeJacobian(*snes,*x,m,p,type,ctx);
1418e27ec22SSatish Balay }
1428e27ec22SSatish Balay void  snesdefaultcomputejacobiancolor_(SNES *snes,Vec *x,Mat *m,Mat *p,MatStructure *type,void *ctx,PetscErrorCode *ierr)
1438e27ec22SSatish Balay {
1448e27ec22SSatish Balay   *ierr = SNESDefaultComputeJacobianColor(*snes,*x,m,p,type,*(MatFDColoring*)ctx);
1458e27ec22SSatish Balay }
1468e27ec22SSatish Balay 
147f5af7f23SKarl Rupp void PETSC_STDCALL snessetjacobian_(SNES *snes,Mat *A,Mat *B,
148f5af7f23SKarl Rupp                                     void (PETSC_STDCALL *func)(SNES*,Vec*,Mat*,Mat*,MatStructure*,void*,PetscErrorCode*),
149f5af7f23SKarl Rupp                                     void *ctx,PetscErrorCode *ierr)
1508e27ec22SSatish Balay {
1518e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(ctx);
152f5b6597dSBarry Smith   CHKFORTRANNULLFUNCTION(func);
153f68b968cSBarry Smith   if ((PetscVoidFunction)func == (PetscVoidFunction)snesdefaultcomputejacobian_) {
1548e27ec22SSatish Balay     *ierr = SNESSetJacobian(*snes,*A,*B,SNESDefaultComputeJacobian,ctx);
155f68b968cSBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesdefaultcomputejacobiancolor_) {
1568e27ec22SSatish Balay     *ierr = SNESSetJacobian(*snes,*A,*B,SNESDefaultComputeJacobianColor,*(MatFDColoring*)ctx);
157df66969eSBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)matmffdcomputejacobian_) {
158df66969eSBarry Smith     *ierr = SNESSetJacobian(*snes,*A,*B,MatMFFDComputeJacobian,ctx);
159f5b6597dSBarry Smith   } else if (!func) {
160f5b6597dSBarry Smith     *ierr = SNESSetJacobian(*snes,*A,*B,0,ctx);
1618e27ec22SSatish Balay   } else {
162f6291634SJed Brown     *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.jacobian,(PetscVoidFunction)func,ctx);
163*0298fd71SBarry Smith     if (!*ierr) *ierr = SNESSetJacobian(*snes,*A,*B,oursnesjacobian,NULL);
1648e27ec22SSatish Balay   }
1658e27ec22SSatish Balay }
1668e27ec22SSatish Balay /* -------------------------------------------------------------*/
1678e27ec22SSatish Balay 
1686ce558aeSBarry Smith void PETSC_STDCALL   snessolve_(SNES *snes,Vec *b,Vec *x, int *__ierr)
1696ce558aeSBarry Smith {
170a69afd8bSBarry Smith   Vec B = *b,X = *x;
171*0298fd71SBarry Smith   if (FORTRANNULLOBJECT(b)) B = NULL;
172*0298fd71SBarry Smith   if (FORTRANNULLOBJECT(x)) X = NULL;
173a69afd8bSBarry Smith   *__ierr = SNESSolve(*snes,B,X);
1746ce558aeSBarry Smith }
1756ce558aeSBarry Smith 
176e1d034e4SBarry Smith void PETSC_STDCALL snesgetoptionsprefix_(SNES *snes,CHAR prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
1778e27ec22SSatish Balay {
1788e27ec22SSatish Balay   const char *tname;
1798e27ec22SSatish Balay 
1808e27ec22SSatish Balay   *ierr = SNESGetOptionsPrefix(*snes,&tname);
1818e27ec22SSatish Balay   *ierr = PetscStrncpy(prefix,tname,len);if (*ierr) return;
1828e27ec22SSatish Balay }
1838e27ec22SSatish Balay 
1847f7931b9SBarry Smith void PETSC_STDCALL snesgettype_(SNES *snes,CHAR name PETSC_MIXED_LEN(len), PetscErrorCode *ierr PETSC_END_LEN(len))
1858e27ec22SSatish Balay {
1868e27ec22SSatish Balay   const char *tname;
1878e27ec22SSatish Balay 
1888e27ec22SSatish Balay   *ierr = SNESGetType(*snes,&tname);
1898e27ec22SSatish Balay   *ierr = PetscStrncpy(name,tname,len);if (*ierr) return;
1907c363081SBarry Smith   FIXRETURNCHAR(PETSC_TRUE,name,len);
1918e27ec22SSatish Balay }
192e3da1266SHong Zhang 
1938e27ec22SSatish Balay /* ---------------------------------------------------------*/
1948e27ec22SSatish Balay 
1958e27ec22SSatish Balay /*
1968e27ec22SSatish Balay    These are not usually called from Fortran but allow Fortran users
1978e27ec22SSatish Balay    to transparently set these monitors from .F code
1988e27ec22SSatish Balay 
1998e27ec22SSatish Balay    functions, hence no STDCALL
2008e27ec22SSatish Balay */
2018e27ec22SSatish Balay 
2022613ca53SBarry Smith void PETSC_STDCALL snessetfunction_(SNES *snes,Vec *r,void (PETSC_STDCALL *func)(SNES*,Vec*,Vec*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr)
2038e27ec22SSatish Balay {
2048e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(ctx);
205f6291634SJed Brown   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.function,(PetscVoidFunction)func,ctx);
206*0298fd71SBarry Smith   if (!*ierr) *ierr = SNESSetFunction(*snes,*r,oursnesfunction,NULL);
2078e27ec22SSatish Balay }
208c79ef259SPeter Brune 
209c79ef259SPeter Brune 
210c79ef259SPeter Brune void PETSC_STDCALL snessetgs_(SNES *snes,void (PETSC_STDCALL *func)(SNES*,Vec*,Vec*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr)
211c79ef259SPeter Brune {
212c79ef259SPeter Brune   CHKFORTRANNULLOBJECT(ctx);
213f6291634SJed Brown   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.gs,(PetscVoidFunction)func,ctx);
214*0298fd71SBarry Smith   if (!*ierr) *ierr = SNESSetGS(*snes,oursnesgs,NULL);
215c79ef259SPeter Brune }
2168e27ec22SSatish Balay /* ---------------------------------------------------------*/
2178e27ec22SSatish Balay 
2188e27ec22SSatish Balay /* the func argument is ignored */
2198e27ec22SSatish Balay void PETSC_STDCALL snesgetfunction_(SNES *snes,Vec *r,void *func,void **ctx,PetscErrorCode *ierr)
2208e27ec22SSatish Balay {
2218e27ec22SSatish Balay   CHKFORTRANNULLINTEGER(ctx);
2228e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(r);
223*0298fd71SBarry Smith   *ierr = SNESGetFunction(*snes,r,NULL,NULL); if (*ierr) return;
224*0298fd71SBarry Smith   *ierr = PetscObjectGetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.function,NULL,ctx);
2258e27ec22SSatish Balay }
226c79ef259SPeter Brune 
227c79ef259SPeter Brune void PETSC_STDCALL snesgetgs_(SNES *snes,void *func,void **ctx,PetscErrorCode *ierr)
228c79ef259SPeter Brune {
229c79ef259SPeter Brune   CHKFORTRANNULLINTEGER(ctx);
230*0298fd71SBarry Smith   *ierr = PetscObjectGetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.gs,NULL,ctx);
231c79ef259SPeter Brune }
232c79ef259SPeter Brune 
2338e27ec22SSatish Balay /*----------------------------------------------------------------------*/
2348e27ec22SSatish Balay 
2357f7931b9SBarry Smith void snesdefaultconverged_(SNES *snes,PetscInt *it,PetscReal *a,PetscReal *b,PetscReal *c,SNESConvergedReason *r, void *ct,PetscErrorCode *ierr)
2363f149594SLisandro Dalcin {
2373f149594SLisandro Dalcin   *ierr = SNESDefaultConverged(*snes,*it,*a,*b,*c,r,ct);
2383f149594SLisandro Dalcin }
2393f149594SLisandro Dalcin 
240f5af7f23SKarl Rupp void snesskipconverged_(SNES *snes,PetscInt *it,PetscReal *a,PetscReal *b,PetscReal *c,SNESConvergedReason *r,void *ct,PetscErrorCode *ierr)
2413f149594SLisandro Dalcin {
2423f149594SLisandro Dalcin   *ierr = SNESSkipConverged(*snes,*it,*a,*b,*c,r,ct);
2433f149594SLisandro Dalcin }
2443f149594SLisandro Dalcin 
2457f7931b9SBarry 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)
2468e27ec22SSatish Balay {
2478e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(cctx);
2483f22127dSBarry Smith   CHKFORTRANNULLFUNCTION(destroy);
2493f149594SLisandro Dalcin 
2503f149594SLisandro Dalcin   if ((PetscVoidFunction)func == (PetscVoidFunction)snesdefaultconverged_) {
2517f7931b9SBarry Smith     *ierr = SNESSetConvergenceTest(*snes,SNESDefaultConverged,0,0);
2523f149594SLisandro Dalcin   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesskipconverged_) {
2537f7931b9SBarry Smith     *ierr = SNESSetConvergenceTest(*snes,SNESSkipConverged,0,0);
2548e27ec22SSatish Balay   } else {
255f6291634SJed Brown     *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.test,(PetscVoidFunction)func,cctx);
256f6291634SJed Brown     if (*ierr) return;
2573f22127dSBarry Smith     if (!destroy) {
258*0298fd71SBarry Smith       *ierr = SNESSetConvergenceTest(*snes,oursnestest,*snes,NULL);
2597f7931b9SBarry Smith     } else {
260f6291634SJed Brown       *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.destroy,(PetscVoidFunction)destroy,cctx);
261f6291634SJed Brown       if (!*ierr) *ierr = SNESSetConvergenceTest(*snes,oursnestest,*snes,ourdestroy);
2627f7931b9SBarry Smith     }
2638e27ec22SSatish Balay   }
2648e27ec22SSatish Balay }
2658e27ec22SSatish Balay /*----------------------------------------------------------------------*/
2668e27ec22SSatish Balay 
2678e27ec22SSatish Balay void PETSC_STDCALL snesview_(SNES *snes,PetscViewer *viewer, PetscErrorCode *ierr)
2688e27ec22SSatish Balay {
2698e27ec22SSatish Balay   PetscViewer v;
2708e27ec22SSatish Balay   PetscPatchDefaultViewers_Fortran(viewer,v);
2718e27ec22SSatish Balay   *ierr = SNESView(*snes,v);
2728e27ec22SSatish Balay }
2738e27ec22SSatish Balay 
2748e27ec22SSatish Balay /*  func is currently ignored from Fortran */
2758e27ec22SSatish Balay void PETSC_STDCALL snesgetjacobian_(SNES *snes,Mat *A,Mat *B,int *func,void **ctx,PetscErrorCode *ierr)
2768e27ec22SSatish Balay {
2778e27ec22SSatish Balay   CHKFORTRANNULLINTEGER(ctx);
2788e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(A);
2798e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(B);
280*0298fd71SBarry Smith   *ierr = SNESGetJacobian(*snes,A,B,0,NULL); if (*ierr) return;
281*0298fd71SBarry Smith   *ierr = PetscObjectGetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.jacobian,NULL,ctx);
282f2e0d3f1SJed Brown 
2838e27ec22SSatish Balay }
2848e27ec22SSatish Balay 
2858e27ec22SSatish Balay void PETSC_STDCALL snesgetconvergencehistory_(SNES *snes,PetscInt *na,PetscErrorCode *ierr)
2868e27ec22SSatish Balay {
287*0298fd71SBarry Smith   *ierr = SNESGetConvergenceHistory(*snes,NULL,NULL,na);
2888e27ec22SSatish Balay }
2898e27ec22SSatish Balay 
2907f7931b9SBarry Smith void PETSC_STDCALL snessettype_(SNES *snes,CHAR type PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
2918e27ec22SSatish Balay {
2928e27ec22SSatish Balay   char *t;
2938e27ec22SSatish Balay 
2948e27ec22SSatish Balay   FIXCHAR(type,len,t);
2958e27ec22SSatish Balay   *ierr = SNESSetType(*snes,t);
2968e27ec22SSatish Balay   FREECHAR(type,t);
2978e27ec22SSatish Balay }
2988e27ec22SSatish Balay 
2997f7931b9SBarry Smith void PETSC_STDCALL snesappendoptionsprefix_(SNES *snes,CHAR prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
3008e27ec22SSatish Balay {
3018e27ec22SSatish Balay   char *t;
3028e27ec22SSatish Balay 
3038e27ec22SSatish Balay   FIXCHAR(prefix,len,t);
3048e27ec22SSatish Balay   *ierr = SNESAppendOptionsPrefix(*snes,t);
3058e27ec22SSatish Balay   FREECHAR(prefix,t);
3068e27ec22SSatish Balay }
3078e27ec22SSatish Balay 
3087f7931b9SBarry Smith void PETSC_STDCALL snessetoptionsprefix_(SNES *snes,CHAR prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
3098e27ec22SSatish Balay {
3108e27ec22SSatish Balay   char *t;
3118e27ec22SSatish Balay 
3128e27ec22SSatish Balay   FIXCHAR(prefix,len,t);
3138e27ec22SSatish Balay   *ierr = SNESSetOptionsPrefix(*snes,t);
3148e27ec22SSatish Balay   FREECHAR(prefix,t);
3158e27ec22SSatish Balay }
3168e27ec22SSatish Balay 
3178e27ec22SSatish Balay /*----------------------------------------------------------------------*/
3188e27ec22SSatish Balay /* functions, hence no STDCALL */
3198e27ec22SSatish Balay 
3204619e776SBarry Smith void snesmonitorlgresidualnorm_(SNES *snes,PetscInt *its,PetscReal *fgnorm,void *dummy,PetscErrorCode *ierr)
3218e27ec22SSatish Balay {
3224619e776SBarry Smith   *ierr = SNESMonitorLGResidualNorm(*snes,*its,*fgnorm,dummy);
3238e27ec22SSatish Balay }
3248e27ec22SSatish Balay 
325a6570f20SBarry Smith void snesmonitordefault_(SNES *snes,PetscInt *its,PetscReal *fgnorm,void *dummy,PetscErrorCode *ierr)
3268e27ec22SSatish Balay {
327a6570f20SBarry Smith   *ierr = SNESMonitorDefault(*snes,*its,*fgnorm,dummy);
3288e27ec22SSatish Balay }
3298e27ec22SSatish Balay 
330a6570f20SBarry Smith void snesmonitorsolution_(SNES *snes,PetscInt *its,PetscReal *fgnorm,void *dummy,PetscErrorCode *ierr)
3318e27ec22SSatish Balay {
332a6570f20SBarry Smith   *ierr = SNESMonitorSolution(*snes,*its,*fgnorm,dummy);
3338e27ec22SSatish Balay }
3348e27ec22SSatish Balay 
335a6570f20SBarry Smith void snesmonitorsolutionupdate_(SNES *snes,PetscInt *its,PetscReal *fgnorm,void *dummy,PetscErrorCode *ierr)
3368e27ec22SSatish Balay {
337a6570f20SBarry Smith   *ierr = SNESMonitorSolutionUpdate(*snes,*its,*fgnorm,dummy);
3388e27ec22SSatish Balay }
3398e27ec22SSatish Balay 
3408e27ec22SSatish Balay 
3416895c445SBarry 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)
3428e27ec22SSatish Balay {
3438e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(mctx);
344a6570f20SBarry Smith   if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitordefault_) {
345a6570f20SBarry Smith     *ierr = SNESMonitorSet(*snes,SNESMonitorDefault,0,0);
346a6570f20SBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorsolution_) {
347a6570f20SBarry Smith     *ierr = SNESMonitorSet(*snes,SNESMonitorSolution,0,0);
348a6570f20SBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorsolutionupdate_) {
349a6570f20SBarry Smith     *ierr = SNESMonitorSet(*snes,SNESMonitorSolutionUpdate,0,0);
3504619e776SBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorlgresidualnorm_) {
3514619e776SBarry Smith     *ierr = SNESMonitorSet(*snes,SNESMonitorLGResidualNorm,0,0);
3528e27ec22SSatish Balay   } else {
353f6291634SJed Brown     *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.monitor,(PetscVoidFunction)func,mctx);
354f6291634SJed Brown     if (*ierr) return;
3558e27ec22SSatish Balay     if (FORTRANNULLFUNCTION(mondestroy)) {
356*0298fd71SBarry Smith       *ierr = SNESMonitorSet(*snes,oursnesmonitor,*snes,NULL);
3578e27ec22SSatish Balay     } else {
3585d4ebb51SBarry Smith       CHKFORTRANNULLFUNCTION(mondestroy);
359f6291634SJed Brown       *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.mondestroy,(PetscVoidFunction)mondestroy,mctx);
360f6291634SJed Brown       if (!*ierr) *ierr = SNESMonitorSet(*snes,oursnesmonitor,*snes,ourmondestroy);
3618e27ec22SSatish Balay     }
3628e27ec22SSatish Balay   }
3638e27ec22SSatish Balay }
3648e27ec22SSatish Balay 
365a6dfd86eSKarl Rupp void PETSC_STDCALL  snesgetsneslinesearch_(SNES *snes,SNESLineSearch *linesearch, int *__ierr)
366a6dfd86eSKarl Rupp {
367f1c6b773SPeter Brune   *__ierr = SNESGetSNESLineSearch(*snes, linesearch);
368ea5d4fccSPeter Brune }
3698e27ec22SSatish Balay 
3708e27ec22SSatish Balay EXTERN_C_END
371