xref: /petsc/src/tao/interface/ftn-custom/ztaosolverf.c (revision fe2efc57b7777594bce7568e90822861480cbdc8)
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
32*fe2efc57SMark #define taoviewfromoptions_                 TAOVIEWFROMOPTIONS
33a7e14dcfSSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
34a7e14dcfSSatish Balay 
35a7e14dcfSSatish Balay #define taosetobjectiveroutine_             taosetobjectiveroutine
36a7e14dcfSSatish Balay #define taosetgradientroutine_              taosetgradientroutine
37a7e14dcfSSatish Balay #define taosetobjectiveandgradientroutine_  taosetobjectiveandgradientroutine
38a7e14dcfSSatish Balay #define taosethessianroutine_               taosethessianroutine
39737f463aSAlp Dener #define taosetresidualroutine_              taosetresidualroutine
404ffbe8acSAlp Dener #define taosetjacobianresidualroutine_      taosetjacobianresidualroutine
41a7e14dcfSSatish Balay #define taosetjacobianroutine_              taosetjacobianroutine
42a7e14dcfSSatish Balay #define taosetjacobianstateroutine_         taosetjacobianstateroutine
43a7e14dcfSSatish Balay #define taosetjacobiandesignroutine_        taosetjacobiandesignroutine
44a7e14dcfSSatish Balay #define taosetjacobianinequalityroutine_    taosetjacobianinequalityroutine
45a7e14dcfSSatish Balay #define taosetjacobianequalityroutine_      taosetjacobianequalityroutine
46a7e14dcfSSatish Balay #define taosetinequalityconstraintsroutine_ taosetinequalityconstraintsroutine
47a7e14dcfSSatish Balay #define taosetequalityconstraintsroutine_   taosetequalityconstraintsroutine
48a7e14dcfSSatish Balay #define taosetvariableboundsroutine_        taosetvariableboundsroutine
49a7e14dcfSSatish Balay #define taosetconstraintsroutine_           taosetconstraintsroutine
50a7e14dcfSSatish Balay #define taosetmonitor_                      taosetmonitor
51a7e14dcfSSatish Balay #define taosettype_                         taosettype
52a7e14dcfSSatish Balay #define taoview_                            taoview
53ae93cb3cSJason Sarich #define taogetconvergencehistory_           taogetconvergencehistory
54a7e14dcfSSatish Balay #define taosetconvergencetest_              taosetconvergencetest
55a7e14dcfSSatish Balay #define taogetoptionsprefix_                taogetoptionsprefix
56a7e14dcfSSatish Balay #define taosetoptionsprefix_                taosetoptionsprefix
57a7e14dcfSSatish Balay #define taoappendoptionsprefix_             taoappendoptionsprefix
58a7e14dcfSSatish Balay #define taogettype_                         taogettype
59e1e80dc8SAlp Dener #define taosetupdate_                       taosetupdate
60*fe2efc57SMark #define taoviewfromoptions_                 taoviewfromoptions
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 
185db87b0f2SBarry Smith PETSC_EXTERN void PETSC_STDCALL taosetobjectiveroutine_(Tao *tao, void (PETSC_STDCALL *func)(Tao*, Vec *, PetscReal *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
186a7e14dcfSSatish Balay {
1878732526dSAlp Dener     CHKFORTRANNULLFUNCTION(func);
1888732526dSAlp Dener     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.obj,(PetscVoidFunction)func,ctx);
1898732526dSAlp Dener     if(!*ierr) *ierr = TaoSetObjectiveRoutine(*tao,ourtaoobjectiveroutine,ctx);
190a7e14dcfSSatish Balay }
191a7e14dcfSSatish Balay 
192db87b0f2SBarry Smith PETSC_EXTERN void PETSC_STDCALL taosetgradientroutine_(Tao *tao, void (PETSC_STDCALL *func)(Tao*, Vec *, Vec *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
193a7e14dcfSSatish Balay {
1948732526dSAlp Dener     CHKFORTRANNULLFUNCTION(func);
1958732526dSAlp Dener     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.grad,(PetscVoidFunction)func,ctx);
1968732526dSAlp Dener     if(!*ierr) *ierr = TaoSetGradientRoutine(*tao,ourtaogradientroutine,ctx);
197a7e14dcfSSatish Balay }
198a7e14dcfSSatish Balay 
199db87b0f2SBarry Smith PETSC_EXTERN void PETSC_STDCALL taosetobjectiveandgradientroutine_(Tao *tao, void (PETSC_STDCALL *func)(Tao*, Vec *, PetscReal *, Vec *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
200a7e14dcfSSatish Balay {
2018732526dSAlp Dener     CHKFORTRANNULLFUNCTION(func);
2028732526dSAlp Dener     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.objgrad,(PetscVoidFunction)func,ctx);
2038732526dSAlp Dener     if(!*ierr) *ierr = TaoSetObjectiveAndGradientRoutine(*tao,ourtaoobjectiveandgradientroutine,ctx);
204a7e14dcfSSatish Balay }
205a7e14dcfSSatish Balay 
206737f463aSAlp Dener PETSC_EXTERN void PETSC_STDCALL taosetresidualroutine_(Tao *tao, Vec *F, void (PETSC_STDCALL *func)(Tao*, Vec *, Vec *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
207a7e14dcfSSatish Balay {
2088732526dSAlp Dener     CHKFORTRANNULLFUNCTION(func);
209737f463aSAlp Dener     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.lsres,(PetscVoidFunction)func,ctx);
210737f463aSAlp Dener     if(!*ierr) *ierr = TaoSetResidualRoutine(*tao,*F,ourtaoresidualroutine,ctx);
211737f463aSAlp Dener }
212737f463aSAlp Dener 
2134ffbe8acSAlp 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)
214737f463aSAlp Dener {
215737f463aSAlp Dener     CHKFORTRANNULLFUNCTION(func);
216737f463aSAlp Dener     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.lsjac,(PetscVoidFunction)func,ctx);
2174ffbe8acSAlp Dener     if(!*ierr) *ierr = TaoSetJacobianResidualRoutine(*tao,*J,*Jpre,ourtaojacobianresidualroutine,ctx);
218a7e14dcfSSatish Balay }
219a7e14dcfSSatish Balay 
220db87b0f2SBarry 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)
221a7e14dcfSSatish Balay {
2228732526dSAlp Dener     CHKFORTRANNULLFUNCTION(func);
2238732526dSAlp Dener     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.jac,(PetscVoidFunction)func,ctx);
2248732526dSAlp Dener     if(!*ierr) *ierr = TaoSetJacobianRoutine(*tao,*J,*Jp,ourtaojacobianroutine,ctx);
225a7e14dcfSSatish Balay }
226a7e14dcfSSatish Balay 
227db87b0f2SBarry 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)
228a7e14dcfSSatish Balay {
2298732526dSAlp Dener     CHKFORTRANNULLFUNCTION(func);
2308732526dSAlp Dener     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.jacstate,(PetscVoidFunction)func,ctx);
2318732526dSAlp Dener     if(!*ierr) *ierr = TaoSetJacobianStateRoutine(*tao,*J,*Jp,*Jinv,ourtaojacobianstateroutine,ctx);
232a7e14dcfSSatish Balay }
233a7e14dcfSSatish Balay 
234db87b0f2SBarry Smith PETSC_EXTERN void PETSC_STDCALL taosetjacobiandesignroutine_(Tao *tao, Mat *J, void (PETSC_STDCALL *func)(Tao*, Vec *, Mat *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
235a7e14dcfSSatish Balay {
2368732526dSAlp Dener     CHKFORTRANNULLFUNCTION(func);
2378732526dSAlp Dener     *ierr = PetscObjectSetFortranCallback((PetscObject)tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.jacdesign,(PetscVoidFunction)func,ctx);
2388732526dSAlp Dener     if(!*ierr) *ierr = TaoSetJacobianDesignRoutine(*tao,*J,ourtaojacobiandesignroutine,ctx);
239a7e14dcfSSatish Balay }
240a7e14dcfSSatish Balay 
241db87b0f2SBarry 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)
242a7e14dcfSSatish Balay {
2438732526dSAlp Dener     CHKFORTRANNULLFUNCTION(func);
2448732526dSAlp Dener     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.hess,(PetscVoidFunction)func,ctx);
2458732526dSAlp Dener     if(!*ierr) *ierr = TaoSetHessianRoutine(*tao,*J, *Jp, ourtaohessianroutine,ctx);
246a7e14dcfSSatish Balay }
247a7e14dcfSSatish Balay 
248db87b0f2SBarry Smith PETSC_EXTERN void PETSC_STDCALL taosetvariableboundsroutine_(Tao *tao, void (PETSC_STDCALL *func)(Tao*,Vec*,Vec*,void*,PetscErrorCode*),void *ctx, PetscErrorCode *ierr)
249a7e14dcfSSatish Balay {
2508732526dSAlp Dener     CHKFORTRANNULLFUNCTION(func);
2518732526dSAlp Dener     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.bounds,(PetscVoidFunction)func,ctx);
2528732526dSAlp Dener     if(!*ierr) *ierr = TaoSetVariableBoundsRoutine(*tao,ourtaoboundsroutine,ctx);
253a7e14dcfSSatish Balay }
254a7e14dcfSSatish Balay 
255db87b0f2SBarry 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)
256a7e14dcfSSatish Balay {
257aecf964fSBarry Smith     CHKFORTRANNULLFUNCTION(mondestroy);
2588732526dSAlp Dener     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.mon,(PetscVoidFunction)func,ctx); if (*ierr) return;
2598732526dSAlp Dener     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.mondestroy,(PetscVoidFunction)mondestroy,ctx); if (*ierr) return;
2608732526dSAlp Dener     *ierr = TaoSetMonitor(*tao,ourtaomonitor,*tao,ourtaomondestroy);
261a7e14dcfSSatish Balay }
262a7e14dcfSSatish Balay 
263db87b0f2SBarry Smith PETSC_EXTERN void PETSC_STDCALL taosetconvergencetest_(Tao *tao, void (PETSC_STDCALL *func)(Tao*,void*,PetscErrorCode*),void *ctx, PetscErrorCode *ierr)
264a7e14dcfSSatish Balay {
2658732526dSAlp Dener     CHKFORTRANNULLFUNCTION(func);
2668732526dSAlp Dener     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.convtest,(PetscVoidFunction)func,ctx);
2678732526dSAlp Dener     if(!*ierr) *ierr = TaoSetConvergenceTest(*tao,ourtaoconvergencetest,ctx);
268a7e14dcfSSatish Balay }
269a7e14dcfSSatish Balay 
270db87b0f2SBarry Smith PETSC_EXTERN void PETSC_STDCALL taosetconstraintsroutine_(Tao *tao, Vec *C, void (PETSC_STDCALL *func)(Tao*, Vec *, Vec *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
271a7e14dcfSSatish Balay {
2728732526dSAlp Dener     CHKFORTRANNULLFUNCTION(func);
2738732526dSAlp Dener     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.constraints,(PetscVoidFunction)func,ctx);
2748732526dSAlp Dener     if(!*ierr) *ierr = TaoSetConstraintsRoutine(*tao,*C,ourtaoconstraintsroutine,ctx);
275a7e14dcfSSatish Balay }
276a7e14dcfSSatish Balay 
277390e1bf2SBarry Smith PETSC_EXTERN void PETSC_STDCALL taosettype_(Tao *tao, char* type_name PETSC_MIXED_LEN(len), PetscErrorCode *ierr PETSC_END_LEN(len))
278a7e14dcfSSatish Balay {
279a7e14dcfSSatish Balay     char *t;
280a7e14dcfSSatish Balay 
281a7e14dcfSSatish Balay     FIXCHAR(type_name,len,t);
282d49bb8f9SBarry Smith     *ierr = TaoSetType(*tao,t);if (*ierr) return;
283a7e14dcfSSatish Balay     FREECHAR(type_name,t);
284a7e14dcfSSatish Balay 
285a7e14dcfSSatish Balay }
286a7e14dcfSSatish Balay 
287db87b0f2SBarry Smith PETSC_EXTERN void PETSC_STDCALL taoview_(Tao *tao, PetscViewer *viewer, PetscErrorCode *ierr)
288a7e14dcfSSatish Balay {
289a7e14dcfSSatish Balay     PetscViewer v;
290a7e14dcfSSatish Balay     PetscPatchDefaultViewers_Fortran(viewer,v);
291a7e14dcfSSatish Balay     *ierr = TaoView(*tao,v);
292a7e14dcfSSatish Balay }
293a7e14dcfSSatish Balay 
294db87b0f2SBarry Smith PETSC_EXTERN void PETSC_STDCALL taogetconvergencehistory_(Tao *tao, PetscInt *nhist, PetscErrorCode *ierr)
295a7e14dcfSSatish Balay {
296ae93cb3cSJason Sarich   *ierr = TaoGetConvergenceHistory(*tao,NULL,NULL,NULL,NULL,nhist);
297a7e14dcfSSatish Balay }
298a7e14dcfSSatish Balay 
299390e1bf2SBarry Smith PETSC_EXTERN void PETSC_STDCALL taogetoptionsprefix_(Tao *tao, char* prefix PETSC_MIXED_LEN(len), PetscErrorCode *ierr PETSC_END_LEN(len))
300a7e14dcfSSatish Balay {
301a7e14dcfSSatish Balay   const char *name;
302a7e14dcfSSatish Balay   *ierr = TaoGetOptionsPrefix(*tao,&name);
303a7e14dcfSSatish Balay   *ierr = PetscStrncpy(prefix,name,len); if (*ierr) return;
304a7e14dcfSSatish Balay   FIXRETURNCHAR(PETSC_TRUE,prefix,len);
305a7e14dcfSSatish Balay 
306a7e14dcfSSatish Balay }
307a7e14dcfSSatish Balay 
308390e1bf2SBarry Smith PETSC_EXTERN void PETSC_STDCALL taoappendoptionsprefix_(Tao *tao, char* prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
309a7e14dcfSSatish Balay {
310a7e14dcfSSatish Balay   char *name;
311a7e14dcfSSatish Balay   FIXCHAR(prefix,len,name);
312d49bb8f9SBarry Smith   *ierr = TaoAppendOptionsPrefix(*tao,name);if (*ierr) return;
313a7e14dcfSSatish Balay   FREECHAR(prefix,name);
314a7e14dcfSSatish Balay }
315a7e14dcfSSatish Balay 
316390e1bf2SBarry Smith PETSC_EXTERN void PETSC_STDCALL taosetoptionsprefix_(Tao *tao, char* prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
317a7e14dcfSSatish Balay {
318a7e14dcfSSatish Balay   char *t;
319a7e14dcfSSatish Balay   FIXCHAR(prefix,len,t);
320d49bb8f9SBarry Smith   *ierr = TaoSetOptionsPrefix(*tao,t);if (*ierr) return;
321a7e14dcfSSatish Balay   FREECHAR(prefix,t);
322a7e14dcfSSatish Balay }
323a7e14dcfSSatish Balay 
324390e1bf2SBarry Smith PETSC_EXTERN void PETSC_STDCALL taogettype_(Tao *tao, char* name PETSC_MIXED_LEN(len), PetscErrorCode *ierr  PETSC_END_LEN(len))
325a7e14dcfSSatish Balay {
326a7e14dcfSSatish Balay   const char *tname;
327a7e14dcfSSatish Balay   *ierr = TaoGetType(*tao,&tname);
328a7e14dcfSSatish Balay   *ierr = PetscStrncpy(name,tname,len); if (*ierr) return;
329a7e14dcfSSatish Balay   FIXRETURNCHAR(PETSC_TRUE,name,len);
330a7e14dcfSSatish Balay 
331a7e14dcfSSatish Balay }
332a7e14dcfSSatish Balay 
333db87b0f2SBarry 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)
334a7e14dcfSSatish Balay {
3358732526dSAlp Dener     CHKFORTRANNULLFUNCTION(func);
3368732526dSAlp Dener     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.jacineq,(PetscVoidFunction)func,ctx);
3378732526dSAlp Dener     if(!*ierr) *ierr = TaoSetJacobianInequalityRoutine(*tao,*J,*Jp,ourtaojacobianinequalityroutine,ctx);
338a7e14dcfSSatish Balay }
339a7e14dcfSSatish Balay 
340db87b0f2SBarry 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)
341a7e14dcfSSatish Balay {
3428732526dSAlp Dener     CHKFORTRANNULLFUNCTION(func);
3438732526dSAlp Dener     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.jaceq,(PetscVoidFunction)func,ctx);
3448732526dSAlp Dener     if(!*ierr) *ierr = TaoSetJacobianEqualityRoutine(*tao,*J,*Jp,ourtaojacobianequalityroutine,ctx);
345a7e14dcfSSatish Balay }
346a7e14dcfSSatish Balay 
347db87b0f2SBarry Smith PETSC_EXTERN void PETSC_STDCALL taosetinequalityconstraintsroutine_(Tao *tao, Vec *C, void (PETSC_STDCALL *func)(Tao*, Vec *, Vec *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
348a7e14dcfSSatish Balay {
3498732526dSAlp Dener     CHKFORTRANNULLFUNCTION(func);
3508732526dSAlp Dener     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.conineq,(PetscVoidFunction)func,ctx);
3518732526dSAlp Dener     if(!*ierr) *ierr = TaoSetInequalityConstraintsRoutine(*tao,*C,ourtaoinequalityconstraintsroutine,ctx);
352a7e14dcfSSatish Balay }
353a7e14dcfSSatish Balay 
354db87b0f2SBarry Smith PETSC_EXTERN void PETSC_STDCALL taosetequalityconstraintsroutine_(Tao *tao, Vec *C, void (PETSC_STDCALL *func)(Tao*, Vec *, Vec *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
355a7e14dcfSSatish Balay {
3568732526dSAlp Dener     CHKFORTRANNULLFUNCTION(func);
3578732526dSAlp Dener     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.coneq,(PetscVoidFunction)func,ctx);
3588732526dSAlp Dener     if(!*ierr) *ierr = TaoSetEqualityConstraintsRoutine(*tao, *C, ourtaoequalityconstraintsroutine,ctx);
359a7e14dcfSSatish Balay }
360a7e14dcfSSatish Balay 
361e1e80dc8SAlp Dener PETSC_EXTERN void PETSC_STDCALL taosetupdate_(Tao *tao, void (PETSC_STDCALL *func)(Tao *, PetscInt *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
362e1e80dc8SAlp Dener {
363e1e80dc8SAlp Dener     CHKFORTRANNULLFUNCTION(func);
364e1e80dc8SAlp Dener     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.update,(PetscVoidFunction)func,ctx);
365e1e80dc8SAlp Dener     if(!*ierr) *ierr = TaoSetUpdate(*tao, ourtaoupdateroutine, ctx);
366e1e80dc8SAlp Dener }
367e1e80dc8SAlp Dener 
368*fe2efc57SMark PETSC_EXTERN void PETSC_STDCALL taoviewfromoptions_(Tao *ao,PetscObject obj,char* type PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
369*fe2efc57SMark {
370*fe2efc57SMark   char *t;
371*fe2efc57SMark 
372*fe2efc57SMark   FIXCHAR(type,len,t);
373*fe2efc57SMark   *ierr = TaoViewFromOptions(*ao,obj,t);if (*ierr) return;
374*fe2efc57SMark   FREECHAR(type,t);
375*fe2efc57SMark }
376*fe2efc57SMark 
377a7e14dcfSSatish Balay EXTERN_C_END
378a7e14dcfSSatish Balay 
379a7e14dcfSSatish Balay 
380