xref: /petsc/src/snes/interface/ftn-custom/zsnesf.c (revision 3c2ee7ea28ff2053bfb45ee90a0bd0447e5c10ec)
1af0996ceSBarry Smith #include <petsc/private/fortranimpl.h>
2c6db04a5SJed Brown #include <petscsnes.h>
3665c2dedSJed Brown #include <petscviewer.h>
48ad9143bSBarry Smith #include <petsc/private/f90impl.h>
58e27ec22SSatish Balay 
68e27ec22SSatish Balay #if defined(PETSC_HAVE_FORTRAN_CAPS)
7df66969eSBarry Smith #define matmffdcomputejacobian_          MATMFFDCOMPUTEJACOBIAN
86ce558aeSBarry Smith #define snessolve_                       SNESSOLVE
98d359177SBarry Smith #define snescomputejacobiandefault_      SNESCOMPUTEJACOBIANDEFAULT
108d359177SBarry Smith #define snescomputejacobiandefaultcolor_ SNESCOMPUTEJACOBIANDEFAULTCOLOR
118e27ec22SSatish Balay #define snessetjacobian_                 SNESSETJACOBIAN
128e27ec22SSatish Balay #define snesgetoptionsprefix_            SNESGETOPTIONSPREFIX
138e27ec22SSatish Balay #define snesgettype_                     SNESGETTYPE
148e27ec22SSatish Balay #define snessetfunction_                 SNESSETFUNCTION
15be95d8f1SBarry Smith #define snessetngs_                       SNESSETNGS
16dfef22ccSBarry Smith #define snessetupdate_                    SNESSETUPDATE
178e27ec22SSatish Balay #define snesgetfunction_                 SNESGETFUNCTION
18be95d8f1SBarry Smith #define snesgetngs_                       SNESGETNGS
198e27ec22SSatish Balay #define snessetconvergencetest_          SNESSETCONVERGENCETEST
208d359177SBarry Smith #define snesconvergeddefault_            SNESCONVERGEDDEFAULT
21e07f7f94SSatish Balay #define snesconvergedskip_               SNESCONVERGEDSKIP
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
304619e776SBarry Smith #define snesmonitorlgresidualnorm_       SNESMONITORLGRESIDUALNORM
31a6570f20SBarry Smith #define snesmonitorsolutionupdate_       SNESMONITORSOLUTIONUPDATE
32a6570f20SBarry Smith #define snesmonitorset_                  SNESMONITORSET
337cb011f5SBarry Smith #define snesnewtontrssetpostcheck_       SNESNEWTONTRSETPOSTCHECK
347cb011f5SBarry Smith #Elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
35df66969eSBarry Smith #define matmffdcomputejacobian_          matmffdcomputejacobian
366ce558aeSBarry Smith #define snessolve_                       snessolve
378d359177SBarry Smith #define snescomputejacobiandefault_      snescomputejacobiandefault
388d359177SBarry Smith #define snescomputejacobiandefaultcolor_ snescomputejacobiandefaultcolor
398e27ec22SSatish Balay #define snessetjacobian_                 snessetjacobian
408e27ec22SSatish Balay #define snesgetoptionsprefix_            snesgetoptionsprefix
418e27ec22SSatish Balay #define snesgettype_                     snesgettype
428e27ec22SSatish Balay #define snessetfunction_                 snessetfunction
43be95d8f1SBarry Smith #define snessetngs_                       snessetngs
44dfef22ccSBarry Smith #define snessetupdate_                    snessetupdate
458e27ec22SSatish Balay #define snesgetfunction_                 snesgetfunction
46be95d8f1SBarry Smith #define snesgetngs_                       snesgetngs
478e27ec22SSatish Balay #define snessetconvergencetest_          snessetconvergencetest
488d359177SBarry Smith #define snesconvergeddefault_            snesconvergeddefault
49e07f7f94SSatish Balay #define snesconvergedskip_               snesconvergedskip
508e27ec22SSatish Balay #define snesview_                        snesview
518e27ec22SSatish Balay #define snesgetjacobian_                 snesgetjacobian
528e27ec22SSatish Balay #define snesgetconvergencehistory_       snesgetconvergencehistory
538e27ec22SSatish Balay #define snessettype_                     snessettype
548e27ec22SSatish Balay #define snesappendoptionsprefix_         snesappendoptionsprefix
558e27ec22SSatish Balay #define snessetoptionsprefix_            snessetoptionsprefix
564619e776SBarry Smith #define snesmonitorlgresidualnorm_       snesmonitorlgresidualnorm
57a6570f20SBarry Smith #define snesmonitordefault_              snesmonitordefault
58a6570f20SBarry Smith #define snesmonitorsolution_             snesmonitorsolution
59a6570f20SBarry Smith #define snesmonitorsolutionupdate_       snesmonitorsolutionupdate
60a6570f20SBarry Smith #define snesmonitorset_                  snesmonitorset
617cb011f5SBarry Smith #define snesnewtontrssetpostcheck_       snesnewtontrssetpostcheck
628e27ec22SSatish Balay #endif
638e27ec22SSatish Balay 
64f6291634SJed Brown static struct {
65f6291634SJed Brown   PetscFortranCallbackId function;
66f6291634SJed Brown   PetscFortranCallbackId test;
67f6291634SJed Brown   PetscFortranCallbackId destroy;
68f6291634SJed Brown   PetscFortranCallbackId jacobian;
69f6291634SJed Brown   PetscFortranCallbackId monitor;
70f6291634SJed Brown   PetscFortranCallbackId mondestroy;
71be95d8f1SBarry Smith   PetscFortranCallbackId ngs;
72dfef22ccSBarry Smith   PetscFortranCallbackId update;
737cb011f5SBarry Smith   PetscFortranCallbackId trpostcheck;
7489e00c7dSSatish Balay #if defined(PETSC_HAVE_F90_2PTR_ARG)
7589e00c7dSSatish Balay   PetscFortranCallbackId function_pgiptr;
76*3c2ee7eaSBarry Smith   PetscFortranCallbackId trpostcheck_pgiptr;
7789e00c7dSSatish Balay #endif
78f6291634SJed Brown } _cb;
7990b77ac2SPeter Brune 
807cb011f5SBarry Smith static PetscErrorCode ourtrpostcheckfunction(SNES snes,Vec x,Vec y,Vec w,PetscBool *changed_w,void *ctx)
817cb011f5SBarry Smith {
827cb011f5SBarry Smith #if defined(PETSC_HAVE_F90_2PTR_ARG)
837cb011f5SBarry Smith   void* ptr;
84*3c2ee7eaSBarry Smith   PetscObjectGetFortranCallback((PetscObject)snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.trpostcheck_pgiptr,NULL,&ptr);
857cb011f5SBarry Smith #endif
867cb011f5SBarry Smith   PetscObjectUseFortranCallback(snes,_cb.trpostcheck,(SNES*,Vec*,Vec*,Vec *,PetscBool *,void*,PetscErrorCode* PETSC_F90_2PTR_PROTO_NOVAR),(&snes,&x,&y,&w,changed_w,_ctx,&ierr PETSC_F90_2PTR_PARAM(ptr)));
877cb011f5SBarry Smith }
887cb011f5SBarry Smith 
89c793d214SBarry Smith PETSC_EXTERN void PETSC_STDCALL snesnewtontrsetpostcheck_(SNES *snes, void (PETSC_STDCALL *func)(SNES,Vec,Vec,Vec,PetscBool*,void*),void *ctx,PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(ptr))
907cb011f5SBarry Smith {
917cb011f5SBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.trpostcheck,(PetscVoidFunction)func,ctx);if (*ierr) return;
927cb011f5SBarry Smith #if defined(PETSC_HAVE_F90_2PTR_ARG)
93*3c2ee7eaSBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.trpostcheck_pgiptr,NULL,ptr);if (*ierr) return;
947cb011f5SBarry Smith #endif
957cb011f5SBarry Smith   SNESNewtonTRSetPostCheck(*snes,ourtrpostcheckfunction,NULL);
967cb011f5SBarry Smith }
977cb011f5SBarry Smith 
987cb011f5SBarry Smith 
997cb011f5SBarry Smith 
1008e27ec22SSatish Balay static PetscErrorCode oursnesfunction(SNES snes,Vec x,Vec f,void *ctx)
1018e27ec22SSatish Balay {
10289e00c7dSSatish Balay #if defined(PETSC_HAVE_F90_2PTR_ARG)
10389e00c7dSSatish Balay   void* ptr;
10489e00c7dSSatish Balay   PetscObjectGetFortranCallback((PetscObject)snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.function_pgiptr,NULL,&ptr);
10589e00c7dSSatish Balay #endif
10689e00c7dSSatish Balay   PetscObjectUseFortranCallback(snes,_cb.function,(SNES*,Vec*,Vec*,void*,PetscErrorCode* PETSC_F90_2PTR_PROTO_NOVAR),(&snes,&x,&f,_ctx,&ierr PETSC_F90_2PTR_PARAM(ptr)));
1078e27ec22SSatish Balay }
108b8ebb45fSBarry Smith 
10906ee9f85SBarry Smith static PetscErrorCode oursnestest(SNES snes,PetscInt it,PetscReal a,PetscReal d,PetscReal c,SNESConvergedReason *reason,void *ctx)
1108e27ec22SSatish Balay {
111f6291634SJed Brown   PetscObjectUseFortranCallback(snes,_cb.test,(SNES*,PetscInt*,PetscReal*,PetscReal*,PetscReal*,SNESConvergedReason*,void*,PetscErrorCode*),(&snes,&it,&a,&d,&c,reason,_ctx,&ierr));
1127f7931b9SBarry Smith }
1137f7931b9SBarry Smith 
1147f7931b9SBarry Smith static PetscErrorCode ourdestroy(void *ctx)
1157f7931b9SBarry Smith {
116f6291634SJed Brown   PetscObjectUseFortranCallback(ctx,_cb.destroy,(void*,PetscErrorCode*),(_ctx,&ierr));
1178e27ec22SSatish Balay }
1188e27ec22SSatish Balay 
119d1e9a80fSBarry Smith static PetscErrorCode oursnesjacobian(SNES snes,Vec x,Mat m,Mat p,void *ctx)
1208e27ec22SSatish Balay {
121d1e9a80fSBarry Smith   PetscObjectUseFortranCallback(snes,_cb.jacobian,(SNES*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),(&snes,&x,&m,&p,_ctx,&ierr));
1228e27ec22SSatish Balay }
123f6291634SJed Brown 
124dfef22ccSBarry Smith static PetscErrorCode oursnesupdate(SNES snes,PetscInt i)
125dfef22ccSBarry Smith {
126dfef22ccSBarry Smith   PetscObjectUseFortranCallback(snes,_cb.update,(SNES*,PetscInt *,PetscErrorCode*),(&snes,&i,&ierr));
127dfef22ccSBarry Smith }
128be95d8f1SBarry Smith static PetscErrorCode oursnesngs(SNES snes,Vec x,Vec b,void *ctx)
12990b77ac2SPeter Brune {
130be95d8f1SBarry Smith   PetscObjectUseFortranCallback(snes,_cb.ngs,(SNES*,Vec*,Vec*,void*,PetscErrorCode*),(&snes,&x,&b,_ctx,&ierr));
13190b77ac2SPeter Brune }
1328e27ec22SSatish Balay static PetscErrorCode oursnesmonitor(SNES snes,PetscInt i,PetscReal d,void *ctx)
1338e27ec22SSatish Balay {
134f6291634SJed Brown   PetscObjectUseFortranCallback(snes,_cb.monitor,(SNES*,PetscInt*,PetscReal*,void*,PetscErrorCode*),(&snes,&i,&d,_ctx,&ierr));
1358e27ec22SSatish Balay }
136c2efdce3SBarry Smith static PetscErrorCode ourmondestroy(void **ctx)
1378e27ec22SSatish Balay {
138f6291634SJed Brown   SNES snes = (SNES)*ctx;
139f6291634SJed Brown   PetscObjectUseFortranCallback(snes,_cb.mondestroy,(void*,PetscErrorCode*),(_ctx,&ierr));
1408e27ec22SSatish Balay }
1418e27ec22SSatish Balay 
1428e27ec22SSatish Balay /* ---------------------------------------------------------*/
1438e27ec22SSatish Balay /*
1448d359177SBarry Smith      snescomputejacobiandefault() and snescomputejacobiandefaultcolor()
1458e27ec22SSatish Balay   These can be used directly from Fortran but are mostly so that
1468e27ec22SSatish Balay   Fortran SNESSetJacobian() will properly handle the defaults being passed in.
1478e27ec22SSatish Balay 
1488e27ec22SSatish Balay   functions, hence no STDCALL
1498e27ec22SSatish Balay */
150d1e9a80fSBarry Smith PETSC_EXTERN void matmffdcomputejacobian_(SNES *snes,Vec *x,Mat *m,Mat *p,void *ctx,PetscErrorCode *ierr)
151df66969eSBarry Smith {
152d1e9a80fSBarry Smith   *ierr = MatMFFDComputeJacobian(*snes,*x,*m,*p,ctx);
153df66969eSBarry Smith }
154d1e9a80fSBarry Smith PETSC_EXTERN void snescomputejacobiandefault_(SNES *snes,Vec *x,Mat *m,Mat *p,void *ctx,PetscErrorCode *ierr)
1558e27ec22SSatish Balay {
156d1e9a80fSBarry Smith   *ierr = SNESComputeJacobianDefault(*snes,*x,*m,*p,ctx);
1578e27ec22SSatish Balay }
158d1e9a80fSBarry Smith PETSC_EXTERN void  snescomputejacobiandefaultcolor_(SNES *snes,Vec *x,Mat *m,Mat *p,void *ctx,PetscErrorCode *ierr)
1598e27ec22SSatish Balay {
160d1e9a80fSBarry Smith   *ierr = SNESComputeJacobianDefaultColor(*snes,*x,*m,*p,*(MatFDColoring*)ctx);
1618e27ec22SSatish Balay }
1628e27ec22SSatish Balay 
1638cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snessetjacobian_(SNES *snes,Mat *A,Mat *B,
164d1e9a80fSBarry Smith                                     void (PETSC_STDCALL *func)(SNES*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),
165f5af7f23SKarl Rupp                                     void *ctx,PetscErrorCode *ierr)
1668e27ec22SSatish Balay {
167f5b6597dSBarry Smith   CHKFORTRANNULLFUNCTION(func);
1688d359177SBarry Smith   if ((PetscVoidFunction)func == (PetscVoidFunction)snescomputejacobiandefault_) {
1698d359177SBarry Smith     *ierr = SNESSetJacobian(*snes,*A,*B,SNESComputeJacobianDefault,ctx);
1708d359177SBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snescomputejacobiandefaultcolor_) {
171e025ade3SBarry Smith     if (!ctx) {
172e025ade3SBarry Smith       *ierr = PETSC_ERR_ARG_NULL;
173e025ade3SBarry Smith       return;
174e025ade3SBarry Smith     }
1758d359177SBarry Smith     *ierr = SNESSetJacobian(*snes,*A,*B,SNESComputeJacobianDefaultColor,*(MatFDColoring*)ctx);
176df66969eSBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)matmffdcomputejacobian_) {
177df66969eSBarry Smith     *ierr = SNESSetJacobian(*snes,*A,*B,MatMFFDComputeJacobian,ctx);
1788e27ec22SSatish Balay   } else {
179f6291634SJed Brown     *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.jacobian,(PetscVoidFunction)func,ctx);
1800298fd71SBarry Smith     if (!*ierr) *ierr = SNESSetJacobian(*snes,*A,*B,oursnesjacobian,NULL);
1818e27ec22SSatish Balay   }
1828e27ec22SSatish Balay }
1838e27ec22SSatish Balay /* -------------------------------------------------------------*/
1848e27ec22SSatish Balay 
185390e1bf2SBarry Smith PETSC_EXTERN void PETSC_STDCALL snesgetoptionsprefix_(SNES *snes,char* prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
1868e27ec22SSatish Balay {
1878e27ec22SSatish Balay   const char *tname;
1888e27ec22SSatish Balay 
1898e27ec22SSatish Balay   *ierr = SNESGetOptionsPrefix(*snes,&tname);
1908e27ec22SSatish Balay   *ierr = PetscStrncpy(prefix,tname,len);if (*ierr) return;
191d6a8cea5SBarry Smith   FIXRETURNCHAR(PETSC_TRUE,prefix,len);
1928e27ec22SSatish Balay }
1938e27ec22SSatish Balay 
194390e1bf2SBarry Smith PETSC_EXTERN void PETSC_STDCALL snesgettype_(SNES *snes,char* name PETSC_MIXED_LEN(len), PetscErrorCode *ierr PETSC_END_LEN(len))
1958e27ec22SSatish Balay {
1968e27ec22SSatish Balay   const char *tname;
1978e27ec22SSatish Balay 
1988e27ec22SSatish Balay   *ierr = SNESGetType(*snes,&tname);
1998e27ec22SSatish Balay   *ierr = PetscStrncpy(name,tname,len);if (*ierr) return;
2007c363081SBarry Smith   FIXRETURNCHAR(PETSC_TRUE,name,len);
2018e27ec22SSatish Balay }
202e3da1266SHong Zhang 
2038e27ec22SSatish Balay /* ---------------------------------------------------------*/
2048e27ec22SSatish Balay 
2058e27ec22SSatish Balay /*
2068e27ec22SSatish Balay    These are not usually called from Fortran but allow Fortran users
2078e27ec22SSatish Balay    to transparently set these monitors from .F code
2088e27ec22SSatish Balay 
2098e27ec22SSatish Balay    functions, hence no STDCALL
2108e27ec22SSatish Balay */
2118e27ec22SSatish Balay 
21289e00c7dSSatish Balay PETSC_EXTERN void PETSC_STDCALL snessetfunction_(SNES *snes,Vec *r,void (PETSC_STDCALL *func)(SNES*,Vec*,Vec*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(ptr))
2138e27ec22SSatish Balay {
214aecf964fSBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.function,(PetscVoidFunction)func,ctx);if (*ierr) return;
21589e00c7dSSatish Balay #if defined(PETSC_HAVE_F90_2PTR_ARG)
216aecf964fSBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.function_pgiptr,NULL,ptr);if (*ierr) return;
21789e00c7dSSatish Balay #endif
218aecf964fSBarry Smith   *ierr = SNESSetFunction(*snes,*r,oursnesfunction,NULL);
2198e27ec22SSatish Balay }
220c79ef259SPeter Brune 
221c79ef259SPeter Brune 
222be95d8f1SBarry Smith PETSC_EXTERN void PETSC_STDCALL snessetngs_(SNES *snes,void (PETSC_STDCALL *func)(SNES*,Vec*,Vec*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr)
223c79ef259SPeter Brune {
224aecf964fSBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.ngs,(PetscVoidFunction)func,ctx);if (*ierr) return;
225aecf964fSBarry Smith   *ierr = SNESSetNGS(*snes,oursnesngs,NULL);
226c79ef259SPeter Brune }
227dfef22ccSBarry Smith PETSC_EXTERN void PETSC_STDCALL snessetupdate_(SNES *snes,void (PETSC_STDCALL *func)(SNES*,PetscInt*,PetscErrorCode*),PetscErrorCode *ierr)
228dfef22ccSBarry Smith {
229aecf964fSBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.update,(PetscVoidFunction)func,NULL);if (*ierr) return;
230aecf964fSBarry Smith   *ierr = SNESSetUpdate(*snes,oursnesupdate);
231dfef22ccSBarry Smith }
2328e27ec22SSatish Balay /* ---------------------------------------------------------*/
2338e27ec22SSatish Balay 
2348e27ec22SSatish Balay /* the func argument is ignored */
235146935d7SSatish Balay PETSC_EXTERN void PETSC_STDCALL snesgetfunction_(SNES *snes,Vec *r,void (PETSC_STDCALL *func)(SNES,Vec,Vec,void*),void **ctx,PetscErrorCode *ierr)
2368e27ec22SSatish Balay {
2378e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(r);
2380298fd71SBarry Smith   *ierr = SNESGetFunction(*snes,r,NULL,NULL); if (*ierr) return;
239146935d7SSatish Balay   if ((PetscVoidFunction)func == (PetscVoidFunction)PETSC_NULL_FUNCTION_Fortran) return;
2400298fd71SBarry Smith   *ierr = PetscObjectGetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.function,NULL,ctx);
2418e27ec22SSatish Balay }
242c79ef259SPeter Brune 
243be95d8f1SBarry Smith PETSC_EXTERN void PETSC_STDCALL snesgetngs_(SNES *snes,void *func,void **ctx,PetscErrorCode *ierr)
244c79ef259SPeter Brune {
245be95d8f1SBarry Smith   *ierr = PetscObjectGetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.ngs,NULL,ctx);
246c79ef259SPeter Brune }
247c79ef259SPeter Brune 
2488e27ec22SSatish Balay /*----------------------------------------------------------------------*/
2498e27ec22SSatish Balay 
25069c1e2abSSatish Balay PETSC_EXTERN void snesconvergeddefault_(SNES *snes,PetscInt *it,PetscReal *a,PetscReal *b,PetscReal *c,SNESConvergedReason *r, void *ct,PetscErrorCode *ierr)
2513f149594SLisandro Dalcin {
2528d359177SBarry Smith   *ierr = SNESConvergedDefault(*snes,*it,*a,*b,*c,r,ct);
2533f149594SLisandro Dalcin }
2543f149594SLisandro Dalcin 
255e07f7f94SSatish Balay PETSC_EXTERN void snesconvergedskip_(SNES *snes,PetscInt *it,PetscReal *a,PetscReal *b,PetscReal *c,SNESConvergedReason *r,void *ct,PetscErrorCode *ierr)
2563f149594SLisandro Dalcin {
257e2a6519dSDmitry Karpeev   *ierr = SNESConvergedSkip(*snes,*it,*a,*b,*c,r,ct);
2583f149594SLisandro Dalcin }
2593f149594SLisandro Dalcin 
2608cc058d9SJed Brown PETSC_EXTERN 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)
2618e27ec22SSatish Balay {
2623f22127dSBarry Smith   CHKFORTRANNULLFUNCTION(destroy);
2633f149594SLisandro Dalcin 
2648d359177SBarry Smith   if ((PetscVoidFunction)func == (PetscVoidFunction)snesconvergeddefault_) {
2658d359177SBarry Smith     *ierr = SNESSetConvergenceTest(*snes,SNESConvergedDefault,0,0);
266e07f7f94SSatish Balay   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesconvergedskip_) {
267e2a6519dSDmitry Karpeev     *ierr = SNESSetConvergenceTest(*snes,SNESConvergedSkip,0,0);
2688e27ec22SSatish Balay   } else {
269aecf964fSBarry Smith     *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.test,(PetscVoidFunction)func,cctx);if (*ierr) return;
270aecf964fSBarry Smith     *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.destroy,(PetscVoidFunction)destroy,cctx);if (*ierr) return;
271aecf964fSBarry Smith     *ierr = SNESSetConvergenceTest(*snes,oursnestest,*snes,ourdestroy);
2728e27ec22SSatish Balay   }
2738e27ec22SSatish Balay }
2748e27ec22SSatish Balay /*----------------------------------------------------------------------*/
2758e27ec22SSatish Balay 
2768cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snesview_(SNES *snes,PetscViewer *viewer, PetscErrorCode *ierr)
2778e27ec22SSatish Balay {
2788e27ec22SSatish Balay   PetscViewer v;
2798e27ec22SSatish Balay   PetscPatchDefaultViewers_Fortran(viewer,v);
2808e27ec22SSatish Balay   *ierr = SNESView(*snes,v);
2818e27ec22SSatish Balay }
2828e27ec22SSatish Balay 
2838e27ec22SSatish Balay /*  func is currently ignored from Fortran */
2848cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snesgetjacobian_(SNES *snes,Mat *A,Mat *B,int *func,void **ctx,PetscErrorCode *ierr)
2858e27ec22SSatish Balay {
2868e27ec22SSatish Balay   CHKFORTRANNULLINTEGER(ctx);
2878e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(A);
2888e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(B);
2890298fd71SBarry Smith   *ierr = SNESGetJacobian(*snes,A,B,0,NULL); if (*ierr) return;
2900298fd71SBarry Smith   *ierr = PetscObjectGetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.jacobian,NULL,ctx);
291f2e0d3f1SJed Brown 
2928e27ec22SSatish Balay }
2938e27ec22SSatish Balay 
2948cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snesgetconvergencehistory_(SNES *snes,PetscInt *na,PetscErrorCode *ierr)
2958e27ec22SSatish Balay {
2960298fd71SBarry Smith   *ierr = SNESGetConvergenceHistory(*snes,NULL,NULL,na);
2978e27ec22SSatish Balay }
2988e27ec22SSatish Balay 
299390e1bf2SBarry Smith PETSC_EXTERN 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);
304d49bb8f9SBarry Smith   *ierr = SNESSetType(*snes,t);if (*ierr) return;
3058e27ec22SSatish Balay   FREECHAR(type,t);
3068e27ec22SSatish Balay }
3078e27ec22SSatish Balay 
308390e1bf2SBarry Smith PETSC_EXTERN 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);
313d49bb8f9SBarry Smith   *ierr = SNESAppendOptionsPrefix(*snes,t);if (*ierr) return;
3148e27ec22SSatish Balay   FREECHAR(prefix,t);
3158e27ec22SSatish Balay }
3168e27ec22SSatish Balay 
317390e1bf2SBarry Smith PETSC_EXTERN 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);
322d49bb8f9SBarry Smith   *ierr = SNESSetOptionsPrefix(*snes,t);if (*ierr) return;
3238e27ec22SSatish Balay   FREECHAR(prefix,t);
3248e27ec22SSatish Balay }
3258e27ec22SSatish Balay 
3268e27ec22SSatish Balay /*----------------------------------------------------------------------*/
3278e27ec22SSatish Balay /* functions, hence no STDCALL */
3288e27ec22SSatish Balay 
3299611d799SBarry Smith PETSC_EXTERN void snesmonitorlgresidualnorm_(SNES *snes,PetscInt *its,PetscReal *fgnorm,PetscObject *dummy,PetscErrorCode *ierr)
3308e27ec22SSatish Balay {
3314619e776SBarry Smith   *ierr = SNESMonitorLGResidualNorm(*snes,*its,*fgnorm,dummy);
3328e27ec22SSatish Balay }
3338e27ec22SSatish Balay 
33452f0073cSBarry Smith PETSC_EXTERN void snesmonitordefault_(SNES *snes,PetscInt *its,PetscReal *fgnorm,PetscViewerAndFormat **dummy,PetscErrorCode *ierr)
3358e27ec22SSatish Balay {
336410efd14SBarry Smith   *ierr = SNESMonitorDefault(*snes,*its,*fgnorm,*dummy);
3378e27ec22SSatish Balay }
3388e27ec22SSatish Balay 
33952f0073cSBarry Smith PETSC_EXTERN void snesmonitorsolution_(SNES *snes,PetscInt *its,PetscReal *fgnorm,PetscViewerAndFormat **dummy,PetscErrorCode *ierr)
3408e27ec22SSatish Balay {
341410efd14SBarry Smith   *ierr = SNESMonitorSolution(*snes,*its,*fgnorm,*dummy);
3428e27ec22SSatish Balay }
3438e27ec22SSatish Balay 
34452f0073cSBarry Smith PETSC_EXTERN void snesmonitorsolutionupdate_(SNES *snes,PetscInt *its,PetscReal *fgnorm,PetscViewerAndFormat **dummy,PetscErrorCode *ierr)
3458e27ec22SSatish Balay {
346410efd14SBarry Smith   *ierr = SNESMonitorSolutionUpdate(*snes,*its,*fgnorm,*dummy);
3478e27ec22SSatish Balay }
3488e27ec22SSatish Balay 
3498e27ec22SSatish Balay 
3508cc058d9SJed Brown PETSC_EXTERN 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 {
352aecf964fSBarry Smith   CHKFORTRANNULLFUNCTION(mondestroy);
353a6570f20SBarry Smith   if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitordefault_) {
3541cb03803SBarry Smith     *ierr = SNESMonitorSet(*snes,(PetscErrorCode (*)(SNES,PetscInt,PetscReal,void*))SNESMonitorDefault,*(PetscViewerAndFormat**)mctx,(PetscErrorCode (*)(void **))PetscViewerAndFormatDestroy);
355a6570f20SBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorsolution_) {
3561cb03803SBarry Smith     *ierr = SNESMonitorSet(*snes,(PetscErrorCode (*)(SNES,PetscInt,PetscReal,void*))SNESMonitorSolution,*(PetscViewerAndFormat**)mctx,(PetscErrorCode (*)(void **))PetscViewerAndFormatDestroy);
357a6570f20SBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorsolutionupdate_) {
3581cb03803SBarry Smith     *ierr = SNESMonitorSet(*snes,(PetscErrorCode (*)(SNES,PetscInt,PetscReal,void*))SNESMonitorSolutionUpdate,*(PetscViewerAndFormat**)mctx,(PetscErrorCode (*)(void **))PetscViewerAndFormatDestroy);
3594619e776SBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorlgresidualnorm_) {
3603e7ff0edSBarry Smith     *ierr = SNESMonitorSet(*snes,(PetscErrorCode (*)(SNES,PetscInt,PetscReal,void*))SNESMonitorLGResidualNorm,0,0);
3618e27ec22SSatish Balay   } else {
362aecf964fSBarry Smith     *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.monitor,(PetscVoidFunction)func,mctx);if (*ierr) return;
363aecf964fSBarry Smith     *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.mondestroy,(PetscVoidFunction)mondestroy,mctx);if (*ierr) return;
364aecf964fSBarry Smith     *ierr = SNESMonitorSet(*snes,oursnesmonitor,*snes,ourmondestroy);
3658e27ec22SSatish Balay   }
3668e27ec22SSatish Balay }
3678e27ec22SSatish Balay 
368