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