xref: /petsc/src/snes/interface/ftn-custom/zsnesf.c (revision 3b229b184324e873f97009af709ff34eaf0a3abe)
1b45d2f2cSJed Brown #include <petsc-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 snessetjacobian_                 SNESSETJACOBIAN
108e27ec22SSatish Balay #define snesgetoptionsprefix_            SNESGETOPTIONSPREFIX
118e27ec22SSatish Balay #define snesgettype_                     SNESGETTYPE
128e27ec22SSatish Balay #define snessetfunction_                 SNESSETFUNCTION
13c79ef259SPeter Brune #define snessetgs_                       SNESSETGS
148e27ec22SSatish Balay #define snesgetfunction_                 SNESGETFUNCTION
15c79ef259SPeter Brune #define snesgetgs_                       SNESGETGS
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
30d20b5d95SPeter Brune #define snesgetsneslinesearch_           SNESGETSNESLINESEARCH
318e27ec22SSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
32df66969eSBarry Smith #define matmffdcomputejacobian_          matmffdcomputejacobian
336ce558aeSBarry Smith #define snessolve_                       snessolve
348e27ec22SSatish Balay #define snesdefaultcomputejacobian_      snesdefaultcomputejacobian
358e27ec22SSatish Balay #define snesdefaultcomputejacobiancolor_ snesdefaultcomputejacobiancolor
368e27ec22SSatish Balay #define snessetjacobian_                 snessetjacobian
378e27ec22SSatish Balay #define snesgetoptionsprefix_            snesgetoptionsprefix
388e27ec22SSatish Balay #define snesgettype_                     snesgettype
398e27ec22SSatish Balay #define snessetfunction_                 snessetfunction
40c79ef259SPeter Brune #define snessetgs_                       snessetgs
418e27ec22SSatish Balay #define snesgetfunction_                 snesgetfunction
42c79ef259SPeter Brune #define snesgetgs_                       snesgetgs
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
57*3b229b18SJed Brown #define snesgetsneslinesearch_           snesgetsneslinesearch
588e27ec22SSatish Balay #endif
598e27ec22SSatish Balay 
6090b77ac2SPeter Brune /*
6190b77ac2SPeter Brune snes->fortran_func_pointers usage:
6290b77ac2SPeter Brune 
6390b77ac2SPeter Brune 0: oursnesfunction
6490b77ac2SPeter Brune 1: oursnestest
6590b77ac2SPeter Brune 2: oursnesjacobian
6690b77ac2SPeter Brune 3: oursnesmonitor
6790b77ac2SPeter Brune 4: oursnesmonitor ctx
6890b77ac2SPeter Brune 5: ourmondestroy
6990b77ac2SPeter Brune 6: unused
7090b77ac2SPeter Brune 7: unused
7190b77ac2SPeter Brune 8: unused
7290b77ac2SPeter Brune 9: unused
7390b77ac2SPeter Brune 10: ourdestroy
7490b77ac2SPeter Brune 11: oursnestest ctx
75158f039cSPeter Brune 12: unused
7690b77ac2SPeter Brune 13: oursnesgs
7790b77ac2SPeter Brune 
7890b77ac2SPeter Brune  */
7990b77ac2SPeter Brune 
808e27ec22SSatish Balay static PetscErrorCode oursnesfunction(SNES snes,Vec x,Vec f,void *ctx)
818e27ec22SSatish Balay {
828e27ec22SSatish Balay   PetscErrorCode ierr = 0;
83b8ebb45fSBarry Smith   (*(void (PETSC_STDCALL *)(SNES*,Vec*,Vec*,void*,PetscErrorCode*))(((PetscObject)snes)->fortran_func_pointers[0]))(&snes,&x,&f,ctx,&ierr);CHKERRQ(ierr);
848e27ec22SSatish Balay   return 0;
858e27ec22SSatish Balay }
86b8ebb45fSBarry Smith 
8706ee9f85SBarry Smith static PetscErrorCode oursnestest(SNES snes,PetscInt it,PetscReal a,PetscReal d,PetscReal c,SNESConvergedReason*reason,void*ctx)
888e27ec22SSatish Balay {
898e27ec22SSatish Balay   PetscErrorCode ierr = 0;
906895c445SBarry Smith   void           *mctx = (void*) ((PetscObject)snes)->fortran_func_pointers[11];
916895c445SBarry 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);
927f7931b9SBarry Smith   return 0;
937f7931b9SBarry Smith }
947f7931b9SBarry Smith 
957f7931b9SBarry Smith static PetscErrorCode ourdestroy(void*ctx)
967f7931b9SBarry Smith {
977f7931b9SBarry Smith   PetscErrorCode ierr = 0;
987f7931b9SBarry Smith   SNES           snes = (SNES)ctx;
996895c445SBarry Smith   void           *mctx = (void*) ((PetscObject)snes)->fortran_func_pointers[11];
1006895c445SBarry Smith   (*(void (PETSC_STDCALL *)(void*,PetscErrorCode*))(((PetscObject)snes)->fortran_func_pointers[10]))(mctx,&ierr);CHKERRQ(ierr);
1018e27ec22SSatish Balay   return 0;
1028e27ec22SSatish Balay }
1038e27ec22SSatish Balay 
1048e27ec22SSatish Balay static PetscErrorCode oursnesjacobian(SNES snes,Vec x,Mat* m,Mat* p,MatStructure* type,void*ctx)
1058e27ec22SSatish Balay {
1068e27ec22SSatish Balay   PetscErrorCode ierr = 0;
107b8ebb45fSBarry 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);
1088e27ec22SSatish Balay   return 0;
1098e27ec22SSatish Balay }
11090b77ac2SPeter Brune static PetscErrorCode oursnesgs(SNES snes,Vec x,Vec b,void*ctx)
11190b77ac2SPeter Brune {
11290b77ac2SPeter Brune   PetscErrorCode ierr = 0;
11390b77ac2SPeter Brune   (*(void (PETSC_STDCALL *)(SNES*,Vec*,Vec*,void*,PetscErrorCode*))(((PetscObject)snes)->fortran_func_pointers[13]))(&snes,&x,&b,ctx,&ierr);CHKERRQ(ierr);
11490b77ac2SPeter Brune   return 0;
11590b77ac2SPeter Brune }
1168e27ec22SSatish Balay static PetscErrorCode oursnesmonitor(SNES snes,PetscInt i,PetscReal d,void*ctx)
1178e27ec22SSatish Balay {
1188e27ec22SSatish Balay   PetscErrorCode ierr = 0;
1198e27ec22SSatish Balay 
1206895c445SBarry Smith   void           *mctx = (void*)((PetscObject)snes)->fortran_func_pointers[4];
1216895c445SBarry Smith   (*(void (PETSC_STDCALL *)(SNES*,PetscInt*,PetscReal*,void*,PetscErrorCode*))(((PetscObject)snes)->fortran_func_pointers[3]))(&snes,&i,&d,mctx,&ierr);CHKERRQ(ierr);
1228e27ec22SSatish Balay   return 0;
1238e27ec22SSatish Balay }
124c2efdce3SBarry Smith static PetscErrorCode ourmondestroy(void** ctx)
1258e27ec22SSatish Balay {
1268e27ec22SSatish Balay   PetscErrorCode ierr = 0;
127c2efdce3SBarry Smith   SNES           snes = *(SNES*)ctx;
1286895c445SBarry Smith   void           *mctx = (void*) ((PetscObject)snes)->fortran_func_pointers[4];
1296895c445SBarry Smith   (*(void (PETSC_STDCALL *)(void*,PetscErrorCode*))(((PetscObject)snes)->fortran_func_pointers[5]))(mctx,&ierr);CHKERRQ(ierr);
1308e27ec22SSatish Balay   return 0;
1318e27ec22SSatish Balay }
1328e27ec22SSatish Balay 
1338e27ec22SSatish Balay EXTERN_C_BEGIN
1348e27ec22SSatish Balay /* ---------------------------------------------------------*/
1358e27ec22SSatish Balay /*
1368e27ec22SSatish Balay      snesdefaultcomputejacobian() and snesdefaultcomputejacobiancolor()
1378e27ec22SSatish Balay   These can be used directly from Fortran but are mostly so that
1388e27ec22SSatish Balay   Fortran SNESSetJacobian() will properly handle the defaults being passed in.
1398e27ec22SSatish Balay 
1408e27ec22SSatish Balay   functions, hence no STDCALL
1418e27ec22SSatish Balay */
142df66969eSBarry Smith void matmffdcomputejacobian_(SNES *snes,Vec *x,Mat *m,Mat *p,MatStructure* type,void *ctx,PetscErrorCode *ierr)
143df66969eSBarry Smith {
144df66969eSBarry Smith   *ierr = MatMFFDComputeJacobian(*snes,*x,m,p,type,ctx);
145df66969eSBarry Smith }
1468e27ec22SSatish Balay void snesdefaultcomputejacobian_(SNES *snes,Vec *x,Mat *m,Mat *p,MatStructure* type,void *ctx,PetscErrorCode *ierr)
1478e27ec22SSatish Balay {
1488e27ec22SSatish Balay   *ierr = SNESDefaultComputeJacobian(*snes,*x,m,p,type,ctx);
1498e27ec22SSatish Balay }
1508e27ec22SSatish Balay void  snesdefaultcomputejacobiancolor_(SNES *snes,Vec *x,Mat *m,Mat *p,MatStructure* type,void *ctx,PetscErrorCode *ierr)
1518e27ec22SSatish Balay {
1528e27ec22SSatish Balay   *ierr = SNESDefaultComputeJacobianColor(*snes,*x,m,p,type,*(MatFDColoring*)ctx);
1538e27ec22SSatish Balay }
1548e27ec22SSatish Balay 
1558e27ec22SSatish Balay void PETSC_STDCALL snessetjacobian_(SNES *snes,Mat *A,Mat *B,void (PETSC_STDCALL *func)(SNES*,Vec*,Mat*,Mat*,
1568e27ec22SSatish Balay             MatStructure*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr)
1578e27ec22SSatish Balay {
1588e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(ctx);
159f5b6597dSBarry Smith   CHKFORTRANNULLFUNCTION(func);
16090b77ac2SPeter Brune   PetscObjectAllocateFortranPointers(*snes,14);
161f68b968cSBarry Smith   if ((PetscVoidFunction)func == (PetscVoidFunction)snesdefaultcomputejacobian_) {
1628e27ec22SSatish Balay     *ierr = SNESSetJacobian(*snes,*A,*B,SNESDefaultComputeJacobian,ctx);
163f68b968cSBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesdefaultcomputejacobiancolor_) {
1648e27ec22SSatish Balay     *ierr = SNESSetJacobian(*snes,*A,*B,SNESDefaultComputeJacobianColor,*(MatFDColoring*)ctx);
165df66969eSBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)matmffdcomputejacobian_) {
166df66969eSBarry Smith     *ierr = SNESSetJacobian(*snes,*A,*B,MatMFFDComputeJacobian,ctx);
167f5b6597dSBarry Smith   } else if (!func) {
168f5b6597dSBarry Smith     *ierr = SNESSetJacobian(*snes,*A,*B,0,ctx);
1698e27ec22SSatish Balay   } else {
170b8ebb45fSBarry Smith     ((PetscObject)*snes)->fortran_func_pointers[2] = (PetscVoidFunction)func;
1718e27ec22SSatish Balay     *ierr = SNESSetJacobian(*snes,*A,*B,oursnesjacobian,ctx);
1728e27ec22SSatish Balay   }
1738e27ec22SSatish Balay }
1748e27ec22SSatish Balay /* -------------------------------------------------------------*/
1758e27ec22SSatish Balay 
1766ce558aeSBarry Smith void PETSC_STDCALL   snessolve_(SNES *snes,Vec *b,Vec *x, int *__ierr )
1776ce558aeSBarry Smith {
178a69afd8bSBarry Smith   Vec B = *b,X = *x;
179c8d1aa3aSSatish Balay   if (FORTRANNULLOBJECT(b)) B = PETSC_NULL;
180c8d1aa3aSSatish Balay   if (FORTRANNULLOBJECT(x)) X = PETSC_NULL;
181a69afd8bSBarry Smith   *__ierr = SNESSolve(*snes,B,X);
1826ce558aeSBarry Smith }
1836ce558aeSBarry Smith 
184e1d034e4SBarry Smith void PETSC_STDCALL snesgetoptionsprefix_(SNES *snes,CHAR prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
1858e27ec22SSatish Balay {
1868e27ec22SSatish Balay   const char *tname;
1878e27ec22SSatish Balay 
1888e27ec22SSatish Balay   *ierr = SNESGetOptionsPrefix(*snes,&tname);
1898e27ec22SSatish Balay   *ierr = PetscStrncpy(prefix,tname,len);if (*ierr) return;
1908e27ec22SSatish Balay }
1918e27ec22SSatish Balay 
1927f7931b9SBarry Smith void PETSC_STDCALL snesgettype_(SNES *snes,CHAR name PETSC_MIXED_LEN(len), PetscErrorCode *ierr PETSC_END_LEN(len))
1938e27ec22SSatish Balay {
1948e27ec22SSatish Balay   const char *tname;
1958e27ec22SSatish Balay 
1968e27ec22SSatish Balay   *ierr = SNESGetType(*snes,&tname);
1978e27ec22SSatish Balay   *ierr = PetscStrncpy(name,tname,len);if (*ierr) return;
1987c363081SBarry Smith   FIXRETURNCHAR(PETSC_TRUE,name,len);
1998e27ec22SSatish Balay }
200e3da1266SHong Zhang 
2018e27ec22SSatish Balay /* ---------------------------------------------------------*/
2028e27ec22SSatish Balay 
2038e27ec22SSatish Balay /*
2048e27ec22SSatish Balay    These are not usually called from Fortran but allow Fortran users
2058e27ec22SSatish Balay    to transparently set these monitors from .F code
2068e27ec22SSatish Balay 
2078e27ec22SSatish Balay    functions, hence no STDCALL
2088e27ec22SSatish Balay */
2098e27ec22SSatish Balay 
2102613ca53SBarry Smith void PETSC_STDCALL snessetfunction_(SNES *snes,Vec *r,void (PETSC_STDCALL *func)(SNES*,Vec*,Vec*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr)
2118e27ec22SSatish Balay {
2128e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(ctx);
21390b77ac2SPeter Brune   PetscObjectAllocateFortranPointers(*snes,14);
214b8ebb45fSBarry Smith   ((PetscObject)*snes)->fortran_func_pointers[0] = (PetscVoidFunction)func;
2158e27ec22SSatish Balay   *ierr = SNESSetFunction(*snes,*r,oursnesfunction,ctx);
2168e27ec22SSatish Balay }
217c79ef259SPeter Brune 
218c79ef259SPeter Brune 
219c79ef259SPeter Brune void PETSC_STDCALL snessetgs_(SNES *snes,void (PETSC_STDCALL *func)(SNES*,Vec*,Vec*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr)
220c79ef259SPeter Brune {
221c79ef259SPeter Brune   CHKFORTRANNULLOBJECT(ctx);
22290b77ac2SPeter Brune   PetscObjectAllocateFortranPointers(*snes,14);
22390b77ac2SPeter Brune   ((PetscObject)*snes)->fortran_func_pointers[13] = (PetscVoidFunction)func;
22490b77ac2SPeter Brune   *ierr = SNESSetGS(*snes,oursnesgs,ctx);
225c79ef259SPeter Brune }
2268e27ec22SSatish Balay /* ---------------------------------------------------------*/
2278e27ec22SSatish Balay 
2288e27ec22SSatish Balay /* the func argument is ignored */
2298e27ec22SSatish Balay void PETSC_STDCALL snesgetfunction_(SNES *snes,Vec *r,void *func,void **ctx,PetscErrorCode *ierr)
2308e27ec22SSatish Balay {
2318e27ec22SSatish Balay   CHKFORTRANNULLINTEGER(ctx);
2328e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(r);
2338e27ec22SSatish Balay   *ierr = SNESGetFunction(*snes,r,PETSC_NULL,ctx);
2348e27ec22SSatish Balay }
235c79ef259SPeter Brune 
236c79ef259SPeter Brune void PETSC_STDCALL snesgetgs_(SNES *snes,void *func,void **ctx,PetscErrorCode *ierr)
237c79ef259SPeter Brune {
238c79ef259SPeter Brune   CHKFORTRANNULLINTEGER(ctx);
239c79ef259SPeter Brune   *ierr = SNESGetGS(*snes,PETSC_NULL,ctx);
240c79ef259SPeter Brune }
241c79ef259SPeter Brune 
2428e27ec22SSatish Balay /*----------------------------------------------------------------------*/
2438e27ec22SSatish Balay 
2447f7931b9SBarry Smith void snesdefaultconverged_(SNES *snes,PetscInt *it,PetscReal *a,PetscReal *b,PetscReal *c,SNESConvergedReason *r, void *ct,PetscErrorCode *ierr)
2453f149594SLisandro Dalcin {
2463f149594SLisandro Dalcin   *ierr = SNESDefaultConverged(*snes,*it,*a,*b,*c,r,ct);
2473f149594SLisandro Dalcin }
2483f149594SLisandro Dalcin 
2493f149594SLisandro Dalcin void snesskipconverged_(SNES *snes,PetscInt *it,PetscReal *a,PetscReal *b,PetscReal *c,SNESConvergedReason *r,
2503f149594SLisandro Dalcin                                        void *ct,PetscErrorCode *ierr)
2513f149594SLisandro Dalcin {
2523f149594SLisandro Dalcin   *ierr = SNESSkipConverged(*snes,*it,*a,*b,*c,r,ct);
2533f149594SLisandro Dalcin }
2543f149594SLisandro Dalcin 
2557f7931b9SBarry 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)
2568e27ec22SSatish Balay {
2578e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(cctx);
2583f22127dSBarry Smith   CHKFORTRANNULLFUNCTION(destroy);
25990b77ac2SPeter Brune   PetscObjectAllocateFortranPointers(*snes,14);
2603f149594SLisandro Dalcin 
2613f149594SLisandro Dalcin   if ((PetscVoidFunction)func == (PetscVoidFunction)snesdefaultconverged_){
2627f7931b9SBarry Smith     *ierr = SNESSetConvergenceTest(*snes,SNESDefaultConverged,0,0);
2633f149594SLisandro Dalcin   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesskipconverged_){
2647f7931b9SBarry Smith     *ierr = SNESSetConvergenceTest(*snes,SNESSkipConverged,0,0);
2658e27ec22SSatish Balay   } else {
266b8ebb45fSBarry Smith     ((PetscObject)*snes)->fortran_func_pointers[1] = (PetscVoidFunction)func;
2677f7931b9SBarry Smith     ((PetscObject)*snes)->fortran_func_pointers[11] = (PetscVoidFunction)cctx;
2683f22127dSBarry Smith     if (!destroy) {
2697f7931b9SBarry Smith       *ierr = SNESSetConvergenceTest(*snes,oursnestest,*snes,PETSC_NULL);
2707f7931b9SBarry Smith     } else {
2717f7931b9SBarry Smith       ((PetscObject)*snes)->fortran_func_pointers[10] = (PetscVoidFunction)destroy;
2727f7931b9SBarry Smith       *ierr = SNESSetConvergenceTest(*snes,oursnestest,*snes,ourdestroy);
2737f7931b9SBarry Smith     }
2748e27ec22SSatish Balay   }
2758e27ec22SSatish Balay }
2768e27ec22SSatish Balay /*----------------------------------------------------------------------*/
2778e27ec22SSatish Balay 
2788e27ec22SSatish Balay void PETSC_STDCALL snesview_(SNES *snes,PetscViewer *viewer, PetscErrorCode *ierr)
2798e27ec22SSatish Balay {
2808e27ec22SSatish Balay   PetscViewer v;
2818e27ec22SSatish Balay   PetscPatchDefaultViewers_Fortran(viewer,v);
2828e27ec22SSatish Balay   *ierr = SNESView(*snes,v);
2838e27ec22SSatish Balay }
2848e27ec22SSatish Balay 
2858e27ec22SSatish Balay /*  func is currently ignored from Fortran */
2868e27ec22SSatish Balay void PETSC_STDCALL snesgetjacobian_(SNES *snes,Mat *A,Mat *B,int *func,void **ctx,PetscErrorCode *ierr)
2878e27ec22SSatish Balay {
2888e27ec22SSatish Balay   CHKFORTRANNULLINTEGER(ctx);
2898e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(A);
2908e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(B);
2918e27ec22SSatish Balay   *ierr = SNESGetJacobian(*snes,A,B,0,ctx);
2928e27ec22SSatish Balay }
2938e27ec22SSatish Balay 
2948e27ec22SSatish Balay void PETSC_STDCALL snesgetconvergencehistory_(SNES *snes,PetscInt *na,PetscErrorCode *ierr)
2958e27ec22SSatish Balay {
2968e27ec22SSatish Balay   *ierr = SNESGetConvergenceHistory(*snes,PETSC_NULL,PETSC_NULL,na);
2978e27ec22SSatish Balay }
2988e27ec22SSatish Balay 
2997f7931b9SBarry Smith void PETSC_STDCALL snessettype_(SNES *snes,CHAR type PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
3008e27ec22SSatish Balay {
3018e27ec22SSatish Balay   char *t;
3028e27ec22SSatish Balay 
3038e27ec22SSatish Balay   FIXCHAR(type,len,t);
3048e27ec22SSatish Balay   *ierr = SNESSetType(*snes,t);
3058e27ec22SSatish Balay   FREECHAR(type,t);
3068e27ec22SSatish Balay }
3078e27ec22SSatish Balay 
3087f7931b9SBarry Smith void PETSC_STDCALL snesappendoptionsprefix_(SNES *snes,CHAR prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
3098e27ec22SSatish Balay {
3108e27ec22SSatish Balay   char *t;
3118e27ec22SSatish Balay 
3128e27ec22SSatish Balay   FIXCHAR(prefix,len,t);
3138e27ec22SSatish Balay   *ierr = SNESAppendOptionsPrefix(*snes,t);
3148e27ec22SSatish Balay   FREECHAR(prefix,t);
3158e27ec22SSatish Balay }
3168e27ec22SSatish Balay 
3177f7931b9SBarry Smith void PETSC_STDCALL snessetoptionsprefix_(SNES *snes,CHAR prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
3188e27ec22SSatish Balay {
3198e27ec22SSatish Balay   char *t;
3208e27ec22SSatish Balay 
3218e27ec22SSatish Balay   FIXCHAR(prefix,len,t);
3228e27ec22SSatish Balay   *ierr = SNESSetOptionsPrefix(*snes,t);
3238e27ec22SSatish Balay   FREECHAR(prefix,t);
3248e27ec22SSatish Balay }
3258e27ec22SSatish Balay 
3268e27ec22SSatish Balay /*----------------------------------------------------------------------*/
3278e27ec22SSatish Balay /* functions, hence no STDCALL */
3288e27ec22SSatish Balay 
329a6570f20SBarry Smith void snesmonitorlg_(SNES *snes,PetscInt *its,PetscReal *fgnorm,void *dummy,PetscErrorCode *ierr)
3308e27ec22SSatish Balay {
331a6570f20SBarry Smith   *ierr = SNESMonitorLG(*snes,*its,*fgnorm,dummy);
3328e27ec22SSatish Balay }
3338e27ec22SSatish Balay 
334a6570f20SBarry Smith void snesmonitordefault_(SNES *snes,PetscInt *its,PetscReal *fgnorm,void *dummy,PetscErrorCode *ierr)
3358e27ec22SSatish Balay {
336a6570f20SBarry Smith   *ierr = SNESMonitorDefault(*snes,*its,*fgnorm,dummy);
3378e27ec22SSatish Balay }
3388e27ec22SSatish Balay 
339a6570f20SBarry Smith void snesmonitorsolution_(SNES *snes,PetscInt *its,PetscReal *fgnorm,void *dummy,PetscErrorCode *ierr)
3408e27ec22SSatish Balay {
341a6570f20SBarry Smith   *ierr = SNESMonitorSolution(*snes,*its,*fgnorm,dummy);
3428e27ec22SSatish Balay }
3438e27ec22SSatish Balay 
344a6570f20SBarry Smith void snesmonitorsolutionupdate_(SNES *snes,PetscInt *its,PetscReal *fgnorm,void *dummy,PetscErrorCode *ierr)
3458e27ec22SSatish Balay {
346a6570f20SBarry Smith   *ierr = SNESMonitorSolutionUpdate(*snes,*its,*fgnorm,dummy);
3478e27ec22SSatish Balay }
3488e27ec22SSatish Balay 
3498e27ec22SSatish Balay 
3506895c445SBarry 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)
3518e27ec22SSatish Balay {
3528e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(mctx);
35390b77ac2SPeter Brune   PetscObjectAllocateFortranPointers(*snes,14);
354a6570f20SBarry Smith   if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitordefault_) {
355a6570f20SBarry Smith     *ierr = SNESMonitorSet(*snes,SNESMonitorDefault,0,0);
356a6570f20SBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorsolution_) {
357a6570f20SBarry Smith     *ierr = SNESMonitorSet(*snes,SNESMonitorSolution,0,0);
358a6570f20SBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorsolutionupdate_) {
359a6570f20SBarry Smith     *ierr = SNESMonitorSet(*snes,SNESMonitorSolutionUpdate,0,0);
360a6570f20SBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorlg_) {
361a6570f20SBarry Smith     *ierr = SNESMonitorSet(*snes,SNESMonitorLG,0,0);
3628e27ec22SSatish Balay   } else {
363b8ebb45fSBarry Smith     ((PetscObject)*snes)->fortran_func_pointers[3] = (PetscVoidFunction)func;
364b8ebb45fSBarry Smith     ((PetscObject)*snes)->fortran_func_pointers[4] = (PetscVoidFunction)mctx;
365b8ebb45fSBarry Smith 
3668e27ec22SSatish Balay     if (FORTRANNULLFUNCTION(mondestroy)){
3677f7931b9SBarry Smith       *ierr = SNESMonitorSet(*snes,oursnesmonitor,*snes,PETSC_NULL);
3688e27ec22SSatish Balay     } else {
3695d4ebb51SBarry Smith       CHKFORTRANNULLFUNCTION(mondestroy);
370b8ebb45fSBarry Smith       ((PetscObject)*snes)->fortran_func_pointers[5] = (PetscVoidFunction)mondestroy;
371b8ebb45fSBarry Smith       *ierr = SNESMonitorSet(*snes,oursnesmonitor,*snes,ourmondestroy);
3728e27ec22SSatish Balay     }
3738e27ec22SSatish Balay   }
3748e27ec22SSatish Balay }
3758e27ec22SSatish Balay 
376f1c6b773SPeter Brune void PETSC_STDCALL  snesgetsneslinesearch_(SNES *snes,SNESLineSearch *linesearch, int *__ierr ){
377f1c6b773SPeter Brune *__ierr = SNESGetSNESLineSearch(*snes, linesearch);
378ea5d4fccSPeter Brune }
3798e27ec22SSatish Balay 
3808e27ec22SSatish Balay EXTERN_C_END
381