1c6db04a5SJed Brown #include <private/fortranimpl.h> 2c6db04a5SJed Brown #include <petscts.h> 3e2df7a95SSatish Balay 4e2df7a95SSatish Balay #if defined(PETSC_HAVE_FORTRAN_CAPS) 5e2df7a95SSatish Balay #define tssetrhsfunction_ TSSETRHSFUNCTION 6e2df7a95SSatish Balay #define tssetrhsjacobian_ TSSETRHSJACOBIAN 7e2df7a95SSatish Balay #define tsgetrhsjacobian_ TSGETRHSJACOBIAN 8e2df7a95SSatish Balay #define tsview_ TSVIEW 9e2df7a95SSatish Balay #define tsgetoptionsprefix_ TSGETOPTIONSPREFIX 10a6570f20SBarry Smith #define tsmonitorset_ TSMONITORSET 110e4ef248SJed Brown #define tscomputerhsfunctionlinear_ TSCOMPUTERHSFUNCTIONLINEAR 120e4ef248SJed Brown #define tscomputerhsjacobianconstant_ TSCOMPUTERHSJACOBIANCONSTANT 13*0fecffdcSJed Brown #define tscomputeifunctionlinear_ TSCOMPUTEIFUNCTIONLINEAR 14*0fecffdcSJed Brown #define tscomputeijacobianconstant_ TSCOMPUTEIJACOBIANCONSTANT 15e2df7a95SSatish Balay #define tsdefaultcomputejacobian_ TSDEFAULTCOMPUTEJACOBIAN 16e2df7a95SSatish Balay #define tsdefaultcomputejacobiancolor_ TSDEFAULTCOMPUTEJACOBIANCOLOR 17a6570f20SBarry Smith #define tsmonitordefault_ TSMONITORDEFAULT 18dd7ecb2fSBarry Smith #define tssetprestep_ TSSETPRESTEP 19dd7ecb2fSBarry Smith #define tssetpoststep_ TSSETPOSTSTEP 20e2df7a95SSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE) 21e2df7a95SSatish Balay #define tssetrhsfunction_ tssetrhsfunction 22e2df7a95SSatish Balay #define tssetrhsjacobian_ tssetrhsjacobian 23e2df7a95SSatish Balay #define tsgetrhsjacobian_ tsgetrhsjacobian 24e2df7a95SSatish Balay #define tsview_ tsview 25e2df7a95SSatish Balay #define tsgetoptionsprefix_ tsgetoptionsprefix 26a6570f20SBarry Smith #define tsmonitorset_ tsmonitorset 270e4ef248SJed Brown #define tscomputerhsfunctionlinear_ tscomputerhsfunctionlinear 280e4ef248SJed Brown #define tscomputerhsjacobianconstant_ tscomputerhsjacobianconstant 29*0fecffdcSJed Brown #define tscomputeifunctionlinear_ tscomputeifunctionlinear 30*0fecffdcSJed Brown #define tscomputeijacobianconstant_ tscomputeijacobianconstant 31e2df7a95SSatish Balay #define tsdefaultcomputejacobian_ tsdefaultcomputejacobian 32e2df7a95SSatish Balay #define tsdefaultcomputejacobiancolor_ tsdefaultcomputejacobiancolor 33a6570f20SBarry Smith #define tsmonitordefault_ tsmonitordefault 34dd7ecb2fSBarry Smith #define tssetprestep_ tssetprestep 35dd7ecb2fSBarry Smith #define tssetpoststep_ tssetpoststep 36e2df7a95SSatish Balay #endif 37e2df7a95SSatish Balay 38*0fecffdcSJed Brown enum {OUR_PRESTEP = 0, 39*0fecffdcSJed Brown OUR_POSTSTEP, 40*0fecffdcSJed Brown OUR_RHSFUNCTION, 41*0fecffdcSJed Brown OUR_IFUNCTION, 42*0fecffdcSJed Brown OUR_RHSJACOBIAN, 43*0fecffdcSJed Brown OUR_IJACOBIAN, 44*0fecffdcSJed Brown OUR_MONITOR, 45*0fecffdcSJed Brown OUR_MONITORDESTROY, 46*0fecffdcSJed Brown OUR_MONITOR_CTX, /* Casting from function pointer is invalid according to the standard. */ 47*0fecffdcSJed Brown OUR_COUNT}; 48*0fecffdcSJed Brown 49dd7ecb2fSBarry Smith static PetscErrorCode ourprestep(TS ts) 50dd7ecb2fSBarry Smith { 51dd7ecb2fSBarry Smith PetscErrorCode ierr = 0; 52*0fecffdcSJed Brown (*(void (PETSC_STDCALL *)(TS*,PetscErrorCode*))(((PetscObject)ts)->fortran_func_pointers[OUR_PRESTEP]))(&ts,&ierr); 53dd7ecb2fSBarry Smith return 0; 54dd7ecb2fSBarry Smith } 55dd7ecb2fSBarry Smith static PetscErrorCode ourpoststep(TS ts) 56dd7ecb2fSBarry Smith { 57dd7ecb2fSBarry Smith PetscErrorCode ierr = 0; 58*0fecffdcSJed Brown (*(void (PETSC_STDCALL *)(TS*,PetscErrorCode*))(((PetscObject)ts)->fortran_func_pointers[OUR_POSTSTEP]))(&ts,&ierr); 59dd7ecb2fSBarry Smith return 0; 60dd7ecb2fSBarry Smith } 61*0fecffdcSJed Brown static PetscErrorCode ourrhsfunction(TS ts,PetscReal d,Vec x,Vec f,void *ctx) 62e2df7a95SSatish Balay { 63e2df7a95SSatish Balay PetscErrorCode ierr = 0; 64*0fecffdcSJed Brown (*(void (PETSC_STDCALL *)(TS*,PetscReal*,Vec*,Vec*,void*,PetscErrorCode*))(((PetscObject)ts)->fortran_func_pointers[OUR_RHSFUNCTION]))(&ts,&d,&x,&f,ctx,&ierr); 65e2df7a95SSatish Balay return 0; 66e2df7a95SSatish Balay } 67*0fecffdcSJed Brown static PetscErrorCode ourifunction(TS ts,PetscReal d,Vec x,Vec xdot,Vec f,void *ctx) 68e2df7a95SSatish Balay { 69e2df7a95SSatish Balay PetscErrorCode ierr = 0; 70*0fecffdcSJed 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); 71*0fecffdcSJed Brown return 0; 72*0fecffdcSJed Brown } 73*0fecffdcSJed Brown static PetscErrorCode ourrhsjacobian(TS ts,PetscReal d,Vec x,Mat* m,Mat* p,MatStructure* type,void*ctx) 74*0fecffdcSJed Brown { 75*0fecffdcSJed Brown PetscErrorCode ierr = 0; 76*0fecffdcSJed Brown (*(void (PETSC_STDCALL *)(TS*,PetscReal*,Vec*,Mat*,Mat*,MatStructure*,void*,PetscErrorCode*))(((PetscObject)ts)->fortran_func_pointers[OUR_RHSJACOBIAN]))(&ts,&d,&x,m,p,type,ctx,&ierr); 77*0fecffdcSJed Brown return 0; 78*0fecffdcSJed Brown } 79*0fecffdcSJed Brown static PetscErrorCode ourijacobian(TS ts,PetscReal d,Vec x,Vec xdot,PetscReal shift,Mat* m,Mat* p,MatStructure* type,void*ctx) 80*0fecffdcSJed Brown { 81*0fecffdcSJed Brown PetscErrorCode ierr = 0; 82*0fecffdcSJed Brown (*(void (PETSC_STDCALL *)(TS*,PetscReal*,Vec*,Vec*,PetscReal*,Mat*,Mat*,MatStructure*,void*,PetscErrorCode*))(((PetscObject)ts)->fortran_func_pointers[OUR_IJACOBIAN]))(&ts,&d,&x,&xdot,&shift,m,p,type,ctx,&ierr); 83e2df7a95SSatish Balay return 0; 84e2df7a95SSatish Balay } 85e2df7a95SSatish Balay 86c2efdce3SBarry Smith static PetscErrorCode ourmonitordestroy(void **ctx) 87e2df7a95SSatish Balay { 88e2df7a95SSatish Balay PetscErrorCode ierr = 0; 89c2efdce3SBarry Smith TS ts = *(TS*)ctx; 90*0fecffdcSJed Brown void *mctx = (void*) ((PetscObject)ts)->fortran_func_pointers[OUR_MONITOR_CTX]; 91*0fecffdcSJed Brown (*(void (PETSC_STDCALL *)(void*,PetscErrorCode*))(((PetscObject)ts)->fortran_func_pointers[OUR_MONITORDESTROY]))(mctx,&ierr); 92e2df7a95SSatish Balay return 0; 93e2df7a95SSatish Balay } 94e2df7a95SSatish Balay 95e2df7a95SSatish Balay /* 96e2df7a95SSatish Balay Note ctx is the same as ts so we need to get the Fortran context out of the TS 97e2df7a95SSatish Balay */ 98*0fecffdcSJed Brown static PetscErrorCode ourmonitor(TS ts,PetscInt i,PetscReal d,Vec v,void*ctx) 99e2df7a95SSatish Balay { 100e2df7a95SSatish Balay PetscErrorCode ierr = 0; 101*0fecffdcSJed Brown void *mctx = (void*) ((PetscObject)ts)->fortran_func_pointers[OUR_MONITOR_CTX]; 102*0fecffdcSJed Brown (*(void (PETSC_STDCALL *)(TS*,PetscInt*,PetscReal*,Vec*,void*,PetscErrorCode*))(((PetscObject)ts)->fortran_func_pointers[OUR_MONITOR]))(&ts,&i,&d,&v,mctx,&ierr); 103e2df7a95SSatish Balay return 0; 104e2df7a95SSatish Balay } 105e2df7a95SSatish Balay 106e2df7a95SSatish Balay EXTERN_C_BEGIN 107e2df7a95SSatish Balay 108dd7ecb2fSBarry Smith void PETSC_STDCALL tssetprestep_(TS *ts,PetscErrorCode (PETSC_STDCALL *f)(TS*,PetscErrorCode*),PetscErrorCode *ierr) 109dd7ecb2fSBarry Smith { 110*0fecffdcSJed Brown PetscObjectAllocateFortranPointers(*ts,OUR_COUNT); 111*0fecffdcSJed Brown ((PetscObject)*ts)->fortran_func_pointers[OUR_PRESTEP] = (PetscVoidFunction)f; 112dd7ecb2fSBarry Smith *ierr = TSSetPreStep(*ts,ourprestep); 113dd7ecb2fSBarry Smith } 114dd7ecb2fSBarry Smith 115dd7ecb2fSBarry Smith void PETSC_STDCALL tssetpoststep_(TS *ts,PetscErrorCode (PETSC_STDCALL *f)(TS*,PetscErrorCode*),PetscErrorCode *ierr) 116dd7ecb2fSBarry Smith { 117*0fecffdcSJed Brown PetscObjectAllocateFortranPointers(*ts,OUR_COUNT); 118*0fecffdcSJed Brown ((PetscObject)*ts)->fortran_func_pointers[OUR_POSTSTEP] = (PetscVoidFunction)f; 119dd7ecb2fSBarry Smith *ierr = TSSetPreStep(*ts,ourpoststep); 120dd7ecb2fSBarry Smith } 121dd7ecb2fSBarry Smith 1220e4ef248SJed Brown void tscomputerhsfunctionlinear_(TS *ts,PetscReal *t,Vec *X,Vec *F,void *ctx,PetscErrorCode *ierr) 1230e4ef248SJed Brown { 1240e4ef248SJed Brown *ierr = TSComputeRHSFunctionLinear(*ts,*t,*X,*F,ctx); 1250e4ef248SJed Brown } 126089b2837SJed Brown void PETSC_STDCALL tssetrhsfunction_(TS *ts,Vec *r,PetscErrorCode (PETSC_STDCALL *f)(TS*,PetscReal*,Vec*,Vec*,void*,PetscErrorCode*),void*fP,PetscErrorCode *ierr) 127e2df7a95SSatish Balay { 1280e4ef248SJed Brown Vec R; 1290e4ef248SJed Brown CHKFORTRANNULLOBJECT(r); 1300e4ef248SJed Brown CHKFORTRANNULLFUNCTION(f); 1310e4ef248SJed Brown CHKFORTRANNULLOBJECT(fP); 1320e4ef248SJed Brown R = r ? *r : PETSC_NULL; 1330e4ef248SJed Brown if ((PetscVoidFunction)f == (PetscVoidFunction)tscomputerhsfunctionlinear_) { 1340e4ef248SJed Brown *ierr = TSSetRHSFunction(*ts,R,TSComputeRHSFunctionLinear,fP); 1350e4ef248SJed Brown } else { 136*0fecffdcSJed Brown PetscObjectAllocateFortranPointers(*ts,OUR_COUNT); 137*0fecffdcSJed Brown ((PetscObject)*ts)->fortran_func_pointers[OUR_RHSFUNCTION] = (PetscVoidFunction)f; 138*0fecffdcSJed Brown *ierr = TSSetRHSFunction(*ts,R,ourrhsfunction,fP); 139*0fecffdcSJed Brown } 140*0fecffdcSJed Brown } 141*0fecffdcSJed Brown 142*0fecffdcSJed Brown void tscomputeifunctionlinear_(TS *ts,PetscReal *t,Vec *X,Vec *Xdot,Vec *F,void *ctx,PetscErrorCode *ierr) 143*0fecffdcSJed Brown { 144*0fecffdcSJed Brown *ierr = TSComputeIFunctionLinear(*ts,*t,*X,*Xdot,*F,ctx); 145*0fecffdcSJed Brown } 146*0fecffdcSJed Brown void PETSC_STDCALL tssetifunction_(TS *ts,Vec *r,PetscErrorCode (PETSC_STDCALL *f)(TS*,PetscReal*,Vec*,Vec*,Vec*,void*,PetscErrorCode*),void*fP,PetscErrorCode *ierr) 147*0fecffdcSJed Brown { 148*0fecffdcSJed Brown Vec R; 149*0fecffdcSJed Brown CHKFORTRANNULLOBJECT(r); 150*0fecffdcSJed Brown CHKFORTRANNULLFUNCTION(f); 151*0fecffdcSJed Brown CHKFORTRANNULLOBJECT(fP); 152*0fecffdcSJed Brown R = r ? *r : PETSC_NULL; 153*0fecffdcSJed Brown if ((PetscVoidFunction)f == (PetscVoidFunction)tscomputeifunctionlinear_) { 154*0fecffdcSJed Brown *ierr = TSSetIFunction(*ts,R,TSComputeIFunctionLinear,fP); 155*0fecffdcSJed Brown } else { 156*0fecffdcSJed Brown PetscObjectAllocateFortranPointers(*ts,OUR_COUNT); 157*0fecffdcSJed Brown ((PetscObject)*ts)->fortran_func_pointers[OUR_IFUNCTION] = (PetscVoidFunction)f; 158*0fecffdcSJed Brown *ierr = TSSetIFunction(*ts,R,ourifunction,fP); 1590e4ef248SJed Brown } 160e2df7a95SSatish Balay } 16126d46c62SHong Zhang 162e2df7a95SSatish Balay /* ---------------------------------------------------------*/ 163e2df7a95SSatish Balay extern void tsdefaultcomputejacobian_(TS*,PetscReal*,Vec*,Mat*,Mat*,MatStructure*,void*,PetscErrorCode*); 164e2df7a95SSatish Balay extern void tsdefaultcomputejacobiancolor_(TS*,PetscReal*,Vec*,Mat*,Mat*,MatStructure*,void*,PetscErrorCode*); 1650e4ef248SJed Brown void tscomputerhsjacobianconstant_(TS *ts,PetscReal *t,Vec *X,Mat *A,Mat *B,MatStructure *flg,void *ctx,PetscErrorCode *ierr) 1660e4ef248SJed Brown { 1670e4ef248SJed Brown *ierr = TSComputeRHSJacobianConstant(*ts,*t,*X,A,B,flg,ctx); 1680e4ef248SJed Brown } 169e2df7a95SSatish Balay void PETSC_STDCALL tssetrhsjacobian_(TS *ts,Mat *A,Mat *B,void (PETSC_STDCALL *f)(TS*,PetscReal*,Vec*,Mat*,Mat*,MatStructure*, 170e2df7a95SSatish Balay void*,PetscErrorCode*),void*fP,PetscErrorCode *ierr) 171e2df7a95SSatish Balay { 172*0fecffdcSJed Brown PetscObjectAllocateFortranPointers(*ts,OUR_COUNT); 173e2df7a95SSatish Balay if (FORTRANNULLFUNCTION(f)) { 174e2df7a95SSatish Balay *ierr = TSSetRHSJacobian(*ts,*A,*B,PETSC_NULL,fP); 1750e4ef248SJed Brown } else if ((PetscVoidFunction)f == (PetscVoidFunction)tscomputerhsjacobianconstant_) { 1760e4ef248SJed Brown *ierr = TSSetRHSJacobian(*ts,*A,*B,TSComputeRHSJacobianConstant,fP); 177f68b968cSBarry Smith } else if ((PetscVoidFunction)f == (PetscVoidFunction)tsdefaultcomputejacobian_) { 178e2df7a95SSatish Balay *ierr = TSSetRHSJacobian(*ts,*A,*B,TSDefaultComputeJacobian,fP); 179f68b968cSBarry Smith } else if ((PetscVoidFunction)f == (PetscVoidFunction)tsdefaultcomputejacobiancolor_) { 180e2df7a95SSatish Balay *ierr = TSSetRHSJacobian(*ts,*A,*B,TSDefaultComputeJacobianColor,*(MatFDColoring*)fP); 181e2df7a95SSatish Balay } else { 182*0fecffdcSJed Brown ((PetscObject)*ts)->fortran_func_pointers[OUR_RHSJACOBIAN] = (PetscVoidFunction)f; 183*0fecffdcSJed Brown *ierr = TSSetRHSJacobian(*ts,*A,*B,ourrhsjacobian,fP); 184*0fecffdcSJed Brown } 185*0fecffdcSJed Brown } 186*0fecffdcSJed Brown 187*0fecffdcSJed Brown void tscomputeijacobianconstant_(TS *ts,PetscReal *t,Vec *X,Vec *Xdot,PetscReal *shift,Mat *A,Mat *B,MatStructure *flg,void *ctx,PetscErrorCode *ierr) 188*0fecffdcSJed Brown { 189*0fecffdcSJed Brown *ierr = TSComputeIJacobianConstant(*ts,*t,*X,*Xdot,*shift,A,B,flg,ctx); 190*0fecffdcSJed Brown } 191*0fecffdcSJed Brown void PETSC_STDCALL tssetijacobian_(TS *ts,Mat *A,Mat *B,void (PETSC_STDCALL *f)(TS*,PetscReal*,Vec*,Mat*,Mat*,MatStructure*, 192*0fecffdcSJed Brown void*,PetscErrorCode*),void*fP,PetscErrorCode *ierr) 193*0fecffdcSJed Brown { 194*0fecffdcSJed Brown PetscObjectAllocateFortranPointers(*ts,OUR_COUNT); 195*0fecffdcSJed Brown if (FORTRANNULLFUNCTION(f)) { 196*0fecffdcSJed Brown *ierr = TSSetIJacobian(*ts,*A,*B,PETSC_NULL,fP); 197*0fecffdcSJed Brown } else if ((PetscVoidFunction)f == (PetscVoidFunction)tscomputeijacobianconstant_) { 198*0fecffdcSJed Brown *ierr = TSSetIJacobian(*ts,*A,*B,TSComputeIJacobianConstant,fP); 199*0fecffdcSJed Brown } else { 200*0fecffdcSJed Brown ((PetscObject)*ts)->fortran_func_pointers[OUR_IJACOBIAN] = (PetscVoidFunction)f; 201*0fecffdcSJed Brown *ierr = TSSetIJacobian(*ts,*A,*B,ourijacobian,fP); 202e2df7a95SSatish Balay } 203e2df7a95SSatish Balay } 204e2df7a95SSatish Balay 205e2df7a95SSatish Balay /* ---------------------------------------------------------*/ 206e2df7a95SSatish Balay 207a6570f20SBarry Smith extern void PETSC_STDCALL tsmonitordefault_(TS*,PetscInt*,PetscReal*,Vec*,void*,PetscErrorCode*); 208e2df7a95SSatish Balay 209a6570f20SBarry Smith 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) 210e2df7a95SSatish Balay { 211*0fecffdcSJed Brown PetscObjectAllocateFortranPointers(*ts,OUR_COUNT); 212a6570f20SBarry Smith if ((PetscVoidFunction)func == (PetscVoidFunction)tsmonitordefault_) { 213a6570f20SBarry Smith *ierr = TSMonitorSet(*ts,TSMonitorDefault,0,0); 214e2df7a95SSatish Balay } else { 215*0fecffdcSJed Brown ((PetscObject)*ts)->fortran_func_pointers[OUR_MONITOR] = (PetscVoidFunction)func; 216*0fecffdcSJed Brown ((PetscObject)*ts)->fortran_func_pointers[OUR_MONITORDESTROY] = (PetscVoidFunction)d; 217*0fecffdcSJed Brown ((PetscObject)*ts)->fortran_func_pointers[OUR_MONITOR_CTX] = (PetscVoidFunction)mctx; 218e2df7a95SSatish Balay if (FORTRANNULLFUNCTION(d)) { 219*0fecffdcSJed Brown *ierr = TSMonitorSet(*ts,ourmonitor,*ts,0); 220e2df7a95SSatish Balay } else { 221*0fecffdcSJed Brown *ierr = TSMonitorSet(*ts,ourmonitor,*ts,ourmonitordestroy); 222e2df7a95SSatish Balay } 223e2df7a95SSatish Balay } 224e2df7a95SSatish Balay } 225e2df7a95SSatish Balay 226e2df7a95SSatish Balay /* ---------------------------------------------------------*/ 227089b2837SJed Brown /* func is currently ignored from Fortran */ 228089b2837SJed Brown void PETSC_STDCALL tsgetrhsjacobian_(TS *ts,Mat *J,Mat *M,int *func,void **ctx,PetscErrorCode *ierr) 229e2df7a95SSatish Balay { 230089b2837SJed Brown *ierr = TSGetRHSJacobian(*ts,J,M,0,ctx); 231e2df7a95SSatish Balay } 232e2df7a95SSatish Balay 233e2df7a95SSatish Balay void PETSC_STDCALL tsview_(TS *ts,PetscViewer *viewer, PetscErrorCode *ierr) 234e2df7a95SSatish Balay { 235e2df7a95SSatish Balay PetscViewer v; 236e2df7a95SSatish Balay PetscPatchDefaultViewers_Fortran(viewer,v); 237e2df7a95SSatish Balay *ierr = TSView(*ts,v); 238e2df7a95SSatish Balay } 239e2df7a95SSatish Balay 240e2df7a95SSatish Balay void PETSC_STDCALL tsgetoptionsprefix_(TS *ts,CHAR prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len)) 241e2df7a95SSatish Balay { 242e2df7a95SSatish Balay const char *tname; 243e2df7a95SSatish Balay 244e2df7a95SSatish Balay *ierr = TSGetOptionsPrefix(*ts,&tname); 245e2df7a95SSatish Balay *ierr = PetscStrncpy(prefix,tname,len); 246e2df7a95SSatish Balay } 247e2df7a95SSatish Balay 248e2df7a95SSatish Balay 249e2df7a95SSatish Balay EXTERN_C_END 250