xref: /petsc/src/snes/interface/ftn-custom/zsnesf.c (revision df2570fef5089aea2961457adb3074278e99e9ae)
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*df2570feSBarry Smith #define snessetpicard_                   SNESSETPICARD
8df66969eSBarry Smith #define matmffdcomputejacobian_          MATMFFDCOMPUTEJACOBIAN
96ce558aeSBarry Smith #define snessolve_                       SNESSOLVE
108d359177SBarry Smith #define snescomputejacobiandefault_      SNESCOMPUTEJACOBIANDEFAULT
118d359177SBarry Smith #define snescomputejacobiandefaultcolor_ SNESCOMPUTEJACOBIANDEFAULTCOLOR
128e27ec22SSatish Balay #define snessetjacobian_                 SNESSETJACOBIAN
1317a42bb7SSatish Balay #define snessetjacobian1_                SNESSETJACOBIAN1
1417a42bb7SSatish Balay #define snessetjacobian2_                SNESSETJACOBIAN2
158e27ec22SSatish Balay #define snesgetoptionsprefix_            SNESGETOPTIONSPREFIX
168e27ec22SSatish Balay #define snesgettype_                     SNESGETTYPE
178e27ec22SSatish Balay #define snessetfunction_                 SNESSETFUNCTION
18be95d8f1SBarry Smith #define snessetngs_                       SNESSETNGS
19dfef22ccSBarry Smith #define snessetupdate_                    SNESSETUPDATE
208e27ec22SSatish Balay #define snesgetfunction_                 SNESGETFUNCTION
21be95d8f1SBarry Smith #define snesgetngs_                       SNESGETNGS
228e27ec22SSatish Balay #define snessetconvergencetest_          SNESSETCONVERGENCETEST
238d359177SBarry Smith #define snesconvergeddefault_            SNESCONVERGEDDEFAULT
24e07f7f94SSatish Balay #define snesconvergedskip_               SNESCONVERGEDSKIP
258e27ec22SSatish Balay #define snesview_                        SNESVIEW
268e27ec22SSatish Balay #define snesgetconvergencehistory_       SNESGETCONVERGENCEHISTORY
278e27ec22SSatish Balay #define snesgetjacobian_                 SNESGETJACOBIAN
288e27ec22SSatish Balay #define snessettype_                     SNESSETTYPE
298e27ec22SSatish Balay #define snesappendoptionsprefix_         SNESAPPENDOPTIONSPREFIX
308e27ec22SSatish Balay #define snessetoptionsprefix_            SNESSETOPTIONSPREFIX
31a6570f20SBarry Smith #define snesmonitordefault_              SNESMONITORDEFAULT
32a6570f20SBarry Smith #define snesmonitorsolution_             SNESMONITORSOLUTION
334619e776SBarry Smith #define snesmonitorlgresidualnorm_       SNESMONITORLGRESIDUALNORM
34a6570f20SBarry Smith #define snesmonitorsolutionupdate_       SNESMONITORSOLUTIONUPDATE
35a6570f20SBarry Smith #define snesmonitorset_                  SNESMONITORSET
36c9368356SGlenn Hammond #define snesnewtontrsetprecheck_         SNESNEWTONTRSETPRECHECK
373b42469aSBarry Smith #define snesnewtontrsetpostcheck_        SNESNEWTONTRSETPOSTCHECK
38fe2efc57SMark #define snesviewfromoptions_             SNESVIEWFROMOPTIONS
394e2a09fcSBarry Smith #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
40*df2570feSBarry Smith #define snessetpicard_                   snessetpicard
41df66969eSBarry Smith #define matmffdcomputejacobian_          matmffdcomputejacobian
426ce558aeSBarry Smith #define snessolve_                       snessolve
438d359177SBarry Smith #define snescomputejacobiandefault_      snescomputejacobiandefault
448d359177SBarry Smith #define snescomputejacobiandefaultcolor_ snescomputejacobiandefaultcolor
458e27ec22SSatish Balay #define snessetjacobian_                 snessetjacobian
4617a42bb7SSatish Balay #define snessetjacobian1_                snessetjacobian1
4717a42bb7SSatish Balay #define snessetjacobian2_                snessetjacobian2
488e27ec22SSatish Balay #define snesgetoptionsprefix_            snesgetoptionsprefix
498e27ec22SSatish Balay #define snesgettype_                     snesgettype
508e27ec22SSatish Balay #define snessetfunction_                 snessetfunction
51be95d8f1SBarry Smith #define snessetngs_                      snessetngs
52dfef22ccSBarry Smith #define snessetupdate_                   snessetupdate
538e27ec22SSatish Balay #define snesgetfunction_                 snesgetfunction
54be95d8f1SBarry Smith #define snesgetngs_                      snesgetngs
558e27ec22SSatish Balay #define snessetconvergencetest_          snessetconvergencetest
568d359177SBarry Smith #define snesconvergeddefault_            snesconvergeddefault
57e07f7f94SSatish Balay #define snesconvergedskip_               snesconvergedskip
588e27ec22SSatish Balay #define snesview_                        snesview
598e27ec22SSatish Balay #define snesgetjacobian_                 snesgetjacobian
608e27ec22SSatish Balay #define snesgetconvergencehistory_       snesgetconvergencehistory
618e27ec22SSatish Balay #define snessettype_                     snessettype
628e27ec22SSatish Balay #define snesappendoptionsprefix_         snesappendoptionsprefix
638e27ec22SSatish Balay #define snessetoptionsprefix_            snessetoptionsprefix
644619e776SBarry Smith #define snesmonitorlgresidualnorm_       snesmonitorlgresidualnorm
65a6570f20SBarry Smith #define snesmonitordefault_              snesmonitordefault
66a6570f20SBarry Smith #define snesmonitorsolution_             snesmonitorsolution
67a6570f20SBarry Smith #define snesmonitorsolutionupdate_       snesmonitorsolutionupdate
68a6570f20SBarry Smith #define snesmonitorset_                  snesmonitorset
69c9368356SGlenn Hammond #define snesnewtontrsetprecheck_         snesnewtontrsetprecheck
703b42469aSBarry Smith #define snesnewtontrsetpostcheck_        snesnewtontrsetpostcheck
71fe2efc57SMark #define snesviewfromoptions_             snesviewfromoptions
728e27ec22SSatish Balay #endif
738e27ec22SSatish Balay 
74f6291634SJed Brown static struct {
75f6291634SJed Brown   PetscFortranCallbackId function;
76f6291634SJed Brown   PetscFortranCallbackId test;
77f6291634SJed Brown   PetscFortranCallbackId destroy;
78f6291634SJed Brown   PetscFortranCallbackId jacobian;
79f6291634SJed Brown   PetscFortranCallbackId monitor;
80f6291634SJed Brown   PetscFortranCallbackId mondestroy;
81be95d8f1SBarry Smith   PetscFortranCallbackId ngs;
82dfef22ccSBarry Smith   PetscFortranCallbackId update;
83c9368356SGlenn Hammond   PetscFortranCallbackId trprecheck;
847cb011f5SBarry Smith   PetscFortranCallbackId trpostcheck;
8589e00c7dSSatish Balay #if defined(PETSC_HAVE_F90_2PTR_ARG)
8689e00c7dSSatish Balay   PetscFortranCallbackId function_pgiptr;
87c9368356SGlenn Hammond   PetscFortranCallbackId trprecheck_pgiptr;
883c2ee7eaSBarry Smith   PetscFortranCallbackId trpostcheck_pgiptr;
8989e00c7dSSatish Balay #endif
90f6291634SJed Brown } _cb;
9190b77ac2SPeter Brune 
92c9368356SGlenn Hammond static PetscErrorCode ourtrprecheckfunction(SNES snes,Vec x,Vec y,PetscBool *changed_y,void *ctx)
93c9368356SGlenn Hammond {
94c9368356SGlenn Hammond #if defined(PETSC_HAVE_F90_2PTR_ARG)
95c9368356SGlenn Hammond   void* ptr;
96c9368356SGlenn Hammond   PetscObjectGetFortranCallback((PetscObject)snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.trprecheck_pgiptr,NULL,&ptr);
97c9368356SGlenn Hammond #endif
98c9368356SGlenn 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)));
99c9368356SGlenn Hammond }
100c9368356SGlenn Hammond 
10119caf8f3SSatish Balay PETSC_EXTERN void snesnewtontrsetprecheck_(SNES *snes, void (*func)(SNES,Vec,Vec,PetscBool*,void*),void *ctx,PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(ptr))
102c9368356SGlenn Hammond {
103c9368356SGlenn Hammond   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.trprecheck,(PetscVoidFunction)func,ctx);if (*ierr) return;
104c9368356SGlenn Hammond #if defined(PETSC_HAVE_F90_2PTR_ARG)
105c9368356SGlenn Hammond   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.trprecheck_pgiptr,NULL,ptr);if (*ierr) return;
106c9368356SGlenn Hammond #endif
107c9368356SGlenn Hammond   SNESNewtonTRSetPreCheck(*snes,ourtrprecheckfunction,NULL);
108c9368356SGlenn Hammond }
109c9368356SGlenn Hammond 
110c9368356SGlenn Hammond 
111c9368356SGlenn Hammond static PetscErrorCode ourtrpostcheckfunction(SNES snes,Vec x,Vec y,Vec w,PetscBool *changed_y,PetscBool *changed_w,void *ctx)
1127cb011f5SBarry Smith {
1137cb011f5SBarry Smith #if defined(PETSC_HAVE_F90_2PTR_ARG)
1147cb011f5SBarry Smith   void* ptr;
1153c2ee7eaSBarry Smith   PetscObjectGetFortranCallback((PetscObject)snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.trpostcheck_pgiptr,NULL,&ptr);
1167cb011f5SBarry Smith #endif
117c9368356SGlenn 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)));
1187cb011f5SBarry Smith }
1197cb011f5SBarry Smith 
12019caf8f3SSatish 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))
1217cb011f5SBarry Smith {
1227cb011f5SBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.trpostcheck,(PetscVoidFunction)func,ctx);if (*ierr) return;
1237cb011f5SBarry Smith #if defined(PETSC_HAVE_F90_2PTR_ARG)
1243c2ee7eaSBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.trpostcheck_pgiptr,NULL,ptr);if (*ierr) return;
1257cb011f5SBarry Smith #endif
1267cb011f5SBarry Smith   SNESNewtonTRSetPostCheck(*snes,ourtrpostcheckfunction,NULL);
1277cb011f5SBarry Smith }
1287cb011f5SBarry Smith 
1298e27ec22SSatish Balay static PetscErrorCode oursnesfunction(SNES snes,Vec x,Vec f,void *ctx)
1308e27ec22SSatish Balay {
13189e00c7dSSatish Balay #if defined(PETSC_HAVE_F90_2PTR_ARG)
13289e00c7dSSatish Balay   void* ptr;
13389e00c7dSSatish Balay   PetscObjectGetFortranCallback((PetscObject)snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.function_pgiptr,NULL,&ptr);
13489e00c7dSSatish Balay #endif
13589e00c7dSSatish 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)));
1368e27ec22SSatish Balay }
137b8ebb45fSBarry Smith 
13806ee9f85SBarry Smith static PetscErrorCode oursnestest(SNES snes,PetscInt it,PetscReal a,PetscReal d,PetscReal c,SNESConvergedReason *reason,void *ctx)
1398e27ec22SSatish Balay {
140f6291634SJed Brown   PetscObjectUseFortranCallback(snes,_cb.test,(SNES*,PetscInt*,PetscReal*,PetscReal*,PetscReal*,SNESConvergedReason*,void*,PetscErrorCode*),(&snes,&it,&a,&d,&c,reason,_ctx,&ierr));
1417f7931b9SBarry Smith }
1427f7931b9SBarry Smith 
1437f7931b9SBarry Smith static PetscErrorCode ourdestroy(void *ctx)
1447f7931b9SBarry Smith {
145f6291634SJed Brown   PetscObjectUseFortranCallback(ctx,_cb.destroy,(void*,PetscErrorCode*),(_ctx,&ierr));
1468e27ec22SSatish Balay }
1478e27ec22SSatish Balay 
148d1e9a80fSBarry Smith static PetscErrorCode oursnesjacobian(SNES snes,Vec x,Mat m,Mat p,void *ctx)
1498e27ec22SSatish Balay {
150d1e9a80fSBarry Smith   PetscObjectUseFortranCallback(snes,_cb.jacobian,(SNES*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),(&snes,&x,&m,&p,_ctx,&ierr));
1518e27ec22SSatish Balay }
152f6291634SJed Brown 
153dfef22ccSBarry Smith static PetscErrorCode oursnesupdate(SNES snes,PetscInt i)
154dfef22ccSBarry Smith {
155dfef22ccSBarry Smith   PetscObjectUseFortranCallback(snes,_cb.update,(SNES*,PetscInt *,PetscErrorCode*),(&snes,&i,&ierr));
156dfef22ccSBarry Smith }
157be95d8f1SBarry Smith static PetscErrorCode oursnesngs(SNES snes,Vec x,Vec b,void *ctx)
15890b77ac2SPeter Brune {
159be95d8f1SBarry Smith   PetscObjectUseFortranCallback(snes,_cb.ngs,(SNES*,Vec*,Vec*,void*,PetscErrorCode*),(&snes,&x,&b,_ctx,&ierr));
16090b77ac2SPeter Brune }
1618e27ec22SSatish Balay static PetscErrorCode oursnesmonitor(SNES snes,PetscInt i,PetscReal d,void *ctx)
1628e27ec22SSatish Balay {
163f6291634SJed Brown   PetscObjectUseFortranCallback(snes,_cb.monitor,(SNES*,PetscInt*,PetscReal*,void*,PetscErrorCode*),(&snes,&i,&d,_ctx,&ierr));
1648e27ec22SSatish Balay }
165c2efdce3SBarry Smith static PetscErrorCode ourmondestroy(void **ctx)
1668e27ec22SSatish Balay {
167f6291634SJed Brown   SNES snes = (SNES)*ctx;
168f6291634SJed Brown   PetscObjectUseFortranCallback(snes,_cb.mondestroy,(void*,PetscErrorCode*),(_ctx,&ierr));
1698e27ec22SSatish Balay }
1708e27ec22SSatish Balay 
1718e27ec22SSatish Balay /* ---------------------------------------------------------*/
1728e27ec22SSatish Balay /*
1738d359177SBarry Smith      snescomputejacobiandefault() and snescomputejacobiandefaultcolor()
1748e27ec22SSatish Balay   These can be used directly from Fortran but are mostly so that
1758e27ec22SSatish Balay   Fortran SNESSetJacobian() will properly handle the defaults being passed in.
1768e27ec22SSatish Balay */
177d1e9a80fSBarry Smith PETSC_EXTERN void matmffdcomputejacobian_(SNES *snes,Vec *x,Mat *m,Mat *p,void *ctx,PetscErrorCode *ierr)
178df66969eSBarry Smith {
179d1e9a80fSBarry Smith   *ierr = MatMFFDComputeJacobian(*snes,*x,*m,*p,ctx);
180df66969eSBarry Smith }
181d1e9a80fSBarry Smith PETSC_EXTERN void snescomputejacobiandefault_(SNES *snes,Vec *x,Mat *m,Mat *p,void *ctx,PetscErrorCode *ierr)
1828e27ec22SSatish Balay {
183d1e9a80fSBarry Smith   *ierr = SNESComputeJacobianDefault(*snes,*x,*m,*p,ctx);
1848e27ec22SSatish Balay }
185d1e9a80fSBarry Smith PETSC_EXTERN void  snescomputejacobiandefaultcolor_(SNES *snes,Vec *x,Mat *m,Mat *p,void *ctx,PetscErrorCode *ierr)
1868e27ec22SSatish Balay {
187d1e9a80fSBarry Smith   *ierr = SNESComputeJacobianDefaultColor(*snes,*x,*m,*p,*(MatFDColoring*)ctx);
1888e27ec22SSatish Balay }
1898e27ec22SSatish Balay 
19019caf8f3SSatish Balay PETSC_EXTERN void snessetjacobian_(SNES *snes,Mat *A,Mat *B,
19119caf8f3SSatish Balay                                     void (*func)(SNES*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),
192f5af7f23SKarl Rupp                                     void *ctx,PetscErrorCode *ierr)
1938e27ec22SSatish Balay {
194f5b6597dSBarry Smith   CHKFORTRANNULLFUNCTION(func);
1958d359177SBarry Smith   if ((PetscVoidFunction)func == (PetscVoidFunction)snescomputejacobiandefault_) {
1968d359177SBarry Smith     *ierr = SNESSetJacobian(*snes,*A,*B,SNESComputeJacobianDefault,ctx);
1978d359177SBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snescomputejacobiandefaultcolor_) {
198e025ade3SBarry Smith     if (!ctx) {
199e025ade3SBarry Smith       *ierr = PETSC_ERR_ARG_NULL;
200e025ade3SBarry Smith       return;
201e025ade3SBarry Smith     }
2028d359177SBarry Smith     *ierr = SNESSetJacobian(*snes,*A,*B,SNESComputeJacobianDefaultColor,*(MatFDColoring*)ctx);
203df66969eSBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)matmffdcomputejacobian_) {
204df66969eSBarry Smith     *ierr = SNESSetJacobian(*snes,*A,*B,MatMFFDComputeJacobian,ctx);
2058e27ec22SSatish Balay   } else {
206f6291634SJed Brown     *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.jacobian,(PetscVoidFunction)func,ctx);
2070298fd71SBarry Smith     if (!*ierr) *ierr = SNESSetJacobian(*snes,*A,*B,oursnesjacobian,NULL);
2088e27ec22SSatish Balay   }
2098e27ec22SSatish Balay }
21017a42bb7SSatish Balay PETSC_EXTERN void snessetjacobian1_(SNES *snes,Mat *A,Mat *B,
21117a42bb7SSatish Balay                                     void (*func)(SNES*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),
21217a42bb7SSatish Balay                                     void *ctx,PetscErrorCode *ierr)
21317a42bb7SSatish Balay {
21417a42bb7SSatish Balay   snessetjacobian_(snes,A,B,func,ctx,ierr);
21517a42bb7SSatish Balay }
21617a42bb7SSatish Balay PETSC_EXTERN void snessetjacobian2_(SNES *snes,Mat *A,Mat *B,
21717a42bb7SSatish Balay                                     void (*func)(SNES*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),
21817a42bb7SSatish Balay                                     void *ctx,PetscErrorCode *ierr)
21917a42bb7SSatish Balay {
22017a42bb7SSatish Balay   snessetjacobian_(snes,A,B,func,ctx,ierr);
22117a42bb7SSatish Balay }
2228e27ec22SSatish Balay /* -------------------------------------------------------------*/
223*df2570feSBarry Smith static PetscErrorCode oursnespicardfunction(SNES snes,Vec x,Vec f,void *ctx)
224*df2570feSBarry Smith {
225*df2570feSBarry Smith #if defined(PETSC_HAVE_F90_2PTR_ARG)
226*df2570feSBarry Smith   void* ptr;
227*df2570feSBarry Smith   PetscObjectGetFortranCallback((PetscObject)snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.function_pgiptr,NULL,&ptr);
228*df2570feSBarry Smith #endif
229*df2570feSBarry 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)));
230*df2570feSBarry Smith }
231*df2570feSBarry Smith 
232*df2570feSBarry Smith static PetscErrorCode oursnespicardjacobian(SNES snes,Vec x,Mat m,Mat p,void *ctx)
233*df2570feSBarry Smith {
234*df2570feSBarry Smith   PetscObjectUseFortranCallback(snes,_cb.jacobian,(SNES*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),(&snes,&x,&m,&p,_ctx,&ierr));
235*df2570feSBarry Smith }
236*df2570feSBarry Smith 
237*df2570feSBarry Smith PETSC_EXTERN void snessetpicard_(SNES *snes,Vec *r,void (*func)(SNES*,Vec*,Vec *,void*,PetscErrorCode*),Mat *A,Mat *B,
238*df2570feSBarry Smith                                  PetscErrorCode (*J)(SNES,Vec,Mat,Mat,void*),void *ctx,PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(ptr))
239*df2570feSBarry Smith {
240*df2570feSBarry Smith     *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.function,(PetscVoidFunction)func,ctx);
241*df2570feSBarry Smith #if defined(PETSC_HAVE_F90_2PTR_ARG)
242*df2570feSBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.function_pgiptr,NULL,ptr);if (*ierr) return;
243*df2570feSBarry Smith #endif
244*df2570feSBarry Smith     *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.jacobian,(PetscVoidFunction)J,ctx);
245*df2570feSBarry Smith     if (!*ierr) *ierr = SNESSetPicard(*snes,*r,oursnespicardfunction,*A,*B,oursnespicardjacobian,NULL);
246*df2570feSBarry Smith }
247*df2570feSBarry Smith /* -------------------------------------------------------------*/
2488e27ec22SSatish Balay 
24919caf8f3SSatish Balay PETSC_EXTERN void snesgetoptionsprefix_(SNES *snes,char* prefix,PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len)
2508e27ec22SSatish Balay {
2518e27ec22SSatish Balay   const char *tname;
2528e27ec22SSatish Balay 
2538e27ec22SSatish Balay   *ierr = SNESGetOptionsPrefix(*snes,&tname);
2548e27ec22SSatish Balay   *ierr = PetscStrncpy(prefix,tname,len);if (*ierr) return;
255d6a8cea5SBarry Smith   FIXRETURNCHAR(PETSC_TRUE,prefix,len);
2568e27ec22SSatish Balay }
2578e27ec22SSatish Balay 
25819caf8f3SSatish Balay PETSC_EXTERN void snesgettype_(SNES *snes,char* name, PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len)
2598e27ec22SSatish Balay {
2608e27ec22SSatish Balay   const char *tname;
2618e27ec22SSatish Balay 
2628e27ec22SSatish Balay   *ierr = SNESGetType(*snes,&tname);
2638e27ec22SSatish Balay   *ierr = PetscStrncpy(name,tname,len);if (*ierr) return;
2647c363081SBarry Smith   FIXRETURNCHAR(PETSC_TRUE,name,len);
2658e27ec22SSatish Balay }
266e3da1266SHong Zhang 
2678e27ec22SSatish Balay /* ---------------------------------------------------------*/
2688e27ec22SSatish Balay 
2698e27ec22SSatish Balay /*
2708e27ec22SSatish Balay    These are not usually called from Fortran but allow Fortran users
2718e27ec22SSatish Balay    to transparently set these monitors from .F code
2728e27ec22SSatish Balay */
2738e27ec22SSatish Balay 
27419caf8f3SSatish 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))
2758e27ec22SSatish Balay {
276aecf964fSBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.function,(PetscVoidFunction)func,ctx);if (*ierr) return;
27789e00c7dSSatish Balay #if defined(PETSC_HAVE_F90_2PTR_ARG)
278aecf964fSBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.function_pgiptr,NULL,ptr);if (*ierr) return;
27989e00c7dSSatish Balay #endif
280aecf964fSBarry Smith   *ierr = SNESSetFunction(*snes,*r,oursnesfunction,NULL);
2818e27ec22SSatish Balay }
282c79ef259SPeter Brune 
283c79ef259SPeter Brune 
28419caf8f3SSatish Balay PETSC_EXTERN void snessetngs_(SNES *snes,void (*func)(SNES*,Vec*,Vec*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr)
285c79ef259SPeter Brune {
286aecf964fSBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.ngs,(PetscVoidFunction)func,ctx);if (*ierr) return;
287aecf964fSBarry Smith   *ierr = SNESSetNGS(*snes,oursnesngs,NULL);
288c79ef259SPeter Brune }
28919caf8f3SSatish Balay PETSC_EXTERN void snessetupdate_(SNES *snes,void (*func)(SNES*,PetscInt*,PetscErrorCode*),PetscErrorCode *ierr)
290dfef22ccSBarry Smith {
291aecf964fSBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.update,(PetscVoidFunction)func,NULL);if (*ierr) return;
292aecf964fSBarry Smith   *ierr = SNESSetUpdate(*snes,oursnesupdate);
293dfef22ccSBarry Smith }
2948e27ec22SSatish Balay /* ---------------------------------------------------------*/
2958e27ec22SSatish Balay 
2968e27ec22SSatish Balay /* the func argument is ignored */
29719caf8f3SSatish Balay PETSC_EXTERN void snesgetfunction_(SNES *snes,Vec *r,void (*func)(SNES,Vec,Vec,void*),void **ctx,PetscErrorCode *ierr)
2988e27ec22SSatish Balay {
2998e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(r);
3000298fd71SBarry Smith   *ierr = SNESGetFunction(*snes,r,NULL,NULL); if (*ierr) return;
301146935d7SSatish Balay   if ((PetscVoidFunction)func == (PetscVoidFunction)PETSC_NULL_FUNCTION_Fortran) return;
3020298fd71SBarry Smith   *ierr = PetscObjectGetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.function,NULL,ctx);
3038e27ec22SSatish Balay }
304c79ef259SPeter Brune 
30519caf8f3SSatish Balay PETSC_EXTERN void snesgetngs_(SNES *snes,void *func,void **ctx,PetscErrorCode *ierr)
306c79ef259SPeter Brune {
307be95d8f1SBarry Smith   *ierr = PetscObjectGetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.ngs,NULL,ctx);
308c79ef259SPeter Brune }
309c79ef259SPeter Brune 
3108e27ec22SSatish Balay /*----------------------------------------------------------------------*/
3118e27ec22SSatish Balay 
31269c1e2abSSatish Balay PETSC_EXTERN void snesconvergeddefault_(SNES *snes,PetscInt *it,PetscReal *a,PetscReal *b,PetscReal *c,SNESConvergedReason *r, void *ct,PetscErrorCode *ierr)
3133f149594SLisandro Dalcin {
3148d359177SBarry Smith   *ierr = SNESConvergedDefault(*snes,*it,*a,*b,*c,r,ct);
3153f149594SLisandro Dalcin }
3163f149594SLisandro Dalcin 
317e07f7f94SSatish Balay PETSC_EXTERN void snesconvergedskip_(SNES *snes,PetscInt *it,PetscReal *a,PetscReal *b,PetscReal *c,SNESConvergedReason *r,void *ct,PetscErrorCode *ierr)
3183f149594SLisandro Dalcin {
319e2a6519dSDmitry Karpeev   *ierr = SNESConvergedSkip(*snes,*it,*a,*b,*c,r,ct);
3203f149594SLisandro Dalcin }
3213f149594SLisandro Dalcin 
32219caf8f3SSatish Balay PETSC_EXTERN void snessetconvergencetest_(SNES *snes,void (*func)(SNES*,PetscInt*,PetscReal*,PetscReal*,PetscReal*,SNESConvergedReason*,void*,PetscErrorCode*), void *cctx,void (*destroy)(void*),PetscErrorCode *ierr)
3238e27ec22SSatish Balay {
3243f22127dSBarry Smith   CHKFORTRANNULLFUNCTION(destroy);
3253f149594SLisandro Dalcin 
3268d359177SBarry Smith   if ((PetscVoidFunction)func == (PetscVoidFunction)snesconvergeddefault_) {
3278d359177SBarry Smith     *ierr = SNESSetConvergenceTest(*snes,SNESConvergedDefault,0,0);
328e07f7f94SSatish Balay   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesconvergedskip_) {
329e2a6519dSDmitry Karpeev     *ierr = SNESSetConvergenceTest(*snes,SNESConvergedSkip,0,0);
3308e27ec22SSatish Balay   } else {
331aecf964fSBarry Smith     *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.test,(PetscVoidFunction)func,cctx);if (*ierr) return;
332aecf964fSBarry Smith     *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.destroy,(PetscVoidFunction)destroy,cctx);if (*ierr) return;
333aecf964fSBarry Smith     *ierr = SNESSetConvergenceTest(*snes,oursnestest,*snes,ourdestroy);
3348e27ec22SSatish Balay   }
3358e27ec22SSatish Balay }
3368e27ec22SSatish Balay /*----------------------------------------------------------------------*/
3378e27ec22SSatish Balay 
33819caf8f3SSatish Balay PETSC_EXTERN void snesview_(SNES *snes,PetscViewer *viewer, PetscErrorCode *ierr)
3398e27ec22SSatish Balay {
3408e27ec22SSatish Balay   PetscViewer v;
3418e27ec22SSatish Balay   PetscPatchDefaultViewers_Fortran(viewer,v);
3428e27ec22SSatish Balay   *ierr = SNESView(*snes,v);
3438e27ec22SSatish Balay }
3448e27ec22SSatish Balay 
3458e27ec22SSatish Balay /*  func is currently ignored from Fortran */
34619caf8f3SSatish Balay PETSC_EXTERN void snesgetjacobian_(SNES *snes,Mat *A,Mat *B,int *func,void **ctx,PetscErrorCode *ierr)
3478e27ec22SSatish Balay {
3488e27ec22SSatish Balay   CHKFORTRANNULLINTEGER(ctx);
3498e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(A);
3508e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(B);
3510298fd71SBarry Smith   *ierr = SNESGetJacobian(*snes,A,B,0,NULL); if (*ierr) return;
3520298fd71SBarry Smith   *ierr = PetscObjectGetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.jacobian,NULL,ctx);
353f2e0d3f1SJed Brown 
3548e27ec22SSatish Balay }
3558e27ec22SSatish Balay 
35619caf8f3SSatish Balay PETSC_EXTERN void snesgetconvergencehistory_(SNES *snes,PetscInt *na,PetscErrorCode *ierr)
3578e27ec22SSatish Balay {
3580298fd71SBarry Smith   *ierr = SNESGetConvergenceHistory(*snes,NULL,NULL,na);
3598e27ec22SSatish Balay }
3608e27ec22SSatish Balay 
36119caf8f3SSatish Balay PETSC_EXTERN void snessettype_(SNES *snes,char* type,PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len)
3628e27ec22SSatish Balay {
3638e27ec22SSatish Balay   char *t;
3648e27ec22SSatish Balay 
3658e27ec22SSatish Balay   FIXCHAR(type,len,t);
366d49bb8f9SBarry Smith   *ierr = SNESSetType(*snes,t);if (*ierr) return;
3678e27ec22SSatish Balay   FREECHAR(type,t);
3688e27ec22SSatish Balay }
3698e27ec22SSatish Balay 
37019caf8f3SSatish Balay PETSC_EXTERN void snesappendoptionsprefix_(SNES *snes,char* prefix,PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len)
3718e27ec22SSatish Balay {
3728e27ec22SSatish Balay   char *t;
3738e27ec22SSatish Balay 
3748e27ec22SSatish Balay   FIXCHAR(prefix,len,t);
375d49bb8f9SBarry Smith   *ierr = SNESAppendOptionsPrefix(*snes,t);if (*ierr) return;
3768e27ec22SSatish Balay   FREECHAR(prefix,t);
3778e27ec22SSatish Balay }
3788e27ec22SSatish Balay 
37919caf8f3SSatish Balay PETSC_EXTERN void snessetoptionsprefix_(SNES *snes,char* prefix,PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len)
3808e27ec22SSatish Balay {
3818e27ec22SSatish Balay   char *t;
3828e27ec22SSatish Balay 
3838e27ec22SSatish Balay   FIXCHAR(prefix,len,t);
384d49bb8f9SBarry Smith   *ierr = SNESSetOptionsPrefix(*snes,t);if (*ierr) return;
3858e27ec22SSatish Balay   FREECHAR(prefix,t);
3868e27ec22SSatish Balay }
3878e27ec22SSatish Balay 
3888e27ec22SSatish Balay /*----------------------------------------------------------------------*/
3898e27ec22SSatish Balay 
3909611d799SBarry Smith PETSC_EXTERN void snesmonitorlgresidualnorm_(SNES *snes,PetscInt *its,PetscReal *fgnorm,PetscObject *dummy,PetscErrorCode *ierr)
3918e27ec22SSatish Balay {
3924619e776SBarry Smith   *ierr = SNESMonitorLGResidualNorm(*snes,*its,*fgnorm,dummy);
3938e27ec22SSatish Balay }
3948e27ec22SSatish Balay 
39552f0073cSBarry Smith PETSC_EXTERN void snesmonitordefault_(SNES *snes,PetscInt *its,PetscReal *fgnorm,PetscViewerAndFormat **dummy,PetscErrorCode *ierr)
3968e27ec22SSatish Balay {
397410efd14SBarry Smith   *ierr = SNESMonitorDefault(*snes,*its,*fgnorm,*dummy);
3988e27ec22SSatish Balay }
3998e27ec22SSatish Balay 
40052f0073cSBarry Smith PETSC_EXTERN void snesmonitorsolution_(SNES *snes,PetscInt *its,PetscReal *fgnorm,PetscViewerAndFormat **dummy,PetscErrorCode *ierr)
4018e27ec22SSatish Balay {
402410efd14SBarry Smith   *ierr = SNESMonitorSolution(*snes,*its,*fgnorm,*dummy);
4038e27ec22SSatish Balay }
4048e27ec22SSatish Balay 
40552f0073cSBarry Smith PETSC_EXTERN void snesmonitorsolutionupdate_(SNES *snes,PetscInt *its,PetscReal *fgnorm,PetscViewerAndFormat **dummy,PetscErrorCode *ierr)
4068e27ec22SSatish Balay {
407410efd14SBarry Smith   *ierr = SNESMonitorSolutionUpdate(*snes,*its,*fgnorm,*dummy);
4088e27ec22SSatish Balay }
4098e27ec22SSatish Balay 
4108e27ec22SSatish Balay 
41119caf8f3SSatish Balay PETSC_EXTERN void snesmonitorset_(SNES *snes,void (*func)(SNES*,PetscInt*,PetscReal*,void*,PetscErrorCode*),void *mctx,void (*mondestroy)(void*,PetscErrorCode*),PetscErrorCode *ierr)
4128e27ec22SSatish Balay {
413aecf964fSBarry Smith   CHKFORTRANNULLFUNCTION(mondestroy);
414a6570f20SBarry Smith   if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitordefault_) {
4151cb03803SBarry Smith     *ierr = SNESMonitorSet(*snes,(PetscErrorCode (*)(SNES,PetscInt,PetscReal,void*))SNESMonitorDefault,*(PetscViewerAndFormat**)mctx,(PetscErrorCode (*)(void **))PetscViewerAndFormatDestroy);
416a6570f20SBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorsolution_) {
4171cb03803SBarry Smith     *ierr = SNESMonitorSet(*snes,(PetscErrorCode (*)(SNES,PetscInt,PetscReal,void*))SNESMonitorSolution,*(PetscViewerAndFormat**)mctx,(PetscErrorCode (*)(void **))PetscViewerAndFormatDestroy);
418a6570f20SBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorsolutionupdate_) {
4191cb03803SBarry Smith     *ierr = SNESMonitorSet(*snes,(PetscErrorCode (*)(SNES,PetscInt,PetscReal,void*))SNESMonitorSolutionUpdate,*(PetscViewerAndFormat**)mctx,(PetscErrorCode (*)(void **))PetscViewerAndFormatDestroy);
4204619e776SBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorlgresidualnorm_) {
4213e7ff0edSBarry Smith     *ierr = SNESMonitorSet(*snes,(PetscErrorCode (*)(SNES,PetscInt,PetscReal,void*))SNESMonitorLGResidualNorm,0,0);
4228e27ec22SSatish Balay   } else {
423aecf964fSBarry Smith     *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.monitor,(PetscVoidFunction)func,mctx);if (*ierr) return;
424aecf964fSBarry Smith     *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.mondestroy,(PetscVoidFunction)mondestroy,mctx);if (*ierr) return;
425aecf964fSBarry Smith     *ierr = SNESMonitorSet(*snes,oursnesmonitor,*snes,ourmondestroy);
4268e27ec22SSatish Balay   }
4278e27ec22SSatish Balay }
4288e27ec22SSatish Balay 
42919caf8f3SSatish Balay PETSC_EXTERN void snesviewfromoptions_(SNES *ao,PetscObject obj,char* type,PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len)
430fe2efc57SMark {
431fe2efc57SMark   char *t;
432fe2efc57SMark 
433fe2efc57SMark   FIXCHAR(type,len,t);
434fe2efc57SMark   *ierr = SNESViewFromOptions(*ao,obj,t);if (*ierr) return;
435fe2efc57SMark   FREECHAR(type,t);
436fe2efc57SMark }
437