xref: /petsc/src/snes/interface/ftn-custom/zsnesf.c (revision 3ba1676111f5c958fe6c2729b46ca4d523958bb3)
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;
102*3ba16761SJacob Faibussowitsch   PetscCall(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 {
109*3ba16761SJacob Faibussowitsch   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.trprecheck, (PetscVoidFunction)func, ctx);
110*3ba16761SJacob Faibussowitsch   if (*ierr) return;
111c9368356SGlenn Hammond #if defined(PETSC_HAVE_F90_2PTR_ARG)
112*3ba16761SJacob Faibussowitsch   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.trprecheck_pgiptr, NULL, ptr);
113*3ba16761SJacob Faibussowitsch   if (*ierr) return;
114c9368356SGlenn Hammond #endif
115*3ba16761SJacob Faibussowitsch   *ierr = SNESNewtonTRSetPreCheck(*snes, ourtrprecheckfunction, NULL);
116c9368356SGlenn Hammond }
117c9368356SGlenn Hammond 
11841ba4c6cSHeeho Park PETSC_EXTERN void snesnewtontrdcsetprecheck_(SNES *snes, void (*func)(SNES, Vec, Vec, PetscBool *, void *), void *ctx, PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(ptr))
11941ba4c6cSHeeho Park {
120*3ba16761SJacob Faibussowitsch   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.trprecheck, (PetscVoidFunction)func, ctx);
121*3ba16761SJacob Faibussowitsch   if (*ierr) return;
12241ba4c6cSHeeho Park #if defined(PETSC_HAVE_F90_2PTR_ARG)
123*3ba16761SJacob Faibussowitsch   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.trprecheck_pgiptr, NULL, ptr);
124*3ba16761SJacob Faibussowitsch   if (*ierr) return;
12541ba4c6cSHeeho Park #endif
126*3ba16761SJacob Faibussowitsch   *ierr = SNESNewtonTRDCSetPreCheck(*snes, ourtrprecheckfunction, NULL);
12741ba4c6cSHeeho Park }
12841ba4c6cSHeeho Park 
129c9368356SGlenn Hammond static PetscErrorCode ourtrpostcheckfunction(SNES snes, Vec x, Vec y, Vec w, PetscBool *changed_y, PetscBool *changed_w, void *ctx)
1307cb011f5SBarry Smith {
1317cb011f5SBarry Smith #if defined(PETSC_HAVE_F90_2PTR_ARG)
1327cb011f5SBarry Smith   void *ptr;
133*3ba16761SJacob Faibussowitsch   PetscCall(PetscObjectGetFortranCallback((PetscObject)snes, PETSC_FORTRAN_CALLBACK_CLASS, _cb.trpostcheck_pgiptr, NULL, &ptr));
1347cb011f5SBarry Smith #endif
135c9368356SGlenn 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)));
1367cb011f5SBarry Smith }
1377cb011f5SBarry Smith 
13819caf8f3SSatish 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))
1397cb011f5SBarry Smith {
140*3ba16761SJacob Faibussowitsch   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.trpostcheck, (PetscVoidFunction)func, ctx);
141*3ba16761SJacob Faibussowitsch   if (*ierr) return;
1427cb011f5SBarry Smith #if defined(PETSC_HAVE_F90_2PTR_ARG)
143*3ba16761SJacob Faibussowitsch   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.trpostcheck_pgiptr, NULL, ptr);
144*3ba16761SJacob Faibussowitsch   if (*ierr) return;
1457cb011f5SBarry Smith #endif
146*3ba16761SJacob Faibussowitsch   *ierr = SNESNewtonTRSetPostCheck(*snes, ourtrpostcheckfunction, NULL);
1477cb011f5SBarry Smith }
1487cb011f5SBarry Smith 
14941ba4c6cSHeeho 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))
15041ba4c6cSHeeho Park {
151*3ba16761SJacob Faibussowitsch   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.trpostcheck, (PetscVoidFunction)func, ctx);
152*3ba16761SJacob Faibussowitsch   if (*ierr) return;
15341ba4c6cSHeeho Park #if defined(PETSC_HAVE_F90_2PTR_ARG)
154*3ba16761SJacob Faibussowitsch   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.trpostcheck_pgiptr, NULL, ptr);
155*3ba16761SJacob Faibussowitsch   if (*ierr) return;
15641ba4c6cSHeeho Park #endif
157*3ba16761SJacob Faibussowitsch   *ierr = SNESNewtonTRDCSetPostCheck(*snes, ourtrpostcheckfunction, NULL);
15841ba4c6cSHeeho Park }
15941ba4c6cSHeeho Park 
1608e27ec22SSatish Balay static PetscErrorCode oursnesfunction(SNES snes, Vec x, Vec f, void *ctx)
1618e27ec22SSatish Balay {
16289e00c7dSSatish Balay #if defined(PETSC_HAVE_F90_2PTR_ARG)
16389e00c7dSSatish Balay   void *ptr;
164*3ba16761SJacob Faibussowitsch   PetscCall(PetscObjectGetFortranCallback((PetscObject)snes, PETSC_FORTRAN_CALLBACK_CLASS, _cb.function_pgiptr, NULL, &ptr));
16589e00c7dSSatish Balay #endif
16689e00c7dSSatish 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)));
1678e27ec22SSatish Balay }
168b8ebb45fSBarry Smith 
16906ee9f85SBarry Smith static PetscErrorCode oursnestest(SNES snes,PetscInt it,PetscReal a,PetscReal d,PetscReal c,SNESConvergedReason *reason,void *ctx)
1708e27ec22SSatish Balay {
171f6291634SJed Brown   PetscObjectUseFortranCallback(snes,_cb.test,(SNES*,PetscInt*,PetscReal*,PetscReal*,PetscReal*,SNESConvergedReason*,void*,PetscErrorCode*),(&snes,&it,&a,&d,&c,reason,_ctx,&ierr));
1727f7931b9SBarry Smith }
1737f7931b9SBarry Smith 
1747f7931b9SBarry Smith static PetscErrorCode ourdestroy(void *ctx)
1757f7931b9SBarry Smith {
176f6291634SJed Brown   PetscObjectUseFortranCallback(ctx,_cb.destroy,(void*,PetscErrorCode*),(_ctx,&ierr));
1778e27ec22SSatish Balay }
1788e27ec22SSatish Balay 
179d1e9a80fSBarry Smith static PetscErrorCode oursnesjacobian(SNES snes,Vec x,Mat m,Mat p,void *ctx)
1808e27ec22SSatish Balay {
181d1e9a80fSBarry Smith   PetscObjectUseFortranCallback(snes,_cb.jacobian,(SNES*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),(&snes,&x,&m,&p,_ctx,&ierr));
1828e27ec22SSatish Balay }
183f6291634SJed Brown 
184dfef22ccSBarry Smith static PetscErrorCode oursnesupdate(SNES snes,PetscInt i)
185dfef22ccSBarry Smith {
186dfef22ccSBarry Smith   PetscObjectUseFortranCallback(snes,_cb.update,(SNES*,PetscInt *,PetscErrorCode*),(&snes,&i,&ierr));
187dfef22ccSBarry Smith }
188be95d8f1SBarry Smith static PetscErrorCode oursnesngs(SNES snes,Vec x,Vec b,void *ctx)
18990b77ac2SPeter Brune {
190be95d8f1SBarry Smith   PetscObjectUseFortranCallback(snes,_cb.ngs,(SNES*,Vec*,Vec*,void*,PetscErrorCode*),(&snes,&x,&b,_ctx,&ierr));
19190b77ac2SPeter Brune }
1928e27ec22SSatish Balay static PetscErrorCode oursnesmonitor(SNES snes,PetscInt i,PetscReal d,void *ctx)
1938e27ec22SSatish Balay {
194f6291634SJed Brown   PetscObjectUseFortranCallback(snes,_cb.monitor,(SNES*,PetscInt*,PetscReal*,void*,PetscErrorCode*),(&snes,&i,&d,_ctx,&ierr));
1958e27ec22SSatish Balay }
196c2efdce3SBarry Smith static PetscErrorCode ourmondestroy(void **ctx)
1978e27ec22SSatish Balay {
198f6291634SJed Brown   SNES snes = (SNES)*ctx;
199f6291634SJed Brown   PetscObjectUseFortranCallback(snes,_cb.mondestroy,(void*,PetscErrorCode*),(_ctx,&ierr));
2008e27ec22SSatish Balay }
2018e27ec22SSatish Balay 
2028e27ec22SSatish Balay /*
2038d359177SBarry Smith      snescomputejacobiandefault() and snescomputejacobiandefaultcolor()
2048e27ec22SSatish Balay   These can be used directly from Fortran but are mostly so that
2058e27ec22SSatish Balay   Fortran SNESSetJacobian() will properly handle the defaults being passed in.
2068e27ec22SSatish Balay */
207d1e9a80fSBarry Smith PETSC_EXTERN void matmffdcomputejacobian_(SNES *snes,Vec *x,Mat *m,Mat *p,void *ctx,PetscErrorCode *ierr)
208df66969eSBarry Smith {
209d1e9a80fSBarry Smith   *ierr = MatMFFDComputeJacobian(*snes,*x,*m,*p,ctx);
210df66969eSBarry Smith }
211d1e9a80fSBarry Smith PETSC_EXTERN void snescomputejacobiandefault_(SNES *snes,Vec *x,Mat *m,Mat *p,void *ctx,PetscErrorCode *ierr)
2128e27ec22SSatish Balay {
213d1e9a80fSBarry Smith   *ierr = SNESComputeJacobianDefault(*snes,*x,*m,*p,ctx);
2148e27ec22SSatish Balay }
215d1e9a80fSBarry Smith PETSC_EXTERN void  snescomputejacobiandefaultcolor_(SNES *snes,Vec *x,Mat *m,Mat *p,void *ctx,PetscErrorCode *ierr)
2168e27ec22SSatish Balay {
217d1e9a80fSBarry Smith   *ierr = SNESComputeJacobianDefaultColor(*snes,*x,*m,*p,*(MatFDColoring*)ctx);
2188e27ec22SSatish Balay }
2198e27ec22SSatish Balay 
22019caf8f3SSatish Balay PETSC_EXTERN void snessetjacobian_(SNES *snes,Mat *A,Mat *B,
22119caf8f3SSatish Balay                                     void (*func)(SNES*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),
222f5af7f23SKarl Rupp                                     void *ctx,PetscErrorCode *ierr)
2238e27ec22SSatish Balay {
224f5b6597dSBarry Smith   CHKFORTRANNULLFUNCTION(func);
2258d359177SBarry Smith   if ((PetscVoidFunction)func == (PetscVoidFunction)snescomputejacobiandefault_) {
2268d359177SBarry Smith     *ierr = SNESSetJacobian(*snes,*A,*B,SNESComputeJacobianDefault,ctx);
2278d359177SBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snescomputejacobiandefaultcolor_) {
228e025ade3SBarry Smith     if (!ctx) {
229e025ade3SBarry Smith       *ierr = PETSC_ERR_ARG_NULL;
230e025ade3SBarry Smith       return;
231e025ade3SBarry Smith     }
2328d359177SBarry Smith     *ierr = SNESSetJacobian(*snes,*A,*B,SNESComputeJacobianDefaultColor,*(MatFDColoring*)ctx);
233df66969eSBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)matmffdcomputejacobian_) {
234df66969eSBarry Smith     *ierr = SNESSetJacobian(*snes,*A,*B,MatMFFDComputeJacobian,ctx);
2358e27ec22SSatish Balay   } else {
236f6291634SJed Brown     *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.jacobian,(PetscVoidFunction)func,ctx);
2370298fd71SBarry Smith     if (!*ierr) *ierr = SNESSetJacobian(*snes,*A,*B,oursnesjacobian,NULL);
2388e27ec22SSatish Balay   }
2398e27ec22SSatish Balay }
24017a42bb7SSatish Balay PETSC_EXTERN void snessetjacobian1_(SNES *snes,Mat *A,Mat *B,
24117a42bb7SSatish Balay                                     void (*func)(SNES*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),
24217a42bb7SSatish Balay                                     void *ctx,PetscErrorCode *ierr)
24317a42bb7SSatish Balay {
24417a42bb7SSatish Balay   snessetjacobian_(snes,A,B,func,ctx,ierr);
24517a42bb7SSatish Balay }
24617a42bb7SSatish Balay PETSC_EXTERN void snessetjacobian2_(SNES *snes,Mat *A,Mat *B,
24717a42bb7SSatish Balay                                     void (*func)(SNES*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),
24817a42bb7SSatish Balay                                     void *ctx,PetscErrorCode *ierr)
24917a42bb7SSatish Balay {
25017a42bb7SSatish Balay   snessetjacobian_(snes,A,B,func,ctx,ierr);
25117a42bb7SSatish Balay }
252f6dfbefdSBarry Smith 
253df2570feSBarry Smith static PetscErrorCode oursnespicardfunction(SNES snes, Vec x, Vec f, void *ctx)
254df2570feSBarry Smith {
255df2570feSBarry Smith #if defined(PETSC_HAVE_F90_2PTR_ARG)
256df2570feSBarry Smith   void *ptr;
257*3ba16761SJacob Faibussowitsch   PetscCall(PetscObjectGetFortranCallback((PetscObject)snes, PETSC_FORTRAN_CALLBACK_CLASS, _cb.function_pgiptr, NULL, &ptr));
258df2570feSBarry Smith #endif
259df2570feSBarry 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)));
260df2570feSBarry Smith }
261df2570feSBarry Smith 
262df2570feSBarry Smith static PetscErrorCode oursnespicardjacobian(SNES snes,Vec x,Mat m,Mat p,void *ctx)
263df2570feSBarry Smith {
264df2570feSBarry Smith   PetscObjectUseFortranCallback(snes,_cb.jacobian,(SNES*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),(&snes,&x,&m,&p,_ctx,&ierr));
265df2570feSBarry Smith }
266df2570feSBarry Smith 
267df2570feSBarry Smith PETSC_EXTERN void snessetpicard_(SNES *snes,Vec *r,void (*func)(SNES*,Vec*,Vec *,void*,PetscErrorCode*),Mat *A,Mat *B,
268df2570feSBarry Smith                                  PetscErrorCode (*J)(SNES,Vec,Mat,Mat,void*),void *ctx,PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(ptr))
269df2570feSBarry Smith {
270df2570feSBarry Smith     *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.function,(PetscVoidFunction)func,ctx);
271df2570feSBarry Smith #if defined(PETSC_HAVE_F90_2PTR_ARG)
272df2570feSBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.function_pgiptr,NULL,ptr);if (*ierr) return;
273df2570feSBarry Smith #endif
274df2570feSBarry Smith     *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.jacobian,(PetscVoidFunction)J,ctx);
275df2570feSBarry Smith     if (!*ierr) *ierr = SNESSetPicard(*snes,*r,oursnespicardfunction,*A,*B,oursnespicardjacobian,NULL);
276df2570feSBarry Smith }
2778e27ec22SSatish Balay 
27819caf8f3SSatish Balay PETSC_EXTERN void snesgetoptionsprefix_(SNES *snes,char* prefix,PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len)
2798e27ec22SSatish Balay {
2808e27ec22SSatish Balay   const char *tname;
2818e27ec22SSatish Balay 
2828e27ec22SSatish Balay   *ierr = SNESGetOptionsPrefix(*snes,&tname);
2838e27ec22SSatish Balay   *ierr = PetscStrncpy(prefix,tname,len);if (*ierr) return;
284d6a8cea5SBarry Smith   FIXRETURNCHAR(PETSC_TRUE,prefix,len);
2858e27ec22SSatish Balay }
2868e27ec22SSatish Balay 
28719caf8f3SSatish Balay PETSC_EXTERN void snesgettype_(SNES *snes,char* name, PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len)
2888e27ec22SSatish Balay {
2898e27ec22SSatish Balay   const char *tname;
2908e27ec22SSatish Balay 
2918e27ec22SSatish Balay   *ierr = SNESGetType(*snes,&tname);
2928e27ec22SSatish Balay   *ierr = PetscStrncpy(name,tname,len);if (*ierr) return;
2937c363081SBarry Smith   FIXRETURNCHAR(PETSC_TRUE,name,len);
2948e27ec22SSatish Balay }
295e3da1266SHong Zhang 
2968e27ec22SSatish Balay /*
2978e27ec22SSatish Balay    These are not usually called from Fortran but allow Fortran users
2988e27ec22SSatish Balay    to transparently set these monitors from .F code
2998e27ec22SSatish Balay */
3008e27ec22SSatish Balay 
30119caf8f3SSatish 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))
3028e27ec22SSatish Balay {
303aecf964fSBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.function,(PetscVoidFunction)func,ctx);if (*ierr) return;
30489e00c7dSSatish Balay #if defined(PETSC_HAVE_F90_2PTR_ARG)
305aecf964fSBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.function_pgiptr,NULL,ptr);if (*ierr) return;
30689e00c7dSSatish Balay #endif
307aecf964fSBarry Smith   *ierr = SNESSetFunction(*snes,*r,oursnesfunction,NULL);
3088e27ec22SSatish Balay }
309c79ef259SPeter Brune 
31019caf8f3SSatish Balay PETSC_EXTERN void snessetngs_(SNES *snes,void (*func)(SNES*,Vec*,Vec*,void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr)
311c79ef259SPeter Brune {
312aecf964fSBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.ngs,(PetscVoidFunction)func,ctx);if (*ierr) return;
313aecf964fSBarry Smith   *ierr = SNESSetNGS(*snes,oursnesngs,NULL);
314c79ef259SPeter Brune }
31519caf8f3SSatish Balay PETSC_EXTERN void snessetupdate_(SNES *snes,void (*func)(SNES*,PetscInt*,PetscErrorCode*),PetscErrorCode *ierr)
316dfef22ccSBarry Smith {
317aecf964fSBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.update,(PetscVoidFunction)func,NULL);if (*ierr) return;
318aecf964fSBarry Smith   *ierr = SNESSetUpdate(*snes,oursnesupdate);
319dfef22ccSBarry Smith }
3208e27ec22SSatish Balay 
3218e27ec22SSatish Balay /* the func argument is ignored */
32219caf8f3SSatish Balay PETSC_EXTERN void snesgetfunction_(SNES *snes,Vec *r,void (*func)(SNES,Vec,Vec,void*),void **ctx,PetscErrorCode *ierr)
3238e27ec22SSatish Balay {
3248e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(r);
3250298fd71SBarry Smith   *ierr = SNESGetFunction(*snes,r,NULL,NULL); if (*ierr) return;
326146935d7SSatish Balay   if ((PetscVoidFunction)func == (PetscVoidFunction)PETSC_NULL_FUNCTION_Fortran) return;
3270298fd71SBarry Smith   *ierr = PetscObjectGetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.function,NULL,ctx);
3288e27ec22SSatish Balay }
329c79ef259SPeter Brune 
33019caf8f3SSatish Balay PETSC_EXTERN void snesgetngs_(SNES *snes,void *func,void **ctx,PetscErrorCode *ierr)
331c79ef259SPeter Brune {
332be95d8f1SBarry Smith   *ierr = PetscObjectGetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,_cb.ngs,NULL,ctx);
333c79ef259SPeter Brune }
334c79ef259SPeter Brune 
33569c1e2abSSatish Balay PETSC_EXTERN void snesconvergeddefault_(SNES *snes,PetscInt *it,PetscReal *a,PetscReal *b,PetscReal *c,SNESConvergedReason *r, void *ct,PetscErrorCode *ierr)
3363f149594SLisandro Dalcin {
3378d359177SBarry Smith   *ierr = SNESConvergedDefault(*snes,*it,*a,*b,*c,r,ct);
3383f149594SLisandro Dalcin }
3393f149594SLisandro Dalcin 
340e07f7f94SSatish Balay PETSC_EXTERN void snesconvergedskip_(SNES *snes,PetscInt *it,PetscReal *a,PetscReal *b,PetscReal *c,SNESConvergedReason *r,void *ct,PetscErrorCode *ierr)
3413f149594SLisandro Dalcin {
342e2a6519dSDmitry Karpeev   *ierr = SNESConvergedSkip(*snes,*it,*a,*b,*c,r,ct);
3433f149594SLisandro Dalcin }
3443f149594SLisandro Dalcin 
34519caf8f3SSatish Balay PETSC_EXTERN void snessetconvergencetest_(SNES *snes,void (*func)(SNES*,PetscInt*,PetscReal*,PetscReal*,PetscReal*,SNESConvergedReason*,void*,PetscErrorCode*), void *cctx,void (*destroy)(void*),PetscErrorCode *ierr)
3468e27ec22SSatish Balay {
3473f22127dSBarry Smith   CHKFORTRANNULLFUNCTION(destroy);
3483f149594SLisandro Dalcin 
3498d359177SBarry Smith   if ((PetscVoidFunction)func == (PetscVoidFunction)snesconvergeddefault_) {
3508d359177SBarry Smith     *ierr = SNESSetConvergenceTest(*snes,SNESConvergedDefault,0,0);
351e07f7f94SSatish Balay   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesconvergedskip_) {
352e2a6519dSDmitry Karpeev     *ierr = SNESSetConvergenceTest(*snes,SNESConvergedSkip,0,0);
3538e27ec22SSatish Balay   } else {
354aecf964fSBarry Smith     *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.test,(PetscVoidFunction)func,cctx);if (*ierr) return;
355aecf964fSBarry Smith     *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.destroy,(PetscVoidFunction)destroy,cctx);if (*ierr) return;
356aecf964fSBarry Smith     *ierr = SNESSetConvergenceTest(*snes,oursnestest,*snes,ourdestroy);
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 
41052f0073cSBarry Smith PETSC_EXTERN void snesmonitordefault_(SNES *snes,PetscInt *its,PetscReal *fgnorm,PetscViewerAndFormat **dummy,PetscErrorCode *ierr)
4118e27ec22SSatish Balay {
412410efd14SBarry Smith   *ierr = SNESMonitorDefault(*snes,*its,*fgnorm,*dummy);
4138e27ec22SSatish Balay }
4148e27ec22SSatish Balay 
41552f0073cSBarry Smith PETSC_EXTERN void snesmonitorsolution_(SNES *snes,PetscInt *its,PetscReal *fgnorm,PetscViewerAndFormat **dummy,PetscErrorCode *ierr)
4168e27ec22SSatish Balay {
417410efd14SBarry Smith   *ierr = SNESMonitorSolution(*snes,*its,*fgnorm,*dummy);
4188e27ec22SSatish Balay }
4198e27ec22SSatish Balay 
42052f0073cSBarry Smith PETSC_EXTERN void snesmonitorsolutionupdate_(SNES *snes,PetscInt *its,PetscReal *fgnorm,PetscViewerAndFormat **dummy,PetscErrorCode *ierr)
4218e27ec22SSatish Balay {
422410efd14SBarry Smith   *ierr = SNESMonitorSolutionUpdate(*snes,*its,*fgnorm,*dummy);
4238e27ec22SSatish Balay }
4248e27ec22SSatish Balay 
42519caf8f3SSatish Balay PETSC_EXTERN void snesmonitorset_(SNES *snes,void (*func)(SNES*,PetscInt*,PetscReal*,void*,PetscErrorCode*),void *mctx,void (*mondestroy)(void*,PetscErrorCode*),PetscErrorCode *ierr)
4268e27ec22SSatish Balay {
427aecf964fSBarry Smith   CHKFORTRANNULLFUNCTION(mondestroy);
428a6570f20SBarry Smith   if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitordefault_) {
4291cb03803SBarry Smith     *ierr = SNESMonitorSet(*snes,(PetscErrorCode (*)(SNES,PetscInt,PetscReal,void*))SNESMonitorDefault,*(PetscViewerAndFormat**)mctx,(PetscErrorCode (*)(void **))PetscViewerAndFormatDestroy);
430a6570f20SBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorsolution_) {
4311cb03803SBarry Smith     *ierr = SNESMonitorSet(*snes,(PetscErrorCode (*)(SNES,PetscInt,PetscReal,void*))SNESMonitorSolution,*(PetscViewerAndFormat**)mctx,(PetscErrorCode (*)(void **))PetscViewerAndFormatDestroy);
432a6570f20SBarry Smith   } else if ((PetscVoidFunction)func == (PetscVoidFunction)snesmonitorsolutionupdate_) {
4331cb03803SBarry Smith     *ierr = SNESMonitorSet(*snes,(PetscErrorCode (*)(SNES,PetscInt,PetscReal,void*))SNESMonitorSolutionUpdate,*(PetscViewerAndFormat**)mctx,(PetscErrorCode (*)(void **))PetscViewerAndFormatDestroy);
4348e27ec22SSatish Balay   } else {
435aecf964fSBarry Smith     *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.monitor,(PetscVoidFunction)func,mctx);if (*ierr) return;
436aecf964fSBarry Smith     *ierr = PetscObjectSetFortranCallback((PetscObject)*snes,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.mondestroy,(PetscVoidFunction)mondestroy,mctx);if (*ierr) return;
437aecf964fSBarry Smith     *ierr = SNESMonitorSet(*snes,oursnesmonitor,*snes,ourmondestroy);
4388e27ec22SSatish Balay   }
4398e27ec22SSatish Balay }
4408e27ec22SSatish Balay 
44119caf8f3SSatish Balay PETSC_EXTERN void snesviewfromoptions_(SNES *ao,PetscObject obj,char* type,PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len)
442fe2efc57SMark {
443fe2efc57SMark   char *t;
444fe2efc57SMark 
445fe2efc57SMark   FIXCHAR(type,len,t);
446b14c0cbaSBlaise Bourdin   CHKFORTRANNULLOBJECT(obj);
447fe2efc57SMark   *ierr = SNESViewFromOptions(*ao,obj,t);if (*ierr) return;
448fe2efc57SMark   FREECHAR(type,t);
449fe2efc57SMark }
45091f3e32bSBarry Smith 
45191f3e32bSBarry Smith PETSC_EXTERN void snesconvergedreasonview_(SNES *snes,PetscViewer *viewer, PetscErrorCode *ierr)
45291f3e32bSBarry Smith {
45391f3e32bSBarry Smith   PetscViewer v;
45491f3e32bSBarry Smith   PetscPatchDefaultViewers_Fortran(viewer,v);
45591f3e32bSBarry Smith   *ierr = SNESConvergedReasonView(*snes,v);
45691f3e32bSBarry Smith }
457c4421ceaSFande Kong 
458c4421ceaSFande Kong PETSC_EXTERN void snesgetconvergedreasonstring_(SNES *snes, char* strreason, PetscErrorCode *ierr, PETSC_FORTRAN_CHARLEN_T len)
459c4421ceaSFande Kong {
460c4421ceaSFande Kong   const char *tstrreason;
461c4421ceaSFande Kong   *ierr = SNESGetConvergedReasonString(*snes,&tstrreason);
462c4421ceaSFande Kong   *ierr = PetscStrncpy(strreason,tstrreason,len);if (*ierr) return;
463c4421ceaSFande Kong   FIXRETURNCHAR(PETSC_TRUE,strreason,len);
464c4421ceaSFande Kong }
465