xref: /petsc/src/snes/interface/ftn-custom/zsnesf.c (revision 6895c4454d0419b7d1cef7fe2938cafebbe2c313)
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;
70*6895c445SBarry Smith   void           *mctx = (void*) ((PetscObject)snes)->fortran_func_pointers[11];
71*6895c445SBarry Smith   (*(void (PETSC_STDCALL *)(SNES*,PetscInt*,PetscReal*,PetscReal*,PetscReal*,SNESConvergedReason*,void*,PetscErrorCode*))(((PetscObject)snes)->fortran_func_pointers[1]))(&snes,&it,&a,&d,&c,reason,mctx,&ierr);CHKERRQ(ierr);
727f7931b9SBarry Smith   return 0;
737f7931b9SBarry Smith }
747f7931b9SBarry Smith 
757f7931b9SBarry Smith static PetscErrorCode ourdestroy(void*ctx)
767f7931b9SBarry Smith {
777f7931b9SBarry Smith   PetscErrorCode ierr = 0;
787f7931b9SBarry Smith   SNES           snes = (SNES)ctx;
79*6895c445SBarry Smith   void           *mctx = (void*) ((PetscObject)snes)->fortran_func_pointers[11];
80*6895c445SBarry Smith   (*(void (PETSC_STDCALL *)(void*,PetscErrorCode*))(((PetscObject)snes)->fortran_func_pointers[10]))(mctx,&ierr);CHKERRQ(ierr);
818e27ec22SSatish Balay   return 0;
828e27ec22SSatish Balay }
838e27ec22SSatish Balay 
848e27ec22SSatish Balay static PetscErrorCode oursnesjacobian(SNES snes,Vec x,Mat* m,Mat* p,MatStructure* type,void*ctx)
858e27ec22SSatish Balay {
868e27ec22SSatish Balay   PetscErrorCode ierr = 0;
87b8ebb45fSBarry 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);
888e27ec22SSatish Balay   return 0;
898e27ec22SSatish Balay }
908e27ec22SSatish Balay static PetscErrorCode oursnesmonitor(SNES snes,PetscInt i,PetscReal d,void*ctx)
918e27ec22SSatish Balay {
928e27ec22SSatish Balay   PetscErrorCode ierr = 0;
938e27ec22SSatish Balay 
94*6895c445SBarry Smith   void           *mctx = (void*)((PetscObject)snes)->fortran_func_pointers[4];
95*6895c445SBarry Smith   (*(void (PETSC_STDCALL *)(SNES*,PetscInt*,PetscReal*,void*,PetscErrorCode*))(((PetscObject)snes)->fortran_func_pointers[3]))(&snes,&i,&d,mctx,&ierr);CHKERRQ(ierr);
968e27ec22SSatish Balay   return 0;
978e27ec22SSatish Balay }
988e27ec22SSatish Balay static PetscErrorCode ourmondestroy(void* ctx)
998e27ec22SSatish Balay {
1008e27ec22SSatish Balay   PetscErrorCode ierr = 0;
101b8ebb45fSBarry Smith   SNES           snes = (SNES)ctx;
102*6895c445SBarry Smith   void           *mctx = (void*) ((PetscObject)snes)->fortran_func_pointers[4];
103*6895c445SBarry Smith   (*(void (PETSC_STDCALL *)(void*,PetscErrorCode*))(((PetscObject)snes)->fortran_func_pointers[5]))(mctx,&ierr);CHKERRQ(ierr);
1048e27ec22SSatish Balay   return 0;
1058e27ec22SSatish Balay }
1068e27ec22SSatish Balay 
1078e27ec22SSatish Balay EXTERN_C_BEGIN
1088e27ec22SSatish Balay /* ---------------------------------------------------------*/
1098e27ec22SSatish Balay /*
1108e27ec22SSatish Balay      snesdefaultcomputejacobian() and snesdefaultcomputejacobiancolor()
1118e27ec22SSatish Balay   These can be used directly from Fortran but are mostly so that
1128e27ec22SSatish Balay   Fortran SNESSetJacobian() will properly handle the defaults being passed in.
1138e27ec22SSatish Balay 
1148e27ec22SSatish Balay   functions, hence no STDCALL
1158e27ec22SSatish Balay */
1168e27ec22SSatish Balay void snesdefaultcomputejacobian_(SNES *snes,Vec *x,Mat *m,Mat *p,MatStructure* type,void *ctx,PetscErrorCode *ierr)
1178e27ec22SSatish Balay {
1188e27ec22SSatish Balay   *ierr = SNESDefaultComputeJacobian(*snes,*x,m,p,type,ctx);
1198e27ec22SSatish Balay }
1208e27ec22SSatish Balay void  snesdefaultcomputejacobiancolor_(SNES *snes,Vec *x,Mat *m,Mat *p,MatStructure* type,void *ctx,PetscErrorCode *ierr)
1218e27ec22SSatish Balay {
1228e27ec22SSatish Balay   *ierr = SNESDefaultComputeJacobianColor(*snes,*x,m,p,type,*(MatFDColoring*)ctx);
1238e27ec22SSatish Balay }
1248e27ec22SSatish Balay 
1258e27ec22SSatish Balay void  snesdacomputejacobianwithadifor_(SNES *snes,Vec *X,Mat *m,Mat *p,MatStructure* type,void *ctx,PetscErrorCode *ierr)
1268e27ec22SSatish Balay {
1278e27ec22SSatish Balay   (*PetscErrorPrintf)("Cannot call this function from Fortran");
1288e27ec22SSatish Balay   *ierr = 1;
1298e27ec22SSatish Balay }
1308e27ec22SSatish Balay 
1318e27ec22SSatish Balay void  snesdacomputejacobian_(SNES *snes,Vec *X,Mat *m,Mat *p,MatStructure* type,void *ctx,PetscErrorCode *ierr)
1328e27ec22SSatish Balay {
1338e27ec22SSatish Balay   (*PetscErrorPrintf)("Cannot call this function from Fortran");
1348e27ec22SSatish Balay   *ierr = 1;
1358e27ec22SSatish Balay }
1368e27ec22SSatish Balay 
1378e27ec22SSatish Balay void PETSC_STDCALL snessetjacobian_(SNES *snes,Mat *A,Mat *B,void (PETSC_STDCALL *func)(SNES*,Vec*,Mat*,Mat*,
1388e27ec22SSatish Balay             MatStructure*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr)
1398e27ec22SSatish Balay {
1408e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(ctx);
141f5b6597dSBarry Smith   CHKFORTRANNULLFUNCTION(func);
1427f7931b9SBarry Smith   PetscObjectAllocateFortranPointers(*snes,12);
143f68b968cSBarry Smith   if ((PetscVoidFunction)func == (PetscVoidFunction)snesdefaultcomputejacobian_) {
1448e27ec22SSatish Balay     *ierr = SNESSetJacobian(*snes,*A,*B,SNESDefaultComputeJacobian,ctx);
145f68b968cSBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesdefaultcomputejacobiancolor_) {
1468e27ec22SSatish Balay     *ierr = SNESSetJacobian(*snes,*A,*B,SNESDefaultComputeJacobianColor,*(MatFDColoring*)ctx);
147f68b968cSBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesdacomputejacobianwithadifor_) {
1488e27ec22SSatish Balay     *ierr = SNESSetJacobian(*snes,*A,*B,SNESDAComputeJacobianWithAdifor,ctx);
149f68b968cSBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesdacomputejacobian_) {
1508e27ec22SSatish Balay     *ierr = SNESSetJacobian(*snes,*A,*B,SNESDAComputeJacobian,ctx);
151f5b6597dSBarry Smith   } else if (!func) {
152f5b6597dSBarry Smith     *ierr = SNESSetJacobian(*snes,*A,*B,0,ctx);
1538e27ec22SSatish Balay   } else {
154b8ebb45fSBarry Smith     ((PetscObject)*snes)->fortran_func_pointers[2] = (PetscVoidFunction)func;
1558e27ec22SSatish Balay     *ierr = SNESSetJacobian(*snes,*A,*B,oursnesjacobian,ctx);
1568e27ec22SSatish Balay   }
1578e27ec22SSatish Balay }
1588e27ec22SSatish Balay /* -------------------------------------------------------------*/
1598e27ec22SSatish Balay 
1606ce558aeSBarry Smith void PETSC_STDCALL   snessolve_(SNES *snes,Vec *b,Vec *x, int *__ierr )
1616ce558aeSBarry Smith {
1626ce558aeSBarry Smith   Vec B = *b;
1636ce558aeSBarry Smith   if (*b == PETSC_NULL_OBJECT_Fortran) B = PETSC_NULL;
1646ce558aeSBarry Smith   *__ierr = SNESSolve(*snes,B,*x);
1656ce558aeSBarry Smith }
1666ce558aeSBarry Smith 
167e1d034e4SBarry Smith void PETSC_STDCALL snesgetoptionsprefix_(SNES *snes,CHAR prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
1688e27ec22SSatish Balay {
1698e27ec22SSatish Balay   const char *tname;
1708e27ec22SSatish Balay 
1718e27ec22SSatish Balay   *ierr = SNESGetOptionsPrefix(*snes,&tname);
1728e27ec22SSatish Balay   *ierr = PetscStrncpy(prefix,tname,len);if (*ierr) return;
1738e27ec22SSatish Balay }
1748e27ec22SSatish Balay 
1757f7931b9SBarry Smith void PETSC_STDCALL snesgettype_(SNES *snes,CHAR name PETSC_MIXED_LEN(len), PetscErrorCode *ierr PETSC_END_LEN(len))
1768e27ec22SSatish Balay {
1778e27ec22SSatish Balay   const char *tname;
1788e27ec22SSatish Balay 
1798e27ec22SSatish Balay   *ierr = SNESGetType(*snes,&tname);
1808e27ec22SSatish Balay   *ierr = PetscStrncpy(name,tname,len);if (*ierr) return;
1817c363081SBarry Smith   FIXRETURNCHAR(PETSC_TRUE,name,len);
1828e27ec22SSatish Balay }
183e3da1266SHong Zhang 
184e3da1266SHong Zhang void PETSC_STDCALL snesgetapplicationcontext_(SNES *snes,void **ctx,PetscErrorCode *ierr)
185e3da1266SHong Zhang {
1868c14c6fbSBarry Smith   *ierr = SNESGetApplicationContext(*snes,ctx);
187e3da1266SHong Zhang }
1888e27ec22SSatish Balay /* ---------------------------------------------------------*/
1898e27ec22SSatish Balay 
1908e27ec22SSatish Balay /*
1918e27ec22SSatish Balay         These are not usually called from Fortran but allow Fortran users
1928e27ec22SSatish Balay    to transparently set these monitors from .F code
1938e27ec22SSatish Balay 
1948e27ec22SSatish Balay    functions, hence no STDCALL
1958e27ec22SSatish Balay */
1968e27ec22SSatish Balay void  snesdaformfunction_(SNES *snes,Vec *X, Vec *F,void *ptr,PetscErrorCode *ierr)
1978e27ec22SSatish Balay {
1988e27ec22SSatish Balay   *ierr = SNESDAFormFunction(*snes,*X,*F,ptr);
1998e27ec22SSatish Balay }
2008e27ec22SSatish Balay 
2012613ca53SBarry Smith void PETSC_STDCALL snessetfunction_(SNES *snes,Vec *r,void (PETSC_STDCALL *func)(SNES*,Vec*,Vec*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr)
2028e27ec22SSatish Balay {
2038e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(ctx);
2047f7931b9SBarry Smith   PetscObjectAllocateFortranPointers(*snes,12);
205f68b968cSBarry Smith   if ((PetscVoidFunction)func == (PetscVoidFunction)snesdaformfunction_) {
2068e27ec22SSatish Balay     *ierr = SNESSetFunction(*snes,*r,SNESDAFormFunction,ctx);
2078e27ec22SSatish Balay   } else {
208b8ebb45fSBarry Smith     ((PetscObject)*snes)->fortran_func_pointers[0] = (PetscVoidFunction)func;
2098e27ec22SSatish Balay     *ierr = SNESSetFunction(*snes,*r,oursnesfunction,ctx);
2108e27ec22SSatish Balay   }
2118e27ec22SSatish Balay }
2128e27ec22SSatish Balay /* ---------------------------------------------------------*/
2138e27ec22SSatish Balay 
2148e27ec22SSatish Balay /* the func argument is ignored */
2158e27ec22SSatish Balay void PETSC_STDCALL snesgetfunction_(SNES *snes,Vec *r,void *func,void **ctx,PetscErrorCode *ierr)
2168e27ec22SSatish Balay {
2178e27ec22SSatish Balay   CHKFORTRANNULLINTEGER(ctx);
2188e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(r);
2198e27ec22SSatish Balay   *ierr = SNESGetFunction(*snes,r,PETSC_NULL,ctx);
2208e27ec22SSatish Balay }
2218e27ec22SSatish Balay /*----------------------------------------------------------------------*/
2228e27ec22SSatish Balay 
2237f7931b9SBarry Smith void snesdefaultconverged_(SNES *snes,PetscInt *it,PetscReal *a,PetscReal *b,PetscReal *c,SNESConvergedReason *r, void *ct,PetscErrorCode *ierr)
2243f149594SLisandro Dalcin {
2253f149594SLisandro Dalcin   *ierr = SNESDefaultConverged(*snes,*it,*a,*b,*c,r,ct);
2263f149594SLisandro Dalcin }
2273f149594SLisandro Dalcin 
2283f149594SLisandro Dalcin void snesskipconverged_(SNES *snes,PetscInt *it,PetscReal *a,PetscReal *b,PetscReal *c,SNESConvergedReason *r,
2293f149594SLisandro Dalcin                                        void *ct,PetscErrorCode *ierr)
2303f149594SLisandro Dalcin {
2313f149594SLisandro Dalcin   *ierr = SNESSkipConverged(*snes,*it,*a,*b,*c,r,ct);
2323f149594SLisandro Dalcin }
2333f149594SLisandro Dalcin 
2347f7931b9SBarry 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)
2358e27ec22SSatish Balay {
2368e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(cctx);
2377f7931b9SBarry Smith   PetscObjectAllocateFortranPointers(*snes,12);
2383f149594SLisandro Dalcin 
2393f149594SLisandro Dalcin   if ((PetscVoidFunction)func == (PetscVoidFunction)snesdefaultconverged_){
2407f7931b9SBarry Smith     *ierr = SNESSetConvergenceTest(*snes,SNESDefaultConverged,0,0);
2413f149594SLisandro Dalcin   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesskipconverged_){
2427f7931b9SBarry Smith     *ierr = SNESSetConvergenceTest(*snes,SNESSkipConverged,0,0);
2438e27ec22SSatish Balay   } else {
244b8ebb45fSBarry Smith     ((PetscObject)*snes)->fortran_func_pointers[1] = (PetscVoidFunction)func;
2457f7931b9SBarry Smith     ((PetscObject)*snes)->fortran_func_pointers[11] = (PetscVoidFunction)cctx;
2467f7931b9SBarry Smith     if (FORTRANNULLFUNCTION(destroy)) {
2477f7931b9SBarry Smith       *ierr = SNESSetConvergenceTest(*snes,oursnestest,*snes,PETSC_NULL);
2487f7931b9SBarry Smith     } else {
2497f7931b9SBarry Smith       ((PetscObject)*snes)->fortran_func_pointers[10] = (PetscVoidFunction)destroy;
2507f7931b9SBarry Smith       *ierr = SNESSetConvergenceTest(*snes,oursnestest,*snes,ourdestroy);
2517f7931b9SBarry Smith     }
2528e27ec22SSatish Balay   }
2538e27ec22SSatish Balay }
2548e27ec22SSatish Balay /*----------------------------------------------------------------------*/
2558e27ec22SSatish Balay 
2568e27ec22SSatish Balay void PETSC_STDCALL snesview_(SNES *snes,PetscViewer *viewer, PetscErrorCode *ierr)
2578e27ec22SSatish Balay {
2588e27ec22SSatish Balay   PetscViewer v;
2598e27ec22SSatish Balay   PetscPatchDefaultViewers_Fortran(viewer,v);
2608e27ec22SSatish Balay   *ierr = SNESView(*snes,v);
2618e27ec22SSatish Balay }
2628e27ec22SSatish Balay 
2638e27ec22SSatish Balay /*  func is currently ignored from Fortran */
2648e27ec22SSatish Balay void PETSC_STDCALL snesgetjacobian_(SNES *snes,Mat *A,Mat *B,int *func,void **ctx,PetscErrorCode *ierr)
2658e27ec22SSatish Balay {
2668e27ec22SSatish Balay   CHKFORTRANNULLINTEGER(ctx);
2678e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(A);
2688e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(B);
2698e27ec22SSatish Balay   *ierr = SNESGetJacobian(*snes,A,B,0,ctx);
2708e27ec22SSatish Balay }
2718e27ec22SSatish Balay 
2728e27ec22SSatish Balay void PETSC_STDCALL snesgetconvergencehistory_(SNES *snes,PetscInt *na,PetscErrorCode *ierr)
2738e27ec22SSatish Balay {
2748e27ec22SSatish Balay   *ierr = SNESGetConvergenceHistory(*snes,PETSC_NULL,PETSC_NULL,na);
2758e27ec22SSatish Balay }
2768e27ec22SSatish Balay 
2777f7931b9SBarry Smith void PETSC_STDCALL snessettype_(SNES *snes,CHAR type PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
2788e27ec22SSatish Balay {
2798e27ec22SSatish Balay   char *t;
2808e27ec22SSatish Balay 
2818e27ec22SSatish Balay   FIXCHAR(type,len,t);
2828e27ec22SSatish Balay   *ierr = SNESSetType(*snes,t);
2838e27ec22SSatish Balay   FREECHAR(type,t);
2848e27ec22SSatish Balay }
2858e27ec22SSatish Balay 
2867f7931b9SBarry Smith void PETSC_STDCALL snesappendoptionsprefix_(SNES *snes,CHAR prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
2878e27ec22SSatish Balay {
2888e27ec22SSatish Balay   char *t;
2898e27ec22SSatish Balay 
2908e27ec22SSatish Balay   FIXCHAR(prefix,len,t);
2918e27ec22SSatish Balay   *ierr = SNESAppendOptionsPrefix(*snes,t);
2928e27ec22SSatish Balay   FREECHAR(prefix,t);
2938e27ec22SSatish Balay }
2948e27ec22SSatish Balay 
2957f7931b9SBarry Smith void PETSC_STDCALL snessetoptionsprefix_(SNES *snes,CHAR prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
2968e27ec22SSatish Balay {
2978e27ec22SSatish Balay   char *t;
2988e27ec22SSatish Balay 
2998e27ec22SSatish Balay   FIXCHAR(prefix,len,t);
3008e27ec22SSatish Balay   *ierr = SNESSetOptionsPrefix(*snes,t);
3018e27ec22SSatish Balay   FREECHAR(prefix,t);
3028e27ec22SSatish Balay }
3038e27ec22SSatish Balay 
3048e27ec22SSatish Balay /*----------------------------------------------------------------------*/
3058e27ec22SSatish Balay /* functions, hence no STDCALL */
3068e27ec22SSatish Balay 
307a6570f20SBarry Smith void snesmonitorlg_(SNES *snes,PetscInt *its,PetscReal *fgnorm,void *dummy,PetscErrorCode *ierr)
3088e27ec22SSatish Balay {
309a6570f20SBarry Smith   *ierr = SNESMonitorLG(*snes,*its,*fgnorm,dummy);
3108e27ec22SSatish Balay }
3118e27ec22SSatish Balay 
312a6570f20SBarry Smith void snesmonitordefault_(SNES *snes,PetscInt *its,PetscReal *fgnorm,void *dummy,PetscErrorCode *ierr)
3138e27ec22SSatish Balay {
314a6570f20SBarry Smith   *ierr = SNESMonitorDefault(*snes,*its,*fgnorm,dummy);
3158e27ec22SSatish Balay }
3168e27ec22SSatish Balay 
317a6570f20SBarry Smith void snesmonitorsolution_(SNES *snes,PetscInt *its,PetscReal *fgnorm,void *dummy,PetscErrorCode *ierr)
3188e27ec22SSatish Balay {
319a6570f20SBarry Smith   *ierr = SNESMonitorSolution(*snes,*its,*fgnorm,dummy);
3208e27ec22SSatish Balay }
3218e27ec22SSatish Balay 
322a6570f20SBarry Smith void snesmonitorsolutionupdate_(SNES *snes,PetscInt *its,PetscReal *fgnorm,void *dummy,PetscErrorCode *ierr)
3238e27ec22SSatish Balay {
324a6570f20SBarry Smith   *ierr = SNESMonitorSolutionUpdate(*snes,*its,*fgnorm,dummy);
3258e27ec22SSatish Balay }
3268e27ec22SSatish Balay 
3278e27ec22SSatish Balay 
328*6895c445SBarry 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)
3298e27ec22SSatish Balay {
3308e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(mctx);
3317f7931b9SBarry Smith   PetscObjectAllocateFortranPointers(*snes,12);
332a6570f20SBarry Smith   if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitordefault_) {
333a6570f20SBarry Smith     *ierr = SNESMonitorSet(*snes,SNESMonitorDefault,0,0);
334a6570f20SBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorsolution_) {
335a6570f20SBarry Smith     *ierr = SNESMonitorSet(*snes,SNESMonitorSolution,0,0);
336a6570f20SBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorsolutionupdate_) {
337a6570f20SBarry Smith     *ierr = SNESMonitorSet(*snes,SNESMonitorSolutionUpdate,0,0);
338a6570f20SBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorlg_) {
339a6570f20SBarry Smith     *ierr = SNESMonitorSet(*snes,SNESMonitorLG,0,0);
3408e27ec22SSatish Balay   } else {
341b8ebb45fSBarry Smith     ((PetscObject)*snes)->fortran_func_pointers[3] = (PetscVoidFunction)func;
342b8ebb45fSBarry Smith     ((PetscObject)*snes)->fortran_func_pointers[4] = (PetscVoidFunction)mctx;
343b8ebb45fSBarry Smith 
3448e27ec22SSatish Balay     if (FORTRANNULLFUNCTION(mondestroy)){
3457f7931b9SBarry Smith       *ierr = SNESMonitorSet(*snes,oursnesmonitor,*snes,PETSC_NULL);
3468e27ec22SSatish Balay     } else {
347b8ebb45fSBarry Smith       ((PetscObject)*snes)->fortran_func_pointers[5] = (PetscVoidFunction)mondestroy;
348b8ebb45fSBarry Smith       *ierr = SNESMonitorSet(*snes,oursnesmonitor,*snes,ourmondestroy);
3498e27ec22SSatish Balay     }
3508e27ec22SSatish Balay   }
3518e27ec22SSatish Balay }
3528e27ec22SSatish Balay 
3538e27ec22SSatish Balay 
3548e27ec22SSatish Balay 
3558e27ec22SSatish Balay EXTERN_C_END
356