xref: /petsc/src/snes/interface/ftn-custom/zsnesf.c (revision c2efdce3a8b4106b7e14f0dd7333a5b437b351ad)
1c6db04a5SJed Brown #include <private/fortranimpl.h>
2c6db04a5SJed Brown #include <petscsnes.h>
38e27ec22SSatish Balay 
48e27ec22SSatish Balay #if defined(PETSC_HAVE_FORTRAN_CAPS)
5df66969eSBarry Smith #define matmffdcomputejacobian_          MATMFFDCOMPUTEJACOBIAN
66ce558aeSBarry Smith #define snessolve_                       SNESSOLVE
78e27ec22SSatish Balay #define snesdefaultcomputejacobian_      SNESDEFAULTCOMPUTEJACOBIAN
88e27ec22SSatish Balay #define snesdefaultcomputejacobiancolor_ SNESDEFAULTCOMPUTEJACOBIANCOLOR
98e27ec22SSatish Balay #define snesdacomputejacobian_           SNESDACOMPUTEJACOBIAN
108e27ec22SSatish Balay #define snesdacomputejacobianwithadifor_ SNESDACOMPUTEJACOBIANWITHADIFOR
118e27ec22SSatish Balay #define snessetjacobian_                 SNESSETJACOBIAN
128e27ec22SSatish Balay #define snesgetoptionsprefix_            SNESGETOPTIONSPREFIX
138e27ec22SSatish Balay #define snesgettype_                     SNESGETTYPE
148e27ec22SSatish Balay #define snesdaformfunction_              SNESDAFORMFUNCTION
158e27ec22SSatish Balay #define snessetfunction_                 SNESSETFUNCTION
168e27ec22SSatish Balay #define snesgetfunction_                 SNESGETFUNCTION
178e27ec22SSatish Balay #define snessetconvergencetest_          SNESSETCONVERGENCETEST
183f149594SLisandro Dalcin #define snesdefaultconverged_            SNESDEFAULTCONVERGED
193f149594SLisandro Dalcin #define snesskipconverged_               SNESSKIPCONVERGED
208e27ec22SSatish Balay #define snesview_                        SNESVIEW
218e27ec22SSatish Balay #define snesgetconvergencehistory_       SNESGETCONVERGENCEHISTORY
228e27ec22SSatish Balay #define snesgetjacobian_                 SNESGETJACOBIAN
238e27ec22SSatish Balay #define snessettype_                     SNESSETTYPE
248e27ec22SSatish Balay #define snesappendoptionsprefix_         SNESAPPENDOPTIONSPREFIX
258e27ec22SSatish Balay #define snessetoptionsprefix_            SNESSETOPTIONSPREFIX
26a6570f20SBarry Smith #define snesmonitordefault_              SNESMONITORDEFAULT
27a6570f20SBarry Smith #define snesmonitorsolution_             SNESMONITORSOLUTION
28a6570f20SBarry Smith #define snesmonitorlg_                   SNESMONITORLG
29a6570f20SBarry Smith #define snesmonitorsolutionupdate_       SNESMONITORSOLUTIONUPDATE
30a6570f20SBarry Smith #define snesmonitorset_                  SNESMONITORSET
31e3da1266SHong Zhang #define snesgetapplicationcontext_       SNESGETAPPLICATIONCONTEXT
328e27ec22SSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
33df66969eSBarry Smith #define matmffdcomputejacobian_          matmffdcomputejacobian
346ce558aeSBarry Smith #define snessolve_                       snessolve
358e27ec22SSatish Balay #define snesdefaultcomputejacobian_      snesdefaultcomputejacobian
368e27ec22SSatish Balay #define snesdefaultcomputejacobiancolor_ snesdefaultcomputejacobiancolor
378e27ec22SSatish Balay #define snesdacomputejacobian_           snesdacomputejacobian
388e27ec22SSatish Balay #define snesdacomputejacobianwithadifor_ snesdacomputejacobianwithadifor
398e27ec22SSatish Balay #define snessetjacobian_                 snessetjacobian
408e27ec22SSatish Balay #define snesgetoptionsprefix_            snesgetoptionsprefix
418e27ec22SSatish Balay #define snesgettype_                     snesgettype
428e27ec22SSatish Balay #define snesdaformfunction_              snesdaformfunction
438e27ec22SSatish Balay #define snessetfunction_                 snessetfunction
448e27ec22SSatish Balay #define snesgetfunction_                 snesgetfunction
458e27ec22SSatish Balay #define snessetconvergencetest_          snessetconvergencetest
463f149594SLisandro Dalcin #define snesdefaultconverged_            snesdefaultconverged
473f149594SLisandro Dalcin #define snesskipconverged_               snesskipconverged
488e27ec22SSatish Balay #define snesview_                        snesview
498e27ec22SSatish Balay #define snesgetjacobian_                 snesgetjacobian
508e27ec22SSatish Balay #define snesgetconvergencehistory_       snesgetconvergencehistory
518e27ec22SSatish Balay #define snessettype_                     snessettype
528e27ec22SSatish Balay #define snesappendoptionsprefix_         snesappendoptionsprefix
538e27ec22SSatish Balay #define snessetoptionsprefix_            snessetoptionsprefix
54a6570f20SBarry Smith #define snesmonitorlg_                   snesmonitorlg
55a6570f20SBarry Smith #define snesmonitordefault_              snesmonitordefault
56a6570f20SBarry Smith #define snesmonitorsolution_             snesmonitorsolution
57a6570f20SBarry Smith #define snesmonitorsolutionupdate_       snesmonitorsolutionupdate
58a6570f20SBarry Smith #define snesmonitorset_                  snesmonitorset
59e3da1266SHong Zhang #define snesgetapplicationcontext_       snesgetapplicationcontext
608e27ec22SSatish Balay #endif
618e27ec22SSatish Balay 
628e27ec22SSatish Balay static PetscErrorCode oursnesfunction(SNES snes,Vec x,Vec f,void *ctx)
638e27ec22SSatish Balay {
648e27ec22SSatish Balay   PetscErrorCode ierr = 0;
65b8ebb45fSBarry Smith   (*(void (PETSC_STDCALL *)(SNES*,Vec*,Vec*,void*,PetscErrorCode*))(((PetscObject)snes)->fortran_func_pointers[0]))(&snes,&x,&f,ctx,&ierr);CHKERRQ(ierr);
668e27ec22SSatish Balay   return 0;
678e27ec22SSatish Balay }
68b8ebb45fSBarry Smith 
6906ee9f85SBarry Smith static PetscErrorCode oursnestest(SNES snes,PetscInt it,PetscReal a,PetscReal d,PetscReal c,SNESConvergedReason*reason,void*ctx)
708e27ec22SSatish Balay {
718e27ec22SSatish Balay   PetscErrorCode ierr = 0;
726895c445SBarry Smith   void           *mctx = (void*) ((PetscObject)snes)->fortran_func_pointers[11];
736895c445SBarry 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);
747f7931b9SBarry Smith   return 0;
757f7931b9SBarry Smith }
767f7931b9SBarry Smith 
777f7931b9SBarry Smith static PetscErrorCode ourdestroy(void*ctx)
787f7931b9SBarry Smith {
797f7931b9SBarry Smith   PetscErrorCode ierr = 0;
807f7931b9SBarry Smith   SNES           snes = (SNES)ctx;
816895c445SBarry Smith   void           *mctx = (void*) ((PetscObject)snes)->fortran_func_pointers[11];
826895c445SBarry Smith   (*(void (PETSC_STDCALL *)(void*,PetscErrorCode*))(((PetscObject)snes)->fortran_func_pointers[10]))(mctx,&ierr);CHKERRQ(ierr);
838e27ec22SSatish Balay   return 0;
848e27ec22SSatish Balay }
858e27ec22SSatish Balay 
868e27ec22SSatish Balay static PetscErrorCode oursnesjacobian(SNES snes,Vec x,Mat* m,Mat* p,MatStructure* type,void*ctx)
878e27ec22SSatish Balay {
888e27ec22SSatish Balay   PetscErrorCode ierr = 0;
89b8ebb45fSBarry 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);
908e27ec22SSatish Balay   return 0;
918e27ec22SSatish Balay }
928e27ec22SSatish Balay static PetscErrorCode oursnesmonitor(SNES snes,PetscInt i,PetscReal d,void*ctx)
938e27ec22SSatish Balay {
948e27ec22SSatish Balay   PetscErrorCode ierr = 0;
958e27ec22SSatish Balay 
966895c445SBarry Smith   void           *mctx = (void*)((PetscObject)snes)->fortran_func_pointers[4];
976895c445SBarry Smith   (*(void (PETSC_STDCALL *)(SNES*,PetscInt*,PetscReal*,void*,PetscErrorCode*))(((PetscObject)snes)->fortran_func_pointers[3]))(&snes,&i,&d,mctx,&ierr);CHKERRQ(ierr);
988e27ec22SSatish Balay   return 0;
998e27ec22SSatish Balay }
100*c2efdce3SBarry Smith static PetscErrorCode ourmondestroy(void** ctx)
1018e27ec22SSatish Balay {
1028e27ec22SSatish Balay   PetscErrorCode ierr = 0;
103*c2efdce3SBarry Smith   SNES           snes = *(SNES*)ctx;
1046895c445SBarry Smith   void           *mctx = (void*) ((PetscObject)snes)->fortran_func_pointers[4];
1056895c445SBarry Smith   (*(void (PETSC_STDCALL *)(void*,PetscErrorCode*))(((PetscObject)snes)->fortran_func_pointers[5]))(mctx,&ierr);CHKERRQ(ierr);
1068e27ec22SSatish Balay   return 0;
1078e27ec22SSatish Balay }
1088e27ec22SSatish Balay 
1098e27ec22SSatish Balay EXTERN_C_BEGIN
1108e27ec22SSatish Balay /* ---------------------------------------------------------*/
1118e27ec22SSatish Balay /*
1128e27ec22SSatish Balay      snesdefaultcomputejacobian() and snesdefaultcomputejacobiancolor()
1138e27ec22SSatish Balay   These can be used directly from Fortran but are mostly so that
1148e27ec22SSatish Balay   Fortran SNESSetJacobian() will properly handle the defaults being passed in.
1158e27ec22SSatish Balay 
1168e27ec22SSatish Balay   functions, hence no STDCALL
1178e27ec22SSatish Balay */
118df66969eSBarry Smith void matmffdcomputejacobian_(SNES *snes,Vec *x,Mat *m,Mat *p,MatStructure* type,void *ctx,PetscErrorCode *ierr)
119df66969eSBarry Smith {
120df66969eSBarry Smith   *ierr = MatMFFDComputeJacobian(*snes,*x,m,p,type,ctx);
121df66969eSBarry Smith }
1228e27ec22SSatish Balay void snesdefaultcomputejacobian_(SNES *snes,Vec *x,Mat *m,Mat *p,MatStructure* type,void *ctx,PetscErrorCode *ierr)
1238e27ec22SSatish Balay {
1248e27ec22SSatish Balay   *ierr = SNESDefaultComputeJacobian(*snes,*x,m,p,type,ctx);
1258e27ec22SSatish Balay }
1268e27ec22SSatish Balay void  snesdefaultcomputejacobiancolor_(SNES *snes,Vec *x,Mat *m,Mat *p,MatStructure* type,void *ctx,PetscErrorCode *ierr)
1278e27ec22SSatish Balay {
1288e27ec22SSatish Balay   *ierr = SNESDefaultComputeJacobianColor(*snes,*x,m,p,type,*(MatFDColoring*)ctx);
1298e27ec22SSatish Balay }
1308e27ec22SSatish Balay 
1318e27ec22SSatish Balay void  snesdacomputejacobianwithadifor_(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  snesdacomputejacobian_(SNES *snes,Vec *X,Mat *m,Mat *p,MatStructure* type,void *ctx,PetscErrorCode *ierr)
1388e27ec22SSatish Balay {
1398e27ec22SSatish Balay   (*PetscErrorPrintf)("Cannot call this function from Fortran");
1408e27ec22SSatish Balay   *ierr = 1;
1418e27ec22SSatish Balay }
1428e27ec22SSatish Balay 
1438e27ec22SSatish Balay void PETSC_STDCALL snessetjacobian_(SNES *snes,Mat *A,Mat *B,void (PETSC_STDCALL *func)(SNES*,Vec*,Mat*,Mat*,
1448e27ec22SSatish Balay             MatStructure*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr)
1458e27ec22SSatish Balay {
1468e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(ctx);
147f5b6597dSBarry Smith   CHKFORTRANNULLFUNCTION(func);
1487f7931b9SBarry Smith   PetscObjectAllocateFortranPointers(*snes,12);
149f68b968cSBarry Smith   if ((PetscVoidFunction)func == (PetscVoidFunction)snesdefaultcomputejacobian_) {
1508e27ec22SSatish Balay     *ierr = SNESSetJacobian(*snes,*A,*B,SNESDefaultComputeJacobian,ctx);
151f68b968cSBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesdefaultcomputejacobiancolor_) {
1528e27ec22SSatish Balay     *ierr = SNESSetJacobian(*snes,*A,*B,SNESDefaultComputeJacobianColor,*(MatFDColoring*)ctx);
153f68b968cSBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesdacomputejacobianwithadifor_) {
1548e27ec22SSatish Balay     *ierr = SNESSetJacobian(*snes,*A,*B,SNESDAComputeJacobianWithAdifor,ctx);
155f68b968cSBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesdacomputejacobian_) {
1568e27ec22SSatish Balay     *ierr = SNESSetJacobian(*snes,*A,*B,SNESDAComputeJacobian,ctx);
157df66969eSBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)matmffdcomputejacobian_) {
158df66969eSBarry Smith     *ierr = SNESSetJacobian(*snes,*A,*B,MatMFFDComputeJacobian,ctx);
159f5b6597dSBarry Smith   } else if (!func) {
160f5b6597dSBarry Smith     *ierr = SNESSetJacobian(*snes,*A,*B,0,ctx);
1618e27ec22SSatish Balay   } else {
162b8ebb45fSBarry Smith     ((PetscObject)*snes)->fortran_func_pointers[2] = (PetscVoidFunction)func;
1638e27ec22SSatish Balay     *ierr = SNESSetJacobian(*snes,*A,*B,oursnesjacobian,ctx);
1648e27ec22SSatish Balay   }
1658e27ec22SSatish Balay }
1668e27ec22SSatish Balay /* -------------------------------------------------------------*/
1678e27ec22SSatish Balay 
1686ce558aeSBarry Smith void PETSC_STDCALL   snessolve_(SNES *snes,Vec *b,Vec *x, int *__ierr )
1696ce558aeSBarry Smith {
1706ce558aeSBarry Smith   Vec B = *b;
1716ce558aeSBarry Smith   if (*b == PETSC_NULL_OBJECT_Fortran) B = PETSC_NULL;
1726ce558aeSBarry Smith   *__ierr = SNESSolve(*snes,B,*x);
1736ce558aeSBarry Smith }
1746ce558aeSBarry Smith 
175e1d034e4SBarry Smith void PETSC_STDCALL snesgetoptionsprefix_(SNES *snes,CHAR prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
1768e27ec22SSatish Balay {
1778e27ec22SSatish Balay   const char *tname;
1788e27ec22SSatish Balay 
1798e27ec22SSatish Balay   *ierr = SNESGetOptionsPrefix(*snes,&tname);
1808e27ec22SSatish Balay   *ierr = PetscStrncpy(prefix,tname,len);if (*ierr) return;
1818e27ec22SSatish Balay }
1828e27ec22SSatish Balay 
1837f7931b9SBarry Smith void PETSC_STDCALL snesgettype_(SNES *snes,CHAR name PETSC_MIXED_LEN(len), PetscErrorCode *ierr PETSC_END_LEN(len))
1848e27ec22SSatish Balay {
1858e27ec22SSatish Balay   const char *tname;
1868e27ec22SSatish Balay 
1878e27ec22SSatish Balay   *ierr = SNESGetType(*snes,&tname);
1888e27ec22SSatish Balay   *ierr = PetscStrncpy(name,tname,len);if (*ierr) return;
1897c363081SBarry Smith   FIXRETURNCHAR(PETSC_TRUE,name,len);
1908e27ec22SSatish Balay }
191e3da1266SHong Zhang 
192e3da1266SHong Zhang void PETSC_STDCALL snesgetapplicationcontext_(SNES *snes,void **ctx,PetscErrorCode *ierr)
193e3da1266SHong Zhang {
1948c14c6fbSBarry Smith   *ierr = SNESGetApplicationContext(*snes,ctx);
195e3da1266SHong Zhang }
1968e27ec22SSatish Balay /* ---------------------------------------------------------*/
1978e27ec22SSatish Balay 
1988e27ec22SSatish Balay /*
1998e27ec22SSatish Balay         These are not usually called from Fortran but allow Fortran users
2008e27ec22SSatish Balay    to transparently set these monitors from .F code
2018e27ec22SSatish Balay 
2028e27ec22SSatish Balay    functions, hence no STDCALL
2038e27ec22SSatish Balay */
2048e27ec22SSatish Balay void  snesdaformfunction_(SNES *snes,Vec *X, Vec *F,void *ptr,PetscErrorCode *ierr)
2058e27ec22SSatish Balay {
2068e27ec22SSatish Balay   *ierr = SNESDAFormFunction(*snes,*X,*F,ptr);
2078e27ec22SSatish Balay }
2088e27ec22SSatish Balay 
2092613ca53SBarry Smith void PETSC_STDCALL snessetfunction_(SNES *snes,Vec *r,void (PETSC_STDCALL *func)(SNES*,Vec*,Vec*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr)
2108e27ec22SSatish Balay {
2118e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(ctx);
2127f7931b9SBarry Smith   PetscObjectAllocateFortranPointers(*snes,12);
213f68b968cSBarry Smith   if ((PetscVoidFunction)func == (PetscVoidFunction)snesdaformfunction_) {
2148e27ec22SSatish Balay     *ierr = SNESSetFunction(*snes,*r,SNESDAFormFunction,ctx);
2158e27ec22SSatish Balay   } else {
216b8ebb45fSBarry Smith     ((PetscObject)*snes)->fortran_func_pointers[0] = (PetscVoidFunction)func;
2178e27ec22SSatish Balay     *ierr = SNESSetFunction(*snes,*r,oursnesfunction,ctx);
2188e27ec22SSatish Balay   }
2198e27ec22SSatish Balay }
2208e27ec22SSatish Balay /* ---------------------------------------------------------*/
2218e27ec22SSatish Balay 
2228e27ec22SSatish Balay /* the func argument is ignored */
2238e27ec22SSatish Balay void PETSC_STDCALL snesgetfunction_(SNES *snes,Vec *r,void *func,void **ctx,PetscErrorCode *ierr)
2248e27ec22SSatish Balay {
2258e27ec22SSatish Balay   CHKFORTRANNULLINTEGER(ctx);
2268e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(r);
2278e27ec22SSatish Balay   *ierr = SNESGetFunction(*snes,r,PETSC_NULL,ctx);
2288e27ec22SSatish Balay }
2298e27ec22SSatish Balay /*----------------------------------------------------------------------*/
2308e27ec22SSatish Balay 
2317f7931b9SBarry Smith void snesdefaultconverged_(SNES *snes,PetscInt *it,PetscReal *a,PetscReal *b,PetscReal *c,SNESConvergedReason *r, void *ct,PetscErrorCode *ierr)
2323f149594SLisandro Dalcin {
2333f149594SLisandro Dalcin   *ierr = SNESDefaultConverged(*snes,*it,*a,*b,*c,r,ct);
2343f149594SLisandro Dalcin }
2353f149594SLisandro Dalcin 
2363f149594SLisandro Dalcin void snesskipconverged_(SNES *snes,PetscInt *it,PetscReal *a,PetscReal *b,PetscReal *c,SNESConvergedReason *r,
2373f149594SLisandro Dalcin                                        void *ct,PetscErrorCode *ierr)
2383f149594SLisandro Dalcin {
2393f149594SLisandro Dalcin   *ierr = SNESSkipConverged(*snes,*it,*a,*b,*c,r,ct);
2403f149594SLisandro Dalcin }
2413f149594SLisandro Dalcin 
2427f7931b9SBarry 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)
2438e27ec22SSatish Balay {
2448e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(cctx);
2453f22127dSBarry Smith   CHKFORTRANNULLFUNCTION(destroy);
2467f7931b9SBarry Smith   PetscObjectAllocateFortranPointers(*snes,12);
2473f149594SLisandro Dalcin 
2483f149594SLisandro Dalcin   if ((PetscVoidFunction)func == (PetscVoidFunction)snesdefaultconverged_){
2497f7931b9SBarry Smith     *ierr = SNESSetConvergenceTest(*snes,SNESDefaultConverged,0,0);
2503f149594SLisandro Dalcin   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesskipconverged_){
2517f7931b9SBarry Smith     *ierr = SNESSetConvergenceTest(*snes,SNESSkipConverged,0,0);
2528e27ec22SSatish Balay   } else {
253b8ebb45fSBarry Smith     ((PetscObject)*snes)->fortran_func_pointers[1] = (PetscVoidFunction)func;
2547f7931b9SBarry Smith     ((PetscObject)*snes)->fortran_func_pointers[11] = (PetscVoidFunction)cctx;
2553f22127dSBarry Smith     if (!destroy) {
2567f7931b9SBarry Smith       *ierr = SNESSetConvergenceTest(*snes,oursnestest,*snes,PETSC_NULL);
2577f7931b9SBarry Smith     } else {
2587f7931b9SBarry Smith       ((PetscObject)*snes)->fortran_func_pointers[10] = (PetscVoidFunction)destroy;
2597f7931b9SBarry Smith       *ierr = SNESSetConvergenceTest(*snes,oursnestest,*snes,ourdestroy);
2607f7931b9SBarry Smith     }
2618e27ec22SSatish Balay   }
2628e27ec22SSatish Balay }
2638e27ec22SSatish Balay /*----------------------------------------------------------------------*/
2648e27ec22SSatish Balay 
2658e27ec22SSatish Balay void PETSC_STDCALL snesview_(SNES *snes,PetscViewer *viewer, PetscErrorCode *ierr)
2668e27ec22SSatish Balay {
2678e27ec22SSatish Balay   PetscViewer v;
2688e27ec22SSatish Balay   PetscPatchDefaultViewers_Fortran(viewer,v);
2698e27ec22SSatish Balay   *ierr = SNESView(*snes,v);
2708e27ec22SSatish Balay }
2718e27ec22SSatish Balay 
2728e27ec22SSatish Balay /*  func is currently ignored from Fortran */
2738e27ec22SSatish Balay void PETSC_STDCALL snesgetjacobian_(SNES *snes,Mat *A,Mat *B,int *func,void **ctx,PetscErrorCode *ierr)
2748e27ec22SSatish Balay {
2758e27ec22SSatish Balay   CHKFORTRANNULLINTEGER(ctx);
2768e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(A);
2778e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(B);
2788e27ec22SSatish Balay   *ierr = SNESGetJacobian(*snes,A,B,0,ctx);
2798e27ec22SSatish Balay }
2808e27ec22SSatish Balay 
2818e27ec22SSatish Balay void PETSC_STDCALL snesgetconvergencehistory_(SNES *snes,PetscInt *na,PetscErrorCode *ierr)
2828e27ec22SSatish Balay {
2838e27ec22SSatish Balay   *ierr = SNESGetConvergenceHistory(*snes,PETSC_NULL,PETSC_NULL,na);
2848e27ec22SSatish Balay }
2858e27ec22SSatish Balay 
2867f7931b9SBarry Smith void PETSC_STDCALL snessettype_(SNES *snes,CHAR type PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
2878e27ec22SSatish Balay {
2888e27ec22SSatish Balay   char *t;
2898e27ec22SSatish Balay 
2908e27ec22SSatish Balay   FIXCHAR(type,len,t);
2918e27ec22SSatish Balay   *ierr = SNESSetType(*snes,t);
2928e27ec22SSatish Balay   FREECHAR(type,t);
2938e27ec22SSatish Balay }
2948e27ec22SSatish Balay 
2957f7931b9SBarry Smith void PETSC_STDCALL snesappendoptionsprefix_(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 = SNESAppendOptionsPrefix(*snes,t);
3018e27ec22SSatish Balay   FREECHAR(prefix,t);
3028e27ec22SSatish Balay }
3038e27ec22SSatish Balay 
3047f7931b9SBarry Smith void PETSC_STDCALL snessetoptionsprefix_(SNES *snes,CHAR prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
3058e27ec22SSatish Balay {
3068e27ec22SSatish Balay   char *t;
3078e27ec22SSatish Balay 
3088e27ec22SSatish Balay   FIXCHAR(prefix,len,t);
3098e27ec22SSatish Balay   *ierr = SNESSetOptionsPrefix(*snes,t);
3108e27ec22SSatish Balay   FREECHAR(prefix,t);
3118e27ec22SSatish Balay }
3128e27ec22SSatish Balay 
3138e27ec22SSatish Balay /*----------------------------------------------------------------------*/
3148e27ec22SSatish Balay /* functions, hence no STDCALL */
3158e27ec22SSatish Balay 
316a6570f20SBarry Smith void snesmonitorlg_(SNES *snes,PetscInt *its,PetscReal *fgnorm,void *dummy,PetscErrorCode *ierr)
3178e27ec22SSatish Balay {
318a6570f20SBarry Smith   *ierr = SNESMonitorLG(*snes,*its,*fgnorm,dummy);
3198e27ec22SSatish Balay }
3208e27ec22SSatish Balay 
321a6570f20SBarry Smith void snesmonitordefault_(SNES *snes,PetscInt *its,PetscReal *fgnorm,void *dummy,PetscErrorCode *ierr)
3228e27ec22SSatish Balay {
323a6570f20SBarry Smith   *ierr = SNESMonitorDefault(*snes,*its,*fgnorm,dummy);
3248e27ec22SSatish Balay }
3258e27ec22SSatish Balay 
326a6570f20SBarry Smith void snesmonitorsolution_(SNES *snes,PetscInt *its,PetscReal *fgnorm,void *dummy,PetscErrorCode *ierr)
3278e27ec22SSatish Balay {
328a6570f20SBarry Smith   *ierr = SNESMonitorSolution(*snes,*its,*fgnorm,dummy);
3298e27ec22SSatish Balay }
3308e27ec22SSatish Balay 
331a6570f20SBarry Smith void snesmonitorsolutionupdate_(SNES *snes,PetscInt *its,PetscReal *fgnorm,void *dummy,PetscErrorCode *ierr)
3328e27ec22SSatish Balay {
333a6570f20SBarry Smith   *ierr = SNESMonitorSolutionUpdate(*snes,*its,*fgnorm,dummy);
3348e27ec22SSatish Balay }
3358e27ec22SSatish Balay 
3368e27ec22SSatish Balay 
3376895c445SBarry 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)
3388e27ec22SSatish Balay {
3398e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(mctx);
3407f7931b9SBarry Smith   PetscObjectAllocateFortranPointers(*snes,12);
341a6570f20SBarry Smith   if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitordefault_) {
342a6570f20SBarry Smith     *ierr = SNESMonitorSet(*snes,SNESMonitorDefault,0,0);
343a6570f20SBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorsolution_) {
344a6570f20SBarry Smith     *ierr = SNESMonitorSet(*snes,SNESMonitorSolution,0,0);
345a6570f20SBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorsolutionupdate_) {
346a6570f20SBarry Smith     *ierr = SNESMonitorSet(*snes,SNESMonitorSolutionUpdate,0,0);
347a6570f20SBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorlg_) {
348a6570f20SBarry Smith     *ierr = SNESMonitorSet(*snes,SNESMonitorLG,0,0);
3498e27ec22SSatish Balay   } else {
350b8ebb45fSBarry Smith     ((PetscObject)*snes)->fortran_func_pointers[3] = (PetscVoidFunction)func;
351b8ebb45fSBarry Smith     ((PetscObject)*snes)->fortran_func_pointers[4] = (PetscVoidFunction)mctx;
352b8ebb45fSBarry Smith 
3538e27ec22SSatish Balay     if (FORTRANNULLFUNCTION(mondestroy)){
3547f7931b9SBarry Smith       *ierr = SNESMonitorSet(*snes,oursnesmonitor,*snes,PETSC_NULL);
3558e27ec22SSatish Balay     } else {
3565d4ebb51SBarry Smith       CHKFORTRANNULLFUNCTION(mondestroy);
357b8ebb45fSBarry Smith       ((PetscObject)*snes)->fortran_func_pointers[5] = (PetscVoidFunction)mondestroy;
358b8ebb45fSBarry Smith       *ierr = SNESMonitorSet(*snes,oursnesmonitor,*snes,ourmondestroy);
3598e27ec22SSatish Balay     }
3608e27ec22SSatish Balay   }
3618e27ec22SSatish Balay }
3628e27ec22SSatish Balay 
3638e27ec22SSatish Balay 
3648e27ec22SSatish Balay 
3658e27ec22SSatish Balay EXTERN_C_END
366