xref: /petsc/src/snes/interface/ftn-custom/zsnesf.c (revision f6dfbefd03961ab3be6f06be75c96cbf27a49667)
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
3841ba4c6cSHeeho Park #define snesnewtontrdcsetprecheck_       SNESNEWTONTRDCSETPRECHECK
3941ba4c6cSHeeho 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
7441ba4c6cSHeeho Park #define snesnewtontrdcsetprecheck_       snesnewtontrdcsetprecheck
7541ba4c6cSHeeho 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 
11641ba4c6cSHeeho Park PETSC_EXTERN void snesnewtontrdcsetprecheck_(SNES *snes, void (*func)(SNES,Vec,Vec,PetscBool*,void*),void *ctx,PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(ptr))
11741ba4c6cSHeeho Park {
11841ba4c6cSHeeho Park   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.trprecheck,(PetscVoidFunction)func,ctx);if (*ierr) return;
11941ba4c6cSHeeho Park #if defined(PETSC_HAVE_F90_2PTR_ARG)
12041ba4c6cSHeeho Park   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.trprecheck_pgiptr,NULL,ptr);if (*ierr) return;
12141ba4c6cSHeeho Park #endif
12241ba4c6cSHeeho Park   SNESNewtonTRDCSetPreCheck(*snes,ourtrprecheckfunction,NULL);
12341ba4c6cSHeeho Park }
12441ba4c6cSHeeho 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 
14341ba4c6cSHeeho 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))
14441ba4c6cSHeeho Park {
14541ba4c6cSHeeho Park   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.trpostcheck,(PetscVoidFunction)func,ctx);if (*ierr) return;
14641ba4c6cSHeeho Park #if defined(PETSC_HAVE_F90_2PTR_ARG)
14741ba4c6cSHeeho Park   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.trpostcheck_pgiptr,NULL,ptr);if (*ierr) return;
14841ba4c6cSHeeho Park #endif
14941ba4c6cSHeeho Park   SNESNewtonTRDCSetPostCheck(*snes,ourtrpostcheckfunction,NULL);
15041ba4c6cSHeeho Park }
15141ba4c6cSHeeho 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 /*
1958d359177SBarry Smith      snescomputejacobiandefault() and snescomputejacobiandefaultcolor()
1968e27ec22SSatish Balay   These can be used directly from Fortran but are mostly so that
1978e27ec22SSatish Balay   Fortran SNESSetJacobian() will properly handle the defaults being passed in.
1988e27ec22SSatish Balay */
199d1e9a80fSBarry Smith PETSC_EXTERN void matmffdcomputejacobian_(SNES *snes,Vec *x,Mat *m,Mat *p,void *ctx,PetscErrorCode *ierr)
200df66969eSBarry Smith {
201d1e9a80fSBarry Smith   *ierr = MatMFFDComputeJacobian(*snes,*x,*m,*p,ctx);
202df66969eSBarry Smith }
203d1e9a80fSBarry Smith PETSC_EXTERN void snescomputejacobiandefault_(SNES *snes,Vec *x,Mat *m,Mat *p,void *ctx,PetscErrorCode *ierr)
2048e27ec22SSatish Balay {
205d1e9a80fSBarry Smith   *ierr = SNESComputeJacobianDefault(*snes,*x,*m,*p,ctx);
2068e27ec22SSatish Balay }
207d1e9a80fSBarry Smith PETSC_EXTERN void  snescomputejacobiandefaultcolor_(SNES *snes,Vec *x,Mat *m,Mat *p,void *ctx,PetscErrorCode *ierr)
2088e27ec22SSatish Balay {
209d1e9a80fSBarry Smith   *ierr = SNESComputeJacobianDefaultColor(*snes,*x,*m,*p,*(MatFDColoring*)ctx);
2108e27ec22SSatish Balay }
2118e27ec22SSatish Balay 
21219caf8f3SSatish Balay PETSC_EXTERN void snessetjacobian_(SNES *snes,Mat *A,Mat *B,
21319caf8f3SSatish Balay                                     void (*func)(SNES*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),
214f5af7f23SKarl Rupp                                     void *ctx,PetscErrorCode *ierr)
2158e27ec22SSatish Balay {
216f5b6597dSBarry Smith   CHKFORTRANNULLFUNCTION(func);
2178d359177SBarry Smith   if ((PetscVoidFunction)func == (PetscVoidFunction)snescomputejacobiandefault_) {
2188d359177SBarry Smith     *ierr = SNESSetJacobian(*snes,*A,*B,SNESComputeJacobianDefault,ctx);
2198d359177SBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snescomputejacobiandefaultcolor_) {
220e025ade3SBarry Smith     if (!ctx) {
221e025ade3SBarry Smith       *ierr = PETSC_ERR_ARG_NULL;
222e025ade3SBarry Smith       return;
223e025ade3SBarry Smith     }
2248d359177SBarry Smith     *ierr = SNESSetJacobian(*snes,*A,*B,SNESComputeJacobianDefaultColor,*(MatFDColoring*)ctx);
225df66969eSBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)matmffdcomputejacobian_) {
226df66969eSBarry Smith     *ierr = SNESSetJacobian(*snes,*A,*B,MatMFFDComputeJacobian,ctx);
2278e27ec22SSatish Balay   } else {
228f6291634SJed Brown     *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.jacobian,(PetscVoidFunction)func,ctx);
2290298fd71SBarry Smith     if (!*ierr) *ierr = SNESSetJacobian(*snes,*A,*B,oursnesjacobian,NULL);
2308e27ec22SSatish Balay   }
2318e27ec22SSatish Balay }
23217a42bb7SSatish Balay PETSC_EXTERN void snessetjacobian1_(SNES *snes,Mat *A,Mat *B,
23317a42bb7SSatish Balay                                     void (*func)(SNES*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),
23417a42bb7SSatish Balay                                     void *ctx,PetscErrorCode *ierr)
23517a42bb7SSatish Balay {
23617a42bb7SSatish Balay   snessetjacobian_(snes,A,B,func,ctx,ierr);
23717a42bb7SSatish Balay }
23817a42bb7SSatish Balay PETSC_EXTERN void snessetjacobian2_(SNES *snes,Mat *A,Mat *B,
23917a42bb7SSatish Balay                                     void (*func)(SNES*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),
24017a42bb7SSatish Balay                                     void *ctx,PetscErrorCode *ierr)
24117a42bb7SSatish Balay {
24217a42bb7SSatish Balay   snessetjacobian_(snes,A,B,func,ctx,ierr);
24317a42bb7SSatish Balay }
244*f6dfbefdSBarry Smith 
245df2570feSBarry Smith static PetscErrorCode oursnespicardfunction(SNES snes,Vec x,Vec f,void *ctx)
246df2570feSBarry Smith {
247df2570feSBarry Smith #if defined(PETSC_HAVE_F90_2PTR_ARG)
248df2570feSBarry Smith   void* ptr;
249df2570feSBarry Smith   PetscObjectGetFortranCallback((PetscObject)snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.function_pgiptr,NULL,&ptr);
250df2570feSBarry Smith #endif
251df2570feSBarry 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)));
252df2570feSBarry Smith }
253df2570feSBarry Smith 
254df2570feSBarry Smith static PetscErrorCode oursnespicardjacobian(SNES snes,Vec x,Mat m,Mat p,void *ctx)
255df2570feSBarry Smith {
256df2570feSBarry Smith   PetscObjectUseFortranCallback(snes,_cb.jacobian,(SNES*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),(&snes,&x,&m,&p,_ctx,&ierr));
257df2570feSBarry Smith }
258df2570feSBarry Smith 
259df2570feSBarry Smith PETSC_EXTERN void snessetpicard_(SNES *snes,Vec *r,void (*func)(SNES*,Vec*,Vec *,void*,PetscErrorCode*),Mat *A,Mat *B,
260df2570feSBarry Smith                                  PetscErrorCode (*J)(SNES,Vec,Mat,Mat,void*),void *ctx,PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(ptr))
261df2570feSBarry Smith {
262df2570feSBarry Smith     *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.function,(PetscVoidFunction)func,ctx);
263df2570feSBarry Smith #if defined(PETSC_HAVE_F90_2PTR_ARG)
264df2570feSBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.function_pgiptr,NULL,ptr);if (*ierr) return;
265df2570feSBarry Smith #endif
266df2570feSBarry Smith     *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.jacobian,(PetscVoidFunction)J,ctx);
267df2570feSBarry Smith     if (!*ierr) *ierr = SNESSetPicard(*snes,*r,oursnespicardfunction,*A,*B,oursnespicardjacobian,NULL);
268df2570feSBarry Smith }
2698e27ec22SSatish Balay 
27019caf8f3SSatish Balay PETSC_EXTERN void snesgetoptionsprefix_(SNES *snes,char* prefix,PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len)
2718e27ec22SSatish Balay {
2728e27ec22SSatish Balay   const char *tname;
2738e27ec22SSatish Balay 
2748e27ec22SSatish Balay   *ierr = SNESGetOptionsPrefix(*snes,&tname);
2758e27ec22SSatish Balay   *ierr = PetscStrncpy(prefix,tname,len);if (*ierr) return;
276d6a8cea5SBarry Smith   FIXRETURNCHAR(PETSC_TRUE,prefix,len);
2778e27ec22SSatish Balay }
2788e27ec22SSatish Balay 
27919caf8f3SSatish Balay PETSC_EXTERN void snesgettype_(SNES *snes,char* name, PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len)
2808e27ec22SSatish Balay {
2818e27ec22SSatish Balay   const char *tname;
2828e27ec22SSatish Balay 
2838e27ec22SSatish Balay   *ierr = SNESGetType(*snes,&tname);
2848e27ec22SSatish Balay   *ierr = PetscStrncpy(name,tname,len);if (*ierr) return;
2857c363081SBarry Smith   FIXRETURNCHAR(PETSC_TRUE,name,len);
2868e27ec22SSatish Balay }
287e3da1266SHong Zhang 
2888e27ec22SSatish Balay /*
2898e27ec22SSatish Balay    These are not usually called from Fortran but allow Fortran users
2908e27ec22SSatish Balay    to transparently set these monitors from .F code
2918e27ec22SSatish Balay */
2928e27ec22SSatish Balay 
29319caf8f3SSatish 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))
2948e27ec22SSatish Balay {
295aecf964fSBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.function,(PetscVoidFunction)func,ctx);if (*ierr) return;
29689e00c7dSSatish Balay #if defined(PETSC_HAVE_F90_2PTR_ARG)
297aecf964fSBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.function_pgiptr,NULL,ptr);if (*ierr) return;
29889e00c7dSSatish Balay #endif
299aecf964fSBarry Smith   *ierr = SNESSetFunction(*snes,*r,oursnesfunction,NULL);
3008e27ec22SSatish Balay }
301c79ef259SPeter Brune 
30219caf8f3SSatish Balay PETSC_EXTERN void snessetngs_(SNES *snes,void (*func)(SNES*,Vec*,Vec*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr)
303c79ef259SPeter Brune {
304aecf964fSBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.ngs,(PetscVoidFunction)func,ctx);if (*ierr) return;
305aecf964fSBarry Smith   *ierr = SNESSetNGS(*snes,oursnesngs,NULL);
306c79ef259SPeter Brune }
30719caf8f3SSatish Balay PETSC_EXTERN void snessetupdate_(SNES *snes,void (*func)(SNES*,PetscInt*,PetscErrorCode*),PetscErrorCode *ierr)
308dfef22ccSBarry Smith {
309aecf964fSBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.update,(PetscVoidFunction)func,NULL);if (*ierr) return;
310aecf964fSBarry Smith   *ierr = SNESSetUpdate(*snes,oursnesupdate);
311dfef22ccSBarry Smith }
3128e27ec22SSatish Balay 
3138e27ec22SSatish Balay /* the func argument is ignored */
31419caf8f3SSatish Balay PETSC_EXTERN void snesgetfunction_(SNES *snes,Vec *r,void (*func)(SNES,Vec,Vec,void*),void **ctx,PetscErrorCode *ierr)
3158e27ec22SSatish Balay {
3168e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(r);
3170298fd71SBarry Smith   *ierr = SNESGetFunction(*snes,r,NULL,NULL); if (*ierr) return;
318146935d7SSatish Balay   if ((PetscVoidFunction)func == (PetscVoidFunction)PETSC_NULL_FUNCTION_Fortran) return;
3190298fd71SBarry Smith   *ierr = PetscObjectGetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.function,NULL,ctx);
3208e27ec22SSatish Balay }
321c79ef259SPeter Brune 
32219caf8f3SSatish Balay PETSC_EXTERN void snesgetngs_(SNES *snes,void *func,void **ctx,PetscErrorCode *ierr)
323c79ef259SPeter Brune {
324be95d8f1SBarry Smith   *ierr = PetscObjectGetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.ngs,NULL,ctx);
325c79ef259SPeter Brune }
326c79ef259SPeter Brune 
32769c1e2abSSatish Balay PETSC_EXTERN void snesconvergeddefault_(SNES *snes,PetscInt *it,PetscReal *a,PetscReal *b,PetscReal *c,SNESConvergedReason *r, void *ct,PetscErrorCode *ierr)
3283f149594SLisandro Dalcin {
3298d359177SBarry Smith   *ierr = SNESConvergedDefault(*snes,*it,*a,*b,*c,r,ct);
3303f149594SLisandro Dalcin }
3313f149594SLisandro Dalcin 
332e07f7f94SSatish Balay PETSC_EXTERN void snesconvergedskip_(SNES *snes,PetscInt *it,PetscReal *a,PetscReal *b,PetscReal *c,SNESConvergedReason *r,void *ct,PetscErrorCode *ierr)
3333f149594SLisandro Dalcin {
334e2a6519dSDmitry Karpeev   *ierr = SNESConvergedSkip(*snes,*it,*a,*b,*c,r,ct);
3353f149594SLisandro Dalcin }
3363f149594SLisandro Dalcin 
33719caf8f3SSatish Balay PETSC_EXTERN void snessetconvergencetest_(SNES *snes,void (*func)(SNES*,PetscInt*,PetscReal*,PetscReal*,PetscReal*,SNESConvergedReason*,void*,PetscErrorCode*), void *cctx,void (*destroy)(void*),PetscErrorCode *ierr)
3388e27ec22SSatish Balay {
3393f22127dSBarry Smith   CHKFORTRANNULLFUNCTION(destroy);
3403f149594SLisandro Dalcin 
3418d359177SBarry Smith   if ((PetscVoidFunction)func == (PetscVoidFunction)snesconvergeddefault_) {
3428d359177SBarry Smith     *ierr = SNESSetConvergenceTest(*snes,SNESConvergedDefault,0,0);
343e07f7f94SSatish Balay   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesconvergedskip_) {
344e2a6519dSDmitry Karpeev     *ierr = SNESSetConvergenceTest(*snes,SNESConvergedSkip,0,0);
3458e27ec22SSatish Balay   } else {
346aecf964fSBarry Smith     *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.test,(PetscVoidFunction)func,cctx);if (*ierr) return;
347aecf964fSBarry Smith     *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.destroy,(PetscVoidFunction)destroy,cctx);if (*ierr) return;
348aecf964fSBarry Smith     *ierr = SNESSetConvergenceTest(*snes,oursnestest,*snes,ourdestroy);
3498e27ec22SSatish Balay   }
3508e27ec22SSatish Balay }
3518e27ec22SSatish Balay 
35219caf8f3SSatish Balay PETSC_EXTERN void snesview_(SNES *snes,PetscViewer *viewer, PetscErrorCode *ierr)
3538e27ec22SSatish Balay {
3548e27ec22SSatish Balay   PetscViewer v;
3558e27ec22SSatish Balay   PetscPatchDefaultViewers_Fortran(viewer,v);
3568e27ec22SSatish Balay   *ierr = SNESView(*snes,v);
3578e27ec22SSatish Balay }
3588e27ec22SSatish Balay 
3598e27ec22SSatish Balay /*  func is currently ignored from Fortran */
36019caf8f3SSatish Balay PETSC_EXTERN void snesgetjacobian_(SNES *snes,Mat *A,Mat *B,int *func,void **ctx,PetscErrorCode *ierr)
3618e27ec22SSatish Balay {
3628e27ec22SSatish Balay   CHKFORTRANNULLINTEGER(ctx);
3638e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(A);
3648e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(B);
3650298fd71SBarry Smith   *ierr = SNESGetJacobian(*snes,A,B,0,NULL); if (*ierr) return;
3660298fd71SBarry Smith   *ierr = PetscObjectGetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.jacobian,NULL,ctx);
367f2e0d3f1SJed Brown 
3688e27ec22SSatish Balay }
3698e27ec22SSatish Balay 
37019caf8f3SSatish Balay PETSC_EXTERN void snesgetconvergencehistory_(SNES *snes,PetscInt *na,PetscErrorCode *ierr)
3718e27ec22SSatish Balay {
3720298fd71SBarry Smith   *ierr = SNESGetConvergenceHistory(*snes,NULL,NULL,na);
3738e27ec22SSatish Balay }
3748e27ec22SSatish Balay 
37519caf8f3SSatish Balay PETSC_EXTERN void snessettype_(SNES *snes,char* type,PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len)
3768e27ec22SSatish Balay {
3778e27ec22SSatish Balay   char *t;
3788e27ec22SSatish Balay 
3798e27ec22SSatish Balay   FIXCHAR(type,len,t);
380d49bb8f9SBarry Smith   *ierr = SNESSetType(*snes,t);if (*ierr) return;
3818e27ec22SSatish Balay   FREECHAR(type,t);
3828e27ec22SSatish Balay }
3838e27ec22SSatish Balay 
38419caf8f3SSatish Balay PETSC_EXTERN void snesappendoptionsprefix_(SNES *snes,char* prefix,PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len)
3858e27ec22SSatish Balay {
3868e27ec22SSatish Balay   char *t;
3878e27ec22SSatish Balay 
3888e27ec22SSatish Balay   FIXCHAR(prefix,len,t);
389d49bb8f9SBarry Smith   *ierr = SNESAppendOptionsPrefix(*snes,t);if (*ierr) return;
3908e27ec22SSatish Balay   FREECHAR(prefix,t);
3918e27ec22SSatish Balay }
3928e27ec22SSatish Balay 
39319caf8f3SSatish Balay PETSC_EXTERN void snessetoptionsprefix_(SNES *snes,char* prefix,PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len)
3948e27ec22SSatish Balay {
3958e27ec22SSatish Balay   char *t;
3968e27ec22SSatish Balay 
3978e27ec22SSatish Balay   FIXCHAR(prefix,len,t);
398d49bb8f9SBarry Smith   *ierr = SNESSetOptionsPrefix(*snes,t);if (*ierr) return;
3998e27ec22SSatish Balay   FREECHAR(prefix,t);
4008e27ec22SSatish Balay }
4018e27ec22SSatish Balay 
40252f0073cSBarry Smith PETSC_EXTERN void snesmonitordefault_(SNES *snes,PetscInt *its,PetscReal *fgnorm,PetscViewerAndFormat **dummy,PetscErrorCode *ierr)
4038e27ec22SSatish Balay {
404410efd14SBarry Smith   *ierr = SNESMonitorDefault(*snes,*its,*fgnorm,*dummy);
4058e27ec22SSatish Balay }
4068e27ec22SSatish Balay 
40752f0073cSBarry Smith PETSC_EXTERN void snesmonitorsolution_(SNES *snes,PetscInt *its,PetscReal *fgnorm,PetscViewerAndFormat **dummy,PetscErrorCode *ierr)
4088e27ec22SSatish Balay {
409410efd14SBarry Smith   *ierr = SNESMonitorSolution(*snes,*its,*fgnorm,*dummy);
4108e27ec22SSatish Balay }
4118e27ec22SSatish Balay 
41252f0073cSBarry Smith PETSC_EXTERN void snesmonitorsolutionupdate_(SNES *snes,PetscInt *its,PetscReal *fgnorm,PetscViewerAndFormat **dummy,PetscErrorCode *ierr)
4138e27ec22SSatish Balay {
414410efd14SBarry Smith   *ierr = SNESMonitorSolutionUpdate(*snes,*its,*fgnorm,*dummy);
4158e27ec22SSatish Balay }
4168e27ec22SSatish Balay 
41719caf8f3SSatish Balay PETSC_EXTERN void snesmonitorset_(SNES *snes,void (*func)(SNES*,PetscInt*,PetscReal*,void*,PetscErrorCode*),void *mctx,void (*mondestroy)(void*,PetscErrorCode*),PetscErrorCode *ierr)
4188e27ec22SSatish Balay {
419aecf964fSBarry Smith   CHKFORTRANNULLFUNCTION(mondestroy);
420a6570f20SBarry Smith   if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitordefault_) {
4211cb03803SBarry Smith     *ierr = SNESMonitorSet(*snes,(PetscErrorCode (*)(SNES,PetscInt,PetscReal,void*))SNESMonitorDefault,*(PetscViewerAndFormat**)mctx,(PetscErrorCode (*)(void **))PetscViewerAndFormatDestroy);
422a6570f20SBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorsolution_) {
4231cb03803SBarry Smith     *ierr = SNESMonitorSet(*snes,(PetscErrorCode (*)(SNES,PetscInt,PetscReal,void*))SNESMonitorSolution,*(PetscViewerAndFormat**)mctx,(PetscErrorCode (*)(void **))PetscViewerAndFormatDestroy);
424a6570f20SBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorsolutionupdate_) {
4251cb03803SBarry Smith     *ierr = SNESMonitorSet(*snes,(PetscErrorCode (*)(SNES,PetscInt,PetscReal,void*))SNESMonitorSolutionUpdate,*(PetscViewerAndFormat**)mctx,(PetscErrorCode (*)(void **))PetscViewerAndFormatDestroy);
4268e27ec22SSatish Balay   } else {
427aecf964fSBarry Smith     *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.monitor,(PetscVoidFunction)func,mctx);if (*ierr) return;
428aecf964fSBarry Smith     *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.mondestroy,(PetscVoidFunction)mondestroy,mctx);if (*ierr) return;
429aecf964fSBarry Smith     *ierr = SNESMonitorSet(*snes,oursnesmonitor,*snes,ourmondestroy);
4308e27ec22SSatish Balay   }
4318e27ec22SSatish Balay }
4328e27ec22SSatish Balay 
43319caf8f3SSatish Balay PETSC_EXTERN void snesviewfromoptions_(SNES *ao,PetscObject obj,char* type,PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len)
434fe2efc57SMark {
435fe2efc57SMark   char *t;
436fe2efc57SMark 
437fe2efc57SMark   FIXCHAR(type,len,t);
438b14c0cbaSBlaise Bourdin   CHKFORTRANNULLOBJECT(obj);
439fe2efc57SMark   *ierr = SNESViewFromOptions(*ao,obj,t);if (*ierr) return;
440fe2efc57SMark   FREECHAR(type,t);
441fe2efc57SMark }
44291f3e32bSBarry Smith 
44391f3e32bSBarry Smith PETSC_EXTERN void snesconvergedreasonview_(SNES *snes,PetscViewer *viewer, PetscErrorCode *ierr)
44491f3e32bSBarry Smith {
44591f3e32bSBarry Smith   PetscViewer v;
44691f3e32bSBarry Smith   PetscPatchDefaultViewers_Fortran(viewer,v);
44791f3e32bSBarry Smith   *ierr = SNESConvergedReasonView(*snes,v);
44891f3e32bSBarry Smith }
449c4421ceaSFande Kong 
450c4421ceaSFande Kong PETSC_EXTERN void snesgetconvergedreasonstring_(SNES *snes, char* strreason, PetscErrorCode *ierr, PETSC_FORTRAN_CHARLEN_T len)
451c4421ceaSFande Kong {
452c4421ceaSFande Kong   const char *tstrreason;
453c4421ceaSFande Kong   *ierr = SNESGetConvergedReasonString(*snes,&tstrreason);
454c4421ceaSFande Kong   *ierr = PetscStrncpy(strreason,tstrreason,len);if (*ierr) return;
455c4421ceaSFande Kong   FIXRETURNCHAR(PETSC_TRUE,strreason,len);
456c4421ceaSFande Kong }
457