xref: /petsc/src/ts/interface/ftn-custom/ztsf.c (revision dfef5ea798a36ccc664ca1bbe435d183ec21e5c1)
1af0996ceSBarry Smith #include <petsc/private/fortranimpl.h>
2c6db04a5SJed Brown #include <petscts.h>
3665c2dedSJed Brown #include <petscviewer.h>
48ad9143bSBarry Smith #include <petsc/private/f90impl.h>
5e2df7a95SSatish Balay 
6e2df7a95SSatish Balay #if defined(PETSC_HAVE_FORTRAN_CAPS)
7b0bc92c6SBarry Smith   #define tsmonitorlgsettransform_      TSMONITORLGSETTRANSFORM
8e2df7a95SSatish Balay   #define tssetrhsfunction_             TSSETRHSFUNCTION
937698f3aSJed Brown   #define tsgetrhsfunction_             TSGETRHSFUNCTION
10e2df7a95SSatish Balay   #define tssetrhsjacobian_             TSSETRHSJACOBIAN
11e2df7a95SSatish Balay   #define tsgetrhsjacobian_             TSGETRHSJACOBIAN
1237698f3aSJed Brown   #define tssetifunction_               TSSETIFUNCTION
1337698f3aSJed Brown   #define tsgetifunction_               TSGETIFUNCTION
1437698f3aSJed Brown   #define tssetijacobian_               TSSETIJACOBIAN
1537698f3aSJed Brown   #define tsgetijacobian_               TSGETIJACOBIAN
16e2df7a95SSatish Balay   #define tsview_                       TSVIEW
1737698f3aSJed Brown   #define tssetoptionsprefix_           TSSETOPTIONSPREFIX
18e2df7a95SSatish Balay   #define tsgetoptionsprefix_           TSGETOPTIONSPREFIX
1937698f3aSJed Brown   #define tsappendoptionsprefix_        TSAPPENDOPTIONSPREFIX
20a6570f20SBarry Smith   #define tsmonitorset_                 TSMONITORSET
210e4ef248SJed Brown   #define tscomputerhsfunctionlinear_   TSCOMPUTERHSFUNCTIONLINEAR
220e4ef248SJed Brown   #define tscomputerhsjacobianconstant_ TSCOMPUTERHSJACOBIANCONSTANT
230fecffdcSJed Brown   #define tscomputeifunctionlinear_     TSCOMPUTEIFUNCTIONLINEAR
240fecffdcSJed Brown   #define tscomputeijacobianconstant_   TSCOMPUTEIJACOBIANCONSTANT
25a6570f20SBarry Smith   #define tsmonitordefault_             TSMONITORDEFAULT
26dd7ecb2fSBarry Smith   #define tssetprestep_                 TSSETPRESTEP
27dd7ecb2fSBarry Smith   #define tssetpoststep_                TSSETPOSTSTEP
28fe2efc57SMark   #define tsviewfromoptions_            TSVIEWFROMOPTIONS
29e2df7a95SSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
30b0bc92c6SBarry Smith   #define tsmonitorlgsettransform_      tsmonitorlgsettransform
31e2df7a95SSatish Balay   #define tssetrhsfunction_             tssetrhsfunction
3237698f3aSJed Brown   #define tsgetrhsfunction_             tsgetrhsfunction
33e2df7a95SSatish Balay   #define tssetrhsjacobian_             tssetrhsjacobian
34e2df7a95SSatish Balay   #define tsgetrhsjacobian_             tsgetrhsjacobian
3537698f3aSJed Brown   #define tssetifunction_               tssetifunction
3637698f3aSJed Brown   #define tsgetifunction_               tsgetifunction
3737698f3aSJed Brown   #define tssetijacobian_               tssetijacobian
3837698f3aSJed Brown   #define tsgetijacobian_               tsgetijacobian
39e2df7a95SSatish Balay   #define tsview_                       tsview
4037698f3aSJed Brown   #define tssetoptionsprefix_           tssetoptionsprefix
41e2df7a95SSatish Balay   #define tsgetoptionsprefix_           tsgetoptionsprefix
4237698f3aSJed Brown   #define tsappendoptionsprefix_        tsappendoptionsprefix
43a6570f20SBarry Smith   #define tsmonitorset_                 tsmonitorset
440e4ef248SJed Brown   #define tscomputerhsfunctionlinear_   tscomputerhsfunctionlinear
450e4ef248SJed Brown   #define tscomputerhsjacobianconstant_ tscomputerhsjacobianconstant
460fecffdcSJed Brown   #define tscomputeifunctionlinear_     tscomputeifunctionlinear
470fecffdcSJed Brown   #define tscomputeijacobianconstant_   tscomputeijacobianconstant
48a6570f20SBarry Smith   #define tsmonitordefault_             tsmonitordefault
49dd7ecb2fSBarry Smith   #define tssetprestep_                 tssetprestep
50dd7ecb2fSBarry Smith   #define tssetpoststep_                tssetpoststep
51fe2efc57SMark   #define tsviewfromoptions_            tsviewfromoptions
52e2df7a95SSatish Balay #endif
53e2df7a95SSatish Balay 
54109c90ceSBarry Smith static struct {
55109c90ceSBarry Smith   PetscFortranCallbackId prestep;
56109c90ceSBarry Smith   PetscFortranCallbackId poststep;
57109c90ceSBarry Smith   PetscFortranCallbackId rhsfunction;
58109c90ceSBarry Smith   PetscFortranCallbackId rhsjacobian;
59109c90ceSBarry Smith   PetscFortranCallbackId ifunction;
60109c90ceSBarry Smith   PetscFortranCallbackId ijacobian;
61109c90ceSBarry Smith   PetscFortranCallbackId monitor;
62109c90ceSBarry Smith   PetscFortranCallbackId mondestroy;
63109c90ceSBarry Smith   PetscFortranCallbackId transform;
64109c90ceSBarry Smith #if defined(PETSC_HAVE_F90_2PTR_ARG)
65109c90ceSBarry Smith   PetscFortranCallbackId function_pgiptr;
66109c90ceSBarry Smith #endif
67109c90ceSBarry Smith } _cb;
680fecffdcSJed Brown 
69dd7ecb2fSBarry Smith static PetscErrorCode ourprestep(TS ts)
70dd7ecb2fSBarry Smith {
711ab477f3SBarry Smith #if defined(PETSC_HAVE_F90_2PTR_ARG) && defined(foo)
72109c90ceSBarry Smith   void *ptr;
733ba16761SJacob Faibussowitsch   PetscCall(PetscObjectGetFortranCallback((PetscObject)ts, PETSC_FORTRAN_CALLBACK_CLASS, _cb.function_pgiptr, NULL, &ptr));
74109c90ceSBarry Smith #endif
751ab477f3SBarry Smith   PetscObjectUseFortranCallback(ts, _cb.prestep, (TS *, PetscErrorCode * /* PETSC_F90_2PTR_PROTO_NOVAR */), (&ts, &ierr /* PETSC_F90_2PTR_PARAM(ptr) */));
76dd7ecb2fSBarry Smith }
77dd7ecb2fSBarry Smith static PetscErrorCode ourpoststep(TS ts)
78dd7ecb2fSBarry Smith {
791ab477f3SBarry Smith #if defined(PETSC_HAVE_F90_2PTR_ARG) && defined(foo)
80109c90ceSBarry Smith   void *ptr;
813ba16761SJacob Faibussowitsch   PetscCall(PetscObjectGetFortranCallback((PetscObject)ts, PETSC_FORTRAN_CALLBACK_CLASS, _cb.function_pgiptr, NULL, &ptr));
82109c90ceSBarry Smith #endif
831ab477f3SBarry Smith   PetscObjectUseFortranCallback(ts, _cb.poststep, (TS *, PetscErrorCode * /* PETSC_F90_2PTR_PROTO_NOVAR */), (&ts, &ierr /* PETSC_F90_2PTR_PARAM(ptr) */));
84dd7ecb2fSBarry Smith }
850fecffdcSJed Brown static PetscErrorCode ourrhsfunction(TS ts, PetscReal d, Vec x, Vec f, void *ctx)
86e2df7a95SSatish Balay {
871ab477f3SBarry Smith #if defined(PETSC_HAVE_F90_2PTR_ARG) && defined(foo)
88109c90ceSBarry Smith   void *ptr;
893ba16761SJacob Faibussowitsch   PetscCall(PetscObjectGetFortranCallback((PetscObject)ts, PETSC_FORTRAN_CALLBACK_CLASS, _cb.function_pgiptr, NULL, &ptr));
90109c90ceSBarry Smith #endif
911ab477f3SBarry 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) */));
92e2df7a95SSatish Balay }
930fecffdcSJed Brown static PetscErrorCode ourifunction(TS ts, PetscReal d, Vec x, Vec xdot, Vec f, void *ctx)
94e2df7a95SSatish Balay {
951ab477f3SBarry Smith #if defined(PETSC_HAVE_F90_2PTR_ARG) && defined(foo)
96109c90ceSBarry Smith   void *ptr;
973ba16761SJacob Faibussowitsch   PetscCall(PetscObjectGetFortranCallback((PetscObject)ts, PETSC_FORTRAN_CALLBACK_CLASS, _cb.function_pgiptr, NULL, &ptr));
98109c90ceSBarry Smith #endif
991ab477f3SBarry 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) */));
1000fecffdcSJed Brown }
101d1e9a80fSBarry Smith static PetscErrorCode ourrhsjacobian(TS ts, PetscReal d, Vec x, Mat m, Mat p, void *ctx)
1020fecffdcSJed Brown {
1031ab477f3SBarry Smith #if defined(PETSC_HAVE_F90_2PTR_ARG) && defined(foo)
104109c90ceSBarry Smith   void *ptr;
1053ba16761SJacob Faibussowitsch   PetscCall(PetscObjectGetFortranCallback((PetscObject)ts, PETSC_FORTRAN_CALLBACK_CLASS, _cb.function_pgiptr, NULL, &ptr));
106109c90ceSBarry Smith #endif
1071ab477f3SBarry 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) */));
1080fecffdcSJed Brown }
109d1e9a80fSBarry Smith static PetscErrorCode ourijacobian(TS ts, PetscReal d, Vec x, Vec xdot, PetscReal shift, Mat m, Mat p, void *ctx)
1100fecffdcSJed Brown {
1111ab477f3SBarry Smith #if defined(PETSC_HAVE_F90_2PTR_ARG) && defined(foo)
112109c90ceSBarry Smith   void *ptr;
1133ba16761SJacob Faibussowitsch   PetscCall(PetscObjectGetFortranCallback((PetscObject)ts, PETSC_FORTRAN_CALLBACK_CLASS, _cb.function_pgiptr, NULL, &ptr));
114109c90ceSBarry Smith #endif
1151ab477f3SBarry 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) */));
116e2df7a95SSatish Balay }
117e2df7a95SSatish Balay 
118c2efdce3SBarry Smith static PetscErrorCode ourmonitordestroy(void **ctx)
119e2df7a95SSatish Balay {
120109c90ceSBarry Smith   TS ts = (TS)*ctx;
121109c90ceSBarry Smith   PetscObjectUseFortranCallback(ts, _cb.mondestroy, (void *, PetscErrorCode *), (_ctx, &ierr));
122e2df7a95SSatish Balay }
123e2df7a95SSatish Balay 
124e2df7a95SSatish Balay /*
125e2df7a95SSatish Balay    Note ctx is the same as ts so we need to get the Fortran context out of the TS
126e2df7a95SSatish Balay */
1270fecffdcSJed Brown static PetscErrorCode ourmonitor(TS ts, PetscInt i, PetscReal d, Vec v, void *ctx)
128e2df7a95SSatish Balay {
129109c90ceSBarry Smith   PetscObjectUseFortranCallback(ts, _cb.monitor, (TS *, PetscInt *, PetscReal *, Vec *, void *, PetscErrorCode *), (&ts, &i, &d, &v, _ctx, &ierr));
130e2df7a95SSatish Balay }
131e2df7a95SSatish Balay 
132b0bc92c6SBarry Smith /*
133b0bc92c6SBarry Smith    Currently does not handle destroy or context
134b0bc92c6SBarry Smith */
135b0bc92c6SBarry Smith static PetscErrorCode ourtransform(void *ctx, Vec x, Vec *xout)
136b0bc92c6SBarry Smith {
137109c90ceSBarry Smith   PetscObjectUseFortranCallback((TS)ctx, _cb.transform, (void *, Vec *, Vec *, PetscErrorCode *), (_ctx, &x, xout, &ierr));
138b0bc92c6SBarry Smith }
139b0bc92c6SBarry Smith 
14019caf8f3SSatish Balay PETSC_EXTERN void tsmonitorlgsettransform_(TS *ts, void (*f)(void *, Vec *, Vec *, PetscErrorCode *), PetscErrorCode (*d)(void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
141b0bc92c6SBarry Smith {
1425975b3b6SBarry Smith   *ierr = TSMonitorLGSetTransform(*ts, ourtransform, NULL, NULL);
1435975b3b6SBarry Smith   if (*ierr) return;
144109c90ceSBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*ts, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.transform, (PetscVoidFunction)f, ctx);
145b0bc92c6SBarry Smith }
146b0bc92c6SBarry Smith 
14719caf8f3SSatish Balay PETSC_EXTERN void tssetprestep_(TS *ts, PetscErrorCode (*f)(TS *, PetscErrorCode *), PetscErrorCode *ierr)
148dd7ecb2fSBarry Smith {
1495975b3b6SBarry Smith   *ierr = TSSetPreStep(*ts, ourprestep);
1505975b3b6SBarry Smith   if (*ierr) return;
151109c90ceSBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*ts, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.prestep, (PetscVoidFunction)f, NULL);
152dd7ecb2fSBarry Smith }
153dd7ecb2fSBarry Smith 
15419caf8f3SSatish Balay PETSC_EXTERN void tssetpoststep_(TS *ts, PetscErrorCode (*f)(TS *, PetscErrorCode *), PetscErrorCode *ierr)
155dd7ecb2fSBarry Smith {
1565975b3b6SBarry Smith   *ierr = TSSetPostStep(*ts, ourpoststep);
1575975b3b6SBarry Smith   if (*ierr) return;
158109c90ceSBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*ts, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.poststep, (PetscVoidFunction)f, NULL);
159dd7ecb2fSBarry Smith }
160dd7ecb2fSBarry Smith 
16169c1e2abSSatish Balay PETSC_EXTERN void tscomputerhsfunctionlinear_(TS *ts, PetscReal *t, Vec *X, Vec *F, void *ctx, PetscErrorCode *ierr)
1620e4ef248SJed Brown {
1630e4ef248SJed Brown   *ierr = TSComputeRHSFunctionLinear(*ts, *t, *X, *F, ctx);
1640e4ef248SJed Brown }
16519caf8f3SSatish Balay PETSC_EXTERN void tssetrhsfunction_(TS *ts, Vec *r, PetscErrorCode (*f)(TS *, PetscReal *, Vec *, Vec *, void *, PetscErrorCode *), void *fP, PetscErrorCode *ierr)
166e2df7a95SSatish Balay {
1670e4ef248SJed Brown   Vec R;
1680e4ef248SJed Brown   CHKFORTRANNULLOBJECT(r);
1690e4ef248SJed Brown   CHKFORTRANNULLFUNCTION(f);
1700298fd71SBarry Smith   R = r ? *r : (Vec)NULL;
1710e4ef248SJed Brown   if ((PetscVoidFunction)f == (PetscVoidFunction)tscomputerhsfunctionlinear_) {
1720e4ef248SJed Brown     *ierr = TSSetRHSFunction(*ts, R, TSComputeRHSFunctionLinear, fP);
1730e4ef248SJed Brown   } else {
174109c90ceSBarry Smith     *ierr = PetscObjectSetFortranCallback((PetscObject)*ts, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.rhsfunction, (PetscVoidFunction)f, fP);
175109c90ceSBarry Smith     *ierr = TSSetRHSFunction(*ts, R, ourrhsfunction, NULL);
1760fecffdcSJed Brown   }
1770fecffdcSJed Brown }
17819caf8f3SSatish Balay PETSC_EXTERN void tsgetrhsfunction_(TS *ts, Vec *r, void *func, void **ctx, PetscErrorCode *ierr)
17937698f3aSJed Brown {
18037698f3aSJed Brown   CHKFORTRANNULLINTEGER(ctx);
18137698f3aSJed Brown   CHKFORTRANNULLOBJECT(r);
1820298fd71SBarry Smith   *ierr = TSGetRHSFunction(*ts, r, NULL, ctx);
18337698f3aSJed Brown }
1840fecffdcSJed Brown 
18569c1e2abSSatish Balay PETSC_EXTERN void tscomputeifunctionlinear_(TS *ts, PetscReal *t, Vec *X, Vec *Xdot, Vec *F, void *ctx, PetscErrorCode *ierr)
1860fecffdcSJed Brown {
1870fecffdcSJed Brown   *ierr = TSComputeIFunctionLinear(*ts, *t, *X, *Xdot, *F, ctx);
1880fecffdcSJed Brown }
18919caf8f3SSatish Balay PETSC_EXTERN void tssetifunction_(TS *ts, Vec *r, PetscErrorCode (*f)(TS *, PetscReal *, Vec *, Vec *, Vec *, void *, PetscErrorCode *), void *fP, PetscErrorCode *ierr)
1900fecffdcSJed Brown {
1910fecffdcSJed Brown   Vec R;
1920fecffdcSJed Brown   CHKFORTRANNULLOBJECT(r);
1930fecffdcSJed Brown   CHKFORTRANNULLFUNCTION(f);
1940298fd71SBarry Smith   R = r ? *r : (Vec)NULL;
1950fecffdcSJed Brown   if ((PetscVoidFunction)f == (PetscVoidFunction)tscomputeifunctionlinear_) {
1960fecffdcSJed Brown     *ierr = TSSetIFunction(*ts, R, TSComputeIFunctionLinear, fP);
1970fecffdcSJed Brown   } else {
198109c90ceSBarry Smith     *ierr = PetscObjectSetFortranCallback((PetscObject)*ts, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.ifunction, (PetscVoidFunction)f, fP);
199109c90ceSBarry Smith     *ierr = TSSetIFunction(*ts, R, ourifunction, NULL);
2000e4ef248SJed Brown   }
201e2df7a95SSatish Balay }
20219caf8f3SSatish Balay PETSC_EXTERN void tsgetifunction_(TS *ts, Vec *r, void *func, void **ctx, PetscErrorCode *ierr)
20337698f3aSJed Brown {
20437698f3aSJed Brown   CHKFORTRANNULLINTEGER(ctx);
20537698f3aSJed Brown   CHKFORTRANNULLOBJECT(r);
2060298fd71SBarry Smith   *ierr = TSGetIFunction(*ts, r, NULL, ctx);
20737698f3aSJed Brown }
20826d46c62SHong Zhang 
209e2df7a95SSatish Balay /* ---------------------------------------------------------*/
210d1e9a80fSBarry Smith PETSC_EXTERN void tscomputerhsjacobianconstant_(TS *ts, PetscReal *t, Vec *X, Mat *A, Mat *B, void *ctx, PetscErrorCode *ierr)
2110e4ef248SJed Brown {
212d1e9a80fSBarry Smith   *ierr = TSComputeRHSJacobianConstant(*ts, *t, *X, *A, *B, ctx);
2130e4ef248SJed Brown }
21419caf8f3SSatish Balay PETSC_EXTERN void tssetrhsjacobian_(TS *ts, Mat *A, Mat *B, void (*f)(TS *, PetscReal *, Vec *, Mat *, Mat *, void *, PetscErrorCode *), void *fP, PetscErrorCode *ierr)
215e2df7a95SSatish Balay {
216aecf964fSBarry Smith   CHKFORTRANNULLFUNCTION(f);
217aecf964fSBarry Smith   if ((PetscVoidFunction)f == (PetscVoidFunction)tscomputerhsjacobianconstant_) {
2180e4ef248SJed Brown     *ierr = TSSetRHSJacobian(*ts, *A, *B, TSComputeRHSJacobianConstant, fP);
219e2df7a95SSatish Balay   } else {
220109c90ceSBarry Smith     *ierr = PetscObjectSetFortranCallback((PetscObject)*ts, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.rhsjacobian, (PetscVoidFunction)f, fP);
221109c90ceSBarry Smith     *ierr = TSSetRHSJacobian(*ts, *A, *B, ourrhsjacobian, NULL);
2220fecffdcSJed Brown   }
2230fecffdcSJed Brown }
2240fecffdcSJed Brown 
225d1e9a80fSBarry Smith PETSC_EXTERN void tscomputeijacobianconstant_(TS *ts, PetscReal *t, Vec *X, Vec *Xdot, PetscReal *shift, Mat *A, Mat *B, void *ctx, PetscErrorCode *ierr)
2260fecffdcSJed Brown {
227d1e9a80fSBarry Smith   *ierr = TSComputeIJacobianConstant(*ts, *t, *X, *Xdot, *shift, *A, *B, ctx);
2280fecffdcSJed Brown }
22919caf8f3SSatish Balay PETSC_EXTERN void tssetijacobian_(TS *ts, Mat *A, Mat *B, void (*f)(TS *, PetscReal *, Vec *, Mat *, Mat *, void *, PetscErrorCode *), void *fP, PetscErrorCode *ierr)
2300fecffdcSJed Brown {
231aecf964fSBarry Smith   CHKFORTRANNULLFUNCTION(f);
232aecf964fSBarry Smith   if ((PetscVoidFunction)f == (PetscVoidFunction)tscomputeijacobianconstant_) {
2330fecffdcSJed Brown     *ierr = TSSetIJacobian(*ts, *A, *B, TSComputeIJacobianConstant, fP);
2340fecffdcSJed Brown   } else {
235109c90ceSBarry Smith     *ierr = PetscObjectSetFortranCallback((PetscObject)*ts, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.ijacobian, (PetscVoidFunction)f, fP);
236109c90ceSBarry Smith     *ierr = TSSetIJacobian(*ts, *A, *B, ourijacobian, NULL);
237e2df7a95SSatish Balay   }
238e2df7a95SSatish Balay }
23919caf8f3SSatish Balay PETSC_EXTERN void tsgetijacobian_(TS *ts, Mat *J, Mat *M, int *func, void **ctx, PetscErrorCode *ierr)
24037698f3aSJed Brown {
24137698f3aSJed Brown   CHKFORTRANNULLINTEGER(ctx);
24237698f3aSJed Brown   CHKFORTRANNULLOBJECT(J);
24337698f3aSJed Brown   CHKFORTRANNULLOBJECT(M);
244*dfef5ea7SSatish Balay   *ierr = TSGetIJacobian(*ts, J, M, NULL, ctx);
24537698f3aSJed Brown }
246e2df7a95SSatish Balay 
24752f0073cSBarry Smith PETSC_EXTERN void tsmonitordefault_(TS *ts, PetscInt *its, PetscReal *fgnorm, Vec *u, PetscViewerAndFormat **dummy, PetscErrorCode *ierr)
24852f0073cSBarry Smith {
249410efd14SBarry Smith   *ierr = TSMonitorDefault(*ts, *its, *fgnorm, *u, *dummy);
25052f0073cSBarry Smith }
25152f0073cSBarry Smith 
252e2df7a95SSatish Balay /* ---------------------------------------------------------*/
253e2df7a95SSatish Balay 
25419caf8f3SSatish Balay /* PETSC_EXTERN void tsmonitordefault_(TS*,PetscInt*,PetscReal*,Vec*,void*,PetscErrorCode*); */
255e2df7a95SSatish Balay 
25619caf8f3SSatish Balay PETSC_EXTERN void tsmonitorset_(TS *ts, void (*func)(TS *, PetscInt *, PetscReal *, Vec *, void *, PetscErrorCode *), void *mctx, void (*d)(void *, PetscErrorCode *), PetscErrorCode *ierr)
257e2df7a95SSatish Balay {
258aecf964fSBarry Smith   CHKFORTRANNULLFUNCTION(d);
25952f0073cSBarry Smith   if ((PetscVoidFunction)func == (PetscVoidFunction)tsmonitordefault_) {
2601cb03803SBarry Smith     *ierr = TSMonitorSet(*ts, (PetscErrorCode(*)(TS, PetscInt, PetscReal, Vec, void *))TSMonitorDefault, *(PetscViewerAndFormat **)mctx, (PetscErrorCode(*)(void **))PetscViewerAndFormatDestroy);
261e2df7a95SSatish Balay   } else {
262109c90ceSBarry Smith     *ierr = PetscObjectSetFortranCallback((PetscObject)*ts, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.monitor, (PetscVoidFunction)func, mctx);
263109c90ceSBarry Smith     *ierr = PetscObjectSetFortranCallback((PetscObject)*ts, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.mondestroy, (PetscVoidFunction)d, mctx);
264aecf964fSBarry Smith     *ierr = TSMonitorSet(*ts, ourmonitor, *ts, ourmonitordestroy);
265e2df7a95SSatish Balay   }
266e2df7a95SSatish Balay }
267e2df7a95SSatish Balay 
268e2df7a95SSatish Balay /* ---------------------------------------------------------*/
269089b2837SJed Brown /*  func is currently ignored from Fortran */
27019caf8f3SSatish Balay PETSC_EXTERN void tsgetrhsjacobian_(TS *ts, Mat *J, Mat *M, int *func, void **ctx, PetscErrorCode *ierr)
271e2df7a95SSatish Balay {
272*dfef5ea7SSatish Balay   *ierr = TSGetRHSJacobian(*ts, J, M, NULL, ctx);
273e2df7a95SSatish Balay }
274e2df7a95SSatish Balay 
27519caf8f3SSatish Balay PETSC_EXTERN void tsview_(TS *ts, PetscViewer *viewer, PetscErrorCode *ierr)
276e2df7a95SSatish Balay {
277e2df7a95SSatish Balay   PetscViewer v;
278e2df7a95SSatish Balay   PetscPatchDefaultViewers_Fortran(viewer, v);
279e2df7a95SSatish Balay   *ierr = TSView(*ts, v);
280e2df7a95SSatish Balay }
281e2df7a95SSatish Balay 
28219caf8f3SSatish Balay PETSC_EXTERN void tssetoptionsprefix_(TS *ts, char *prefix, PetscErrorCode *ierr, PETSC_FORTRAN_CHARLEN_T len)
28337698f3aSJed Brown {
28437698f3aSJed Brown   char *t;
28537698f3aSJed Brown   FIXCHAR(prefix, len, t);
2865975b3b6SBarry Smith   *ierr = TSSetOptionsPrefix(*ts, t);
2875975b3b6SBarry Smith   if (*ierr) return;
28837698f3aSJed Brown   FREECHAR(prefix, t);
28937698f3aSJed Brown }
29019caf8f3SSatish Balay PETSC_EXTERN void tsgetoptionsprefix_(TS *ts, char *prefix, PetscErrorCode *ierr, PETSC_FORTRAN_CHARLEN_T len)
291e2df7a95SSatish Balay {
292e2df7a95SSatish Balay   const char *tname;
293e2df7a95SSatish Balay 
294e2df7a95SSatish Balay   *ierr = TSGetOptionsPrefix(*ts, &tname);
295e2df7a95SSatish Balay   *ierr = PetscStrncpy(prefix, tname, len);
296d6a8cea5SBarry Smith   FIXRETURNCHAR(PETSC_TRUE, prefix, len);
297e2df7a95SSatish Balay }
29819caf8f3SSatish Balay PETSC_EXTERN void tsappendoptionsprefix_(TS *ts, char *prefix, PetscErrorCode *ierr, PETSC_FORTRAN_CHARLEN_T len)
29937698f3aSJed Brown {
30037698f3aSJed Brown   char *t;
30137698f3aSJed Brown   FIXCHAR(prefix, len, t);
3025975b3b6SBarry Smith   *ierr = TSAppendOptionsPrefix(*ts, t);
3035975b3b6SBarry Smith   if (*ierr) return;
30437698f3aSJed Brown   FREECHAR(prefix, t);
30537698f3aSJed Brown }
306e2df7a95SSatish Balay 
30719caf8f3SSatish Balay PETSC_EXTERN void tsviewfromoptions_(TS *ao, PetscObject obj, char *type, PetscErrorCode *ierr, PETSC_FORTRAN_CHARLEN_T len)
308fe2efc57SMark {
309fe2efc57SMark   char *t;
310fe2efc57SMark 
311fe2efc57SMark   FIXCHAR(type, len, t);
312b14c0cbaSBlaise Bourdin   CHKFORTRANNULLOBJECT(obj);
3135975b3b6SBarry Smith   *ierr = TSViewFromOptions(*ao, obj, t);
3145975b3b6SBarry Smith   if (*ierr) return;
315fe2efc57SMark   FREECHAR(type, t);
316fe2efc57SMark }
317