xref: /petsc/src/snes/interface/ftn-custom/zsnesf.c (revision 41ba4c6c04ec6b90096e1e0d2d3de306864f2fe5)
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)
791f3e32bSBarry 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
34a6570f20SBarry Smith #define snesmonitorsolutionupdate_       SNESMONITORSOLUTIONUPDATE
35a6570f20SBarry Smith #define snesmonitorset_                  SNESMONITORSET
36c9368356SGlenn Hammond #define snesnewtontrsetprecheck_         SNESNEWTONTRSETPRECHECK
373b42469aSBarry Smith #define snesnewtontrsetpostcheck_        SNESNEWTONTRSETPOSTCHECK
38*41ba4c6cSHeeho Park #define snesnewtontrdcsetprecheck_       SNESNEWTONTRDCSETPRECHECK
39*41ba4c6cSHeeho Park #define snesnewtontrdcsetpostcheck_      SNESNEWTONTRDCSETPOSTCHECK
40fe2efc57SMark #define snesviewfromoptions_             SNESVIEWFROMOPTIONS
41c4421ceaSFande Kong #define snesgetconvergedreasonstring_    SNESGETCONVERGEDREASONSTRING
424e2a09fcSBarry Smith #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
4391f3e32bSBarry Smith #define snesconvergedreasonview_         snesconvergedreasonview
44df2570feSBarry Smith #define snessetpicard_                   snessetpicard
45df66969eSBarry Smith #define matmffdcomputejacobian_          matmffdcomputejacobian
466ce558aeSBarry Smith #define snessolve_                       snessolve
478d359177SBarry Smith #define snescomputejacobiandefault_      snescomputejacobiandefault
488d359177SBarry Smith #define snescomputejacobiandefaultcolor_ snescomputejacobiandefaultcolor
498e27ec22SSatish Balay #define snessetjacobian_                 snessetjacobian
5017a42bb7SSatish Balay #define snessetjacobian1_                snessetjacobian1
5117a42bb7SSatish Balay #define snessetjacobian2_                snessetjacobian2
528e27ec22SSatish Balay #define snesgetoptionsprefix_            snesgetoptionsprefix
538e27ec22SSatish Balay #define snesgettype_                     snesgettype
548e27ec22SSatish Balay #define snessetfunction_                 snessetfunction
55be95d8f1SBarry Smith #define snessetngs_                      snessetngs
56dfef22ccSBarry Smith #define snessetupdate_                   snessetupdate
578e27ec22SSatish Balay #define snesgetfunction_                 snesgetfunction
58be95d8f1SBarry Smith #define snesgetngs_                      snesgetngs
598e27ec22SSatish Balay #define snessetconvergencetest_          snessetconvergencetest
608d359177SBarry Smith #define snesconvergeddefault_            snesconvergeddefault
61e07f7f94SSatish Balay #define snesconvergedskip_               snesconvergedskip
628e27ec22SSatish Balay #define snesview_                        snesview
638e27ec22SSatish Balay #define snesgetjacobian_                 snesgetjacobian
648e27ec22SSatish Balay #define snesgetconvergencehistory_       snesgetconvergencehistory
658e27ec22SSatish Balay #define snessettype_                     snessettype
668e27ec22SSatish Balay #define snesappendoptionsprefix_         snesappendoptionsprefix
678e27ec22SSatish Balay #define snessetoptionsprefix_            snessetoptionsprefix
68a6570f20SBarry Smith #define snesmonitordefault_              snesmonitordefault
69a6570f20SBarry Smith #define snesmonitorsolution_             snesmonitorsolution
70a6570f20SBarry Smith #define snesmonitorsolutionupdate_       snesmonitorsolutionupdate
71a6570f20SBarry Smith #define snesmonitorset_                  snesmonitorset
72c9368356SGlenn Hammond #define snesnewtontrsetprecheck_         snesnewtontrsetprecheck
733b42469aSBarry Smith #define snesnewtontrsetpostcheck_        snesnewtontrsetpostcheck
74*41ba4c6cSHeeho Park #define snesnewtontrdcsetprecheck_       snesnewtontrdcsetprecheck
75*41ba4c6cSHeeho Park #define snesnewtontrdcsetpostcheck_      snesnewtontrdcsetpostcheck
76fe2efc57SMark #define snesviewfromoptions_             snesviewfromoptions
77c4421ceaSFande Kong #define snesgetconvergedreasonstring_    snesgetconvergedreasonstring
788e27ec22SSatish Balay #endif
798e27ec22SSatish Balay 
80f6291634SJed Brown static struct {
81f6291634SJed Brown   PetscFortranCallbackId function;
82f6291634SJed Brown   PetscFortranCallbackId test;
83f6291634SJed Brown   PetscFortranCallbackId destroy;
84f6291634SJed Brown   PetscFortranCallbackId jacobian;
85f6291634SJed Brown   PetscFortranCallbackId monitor;
86f6291634SJed Brown   PetscFortranCallbackId mondestroy;
87be95d8f1SBarry Smith   PetscFortranCallbackId ngs;
88dfef22ccSBarry Smith   PetscFortranCallbackId update;
89c9368356SGlenn Hammond   PetscFortranCallbackId trprecheck;
907cb011f5SBarry Smith   PetscFortranCallbackId trpostcheck;
9189e00c7dSSatish Balay #if defined(PETSC_HAVE_F90_2PTR_ARG)
9289e00c7dSSatish Balay   PetscFortranCallbackId function_pgiptr;
93c9368356SGlenn Hammond   PetscFortranCallbackId trprecheck_pgiptr;
943c2ee7eaSBarry Smith   PetscFortranCallbackId trpostcheck_pgiptr;
9589e00c7dSSatish Balay #endif
96f6291634SJed Brown } _cb;
9790b77ac2SPeter Brune 
98c9368356SGlenn Hammond static PetscErrorCode ourtrprecheckfunction(SNES snes,Vec x,Vec y,PetscBool *changed_y,void *ctx)
99c9368356SGlenn Hammond {
100c9368356SGlenn Hammond #if defined(PETSC_HAVE_F90_2PTR_ARG)
101c9368356SGlenn Hammond   void* ptr;
102c9368356SGlenn Hammond   PetscObjectGetFortranCallback((PetscObject)snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.trprecheck_pgiptr,NULL,&ptr);
103c9368356SGlenn Hammond #endif
104c9368356SGlenn 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)));
105c9368356SGlenn Hammond }
106c9368356SGlenn Hammond 
10719caf8f3SSatish Balay PETSC_EXTERN void snesnewtontrsetprecheck_(SNES *snes, void (*func)(SNES,Vec,Vec,PetscBool*,void*),void *ctx,PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(ptr))
108c9368356SGlenn Hammond {
109c9368356SGlenn Hammond   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.trprecheck,(PetscVoidFunction)func,ctx);if (*ierr) return;
110c9368356SGlenn Hammond #if defined(PETSC_HAVE_F90_2PTR_ARG)
111c9368356SGlenn Hammond   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.trprecheck_pgiptr,NULL,ptr);if (*ierr) return;
112c9368356SGlenn Hammond #endif
113c9368356SGlenn Hammond   SNESNewtonTRSetPreCheck(*snes,ourtrprecheckfunction,NULL);
114c9368356SGlenn Hammond }
115c9368356SGlenn Hammond 
116*41ba4c6cSHeeho Park PETSC_EXTERN void snesnewtontrdcsetprecheck_(SNES *snes, void (*func)(SNES,Vec,Vec,PetscBool*,void*),void *ctx,PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(ptr))
117*41ba4c6cSHeeho Park {
118*41ba4c6cSHeeho Park   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.trprecheck,(PetscVoidFunction)func,ctx);if (*ierr) return;
119*41ba4c6cSHeeho Park #if defined(PETSC_HAVE_F90_2PTR_ARG)
120*41ba4c6cSHeeho Park   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.trprecheck_pgiptr,NULL,ptr);if (*ierr) return;
121*41ba4c6cSHeeho Park #endif
122*41ba4c6cSHeeho Park   SNESNewtonTRDCSetPreCheck(*snes,ourtrprecheckfunction,NULL);
123*41ba4c6cSHeeho Park }
124*41ba4c6cSHeeho Park 
125c9368356SGlenn Hammond static PetscErrorCode ourtrpostcheckfunction(SNES snes,Vec x,Vec y,Vec w,PetscBool *changed_y,PetscBool *changed_w,void *ctx)
1267cb011f5SBarry Smith {
1277cb011f5SBarry Smith #if defined(PETSC_HAVE_F90_2PTR_ARG)
1287cb011f5SBarry Smith   void* ptr;
1293c2ee7eaSBarry Smith   PetscObjectGetFortranCallback((PetscObject)snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.trpostcheck_pgiptr,NULL,&ptr);
1307cb011f5SBarry Smith #endif
131c9368356SGlenn 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)));
1327cb011f5SBarry Smith }
1337cb011f5SBarry Smith 
13419caf8f3SSatish 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))
1357cb011f5SBarry Smith {
1367cb011f5SBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.trpostcheck,(PetscVoidFunction)func,ctx);if (*ierr) return;
1377cb011f5SBarry Smith #if defined(PETSC_HAVE_F90_2PTR_ARG)
1383c2ee7eaSBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.trpostcheck_pgiptr,NULL,ptr);if (*ierr) return;
1397cb011f5SBarry Smith #endif
1407cb011f5SBarry Smith   SNESNewtonTRSetPostCheck(*snes,ourtrpostcheckfunction,NULL);
1417cb011f5SBarry Smith }
1427cb011f5SBarry Smith 
143*41ba4c6cSHeeho Park PETSC_EXTERN void snesnewtontrdcsetpostcheck_(SNES *snes, void (*func)(SNES,Vec,Vec,Vec,PetscBool*,PetscBool*,void*),void *ctx,PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(ptr))
144*41ba4c6cSHeeho Park {
145*41ba4c6cSHeeho Park   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.trpostcheck,(PetscVoidFunction)func,ctx);if (*ierr) return;
146*41ba4c6cSHeeho Park #if defined(PETSC_HAVE_F90_2PTR_ARG)
147*41ba4c6cSHeeho Park   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.trpostcheck_pgiptr,NULL,ptr);if (*ierr) return;
148*41ba4c6cSHeeho Park #endif
149*41ba4c6cSHeeho Park   SNESNewtonTRDCSetPostCheck(*snes,ourtrpostcheckfunction,NULL);
150*41ba4c6cSHeeho Park }
151*41ba4c6cSHeeho Park 
1528e27ec22SSatish Balay static PetscErrorCode oursnesfunction(SNES snes,Vec x,Vec f,void *ctx)
1538e27ec22SSatish Balay {
15489e00c7dSSatish Balay #if defined(PETSC_HAVE_F90_2PTR_ARG)
15589e00c7dSSatish Balay   void* ptr;
15689e00c7dSSatish Balay   PetscObjectGetFortranCallback((PetscObject)snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.function_pgiptr,NULL,&ptr);
15789e00c7dSSatish Balay #endif
15889e00c7dSSatish 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)));
1598e27ec22SSatish Balay }
160b8ebb45fSBarry Smith 
16106ee9f85SBarry Smith static PetscErrorCode oursnestest(SNES snes,PetscInt it,PetscReal a,PetscReal d,PetscReal c,SNESConvergedReason *reason,void *ctx)
1628e27ec22SSatish Balay {
163f6291634SJed Brown   PetscObjectUseFortranCallback(snes,_cb.test,(SNES*,PetscInt*,PetscReal*,PetscReal*,PetscReal*,SNESConvergedReason*,void*,PetscErrorCode*),(&snes,&it,&a,&d,&c,reason,_ctx,&ierr));
1647f7931b9SBarry Smith }
1657f7931b9SBarry Smith 
1667f7931b9SBarry Smith static PetscErrorCode ourdestroy(void *ctx)
1677f7931b9SBarry Smith {
168f6291634SJed Brown   PetscObjectUseFortranCallback(ctx,_cb.destroy,(void*,PetscErrorCode*),(_ctx,&ierr));
1698e27ec22SSatish Balay }
1708e27ec22SSatish Balay 
171d1e9a80fSBarry Smith static PetscErrorCode oursnesjacobian(SNES snes,Vec x,Mat m,Mat p,void *ctx)
1728e27ec22SSatish Balay {
173d1e9a80fSBarry Smith   PetscObjectUseFortranCallback(snes,_cb.jacobian,(SNES*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),(&snes,&x,&m,&p,_ctx,&ierr));
1748e27ec22SSatish Balay }
175f6291634SJed Brown 
176dfef22ccSBarry Smith static PetscErrorCode oursnesupdate(SNES snes,PetscInt i)
177dfef22ccSBarry Smith {
178dfef22ccSBarry Smith   PetscObjectUseFortranCallback(snes,_cb.update,(SNES*,PetscInt *,PetscErrorCode*),(&snes,&i,&ierr));
179dfef22ccSBarry Smith }
180be95d8f1SBarry Smith static PetscErrorCode oursnesngs(SNES snes,Vec x,Vec b,void *ctx)
18190b77ac2SPeter Brune {
182be95d8f1SBarry Smith   PetscObjectUseFortranCallback(snes,_cb.ngs,(SNES*,Vec*,Vec*,void*,PetscErrorCode*),(&snes,&x,&b,_ctx,&ierr));
18390b77ac2SPeter Brune }
1848e27ec22SSatish Balay static PetscErrorCode oursnesmonitor(SNES snes,PetscInt i,PetscReal d,void *ctx)
1858e27ec22SSatish Balay {
186f6291634SJed Brown   PetscObjectUseFortranCallback(snes,_cb.monitor,(SNES*,PetscInt*,PetscReal*,void*,PetscErrorCode*),(&snes,&i,&d,_ctx,&ierr));
1878e27ec22SSatish Balay }
188c2efdce3SBarry Smith static PetscErrorCode ourmondestroy(void **ctx)
1898e27ec22SSatish Balay {
190f6291634SJed Brown   SNES snes = (SNES)*ctx;
191f6291634SJed Brown   PetscObjectUseFortranCallback(snes,_cb.mondestroy,(void*,PetscErrorCode*),(_ctx,&ierr));
1928e27ec22SSatish Balay }
1938e27ec22SSatish Balay 
1948e27ec22SSatish Balay /* ---------------------------------------------------------*/
1958e27ec22SSatish Balay /*
1968d359177SBarry Smith      snescomputejacobiandefault() and snescomputejacobiandefaultcolor()
1978e27ec22SSatish Balay   These can be used directly from Fortran but are mostly so that
1988e27ec22SSatish Balay   Fortran SNESSetJacobian() will properly handle the defaults being passed in.
1998e27ec22SSatish Balay */
200d1e9a80fSBarry Smith PETSC_EXTERN void matmffdcomputejacobian_(SNES *snes,Vec *x,Mat *m,Mat *p,void *ctx,PetscErrorCode *ierr)
201df66969eSBarry Smith {
202d1e9a80fSBarry Smith   *ierr = MatMFFDComputeJacobian(*snes,*x,*m,*p,ctx);
203df66969eSBarry Smith }
204d1e9a80fSBarry Smith PETSC_EXTERN void snescomputejacobiandefault_(SNES *snes,Vec *x,Mat *m,Mat *p,void *ctx,PetscErrorCode *ierr)
2058e27ec22SSatish Balay {
206d1e9a80fSBarry Smith   *ierr = SNESComputeJacobianDefault(*snes,*x,*m,*p,ctx);
2078e27ec22SSatish Balay }
208d1e9a80fSBarry Smith PETSC_EXTERN void  snescomputejacobiandefaultcolor_(SNES *snes,Vec *x,Mat *m,Mat *p,void *ctx,PetscErrorCode *ierr)
2098e27ec22SSatish Balay {
210d1e9a80fSBarry Smith   *ierr = SNESComputeJacobianDefaultColor(*snes,*x,*m,*p,*(MatFDColoring*)ctx);
2118e27ec22SSatish Balay }
2128e27ec22SSatish Balay 
21319caf8f3SSatish Balay PETSC_EXTERN void snessetjacobian_(SNES *snes,Mat *A,Mat *B,
21419caf8f3SSatish Balay                                     void (*func)(SNES*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),
215f5af7f23SKarl Rupp                                     void *ctx,PetscErrorCode *ierr)
2168e27ec22SSatish Balay {
217f5b6597dSBarry Smith   CHKFORTRANNULLFUNCTION(func);
2188d359177SBarry Smith   if ((PetscVoidFunction)func == (PetscVoidFunction)snescomputejacobiandefault_) {
2198d359177SBarry Smith     *ierr = SNESSetJacobian(*snes,*A,*B,SNESComputeJacobianDefault,ctx);
2208d359177SBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snescomputejacobiandefaultcolor_) {
221e025ade3SBarry Smith     if (!ctx) {
222e025ade3SBarry Smith       *ierr = PETSC_ERR_ARG_NULL;
223e025ade3SBarry Smith       return;
224e025ade3SBarry Smith     }
2258d359177SBarry Smith     *ierr = SNESSetJacobian(*snes,*A,*B,SNESComputeJacobianDefaultColor,*(MatFDColoring*)ctx);
226df66969eSBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)matmffdcomputejacobian_) {
227df66969eSBarry Smith     *ierr = SNESSetJacobian(*snes,*A,*B,MatMFFDComputeJacobian,ctx);
2288e27ec22SSatish Balay   } else {
229f6291634SJed Brown     *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.jacobian,(PetscVoidFunction)func,ctx);
2300298fd71SBarry Smith     if (!*ierr) *ierr = SNESSetJacobian(*snes,*A,*B,oursnesjacobian,NULL);
2318e27ec22SSatish Balay   }
2328e27ec22SSatish Balay }
23317a42bb7SSatish Balay PETSC_EXTERN void snessetjacobian1_(SNES *snes,Mat *A,Mat *B,
23417a42bb7SSatish Balay                                     void (*func)(SNES*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),
23517a42bb7SSatish Balay                                     void *ctx,PetscErrorCode *ierr)
23617a42bb7SSatish Balay {
23717a42bb7SSatish Balay   snessetjacobian_(snes,A,B,func,ctx,ierr);
23817a42bb7SSatish Balay }
23917a42bb7SSatish Balay PETSC_EXTERN void snessetjacobian2_(SNES *snes,Mat *A,Mat *B,
24017a42bb7SSatish Balay                                     void (*func)(SNES*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),
24117a42bb7SSatish Balay                                     void *ctx,PetscErrorCode *ierr)
24217a42bb7SSatish Balay {
24317a42bb7SSatish Balay   snessetjacobian_(snes,A,B,func,ctx,ierr);
24417a42bb7SSatish Balay }
2458e27ec22SSatish Balay /* -------------------------------------------------------------*/
246df2570feSBarry Smith static PetscErrorCode oursnespicardfunction(SNES snes,Vec x,Vec f,void *ctx)
247df2570feSBarry Smith {
248df2570feSBarry Smith #if defined(PETSC_HAVE_F90_2PTR_ARG)
249df2570feSBarry Smith   void* ptr;
250df2570feSBarry Smith   PetscObjectGetFortranCallback((PetscObject)snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.function_pgiptr,NULL,&ptr);
251df2570feSBarry Smith #endif
252df2570feSBarry 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)));
253df2570feSBarry Smith }
254df2570feSBarry Smith 
255df2570feSBarry Smith static PetscErrorCode oursnespicardjacobian(SNES snes,Vec x,Mat m,Mat p,void *ctx)
256df2570feSBarry Smith {
257df2570feSBarry Smith   PetscObjectUseFortranCallback(snes,_cb.jacobian,(SNES*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),(&snes,&x,&m,&p,_ctx,&ierr));
258df2570feSBarry Smith }
259df2570feSBarry Smith 
260df2570feSBarry Smith PETSC_EXTERN void snessetpicard_(SNES *snes,Vec *r,void (*func)(SNES*,Vec*,Vec *,void*,PetscErrorCode*),Mat *A,Mat *B,
261df2570feSBarry Smith                                  PetscErrorCode (*J)(SNES,Vec,Mat,Mat,void*),void *ctx,PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(ptr))
262df2570feSBarry Smith {
263df2570feSBarry Smith     *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.function,(PetscVoidFunction)func,ctx);
264df2570feSBarry Smith #if defined(PETSC_HAVE_F90_2PTR_ARG)
265df2570feSBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.function_pgiptr,NULL,ptr);if (*ierr) return;
266df2570feSBarry Smith #endif
267df2570feSBarry Smith     *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.jacobian,(PetscVoidFunction)J,ctx);
268df2570feSBarry Smith     if (!*ierr) *ierr = SNESSetPicard(*snes,*r,oursnespicardfunction,*A,*B,oursnespicardjacobian,NULL);
269df2570feSBarry Smith }
270df2570feSBarry Smith /* -------------------------------------------------------------*/
2718e27ec22SSatish Balay 
27219caf8f3SSatish Balay PETSC_EXTERN void snesgetoptionsprefix_(SNES *snes,char* prefix,PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len)
2738e27ec22SSatish Balay {
2748e27ec22SSatish Balay   const char *tname;
2758e27ec22SSatish Balay 
2768e27ec22SSatish Balay   *ierr = SNESGetOptionsPrefix(*snes,&tname);
2778e27ec22SSatish Balay   *ierr = PetscStrncpy(prefix,tname,len);if (*ierr) return;
278d6a8cea5SBarry Smith   FIXRETURNCHAR(PETSC_TRUE,prefix,len);
2798e27ec22SSatish Balay }
2808e27ec22SSatish Balay 
28119caf8f3SSatish Balay PETSC_EXTERN void snesgettype_(SNES *snes,char* name, PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len)
2828e27ec22SSatish Balay {
2838e27ec22SSatish Balay   const char *tname;
2848e27ec22SSatish Balay 
2858e27ec22SSatish Balay   *ierr = SNESGetType(*snes,&tname);
2868e27ec22SSatish Balay   *ierr = PetscStrncpy(name,tname,len);if (*ierr) return;
2877c363081SBarry Smith   FIXRETURNCHAR(PETSC_TRUE,name,len);
2888e27ec22SSatish Balay }
289e3da1266SHong Zhang 
2908e27ec22SSatish Balay /* ---------------------------------------------------------*/
2918e27ec22SSatish Balay 
2928e27ec22SSatish Balay /*
2938e27ec22SSatish Balay    These are not usually called from Fortran but allow Fortran users
2948e27ec22SSatish Balay    to transparently set these monitors from .F code
2958e27ec22SSatish Balay */
2968e27ec22SSatish Balay 
29719caf8f3SSatish 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))
2988e27ec22SSatish Balay {
299aecf964fSBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.function,(PetscVoidFunction)func,ctx);if (*ierr) return;
30089e00c7dSSatish Balay #if defined(PETSC_HAVE_F90_2PTR_ARG)
301aecf964fSBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.function_pgiptr,NULL,ptr);if (*ierr) return;
30289e00c7dSSatish Balay #endif
303aecf964fSBarry Smith   *ierr = SNESSetFunction(*snes,*r,oursnesfunction,NULL);
3048e27ec22SSatish Balay }
305c79ef259SPeter Brune 
30619caf8f3SSatish Balay PETSC_EXTERN void snessetngs_(SNES *snes,void (*func)(SNES*,Vec*,Vec*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr)
307c79ef259SPeter Brune {
308aecf964fSBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.ngs,(PetscVoidFunction)func,ctx);if (*ierr) return;
309aecf964fSBarry Smith   *ierr = SNESSetNGS(*snes,oursnesngs,NULL);
310c79ef259SPeter Brune }
31119caf8f3SSatish Balay PETSC_EXTERN void snessetupdate_(SNES *snes,void (*func)(SNES*,PetscInt*,PetscErrorCode*),PetscErrorCode *ierr)
312dfef22ccSBarry Smith {
313aecf964fSBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.update,(PetscVoidFunction)func,NULL);if (*ierr) return;
314aecf964fSBarry Smith   *ierr = SNESSetUpdate(*snes,oursnesupdate);
315dfef22ccSBarry Smith }
3168e27ec22SSatish Balay /* ---------------------------------------------------------*/
3178e27ec22SSatish Balay 
3188e27ec22SSatish Balay /* the func argument is ignored */
31919caf8f3SSatish Balay PETSC_EXTERN void snesgetfunction_(SNES *snes,Vec *r,void (*func)(SNES,Vec,Vec,void*),void **ctx,PetscErrorCode *ierr)
3208e27ec22SSatish Balay {
3218e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(r);
3220298fd71SBarry Smith   *ierr = SNESGetFunction(*snes,r,NULL,NULL); if (*ierr) return;
323146935d7SSatish Balay   if ((PetscVoidFunction)func == (PetscVoidFunction)PETSC_NULL_FUNCTION_Fortran) return;
3240298fd71SBarry Smith   *ierr = PetscObjectGetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.function,NULL,ctx);
3258e27ec22SSatish Balay }
326c79ef259SPeter Brune 
32719caf8f3SSatish Balay PETSC_EXTERN void snesgetngs_(SNES *snes,void *func,void **ctx,PetscErrorCode *ierr)
328c79ef259SPeter Brune {
329be95d8f1SBarry Smith   *ierr = PetscObjectGetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.ngs,NULL,ctx);
330c79ef259SPeter Brune }
331c79ef259SPeter Brune 
3328e27ec22SSatish Balay /*----------------------------------------------------------------------*/
3338e27ec22SSatish Balay 
33469c1e2abSSatish Balay PETSC_EXTERN void snesconvergeddefault_(SNES *snes,PetscInt *it,PetscReal *a,PetscReal *b,PetscReal *c,SNESConvergedReason *r, void *ct,PetscErrorCode *ierr)
3353f149594SLisandro Dalcin {
3368d359177SBarry Smith   *ierr = SNESConvergedDefault(*snes,*it,*a,*b,*c,r,ct);
3373f149594SLisandro Dalcin }
3383f149594SLisandro Dalcin 
339e07f7f94SSatish Balay PETSC_EXTERN void snesconvergedskip_(SNES *snes,PetscInt *it,PetscReal *a,PetscReal *b,PetscReal *c,SNESConvergedReason *r,void *ct,PetscErrorCode *ierr)
3403f149594SLisandro Dalcin {
341e2a6519dSDmitry Karpeev   *ierr = SNESConvergedSkip(*snes,*it,*a,*b,*c,r,ct);
3423f149594SLisandro Dalcin }
3433f149594SLisandro Dalcin 
34419caf8f3SSatish Balay PETSC_EXTERN void snessetconvergencetest_(SNES *snes,void (*func)(SNES*,PetscInt*,PetscReal*,PetscReal*,PetscReal*,SNESConvergedReason*,void*,PetscErrorCode*), void *cctx,void (*destroy)(void*),PetscErrorCode *ierr)
3458e27ec22SSatish Balay {
3463f22127dSBarry Smith   CHKFORTRANNULLFUNCTION(destroy);
3473f149594SLisandro Dalcin 
3488d359177SBarry Smith   if ((PetscVoidFunction)func == (PetscVoidFunction)snesconvergeddefault_) {
3498d359177SBarry Smith     *ierr = SNESSetConvergenceTest(*snes,SNESConvergedDefault,0,0);
350e07f7f94SSatish Balay   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesconvergedskip_) {
351e2a6519dSDmitry Karpeev     *ierr = SNESSetConvergenceTest(*snes,SNESConvergedSkip,0,0);
3528e27ec22SSatish Balay   } else {
353aecf964fSBarry Smith     *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.test,(PetscVoidFunction)func,cctx);if (*ierr) return;
354aecf964fSBarry Smith     *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.destroy,(PetscVoidFunction)destroy,cctx);if (*ierr) return;
355aecf964fSBarry Smith     *ierr = SNESSetConvergenceTest(*snes,oursnestest,*snes,ourdestroy);
3568e27ec22SSatish Balay   }
3578e27ec22SSatish Balay }
3588e27ec22SSatish Balay /*----------------------------------------------------------------------*/
3598e27ec22SSatish Balay 
36019caf8f3SSatish Balay PETSC_EXTERN void snesview_(SNES *snes,PetscViewer *viewer, PetscErrorCode *ierr)
3618e27ec22SSatish Balay {
3628e27ec22SSatish Balay   PetscViewer v;
3638e27ec22SSatish Balay   PetscPatchDefaultViewers_Fortran(viewer,v);
3648e27ec22SSatish Balay   *ierr = SNESView(*snes,v);
3658e27ec22SSatish Balay }
3668e27ec22SSatish Balay 
3678e27ec22SSatish Balay /*  func is currently ignored from Fortran */
36819caf8f3SSatish Balay PETSC_EXTERN void snesgetjacobian_(SNES *snes,Mat *A,Mat *B,int *func,void **ctx,PetscErrorCode *ierr)
3698e27ec22SSatish Balay {
3708e27ec22SSatish Balay   CHKFORTRANNULLINTEGER(ctx);
3718e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(A);
3728e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(B);
3730298fd71SBarry Smith   *ierr = SNESGetJacobian(*snes,A,B,0,NULL); if (*ierr) return;
3740298fd71SBarry Smith   *ierr = PetscObjectGetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.jacobian,NULL,ctx);
375f2e0d3f1SJed Brown 
3768e27ec22SSatish Balay }
3778e27ec22SSatish Balay 
37819caf8f3SSatish Balay PETSC_EXTERN void snesgetconvergencehistory_(SNES *snes,PetscInt *na,PetscErrorCode *ierr)
3798e27ec22SSatish Balay {
3800298fd71SBarry Smith   *ierr = SNESGetConvergenceHistory(*snes,NULL,NULL,na);
3818e27ec22SSatish Balay }
3828e27ec22SSatish Balay 
38319caf8f3SSatish Balay PETSC_EXTERN void snessettype_(SNES *snes,char* type,PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len)
3848e27ec22SSatish Balay {
3858e27ec22SSatish Balay   char *t;
3868e27ec22SSatish Balay 
3878e27ec22SSatish Balay   FIXCHAR(type,len,t);
388d49bb8f9SBarry Smith   *ierr = SNESSetType(*snes,t);if (*ierr) return;
3898e27ec22SSatish Balay   FREECHAR(type,t);
3908e27ec22SSatish Balay }
3918e27ec22SSatish Balay 
39219caf8f3SSatish Balay PETSC_EXTERN void snesappendoptionsprefix_(SNES *snes,char* prefix,PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len)
3938e27ec22SSatish Balay {
3948e27ec22SSatish Balay   char *t;
3958e27ec22SSatish Balay 
3968e27ec22SSatish Balay   FIXCHAR(prefix,len,t);
397d49bb8f9SBarry Smith   *ierr = SNESAppendOptionsPrefix(*snes,t);if (*ierr) return;
3988e27ec22SSatish Balay   FREECHAR(prefix,t);
3998e27ec22SSatish Balay }
4008e27ec22SSatish Balay 
40119caf8f3SSatish Balay PETSC_EXTERN void snessetoptionsprefix_(SNES *snes,char* prefix,PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len)
4028e27ec22SSatish Balay {
4038e27ec22SSatish Balay   char *t;
4048e27ec22SSatish Balay 
4058e27ec22SSatish Balay   FIXCHAR(prefix,len,t);
406d49bb8f9SBarry Smith   *ierr = SNESSetOptionsPrefix(*snes,t);if (*ierr) return;
4078e27ec22SSatish Balay   FREECHAR(prefix,t);
4088e27ec22SSatish Balay }
4098e27ec22SSatish Balay 
4108e27ec22SSatish Balay /*----------------------------------------------------------------------*/
4118e27ec22SSatish Balay 
41252f0073cSBarry Smith PETSC_EXTERN void snesmonitordefault_(SNES *snes,PetscInt *its,PetscReal *fgnorm,PetscViewerAndFormat **dummy,PetscErrorCode *ierr)
4138e27ec22SSatish Balay {
414410efd14SBarry Smith   *ierr = SNESMonitorDefault(*snes,*its,*fgnorm,*dummy);
4158e27ec22SSatish Balay }
4168e27ec22SSatish Balay 
41752f0073cSBarry Smith PETSC_EXTERN void snesmonitorsolution_(SNES *snes,PetscInt *its,PetscReal *fgnorm,PetscViewerAndFormat **dummy,PetscErrorCode *ierr)
4188e27ec22SSatish Balay {
419410efd14SBarry Smith   *ierr = SNESMonitorSolution(*snes,*its,*fgnorm,*dummy);
4208e27ec22SSatish Balay }
4218e27ec22SSatish Balay 
42252f0073cSBarry Smith PETSC_EXTERN void snesmonitorsolutionupdate_(SNES *snes,PetscInt *its,PetscReal *fgnorm,PetscViewerAndFormat **dummy,PetscErrorCode *ierr)
4238e27ec22SSatish Balay {
424410efd14SBarry Smith   *ierr = SNESMonitorSolutionUpdate(*snes,*its,*fgnorm,*dummy);
4258e27ec22SSatish Balay }
4268e27ec22SSatish Balay 
42719caf8f3SSatish Balay PETSC_EXTERN void snesmonitorset_(SNES *snes,void (*func)(SNES*,PetscInt*,PetscReal*,void*,PetscErrorCode*),void *mctx,void (*mondestroy)(void*,PetscErrorCode*),PetscErrorCode *ierr)
4288e27ec22SSatish Balay {
429aecf964fSBarry Smith   CHKFORTRANNULLFUNCTION(mondestroy);
430a6570f20SBarry Smith   if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitordefault_) {
4311cb03803SBarry Smith     *ierr = SNESMonitorSet(*snes,(PetscErrorCode (*)(SNES,PetscInt,PetscReal,void*))SNESMonitorDefault,*(PetscViewerAndFormat**)mctx,(PetscErrorCode (*)(void **))PetscViewerAndFormatDestroy);
432a6570f20SBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorsolution_) {
4331cb03803SBarry Smith     *ierr = SNESMonitorSet(*snes,(PetscErrorCode (*)(SNES,PetscInt,PetscReal,void*))SNESMonitorSolution,*(PetscViewerAndFormat**)mctx,(PetscErrorCode (*)(void **))PetscViewerAndFormatDestroy);
434a6570f20SBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorsolutionupdate_) {
4351cb03803SBarry Smith     *ierr = SNESMonitorSet(*snes,(PetscErrorCode (*)(SNES,PetscInt,PetscReal,void*))SNESMonitorSolutionUpdate,*(PetscViewerAndFormat**)mctx,(PetscErrorCode (*)(void **))PetscViewerAndFormatDestroy);
4368e27ec22SSatish Balay   } else {
437aecf964fSBarry Smith     *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.monitor,(PetscVoidFunction)func,mctx);if (*ierr) return;
438aecf964fSBarry Smith     *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.mondestroy,(PetscVoidFunction)mondestroy,mctx);if (*ierr) return;
439aecf964fSBarry Smith     *ierr = SNESMonitorSet(*snes,oursnesmonitor,*snes,ourmondestroy);
4408e27ec22SSatish Balay   }
4418e27ec22SSatish Balay }
4428e27ec22SSatish Balay 
44319caf8f3SSatish Balay PETSC_EXTERN void snesviewfromoptions_(SNES *ao,PetscObject obj,char* type,PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len)
444fe2efc57SMark {
445fe2efc57SMark   char *t;
446fe2efc57SMark 
447fe2efc57SMark   FIXCHAR(type,len,t);
448b14c0cbaSBlaise Bourdin   CHKFORTRANNULLOBJECT(obj);
449fe2efc57SMark   *ierr = SNESViewFromOptions(*ao,obj,t);if (*ierr) return;
450fe2efc57SMark   FREECHAR(type,t);
451fe2efc57SMark }
45291f3e32bSBarry Smith 
45391f3e32bSBarry Smith PETSC_EXTERN void snesconvergedreasonview_(SNES *snes,PetscViewer *viewer, PetscErrorCode *ierr)
45491f3e32bSBarry Smith {
45591f3e32bSBarry Smith   PetscViewer v;
45691f3e32bSBarry Smith   PetscPatchDefaultViewers_Fortran(viewer,v);
45791f3e32bSBarry Smith   *ierr = SNESConvergedReasonView(*snes,v);
45891f3e32bSBarry Smith }
459c4421ceaSFande Kong 
460c4421ceaSFande Kong PETSC_EXTERN void snesgetconvergedreasonstring_(SNES *snes, char* strreason, PetscErrorCode *ierr, PETSC_FORTRAN_CHARLEN_T len)
461c4421ceaSFande Kong {
462c4421ceaSFande Kong   const char *tstrreason;
463c4421ceaSFande Kong   *ierr = SNESGetConvergedReasonString(*snes,&tstrreason);
464c4421ceaSFande Kong   *ierr = PetscStrncpy(strreason,tstrreason,len);if (*ierr) return;
465c4421ceaSFande Kong   FIXRETURNCHAR(PETSC_TRUE,strreason,len);
466c4421ceaSFande Kong }
467