xref: /petsc/src/tao/interface/ftn-custom/ztaosolverf.c (revision 8434afd195968570cfdb5bc7b9cfc0a316d974ae)
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 #if defined(PETSC_HAVE_FORTRAN_CAPS)
6a82e8c82SStefano Zampini   #define taosetobjective_                    TAOSETOBJECTIVE
7a82e8c82SStefano Zampini   #define taosetgradient_                     TAOSETGRADIENT
8a82e8c82SStefano Zampini   #define taosetobjectiveandgradient_         TAOSETOBJECTIVEANDGRADIENT
9a82e8c82SStefano Zampini   #define taosethessian_                      TAOSETHESSIAN
10737f463aSAlp Dener   #define taosetresidualroutine_              TAOSETRESIDUALROUTINE
114ffbe8acSAlp Dener   #define taosetjacobianresidualroutine_      TAOSETJACOBIANRESIDUALROUTINE
12a7e14dcfSSatish Balay   #define taosetjacobianroutine_              TAOSETJACOBIANROUTINE
13a7e14dcfSSatish Balay   #define taosetjacobianstateroutine_         TAOSETJACOBIANSTATEROUTINE
14a7e14dcfSSatish Balay   #define taosetjacobiandesignroutine_        TAOSETJACOBIANDESIGNROUTINE
15a7e14dcfSSatish Balay   #define taosetjacobianinequalityroutine_    TAOSETJACOBIANINEQUALITYROUTINE
16a7e14dcfSSatish Balay   #define taosetjacobianequalityroutine_      TAOSETJACOBIANEQUALITYROUTINE
17a7e14dcfSSatish Balay   #define taosetinequalityconstraintsroutine_ TAOSETINEQUALITYCONSTRAINTSROUTINE
18a7e14dcfSSatish Balay   #define taosetequalityconstraintsroutine_   TAOSETEQUALITYCONSTRAINTSROUTINE
19a7e14dcfSSatish Balay   #define taosetvariableboundsroutine_        TAOSETVARIABLEBOUNDSROUTINE
20a7e14dcfSSatish Balay   #define taosetconstraintsroutine_           TAOSETCONSTRAINTSROUTINE
21a7e14dcfSSatish Balay   #define taosetmonitor_                      TAOSETMONITOR
22a7e14dcfSSatish Balay   #define taosettype_                         TAOSETTYPE
23a7e14dcfSSatish Balay   #define taoview_                            TAOVIEW
24ae93cb3cSJason Sarich   #define taogetconvergencehistory_           TAOGETCONVERGENCEHISTORY
25a7e14dcfSSatish Balay   #define taosetconvergencetest_              TAOSETCONVERGENCETEST
26a7e14dcfSSatish Balay   #define taogetoptionsprefix_                TAOGETOPTIONSPREFIX
27a7e14dcfSSatish Balay   #define taosetoptionsprefix_                TAOSETOPTIONSPREFIX
28a7e14dcfSSatish Balay   #define taoappendoptionsprefix_             TAOAPPENDOPTIONSPREFIX
29a7e14dcfSSatish Balay   #define taogettype_                         TAOGETTYPE
30e1e80dc8SAlp Dener   #define taosetupdate_                       TAOSETUPDATE
31fe2efc57SMark   #define taoviewfromoptions_                 TAOVIEWFROMOPTIONS
321fb7b255SJunchao Zhang   #define taodestroy_                         TAODESTROY
33a7e14dcfSSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
34a82e8c82SStefano Zampini   #define taosetobjective_                    taosetobjective
35a82e8c82SStefano Zampini   #define taosetgradient_                     taosetgradient
36a82e8c82SStefano Zampini   #define taosetobjectiveandgradient_         taosetobjectiveandgradient
37a82e8c82SStefano Zampini   #define taosethessian_                      taosethessian
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
59fe2efc57SMark   #define taoviewfromoptions_                 taoviewfromoptions
601fb7b255SJunchao Zhang   #define taodestroy_                         taodestroy
61a7e14dcfSSatish Balay #endif
62a7e14dcfSSatish Balay 
638732526dSAlp Dener static struct {
648732526dSAlp Dener   PetscFortranCallbackId obj;
658732526dSAlp Dener   PetscFortranCallbackId grad;
668732526dSAlp Dener   PetscFortranCallbackId objgrad;
678732526dSAlp Dener   PetscFortranCallbackId hess;
68737f463aSAlp Dener   PetscFortranCallbackId lsres;
69737f463aSAlp Dener   PetscFortranCallbackId lsjac;
708732526dSAlp Dener   PetscFortranCallbackId jac;
718732526dSAlp Dener   PetscFortranCallbackId jacstate;
728732526dSAlp Dener   PetscFortranCallbackId jacdesign;
738732526dSAlp Dener   PetscFortranCallbackId bounds;
748732526dSAlp Dener   PetscFortranCallbackId mon;
758732526dSAlp Dener   PetscFortranCallbackId mondestroy;
768732526dSAlp Dener   PetscFortranCallbackId convtest;
778732526dSAlp Dener   PetscFortranCallbackId constraints;
788732526dSAlp Dener   PetscFortranCallbackId jacineq;
798732526dSAlp Dener   PetscFortranCallbackId jaceq;
808732526dSAlp Dener   PetscFortranCallbackId conineq;
818732526dSAlp Dener   PetscFortranCallbackId coneq;
828732526dSAlp Dener   PetscFortranCallbackId nfuncs;
83e1e80dc8SAlp Dener   PetscFortranCallbackId update;
848732526dSAlp Dener #if defined(PETSC_HAVE_F90_2PTR_ARG)
858732526dSAlp Dener   PetscFortranCallbackId function_pgiptr;
868732526dSAlp Dener #endif
878732526dSAlp Dener } _cb;
88a7e14dcfSSatish Balay 
89441846f8SBarry Smith static PetscErrorCode ourtaoobjectiveroutine(Tao tao, Vec x, PetscReal *f, void *ctx)
90a7e14dcfSSatish Balay {
918732526dSAlp Dener   PetscObjectUseFortranCallback(tao, _cb.obj, (Tao *, Vec *, PetscReal *, void *, PetscErrorCode *), (&tao, &x, f, _ctx, &ierr));
92a7e14dcfSSatish Balay }
93a7e14dcfSSatish Balay 
94441846f8SBarry Smith static PetscErrorCode ourtaogradientroutine(Tao tao, Vec x, Vec g, void *ctx)
95a7e14dcfSSatish Balay {
968732526dSAlp Dener   PetscObjectUseFortranCallback(tao, _cb.grad, (Tao *, Vec *, Vec *, void *, PetscErrorCode *), (&tao, &x, &g, _ctx, &ierr));
97a7e14dcfSSatish Balay }
98a7e14dcfSSatish Balay 
99441846f8SBarry Smith static PetscErrorCode ourtaoobjectiveandgradientroutine(Tao tao, Vec x, PetscReal *f, Vec g, void *ctx)
100a7e14dcfSSatish Balay {
1018732526dSAlp Dener   PetscObjectUseFortranCallback(tao, _cb.objgrad, (Tao *, Vec *, PetscReal *, Vec *, void *, PetscErrorCode *), (&tao, &x, f, &g, _ctx, &ierr));
102a7e14dcfSSatish Balay }
103a7e14dcfSSatish Balay 
104ffad9901SBarry Smith static PetscErrorCode ourtaohessianroutine(Tao tao, Vec x, Mat H, Mat Hpre, void *ctx)
105a7e14dcfSSatish Balay {
1068732526dSAlp Dener   PetscObjectUseFortranCallback(tao, _cb.hess, (Tao *, Vec *, Mat *, Mat *, void *, PetscErrorCode *), (&tao, &x, &H, &Hpre, _ctx, &ierr));
107a7e14dcfSSatish Balay }
108a7e14dcfSSatish Balay 
109ffad9901SBarry Smith static PetscErrorCode ourtaojacobianroutine(Tao tao, Vec x, Mat H, Mat Hpre, void *ctx)
110a7e14dcfSSatish Balay {
1118732526dSAlp Dener   PetscObjectUseFortranCallback(tao, _cb.jac, (Tao *, Vec *, Mat *, Mat *, void *, PetscErrorCode *), (&tao, &x, &H, &Hpre, _ctx, &ierr));
112a7e14dcfSSatish Balay }
113a7e14dcfSSatish Balay 
114ffad9901SBarry Smith static PetscErrorCode ourtaojacobianstateroutine(Tao tao, Vec x, Mat H, Mat Hpre, Mat Hinv, void *ctx)
115a7e14dcfSSatish Balay {
1168732526dSAlp Dener   PetscObjectUseFortranCallback(tao, _cb.jacstate, (Tao *, Vec *, Mat *, Mat *, Mat *, void *, PetscErrorCode *), (&tao, &x, &H, &Hpre, &Hinv, _ctx, &ierr));
117a7e14dcfSSatish Balay }
118a7e14dcfSSatish Balay 
11994ab13aaSBarry Smith static PetscErrorCode ourtaojacobiandesignroutine(Tao tao, Vec x, Mat H, void *ctx)
120a7e14dcfSSatish Balay {
1218732526dSAlp Dener   PetscObjectUseFortranCallback(tao, _cb.jacdesign, (Tao *, Vec *, Mat *, void *, PetscErrorCode *), (&tao, &x, &H, _ctx, &ierr));
122a7e14dcfSSatish Balay }
123a7e14dcfSSatish Balay 
124441846f8SBarry Smith static PetscErrorCode ourtaoboundsroutine(Tao tao, Vec xl, Vec xu, void *ctx)
125a7e14dcfSSatish Balay {
1268732526dSAlp Dener   PetscObjectUseFortranCallback(tao, _cb.bounds, (Tao *, Vec *, Vec *, void *, PetscErrorCode *), (&tao, &xl, &xu, _ctx, &ierr));
127a7e14dcfSSatish Balay }
128737f463aSAlp Dener static PetscErrorCode ourtaoresidualroutine(Tao tao, Vec x, Vec f, void *ctx)
129a7e14dcfSSatish Balay {
130737f463aSAlp Dener   PetscObjectUseFortranCallback(tao, _cb.lsres, (Tao *, Vec *, Vec *, void *, PetscErrorCode *), (&tao, &x, &f, _ctx, &ierr));
131737f463aSAlp Dener }
132737f463aSAlp Dener 
1334ffbe8acSAlp Dener static PetscErrorCode ourtaojacobianresidualroutine(Tao tao, Vec x, Mat J, Mat Jpre, void *ctx)
134737f463aSAlp Dener {
135737f463aSAlp Dener   PetscObjectUseFortranCallback(tao, _cb.lsjac, (Tao *, Vec *, Mat *, Mat *, void *, PetscErrorCode *), (&tao, &x, &J, &Jpre, _ctx, &ierr));
136a7e14dcfSSatish Balay }
137a7e14dcfSSatish Balay 
138441846f8SBarry Smith static PetscErrorCode ourtaomonitor(Tao tao, void *ctx)
139a7e14dcfSSatish Balay {
1408732526dSAlp Dener   PetscObjectUseFortranCallback(tao, _cb.mon, (Tao *, void *, PetscErrorCode *), (&tao, _ctx, &ierr));
141a7e14dcfSSatish Balay }
142a7e14dcfSSatish Balay 
143a7e14dcfSSatish Balay static PetscErrorCode ourtaomondestroy(void **ctx)
144a7e14dcfSSatish Balay {
1458732526dSAlp Dener   Tao tao = (Tao)*ctx;
1468732526dSAlp Dener   PetscObjectUseFortranCallback(tao, _cb.mondestroy, (void *, PetscErrorCode *), (_ctx, &ierr));
147a7e14dcfSSatish Balay }
148441846f8SBarry Smith static PetscErrorCode ourtaoconvergencetest(Tao tao, void *ctx)
149a7e14dcfSSatish Balay {
1508732526dSAlp Dener   PetscObjectUseFortranCallback(tao, _cb.convtest, (Tao *, void *, PetscErrorCode *), (&tao, _ctx, &ierr));
151a7e14dcfSSatish Balay }
152a7e14dcfSSatish Balay 
153441846f8SBarry Smith static PetscErrorCode ourtaoconstraintsroutine(Tao tao, Vec x, Vec c, void *ctx)
154a7e14dcfSSatish Balay {
1558732526dSAlp Dener   PetscObjectUseFortranCallback(tao, _cb.constraints, (Tao *, Vec *, Vec *, void *, PetscErrorCode *), (&tao, &x, &c, _ctx, &ierr));
156a7e14dcfSSatish Balay }
157a7e14dcfSSatish Balay 
158ffad9901SBarry Smith static PetscErrorCode ourtaojacobianinequalityroutine(Tao tao, Vec x, Mat J, Mat Jpre, void *ctx)
159a7e14dcfSSatish Balay {
1608732526dSAlp Dener   PetscObjectUseFortranCallback(tao, _cb.jacineq, (Tao *, Vec *, Mat *, Mat *, void *, PetscErrorCode *), (&tao, &x, &J, &Jpre, _ctx, &ierr));
161a7e14dcfSSatish Balay }
162a7e14dcfSSatish Balay 
163ffad9901SBarry Smith static PetscErrorCode ourtaojacobianequalityroutine(Tao tao, Vec x, Mat J, Mat Jpre, void *ctx)
164a7e14dcfSSatish Balay {
1658732526dSAlp Dener   PetscObjectUseFortranCallback(tao, _cb.jaceq, (Tao *, Vec *, Mat *, Mat *, void *, PetscErrorCode *), (&tao, &x, &J, &Jpre, _ctx, &ierr));
166a7e14dcfSSatish Balay }
167a7e14dcfSSatish Balay 
168441846f8SBarry Smith static PetscErrorCode ourtaoinequalityconstraintsroutine(Tao tao, Vec x, Vec c, void *ctx)
169a7e14dcfSSatish Balay {
1708732526dSAlp Dener   PetscObjectUseFortranCallback(tao, _cb.conineq, (Tao *, Vec *, Vec *, void *, PetscErrorCode *), (&tao, &x, &c, _ctx, &ierr));
171a7e14dcfSSatish Balay }
172a7e14dcfSSatish Balay 
173441846f8SBarry Smith static PetscErrorCode ourtaoequalityconstraintsroutine(Tao tao, Vec x, Vec c, void *ctx)
174a7e14dcfSSatish Balay {
1758732526dSAlp Dener   PetscObjectUseFortranCallback(tao, _cb.coneq, (Tao *, Vec *, Vec *, void *, PetscErrorCode *), (&tao, &x, &c, _ctx, &ierr));
176a7e14dcfSSatish Balay }
177a7e14dcfSSatish Balay 
1788fcddce6SStefano Zampini static PetscErrorCode ourtaoupdateroutine(Tao tao, PetscInt iter, void *ctx)
179e1e80dc8SAlp Dener {
1808fcddce6SStefano Zampini   PetscObjectUseFortranCallback(tao, _cb.update, (Tao *, PetscInt *, void *), (&tao, &iter, _ctx));
181e1e80dc8SAlp Dener }
182e1e80dc8SAlp Dener 
183a7e14dcfSSatish Balay EXTERN_C_BEGIN
184a7e14dcfSSatish Balay 
185a82e8c82SStefano Zampini PETSC_EXTERN void taosetobjective_(Tao *tao, void (*func)(Tao *, Vec *, PetscReal *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
186a7e14dcfSSatish Balay {
1878732526dSAlp Dener   CHKFORTRANNULLFUNCTION(func);
188*8434afd1SBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*tao, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.obj, (PetscVoidFn *)func, ctx);
189a82e8c82SStefano Zampini   if (!*ierr) *ierr = TaoSetObjective(*tao, ourtaoobjectiveroutine, ctx);
190a7e14dcfSSatish Balay }
191a7e14dcfSSatish Balay 
192a82e8c82SStefano Zampini PETSC_EXTERN void taosetgradient_(Tao *tao, Vec *g, void (*func)(Tao *, Vec *, Vec *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
193a7e14dcfSSatish Balay {
1948732526dSAlp Dener   CHKFORTRANNULLFUNCTION(func);
195*8434afd1SBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*tao, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.grad, (PetscVoidFn *)func, ctx);
196a82e8c82SStefano Zampini   if (!*ierr) *ierr = TaoSetGradient(*tao, *g, ourtaogradientroutine, ctx);
197a7e14dcfSSatish Balay }
198a7e14dcfSSatish Balay 
199a82e8c82SStefano Zampini PETSC_EXTERN void taosetobjectiveandgradient_(Tao *tao, Vec *g, void (*func)(Tao *, Vec *, PetscReal *, Vec *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
200a7e14dcfSSatish Balay {
2018732526dSAlp Dener   CHKFORTRANNULLFUNCTION(func);
202*8434afd1SBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*tao, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.objgrad, (PetscVoidFn *)func, ctx);
203a82e8c82SStefano Zampini   if (!*ierr) *ierr = TaoSetObjectiveAndGradient(*tao, *g, ourtaoobjectiveandgradientroutine, ctx);
204a82e8c82SStefano Zampini }
205a82e8c82SStefano Zampini 
206a82e8c82SStefano Zampini PETSC_EXTERN void taosethessian_(Tao *tao, Mat *J, Mat *Jp, void (*func)(Tao *, Vec *, Mat *, Mat *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
207a82e8c82SStefano Zampini {
208a82e8c82SStefano Zampini   CHKFORTRANNULLFUNCTION(func);
209*8434afd1SBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*tao, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.hess, (PetscVoidFn *)func, ctx);
210a82e8c82SStefano Zampini   if (!*ierr) *ierr = TaoSetHessian(*tao, *J, *Jp, ourtaohessianroutine, ctx);
211a7e14dcfSSatish Balay }
212a7e14dcfSSatish Balay 
21319caf8f3SSatish Balay PETSC_EXTERN void taosetresidualroutine_(Tao *tao, Vec *F, void (*func)(Tao *, Vec *, Vec *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
214a7e14dcfSSatish Balay {
2158732526dSAlp Dener   CHKFORTRANNULLFUNCTION(func);
216*8434afd1SBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*tao, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.lsres, (PetscVoidFn *)func, ctx);
217737f463aSAlp Dener   if (!*ierr) *ierr = TaoSetResidualRoutine(*tao, *F, ourtaoresidualroutine, ctx);
218737f463aSAlp Dener }
219737f463aSAlp Dener 
22019caf8f3SSatish Balay PETSC_EXTERN void taosetjacobianresidualroutine_(Tao *tao, Mat *J, Mat *Jpre, void (*func)(Tao *, Vec *, Mat *, Mat *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
221737f463aSAlp Dener {
222737f463aSAlp Dener   CHKFORTRANNULLFUNCTION(func);
223*8434afd1SBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*tao, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.lsjac, (PetscVoidFn *)func, ctx);
2244ffbe8acSAlp Dener   if (!*ierr) *ierr = TaoSetJacobianResidualRoutine(*tao, *J, *Jpre, ourtaojacobianresidualroutine, ctx);
225a7e14dcfSSatish Balay }
226a7e14dcfSSatish Balay 
22719caf8f3SSatish Balay PETSC_EXTERN void taosetjacobianroutine_(Tao *tao, Mat *J, Mat *Jp, void (*func)(Tao *, Vec *, Mat *, Mat *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
228a7e14dcfSSatish Balay {
2298732526dSAlp Dener   CHKFORTRANNULLFUNCTION(func);
230*8434afd1SBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*tao, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.jac, (PetscVoidFn *)func, ctx);
2318732526dSAlp Dener   if (!*ierr) *ierr = TaoSetJacobianRoutine(*tao, *J, *Jp, ourtaojacobianroutine, ctx);
232a7e14dcfSSatish Balay }
233a7e14dcfSSatish Balay 
23419caf8f3SSatish 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)
235a7e14dcfSSatish Balay {
2368732526dSAlp Dener   CHKFORTRANNULLFUNCTION(func);
237*8434afd1SBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*tao, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.jacstate, (PetscVoidFn *)func, ctx);
2388732526dSAlp Dener   if (!*ierr) *ierr = TaoSetJacobianStateRoutine(*tao, *J, *Jp, *Jinv, ourtaojacobianstateroutine, ctx);
239a7e14dcfSSatish Balay }
240a7e14dcfSSatish Balay 
24119caf8f3SSatish Balay PETSC_EXTERN void taosetjacobiandesignroutine_(Tao *tao, Mat *J, void (*func)(Tao *, Vec *, Mat *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
242a7e14dcfSSatish Balay {
2438732526dSAlp Dener   CHKFORTRANNULLFUNCTION(func);
244*8434afd1SBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)tao, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.jacdesign, (PetscVoidFn *)func, ctx);
2458732526dSAlp Dener   if (!*ierr) *ierr = TaoSetJacobianDesignRoutine(*tao, *J, ourtaojacobiandesignroutine, ctx);
246a7e14dcfSSatish Balay }
247a7e14dcfSSatish Balay 
24819caf8f3SSatish Balay PETSC_EXTERN void taosetvariableboundsroutine_(Tao *tao, void (*func)(Tao *, Vec *, Vec *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
249a7e14dcfSSatish Balay {
2508732526dSAlp Dener   CHKFORTRANNULLFUNCTION(func);
251*8434afd1SBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*tao, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.bounds, (PetscVoidFn *)func, ctx);
2528732526dSAlp Dener   if (!*ierr) *ierr = TaoSetVariableBoundsRoutine(*tao, ourtaoboundsroutine, ctx);
253a7e14dcfSSatish Balay }
254a7e14dcfSSatish Balay 
25519caf8f3SSatish Balay PETSC_EXTERN void taosetmonitor_(Tao *tao, void (*func)(Tao *, void *, PetscErrorCode *), void *ctx, void (*mondestroy)(void *, PetscErrorCode *), PetscErrorCode *ierr)
256a7e14dcfSSatish Balay {
257aecf964fSBarry Smith   CHKFORTRANNULLFUNCTION(mondestroy);
258*8434afd1SBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*tao, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.mon, (PetscVoidFn *)func, ctx);
2595975b3b6SBarry Smith   if (*ierr) return;
260*8434afd1SBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*tao, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.mondestroy, (PetscVoidFn *)mondestroy, ctx);
2615975b3b6SBarry Smith   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);
268*8434afd1SBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*tao, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.convtest, (PetscVoidFn *)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);
275*8434afd1SBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*tao, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.constraints, (PetscVoidFn *)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);
2845975b3b6SBarry Smith   *ierr = TaoSetType(*tao, t);
2855975b3b6SBarry Smith   if (*ierr) return;
286a7e14dcfSSatish Balay   FREECHAR(type_name, t);
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);
3055975b3b6SBarry Smith   *ierr = PetscStrncpy(prefix, name, len);
3065975b3b6SBarry Smith   if (*ierr) return;
307a7e14dcfSSatish Balay   FIXRETURNCHAR(PETSC_TRUE, prefix, len);
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);
3145975b3b6SBarry Smith   *ierr = TaoAppendOptionsPrefix(*tao, name);
3155975b3b6SBarry Smith   if (*ierr) return;
316a7e14dcfSSatish Balay   FREECHAR(prefix, name);
317a7e14dcfSSatish Balay }
318a7e14dcfSSatish Balay 
31919caf8f3SSatish Balay PETSC_EXTERN void taosetoptionsprefix_(Tao *tao, char *prefix, PetscErrorCode *ierr, PETSC_FORTRAN_CHARLEN_T len)
320a7e14dcfSSatish Balay {
321a7e14dcfSSatish Balay   char *t;
322a7e14dcfSSatish Balay   FIXCHAR(prefix, len, t);
3235975b3b6SBarry Smith   *ierr = TaoSetOptionsPrefix(*tao, t);
3245975b3b6SBarry Smith   if (*ierr) return;
325a7e14dcfSSatish Balay   FREECHAR(prefix, t);
326a7e14dcfSSatish Balay }
327a7e14dcfSSatish Balay 
32819caf8f3SSatish Balay PETSC_EXTERN void taogettype_(Tao *tao, char *name, PetscErrorCode *ierr, PETSC_FORTRAN_CHARLEN_T len)
329a7e14dcfSSatish Balay {
330a7e14dcfSSatish Balay   const char *tname;
331a7e14dcfSSatish Balay   *ierr = TaoGetType(*tao, &tname);
3325975b3b6SBarry Smith   *ierr = PetscStrncpy(name, tname, len);
3335975b3b6SBarry Smith   if (*ierr) return;
334a7e14dcfSSatish Balay   FIXRETURNCHAR(PETSC_TRUE, name, len);
335a7e14dcfSSatish Balay }
336a7e14dcfSSatish Balay 
33719caf8f3SSatish Balay PETSC_EXTERN void taosetjacobianinequalityroutine_(Tao *tao, Mat *J, Mat *Jp, void (*func)(Tao *, Vec *, Mat *, Mat *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
338a7e14dcfSSatish Balay {
3398732526dSAlp Dener   CHKFORTRANNULLFUNCTION(func);
340*8434afd1SBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*tao, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.jacineq, (PetscVoidFn *)func, ctx);
3418732526dSAlp Dener   if (!*ierr) *ierr = TaoSetJacobianInequalityRoutine(*tao, *J, *Jp, ourtaojacobianinequalityroutine, ctx);
342a7e14dcfSSatish Balay }
343a7e14dcfSSatish Balay 
34419caf8f3SSatish Balay PETSC_EXTERN void taosetjacobianequalityroutine_(Tao *tao, Mat *J, Mat *Jp, void (*func)(Tao *, Vec *, Mat *, Mat *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
345a7e14dcfSSatish Balay {
3468732526dSAlp Dener   CHKFORTRANNULLFUNCTION(func);
347*8434afd1SBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*tao, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.jaceq, (PetscVoidFn *)func, ctx);
3488732526dSAlp Dener   if (!*ierr) *ierr = TaoSetJacobianEqualityRoutine(*tao, *J, *Jp, ourtaojacobianequalityroutine, ctx);
349a7e14dcfSSatish Balay }
350a7e14dcfSSatish Balay 
35119caf8f3SSatish Balay PETSC_EXTERN void taosetinequalityconstraintsroutine_(Tao *tao, Vec *C, void (*func)(Tao *, Vec *, Vec *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
352a7e14dcfSSatish Balay {
3538732526dSAlp Dener   CHKFORTRANNULLFUNCTION(func);
354*8434afd1SBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*tao, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.conineq, (PetscVoidFn *)func, ctx);
3558732526dSAlp Dener   if (!*ierr) *ierr = TaoSetInequalityConstraintsRoutine(*tao, *C, ourtaoinequalityconstraintsroutine, ctx);
356a7e14dcfSSatish Balay }
357a7e14dcfSSatish Balay 
35819caf8f3SSatish Balay PETSC_EXTERN void taosetequalityconstraintsroutine_(Tao *tao, Vec *C, void (*func)(Tao *, Vec *, Vec *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
359a7e14dcfSSatish Balay {
3608732526dSAlp Dener   CHKFORTRANNULLFUNCTION(func);
361*8434afd1SBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*tao, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.coneq, (PetscVoidFn *)func, ctx);
3628732526dSAlp Dener   if (!*ierr) *ierr = TaoSetEqualityConstraintsRoutine(*tao, *C, ourtaoequalityconstraintsroutine, ctx);
363a7e14dcfSSatish Balay }
364a7e14dcfSSatish Balay 
36519caf8f3SSatish Balay PETSC_EXTERN void taosetupdate_(Tao *tao, void (*func)(Tao *, PetscInt *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
366e1e80dc8SAlp Dener {
367e1e80dc8SAlp Dener   CHKFORTRANNULLFUNCTION(func);
368*8434afd1SBarry Smith   *ierr = PetscObjectSetFortranCallback((PetscObject)*tao, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.update, (PetscVoidFn *)func, ctx);
369e1e80dc8SAlp Dener   if (!*ierr) *ierr = TaoSetUpdate(*tao, ourtaoupdateroutine, ctx);
370e1e80dc8SAlp Dener }
371e1e80dc8SAlp Dener 
37219caf8f3SSatish Balay PETSC_EXTERN void taoviewfromoptions_(Tao *ao, PetscObject obj, char *type, PetscErrorCode *ierr, PETSC_FORTRAN_CHARLEN_T len)
373fe2efc57SMark {
374fe2efc57SMark   char *t;
375fe2efc57SMark 
376fe2efc57SMark   FIXCHAR(type, len, t);
377b14c0cbaSBlaise Bourdin   CHKFORTRANNULLOBJECT(obj);
3785975b3b6SBarry Smith   *ierr = TaoViewFromOptions(*ao, obj, t);
3795975b3b6SBarry Smith   if (*ierr) return;
380fe2efc57SMark   FREECHAR(type, t);
381fe2efc57SMark }
382fe2efc57SMark 
3831fb7b255SJunchao Zhang PETSC_EXTERN void taodestroy_(Tao *x, int *ierr)
3841fb7b255SJunchao Zhang {
3851fb7b255SJunchao Zhang   PETSC_FORTRAN_OBJECT_F_DESTROYED_TO_C_NULL(x);
3865975b3b6SBarry Smith   *ierr = TaoDestroy(x);
3875975b3b6SBarry Smith   if (*ierr) return;
3881fb7b255SJunchao Zhang   PETSC_FORTRAN_OBJECT_C_NULL_TO_F_DESTROYED(x);
3891fb7b255SJunchao Zhang }
3901fb7b255SJunchao Zhang 
391a7e14dcfSSatish Balay EXTERN_C_END
392