xref: /petsc/src/snes/interface/ftn-custom/zsnesf.c (revision f5af7f232b71b4a723423f52797ae8ea7ad3f041)
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
274619e776SBarry Smith #define snesmonitorlgresidualnorm_       SNESMONITORLGRESIDUALNORM
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
524619e776SBarry Smith #define snesmonitorlgresidualnorm_       snesmonitorlgresidualnorm
53a6570f20SBarry Smith #define snesmonitordefault_              snesmonitordefault
54a6570f20SBarry Smith #define snesmonitorsolution_             snesmonitorsolution
55a6570f20SBarry Smith #define snesmonitorsolutionupdate_       snesmonitorsolutionupdate
56a6570f20SBarry Smith #define snesmonitorset_                  snesmonitorset
573b229b18SJed Brown #define snesgetsneslinesearch_           snesgetsneslinesearch
588e27ec22SSatish Balay #endif
598e27ec22SSatish Balay 
60f6291634SJed Brown static struct {
61f6291634SJed Brown   PetscFortranCallbackId function;
62f6291634SJed Brown   PetscFortranCallbackId test;
63f6291634SJed Brown   PetscFortranCallbackId destroy;
64f6291634SJed Brown   PetscFortranCallbackId jacobian;
65f6291634SJed Brown   PetscFortranCallbackId monitor;
66f6291634SJed Brown   PetscFortranCallbackId mondestroy;
67f6291634SJed Brown   PetscFortranCallbackId gs;
68f6291634SJed Brown } _cb;
6990b77ac2SPeter Brune 
708e27ec22SSatish Balay static PetscErrorCode oursnesfunction(SNES snes,Vec x,Vec f,void *ctx)
718e27ec22SSatish Balay {
72f6291634SJed Brown   PetscObjectUseFortranCallback(snes,_cb.function,(SNES*,Vec*,Vec*,void*,PetscErrorCode*),(&snes,&x,&f,_ctx,&ierr));
738e27ec22SSatish Balay   return 0;
748e27ec22SSatish Balay }
75b8ebb45fSBarry Smith 
7606ee9f85SBarry Smith static PetscErrorCode oursnestest(SNES snes,PetscInt it,PetscReal a,PetscReal d,PetscReal c,SNESConvergedReason *reason,void *ctx)
778e27ec22SSatish Balay {
78f6291634SJed Brown   PetscObjectUseFortranCallback(snes,_cb.test,(SNES*,PetscInt*,PetscReal*,PetscReal*,PetscReal*,SNESConvergedReason*,void*,PetscErrorCode*),(&snes,&it,&a,&d,&c,reason,_ctx,&ierr));
797f7931b9SBarry Smith   return 0;
807f7931b9SBarry Smith }
817f7931b9SBarry Smith 
827f7931b9SBarry Smith static PetscErrorCode ourdestroy(void *ctx)
837f7931b9SBarry Smith {
84f6291634SJed Brown   PetscObjectUseFortranCallback(ctx,_cb.destroy,(void*,PetscErrorCode*),(_ctx,&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 {
90f6291634SJed Brown   PetscObjectUseFortranCallback(snes,_cb.jacobian,(SNES*,Vec*,Mat*,Mat*,MatStructure*,void*,PetscErrorCode*),(&snes,&x,m,p,type,_ctx,&ierr));
918e27ec22SSatish Balay   return 0;
928e27ec22SSatish Balay }
93f6291634SJed Brown 
9490b77ac2SPeter Brune static PetscErrorCode oursnesgs(SNES snes,Vec x,Vec b,void *ctx)
9590b77ac2SPeter Brune {
96f6291634SJed Brown   PetscObjectUseFortranCallback(snes,_cb.gs,(SNES*,Vec*,Vec*,void*,PetscErrorCode*),(&snes,&x,&b,_ctx,&ierr));
9790b77ac2SPeter Brune   return 0;
9890b77ac2SPeter Brune }
998e27ec22SSatish Balay static PetscErrorCode oursnesmonitor(SNES snes,PetscInt i,PetscReal d,void *ctx)
1008e27ec22SSatish Balay {
101f6291634SJed Brown   PetscObjectUseFortranCallback(snes,_cb.monitor,(SNES*,PetscInt*,PetscReal*,void*,PetscErrorCode*),(&snes,&i,&d,_ctx,&ierr));
1028e27ec22SSatish Balay   return 0;
1038e27ec22SSatish Balay }
104c2efdce3SBarry Smith static PetscErrorCode ourmondestroy(void **ctx)
1058e27ec22SSatish Balay {
106f6291634SJed Brown   SNES snes = (SNES)*ctx;
107f6291634SJed Brown   PetscObjectUseFortranCallback(snes,_cb.mondestroy,(void*,PetscErrorCode*),(_ctx,&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 
133*f5af7f23SKarl Rupp void PETSC_STDCALL snessetjacobian_(SNES *snes,Mat *A,Mat *B,
134*f5af7f23SKarl Rupp                                     void (PETSC_STDCALL *func)(SNES*,Vec*,Mat*,Mat*,MatStructure*,void*,PetscErrorCode*),
135*f5af7f23SKarl Rupp                                     void *ctx,PetscErrorCode *ierr)
1368e27ec22SSatish Balay {
1378e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(ctx);
138f5b6597dSBarry Smith   CHKFORTRANNULLFUNCTION(func);
139f68b968cSBarry Smith   if ((PetscVoidFunction)func == (PetscVoidFunction)snesdefaultcomputejacobian_) {
1408e27ec22SSatish Balay     *ierr = SNESSetJacobian(*snes,*A,*B,SNESDefaultComputeJacobian,ctx);
141f68b968cSBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesdefaultcomputejacobiancolor_) {
1428e27ec22SSatish Balay     *ierr = SNESSetJacobian(*snes,*A,*B,SNESDefaultComputeJacobianColor,*(MatFDColoring*)ctx);
143df66969eSBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)matmffdcomputejacobian_) {
144df66969eSBarry Smith     *ierr = SNESSetJacobian(*snes,*A,*B,MatMFFDComputeJacobian,ctx);
145f5b6597dSBarry Smith   } else if (!func) {
146f5b6597dSBarry Smith     *ierr = SNESSetJacobian(*snes,*A,*B,0,ctx);
1478e27ec22SSatish Balay   } else {
148f6291634SJed Brown     *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.jacobian,(PetscVoidFunction)func,ctx);
149f6291634SJed Brown     if (!*ierr) *ierr = SNESSetJacobian(*snes,*A,*B,oursnesjacobian,PETSC_NULL);
1508e27ec22SSatish Balay   }
1518e27ec22SSatish Balay }
1528e27ec22SSatish Balay /* -------------------------------------------------------------*/
1538e27ec22SSatish Balay 
1546ce558aeSBarry Smith void PETSC_STDCALL   snessolve_(SNES *snes,Vec *b,Vec *x, int *__ierr)
1556ce558aeSBarry Smith {
156a69afd8bSBarry Smith   Vec B = *b,X = *x;
157c8d1aa3aSSatish Balay   if (FORTRANNULLOBJECT(b)) B = PETSC_NULL;
158c8d1aa3aSSatish Balay   if (FORTRANNULLOBJECT(x)) X = PETSC_NULL;
159a69afd8bSBarry Smith   *__ierr = SNESSolve(*snes,B,X);
1606ce558aeSBarry Smith }
1616ce558aeSBarry Smith 
162e1d034e4SBarry Smith void PETSC_STDCALL snesgetoptionsprefix_(SNES *snes,CHAR prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
1638e27ec22SSatish Balay {
1648e27ec22SSatish Balay   const char *tname;
1658e27ec22SSatish Balay 
1668e27ec22SSatish Balay   *ierr = SNESGetOptionsPrefix(*snes,&tname);
1678e27ec22SSatish Balay   *ierr = PetscStrncpy(prefix,tname,len);if (*ierr) return;
1688e27ec22SSatish Balay }
1698e27ec22SSatish Balay 
1707f7931b9SBarry Smith void PETSC_STDCALL snesgettype_(SNES *snes,CHAR name PETSC_MIXED_LEN(len), PetscErrorCode *ierr PETSC_END_LEN(len))
1718e27ec22SSatish Balay {
1728e27ec22SSatish Balay   const char *tname;
1738e27ec22SSatish Balay 
1748e27ec22SSatish Balay   *ierr = SNESGetType(*snes,&tname);
1758e27ec22SSatish Balay   *ierr = PetscStrncpy(name,tname,len);if (*ierr) return;
1767c363081SBarry Smith   FIXRETURNCHAR(PETSC_TRUE,name,len);
1778e27ec22SSatish Balay }
178e3da1266SHong Zhang 
1798e27ec22SSatish Balay /* ---------------------------------------------------------*/
1808e27ec22SSatish Balay 
1818e27ec22SSatish Balay /*
1828e27ec22SSatish Balay    These are not usually called from Fortran but allow Fortran users
1838e27ec22SSatish Balay    to transparently set these monitors from .F code
1848e27ec22SSatish Balay 
1858e27ec22SSatish Balay    functions, hence no STDCALL
1868e27ec22SSatish Balay */
1878e27ec22SSatish Balay 
1882613ca53SBarry Smith void PETSC_STDCALL snessetfunction_(SNES *snes,Vec *r,void (PETSC_STDCALL *func)(SNES*,Vec*,Vec*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr)
1898e27ec22SSatish Balay {
1908e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(ctx);
191f6291634SJed Brown   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.function,(PetscVoidFunction)func,ctx);
192f6291634SJed Brown   if (!*ierr) *ierr = SNESSetFunction(*snes,*r,oursnesfunction,PETSC_NULL);
1938e27ec22SSatish Balay }
194c79ef259SPeter Brune 
195c79ef259SPeter Brune 
196c79ef259SPeter Brune void PETSC_STDCALL snessetgs_(SNES *snes,void (PETSC_STDCALL *func)(SNES*,Vec*,Vec*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr)
197c79ef259SPeter Brune {
198c79ef259SPeter Brune   CHKFORTRANNULLOBJECT(ctx);
199f6291634SJed Brown   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.gs,(PetscVoidFunction)func,ctx);
200f6291634SJed Brown   if (!*ierr) *ierr = SNESSetGS(*snes,oursnesgs,PETSC_NULL);
201c79ef259SPeter Brune }
2028e27ec22SSatish Balay /* ---------------------------------------------------------*/
2038e27ec22SSatish Balay 
2048e27ec22SSatish Balay /* the func argument is ignored */
2058e27ec22SSatish Balay void PETSC_STDCALL snesgetfunction_(SNES *snes,Vec *r,void *func,void **ctx,PetscErrorCode *ierr)
2068e27ec22SSatish Balay {
2078e27ec22SSatish Balay   CHKFORTRANNULLINTEGER(ctx);
2088e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(r);
209f2e0d3f1SJed Brown   *ierr = SNESGetFunction(*snes,r,PETSC_NULL,PETSC_NULL); if (*ierr) return;
210f6291634SJed Brown   *ierr = PetscObjectGetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.function,PETSC_NULL,ctx);
2118e27ec22SSatish Balay }
212c79ef259SPeter Brune 
213c79ef259SPeter Brune void PETSC_STDCALL snesgetgs_(SNES *snes,void *func,void **ctx,PetscErrorCode *ierr)
214c79ef259SPeter Brune {
215c79ef259SPeter Brune   CHKFORTRANNULLINTEGER(ctx);
216f6291634SJed Brown   *ierr = PetscObjectGetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.gs,PETSC_NULL,ctx);
217c79ef259SPeter Brune }
218c79ef259SPeter Brune 
2198e27ec22SSatish Balay /*----------------------------------------------------------------------*/
2208e27ec22SSatish Balay 
2217f7931b9SBarry Smith void snesdefaultconverged_(SNES *snes,PetscInt *it,PetscReal *a,PetscReal *b,PetscReal *c,SNESConvergedReason *r, void *ct,PetscErrorCode *ierr)
2223f149594SLisandro Dalcin {
2233f149594SLisandro Dalcin   *ierr = SNESDefaultConverged(*snes,*it,*a,*b,*c,r,ct);
2243f149594SLisandro Dalcin }
2253f149594SLisandro Dalcin 
226*f5af7f23SKarl Rupp void snesskipconverged_(SNES *snes,PetscInt *it,PetscReal *a,PetscReal *b,PetscReal *c,SNESConvergedReason *r,void *ct,PetscErrorCode *ierr)
2273f149594SLisandro Dalcin {
2283f149594SLisandro Dalcin   *ierr = SNESSkipConverged(*snes,*it,*a,*b,*c,r,ct);
2293f149594SLisandro Dalcin }
2303f149594SLisandro Dalcin 
2317f7931b9SBarry 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)
2328e27ec22SSatish Balay {
2338e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(cctx);
2343f22127dSBarry Smith   CHKFORTRANNULLFUNCTION(destroy);
2353f149594SLisandro Dalcin 
2363f149594SLisandro Dalcin   if ((PetscVoidFunction)func == (PetscVoidFunction)snesdefaultconverged_) {
2377f7931b9SBarry Smith     *ierr = SNESSetConvergenceTest(*snes,SNESDefaultConverged,0,0);
2383f149594SLisandro Dalcin   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesskipconverged_) {
2397f7931b9SBarry Smith     *ierr = SNESSetConvergenceTest(*snes,SNESSkipConverged,0,0);
2408e27ec22SSatish Balay   } else {
241f6291634SJed Brown     *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.test,(PetscVoidFunction)func,cctx);
242f6291634SJed Brown     if (*ierr) return;
2433f22127dSBarry Smith     if (!destroy) {
2447f7931b9SBarry Smith       *ierr = SNESSetConvergenceTest(*snes,oursnestest,*snes,PETSC_NULL);
2457f7931b9SBarry Smith     } else {
246f6291634SJed Brown       *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.destroy,(PetscVoidFunction)destroy,cctx);
247f6291634SJed Brown       if (!*ierr) *ierr = SNESSetConvergenceTest(*snes,oursnestest,*snes,ourdestroy);
2487f7931b9SBarry Smith     }
2498e27ec22SSatish Balay   }
2508e27ec22SSatish Balay }
2518e27ec22SSatish Balay /*----------------------------------------------------------------------*/
2528e27ec22SSatish Balay 
2538e27ec22SSatish Balay void PETSC_STDCALL snesview_(SNES *snes,PetscViewer *viewer, PetscErrorCode *ierr)
2548e27ec22SSatish Balay {
2558e27ec22SSatish Balay   PetscViewer v;
2568e27ec22SSatish Balay   PetscPatchDefaultViewers_Fortran(viewer,v);
2578e27ec22SSatish Balay   *ierr = SNESView(*snes,v);
2588e27ec22SSatish Balay }
2598e27ec22SSatish Balay 
2608e27ec22SSatish Balay /*  func is currently ignored from Fortran */
2618e27ec22SSatish Balay void PETSC_STDCALL snesgetjacobian_(SNES *snes,Mat *A,Mat *B,int *func,void **ctx,PetscErrorCode *ierr)
2628e27ec22SSatish Balay {
2638e27ec22SSatish Balay   CHKFORTRANNULLINTEGER(ctx);
2648e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(A);
2658e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(B);
266f2e0d3f1SJed Brown   *ierr = SNESGetJacobian(*snes,A,B,0,PETSC_NULL); if (*ierr) return;
267f2e0d3f1SJed Brown   *ierr = PetscObjectGetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.jacobian,PETSC_NULL,ctx);
268f2e0d3f1SJed Brown 
2698e27ec22SSatish Balay }
2708e27ec22SSatish Balay 
2718e27ec22SSatish Balay void PETSC_STDCALL snesgetconvergencehistory_(SNES *snes,PetscInt *na,PetscErrorCode *ierr)
2728e27ec22SSatish Balay {
2738e27ec22SSatish Balay   *ierr = SNESGetConvergenceHistory(*snes,PETSC_NULL,PETSC_NULL,na);
2748e27ec22SSatish Balay }
2758e27ec22SSatish Balay 
2767f7931b9SBarry Smith void PETSC_STDCALL snessettype_(SNES *snes,CHAR type PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
2778e27ec22SSatish Balay {
2788e27ec22SSatish Balay   char *t;
2798e27ec22SSatish Balay 
2808e27ec22SSatish Balay   FIXCHAR(type,len,t);
2818e27ec22SSatish Balay   *ierr = SNESSetType(*snes,t);
2828e27ec22SSatish Balay   FREECHAR(type,t);
2838e27ec22SSatish Balay }
2848e27ec22SSatish Balay 
2857f7931b9SBarry Smith void PETSC_STDCALL snesappendoptionsprefix_(SNES *snes,CHAR prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
2868e27ec22SSatish Balay {
2878e27ec22SSatish Balay   char *t;
2888e27ec22SSatish Balay 
2898e27ec22SSatish Balay   FIXCHAR(prefix,len,t);
2908e27ec22SSatish Balay   *ierr = SNESAppendOptionsPrefix(*snes,t);
2918e27ec22SSatish Balay   FREECHAR(prefix,t);
2928e27ec22SSatish Balay }
2938e27ec22SSatish Balay 
2947f7931b9SBarry Smith void PETSC_STDCALL snessetoptionsprefix_(SNES *snes,CHAR prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
2958e27ec22SSatish Balay {
2968e27ec22SSatish Balay   char *t;
2978e27ec22SSatish Balay 
2988e27ec22SSatish Balay   FIXCHAR(prefix,len,t);
2998e27ec22SSatish Balay   *ierr = SNESSetOptionsPrefix(*snes,t);
3008e27ec22SSatish Balay   FREECHAR(prefix,t);
3018e27ec22SSatish Balay }
3028e27ec22SSatish Balay 
3038e27ec22SSatish Balay /*----------------------------------------------------------------------*/
3048e27ec22SSatish Balay /* functions, hence no STDCALL */
3058e27ec22SSatish Balay 
3064619e776SBarry Smith void snesmonitorlgresidualnorm_(SNES *snes,PetscInt *its,PetscReal *fgnorm,void *dummy,PetscErrorCode *ierr)
3078e27ec22SSatish Balay {
3084619e776SBarry Smith   *ierr = SNESMonitorLGResidualNorm(*snes,*its,*fgnorm,dummy);
3098e27ec22SSatish Balay }
3108e27ec22SSatish Balay 
311a6570f20SBarry Smith void snesmonitordefault_(SNES *snes,PetscInt *its,PetscReal *fgnorm,void *dummy,PetscErrorCode *ierr)
3128e27ec22SSatish Balay {
313a6570f20SBarry Smith   *ierr = SNESMonitorDefault(*snes,*its,*fgnorm,dummy);
3148e27ec22SSatish Balay }
3158e27ec22SSatish Balay 
316a6570f20SBarry Smith void snesmonitorsolution_(SNES *snes,PetscInt *its,PetscReal *fgnorm,void *dummy,PetscErrorCode *ierr)
3178e27ec22SSatish Balay {
318a6570f20SBarry Smith   *ierr = SNESMonitorSolution(*snes,*its,*fgnorm,dummy);
3198e27ec22SSatish Balay }
3208e27ec22SSatish Balay 
321a6570f20SBarry Smith void snesmonitorsolutionupdate_(SNES *snes,PetscInt *its,PetscReal *fgnorm,void *dummy,PetscErrorCode *ierr)
3228e27ec22SSatish Balay {
323a6570f20SBarry Smith   *ierr = SNESMonitorSolutionUpdate(*snes,*its,*fgnorm,dummy);
3248e27ec22SSatish Balay }
3258e27ec22SSatish Balay 
3268e27ec22SSatish Balay 
3276895c445SBarry 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)
3288e27ec22SSatish Balay {
3298e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(mctx);
330a6570f20SBarry Smith   if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitordefault_) {
331a6570f20SBarry Smith     *ierr = SNESMonitorSet(*snes,SNESMonitorDefault,0,0);
332a6570f20SBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorsolution_) {
333a6570f20SBarry Smith     *ierr = SNESMonitorSet(*snes,SNESMonitorSolution,0,0);
334a6570f20SBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorsolutionupdate_) {
335a6570f20SBarry Smith     *ierr = SNESMonitorSet(*snes,SNESMonitorSolutionUpdate,0,0);
3364619e776SBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorlgresidualnorm_) {
3374619e776SBarry Smith     *ierr = SNESMonitorSet(*snes,SNESMonitorLGResidualNorm,0,0);
3388e27ec22SSatish Balay   } else {
339f6291634SJed Brown     *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.monitor,(PetscVoidFunction)func,mctx);
340f6291634SJed Brown     if (*ierr) return;
3418e27ec22SSatish Balay     if (FORTRANNULLFUNCTION(mondestroy)) {
3427f7931b9SBarry Smith       *ierr = SNESMonitorSet(*snes,oursnesmonitor,*snes,PETSC_NULL);
3438e27ec22SSatish Balay     } else {
3445d4ebb51SBarry Smith       CHKFORTRANNULLFUNCTION(mondestroy);
345f6291634SJed Brown       *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.mondestroy,(PetscVoidFunction)mondestroy,mctx);
346f6291634SJed Brown       if (!*ierr) *ierr = SNESMonitorSet(*snes,oursnesmonitor,*snes,ourmondestroy);
3478e27ec22SSatish Balay     }
3488e27ec22SSatish Balay   }
3498e27ec22SSatish Balay }
3508e27ec22SSatish Balay 
351a6dfd86eSKarl Rupp void PETSC_STDCALL  snesgetsneslinesearch_(SNES *snes,SNESLineSearch *linesearch, int *__ierr)
352a6dfd86eSKarl Rupp {
353f1c6b773SPeter Brune   *__ierr = SNESGetSNESLineSearch(*snes, linesearch);
354ea5d4fccSPeter Brune }
3558e27ec22SSatish Balay 
3568e27ec22SSatish Balay EXTERN_C_END
357