xref: /petsc/src/snes/interface/ftn-custom/zsnesf.c (revision 4e8208cbcbc709572b8abe32f33c78b69c819375)
16dd63270SBarry Smith #include <petsc/private/ftnimpl.h>
2c6db04a5SJed Brown #include <petscsnes.h>
3665c2dedSJed Brown #include <petscviewer.h>
46dd63270SBarry Smith #include <petsc/private/ftnimpl.h>
58e27ec22SSatish Balay 
68e27ec22SSatish Balay #if defined(PETSC_HAVE_FORTRAN_CAPS)
7df2570feSBarry Smith   #define snessetpicard_                   SNESSETPICARD
8f51a5268SBarry Smith   #define snessetpicardnointerface_        SNESSETPICARDNOINTERFACE
96ce558aeSBarry Smith   #define snessolve_                       SNESSOLVE
108d359177SBarry Smith   #define snescomputejacobiandefault_      SNESCOMPUTEJACOBIANDEFAULT
118d359177SBarry Smith   #define snescomputejacobiandefaultcolor_ SNESCOMPUTEJACOBIANDEFAULTCOLOR
128e27ec22SSatish Balay   #define snessetjacobian_                 SNESSETJACOBIAN
13f51a5268SBarry Smith   #define snessetjacobiannointerface_      SNESSETJACOBIANNOINTERFACE
148e27ec22SSatish Balay   #define snessetfunction_                 SNESSETFUNCTION
15f51a5268SBarry Smith   #define snessetfunctionnointerface_      SNESSETFUNCTIONNOINTERFACE
16c00ad2bcSBarry Smith   #define snessetobjective_                SNESSETOBJECTIVE
17f51a5268SBarry Smith   #define snessetobjectivenointerface_     SNESSETOBJECTIVENOINTERFACE
18be95d8f1SBarry Smith   #define snessetngs_                      SNESSETNGS
19dfef22ccSBarry Smith   #define snessetupdate_                   SNESSETUPDATE
208e27ec22SSatish Balay   #define snesgetfunction_                 SNESGETFUNCTION
21be95d8f1SBarry Smith   #define snesgetngs_                      SNESGETNGS
228e27ec22SSatish Balay   #define snessetconvergencetest_          SNESSETCONVERGENCETEST
238d359177SBarry Smith   #define snesconvergeddefault_            SNESCONVERGEDDEFAULT
24e07f7f94SSatish Balay   #define snesconvergedskip_               SNESCONVERGEDSKIP
258e27ec22SSatish Balay   #define snesgetjacobian_                 SNESGETJACOBIAN
26a6570f20SBarry Smith   #define snesmonitordefault_              SNESMONITORDEFAULT
27a6570f20SBarry Smith   #define snesmonitorsolution_             SNESMONITORSOLUTION
28a6570f20SBarry Smith   #define snesmonitorsolutionupdate_       SNESMONITORSOLUTIONUPDATE
29a6570f20SBarry Smith   #define snesmonitorset_                  SNESMONITORSET
30c9368356SGlenn Hammond   #define snesnewtontrsetprecheck_         SNESNEWTONTRSETPRECHECK
313b42469aSBarry Smith   #define snesnewtontrsetpostcheck_        SNESNEWTONTRSETPOSTCHECK
3241ba4c6cSHeeho Park   #define snesnewtontrdcsetprecheck_       SNESNEWTONTRDCSETPRECHECK
3341ba4c6cSHeeho Park   #define snesnewtontrdcsetpostcheck_      SNESNEWTONTRDCSETPOSTCHECK
345d83a8b1SBarry Smith   #define matmffdcomputejacobian_          MATMFFDCOMPUTEJACOBIAN
354e2a09fcSBarry Smith #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
36df2570feSBarry Smith   #define snessetpicard_                   snessetpicard
37f51a5268SBarry Smith   #define snessetpicardnointerface_        snessetpicardnointerface
386ce558aeSBarry Smith   #define snessolve_                       snessolve
398d359177SBarry Smith   #define snescomputejacobiandefault_      snescomputejacobiandefault
408d359177SBarry Smith   #define snescomputejacobiandefaultcolor_ snescomputejacobiandefaultcolor
418e27ec22SSatish Balay   #define snessetjacobian_                 snessetjacobian
42f51a5268SBarry Smith   #define snessetjacobiannointerface_      snessetjacobiannointerface
438e27ec22SSatish Balay   #define snessetfunction_                 snessetfunction
44f51a5268SBarry Smith   #define snessetfunctionnointerface_      snessetfunctionnointerface
45c00ad2bcSBarry Smith   #define snessetobjective_                snessetobjective
46f51a5268SBarry Smith   #define snessetobjectivenointerface_     snessetobjectivenointerface
47be95d8f1SBarry Smith   #define snessetngs_                      snessetngs
48dfef22ccSBarry Smith   #define snessetupdate_                   snessetupdate
498e27ec22SSatish Balay   #define snesgetfunction_                 snesgetfunction
50be95d8f1SBarry Smith   #define snesgetngs_                      snesgetngs
518e27ec22SSatish Balay   #define snessetconvergencetest_          snessetconvergencetest
528d359177SBarry Smith   #define snesconvergeddefault_            snesconvergeddefault
53e07f7f94SSatish Balay   #define snesconvergedskip_               snesconvergedskip
548e27ec22SSatish Balay   #define snesgetjacobian_                 snesgetjacobian
55a6570f20SBarry Smith   #define snesmonitordefault_              snesmonitordefault
56a6570f20SBarry Smith   #define snesmonitorsolution_             snesmonitorsolution
57a6570f20SBarry Smith   #define snesmonitorsolutionupdate_       snesmonitorsolutionupdate
58a6570f20SBarry Smith   #define snesmonitorset_                  snesmonitorset
59c9368356SGlenn Hammond   #define snesnewtontrsetprecheck_         snesnewtontrsetprecheck
603b42469aSBarry Smith   #define snesnewtontrsetpostcheck_        snesnewtontrsetpostcheck
6141ba4c6cSHeeho Park   #define snesnewtontrdcsetprecheck_       snesnewtontrdcsetprecheck
6241ba4c6cSHeeho Park   #define snesnewtontrdcsetpostcheck_      snesnewtontrdcsetpostcheck
635d83a8b1SBarry Smith   #define matmffdcomputejacobian_          matmffdcomputejacobian
648e27ec22SSatish Balay #endif
658e27ec22SSatish Balay 
66f6291634SJed Brown static struct {
67f6291634SJed Brown   PetscFortranCallbackId function;
68c00ad2bcSBarry Smith   PetscFortranCallbackId objective;
69f6291634SJed Brown   PetscFortranCallbackId test;
70f6291634SJed Brown   PetscFortranCallbackId destroy;
71f6291634SJed Brown   PetscFortranCallbackId jacobian;
72f6291634SJed Brown   PetscFortranCallbackId monitor;
73f6291634SJed Brown   PetscFortranCallbackId mondestroy;
74be95d8f1SBarry Smith   PetscFortranCallbackId ngs;
75dfef22ccSBarry Smith   PetscFortranCallbackId update;
76c9368356SGlenn Hammond   PetscFortranCallbackId trprecheck;
777cb011f5SBarry Smith   PetscFortranCallbackId trpostcheck;
7889e00c7dSSatish Balay #if defined(PETSC_HAVE_F90_2PTR_ARG)
7989e00c7dSSatish Balay   PetscFortranCallbackId function_pgiptr;
80c00ad2bcSBarry Smith   PetscFortranCallbackId objective_pgiptr;
81c9368356SGlenn Hammond   PetscFortranCallbackId trprecheck_pgiptr;
823c2ee7eaSBarry Smith   PetscFortranCallbackId trpostcheck_pgiptr;
8389e00c7dSSatish Balay #endif
84f6291634SJed Brown } _cb;
8590b77ac2SPeter Brune 
ourtrprecheckfunction(SNES snes,Vec x,Vec y,PetscBool * changed_y,PetscCtx ctx)86*2a8381b2SBarry Smith static PetscErrorCode ourtrprecheckfunction(SNES snes, Vec x, Vec y, PetscBool *changed_y, PetscCtx ctx)
87c9368356SGlenn Hammond {
88c9368356SGlenn Hammond #if defined(PETSC_HAVE_F90_2PTR_ARG)
89c9368356SGlenn Hammond   void *ptr;
903ba16761SJacob Faibussowitsch   PetscCall(PetscObjectGetFortranCallback((PetscObject)snes, PETSC_FORTRAN_CALLBACK_CLASS, _cb.trprecheck_pgiptr, NULL, &ptr));
91c9368356SGlenn Hammond #endif
92c9368356SGlenn 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)));
93c9368356SGlenn Hammond }
94c9368356SGlenn Hammond 
snesnewtontrsetprecheck_(SNES * snes,void (* func)(SNES,Vec,Vec,PetscBool *,void *),PetscCtx ctx,PetscErrorCode * ierr PETSC_F90_2PTR_PROTO (ptr))95*2a8381b2SBarry Smith PETSC_EXTERN void snesnewtontrsetprecheck_(SNES *snes, void (*func)(SNES, Vec, Vec, PetscBool *, void *), PetscCtx ctx, PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(ptr))
96c9368356SGlenn Hammond {
975ebfa9e9SBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.trprecheck, (PetscFortranCallbackFn *)func, ctx);
983ba16761SJacob Faibussowitsch   if (*ierr) return;
99c9368356SGlenn Hammond #if defined(PETSC_HAVE_F90_2PTR_ARG)
1003ba16761SJacob Faibussowitsch   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.trprecheck_pgiptr, NULL, ptr);
1013ba16761SJacob Faibussowitsch   if (*ierr) return;
102c9368356SGlenn Hammond #endif
1033ba16761SJacob Faibussowitsch   *ierr = SNESNewtonTRSetPreCheck(*snes, ourtrprecheckfunction, NULL);
104c9368356SGlenn Hammond }
105c9368356SGlenn Hammond 
snesnewtontrdcsetprecheck_(SNES * snes,void (* func)(SNES,Vec,Vec,PetscBool *,void *),PetscCtx ctx,PetscErrorCode * ierr PETSC_F90_2PTR_PROTO (ptr))106*2a8381b2SBarry Smith PETSC_EXTERN void snesnewtontrdcsetprecheck_(SNES *snes, void (*func)(SNES, Vec, Vec, PetscBool *, void *), PetscCtx ctx, PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(ptr))
10741ba4c6cSHeeho Park {
1085ebfa9e9SBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.trprecheck, (PetscFortranCallbackFn *)func, ctx);
1093ba16761SJacob Faibussowitsch   if (*ierr) return;
11041ba4c6cSHeeho Park #if defined(PETSC_HAVE_F90_2PTR_ARG)
1113ba16761SJacob Faibussowitsch   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.trprecheck_pgiptr, NULL, ptr);
1123ba16761SJacob Faibussowitsch   if (*ierr) return;
11341ba4c6cSHeeho Park #endif
1143ba16761SJacob Faibussowitsch   *ierr = SNESNewtonTRDCSetPreCheck(*snes, ourtrprecheckfunction, NULL);
11541ba4c6cSHeeho Park }
11641ba4c6cSHeeho Park 
ourtrpostcheckfunction(SNES snes,Vec x,Vec y,Vec w,PetscBool * changed_y,PetscBool * changed_w,PetscCtx ctx)117*2a8381b2SBarry Smith static PetscErrorCode ourtrpostcheckfunction(SNES snes, Vec x, Vec y, Vec w, PetscBool *changed_y, PetscBool *changed_w, PetscCtx ctx)
1187cb011f5SBarry Smith {
1197cb011f5SBarry Smith #if defined(PETSC_HAVE_F90_2PTR_ARG)
1207cb011f5SBarry Smith   void *ptr;
1213ba16761SJacob Faibussowitsch   PetscCall(PetscObjectGetFortranCallback((PetscObject)snes, PETSC_FORTRAN_CALLBACK_CLASS, _cb.trpostcheck_pgiptr, NULL, &ptr));
1227cb011f5SBarry Smith #endif
123c9368356SGlenn 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)));
1247cb011f5SBarry Smith }
1257cb011f5SBarry Smith 
snesnewtontrsetpostcheck_(SNES * snes,void (* func)(SNES,Vec,Vec,Vec,PetscBool *,PetscBool *,void *),PetscCtx ctx,PetscErrorCode * ierr PETSC_F90_2PTR_PROTO (ptr))126*2a8381b2SBarry Smith PETSC_EXTERN void snesnewtontrsetpostcheck_(SNES *snes, void (*func)(SNES, Vec, Vec, Vec, PetscBool *, PetscBool *, void *), PetscCtx ctx, PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(ptr))
1277cb011f5SBarry Smith {
1285ebfa9e9SBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.trpostcheck, (PetscFortranCallbackFn *)func, ctx);
1293ba16761SJacob Faibussowitsch   if (*ierr) return;
1307cb011f5SBarry Smith #if defined(PETSC_HAVE_F90_2PTR_ARG)
1313ba16761SJacob Faibussowitsch   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.trpostcheck_pgiptr, NULL, ptr);
1323ba16761SJacob Faibussowitsch   if (*ierr) return;
1337cb011f5SBarry Smith #endif
1343ba16761SJacob Faibussowitsch   *ierr = SNESNewtonTRSetPostCheck(*snes, ourtrpostcheckfunction, NULL);
1357cb011f5SBarry Smith }
1367cb011f5SBarry Smith 
snesnewtontrdcsetpostcheck_(SNES * snes,void (* func)(SNES,Vec,Vec,Vec,PetscBool *,PetscBool *,void *),PetscCtx ctx,PetscErrorCode * ierr PETSC_F90_2PTR_PROTO (ptr))137*2a8381b2SBarry Smith PETSC_EXTERN void snesnewtontrdcsetpostcheck_(SNES *snes, void (*func)(SNES, Vec, Vec, Vec, PetscBool *, PetscBool *, void *), PetscCtx ctx, PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(ptr))
13841ba4c6cSHeeho Park {
1395ebfa9e9SBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.trpostcheck, (PetscFortranCallbackFn *)func, ctx);
1403ba16761SJacob Faibussowitsch   if (*ierr) return;
14141ba4c6cSHeeho Park #if defined(PETSC_HAVE_F90_2PTR_ARG)
1423ba16761SJacob Faibussowitsch   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.trpostcheck_pgiptr, NULL, ptr);
1433ba16761SJacob Faibussowitsch   if (*ierr) return;
14441ba4c6cSHeeho Park #endif
1453ba16761SJacob Faibussowitsch   *ierr = SNESNewtonTRDCSetPostCheck(*snes, ourtrpostcheckfunction, NULL);
14641ba4c6cSHeeho Park }
14741ba4c6cSHeeho Park 
oursnesfunction(SNES snes,Vec x,Vec f,PetscCtx ctx)148*2a8381b2SBarry Smith static PetscErrorCode oursnesfunction(SNES snes, Vec x, Vec f, PetscCtx ctx)
1498e27ec22SSatish Balay {
15089e00c7dSSatish Balay #if defined(PETSC_HAVE_F90_2PTR_ARG)
15189e00c7dSSatish Balay   void *ptr;
1523ba16761SJacob Faibussowitsch   PetscCall(PetscObjectGetFortranCallback((PetscObject)snes, PETSC_FORTRAN_CALLBACK_CLASS, _cb.function_pgiptr, NULL, &ptr));
15389e00c7dSSatish Balay #endif
15489e00c7dSSatish 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)));
1558e27ec22SSatish Balay }
156b8ebb45fSBarry Smith 
oursnesobjective(SNES snes,Vec x,PetscReal * v,PetscCtx ctx)157*2a8381b2SBarry Smith static PetscErrorCode oursnesobjective(SNES snes, Vec x, PetscReal *v, PetscCtx ctx)
158c00ad2bcSBarry Smith {
159c00ad2bcSBarry Smith #if defined(PETSC_HAVE_F90_2PTR_ARG)
160c00ad2bcSBarry Smith   void *ptr;
161c00ad2bcSBarry Smith   PetscCall(PetscObjectGetFortranCallback((PetscObject)snes, PETSC_FORTRAN_CALLBACK_CLASS, _cb.objective_pgiptr, NULL, &ptr));
162c00ad2bcSBarry Smith #endif
163c00ad2bcSBarry Smith   PetscObjectUseFortranCallback(snes, _cb.objective, (SNES *, Vec *, PetscReal *, void *, PetscErrorCode *PETSC_F90_2PTR_PROTO_NOVAR), (&snes, &x, v, _ctx, &ierr PETSC_F90_2PTR_PARAM(ptr)));
164c00ad2bcSBarry Smith }
165c00ad2bcSBarry Smith 
oursnestest(SNES snes,PetscInt it,PetscReal a,PetscReal d,PetscReal c,SNESConvergedReason * reason,PetscCtx ctx)166*2a8381b2SBarry Smith static PetscErrorCode oursnestest(SNES snes, PetscInt it, PetscReal a, PetscReal d, PetscReal c, SNESConvergedReason *reason, PetscCtx ctx)
1678e27ec22SSatish Balay {
168f6291634SJed Brown   PetscObjectUseFortranCallback(snes, _cb.test, (SNES *, PetscInt *, PetscReal *, PetscReal *, PetscReal *, SNESConvergedReason *, void *, PetscErrorCode *), (&snes, &it, &a, &d, &c, reason, _ctx, &ierr));
1697f7931b9SBarry Smith }
1707f7931b9SBarry Smith 
ourdestroy(PetscCtxRt ctx)171*2a8381b2SBarry Smith static PetscErrorCode ourdestroy(PetscCtxRt ctx)
1727f7931b9SBarry Smith {
173f6291634SJed Brown   PetscObjectUseFortranCallback(ctx, _cb.destroy, (void *, PetscErrorCode *), (_ctx, &ierr));
1748e27ec22SSatish Balay }
1758e27ec22SSatish Balay 
oursnesjacobian(SNES snes,Vec x,Mat m,Mat p,PetscCtx ctx)176*2a8381b2SBarry Smith static PetscErrorCode oursnesjacobian(SNES snes, Vec x, Mat m, Mat p, PetscCtx ctx)
1778e27ec22SSatish Balay {
178d1e9a80fSBarry Smith   PetscObjectUseFortranCallback(snes, _cb.jacobian, (SNES *, Vec *, Mat *, Mat *, void *, PetscErrorCode *), (&snes, &x, &m, &p, _ctx, &ierr));
1798e27ec22SSatish Balay }
180f6291634SJed Brown 
oursnesupdate(SNES snes,PetscInt i)181dfef22ccSBarry Smith static PetscErrorCode oursnesupdate(SNES snes, PetscInt i)
182dfef22ccSBarry Smith {
183dfef22ccSBarry Smith   PetscObjectUseFortranCallback(snes, _cb.update, (SNES *, PetscInt *, PetscErrorCode *), (&snes, &i, &ierr));
184dfef22ccSBarry Smith }
oursnesngs(SNES snes,Vec x,Vec b,PetscCtx ctx)185*2a8381b2SBarry Smith static PetscErrorCode oursnesngs(SNES snes, Vec x, Vec b, PetscCtx ctx)
18690b77ac2SPeter Brune {
187be95d8f1SBarry Smith   PetscObjectUseFortranCallback(snes, _cb.ngs, (SNES *, Vec *, Vec *, void *, PetscErrorCode *), (&snes, &x, &b, _ctx, &ierr));
18890b77ac2SPeter Brune }
oursnesmonitor(SNES snes,PetscInt i,PetscReal d,PetscCtx ctx)189*2a8381b2SBarry Smith static PetscErrorCode oursnesmonitor(SNES snes, PetscInt i, PetscReal d, PetscCtx ctx)
1908e27ec22SSatish Balay {
191f6291634SJed Brown   PetscObjectUseFortranCallback(snes, _cb.monitor, (SNES *, PetscInt *, PetscReal *, void *, PetscErrorCode *), (&snes, &i, &d, _ctx, &ierr));
1928e27ec22SSatish Balay }
ourmondestroy(PetscCtxRt ctx)193*2a8381b2SBarry Smith static PetscErrorCode ourmondestroy(PetscCtxRt ctx)
1948e27ec22SSatish Balay {
195*2a8381b2SBarry Smith   SNES snes = *(SNES *)ctx;
196f6291634SJed Brown   PetscObjectUseFortranCallback(snes, _cb.mondestroy, (void *, PetscErrorCode *), (_ctx, &ierr));
1978e27ec22SSatish Balay }
1988e27ec22SSatish Balay 
1995b669ad3SBarry Smith PETSC_EXTERN void snescomputejacobiandefault_(SNES *, Vec *, Mat *, Mat *, void *, PetscErrorCode *);
2005b669ad3SBarry Smith PETSC_EXTERN void snescomputejacobiandefaultcolor_(SNES *, Vec *, Mat *, Mat *, void *, PetscErrorCode *);
2015b669ad3SBarry Smith PETSC_EXTERN void matmffdcomputejacobian_(SNES *, Vec *, Mat *, Mat *, void *, PetscErrorCode *);
2028e27ec22SSatish Balay 
snessetjacobian_(SNES * snes,Mat * A,Mat * B,void (* func)(SNES *,Vec *,Mat *,Mat *,void *,PetscErrorCode *),PetscCtx ctx,PetscErrorCode * ierr PETSC_F90_2PTR_PROTO (ptr))203*2a8381b2SBarry Smith PETSC_EXTERN void snessetjacobian_(SNES *snes, Mat *A, Mat *B, void (*func)(SNES *, Vec *, Mat *, Mat *, void *, PetscErrorCode *), PetscCtx ctx, PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(ptr))
2048e27ec22SSatish Balay {
205f5b6597dSBarry Smith   CHKFORTRANNULLFUNCTION(func);
2065ebfa9e9SBarry Smith   if (func == snescomputejacobiandefault_) {
2078d359177SBarry Smith     *ierr = SNESSetJacobian(*snes, *A, *B, SNESComputeJacobianDefault, ctx);
2085ebfa9e9SBarry Smith   } else if (func == snescomputejacobiandefaultcolor_) {
209e025ade3SBarry Smith     if (!ctx) {
210e025ade3SBarry Smith       *ierr = PETSC_ERR_ARG_NULL;
211e025ade3SBarry Smith       return;
212e025ade3SBarry Smith     }
2138d359177SBarry Smith     *ierr = SNESSetJacobian(*snes, *A, *B, SNESComputeJacobianDefaultColor, *(MatFDColoring *)ctx);
2145ebfa9e9SBarry Smith   } else if (func == matmffdcomputejacobian_) {
215df66969eSBarry Smith     *ierr = SNESSetJacobian(*snes, *A, *B, MatMFFDComputeJacobian, ctx);
2168e27ec22SSatish Balay   } else {
2175ebfa9e9SBarry Smith     *ierr = PetscObjectSetFortranCallback((PetscObject)*snes, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.jacobian, (PetscFortranCallbackFn *)func, ctx);
2180298fd71SBarry Smith     if (!*ierr) *ierr = SNESSetJacobian(*snes, *A, *B, oursnesjacobian, NULL);
2198e27ec22SSatish Balay   }
2208e27ec22SSatish Balay }
221f51a5268SBarry Smith 
snessetjacobiannointerface_(SNES * snes,Mat * A,Mat * B,void (* func)(SNES *,Vec *,Mat *,Mat *,void *,PetscErrorCode *),PetscCtx ctx,PetscErrorCode * ierr PETSC_F90_2PTR_PROTO (ptr))222*2a8381b2SBarry Smith PETSC_EXTERN void snessetjacobiannointerface_(SNES *snes, Mat *A, Mat *B, void (*func)(SNES *, Vec *, Mat *, Mat *, void *, PetscErrorCode *), PetscCtx ctx, PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(ptr))
22317a42bb7SSatish Balay {
2245ebfa9e9SBarry Smith   snessetjacobian_(snes, A, B, func, ctx, ierr PETSC_F90_2PTR_PARAM(ptr));
22517a42bb7SSatish Balay }
226f51a5268SBarry Smith 
227f51a5268SBarry Smith /*  func is currently ignored from Fortran */
snesgetjacobian_(SNES * snes,Mat * A,Mat * B,int * func,void ** ctx,PetscErrorCode * ierr)228f51a5268SBarry Smith PETSC_EXTERN void snesgetjacobian_(SNES *snes, Mat *A, Mat *B, int *func, void **ctx, PetscErrorCode *ierr)
22917a42bb7SSatish Balay {
230f51a5268SBarry Smith   SNESJacobianFn *jfunc;
231f51a5268SBarry Smith   void           *jctx;
232f51a5268SBarry Smith 
233f51a5268SBarry Smith   CHKFORTRANNULL(ctx);
234f51a5268SBarry Smith   CHKFORTRANNULLOBJECT(A);
235f51a5268SBarry Smith   CHKFORTRANNULLOBJECT(B);
236f51a5268SBarry Smith   *ierr = SNESGetJacobian(*snes, A, B, &jfunc, &jctx);
237f51a5268SBarry Smith   if (*ierr) return;
238f51a5268SBarry Smith   if (jfunc == SNESComputeJacobianDefault || jfunc == SNESComputeJacobianDefaultColor || jfunc == MatMFFDComputeJacobian) {
239f51a5268SBarry Smith     if (ctx) *ctx = jctx;
240f51a5268SBarry Smith   } else {
241f51a5268SBarry Smith     *ierr = PetscObjectGetFortranCallback((PetscObject)*snes, PETSC_FORTRAN_CALLBACK_CLASS, _cb.jacobian, NULL, ctx);
242f51a5268SBarry Smith   }
24317a42bb7SSatish Balay }
244f6dfbefdSBarry Smith 
oursnespicardfunction(SNES snes,Vec x,Vec f,PetscCtx ctx)245*2a8381b2SBarry Smith static PetscErrorCode oursnespicardfunction(SNES snes, Vec x, Vec f, PetscCtx ctx)
246df2570feSBarry Smith {
247df2570feSBarry Smith #if defined(PETSC_HAVE_F90_2PTR_ARG)
248df2570feSBarry Smith   void *ptr;
2493ba16761SJacob Faibussowitsch   PetscCall(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 
oursnespicardjacobian(SNES snes,Vec x,Mat m,Mat p,PetscCtx ctx)254*2a8381b2SBarry Smith static PetscErrorCode oursnespicardjacobian(SNES snes, Vec x, Mat m, Mat p, PetscCtx 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 
snessetpicard_(SNES * snes,Vec * r,void (* func)(SNES,Vec,Vec,void *,PetscErrorCode *),Mat * A,Mat * B,void (* J)(SNES *,Vec *,Mat *,Mat *,void *,PetscErrorCode *),PetscCtx ctx,PetscErrorCode * ierr PETSC_F90_2PTR_PROTO (ptr))259*2a8381b2SBarry Smith PETSC_EXTERN void snessetpicard_(SNES *snes, Vec *r, void (*func)(SNES, Vec, Vec, void *, PetscErrorCode *), Mat *A, Mat *B, void (*J)(SNES *, Vec *, Mat *, Mat *, void *, PetscErrorCode *), PetscCtx ctx, PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(ptr))
260df2570feSBarry Smith {
2615ebfa9e9SBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.function, (PetscFortranCallbackFn *)func, ctx);
262df2570feSBarry Smith #if defined(PETSC_HAVE_F90_2PTR_ARG)
2635975b3b6SBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.function_pgiptr, NULL, ptr);
2645975b3b6SBarry Smith   if (*ierr) return;
265df2570feSBarry Smith #endif
2665ebfa9e9SBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.jacobian, (PetscFortranCallbackFn *)J, ctx);
267df2570feSBarry Smith   if (!*ierr) *ierr = SNESSetPicard(*snes, *r, oursnespicardfunction, *A, *B, oursnespicardjacobian, NULL);
268df2570feSBarry Smith }
2698e27ec22SSatish Balay 
snessetpicardnointerface_(SNES * snes,Vec * r,void (* func)(SNES,Vec,Vec,void *,PetscErrorCode *),Mat * A,Mat * B,void (* J)(SNES *,Vec *,Mat *,Mat *,void *,PetscErrorCode *),PetscCtx ctx,PetscErrorCode * ierr PETSC_F90_2PTR_PROTO (ptr))270*2a8381b2SBarry Smith PETSC_EXTERN void snessetpicardnointerface_(SNES *snes, Vec *r, void (*func)(SNES, Vec, Vec, void *, PetscErrorCode *), Mat *A, Mat *B, void (*J)(SNES *, Vec *, Mat *, Mat *, void *, PetscErrorCode *), PetscCtx ctx, PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(ptr))
271f51a5268SBarry Smith {
272f51a5268SBarry Smith   snessetpicard_(snes, r, func, A, B, J, ctx, ierr PETSC_F90_2PTR_PARAM(ptr));
273f51a5268SBarry Smith }
274f51a5268SBarry Smith 
snessetfunction_(SNES * snes,Vec * r,void (* func)(SNES,Vec,Vec,void *,PetscErrorCode *),PetscCtx ctx,PetscErrorCode * ierr PETSC_F90_2PTR_PROTO (ptr))275*2a8381b2SBarry Smith PETSC_EXTERN void snessetfunction_(SNES *snes, Vec *r, void (*func)(SNES, Vec, Vec, void *, PetscErrorCode *), PetscCtx ctx, PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(ptr))
2768e27ec22SSatish Balay {
2775ebfa9e9SBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.function, (PetscFortranCallbackFn *)func, ctx);
2785975b3b6SBarry Smith   if (*ierr) return;
27989e00c7dSSatish Balay #if defined(PETSC_HAVE_F90_2PTR_ARG)
2805975b3b6SBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.function_pgiptr, NULL, ptr);
2815975b3b6SBarry Smith   if (*ierr) return;
28289e00c7dSSatish Balay #endif
283aecf964fSBarry Smith   *ierr = SNESSetFunction(*snes, *r, oursnesfunction, NULL);
2848e27ec22SSatish Balay }
285c79ef259SPeter Brune 
snessetfunctionnointerface_(SNES * snes,Vec * r,void (* func)(SNES,Vec,Vec,void *,PetscErrorCode *),PetscCtx ctx,PetscErrorCode * ierr PETSC_F90_2PTR_PROTO (ptr))286*2a8381b2SBarry Smith PETSC_EXTERN void snessetfunctionnointerface_(SNES *snes, Vec *r, void (*func)(SNES, Vec, Vec, void *, PetscErrorCode *), PetscCtx ctx, PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(ptr))
287f51a5268SBarry Smith {
288f51a5268SBarry Smith   snessetfunction_(snes, r, func, ctx, ierr PETSC_F90_2PTR_PARAM(ptr));
289f51a5268SBarry Smith }
290f51a5268SBarry Smith 
snessetobjective_(SNES * snes,SNESObjectiveFn func,PetscCtx ctx,PetscErrorCode * ierr PETSC_F90_2PTR_PROTO (ptr))291*2a8381b2SBarry Smith PETSC_EXTERN void snessetobjective_(SNES *snes, SNESObjectiveFn func, PetscCtx ctx, PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(ptr))
292c00ad2bcSBarry Smith {
2935ebfa9e9SBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.objective, (PetscFortranCallbackFn *)func, ctx);
294c00ad2bcSBarry Smith   if (*ierr) return;
295c00ad2bcSBarry Smith #if defined(PETSC_HAVE_F90_2PTR_ARG)
296c00ad2bcSBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.objective_pgiptr, NULL, ptr);
297c00ad2bcSBarry Smith   if (*ierr) return;
298c00ad2bcSBarry Smith #endif
299c00ad2bcSBarry Smith   *ierr = SNESSetObjective(*snes, oursnesobjective, NULL);
300c00ad2bcSBarry Smith }
301c00ad2bcSBarry Smith 
snessetobjectivenointerface_(SNES * snes,SNESObjectiveFn func,PetscCtx ctx,PetscErrorCode * ierr PETSC_F90_2PTR_PROTO (ptr))302*2a8381b2SBarry Smith PETSC_EXTERN void snessetobjectivenointerface_(SNES *snes, SNESObjectiveFn func, PetscCtx ctx, PetscErrorCode *ierr PETSC_F90_2PTR_PROTO(ptr))
303f51a5268SBarry Smith {
304f51a5268SBarry Smith   snessetobjective_(snes, func, ctx, ierr PETSC_F90_2PTR_PARAM(ptr));
305f51a5268SBarry Smith }
306f51a5268SBarry Smith 
snessetngs_(SNES * snes,void (* func)(SNES *,Vec *,Vec *,void *,PetscErrorCode *),PetscCtx ctx,PetscErrorCode * ierr)307*2a8381b2SBarry Smith PETSC_EXTERN void snessetngs_(SNES *snes, void (*func)(SNES *, Vec *, Vec *, void *, PetscErrorCode *), PetscCtx ctx, PetscErrorCode *ierr)
308c79ef259SPeter Brune {
3095ebfa9e9SBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.ngs, (PetscFortranCallbackFn *)func, ctx);
3105975b3b6SBarry Smith   if (*ierr) return;
311aecf964fSBarry Smith   *ierr = SNESSetNGS(*snes, oursnesngs, NULL);
312c79ef259SPeter Brune }
snessetupdate_(SNES * snes,void (* func)(SNES *,PetscInt *,PetscErrorCode *),PetscErrorCode * ierr)31319caf8f3SSatish Balay PETSC_EXTERN void snessetupdate_(SNES *snes, void (*func)(SNES *, PetscInt *, PetscErrorCode *), PetscErrorCode *ierr)
314dfef22ccSBarry Smith {
3155ebfa9e9SBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*snes, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.update, (PetscFortranCallbackFn *)func, NULL);
3165975b3b6SBarry Smith   if (*ierr) return;
317aecf964fSBarry Smith   *ierr = SNESSetUpdate(*snes, oursnesupdate);
318dfef22ccSBarry Smith }
3198e27ec22SSatish Balay 
3208e27ec22SSatish Balay /* the func argument is ignored */
snesgetfunction_(SNES * snes,Vec * r,void (* func)(SNES,Vec,Vec,void *,PetscErrorCode *),void ** ctx,PetscErrorCode * ierr)3215ebfa9e9SBarry Smith PETSC_EXTERN void snesgetfunction_(SNES *snes, Vec *r, void (*func)(SNES, Vec, Vec, void *, PetscErrorCode *), void **ctx, PetscErrorCode *ierr)
3228e27ec22SSatish Balay {
3238e27ec22SSatish Balay   CHKFORTRANNULLOBJECT(r);
3245975b3b6SBarry Smith   *ierr = SNESGetFunction(*snes, r, NULL, NULL);
3255975b3b6SBarry Smith   if (*ierr) return;
3265ebfa9e9SBarry Smith   if ((PetscFortranCallbackFn *)func == (PetscFortranCallbackFn *)PETSC_NULL_FUNCTION_Fortran) return;
3270298fd71SBarry Smith   *ierr = PetscObjectGetFortranCallback((PetscObject)*snes, PETSC_FORTRAN_CALLBACK_CLASS, _cb.function, NULL, ctx);
3288e27ec22SSatish Balay }
329c79ef259SPeter Brune 
snesgetngs_(SNES * snes,void * func,void ** ctx,PetscErrorCode * ierr)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 
335ce78bad3SBarry Smith PETSC_EXTERN void snesconvergeddefault_(SNES *, PetscInt *, PetscReal *, PetscReal *, PetscReal *, SNESConvergedReason *, void *, PetscErrorCode *);
3365ebfa9e9SBarry Smith PETSC_EXTERN void snesconvergedskip_(SNES *, PetscInt *, PetscReal *, PetscReal *, PetscReal *, SNESConvergedReason *, void *, PetscErrorCode *);
3373f149594SLisandro Dalcin 
snessetconvergencetest_(SNES * snes,void (* func)(SNES *,PetscInt *,PetscReal *,PetscReal *,PetscReal *,SNESConvergedReason *,void *,PetscErrorCode *),void * cctx,PetscCtxDestroyFn * destroy,PetscErrorCode * ierr)33812651944SBarry Smith PETSC_EXTERN void snessetconvergencetest_(SNES *snes, void (*func)(SNES *, PetscInt *, PetscReal *, PetscReal *, PetscReal *, SNESConvergedReason *, void *, PetscErrorCode *), void *cctx, PetscCtxDestroyFn *destroy, PetscErrorCode *ierr)
3398e27ec22SSatish Balay {
3403f22127dSBarry Smith   CHKFORTRANNULLFUNCTION(destroy);
3413f149594SLisandro Dalcin 
3425ebfa9e9SBarry Smith   if (func == snesconvergeddefault_) {
343dfef5ea7SSatish Balay     *ierr = SNESSetConvergenceTest(*snes, SNESConvergedDefault, NULL, NULL);
3445ebfa9e9SBarry Smith   } else if (func == snesconvergedskip_) {
345dfef5ea7SSatish Balay     *ierr = SNESSetConvergenceTest(*snes, SNESConvergedSkip, NULL, NULL);
3468e27ec22SSatish Balay   } else {
3475ebfa9e9SBarry Smith     *ierr = PetscObjectSetFortranCallback((PetscObject)*snes, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.test, (PetscFortranCallbackFn *)func, cctx);
3485975b3b6SBarry Smith     if (*ierr) return;
34912651944SBarry Smith     if (destroy) {
3505ebfa9e9SBarry Smith       *ierr = PetscObjectSetFortranCallback((PetscObject)*snes, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.destroy, (PetscFortranCallbackFn *)destroy, cctx);
3515975b3b6SBarry Smith       if (*ierr) return;
352aecf964fSBarry Smith       *ierr = SNESSetConvergenceTest(*snes, oursnestest, *snes, ourdestroy);
35312651944SBarry Smith     } else *ierr = SNESSetConvergenceTest(*snes, oursnestest, *snes, NULL);
3548e27ec22SSatish Balay   }
3558e27ec22SSatish Balay }
3568e27ec22SSatish Balay 
357ce78bad3SBarry Smith PETSC_EXTERN void snesmonitordefault_(SNES *, PetscInt *, PetscReal *, PetscViewerAndFormat **, PetscErrorCode *);
3588e27ec22SSatish Balay 
359ce78bad3SBarry Smith PETSC_EXTERN void snesmonitorsolution_(SNES *snes, PetscInt *its, PetscReal *fgnorm, PetscViewerAndFormat **dummy, PetscErrorCode *ierr);
3608e27ec22SSatish Balay 
361ce78bad3SBarry Smith PETSC_EXTERN void snesmonitorsolutionupdate_(SNES *snes, PetscInt *its, PetscReal *fgnorm, PetscViewerAndFormat **dummy, PetscErrorCode *ierr);
3628e27ec22SSatish Balay 
snesmonitorset_(SNES * snes,void (* func)(SNES *,PetscInt *,PetscReal *,void *,PetscErrorCode *),void * mctx,void (* mondestroy)(void *,PetscErrorCode *),PetscErrorCode * ierr)36319caf8f3SSatish Balay PETSC_EXTERN void snesmonitorset_(SNES *snes, void (*func)(SNES *, PetscInt *, PetscReal *, void *, PetscErrorCode *), void *mctx, void (*mondestroy)(void *, PetscErrorCode *), PetscErrorCode *ierr)
3648e27ec22SSatish Balay {
365aecf964fSBarry Smith   CHKFORTRANNULLFUNCTION(mondestroy);
3665ebfa9e9SBarry Smith   if ((PetscFortranCallbackFn *)func == (PetscFortranCallbackFn *)snesmonitordefault_) {
36749abdd8aSBarry Smith     *ierr = SNESMonitorSet(*snes, (PetscErrorCode (*)(SNES, PetscInt, PetscReal, void *))SNESMonitorDefault, *(PetscViewerAndFormat **)mctx, (PetscCtxDestroyFn *)PetscViewerAndFormatDestroy);
3685ebfa9e9SBarry Smith   } else if ((PetscFortranCallbackFn *)func == (PetscFortranCallbackFn *)snesmonitorsolution_) {
36949abdd8aSBarry Smith     *ierr = SNESMonitorSet(*snes, (PetscErrorCode (*)(SNES, PetscInt, PetscReal, void *))SNESMonitorSolution, *(PetscViewerAndFormat **)mctx, (PetscCtxDestroyFn *)PetscViewerAndFormatDestroy);
3705ebfa9e9SBarry Smith   } else if ((PetscFortranCallbackFn *)func == (PetscFortranCallbackFn *)snesmonitorsolutionupdate_) {
37149abdd8aSBarry Smith     *ierr = SNESMonitorSet(*snes, (PetscErrorCode (*)(SNES, PetscInt, PetscReal, void *))SNESMonitorSolutionUpdate, *(PetscViewerAndFormat **)mctx, (PetscCtxDestroyFn *)PetscViewerAndFormatDestroy);
3728e27ec22SSatish Balay   } else {
3735ebfa9e9SBarry Smith     *ierr = PetscObjectSetFortranCallback((PetscObject)*snes, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.monitor, (PetscFortranCallbackFn *)func, mctx);
3745975b3b6SBarry Smith     if (*ierr) return;
3755ebfa9e9SBarry Smith     *ierr = PetscObjectSetFortranCallback((PetscObject)*snes, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.mondestroy, (PetscFortranCallbackFn *)mondestroy, mctx);
3765975b3b6SBarry Smith     if (*ierr) return;
377aecf964fSBarry Smith     *ierr = SNESMonitorSet(*snes, oursnesmonitor, *snes, ourmondestroy);
3788e27ec22SSatish Balay   }
3798e27ec22SSatish Balay }
380