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 162549da82SBarry Smith #define tssetrhsjacobianp_ TSSETRHSJACOBIANP 172549da82SBarry Smith #define tsgetrhsjacobianp_ TSGETRHSJACOBIANP 182549da82SBarry Smith #define tssetijacobianp_ TSSETIJACOBIANP 192549da82SBarry 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 372549da82SBarry Smith #define tssetijacobianp_ tssetijacobianp 382549da82SBarry Smith #define tsgetijacobianp_ tsgetijacobianp 392549da82SBarry Smith #define tssetrhsjacobianp_ tssetrhsjacobianp 402549da82SBarry 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; 582549da82SBarry Smith PetscFortranCallbackId rhsjacobianp; 592549da82SBarry 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 } 1162549da82SBarry Smith static PetscErrorCode ourijacobianp(TS ts, PetscReal d, Vec x, Vec xdot, PetscReal shift, Mat m, void *ctx) 1172549da82SBarry Smith { 1182549da82SBarry Smith #if defined(PETSC_HAVE_F90_2PTR_ARG) && defined(foo) 1192549da82SBarry Smith void *ptr; 1202549da82SBarry Smith PetscCall(PetscObjectGetFortranCallback((PetscObject)ts, PETSC_FORTRAN_CALLBACK_CLASS, _cb.function_pgiptr, NULL, &ptr)); 1212549da82SBarry Smith #endif 1222549da82SBarry 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) */)); 1232549da82SBarry Smith } 1242549da82SBarry Smith static PetscErrorCode ourrhsjacobianp(TS ts, PetscReal d, Vec x, Mat m, void *ctx) 1252549da82SBarry Smith { 1262549da82SBarry Smith #if defined(PETSC_HAVE_F90_2PTR_ARG) && defined(foo) 1272549da82SBarry Smith void *ptr; 1282549da82SBarry Smith PetscCall(PetscObjectGetFortranCallback((PetscObject)ts, PETSC_FORTRAN_CALLBACK_CLASS, _cb.function_pgiptr, NULL, &ptr)); 1292549da82SBarry Smith #endif 1302549da82SBarry 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) */)); 1312549da82SBarry 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; 159*5ebfa9e9SBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*ts, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.transform, (PetscFortranCallbackFn *)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; 166*5ebfa9e9SBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*ts, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.prestep, (PetscFortranCallbackFn *)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; 173*5ebfa9e9SBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*ts, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.poststep, (PetscFortranCallbackFn *)f, NULL); 174dd7ecb2fSBarry Smith } 175dd7ecb2fSBarry Smith 1765b669ad3SBarry Smith PETSC_EXTERN void tscomputerhsfunctionlinear_(TS *, PetscReal *, Vec *, Vec *, void *, PetscErrorCode *); 1775b669ad3SBarry Smith 178*5ebfa9e9SBarry Smith PETSC_EXTERN void tssetrhsfunction_(TS *ts, Vec *r, void (*f)(TS *, PetscReal *, Vec *, Vec *, void *, PetscErrorCode *), void *fP, PetscErrorCode *ierr) 179e2df7a95SSatish Balay { 1800e4ef248SJed Brown Vec R; 1810e4ef248SJed Brown CHKFORTRANNULLOBJECT(r); 1820e4ef248SJed Brown CHKFORTRANNULLFUNCTION(f); 1830298fd71SBarry Smith R = r ? *r : (Vec)NULL; 184*5ebfa9e9SBarry Smith if (f == tscomputerhsfunctionlinear_) { 1850e4ef248SJed Brown *ierr = TSSetRHSFunction(*ts, R, TSComputeRHSFunctionLinear, fP); 1860e4ef248SJed Brown } else { 187*5ebfa9e9SBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*ts, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.rhsfunction, (PetscFortranCallbackFn *)f, fP); 188109c90ceSBarry Smith *ierr = TSSetRHSFunction(*ts, R, ourrhsfunction, NULL); 1890fecffdcSJed Brown } 1900fecffdcSJed Brown } 19119caf8f3SSatish Balay PETSC_EXTERN void tsgetrhsfunction_(TS *ts, Vec *r, void *func, void **ctx, PetscErrorCode *ierr) 19237698f3aSJed Brown { 19337698f3aSJed Brown CHKFORTRANNULLINTEGER(ctx); 19437698f3aSJed Brown CHKFORTRANNULLOBJECT(r); 1950298fd71SBarry Smith *ierr = TSGetRHSFunction(*ts, r, NULL, ctx); 19637698f3aSJed Brown } 1970fecffdcSJed Brown 198ce78bad3SBarry Smith PETSC_EXTERN void tscomputeifunctionlinear_(TS *ts, PetscReal *t, Vec *X, Vec *Xdot, Vec *F, void *ctx, PetscErrorCode *ierr); 199ce78bad3SBarry Smith 200*5ebfa9e9SBarry Smith PETSC_EXTERN void tssetifunction_(TS *ts, Vec *r, void (*f)(TS *, PetscReal *, Vec *, Vec *, Vec *, void *, PetscErrorCode *), void *fP, PetscErrorCode *ierr) 2010fecffdcSJed Brown { 2020fecffdcSJed Brown Vec R; 2030fecffdcSJed Brown CHKFORTRANNULLOBJECT(r); 2040fecffdcSJed Brown CHKFORTRANNULLFUNCTION(f); 2050298fd71SBarry Smith R = r ? *r : (Vec)NULL; 206*5ebfa9e9SBarry Smith if (f == tscomputeifunctionlinear_) { 2070fecffdcSJed Brown *ierr = TSSetIFunction(*ts, R, TSComputeIFunctionLinear, fP); 2080fecffdcSJed Brown } else { 209*5ebfa9e9SBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*ts, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.ifunction, (PetscFortranCallbackFn *)f, fP); 210109c90ceSBarry Smith *ierr = TSSetIFunction(*ts, R, ourifunction, NULL); 2110e4ef248SJed Brown } 212e2df7a95SSatish Balay } 21319caf8f3SSatish Balay PETSC_EXTERN void tsgetifunction_(TS *ts, Vec *r, void *func, void **ctx, PetscErrorCode *ierr) 21437698f3aSJed Brown { 21537698f3aSJed Brown CHKFORTRANNULLINTEGER(ctx); 21637698f3aSJed Brown CHKFORTRANNULLOBJECT(r); 2170298fd71SBarry Smith *ierr = TSGetIFunction(*ts, r, NULL, ctx); 21837698f3aSJed Brown } 21926d46c62SHong Zhang 220e2df7a95SSatish Balay /* ---------------------------------------------------------*/ 2215b669ad3SBarry Smith PETSC_EXTERN void tscomputerhsjacobianconstant_(TS *, PetscReal *, Vec *, Mat *, Mat *, void *, PetscErrorCode *); 2225b669ad3SBarry Smith 22319caf8f3SSatish Balay PETSC_EXTERN void tssetrhsjacobian_(TS *ts, Mat *A, Mat *B, void (*f)(TS *, PetscReal *, Vec *, Mat *, Mat *, void *, PetscErrorCode *), void *fP, PetscErrorCode *ierr) 224e2df7a95SSatish Balay { 225aecf964fSBarry Smith CHKFORTRANNULLFUNCTION(f); 226*5ebfa9e9SBarry Smith if (f == tscomputerhsjacobianconstant_) { 2270e4ef248SJed Brown *ierr = TSSetRHSJacobian(*ts, *A, *B, TSComputeRHSJacobianConstant, fP); 228e2df7a95SSatish Balay } else { 229*5ebfa9e9SBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*ts, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.rhsjacobian, (PetscFortranCallbackFn *)f, fP); 230109c90ceSBarry Smith *ierr = TSSetRHSJacobian(*ts, *A, *B, ourrhsjacobian, NULL); 2310fecffdcSJed Brown } 2320fecffdcSJed Brown } 2330fecffdcSJed Brown 234ce78bad3SBarry Smith PETSC_EXTERN void tscomputeijacobianconstant_(TS *ts, PetscReal *t, Vec *X, Vec *Xdot, PetscReal *shift, Mat *A, Mat *B, void *ctx, PetscErrorCode *ierr); 235ce78bad3SBarry Smith 236*5ebfa9e9SBarry 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) 2370fecffdcSJed Brown { 238aecf964fSBarry Smith CHKFORTRANNULLFUNCTION(f); 239*5ebfa9e9SBarry Smith if (f == tscomputeijacobianconstant_) { 2400fecffdcSJed Brown *ierr = TSSetIJacobian(*ts, *A, *B, TSComputeIJacobianConstant, fP); 2410fecffdcSJed Brown } else { 242*5ebfa9e9SBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*ts, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.ijacobian, (PetscFortranCallbackFn *)f, fP); 243109c90ceSBarry Smith *ierr = TSSetIJacobian(*ts, *A, *B, ourijacobian, NULL); 244e2df7a95SSatish Balay } 245e2df7a95SSatish Balay } 24619caf8f3SSatish Balay PETSC_EXTERN void tsgetijacobian_(TS *ts, Mat *J, Mat *M, int *func, void **ctx, PetscErrorCode *ierr) 24737698f3aSJed Brown { 24837698f3aSJed Brown CHKFORTRANNULLINTEGER(ctx); 24937698f3aSJed Brown CHKFORTRANNULLOBJECT(J); 25037698f3aSJed Brown CHKFORTRANNULLOBJECT(M); 251dfef5ea7SSatish Balay *ierr = TSGetIJacobian(*ts, J, M, NULL, ctx); 25237698f3aSJed Brown } 2532549da82SBarry Smith PETSC_EXTERN void tssetijacobianp_(TS *ts, Mat *A, void (*f)(TS *, PetscReal *, Vec *, Vec *, PetscReal, Mat *, void *, PetscErrorCode *), void *fP, PetscErrorCode *ierr) 2542549da82SBarry Smith { 2552549da82SBarry Smith CHKFORTRANNULLFUNCTION(f); 256*5ebfa9e9SBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*ts, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.ijacobianp, (PetscFortranCallbackFn *)f, fP); 2572549da82SBarry Smith *ierr = TSSetIJacobianP(*ts, *A, ourijacobianp, NULL); 2582549da82SBarry Smith } 2592549da82SBarry Smith PETSC_EXTERN void tsgetijacobianp_(TS *ts, Mat *J, int *func, void **ctx, PetscErrorCode *ierr) 2602549da82SBarry Smith { 2612549da82SBarry Smith CHKFORTRANNULLINTEGER(ctx); 2622549da82SBarry Smith CHKFORTRANNULLOBJECT(J); 2632549da82SBarry Smith *ierr = TSGetIJacobianP(*ts, J, NULL, ctx); 2642549da82SBarry Smith } 2652549da82SBarry Smith PETSC_EXTERN void tssetrhsjacobianp_(TS *ts, Mat *A, void (*f)(TS *, PetscReal *, Vec *, Mat *, void *, PetscErrorCode *), void *fP, PetscErrorCode *ierr) 2662549da82SBarry Smith { 2672549da82SBarry Smith CHKFORTRANNULLFUNCTION(f); 268*5ebfa9e9SBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*ts, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.rhsjacobianp, (PetscFortranCallbackFn *)f, fP); 2692549da82SBarry Smith *ierr = TSSetRHSJacobianP(*ts, *A, ourrhsjacobianp, NULL); 2702549da82SBarry Smith } 2712549da82SBarry Smith PETSC_EXTERN void tsgetrhsjacobianp_(TS *ts, Mat *J, int *func, void **ctx, PetscErrorCode *ierr) 2722549da82SBarry Smith { 2732549da82SBarry Smith CHKFORTRANNULLINTEGER(ctx); 2742549da82SBarry Smith CHKFORTRANNULLOBJECT(J); 2752549da82SBarry Smith *ierr = TSGetRHSJacobianP(*ts, J, NULL, ctx); 2762549da82SBarry Smith } 277e2df7a95SSatish Balay 278ce78bad3SBarry Smith PETSC_EXTERN void tsmonitordefault_(TS *, PetscInt *, PetscReal *, Vec *, PetscViewerAndFormat **, PetscErrorCode *); 27952f0073cSBarry Smith 280e2df7a95SSatish Balay /* ---------------------------------------------------------*/ 281e2df7a95SSatish Balay 28219caf8f3SSatish Balay /* PETSC_EXTERN void tsmonitordefault_(TS*,PetscInt*,PetscReal*,Vec*,void*,PetscErrorCode*); */ 283e2df7a95SSatish Balay 28419caf8f3SSatish Balay PETSC_EXTERN void tsmonitorset_(TS *ts, void (*func)(TS *, PetscInt *, PetscReal *, Vec *, void *, PetscErrorCode *), void *mctx, void (*d)(void *, PetscErrorCode *), PetscErrorCode *ierr) 285e2df7a95SSatish Balay { 286aecf964fSBarry Smith CHKFORTRANNULLFUNCTION(d); 287*5ebfa9e9SBarry Smith if ((PetscFortranCallbackFn *)func == (PetscFortranCallbackFn *)tsmonitordefault_) { 28849abdd8aSBarry Smith *ierr = TSMonitorSet(*ts, (PetscErrorCode (*)(TS, PetscInt, PetscReal, Vec, void *))TSMonitorDefault, *(PetscViewerAndFormat **)mctx, (PetscCtxDestroyFn *)PetscViewerAndFormatDestroy); 289e2df7a95SSatish Balay } else { 290*5ebfa9e9SBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*ts, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.monitor, (PetscFortranCallbackFn *)func, mctx); 291*5ebfa9e9SBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*ts, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.mondestroy, (PetscFortranCallbackFn *)d, mctx); 292aecf964fSBarry Smith *ierr = TSMonitorSet(*ts, ourmonitor, *ts, ourmonitordestroy); 293e2df7a95SSatish Balay } 294e2df7a95SSatish Balay } 295e2df7a95SSatish Balay 296e2df7a95SSatish Balay /* ---------------------------------------------------------*/ 297089b2837SJed Brown /* func is currently ignored from Fortran */ 29819caf8f3SSatish Balay PETSC_EXTERN void tsgetrhsjacobian_(TS *ts, Mat *J, Mat *M, int *func, void **ctx, PetscErrorCode *ierr) 299e2df7a95SSatish Balay { 300dfef5ea7SSatish Balay *ierr = TSGetRHSJacobian(*ts, J, M, NULL, ctx); 301e2df7a95SSatish Balay } 302