xref: /petsc/src/ts/interface/ftn-custom/ztsf.c (revision fe2efc57b7777594bce7568e90822861480cbdc8)
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
28*fe2efc57SMark #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
51*fe2efc57SMark #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;
73109c90ceSBarry Smith   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   return 0;
77dd7ecb2fSBarry Smith }
78dd7ecb2fSBarry Smith static PetscErrorCode ourpoststep(TS ts)
79dd7ecb2fSBarry Smith {
801ab477f3SBarry Smith #if defined(PETSC_HAVE_F90_2PTR_ARG) && defined(foo)
81109c90ceSBarry Smith   void* ptr;
82109c90ceSBarry Smith   PetscObjectGetFortranCallback((PetscObject)ts,PETSC_FORTRAN_CALLBACK_CLASS,_cb.function_pgiptr,NULL,&ptr);
83109c90ceSBarry Smith #endif
841ab477f3SBarry Smith   PetscObjectUseFortranCallback(ts,_cb.poststep,(TS*,PetscErrorCode* /* PETSC_F90_2PTR_PROTO_NOVAR */),(&ts,&ierr /* PETSC_F90_2PTR_PARAM(ptr) */));
85dd7ecb2fSBarry Smith   return 0;
86dd7ecb2fSBarry Smith }
870fecffdcSJed Brown static PetscErrorCode ourrhsfunction(TS ts,PetscReal d,Vec x,Vec f,void *ctx)
88e2df7a95SSatish Balay {
891ab477f3SBarry Smith #if defined(PETSC_HAVE_F90_2PTR_ARG) && defined(foo)
90109c90ceSBarry Smith   void* ptr;
91109c90ceSBarry Smith   PetscObjectGetFortranCallback((PetscObject)ts,PETSC_FORTRAN_CALLBACK_CLASS,_cb.function_pgiptr,NULL,&ptr);
92109c90ceSBarry Smith #endif
931ab477f3SBarry 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) */));
94e2df7a95SSatish Balay   return 0;
95e2df7a95SSatish Balay }
960fecffdcSJed Brown static PetscErrorCode ourifunction(TS ts,PetscReal d,Vec x,Vec xdot,Vec f,void *ctx)
97e2df7a95SSatish Balay {
981ab477f3SBarry Smith #if defined(PETSC_HAVE_F90_2PTR_ARG) && defined(foo)
99109c90ceSBarry Smith   void* ptr;
100109c90ceSBarry Smith   PetscObjectGetFortranCallback((PetscObject)ts,PETSC_FORTRAN_CALLBACK_CLASS,_cb.function_pgiptr,NULL,&ptr);
101109c90ceSBarry Smith #endif
1021ab477f3SBarry 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) */));
1030fecffdcSJed Brown   return 0;
1040fecffdcSJed Brown }
105d1e9a80fSBarry Smith static PetscErrorCode ourrhsjacobian(TS ts,PetscReal d,Vec x,Mat m,Mat p,void *ctx)
1060fecffdcSJed Brown {
1071ab477f3SBarry Smith #if defined(PETSC_HAVE_F90_2PTR_ARG) && defined(foo)
108109c90ceSBarry Smith   void* ptr;
109109c90ceSBarry Smith   PetscObjectGetFortranCallback((PetscObject)ts,PETSC_FORTRAN_CALLBACK_CLASS,_cb.function_pgiptr,NULL,&ptr);
110109c90ceSBarry Smith #endif
1111ab477f3SBarry 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) */));
1120fecffdcSJed Brown   return 0;
1130fecffdcSJed Brown }
114d1e9a80fSBarry Smith static PetscErrorCode ourijacobian(TS ts,PetscReal d,Vec x,Vec xdot,PetscReal shift,Mat m,Mat p,void *ctx)
1150fecffdcSJed Brown {
1161ab477f3SBarry Smith #if defined(PETSC_HAVE_F90_2PTR_ARG) && defined(foo)
117109c90ceSBarry Smith   void* ptr;
118109c90ceSBarry Smith   PetscObjectGetFortranCallback((PetscObject)ts,PETSC_FORTRAN_CALLBACK_CLASS,_cb.function_pgiptr,NULL,&ptr);
119109c90ceSBarry Smith #endif
1201ab477f3SBarry 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) */));
121e2df7a95SSatish Balay   return 0;
122e2df7a95SSatish Balay }
123e2df7a95SSatish Balay 
124c2efdce3SBarry Smith static PetscErrorCode ourmonitordestroy(void **ctx)
125e2df7a95SSatish Balay {
126109c90ceSBarry Smith   TS ts = (TS)*ctx;
127109c90ceSBarry Smith   PetscObjectUseFortranCallback(ts,_cb.mondestroy,(void*,PetscErrorCode*),(_ctx,&ierr));
128e2df7a95SSatish Balay }
129e2df7a95SSatish Balay 
130e2df7a95SSatish Balay /*
131e2df7a95SSatish Balay    Note ctx is the same as ts so we need to get the Fortran context out of the TS
132e2df7a95SSatish Balay */
1330fecffdcSJed Brown static PetscErrorCode ourmonitor(TS ts,PetscInt i,PetscReal d,Vec v,void *ctx)
134e2df7a95SSatish Balay {
135109c90ceSBarry Smith   PetscObjectUseFortranCallback(ts,_cb.monitor,(TS*,PetscInt*,PetscReal*,Vec *,void*,PetscErrorCode*),(&ts,&i,&d,&v,_ctx,&ierr));
136e2df7a95SSatish Balay   return 0;
137e2df7a95SSatish Balay }
138e2df7a95SSatish Balay 
139b0bc92c6SBarry Smith /*
140b0bc92c6SBarry Smith    Currently does not handle destroy or context
141b0bc92c6SBarry Smith */
142b0bc92c6SBarry Smith static PetscErrorCode ourtransform(void *ctx,Vec x,Vec *xout)
143b0bc92c6SBarry Smith {
144109c90ceSBarry Smith   PetscObjectUseFortranCallback((TS)ctx,_cb.transform,(void*,Vec *,Vec *,PetscErrorCode*),(_ctx,&x,xout,&ierr));
145b0bc92c6SBarry Smith }
146b0bc92c6SBarry Smith 
147b0bc92c6SBarry Smith PETSC_EXTERN void PETSC_STDCALL tsmonitorlgsettransform_(TS *ts,void (PETSC_STDCALL*f)(void*,Vec*,Vec*,PetscErrorCode*),PetscErrorCode (PETSC_STDCALL*d)(void*,PetscErrorCode*),void *ctx,PetscErrorCode *ierr)
148b0bc92c6SBarry Smith {
149109c90ceSBarry Smith   *ierr = TSMonitorLGSetTransform(*ts,ourtransform,NULL,NULL); if (*ierr) return;
150109c90ceSBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*ts,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.transform,(PetscVoidFunction)f,ctx);
151b0bc92c6SBarry Smith }
152b0bc92c6SBarry Smith 
1538cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL tssetprestep_(TS *ts,PetscErrorCode (PETSC_STDCALL*f)(TS*,PetscErrorCode*),PetscErrorCode *ierr)
154dd7ecb2fSBarry Smith {
155109c90ceSBarry Smith   *ierr = TSSetPreStep(*ts,ourprestep);if (*ierr) return;
156109c90ceSBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*ts,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.prestep,(PetscVoidFunction)f,NULL);
157dd7ecb2fSBarry Smith }
158dd7ecb2fSBarry Smith 
1598cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL tssetpoststep_(TS *ts,PetscErrorCode (PETSC_STDCALL *f)(TS*,PetscErrorCode*),PetscErrorCode *ierr)
160dd7ecb2fSBarry Smith {
161109c90ceSBarry Smith   *ierr = TSSetPostStep(*ts,ourpoststep);if (*ierr) return;
162109c90ceSBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*ts,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.poststep,(PetscVoidFunction)f,NULL);
163dd7ecb2fSBarry Smith }
164dd7ecb2fSBarry Smith 
16569c1e2abSSatish Balay PETSC_EXTERN void tscomputerhsfunctionlinear_(TS *ts,PetscReal *t,Vec *X,Vec *F,void *ctx,PetscErrorCode *ierr)
1660e4ef248SJed Brown {
1670e4ef248SJed Brown   *ierr = TSComputeRHSFunctionLinear(*ts,*t,*X,*F,ctx);
1680e4ef248SJed Brown }
1698cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL tssetrhsfunction_(TS *ts,Vec *r,PetscErrorCode (PETSC_STDCALL*f)(TS*,PetscReal*,Vec*,Vec*,void*,PetscErrorCode*),void *fP,PetscErrorCode *ierr)
170e2df7a95SSatish Balay {
1710e4ef248SJed Brown   Vec R;
1720e4ef248SJed Brown   CHKFORTRANNULLOBJECT(r);
1730e4ef248SJed Brown   CHKFORTRANNULLFUNCTION(f);
1740298fd71SBarry Smith   R = r ? *r : (Vec)NULL;
1750e4ef248SJed Brown   if ((PetscVoidFunction)f == (PetscVoidFunction)tscomputerhsfunctionlinear_) {
1760e4ef248SJed Brown     *ierr = TSSetRHSFunction(*ts,R,TSComputeRHSFunctionLinear,fP);
1770e4ef248SJed Brown   } else {
178109c90ceSBarry Smith     *ierr = PetscObjectSetFortranCallback((PetscObject)*ts,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.rhsfunction,(PetscVoidFunction)f,fP);
179109c90ceSBarry Smith     *ierr = TSSetRHSFunction(*ts,R,ourrhsfunction,NULL);
1800fecffdcSJed Brown   }
1810fecffdcSJed Brown }
1828cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL tsgetrhsfunction_(TS *ts,Vec *r,void *func,void **ctx,PetscErrorCode *ierr)
18337698f3aSJed Brown {
18437698f3aSJed Brown   CHKFORTRANNULLINTEGER(ctx);
18537698f3aSJed Brown   CHKFORTRANNULLOBJECT(r);
1860298fd71SBarry Smith   *ierr = TSGetRHSFunction(*ts,r,NULL,ctx);
18737698f3aSJed Brown }
1880fecffdcSJed Brown 
18969c1e2abSSatish Balay PETSC_EXTERN void tscomputeifunctionlinear_(TS *ts,PetscReal *t,Vec *X,Vec *Xdot,Vec *F,void *ctx,PetscErrorCode *ierr)
1900fecffdcSJed Brown {
1910fecffdcSJed Brown   *ierr = TSComputeIFunctionLinear(*ts,*t,*X,*Xdot,*F,ctx);
1920fecffdcSJed Brown }
1938cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL tssetifunction_(TS *ts,Vec *r,PetscErrorCode (PETSC_STDCALL*f)(TS*,PetscReal*,Vec*,Vec*,Vec*,void*,PetscErrorCode*),void *fP,PetscErrorCode *ierr)
1940fecffdcSJed Brown {
1950fecffdcSJed Brown   Vec R;
1960fecffdcSJed Brown   CHKFORTRANNULLOBJECT(r);
1970fecffdcSJed Brown   CHKFORTRANNULLFUNCTION(f);
1980298fd71SBarry Smith   R = r ? *r : (Vec)NULL;
1990fecffdcSJed Brown   if ((PetscVoidFunction)f == (PetscVoidFunction)tscomputeifunctionlinear_) {
2000fecffdcSJed Brown     *ierr = TSSetIFunction(*ts,R,TSComputeIFunctionLinear,fP);
2010fecffdcSJed Brown   } else {
202109c90ceSBarry Smith     *ierr = PetscObjectSetFortranCallback((PetscObject)*ts,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.ifunction,(PetscVoidFunction)f,fP);
203109c90ceSBarry Smith     *ierr = TSSetIFunction(*ts,R,ourifunction,NULL);
2040e4ef248SJed Brown   }
205e2df7a95SSatish Balay }
2068cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL tsgetifunction_(TS *ts,Vec *r,void *func,void **ctx,PetscErrorCode *ierr)
20737698f3aSJed Brown {
20837698f3aSJed Brown   CHKFORTRANNULLINTEGER(ctx);
20937698f3aSJed Brown   CHKFORTRANNULLOBJECT(r);
2100298fd71SBarry Smith   *ierr = TSGetIFunction(*ts,r,NULL,ctx);
21137698f3aSJed Brown }
21226d46c62SHong Zhang 
213e2df7a95SSatish Balay /* ---------------------------------------------------------*/
214d1e9a80fSBarry Smith PETSC_EXTERN void tscomputerhsjacobianconstant_(TS *ts,PetscReal *t,Vec *X,Mat *A,Mat *B,void *ctx,PetscErrorCode *ierr)
2150e4ef248SJed Brown {
216d1e9a80fSBarry Smith   *ierr = TSComputeRHSJacobianConstant(*ts,*t,*X,*A,*B,ctx);
2170e4ef248SJed Brown }
218d1e9a80fSBarry Smith PETSC_EXTERN void PETSC_STDCALL tssetrhsjacobian_(TS *ts,Mat *A,Mat *B,void (PETSC_STDCALL*f)(TS*,PetscReal*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),void *fP,PetscErrorCode *ierr)
219e2df7a95SSatish Balay {
220aecf964fSBarry Smith   CHKFORTRANNULLFUNCTION(f);
221aecf964fSBarry Smith   if ((PetscVoidFunction)f == (PetscVoidFunction)tscomputerhsjacobianconstant_) {
2220e4ef248SJed Brown     *ierr = TSSetRHSJacobian(*ts,*A,*B,TSComputeRHSJacobianConstant,fP);
223e2df7a95SSatish Balay   } else {
224109c90ceSBarry Smith     *ierr = PetscObjectSetFortranCallback((PetscObject)*ts,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.rhsjacobian,(PetscVoidFunction)f,fP);
225109c90ceSBarry Smith     *ierr = TSSetRHSJacobian(*ts,*A,*B,ourrhsjacobian,NULL);
2260fecffdcSJed Brown   }
2270fecffdcSJed Brown }
2280fecffdcSJed Brown 
229d1e9a80fSBarry Smith PETSC_EXTERN void tscomputeijacobianconstant_(TS *ts,PetscReal *t,Vec *X,Vec *Xdot,PetscReal *shift,Mat *A,Mat *B,void *ctx,PetscErrorCode *ierr)
2300fecffdcSJed Brown {
231d1e9a80fSBarry Smith   *ierr = TSComputeIJacobianConstant(*ts,*t,*X,*Xdot,*shift,*A,*B,ctx);
2320fecffdcSJed Brown }
233d1e9a80fSBarry Smith PETSC_EXTERN void PETSC_STDCALL tssetijacobian_(TS *ts,Mat *A,Mat *B,void (PETSC_STDCALL*f)(TS*,PetscReal*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),void *fP,PetscErrorCode *ierr)
2340fecffdcSJed Brown {
235aecf964fSBarry Smith   CHKFORTRANNULLFUNCTION(f);
236aecf964fSBarry Smith   if ((PetscVoidFunction)f == (PetscVoidFunction)tscomputeijacobianconstant_) {
2370fecffdcSJed Brown     *ierr = TSSetIJacobian(*ts,*A,*B,TSComputeIJacobianConstant,fP);
2380fecffdcSJed Brown   } else {
239109c90ceSBarry Smith     *ierr = PetscObjectSetFortranCallback((PetscObject)*ts,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.ijacobian,(PetscVoidFunction)f,fP);
240109c90ceSBarry Smith     *ierr = TSSetIJacobian(*ts,*A,*B,ourijacobian,NULL);
241e2df7a95SSatish Balay   }
242e2df7a95SSatish Balay }
2438cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL tsgetijacobian_(TS *ts,Mat *J,Mat *M,int *func,void **ctx,PetscErrorCode *ierr)
24437698f3aSJed Brown {
24537698f3aSJed Brown   CHKFORTRANNULLINTEGER(ctx);
24637698f3aSJed Brown   CHKFORTRANNULLOBJECT(J);
24737698f3aSJed Brown   CHKFORTRANNULLOBJECT(M);
24837698f3aSJed Brown   *ierr = TSGetIJacobian(*ts,J,M,0,ctx);
24937698f3aSJed Brown }
250e2df7a95SSatish Balay 
25152f0073cSBarry Smith PETSC_EXTERN void tsmonitordefault_(TS *ts,PetscInt *its,PetscReal *fgnorm,Vec *u,PetscViewerAndFormat **dummy,PetscErrorCode *ierr)
25252f0073cSBarry Smith {
253410efd14SBarry Smith   *ierr = TSMonitorDefault(*ts,*its,*fgnorm,*u,*dummy);
25452f0073cSBarry Smith }
25552f0073cSBarry Smith 
256e2df7a95SSatish Balay /* ---------------------------------------------------------*/
257e2df7a95SSatish Balay 
258721cd6eeSBarry Smith /* PETSC_EXTERN void PETSC_STDCALL tsmonitordefault_(TS*,PetscInt*,PetscReal*,Vec*,void*,PetscErrorCode*); */
259e2df7a95SSatish Balay 
260683f640bSBarry Smith PETSC_EXTERN void PETSC_STDCALL tsmonitorset_(TS *ts,void (PETSC_STDCALL*func)(TS*,PetscInt*,PetscReal*,Vec*,void*,PetscErrorCode*),void *mctx,void (PETSC_STDCALL*d)(void*,PetscErrorCode*),PetscErrorCode *ierr)
261e2df7a95SSatish Balay {
262aecf964fSBarry Smith   CHKFORTRANNULLFUNCTION(d);
26352f0073cSBarry Smith   if ((PetscVoidFunction)func == (PetscVoidFunction) tsmonitordefault_) {
2641cb03803SBarry Smith     *ierr = TSMonitorSet(*ts,(PetscErrorCode (*)(TS,PetscInt,PetscReal,Vec,void*))TSMonitorDefault,*(PetscViewerAndFormat**)mctx,(PetscErrorCode (*)(void **))PetscViewerAndFormatDestroy);
265e2df7a95SSatish Balay   } else {
266109c90ceSBarry Smith     *ierr = PetscObjectSetFortranCallback((PetscObject)*ts,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.monitor,(PetscVoidFunction)func,mctx);
267109c90ceSBarry Smith     *ierr = PetscObjectSetFortranCallback((PetscObject)*ts,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.mondestroy,(PetscVoidFunction)d,mctx);
268aecf964fSBarry Smith     *ierr = TSMonitorSet(*ts,ourmonitor,*ts,ourmonitordestroy);
269e2df7a95SSatish Balay   }
270e2df7a95SSatish Balay }
271e2df7a95SSatish Balay 
272e2df7a95SSatish Balay /* ---------------------------------------------------------*/
273089b2837SJed Brown /*  func is currently ignored from Fortran */
2748cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL tsgetrhsjacobian_(TS *ts,Mat *J,Mat *M,int *func,void **ctx,PetscErrorCode *ierr)
275e2df7a95SSatish Balay {
276089b2837SJed Brown   *ierr = TSGetRHSJacobian(*ts,J,M,0,ctx);
277e2df7a95SSatish Balay }
278e2df7a95SSatish Balay 
2798cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL tsview_(TS *ts,PetscViewer *viewer, PetscErrorCode *ierr)
280e2df7a95SSatish Balay {
281e2df7a95SSatish Balay   PetscViewer v;
282e2df7a95SSatish Balay   PetscPatchDefaultViewers_Fortran(viewer,v);
283e2df7a95SSatish Balay   *ierr = TSView(*ts,v);
284e2df7a95SSatish Balay }
285e2df7a95SSatish Balay 
286390e1bf2SBarry Smith PETSC_EXTERN void PETSC_STDCALL tssetoptionsprefix_(TS *ts,char* prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
28737698f3aSJed Brown {
28837698f3aSJed Brown   char *t;
28937698f3aSJed Brown   FIXCHAR(prefix,len,t);
290d49bb8f9SBarry Smith   *ierr = TSSetOptionsPrefix(*ts,t);if (*ierr) return;
29137698f3aSJed Brown   FREECHAR(prefix,t);
29237698f3aSJed Brown }
293390e1bf2SBarry Smith PETSC_EXTERN void PETSC_STDCALL tsgetoptionsprefix_(TS *ts,char* prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
294e2df7a95SSatish Balay {
295e2df7a95SSatish Balay   const char *tname;
296e2df7a95SSatish Balay 
297e2df7a95SSatish Balay   *ierr = TSGetOptionsPrefix(*ts,&tname);
298e2df7a95SSatish Balay   *ierr = PetscStrncpy(prefix,tname,len);
299d6a8cea5SBarry Smith   FIXRETURNCHAR(PETSC_TRUE,prefix,len);
300e2df7a95SSatish Balay }
301390e1bf2SBarry Smith PETSC_EXTERN void PETSC_STDCALL tsappendoptionsprefix_(TS *ts,char* prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
30237698f3aSJed Brown {
30337698f3aSJed Brown   char *t;
30437698f3aSJed Brown   FIXCHAR(prefix,len,t);
305d49bb8f9SBarry Smith   *ierr = TSAppendOptionsPrefix(*ts,t);if (*ierr) return;
30637698f3aSJed Brown   FREECHAR(prefix,t);
30737698f3aSJed Brown }
308e2df7a95SSatish Balay 
309*fe2efc57SMark PETSC_EXTERN void PETSC_STDCALL tsviewfromoptions_(TS *ao,PetscObject obj,char* type PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
310*fe2efc57SMark {
311*fe2efc57SMark   char *t;
312*fe2efc57SMark 
313*fe2efc57SMark   FIXCHAR(type,len,t);
314*fe2efc57SMark   *ierr = TSViewFromOptions(*ao,obj,t);if (*ierr) return;
315*fe2efc57SMark   FREECHAR(type,t);
316*fe2efc57SMark }
317