xref: /petsc/src/ts/interface/ftn-custom/ztsf.c (revision 2549da8291ea13c3db966e857b93bfee80d6e7e5)
16dd63270SBarry Smith #include <petsc/private/ftnimpl.h>
2c6db04a5SJed Brown #include <petscts.h>
3665c2dedSJed Brown #include <petscviewer.h>
4e2df7a95SSatish Balay 
5e2df7a95SSatish Balay #if defined(PETSC_HAVE_FORTRAN_CAPS)
6b0bc92c6SBarry Smith   #define tsmonitorlgsettransform_      TSMONITORLGSETTRANSFORM
7e2df7a95SSatish Balay   #define tssetrhsfunction_             TSSETRHSFUNCTION
837698f3aSJed Brown   #define tsgetrhsfunction_             TSGETRHSFUNCTION
9e2df7a95SSatish Balay   #define tssetrhsjacobian_             TSSETRHSJACOBIAN
10e2df7a95SSatish Balay   #define tsgetrhsjacobian_             TSGETRHSJACOBIAN
1137698f3aSJed Brown   #define tssetifunction_               TSSETIFUNCTION
1237698f3aSJed Brown   #define tsgetifunction_               TSGETIFUNCTION
1337698f3aSJed Brown   #define tssetijacobian_               TSSETIJACOBIAN
1437698f3aSJed Brown   #define tsgetijacobian_               TSGETIJACOBIAN
15a6570f20SBarry Smith   #define tsmonitorset_                 TSMONITORSET
16*2549da82SBarry Smith   #define tssetrhsjacobianp_            TSSETRHSJACOBIANP
17*2549da82SBarry Smith   #define tsgetrhsjacobianp_            TSGETRHSJACOBIANP
18*2549da82SBarry Smith   #define tssetijacobianp_              TSSETIJACOBIANP
19*2549da82SBarry Smith   #define tsgetijacobianp_              TSGETIJACOBIANP
200e4ef248SJed Brown   #define tscomputerhsfunctionlinear_   TSCOMPUTERHSFUNCTIONLINEAR
210e4ef248SJed Brown   #define tscomputerhsjacobianconstant_ TSCOMPUTERHSJACOBIANCONSTANT
220fecffdcSJed Brown   #define tscomputeifunctionlinear_     TSCOMPUTEIFUNCTIONLINEAR
230fecffdcSJed Brown   #define tscomputeijacobianconstant_   TSCOMPUTEIJACOBIANCONSTANT
24a6570f20SBarry Smith   #define tsmonitordefault_             TSMONITORDEFAULT
25dd7ecb2fSBarry Smith   #define tssetprestep_                 TSSETPRESTEP
26dd7ecb2fSBarry Smith   #define tssetpoststep_                TSSETPOSTSTEP
27e2df7a95SSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
28b0bc92c6SBarry Smith   #define tsmonitorlgsettransform_      tsmonitorlgsettransform
29e2df7a95SSatish Balay   #define tssetrhsfunction_             tssetrhsfunction
3037698f3aSJed Brown   #define tsgetrhsfunction_             tsgetrhsfunction
31e2df7a95SSatish Balay   #define tssetrhsjacobian_             tssetrhsjacobian
32e2df7a95SSatish Balay   #define tsgetrhsjacobian_             tsgetrhsjacobian
3337698f3aSJed Brown   #define tssetifunction_               tssetifunction
3437698f3aSJed Brown   #define tsgetifunction_               tsgetifunction
3537698f3aSJed Brown   #define tssetijacobian_               tssetijacobian
3637698f3aSJed Brown   #define tsgetijacobian_               tsgetijacobian
37*2549da82SBarry Smith   #define tssetijacobianp_              tssetijacobianp
38*2549da82SBarry Smith   #define tsgetijacobianp_              tsgetijacobianp
39*2549da82SBarry Smith   #define tssetrhsjacobianp_            tssetrhsjacobianp
40*2549da82SBarry Smith   #define tsgetrhsjacobianp_            tsgetrhsjacobianp
41a6570f20SBarry Smith   #define tsmonitorset_                 tsmonitorset
420e4ef248SJed Brown   #define tscomputerhsfunctionlinear_   tscomputerhsfunctionlinear
430e4ef248SJed Brown   #define tscomputerhsjacobianconstant_ tscomputerhsjacobianconstant
440fecffdcSJed Brown   #define tscomputeifunctionlinear_     tscomputeifunctionlinear
450fecffdcSJed Brown   #define tscomputeijacobianconstant_   tscomputeijacobianconstant
46a6570f20SBarry Smith   #define tsmonitordefault_             tsmonitordefault
47dd7ecb2fSBarry Smith   #define tssetprestep_                 tssetprestep
48dd7ecb2fSBarry Smith   #define tssetpoststep_                tssetpoststep
49e2df7a95SSatish Balay #endif
50e2df7a95SSatish Balay 
51109c90ceSBarry Smith static struct {
52109c90ceSBarry Smith   PetscFortranCallbackId prestep;
53109c90ceSBarry Smith   PetscFortranCallbackId poststep;
54109c90ceSBarry Smith   PetscFortranCallbackId rhsfunction;
55109c90ceSBarry Smith   PetscFortranCallbackId rhsjacobian;
56109c90ceSBarry Smith   PetscFortranCallbackId ifunction;
57109c90ceSBarry Smith   PetscFortranCallbackId ijacobian;
58*2549da82SBarry Smith   PetscFortranCallbackId rhsjacobianp;
59*2549da82SBarry Smith   PetscFortranCallbackId ijacobianp;
60109c90ceSBarry Smith   PetscFortranCallbackId monitor;
61109c90ceSBarry Smith   PetscFortranCallbackId mondestroy;
62109c90ceSBarry Smith   PetscFortranCallbackId transform;
63109c90ceSBarry Smith #if defined(PETSC_HAVE_F90_2PTR_ARG)
64109c90ceSBarry Smith   PetscFortranCallbackId function_pgiptr;
65109c90ceSBarry Smith #endif
66109c90ceSBarry Smith } _cb;
670fecffdcSJed Brown 
68dd7ecb2fSBarry Smith static PetscErrorCode ourprestep(TS ts)
69dd7ecb2fSBarry Smith {
701ab477f3SBarry Smith #if defined(PETSC_HAVE_F90_2PTR_ARG) && defined(foo)
71109c90ceSBarry Smith   void *ptr;
723ba16761SJacob Faibussowitsch   PetscCall(PetscObjectGetFortranCallback((PetscObject)ts, PETSC_FORTRAN_CALLBACK_CLASS, _cb.function_pgiptr, NULL, &ptr));
73109c90ceSBarry Smith #endif
741ab477f3SBarry Smith   PetscObjectUseFortranCallback(ts, _cb.prestep, (TS *, PetscErrorCode * /* PETSC_F90_2PTR_PROTO_NOVAR */), (&ts, &ierr /* PETSC_F90_2PTR_PARAM(ptr) */));
75dd7ecb2fSBarry Smith }
76dd7ecb2fSBarry Smith static PetscErrorCode ourpoststep(TS ts)
77dd7ecb2fSBarry Smith {
781ab477f3SBarry Smith #if defined(PETSC_HAVE_F90_2PTR_ARG) && defined(foo)
79109c90ceSBarry Smith   void *ptr;
803ba16761SJacob Faibussowitsch   PetscCall(PetscObjectGetFortranCallback((PetscObject)ts, PETSC_FORTRAN_CALLBACK_CLASS, _cb.function_pgiptr, NULL, &ptr));
81109c90ceSBarry Smith #endif
821ab477f3SBarry Smith   PetscObjectUseFortranCallback(ts, _cb.poststep, (TS *, PetscErrorCode * /* PETSC_F90_2PTR_PROTO_NOVAR */), (&ts, &ierr /* PETSC_F90_2PTR_PARAM(ptr) */));
83dd7ecb2fSBarry Smith }
840fecffdcSJed Brown static PetscErrorCode ourrhsfunction(TS ts, PetscReal d, Vec x, Vec f, void *ctx)
85e2df7a95SSatish Balay {
861ab477f3SBarry Smith #if defined(PETSC_HAVE_F90_2PTR_ARG) && defined(foo)
87109c90ceSBarry Smith   void *ptr;
883ba16761SJacob Faibussowitsch   PetscCall(PetscObjectGetFortranCallback((PetscObject)ts, PETSC_FORTRAN_CALLBACK_CLASS, _cb.function_pgiptr, NULL, &ptr));
89109c90ceSBarry Smith #endif
901ab477f3SBarry Smith   PetscObjectUseFortranCallback(ts, _cb.rhsfunction, (TS *, PetscReal *, Vec *, Vec *, void *, PetscErrorCode * /* PETSC_F90_2PTR_PROTO_NOVAR */), (&ts, &d, &x, &f, _ctx, &ierr /* PETSC_F90_2PTR_PARAM(ptr) */));
91e2df7a95SSatish Balay }
920fecffdcSJed Brown static PetscErrorCode ourifunction(TS ts, PetscReal d, Vec x, Vec xdot, Vec f, void *ctx)
93e2df7a95SSatish Balay {
941ab477f3SBarry Smith #if defined(PETSC_HAVE_F90_2PTR_ARG) && defined(foo)
95109c90ceSBarry Smith   void *ptr;
963ba16761SJacob Faibussowitsch   PetscCall(PetscObjectGetFortranCallback((PetscObject)ts, PETSC_FORTRAN_CALLBACK_CLASS, _cb.function_pgiptr, NULL, &ptr));
97109c90ceSBarry Smith #endif
981ab477f3SBarry Smith   PetscObjectUseFortranCallback(ts, _cb.ifunction, (TS *, PetscReal *, Vec *, Vec *, Vec *, void *, PetscErrorCode * /* PETSC_F90_2PTR_PROTO_NOVAR */), (&ts, &d, &x, &xdot, &f, _ctx, &ierr /* PETSC_F90_2PTR_PARAM(ptr) */));
990fecffdcSJed Brown }
100d1e9a80fSBarry Smith static PetscErrorCode ourrhsjacobian(TS ts, PetscReal d, Vec x, Mat m, Mat p, void *ctx)
1010fecffdcSJed Brown {
1021ab477f3SBarry Smith #if defined(PETSC_HAVE_F90_2PTR_ARG) && defined(foo)
103109c90ceSBarry Smith   void *ptr;
1043ba16761SJacob Faibussowitsch   PetscCall(PetscObjectGetFortranCallback((PetscObject)ts, PETSC_FORTRAN_CALLBACK_CLASS, _cb.function_pgiptr, NULL, &ptr));
105109c90ceSBarry Smith #endif
1061ab477f3SBarry Smith   PetscObjectUseFortranCallback(ts, _cb.rhsjacobian, (TS *, PetscReal *, Vec *, Mat *, Mat *, void *, PetscErrorCode * /* PETSC_F90_2PTR_PROTO_NOVAR */), (&ts, &d, &x, &m, &p, _ctx, &ierr /* PETSC_F90_2PTR_PARAM(ptr) */));
1070fecffdcSJed Brown }
108d1e9a80fSBarry Smith static PetscErrorCode ourijacobian(TS ts, PetscReal d, Vec x, Vec xdot, PetscReal shift, Mat m, Mat p, void *ctx)
1090fecffdcSJed Brown {
1101ab477f3SBarry Smith #if defined(PETSC_HAVE_F90_2PTR_ARG) && defined(foo)
111109c90ceSBarry Smith   void *ptr;
1123ba16761SJacob Faibussowitsch   PetscCall(PetscObjectGetFortranCallback((PetscObject)ts, PETSC_FORTRAN_CALLBACK_CLASS, _cb.function_pgiptr, NULL, &ptr));
113109c90ceSBarry Smith #endif
1141ab477f3SBarry Smith   PetscObjectUseFortranCallback(ts, _cb.ijacobian, (TS *, PetscReal *, Vec *, Vec *, PetscReal *, Mat *, Mat *, void *, PetscErrorCode * /* PETSC_F90_2PTR_PROTO_NOVAR */), (&ts, &d, &x, &xdot, &shift, &m, &p, _ctx, &ierr /* PETSC_F90_2PTR_PARAM(ptr) */));
115e2df7a95SSatish Balay }
116*2549da82SBarry Smith static PetscErrorCode ourijacobianp(TS ts, PetscReal d, Vec x, Vec xdot, PetscReal shift, Mat m, void *ctx)
117*2549da82SBarry Smith {
118*2549da82SBarry Smith #if defined(PETSC_HAVE_F90_2PTR_ARG) && defined(foo)
119*2549da82SBarry Smith   void *ptr;
120*2549da82SBarry Smith   PetscCall(PetscObjectGetFortranCallback((PetscObject)ts, PETSC_FORTRAN_CALLBACK_CLASS, _cb.function_pgiptr, NULL, &ptr));
121*2549da82SBarry Smith #endif
122*2549da82SBarry Smith   PetscObjectUseFortranCallback(ts, _cb.ijacobianp, (TS *, PetscReal *, Vec *, Vec *, PetscReal *, Mat *, void *, PetscErrorCode * /* PETSC_F90_2PTR_PROTO_NOVAR */), (&ts, &d, &x, &xdot, &shift, &m, _ctx, &ierr /* PETSC_F90_2PTR_PARAM(ptr) */));
123*2549da82SBarry Smith }
124*2549da82SBarry Smith static PetscErrorCode ourrhsjacobianp(TS ts, PetscReal d, Vec x, Mat m, void *ctx)
125*2549da82SBarry Smith {
126*2549da82SBarry Smith #if defined(PETSC_HAVE_F90_2PTR_ARG) && defined(foo)
127*2549da82SBarry Smith   void *ptr;
128*2549da82SBarry Smith   PetscCall(PetscObjectGetFortranCallback((PetscObject)ts, PETSC_FORTRAN_CALLBACK_CLASS, _cb.function_pgiptr, NULL, &ptr));
129*2549da82SBarry Smith #endif
130*2549da82SBarry Smith   PetscObjectUseFortranCallback(ts, _cb.rhsjacobianp, (TS *, PetscReal *, Vec *, Mat *, void *, PetscErrorCode * /* PETSC_F90_2PTR_PROTO_NOVAR */), (&ts, &d, &x, &m, _ctx, &ierr /* PETSC_F90_2PTR_PARAM(ptr) */));
131*2549da82SBarry Smith }
132e2df7a95SSatish Balay 
133c2efdce3SBarry Smith static PetscErrorCode ourmonitordestroy(void **ctx)
134e2df7a95SSatish Balay {
135109c90ceSBarry Smith   TS ts = (TS)*ctx;
136109c90ceSBarry Smith   PetscObjectUseFortranCallback(ts, _cb.mondestroy, (void *, PetscErrorCode *), (_ctx, &ierr));
137e2df7a95SSatish Balay }
138e2df7a95SSatish Balay 
139e2df7a95SSatish Balay /*
140e2df7a95SSatish Balay    Note ctx is the same as ts so we need to get the Fortran context out of the TS
141e2df7a95SSatish Balay */
1420fecffdcSJed Brown static PetscErrorCode ourmonitor(TS ts, PetscInt i, PetscReal d, Vec v, void *ctx)
143e2df7a95SSatish Balay {
144109c90ceSBarry Smith   PetscObjectUseFortranCallback(ts, _cb.monitor, (TS *, PetscInt *, PetscReal *, Vec *, void *, PetscErrorCode *), (&ts, &i, &d, &v, _ctx, &ierr));
145e2df7a95SSatish Balay }
146e2df7a95SSatish Balay 
147b0bc92c6SBarry Smith /*
148b0bc92c6SBarry Smith    Currently does not handle destroy or context
149b0bc92c6SBarry Smith */
150b0bc92c6SBarry Smith static PetscErrorCode ourtransform(void *ctx, Vec x, Vec *xout)
151b0bc92c6SBarry Smith {
152109c90ceSBarry Smith   PetscObjectUseFortranCallback((TS)ctx, _cb.transform, (void *, Vec *, Vec *, PetscErrorCode *), (_ctx, &x, xout, &ierr));
153b0bc92c6SBarry Smith }
154b0bc92c6SBarry Smith 
15519caf8f3SSatish Balay PETSC_EXTERN void tsmonitorlgsettransform_(TS *ts, void (*f)(void *, Vec *, Vec *, PetscErrorCode *), PetscErrorCode (*d)(void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
156b0bc92c6SBarry Smith {
1575975b3b6SBarry Smith   *ierr = TSMonitorLGSetTransform(*ts, ourtransform, NULL, NULL);
1585975b3b6SBarry Smith   if (*ierr) return;
1598434afd1SBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*ts, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.transform, (PetscVoidFn *)f, ctx);
160b0bc92c6SBarry Smith }
161b0bc92c6SBarry Smith 
16219caf8f3SSatish Balay PETSC_EXTERN void tssetprestep_(TS *ts, PetscErrorCode (*f)(TS *, PetscErrorCode *), PetscErrorCode *ierr)
163dd7ecb2fSBarry Smith {
1645975b3b6SBarry Smith   *ierr = TSSetPreStep(*ts, ourprestep);
1655975b3b6SBarry Smith   if (*ierr) return;
1668434afd1SBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*ts, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.prestep, (PetscVoidFn *)f, NULL);
167dd7ecb2fSBarry Smith }
168dd7ecb2fSBarry Smith 
16919caf8f3SSatish Balay PETSC_EXTERN void tssetpoststep_(TS *ts, PetscErrorCode (*f)(TS *, PetscErrorCode *), PetscErrorCode *ierr)
170dd7ecb2fSBarry Smith {
1715975b3b6SBarry Smith   *ierr = TSSetPostStep(*ts, ourpoststep);
1725975b3b6SBarry Smith   if (*ierr) return;
1738434afd1SBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*ts, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.poststep, (PetscVoidFn *)f, NULL);
174dd7ecb2fSBarry Smith }
175dd7ecb2fSBarry Smith 
17669c1e2abSSatish Balay PETSC_EXTERN void tscomputerhsfunctionlinear_(TS *ts, PetscReal *t, Vec *X, Vec *F, void *ctx, PetscErrorCode *ierr)
1770e4ef248SJed Brown {
1780e4ef248SJed Brown   *ierr = TSComputeRHSFunctionLinear(*ts, *t, *X, *F, ctx);
1790e4ef248SJed Brown }
18019caf8f3SSatish Balay PETSC_EXTERN void tssetrhsfunction_(TS *ts, Vec *r, PetscErrorCode (*f)(TS *, PetscReal *, Vec *, Vec *, void *, PetscErrorCode *), void *fP, PetscErrorCode *ierr)
181e2df7a95SSatish Balay {
1820e4ef248SJed Brown   Vec R;
1830e4ef248SJed Brown   CHKFORTRANNULLOBJECT(r);
1840e4ef248SJed Brown   CHKFORTRANNULLFUNCTION(f);
1850298fd71SBarry Smith   R = r ? *r : (Vec)NULL;
1868434afd1SBarry Smith   if ((PetscVoidFn *)f == (PetscVoidFn *)tscomputerhsfunctionlinear_) {
1870e4ef248SJed Brown     *ierr = TSSetRHSFunction(*ts, R, TSComputeRHSFunctionLinear, fP);
1880e4ef248SJed Brown   } else {
1898434afd1SBarry Smith     *ierr = PetscObjectSetFortranCallback((PetscObject)*ts, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.rhsfunction, (PetscVoidFn *)f, fP);
190109c90ceSBarry Smith     *ierr = TSSetRHSFunction(*ts, R, ourrhsfunction, NULL);
1910fecffdcSJed Brown   }
1920fecffdcSJed Brown }
19319caf8f3SSatish Balay PETSC_EXTERN void tsgetrhsfunction_(TS *ts, Vec *r, void *func, void **ctx, PetscErrorCode *ierr)
19437698f3aSJed Brown {
19537698f3aSJed Brown   CHKFORTRANNULLINTEGER(ctx);
19637698f3aSJed Brown   CHKFORTRANNULLOBJECT(r);
1970298fd71SBarry Smith   *ierr = TSGetRHSFunction(*ts, r, NULL, ctx);
19837698f3aSJed Brown }
1990fecffdcSJed Brown 
200ce78bad3SBarry Smith PETSC_EXTERN void tscomputeifunctionlinear_(TS *ts, PetscReal *t, Vec *X, Vec *Xdot, Vec *F, void *ctx, PetscErrorCode *ierr);
201ce78bad3SBarry Smith 
20219caf8f3SSatish Balay PETSC_EXTERN void tssetifunction_(TS *ts, Vec *r, PetscErrorCode (*f)(TS *, PetscReal *, Vec *, Vec *, Vec *, void *, PetscErrorCode *), void *fP, PetscErrorCode *ierr)
2030fecffdcSJed Brown {
2040fecffdcSJed Brown   Vec R;
2050fecffdcSJed Brown   CHKFORTRANNULLOBJECT(r);
2060fecffdcSJed Brown   CHKFORTRANNULLFUNCTION(f);
2070298fd71SBarry Smith   R = r ? *r : (Vec)NULL;
2088434afd1SBarry Smith   if ((PetscVoidFn *)f == (PetscVoidFn *)tscomputeifunctionlinear_) {
2090fecffdcSJed Brown     *ierr = TSSetIFunction(*ts, R, TSComputeIFunctionLinear, fP);
2100fecffdcSJed Brown   } else {
2118434afd1SBarry Smith     *ierr = PetscObjectSetFortranCallback((PetscObject)*ts, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.ifunction, (PetscVoidFn *)f, fP);
212109c90ceSBarry Smith     *ierr = TSSetIFunction(*ts, R, ourifunction, NULL);
2130e4ef248SJed Brown   }
214e2df7a95SSatish Balay }
21519caf8f3SSatish Balay PETSC_EXTERN void tsgetifunction_(TS *ts, Vec *r, void *func, void **ctx, PetscErrorCode *ierr)
21637698f3aSJed Brown {
21737698f3aSJed Brown   CHKFORTRANNULLINTEGER(ctx);
21837698f3aSJed Brown   CHKFORTRANNULLOBJECT(r);
2190298fd71SBarry Smith   *ierr = TSGetIFunction(*ts, r, NULL, ctx);
22037698f3aSJed Brown }
22126d46c62SHong Zhang 
222e2df7a95SSatish Balay /* ---------------------------------------------------------*/
223d1e9a80fSBarry Smith PETSC_EXTERN void tscomputerhsjacobianconstant_(TS *ts, PetscReal *t, Vec *X, Mat *A, Mat *B, void *ctx, PetscErrorCode *ierr)
2240e4ef248SJed Brown {
225d1e9a80fSBarry Smith   *ierr = TSComputeRHSJacobianConstant(*ts, *t, *X, *A, *B, ctx);
2260e4ef248SJed Brown }
22719caf8f3SSatish Balay PETSC_EXTERN void tssetrhsjacobian_(TS *ts, Mat *A, Mat *B, void (*f)(TS *, PetscReal *, Vec *, Mat *, Mat *, void *, PetscErrorCode *), void *fP, PetscErrorCode *ierr)
228e2df7a95SSatish Balay {
229aecf964fSBarry Smith   CHKFORTRANNULLFUNCTION(f);
2308434afd1SBarry Smith   if ((PetscVoidFn *)f == (PetscVoidFn *)tscomputerhsjacobianconstant_) {
2310e4ef248SJed Brown     *ierr = TSSetRHSJacobian(*ts, *A, *B, TSComputeRHSJacobianConstant, fP);
232e2df7a95SSatish Balay   } else {
2338434afd1SBarry Smith     *ierr = PetscObjectSetFortranCallback((PetscObject)*ts, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.rhsjacobian, (PetscVoidFn *)f, fP);
234109c90ceSBarry Smith     *ierr = TSSetRHSJacobian(*ts, *A, *B, ourrhsjacobian, NULL);
2350fecffdcSJed Brown   }
2360fecffdcSJed Brown }
2370fecffdcSJed Brown 
238ce78bad3SBarry Smith PETSC_EXTERN void tscomputeijacobianconstant_(TS *ts, PetscReal *t, Vec *X, Vec *Xdot, PetscReal *shift, Mat *A, Mat *B, void *ctx, PetscErrorCode *ierr);
239ce78bad3SBarry Smith 
240*2549da82SBarry Smith PETSC_EXTERN void tssetijacobian_(TS *ts, Mat *A, Mat *B, void (*f)(TS *, PetscReal *, Vec *, Vec *, PetscReal, Mat *, Mat *, void *, PetscErrorCode *), void *fP, PetscErrorCode *ierr)
2410fecffdcSJed Brown {
242aecf964fSBarry Smith   CHKFORTRANNULLFUNCTION(f);
2438434afd1SBarry Smith   if ((PetscVoidFn *)f == (PetscVoidFn *)tscomputeijacobianconstant_) {
2440fecffdcSJed Brown     *ierr = TSSetIJacobian(*ts, *A, *B, TSComputeIJacobianConstant, fP);
2450fecffdcSJed Brown   } else {
2468434afd1SBarry Smith     *ierr = PetscObjectSetFortranCallback((PetscObject)*ts, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.ijacobian, (PetscVoidFn *)f, fP);
247109c90ceSBarry Smith     *ierr = TSSetIJacobian(*ts, *A, *B, ourijacobian, NULL);
248e2df7a95SSatish Balay   }
249e2df7a95SSatish Balay }
25019caf8f3SSatish Balay PETSC_EXTERN void tsgetijacobian_(TS *ts, Mat *J, Mat *M, int *func, void **ctx, PetscErrorCode *ierr)
25137698f3aSJed Brown {
25237698f3aSJed Brown   CHKFORTRANNULLINTEGER(ctx);
25337698f3aSJed Brown   CHKFORTRANNULLOBJECT(J);
25437698f3aSJed Brown   CHKFORTRANNULLOBJECT(M);
255dfef5ea7SSatish Balay   *ierr = TSGetIJacobian(*ts, J, M, NULL, ctx);
25637698f3aSJed Brown }
257*2549da82SBarry Smith PETSC_EXTERN void tssetijacobianp_(TS *ts, Mat *A, void (*f)(TS *, PetscReal *, Vec *, Vec *, PetscReal, Mat *, void *, PetscErrorCode *), void *fP, PetscErrorCode *ierr)
258*2549da82SBarry Smith {
259*2549da82SBarry Smith   CHKFORTRANNULLFUNCTION(f);
260*2549da82SBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*ts, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.ijacobianp, (PetscVoidFn *)f, fP);
261*2549da82SBarry Smith   *ierr = TSSetIJacobianP(*ts, *A, ourijacobianp, NULL);
262*2549da82SBarry Smith }
263*2549da82SBarry Smith PETSC_EXTERN void tsgetijacobianp_(TS *ts, Mat *J, int *func, void **ctx, PetscErrorCode *ierr)
264*2549da82SBarry Smith {
265*2549da82SBarry Smith   CHKFORTRANNULLINTEGER(ctx);
266*2549da82SBarry Smith   CHKFORTRANNULLOBJECT(J);
267*2549da82SBarry Smith   *ierr = TSGetIJacobianP(*ts, J, NULL, ctx);
268*2549da82SBarry Smith }
269*2549da82SBarry Smith PETSC_EXTERN void tssetrhsjacobianp_(TS *ts, Mat *A, void (*f)(TS *, PetscReal *, Vec *, Mat *, void *, PetscErrorCode *), void *fP, PetscErrorCode *ierr)
270*2549da82SBarry Smith {
271*2549da82SBarry Smith   CHKFORTRANNULLFUNCTION(f);
272*2549da82SBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*ts, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.rhsjacobianp, (PetscVoidFn *)f, fP);
273*2549da82SBarry Smith   *ierr = TSSetRHSJacobianP(*ts, *A, ourrhsjacobianp, NULL);
274*2549da82SBarry Smith }
275*2549da82SBarry Smith PETSC_EXTERN void tsgetrhsjacobianp_(TS *ts, Mat *J, int *func, void **ctx, PetscErrorCode *ierr)
276*2549da82SBarry Smith {
277*2549da82SBarry Smith   CHKFORTRANNULLINTEGER(ctx);
278*2549da82SBarry Smith   CHKFORTRANNULLOBJECT(J);
279*2549da82SBarry Smith   *ierr = TSGetRHSJacobianP(*ts, J, NULL, ctx);
280*2549da82SBarry Smith }
281e2df7a95SSatish Balay 
282ce78bad3SBarry Smith PETSC_EXTERN void tsmonitordefault_(TS *, PetscInt *, PetscReal *, Vec *, PetscViewerAndFormat **, PetscErrorCode *);
28352f0073cSBarry Smith 
284e2df7a95SSatish Balay /* ---------------------------------------------------------*/
285e2df7a95SSatish Balay 
28619caf8f3SSatish Balay /* PETSC_EXTERN void tsmonitordefault_(TS*,PetscInt*,PetscReal*,Vec*,void*,PetscErrorCode*); */
287e2df7a95SSatish Balay 
28819caf8f3SSatish Balay PETSC_EXTERN void tsmonitorset_(TS *ts, void (*func)(TS *, PetscInt *, PetscReal *, Vec *, void *, PetscErrorCode *), void *mctx, void (*d)(void *, PetscErrorCode *), PetscErrorCode *ierr)
289e2df7a95SSatish Balay {
290aecf964fSBarry Smith   CHKFORTRANNULLFUNCTION(d);
2918434afd1SBarry Smith   if ((PetscVoidFn *)func == (PetscVoidFn *)tsmonitordefault_) {
29249abdd8aSBarry Smith     *ierr = TSMonitorSet(*ts, (PetscErrorCode (*)(TS, PetscInt, PetscReal, Vec, void *))TSMonitorDefault, *(PetscViewerAndFormat **)mctx, (PetscCtxDestroyFn *)PetscViewerAndFormatDestroy);
293e2df7a95SSatish Balay   } else {
2948434afd1SBarry Smith     *ierr = PetscObjectSetFortranCallback((PetscObject)*ts, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.monitor, (PetscVoidFn *)func, mctx);
2958434afd1SBarry Smith     *ierr = PetscObjectSetFortranCallback((PetscObject)*ts, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.mondestroy, (PetscVoidFn *)d, mctx);
296aecf964fSBarry Smith     *ierr = TSMonitorSet(*ts, ourmonitor, *ts, ourmonitordestroy);
297e2df7a95SSatish Balay   }
298e2df7a95SSatish Balay }
299e2df7a95SSatish Balay 
300e2df7a95SSatish Balay /* ---------------------------------------------------------*/
301089b2837SJed Brown /*  func is currently ignored from Fortran */
30219caf8f3SSatish Balay PETSC_EXTERN void tsgetrhsjacobian_(TS *ts, Mat *J, Mat *M, int *func, void **ctx, PetscErrorCode *ierr)
303e2df7a95SSatish Balay {
304dfef5ea7SSatish Balay   *ierr = TSGetRHSJacobian(*ts, J, M, NULL, ctx);
305e2df7a95SSatish Balay }
306