xref: /petsc/src/ts/interface/ftn-custom/ztsf.c (revision 52f0073ced5fd9215b0e2b68ff91ff6c26508eb4)
1af0996ceSBarry Smith #include <petsc/private/fortranimpl.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
15e2df7a95SSatish Balay #define tsview_                              TSVIEW
1637698f3aSJed Brown #define tssetoptionsprefix_                  TSSETOPTIONSPREFIX
17e2df7a95SSatish Balay #define tsgetoptionsprefix_                  TSGETOPTIONSPREFIX
1837698f3aSJed Brown #define tsappendoptionsprefix_               TSAPPENDOPTIONSPREFIX
19a6570f20SBarry Smith #define tsmonitorset_                        TSMONITORSET
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
37e2df7a95SSatish Balay #define tsview_                              tsview
3837698f3aSJed Brown #define tssetoptionsprefix_                  tssetoptionsprefix
39e2df7a95SSatish Balay #define tsgetoptionsprefix_                  tsgetoptionsprefix
4037698f3aSJed Brown #define tsappendoptionsprefix_               tsappendoptionsprefix
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 
510fecffdcSJed Brown enum {OUR_PRESTEP = 0,
520fecffdcSJed Brown       OUR_POSTSTEP,
530fecffdcSJed Brown       OUR_RHSFUNCTION,
540fecffdcSJed Brown       OUR_IFUNCTION,
550fecffdcSJed Brown       OUR_RHSJACOBIAN,
560fecffdcSJed Brown       OUR_IJACOBIAN,
570fecffdcSJed Brown       OUR_MONITOR,
580fecffdcSJed Brown       OUR_MONITORDESTROY,
590fecffdcSJed Brown       OUR_MONITOR_CTX,   /* Casting from function pointer is invalid according to the standard. */
600fecffdcSJed Brown       OUR_COUNT};
610fecffdcSJed Brown 
62dd7ecb2fSBarry Smith static PetscErrorCode ourprestep(TS ts)
63dd7ecb2fSBarry Smith {
64dd7ecb2fSBarry Smith   PetscErrorCode ierr = 0;
650fecffdcSJed Brown   (*(void (PETSC_STDCALL*)(TS*,PetscErrorCode*))(((PetscObject)ts)->fortran_func_pointers[OUR_PRESTEP]))(&ts,&ierr);
66dd7ecb2fSBarry Smith   return 0;
67dd7ecb2fSBarry Smith }
68dd7ecb2fSBarry Smith static PetscErrorCode ourpoststep(TS ts)
69dd7ecb2fSBarry Smith {
70dd7ecb2fSBarry Smith   PetscErrorCode ierr = 0;
710fecffdcSJed Brown   (*(void (PETSC_STDCALL*)(TS*,PetscErrorCode*))(((PetscObject)ts)->fortran_func_pointers[OUR_POSTSTEP]))(&ts,&ierr);
72dd7ecb2fSBarry Smith   return 0;
73dd7ecb2fSBarry Smith }
740fecffdcSJed Brown static PetscErrorCode ourrhsfunction(TS ts,PetscReal d,Vec x,Vec f,void *ctx)
75e2df7a95SSatish Balay {
76e2df7a95SSatish Balay   PetscErrorCode ierr = 0;
770fecffdcSJed Brown   (*(void (PETSC_STDCALL*)(TS*,PetscReal*,Vec*,Vec*,void*,PetscErrorCode*))(((PetscObject)ts)->fortran_func_pointers[OUR_RHSFUNCTION]))(&ts,&d,&x,&f,ctx,&ierr);
78e2df7a95SSatish Balay   return 0;
79e2df7a95SSatish Balay }
800fecffdcSJed Brown static PetscErrorCode ourifunction(TS ts,PetscReal d,Vec x,Vec xdot,Vec f,void *ctx)
81e2df7a95SSatish Balay {
82e2df7a95SSatish Balay   PetscErrorCode ierr = 0;
830fecffdcSJed Brown   (*(void (PETSC_STDCALL*)(TS*,PetscReal*,Vec*,Vec*,Vec*,void*,PetscErrorCode*))(((PetscObject)ts)->fortran_func_pointers[OUR_IFUNCTION]))(&ts,&d,&x,&xdot,&f,ctx,&ierr);
840fecffdcSJed Brown   return 0;
850fecffdcSJed Brown }
86d1e9a80fSBarry Smith static PetscErrorCode ourrhsjacobian(TS ts,PetscReal d,Vec x,Mat m,Mat p,void *ctx)
870fecffdcSJed Brown {
880fecffdcSJed Brown   PetscErrorCode ierr = 0;
89d1e9a80fSBarry Smith   (*(void (PETSC_STDCALL*)(TS*,PetscReal*,Vec*,Mat*,Mat*,void*,PetscErrorCode*))(((PetscObject)ts)->fortran_func_pointers[OUR_RHSJACOBIAN]))(&ts,&d,&x,&m,&p,ctx,&ierr);
900fecffdcSJed Brown   return 0;
910fecffdcSJed Brown }
92d1e9a80fSBarry Smith static PetscErrorCode ourijacobian(TS ts,PetscReal d,Vec x,Vec xdot,PetscReal shift,Mat m,Mat p,void *ctx)
930fecffdcSJed Brown {
940fecffdcSJed Brown   PetscErrorCode ierr = 0;
95d1e9a80fSBarry Smith   (*(void (PETSC_STDCALL*)(TS*,PetscReal*,Vec*,Vec*,PetscReal*,Mat*,Mat*,void*,PetscErrorCode*))(((PetscObject)ts)->fortran_func_pointers[OUR_IJACOBIAN]))(&ts,&d,&x,&xdot,&shift,&m,&p,ctx,&ierr);
96e2df7a95SSatish Balay   return 0;
97e2df7a95SSatish Balay }
98e2df7a95SSatish Balay 
99c2efdce3SBarry Smith static PetscErrorCode ourmonitordestroy(void **ctx)
100e2df7a95SSatish Balay {
101e2df7a95SSatish Balay   PetscErrorCode ierr  = 0;
102c2efdce3SBarry Smith   TS             ts    = *(TS*)ctx;
1031d14097aSBarry Smith   void           *mctx = (void*) (PETSC_UINTPTR_T) ((PetscObject)ts)->fortran_func_pointers[OUR_MONITOR_CTX];
1040fecffdcSJed Brown   (*(void (PETSC_STDCALL*)(void*,PetscErrorCode*))(((PetscObject)ts)->fortran_func_pointers[OUR_MONITORDESTROY]))(mctx,&ierr);
105e2df7a95SSatish Balay   return 0;
106e2df7a95SSatish Balay }
107e2df7a95SSatish Balay 
108e2df7a95SSatish Balay /*
109e2df7a95SSatish Balay    Note ctx is the same as ts so we need to get the Fortran context out of the TS
110e2df7a95SSatish Balay */
1110fecffdcSJed Brown static PetscErrorCode ourmonitor(TS ts,PetscInt i,PetscReal d,Vec v,void *ctx)
112e2df7a95SSatish Balay {
113e2df7a95SSatish Balay   PetscErrorCode ierr  = 0;
1141d14097aSBarry Smith   void           *mctx = (void*) (PETSC_UINTPTR_T) ((PetscObject)ts)->fortran_func_pointers[OUR_MONITOR_CTX];
1150fecffdcSJed Brown   (*(void (PETSC_STDCALL*)(TS*,PetscInt*,PetscReal*,Vec*,void*,PetscErrorCode*))(((PetscObject)ts)->fortran_func_pointers[OUR_MONITOR]))(&ts,&i,&d,&v,mctx,&ierr);
116e2df7a95SSatish Balay   return 0;
117e2df7a95SSatish Balay }
118e2df7a95SSatish Balay 
119b0bc92c6SBarry Smith /*
120b0bc92c6SBarry Smith    Currently does not handle destroy or context
121b0bc92c6SBarry Smith */
1220d8bfb15SSatish Balay static void (PETSC_STDCALL*yourtransform)(void*ctx,Vec*,Vec*,PetscErrorCode*);
123b0bc92c6SBarry Smith static PetscErrorCode ourtransform(void *ctx,Vec x,Vec *xout)
124b0bc92c6SBarry Smith {
125b0bc92c6SBarry Smith   PetscErrorCode ierr = 0;
126b0bc92c6SBarry Smith   (*yourtransform)(ctx,&x,xout,&ierr);
127b0bc92c6SBarry Smith   return ierr;
128b0bc92c6SBarry Smith }
129b0bc92c6SBarry Smith 
130b0bc92c6SBarry 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)
131b0bc92c6SBarry Smith {
132b0bc92c6SBarry Smith   *ierr = TSMonitorLGSetTransform(*ts,ourtransform,NULL,NULL);
133b0bc92c6SBarry Smith   yourtransform = f;
134b0bc92c6SBarry Smith }
135b0bc92c6SBarry Smith 
1368cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL tssetprestep_(TS *ts,PetscErrorCode (PETSC_STDCALL*f)(TS*,PetscErrorCode*),PetscErrorCode *ierr)
137dd7ecb2fSBarry Smith {
1380fecffdcSJed Brown   PetscObjectAllocateFortranPointers(*ts,OUR_COUNT);
1390fecffdcSJed Brown   ((PetscObject)*ts)->fortran_func_pointers[OUR_PRESTEP] = (PetscVoidFunction)f;
140bbd56ea5SKarl Rupp 
141dd7ecb2fSBarry Smith   *ierr = TSSetPreStep(*ts,ourprestep);
142dd7ecb2fSBarry Smith }
143dd7ecb2fSBarry Smith 
1448cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL tssetpoststep_(TS *ts,PetscErrorCode (PETSC_STDCALL *f)(TS*,PetscErrorCode*),PetscErrorCode *ierr)
145dd7ecb2fSBarry Smith {
1460fecffdcSJed Brown   PetscObjectAllocateFortranPointers(*ts,OUR_COUNT);
1470fecffdcSJed Brown   ((PetscObject)*ts)->fortran_func_pointers[OUR_POSTSTEP] = (PetscVoidFunction)f;
148bbd56ea5SKarl Rupp 
149041da8cfSDebojyoti Ghosh   *ierr = TSSetPostStep(*ts,ourpoststep);
150dd7ecb2fSBarry Smith }
151dd7ecb2fSBarry Smith 
15269c1e2abSSatish Balay PETSC_EXTERN void tscomputerhsfunctionlinear_(TS *ts,PetscReal *t,Vec *X,Vec *F,void *ctx,PetscErrorCode *ierr)
1530e4ef248SJed Brown {
1540e4ef248SJed Brown   *ierr = TSComputeRHSFunctionLinear(*ts,*t,*X,*F,ctx);
1550e4ef248SJed Brown }
1568cc058d9SJed 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)
157e2df7a95SSatish Balay {
1580e4ef248SJed Brown   Vec R;
1590e4ef248SJed Brown   CHKFORTRANNULLOBJECT(r);
1600e4ef248SJed Brown   CHKFORTRANNULLFUNCTION(f);
1610e4ef248SJed Brown   CHKFORTRANNULLOBJECT(fP);
1620298fd71SBarry Smith   R = r ? *r : (Vec)NULL;
1630e4ef248SJed Brown   if ((PetscVoidFunction)f == (PetscVoidFunction)tscomputerhsfunctionlinear_) {
1640e4ef248SJed Brown     *ierr = TSSetRHSFunction(*ts,R,TSComputeRHSFunctionLinear,fP);
1650e4ef248SJed Brown   } else {
1660fecffdcSJed Brown     PetscObjectAllocateFortranPointers(*ts,OUR_COUNT);
1670fecffdcSJed Brown     ((PetscObject)*ts)->fortran_func_pointers[OUR_RHSFUNCTION] = (PetscVoidFunction)f;
1680fecffdcSJed Brown     *ierr = TSSetRHSFunction(*ts,R,ourrhsfunction,fP);
1690fecffdcSJed Brown   }
1700fecffdcSJed Brown }
1718cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL tsgetrhsfunction_(TS *ts,Vec *r,void *func,void **ctx,PetscErrorCode *ierr)
17237698f3aSJed Brown {
17337698f3aSJed Brown   CHKFORTRANNULLINTEGER(ctx);
17437698f3aSJed Brown   CHKFORTRANNULLOBJECT(r);
1750298fd71SBarry Smith   *ierr = TSGetRHSFunction(*ts,r,NULL,ctx);
17637698f3aSJed Brown }
1770fecffdcSJed Brown 
17869c1e2abSSatish Balay PETSC_EXTERN void tscomputeifunctionlinear_(TS *ts,PetscReal *t,Vec *X,Vec *Xdot,Vec *F,void *ctx,PetscErrorCode *ierr)
1790fecffdcSJed Brown {
1800fecffdcSJed Brown   *ierr = TSComputeIFunctionLinear(*ts,*t,*X,*Xdot,*F,ctx);
1810fecffdcSJed Brown }
1828cc058d9SJed 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)
1830fecffdcSJed Brown {
1840fecffdcSJed Brown   Vec R;
1850fecffdcSJed Brown   CHKFORTRANNULLOBJECT(r);
1860fecffdcSJed Brown   CHKFORTRANNULLFUNCTION(f);
1870fecffdcSJed Brown   CHKFORTRANNULLOBJECT(fP);
1880298fd71SBarry Smith   R = r ? *r : (Vec)NULL;
1890fecffdcSJed Brown   if ((PetscVoidFunction)f == (PetscVoidFunction)tscomputeifunctionlinear_) {
1900fecffdcSJed Brown     *ierr = TSSetIFunction(*ts,R,TSComputeIFunctionLinear,fP);
1910fecffdcSJed Brown   } else {
1920fecffdcSJed Brown     PetscObjectAllocateFortranPointers(*ts,OUR_COUNT);
1930fecffdcSJed Brown     ((PetscObject)*ts)->fortran_func_pointers[OUR_IFUNCTION] = (PetscVoidFunction)f;
1940fecffdcSJed Brown     *ierr = TSSetIFunction(*ts,R,ourifunction,fP);
1950e4ef248SJed Brown   }
196e2df7a95SSatish Balay }
1978cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL tsgetifunction_(TS *ts,Vec *r,void *func,void **ctx,PetscErrorCode *ierr)
19837698f3aSJed Brown {
19937698f3aSJed Brown   CHKFORTRANNULLINTEGER(ctx);
20037698f3aSJed Brown   CHKFORTRANNULLOBJECT(r);
2010298fd71SBarry Smith   *ierr = TSGetIFunction(*ts,r,NULL,ctx);
20237698f3aSJed Brown }
20326d46c62SHong Zhang 
204e2df7a95SSatish Balay /* ---------------------------------------------------------*/
205d1e9a80fSBarry Smith PETSC_EXTERN void tscomputerhsjacobianconstant_(TS *ts,PetscReal *t,Vec *X,Mat *A,Mat *B,void *ctx,PetscErrorCode *ierr)
2060e4ef248SJed Brown {
207d1e9a80fSBarry Smith   *ierr = TSComputeRHSJacobianConstant(*ts,*t,*X,*A,*B,ctx);
2080e4ef248SJed Brown }
209d1e9a80fSBarry 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)
210e2df7a95SSatish Balay {
2110fecffdcSJed Brown   PetscObjectAllocateFortranPointers(*ts,OUR_COUNT);
212e2df7a95SSatish Balay   if (FORTRANNULLFUNCTION(f)) {
2130298fd71SBarry Smith     *ierr = TSSetRHSJacobian(*ts,*A,*B,NULL,fP);
2140e4ef248SJed Brown   } else if ((PetscVoidFunction)f == (PetscVoidFunction)tscomputerhsjacobianconstant_) {
2150e4ef248SJed Brown     *ierr = TSSetRHSJacobian(*ts,*A,*B,TSComputeRHSJacobianConstant,fP);
216e2df7a95SSatish Balay   } else {
2170fecffdcSJed Brown     ((PetscObject)*ts)->fortran_func_pointers[OUR_RHSJACOBIAN] = (PetscVoidFunction)f;
2180fecffdcSJed Brown     *ierr = TSSetRHSJacobian(*ts,*A,*B,ourrhsjacobian,fP);
2190fecffdcSJed Brown   }
2200fecffdcSJed Brown }
2210fecffdcSJed Brown 
222d1e9a80fSBarry Smith PETSC_EXTERN void tscomputeijacobianconstant_(TS *ts,PetscReal *t,Vec *X,Vec *Xdot,PetscReal *shift,Mat *A,Mat *B,void *ctx,PetscErrorCode *ierr)
2230fecffdcSJed Brown {
224d1e9a80fSBarry Smith   *ierr = TSComputeIJacobianConstant(*ts,*t,*X,*Xdot,*shift,*A,*B,ctx);
2250fecffdcSJed Brown }
226d1e9a80fSBarry 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)
2270fecffdcSJed Brown {
2280fecffdcSJed Brown   PetscObjectAllocateFortranPointers(*ts,OUR_COUNT);
2290fecffdcSJed Brown   if (FORTRANNULLFUNCTION(f)) {
2300298fd71SBarry Smith     *ierr = TSSetIJacobian(*ts,*A,*B,NULL,fP);
2310fecffdcSJed Brown   } else if ((PetscVoidFunction)f == (PetscVoidFunction)tscomputeijacobianconstant_) {
2320fecffdcSJed Brown     *ierr = TSSetIJacobian(*ts,*A,*B,TSComputeIJacobianConstant,fP);
2330fecffdcSJed Brown   } else {
2340fecffdcSJed Brown     ((PetscObject)*ts)->fortran_func_pointers[OUR_IJACOBIAN] = (PetscVoidFunction)f;
2350fecffdcSJed Brown     *ierr = TSSetIJacobian(*ts,*A,*B,ourijacobian,fP);
236e2df7a95SSatish Balay   }
237e2df7a95SSatish Balay }
2388cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL tsgetijacobian_(TS *ts,Mat *J,Mat *M,int *func,void **ctx,PetscErrorCode *ierr)
23937698f3aSJed Brown {
24037698f3aSJed Brown   CHKFORTRANNULLINTEGER(ctx);
24137698f3aSJed Brown   CHKFORTRANNULLOBJECT(J);
24237698f3aSJed Brown   CHKFORTRANNULLOBJECT(M);
24337698f3aSJed Brown   *ierr = TSGetIJacobian(*ts,J,M,0,ctx);
24437698f3aSJed Brown }
245e2df7a95SSatish Balay 
246*52f0073cSBarry Smith PETSC_EXTERN void tsmonitordefault_(TS *ts,PetscInt *its,PetscReal *fgnorm,Vec *u,PetscViewerAndFormat **dummy,PetscErrorCode *ierr)
247*52f0073cSBarry Smith {
248*52f0073cSBarry Smith   *ierr = TSMonitorDefault(*ts,*its,*fgnorm,*u,dummy);
249*52f0073cSBarry Smith }
250*52f0073cSBarry Smith 
251e2df7a95SSatish Balay /* ---------------------------------------------------------*/
252e2df7a95SSatish Balay 
253721cd6eeSBarry Smith /* PETSC_EXTERN void PETSC_STDCALL tsmonitordefault_(TS*,PetscInt*,PetscReal*,Vec*,void*,PetscErrorCode*); */
254e2df7a95SSatish Balay 
2558cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL tsmonitorset_(TS *ts,void (PETSC_STDCALL*func)(TS*,PetscInt*,PetscReal*,Vec*,void*,PetscErrorCode*),void (*mctx)(void),void (PETSC_STDCALL*d)(void*,PetscErrorCode*),PetscErrorCode *ierr)
256e2df7a95SSatish Balay {
2570fecffdcSJed Brown   PetscObjectAllocateFortranPointers(*ts,OUR_COUNT);
258*52f0073cSBarry Smith   if ((PetscVoidFunction)func == (PetscVoidFunction) tsmonitordefault_) {
2591cb03803SBarry Smith     *ierr = TSMonitorSet(*ts,(PetscErrorCode (*)(TS,PetscInt,PetscReal,Vec,void*))TSMonitorDefault,*(PetscViewerAndFormat**)mctx,(PetscErrorCode (*)(void **))PetscViewerAndFormatDestroy);
260e2df7a95SSatish Balay   } else {
2610fecffdcSJed Brown     ((PetscObject)*ts)->fortran_func_pointers[OUR_MONITOR]        = (PetscVoidFunction)func;
2620fecffdcSJed Brown     ((PetscObject)*ts)->fortran_func_pointers[OUR_MONITORDESTROY] = (PetscVoidFunction)d;
2630fecffdcSJed Brown     ((PetscObject)*ts)->fortran_func_pointers[OUR_MONITOR_CTX]    = (PetscVoidFunction)mctx;
264e2df7a95SSatish Balay     if (FORTRANNULLFUNCTION(d)) {
2650fecffdcSJed Brown       *ierr = TSMonitorSet(*ts,ourmonitor,*ts,0);
266e2df7a95SSatish Balay     } else {
2670fecffdcSJed Brown       *ierr = TSMonitorSet(*ts,ourmonitor,*ts,ourmonitordestroy);
268e2df7a95SSatish Balay     }
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 
2868cc058d9SJed Brown 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);
29037698f3aSJed Brown   *ierr = TSSetOptionsPrefix(*ts,t);
29137698f3aSJed Brown   FREECHAR(prefix,t);
29237698f3aSJed Brown }
2938cc058d9SJed Brown 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);
299e2df7a95SSatish Balay }
3008cc058d9SJed Brown PETSC_EXTERN void PETSC_STDCALL tsappendoptionsprefix_(TS *ts,CHAR prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
30137698f3aSJed Brown {
30237698f3aSJed Brown   char *t;
30337698f3aSJed Brown   FIXCHAR(prefix,len,t);
30437698f3aSJed Brown   *ierr = TSAppendOptionsPrefix(*ts,t);
30537698f3aSJed Brown   FREECHAR(prefix,t);
30637698f3aSJed Brown }
307e2df7a95SSatish Balay 
308