xref: /petsc/src/snes/interface/ftn-custom/zsnesf.c (revision 3f1495945e0c17d25f364df1e0c912f77d59eb1e)
18e27ec22SSatish Balay #include "zpetsc.h"
28e27ec22SSatish Balay #include "petscsnes.h"
38e27ec22SSatish Balay 
48e27ec22SSatish Balay #ifdef PETSC_HAVE_FORTRAN_UNDERSCORE_UNDERSCORE
5*3f149594SLisandro Dalcin #define snesdefaultconverged_            snesdefaultconverged__
6*3f149594SLisandro Dalcin #define snesskipconverged_               snesskipconverged__
78e27ec22SSatish Balay #define snesconverged_tr_                snesconverged_tr__
88e27ec22SSatish Balay #define snesconverged_ls_                snesconverged_ls__
98e27ec22SSatish Balay #endif
108e27ec22SSatish Balay 
118e27ec22SSatish Balay #if defined(PETSC_HAVE_FORTRAN_CAPS)
126ce558aeSBarry Smith #define snessolve_                       SNESSOLVE
138e27ec22SSatish Balay #define snesdefaultcomputejacobian_      SNESDEFAULTCOMPUTEJACOBIAN
148e27ec22SSatish Balay #define snesdefaultcomputejacobiancolor_ SNESDEFAULTCOMPUTEJACOBIANCOLOR
158e27ec22SSatish Balay #define snesdacomputejacobian_           SNESDACOMPUTEJACOBIAN
168e27ec22SSatish Balay #define snesdacomputejacobianwithadifor_ SNESDACOMPUTEJACOBIANWITHADIFOR
178e27ec22SSatish Balay #define snessetjacobian_                 SNESSETJACOBIAN
188e27ec22SSatish Balay #define snesgetoptionsprefix_            SNESGETOPTIONSPREFIX
198e27ec22SSatish Balay #define snesgettype_                     SNESGETTYPE
208e27ec22SSatish Balay #define snesdaformfunction_              SNESDAFORMFUNCTION
218e27ec22SSatish Balay #define snessetfunction_                 SNESSETFUNCTION
228e27ec22SSatish Balay #define snesgetfunction_                 SNESGETFUNCTION
238e27ec22SSatish Balay #define snessetconvergencetest_          SNESSETCONVERGENCETEST
24*3f149594SLisandro Dalcin #define snesdefaultconverged_            SNESDEFAULTCONVERGED
25*3f149594SLisandro Dalcin #define snesskipconverged_               SNESSKIPCONVERGED
268e27ec22SSatish Balay #define snesconverged_tr_                SNESCONVERGED_TR
278e27ec22SSatish Balay #define snesconverged_ls_                SNESCONVERGED_LS
288e27ec22SSatish Balay #define snesview_                        SNESVIEW
298e27ec22SSatish Balay #define snesgetconvergencehistory_       SNESGETCONVERGENCEHISTORY
308e27ec22SSatish Balay #define snesgetjacobian_                 SNESGETJACOBIAN
318e27ec22SSatish Balay #define snessettype_                     SNESSETTYPE
328e27ec22SSatish Balay #define snesappendoptionsprefix_         SNESAPPENDOPTIONSPREFIX
338e27ec22SSatish Balay #define snessetoptionsprefix_            SNESSETOPTIONSPREFIX
34a6570f20SBarry Smith #define snesmonitordefault_              SNESMONITORDEFAULT
35a6570f20SBarry Smith #define snesmonitorsolution_             SNESMONITORSOLUTION
36a6570f20SBarry Smith #define snesmonitorlg_                   SNESMONITORLG
37a6570f20SBarry Smith #define snesmonitorsolutionupdate_       SNESMONITORSOLUTIONUPDATE
38a6570f20SBarry Smith #define snesmonitorset_                  SNESMONITORSET
398e27ec22SSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
406ce558aeSBarry Smith #define snessolve_                       snessolve
418e27ec22SSatish Balay #define snesdefaultcomputejacobian_      snesdefaultcomputejacobian
428e27ec22SSatish Balay #define snesdefaultcomputejacobiancolor_ snesdefaultcomputejacobiancolor
438e27ec22SSatish Balay #define snesdacomputejacobian_           snesdacomputejacobian
448e27ec22SSatish Balay #define snesdacomputejacobianwithadifor_ snesdacomputejacobianwithadifor
458e27ec22SSatish Balay #define snessetjacobian_                 snessetjacobian
468e27ec22SSatish Balay #define snesgetoptionsprefix_            snesgetoptionsprefix
478e27ec22SSatish Balay #define snesgettype_                     snesgettype
488e27ec22SSatish Balay #define snesdaformfunction_              snesdaformfunction
498e27ec22SSatish Balay #define snessetfunction_                 snessetfunction
508e27ec22SSatish Balay #define snesgetfunction_                 snesgetfunction
518e27ec22SSatish Balay #define snessetconvergencetest_          snessetconvergencetest
52*3f149594SLisandro Dalcin #define snesdefaultconverged_            snesdefaultconverged
53*3f149594SLisandro Dalcin #define snesskipconverged_               snesskipconverged
548e27ec22SSatish Balay #define snesconverged_tr_                snesconverged_tr
558e27ec22SSatish Balay #define snesconverged_ls_                snesconverged_ls
568e27ec22SSatish Balay #define snesview_                        snesview
578e27ec22SSatish Balay #define snesgetjacobian_                 snesgetjacobian
588e27ec22SSatish Balay #define snesgetconvergencehistory_       snesgetconvergencehistory
598e27ec22SSatish Balay #define snessettype_                     snessettype
608e27ec22SSatish Balay #define snesappendoptionsprefix_         snesappendoptionsprefix
618e27ec22SSatish Balay #define snessetoptionsprefix_            snessetoptionsprefix
62a6570f20SBarry Smith #define snesmonitorlg_                   snesmonitorlg
63a6570f20SBarry Smith #define snesmonitordefault_              snesmonitordefault
64a6570f20SBarry Smith #define snesmonitorsolution_             snesmonitorsolution
65a6570f20SBarry Smith #define snesmonitorsolutionupdate_       snesmonitorsolutionupdate
66a6570f20SBarry Smith #define snesmonitorset_                  snesmonitorset
678e27ec22SSatish Balay #endif
688e27ec22SSatish Balay 
698e27ec22SSatish Balay EXTERN_C_BEGIN
708e27ec22SSatish Balay static void (PETSC_STDCALL *f3)(SNES*,Vec*,Mat*,Mat*,MatStructure*,void*,PetscErrorCode*);
718e27ec22SSatish Balay static void (PETSC_STDCALL *f2)(SNES*,Vec*,Vec*,void*,PetscErrorCode*);
7206ee9f85SBarry Smith static void (PETSC_STDCALL *f8)(SNES*,PetscInt *,PetscReal*,PetscReal*,PetscReal*,SNESConvergedReason*,void*,PetscErrorCode*);
738e27ec22SSatish Balay static void (PETSC_STDCALL *f7)(SNES*,PetscInt*,PetscReal*,void*,PetscErrorCode*);
748e27ec22SSatish Balay static void (PETSC_STDCALL *f71)(void*,PetscErrorCode*);
758e27ec22SSatish Balay EXTERN_C_END
768e27ec22SSatish Balay 
778e27ec22SSatish Balay static PetscErrorCode oursnesfunction(SNES snes,Vec x,Vec f,void *ctx)
788e27ec22SSatish Balay {
798e27ec22SSatish Balay   PetscErrorCode ierr = 0;
808e27ec22SSatish Balay   (*f2)(&snes,&x,&f,ctx,&ierr);CHKERRQ(ierr);
818e27ec22SSatish Balay   return 0;
828e27ec22SSatish Balay }
8306ee9f85SBarry Smith static PetscErrorCode oursnestest(SNES snes,PetscInt it,PetscReal a,PetscReal d,PetscReal c,SNESConvergedReason*reason,void*ctx)
848e27ec22SSatish Balay {
858e27ec22SSatish Balay   PetscErrorCode ierr = 0;
868e27ec22SSatish Balay 
8706ee9f85SBarry Smith   (*f8)(&snes,&it,&a,&d,&c,reason,ctx,&ierr);CHKERRQ(ierr);
888e27ec22SSatish Balay   return 0;
898e27ec22SSatish Balay }
908e27ec22SSatish Balay 
918e27ec22SSatish Balay static PetscErrorCode oursnesjacobian(SNES snes,Vec x,Mat* m,Mat* p,MatStructure* type,void*ctx)
928e27ec22SSatish Balay {
938e27ec22SSatish Balay   PetscErrorCode ierr = 0;
948e27ec22SSatish Balay   (*f3)(&snes,&x,m,p,type,ctx,&ierr);CHKERRQ(ierr);
958e27ec22SSatish Balay   return 0;
968e27ec22SSatish Balay }
978e27ec22SSatish Balay static PetscErrorCode oursnesmonitor(SNES snes,PetscInt i,PetscReal d,void*ctx)
988e27ec22SSatish Balay {
998e27ec22SSatish Balay   PetscErrorCode ierr = 0;
1008e27ec22SSatish Balay 
1018e27ec22SSatish Balay   (*f7)(&snes,&i,&d,ctx,&ierr);CHKERRQ(ierr);
1028e27ec22SSatish Balay   return 0;
1038e27ec22SSatish Balay }
1048e27ec22SSatish Balay static PetscErrorCode ourmondestroy(void* ctx)
1058e27ec22SSatish Balay {
1068e27ec22SSatish Balay   PetscErrorCode ierr = 0;
1078e27ec22SSatish Balay 
1088e27ec22SSatish Balay   (*f71)(ctx,&ierr);CHKERRQ(ierr);
1098e27ec22SSatish Balay   return 0;
1108e27ec22SSatish Balay }
1118e27ec22SSatish Balay 
1128e27ec22SSatish Balay EXTERN_C_BEGIN
1138e27ec22SSatish Balay /* ---------------------------------------------------------*/
1148e27ec22SSatish Balay /*
1158e27ec22SSatish Balay      snesdefaultcomputejacobian() and snesdefaultcomputejacobiancolor()
1168e27ec22SSatish Balay   These can be used directly from Fortran but are mostly so that
1178e27ec22SSatish Balay   Fortran SNESSetJacobian() will properly handle the defaults being passed in.
1188e27ec22SSatish Balay 
1198e27ec22SSatish Balay   functions, hence no STDCALL
1208e27ec22SSatish Balay */
1218e27ec22SSatish Balay void snesdefaultcomputejacobian_(SNES *snes,Vec *x,Mat *m,Mat *p,MatStructure* type,void *ctx,PetscErrorCode *ierr)
1228e27ec22SSatish Balay {
1238e27ec22SSatish Balay   *ierr = SNESDefaultComputeJacobian(*snes,*x,m,p,type,ctx);
1248e27ec22SSatish Balay }
1258e27ec22SSatish Balay void  snesdefaultcomputejacobiancolor_(SNES *snes,Vec *x,Mat *m,Mat *p,MatStructure* type,void *ctx,PetscErrorCode *ierr)
1268e27ec22SSatish Balay {
1278e27ec22SSatish Balay   *ierr = SNESDefaultComputeJacobianColor(*snes,*x,m,p,type,*(MatFDColoring*)ctx);
1288e27ec22SSatish Balay }
1298e27ec22SSatish Balay 
1308e27ec22SSatish Balay void  snesdacomputejacobianwithadifor_(SNES *snes,Vec *X,Mat *m,Mat *p,MatStructure* type,void *ctx,PetscErrorCode *ierr)
1318e27ec22SSatish Balay {
1328e27ec22SSatish Balay   (*PetscErrorPrintf)("Cannot call this function from Fortran");
1338e27ec22SSatish Balay   *ierr = 1;
1348e27ec22SSatish Balay }
1358e27ec22SSatish Balay 
1368e27ec22SSatish Balay void  snesdacomputejacobian_(SNES *snes,Vec *X,Mat *m,Mat *p,MatStructure* type,void *ctx,PetscErrorCode *ierr)
1378e27ec22SSatish Balay {
1388e27ec22SSatish Balay   (*PetscErrorPrintf)("Cannot call this function from Fortran");
1398e27ec22SSatish Balay   *ierr = 1;
1408e27ec22SSatish Balay }
1418e27ec22SSatish Balay 
1428e27ec22SSatish Balay void PETSC_STDCALL snessetjacobian_(SNES *snes,Mat *A,Mat *B,void (PETSC_STDCALL *func)(SNES*,Vec*,Mat*,Mat*,
1438e27ec22SSatish Balay             MatStructure*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr)
1448e27ec22SSatish Balay {
1458e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(ctx);
146f68b968cSBarry Smith   if ((PetscVoidFunction)func == (PetscVoidFunction)snesdefaultcomputejacobian_) {
1478e27ec22SSatish Balay     *ierr = SNESSetJacobian(*snes,*A,*B,SNESDefaultComputeJacobian,ctx);
148f68b968cSBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesdefaultcomputejacobiancolor_) {
1498e27ec22SSatish Balay     *ierr = SNESSetJacobian(*snes,*A,*B,SNESDefaultComputeJacobianColor,*(MatFDColoring*)ctx);
150f68b968cSBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesdacomputejacobianwithadifor_) {
1518e27ec22SSatish Balay     *ierr = SNESSetJacobian(*snes,*A,*B,SNESDAComputeJacobianWithAdifor,ctx);
152f68b968cSBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesdacomputejacobian_) {
1538e27ec22SSatish Balay     *ierr = SNESSetJacobian(*snes,*A,*B,SNESDAComputeJacobian,ctx);
1548e27ec22SSatish Balay   } else {
1558e27ec22SSatish Balay     f3 = func;
1568e27ec22SSatish Balay     *ierr = SNESSetJacobian(*snes,*A,*B,oursnesjacobian,ctx);
1578e27ec22SSatish Balay   }
1588e27ec22SSatish Balay }
1598e27ec22SSatish Balay /* -------------------------------------------------------------*/
1608e27ec22SSatish Balay 
1616ce558aeSBarry Smith void PETSC_STDCALL   snessolve_(SNES *snes,Vec *b,Vec *x, int *__ierr )
1626ce558aeSBarry Smith {
1636ce558aeSBarry Smith   Vec B = *b;
1646ce558aeSBarry Smith   if (*b == PETSC_NULL_OBJECT_Fortran) B = PETSC_NULL;
1656ce558aeSBarry Smith   *__ierr = SNESSolve(*snes,B,*x);
1666ce558aeSBarry Smith }
1676ce558aeSBarry Smith 
1688e27ec22SSatish Balay void PETSC_STDCALL snesgetoptionsprefix_(SNES *snes,CHAR prefix PETSC_MIXED_LEN(len),
1698e27ec22SSatish Balay                                          PetscErrorCode *ierr PETSC_END_LEN(len))
1708e27ec22SSatish Balay {
1718e27ec22SSatish Balay   const char *tname;
1728e27ec22SSatish Balay 
1738e27ec22SSatish Balay   *ierr = SNESGetOptionsPrefix(*snes,&tname);
1748e27ec22SSatish Balay #if defined(PETSC_USES_CPTOFCD)
1758e27ec22SSatish Balay   {
1768e27ec22SSatish Balay     char *t = _fcdtocp(prefix); int len1 = _fcdlen(prefix);
1778e27ec22SSatish Balay     *ierr = PetscStrncpy(t,tname,len1);if (*ierr) return;
1788e27ec22SSatish Balay   }
1798e27ec22SSatish Balay #else
1808e27ec22SSatish Balay   *ierr = PetscStrncpy(prefix,tname,len);if (*ierr) return;
1818e27ec22SSatish Balay #endif
1828e27ec22SSatish Balay }
1838e27ec22SSatish Balay 
1848e27ec22SSatish Balay void PETSC_STDCALL snesgettype_(SNES *snes,CHAR name PETSC_MIXED_LEN(len),
1858e27ec22SSatish Balay                                 PetscErrorCode *ierr PETSC_END_LEN(len))
1868e27ec22SSatish Balay {
1878e27ec22SSatish Balay   const char *tname;
1888e27ec22SSatish Balay 
1898e27ec22SSatish Balay   *ierr = SNESGetType(*snes,&tname);
1908e27ec22SSatish Balay #if defined(PETSC_USES_CPTOFCD)
1918e27ec22SSatish Balay   {
1928e27ec22SSatish Balay     char *t = _fcdtocp(name); int len1 = _fcdlen(name);
1938e27ec22SSatish Balay     *ierr = PetscStrncpy(t,tname,len1);if (*ierr) return;
1948e27ec22SSatish Balay   }
1958e27ec22SSatish Balay #else
1968e27ec22SSatish Balay   *ierr = PetscStrncpy(name,tname,len);if (*ierr) return;
1978e27ec22SSatish Balay #endif
1988e27ec22SSatish Balay   FIXRETURNCHAR(name,len);
1998e27ec22SSatish Balay }
2008e27ec22SSatish Balay /* ---------------------------------------------------------*/
2018e27ec22SSatish Balay 
2028e27ec22SSatish Balay /*
2038e27ec22SSatish Balay         These are not usually called from Fortran but allow Fortran users
2048e27ec22SSatish Balay    to transparently set these monitors from .F code
2058e27ec22SSatish Balay 
2068e27ec22SSatish Balay    functions, hence no STDCALL
2078e27ec22SSatish Balay */
2088e27ec22SSatish Balay void  snesdaformfunction_(SNES *snes,Vec *X, Vec *F,void *ptr,PetscErrorCode *ierr)
2098e27ec22SSatish Balay {
2108e27ec22SSatish Balay   *ierr = SNESDAFormFunction(*snes,*X,*F,ptr);
2118e27ec22SSatish Balay }
2128e27ec22SSatish Balay 
2138e27ec22SSatish Balay void PETSC_STDCALL snessetfunction_(SNES *snes,Vec *r,void (PETSC_STDCALL *func)(SNES*,Vec*,Vec*,void*,PetscErrorCode*),
2148e27ec22SSatish Balay                       void *ctx,PetscErrorCode *ierr)
2158e27ec22SSatish Balay {
2168e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(ctx);
2178e27ec22SSatish Balay   f2 = func;
218f68b968cSBarry Smith   if ((PetscVoidFunction)func == (PetscVoidFunction)snesdaformfunction_) {
2198e27ec22SSatish Balay     *ierr = SNESSetFunction(*snes,*r,SNESDAFormFunction,ctx);
2208e27ec22SSatish Balay   } else {
2218e27ec22SSatish Balay     *ierr = SNESSetFunction(*snes,*r,oursnesfunction,ctx);
2228e27ec22SSatish Balay   }
2238e27ec22SSatish Balay }
2248e27ec22SSatish Balay /* ---------------------------------------------------------*/
2258e27ec22SSatish Balay 
2268e27ec22SSatish Balay /* the func argument is ignored */
2278e27ec22SSatish Balay void PETSC_STDCALL snesgetfunction_(SNES *snes,Vec *r,void *func,void **ctx,PetscErrorCode *ierr)
2288e27ec22SSatish Balay {
2298e27ec22SSatish Balay   CHKFORTRANNULLINTEGER(ctx);
2308e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(r);
2318e27ec22SSatish Balay   *ierr = SNESGetFunction(*snes,r,PETSC_NULL,ctx);
2328e27ec22SSatish Balay }
2338e27ec22SSatish Balay /*----------------------------------------------------------------------*/
2348e27ec22SSatish Balay 
235*3f149594SLisandro Dalcin void snesdefaultconverged_(SNES *snes,PetscInt *it,PetscReal *a,PetscReal *b,PetscReal *c,SNESConvergedReason *r,
236*3f149594SLisandro Dalcin                                        void *ct,PetscErrorCode *ierr)
237*3f149594SLisandro Dalcin {
238*3f149594SLisandro Dalcin   *ierr = SNESDefaultConverged(*snes,*it,*a,*b,*c,r,ct);
239*3f149594SLisandro Dalcin }
240*3f149594SLisandro Dalcin 
241*3f149594SLisandro Dalcin void snesskipconverged_(SNES *snes,PetscInt *it,PetscReal *a,PetscReal *b,PetscReal *c,SNESConvergedReason *r,
242*3f149594SLisandro Dalcin                                        void *ct,PetscErrorCode *ierr)
243*3f149594SLisandro Dalcin {
244*3f149594SLisandro Dalcin   *ierr = SNESSkipConverged(*snes,*it,*a,*b,*c,r,ct);
245*3f149594SLisandro Dalcin }
246*3f149594SLisandro Dalcin 
24706ee9f85SBarry Smith void snesconverged_tr_(SNES *snes,PetscInt *it,PetscReal *a,PetscReal *b,PetscReal *c,SNESConvergedReason *r,
2488e27ec22SSatish Balay                                        void *ct,PetscErrorCode *ierr)
2498e27ec22SSatish Balay {
25006ee9f85SBarry Smith   *ierr = SNESConverged_TR(*snes,*it,*a,*b,*c,r,ct);
2518e27ec22SSatish Balay }
2528e27ec22SSatish Balay 
25306ee9f85SBarry Smith void snesconverged_ls_(SNES *snes,PetscInt *it, PetscReal *a,PetscReal *b,PetscReal *c,SNESConvergedReason *r,
2548e27ec22SSatish Balay                                        void *ct,PetscErrorCode *ierr)
2558e27ec22SSatish Balay {
25606ee9f85SBarry Smith   *ierr = SNESConverged_LS(*snes,*it,*a,*b,*c,r,ct);
2578e27ec22SSatish Balay }
2588e27ec22SSatish Balay 
2598e27ec22SSatish Balay 
2608e27ec22SSatish Balay void PETSC_STDCALL snessetconvergencetest_(SNES *snes,
26106ee9f85SBarry Smith        void (PETSC_STDCALL *func)(SNES*,PetscInt*,PetscReal*,PetscReal*,PetscReal*,SNESConvergedReason*,void*,PetscErrorCode*),
2628e27ec22SSatish Balay        void *cctx,PetscErrorCode *ierr)
2638e27ec22SSatish Balay {
2648e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(cctx);
265*3f149594SLisandro Dalcin 
266*3f149594SLisandro Dalcin   if ((PetscVoidFunction)func == (PetscVoidFunction)snesdefaultconverged_){
267*3f149594SLisandro Dalcin     *ierr = SNESSetConvergenceTest(*snes,SNESDefaultConverged,0);
268*3f149594SLisandro Dalcin   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesskipconverged_){
269*3f149594SLisandro Dalcin     *ierr = SNESSetConvergenceTest(*snes,SNESSkipConverged,0);
270*3f149594SLisandro Dalcin   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesconverged_ls_){
2718e27ec22SSatish Balay     *ierr = SNESSetConvergenceTest(*snes,SNESConverged_LS,0);
272f68b968cSBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesconverged_tr_){
2738e27ec22SSatish Balay     *ierr = SNESSetConvergenceTest(*snes,SNESConverged_TR,0);
2748e27ec22SSatish Balay   } else {
2758e27ec22SSatish Balay     f8 = func;
2768e27ec22SSatish Balay     *ierr = SNESSetConvergenceTest(*snes,oursnestest,cctx);
2778e27ec22SSatish Balay   }
2788e27ec22SSatish Balay }
2798e27ec22SSatish Balay /*----------------------------------------------------------------------*/
2808e27ec22SSatish Balay 
2818e27ec22SSatish Balay void PETSC_STDCALL snesview_(SNES *snes,PetscViewer *viewer, PetscErrorCode *ierr)
2828e27ec22SSatish Balay {
2838e27ec22SSatish Balay   PetscViewer v;
2848e27ec22SSatish Balay   PetscPatchDefaultViewers_Fortran(viewer,v);
2858e27ec22SSatish Balay   *ierr = SNESView(*snes,v);
2868e27ec22SSatish Balay }
2878e27ec22SSatish Balay 
2888e27ec22SSatish Balay /*  func is currently ignored from Fortran */
2898e27ec22SSatish Balay void PETSC_STDCALL snesgetjacobian_(SNES *snes,Mat *A,Mat *B,int *func,void **ctx,PetscErrorCode *ierr)
2908e27ec22SSatish Balay {
2918e27ec22SSatish Balay   CHKFORTRANNULLINTEGER(ctx);
2928e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(A);
2938e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(B);
2948e27ec22SSatish Balay   *ierr = SNESGetJacobian(*snes,A,B,0,ctx);
2958e27ec22SSatish Balay }
2968e27ec22SSatish Balay 
2978e27ec22SSatish Balay void PETSC_STDCALL snesgetconvergencehistory_(SNES *snes,PetscInt *na,PetscErrorCode *ierr)
2988e27ec22SSatish Balay {
2998e27ec22SSatish Balay   *ierr = SNESGetConvergenceHistory(*snes,PETSC_NULL,PETSC_NULL,na);
3008e27ec22SSatish Balay }
3018e27ec22SSatish Balay 
3028e27ec22SSatish Balay void PETSC_STDCALL snessettype_(SNES *snes,CHAR type PETSC_MIXED_LEN(len),
3038e27ec22SSatish Balay                                 PetscErrorCode *ierr PETSC_END_LEN(len))
3048e27ec22SSatish Balay {
3058e27ec22SSatish Balay   char *t;
3068e27ec22SSatish Balay 
3078e27ec22SSatish Balay   FIXCHAR(type,len,t);
3088e27ec22SSatish Balay   *ierr = SNESSetType(*snes,t);
3098e27ec22SSatish Balay   FREECHAR(type,t);
3108e27ec22SSatish Balay }
3118e27ec22SSatish Balay 
3128e27ec22SSatish Balay void PETSC_STDCALL snesappendoptionsprefix_(SNES *snes,CHAR prefix PETSC_MIXED_LEN(len),
3138e27ec22SSatish Balay                                             PetscErrorCode *ierr PETSC_END_LEN(len))
3148e27ec22SSatish Balay {
3158e27ec22SSatish Balay   char *t;
3168e27ec22SSatish Balay 
3178e27ec22SSatish Balay   FIXCHAR(prefix,len,t);
3188e27ec22SSatish Balay   *ierr = SNESAppendOptionsPrefix(*snes,t);
3198e27ec22SSatish Balay   FREECHAR(prefix,t);
3208e27ec22SSatish Balay }
3218e27ec22SSatish Balay 
3228e27ec22SSatish Balay void PETSC_STDCALL snessetoptionsprefix_(SNES *snes,CHAR prefix PETSC_MIXED_LEN(len),
3238e27ec22SSatish Balay                                         PetscErrorCode *ierr PETSC_END_LEN(len))
3248e27ec22SSatish Balay {
3258e27ec22SSatish Balay   char *t;
3268e27ec22SSatish Balay 
3278e27ec22SSatish Balay   FIXCHAR(prefix,len,t);
3288e27ec22SSatish Balay   *ierr = SNESSetOptionsPrefix(*snes,t);
3298e27ec22SSatish Balay   FREECHAR(prefix,t);
3308e27ec22SSatish Balay }
3318e27ec22SSatish Balay 
3328e27ec22SSatish Balay /*----------------------------------------------------------------------*/
3338e27ec22SSatish Balay /* functions, hence no STDCALL */
3348e27ec22SSatish Balay 
335a6570f20SBarry Smith void snesmonitorlg_(SNES *snes,PetscInt *its,PetscReal *fgnorm,void *dummy,PetscErrorCode *ierr)
3368e27ec22SSatish Balay {
337a6570f20SBarry Smith   *ierr = SNESMonitorLG(*snes,*its,*fgnorm,dummy);
3388e27ec22SSatish Balay }
3398e27ec22SSatish Balay 
340a6570f20SBarry Smith void snesmonitordefault_(SNES *snes,PetscInt *its,PetscReal *fgnorm,void *dummy,PetscErrorCode *ierr)
3418e27ec22SSatish Balay {
342a6570f20SBarry Smith   *ierr = SNESMonitorDefault(*snes,*its,*fgnorm,dummy);
3438e27ec22SSatish Balay }
3448e27ec22SSatish Balay 
345a6570f20SBarry Smith void snesmonitorsolution_(SNES *snes,PetscInt *its,PetscReal *fgnorm,void *dummy,PetscErrorCode *ierr)
3468e27ec22SSatish Balay {
347a6570f20SBarry Smith   *ierr = SNESMonitorSolution(*snes,*its,*fgnorm,dummy);
3488e27ec22SSatish Balay }
3498e27ec22SSatish Balay 
350a6570f20SBarry Smith void snesmonitorsolutionupdate_(SNES *snes,PetscInt *its,PetscReal *fgnorm,void *dummy,PetscErrorCode *ierr)
3518e27ec22SSatish Balay {
352a6570f20SBarry Smith   *ierr = SNESMonitorSolutionUpdate(*snes,*its,*fgnorm,dummy);
3538e27ec22SSatish Balay }
3548e27ec22SSatish Balay 
3558e27ec22SSatish Balay 
356a6570f20SBarry Smith void PETSC_STDCALL snesmonitorset_(SNES *snes,void (PETSC_STDCALL *func)(SNES*,PetscInt*,PetscReal*,void*,PetscErrorCode*),
3578e27ec22SSatish Balay                     void *mctx,void (PETSC_STDCALL *mondestroy)(void*,PetscErrorCode*),PetscErrorCode *ierr)
3588e27ec22SSatish Balay {
3598e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(mctx);
360a6570f20SBarry Smith   if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitordefault_) {
361a6570f20SBarry Smith     *ierr = SNESMonitorSet(*snes,SNESMonitorDefault,0,0);
362a6570f20SBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorsolution_) {
363a6570f20SBarry Smith     *ierr = SNESMonitorSet(*snes,SNESMonitorSolution,0,0);
364a6570f20SBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorsolutionupdate_) {
365a6570f20SBarry Smith     *ierr = SNESMonitorSet(*snes,SNESMonitorSolutionUpdate,0,0);
366a6570f20SBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorlg_) {
367a6570f20SBarry Smith     *ierr = SNESMonitorSet(*snes,SNESMonitorLG,0,0);
3688e27ec22SSatish Balay   } else {
3698e27ec22SSatish Balay     f7 = func;
3708e27ec22SSatish Balay     if (FORTRANNULLFUNCTION(mondestroy)){
371a6570f20SBarry Smith       *ierr = SNESMonitorSet(*snes,oursnesmonitor,mctx,0);
3728e27ec22SSatish Balay     } else {
3738e27ec22SSatish Balay       f71 = mondestroy;
374a6570f20SBarry Smith       *ierr = SNESMonitorSet(*snes,oursnesmonitor,mctx,ourmondestroy);
3758e27ec22SSatish Balay     }
3768e27ec22SSatish Balay   }
3778e27ec22SSatish Balay }
3788e27ec22SSatish Balay 
3798e27ec22SSatish Balay 
3808e27ec22SSatish Balay 
3818e27ec22SSatish Balay EXTERN_C_END
382