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