xref: /petsc/src/snes/interface/ftn-custom/zsnesf.c (revision d20b5d95fb5ed4c01fb0da19d63ae2a035fb24e8)
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
9837ad101SBarry Smith #define snesdmdacomputejacobian_           SNESDMDACOMPUTEJACOBIAN
10837ad101SBarry Smith #define snesdmdacomputejacobianwithadifor_ SNESDMDACOMPUTEJACOBIANWITHADIFOR
118e27ec22SSatish Balay #define snessetjacobian_                 SNESSETJACOBIAN
128e27ec22SSatish Balay #define snesgetoptionsprefix_            SNESGETOPTIONSPREFIX
138e27ec22SSatish Balay #define snesgettype_                     SNESGETTYPE
14837ad101SBarry Smith #define snesdmdacomputefunction_              SNESDMDACOMPUTEFUNCTION
158e27ec22SSatish Balay #define snessetfunction_                 SNESSETFUNCTION
16c79ef259SPeter Brune #define snessetgs_                       SNESSETGS
178e27ec22SSatish Balay #define snesgetfunction_                 SNESGETFUNCTION
18c79ef259SPeter Brune #define snesgetgs_                       SNESGETGS
198e27ec22SSatish Balay #define snessetconvergencetest_          SNESSETCONVERGENCETEST
203f149594SLisandro Dalcin #define snesdefaultconverged_            SNESDEFAULTCONVERGED
213f149594SLisandro Dalcin #define snesskipconverged_               SNESSKIPCONVERGED
228e27ec22SSatish Balay #define snesview_                        SNESVIEW
238e27ec22SSatish Balay #define snesgetconvergencehistory_       SNESGETCONVERGENCEHISTORY
248e27ec22SSatish Balay #define snesgetjacobian_                 SNESGETJACOBIAN
258e27ec22SSatish Balay #define snessettype_                     SNESSETTYPE
268e27ec22SSatish Balay #define snesappendoptionsprefix_         SNESAPPENDOPTIONSPREFIX
278e27ec22SSatish Balay #define snessetoptionsprefix_            SNESSETOPTIONSPREFIX
28a6570f20SBarry Smith #define snesmonitordefault_              SNESMONITORDEFAULT
29a6570f20SBarry Smith #define snesmonitorsolution_             SNESMONITORSOLUTION
30a6570f20SBarry Smith #define snesmonitorlg_                   SNESMONITORLG
31a6570f20SBarry Smith #define snesmonitorsolutionupdate_       SNESMONITORSOLUTIONUPDATE
32a6570f20SBarry Smith #define snesmonitorset_                  SNESMONITORSET
33*d20b5d95SPeter Brune #define snesgetsneslinesearch_           SNESGETSNESLINESEARCH
348e27ec22SSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
35df66969eSBarry Smith #define matmffdcomputejacobian_          matmffdcomputejacobian
366ce558aeSBarry Smith #define snessolve_                       snessolve
378e27ec22SSatish Balay #define snesdefaultcomputejacobian_      snesdefaultcomputejacobian
388e27ec22SSatish Balay #define snesdefaultcomputejacobiancolor_ snesdefaultcomputejacobiancolor
39837ad101SBarry Smith #define snesdmdacomputejacobian_           snesdmdacomputejacobian
40837ad101SBarry Smith #define snesdmdacomputejacobianwithadifor_ snesdmdacomputejacobianwithadifor
418e27ec22SSatish Balay #define snessetjacobian_                 snessetjacobian
428e27ec22SSatish Balay #define snesgetoptionsprefix_            snesgetoptionsprefix
438e27ec22SSatish Balay #define snesgettype_                     snesgettype
44837ad101SBarry Smith #define snesdmdacomputefunction_              snesdmdacomputefunction
458e27ec22SSatish Balay #define snessetfunction_                 snessetfunction
46c79ef259SPeter Brune #define snessetgs_                       snessetgs
478e27ec22SSatish Balay #define snesgetfunction_                 snesgetfunction
48c79ef259SPeter Brune #define snesgetgs_                       snesgetgs
498e27ec22SSatish Balay #define snessetconvergencetest_          snessetconvergencetest
503f149594SLisandro Dalcin #define snesdefaultconverged_            snesdefaultconverged
513f149594SLisandro Dalcin #define snesskipconverged_               snesskipconverged
528e27ec22SSatish Balay #define snesview_                        snesview
538e27ec22SSatish Balay #define snesgetjacobian_                 snesgetjacobian
548e27ec22SSatish Balay #define snesgetconvergencehistory_       snesgetconvergencehistory
558e27ec22SSatish Balay #define snessettype_                     snessettype
568e27ec22SSatish Balay #define snesappendoptionsprefix_         snesappendoptionsprefix
578e27ec22SSatish Balay #define snessetoptionsprefix_            snessetoptionsprefix
58a6570f20SBarry Smith #define snesmonitorlg_                   snesmonitorlg
59a6570f20SBarry Smith #define snesmonitordefault_              snesmonitordefault
60a6570f20SBarry Smith #define snesmonitorsolution_             snesmonitorsolution
61a6570f20SBarry Smith #define snesmonitorsolutionupdate_       snesmonitorsolutionupdate
62a6570f20SBarry Smith #define snesmonitorset_                  snesmonitorset
63f1c6b773SPeter Brune #define snesgetsneslinesearch            snesgetsneslinesearch
648e27ec22SSatish Balay #endif
658e27ec22SSatish Balay 
668e27ec22SSatish Balay static PetscErrorCode oursnesfunction(SNES snes,Vec x,Vec f,void *ctx)
678e27ec22SSatish Balay {
688e27ec22SSatish Balay   PetscErrorCode ierr = 0;
69b8ebb45fSBarry Smith   (*(void (PETSC_STDCALL *)(SNES*,Vec*,Vec*,void*,PetscErrorCode*))(((PetscObject)snes)->fortran_func_pointers[0]))(&snes,&x,&f,ctx,&ierr);CHKERRQ(ierr);
708e27ec22SSatish Balay   return 0;
718e27ec22SSatish Balay }
72b8ebb45fSBarry Smith 
7306ee9f85SBarry Smith static PetscErrorCode oursnestest(SNES snes,PetscInt it,PetscReal a,PetscReal d,PetscReal c,SNESConvergedReason*reason,void*ctx)
748e27ec22SSatish Balay {
758e27ec22SSatish Balay   PetscErrorCode ierr = 0;
766895c445SBarry Smith   void           *mctx = (void*) ((PetscObject)snes)->fortran_func_pointers[11];
776895c445SBarry 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);
787f7931b9SBarry Smith   return 0;
797f7931b9SBarry Smith }
807f7931b9SBarry Smith 
817f7931b9SBarry Smith static PetscErrorCode ourdestroy(void*ctx)
827f7931b9SBarry Smith {
837f7931b9SBarry Smith   PetscErrorCode ierr = 0;
847f7931b9SBarry Smith   SNES           snes = (SNES)ctx;
856895c445SBarry Smith   void           *mctx = (void*) ((PetscObject)snes)->fortran_func_pointers[11];
866895c445SBarry Smith   (*(void (PETSC_STDCALL *)(void*,PetscErrorCode*))(((PetscObject)snes)->fortran_func_pointers[10]))(mctx,&ierr);CHKERRQ(ierr);
878e27ec22SSatish Balay   return 0;
888e27ec22SSatish Balay }
898e27ec22SSatish Balay 
908e27ec22SSatish Balay static PetscErrorCode oursnesjacobian(SNES snes,Vec x,Mat* m,Mat* p,MatStructure* type,void*ctx)
918e27ec22SSatish Balay {
928e27ec22SSatish Balay   PetscErrorCode ierr = 0;
93b8ebb45fSBarry 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);
948e27ec22SSatish Balay   return 0;
958e27ec22SSatish Balay }
968e27ec22SSatish Balay static PetscErrorCode oursnesmonitor(SNES snes,PetscInt i,PetscReal d,void*ctx)
978e27ec22SSatish Balay {
988e27ec22SSatish Balay   PetscErrorCode ierr = 0;
998e27ec22SSatish Balay 
1006895c445SBarry Smith   void           *mctx = (void*)((PetscObject)snes)->fortran_func_pointers[4];
1016895c445SBarry Smith   (*(void (PETSC_STDCALL *)(SNES*,PetscInt*,PetscReal*,void*,PetscErrorCode*))(((PetscObject)snes)->fortran_func_pointers[3]))(&snes,&i,&d,mctx,&ierr);CHKERRQ(ierr);
1028e27ec22SSatish Balay   return 0;
1038e27ec22SSatish Balay }
104c2efdce3SBarry Smith static PetscErrorCode ourmondestroy(void** ctx)
1058e27ec22SSatish Balay {
1068e27ec22SSatish Balay   PetscErrorCode ierr = 0;
107c2efdce3SBarry Smith   SNES           snes = *(SNES*)ctx;
1086895c445SBarry Smith   void           *mctx = (void*) ((PetscObject)snes)->fortran_func_pointers[4];
1096895c445SBarry Smith   (*(void (PETSC_STDCALL *)(void*,PetscErrorCode*))(((PetscObject)snes)->fortran_func_pointers[5]))(mctx,&ierr);CHKERRQ(ierr);
1108e27ec22SSatish Balay   return 0;
1118e27ec22SSatish Balay }
1128e27ec22SSatish Balay 
1138e27ec22SSatish Balay EXTERN_C_BEGIN
1148e27ec22SSatish Balay /* ---------------------------------------------------------*/
1158e27ec22SSatish Balay /*
1168e27ec22SSatish Balay      snesdefaultcomputejacobian() and snesdefaultcomputejacobiancolor()
1178e27ec22SSatish Balay   These can be used directly from Fortran but are mostly so that
1188e27ec22SSatish Balay   Fortran SNESSetJacobian() will properly handle the defaults being passed in.
1198e27ec22SSatish Balay 
1208e27ec22SSatish Balay   functions, hence no STDCALL
1218e27ec22SSatish Balay */
122df66969eSBarry Smith void matmffdcomputejacobian_(SNES *snes,Vec *x,Mat *m,Mat *p,MatStructure* type,void *ctx,PetscErrorCode *ierr)
123df66969eSBarry Smith {
124df66969eSBarry Smith   *ierr = MatMFFDComputeJacobian(*snes,*x,m,p,type,ctx);
125df66969eSBarry Smith }
1268e27ec22SSatish Balay void snesdefaultcomputejacobian_(SNES *snes,Vec *x,Mat *m,Mat *p,MatStructure* type,void *ctx,PetscErrorCode *ierr)
1278e27ec22SSatish Balay {
1288e27ec22SSatish Balay   *ierr = SNESDefaultComputeJacobian(*snes,*x,m,p,type,ctx);
1298e27ec22SSatish Balay }
1308e27ec22SSatish Balay void  snesdefaultcomputejacobiancolor_(SNES *snes,Vec *x,Mat *m,Mat *p,MatStructure* type,void *ctx,PetscErrorCode *ierr)
1318e27ec22SSatish Balay {
1328e27ec22SSatish Balay   *ierr = SNESDefaultComputeJacobianColor(*snes,*x,m,p,type,*(MatFDColoring*)ctx);
1338e27ec22SSatish Balay }
1348e27ec22SSatish Balay 
135837ad101SBarry Smith void  snesdmdacomputejacobianwithadifor_(SNES *snes,Vec *X,Mat *m,Mat *p,MatStructure* type,void *ctx,PetscErrorCode *ierr)
1368e27ec22SSatish Balay {
1378e27ec22SSatish Balay   (*PetscErrorPrintf)("Cannot call this function from Fortran");
1388e27ec22SSatish Balay   *ierr = 1;
1398e27ec22SSatish Balay }
1408e27ec22SSatish Balay 
141837ad101SBarry Smith void  snesdmdacomputejacobian_(SNES *snes,Vec *X,Mat *m,Mat *p,MatStructure* type,void *ctx,PetscErrorCode *ierr)
1428e27ec22SSatish Balay {
1438e27ec22SSatish Balay   (*PetscErrorPrintf)("Cannot call this function from Fortran");
1448e27ec22SSatish Balay   *ierr = 1;
1458e27ec22SSatish Balay }
1468e27ec22SSatish Balay 
1478e27ec22SSatish Balay void PETSC_STDCALL snessetjacobian_(SNES *snes,Mat *A,Mat *B,void (PETSC_STDCALL *func)(SNES*,Vec*,Mat*,Mat*,
1488e27ec22SSatish Balay             MatStructure*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr)
1498e27ec22SSatish Balay {
1508e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(ctx);
151f5b6597dSBarry Smith   CHKFORTRANNULLFUNCTION(func);
1527f7931b9SBarry Smith   PetscObjectAllocateFortranPointers(*snes,12);
153f68b968cSBarry Smith   if ((PetscVoidFunction)func == (PetscVoidFunction)snesdefaultcomputejacobian_) {
1548e27ec22SSatish Balay     *ierr = SNESSetJacobian(*snes,*A,*B,SNESDefaultComputeJacobian,ctx);
155f68b968cSBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesdefaultcomputejacobiancolor_) {
1568e27ec22SSatish Balay     *ierr = SNESSetJacobian(*snes,*A,*B,SNESDefaultComputeJacobianColor,*(MatFDColoring*)ctx);
157837ad101SBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesdmdacomputejacobianwithadifor_) {
158837ad101SBarry Smith     *ierr = SNESSetJacobian(*snes,*A,*B,SNESDMDAComputeJacobianWithAdifor,ctx);
159837ad101SBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesdmdacomputejacobian_) {
160837ad101SBarry Smith     *ierr = SNESSetJacobian(*snes,*A,*B,SNESDMDAComputeJacobian,ctx);
161df66969eSBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)matmffdcomputejacobian_) {
162df66969eSBarry Smith     *ierr = SNESSetJacobian(*snes,*A,*B,MatMFFDComputeJacobian,ctx);
163f5b6597dSBarry Smith   } else if (!func) {
164f5b6597dSBarry Smith     *ierr = SNESSetJacobian(*snes,*A,*B,0,ctx);
1658e27ec22SSatish Balay   } else {
166b8ebb45fSBarry Smith     ((PetscObject)*snes)->fortran_func_pointers[2] = (PetscVoidFunction)func;
1678e27ec22SSatish Balay     *ierr = SNESSetJacobian(*snes,*A,*B,oursnesjacobian,ctx);
1688e27ec22SSatish Balay   }
1698e27ec22SSatish Balay }
1708e27ec22SSatish Balay /* -------------------------------------------------------------*/
1718e27ec22SSatish Balay 
1726ce558aeSBarry Smith void PETSC_STDCALL   snessolve_(SNES *snes,Vec *b,Vec *x, int *__ierr )
1736ce558aeSBarry Smith {
174a69afd8bSBarry Smith   Vec B = *b,X = *x;
175c8d1aa3aSSatish Balay   if (FORTRANNULLOBJECT(b)) B = PETSC_NULL;
176c8d1aa3aSSatish Balay   if (FORTRANNULLOBJECT(x)) X = PETSC_NULL;
177a69afd8bSBarry Smith   *__ierr = SNESSolve(*snes,B,X);
1786ce558aeSBarry Smith }
1796ce558aeSBarry Smith 
180e1d034e4SBarry Smith void PETSC_STDCALL snesgetoptionsprefix_(SNES *snes,CHAR prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
1818e27ec22SSatish Balay {
1828e27ec22SSatish Balay   const char *tname;
1838e27ec22SSatish Balay 
1848e27ec22SSatish Balay   *ierr = SNESGetOptionsPrefix(*snes,&tname);
1858e27ec22SSatish Balay   *ierr = PetscStrncpy(prefix,tname,len);if (*ierr) return;
1868e27ec22SSatish Balay }
1878e27ec22SSatish Balay 
1887f7931b9SBarry Smith void PETSC_STDCALL snesgettype_(SNES *snes,CHAR name PETSC_MIXED_LEN(len), PetscErrorCode *ierr PETSC_END_LEN(len))
1898e27ec22SSatish Balay {
1908e27ec22SSatish Balay   const char *tname;
1918e27ec22SSatish Balay 
1928e27ec22SSatish Balay   *ierr = SNESGetType(*snes,&tname);
1938e27ec22SSatish Balay   *ierr = PetscStrncpy(name,tname,len);if (*ierr) return;
1947c363081SBarry Smith   FIXRETURNCHAR(PETSC_TRUE,name,len);
1958e27ec22SSatish Balay }
196e3da1266SHong Zhang 
1978e27ec22SSatish Balay /* ---------------------------------------------------------*/
1988e27ec22SSatish Balay 
1998e27ec22SSatish Balay /*
2008e27ec22SSatish Balay    These are not usually called from Fortran but allow Fortran users
2018e27ec22SSatish Balay    to transparently set these monitors from .F code
2028e27ec22SSatish Balay 
2038e27ec22SSatish Balay    functions, hence no STDCALL
2048e27ec22SSatish Balay */
205837ad101SBarry Smith void  snesdmdacomputefunction_(SNES *snes,Vec *X, Vec *F,void *ptr,PetscErrorCode *ierr)
2068e27ec22SSatish Balay {
207837ad101SBarry Smith   *ierr = SNESDMDAComputeFunction(*snes,*X,*F,ptr);
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);
2137f7931b9SBarry Smith   PetscObjectAllocateFortranPointers(*snes,12);
214837ad101SBarry Smith   if ((PetscVoidFunction)func == (PetscVoidFunction)snesdmdacomputefunction_) {
215837ad101SBarry Smith     *ierr = SNESSetFunction(*snes,*r,SNESDMDAComputeFunction,ctx);
2168e27ec22SSatish Balay   } else {
217b8ebb45fSBarry Smith     ((PetscObject)*snes)->fortran_func_pointers[0] = (PetscVoidFunction)func;
2188e27ec22SSatish Balay     *ierr = SNESSetFunction(*snes,*r,oursnesfunction,ctx);
2198e27ec22SSatish Balay   }
2208e27ec22SSatish Balay }
221c79ef259SPeter Brune 
222c79ef259SPeter Brune 
223c79ef259SPeter Brune void PETSC_STDCALL snessetgs_(SNES *snes,void (PETSC_STDCALL *func)(SNES*,Vec*,Vec*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr)
224c79ef259SPeter Brune {
225c79ef259SPeter Brune   CHKFORTRANNULLOBJECT(ctx);
226c79ef259SPeter Brune   PetscObjectAllocateFortranPointers(*snes,12);
227837ad101SBarry Smith   if ((PetscVoidFunction)func == (PetscVoidFunction)snesdmdacomputefunction_) {
228837ad101SBarry Smith     *ierr = SNESSetGS(*snes,SNESDMDAComputeFunction,ctx);
229c79ef259SPeter Brune   } else {
230c79ef259SPeter Brune     ((PetscObject)*snes)->fortran_func_pointers[0] = (PetscVoidFunction)func;
231c79ef259SPeter Brune     *ierr = SNESSetGS(*snes,oursnesfunction,ctx);
232c79ef259SPeter Brune   }
233c79ef259SPeter Brune }
2348e27ec22SSatish Balay /* ---------------------------------------------------------*/
2358e27ec22SSatish Balay 
2368e27ec22SSatish Balay /* the func argument is ignored */
2378e27ec22SSatish Balay void PETSC_STDCALL snesgetfunction_(SNES *snes,Vec *r,void *func,void **ctx,PetscErrorCode *ierr)
2388e27ec22SSatish Balay {
2398e27ec22SSatish Balay   CHKFORTRANNULLINTEGER(ctx);
2408e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(r);
2418e27ec22SSatish Balay   *ierr = SNESGetFunction(*snes,r,PETSC_NULL,ctx);
2428e27ec22SSatish Balay }
243c79ef259SPeter Brune 
244c79ef259SPeter Brune void PETSC_STDCALL snesgetgs_(SNES *snes,void *func,void **ctx,PetscErrorCode *ierr)
245c79ef259SPeter Brune {
246c79ef259SPeter Brune   CHKFORTRANNULLINTEGER(ctx);
247c79ef259SPeter Brune   *ierr = SNESGetGS(*snes,PETSC_NULL,ctx);
248c79ef259SPeter Brune }
249c79ef259SPeter Brune 
2508e27ec22SSatish Balay /*----------------------------------------------------------------------*/
2518e27ec22SSatish Balay 
2527f7931b9SBarry Smith void snesdefaultconverged_(SNES *snes,PetscInt *it,PetscReal *a,PetscReal *b,PetscReal *c,SNESConvergedReason *r, void *ct,PetscErrorCode *ierr)
2533f149594SLisandro Dalcin {
2543f149594SLisandro Dalcin   *ierr = SNESDefaultConverged(*snes,*it,*a,*b,*c,r,ct);
2553f149594SLisandro Dalcin }
2563f149594SLisandro Dalcin 
2573f149594SLisandro Dalcin void snesskipconverged_(SNES *snes,PetscInt *it,PetscReal *a,PetscReal *b,PetscReal *c,SNESConvergedReason *r,
2583f149594SLisandro Dalcin                                        void *ct,PetscErrorCode *ierr)
2593f149594SLisandro Dalcin {
2603f149594SLisandro Dalcin   *ierr = SNESSkipConverged(*snes,*it,*a,*b,*c,r,ct);
2613f149594SLisandro Dalcin }
2623f149594SLisandro Dalcin 
2637f7931b9SBarry 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)
2648e27ec22SSatish Balay {
2658e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(cctx);
2663f22127dSBarry Smith   CHKFORTRANNULLFUNCTION(destroy);
2677f7931b9SBarry Smith   PetscObjectAllocateFortranPointers(*snes,12);
2683f149594SLisandro Dalcin 
2693f149594SLisandro Dalcin   if ((PetscVoidFunction)func == (PetscVoidFunction)snesdefaultconverged_){
2707f7931b9SBarry Smith     *ierr = SNESSetConvergenceTest(*snes,SNESDefaultConverged,0,0);
2713f149594SLisandro Dalcin   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesskipconverged_){
2727f7931b9SBarry Smith     *ierr = SNESSetConvergenceTest(*snes,SNESSkipConverged,0,0);
2738e27ec22SSatish Balay   } else {
274b8ebb45fSBarry Smith     ((PetscObject)*snes)->fortran_func_pointers[1] = (PetscVoidFunction)func;
2757f7931b9SBarry Smith     ((PetscObject)*snes)->fortran_func_pointers[11] = (PetscVoidFunction)cctx;
2763f22127dSBarry Smith     if (!destroy) {
2777f7931b9SBarry Smith       *ierr = SNESSetConvergenceTest(*snes,oursnestest,*snes,PETSC_NULL);
2787f7931b9SBarry Smith     } else {
2797f7931b9SBarry Smith       ((PetscObject)*snes)->fortran_func_pointers[10] = (PetscVoidFunction)destroy;
2807f7931b9SBarry Smith       *ierr = SNESSetConvergenceTest(*snes,oursnestest,*snes,ourdestroy);
2817f7931b9SBarry Smith     }
2828e27ec22SSatish Balay   }
2838e27ec22SSatish Balay }
2848e27ec22SSatish Balay /*----------------------------------------------------------------------*/
2858e27ec22SSatish Balay 
2868e27ec22SSatish Balay void PETSC_STDCALL snesview_(SNES *snes,PetscViewer *viewer, PetscErrorCode *ierr)
2878e27ec22SSatish Balay {
2888e27ec22SSatish Balay   PetscViewer v;
2898e27ec22SSatish Balay   PetscPatchDefaultViewers_Fortran(viewer,v);
2908e27ec22SSatish Balay   *ierr = SNESView(*snes,v);
2918e27ec22SSatish Balay }
2928e27ec22SSatish Balay 
2938e27ec22SSatish Balay /*  func is currently ignored from Fortran */
2948e27ec22SSatish Balay void PETSC_STDCALL snesgetjacobian_(SNES *snes,Mat *A,Mat *B,int *func,void **ctx,PetscErrorCode *ierr)
2958e27ec22SSatish Balay {
2968e27ec22SSatish Balay   CHKFORTRANNULLINTEGER(ctx);
2978e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(A);
2988e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(B);
2998e27ec22SSatish Balay   *ierr = SNESGetJacobian(*snes,A,B,0,ctx);
3008e27ec22SSatish Balay }
3018e27ec22SSatish Balay 
3028e27ec22SSatish Balay void PETSC_STDCALL snesgetconvergencehistory_(SNES *snes,PetscInt *na,PetscErrorCode *ierr)
3038e27ec22SSatish Balay {
3048e27ec22SSatish Balay   *ierr = SNESGetConvergenceHistory(*snes,PETSC_NULL,PETSC_NULL,na);
3058e27ec22SSatish Balay }
3068e27ec22SSatish Balay 
3077f7931b9SBarry Smith void PETSC_STDCALL snessettype_(SNES *snes,CHAR type PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
3088e27ec22SSatish Balay {
3098e27ec22SSatish Balay   char *t;
3108e27ec22SSatish Balay 
3118e27ec22SSatish Balay   FIXCHAR(type,len,t);
3128e27ec22SSatish Balay   *ierr = SNESSetType(*snes,t);
3138e27ec22SSatish Balay   FREECHAR(type,t);
3148e27ec22SSatish Balay }
3158e27ec22SSatish Balay 
3167f7931b9SBarry Smith void PETSC_STDCALL snesappendoptionsprefix_(SNES *snes,CHAR prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
3178e27ec22SSatish Balay {
3188e27ec22SSatish Balay   char *t;
3198e27ec22SSatish Balay 
3208e27ec22SSatish Balay   FIXCHAR(prefix,len,t);
3218e27ec22SSatish Balay   *ierr = SNESAppendOptionsPrefix(*snes,t);
3228e27ec22SSatish Balay   FREECHAR(prefix,t);
3238e27ec22SSatish Balay }
3248e27ec22SSatish Balay 
3257f7931b9SBarry Smith void PETSC_STDCALL snessetoptionsprefix_(SNES *snes,CHAR prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
3268e27ec22SSatish Balay {
3278e27ec22SSatish Balay   char *t;
3288e27ec22SSatish Balay 
3298e27ec22SSatish Balay   FIXCHAR(prefix,len,t);
3308e27ec22SSatish Balay   *ierr = SNESSetOptionsPrefix(*snes,t);
3318e27ec22SSatish Balay   FREECHAR(prefix,t);
3328e27ec22SSatish Balay }
3338e27ec22SSatish Balay 
3348e27ec22SSatish Balay /*----------------------------------------------------------------------*/
3358e27ec22SSatish Balay /* functions, hence no STDCALL */
3368e27ec22SSatish Balay 
337a6570f20SBarry Smith void snesmonitorlg_(SNES *snes,PetscInt *its,PetscReal *fgnorm,void *dummy,PetscErrorCode *ierr)
3388e27ec22SSatish Balay {
339a6570f20SBarry Smith   *ierr = SNESMonitorLG(*snes,*its,*fgnorm,dummy);
3408e27ec22SSatish Balay }
3418e27ec22SSatish Balay 
342a6570f20SBarry Smith void snesmonitordefault_(SNES *snes,PetscInt *its,PetscReal *fgnorm,void *dummy,PetscErrorCode *ierr)
3438e27ec22SSatish Balay {
344a6570f20SBarry Smith   *ierr = SNESMonitorDefault(*snes,*its,*fgnorm,dummy);
3458e27ec22SSatish Balay }
3468e27ec22SSatish Balay 
347a6570f20SBarry Smith void snesmonitorsolution_(SNES *snes,PetscInt *its,PetscReal *fgnorm,void *dummy,PetscErrorCode *ierr)
3488e27ec22SSatish Balay {
349a6570f20SBarry Smith   *ierr = SNESMonitorSolution(*snes,*its,*fgnorm,dummy);
3508e27ec22SSatish Balay }
3518e27ec22SSatish Balay 
352a6570f20SBarry Smith void snesmonitorsolutionupdate_(SNES *snes,PetscInt *its,PetscReal *fgnorm,void *dummy,PetscErrorCode *ierr)
3538e27ec22SSatish Balay {
354a6570f20SBarry Smith   *ierr = SNESMonitorSolutionUpdate(*snes,*its,*fgnorm,dummy);
3558e27ec22SSatish Balay }
3568e27ec22SSatish Balay 
3578e27ec22SSatish Balay 
3586895c445SBarry 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)
3598e27ec22SSatish Balay {
3608e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(mctx);
3617f7931b9SBarry Smith   PetscObjectAllocateFortranPointers(*snes,12);
362a6570f20SBarry Smith   if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitordefault_) {
363a6570f20SBarry Smith     *ierr = SNESMonitorSet(*snes,SNESMonitorDefault,0,0);
364a6570f20SBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorsolution_) {
365a6570f20SBarry Smith     *ierr = SNESMonitorSet(*snes,SNESMonitorSolution,0,0);
366a6570f20SBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorsolutionupdate_) {
367a6570f20SBarry Smith     *ierr = SNESMonitorSet(*snes,SNESMonitorSolutionUpdate,0,0);
368a6570f20SBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorlg_) {
369a6570f20SBarry Smith     *ierr = SNESMonitorSet(*snes,SNESMonitorLG,0,0);
3708e27ec22SSatish Balay   } else {
371b8ebb45fSBarry Smith     ((PetscObject)*snes)->fortran_func_pointers[3] = (PetscVoidFunction)func;
372b8ebb45fSBarry Smith     ((PetscObject)*snes)->fortran_func_pointers[4] = (PetscVoidFunction)mctx;
373b8ebb45fSBarry Smith 
3748e27ec22SSatish Balay     if (FORTRANNULLFUNCTION(mondestroy)){
3757f7931b9SBarry Smith       *ierr = SNESMonitorSet(*snes,oursnesmonitor,*snes,PETSC_NULL);
3768e27ec22SSatish Balay     } else {
3775d4ebb51SBarry Smith       CHKFORTRANNULLFUNCTION(mondestroy);
378b8ebb45fSBarry Smith       ((PetscObject)*snes)->fortran_func_pointers[5] = (PetscVoidFunction)mondestroy;
379b8ebb45fSBarry Smith       *ierr = SNESMonitorSet(*snes,oursnesmonitor,*snes,ourmondestroy);
3808e27ec22SSatish Balay     }
3818e27ec22SSatish Balay   }
3828e27ec22SSatish Balay }
3838e27ec22SSatish Balay 
384f1c6b773SPeter Brune void PETSC_STDCALL  snesgetsneslinesearch_(SNES *snes,SNESLineSearch *linesearch, int *__ierr ){
385f1c6b773SPeter Brune *__ierr = SNESGetSNESLineSearch(*snes, linesearch);
386ea5d4fccSPeter Brune }
3878e27ec22SSatish Balay 
3888e27ec22SSatish Balay EXTERN_C_END
389