xref: /petsc/src/ts/interface/ftn-custom/ztsf.c (revision 0e4ef248315907a72e02a91c80d068e7601cd6a7)
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