xref: /petsc/src/snes/interface/ftn-custom/zsnesf.c (revision fe2efc57b7777594bce7568e90822861480cbdc8)
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
33c9368356SGlenn Hammond #define snesnewtontrsetprecheck_         SNESNEWTONTRSETPRECHECK
343b42469aSBarry Smith #define snesnewtontrsetpostcheck_        SNESNEWTONTRSETPOSTCHECK
35*fe2efc57SMark #define snesviewfromoptions_             SNESVIEWFROMOPTIONS
364e2a09fcSBarry Smith #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
37df66969eSBarry Smith #define matmffdcomputejacobian_          matmffdcomputejacobian
386ce558aeSBarry Smith #define snessolve_                       snessolve
398d359177SBarry Smith #define snescomputejacobiandefault_      snescomputejacobiandefault
408d359177SBarry Smith #define snescomputejacobiandefaultcolor_ snescomputejacobiandefaultcolor
418e27ec22SSatish Balay #define snessetjacobian_                 snessetjacobian
428e27ec22SSatish Balay #define snesgetoptionsprefix_            snesgetoptionsprefix
438e27ec22SSatish Balay #define snesgettype_                     snesgettype
448e27ec22SSatish Balay #define snessetfunction_                 snessetfunction
45be95d8f1SBarry Smith #define snessetngs_                      snessetngs
46dfef22ccSBarry Smith #define snessetupdate_                   snessetupdate
478e27ec22SSatish Balay #define snesgetfunction_                 snesgetfunction
48be95d8f1SBarry Smith #define snesgetngs_                      snesgetngs
498e27ec22SSatish Balay #define snessetconvergencetest_          snessetconvergencetest
508d359177SBarry Smith #define snesconvergeddefault_            snesconvergeddefault
51e07f7f94SSatish Balay #define snesconvergedskip_               snesconvergedskip
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
584619e776SBarry Smith #define snesmonitorlgresidualnorm_       snesmonitorlgresidualnorm
59a6570f20SBarry Smith #define snesmonitordefault_              snesmonitordefault
60a6570f20SBarry Smith #define snesmonitorsolution_             snesmonitorsolution
61a6570f20SBarry Smith #define snesmonitorsolutionupdate_       snesmonitorsolutionupdate
62a6570f20SBarry Smith #define snesmonitorset_                  snesmonitorset
63c9368356SGlenn Hammond #define snesnewtontrsetprecheck_         snesnewtontrsetprecheck
643b42469aSBarry Smith #define snesnewtontrsetpostcheck_        snesnewtontrsetpostcheck
65*fe2efc57SMark #define snesviewfromoptions_             snesviewfromoptions
668e27ec22SSatish Balay #endif
678e27ec22SSatish Balay 
68f6291634SJed Brown static struct {
69f6291634SJed Brown   PetscFortranCallbackId function;
70f6291634SJed Brown   PetscFortranCallbackId test;
71f6291634SJed Brown   PetscFortranCallbackId destroy;
72f6291634SJed Brown   PetscFortranCallbackId jacobian;
73f6291634SJed Brown   PetscFortranCallbackId monitor;
74f6291634SJed Brown   PetscFortranCallbackId mondestroy;
75be95d8f1SBarry Smith   PetscFortranCallbackId ngs;
76dfef22ccSBarry Smith   PetscFortranCallbackId update;
77c9368356SGlenn Hammond   PetscFortranCallbackId trprecheck;
787cb011f5SBarry Smith   PetscFortranCallbackId trpostcheck;
7989e00c7dSSatish Balay #if defined(PETSC_HAVE_F90_2PTR_ARG)
8089e00c7dSSatish Balay   PetscFortranCallbackId function_pgiptr;
81c9368356SGlenn Hammond   PetscFortranCallbackId trprecheck_pgiptr;
823c2ee7eaSBarry Smith   PetscFortranCallbackId trpostcheck_pgiptr;
8389e00c7dSSatish Balay #endif
84f6291634SJed Brown } _cb;
8590b77ac2SPeter Brune 
86c9368356SGlenn Hammond static PetscErrorCode ourtrprecheckfunction(SNES snes,Vec x,Vec y,PetscBool *changed_y,void *ctx)
87c9368356SGlenn Hammond {
88c9368356SGlenn Hammond #if defined(PETSC_HAVE_F90_2PTR_ARG)
89c9368356SGlenn Hammond   void* ptr;
90c9368356SGlenn Hammond   PetscObjectGetFortranCallback((PetscObject)snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.trprecheck_pgiptr,NULL,&ptr);
91c9368356SGlenn Hammond #endif
92c9368356SGlenn Hammond   PetscObjectUseFortranCallback(snes,_cb.trprecheck,(SNES*,Vec*,Vec*,PetscBool *,void*,PetscErrorCode* PETSC_F90_2PTR_PROTO_NOVAR),(&snes,&x,&y,changed_y,_ctx,&ierr PETSC_F90_2PTR_PARAM(ptr)));
93c9368356SGlenn Hammond }
94c9368356SGlenn Hammond 
95c9368356SGlenn Hammond PETSC_EXTERN void PETSC_STDCALL snesnewtontrsetprecheck_(SNES *snes, void (PETSC_STDCALL *func)(SNES,Vec,Vec,PetscBool*,void*),void *ctx,PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(ptr))
96c9368356SGlenn Hammond {
97c9368356SGlenn Hammond   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.trprecheck,(PetscVoidFunction)func,ctx);if (*ierr) return;
98c9368356SGlenn Hammond #if defined(PETSC_HAVE_F90_2PTR_ARG)
99c9368356SGlenn Hammond   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.trprecheck_pgiptr,NULL,ptr);if (*ierr) return;
100c9368356SGlenn Hammond #endif
101c9368356SGlenn Hammond   SNESNewtonTRSetPreCheck(*snes,ourtrprecheckfunction,NULL);
102c9368356SGlenn Hammond }
103c9368356SGlenn Hammond 
104c9368356SGlenn Hammond 
105c9368356SGlenn Hammond static PetscErrorCode ourtrpostcheckfunction(SNES snes,Vec x,Vec y,Vec w,PetscBool *changed_y,PetscBool *changed_w,void *ctx)
1067cb011f5SBarry Smith {
1077cb011f5SBarry Smith #if defined(PETSC_HAVE_F90_2PTR_ARG)
1087cb011f5SBarry Smith   void* ptr;
1093c2ee7eaSBarry Smith   PetscObjectGetFortranCallback((PetscObject)snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.trpostcheck_pgiptr,NULL,&ptr);
1107cb011f5SBarry Smith #endif
111c9368356SGlenn Hammond   PetscObjectUseFortranCallback(snes,_cb.trpostcheck,(SNES*,Vec*,Vec*,Vec *,PetscBool *,PetscBool *,void*,PetscErrorCode* PETSC_F90_2PTR_PROTO_NOVAR),(&snes,&x,&y,&w,changed_y,changed_w,_ctx,&ierr PETSC_F90_2PTR_PARAM(ptr)));
1127cb011f5SBarry Smith }
1137cb011f5SBarry Smith 
114c9368356SGlenn Hammond PETSC_EXTERN void PETSC_STDCALL snesnewtontrsetpostcheck_(SNES *snes, void (PETSC_STDCALL *func)(SNES,Vec,Vec,Vec,PetscBool*,PetscBool*,void*),void *ctx,PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(ptr))
1157cb011f5SBarry Smith {
1167cb011f5SBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.trpostcheck,(PetscVoidFunction)func,ctx);if (*ierr) return;
1177cb011f5SBarry Smith #if defined(PETSC_HAVE_F90_2PTR_ARG)
1183c2ee7eaSBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.trpostcheck_pgiptr,NULL,ptr);if (*ierr) return;
1197cb011f5SBarry Smith #endif
1207cb011f5SBarry Smith   SNESNewtonTRSetPostCheck(*snes,ourtrpostcheckfunction,NULL);
1217cb011f5SBarry Smith }
1227cb011f5SBarry Smith 
1238e27ec22SSatish Balay static PetscErrorCode oursnesfunction(SNES snes,Vec x,Vec f,void *ctx)
1248e27ec22SSatish Balay {
12589e00c7dSSatish Balay #if defined(PETSC_HAVE_F90_2PTR_ARG)
12689e00c7dSSatish Balay   void* ptr;
12789e00c7dSSatish Balay   PetscObjectGetFortranCallback((PetscObject)snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.function_pgiptr,NULL,&ptr);
12889e00c7dSSatish Balay #endif
12989e00c7dSSatish 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)));
1308e27ec22SSatish Balay }
131b8ebb45fSBarry Smith 
13206ee9f85SBarry Smith static PetscErrorCode oursnestest(SNES snes,PetscInt it,PetscReal a,PetscReal d,PetscReal c,SNESConvergedReason *reason,void *ctx)
1338e27ec22SSatish Balay {
134f6291634SJed Brown   PetscObjectUseFortranCallback(snes,_cb.test,(SNES*,PetscInt*,PetscReal*,PetscReal*,PetscReal*,SNESConvergedReason*,void*,PetscErrorCode*),(&snes,&it,&a,&d,&c,reason,_ctx,&ierr));
1357f7931b9SBarry Smith }
1367f7931b9SBarry Smith 
1377f7931b9SBarry Smith static PetscErrorCode ourdestroy(void *ctx)
1387f7931b9SBarry Smith {
139f6291634SJed Brown   PetscObjectUseFortranCallback(ctx,_cb.destroy,(void*,PetscErrorCode*),(_ctx,&ierr));
1408e27ec22SSatish Balay }
1418e27ec22SSatish Balay 
142d1e9a80fSBarry Smith static PetscErrorCode oursnesjacobian(SNES snes,Vec x,Mat m,Mat p,void *ctx)
1438e27ec22SSatish Balay {
144d1e9a80fSBarry Smith   PetscObjectUseFortranCallback(snes,_cb.jacobian,(SNES*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),(&snes,&x,&m,&p,_ctx,&ierr));
1458e27ec22SSatish Balay }
146f6291634SJed Brown 
147dfef22ccSBarry Smith static PetscErrorCode oursnesupdate(SNES snes,PetscInt i)
148dfef22ccSBarry Smith {
149dfef22ccSBarry Smith   PetscObjectUseFortranCallback(snes,_cb.update,(SNES*,PetscInt *,PetscErrorCode*),(&snes,&i,&ierr));
150dfef22ccSBarry Smith }
151be95d8f1SBarry Smith static PetscErrorCode oursnesngs(SNES snes,Vec x,Vec b,void *ctx)
15290b77ac2SPeter Brune {
153be95d8f1SBarry Smith   PetscObjectUseFortranCallback(snes,_cb.ngs,(SNES*,Vec*,Vec*,void*,PetscErrorCode*),(&snes,&x,&b,_ctx,&ierr));
15490b77ac2SPeter Brune }
1558e27ec22SSatish Balay static PetscErrorCode oursnesmonitor(SNES snes,PetscInt i,PetscReal d,void *ctx)
1568e27ec22SSatish Balay {
157f6291634SJed Brown   PetscObjectUseFortranCallback(snes,_cb.monitor,(SNES*,PetscInt*,PetscReal*,void*,PetscErrorCode*),(&snes,&i,&d,_ctx,&ierr));
1588e27ec22SSatish Balay }
159c2efdce3SBarry Smith static PetscErrorCode ourmondestroy(void **ctx)
1608e27ec22SSatish Balay {
161f6291634SJed Brown   SNES snes = (SNES)*ctx;
162f6291634SJed Brown   PetscObjectUseFortranCallback(snes,_cb.mondestroy,(void*,PetscErrorCode*),(_ctx,&ierr));
1638e27ec22SSatish Balay }
1648e27ec22SSatish Balay 
1658e27ec22SSatish Balay /* ---------------------------------------------------------*/
1668e27ec22SSatish Balay /*
1678d359177SBarry Smith      snescomputejacobiandefault() and snescomputejacobiandefaultcolor()
1688e27ec22SSatish Balay   These can be used directly from Fortran but are mostly so that
1698e27ec22SSatish Balay   Fortran SNESSetJacobian() will properly handle the defaults being passed in.
1708e27ec22SSatish Balay 
1718e27ec22SSatish Balay   functions, hence no STDCALL
1728e27ec22SSatish Balay */
173d1e9a80fSBarry Smith PETSC_EXTERN void matmffdcomputejacobian_(SNES *snes,Vec *x,Mat *m,Mat *p,void *ctx,PetscErrorCode *ierr)
174df66969eSBarry Smith {
175d1e9a80fSBarry Smith   *ierr = MatMFFDComputeJacobian(*snes,*x,*m,*p,ctx);
176df66969eSBarry Smith }
177d1e9a80fSBarry Smith PETSC_EXTERN void snescomputejacobiandefault_(SNES *snes,Vec *x,Mat *m,Mat *p,void *ctx,PetscErrorCode *ierr)
1788e27ec22SSatish Balay {
179d1e9a80fSBarry Smith   *ierr = SNESComputeJacobianDefault(*snes,*x,*m,*p,ctx);
1808e27ec22SSatish Balay }
181d1e9a80fSBarry Smith PETSC_EXTERN void  snescomputejacobiandefaultcolor_(SNES *snes,Vec *x,Mat *m,Mat *p,void *ctx,PetscErrorCode *ierr)
1828e27ec22SSatish Balay {
183d1e9a80fSBarry Smith   *ierr = SNESComputeJacobianDefaultColor(*snes,*x,*m,*p,*(MatFDColoring*)ctx);
1848e27ec22SSatish Balay }
1858e27ec22SSatish Balay 
1868cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snessetjacobian_(SNES *snes,Mat *A,Mat *B,
187d1e9a80fSBarry Smith                                     void (PETSC_STDCALL *func)(SNES*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),
188f5af7f23SKarl Rupp                                     void *ctx,PetscErrorCode *ierr)
1898e27ec22SSatish Balay {
190f5b6597dSBarry Smith   CHKFORTRANNULLFUNCTION(func);
1918d359177SBarry Smith   if ((PetscVoidFunction)func == (PetscVoidFunction)snescomputejacobiandefault_) {
1928d359177SBarry Smith     *ierr = SNESSetJacobian(*snes,*A,*B,SNESComputeJacobianDefault,ctx);
1938d359177SBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snescomputejacobiandefaultcolor_) {
194e025ade3SBarry Smith     if (!ctx) {
195e025ade3SBarry Smith       *ierr = PETSC_ERR_ARG_NULL;
196e025ade3SBarry Smith       return;
197e025ade3SBarry Smith     }
1988d359177SBarry Smith     *ierr = SNESSetJacobian(*snes,*A,*B,SNESComputeJacobianDefaultColor,*(MatFDColoring*)ctx);
199df66969eSBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)matmffdcomputejacobian_) {
200df66969eSBarry Smith     *ierr = SNESSetJacobian(*snes,*A,*B,MatMFFDComputeJacobian,ctx);
2018e27ec22SSatish Balay   } else {
202f6291634SJed Brown     *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.jacobian,(PetscVoidFunction)func,ctx);
2030298fd71SBarry Smith     if (!*ierr) *ierr = SNESSetJacobian(*snes,*A,*B,oursnesjacobian,NULL);
2048e27ec22SSatish Balay   }
2058e27ec22SSatish Balay }
2068e27ec22SSatish Balay /* -------------------------------------------------------------*/
2078e27ec22SSatish Balay 
208390e1bf2SBarry Smith PETSC_EXTERN void PETSC_STDCALL snesgetoptionsprefix_(SNES *snes,char* prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
2098e27ec22SSatish Balay {
2108e27ec22SSatish Balay   const char *tname;
2118e27ec22SSatish Balay 
2128e27ec22SSatish Balay   *ierr = SNESGetOptionsPrefix(*snes,&tname);
2138e27ec22SSatish Balay   *ierr = PetscStrncpy(prefix,tname,len);if (*ierr) return;
214d6a8cea5SBarry Smith   FIXRETURNCHAR(PETSC_TRUE,prefix,len);
2158e27ec22SSatish Balay }
2168e27ec22SSatish Balay 
217390e1bf2SBarry Smith PETSC_EXTERN void PETSC_STDCALL snesgettype_(SNES *snes,char* name PETSC_MIXED_LEN(len), PetscErrorCode *ierr PETSC_END_LEN(len))
2188e27ec22SSatish Balay {
2198e27ec22SSatish Balay   const char *tname;
2208e27ec22SSatish Balay 
2218e27ec22SSatish Balay   *ierr = SNESGetType(*snes,&tname);
2228e27ec22SSatish Balay   *ierr = PetscStrncpy(name,tname,len);if (*ierr) return;
2237c363081SBarry Smith   FIXRETURNCHAR(PETSC_TRUE,name,len);
2248e27ec22SSatish Balay }
225e3da1266SHong Zhang 
2268e27ec22SSatish Balay /* ---------------------------------------------------------*/
2278e27ec22SSatish Balay 
2288e27ec22SSatish Balay /*
2298e27ec22SSatish Balay    These are not usually called from Fortran but allow Fortran users
2308e27ec22SSatish Balay    to transparently set these monitors from .F code
2318e27ec22SSatish Balay 
2328e27ec22SSatish Balay    functions, hence no STDCALL
2338e27ec22SSatish Balay */
2348e27ec22SSatish Balay 
23589e00c7dSSatish 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))
2368e27ec22SSatish Balay {
237aecf964fSBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.function,(PetscVoidFunction)func,ctx);if (*ierr) return;
23889e00c7dSSatish Balay #if defined(PETSC_HAVE_F90_2PTR_ARG)
239aecf964fSBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.function_pgiptr,NULL,ptr);if (*ierr) return;
24089e00c7dSSatish Balay #endif
241aecf964fSBarry Smith   *ierr = SNESSetFunction(*snes,*r,oursnesfunction,NULL);
2428e27ec22SSatish Balay }
243c79ef259SPeter Brune 
244c79ef259SPeter Brune 
245be95d8f1SBarry Smith PETSC_EXTERN void PETSC_STDCALL snessetngs_(SNES *snes,void (PETSC_STDCALL *func)(SNES*,Vec*,Vec*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr)
246c79ef259SPeter Brune {
247aecf964fSBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.ngs,(PetscVoidFunction)func,ctx);if (*ierr) return;
248aecf964fSBarry Smith   *ierr = SNESSetNGS(*snes,oursnesngs,NULL);
249c79ef259SPeter Brune }
250dfef22ccSBarry Smith PETSC_EXTERN void PETSC_STDCALL snessetupdate_(SNES *snes,void (PETSC_STDCALL *func)(SNES*,PetscInt*,PetscErrorCode*),PetscErrorCode *ierr)
251dfef22ccSBarry Smith {
252aecf964fSBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.update,(PetscVoidFunction)func,NULL);if (*ierr) return;
253aecf964fSBarry Smith   *ierr = SNESSetUpdate(*snes,oursnesupdate);
254dfef22ccSBarry Smith }
2558e27ec22SSatish Balay /* ---------------------------------------------------------*/
2568e27ec22SSatish Balay 
2578e27ec22SSatish Balay /* the func argument is ignored */
258146935d7SSatish Balay PETSC_EXTERN void PETSC_STDCALL snesgetfunction_(SNES *snes,Vec *r,void (PETSC_STDCALL *func)(SNES,Vec,Vec,void*),void **ctx,PetscErrorCode *ierr)
2598e27ec22SSatish Balay {
2608e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(r);
2610298fd71SBarry Smith   *ierr = SNESGetFunction(*snes,r,NULL,NULL); if (*ierr) return;
262146935d7SSatish Balay   if ((PetscVoidFunction)func == (PetscVoidFunction)PETSC_NULL_FUNCTION_Fortran) return;
2630298fd71SBarry Smith   *ierr = PetscObjectGetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.function,NULL,ctx);
2648e27ec22SSatish Balay }
265c79ef259SPeter Brune 
266be95d8f1SBarry Smith PETSC_EXTERN void PETSC_STDCALL snesgetngs_(SNES *snes,void *func,void **ctx,PetscErrorCode *ierr)
267c79ef259SPeter Brune {
268be95d8f1SBarry Smith   *ierr = PetscObjectGetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.ngs,NULL,ctx);
269c79ef259SPeter Brune }
270c79ef259SPeter Brune 
2718e27ec22SSatish Balay /*----------------------------------------------------------------------*/
2728e27ec22SSatish Balay 
27369c1e2abSSatish Balay PETSC_EXTERN void snesconvergeddefault_(SNES *snes,PetscInt *it,PetscReal *a,PetscReal *b,PetscReal *c,SNESConvergedReason *r, void *ct,PetscErrorCode *ierr)
2743f149594SLisandro Dalcin {
2758d359177SBarry Smith   *ierr = SNESConvergedDefault(*snes,*it,*a,*b,*c,r,ct);
2763f149594SLisandro Dalcin }
2773f149594SLisandro Dalcin 
278e07f7f94SSatish Balay PETSC_EXTERN void snesconvergedskip_(SNES *snes,PetscInt *it,PetscReal *a,PetscReal *b,PetscReal *c,SNESConvergedReason *r,void *ct,PetscErrorCode *ierr)
2793f149594SLisandro Dalcin {
280e2a6519dSDmitry Karpeev   *ierr = SNESConvergedSkip(*snes,*it,*a,*b,*c,r,ct);
2813f149594SLisandro Dalcin }
2823f149594SLisandro Dalcin 
2838cc058d9SJed 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)
2848e27ec22SSatish Balay {
2853f22127dSBarry Smith   CHKFORTRANNULLFUNCTION(destroy);
2863f149594SLisandro Dalcin 
2878d359177SBarry Smith   if ((PetscVoidFunction)func == (PetscVoidFunction)snesconvergeddefault_) {
2888d359177SBarry Smith     *ierr = SNESSetConvergenceTest(*snes,SNESConvergedDefault,0,0);
289e07f7f94SSatish Balay   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesconvergedskip_) {
290e2a6519dSDmitry Karpeev     *ierr = SNESSetConvergenceTest(*snes,SNESConvergedSkip,0,0);
2918e27ec22SSatish Balay   } else {
292aecf964fSBarry Smith     *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.test,(PetscVoidFunction)func,cctx);if (*ierr) return;
293aecf964fSBarry Smith     *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.destroy,(PetscVoidFunction)destroy,cctx);if (*ierr) return;
294aecf964fSBarry Smith     *ierr = SNESSetConvergenceTest(*snes,oursnestest,*snes,ourdestroy);
2958e27ec22SSatish Balay   }
2968e27ec22SSatish Balay }
2978e27ec22SSatish Balay /*----------------------------------------------------------------------*/
2988e27ec22SSatish Balay 
2998cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snesview_(SNES *snes,PetscViewer *viewer, PetscErrorCode *ierr)
3008e27ec22SSatish Balay {
3018e27ec22SSatish Balay   PetscViewer v;
3028e27ec22SSatish Balay   PetscPatchDefaultViewers_Fortran(viewer,v);
3038e27ec22SSatish Balay   *ierr = SNESView(*snes,v);
3048e27ec22SSatish Balay }
3058e27ec22SSatish Balay 
3068e27ec22SSatish Balay /*  func is currently ignored from Fortran */
3078cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snesgetjacobian_(SNES *snes,Mat *A,Mat *B,int *func,void **ctx,PetscErrorCode *ierr)
3088e27ec22SSatish Balay {
3098e27ec22SSatish Balay   CHKFORTRANNULLINTEGER(ctx);
3108e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(A);
3118e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(B);
3120298fd71SBarry Smith   *ierr = SNESGetJacobian(*snes,A,B,0,NULL); if (*ierr) return;
3130298fd71SBarry Smith   *ierr = PetscObjectGetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.jacobian,NULL,ctx);
314f2e0d3f1SJed Brown 
3158e27ec22SSatish Balay }
3168e27ec22SSatish Balay 
3178cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL snesgetconvergencehistory_(SNES *snes,PetscInt *na,PetscErrorCode *ierr)
3188e27ec22SSatish Balay {
3190298fd71SBarry Smith   *ierr = SNESGetConvergenceHistory(*snes,NULL,NULL,na);
3208e27ec22SSatish Balay }
3218e27ec22SSatish Balay 
322390e1bf2SBarry Smith PETSC_EXTERN void PETSC_STDCALL snessettype_(SNES *snes,char* type PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
3238e27ec22SSatish Balay {
3248e27ec22SSatish Balay   char *t;
3258e27ec22SSatish Balay 
3268e27ec22SSatish Balay   FIXCHAR(type,len,t);
327d49bb8f9SBarry Smith   *ierr = SNESSetType(*snes,t);if (*ierr) return;
3288e27ec22SSatish Balay   FREECHAR(type,t);
3298e27ec22SSatish Balay }
3308e27ec22SSatish Balay 
331390e1bf2SBarry Smith PETSC_EXTERN void PETSC_STDCALL snesappendoptionsprefix_(SNES *snes,char* prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
3328e27ec22SSatish Balay {
3338e27ec22SSatish Balay   char *t;
3348e27ec22SSatish Balay 
3358e27ec22SSatish Balay   FIXCHAR(prefix,len,t);
336d49bb8f9SBarry Smith   *ierr = SNESAppendOptionsPrefix(*snes,t);if (*ierr) return;
3378e27ec22SSatish Balay   FREECHAR(prefix,t);
3388e27ec22SSatish Balay }
3398e27ec22SSatish Balay 
340390e1bf2SBarry Smith PETSC_EXTERN void PETSC_STDCALL snessetoptionsprefix_(SNES *snes,char* prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
3418e27ec22SSatish Balay {
3428e27ec22SSatish Balay   char *t;
3438e27ec22SSatish Balay 
3448e27ec22SSatish Balay   FIXCHAR(prefix,len,t);
345d49bb8f9SBarry Smith   *ierr = SNESSetOptionsPrefix(*snes,t);if (*ierr) return;
3468e27ec22SSatish Balay   FREECHAR(prefix,t);
3478e27ec22SSatish Balay }
3488e27ec22SSatish Balay 
3498e27ec22SSatish Balay /*----------------------------------------------------------------------*/
3508e27ec22SSatish Balay /* functions, hence no STDCALL */
3518e27ec22SSatish Balay 
3529611d799SBarry Smith PETSC_EXTERN void snesmonitorlgresidualnorm_(SNES *snes,PetscInt *its,PetscReal *fgnorm,PetscObject *dummy,PetscErrorCode *ierr)
3538e27ec22SSatish Balay {
3544619e776SBarry Smith   *ierr = SNESMonitorLGResidualNorm(*snes,*its,*fgnorm,dummy);
3558e27ec22SSatish Balay }
3568e27ec22SSatish Balay 
35752f0073cSBarry Smith PETSC_EXTERN void snesmonitordefault_(SNES *snes,PetscInt *its,PetscReal *fgnorm,PetscViewerAndFormat **dummy,PetscErrorCode *ierr)
3588e27ec22SSatish Balay {
359410efd14SBarry Smith   *ierr = SNESMonitorDefault(*snes,*its,*fgnorm,*dummy);
3608e27ec22SSatish Balay }
3618e27ec22SSatish Balay 
36252f0073cSBarry Smith PETSC_EXTERN void snesmonitorsolution_(SNES *snes,PetscInt *its,PetscReal *fgnorm,PetscViewerAndFormat **dummy,PetscErrorCode *ierr)
3638e27ec22SSatish Balay {
364410efd14SBarry Smith   *ierr = SNESMonitorSolution(*snes,*its,*fgnorm,*dummy);
3658e27ec22SSatish Balay }
3668e27ec22SSatish Balay 
36752f0073cSBarry Smith PETSC_EXTERN void snesmonitorsolutionupdate_(SNES *snes,PetscInt *its,PetscReal *fgnorm,PetscViewerAndFormat **dummy,PetscErrorCode *ierr)
3688e27ec22SSatish Balay {
369410efd14SBarry Smith   *ierr = SNESMonitorSolutionUpdate(*snes,*its,*fgnorm,*dummy);
3708e27ec22SSatish Balay }
3718e27ec22SSatish Balay 
3728e27ec22SSatish Balay 
3738cc058d9SJed 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)
3748e27ec22SSatish Balay {
375aecf964fSBarry Smith   CHKFORTRANNULLFUNCTION(mondestroy);
376a6570f20SBarry Smith   if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitordefault_) {
3771cb03803SBarry Smith     *ierr = SNESMonitorSet(*snes,(PetscErrorCode (*)(SNES,PetscInt,PetscReal,void*))SNESMonitorDefault,*(PetscViewerAndFormat**)mctx,(PetscErrorCode (*)(void **))PetscViewerAndFormatDestroy);
378a6570f20SBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorsolution_) {
3791cb03803SBarry Smith     *ierr = SNESMonitorSet(*snes,(PetscErrorCode (*)(SNES,PetscInt,PetscReal,void*))SNESMonitorSolution,*(PetscViewerAndFormat**)mctx,(PetscErrorCode (*)(void **))PetscViewerAndFormatDestroy);
380a6570f20SBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorsolutionupdate_) {
3811cb03803SBarry Smith     *ierr = SNESMonitorSet(*snes,(PetscErrorCode (*)(SNES,PetscInt,PetscReal,void*))SNESMonitorSolutionUpdate,*(PetscViewerAndFormat**)mctx,(PetscErrorCode (*)(void **))PetscViewerAndFormatDestroy);
3824619e776SBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorlgresidualnorm_) {
3833e7ff0edSBarry Smith     *ierr = SNESMonitorSet(*snes,(PetscErrorCode (*)(SNES,PetscInt,PetscReal,void*))SNESMonitorLGResidualNorm,0,0);
3848e27ec22SSatish Balay   } else {
385aecf964fSBarry Smith     *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.monitor,(PetscVoidFunction)func,mctx);if (*ierr) return;
386aecf964fSBarry Smith     *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.mondestroy,(PetscVoidFunction)mondestroy,mctx);if (*ierr) return;
387aecf964fSBarry Smith     *ierr = SNESMonitorSet(*snes,oursnesmonitor,*snes,ourmondestroy);
3888e27ec22SSatish Balay   }
3898e27ec22SSatish Balay }
3908e27ec22SSatish Balay 
391*fe2efc57SMark PETSC_EXTERN void PETSC_STDCALL snesviewfromoptions_(SNES *ao,PetscObject obj,char* type PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
392*fe2efc57SMark {
393*fe2efc57SMark   char *t;
394*fe2efc57SMark 
395*fe2efc57SMark   FIXCHAR(type,len,t);
396*fe2efc57SMark   *ierr = SNESViewFromOptions(*ao,obj,t);if (*ierr) return;
397*fe2efc57SMark   FREECHAR(type,t);
398*fe2efc57SMark }
399