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 11*0e4ef248SJed Brown #define tscomputerhsfunctionlinear_ TSCOMPUTERHSFUNCTIONLINEAR 12*0e4ef248SJed Brown #define tscomputerhsjacobianconstant_ TSCOMPUTERHSJACOBIANCONSTANT 13e2df7a95SSatish Balay #define tsdefaultcomputejacobian_ TSDEFAULTCOMPUTEJACOBIAN 14e2df7a95SSatish Balay #define tsdefaultcomputejacobiancolor_ TSDEFAULTCOMPUTEJACOBIANCOLOR 15a6570f20SBarry Smith #define tsmonitordefault_ TSMONITORDEFAULT 16dd7ecb2fSBarry Smith #define tssetprestep_ TSSETPRESTEP 17dd7ecb2fSBarry Smith #define tssetpoststep_ TSSETPOSTSTEP 18e2df7a95SSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE) 19e2df7a95SSatish Balay #define tssetrhsfunction_ tssetrhsfunction 20e2df7a95SSatish Balay #define tssetrhsjacobian_ tssetrhsjacobian 21e2df7a95SSatish Balay #define tsgetrhsjacobian_ tsgetrhsjacobian 22e2df7a95SSatish Balay #define tsview_ tsview 23e2df7a95SSatish Balay #define tsgetoptionsprefix_ tsgetoptionsprefix 24a6570f20SBarry Smith #define tsmonitorset_ tsmonitorset 25*0e4ef248SJed Brown #define tscomputerhsfunctionlinear_ tscomputerhsfunctionlinear 26*0e4ef248SJed Brown #define tscomputerhsjacobianconstant_ tscomputerhsjacobianconstant 27e2df7a95SSatish Balay #define tsdefaultcomputejacobian_ tsdefaultcomputejacobian 28e2df7a95SSatish Balay #define tsdefaultcomputejacobiancolor_ tsdefaultcomputejacobiancolor 29a6570f20SBarry Smith #define tsmonitordefault_ tsmonitordefault 30dd7ecb2fSBarry Smith #define tssetprestep_ tssetprestep 31dd7ecb2fSBarry Smith #define tssetpoststep_ tssetpoststep 32e2df7a95SSatish Balay #endif 33e2df7a95SSatish Balay 34dd7ecb2fSBarry Smith static PetscErrorCode ourprestep(TS ts) 35dd7ecb2fSBarry Smith { 36dd7ecb2fSBarry Smith PetscErrorCode ierr = 0; 37dd7ecb2fSBarry Smith (*(void (PETSC_STDCALL *)(TS*,PetscErrorCode*))(((PetscObject)ts)->fortran_func_pointers[8]))(&ts,&ierr); 38dd7ecb2fSBarry Smith return 0; 39dd7ecb2fSBarry Smith } 40dd7ecb2fSBarry Smith static PetscErrorCode ourpoststep(TS ts) 41dd7ecb2fSBarry Smith { 42dd7ecb2fSBarry Smith PetscErrorCode ierr = 0; 43dd7ecb2fSBarry Smith (*(void (PETSC_STDCALL *)(TS*,PetscErrorCode*))(((PetscObject)ts)->fortran_func_pointers[9]))(&ts,&ierr); 44dd7ecb2fSBarry Smith return 0; 45dd7ecb2fSBarry Smith } 46e2df7a95SSatish Balay static PetscErrorCode ourtsfunction(TS ts,PetscReal d,Vec x,Vec f,void *ctx) 47e2df7a95SSatish Balay { 48e2df7a95SSatish Balay PetscErrorCode ierr = 0; 49e2df7a95SSatish Balay (*(void (PETSC_STDCALL *)(TS*,PetscReal*,Vec*,Vec*,void*,PetscErrorCode*))(((PetscObject)ts)->fortran_func_pointers[1]))(&ts,&d,&x,&f,ctx,&ierr); 50e2df7a95SSatish Balay return 0; 51e2df7a95SSatish Balay } 52e2df7a95SSatish Balay static PetscErrorCode ourtsjacobian(TS ts,PetscReal d,Vec x,Mat* m,Mat* p,MatStructure* type,void*ctx) 53e2df7a95SSatish Balay { 54e2df7a95SSatish Balay PetscErrorCode ierr = 0; 55e2df7a95SSatish Balay (*(void (PETSC_STDCALL *)(TS*,PetscReal*,Vec*,Mat*,Mat*,MatStructure*,void*,PetscErrorCode*))(((PetscObject)ts)->fortran_func_pointers[3]))(&ts,&d,&x,m,p,type,ctx,&ierr); 56e2df7a95SSatish Balay return 0; 57e2df7a95SSatish Balay } 58e2df7a95SSatish Balay 59c2efdce3SBarry Smith static PetscErrorCode ourmonitordestroy(void **ctx) 60e2df7a95SSatish Balay { 61e2df7a95SSatish Balay PetscErrorCode ierr = 0; 62c2efdce3SBarry Smith TS ts = *(TS*)ctx; 636895c445SBarry Smith void *mctx = (void*) ((PetscObject)ts)->fortran_func_pointers[6]; 646895c445SBarry Smith (*(void (PETSC_STDCALL *)(void*,PetscErrorCode*))(((PetscObject)ts)->fortran_func_pointers[5]))(mctx,&ierr); 65e2df7a95SSatish Balay return 0; 66e2df7a95SSatish Balay } 67e2df7a95SSatish Balay 68e2df7a95SSatish Balay /* 69e2df7a95SSatish Balay Note ctx is the same as ts so we need to get the Fortran context out of the TS 70e2df7a95SSatish Balay */ 71e2df7a95SSatish Balay static PetscErrorCode ourtsmonitor(TS ts,PetscInt i,PetscReal d,Vec v,void*ctx) 72e2df7a95SSatish Balay { 73e2df7a95SSatish Balay PetscErrorCode ierr = 0; 746895c445SBarry Smith void *mctx = (void*) ((PetscObject)ts)->fortran_func_pointers[6]; 756895c445SBarry Smith (*(void (PETSC_STDCALL *)(TS*,PetscInt*,PetscReal*,Vec*,void*,PetscErrorCode*))(((PetscObject)ts)->fortran_func_pointers[4]))(&ts,&i,&d,&v,mctx,&ierr); 76e2df7a95SSatish Balay return 0; 77e2df7a95SSatish Balay } 78e2df7a95SSatish Balay 79e2df7a95SSatish Balay EXTERN_C_BEGIN 80e2df7a95SSatish Balay 81dd7ecb2fSBarry Smith void PETSC_STDCALL tssetprestep_(TS *ts,PetscErrorCode (PETSC_STDCALL *f)(TS*,PetscErrorCode*),PetscErrorCode *ierr) 82dd7ecb2fSBarry Smith { 83dd7ecb2fSBarry Smith PetscObjectAllocateFortranPointers(*ts,10); 84dd7ecb2fSBarry Smith ((PetscObject)*ts)->fortran_func_pointers[8] = (PetscVoidFunction)f; 85dd7ecb2fSBarry Smith *ierr = TSSetPreStep(*ts,ourprestep); 86dd7ecb2fSBarry Smith } 87dd7ecb2fSBarry Smith 88dd7ecb2fSBarry Smith void PETSC_STDCALL tssetpoststep_(TS *ts,PetscErrorCode (PETSC_STDCALL *f)(TS*,PetscErrorCode*),PetscErrorCode *ierr) 89dd7ecb2fSBarry Smith { 90dd7ecb2fSBarry Smith PetscObjectAllocateFortranPointers(*ts,10); 91dd7ecb2fSBarry Smith ((PetscObject)*ts)->fortran_func_pointers[9] = (PetscVoidFunction)f; 92dd7ecb2fSBarry Smith *ierr = TSSetPreStep(*ts,ourpoststep); 93dd7ecb2fSBarry Smith } 94dd7ecb2fSBarry Smith 95*0e4ef248SJed Brown void tscomputerhsfunctionlinear_(TS *ts,PetscReal *t,Vec *X,Vec *F,void *ctx,PetscErrorCode *ierr) 96*0e4ef248SJed Brown { 97*0e4ef248SJed Brown *ierr = TSComputeRHSFunctionLinear(*ts,*t,*X,*F,ctx); 98*0e4ef248SJed Brown } 99089b2837SJed Brown void PETSC_STDCALL tssetrhsfunction_(TS *ts,Vec *r,PetscErrorCode (PETSC_STDCALL *f)(TS*,PetscReal*,Vec*,Vec*,void*,PetscErrorCode*),void*fP,PetscErrorCode *ierr) 100e2df7a95SSatish Balay { 101*0e4ef248SJed Brown Vec R; 102*0e4ef248SJed Brown CHKFORTRANNULLOBJECT(r); 103*0e4ef248SJed Brown CHKFORTRANNULLFUNCTION(f); 104*0e4ef248SJed Brown CHKFORTRANNULLOBJECT(fP); 105*0e4ef248SJed Brown R = r ? *r : PETSC_NULL; 106*0e4ef248SJed Brown if ((PetscVoidFunction)f == (PetscVoidFunction)tscomputerhsfunctionlinear_) { 107*0e4ef248SJed Brown *ierr = TSSetRHSFunction(*ts,R,TSComputeRHSFunctionLinear,fP); 108*0e4ef248SJed Brown } else { 109dd7ecb2fSBarry Smith PetscObjectAllocateFortranPointers(*ts,10); 110f68b968cSBarry Smith ((PetscObject)*ts)->fortran_func_pointers[1] = (PetscVoidFunction)f; 111*0e4ef248SJed Brown *ierr = TSSetRHSFunction(*ts,R,ourtsfunction,fP); 112*0e4ef248SJed Brown } 113e2df7a95SSatish Balay } 11426d46c62SHong Zhang 115e2df7a95SSatish Balay /* ---------------------------------------------------------*/ 116e2df7a95SSatish Balay extern void tsdefaultcomputejacobian_(TS*,PetscReal*,Vec*,Mat*,Mat*,MatStructure*,void*,PetscErrorCode*); 117e2df7a95SSatish Balay extern void tsdefaultcomputejacobiancolor_(TS*,PetscReal*,Vec*,Mat*,Mat*,MatStructure*,void*,PetscErrorCode*); 118*0e4ef248SJed Brown void tscomputerhsjacobianconstant_(TS *ts,PetscReal *t,Vec *X,Mat *A,Mat *B,MatStructure *flg,void *ctx,PetscErrorCode *ierr) 119*0e4ef248SJed Brown { 120*0e4ef248SJed Brown *ierr = TSComputeRHSJacobianConstant(*ts,*t,*X,A,B,flg,ctx); 121*0e4ef248SJed Brown } 122e2df7a95SSatish Balay void PETSC_STDCALL tssetrhsjacobian_(TS *ts,Mat *A,Mat *B,void (PETSC_STDCALL *f)(TS*,PetscReal*,Vec*,Mat*,Mat*,MatStructure*, 123e2df7a95SSatish Balay void*,PetscErrorCode*),void*fP,PetscErrorCode *ierr) 124e2df7a95SSatish Balay { 125dd7ecb2fSBarry Smith PetscObjectAllocateFortranPointers(*ts,10); 126e2df7a95SSatish Balay if (FORTRANNULLFUNCTION(f)) { 127e2df7a95SSatish Balay *ierr = TSSetRHSJacobian(*ts,*A,*B,PETSC_NULL,fP); 128*0e4ef248SJed Brown } else if ((PetscVoidFunction)f == (PetscVoidFunction)tscomputerhsjacobianconstant_) { 129*0e4ef248SJed Brown *ierr = TSSetRHSJacobian(*ts,*A,*B,TSComputeRHSJacobianConstant,fP); 130f68b968cSBarry Smith } else if ((PetscVoidFunction)f == (PetscVoidFunction)tsdefaultcomputejacobian_) { 131e2df7a95SSatish Balay *ierr = TSSetRHSJacobian(*ts,*A,*B,TSDefaultComputeJacobian,fP); 132f68b968cSBarry Smith } else if ((PetscVoidFunction)f == (PetscVoidFunction)tsdefaultcomputejacobiancolor_) { 133e2df7a95SSatish Balay *ierr = TSSetRHSJacobian(*ts,*A,*B,TSDefaultComputeJacobianColor,*(MatFDColoring*)fP); 134e2df7a95SSatish Balay } else { 135f68b968cSBarry Smith ((PetscObject)*ts)->fortran_func_pointers[3] = (PetscVoidFunction)f; 136e2df7a95SSatish Balay *ierr = TSSetRHSJacobian(*ts,*A,*B,ourtsjacobian,fP); 137e2df7a95SSatish Balay } 138e2df7a95SSatish Balay } 139e2df7a95SSatish Balay 140e2df7a95SSatish Balay /* ---------------------------------------------------------*/ 141e2df7a95SSatish Balay 142a6570f20SBarry Smith extern void PETSC_STDCALL tsmonitordefault_(TS*,PetscInt*,PetscReal*,Vec*,void*,PetscErrorCode*); 143e2df7a95SSatish Balay 144a6570f20SBarry 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) 145e2df7a95SSatish Balay { 146dd7ecb2fSBarry Smith PetscObjectAllocateFortranPointers(*ts,10); 147a6570f20SBarry Smith if ((PetscVoidFunction)func == (PetscVoidFunction)tsmonitordefault_) { 148a6570f20SBarry Smith *ierr = TSMonitorSet(*ts,TSMonitorDefault,0,0); 149e2df7a95SSatish Balay } else { 150f68b968cSBarry Smith ((PetscObject)*ts)->fortran_func_pointers[4] = (PetscVoidFunction)func; 151f68b968cSBarry Smith ((PetscObject)*ts)->fortran_func_pointers[5] = (PetscVoidFunction)d; 152f68b968cSBarry Smith ((PetscObject)*ts)->fortran_func_pointers[6] = (PetscVoidFunction)mctx; 153e2df7a95SSatish Balay if (FORTRANNULLFUNCTION(d)) { 154a6570f20SBarry Smith *ierr = TSMonitorSet(*ts,ourtsmonitor,*ts,0); 155e2df7a95SSatish Balay } else { 156b8ebb45fSBarry Smith *ierr = TSMonitorSet(*ts,ourtsmonitor,*ts,ourmonitordestroy); 157e2df7a95SSatish Balay } 158e2df7a95SSatish Balay } 159e2df7a95SSatish Balay } 160e2df7a95SSatish Balay 161e2df7a95SSatish Balay /* ---------------------------------------------------------*/ 162089b2837SJed Brown /* func is currently ignored from Fortran */ 163089b2837SJed Brown void PETSC_STDCALL tsgetrhsjacobian_(TS *ts,Mat *J,Mat *M,int *func,void **ctx,PetscErrorCode *ierr) 164e2df7a95SSatish Balay { 165089b2837SJed Brown *ierr = TSGetRHSJacobian(*ts,J,M,0,ctx); 166e2df7a95SSatish Balay } 167e2df7a95SSatish Balay 168e2df7a95SSatish Balay void PETSC_STDCALL tsview_(TS *ts,PetscViewer *viewer, PetscErrorCode *ierr) 169e2df7a95SSatish Balay { 170e2df7a95SSatish Balay PetscViewer v; 171e2df7a95SSatish Balay PetscPatchDefaultViewers_Fortran(viewer,v); 172e2df7a95SSatish Balay *ierr = TSView(*ts,v); 173e2df7a95SSatish Balay } 174e2df7a95SSatish Balay 175e2df7a95SSatish Balay void PETSC_STDCALL tsgetoptionsprefix_(TS *ts,CHAR prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len)) 176e2df7a95SSatish Balay { 177e2df7a95SSatish Balay const char *tname; 178e2df7a95SSatish Balay 179e2df7a95SSatish Balay *ierr = TSGetOptionsPrefix(*ts,&tname); 180e2df7a95SSatish Balay *ierr = PetscStrncpy(prefix,tname,len); 181e2df7a95SSatish Balay } 182e2df7a95SSatish Balay 183e2df7a95SSatish Balay 184e2df7a95SSatish Balay EXTERN_C_END 185