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