xref: /petsc/src/tao/interface/ftn-custom/ztaosolverf.c (revision 1fb7b255396822dd64a4ea9c656967637c985cf5)
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
32fe2efc57SMark #define taoviewfromoptions_                 TAOVIEWFROMOPTIONS
33*1fb7b255SJunchao Zhang #define taodestroy_                         TAODESTROY
34a7e14dcfSSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
35a7e14dcfSSatish Balay 
36a7e14dcfSSatish Balay #define taosetobjectiveroutine_             taosetobjectiveroutine
37a7e14dcfSSatish Balay #define taosetgradientroutine_              taosetgradientroutine
38a7e14dcfSSatish Balay #define taosetobjectiveandgradientroutine_  taosetobjectiveandgradientroutine
39a7e14dcfSSatish Balay #define taosethessianroutine_               taosethessianroutine
40737f463aSAlp Dener #define taosetresidualroutine_              taosetresidualroutine
414ffbe8acSAlp Dener #define taosetjacobianresidualroutine_      taosetjacobianresidualroutine
42a7e14dcfSSatish Balay #define taosetjacobianroutine_              taosetjacobianroutine
43a7e14dcfSSatish Balay #define taosetjacobianstateroutine_         taosetjacobianstateroutine
44a7e14dcfSSatish Balay #define taosetjacobiandesignroutine_        taosetjacobiandesignroutine
45a7e14dcfSSatish Balay #define taosetjacobianinequalityroutine_    taosetjacobianinequalityroutine
46a7e14dcfSSatish Balay #define taosetjacobianequalityroutine_      taosetjacobianequalityroutine
47a7e14dcfSSatish Balay #define taosetinequalityconstraintsroutine_ taosetinequalityconstraintsroutine
48a7e14dcfSSatish Balay #define taosetequalityconstraintsroutine_   taosetequalityconstraintsroutine
49a7e14dcfSSatish Balay #define taosetvariableboundsroutine_        taosetvariableboundsroutine
50a7e14dcfSSatish Balay #define taosetconstraintsroutine_           taosetconstraintsroutine
51a7e14dcfSSatish Balay #define taosetmonitor_                      taosetmonitor
52a7e14dcfSSatish Balay #define taosettype_                         taosettype
53a7e14dcfSSatish Balay #define taoview_                            taoview
54ae93cb3cSJason Sarich #define taogetconvergencehistory_           taogetconvergencehistory
55a7e14dcfSSatish Balay #define taosetconvergencetest_              taosetconvergencetest
56a7e14dcfSSatish Balay #define taogetoptionsprefix_                taogetoptionsprefix
57a7e14dcfSSatish Balay #define taosetoptionsprefix_                taosetoptionsprefix
58a7e14dcfSSatish Balay #define taoappendoptionsprefix_             taoappendoptionsprefix
59a7e14dcfSSatish Balay #define taogettype_                         taogettype
60e1e80dc8SAlp Dener #define taosetupdate_                       taosetupdate
61fe2efc57SMark #define taoviewfromoptions_                 taoviewfromoptions
62*1fb7b255SJunchao Zhang #define taodestroy_                         taodestroy
63a7e14dcfSSatish Balay #endif
64a7e14dcfSSatish Balay 
658732526dSAlp Dener static struct {
668732526dSAlp Dener   PetscFortranCallbackId obj;
678732526dSAlp Dener   PetscFortranCallbackId grad;
688732526dSAlp Dener   PetscFortranCallbackId objgrad;
698732526dSAlp Dener   PetscFortranCallbackId hess;
70737f463aSAlp Dener   PetscFortranCallbackId lsres;
71737f463aSAlp Dener   PetscFortranCallbackId lsjac;
728732526dSAlp Dener   PetscFortranCallbackId jac;
738732526dSAlp Dener   PetscFortranCallbackId jacstate;
748732526dSAlp Dener   PetscFortranCallbackId jacdesign;
758732526dSAlp Dener   PetscFortranCallbackId bounds;
768732526dSAlp Dener   PetscFortranCallbackId mon;
778732526dSAlp Dener   PetscFortranCallbackId mondestroy;
788732526dSAlp Dener   PetscFortranCallbackId convtest;
798732526dSAlp Dener   PetscFortranCallbackId constraints;
808732526dSAlp Dener   PetscFortranCallbackId jacineq;
818732526dSAlp Dener   PetscFortranCallbackId jaceq;
828732526dSAlp Dener   PetscFortranCallbackId conineq;
838732526dSAlp Dener   PetscFortranCallbackId coneq;
848732526dSAlp Dener   PetscFortranCallbackId nfuncs;
85e1e80dc8SAlp Dener   PetscFortranCallbackId update;
868732526dSAlp Dener #if defined(PETSC_HAVE_F90_2PTR_ARG)
878732526dSAlp Dener   PetscFortranCallbackId function_pgiptr;
888732526dSAlp Dener #endif
898732526dSAlp Dener } _cb;
90a7e14dcfSSatish Balay 
91441846f8SBarry Smith static PetscErrorCode ourtaoobjectiveroutine(Tao tao, Vec x, PetscReal *f, void *ctx)
92a7e14dcfSSatish Balay {
938732526dSAlp Dener     PetscObjectUseFortranCallback(tao,_cb.obj,(Tao*,Vec*,PetscReal*,void*,PetscErrorCode*),(&tao,&x,f,_ctx,&ierr));
94a7e14dcfSSatish Balay }
95a7e14dcfSSatish Balay 
96441846f8SBarry Smith static PetscErrorCode ourtaogradientroutine(Tao tao, Vec x, Vec g, void *ctx)
97a7e14dcfSSatish Balay {
988732526dSAlp Dener     PetscObjectUseFortranCallback(tao,_cb.grad,(Tao*,Vec*,Vec*,void*,PetscErrorCode*),(&tao,&x,&g,_ctx,&ierr));
99a7e14dcfSSatish Balay }
100a7e14dcfSSatish Balay 
101441846f8SBarry Smith static PetscErrorCode ourtaoobjectiveandgradientroutine(Tao tao, Vec x, PetscReal *f, Vec g, void* ctx)
102a7e14dcfSSatish Balay {
1038732526dSAlp Dener     PetscObjectUseFortranCallback(tao,_cb.objgrad,(Tao*,Vec*,PetscReal*,Vec*,void*,PetscErrorCode*),(&tao,&x,f,&g,_ctx,&ierr));
104a7e14dcfSSatish Balay }
105a7e14dcfSSatish Balay 
106ffad9901SBarry Smith static PetscErrorCode ourtaohessianroutine(Tao tao, Vec x, Mat H, Mat Hpre, void *ctx)
107a7e14dcfSSatish Balay {
1088732526dSAlp Dener     PetscObjectUseFortranCallback(tao,_cb.hess,(Tao*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),(&tao,&x,&H,&Hpre,_ctx,&ierr));
109a7e14dcfSSatish Balay }
110a7e14dcfSSatish Balay 
111ffad9901SBarry Smith static PetscErrorCode ourtaojacobianroutine(Tao tao, Vec x, Mat H, Mat Hpre, void *ctx)
112a7e14dcfSSatish Balay {
1138732526dSAlp Dener     PetscObjectUseFortranCallback(tao,_cb.jac,(Tao*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),(&tao,&x,&H,&Hpre,_ctx,&ierr));
114a7e14dcfSSatish Balay }
115a7e14dcfSSatish Balay 
116ffad9901SBarry Smith static PetscErrorCode ourtaojacobianstateroutine(Tao tao, Vec x, Mat H, Mat Hpre, Mat Hinv, void *ctx)
117a7e14dcfSSatish Balay {
1188732526dSAlp Dener     PetscObjectUseFortranCallback(tao,_cb.jacstate,(Tao*,Vec*,Mat*,Mat*,Mat*,void*,PetscErrorCode*),(&tao,&x,&H,&Hpre,&Hinv,_ctx,&ierr));
119a7e14dcfSSatish Balay }
120a7e14dcfSSatish Balay 
12194ab13aaSBarry Smith static PetscErrorCode ourtaojacobiandesignroutine(Tao tao, Vec x, Mat H, void *ctx)
122a7e14dcfSSatish Balay {
1238732526dSAlp Dener     PetscObjectUseFortranCallback(tao,_cb.jacdesign,(Tao*,Vec*,Mat*,void*,PetscErrorCode*),(&tao,&x,&H,_ctx,&ierr));
124a7e14dcfSSatish Balay }
125a7e14dcfSSatish Balay 
126441846f8SBarry Smith static PetscErrorCode ourtaoboundsroutine(Tao tao, Vec xl, Vec xu, void *ctx)
127a7e14dcfSSatish Balay {
1288732526dSAlp Dener     PetscObjectUseFortranCallback(tao,_cb.bounds,(Tao*,Vec*,Vec*,void*,PetscErrorCode*),(&tao,&xl,&xu,_ctx,&ierr));
129a7e14dcfSSatish Balay }
130737f463aSAlp Dener static PetscErrorCode ourtaoresidualroutine(Tao tao, Vec x, Vec f, void *ctx)
131a7e14dcfSSatish Balay {
132737f463aSAlp Dener     PetscObjectUseFortranCallback(tao,_cb.lsres,(Tao*,Vec*,Vec*,void*,PetscErrorCode*),(&tao,&x,&f,_ctx,&ierr));
133737f463aSAlp Dener }
134737f463aSAlp Dener 
1354ffbe8acSAlp Dener static PetscErrorCode ourtaojacobianresidualroutine(Tao tao, Vec x, Mat J, Mat Jpre, void *ctx)
136737f463aSAlp Dener {
137737f463aSAlp Dener     PetscObjectUseFortranCallback(tao,_cb.lsjac,(Tao*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),(&tao,&x,&J,&Jpre,_ctx,&ierr));
138a7e14dcfSSatish Balay }
139a7e14dcfSSatish Balay 
140441846f8SBarry Smith static PetscErrorCode ourtaomonitor(Tao tao, void *ctx)
141a7e14dcfSSatish Balay {
1428732526dSAlp Dener     PetscObjectUseFortranCallback(tao,_cb.mon,(Tao *,void*,PetscErrorCode*),(&tao,_ctx,&ierr));
143a7e14dcfSSatish Balay }
144a7e14dcfSSatish Balay 
145a7e14dcfSSatish Balay static PetscErrorCode ourtaomondestroy(void **ctx)
146a7e14dcfSSatish Balay {
1478732526dSAlp Dener     Tao tao = (Tao)*ctx;
1488732526dSAlp Dener     PetscObjectUseFortranCallback(tao,_cb.mondestroy,(void*,PetscErrorCode*),(_ctx,&ierr));
149a7e14dcfSSatish Balay }
150441846f8SBarry Smith static PetscErrorCode ourtaoconvergencetest(Tao tao, void *ctx)
151a7e14dcfSSatish Balay {
1528732526dSAlp Dener     PetscObjectUseFortranCallback(tao,_cb.convtest,(Tao *,void*,PetscErrorCode*),(&tao,_ctx,&ierr));
153a7e14dcfSSatish Balay }
154a7e14dcfSSatish Balay 
155441846f8SBarry Smith static PetscErrorCode ourtaoconstraintsroutine(Tao tao, Vec x, Vec c, void *ctx)
156a7e14dcfSSatish Balay {
1578732526dSAlp Dener     PetscObjectUseFortranCallback(tao,_cb.constraints,(Tao*,Vec*,Vec*,void*,PetscErrorCode*),(&tao,&x,&c,_ctx,&ierr));
158a7e14dcfSSatish Balay }
159a7e14dcfSSatish Balay 
160ffad9901SBarry Smith static PetscErrorCode ourtaojacobianinequalityroutine(Tao tao, Vec x, Mat J, Mat Jpre, void *ctx)
161a7e14dcfSSatish Balay {
1628732526dSAlp Dener     PetscObjectUseFortranCallback(tao,_cb.jacineq,(Tao*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),(&tao,&x,&J,&Jpre,_ctx,&ierr));
163a7e14dcfSSatish Balay }
164a7e14dcfSSatish Balay 
165ffad9901SBarry Smith static PetscErrorCode ourtaojacobianequalityroutine(Tao tao, Vec x, Mat J, Mat Jpre, void *ctx)
166a7e14dcfSSatish Balay {
1678732526dSAlp Dener     PetscObjectUseFortranCallback(tao,_cb.jaceq,(Tao*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),(&tao,&x,&J,&Jpre,_ctx,&ierr));
168a7e14dcfSSatish Balay }
169a7e14dcfSSatish Balay 
170441846f8SBarry Smith static PetscErrorCode ourtaoinequalityconstraintsroutine(Tao tao, Vec x, Vec c, void *ctx)
171a7e14dcfSSatish Balay {
1728732526dSAlp Dener     PetscObjectUseFortranCallback(tao,_cb.conineq,(Tao*,Vec*,Vec*,void*,PetscErrorCode*),(&tao,&x,&c,_ctx,&ierr));
173a7e14dcfSSatish Balay }
174a7e14dcfSSatish Balay 
175441846f8SBarry Smith static PetscErrorCode ourtaoequalityconstraintsroutine(Tao tao, Vec x, Vec c, void *ctx)
176a7e14dcfSSatish Balay {
1778732526dSAlp Dener     PetscObjectUseFortranCallback(tao,_cb.coneq,(Tao*,Vec*,Vec*,void*,PetscErrorCode*),(&tao,&x,&c,_ctx,&ierr));
178a7e14dcfSSatish Balay }
179a7e14dcfSSatish Balay 
1808fcddce6SStefano Zampini static PetscErrorCode ourtaoupdateroutine(Tao tao, PetscInt iter, void *ctx)
181e1e80dc8SAlp Dener {
1828fcddce6SStefano Zampini     PetscObjectUseFortranCallback(tao,_cb.update,(Tao*,PetscInt*,void*),(&tao,&iter,_ctx));
183e1e80dc8SAlp Dener }
184e1e80dc8SAlp Dener 
185a7e14dcfSSatish Balay EXTERN_C_BEGIN
186a7e14dcfSSatish Balay 
18719caf8f3SSatish Balay PETSC_EXTERN void taosetobjectiveroutine_(Tao *tao, void (*func)(Tao*, Vec *, PetscReal *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
188a7e14dcfSSatish Balay {
1898732526dSAlp Dener     CHKFORTRANNULLFUNCTION(func);
1908732526dSAlp Dener     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.obj,(PetscVoidFunction)func,ctx);
1918732526dSAlp Dener     if (!*ierr) *ierr = TaoSetObjectiveRoutine(*tao,ourtaoobjectiveroutine,ctx);
192a7e14dcfSSatish Balay }
193a7e14dcfSSatish Balay 
19419caf8f3SSatish Balay PETSC_EXTERN void taosetgradientroutine_(Tao *tao, void (*func)(Tao*, Vec *, Vec *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
195a7e14dcfSSatish Balay {
1968732526dSAlp Dener     CHKFORTRANNULLFUNCTION(func);
1978732526dSAlp Dener     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.grad,(PetscVoidFunction)func,ctx);
1988732526dSAlp Dener     if (!*ierr) *ierr = TaoSetGradientRoutine(*tao,ourtaogradientroutine,ctx);
199a7e14dcfSSatish Balay }
200a7e14dcfSSatish Balay 
20119caf8f3SSatish Balay PETSC_EXTERN void taosetobjectiveandgradientroutine_(Tao *tao, void (*func)(Tao*, Vec *, PetscReal *, Vec *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
202a7e14dcfSSatish Balay {
2038732526dSAlp Dener     CHKFORTRANNULLFUNCTION(func);
2048732526dSAlp Dener     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.objgrad,(PetscVoidFunction)func,ctx);
2058732526dSAlp Dener     if (!*ierr) *ierr = TaoSetObjectiveAndGradientRoutine(*tao,ourtaoobjectiveandgradientroutine,ctx);
206a7e14dcfSSatish Balay }
207a7e14dcfSSatish Balay 
20819caf8f3SSatish Balay PETSC_EXTERN void taosetresidualroutine_(Tao *tao, Vec *F, void (*func)(Tao*, Vec *, Vec *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
209a7e14dcfSSatish Balay {
2108732526dSAlp Dener     CHKFORTRANNULLFUNCTION(func);
211737f463aSAlp Dener     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.lsres,(PetscVoidFunction)func,ctx);
212737f463aSAlp Dener     if (!*ierr) *ierr = TaoSetResidualRoutine(*tao,*F,ourtaoresidualroutine,ctx);
213737f463aSAlp Dener }
214737f463aSAlp Dener 
21519caf8f3SSatish Balay PETSC_EXTERN void taosetjacobianresidualroutine_(Tao *tao, Mat *J, Mat *Jpre, void (*func)(Tao*, Vec *, Mat *, Mat *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
216737f463aSAlp Dener {
217737f463aSAlp Dener     CHKFORTRANNULLFUNCTION(func);
218737f463aSAlp Dener     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.lsjac,(PetscVoidFunction)func,ctx);
2194ffbe8acSAlp Dener     if (!*ierr) *ierr = TaoSetJacobianResidualRoutine(*tao,*J,*Jpre,ourtaojacobianresidualroutine,ctx);
220a7e14dcfSSatish Balay }
221a7e14dcfSSatish Balay 
22219caf8f3SSatish Balay PETSC_EXTERN void taosetjacobianroutine_(Tao *tao, Mat *J, Mat *Jp, void (*func)(Tao*, Vec *, Mat *, Mat *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
223a7e14dcfSSatish Balay {
2248732526dSAlp Dener     CHKFORTRANNULLFUNCTION(func);
2258732526dSAlp Dener     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.jac,(PetscVoidFunction)func,ctx);
2268732526dSAlp Dener     if (!*ierr) *ierr = TaoSetJacobianRoutine(*tao,*J,*Jp,ourtaojacobianroutine,ctx);
227a7e14dcfSSatish Balay }
228a7e14dcfSSatish Balay 
22919caf8f3SSatish Balay PETSC_EXTERN void taosetjacobianstateroutine_(Tao *tao, Mat *J, Mat *Jp, Mat*Jinv, void (*func)(Tao*, Vec *, Mat *, Mat *, Mat*, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
230a7e14dcfSSatish Balay {
2318732526dSAlp Dener     CHKFORTRANNULLFUNCTION(func);
2328732526dSAlp Dener     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.jacstate,(PetscVoidFunction)func,ctx);
2338732526dSAlp Dener     if (!*ierr) *ierr = TaoSetJacobianStateRoutine(*tao,*J,*Jp,*Jinv,ourtaojacobianstateroutine,ctx);
234a7e14dcfSSatish Balay }
235a7e14dcfSSatish Balay 
23619caf8f3SSatish Balay PETSC_EXTERN void taosetjacobiandesignroutine_(Tao *tao, Mat *J, void (*func)(Tao*, Vec *, Mat *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
237a7e14dcfSSatish Balay {
2388732526dSAlp Dener     CHKFORTRANNULLFUNCTION(func);
2398732526dSAlp Dener     *ierr = PetscObjectSetFortranCallback((PetscObject)tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.jacdesign,(PetscVoidFunction)func,ctx);
2408732526dSAlp Dener     if (!*ierr) *ierr = TaoSetJacobianDesignRoutine(*tao,*J,ourtaojacobiandesignroutine,ctx);
241a7e14dcfSSatish Balay }
242a7e14dcfSSatish Balay 
24319caf8f3SSatish Balay PETSC_EXTERN void taosethessianroutine_(Tao *tao, Mat *J, Mat *Jp, void (*func)(Tao*, Vec *, Mat *, Mat *,void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
244a7e14dcfSSatish Balay {
2458732526dSAlp Dener     CHKFORTRANNULLFUNCTION(func);
2468732526dSAlp Dener     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.hess,(PetscVoidFunction)func,ctx);
2478732526dSAlp Dener     if (!*ierr) *ierr = TaoSetHessianRoutine(*tao,*J, *Jp, ourtaohessianroutine,ctx);
248a7e14dcfSSatish Balay }
249a7e14dcfSSatish Balay 
25019caf8f3SSatish Balay PETSC_EXTERN void taosetvariableboundsroutine_(Tao *tao, void (*func)(Tao*,Vec*,Vec*,void*,PetscErrorCode*),void *ctx, PetscErrorCode *ierr)
251a7e14dcfSSatish Balay {
2528732526dSAlp Dener     CHKFORTRANNULLFUNCTION(func);
2538732526dSAlp Dener     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.bounds,(PetscVoidFunction)func,ctx);
2548732526dSAlp Dener     if (!*ierr) *ierr = TaoSetVariableBoundsRoutine(*tao,ourtaoboundsroutine,ctx);
255a7e14dcfSSatish Balay }
256a7e14dcfSSatish Balay 
25719caf8f3SSatish Balay PETSC_EXTERN void taosetmonitor_(Tao *tao, void (*func)(Tao*,void*,PetscErrorCode*),void *ctx, void (*mondestroy)(void*,PetscErrorCode*),PetscErrorCode *ierr)
258a7e14dcfSSatish Balay {
259aecf964fSBarry Smith     CHKFORTRANNULLFUNCTION(mondestroy);
2608732526dSAlp Dener     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.mon,(PetscVoidFunction)func,ctx); if (*ierr) return;
2618732526dSAlp Dener     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.mondestroy,(PetscVoidFunction)mondestroy,ctx); if (*ierr) return;
2628732526dSAlp Dener     *ierr = TaoSetMonitor(*tao,ourtaomonitor,*tao,ourtaomondestroy);
263a7e14dcfSSatish Balay }
264a7e14dcfSSatish Balay 
26519caf8f3SSatish Balay PETSC_EXTERN void taosetconvergencetest_(Tao *tao, void (*func)(Tao*,void*,PetscErrorCode*),void *ctx, PetscErrorCode *ierr)
266a7e14dcfSSatish Balay {
2678732526dSAlp Dener     CHKFORTRANNULLFUNCTION(func);
2688732526dSAlp Dener     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.convtest,(PetscVoidFunction)func,ctx);
2698732526dSAlp Dener     if (!*ierr) *ierr = TaoSetConvergenceTest(*tao,ourtaoconvergencetest,ctx);
270a7e14dcfSSatish Balay }
271a7e14dcfSSatish Balay 
27219caf8f3SSatish Balay PETSC_EXTERN void taosetconstraintsroutine_(Tao *tao, Vec *C, void (*func)(Tao*, Vec *, Vec *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
273a7e14dcfSSatish Balay {
2748732526dSAlp Dener     CHKFORTRANNULLFUNCTION(func);
2758732526dSAlp Dener     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.constraints,(PetscVoidFunction)func,ctx);
2768732526dSAlp Dener     if (!*ierr) *ierr = TaoSetConstraintsRoutine(*tao,*C,ourtaoconstraintsroutine,ctx);
277a7e14dcfSSatish Balay }
278a7e14dcfSSatish Balay 
27919caf8f3SSatish Balay PETSC_EXTERN void taosettype_(Tao *tao, char* type_name, PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len)
280a7e14dcfSSatish Balay {
281a7e14dcfSSatish Balay     char *t;
282a7e14dcfSSatish Balay 
283a7e14dcfSSatish Balay     FIXCHAR(type_name,len,t);
284d49bb8f9SBarry Smith     *ierr = TaoSetType(*tao,t);if (*ierr) return;
285a7e14dcfSSatish Balay     FREECHAR(type_name,t);
286a7e14dcfSSatish Balay 
287a7e14dcfSSatish Balay }
288a7e14dcfSSatish Balay 
28919caf8f3SSatish Balay PETSC_EXTERN void taoview_(Tao *tao, PetscViewer *viewer, PetscErrorCode *ierr)
290a7e14dcfSSatish Balay {
291a7e14dcfSSatish Balay     PetscViewer v;
292a7e14dcfSSatish Balay     PetscPatchDefaultViewers_Fortran(viewer,v);
293a7e14dcfSSatish Balay     *ierr = TaoView(*tao,v);
294a7e14dcfSSatish Balay }
295a7e14dcfSSatish Balay 
29619caf8f3SSatish Balay PETSC_EXTERN void taogetconvergencehistory_(Tao *tao, PetscInt *nhist, PetscErrorCode *ierr)
297a7e14dcfSSatish Balay {
298ae93cb3cSJason Sarich   *ierr = TaoGetConvergenceHistory(*tao,NULL,NULL,NULL,NULL,nhist);
299a7e14dcfSSatish Balay }
300a7e14dcfSSatish Balay 
30119caf8f3SSatish Balay PETSC_EXTERN void taogetoptionsprefix_(Tao *tao, char* prefix, PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len)
302a7e14dcfSSatish Balay {
303a7e14dcfSSatish Balay   const char *name;
304a7e14dcfSSatish Balay   *ierr = TaoGetOptionsPrefix(*tao,&name);
305a7e14dcfSSatish Balay   *ierr = PetscStrncpy(prefix,name,len); if (*ierr) return;
306a7e14dcfSSatish Balay   FIXRETURNCHAR(PETSC_TRUE,prefix,len);
307a7e14dcfSSatish Balay 
308a7e14dcfSSatish Balay }
309a7e14dcfSSatish Balay 
31019caf8f3SSatish Balay PETSC_EXTERN void taoappendoptionsprefix_(Tao *tao, char* prefix,PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len)
311a7e14dcfSSatish Balay {
312a7e14dcfSSatish Balay   char *name;
313a7e14dcfSSatish Balay   FIXCHAR(prefix,len,name);
314d49bb8f9SBarry Smith   *ierr = TaoAppendOptionsPrefix(*tao,name);if (*ierr) return;
315a7e14dcfSSatish Balay   FREECHAR(prefix,name);
316a7e14dcfSSatish Balay }
317a7e14dcfSSatish Balay 
31819caf8f3SSatish Balay PETSC_EXTERN void taosetoptionsprefix_(Tao *tao, char* prefix,PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len)
319a7e14dcfSSatish Balay {
320a7e14dcfSSatish Balay   char *t;
321a7e14dcfSSatish Balay   FIXCHAR(prefix,len,t);
322d49bb8f9SBarry Smith   *ierr = TaoSetOptionsPrefix(*tao,t);if (*ierr) return;
323a7e14dcfSSatish Balay   FREECHAR(prefix,t);
324a7e14dcfSSatish Balay }
325a7e14dcfSSatish Balay 
32619caf8f3SSatish Balay PETSC_EXTERN void taogettype_(Tao *tao, char* name, PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len)
327a7e14dcfSSatish Balay {
328a7e14dcfSSatish Balay   const char *tname;
329a7e14dcfSSatish Balay   *ierr = TaoGetType(*tao,&tname);
330a7e14dcfSSatish Balay   *ierr = PetscStrncpy(name,tname,len); if (*ierr) return;
331a7e14dcfSSatish Balay   FIXRETURNCHAR(PETSC_TRUE,name,len);
332a7e14dcfSSatish Balay 
333a7e14dcfSSatish Balay }
334a7e14dcfSSatish Balay 
33519caf8f3SSatish Balay PETSC_EXTERN void taosetjacobianinequalityroutine_(Tao *tao, Mat *J, Mat *Jp, void (*func)(Tao*, Vec *, Mat *, Mat *,void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
336a7e14dcfSSatish Balay {
3378732526dSAlp Dener     CHKFORTRANNULLFUNCTION(func);
3388732526dSAlp Dener     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.jacineq,(PetscVoidFunction)func,ctx);
3398732526dSAlp Dener     if (!*ierr) *ierr = TaoSetJacobianInequalityRoutine(*tao,*J,*Jp,ourtaojacobianinequalityroutine,ctx);
340a7e14dcfSSatish Balay }
341a7e14dcfSSatish Balay 
34219caf8f3SSatish Balay PETSC_EXTERN void taosetjacobianequalityroutine_(Tao *tao, Mat *J, Mat *Jp, void (*func)(Tao*, Vec *, Mat *, Mat *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
343a7e14dcfSSatish Balay {
3448732526dSAlp Dener     CHKFORTRANNULLFUNCTION(func);
3458732526dSAlp Dener     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.jaceq,(PetscVoidFunction)func,ctx);
3468732526dSAlp Dener     if (!*ierr) *ierr = TaoSetJacobianEqualityRoutine(*tao,*J,*Jp,ourtaojacobianequalityroutine,ctx);
347a7e14dcfSSatish Balay }
348a7e14dcfSSatish Balay 
34919caf8f3SSatish Balay PETSC_EXTERN void taosetinequalityconstraintsroutine_(Tao *tao, Vec *C, void (*func)(Tao*, Vec *, Vec *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
350a7e14dcfSSatish Balay {
3518732526dSAlp Dener     CHKFORTRANNULLFUNCTION(func);
3528732526dSAlp Dener     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.conineq,(PetscVoidFunction)func,ctx);
3538732526dSAlp Dener     if (!*ierr) *ierr = TaoSetInequalityConstraintsRoutine(*tao,*C,ourtaoinequalityconstraintsroutine,ctx);
354a7e14dcfSSatish Balay }
355a7e14dcfSSatish Balay 
35619caf8f3SSatish Balay PETSC_EXTERN void taosetequalityconstraintsroutine_(Tao *tao, Vec *C, void (*func)(Tao*, Vec *, Vec *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
357a7e14dcfSSatish Balay {
3588732526dSAlp Dener     CHKFORTRANNULLFUNCTION(func);
3598732526dSAlp Dener     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.coneq,(PetscVoidFunction)func,ctx);
3608732526dSAlp Dener     if (!*ierr) *ierr = TaoSetEqualityConstraintsRoutine(*tao, *C, ourtaoequalityconstraintsroutine,ctx);
361a7e14dcfSSatish Balay }
362a7e14dcfSSatish Balay 
36319caf8f3SSatish Balay PETSC_EXTERN void taosetupdate_(Tao *tao, void (*func)(Tao *, PetscInt *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
364e1e80dc8SAlp Dener {
365e1e80dc8SAlp Dener     CHKFORTRANNULLFUNCTION(func);
366e1e80dc8SAlp Dener     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.update,(PetscVoidFunction)func,ctx);
367e1e80dc8SAlp Dener     if (!*ierr) *ierr = TaoSetUpdate(*tao, ourtaoupdateroutine, ctx);
368e1e80dc8SAlp Dener }
369e1e80dc8SAlp Dener 
37019caf8f3SSatish Balay PETSC_EXTERN void taoviewfromoptions_(Tao *ao,PetscObject obj,char* type,PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len)
371fe2efc57SMark {
372fe2efc57SMark   char *t;
373fe2efc57SMark 
374fe2efc57SMark   FIXCHAR(type,len,t);
375b14c0cbaSBlaise Bourdin   CHKFORTRANNULLOBJECT(obj);
376fe2efc57SMark   *ierr = TaoViewFromOptions(*ao,obj,t);if (*ierr) return;
377fe2efc57SMark   FREECHAR(type,t);
378fe2efc57SMark }
379fe2efc57SMark 
380*1fb7b255SJunchao Zhang PETSC_EXTERN void taodestroy_(Tao *x,int *ierr)
381*1fb7b255SJunchao Zhang {
382*1fb7b255SJunchao Zhang   PETSC_FORTRAN_OBJECT_F_DESTROYED_TO_C_NULL(x);
383*1fb7b255SJunchao Zhang   *ierr = TaoDestroy(x); if (*ierr) return;
384*1fb7b255SJunchao Zhang   PETSC_FORTRAN_OBJECT_C_NULL_TO_F_DESTROYED(x);
385*1fb7b255SJunchao Zhang }
386*1fb7b255SJunchao Zhang 
387a7e14dcfSSatish Balay EXTERN_C_END
388a7e14dcfSSatish Balay 
389a7e14dcfSSatish Balay 
390