xref: /petsc/src/snes/interface/ftn-custom/zsnesf.c (revision 06ee9f85ecda6adaae627a28ca41c24bdb6deb84)
18e27ec22SSatish Balay #include "zpetsc.h"
28e27ec22SSatish Balay #include "petscsnes.h"
38e27ec22SSatish Balay 
48e27ec22SSatish Balay #ifdef PETSC_HAVE_FORTRAN_UNDERSCORE_UNDERSCORE
58e27ec22SSatish Balay #define snesconverged_tr_                snesconverged_tr__
68e27ec22SSatish Balay #define snesconverged_ls_                snesconverged_ls__
78e27ec22SSatish Balay #endif
88e27ec22SSatish Balay 
98e27ec22SSatish Balay #if defined(PETSC_HAVE_FORTRAN_CAPS)
106ce558aeSBarry Smith #define snessolve_                       SNESSOLVE
118e27ec22SSatish Balay #define snesdefaultcomputejacobian_      SNESDEFAULTCOMPUTEJACOBIAN
128e27ec22SSatish Balay #define snesdefaultcomputejacobiancolor_ SNESDEFAULTCOMPUTEJACOBIANCOLOR
138e27ec22SSatish Balay #define snesdacomputejacobian_           SNESDACOMPUTEJACOBIAN
148e27ec22SSatish Balay #define snesdacomputejacobianwithadifor_ SNESDACOMPUTEJACOBIANWITHADIFOR
158e27ec22SSatish Balay #define snessetjacobian_                 SNESSETJACOBIAN
168e27ec22SSatish Balay #define snesgetoptionsprefix_            SNESGETOPTIONSPREFIX
178e27ec22SSatish Balay #define snesgettype_                     SNESGETTYPE
188e27ec22SSatish Balay #define snesdaformfunction_              SNESDAFORMFUNCTION
198e27ec22SSatish Balay #define snessetfunction_                 SNESSETFUNCTION
208e27ec22SSatish Balay #define snesgetfunction_                 SNESGETFUNCTION
218e27ec22SSatish Balay #define snessetconvergencetest_          SNESSETCONVERGENCETEST
228e27ec22SSatish Balay #define snesconverged_tr_                SNESCONVERGED_TR
238e27ec22SSatish Balay #define snesconverged_ls_                SNESCONVERGED_LS
248e27ec22SSatish Balay #define snesview_                        SNESVIEW
258e27ec22SSatish Balay #define snesgetconvergencehistory_       SNESGETCONVERGENCEHISTORY
268e27ec22SSatish Balay #define snesgetjacobian_                 SNESGETJACOBIAN
278e27ec22SSatish Balay #define snessettype_                     SNESSETTYPE
288e27ec22SSatish Balay #define snesappendoptionsprefix_         SNESAPPENDOPTIONSPREFIX
298e27ec22SSatish Balay #define snessetoptionsprefix_            SNESSETOPTIONSPREFIX
308e27ec22SSatish Balay #define snesdefaultmonitor_              SNESDEFAULTMONITOR
318e27ec22SSatish Balay #define snesvecviewmonitor_              SNESVECVIEWMONITOR
328e27ec22SSatish Balay #define sneslgmonitor_                   SNESLGMONITOR
338e27ec22SSatish Balay #define snesvecviewupdatemonitor_        SNESVECVIEWUPDATEMONITOR
348e27ec22SSatish Balay #define snessetmonitor_                  SNESSETMONITOR
358e27ec22SSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
366ce558aeSBarry Smith #define snessolve_                       snessolve
378e27ec22SSatish Balay #define snesdefaultcomputejacobian_      snesdefaultcomputejacobian
388e27ec22SSatish Balay #define snesdefaultcomputejacobiancolor_ snesdefaultcomputejacobiancolor
398e27ec22SSatish Balay #define snesdacomputejacobian_           snesdacomputejacobian
408e27ec22SSatish Balay #define snesdacomputejacobianwithadifor_ snesdacomputejacobianwithadifor
418e27ec22SSatish Balay #define snessetjacobian_                 snessetjacobian
428e27ec22SSatish Balay #define snesgetoptionsprefix_            snesgetoptionsprefix
438e27ec22SSatish Balay #define snesgettype_                     snesgettype
448e27ec22SSatish Balay #define snesdaformfunction_              snesdaformfunction
458e27ec22SSatish Balay #define snessetfunction_                 snessetfunction
468e27ec22SSatish Balay #define snesgetfunction_                 snesgetfunction
478e27ec22SSatish Balay #define snessetconvergencetest_          snessetconvergencetest
488e27ec22SSatish Balay #define snesconverged_tr_                snesconverged_tr
498e27ec22SSatish Balay #define snesconverged_ls_                snesconverged_ls
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
568e27ec22SSatish Balay #define sneslgmonitor_                   sneslgmonitor
578e27ec22SSatish Balay #define snesdefaultmonitor_              snesdefaultmonitor
588e27ec22SSatish Balay #define snesvecviewmonitor_              snesvecviewmonitor
598e27ec22SSatish Balay #define snesvecviewupdatemonitor_        snesvecviewupdatemonitor
608e27ec22SSatish Balay #define snessetmonitor_                  snessetmonitor
618e27ec22SSatish Balay #endif
628e27ec22SSatish Balay 
638e27ec22SSatish Balay EXTERN_C_BEGIN
648e27ec22SSatish Balay static void (PETSC_STDCALL *f3)(SNES*,Vec*,Mat*,Mat*,MatStructure*,void*,PetscErrorCode*);
658e27ec22SSatish Balay static void (PETSC_STDCALL *f2)(SNES*,Vec*,Vec*,void*,PetscErrorCode*);
66*06ee9f85SBarry Smith static void (PETSC_STDCALL *f8)(SNES*,PetscInt *,PetscReal*,PetscReal*,PetscReal*,SNESConvergedReason*,void*,PetscErrorCode*);
678e27ec22SSatish Balay static void (PETSC_STDCALL *f7)(SNES*,PetscInt*,PetscReal*,void*,PetscErrorCode*);
688e27ec22SSatish Balay static void (PETSC_STDCALL *f71)(void*,PetscErrorCode*);
698e27ec22SSatish Balay EXTERN_C_END
708e27ec22SSatish Balay 
718e27ec22SSatish Balay static PetscErrorCode oursnesfunction(SNES snes,Vec x,Vec f,void *ctx)
728e27ec22SSatish Balay {
738e27ec22SSatish Balay   PetscErrorCode ierr = 0;
748e27ec22SSatish Balay   (*f2)(&snes,&x,&f,ctx,&ierr);CHKERRQ(ierr);
758e27ec22SSatish Balay   return 0;
768e27ec22SSatish Balay }
77*06ee9f85SBarry Smith static PetscErrorCode oursnestest(SNES snes,PetscInt it,PetscReal a,PetscReal d,PetscReal c,SNESConvergedReason*reason,void*ctx)
788e27ec22SSatish Balay {
798e27ec22SSatish Balay   PetscErrorCode ierr = 0;
808e27ec22SSatish Balay 
81*06ee9f85SBarry Smith   (*f8)(&snes,&it,&a,&d,&c,reason,ctx,&ierr);CHKERRQ(ierr);
828e27ec22SSatish Balay   return 0;
838e27ec22SSatish Balay }
848e27ec22SSatish Balay 
858e27ec22SSatish Balay static PetscErrorCode oursnesjacobian(SNES snes,Vec x,Mat* m,Mat* p,MatStructure* type,void*ctx)
868e27ec22SSatish Balay {
878e27ec22SSatish Balay   PetscErrorCode ierr = 0;
888e27ec22SSatish Balay   (*f3)(&snes,&x,m,p,type,ctx,&ierr);CHKERRQ(ierr);
898e27ec22SSatish Balay   return 0;
908e27ec22SSatish Balay }
918e27ec22SSatish Balay static PetscErrorCode oursnesmonitor(SNES snes,PetscInt i,PetscReal d,void*ctx)
928e27ec22SSatish Balay {
938e27ec22SSatish Balay   PetscErrorCode ierr = 0;
948e27ec22SSatish Balay 
958e27ec22SSatish Balay   (*f7)(&snes,&i,&d,ctx,&ierr);CHKERRQ(ierr);
968e27ec22SSatish Balay   return 0;
978e27ec22SSatish Balay }
988e27ec22SSatish Balay static PetscErrorCode ourmondestroy(void* ctx)
998e27ec22SSatish Balay {
1008e27ec22SSatish Balay   PetscErrorCode ierr = 0;
1018e27ec22SSatish Balay 
1028e27ec22SSatish Balay   (*f71)(ctx,&ierr);CHKERRQ(ierr);
1038e27ec22SSatish Balay   return 0;
1048e27ec22SSatish Balay }
1058e27ec22SSatish Balay 
1068e27ec22SSatish Balay EXTERN_C_BEGIN
1078e27ec22SSatish Balay /* ---------------------------------------------------------*/
1088e27ec22SSatish Balay /*
1098e27ec22SSatish Balay      snesdefaultcomputejacobian() and snesdefaultcomputejacobiancolor()
1108e27ec22SSatish Balay   These can be used directly from Fortran but are mostly so that
1118e27ec22SSatish Balay   Fortran SNESSetJacobian() will properly handle the defaults being passed in.
1128e27ec22SSatish Balay 
1138e27ec22SSatish Balay   functions, hence no STDCALL
1148e27ec22SSatish Balay */
1158e27ec22SSatish Balay void snesdefaultcomputejacobian_(SNES *snes,Vec *x,Mat *m,Mat *p,MatStructure* type,void *ctx,PetscErrorCode *ierr)
1168e27ec22SSatish Balay {
1178e27ec22SSatish Balay   *ierr = SNESDefaultComputeJacobian(*snes,*x,m,p,type,ctx);
1188e27ec22SSatish Balay }
1198e27ec22SSatish Balay void  snesdefaultcomputejacobiancolor_(SNES *snes,Vec *x,Mat *m,Mat *p,MatStructure* type,void *ctx,PetscErrorCode *ierr)
1208e27ec22SSatish Balay {
1218e27ec22SSatish Balay   *ierr = SNESDefaultComputeJacobianColor(*snes,*x,m,p,type,*(MatFDColoring*)ctx);
1228e27ec22SSatish Balay }
1238e27ec22SSatish Balay 
1248e27ec22SSatish Balay void  snesdacomputejacobianwithadifor_(SNES *snes,Vec *X,Mat *m,Mat *p,MatStructure* type,void *ctx,PetscErrorCode *ierr)
1258e27ec22SSatish Balay {
1268e27ec22SSatish Balay   (*PetscErrorPrintf)("Cannot call this function from Fortran");
1278e27ec22SSatish Balay   *ierr = 1;
1288e27ec22SSatish Balay }
1298e27ec22SSatish Balay 
1308e27ec22SSatish Balay void  snesdacomputejacobian_(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 PETSC_STDCALL snessetjacobian_(SNES *snes,Mat *A,Mat *B,void (PETSC_STDCALL *func)(SNES*,Vec*,Mat*,Mat*,
1378e27ec22SSatish Balay             MatStructure*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr)
1388e27ec22SSatish Balay {
1398e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(ctx);
140f68b968cSBarry Smith   if ((PetscVoidFunction)func == (PetscVoidFunction)snesdefaultcomputejacobian_) {
1418e27ec22SSatish Balay     *ierr = SNESSetJacobian(*snes,*A,*B,SNESDefaultComputeJacobian,ctx);
142f68b968cSBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesdefaultcomputejacobiancolor_) {
1438e27ec22SSatish Balay     *ierr = SNESSetJacobian(*snes,*A,*B,SNESDefaultComputeJacobianColor,*(MatFDColoring*)ctx);
144f68b968cSBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesdacomputejacobianwithadifor_) {
1458e27ec22SSatish Balay     *ierr = SNESSetJacobian(*snes,*A,*B,SNESDAComputeJacobianWithAdifor,ctx);
146f68b968cSBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesdacomputejacobian_) {
1478e27ec22SSatish Balay     *ierr = SNESSetJacobian(*snes,*A,*B,SNESDAComputeJacobian,ctx);
1488e27ec22SSatish Balay   } else {
1498e27ec22SSatish Balay     f3 = func;
1508e27ec22SSatish Balay     *ierr = SNESSetJacobian(*snes,*A,*B,oursnesjacobian,ctx);
1518e27ec22SSatish Balay   }
1528e27ec22SSatish Balay }
1538e27ec22SSatish Balay /* -------------------------------------------------------------*/
1548e27ec22SSatish Balay 
1556ce558aeSBarry Smith void PETSC_STDCALL   snessolve_(SNES *snes,Vec *b,Vec *x, int *__ierr )
1566ce558aeSBarry Smith {
1576ce558aeSBarry Smith   Vec B = *b;
1586ce558aeSBarry Smith   if (*b == PETSC_NULL_OBJECT_Fortran) B = PETSC_NULL;
1596ce558aeSBarry Smith   *__ierr = SNESSolve(*snes,B,*x);
1606ce558aeSBarry Smith }
1616ce558aeSBarry Smith 
1628e27ec22SSatish Balay void PETSC_STDCALL snesgetoptionsprefix_(SNES *snes,CHAR prefix PETSC_MIXED_LEN(len),
1638e27ec22SSatish Balay                                          PetscErrorCode *ierr PETSC_END_LEN(len))
1648e27ec22SSatish Balay {
1658e27ec22SSatish Balay   const char *tname;
1668e27ec22SSatish Balay 
1678e27ec22SSatish Balay   *ierr = SNESGetOptionsPrefix(*snes,&tname);
1688e27ec22SSatish Balay #if defined(PETSC_USES_CPTOFCD)
1698e27ec22SSatish Balay   {
1708e27ec22SSatish Balay     char *t = _fcdtocp(prefix); int len1 = _fcdlen(prefix);
1718e27ec22SSatish Balay     *ierr = PetscStrncpy(t,tname,len1);if (*ierr) return;
1728e27ec22SSatish Balay   }
1738e27ec22SSatish Balay #else
1748e27ec22SSatish Balay   *ierr = PetscStrncpy(prefix,tname,len);if (*ierr) return;
1758e27ec22SSatish Balay #endif
1768e27ec22SSatish Balay }
1778e27ec22SSatish Balay 
1788e27ec22SSatish Balay void PETSC_STDCALL snesgettype_(SNES *snes,CHAR name PETSC_MIXED_LEN(len),
1798e27ec22SSatish Balay                                 PetscErrorCode *ierr PETSC_END_LEN(len))
1808e27ec22SSatish Balay {
1818e27ec22SSatish Balay   const char *tname;
1828e27ec22SSatish Balay 
1838e27ec22SSatish Balay   *ierr = SNESGetType(*snes,&tname);
1848e27ec22SSatish Balay #if defined(PETSC_USES_CPTOFCD)
1858e27ec22SSatish Balay   {
1868e27ec22SSatish Balay     char *t = _fcdtocp(name); int len1 = _fcdlen(name);
1878e27ec22SSatish Balay     *ierr = PetscStrncpy(t,tname,len1);if (*ierr) return;
1888e27ec22SSatish Balay   }
1898e27ec22SSatish Balay #else
1908e27ec22SSatish Balay   *ierr = PetscStrncpy(name,tname,len);if (*ierr) return;
1918e27ec22SSatish Balay #endif
1928e27ec22SSatish Balay   FIXRETURNCHAR(name,len);
1938e27ec22SSatish Balay }
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 void  snesdaformfunction_(SNES *snes,Vec *X, Vec *F,void *ptr,PetscErrorCode *ierr)
2038e27ec22SSatish Balay {
2048e27ec22SSatish Balay   *ierr = SNESDAFormFunction(*snes,*X,*F,ptr);
2058e27ec22SSatish Balay }
2068e27ec22SSatish Balay 
2078e27ec22SSatish Balay void PETSC_STDCALL snessetfunction_(SNES *snes,Vec *r,void (PETSC_STDCALL *func)(SNES*,Vec*,Vec*,void*,PetscErrorCode*),
2088e27ec22SSatish Balay                       void *ctx,PetscErrorCode *ierr)
2098e27ec22SSatish Balay {
2108e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(ctx);
2118e27ec22SSatish Balay   f2 = func;
212f68b968cSBarry Smith   if ((PetscVoidFunction)func == (PetscVoidFunction)snesdaformfunction_) {
2138e27ec22SSatish Balay     *ierr = SNESSetFunction(*snes,*r,SNESDAFormFunction,ctx);
2148e27ec22SSatish Balay   } else {
2158e27ec22SSatish Balay     *ierr = SNESSetFunction(*snes,*r,oursnesfunction,ctx);
2168e27ec22SSatish Balay   }
2178e27ec22SSatish Balay }
2188e27ec22SSatish Balay /* ---------------------------------------------------------*/
2198e27ec22SSatish Balay 
2208e27ec22SSatish Balay /* the func argument is ignored */
2218e27ec22SSatish Balay void PETSC_STDCALL snesgetfunction_(SNES *snes,Vec *r,void *func,void **ctx,PetscErrorCode *ierr)
2228e27ec22SSatish Balay {
2238e27ec22SSatish Balay   CHKFORTRANNULLINTEGER(ctx);
2248e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(r);
2258e27ec22SSatish Balay   *ierr = SNESGetFunction(*snes,r,PETSC_NULL,ctx);
2268e27ec22SSatish Balay }
2278e27ec22SSatish Balay /*----------------------------------------------------------------------*/
2288e27ec22SSatish Balay 
229*06ee9f85SBarry Smith void snesconverged_tr_(SNES *snes,PetscInt *it,PetscReal *a,PetscReal *b,PetscReal *c,SNESConvergedReason *r,
2308e27ec22SSatish Balay                                        void *ct,PetscErrorCode *ierr)
2318e27ec22SSatish Balay {
232*06ee9f85SBarry Smith   *ierr = SNESConverged_TR(*snes,*it,*a,*b,*c,r,ct);
2338e27ec22SSatish Balay }
2348e27ec22SSatish Balay 
235*06ee9f85SBarry Smith void snesconverged_ls_(SNES *snes,PetscInt *it, PetscReal *a,PetscReal *b,PetscReal *c,SNESConvergedReason *r,
2368e27ec22SSatish Balay                                        void *ct,PetscErrorCode *ierr)
2378e27ec22SSatish Balay {
238*06ee9f85SBarry Smith   *ierr = SNESConverged_LS(*snes,*it,*a,*b,*c,r,ct);
2398e27ec22SSatish Balay }
2408e27ec22SSatish Balay 
2418e27ec22SSatish Balay 
2428e27ec22SSatish Balay void PETSC_STDCALL snessetconvergencetest_(SNES *snes,
243*06ee9f85SBarry Smith        void (PETSC_STDCALL *func)(SNES*,PetscInt*,PetscReal*,PetscReal*,PetscReal*,SNESConvergedReason*,void*,PetscErrorCode*),
2448e27ec22SSatish Balay        void *cctx,PetscErrorCode *ierr)
2458e27ec22SSatish Balay {
2468e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(cctx);
247f68b968cSBarry Smith   if ((PetscVoidFunction)func == (PetscVoidFunction)snesconverged_ls_){
2488e27ec22SSatish Balay     *ierr = SNESSetConvergenceTest(*snes,SNESConverged_LS,0);
249f68b968cSBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesconverged_tr_){
2508e27ec22SSatish Balay     *ierr = SNESSetConvergenceTest(*snes,SNESConverged_TR,0);
2518e27ec22SSatish Balay   } else {
2528e27ec22SSatish Balay     f8 = func;
2538e27ec22SSatish Balay     *ierr = SNESSetConvergenceTest(*snes,oursnestest,cctx);
2548e27ec22SSatish Balay   }
2558e27ec22SSatish Balay }
2568e27ec22SSatish Balay /*----------------------------------------------------------------------*/
2578e27ec22SSatish Balay 
2588e27ec22SSatish Balay void PETSC_STDCALL snesview_(SNES *snes,PetscViewer *viewer, PetscErrorCode *ierr)
2598e27ec22SSatish Balay {
2608e27ec22SSatish Balay   PetscViewer v;
2618e27ec22SSatish Balay   PetscPatchDefaultViewers_Fortran(viewer,v);
2628e27ec22SSatish Balay   *ierr = SNESView(*snes,v);
2638e27ec22SSatish Balay }
2648e27ec22SSatish Balay 
2658e27ec22SSatish Balay /*  func is currently ignored from Fortran */
2668e27ec22SSatish Balay void PETSC_STDCALL snesgetjacobian_(SNES *snes,Mat *A,Mat *B,int *func,void **ctx,PetscErrorCode *ierr)
2678e27ec22SSatish Balay {
2688e27ec22SSatish Balay   CHKFORTRANNULLINTEGER(ctx);
2698e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(A);
2708e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(B);
2718e27ec22SSatish Balay   *ierr = SNESGetJacobian(*snes,A,B,0,ctx);
2728e27ec22SSatish Balay }
2738e27ec22SSatish Balay 
2748e27ec22SSatish Balay void PETSC_STDCALL snesgetconvergencehistory_(SNES *snes,PetscInt *na,PetscErrorCode *ierr)
2758e27ec22SSatish Balay {
2768e27ec22SSatish Balay   *ierr = SNESGetConvergenceHistory(*snes,PETSC_NULL,PETSC_NULL,na);
2778e27ec22SSatish Balay }
2788e27ec22SSatish Balay 
2798e27ec22SSatish Balay void PETSC_STDCALL snessettype_(SNES *snes,CHAR type PETSC_MIXED_LEN(len),
2808e27ec22SSatish Balay                                 PetscErrorCode *ierr PETSC_END_LEN(len))
2818e27ec22SSatish Balay {
2828e27ec22SSatish Balay   char *t;
2838e27ec22SSatish Balay 
2848e27ec22SSatish Balay   FIXCHAR(type,len,t);
2858e27ec22SSatish Balay   *ierr = SNESSetType(*snes,t);
2868e27ec22SSatish Balay   FREECHAR(type,t);
2878e27ec22SSatish Balay }
2888e27ec22SSatish Balay 
2898e27ec22SSatish Balay void PETSC_STDCALL snesappendoptionsprefix_(SNES *snes,CHAR prefix PETSC_MIXED_LEN(len),
2908e27ec22SSatish Balay                                             PetscErrorCode *ierr PETSC_END_LEN(len))
2918e27ec22SSatish Balay {
2928e27ec22SSatish Balay   char *t;
2938e27ec22SSatish Balay 
2948e27ec22SSatish Balay   FIXCHAR(prefix,len,t);
2958e27ec22SSatish Balay   *ierr = SNESAppendOptionsPrefix(*snes,t);
2968e27ec22SSatish Balay   FREECHAR(prefix,t);
2978e27ec22SSatish Balay }
2988e27ec22SSatish Balay 
2998e27ec22SSatish Balay void PETSC_STDCALL snessetoptionsprefix_(SNES *snes,CHAR prefix PETSC_MIXED_LEN(len),
3008e27ec22SSatish Balay                                         PetscErrorCode *ierr PETSC_END_LEN(len))
3018e27ec22SSatish Balay {
3028e27ec22SSatish Balay   char *t;
3038e27ec22SSatish Balay 
3048e27ec22SSatish Balay   FIXCHAR(prefix,len,t);
3058e27ec22SSatish Balay   *ierr = SNESSetOptionsPrefix(*snes,t);
3068e27ec22SSatish Balay   FREECHAR(prefix,t);
3078e27ec22SSatish Balay }
3088e27ec22SSatish Balay 
3098e27ec22SSatish Balay /*----------------------------------------------------------------------*/
3108e27ec22SSatish Balay /* functions, hence no STDCALL */
3118e27ec22SSatish Balay 
3128e27ec22SSatish Balay void sneslgmonitor_(SNES *snes,PetscInt *its,PetscReal *fgnorm,void *dummy,PetscErrorCode *ierr)
3138e27ec22SSatish Balay {
3148e27ec22SSatish Balay   *ierr = SNESLGMonitor(*snes,*its,*fgnorm,dummy);
3158e27ec22SSatish Balay }
3168e27ec22SSatish Balay 
3178e27ec22SSatish Balay void snesdefaultmonitor_(SNES *snes,PetscInt *its,PetscReal *fgnorm,void *dummy,PetscErrorCode *ierr)
3188e27ec22SSatish Balay {
3198e27ec22SSatish Balay   *ierr = SNESDefaultMonitor(*snes,*its,*fgnorm,dummy);
3208e27ec22SSatish Balay }
3218e27ec22SSatish Balay 
3228e27ec22SSatish Balay void snesvecviewmonitor_(SNES *snes,PetscInt *its,PetscReal *fgnorm,void *dummy,PetscErrorCode *ierr)
3238e27ec22SSatish Balay {
3248e27ec22SSatish Balay   *ierr = SNESVecViewMonitor(*snes,*its,*fgnorm,dummy);
3258e27ec22SSatish Balay }
3268e27ec22SSatish Balay 
3278e27ec22SSatish Balay void snesvecviewupdatemonitor_(SNES *snes,PetscInt *its,PetscReal *fgnorm,void *dummy,PetscErrorCode *ierr)
3288e27ec22SSatish Balay {
3298e27ec22SSatish Balay   *ierr = SNESVecViewUpdateMonitor(*snes,*its,*fgnorm,dummy);
3308e27ec22SSatish Balay }
3318e27ec22SSatish Balay 
3328e27ec22SSatish Balay 
3338e27ec22SSatish Balay void PETSC_STDCALL snessetmonitor_(SNES *snes,void (PETSC_STDCALL *func)(SNES*,PetscInt*,PetscReal*,void*,PetscErrorCode*),
3348e27ec22SSatish Balay                     void *mctx,void (PETSC_STDCALL *mondestroy)(void*,PetscErrorCode*),PetscErrorCode *ierr)
3358e27ec22SSatish Balay {
3368e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(mctx);
337f68b968cSBarry Smith   if ((PetscVoidFunction)func == (PetscVoidFunction)snesdefaultmonitor_) {
3388e27ec22SSatish Balay     *ierr = SNESSetMonitor(*snes,SNESDefaultMonitor,0,0);
339f68b968cSBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesvecviewmonitor_) {
3408e27ec22SSatish Balay     *ierr = SNESSetMonitor(*snes,SNESVecViewMonitor,0,0);
341f68b968cSBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesvecviewupdatemonitor_) {
3428e27ec22SSatish Balay     *ierr = SNESSetMonitor(*snes,SNESVecViewUpdateMonitor,0,0);
343f68b968cSBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)sneslgmonitor_) {
3448e27ec22SSatish Balay     *ierr = SNESSetMonitor(*snes,SNESLGMonitor,0,0);
3458e27ec22SSatish Balay   } else {
3468e27ec22SSatish Balay     f7 = func;
3478e27ec22SSatish Balay     if (FORTRANNULLFUNCTION(mondestroy)){
3488e27ec22SSatish Balay       *ierr = SNESSetMonitor(*snes,oursnesmonitor,mctx,0);
3498e27ec22SSatish Balay     } else {
3508e27ec22SSatish Balay       f71 = mondestroy;
3518e27ec22SSatish Balay       *ierr = SNESSetMonitor(*snes,oursnesmonitor,mctx,ourmondestroy);
3528e27ec22SSatish Balay     }
3538e27ec22SSatish Balay   }
3548e27ec22SSatish Balay }
3558e27ec22SSatish Balay 
3568e27ec22SSatish Balay 
3578e27ec22SSatish Balay 
3588e27ec22SSatish Balay EXTERN_C_END
359