xref: /petsc/src/snes/interface/ftn-custom/zsnesf.c (revision 17a42bb7546030dad7d7ce199606ca2e8f3a32eb)
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
12*17a42bb7SSatish Balay #define snessetjacobian1_                SNESSETJACOBIAN1
13*17a42bb7SSatish Balay #define snessetjacobian2_                SNESSETJACOBIAN2
148e27ec22SSatish Balay #define snesgetoptionsprefix_            SNESGETOPTIONSPREFIX
158e27ec22SSatish Balay #define snesgettype_                     SNESGETTYPE
168e27ec22SSatish Balay #define snessetfunction_                 SNESSETFUNCTION
17be95d8f1SBarry Smith #define snessetngs_                       SNESSETNGS
18dfef22ccSBarry Smith #define snessetupdate_                    SNESSETUPDATE
198e27ec22SSatish Balay #define snesgetfunction_                 SNESGETFUNCTION
20be95d8f1SBarry Smith #define snesgetngs_                       SNESGETNGS
218e27ec22SSatish Balay #define snessetconvergencetest_          SNESSETCONVERGENCETEST
228d359177SBarry Smith #define snesconvergeddefault_            SNESCONVERGEDDEFAULT
23e07f7f94SSatish Balay #define snesconvergedskip_               SNESCONVERGEDSKIP
248e27ec22SSatish Balay #define snesview_                        SNESVIEW
258e27ec22SSatish Balay #define snesgetconvergencehistory_       SNESGETCONVERGENCEHISTORY
268e27ec22SSatish Balay #define snesgetjacobian_                 SNESGETJACOBIAN
278e27ec22SSatish Balay #define snessettype_                     SNESSETTYPE
288e27ec22SSatish Balay #define snesappendoptionsprefix_         SNESAPPENDOPTIONSPREFIX
298e27ec22SSatish Balay #define snessetoptionsprefix_            SNESSETOPTIONSPREFIX
30a6570f20SBarry Smith #define snesmonitordefault_              SNESMONITORDEFAULT
31a6570f20SBarry Smith #define snesmonitorsolution_             SNESMONITORSOLUTION
324619e776SBarry Smith #define snesmonitorlgresidualnorm_       SNESMONITORLGRESIDUALNORM
33a6570f20SBarry Smith #define snesmonitorsolutionupdate_       SNESMONITORSOLUTIONUPDATE
34a6570f20SBarry Smith #define snesmonitorset_                  SNESMONITORSET
35c9368356SGlenn Hammond #define snesnewtontrsetprecheck_         SNESNEWTONTRSETPRECHECK
363b42469aSBarry Smith #define snesnewtontrsetpostcheck_        SNESNEWTONTRSETPOSTCHECK
37fe2efc57SMark #define snesviewfromoptions_             SNESVIEWFROMOPTIONS
384e2a09fcSBarry Smith #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
39df66969eSBarry Smith #define matmffdcomputejacobian_          matmffdcomputejacobian
406ce558aeSBarry Smith #define snessolve_                       snessolve
418d359177SBarry Smith #define snescomputejacobiandefault_      snescomputejacobiandefault
428d359177SBarry Smith #define snescomputejacobiandefaultcolor_ snescomputejacobiandefaultcolor
438e27ec22SSatish Balay #define snessetjacobian_                 snessetjacobian
44*17a42bb7SSatish Balay #define snessetjacobian1_                snessetjacobian1
45*17a42bb7SSatish Balay #define snessetjacobian2_                snessetjacobian2
468e27ec22SSatish Balay #define snesgetoptionsprefix_            snesgetoptionsprefix
478e27ec22SSatish Balay #define snesgettype_                     snesgettype
488e27ec22SSatish Balay #define snessetfunction_                 snessetfunction
49be95d8f1SBarry Smith #define snessetngs_                      snessetngs
50dfef22ccSBarry Smith #define snessetupdate_                   snessetupdate
518e27ec22SSatish Balay #define snesgetfunction_                 snesgetfunction
52be95d8f1SBarry Smith #define snesgetngs_                      snesgetngs
538e27ec22SSatish Balay #define snessetconvergencetest_          snessetconvergencetest
548d359177SBarry Smith #define snesconvergeddefault_            snesconvergeddefault
55e07f7f94SSatish Balay #define snesconvergedskip_               snesconvergedskip
568e27ec22SSatish Balay #define snesview_                        snesview
578e27ec22SSatish Balay #define snesgetjacobian_                 snesgetjacobian
588e27ec22SSatish Balay #define snesgetconvergencehistory_       snesgetconvergencehistory
598e27ec22SSatish Balay #define snessettype_                     snessettype
608e27ec22SSatish Balay #define snesappendoptionsprefix_         snesappendoptionsprefix
618e27ec22SSatish Balay #define snessetoptionsprefix_            snessetoptionsprefix
624619e776SBarry Smith #define snesmonitorlgresidualnorm_       snesmonitorlgresidualnorm
63a6570f20SBarry Smith #define snesmonitordefault_              snesmonitordefault
64a6570f20SBarry Smith #define snesmonitorsolution_             snesmonitorsolution
65a6570f20SBarry Smith #define snesmonitorsolutionupdate_       snesmonitorsolutionupdate
66a6570f20SBarry Smith #define snesmonitorset_                  snesmonitorset
67c9368356SGlenn Hammond #define snesnewtontrsetprecheck_         snesnewtontrsetprecheck
683b42469aSBarry Smith #define snesnewtontrsetpostcheck_        snesnewtontrsetpostcheck
69fe2efc57SMark #define snesviewfromoptions_             snesviewfromoptions
708e27ec22SSatish Balay #endif
718e27ec22SSatish Balay 
72f6291634SJed Brown static struct {
73f6291634SJed Brown   PetscFortranCallbackId function;
74f6291634SJed Brown   PetscFortranCallbackId test;
75f6291634SJed Brown   PetscFortranCallbackId destroy;
76f6291634SJed Brown   PetscFortranCallbackId jacobian;
77f6291634SJed Brown   PetscFortranCallbackId monitor;
78f6291634SJed Brown   PetscFortranCallbackId mondestroy;
79be95d8f1SBarry Smith   PetscFortranCallbackId ngs;
80dfef22ccSBarry Smith   PetscFortranCallbackId update;
81c9368356SGlenn Hammond   PetscFortranCallbackId trprecheck;
827cb011f5SBarry Smith   PetscFortranCallbackId trpostcheck;
8389e00c7dSSatish Balay #if defined(PETSC_HAVE_F90_2PTR_ARG)
8489e00c7dSSatish Balay   PetscFortranCallbackId function_pgiptr;
85c9368356SGlenn Hammond   PetscFortranCallbackId trprecheck_pgiptr;
863c2ee7eaSBarry Smith   PetscFortranCallbackId trpostcheck_pgiptr;
8789e00c7dSSatish Balay #endif
88f6291634SJed Brown } _cb;
8990b77ac2SPeter Brune 
90c9368356SGlenn Hammond static PetscErrorCode ourtrprecheckfunction(SNES snes,Vec x,Vec y,PetscBool *changed_y,void *ctx)
91c9368356SGlenn Hammond {
92c9368356SGlenn Hammond #if defined(PETSC_HAVE_F90_2PTR_ARG)
93c9368356SGlenn Hammond   void* ptr;
94c9368356SGlenn Hammond   PetscObjectGetFortranCallback((PetscObject)snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.trprecheck_pgiptr,NULL,&ptr);
95c9368356SGlenn Hammond #endif
96c9368356SGlenn 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)));
97c9368356SGlenn Hammond }
98c9368356SGlenn Hammond 
9919caf8f3SSatish Balay PETSC_EXTERN void snesnewtontrsetprecheck_(SNES *snes, void (*func)(SNES,Vec,Vec,PetscBool*,void*),void *ctx,PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(ptr))
100c9368356SGlenn Hammond {
101c9368356SGlenn Hammond   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.trprecheck,(PetscVoidFunction)func,ctx);if (*ierr) return;
102c9368356SGlenn Hammond #if defined(PETSC_HAVE_F90_2PTR_ARG)
103c9368356SGlenn Hammond   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.trprecheck_pgiptr,NULL,ptr);if (*ierr) return;
104c9368356SGlenn Hammond #endif
105c9368356SGlenn Hammond   SNESNewtonTRSetPreCheck(*snes,ourtrprecheckfunction,NULL);
106c9368356SGlenn Hammond }
107c9368356SGlenn Hammond 
108c9368356SGlenn Hammond 
109c9368356SGlenn Hammond static PetscErrorCode ourtrpostcheckfunction(SNES snes,Vec x,Vec y,Vec w,PetscBool *changed_y,PetscBool *changed_w,void *ctx)
1107cb011f5SBarry Smith {
1117cb011f5SBarry Smith #if defined(PETSC_HAVE_F90_2PTR_ARG)
1127cb011f5SBarry Smith   void* ptr;
1133c2ee7eaSBarry Smith   PetscObjectGetFortranCallback((PetscObject)snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.trpostcheck_pgiptr,NULL,&ptr);
1147cb011f5SBarry Smith #endif
115c9368356SGlenn 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)));
1167cb011f5SBarry Smith }
1177cb011f5SBarry Smith 
11819caf8f3SSatish Balay PETSC_EXTERN void snesnewtontrsetpostcheck_(SNES *snes, void (*func)(SNES,Vec,Vec,Vec,PetscBool*,PetscBool*,void*),void *ctx,PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(ptr))
1197cb011f5SBarry Smith {
1207cb011f5SBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.trpostcheck,(PetscVoidFunction)func,ctx);if (*ierr) return;
1217cb011f5SBarry Smith #if defined(PETSC_HAVE_F90_2PTR_ARG)
1223c2ee7eaSBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.trpostcheck_pgiptr,NULL,ptr);if (*ierr) return;
1237cb011f5SBarry Smith #endif
1247cb011f5SBarry Smith   SNESNewtonTRSetPostCheck(*snes,ourtrpostcheckfunction,NULL);
1257cb011f5SBarry Smith }
1267cb011f5SBarry Smith 
1278e27ec22SSatish Balay static PetscErrorCode oursnesfunction(SNES snes,Vec x,Vec f,void *ctx)
1288e27ec22SSatish Balay {
12989e00c7dSSatish Balay #if defined(PETSC_HAVE_F90_2PTR_ARG)
13089e00c7dSSatish Balay   void* ptr;
13189e00c7dSSatish Balay   PetscObjectGetFortranCallback((PetscObject)snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.function_pgiptr,NULL,&ptr);
13289e00c7dSSatish Balay #endif
13389e00c7dSSatish 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)));
1348e27ec22SSatish Balay }
135b8ebb45fSBarry Smith 
13606ee9f85SBarry Smith static PetscErrorCode oursnestest(SNES snes,PetscInt it,PetscReal a,PetscReal d,PetscReal c,SNESConvergedReason *reason,void *ctx)
1378e27ec22SSatish Balay {
138f6291634SJed Brown   PetscObjectUseFortranCallback(snes,_cb.test,(SNES*,PetscInt*,PetscReal*,PetscReal*,PetscReal*,SNESConvergedReason*,void*,PetscErrorCode*),(&snes,&it,&a,&d,&c,reason,_ctx,&ierr));
1397f7931b9SBarry Smith }
1407f7931b9SBarry Smith 
1417f7931b9SBarry Smith static PetscErrorCode ourdestroy(void *ctx)
1427f7931b9SBarry Smith {
143f6291634SJed Brown   PetscObjectUseFortranCallback(ctx,_cb.destroy,(void*,PetscErrorCode*),(_ctx,&ierr));
1448e27ec22SSatish Balay }
1458e27ec22SSatish Balay 
146d1e9a80fSBarry Smith static PetscErrorCode oursnesjacobian(SNES snes,Vec x,Mat m,Mat p,void *ctx)
1478e27ec22SSatish Balay {
148d1e9a80fSBarry Smith   PetscObjectUseFortranCallback(snes,_cb.jacobian,(SNES*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),(&snes,&x,&m,&p,_ctx,&ierr));
1498e27ec22SSatish Balay }
150f6291634SJed Brown 
151dfef22ccSBarry Smith static PetscErrorCode oursnesupdate(SNES snes,PetscInt i)
152dfef22ccSBarry Smith {
153dfef22ccSBarry Smith   PetscObjectUseFortranCallback(snes,_cb.update,(SNES*,PetscInt *,PetscErrorCode*),(&snes,&i,&ierr));
154dfef22ccSBarry Smith }
155be95d8f1SBarry Smith static PetscErrorCode oursnesngs(SNES snes,Vec x,Vec b,void *ctx)
15690b77ac2SPeter Brune {
157be95d8f1SBarry Smith   PetscObjectUseFortranCallback(snes,_cb.ngs,(SNES*,Vec*,Vec*,void*,PetscErrorCode*),(&snes,&x,&b,_ctx,&ierr));
15890b77ac2SPeter Brune }
1598e27ec22SSatish Balay static PetscErrorCode oursnesmonitor(SNES snes,PetscInt i,PetscReal d,void *ctx)
1608e27ec22SSatish Balay {
161f6291634SJed Brown   PetscObjectUseFortranCallback(snes,_cb.monitor,(SNES*,PetscInt*,PetscReal*,void*,PetscErrorCode*),(&snes,&i,&d,_ctx,&ierr));
1628e27ec22SSatish Balay }
163c2efdce3SBarry Smith static PetscErrorCode ourmondestroy(void **ctx)
1648e27ec22SSatish Balay {
165f6291634SJed Brown   SNES snes = (SNES)*ctx;
166f6291634SJed Brown   PetscObjectUseFortranCallback(snes,_cb.mondestroy,(void*,PetscErrorCode*),(_ctx,&ierr));
1678e27ec22SSatish Balay }
1688e27ec22SSatish Balay 
1698e27ec22SSatish Balay /* ---------------------------------------------------------*/
1708e27ec22SSatish Balay /*
1718d359177SBarry Smith      snescomputejacobiandefault() and snescomputejacobiandefaultcolor()
1728e27ec22SSatish Balay   These can be used directly from Fortran but are mostly so that
1738e27ec22SSatish Balay   Fortran SNESSetJacobian() will properly handle the defaults being passed in.
1748e27ec22SSatish Balay */
175d1e9a80fSBarry Smith PETSC_EXTERN void matmffdcomputejacobian_(SNES *snes,Vec *x,Mat *m,Mat *p,void *ctx,PetscErrorCode *ierr)
176df66969eSBarry Smith {
177d1e9a80fSBarry Smith   *ierr = MatMFFDComputeJacobian(*snes,*x,*m,*p,ctx);
178df66969eSBarry Smith }
179d1e9a80fSBarry Smith PETSC_EXTERN void snescomputejacobiandefault_(SNES *snes,Vec *x,Mat *m,Mat *p,void *ctx,PetscErrorCode *ierr)
1808e27ec22SSatish Balay {
181d1e9a80fSBarry Smith   *ierr = SNESComputeJacobianDefault(*snes,*x,*m,*p,ctx);
1828e27ec22SSatish Balay }
183d1e9a80fSBarry Smith PETSC_EXTERN void  snescomputejacobiandefaultcolor_(SNES *snes,Vec *x,Mat *m,Mat *p,void *ctx,PetscErrorCode *ierr)
1848e27ec22SSatish Balay {
185d1e9a80fSBarry Smith   *ierr = SNESComputeJacobianDefaultColor(*snes,*x,*m,*p,*(MatFDColoring*)ctx);
1868e27ec22SSatish Balay }
1878e27ec22SSatish Balay 
18819caf8f3SSatish Balay PETSC_EXTERN void snessetjacobian_(SNES *snes,Mat *A,Mat *B,
18919caf8f3SSatish Balay                                     void (*func)(SNES*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),
190f5af7f23SKarl Rupp                                     void *ctx,PetscErrorCode *ierr)
1918e27ec22SSatish Balay {
192f5b6597dSBarry Smith   CHKFORTRANNULLFUNCTION(func);
1938d359177SBarry Smith   if ((PetscVoidFunction)func == (PetscVoidFunction)snescomputejacobiandefault_) {
1948d359177SBarry Smith     *ierr = SNESSetJacobian(*snes,*A,*B,SNESComputeJacobianDefault,ctx);
1958d359177SBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snescomputejacobiandefaultcolor_) {
196e025ade3SBarry Smith     if (!ctx) {
197e025ade3SBarry Smith       *ierr = PETSC_ERR_ARG_NULL;
198e025ade3SBarry Smith       return;
199e025ade3SBarry Smith     }
2008d359177SBarry Smith     *ierr = SNESSetJacobian(*snes,*A,*B,SNESComputeJacobianDefaultColor,*(MatFDColoring*)ctx);
201df66969eSBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)matmffdcomputejacobian_) {
202df66969eSBarry Smith     *ierr = SNESSetJacobian(*snes,*A,*B,MatMFFDComputeJacobian,ctx);
2038e27ec22SSatish Balay   } else {
204f6291634SJed Brown     *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.jacobian,(PetscVoidFunction)func,ctx);
2050298fd71SBarry Smith     if (!*ierr) *ierr = SNESSetJacobian(*snes,*A,*B,oursnesjacobian,NULL);
2068e27ec22SSatish Balay   }
2078e27ec22SSatish Balay }
208*17a42bb7SSatish Balay PETSC_EXTERN void snessetjacobian1_(SNES *snes,Mat *A,Mat *B,
209*17a42bb7SSatish Balay                                     void (*func)(SNES*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),
210*17a42bb7SSatish Balay                                     void *ctx,PetscErrorCode *ierr)
211*17a42bb7SSatish Balay {
212*17a42bb7SSatish Balay   snessetjacobian_(snes,A,B,func,ctx,ierr);
213*17a42bb7SSatish Balay }
214*17a42bb7SSatish Balay PETSC_EXTERN void snessetjacobian2_(SNES *snes,Mat *A,Mat *B,
215*17a42bb7SSatish Balay                                     void (*func)(SNES*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),
216*17a42bb7SSatish Balay                                     void *ctx,PetscErrorCode *ierr)
217*17a42bb7SSatish Balay {
218*17a42bb7SSatish Balay   snessetjacobian_(snes,A,B,func,ctx,ierr);
219*17a42bb7SSatish Balay }
2208e27ec22SSatish Balay /* -------------------------------------------------------------*/
2218e27ec22SSatish Balay 
22219caf8f3SSatish Balay PETSC_EXTERN void snesgetoptionsprefix_(SNES *snes,char* prefix,PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len)
2238e27ec22SSatish Balay {
2248e27ec22SSatish Balay   const char *tname;
2258e27ec22SSatish Balay 
2268e27ec22SSatish Balay   *ierr = SNESGetOptionsPrefix(*snes,&tname);
2278e27ec22SSatish Balay   *ierr = PetscStrncpy(prefix,tname,len);if (*ierr) return;
228d6a8cea5SBarry Smith   FIXRETURNCHAR(PETSC_TRUE,prefix,len);
2298e27ec22SSatish Balay }
2308e27ec22SSatish Balay 
23119caf8f3SSatish Balay PETSC_EXTERN void snesgettype_(SNES *snes,char* name, PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len)
2328e27ec22SSatish Balay {
2338e27ec22SSatish Balay   const char *tname;
2348e27ec22SSatish Balay 
2358e27ec22SSatish Balay   *ierr = SNESGetType(*snes,&tname);
2368e27ec22SSatish Balay   *ierr = PetscStrncpy(name,tname,len);if (*ierr) return;
2377c363081SBarry Smith   FIXRETURNCHAR(PETSC_TRUE,name,len);
2388e27ec22SSatish Balay }
239e3da1266SHong Zhang 
2408e27ec22SSatish Balay /* ---------------------------------------------------------*/
2418e27ec22SSatish Balay 
2428e27ec22SSatish Balay /*
2438e27ec22SSatish Balay    These are not usually called from Fortran but allow Fortran users
2448e27ec22SSatish Balay    to transparently set these monitors from .F code
2458e27ec22SSatish Balay */
2468e27ec22SSatish Balay 
24719caf8f3SSatish Balay PETSC_EXTERN void snessetfunction_(SNES *snes,Vec *r,void (*func)(SNES*,Vec*,Vec*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(ptr))
2488e27ec22SSatish Balay {
249aecf964fSBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.function,(PetscVoidFunction)func,ctx);if (*ierr) return;
25089e00c7dSSatish Balay #if defined(PETSC_HAVE_F90_2PTR_ARG)
251aecf964fSBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.function_pgiptr,NULL,ptr);if (*ierr) return;
25289e00c7dSSatish Balay #endif
253aecf964fSBarry Smith   *ierr = SNESSetFunction(*snes,*r,oursnesfunction,NULL);
2548e27ec22SSatish Balay }
255c79ef259SPeter Brune 
256c79ef259SPeter Brune 
25719caf8f3SSatish Balay PETSC_EXTERN void snessetngs_(SNES *snes,void (*func)(SNES*,Vec*,Vec*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr)
258c79ef259SPeter Brune {
259aecf964fSBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.ngs,(PetscVoidFunction)func,ctx);if (*ierr) return;
260aecf964fSBarry Smith   *ierr = SNESSetNGS(*snes,oursnesngs,NULL);
261c79ef259SPeter Brune }
26219caf8f3SSatish Balay PETSC_EXTERN void snessetupdate_(SNES *snes,void (*func)(SNES*,PetscInt*,PetscErrorCode*),PetscErrorCode *ierr)
263dfef22ccSBarry Smith {
264aecf964fSBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.update,(PetscVoidFunction)func,NULL);if (*ierr) return;
265aecf964fSBarry Smith   *ierr = SNESSetUpdate(*snes,oursnesupdate);
266dfef22ccSBarry Smith }
2678e27ec22SSatish Balay /* ---------------------------------------------------------*/
2688e27ec22SSatish Balay 
2698e27ec22SSatish Balay /* the func argument is ignored */
27019caf8f3SSatish Balay PETSC_EXTERN void snesgetfunction_(SNES *snes,Vec *r,void (*func)(SNES,Vec,Vec,void*),void **ctx,PetscErrorCode *ierr)
2718e27ec22SSatish Balay {
2728e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(r);
2730298fd71SBarry Smith   *ierr = SNESGetFunction(*snes,r,NULL,NULL); if (*ierr) return;
274146935d7SSatish Balay   if ((PetscVoidFunction)func == (PetscVoidFunction)PETSC_NULL_FUNCTION_Fortran) return;
2750298fd71SBarry Smith   *ierr = PetscObjectGetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.function,NULL,ctx);
2768e27ec22SSatish Balay }
277c79ef259SPeter Brune 
27819caf8f3SSatish Balay PETSC_EXTERN void snesgetngs_(SNES *snes,void *func,void **ctx,PetscErrorCode *ierr)
279c79ef259SPeter Brune {
280be95d8f1SBarry Smith   *ierr = PetscObjectGetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.ngs,NULL,ctx);
281c79ef259SPeter Brune }
282c79ef259SPeter Brune 
2838e27ec22SSatish Balay /*----------------------------------------------------------------------*/
2848e27ec22SSatish Balay 
28569c1e2abSSatish Balay PETSC_EXTERN void snesconvergeddefault_(SNES *snes,PetscInt *it,PetscReal *a,PetscReal *b,PetscReal *c,SNESConvergedReason *r, void *ct,PetscErrorCode *ierr)
2863f149594SLisandro Dalcin {
2878d359177SBarry Smith   *ierr = SNESConvergedDefault(*snes,*it,*a,*b,*c,r,ct);
2883f149594SLisandro Dalcin }
2893f149594SLisandro Dalcin 
290e07f7f94SSatish Balay PETSC_EXTERN void snesconvergedskip_(SNES *snes,PetscInt *it,PetscReal *a,PetscReal *b,PetscReal *c,SNESConvergedReason *r,void *ct,PetscErrorCode *ierr)
2913f149594SLisandro Dalcin {
292e2a6519dSDmitry Karpeev   *ierr = SNESConvergedSkip(*snes,*it,*a,*b,*c,r,ct);
2933f149594SLisandro Dalcin }
2943f149594SLisandro Dalcin 
29519caf8f3SSatish Balay PETSC_EXTERN void snessetconvergencetest_(SNES *snes,void (*func)(SNES*,PetscInt*,PetscReal*,PetscReal*,PetscReal*,SNESConvergedReason*,void*,PetscErrorCode*), void *cctx,void (*destroy)(void*),PetscErrorCode *ierr)
2968e27ec22SSatish Balay {
2973f22127dSBarry Smith   CHKFORTRANNULLFUNCTION(destroy);
2983f149594SLisandro Dalcin 
2998d359177SBarry Smith   if ((PetscVoidFunction)func == (PetscVoidFunction)snesconvergeddefault_) {
3008d359177SBarry Smith     *ierr = SNESSetConvergenceTest(*snes,SNESConvergedDefault,0,0);
301e07f7f94SSatish Balay   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesconvergedskip_) {
302e2a6519dSDmitry Karpeev     *ierr = SNESSetConvergenceTest(*snes,SNESConvergedSkip,0,0);
3038e27ec22SSatish Balay   } else {
304aecf964fSBarry Smith     *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.test,(PetscVoidFunction)func,cctx);if (*ierr) return;
305aecf964fSBarry Smith     *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.destroy,(PetscVoidFunction)destroy,cctx);if (*ierr) return;
306aecf964fSBarry Smith     *ierr = SNESSetConvergenceTest(*snes,oursnestest,*snes,ourdestroy);
3078e27ec22SSatish Balay   }
3088e27ec22SSatish Balay }
3098e27ec22SSatish Balay /*----------------------------------------------------------------------*/
3108e27ec22SSatish Balay 
31119caf8f3SSatish Balay PETSC_EXTERN void snesview_(SNES *snes,PetscViewer *viewer, PetscErrorCode *ierr)
3128e27ec22SSatish Balay {
3138e27ec22SSatish Balay   PetscViewer v;
3148e27ec22SSatish Balay   PetscPatchDefaultViewers_Fortran(viewer,v);
3158e27ec22SSatish Balay   *ierr = SNESView(*snes,v);
3168e27ec22SSatish Balay }
3178e27ec22SSatish Balay 
3188e27ec22SSatish Balay /*  func is currently ignored from Fortran */
31919caf8f3SSatish Balay PETSC_EXTERN void snesgetjacobian_(SNES *snes,Mat *A,Mat *B,int *func,void **ctx,PetscErrorCode *ierr)
3208e27ec22SSatish Balay {
3218e27ec22SSatish Balay   CHKFORTRANNULLINTEGER(ctx);
3228e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(A);
3238e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(B);
3240298fd71SBarry Smith   *ierr = SNESGetJacobian(*snes,A,B,0,NULL); if (*ierr) return;
3250298fd71SBarry Smith   *ierr = PetscObjectGetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.jacobian,NULL,ctx);
326f2e0d3f1SJed Brown 
3278e27ec22SSatish Balay }
3288e27ec22SSatish Balay 
32919caf8f3SSatish Balay PETSC_EXTERN void snesgetconvergencehistory_(SNES *snes,PetscInt *na,PetscErrorCode *ierr)
3308e27ec22SSatish Balay {
3310298fd71SBarry Smith   *ierr = SNESGetConvergenceHistory(*snes,NULL,NULL,na);
3328e27ec22SSatish Balay }
3338e27ec22SSatish Balay 
33419caf8f3SSatish Balay PETSC_EXTERN void snessettype_(SNES *snes,char* type,PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len)
3358e27ec22SSatish Balay {
3368e27ec22SSatish Balay   char *t;
3378e27ec22SSatish Balay 
3388e27ec22SSatish Balay   FIXCHAR(type,len,t);
339d49bb8f9SBarry Smith   *ierr = SNESSetType(*snes,t);if (*ierr) return;
3408e27ec22SSatish Balay   FREECHAR(type,t);
3418e27ec22SSatish Balay }
3428e27ec22SSatish Balay 
34319caf8f3SSatish Balay PETSC_EXTERN void snesappendoptionsprefix_(SNES *snes,char* prefix,PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len)
3448e27ec22SSatish Balay {
3458e27ec22SSatish Balay   char *t;
3468e27ec22SSatish Balay 
3478e27ec22SSatish Balay   FIXCHAR(prefix,len,t);
348d49bb8f9SBarry Smith   *ierr = SNESAppendOptionsPrefix(*snes,t);if (*ierr) return;
3498e27ec22SSatish Balay   FREECHAR(prefix,t);
3508e27ec22SSatish Balay }
3518e27ec22SSatish Balay 
35219caf8f3SSatish Balay PETSC_EXTERN void snessetoptionsprefix_(SNES *snes,char* prefix,PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len)
3538e27ec22SSatish Balay {
3548e27ec22SSatish Balay   char *t;
3558e27ec22SSatish Balay 
3568e27ec22SSatish Balay   FIXCHAR(prefix,len,t);
357d49bb8f9SBarry Smith   *ierr = SNESSetOptionsPrefix(*snes,t);if (*ierr) return;
3588e27ec22SSatish Balay   FREECHAR(prefix,t);
3598e27ec22SSatish Balay }
3608e27ec22SSatish Balay 
3618e27ec22SSatish Balay /*----------------------------------------------------------------------*/
3628e27ec22SSatish Balay 
3639611d799SBarry Smith PETSC_EXTERN void snesmonitorlgresidualnorm_(SNES *snes,PetscInt *its,PetscReal *fgnorm,PetscObject *dummy,PetscErrorCode *ierr)
3648e27ec22SSatish Balay {
3654619e776SBarry Smith   *ierr = SNESMonitorLGResidualNorm(*snes,*its,*fgnorm,dummy);
3668e27ec22SSatish Balay }
3678e27ec22SSatish Balay 
36852f0073cSBarry Smith PETSC_EXTERN void snesmonitordefault_(SNES *snes,PetscInt *its,PetscReal *fgnorm,PetscViewerAndFormat **dummy,PetscErrorCode *ierr)
3698e27ec22SSatish Balay {
370410efd14SBarry Smith   *ierr = SNESMonitorDefault(*snes,*its,*fgnorm,*dummy);
3718e27ec22SSatish Balay }
3728e27ec22SSatish Balay 
37352f0073cSBarry Smith PETSC_EXTERN void snesmonitorsolution_(SNES *snes,PetscInt *its,PetscReal *fgnorm,PetscViewerAndFormat **dummy,PetscErrorCode *ierr)
3748e27ec22SSatish Balay {
375410efd14SBarry Smith   *ierr = SNESMonitorSolution(*snes,*its,*fgnorm,*dummy);
3768e27ec22SSatish Balay }
3778e27ec22SSatish Balay 
37852f0073cSBarry Smith PETSC_EXTERN void snesmonitorsolutionupdate_(SNES *snes,PetscInt *its,PetscReal *fgnorm,PetscViewerAndFormat **dummy,PetscErrorCode *ierr)
3798e27ec22SSatish Balay {
380410efd14SBarry Smith   *ierr = SNESMonitorSolutionUpdate(*snes,*its,*fgnorm,*dummy);
3818e27ec22SSatish Balay }
3828e27ec22SSatish Balay 
3838e27ec22SSatish Balay 
38419caf8f3SSatish Balay PETSC_EXTERN void snesmonitorset_(SNES *snes,void (*func)(SNES*,PetscInt*,PetscReal*,void*,PetscErrorCode*),void *mctx,void (*mondestroy)(void*,PetscErrorCode*),PetscErrorCode *ierr)
3858e27ec22SSatish Balay {
386aecf964fSBarry Smith   CHKFORTRANNULLFUNCTION(mondestroy);
387a6570f20SBarry Smith   if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitordefault_) {
3881cb03803SBarry Smith     *ierr = SNESMonitorSet(*snes,(PetscErrorCode (*)(SNES,PetscInt,PetscReal,void*))SNESMonitorDefault,*(PetscViewerAndFormat**)mctx,(PetscErrorCode (*)(void **))PetscViewerAndFormatDestroy);
389a6570f20SBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorsolution_) {
3901cb03803SBarry Smith     *ierr = SNESMonitorSet(*snes,(PetscErrorCode (*)(SNES,PetscInt,PetscReal,void*))SNESMonitorSolution,*(PetscViewerAndFormat**)mctx,(PetscErrorCode (*)(void **))PetscViewerAndFormatDestroy);
391a6570f20SBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorsolutionupdate_) {
3921cb03803SBarry Smith     *ierr = SNESMonitorSet(*snes,(PetscErrorCode (*)(SNES,PetscInt,PetscReal,void*))SNESMonitorSolutionUpdate,*(PetscViewerAndFormat**)mctx,(PetscErrorCode (*)(void **))PetscViewerAndFormatDestroy);
3934619e776SBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorlgresidualnorm_) {
3943e7ff0edSBarry Smith     *ierr = SNESMonitorSet(*snes,(PetscErrorCode (*)(SNES,PetscInt,PetscReal,void*))SNESMonitorLGResidualNorm,0,0);
3958e27ec22SSatish Balay   } else {
396aecf964fSBarry Smith     *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.monitor,(PetscVoidFunction)func,mctx);if (*ierr) return;
397aecf964fSBarry Smith     *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.mondestroy,(PetscVoidFunction)mondestroy,mctx);if (*ierr) return;
398aecf964fSBarry Smith     *ierr = SNESMonitorSet(*snes,oursnesmonitor,*snes,ourmondestroy);
3998e27ec22SSatish Balay   }
4008e27ec22SSatish Balay }
4018e27ec22SSatish Balay 
40219caf8f3SSatish Balay PETSC_EXTERN void snesviewfromoptions_(SNES *ao,PetscObject obj,char* type,PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len)
403fe2efc57SMark {
404fe2efc57SMark   char *t;
405fe2efc57SMark 
406fe2efc57SMark   FIXCHAR(type,len,t);
407fe2efc57SMark   *ierr = SNESViewFromOptions(*ao,obj,t);if (*ierr) return;
408fe2efc57SMark   FREECHAR(type,t);
409fe2efc57SMark }
410