xref: /petsc/src/snes/interface/ftn-custom/zsnesf.c (revision 2613ca53524330f2dbe24f57e29dccb9aa56dab3)
1ce0a2cd1SBarry Smith #include "private/fortranimpl.h"
28e27ec22SSatish Balay #include "petscsnes.h"
38e27ec22SSatish Balay 
48e27ec22SSatish Balay #if defined(PETSC_HAVE_FORTRAN_CAPS)
56ce558aeSBarry Smith #define snessolve_                       SNESSOLVE
68e27ec22SSatish Balay #define snesdefaultcomputejacobian_      SNESDEFAULTCOMPUTEJACOBIAN
78e27ec22SSatish Balay #define snesdefaultcomputejacobiancolor_ SNESDEFAULTCOMPUTEJACOBIANCOLOR
88e27ec22SSatish Balay #define snesdacomputejacobian_           SNESDACOMPUTEJACOBIAN
98e27ec22SSatish Balay #define snesdacomputejacobianwithadifor_ SNESDACOMPUTEJACOBIANWITHADIFOR
108e27ec22SSatish Balay #define snessetjacobian_                 SNESSETJACOBIAN
118e27ec22SSatish Balay #define snesgetoptionsprefix_            SNESGETOPTIONSPREFIX
128e27ec22SSatish Balay #define snesgettype_                     SNESGETTYPE
138e27ec22SSatish Balay #define snesdaformfunction_              SNESDAFORMFUNCTION
148e27ec22SSatish Balay #define snessetfunction_                 SNESSETFUNCTION
158e27ec22SSatish Balay #define snesgetfunction_                 SNESGETFUNCTION
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
27a6570f20SBarry Smith #define snesmonitorlg_                   SNESMONITORLG
28a6570f20SBarry Smith #define snesmonitorsolutionupdate_       SNESMONITORSOLUTIONUPDATE
29a6570f20SBarry Smith #define snesmonitorset_                  SNESMONITORSET
30e3da1266SHong Zhang #define snesgetapplicationcontext_       SNESGETAPPLICATIONCONTEXT
318e27ec22SSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
326ce558aeSBarry Smith #define snessolve_                       snessolve
338e27ec22SSatish Balay #define snesdefaultcomputejacobian_      snesdefaultcomputejacobian
348e27ec22SSatish Balay #define snesdefaultcomputejacobiancolor_ snesdefaultcomputejacobiancolor
358e27ec22SSatish Balay #define snesdacomputejacobian_           snesdacomputejacobian
368e27ec22SSatish Balay #define snesdacomputejacobianwithadifor_ snesdacomputejacobianwithadifor
378e27ec22SSatish Balay #define snessetjacobian_                 snessetjacobian
388e27ec22SSatish Balay #define snesgetoptionsprefix_            snesgetoptionsprefix
398e27ec22SSatish Balay #define snesgettype_                     snesgettype
408e27ec22SSatish Balay #define snesdaformfunction_              snesdaformfunction
418e27ec22SSatish Balay #define snessetfunction_                 snessetfunction
428e27ec22SSatish Balay #define snesgetfunction_                 snesgetfunction
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
52a6570f20SBarry Smith #define snesmonitorlg_                   snesmonitorlg
53a6570f20SBarry Smith #define snesmonitordefault_              snesmonitordefault
54a6570f20SBarry Smith #define snesmonitorsolution_             snesmonitorsolution
55a6570f20SBarry Smith #define snesmonitorsolutionupdate_       snesmonitorsolutionupdate
56a6570f20SBarry Smith #define snesmonitorset_                  snesmonitorset
57e3da1266SHong Zhang #define snesgetapplicationcontext_       snesgetapplicationcontext
588e27ec22SSatish Balay #endif
598e27ec22SSatish Balay 
608e27ec22SSatish Balay static PetscErrorCode oursnesfunction(SNES snes,Vec x,Vec f,void *ctx)
618e27ec22SSatish Balay {
628e27ec22SSatish Balay   PetscErrorCode ierr = 0;
63b8ebb45fSBarry Smith   (*(void (PETSC_STDCALL *)(SNES*,Vec*,Vec*,void*,PetscErrorCode*))(((PetscObject)snes)->fortran_func_pointers[0]))(&snes,&x,&f,ctx,&ierr);CHKERRQ(ierr);
648e27ec22SSatish Balay   return 0;
658e27ec22SSatish Balay }
66b8ebb45fSBarry Smith 
6706ee9f85SBarry Smith static PetscErrorCode oursnestest(SNES snes,PetscInt it,PetscReal a,PetscReal d,PetscReal c,SNESConvergedReason*reason,void*ctx)
688e27ec22SSatish Balay {
698e27ec22SSatish Balay   PetscErrorCode ierr = 0;
70b8ebb45fSBarry Smith   (*(void (PETSC_STDCALL *)(SNES*,PetscInt*,PetscReal*,PetscReal*,PetscReal*,SNESConvergedReason*,void*,PetscErrorCode*))(((PetscObject)snes)->fortran_func_pointers[1]))(&snes,&it,&a,&d,&c,reason,ctx,&ierr);CHKERRQ(ierr);
718e27ec22SSatish Balay   return 0;
728e27ec22SSatish Balay }
738e27ec22SSatish Balay 
748e27ec22SSatish Balay static PetscErrorCode oursnesjacobian(SNES snes,Vec x,Mat* m,Mat* p,MatStructure* type,void*ctx)
758e27ec22SSatish Balay {
768e27ec22SSatish Balay   PetscErrorCode ierr = 0;
77b8ebb45fSBarry Smith   (*(void (PETSC_STDCALL *)(SNES*,Vec*,Mat*,Mat*,MatStructure*,void*,PetscErrorCode*))(((PetscObject)snes)->fortran_func_pointers[2]))(&snes,&x,m,p,type,ctx,&ierr);CHKERRQ(ierr);
788e27ec22SSatish Balay   return 0;
798e27ec22SSatish Balay }
808e27ec22SSatish Balay static PetscErrorCode oursnesmonitor(SNES snes,PetscInt i,PetscReal d,void*ctx)
818e27ec22SSatish Balay {
828e27ec22SSatish Balay   PetscErrorCode ierr = 0;
838e27ec22SSatish Balay 
84b8ebb45fSBarry Smith   void           (*mctx)(void) = ((PetscObject)snes)->fortran_func_pointers[4];
85f5c0949bSMatthew Knepley   (*(void (PETSC_STDCALL *)(SNES*,PetscInt*,PetscReal*,void*,PetscErrorCode*))(((PetscObject)snes)->fortran_func_pointers[3]))(&snes,&i,&d,(void*)mctx,&ierr);CHKERRQ(ierr);
868e27ec22SSatish Balay   return 0;
878e27ec22SSatish Balay }
888e27ec22SSatish Balay static PetscErrorCode ourmondestroy(void* ctx)
898e27ec22SSatish Balay {
908e27ec22SSatish Balay   PetscErrorCode ierr = 0;
91b8ebb45fSBarry Smith   SNES           snes = (SNES)ctx;
92b8ebb45fSBarry Smith   void           (*mctx)(void) = ((PetscObject)snes)->fortran_func_pointers[4];
93b8ebb45fSBarry Smith   (*(void (PETSC_STDCALL *)(PetscVoidFunction,PetscErrorCode*))(((PetscObject)snes)->fortran_func_pointers[5]))(mctx,&ierr);CHKERRQ(ierr);
948e27ec22SSatish Balay   return 0;
958e27ec22SSatish Balay }
968e27ec22SSatish Balay 
978e27ec22SSatish Balay EXTERN_C_BEGIN
988e27ec22SSatish Balay /* ---------------------------------------------------------*/
998e27ec22SSatish Balay /*
1008e27ec22SSatish Balay      snesdefaultcomputejacobian() and snesdefaultcomputejacobiancolor()
1018e27ec22SSatish Balay   These can be used directly from Fortran but are mostly so that
1028e27ec22SSatish Balay   Fortran SNESSetJacobian() will properly handle the defaults being passed in.
1038e27ec22SSatish Balay 
1048e27ec22SSatish Balay   functions, hence no STDCALL
1058e27ec22SSatish Balay */
1068e27ec22SSatish Balay void snesdefaultcomputejacobian_(SNES *snes,Vec *x,Mat *m,Mat *p,MatStructure* type,void *ctx,PetscErrorCode *ierr)
1078e27ec22SSatish Balay {
1088e27ec22SSatish Balay   *ierr = SNESDefaultComputeJacobian(*snes,*x,m,p,type,ctx);
1098e27ec22SSatish Balay }
1108e27ec22SSatish Balay void  snesdefaultcomputejacobiancolor_(SNES *snes,Vec *x,Mat *m,Mat *p,MatStructure* type,void *ctx,PetscErrorCode *ierr)
1118e27ec22SSatish Balay {
1128e27ec22SSatish Balay   *ierr = SNESDefaultComputeJacobianColor(*snes,*x,m,p,type,*(MatFDColoring*)ctx);
1138e27ec22SSatish Balay }
1148e27ec22SSatish Balay 
1158e27ec22SSatish Balay void  snesdacomputejacobianwithadifor_(SNES *snes,Vec *X,Mat *m,Mat *p,MatStructure* type,void *ctx,PetscErrorCode *ierr)
1168e27ec22SSatish Balay {
1178e27ec22SSatish Balay   (*PetscErrorPrintf)("Cannot call this function from Fortran");
1188e27ec22SSatish Balay   *ierr = 1;
1198e27ec22SSatish Balay }
1208e27ec22SSatish Balay 
1218e27ec22SSatish Balay void  snesdacomputejacobian_(SNES *snes,Vec *X,Mat *m,Mat *p,MatStructure* type,void *ctx,PetscErrorCode *ierr)
1228e27ec22SSatish Balay {
1238e27ec22SSatish Balay   (*PetscErrorPrintf)("Cannot call this function from Fortran");
1248e27ec22SSatish Balay   *ierr = 1;
1258e27ec22SSatish Balay }
1268e27ec22SSatish Balay 
1278e27ec22SSatish Balay void PETSC_STDCALL snessetjacobian_(SNES *snes,Mat *A,Mat *B,void (PETSC_STDCALL *func)(SNES*,Vec*,Mat*,Mat*,
1288e27ec22SSatish Balay             MatStructure*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr)
1298e27ec22SSatish Balay {
1308e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(ctx);
131f5b6597dSBarry Smith   CHKFORTRANNULLFUNCTION(func);
132*2613ca53SBarry Smith   PetscObjectAllocateFortranPointers(*snes,10);
133f68b968cSBarry Smith   if ((PetscVoidFunction)func == (PetscVoidFunction)snesdefaultcomputejacobian_) {
1348e27ec22SSatish Balay     *ierr = SNESSetJacobian(*snes,*A,*B,SNESDefaultComputeJacobian,ctx);
135f68b968cSBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesdefaultcomputejacobiancolor_) {
1368e27ec22SSatish Balay     *ierr = SNESSetJacobian(*snes,*A,*B,SNESDefaultComputeJacobianColor,*(MatFDColoring*)ctx);
137f68b968cSBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesdacomputejacobianwithadifor_) {
1388e27ec22SSatish Balay     *ierr = SNESSetJacobian(*snes,*A,*B,SNESDAComputeJacobianWithAdifor,ctx);
139f68b968cSBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesdacomputejacobian_) {
1408e27ec22SSatish Balay     *ierr = SNESSetJacobian(*snes,*A,*B,SNESDAComputeJacobian,ctx);
141f5b6597dSBarry Smith   } else if (!func) {
142f5b6597dSBarry Smith     *ierr = SNESSetJacobian(*snes,*A,*B,0,ctx);
1438e27ec22SSatish Balay   } else {
144b8ebb45fSBarry Smith     ((PetscObject)*snes)->fortran_func_pointers[2] = (PetscVoidFunction)func;
1458e27ec22SSatish Balay     *ierr = SNESSetJacobian(*snes,*A,*B,oursnesjacobian,ctx);
1468e27ec22SSatish Balay   }
1478e27ec22SSatish Balay }
1488e27ec22SSatish Balay /* -------------------------------------------------------------*/
1498e27ec22SSatish Balay 
1506ce558aeSBarry Smith void PETSC_STDCALL   snessolve_(SNES *snes,Vec *b,Vec *x, int *__ierr )
1516ce558aeSBarry Smith {
1526ce558aeSBarry Smith   Vec B = *b;
1536ce558aeSBarry Smith   if (*b == PETSC_NULL_OBJECT_Fortran) B = PETSC_NULL;
1546ce558aeSBarry Smith   *__ierr = SNESSolve(*snes,B,*x);
1556ce558aeSBarry Smith }
1566ce558aeSBarry Smith 
1578e27ec22SSatish Balay void PETSC_STDCALL snesgetoptionsprefix_(SNES *snes,CHAR prefix PETSC_MIXED_LEN(len),
1588e27ec22SSatish Balay                                          PetscErrorCode *ierr PETSC_END_LEN(len))
1598e27ec22SSatish Balay {
1608e27ec22SSatish Balay   const char *tname;
1618e27ec22SSatish Balay 
1628e27ec22SSatish Balay   *ierr = SNESGetOptionsPrefix(*snes,&tname);
1638e27ec22SSatish Balay   *ierr = PetscStrncpy(prefix,tname,len);if (*ierr) return;
1648e27ec22SSatish Balay }
1658e27ec22SSatish Balay 
1668e27ec22SSatish Balay void PETSC_STDCALL snesgettype_(SNES *snes,CHAR name PETSC_MIXED_LEN(len),
1678e27ec22SSatish Balay                                 PetscErrorCode *ierr PETSC_END_LEN(len))
1688e27ec22SSatish Balay {
1698e27ec22SSatish Balay   const char *tname;
1708e27ec22SSatish Balay 
1718e27ec22SSatish Balay   *ierr = SNESGetType(*snes,&tname);
1728e27ec22SSatish Balay   *ierr = PetscStrncpy(name,tname,len);if (*ierr) return;
1737c363081SBarry Smith   FIXRETURNCHAR(PETSC_TRUE,name,len);
1748e27ec22SSatish Balay }
175e3da1266SHong Zhang 
176e3da1266SHong Zhang void PETSC_STDCALL snesgetapplicationcontext_(SNES *snes,void **ctx,PetscErrorCode *ierr)
177e3da1266SHong Zhang {
1788c14c6fbSBarry Smith   *ierr = SNESGetApplicationContext(*snes,ctx);
179e3da1266SHong Zhang }
1808e27ec22SSatish Balay /* ---------------------------------------------------------*/
1818e27ec22SSatish Balay 
1828e27ec22SSatish Balay /*
1838e27ec22SSatish Balay         These are not usually called from Fortran but allow Fortran users
1848e27ec22SSatish Balay    to transparently set these monitors from .F code
1858e27ec22SSatish Balay 
1868e27ec22SSatish Balay    functions, hence no STDCALL
1878e27ec22SSatish Balay */
1888e27ec22SSatish Balay void  snesdaformfunction_(SNES *snes,Vec *X, Vec *F,void *ptr,PetscErrorCode *ierr)
1898e27ec22SSatish Balay {
1908e27ec22SSatish Balay   *ierr = SNESDAFormFunction(*snes,*X,*F,ptr);
1918e27ec22SSatish Balay }
1928e27ec22SSatish Balay 
193*2613ca53SBarry Smith void PETSC_STDCALL snessetfunction_(SNES *snes,Vec *r,void (PETSC_STDCALL *func)(SNES*,Vec*,Vec*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr)
1948e27ec22SSatish Balay {
1958e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(ctx);
196*2613ca53SBarry Smith   PetscObjectAllocateFortranPointers(*snes,10);
197f68b968cSBarry Smith   if ((PetscVoidFunction)func == (PetscVoidFunction)snesdaformfunction_) {
1988e27ec22SSatish Balay     *ierr = SNESSetFunction(*snes,*r,SNESDAFormFunction,ctx);
1998e27ec22SSatish Balay   } else {
200b8ebb45fSBarry Smith     ((PetscObject)*snes)->fortran_func_pointers[0] = (PetscVoidFunction)func;
2018e27ec22SSatish Balay     *ierr = SNESSetFunction(*snes,*r,oursnesfunction,ctx);
2028e27ec22SSatish Balay   }
2038e27ec22SSatish Balay }
2048e27ec22SSatish Balay /* ---------------------------------------------------------*/
2058e27ec22SSatish Balay 
2068e27ec22SSatish Balay /* the func argument is ignored */
2078e27ec22SSatish Balay void PETSC_STDCALL snesgetfunction_(SNES *snes,Vec *r,void *func,void **ctx,PetscErrorCode *ierr)
2088e27ec22SSatish Balay {
2098e27ec22SSatish Balay   CHKFORTRANNULLINTEGER(ctx);
2108e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(r);
2118e27ec22SSatish Balay   *ierr = SNESGetFunction(*snes,r,PETSC_NULL,ctx);
2128e27ec22SSatish Balay }
2138e27ec22SSatish Balay /*----------------------------------------------------------------------*/
2148e27ec22SSatish Balay 
2153f149594SLisandro Dalcin void snesdefaultconverged_(SNES *snes,PetscInt *it,PetscReal *a,PetscReal *b,PetscReal *c,SNESConvergedReason *r,
2163f149594SLisandro Dalcin                                        void *ct,PetscErrorCode *ierr)
2173f149594SLisandro Dalcin {
2183f149594SLisandro Dalcin   *ierr = SNESDefaultConverged(*snes,*it,*a,*b,*c,r,ct);
2193f149594SLisandro Dalcin }
2203f149594SLisandro Dalcin 
2213f149594SLisandro Dalcin void snesskipconverged_(SNES *snes,PetscInt *it,PetscReal *a,PetscReal *b,PetscReal *c,SNESConvergedReason *r,
2223f149594SLisandro Dalcin                                        void *ct,PetscErrorCode *ierr)
2233f149594SLisandro Dalcin {
2243f149594SLisandro Dalcin   *ierr = SNESSkipConverged(*snes,*it,*a,*b,*c,r,ct);
2253f149594SLisandro Dalcin }
2263f149594SLisandro Dalcin 
2278e27ec22SSatish Balay void PETSC_STDCALL snessetconvergencetest_(SNES *snes,
22806ee9f85SBarry Smith        void (PETSC_STDCALL *func)(SNES*,PetscInt*,PetscReal*,PetscReal*,PetscReal*,SNESConvergedReason*,void*,PetscErrorCode*),
2298e27ec22SSatish Balay        void *cctx,PetscErrorCode *ierr)
2308e27ec22SSatish Balay {
2318e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(cctx);
232*2613ca53SBarry Smith   PetscObjectAllocateFortranPointers(*snes,10);
2333f149594SLisandro Dalcin 
2343f149594SLisandro Dalcin   if ((PetscVoidFunction)func == (PetscVoidFunction)snesdefaultconverged_){
2353f149594SLisandro Dalcin     *ierr = SNESSetConvergenceTest(*snes,SNESDefaultConverged,0);
2363f149594SLisandro Dalcin   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesskipconverged_){
2373f149594SLisandro Dalcin     *ierr = SNESSetConvergenceTest(*snes,SNESSkipConverged,0);
2388e27ec22SSatish Balay   } else {
239b8ebb45fSBarry Smith     ((PetscObject)*snes)->fortran_func_pointers[1] = (PetscVoidFunction)func;
2408e27ec22SSatish Balay     *ierr = SNESSetConvergenceTest(*snes,oursnestest,cctx);
2418e27ec22SSatish Balay   }
2428e27ec22SSatish Balay }
2438e27ec22SSatish Balay /*----------------------------------------------------------------------*/
2448e27ec22SSatish Balay 
2458e27ec22SSatish Balay void PETSC_STDCALL snesview_(SNES *snes,PetscViewer *viewer, PetscErrorCode *ierr)
2468e27ec22SSatish Balay {
2478e27ec22SSatish Balay   PetscViewer v;
2488e27ec22SSatish Balay   PetscPatchDefaultViewers_Fortran(viewer,v);
2498e27ec22SSatish Balay   *ierr = SNESView(*snes,v);
2508e27ec22SSatish Balay }
2518e27ec22SSatish Balay 
2528e27ec22SSatish Balay /*  func is currently ignored from Fortran */
2538e27ec22SSatish Balay void PETSC_STDCALL snesgetjacobian_(SNES *snes,Mat *A,Mat *B,int *func,void **ctx,PetscErrorCode *ierr)
2548e27ec22SSatish Balay {
2558e27ec22SSatish Balay   CHKFORTRANNULLINTEGER(ctx);
2568e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(A);
2578e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(B);
2588e27ec22SSatish Balay   *ierr = SNESGetJacobian(*snes,A,B,0,ctx);
2598e27ec22SSatish Balay }
2608e27ec22SSatish Balay 
2618e27ec22SSatish Balay void PETSC_STDCALL snesgetconvergencehistory_(SNES *snes,PetscInt *na,PetscErrorCode *ierr)
2628e27ec22SSatish Balay {
2638e27ec22SSatish Balay   *ierr = SNESGetConvergenceHistory(*snes,PETSC_NULL,PETSC_NULL,na);
2648e27ec22SSatish Balay }
2658e27ec22SSatish Balay 
2668e27ec22SSatish Balay void PETSC_STDCALL snessettype_(SNES *snes,CHAR type PETSC_MIXED_LEN(len),
2678e27ec22SSatish Balay                                 PetscErrorCode *ierr PETSC_END_LEN(len))
2688e27ec22SSatish Balay {
2698e27ec22SSatish Balay   char *t;
2708e27ec22SSatish Balay 
2718e27ec22SSatish Balay   FIXCHAR(type,len,t);
2728e27ec22SSatish Balay   *ierr = SNESSetType(*snes,t);
2738e27ec22SSatish Balay   FREECHAR(type,t);
2748e27ec22SSatish Balay }
2758e27ec22SSatish Balay 
2768e27ec22SSatish Balay void PETSC_STDCALL snesappendoptionsprefix_(SNES *snes,CHAR prefix PETSC_MIXED_LEN(len),
2778e27ec22SSatish Balay                                             PetscErrorCode *ierr PETSC_END_LEN(len))
2788e27ec22SSatish Balay {
2798e27ec22SSatish Balay   char *t;
2808e27ec22SSatish Balay 
2818e27ec22SSatish Balay   FIXCHAR(prefix,len,t);
2828e27ec22SSatish Balay   *ierr = SNESAppendOptionsPrefix(*snes,t);
2838e27ec22SSatish Balay   FREECHAR(prefix,t);
2848e27ec22SSatish Balay }
2858e27ec22SSatish Balay 
2868e27ec22SSatish Balay void PETSC_STDCALL snessetoptionsprefix_(SNES *snes,CHAR prefix PETSC_MIXED_LEN(len),
2878e27ec22SSatish Balay                                         PetscErrorCode *ierr PETSC_END_LEN(len))
2888e27ec22SSatish Balay {
2898e27ec22SSatish Balay   char *t;
2908e27ec22SSatish Balay 
2918e27ec22SSatish Balay   FIXCHAR(prefix,len,t);
2928e27ec22SSatish Balay   *ierr = SNESSetOptionsPrefix(*snes,t);
2938e27ec22SSatish Balay   FREECHAR(prefix,t);
2948e27ec22SSatish Balay }
2958e27ec22SSatish Balay 
2968e27ec22SSatish Balay /*----------------------------------------------------------------------*/
2978e27ec22SSatish Balay /* functions, hence no STDCALL */
2988e27ec22SSatish Balay 
299a6570f20SBarry Smith void snesmonitorlg_(SNES *snes,PetscInt *its,PetscReal *fgnorm,void *dummy,PetscErrorCode *ierr)
3008e27ec22SSatish Balay {
301a6570f20SBarry Smith   *ierr = SNESMonitorLG(*snes,*its,*fgnorm,dummy);
3028e27ec22SSatish Balay }
3038e27ec22SSatish Balay 
304a6570f20SBarry Smith void snesmonitordefault_(SNES *snes,PetscInt *its,PetscReal *fgnorm,void *dummy,PetscErrorCode *ierr)
3058e27ec22SSatish Balay {
306a6570f20SBarry Smith   *ierr = SNESMonitorDefault(*snes,*its,*fgnorm,dummy);
3078e27ec22SSatish Balay }
3088e27ec22SSatish Balay 
309a6570f20SBarry Smith void snesmonitorsolution_(SNES *snes,PetscInt *its,PetscReal *fgnorm,void *dummy,PetscErrorCode *ierr)
3108e27ec22SSatish Balay {
311a6570f20SBarry Smith   *ierr = SNESMonitorSolution(*snes,*its,*fgnorm,dummy);
3128e27ec22SSatish Balay }
3138e27ec22SSatish Balay 
314a6570f20SBarry Smith void snesmonitorsolutionupdate_(SNES *snes,PetscInt *its,PetscReal *fgnorm,void *dummy,PetscErrorCode *ierr)
3158e27ec22SSatish Balay {
316a6570f20SBarry Smith   *ierr = SNESMonitorSolutionUpdate(*snes,*its,*fgnorm,dummy);
3178e27ec22SSatish Balay }
3188e27ec22SSatish Balay 
3198e27ec22SSatish Balay 
320a6570f20SBarry Smith void PETSC_STDCALL snesmonitorset_(SNES *snes,void (PETSC_STDCALL *func)(SNES*,PetscInt*,PetscReal*,void*,PetscErrorCode*),
3218e27ec22SSatish Balay                     void *mctx,void (PETSC_STDCALL *mondestroy)(void*,PetscErrorCode*),PetscErrorCode *ierr)
3228e27ec22SSatish Balay {
3238e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(mctx);
324*2613ca53SBarry Smith   PetscObjectAllocateFortranPointers(*snes,10);
325a6570f20SBarry Smith   if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitordefault_) {
326a6570f20SBarry Smith     *ierr = SNESMonitorSet(*snes,SNESMonitorDefault,0,0);
327a6570f20SBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorsolution_) {
328a6570f20SBarry Smith     *ierr = SNESMonitorSet(*snes,SNESMonitorSolution,0,0);
329a6570f20SBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorsolutionupdate_) {
330a6570f20SBarry Smith     *ierr = SNESMonitorSet(*snes,SNESMonitorSolutionUpdate,0,0);
331a6570f20SBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorlg_) {
332a6570f20SBarry Smith     *ierr = SNESMonitorSet(*snes,SNESMonitorLG,0,0);
3338e27ec22SSatish Balay   } else {
334b8ebb45fSBarry Smith     ((PetscObject)*snes)->fortran_func_pointers[3] = (PetscVoidFunction)func;
335b8ebb45fSBarry Smith     ((PetscObject)*snes)->fortran_func_pointers[4] = (PetscVoidFunction)mctx;
336b8ebb45fSBarry Smith 
3378e27ec22SSatish Balay     if (FORTRANNULLFUNCTION(mondestroy)){
338b8ebb45fSBarry Smith       *ierr = SNESMonitorSet(*snes,oursnesmonitor,*snes,0);
3398e27ec22SSatish Balay     } else {
340b8ebb45fSBarry Smith       ((PetscObject)*snes)->fortran_func_pointers[5] = (PetscVoidFunction)mondestroy;
341b8ebb45fSBarry Smith       *ierr = SNESMonitorSet(*snes,oursnesmonitor,*snes,ourmondestroy);
3428e27ec22SSatish Balay     }
3438e27ec22SSatish Balay   }
3448e27ec22SSatish Balay }
3458e27ec22SSatish Balay 
3468e27ec22SSatish Balay 
3478e27ec22SSatish Balay 
3488e27ec22SSatish Balay EXTERN_C_END
349