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