xref: /petsc/src/tao/interface/ftn-custom/ztaosolverf.c (revision 8fcddce65efd55a8fe3f87d4c08c15577ce4cbef)
1af0996ceSBarry Smith #include <petsc/private/fortranimpl.h>
28732526dSAlp Dener #include <petsc/private/f90impl.h>
3af0996ceSBarry Smith #include <petsc/private/taoimpl.h>
4a7e14dcfSSatish Balay 
5a7e14dcfSSatish Balay 
6a7e14dcfSSatish Balay #if defined(PETSC_HAVE_FORTRAN_CAPS)
7a7e14dcfSSatish Balay #define taosetobjectiveroutine_             TAOSETOBJECTIVEROUTINE
8a7e14dcfSSatish Balay #define taosetgradientroutine_              TAOSETGRADIENTROUTINE
9a7e14dcfSSatish Balay #define taosetobjectiveandgradientroutine_  TAOSETOBJECTIVEANDGRADIENTROUTINE
10a7e14dcfSSatish Balay #define taosethessianroutine_               TAOSETHESSIANROUTINE
11737f463aSAlp Dener #define taosetresidualroutine_              TAOSETRESIDUALROUTINE
124ffbe8acSAlp Dener #define taosetjacobianresidualroutine_      TAOSETJACOBIANRESIDUALROUTINE
13a7e14dcfSSatish Balay #define taosetjacobianroutine_              TAOSETJACOBIANROUTINE
14a7e14dcfSSatish Balay #define taosetjacobianstateroutine_         TAOSETJACOBIANSTATEROUTINE
15a7e14dcfSSatish Balay #define taosetjacobiandesignroutine_        TAOSETJACOBIANDESIGNROUTINE
16a7e14dcfSSatish Balay #define taosetjacobianinequalityroutine_    TAOSETJACOBIANINEQUALITYROUTINE
17a7e14dcfSSatish Balay #define taosetjacobianequalityroutine_      TAOSETJACOBIANEQUALITYROUTINE
18a7e14dcfSSatish Balay #define taosetinequalityconstraintsroutine_ TAOSETINEQUALITYCONSTRAINTSROUTINE
19a7e14dcfSSatish Balay #define taosetequalityconstraintsroutine_   TAOSETEQUALITYCONSTRAINTSROUTINE
20a7e14dcfSSatish Balay #define taosetvariableboundsroutine_        TAOSETVARIABLEBOUNDSROUTINE
21a7e14dcfSSatish Balay #define taosetconstraintsroutine_           TAOSETCONSTRAINTSROUTINE
22a7e14dcfSSatish Balay #define taosetmonitor_                      TAOSETMONITOR
23a7e14dcfSSatish Balay #define taosettype_                         TAOSETTYPE
24a7e14dcfSSatish Balay #define taoview_                            TAOVIEW
25ae93cb3cSJason Sarich #define taogetconvergencehistory_           TAOGETCONVERGENCEHISTORY
26a7e14dcfSSatish Balay #define taosetconvergencetest_              TAOSETCONVERGENCETEST
27a7e14dcfSSatish Balay #define taogetoptionsprefix_                TAOGETOPTIONSPREFIX
28a7e14dcfSSatish Balay #define taosetoptionsprefix_                TAOSETOPTIONSPREFIX
29a7e14dcfSSatish Balay #define taoappendoptionsprefix_             TAOAPPENDOPTIONSPREFIX
30a7e14dcfSSatish Balay #define taogettype_                         TAOGETTYPE
31e1e80dc8SAlp Dener #define taosetupdate_                       TAOSETUPDATE
32a7e14dcfSSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
33a7e14dcfSSatish Balay 
34a7e14dcfSSatish Balay #define taosetobjectiveroutine_             taosetobjectiveroutine
35a7e14dcfSSatish Balay #define taosetgradientroutine_              taosetgradientroutine
36a7e14dcfSSatish Balay #define taosetobjectiveandgradientroutine_  taosetobjectiveandgradientroutine
37a7e14dcfSSatish Balay #define taosethessianroutine_               taosethessianroutine
38737f463aSAlp Dener #define taosetresidualroutine_              taosetresidualroutine
394ffbe8acSAlp Dener #define taosetjacobianresidualroutine_      taosetjacobianresidualroutine
40a7e14dcfSSatish Balay #define taosetjacobianroutine_              taosetjacobianroutine
41a7e14dcfSSatish Balay #define taosetjacobianstateroutine_         taosetjacobianstateroutine
42a7e14dcfSSatish Balay #define taosetjacobiandesignroutine_        taosetjacobiandesignroutine
43a7e14dcfSSatish Balay #define taosetjacobianinequalityroutine_    taosetjacobianinequalityroutine
44a7e14dcfSSatish Balay #define taosetjacobianequalityroutine_      taosetjacobianequalityroutine
45a7e14dcfSSatish Balay #define taosetinequalityconstraintsroutine_ taosetinequalityconstraintsroutine
46a7e14dcfSSatish Balay #define taosetequalityconstraintsroutine_   taosetequalityconstraintsroutine
47a7e14dcfSSatish Balay #define taosetvariableboundsroutine_        taosetvariableboundsroutine
48a7e14dcfSSatish Balay #define taosetconstraintsroutine_           taosetconstraintsroutine
49a7e14dcfSSatish Balay #define taosetmonitor_                      taosetmonitor
50a7e14dcfSSatish Balay #define taosettype_                         taosettype
51a7e14dcfSSatish Balay #define taoview_                            taoview
52ae93cb3cSJason Sarich #define taogetconvergencehistory_           taogetconvergencehistory
53a7e14dcfSSatish Balay #define taosetconvergencetest_              taosetconvergencetest
54a7e14dcfSSatish Balay #define taogetoptionsprefix_                taogetoptionsprefix
55a7e14dcfSSatish Balay #define taosetoptionsprefix_                taosetoptionsprefix
56a7e14dcfSSatish Balay #define taoappendoptionsprefix_             taoappendoptionsprefix
57a7e14dcfSSatish Balay #define taogettype_                         taogettype
58e1e80dc8SAlp Dener #define taosetupdate_                       taosetupdate
59a7e14dcfSSatish Balay #endif
60a7e14dcfSSatish Balay 
618732526dSAlp Dener static struct {
628732526dSAlp Dener   PetscFortranCallbackId obj;
638732526dSAlp Dener   PetscFortranCallbackId grad;
648732526dSAlp Dener   PetscFortranCallbackId objgrad;
658732526dSAlp Dener   PetscFortranCallbackId hess;
66737f463aSAlp Dener   PetscFortranCallbackId lsres;
67737f463aSAlp Dener   PetscFortranCallbackId lsjac;
688732526dSAlp Dener   PetscFortranCallbackId jac;
698732526dSAlp Dener   PetscFortranCallbackId jacstate;
708732526dSAlp Dener   PetscFortranCallbackId jacdesign;
718732526dSAlp Dener   PetscFortranCallbackId bounds;
728732526dSAlp Dener   PetscFortranCallbackId mon;
738732526dSAlp Dener   PetscFortranCallbackId mondestroy;
748732526dSAlp Dener   PetscFortranCallbackId convtest;
758732526dSAlp Dener   PetscFortranCallbackId constraints;
768732526dSAlp Dener   PetscFortranCallbackId jacineq;
778732526dSAlp Dener   PetscFortranCallbackId jaceq;
788732526dSAlp Dener   PetscFortranCallbackId conineq;
798732526dSAlp Dener   PetscFortranCallbackId coneq;
808732526dSAlp Dener   PetscFortranCallbackId nfuncs;
81e1e80dc8SAlp Dener   PetscFortranCallbackId update;
828732526dSAlp Dener #if defined(PETSC_HAVE_F90_2PTR_ARG)
838732526dSAlp Dener   PetscFortranCallbackId function_pgiptr;
848732526dSAlp Dener #endif
858732526dSAlp Dener } _cb;
86a7e14dcfSSatish Balay 
87441846f8SBarry Smith static PetscErrorCode ourtaoobjectiveroutine(Tao tao, Vec x, PetscReal *f, void *ctx)
88a7e14dcfSSatish Balay {
898732526dSAlp Dener     PetscObjectUseFortranCallback(tao,_cb.obj,(Tao*,Vec*,PetscReal*,void*,PetscErrorCode*),(&tao,&x,f,_ctx,&ierr));
90a7e14dcfSSatish Balay }
91a7e14dcfSSatish Balay 
92441846f8SBarry Smith static PetscErrorCode ourtaogradientroutine(Tao tao, Vec x, Vec g, void *ctx)
93a7e14dcfSSatish Balay {
948732526dSAlp Dener     PetscObjectUseFortranCallback(tao,_cb.grad,(Tao*,Vec*,Vec*,void*,PetscErrorCode*),(&tao,&x,&g,_ctx,&ierr));
95a7e14dcfSSatish Balay }
96a7e14dcfSSatish Balay 
97441846f8SBarry Smith static PetscErrorCode ourtaoobjectiveandgradientroutine(Tao tao, Vec x, PetscReal *f, Vec g, void* ctx)
98a7e14dcfSSatish Balay {
998732526dSAlp Dener     PetscObjectUseFortranCallback(tao,_cb.objgrad,(Tao*,Vec*,PetscReal*,Vec*,void*,PetscErrorCode*),(&tao,&x,f,&g,_ctx,&ierr));
100a7e14dcfSSatish Balay }
101a7e14dcfSSatish Balay 
102ffad9901SBarry Smith static PetscErrorCode ourtaohessianroutine(Tao tao, Vec x, Mat H, Mat Hpre, void *ctx)
103a7e14dcfSSatish Balay {
1048732526dSAlp Dener     PetscObjectUseFortranCallback(tao,_cb.hess,(Tao*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),(&tao,&x,&H,&Hpre,_ctx,&ierr));
105a7e14dcfSSatish Balay }
106a7e14dcfSSatish Balay 
107ffad9901SBarry Smith static PetscErrorCode ourtaojacobianroutine(Tao tao, Vec x, Mat H, Mat Hpre, void *ctx)
108a7e14dcfSSatish Balay {
1098732526dSAlp Dener     PetscObjectUseFortranCallback(tao,_cb.jac,(Tao*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),(&tao,&x,&H,&Hpre,_ctx,&ierr));
110a7e14dcfSSatish Balay }
111a7e14dcfSSatish Balay 
112ffad9901SBarry Smith static PetscErrorCode ourtaojacobianstateroutine(Tao tao, Vec x, Mat H, Mat Hpre, Mat Hinv, void *ctx)
113a7e14dcfSSatish Balay {
1148732526dSAlp Dener     PetscObjectUseFortranCallback(tao,_cb.jacstate,(Tao*,Vec*,Mat*,Mat*,Mat*,void*,PetscErrorCode*),(&tao,&x,&H,&Hpre,&Hinv,_ctx,&ierr));
115a7e14dcfSSatish Balay }
116a7e14dcfSSatish Balay 
11794ab13aaSBarry Smith static PetscErrorCode ourtaojacobiandesignroutine(Tao tao, Vec x, Mat H, void *ctx)
118a7e14dcfSSatish Balay {
1198732526dSAlp Dener     PetscObjectUseFortranCallback(tao,_cb.jacdesign,(Tao*,Vec*,Mat*,void*,PetscErrorCode*),(&tao,&x,&H,_ctx,&ierr));
120a7e14dcfSSatish Balay }
121a7e14dcfSSatish Balay 
122441846f8SBarry Smith static PetscErrorCode ourtaoboundsroutine(Tao tao, Vec xl, Vec xu, void *ctx)
123a7e14dcfSSatish Balay {
1248732526dSAlp Dener     PetscObjectUseFortranCallback(tao,_cb.bounds,(Tao*,Vec*,Vec*,void*,PetscErrorCode*),(&tao,&xl,&xu,_ctx,&ierr));
125a7e14dcfSSatish Balay }
126737f463aSAlp Dener static PetscErrorCode ourtaoresidualroutine(Tao tao, Vec x, Vec f, void *ctx)
127a7e14dcfSSatish Balay {
128737f463aSAlp Dener     PetscObjectUseFortranCallback(tao,_cb.lsres,(Tao*,Vec*,Vec*,void*,PetscErrorCode*),(&tao,&x,&f,_ctx,&ierr));
129737f463aSAlp Dener }
130737f463aSAlp Dener 
1314ffbe8acSAlp Dener static PetscErrorCode ourtaojacobianresidualroutine(Tao tao, Vec x, Mat J, Mat Jpre, void *ctx)
132737f463aSAlp Dener {
133737f463aSAlp Dener     PetscObjectUseFortranCallback(tao,_cb.lsjac,(Tao*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),(&tao,&x,&J,&Jpre,_ctx,&ierr));
134a7e14dcfSSatish Balay }
135a7e14dcfSSatish Balay 
136441846f8SBarry Smith static PetscErrorCode ourtaomonitor(Tao tao, void *ctx)
137a7e14dcfSSatish Balay {
1388732526dSAlp Dener     PetscObjectUseFortranCallback(tao,_cb.mon,(Tao *,void*,PetscErrorCode*),(&tao,_ctx,&ierr));
139a7e14dcfSSatish Balay }
140a7e14dcfSSatish Balay 
141a7e14dcfSSatish Balay static PetscErrorCode ourtaomondestroy(void **ctx)
142a7e14dcfSSatish Balay {
1438732526dSAlp Dener     Tao tao = (Tao)*ctx;
1448732526dSAlp Dener     PetscObjectUseFortranCallback(tao,_cb.mondestroy,(void*,PetscErrorCode*),(_ctx,&ierr));
145a7e14dcfSSatish Balay }
146441846f8SBarry Smith static PetscErrorCode ourtaoconvergencetest(Tao tao, void *ctx)
147a7e14dcfSSatish Balay {
1488732526dSAlp Dener     PetscObjectUseFortranCallback(tao,_cb.convtest,(Tao *,void*,PetscErrorCode*),(&tao,_ctx,&ierr));
149a7e14dcfSSatish Balay }
150a7e14dcfSSatish Balay 
151441846f8SBarry Smith static PetscErrorCode ourtaoconstraintsroutine(Tao tao, Vec x, Vec c, void *ctx)
152a7e14dcfSSatish Balay {
1538732526dSAlp Dener     PetscObjectUseFortranCallback(tao,_cb.constraints,(Tao*,Vec*,Vec*,void*,PetscErrorCode*),(&tao,&x,&c,_ctx,&ierr));
154a7e14dcfSSatish Balay }
155a7e14dcfSSatish Balay 
156ffad9901SBarry Smith static PetscErrorCode ourtaojacobianinequalityroutine(Tao tao, Vec x, Mat J, Mat Jpre, void *ctx)
157a7e14dcfSSatish Balay {
1588732526dSAlp Dener     PetscObjectUseFortranCallback(tao,_cb.jacineq,(Tao*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),(&tao,&x,&J,&Jpre,_ctx,&ierr));
159a7e14dcfSSatish Balay }
160a7e14dcfSSatish Balay 
161ffad9901SBarry Smith static PetscErrorCode ourtaojacobianequalityroutine(Tao tao, Vec x, Mat J, Mat Jpre, void *ctx)
162a7e14dcfSSatish Balay {
1638732526dSAlp Dener     PetscObjectUseFortranCallback(tao,_cb.jaceq,(Tao*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),(&tao,&x,&J,&Jpre,_ctx,&ierr));
164a7e14dcfSSatish Balay }
165a7e14dcfSSatish Balay 
166441846f8SBarry Smith static PetscErrorCode ourtaoinequalityconstraintsroutine(Tao tao, Vec x, Vec c, void *ctx)
167a7e14dcfSSatish Balay {
1688732526dSAlp Dener     PetscObjectUseFortranCallback(tao,_cb.conineq,(Tao*,Vec*,Vec*,void*,PetscErrorCode*),(&tao,&x,&c,_ctx,&ierr));
169a7e14dcfSSatish Balay }
170a7e14dcfSSatish Balay 
171441846f8SBarry Smith static PetscErrorCode ourtaoequalityconstraintsroutine(Tao tao, Vec x, Vec c, void *ctx)
172a7e14dcfSSatish Balay {
1738732526dSAlp Dener     PetscObjectUseFortranCallback(tao,_cb.coneq,(Tao*,Vec*,Vec*,void*,PetscErrorCode*),(&tao,&x,&c,_ctx,&ierr));
174a7e14dcfSSatish Balay }
175a7e14dcfSSatish Balay 
176*8fcddce6SStefano Zampini static PetscErrorCode ourtaoupdateroutine(Tao tao, PetscInt iter, void *ctx)
177e1e80dc8SAlp Dener {
178*8fcddce6SStefano Zampini     PetscObjectUseFortranCallback(tao,_cb.update,(Tao*,PetscInt*,void*),(&tao,&iter,_ctx));
179e1e80dc8SAlp Dener }
180e1e80dc8SAlp Dener 
181a7e14dcfSSatish Balay EXTERN_C_BEGIN
182a7e14dcfSSatish Balay 
183db87b0f2SBarry Smith PETSC_EXTERN void PETSC_STDCALL taosetobjectiveroutine_(Tao *tao, void (PETSC_STDCALL *func)(Tao*, Vec *, PetscReal *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
184a7e14dcfSSatish Balay {
1858732526dSAlp Dener     CHKFORTRANNULLFUNCTION(func);
1868732526dSAlp Dener     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.obj,(PetscVoidFunction)func,ctx);
1878732526dSAlp Dener     if(!*ierr) *ierr = TaoSetObjectiveRoutine(*tao,ourtaoobjectiveroutine,ctx);
188a7e14dcfSSatish Balay }
189a7e14dcfSSatish Balay 
190db87b0f2SBarry Smith PETSC_EXTERN void PETSC_STDCALL taosetgradientroutine_(Tao *tao, void (PETSC_STDCALL *func)(Tao*, Vec *, Vec *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
191a7e14dcfSSatish Balay {
1928732526dSAlp Dener     CHKFORTRANNULLFUNCTION(func);
1938732526dSAlp Dener     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.grad,(PetscVoidFunction)func,ctx);
1948732526dSAlp Dener     if(!*ierr) *ierr = TaoSetGradientRoutine(*tao,ourtaogradientroutine,ctx);
195a7e14dcfSSatish Balay }
196a7e14dcfSSatish Balay 
197db87b0f2SBarry Smith PETSC_EXTERN void PETSC_STDCALL taosetobjectiveandgradientroutine_(Tao *tao, void (PETSC_STDCALL *func)(Tao*, Vec *, PetscReal *, Vec *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
198a7e14dcfSSatish Balay {
1998732526dSAlp Dener     CHKFORTRANNULLFUNCTION(func);
2008732526dSAlp Dener     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.objgrad,(PetscVoidFunction)func,ctx);
2018732526dSAlp Dener     if(!*ierr) *ierr = TaoSetObjectiveAndGradientRoutine(*tao,ourtaoobjectiveandgradientroutine,ctx);
202a7e14dcfSSatish Balay }
203a7e14dcfSSatish Balay 
204737f463aSAlp Dener PETSC_EXTERN void PETSC_STDCALL taosetresidualroutine_(Tao *tao, Vec *F, void (PETSC_STDCALL *func)(Tao*, Vec *, Vec *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
205a7e14dcfSSatish Balay {
2068732526dSAlp Dener     CHKFORTRANNULLFUNCTION(func);
207737f463aSAlp Dener     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.lsres,(PetscVoidFunction)func,ctx);
208737f463aSAlp Dener     if(!*ierr) *ierr = TaoSetResidualRoutine(*tao,*F,ourtaoresidualroutine,ctx);
209737f463aSAlp Dener }
210737f463aSAlp Dener 
2114ffbe8acSAlp Dener PETSC_EXTERN void PETSC_STDCALL taosetjacobianresidualroutine_(Tao *tao, Mat *J, Mat *Jpre, void (PETSC_STDCALL *func)(Tao*, Vec *, Mat *, Mat *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
212737f463aSAlp Dener {
213737f463aSAlp Dener     CHKFORTRANNULLFUNCTION(func);
214737f463aSAlp Dener     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.lsjac,(PetscVoidFunction)func,ctx);
2154ffbe8acSAlp Dener     if(!*ierr) *ierr = TaoSetJacobianResidualRoutine(*tao,*J,*Jpre,ourtaojacobianresidualroutine,ctx);
216a7e14dcfSSatish Balay }
217a7e14dcfSSatish Balay 
218db87b0f2SBarry Smith PETSC_EXTERN void PETSC_STDCALL taosetjacobianroutine_(Tao *tao, Mat *J, Mat *Jp, void (PETSC_STDCALL *func)(Tao*, Vec *, Mat *, Mat *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
219a7e14dcfSSatish Balay {
2208732526dSAlp Dener     CHKFORTRANNULLFUNCTION(func);
2218732526dSAlp Dener     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.jac,(PetscVoidFunction)func,ctx);
2228732526dSAlp Dener     if(!*ierr) *ierr = TaoSetJacobianRoutine(*tao,*J,*Jp,ourtaojacobianroutine,ctx);
223a7e14dcfSSatish Balay }
224a7e14dcfSSatish Balay 
225db87b0f2SBarry Smith PETSC_EXTERN void PETSC_STDCALL taosetjacobianstateroutine_(Tao *tao, Mat *J, Mat *Jp, Mat*Jinv, void (PETSC_STDCALL *func)(Tao*, Vec *, Mat *, Mat *, Mat*, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
226a7e14dcfSSatish Balay {
2278732526dSAlp Dener     CHKFORTRANNULLFUNCTION(func);
2288732526dSAlp Dener     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.jacstate,(PetscVoidFunction)func,ctx);
2298732526dSAlp Dener     if(!*ierr) *ierr = TaoSetJacobianStateRoutine(*tao,*J,*Jp,*Jinv,ourtaojacobianstateroutine,ctx);
230a7e14dcfSSatish Balay }
231a7e14dcfSSatish Balay 
232db87b0f2SBarry Smith PETSC_EXTERN void PETSC_STDCALL taosetjacobiandesignroutine_(Tao *tao, Mat *J, void (PETSC_STDCALL *func)(Tao*, Vec *, Mat *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
233a7e14dcfSSatish Balay {
2348732526dSAlp Dener     CHKFORTRANNULLFUNCTION(func);
2358732526dSAlp Dener     *ierr = PetscObjectSetFortranCallback((PetscObject)tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.jacdesign,(PetscVoidFunction)func,ctx);
2368732526dSAlp Dener     if(!*ierr) *ierr = TaoSetJacobianDesignRoutine(*tao,*J,ourtaojacobiandesignroutine,ctx);
237a7e14dcfSSatish Balay }
238a7e14dcfSSatish Balay 
239db87b0f2SBarry Smith PETSC_EXTERN void PETSC_STDCALL taosethessianroutine_(Tao *tao, Mat *J, Mat *Jp, void (PETSC_STDCALL *func)(Tao*, Vec *, Mat *, Mat *,void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
240a7e14dcfSSatish Balay {
2418732526dSAlp Dener     CHKFORTRANNULLFUNCTION(func);
2428732526dSAlp Dener     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.hess,(PetscVoidFunction)func,ctx);
2438732526dSAlp Dener     if(!*ierr) *ierr = TaoSetHessianRoutine(*tao,*J, *Jp, ourtaohessianroutine,ctx);
244a7e14dcfSSatish Balay }
245a7e14dcfSSatish Balay 
246db87b0f2SBarry Smith PETSC_EXTERN void PETSC_STDCALL taosetvariableboundsroutine_(Tao *tao, void (PETSC_STDCALL *func)(Tao*,Vec*,Vec*,void*,PetscErrorCode*),void *ctx, PetscErrorCode *ierr)
247a7e14dcfSSatish Balay {
2488732526dSAlp Dener     CHKFORTRANNULLFUNCTION(func);
2498732526dSAlp Dener     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.bounds,(PetscVoidFunction)func,ctx);
2508732526dSAlp Dener     if(!*ierr) *ierr = TaoSetVariableBoundsRoutine(*tao,ourtaoboundsroutine,ctx);
251a7e14dcfSSatish Balay }
252a7e14dcfSSatish Balay 
253db87b0f2SBarry Smith PETSC_EXTERN void PETSC_STDCALL taosetmonitor_(Tao *tao, void (PETSC_STDCALL *func)(Tao*,void*,PetscErrorCode*),void *ctx, void (PETSC_STDCALL *mondestroy)(void*,PetscErrorCode*),PetscErrorCode *ierr)
254a7e14dcfSSatish Balay {
255aecf964fSBarry Smith     CHKFORTRANNULLFUNCTION(mondestroy);
2568732526dSAlp Dener     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.mon,(PetscVoidFunction)func,ctx); if (*ierr) return;
2578732526dSAlp Dener     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.mondestroy,(PetscVoidFunction)mondestroy,ctx); if (*ierr) return;
2588732526dSAlp Dener     *ierr = TaoSetMonitor(*tao,ourtaomonitor,*tao,ourtaomondestroy);
259a7e14dcfSSatish Balay }
260a7e14dcfSSatish Balay 
261db87b0f2SBarry Smith PETSC_EXTERN void PETSC_STDCALL taosetconvergencetest_(Tao *tao, void (PETSC_STDCALL *func)(Tao*,void*,PetscErrorCode*),void *ctx, PetscErrorCode *ierr)
262a7e14dcfSSatish Balay {
2638732526dSAlp Dener     CHKFORTRANNULLFUNCTION(func);
2648732526dSAlp Dener     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.convtest,(PetscVoidFunction)func,ctx);
2658732526dSAlp Dener     if(!*ierr) *ierr = TaoSetConvergenceTest(*tao,ourtaoconvergencetest,ctx);
266a7e14dcfSSatish Balay }
267a7e14dcfSSatish Balay 
268db87b0f2SBarry Smith PETSC_EXTERN void PETSC_STDCALL taosetconstraintsroutine_(Tao *tao, Vec *C, void (PETSC_STDCALL *func)(Tao*, Vec *, Vec *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
269a7e14dcfSSatish Balay {
2708732526dSAlp Dener     CHKFORTRANNULLFUNCTION(func);
2718732526dSAlp Dener     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.constraints,(PetscVoidFunction)func,ctx);
2728732526dSAlp Dener     if(!*ierr) *ierr = TaoSetConstraintsRoutine(*tao,*C,ourtaoconstraintsroutine,ctx);
273a7e14dcfSSatish Balay }
274a7e14dcfSSatish Balay 
275390e1bf2SBarry Smith PETSC_EXTERN void PETSC_STDCALL taosettype_(Tao *tao, char* type_name PETSC_MIXED_LEN(len), PetscErrorCode *ierr PETSC_END_LEN(len))
276a7e14dcfSSatish Balay {
277a7e14dcfSSatish Balay     char *t;
278a7e14dcfSSatish Balay 
279a7e14dcfSSatish Balay     FIXCHAR(type_name,len,t);
280d49bb8f9SBarry Smith     *ierr = TaoSetType(*tao,t);if (*ierr) return;
281a7e14dcfSSatish Balay     FREECHAR(type_name,t);
282a7e14dcfSSatish Balay 
283a7e14dcfSSatish Balay }
284a7e14dcfSSatish Balay 
285db87b0f2SBarry Smith PETSC_EXTERN void PETSC_STDCALL taoview_(Tao *tao, PetscViewer *viewer, PetscErrorCode *ierr)
286a7e14dcfSSatish Balay {
287a7e14dcfSSatish Balay     PetscViewer v;
288a7e14dcfSSatish Balay     PetscPatchDefaultViewers_Fortran(viewer,v);
289a7e14dcfSSatish Balay     *ierr = TaoView(*tao,v);
290a7e14dcfSSatish Balay }
291a7e14dcfSSatish Balay 
292db87b0f2SBarry Smith PETSC_EXTERN void PETSC_STDCALL taogetconvergencehistory_(Tao *tao, PetscInt *nhist, PetscErrorCode *ierr)
293a7e14dcfSSatish Balay {
294ae93cb3cSJason Sarich   *ierr = TaoGetConvergenceHistory(*tao,NULL,NULL,NULL,NULL,nhist);
295a7e14dcfSSatish Balay }
296a7e14dcfSSatish Balay 
297390e1bf2SBarry Smith PETSC_EXTERN void PETSC_STDCALL taogetoptionsprefix_(Tao *tao, char* prefix PETSC_MIXED_LEN(len), PetscErrorCode *ierr PETSC_END_LEN(len))
298a7e14dcfSSatish Balay {
299a7e14dcfSSatish Balay   const char *name;
300a7e14dcfSSatish Balay   *ierr = TaoGetOptionsPrefix(*tao,&name);
301a7e14dcfSSatish Balay   *ierr = PetscStrncpy(prefix,name,len); if (*ierr) return;
302a7e14dcfSSatish Balay   FIXRETURNCHAR(PETSC_TRUE,prefix,len);
303a7e14dcfSSatish Balay 
304a7e14dcfSSatish Balay }
305a7e14dcfSSatish Balay 
306390e1bf2SBarry Smith PETSC_EXTERN void PETSC_STDCALL taoappendoptionsprefix_(Tao *tao, char* prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
307a7e14dcfSSatish Balay {
308a7e14dcfSSatish Balay   char *name;
309a7e14dcfSSatish Balay   FIXCHAR(prefix,len,name);
310d49bb8f9SBarry Smith   *ierr = TaoAppendOptionsPrefix(*tao,name);if (*ierr) return;
311a7e14dcfSSatish Balay   FREECHAR(prefix,name);
312a7e14dcfSSatish Balay }
313a7e14dcfSSatish Balay 
314390e1bf2SBarry Smith PETSC_EXTERN void PETSC_STDCALL taosetoptionsprefix_(Tao *tao, char* prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
315a7e14dcfSSatish Balay {
316a7e14dcfSSatish Balay   char *t;
317a7e14dcfSSatish Balay   FIXCHAR(prefix,len,t);
318d49bb8f9SBarry Smith   *ierr = TaoSetOptionsPrefix(*tao,t);if (*ierr) return;
319a7e14dcfSSatish Balay   FREECHAR(prefix,t);
320a7e14dcfSSatish Balay }
321a7e14dcfSSatish Balay 
322390e1bf2SBarry Smith PETSC_EXTERN void PETSC_STDCALL taogettype_(Tao *tao, char* name PETSC_MIXED_LEN(len), PetscErrorCode *ierr  PETSC_END_LEN(len))
323a7e14dcfSSatish Balay {
324a7e14dcfSSatish Balay   const char *tname;
325a7e14dcfSSatish Balay   *ierr = TaoGetType(*tao,&tname);
326a7e14dcfSSatish Balay   *ierr = PetscStrncpy(name,tname,len); if (*ierr) return;
327a7e14dcfSSatish Balay   FIXRETURNCHAR(PETSC_TRUE,name,len);
328a7e14dcfSSatish Balay 
329a7e14dcfSSatish Balay }
330a7e14dcfSSatish Balay 
331db87b0f2SBarry Smith PETSC_EXTERN void PETSC_STDCALL taosetjacobianinequalityroutine_(Tao *tao, Mat *J, Mat *Jp, void (PETSC_STDCALL *func)(Tao*, Vec *, Mat *, Mat *,void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
332a7e14dcfSSatish Balay {
3338732526dSAlp Dener     CHKFORTRANNULLFUNCTION(func);
3348732526dSAlp Dener     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.jacineq,(PetscVoidFunction)func,ctx);
3358732526dSAlp Dener     if(!*ierr) *ierr = TaoSetJacobianInequalityRoutine(*tao,*J,*Jp,ourtaojacobianinequalityroutine,ctx);
336a7e14dcfSSatish Balay }
337a7e14dcfSSatish Balay 
338db87b0f2SBarry Smith PETSC_EXTERN void PETSC_STDCALL taosetjacobianequalityroutine_(Tao *tao, Mat *J, Mat *Jp, void (PETSC_STDCALL *func)(Tao*, Vec *, Mat *, Mat *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
339a7e14dcfSSatish Balay {
3408732526dSAlp Dener     CHKFORTRANNULLFUNCTION(func);
3418732526dSAlp Dener     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.jaceq,(PetscVoidFunction)func,ctx);
3428732526dSAlp Dener     if(!*ierr) *ierr = TaoSetJacobianEqualityRoutine(*tao,*J,*Jp,ourtaojacobianequalityroutine,ctx);
343a7e14dcfSSatish Balay }
344a7e14dcfSSatish Balay 
345db87b0f2SBarry Smith PETSC_EXTERN void PETSC_STDCALL taosetinequalityconstraintsroutine_(Tao *tao, Vec *C, void (PETSC_STDCALL *func)(Tao*, Vec *, Vec *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
346a7e14dcfSSatish Balay {
3478732526dSAlp Dener     CHKFORTRANNULLFUNCTION(func);
3488732526dSAlp Dener     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.conineq,(PetscVoidFunction)func,ctx);
3498732526dSAlp Dener     if(!*ierr) *ierr = TaoSetInequalityConstraintsRoutine(*tao,*C,ourtaoinequalityconstraintsroutine,ctx);
350a7e14dcfSSatish Balay }
351a7e14dcfSSatish Balay 
352db87b0f2SBarry Smith PETSC_EXTERN void PETSC_STDCALL taosetequalityconstraintsroutine_(Tao *tao, Vec *C, void (PETSC_STDCALL *func)(Tao*, Vec *, Vec *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
353a7e14dcfSSatish Balay {
3548732526dSAlp Dener     CHKFORTRANNULLFUNCTION(func);
3558732526dSAlp Dener     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.coneq,(PetscVoidFunction)func,ctx);
3568732526dSAlp Dener     if(!*ierr) *ierr = TaoSetEqualityConstraintsRoutine(*tao, *C, ourtaoequalityconstraintsroutine,ctx);
357a7e14dcfSSatish Balay }
358a7e14dcfSSatish Balay 
359e1e80dc8SAlp Dener PETSC_EXTERN void PETSC_STDCALL taosetupdate_(Tao *tao, void (PETSC_STDCALL *func)(Tao *, PetscInt *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
360e1e80dc8SAlp Dener {
361e1e80dc8SAlp Dener     CHKFORTRANNULLFUNCTION(func);
362e1e80dc8SAlp Dener     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.update,(PetscVoidFunction)func,ctx);
363e1e80dc8SAlp Dener     if(!*ierr) *ierr = TaoSetUpdate(*tao, ourtaoupdateroutine, ctx);
364e1e80dc8SAlp Dener }
365e1e80dc8SAlp Dener 
366a7e14dcfSSatish Balay EXTERN_C_END
367a7e14dcfSSatish Balay 
368a7e14dcfSSatish Balay 
369