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 676f2fa84SHong Zhang #define tssetmatrices_ TSSETMATRICES 726d46c62SHong Zhang #define tsgetmatrices_ TSGETMATRICES 8e2df7a95SSatish Balay #define tssetrhsjacobian_ TSSETRHSJACOBIAN 9e2df7a95SSatish Balay #define tsgetrhsjacobian_ TSGETRHSJACOBIAN 10e2df7a95SSatish Balay #define tsview_ TSVIEW 11e2df7a95SSatish Balay #define tsgetoptionsprefix_ TSGETOPTIONSPREFIX 12a6570f20SBarry Smith #define tsmonitorset_ TSMONITORSET 13e2df7a95SSatish Balay #define tsdefaultcomputejacobian_ TSDEFAULTCOMPUTEJACOBIAN 14e2df7a95SSatish Balay #define tsdefaultcomputejacobiancolor_ TSDEFAULTCOMPUTEJACOBIANCOLOR 15a6570f20SBarry Smith #define tsmonitordefault_ TSMONITORDEFAULT 16*dd7ecb2fSBarry Smith #define tssetprestep_ TSSETPRESTEP 17*dd7ecb2fSBarry Smith #define tssetpoststep_ TSSETPOSTSTEP 18e2df7a95SSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE) 19e2df7a95SSatish Balay #define tssetrhsfunction_ tssetrhsfunction 2076f2fa84SHong Zhang #define tssetmatrices_ tssetmatrices 2126d46c62SHong Zhang #define tsgetmatrices_ tsgetmatrices 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 27e2df7a95SSatish Balay #define tsdefaultcomputejacobian_ tsdefaultcomputejacobian 28e2df7a95SSatish Balay #define tsdefaultcomputejacobiancolor_ tsdefaultcomputejacobiancolor 29a6570f20SBarry Smith #define tsmonitordefault_ tsmonitordefault 30*dd7ecb2fSBarry Smith #define tssetprestep_ tssetprestep 31*dd7ecb2fSBarry Smith #define tssetpoststep_ tssetpoststep 32e2df7a95SSatish Balay #endif 33e2df7a95SSatish Balay 34*dd7ecb2fSBarry Smith static PetscErrorCode ourprestep(TS ts) 35*dd7ecb2fSBarry Smith { 36*dd7ecb2fSBarry Smith PetscErrorCode ierr = 0; 37*dd7ecb2fSBarry Smith (*(void (PETSC_STDCALL *)(TS*,PetscErrorCode*))(((PetscObject)ts)->fortran_func_pointers[8]))(&ts,&ierr); 38*dd7ecb2fSBarry Smith return 0; 39*dd7ecb2fSBarry Smith } 40*dd7ecb2fSBarry Smith static PetscErrorCode ourpoststep(TS ts) 41*dd7ecb2fSBarry Smith { 42*dd7ecb2fSBarry Smith PetscErrorCode ierr = 0; 43*dd7ecb2fSBarry Smith (*(void (PETSC_STDCALL *)(TS*,PetscErrorCode*))(((PetscObject)ts)->fortran_func_pointers[9]))(&ts,&ierr); 44*dd7ecb2fSBarry Smith return 0; 45*dd7ecb2fSBarry 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 ourtsmatrix(TS ts,PetscReal d,Mat* m,Mat* p,MatStructure* type,void*ctx) 53e2df7a95SSatish Balay { 54e2df7a95SSatish Balay PetscErrorCode ierr = 0; 55e2df7a95SSatish Balay (*(void (PETSC_STDCALL *)(TS*,PetscReal*,Mat*,Mat*,MatStructure*,void*,PetscErrorCode*))(((PetscObject)ts)->fortran_func_pointers[2]))(&ts,&d,m,p,type,ctx,&ierr); 56e2df7a95SSatish Balay return 0; 57e2df7a95SSatish Balay } 5876f2fa84SHong Zhang static PetscErrorCode ourtslhsmatrix(TS ts,PetscReal d,Mat* m,Mat* p,MatStructure* type,void*ctx) 5976f2fa84SHong Zhang { 6076f2fa84SHong Zhang PetscErrorCode ierr = 0; 6176f2fa84SHong Zhang (*(void (PETSC_STDCALL *)(TS*,PetscReal*,Mat*,Mat*,MatStructure*,void*,PetscErrorCode*))(((PetscObject)ts)->fortran_func_pointers[7]))(&ts,&d,m,p,type,ctx,&ierr); 6276f2fa84SHong Zhang return 0; 6376f2fa84SHong Zhang } 64e2df7a95SSatish Balay static PetscErrorCode ourtsjacobian(TS ts,PetscReal d,Vec x,Mat* m,Mat* p,MatStructure* type,void*ctx) 65e2df7a95SSatish Balay { 66e2df7a95SSatish Balay PetscErrorCode ierr = 0; 67e2df7a95SSatish 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); 68e2df7a95SSatish Balay return 0; 69e2df7a95SSatish Balay } 70e2df7a95SSatish Balay 71c2efdce3SBarry Smith static PetscErrorCode ourmonitordestroy(void **ctx) 72e2df7a95SSatish Balay { 73e2df7a95SSatish Balay PetscErrorCode ierr = 0; 74c2efdce3SBarry Smith TS ts = *(TS*)ctx; 756895c445SBarry Smith void *mctx = (void*) ((PetscObject)ts)->fortran_func_pointers[6]; 766895c445SBarry Smith (*(void (PETSC_STDCALL *)(void*,PetscErrorCode*))(((PetscObject)ts)->fortran_func_pointers[5]))(mctx,&ierr); 77e2df7a95SSatish Balay return 0; 78e2df7a95SSatish Balay } 79e2df7a95SSatish Balay 80e2df7a95SSatish Balay /* 81e2df7a95SSatish Balay Note ctx is the same as ts so we need to get the Fortran context out of the TS 82e2df7a95SSatish Balay */ 83e2df7a95SSatish Balay static PetscErrorCode ourtsmonitor(TS ts,PetscInt i,PetscReal d,Vec v,void*ctx) 84e2df7a95SSatish Balay { 85e2df7a95SSatish Balay PetscErrorCode ierr = 0; 866895c445SBarry Smith void *mctx = (void*) ((PetscObject)ts)->fortran_func_pointers[6]; 876895c445SBarry Smith (*(void (PETSC_STDCALL *)(TS*,PetscInt*,PetscReal*,Vec*,void*,PetscErrorCode*))(((PetscObject)ts)->fortran_func_pointers[4]))(&ts,&i,&d,&v,mctx,&ierr); 88e2df7a95SSatish Balay return 0; 89e2df7a95SSatish Balay } 90e2df7a95SSatish Balay 91e2df7a95SSatish Balay EXTERN_C_BEGIN 92e2df7a95SSatish Balay 93*dd7ecb2fSBarry Smith void PETSC_STDCALL tssetprestep_(TS *ts,PetscErrorCode (PETSC_STDCALL *f)(TS*,PetscErrorCode*),PetscErrorCode *ierr) 94*dd7ecb2fSBarry Smith { 95*dd7ecb2fSBarry Smith PetscObjectAllocateFortranPointers(*ts,10); 96*dd7ecb2fSBarry Smith ((PetscObject)*ts)->fortran_func_pointers[8] = (PetscVoidFunction)f; 97*dd7ecb2fSBarry Smith *ierr = TSSetPreStep(*ts,ourprestep); 98*dd7ecb2fSBarry Smith } 99*dd7ecb2fSBarry Smith 100*dd7ecb2fSBarry Smith void PETSC_STDCALL tssetpoststep_(TS *ts,PetscErrorCode (PETSC_STDCALL *f)(TS*,PetscErrorCode*),PetscErrorCode *ierr) 101*dd7ecb2fSBarry Smith { 102*dd7ecb2fSBarry Smith PetscObjectAllocateFortranPointers(*ts,10); 103*dd7ecb2fSBarry Smith ((PetscObject)*ts)->fortran_func_pointers[9] = (PetscVoidFunction)f; 104*dd7ecb2fSBarry Smith *ierr = TSSetPreStep(*ts,ourpoststep); 105*dd7ecb2fSBarry Smith } 106*dd7ecb2fSBarry Smith 107e2df7a95SSatish Balay void PETSC_STDCALL tssetrhsfunction_(TS *ts,PetscErrorCode (PETSC_STDCALL *f)(TS*,PetscReal*,Vec*,Vec*,void*,PetscErrorCode*),void*fP,PetscErrorCode *ierr) 108e2df7a95SSatish Balay { 109*dd7ecb2fSBarry Smith PetscObjectAllocateFortranPointers(*ts,10); 110f68b968cSBarry Smith ((PetscObject)*ts)->fortran_func_pointers[1] = (PetscVoidFunction)f; 111e2df7a95SSatish Balay *ierr = TSSetRHSFunction(*ts,ourtsfunction,fP); 112e2df7a95SSatish Balay } 11326d46c62SHong Zhang 11476f2fa84SHong Zhang void PETSC_STDCALL tssetmatrices_(TS *ts,Mat *Arhs,PetscErrorCode (PETSC_STDCALL *frhs)(TS*,PetscReal*,Mat*,Mat*,MatStructure*, 11576f2fa84SHong Zhang void*,PetscInt *), 11676f2fa84SHong Zhang Mat *Alhs,PetscErrorCode (PETSC_STDCALL *flhs)(TS*,PetscReal*,Mat*,Mat*,MatStructure*, 11776f2fa84SHong Zhang void*,PetscInt *), 11876f2fa84SHong Zhang MatStructure *flag,void*fP,PetscErrorCode *ierr) 11976f2fa84SHong Zhang { 120*dd7ecb2fSBarry Smith PetscObjectAllocateFortranPointers(*ts,10); 12176f2fa84SHong Zhang if (FORTRANNULLFUNCTION(frhs) && FORTRANNULLFUNCTION(flhs)) { 12276f2fa84SHong Zhang *ierr = TSSetMatrices(*ts,*Arhs,PETSC_NULL,*Alhs,PETSC_NULL,*flag,fP); 12376f2fa84SHong Zhang } else if (FORTRANNULLFUNCTION(flhs)){ 12476f2fa84SHong Zhang ((PetscObject)*ts)->fortran_func_pointers[2] = (PetscVoidFunction)frhs; 12576f2fa84SHong Zhang *ierr = TSSetMatrices(*ts,*Arhs,ourtsmatrix,*Alhs,PETSC_NULL,*flag,fP); 12676f2fa84SHong Zhang } else if (FORTRANNULLFUNCTION(frhs)){ 12776f2fa84SHong Zhang ((PetscObject)*ts)->fortran_func_pointers[7] = (PetscVoidFunction)flhs; 12876f2fa84SHong Zhang *ierr = TSSetMatrices(*ts,*Arhs,PETSC_NULL,*Alhs,ourtslhsmatrix,*flag,fP); 12976f2fa84SHong Zhang } else { 13076f2fa84SHong Zhang ((PetscObject)*ts)->fortran_func_pointers[2] = (PetscVoidFunction)frhs; 13176f2fa84SHong Zhang ((PetscObject)*ts)->fortran_func_pointers[7] = (PetscVoidFunction)flhs; 13276f2fa84SHong Zhang *ierr = TSSetMatrices(*ts,*Arhs,ourtsmatrix,*Alhs,ourtslhsmatrix,*flag,fP); 13376f2fa84SHong Zhang } 13476f2fa84SHong Zhang } 135e2df7a95SSatish Balay 136e2df7a95SSatish Balay /* ---------------------------------------------------------*/ 137e2df7a95SSatish Balay extern void tsdefaultcomputejacobian_(TS*,PetscReal*,Vec*,Mat*,Mat*,MatStructure*,void*,PetscErrorCode*); 138e2df7a95SSatish Balay extern void tsdefaultcomputejacobiancolor_(TS*,PetscReal*,Vec*,Mat*,Mat*,MatStructure*,void*,PetscErrorCode*); 139e2df7a95SSatish Balay 140e2df7a95SSatish Balay void PETSC_STDCALL tssetrhsjacobian_(TS *ts,Mat *A,Mat *B,void (PETSC_STDCALL *f)(TS*,PetscReal*,Vec*,Mat*,Mat*,MatStructure*, 141e2df7a95SSatish Balay void*,PetscErrorCode*),void*fP,PetscErrorCode *ierr) 142e2df7a95SSatish Balay { 143*dd7ecb2fSBarry Smith PetscObjectAllocateFortranPointers(*ts,10); 144e2df7a95SSatish Balay if (FORTRANNULLFUNCTION(f)) { 145e2df7a95SSatish Balay *ierr = TSSetRHSJacobian(*ts,*A,*B,PETSC_NULL,fP); 146f68b968cSBarry Smith } else if ((PetscVoidFunction)f == (PetscVoidFunction)tsdefaultcomputejacobian_) { 147e2df7a95SSatish Balay *ierr = TSSetRHSJacobian(*ts,*A,*B,TSDefaultComputeJacobian,fP); 148f68b968cSBarry Smith } else if ((PetscVoidFunction)f == (PetscVoidFunction)tsdefaultcomputejacobiancolor_) { 149e2df7a95SSatish Balay *ierr = TSSetRHSJacobian(*ts,*A,*B,TSDefaultComputeJacobianColor,*(MatFDColoring*)fP); 150e2df7a95SSatish Balay } else { 151f68b968cSBarry Smith ((PetscObject)*ts)->fortran_func_pointers[3] = (PetscVoidFunction)f; 152e2df7a95SSatish Balay *ierr = TSSetRHSJacobian(*ts,*A,*B,ourtsjacobian,fP); 153e2df7a95SSatish Balay } 154e2df7a95SSatish Balay } 155e2df7a95SSatish Balay 156e2df7a95SSatish Balay /* ---------------------------------------------------------*/ 157e2df7a95SSatish Balay 158a6570f20SBarry Smith extern void PETSC_STDCALL tsmonitordefault_(TS*,PetscInt*,PetscReal*,Vec*,void*,PetscErrorCode*); 159e2df7a95SSatish Balay 160a6570f20SBarry 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) 161e2df7a95SSatish Balay { 162*dd7ecb2fSBarry Smith PetscObjectAllocateFortranPointers(*ts,10); 163a6570f20SBarry Smith if ((PetscVoidFunction)func == (PetscVoidFunction)tsmonitordefault_) { 164a6570f20SBarry Smith *ierr = TSMonitorSet(*ts,TSMonitorDefault,0,0); 165e2df7a95SSatish Balay } else { 166f68b968cSBarry Smith ((PetscObject)*ts)->fortran_func_pointers[4] = (PetscVoidFunction)func; 167f68b968cSBarry Smith ((PetscObject)*ts)->fortran_func_pointers[5] = (PetscVoidFunction)d; 168f68b968cSBarry Smith ((PetscObject)*ts)->fortran_func_pointers[6] = (PetscVoidFunction)mctx; 169e2df7a95SSatish Balay if (FORTRANNULLFUNCTION(d)) { 170a6570f20SBarry Smith *ierr = TSMonitorSet(*ts,ourtsmonitor,*ts,0); 171e2df7a95SSatish Balay } else { 172b8ebb45fSBarry Smith *ierr = TSMonitorSet(*ts,ourtsmonitor,*ts,ourmonitordestroy); 173e2df7a95SSatish Balay } 174e2df7a95SSatish Balay } 175e2df7a95SSatish Balay } 176e2df7a95SSatish Balay 177e2df7a95SSatish Balay /* ---------------------------------------------------------*/ 178e2df7a95SSatish Balay void PETSC_STDCALL tsgetrhsjacobian_(TS *ts,Mat *J,Mat *M,void **ctx,PetscErrorCode *ierr) 179e2df7a95SSatish Balay { 180e2df7a95SSatish Balay *ierr = TSGetRHSJacobian(*ts,J,M,ctx); 181e2df7a95SSatish Balay } 182e2df7a95SSatish Balay 18326d46c62SHong Zhang void PETSC_STDCALL tsgetmatrices_(TS *ts,Mat *Arhs,Mat *Alhs,void **ctx,PetscErrorCode *ierr) 184e2df7a95SSatish Balay { 18526d46c62SHong Zhang *ierr = TSGetMatrices(*ts,Arhs,Alhs,ctx); 186e2df7a95SSatish Balay } 187e2df7a95SSatish Balay 188e2df7a95SSatish Balay void PETSC_STDCALL tsview_(TS *ts,PetscViewer *viewer, PetscErrorCode *ierr) 189e2df7a95SSatish Balay { 190e2df7a95SSatish Balay PetscViewer v; 191e2df7a95SSatish Balay PetscPatchDefaultViewers_Fortran(viewer,v); 192e2df7a95SSatish Balay *ierr = TSView(*ts,v); 193e2df7a95SSatish Balay } 194e2df7a95SSatish Balay 195e2df7a95SSatish Balay void PETSC_STDCALL tsgetoptionsprefix_(TS *ts,CHAR prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len)) 196e2df7a95SSatish Balay { 197e2df7a95SSatish Balay const char *tname; 198e2df7a95SSatish Balay 199e2df7a95SSatish Balay *ierr = TSGetOptionsPrefix(*ts,&tname); 200e2df7a95SSatish Balay *ierr = PetscStrncpy(prefix,tname,len); 201e2df7a95SSatish Balay } 202e2df7a95SSatish Balay 203e2df7a95SSatish Balay 204e2df7a95SSatish Balay EXTERN_C_END 205