xref: /petsc/src/snes/interface/ftn-custom/zsnesf.c (revision 91f3e32b51157b117797a30954462a67c6aa1895)
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)
7*91f3e32bSBarry Smith #define snesconvergedreasonview_         SNESCONVERGEDREASONVIEW
8df2570feSBarry Smith #define snessetpicard_                   SNESSETPICARD
9df66969eSBarry Smith #define matmffdcomputejacobian_          MATMFFDCOMPUTEJACOBIAN
106ce558aeSBarry Smith #define snessolve_                       SNESSOLVE
118d359177SBarry Smith #define snescomputejacobiandefault_      SNESCOMPUTEJACOBIANDEFAULT
128d359177SBarry Smith #define snescomputejacobiandefaultcolor_ SNESCOMPUTEJACOBIANDEFAULTCOLOR
138e27ec22SSatish Balay #define snessetjacobian_                 SNESSETJACOBIAN
1417a42bb7SSatish Balay #define snessetjacobian1_                SNESSETJACOBIAN1
1517a42bb7SSatish Balay #define snessetjacobian2_                SNESSETJACOBIAN2
168e27ec22SSatish Balay #define snesgetoptionsprefix_            SNESGETOPTIONSPREFIX
178e27ec22SSatish Balay #define snesgettype_                     SNESGETTYPE
188e27ec22SSatish Balay #define snessetfunction_                 SNESSETFUNCTION
19be95d8f1SBarry Smith #define snessetngs_                       SNESSETNGS
20dfef22ccSBarry Smith #define snessetupdate_                    SNESSETUPDATE
218e27ec22SSatish Balay #define snesgetfunction_                 SNESGETFUNCTION
22be95d8f1SBarry Smith #define snesgetngs_                       SNESGETNGS
238e27ec22SSatish Balay #define snessetconvergencetest_          SNESSETCONVERGENCETEST
248d359177SBarry Smith #define snesconvergeddefault_            SNESCONVERGEDDEFAULT
25e07f7f94SSatish Balay #define snesconvergedskip_               SNESCONVERGEDSKIP
268e27ec22SSatish Balay #define snesview_                        SNESVIEW
278e27ec22SSatish Balay #define snesgetconvergencehistory_       SNESGETCONVERGENCEHISTORY
288e27ec22SSatish Balay #define snesgetjacobian_                 SNESGETJACOBIAN
298e27ec22SSatish Balay #define snessettype_                     SNESSETTYPE
308e27ec22SSatish Balay #define snesappendoptionsprefix_         SNESAPPENDOPTIONSPREFIX
318e27ec22SSatish Balay #define snessetoptionsprefix_            SNESSETOPTIONSPREFIX
32a6570f20SBarry Smith #define snesmonitordefault_              SNESMONITORDEFAULT
33a6570f20SBarry Smith #define snesmonitorsolution_             SNESMONITORSOLUTION
344619e776SBarry Smith #define snesmonitorlgresidualnorm_       SNESMONITORLGRESIDUALNORM
35a6570f20SBarry Smith #define snesmonitorsolutionupdate_       SNESMONITORSOLUTIONUPDATE
36a6570f20SBarry Smith #define snesmonitorset_                  SNESMONITORSET
37c9368356SGlenn Hammond #define snesnewtontrsetprecheck_         SNESNEWTONTRSETPRECHECK
383b42469aSBarry Smith #define snesnewtontrsetpostcheck_        SNESNEWTONTRSETPOSTCHECK
39fe2efc57SMark #define snesviewfromoptions_             SNESVIEWFROMOPTIONS
404e2a09fcSBarry Smith #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
41*91f3e32bSBarry Smith #define snesconvergedreasonview_         snesconvergedreasonview
42df2570feSBarry Smith #define snessetpicard_                   snessetpicard
43df66969eSBarry Smith #define matmffdcomputejacobian_          matmffdcomputejacobian
446ce558aeSBarry Smith #define snessolve_                       snessolve
458d359177SBarry Smith #define snescomputejacobiandefault_      snescomputejacobiandefault
468d359177SBarry Smith #define snescomputejacobiandefaultcolor_ snescomputejacobiandefaultcolor
478e27ec22SSatish Balay #define snessetjacobian_                 snessetjacobian
4817a42bb7SSatish Balay #define snessetjacobian1_                snessetjacobian1
4917a42bb7SSatish Balay #define snessetjacobian2_                snessetjacobian2
508e27ec22SSatish Balay #define snesgetoptionsprefix_            snesgetoptionsprefix
518e27ec22SSatish Balay #define snesgettype_                     snesgettype
528e27ec22SSatish Balay #define snessetfunction_                 snessetfunction
53be95d8f1SBarry Smith #define snessetngs_                      snessetngs
54dfef22ccSBarry Smith #define snessetupdate_                   snessetupdate
558e27ec22SSatish Balay #define snesgetfunction_                 snesgetfunction
56be95d8f1SBarry Smith #define snesgetngs_                      snesgetngs
578e27ec22SSatish Balay #define snessetconvergencetest_          snessetconvergencetest
588d359177SBarry Smith #define snesconvergeddefault_            snesconvergeddefault
59e07f7f94SSatish Balay #define snesconvergedskip_               snesconvergedskip
608e27ec22SSatish Balay #define snesview_                        snesview
618e27ec22SSatish Balay #define snesgetjacobian_                 snesgetjacobian
628e27ec22SSatish Balay #define snesgetconvergencehistory_       snesgetconvergencehistory
638e27ec22SSatish Balay #define snessettype_                     snessettype
648e27ec22SSatish Balay #define snesappendoptionsprefix_         snesappendoptionsprefix
658e27ec22SSatish Balay #define snessetoptionsprefix_            snessetoptionsprefix
664619e776SBarry Smith #define snesmonitorlgresidualnorm_       snesmonitorlgresidualnorm
67a6570f20SBarry Smith #define snesmonitordefault_              snesmonitordefault
68a6570f20SBarry Smith #define snesmonitorsolution_             snesmonitorsolution
69a6570f20SBarry Smith #define snesmonitorsolutionupdate_       snesmonitorsolutionupdate
70a6570f20SBarry Smith #define snesmonitorset_                  snesmonitorset
71c9368356SGlenn Hammond #define snesnewtontrsetprecheck_         snesnewtontrsetprecheck
723b42469aSBarry Smith #define snesnewtontrsetpostcheck_        snesnewtontrsetpostcheck
73fe2efc57SMark #define snesviewfromoptions_             snesviewfromoptions
748e27ec22SSatish Balay #endif
758e27ec22SSatish Balay 
76f6291634SJed Brown static struct {
77f6291634SJed Brown   PetscFortranCallbackId function;
78f6291634SJed Brown   PetscFortranCallbackId test;
79f6291634SJed Brown   PetscFortranCallbackId destroy;
80f6291634SJed Brown   PetscFortranCallbackId jacobian;
81f6291634SJed Brown   PetscFortranCallbackId monitor;
82f6291634SJed Brown   PetscFortranCallbackId mondestroy;
83be95d8f1SBarry Smith   PetscFortranCallbackId ngs;
84dfef22ccSBarry Smith   PetscFortranCallbackId update;
85c9368356SGlenn Hammond   PetscFortranCallbackId trprecheck;
867cb011f5SBarry Smith   PetscFortranCallbackId trpostcheck;
8789e00c7dSSatish Balay #if defined(PETSC_HAVE_F90_2PTR_ARG)
8889e00c7dSSatish Balay   PetscFortranCallbackId function_pgiptr;
89c9368356SGlenn Hammond   PetscFortranCallbackId trprecheck_pgiptr;
903c2ee7eaSBarry Smith   PetscFortranCallbackId trpostcheck_pgiptr;
9189e00c7dSSatish Balay #endif
92f6291634SJed Brown } _cb;
9390b77ac2SPeter Brune 
94c9368356SGlenn Hammond static PetscErrorCode ourtrprecheckfunction(SNES snes,Vec x,Vec y,PetscBool *changed_y,void *ctx)
95c9368356SGlenn Hammond {
96c9368356SGlenn Hammond #if defined(PETSC_HAVE_F90_2PTR_ARG)
97c9368356SGlenn Hammond   void* ptr;
98c9368356SGlenn Hammond   PetscObjectGetFortranCallback((PetscObject)snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.trprecheck_pgiptr,NULL,&ptr);
99c9368356SGlenn Hammond #endif
100c9368356SGlenn 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)));
101c9368356SGlenn Hammond }
102c9368356SGlenn Hammond 
10319caf8f3SSatish Balay PETSC_EXTERN void snesnewtontrsetprecheck_(SNES *snes, void (*func)(SNES,Vec,Vec,PetscBool*,void*),void *ctx,PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(ptr))
104c9368356SGlenn Hammond {
105c9368356SGlenn Hammond   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.trprecheck,(PetscVoidFunction)func,ctx);if (*ierr) return;
106c9368356SGlenn Hammond #if defined(PETSC_HAVE_F90_2PTR_ARG)
107c9368356SGlenn Hammond   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.trprecheck_pgiptr,NULL,ptr);if (*ierr) return;
108c9368356SGlenn Hammond #endif
109c9368356SGlenn Hammond   SNESNewtonTRSetPreCheck(*snes,ourtrprecheckfunction,NULL);
110c9368356SGlenn Hammond }
111c9368356SGlenn Hammond 
112c9368356SGlenn Hammond 
113c9368356SGlenn Hammond static PetscErrorCode ourtrpostcheckfunction(SNES snes,Vec x,Vec y,Vec w,PetscBool *changed_y,PetscBool *changed_w,void *ctx)
1147cb011f5SBarry Smith {
1157cb011f5SBarry Smith #if defined(PETSC_HAVE_F90_2PTR_ARG)
1167cb011f5SBarry Smith   void* ptr;
1173c2ee7eaSBarry Smith   PetscObjectGetFortranCallback((PetscObject)snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.trpostcheck_pgiptr,NULL,&ptr);
1187cb011f5SBarry Smith #endif
119c9368356SGlenn 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)));
1207cb011f5SBarry Smith }
1217cb011f5SBarry Smith 
12219caf8f3SSatish 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))
1237cb011f5SBarry Smith {
1247cb011f5SBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.trpostcheck,(PetscVoidFunction)func,ctx);if (*ierr) return;
1257cb011f5SBarry Smith #if defined(PETSC_HAVE_F90_2PTR_ARG)
1263c2ee7eaSBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.trpostcheck_pgiptr,NULL,ptr);if (*ierr) return;
1277cb011f5SBarry Smith #endif
1287cb011f5SBarry Smith   SNESNewtonTRSetPostCheck(*snes,ourtrpostcheckfunction,NULL);
1297cb011f5SBarry Smith }
1307cb011f5SBarry Smith 
1318e27ec22SSatish Balay static PetscErrorCode oursnesfunction(SNES snes,Vec x,Vec f,void *ctx)
1328e27ec22SSatish Balay {
13389e00c7dSSatish Balay #if defined(PETSC_HAVE_F90_2PTR_ARG)
13489e00c7dSSatish Balay   void* ptr;
13589e00c7dSSatish Balay   PetscObjectGetFortranCallback((PetscObject)snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.function_pgiptr,NULL,&ptr);
13689e00c7dSSatish Balay #endif
13789e00c7dSSatish 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)));
1388e27ec22SSatish Balay }
139b8ebb45fSBarry Smith 
14006ee9f85SBarry Smith static PetscErrorCode oursnestest(SNES snes,PetscInt it,PetscReal a,PetscReal d,PetscReal c,SNESConvergedReason *reason,void *ctx)
1418e27ec22SSatish Balay {
142f6291634SJed Brown   PetscObjectUseFortranCallback(snes,_cb.test,(SNES*,PetscInt*,PetscReal*,PetscReal*,PetscReal*,SNESConvergedReason*,void*,PetscErrorCode*),(&snes,&it,&a,&d,&c,reason,_ctx,&ierr));
1437f7931b9SBarry Smith }
1447f7931b9SBarry Smith 
1457f7931b9SBarry Smith static PetscErrorCode ourdestroy(void *ctx)
1467f7931b9SBarry Smith {
147f6291634SJed Brown   PetscObjectUseFortranCallback(ctx,_cb.destroy,(void*,PetscErrorCode*),(_ctx,&ierr));
1488e27ec22SSatish Balay }
1498e27ec22SSatish Balay 
150d1e9a80fSBarry Smith static PetscErrorCode oursnesjacobian(SNES snes,Vec x,Mat m,Mat p,void *ctx)
1518e27ec22SSatish Balay {
152d1e9a80fSBarry Smith   PetscObjectUseFortranCallback(snes,_cb.jacobian,(SNES*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),(&snes,&x,&m,&p,_ctx,&ierr));
1538e27ec22SSatish Balay }
154f6291634SJed Brown 
155dfef22ccSBarry Smith static PetscErrorCode oursnesupdate(SNES snes,PetscInt i)
156dfef22ccSBarry Smith {
157dfef22ccSBarry Smith   PetscObjectUseFortranCallback(snes,_cb.update,(SNES*,PetscInt *,PetscErrorCode*),(&snes,&i,&ierr));
158dfef22ccSBarry Smith }
159be95d8f1SBarry Smith static PetscErrorCode oursnesngs(SNES snes,Vec x,Vec b,void *ctx)
16090b77ac2SPeter Brune {
161be95d8f1SBarry Smith   PetscObjectUseFortranCallback(snes,_cb.ngs,(SNES*,Vec*,Vec*,void*,PetscErrorCode*),(&snes,&x,&b,_ctx,&ierr));
16290b77ac2SPeter Brune }
1638e27ec22SSatish Balay static PetscErrorCode oursnesmonitor(SNES snes,PetscInt i,PetscReal d,void *ctx)
1648e27ec22SSatish Balay {
165f6291634SJed Brown   PetscObjectUseFortranCallback(snes,_cb.monitor,(SNES*,PetscInt*,PetscReal*,void*,PetscErrorCode*),(&snes,&i,&d,_ctx,&ierr));
1668e27ec22SSatish Balay }
167c2efdce3SBarry Smith static PetscErrorCode ourmondestroy(void **ctx)
1688e27ec22SSatish Balay {
169f6291634SJed Brown   SNES snes = (SNES)*ctx;
170f6291634SJed Brown   PetscObjectUseFortranCallback(snes,_cb.mondestroy,(void*,PetscErrorCode*),(_ctx,&ierr));
1718e27ec22SSatish Balay }
1728e27ec22SSatish Balay 
1738e27ec22SSatish Balay /* ---------------------------------------------------------*/
1748e27ec22SSatish Balay /*
1758d359177SBarry Smith      snescomputejacobiandefault() and snescomputejacobiandefaultcolor()
1768e27ec22SSatish Balay   These can be used directly from Fortran but are mostly so that
1778e27ec22SSatish Balay   Fortran SNESSetJacobian() will properly handle the defaults being passed in.
1788e27ec22SSatish Balay */
179d1e9a80fSBarry Smith PETSC_EXTERN void matmffdcomputejacobian_(SNES *snes,Vec *x,Mat *m,Mat *p,void *ctx,PetscErrorCode *ierr)
180df66969eSBarry Smith {
181d1e9a80fSBarry Smith   *ierr = MatMFFDComputeJacobian(*snes,*x,*m,*p,ctx);
182df66969eSBarry Smith }
183d1e9a80fSBarry Smith PETSC_EXTERN void snescomputejacobiandefault_(SNES *snes,Vec *x,Mat *m,Mat *p,void *ctx,PetscErrorCode *ierr)
1848e27ec22SSatish Balay {
185d1e9a80fSBarry Smith   *ierr = SNESComputeJacobianDefault(*snes,*x,*m,*p,ctx);
1868e27ec22SSatish Balay }
187d1e9a80fSBarry Smith PETSC_EXTERN void  snescomputejacobiandefaultcolor_(SNES *snes,Vec *x,Mat *m,Mat *p,void *ctx,PetscErrorCode *ierr)
1888e27ec22SSatish Balay {
189d1e9a80fSBarry Smith   *ierr = SNESComputeJacobianDefaultColor(*snes,*x,*m,*p,*(MatFDColoring*)ctx);
1908e27ec22SSatish Balay }
1918e27ec22SSatish Balay 
19219caf8f3SSatish Balay PETSC_EXTERN void snessetjacobian_(SNES *snes,Mat *A,Mat *B,
19319caf8f3SSatish Balay                                     void (*func)(SNES*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),
194f5af7f23SKarl Rupp                                     void *ctx,PetscErrorCode *ierr)
1958e27ec22SSatish Balay {
196f5b6597dSBarry Smith   CHKFORTRANNULLFUNCTION(func);
1978d359177SBarry Smith   if ((PetscVoidFunction)func == (PetscVoidFunction)snescomputejacobiandefault_) {
1988d359177SBarry Smith     *ierr = SNESSetJacobian(*snes,*A,*B,SNESComputeJacobianDefault,ctx);
1998d359177SBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snescomputejacobiandefaultcolor_) {
200e025ade3SBarry Smith     if (!ctx) {
201e025ade3SBarry Smith       *ierr = PETSC_ERR_ARG_NULL;
202e025ade3SBarry Smith       return;
203e025ade3SBarry Smith     }
2048d359177SBarry Smith     *ierr = SNESSetJacobian(*snes,*A,*B,SNESComputeJacobianDefaultColor,*(MatFDColoring*)ctx);
205df66969eSBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)matmffdcomputejacobian_) {
206df66969eSBarry Smith     *ierr = SNESSetJacobian(*snes,*A,*B,MatMFFDComputeJacobian,ctx);
2078e27ec22SSatish Balay   } else {
208f6291634SJed Brown     *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.jacobian,(PetscVoidFunction)func,ctx);
2090298fd71SBarry Smith     if (!*ierr) *ierr = SNESSetJacobian(*snes,*A,*B,oursnesjacobian,NULL);
2108e27ec22SSatish Balay   }
2118e27ec22SSatish Balay }
21217a42bb7SSatish Balay PETSC_EXTERN void snessetjacobian1_(SNES *snes,Mat *A,Mat *B,
21317a42bb7SSatish Balay                                     void (*func)(SNES*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),
21417a42bb7SSatish Balay                                     void *ctx,PetscErrorCode *ierr)
21517a42bb7SSatish Balay {
21617a42bb7SSatish Balay   snessetjacobian_(snes,A,B,func,ctx,ierr);
21717a42bb7SSatish Balay }
21817a42bb7SSatish Balay PETSC_EXTERN void snessetjacobian2_(SNES *snes,Mat *A,Mat *B,
21917a42bb7SSatish Balay                                     void (*func)(SNES*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),
22017a42bb7SSatish Balay                                     void *ctx,PetscErrorCode *ierr)
22117a42bb7SSatish Balay {
22217a42bb7SSatish Balay   snessetjacobian_(snes,A,B,func,ctx,ierr);
22317a42bb7SSatish Balay }
2248e27ec22SSatish Balay /* -------------------------------------------------------------*/
225df2570feSBarry Smith static PetscErrorCode oursnespicardfunction(SNES snes,Vec x,Vec f,void *ctx)
226df2570feSBarry Smith {
227df2570feSBarry Smith #if defined(PETSC_HAVE_F90_2PTR_ARG)
228df2570feSBarry Smith   void* ptr;
229df2570feSBarry Smith   PetscObjectGetFortranCallback((PetscObject)snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.function_pgiptr,NULL,&ptr);
230df2570feSBarry Smith #endif
231df2570feSBarry Smith   PetscObjectUseFortranCallback(snes,_cb.function,(SNES*,Vec*,Vec*,void*,PetscErrorCode* PETSC_F90_2PTR_PROTO_NOVAR),(&snes,&x,&f,_ctx,&ierr PETSC_F90_2PTR_PARAM(ptr)));
232df2570feSBarry Smith }
233df2570feSBarry Smith 
234df2570feSBarry Smith static PetscErrorCode oursnespicardjacobian(SNES snes,Vec x,Mat m,Mat p,void *ctx)
235df2570feSBarry Smith {
236df2570feSBarry Smith   PetscObjectUseFortranCallback(snes,_cb.jacobian,(SNES*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),(&snes,&x,&m,&p,_ctx,&ierr));
237df2570feSBarry Smith }
238df2570feSBarry Smith 
239df2570feSBarry Smith PETSC_EXTERN void snessetpicard_(SNES *snes,Vec *r,void (*func)(SNES*,Vec*,Vec *,void*,PetscErrorCode*),Mat *A,Mat *B,
240df2570feSBarry Smith                                  PetscErrorCode (*J)(SNES,Vec,Mat,Mat,void*),void *ctx,PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(ptr))
241df2570feSBarry Smith {
242df2570feSBarry Smith     *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.function,(PetscVoidFunction)func,ctx);
243df2570feSBarry Smith #if defined(PETSC_HAVE_F90_2PTR_ARG)
244df2570feSBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.function_pgiptr,NULL,ptr);if (*ierr) return;
245df2570feSBarry Smith #endif
246df2570feSBarry Smith     *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.jacobian,(PetscVoidFunction)J,ctx);
247df2570feSBarry Smith     if (!*ierr) *ierr = SNESSetPicard(*snes,*r,oursnespicardfunction,*A,*B,oursnespicardjacobian,NULL);
248df2570feSBarry Smith }
249df2570feSBarry Smith /* -------------------------------------------------------------*/
2508e27ec22SSatish Balay 
25119caf8f3SSatish Balay PETSC_EXTERN void snesgetoptionsprefix_(SNES *snes,char* prefix,PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len)
2528e27ec22SSatish Balay {
2538e27ec22SSatish Balay   const char *tname;
2548e27ec22SSatish Balay 
2558e27ec22SSatish Balay   *ierr = SNESGetOptionsPrefix(*snes,&tname);
2568e27ec22SSatish Balay   *ierr = PetscStrncpy(prefix,tname,len);if (*ierr) return;
257d6a8cea5SBarry Smith   FIXRETURNCHAR(PETSC_TRUE,prefix,len);
2588e27ec22SSatish Balay }
2598e27ec22SSatish Balay 
26019caf8f3SSatish Balay PETSC_EXTERN void snesgettype_(SNES *snes,char* name, PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len)
2618e27ec22SSatish Balay {
2628e27ec22SSatish Balay   const char *tname;
2638e27ec22SSatish Balay 
2648e27ec22SSatish Balay   *ierr = SNESGetType(*snes,&tname);
2658e27ec22SSatish Balay   *ierr = PetscStrncpy(name,tname,len);if (*ierr) return;
2667c363081SBarry Smith   FIXRETURNCHAR(PETSC_TRUE,name,len);
2678e27ec22SSatish Balay }
268e3da1266SHong Zhang 
2698e27ec22SSatish Balay /* ---------------------------------------------------------*/
2708e27ec22SSatish Balay 
2718e27ec22SSatish Balay /*
2728e27ec22SSatish Balay    These are not usually called from Fortran but allow Fortran users
2738e27ec22SSatish Balay    to transparently set these monitors from .F code
2748e27ec22SSatish Balay */
2758e27ec22SSatish Balay 
27619caf8f3SSatish 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))
2778e27ec22SSatish Balay {
278aecf964fSBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.function,(PetscVoidFunction)func,ctx);if (*ierr) return;
27989e00c7dSSatish Balay #if defined(PETSC_HAVE_F90_2PTR_ARG)
280aecf964fSBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.function_pgiptr,NULL,ptr);if (*ierr) return;
28189e00c7dSSatish Balay #endif
282aecf964fSBarry Smith   *ierr = SNESSetFunction(*snes,*r,oursnesfunction,NULL);
2838e27ec22SSatish Balay }
284c79ef259SPeter Brune 
285c79ef259SPeter Brune 
28619caf8f3SSatish Balay PETSC_EXTERN void snessetngs_(SNES *snes,void (*func)(SNES*,Vec*,Vec*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr)
287c79ef259SPeter Brune {
288aecf964fSBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.ngs,(PetscVoidFunction)func,ctx);if (*ierr) return;
289aecf964fSBarry Smith   *ierr = SNESSetNGS(*snes,oursnesngs,NULL);
290c79ef259SPeter Brune }
29119caf8f3SSatish Balay PETSC_EXTERN void snessetupdate_(SNES *snes,void (*func)(SNES*,PetscInt*,PetscErrorCode*),PetscErrorCode *ierr)
292dfef22ccSBarry Smith {
293aecf964fSBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.update,(PetscVoidFunction)func,NULL);if (*ierr) return;
294aecf964fSBarry Smith   *ierr = SNESSetUpdate(*snes,oursnesupdate);
295dfef22ccSBarry Smith }
2968e27ec22SSatish Balay /* ---------------------------------------------------------*/
2978e27ec22SSatish Balay 
2988e27ec22SSatish Balay /* the func argument is ignored */
29919caf8f3SSatish Balay PETSC_EXTERN void snesgetfunction_(SNES *snes,Vec *r,void (*func)(SNES,Vec,Vec,void*),void **ctx,PetscErrorCode *ierr)
3008e27ec22SSatish Balay {
3018e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(r);
3020298fd71SBarry Smith   *ierr = SNESGetFunction(*snes,r,NULL,NULL); if (*ierr) return;
303146935d7SSatish Balay   if ((PetscVoidFunction)func == (PetscVoidFunction)PETSC_NULL_FUNCTION_Fortran) return;
3040298fd71SBarry Smith   *ierr = PetscObjectGetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.function,NULL,ctx);
3058e27ec22SSatish Balay }
306c79ef259SPeter Brune 
30719caf8f3SSatish Balay PETSC_EXTERN void snesgetngs_(SNES *snes,void *func,void **ctx,PetscErrorCode *ierr)
308c79ef259SPeter Brune {
309be95d8f1SBarry Smith   *ierr = PetscObjectGetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.ngs,NULL,ctx);
310c79ef259SPeter Brune }
311c79ef259SPeter Brune 
3128e27ec22SSatish Balay /*----------------------------------------------------------------------*/
3138e27ec22SSatish Balay 
31469c1e2abSSatish Balay PETSC_EXTERN void snesconvergeddefault_(SNES *snes,PetscInt *it,PetscReal *a,PetscReal *b,PetscReal *c,SNESConvergedReason *r, void *ct,PetscErrorCode *ierr)
3153f149594SLisandro Dalcin {
3168d359177SBarry Smith   *ierr = SNESConvergedDefault(*snes,*it,*a,*b,*c,r,ct);
3173f149594SLisandro Dalcin }
3183f149594SLisandro Dalcin 
319e07f7f94SSatish Balay PETSC_EXTERN void snesconvergedskip_(SNES *snes,PetscInt *it,PetscReal *a,PetscReal *b,PetscReal *c,SNESConvergedReason *r,void *ct,PetscErrorCode *ierr)
3203f149594SLisandro Dalcin {
321e2a6519dSDmitry Karpeev   *ierr = SNESConvergedSkip(*snes,*it,*a,*b,*c,r,ct);
3223f149594SLisandro Dalcin }
3233f149594SLisandro Dalcin 
32419caf8f3SSatish Balay PETSC_EXTERN void snessetconvergencetest_(SNES *snes,void (*func)(SNES*,PetscInt*,PetscReal*,PetscReal*,PetscReal*,SNESConvergedReason*,void*,PetscErrorCode*), void *cctx,void (*destroy)(void*),PetscErrorCode *ierr)
3258e27ec22SSatish Balay {
3263f22127dSBarry Smith   CHKFORTRANNULLFUNCTION(destroy);
3273f149594SLisandro Dalcin 
3288d359177SBarry Smith   if ((PetscVoidFunction)func == (PetscVoidFunction)snesconvergeddefault_) {
3298d359177SBarry Smith     *ierr = SNESSetConvergenceTest(*snes,SNESConvergedDefault,0,0);
330e07f7f94SSatish Balay   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesconvergedskip_) {
331e2a6519dSDmitry Karpeev     *ierr = SNESSetConvergenceTest(*snes,SNESConvergedSkip,0,0);
3328e27ec22SSatish Balay   } else {
333aecf964fSBarry Smith     *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.test,(PetscVoidFunction)func,cctx);if (*ierr) return;
334aecf964fSBarry Smith     *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.destroy,(PetscVoidFunction)destroy,cctx);if (*ierr) return;
335aecf964fSBarry Smith     *ierr = SNESSetConvergenceTest(*snes,oursnestest,*snes,ourdestroy);
3368e27ec22SSatish Balay   }
3378e27ec22SSatish Balay }
3388e27ec22SSatish Balay /*----------------------------------------------------------------------*/
3398e27ec22SSatish Balay 
34019caf8f3SSatish Balay PETSC_EXTERN void snesview_(SNES *snes,PetscViewer *viewer, PetscErrorCode *ierr)
3418e27ec22SSatish Balay {
3428e27ec22SSatish Balay   PetscViewer v;
3438e27ec22SSatish Balay   PetscPatchDefaultViewers_Fortran(viewer,v);
3448e27ec22SSatish Balay   *ierr = SNESView(*snes,v);
3458e27ec22SSatish Balay }
3468e27ec22SSatish Balay 
3478e27ec22SSatish Balay /*  func is currently ignored from Fortran */
34819caf8f3SSatish Balay PETSC_EXTERN void snesgetjacobian_(SNES *snes,Mat *A,Mat *B,int *func,void **ctx,PetscErrorCode *ierr)
3498e27ec22SSatish Balay {
3508e27ec22SSatish Balay   CHKFORTRANNULLINTEGER(ctx);
3518e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(A);
3528e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(B);
3530298fd71SBarry Smith   *ierr = SNESGetJacobian(*snes,A,B,0,NULL); if (*ierr) return;
3540298fd71SBarry Smith   *ierr = PetscObjectGetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.jacobian,NULL,ctx);
355f2e0d3f1SJed Brown 
3568e27ec22SSatish Balay }
3578e27ec22SSatish Balay 
35819caf8f3SSatish Balay PETSC_EXTERN void snesgetconvergencehistory_(SNES *snes,PetscInt *na,PetscErrorCode *ierr)
3598e27ec22SSatish Balay {
3600298fd71SBarry Smith   *ierr = SNESGetConvergenceHistory(*snes,NULL,NULL,na);
3618e27ec22SSatish Balay }
3628e27ec22SSatish Balay 
36319caf8f3SSatish Balay PETSC_EXTERN void snessettype_(SNES *snes,char* type,PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len)
3648e27ec22SSatish Balay {
3658e27ec22SSatish Balay   char *t;
3668e27ec22SSatish Balay 
3678e27ec22SSatish Balay   FIXCHAR(type,len,t);
368d49bb8f9SBarry Smith   *ierr = SNESSetType(*snes,t);if (*ierr) return;
3698e27ec22SSatish Balay   FREECHAR(type,t);
3708e27ec22SSatish Balay }
3718e27ec22SSatish Balay 
37219caf8f3SSatish Balay PETSC_EXTERN void snesappendoptionsprefix_(SNES *snes,char* prefix,PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len)
3738e27ec22SSatish Balay {
3748e27ec22SSatish Balay   char *t;
3758e27ec22SSatish Balay 
3768e27ec22SSatish Balay   FIXCHAR(prefix,len,t);
377d49bb8f9SBarry Smith   *ierr = SNESAppendOptionsPrefix(*snes,t);if (*ierr) return;
3788e27ec22SSatish Balay   FREECHAR(prefix,t);
3798e27ec22SSatish Balay }
3808e27ec22SSatish Balay 
38119caf8f3SSatish Balay PETSC_EXTERN void snessetoptionsprefix_(SNES *snes,char* prefix,PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len)
3828e27ec22SSatish Balay {
3838e27ec22SSatish Balay   char *t;
3848e27ec22SSatish Balay 
3858e27ec22SSatish Balay   FIXCHAR(prefix,len,t);
386d49bb8f9SBarry Smith   *ierr = SNESSetOptionsPrefix(*snes,t);if (*ierr) return;
3878e27ec22SSatish Balay   FREECHAR(prefix,t);
3888e27ec22SSatish Balay }
3898e27ec22SSatish Balay 
3908e27ec22SSatish Balay /*----------------------------------------------------------------------*/
3918e27ec22SSatish Balay 
3929611d799SBarry Smith PETSC_EXTERN void snesmonitorlgresidualnorm_(SNES *snes,PetscInt *its,PetscReal *fgnorm,PetscObject *dummy,PetscErrorCode *ierr)
3938e27ec22SSatish Balay {
3944619e776SBarry Smith   *ierr = SNESMonitorLGResidualNorm(*snes,*its,*fgnorm,dummy);
3958e27ec22SSatish Balay }
3968e27ec22SSatish Balay 
39752f0073cSBarry Smith PETSC_EXTERN void snesmonitordefault_(SNES *snes,PetscInt *its,PetscReal *fgnorm,PetscViewerAndFormat **dummy,PetscErrorCode *ierr)
3988e27ec22SSatish Balay {
399410efd14SBarry Smith   *ierr = SNESMonitorDefault(*snes,*its,*fgnorm,*dummy);
4008e27ec22SSatish Balay }
4018e27ec22SSatish Balay 
40252f0073cSBarry Smith PETSC_EXTERN void snesmonitorsolution_(SNES *snes,PetscInt *its,PetscReal *fgnorm,PetscViewerAndFormat **dummy,PetscErrorCode *ierr)
4038e27ec22SSatish Balay {
404410efd14SBarry Smith   *ierr = SNESMonitorSolution(*snes,*its,*fgnorm,*dummy);
4058e27ec22SSatish Balay }
4068e27ec22SSatish Balay 
40752f0073cSBarry Smith PETSC_EXTERN void snesmonitorsolutionupdate_(SNES *snes,PetscInt *its,PetscReal *fgnorm,PetscViewerAndFormat **dummy,PetscErrorCode *ierr)
4088e27ec22SSatish Balay {
409410efd14SBarry Smith   *ierr = SNESMonitorSolutionUpdate(*snes,*its,*fgnorm,*dummy);
4108e27ec22SSatish Balay }
4118e27ec22SSatish Balay 
4128e27ec22SSatish Balay 
41319caf8f3SSatish Balay PETSC_EXTERN void snesmonitorset_(SNES *snes,void (*func)(SNES*,PetscInt*,PetscReal*,void*,PetscErrorCode*),void *mctx,void (*mondestroy)(void*,PetscErrorCode*),PetscErrorCode *ierr)
4148e27ec22SSatish Balay {
415aecf964fSBarry Smith   CHKFORTRANNULLFUNCTION(mondestroy);
416a6570f20SBarry Smith   if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitordefault_) {
4171cb03803SBarry Smith     *ierr = SNESMonitorSet(*snes,(PetscErrorCode (*)(SNES,PetscInt,PetscReal,void*))SNESMonitorDefault,*(PetscViewerAndFormat**)mctx,(PetscErrorCode (*)(void **))PetscViewerAndFormatDestroy);
418a6570f20SBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorsolution_) {
4191cb03803SBarry Smith     *ierr = SNESMonitorSet(*snes,(PetscErrorCode (*)(SNES,PetscInt,PetscReal,void*))SNESMonitorSolution,*(PetscViewerAndFormat**)mctx,(PetscErrorCode (*)(void **))PetscViewerAndFormatDestroy);
420a6570f20SBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorsolutionupdate_) {
4211cb03803SBarry Smith     *ierr = SNESMonitorSet(*snes,(PetscErrorCode (*)(SNES,PetscInt,PetscReal,void*))SNESMonitorSolutionUpdate,*(PetscViewerAndFormat**)mctx,(PetscErrorCode (*)(void **))PetscViewerAndFormatDestroy);
4224619e776SBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorlgresidualnorm_) {
4233e7ff0edSBarry Smith     *ierr = SNESMonitorSet(*snes,(PetscErrorCode (*)(SNES,PetscInt,PetscReal,void*))SNESMonitorLGResidualNorm,0,0);
4248e27ec22SSatish Balay   } else {
425aecf964fSBarry Smith     *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.monitor,(PetscVoidFunction)func,mctx);if (*ierr) return;
426aecf964fSBarry Smith     *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.mondestroy,(PetscVoidFunction)mondestroy,mctx);if (*ierr) return;
427aecf964fSBarry Smith     *ierr = SNESMonitorSet(*snes,oursnesmonitor,*snes,ourmondestroy);
4288e27ec22SSatish Balay   }
4298e27ec22SSatish Balay }
4308e27ec22SSatish Balay 
43119caf8f3SSatish Balay PETSC_EXTERN void snesviewfromoptions_(SNES *ao,PetscObject obj,char* type,PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len)
432fe2efc57SMark {
433fe2efc57SMark   char *t;
434fe2efc57SMark 
435fe2efc57SMark   FIXCHAR(type,len,t);
436fe2efc57SMark   *ierr = SNESViewFromOptions(*ao,obj,t);if (*ierr) return;
437fe2efc57SMark   FREECHAR(type,t);
438fe2efc57SMark }
439*91f3e32bSBarry Smith 
440*91f3e32bSBarry Smith PETSC_EXTERN void snesconvergedreasonview_(SNES *snes,PetscViewer *viewer, PetscErrorCode *ierr)
441*91f3e32bSBarry Smith {
442*91f3e32bSBarry Smith   PetscViewer v;
443*91f3e32bSBarry Smith   PetscPatchDefaultViewers_Fortran(viewer,v);
444*91f3e32bSBarry Smith   *ierr = SNESConvergedReasonView(*snes,v);
445*91f3e32bSBarry Smith }
446