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 16a6570f20SBarry Smith #define tsmonitorset_ TSMONITORSET 170e4ef248SJed Brown #define tscomputerhsfunctionlinear_ TSCOMPUTERHSFUNCTIONLINEAR 180e4ef248SJed Brown #define tscomputerhsjacobianconstant_ TSCOMPUTERHSJACOBIANCONSTANT 190fecffdcSJed Brown #define tscomputeifunctionlinear_ TSCOMPUTEIFUNCTIONLINEAR 200fecffdcSJed Brown #define tscomputeijacobianconstant_ TSCOMPUTEIJACOBIANCONSTANT 21a6570f20SBarry Smith #define tsmonitordefault_ TSMONITORDEFAULT 22dd7ecb2fSBarry Smith #define tssetprestep_ TSSETPRESTEP 23dd7ecb2fSBarry Smith #define tssetpoststep_ TSSETPOSTSTEP 24e2df7a95SSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE) 25b0bc92c6SBarry Smith #define tsmonitorlgsettransform_ tsmonitorlgsettransform 26e2df7a95SSatish Balay #define tssetrhsfunction_ tssetrhsfunction 2737698f3aSJed Brown #define tsgetrhsfunction_ tsgetrhsfunction 28e2df7a95SSatish Balay #define tssetrhsjacobian_ tssetrhsjacobian 29e2df7a95SSatish Balay #define tsgetrhsjacobian_ tsgetrhsjacobian 3037698f3aSJed Brown #define tssetifunction_ tssetifunction 3137698f3aSJed Brown #define tsgetifunction_ tsgetifunction 3237698f3aSJed Brown #define tssetijacobian_ tssetijacobian 3337698f3aSJed Brown #define tsgetijacobian_ tsgetijacobian 34a6570f20SBarry Smith #define tsmonitorset_ tsmonitorset 350e4ef248SJed Brown #define tscomputerhsfunctionlinear_ tscomputerhsfunctionlinear 360e4ef248SJed Brown #define tscomputerhsjacobianconstant_ tscomputerhsjacobianconstant 370fecffdcSJed Brown #define tscomputeifunctionlinear_ tscomputeifunctionlinear 380fecffdcSJed Brown #define tscomputeijacobianconstant_ tscomputeijacobianconstant 39a6570f20SBarry Smith #define tsmonitordefault_ tsmonitordefault 40dd7ecb2fSBarry Smith #define tssetprestep_ tssetprestep 41dd7ecb2fSBarry Smith #define tssetpoststep_ tssetpoststep 42e2df7a95SSatish Balay #endif 43e2df7a95SSatish Balay 44109c90ceSBarry Smith static struct { 45109c90ceSBarry Smith PetscFortranCallbackId prestep; 46109c90ceSBarry Smith PetscFortranCallbackId poststep; 47109c90ceSBarry Smith PetscFortranCallbackId rhsfunction; 48109c90ceSBarry Smith PetscFortranCallbackId rhsjacobian; 49109c90ceSBarry Smith PetscFortranCallbackId ifunction; 50109c90ceSBarry Smith PetscFortranCallbackId ijacobian; 51109c90ceSBarry Smith PetscFortranCallbackId monitor; 52109c90ceSBarry Smith PetscFortranCallbackId mondestroy; 53109c90ceSBarry Smith PetscFortranCallbackId transform; 54109c90ceSBarry Smith #if defined(PETSC_HAVE_F90_2PTR_ARG) 55109c90ceSBarry Smith PetscFortranCallbackId function_pgiptr; 56109c90ceSBarry Smith #endif 57109c90ceSBarry Smith } _cb; 580fecffdcSJed Brown 59dd7ecb2fSBarry Smith static PetscErrorCode ourprestep(TS ts) 60dd7ecb2fSBarry Smith { 611ab477f3SBarry Smith #if defined(PETSC_HAVE_F90_2PTR_ARG) && defined(foo) 62109c90ceSBarry Smith void *ptr; 633ba16761SJacob Faibussowitsch PetscCall(PetscObjectGetFortranCallback((PetscObject)ts, PETSC_FORTRAN_CALLBACK_CLASS, _cb.function_pgiptr, NULL, &ptr)); 64109c90ceSBarry Smith #endif 651ab477f3SBarry Smith PetscObjectUseFortranCallback(ts, _cb.prestep, (TS *, PetscErrorCode * /* PETSC_F90_2PTR_PROTO_NOVAR */), (&ts, &ierr /* PETSC_F90_2PTR_PARAM(ptr) */)); 66dd7ecb2fSBarry Smith } 67dd7ecb2fSBarry Smith static PetscErrorCode ourpoststep(TS ts) 68dd7ecb2fSBarry Smith { 691ab477f3SBarry Smith #if defined(PETSC_HAVE_F90_2PTR_ARG) && defined(foo) 70109c90ceSBarry Smith void *ptr; 713ba16761SJacob Faibussowitsch PetscCall(PetscObjectGetFortranCallback((PetscObject)ts, PETSC_FORTRAN_CALLBACK_CLASS, _cb.function_pgiptr, NULL, &ptr)); 72109c90ceSBarry Smith #endif 731ab477f3SBarry Smith PetscObjectUseFortranCallback(ts, _cb.poststep, (TS *, PetscErrorCode * /* PETSC_F90_2PTR_PROTO_NOVAR */), (&ts, &ierr /* PETSC_F90_2PTR_PARAM(ptr) */)); 74dd7ecb2fSBarry Smith } 750fecffdcSJed Brown static PetscErrorCode ourrhsfunction(TS ts, PetscReal d, Vec x, Vec f, void *ctx) 76e2df7a95SSatish Balay { 771ab477f3SBarry Smith #if defined(PETSC_HAVE_F90_2PTR_ARG) && defined(foo) 78109c90ceSBarry Smith void *ptr; 793ba16761SJacob Faibussowitsch PetscCall(PetscObjectGetFortranCallback((PetscObject)ts, PETSC_FORTRAN_CALLBACK_CLASS, _cb.function_pgiptr, NULL, &ptr)); 80109c90ceSBarry Smith #endif 811ab477f3SBarry 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) */)); 82e2df7a95SSatish Balay } 830fecffdcSJed Brown static PetscErrorCode ourifunction(TS ts, PetscReal d, Vec x, Vec xdot, Vec f, void *ctx) 84e2df7a95SSatish Balay { 851ab477f3SBarry Smith #if defined(PETSC_HAVE_F90_2PTR_ARG) && defined(foo) 86109c90ceSBarry Smith void *ptr; 873ba16761SJacob Faibussowitsch PetscCall(PetscObjectGetFortranCallback((PetscObject)ts, PETSC_FORTRAN_CALLBACK_CLASS, _cb.function_pgiptr, NULL, &ptr)); 88109c90ceSBarry Smith #endif 891ab477f3SBarry 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) */)); 900fecffdcSJed Brown } 91d1e9a80fSBarry Smith static PetscErrorCode ourrhsjacobian(TS ts, PetscReal d, Vec x, Mat m, Mat p, void *ctx) 920fecffdcSJed Brown { 931ab477f3SBarry Smith #if defined(PETSC_HAVE_F90_2PTR_ARG) && defined(foo) 94109c90ceSBarry Smith void *ptr; 953ba16761SJacob Faibussowitsch PetscCall(PetscObjectGetFortranCallback((PetscObject)ts, PETSC_FORTRAN_CALLBACK_CLASS, _cb.function_pgiptr, NULL, &ptr)); 96109c90ceSBarry Smith #endif 971ab477f3SBarry 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) */)); 980fecffdcSJed Brown } 99d1e9a80fSBarry Smith static PetscErrorCode ourijacobian(TS ts, PetscReal d, Vec x, Vec xdot, PetscReal shift, Mat m, Mat p, void *ctx) 1000fecffdcSJed Brown { 1011ab477f3SBarry Smith #if defined(PETSC_HAVE_F90_2PTR_ARG) && defined(foo) 102109c90ceSBarry Smith void *ptr; 1033ba16761SJacob Faibussowitsch PetscCall(PetscObjectGetFortranCallback((PetscObject)ts, PETSC_FORTRAN_CALLBACK_CLASS, _cb.function_pgiptr, NULL, &ptr)); 104109c90ceSBarry Smith #endif 1051ab477f3SBarry 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) */)); 106e2df7a95SSatish Balay } 107e2df7a95SSatish Balay 108c2efdce3SBarry Smith static PetscErrorCode ourmonitordestroy(void **ctx) 109e2df7a95SSatish Balay { 110109c90ceSBarry Smith TS ts = (TS)*ctx; 111109c90ceSBarry Smith PetscObjectUseFortranCallback(ts, _cb.mondestroy, (void *, PetscErrorCode *), (_ctx, &ierr)); 112e2df7a95SSatish Balay } 113e2df7a95SSatish Balay 114e2df7a95SSatish Balay /* 115e2df7a95SSatish Balay Note ctx is the same as ts so we need to get the Fortran context out of the TS 116e2df7a95SSatish Balay */ 1170fecffdcSJed Brown static PetscErrorCode ourmonitor(TS ts, PetscInt i, PetscReal d, Vec v, void *ctx) 118e2df7a95SSatish Balay { 119109c90ceSBarry Smith PetscObjectUseFortranCallback(ts, _cb.monitor, (TS *, PetscInt *, PetscReal *, Vec *, void *, PetscErrorCode *), (&ts, &i, &d, &v, _ctx, &ierr)); 120e2df7a95SSatish Balay } 121e2df7a95SSatish Balay 122b0bc92c6SBarry Smith /* 123b0bc92c6SBarry Smith Currently does not handle destroy or context 124b0bc92c6SBarry Smith */ 125b0bc92c6SBarry Smith static PetscErrorCode ourtransform(void *ctx, Vec x, Vec *xout) 126b0bc92c6SBarry Smith { 127109c90ceSBarry Smith PetscObjectUseFortranCallback((TS)ctx, _cb.transform, (void *, Vec *, Vec *, PetscErrorCode *), (_ctx, &x, xout, &ierr)); 128b0bc92c6SBarry Smith } 129b0bc92c6SBarry Smith 13019caf8f3SSatish Balay PETSC_EXTERN void tsmonitorlgsettransform_(TS *ts, void (*f)(void *, Vec *, Vec *, PetscErrorCode *), PetscErrorCode (*d)(void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr) 131b0bc92c6SBarry Smith { 1325975b3b6SBarry Smith *ierr = TSMonitorLGSetTransform(*ts, ourtransform, NULL, NULL); 1335975b3b6SBarry Smith if (*ierr) return; 1348434afd1SBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*ts, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.transform, (PetscVoidFn *)f, ctx); 135b0bc92c6SBarry Smith } 136b0bc92c6SBarry Smith 13719caf8f3SSatish Balay PETSC_EXTERN void tssetprestep_(TS *ts, PetscErrorCode (*f)(TS *, PetscErrorCode *), PetscErrorCode *ierr) 138dd7ecb2fSBarry Smith { 1395975b3b6SBarry Smith *ierr = TSSetPreStep(*ts, ourprestep); 1405975b3b6SBarry Smith if (*ierr) return; 1418434afd1SBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*ts, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.prestep, (PetscVoidFn *)f, NULL); 142dd7ecb2fSBarry Smith } 143dd7ecb2fSBarry Smith 14419caf8f3SSatish Balay PETSC_EXTERN void tssetpoststep_(TS *ts, PetscErrorCode (*f)(TS *, PetscErrorCode *), PetscErrorCode *ierr) 145dd7ecb2fSBarry Smith { 1465975b3b6SBarry Smith *ierr = TSSetPostStep(*ts, ourpoststep); 1475975b3b6SBarry Smith if (*ierr) return; 1488434afd1SBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*ts, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.poststep, (PetscVoidFn *)f, NULL); 149dd7ecb2fSBarry Smith } 150dd7ecb2fSBarry Smith 15169c1e2abSSatish Balay PETSC_EXTERN void tscomputerhsfunctionlinear_(TS *ts, PetscReal *t, Vec *X, Vec *F, void *ctx, PetscErrorCode *ierr) 1520e4ef248SJed Brown { 1530e4ef248SJed Brown *ierr = TSComputeRHSFunctionLinear(*ts, *t, *X, *F, ctx); 1540e4ef248SJed Brown } 15519caf8f3SSatish Balay PETSC_EXTERN void tssetrhsfunction_(TS *ts, Vec *r, PetscErrorCode (*f)(TS *, PetscReal *, Vec *, Vec *, void *, PetscErrorCode *), void *fP, PetscErrorCode *ierr) 156e2df7a95SSatish Balay { 1570e4ef248SJed Brown Vec R; 1580e4ef248SJed Brown CHKFORTRANNULLOBJECT(r); 1590e4ef248SJed Brown CHKFORTRANNULLFUNCTION(f); 1600298fd71SBarry Smith R = r ? *r : (Vec)NULL; 1618434afd1SBarry Smith if ((PetscVoidFn *)f == (PetscVoidFn *)tscomputerhsfunctionlinear_) { 1620e4ef248SJed Brown *ierr = TSSetRHSFunction(*ts, R, TSComputeRHSFunctionLinear, fP); 1630e4ef248SJed Brown } else { 1648434afd1SBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*ts, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.rhsfunction, (PetscVoidFn *)f, fP); 165109c90ceSBarry Smith *ierr = TSSetRHSFunction(*ts, R, ourrhsfunction, NULL); 1660fecffdcSJed Brown } 1670fecffdcSJed Brown } 16819caf8f3SSatish Balay PETSC_EXTERN void tsgetrhsfunction_(TS *ts, Vec *r, void *func, void **ctx, PetscErrorCode *ierr) 16937698f3aSJed Brown { 17037698f3aSJed Brown CHKFORTRANNULLINTEGER(ctx); 17137698f3aSJed Brown CHKFORTRANNULLOBJECT(r); 1720298fd71SBarry Smith *ierr = TSGetRHSFunction(*ts, r, NULL, ctx); 17337698f3aSJed Brown } 1740fecffdcSJed Brown 17569c1e2abSSatish Balay PETSC_EXTERN void tscomputeifunctionlinear_(TS *ts, PetscReal *t, Vec *X, Vec *Xdot, Vec *F, void *ctx, PetscErrorCode *ierr) 1760fecffdcSJed Brown { 1770fecffdcSJed Brown *ierr = TSComputeIFunctionLinear(*ts, *t, *X, *Xdot, *F, ctx); 1780fecffdcSJed Brown } 17919caf8f3SSatish Balay PETSC_EXTERN void tssetifunction_(TS *ts, Vec *r, PetscErrorCode (*f)(TS *, PetscReal *, Vec *, Vec *, Vec *, void *, PetscErrorCode *), void *fP, PetscErrorCode *ierr) 1800fecffdcSJed Brown { 1810fecffdcSJed Brown Vec R; 1820fecffdcSJed Brown CHKFORTRANNULLOBJECT(r); 1830fecffdcSJed Brown CHKFORTRANNULLFUNCTION(f); 1840298fd71SBarry Smith R = r ? *r : (Vec)NULL; 1858434afd1SBarry Smith if ((PetscVoidFn *)f == (PetscVoidFn *)tscomputeifunctionlinear_) { 1860fecffdcSJed Brown *ierr = TSSetIFunction(*ts, R, TSComputeIFunctionLinear, fP); 1870fecffdcSJed Brown } else { 1888434afd1SBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*ts, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.ifunction, (PetscVoidFn *)f, fP); 189109c90ceSBarry Smith *ierr = TSSetIFunction(*ts, R, ourifunction, NULL); 1900e4ef248SJed Brown } 191e2df7a95SSatish Balay } 19219caf8f3SSatish Balay PETSC_EXTERN void tsgetifunction_(TS *ts, Vec *r, void *func, void **ctx, PetscErrorCode *ierr) 19337698f3aSJed Brown { 19437698f3aSJed Brown CHKFORTRANNULLINTEGER(ctx); 19537698f3aSJed Brown CHKFORTRANNULLOBJECT(r); 1960298fd71SBarry Smith *ierr = TSGetIFunction(*ts, r, NULL, ctx); 19737698f3aSJed Brown } 19826d46c62SHong Zhang 199e2df7a95SSatish Balay /* ---------------------------------------------------------*/ 200d1e9a80fSBarry Smith PETSC_EXTERN void tscomputerhsjacobianconstant_(TS *ts, PetscReal *t, Vec *X, Mat *A, Mat *B, void *ctx, PetscErrorCode *ierr) 2010e4ef248SJed Brown { 202d1e9a80fSBarry Smith *ierr = TSComputeRHSJacobianConstant(*ts, *t, *X, *A, *B, ctx); 2030e4ef248SJed Brown } 20419caf8f3SSatish Balay PETSC_EXTERN void tssetrhsjacobian_(TS *ts, Mat *A, Mat *B, void (*f)(TS *, PetscReal *, Vec *, Mat *, Mat *, void *, PetscErrorCode *), void *fP, PetscErrorCode *ierr) 205e2df7a95SSatish Balay { 206aecf964fSBarry Smith CHKFORTRANNULLFUNCTION(f); 2078434afd1SBarry Smith if ((PetscVoidFn *)f == (PetscVoidFn *)tscomputerhsjacobianconstant_) { 2080e4ef248SJed Brown *ierr = TSSetRHSJacobian(*ts, *A, *B, TSComputeRHSJacobianConstant, fP); 209e2df7a95SSatish Balay } else { 2108434afd1SBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*ts, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.rhsjacobian, (PetscVoidFn *)f, fP); 211109c90ceSBarry Smith *ierr = TSSetRHSJacobian(*ts, *A, *B, ourrhsjacobian, NULL); 2120fecffdcSJed Brown } 2130fecffdcSJed Brown } 2140fecffdcSJed Brown 215d1e9a80fSBarry Smith PETSC_EXTERN void tscomputeijacobianconstant_(TS *ts, PetscReal *t, Vec *X, Vec *Xdot, PetscReal *shift, Mat *A, Mat *B, void *ctx, PetscErrorCode *ierr) 2160fecffdcSJed Brown { 217d1e9a80fSBarry Smith *ierr = TSComputeIJacobianConstant(*ts, *t, *X, *Xdot, *shift, *A, *B, ctx); 2180fecffdcSJed Brown } 21919caf8f3SSatish Balay PETSC_EXTERN void tssetijacobian_(TS *ts, Mat *A, Mat *B, void (*f)(TS *, PetscReal *, Vec *, Mat *, Mat *, void *, PetscErrorCode *), void *fP, PetscErrorCode *ierr) 2200fecffdcSJed Brown { 221aecf964fSBarry Smith CHKFORTRANNULLFUNCTION(f); 2228434afd1SBarry Smith if ((PetscVoidFn *)f == (PetscVoidFn *)tscomputeijacobianconstant_) { 2230fecffdcSJed Brown *ierr = TSSetIJacobian(*ts, *A, *B, TSComputeIJacobianConstant, fP); 2240fecffdcSJed Brown } else { 2258434afd1SBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*ts, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.ijacobian, (PetscVoidFn *)f, fP); 226109c90ceSBarry Smith *ierr = TSSetIJacobian(*ts, *A, *B, ourijacobian, NULL); 227e2df7a95SSatish Balay } 228e2df7a95SSatish Balay } 22919caf8f3SSatish Balay PETSC_EXTERN void tsgetijacobian_(TS *ts, Mat *J, Mat *M, int *func, void **ctx, PetscErrorCode *ierr) 23037698f3aSJed Brown { 23137698f3aSJed Brown CHKFORTRANNULLINTEGER(ctx); 23237698f3aSJed Brown CHKFORTRANNULLOBJECT(J); 23337698f3aSJed Brown CHKFORTRANNULLOBJECT(M); 234dfef5ea7SSatish Balay *ierr = TSGetIJacobian(*ts, J, M, NULL, ctx); 23537698f3aSJed Brown } 236e2df7a95SSatish Balay 23752f0073cSBarry Smith PETSC_EXTERN void tsmonitordefault_(TS *ts, PetscInt *its, PetscReal *fgnorm, Vec *u, PetscViewerAndFormat **dummy, PetscErrorCode *ierr) 23852f0073cSBarry Smith { 239410efd14SBarry Smith *ierr = TSMonitorDefault(*ts, *its, *fgnorm, *u, *dummy); 24052f0073cSBarry Smith } 24152f0073cSBarry Smith 242e2df7a95SSatish Balay /* ---------------------------------------------------------*/ 243e2df7a95SSatish Balay 24419caf8f3SSatish Balay /* PETSC_EXTERN void tsmonitordefault_(TS*,PetscInt*,PetscReal*,Vec*,void*,PetscErrorCode*); */ 245e2df7a95SSatish Balay 24619caf8f3SSatish Balay PETSC_EXTERN void tsmonitorset_(TS *ts, void (*func)(TS *, PetscInt *, PetscReal *, Vec *, void *, PetscErrorCode *), void *mctx, void (*d)(void *, PetscErrorCode *), PetscErrorCode *ierr) 247e2df7a95SSatish Balay { 248aecf964fSBarry Smith CHKFORTRANNULLFUNCTION(d); 2498434afd1SBarry Smith if ((PetscVoidFn *)func == (PetscVoidFn *)tsmonitordefault_) { 250*49abdd8aSBarry Smith *ierr = TSMonitorSet(*ts, (PetscErrorCode (*)(TS, PetscInt, PetscReal, Vec, void *))TSMonitorDefault, *(PetscViewerAndFormat **)mctx, (PetscCtxDestroyFn *)PetscViewerAndFormatDestroy); 251e2df7a95SSatish Balay } else { 2528434afd1SBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*ts, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.monitor, (PetscVoidFn *)func, mctx); 2538434afd1SBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*ts, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.mondestroy, (PetscVoidFn *)d, mctx); 254aecf964fSBarry Smith *ierr = TSMonitorSet(*ts, ourmonitor, *ts, ourmonitordestroy); 255e2df7a95SSatish Balay } 256e2df7a95SSatish Balay } 257e2df7a95SSatish Balay 258e2df7a95SSatish Balay /* ---------------------------------------------------------*/ 259089b2837SJed Brown /* func is currently ignored from Fortran */ 26019caf8f3SSatish Balay PETSC_EXTERN void tsgetrhsjacobian_(TS *ts, Mat *J, Mat *M, int *func, void **ctx, PetscErrorCode *ierr) 261e2df7a95SSatish Balay { 262dfef5ea7SSatish Balay *ierr = TSGetRHSJacobian(*ts, J, M, NULL, ctx); 263e2df7a95SSatish Balay } 264