xref: /petsc/src/snes/interface/ftn-custom/zsnesf.c (revision a69afd8b8742bc40752801dcf3f6c42467f5e464)
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
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
338e27ec22SSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
34df66969eSBarry Smith #define matmffdcomputejacobian_          matmffdcomputejacobian
356ce558aeSBarry Smith #define snessolve_                       snessolve
368e27ec22SSatish Balay #define snesdefaultcomputejacobian_      snesdefaultcomputejacobian
378e27ec22SSatish Balay #define snesdefaultcomputejacobiancolor_ snesdefaultcomputejacobiancolor
38837ad101SBarry Smith #define snesdmdacomputejacobian_           snesdmdacomputejacobian
39837ad101SBarry Smith #define snesdmdacomputejacobianwithadifor_ snesdmdacomputejacobianwithadifor
408e27ec22SSatish Balay #define snessetjacobian_                 snessetjacobian
418e27ec22SSatish Balay #define snesgetoptionsprefix_            snesgetoptionsprefix
428e27ec22SSatish Balay #define snesgettype_                     snesgettype
43837ad101SBarry Smith #define snesdmdacomputefunction_              snesdmdacomputefunction
448e27ec22SSatish Balay #define snessetfunction_                 snessetfunction
45c79ef259SPeter Brune #define snessetgs_                       snessetgs
468e27ec22SSatish Balay #define snesgetfunction_                 snesgetfunction
47c79ef259SPeter Brune #define snesgetgs_                       snesgetgs
488e27ec22SSatish Balay #define snessetconvergencetest_          snessetconvergencetest
493f149594SLisandro Dalcin #define snesdefaultconverged_            snesdefaultconverged
503f149594SLisandro Dalcin #define snesskipconverged_               snesskipconverged
518e27ec22SSatish Balay #define snesview_                        snesview
528e27ec22SSatish Balay #define snesgetjacobian_                 snesgetjacobian
538e27ec22SSatish Balay #define snesgetconvergencehistory_       snesgetconvergencehistory
548e27ec22SSatish Balay #define snessettype_                     snessettype
558e27ec22SSatish Balay #define snesappendoptionsprefix_         snesappendoptionsprefix
568e27ec22SSatish Balay #define snessetoptionsprefix_            snessetoptionsprefix
57a6570f20SBarry Smith #define snesmonitorlg_                   snesmonitorlg
58a6570f20SBarry Smith #define snesmonitordefault_              snesmonitordefault
59a6570f20SBarry Smith #define snesmonitorsolution_             snesmonitorsolution
60a6570f20SBarry Smith #define snesmonitorsolutionupdate_       snesmonitorsolutionupdate
61a6570f20SBarry Smith #define snesmonitorset_                  snesmonitorset
628e27ec22SSatish Balay #endif
638e27ec22SSatish Balay 
648e27ec22SSatish Balay static PetscErrorCode oursnesfunction(SNES snes,Vec x,Vec f,void *ctx)
658e27ec22SSatish Balay {
668e27ec22SSatish Balay   PetscErrorCode ierr = 0;
67b8ebb45fSBarry Smith   (*(void (PETSC_STDCALL *)(SNES*,Vec*,Vec*,void*,PetscErrorCode*))(((PetscObject)snes)->fortran_func_pointers[0]))(&snes,&x,&f,ctx,&ierr);CHKERRQ(ierr);
688e27ec22SSatish Balay   return 0;
698e27ec22SSatish Balay }
70b8ebb45fSBarry Smith 
7106ee9f85SBarry Smith static PetscErrorCode oursnestest(SNES snes,PetscInt it,PetscReal a,PetscReal d,PetscReal c,SNESConvergedReason*reason,void*ctx)
728e27ec22SSatish Balay {
738e27ec22SSatish Balay   PetscErrorCode ierr = 0;
746895c445SBarry Smith   void           *mctx = (void*) ((PetscObject)snes)->fortran_func_pointers[11];
756895c445SBarry 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);
767f7931b9SBarry Smith   return 0;
777f7931b9SBarry Smith }
787f7931b9SBarry Smith 
797f7931b9SBarry Smith static PetscErrorCode ourdestroy(void*ctx)
807f7931b9SBarry Smith {
817f7931b9SBarry Smith   PetscErrorCode ierr = 0;
827f7931b9SBarry Smith   SNES           snes = (SNES)ctx;
836895c445SBarry Smith   void           *mctx = (void*) ((PetscObject)snes)->fortran_func_pointers[11];
846895c445SBarry Smith   (*(void (PETSC_STDCALL *)(void*,PetscErrorCode*))(((PetscObject)snes)->fortran_func_pointers[10]))(mctx,&ierr);CHKERRQ(ierr);
858e27ec22SSatish Balay   return 0;
868e27ec22SSatish Balay }
878e27ec22SSatish Balay 
888e27ec22SSatish Balay static PetscErrorCode oursnesjacobian(SNES snes,Vec x,Mat* m,Mat* p,MatStructure* type,void*ctx)
898e27ec22SSatish Balay {
908e27ec22SSatish Balay   PetscErrorCode ierr = 0;
91b8ebb45fSBarry 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);
928e27ec22SSatish Balay   return 0;
938e27ec22SSatish Balay }
948e27ec22SSatish Balay static PetscErrorCode oursnesmonitor(SNES snes,PetscInt i,PetscReal d,void*ctx)
958e27ec22SSatish Balay {
968e27ec22SSatish Balay   PetscErrorCode ierr = 0;
978e27ec22SSatish Balay 
986895c445SBarry Smith   void           *mctx = (void*)((PetscObject)snes)->fortran_func_pointers[4];
996895c445SBarry Smith   (*(void (PETSC_STDCALL *)(SNES*,PetscInt*,PetscReal*,void*,PetscErrorCode*))(((PetscObject)snes)->fortran_func_pointers[3]))(&snes,&i,&d,mctx,&ierr);CHKERRQ(ierr);
1008e27ec22SSatish Balay   return 0;
1018e27ec22SSatish Balay }
102c2efdce3SBarry Smith static PetscErrorCode ourmondestroy(void** ctx)
1038e27ec22SSatish Balay {
1048e27ec22SSatish Balay   PetscErrorCode ierr = 0;
105c2efdce3SBarry Smith   SNES           snes = *(SNES*)ctx;
1066895c445SBarry Smith   void           *mctx = (void*) ((PetscObject)snes)->fortran_func_pointers[4];
1076895c445SBarry Smith   (*(void (PETSC_STDCALL *)(void*,PetscErrorCode*))(((PetscObject)snes)->fortran_func_pointers[5]))(mctx,&ierr);CHKERRQ(ierr);
1088e27ec22SSatish Balay   return 0;
1098e27ec22SSatish Balay }
1108e27ec22SSatish Balay 
1118e27ec22SSatish Balay EXTERN_C_BEGIN
1128e27ec22SSatish Balay /* ---------------------------------------------------------*/
1138e27ec22SSatish Balay /*
1148e27ec22SSatish Balay      snesdefaultcomputejacobian() and snesdefaultcomputejacobiancolor()
1158e27ec22SSatish Balay   These can be used directly from Fortran but are mostly so that
1168e27ec22SSatish Balay   Fortran SNESSetJacobian() will properly handle the defaults being passed in.
1178e27ec22SSatish Balay 
1188e27ec22SSatish Balay   functions, hence no STDCALL
1198e27ec22SSatish Balay */
120df66969eSBarry Smith void matmffdcomputejacobian_(SNES *snes,Vec *x,Mat *m,Mat *p,MatStructure* type,void *ctx,PetscErrorCode *ierr)
121df66969eSBarry Smith {
122df66969eSBarry Smith   *ierr = MatMFFDComputeJacobian(*snes,*x,m,p,type,ctx);
123df66969eSBarry Smith }
1248e27ec22SSatish Balay void snesdefaultcomputejacobian_(SNES *snes,Vec *x,Mat *m,Mat *p,MatStructure* type,void *ctx,PetscErrorCode *ierr)
1258e27ec22SSatish Balay {
1268e27ec22SSatish Balay   *ierr = SNESDefaultComputeJacobian(*snes,*x,m,p,type,ctx);
1278e27ec22SSatish Balay }
1288e27ec22SSatish Balay void  snesdefaultcomputejacobiancolor_(SNES *snes,Vec *x,Mat *m,Mat *p,MatStructure* type,void *ctx,PetscErrorCode *ierr)
1298e27ec22SSatish Balay {
1308e27ec22SSatish Balay   *ierr = SNESDefaultComputeJacobianColor(*snes,*x,m,p,type,*(MatFDColoring*)ctx);
1318e27ec22SSatish Balay }
1328e27ec22SSatish Balay 
133837ad101SBarry Smith void  snesdmdacomputejacobianwithadifor_(SNES *snes,Vec *X,Mat *m,Mat *p,MatStructure* type,void *ctx,PetscErrorCode *ierr)
1348e27ec22SSatish Balay {
1358e27ec22SSatish Balay   (*PetscErrorPrintf)("Cannot call this function from Fortran");
1368e27ec22SSatish Balay   *ierr = 1;
1378e27ec22SSatish Balay }
1388e27ec22SSatish Balay 
139837ad101SBarry Smith void  snesdmdacomputejacobian_(SNES *snes,Vec *X,Mat *m,Mat *p,MatStructure* type,void *ctx,PetscErrorCode *ierr)
1408e27ec22SSatish Balay {
1418e27ec22SSatish Balay   (*PetscErrorPrintf)("Cannot call this function from Fortran");
1428e27ec22SSatish Balay   *ierr = 1;
1438e27ec22SSatish Balay }
1448e27ec22SSatish Balay 
1458e27ec22SSatish Balay void PETSC_STDCALL snessetjacobian_(SNES *snes,Mat *A,Mat *B,void (PETSC_STDCALL *func)(SNES*,Vec*,Mat*,Mat*,
1468e27ec22SSatish Balay             MatStructure*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr)
1478e27ec22SSatish Balay {
1488e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(ctx);
149f5b6597dSBarry Smith   CHKFORTRANNULLFUNCTION(func);
1507f7931b9SBarry Smith   PetscObjectAllocateFortranPointers(*snes,12);
151f68b968cSBarry Smith   if ((PetscVoidFunction)func == (PetscVoidFunction)snesdefaultcomputejacobian_) {
1528e27ec22SSatish Balay     *ierr = SNESSetJacobian(*snes,*A,*B,SNESDefaultComputeJacobian,ctx);
153f68b968cSBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesdefaultcomputejacobiancolor_) {
1548e27ec22SSatish Balay     *ierr = SNESSetJacobian(*snes,*A,*B,SNESDefaultComputeJacobianColor,*(MatFDColoring*)ctx);
155837ad101SBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesdmdacomputejacobianwithadifor_) {
156837ad101SBarry Smith     *ierr = SNESSetJacobian(*snes,*A,*B,SNESDMDAComputeJacobianWithAdifor,ctx);
157837ad101SBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesdmdacomputejacobian_) {
158837ad101SBarry Smith     *ierr = SNESSetJacobian(*snes,*A,*B,SNESDMDAComputeJacobian,ctx);
159df66969eSBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)matmffdcomputejacobian_) {
160df66969eSBarry Smith     *ierr = SNESSetJacobian(*snes,*A,*B,MatMFFDComputeJacobian,ctx);
161f5b6597dSBarry Smith   } else if (!func) {
162f5b6597dSBarry Smith     *ierr = SNESSetJacobian(*snes,*A,*B,0,ctx);
1638e27ec22SSatish Balay   } else {
164b8ebb45fSBarry Smith     ((PetscObject)*snes)->fortran_func_pointers[2] = (PetscVoidFunction)func;
1658e27ec22SSatish Balay     *ierr = SNESSetJacobian(*snes,*A,*B,oursnesjacobian,ctx);
1668e27ec22SSatish Balay   }
1678e27ec22SSatish Balay }
1688e27ec22SSatish Balay /* -------------------------------------------------------------*/
1698e27ec22SSatish Balay 
1706ce558aeSBarry Smith void PETSC_STDCALL   snessolve_(SNES *snes,Vec *b,Vec *x, int *__ierr )
1716ce558aeSBarry Smith {
172*a69afd8bSBarry Smith   Vec B = *b,X = *x;
1736ce558aeSBarry Smith   if (*b == PETSC_NULL_OBJECT_Fortran) B = PETSC_NULL;
174*a69afd8bSBarry Smith   if (*x == PETSC_NULL_OBJECT_Fortran) X = PETSC_NULL;
175*a69afd8bSBarry Smith   *__ierr = SNESSolve(*snes,B,X);
1766ce558aeSBarry Smith }
1776ce558aeSBarry Smith 
178e1d034e4SBarry Smith void PETSC_STDCALL snesgetoptionsprefix_(SNES *snes,CHAR prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
1798e27ec22SSatish Balay {
1808e27ec22SSatish Balay   const char *tname;
1818e27ec22SSatish Balay 
1828e27ec22SSatish Balay   *ierr = SNESGetOptionsPrefix(*snes,&tname);
1838e27ec22SSatish Balay   *ierr = PetscStrncpy(prefix,tname,len);if (*ierr) return;
1848e27ec22SSatish Balay }
1858e27ec22SSatish Balay 
1867f7931b9SBarry Smith void PETSC_STDCALL snesgettype_(SNES *snes,CHAR name PETSC_MIXED_LEN(len), PetscErrorCode *ierr PETSC_END_LEN(len))
1878e27ec22SSatish Balay {
1888e27ec22SSatish Balay   const char *tname;
1898e27ec22SSatish Balay 
1908e27ec22SSatish Balay   *ierr = SNESGetType(*snes,&tname);
1918e27ec22SSatish Balay   *ierr = PetscStrncpy(name,tname,len);if (*ierr) return;
1927c363081SBarry Smith   FIXRETURNCHAR(PETSC_TRUE,name,len);
1938e27ec22SSatish Balay }
194e3da1266SHong Zhang 
1958e27ec22SSatish Balay /* ---------------------------------------------------------*/
1968e27ec22SSatish Balay 
1978e27ec22SSatish Balay /*
1988e27ec22SSatish Balay    These are not usually called from Fortran but allow Fortran users
1998e27ec22SSatish Balay    to transparently set these monitors from .F code
2008e27ec22SSatish Balay 
2018e27ec22SSatish Balay    functions, hence no STDCALL
2028e27ec22SSatish Balay */
203837ad101SBarry Smith void  snesdmdacomputefunction_(SNES *snes,Vec *X, Vec *F,void *ptr,PetscErrorCode *ierr)
2048e27ec22SSatish Balay {
205837ad101SBarry Smith   *ierr = SNESDMDAComputeFunction(*snes,*X,*F,ptr);
2068e27ec22SSatish Balay }
2078e27ec22SSatish Balay 
2082613ca53SBarry Smith void PETSC_STDCALL snessetfunction_(SNES *snes,Vec *r,void (PETSC_STDCALL *func)(SNES*,Vec*,Vec*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr)
2098e27ec22SSatish Balay {
2108e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(ctx);
2117f7931b9SBarry Smith   PetscObjectAllocateFortranPointers(*snes,12);
212837ad101SBarry Smith   if ((PetscVoidFunction)func == (PetscVoidFunction)snesdmdacomputefunction_) {
213837ad101SBarry Smith     *ierr = SNESSetFunction(*snes,*r,SNESDMDAComputeFunction,ctx);
2148e27ec22SSatish Balay   } else {
215b8ebb45fSBarry Smith     ((PetscObject)*snes)->fortran_func_pointers[0] = (PetscVoidFunction)func;
2168e27ec22SSatish Balay     *ierr = SNESSetFunction(*snes,*r,oursnesfunction,ctx);
2178e27ec22SSatish Balay   }
2188e27ec22SSatish Balay }
219c79ef259SPeter Brune 
220c79ef259SPeter Brune 
221c79ef259SPeter Brune void PETSC_STDCALL snessetgs_(SNES *snes,void (PETSC_STDCALL *func)(SNES*,Vec*,Vec*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr)
222c79ef259SPeter Brune {
223c79ef259SPeter Brune   CHKFORTRANNULLOBJECT(ctx);
224c79ef259SPeter Brune   PetscObjectAllocateFortranPointers(*snes,12);
225837ad101SBarry Smith   if ((PetscVoidFunction)func == (PetscVoidFunction)snesdmdacomputefunction_) {
226837ad101SBarry Smith     *ierr = SNESSetGS(*snes,SNESDMDAComputeFunction,ctx);
227c79ef259SPeter Brune   } else {
228c79ef259SPeter Brune     ((PetscObject)*snes)->fortran_func_pointers[0] = (PetscVoidFunction)func;
229c79ef259SPeter Brune     *ierr = SNESSetGS(*snes,oursnesfunction,ctx);
230c79ef259SPeter Brune   }
231c79ef259SPeter Brune }
2328e27ec22SSatish Balay /* ---------------------------------------------------------*/
2338e27ec22SSatish Balay 
2348e27ec22SSatish Balay /* the func argument is ignored */
2358e27ec22SSatish Balay void PETSC_STDCALL snesgetfunction_(SNES *snes,Vec *r,void *func,void **ctx,PetscErrorCode *ierr)
2368e27ec22SSatish Balay {
2378e27ec22SSatish Balay   CHKFORTRANNULLINTEGER(ctx);
2388e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(r);
2398e27ec22SSatish Balay   *ierr = SNESGetFunction(*snes,r,PETSC_NULL,ctx);
2408e27ec22SSatish Balay }
241c79ef259SPeter Brune 
242c79ef259SPeter Brune void PETSC_STDCALL snesgetgs_(SNES *snes,void *func,void **ctx,PetscErrorCode *ierr)
243c79ef259SPeter Brune {
244c79ef259SPeter Brune   CHKFORTRANNULLINTEGER(ctx);
245c79ef259SPeter Brune   *ierr = SNESGetGS(*snes,PETSC_NULL,ctx);
246c79ef259SPeter Brune }
247c79ef259SPeter Brune 
2488e27ec22SSatish Balay /*----------------------------------------------------------------------*/
2498e27ec22SSatish Balay 
2507f7931b9SBarry Smith void snesdefaultconverged_(SNES *snes,PetscInt *it,PetscReal *a,PetscReal *b,PetscReal *c,SNESConvergedReason *r, void *ct,PetscErrorCode *ierr)
2513f149594SLisandro Dalcin {
2523f149594SLisandro Dalcin   *ierr = SNESDefaultConverged(*snes,*it,*a,*b,*c,r,ct);
2533f149594SLisandro Dalcin }
2543f149594SLisandro Dalcin 
2553f149594SLisandro Dalcin void snesskipconverged_(SNES *snes,PetscInt *it,PetscReal *a,PetscReal *b,PetscReal *c,SNESConvergedReason *r,
2563f149594SLisandro Dalcin                                        void *ct,PetscErrorCode *ierr)
2573f149594SLisandro Dalcin {
2583f149594SLisandro Dalcin   *ierr = SNESSkipConverged(*snes,*it,*a,*b,*c,r,ct);
2593f149594SLisandro Dalcin }
2603f149594SLisandro Dalcin 
2617f7931b9SBarry 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)
2628e27ec22SSatish Balay {
2638e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(cctx);
2643f22127dSBarry Smith   CHKFORTRANNULLFUNCTION(destroy);
2657f7931b9SBarry Smith   PetscObjectAllocateFortranPointers(*snes,12);
2663f149594SLisandro Dalcin 
2673f149594SLisandro Dalcin   if ((PetscVoidFunction)func == (PetscVoidFunction)snesdefaultconverged_){
2687f7931b9SBarry Smith     *ierr = SNESSetConvergenceTest(*snes,SNESDefaultConverged,0,0);
2693f149594SLisandro Dalcin   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesskipconverged_){
2707f7931b9SBarry Smith     *ierr = SNESSetConvergenceTest(*snes,SNESSkipConverged,0,0);
2718e27ec22SSatish Balay   } else {
272b8ebb45fSBarry Smith     ((PetscObject)*snes)->fortran_func_pointers[1] = (PetscVoidFunction)func;
2737f7931b9SBarry Smith     ((PetscObject)*snes)->fortran_func_pointers[11] = (PetscVoidFunction)cctx;
2743f22127dSBarry Smith     if (!destroy) {
2757f7931b9SBarry Smith       *ierr = SNESSetConvergenceTest(*snes,oursnestest,*snes,PETSC_NULL);
2767f7931b9SBarry Smith     } else {
2777f7931b9SBarry Smith       ((PetscObject)*snes)->fortran_func_pointers[10] = (PetscVoidFunction)destroy;
2787f7931b9SBarry Smith       *ierr = SNESSetConvergenceTest(*snes,oursnestest,*snes,ourdestroy);
2797f7931b9SBarry Smith     }
2808e27ec22SSatish Balay   }
2818e27ec22SSatish Balay }
2828e27ec22SSatish Balay /*----------------------------------------------------------------------*/
2838e27ec22SSatish Balay 
2848e27ec22SSatish Balay void PETSC_STDCALL snesview_(SNES *snes,PetscViewer *viewer, PetscErrorCode *ierr)
2858e27ec22SSatish Balay {
2868e27ec22SSatish Balay   PetscViewer v;
2878e27ec22SSatish Balay   PetscPatchDefaultViewers_Fortran(viewer,v);
2888e27ec22SSatish Balay   *ierr = SNESView(*snes,v);
2898e27ec22SSatish Balay }
2908e27ec22SSatish Balay 
2918e27ec22SSatish Balay /*  func is currently ignored from Fortran */
2928e27ec22SSatish Balay void PETSC_STDCALL snesgetjacobian_(SNES *snes,Mat *A,Mat *B,int *func,void **ctx,PetscErrorCode *ierr)
2938e27ec22SSatish Balay {
2948e27ec22SSatish Balay   CHKFORTRANNULLINTEGER(ctx);
2958e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(A);
2968e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(B);
2978e27ec22SSatish Balay   *ierr = SNESGetJacobian(*snes,A,B,0,ctx);
2988e27ec22SSatish Balay }
2998e27ec22SSatish Balay 
3008e27ec22SSatish Balay void PETSC_STDCALL snesgetconvergencehistory_(SNES *snes,PetscInt *na,PetscErrorCode *ierr)
3018e27ec22SSatish Balay {
3028e27ec22SSatish Balay   *ierr = SNESGetConvergenceHistory(*snes,PETSC_NULL,PETSC_NULL,na);
3038e27ec22SSatish Balay }
3048e27ec22SSatish Balay 
3057f7931b9SBarry Smith void PETSC_STDCALL snessettype_(SNES *snes,CHAR type PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
3068e27ec22SSatish Balay {
3078e27ec22SSatish Balay   char *t;
3088e27ec22SSatish Balay 
3098e27ec22SSatish Balay   FIXCHAR(type,len,t);
3108e27ec22SSatish Balay   *ierr = SNESSetType(*snes,t);
3118e27ec22SSatish Balay   FREECHAR(type,t);
3128e27ec22SSatish Balay }
3138e27ec22SSatish Balay 
3147f7931b9SBarry Smith void PETSC_STDCALL snesappendoptionsprefix_(SNES *snes,CHAR prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
3158e27ec22SSatish Balay {
3168e27ec22SSatish Balay   char *t;
3178e27ec22SSatish Balay 
3188e27ec22SSatish Balay   FIXCHAR(prefix,len,t);
3198e27ec22SSatish Balay   *ierr = SNESAppendOptionsPrefix(*snes,t);
3208e27ec22SSatish Balay   FREECHAR(prefix,t);
3218e27ec22SSatish Balay }
3228e27ec22SSatish Balay 
3237f7931b9SBarry Smith void PETSC_STDCALL snessetoptionsprefix_(SNES *snes,CHAR prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
3248e27ec22SSatish Balay {
3258e27ec22SSatish Balay   char *t;
3268e27ec22SSatish Balay 
3278e27ec22SSatish Balay   FIXCHAR(prefix,len,t);
3288e27ec22SSatish Balay   *ierr = SNESSetOptionsPrefix(*snes,t);
3298e27ec22SSatish Balay   FREECHAR(prefix,t);
3308e27ec22SSatish Balay }
3318e27ec22SSatish Balay 
3328e27ec22SSatish Balay /*----------------------------------------------------------------------*/
3338e27ec22SSatish Balay /* functions, hence no STDCALL */
3348e27ec22SSatish Balay 
335a6570f20SBarry Smith void snesmonitorlg_(SNES *snes,PetscInt *its,PetscReal *fgnorm,void *dummy,PetscErrorCode *ierr)
3368e27ec22SSatish Balay {
337a6570f20SBarry Smith   *ierr = SNESMonitorLG(*snes,*its,*fgnorm,dummy);
3388e27ec22SSatish Balay }
3398e27ec22SSatish Balay 
340a6570f20SBarry Smith void snesmonitordefault_(SNES *snes,PetscInt *its,PetscReal *fgnorm,void *dummy,PetscErrorCode *ierr)
3418e27ec22SSatish Balay {
342a6570f20SBarry Smith   *ierr = SNESMonitorDefault(*snes,*its,*fgnorm,dummy);
3438e27ec22SSatish Balay }
3448e27ec22SSatish Balay 
345a6570f20SBarry Smith void snesmonitorsolution_(SNES *snes,PetscInt *its,PetscReal *fgnorm,void *dummy,PetscErrorCode *ierr)
3468e27ec22SSatish Balay {
347a6570f20SBarry Smith   *ierr = SNESMonitorSolution(*snes,*its,*fgnorm,dummy);
3488e27ec22SSatish Balay }
3498e27ec22SSatish Balay 
350a6570f20SBarry Smith void snesmonitorsolutionupdate_(SNES *snes,PetscInt *its,PetscReal *fgnorm,void *dummy,PetscErrorCode *ierr)
3518e27ec22SSatish Balay {
352a6570f20SBarry Smith   *ierr = SNESMonitorSolutionUpdate(*snes,*its,*fgnorm,dummy);
3538e27ec22SSatish Balay }
3548e27ec22SSatish Balay 
3558e27ec22SSatish Balay 
3566895c445SBarry 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)
3578e27ec22SSatish Balay {
3588e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(mctx);
3597f7931b9SBarry Smith   PetscObjectAllocateFortranPointers(*snes,12);
360a6570f20SBarry Smith   if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitordefault_) {
361a6570f20SBarry Smith     *ierr = SNESMonitorSet(*snes,SNESMonitorDefault,0,0);
362a6570f20SBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorsolution_) {
363a6570f20SBarry Smith     *ierr = SNESMonitorSet(*snes,SNESMonitorSolution,0,0);
364a6570f20SBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorsolutionupdate_) {
365a6570f20SBarry Smith     *ierr = SNESMonitorSet(*snes,SNESMonitorSolutionUpdate,0,0);
366a6570f20SBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorlg_) {
367a6570f20SBarry Smith     *ierr = SNESMonitorSet(*snes,SNESMonitorLG,0,0);
3688e27ec22SSatish Balay   } else {
369b8ebb45fSBarry Smith     ((PetscObject)*snes)->fortran_func_pointers[3] = (PetscVoidFunction)func;
370b8ebb45fSBarry Smith     ((PetscObject)*snes)->fortran_func_pointers[4] = (PetscVoidFunction)mctx;
371b8ebb45fSBarry Smith 
3728e27ec22SSatish Balay     if (FORTRANNULLFUNCTION(mondestroy)){
3737f7931b9SBarry Smith       *ierr = SNESMonitorSet(*snes,oursnesmonitor,*snes,PETSC_NULL);
3748e27ec22SSatish Balay     } else {
3755d4ebb51SBarry Smith       CHKFORTRANNULLFUNCTION(mondestroy);
376b8ebb45fSBarry Smith       ((PetscObject)*snes)->fortran_func_pointers[5] = (PetscVoidFunction)mondestroy;
377b8ebb45fSBarry Smith       *ierr = SNESMonitorSet(*snes,oursnesmonitor,*snes,ourmondestroy);
3788e27ec22SSatish Balay     }
3798e27ec22SSatish Balay   }
3808e27ec22SSatish Balay }
3818e27ec22SSatish Balay 
3828e27ec22SSatish Balay 
3838e27ec22SSatish Balay 
3848e27ec22SSatish Balay EXTERN_C_END
385