xref: /petsc/src/tao/interface/ftn-custom/ztaosolverf.c (revision 737f463ab30e8a11bf8f036b04a75b5d358c645b)
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
11*737f463aSAlp Dener #define taosetresidualroutine_              TAOSETRESIDUALROUTINE
12*737f463aSAlp Dener #define taosetresidualjacobianroutine_      TAOSETRESIDUALJACOBIANROUTINE
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
31a7e14dcfSSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
32a7e14dcfSSatish Balay 
33a7e14dcfSSatish Balay #define taosetobjectiveroutine_             taosetobjectiveroutine
34a7e14dcfSSatish Balay #define taosetgradientroutine_              taosetgradientroutine
35a7e14dcfSSatish Balay #define taosetobjectiveandgradientroutine_  taosetobjectiveandgradientroutine
36a7e14dcfSSatish Balay #define taosethessianroutine_               taosethessianroutine
37*737f463aSAlp Dener #define taosetresidualroutine_              taosetresidualroutine
38*737f463aSAlp Dener #define taosetresidualjacobianroutine_      taosetresidualjacobianroutine
39a7e14dcfSSatish Balay #define taosetjacobianroutine_              taosetjacobianroutine
40a7e14dcfSSatish Balay #define taosetjacobianstateroutine_         taosetjacobianstateroutine
41a7e14dcfSSatish Balay #define taosetjacobiandesignroutine_        taosetjacobiandesignroutine
42a7e14dcfSSatish Balay #define taosetjacobianinequalityroutine_    taosetjacobianinequalityroutine
43a7e14dcfSSatish Balay #define taosetjacobianequalityroutine_      taosetjacobianequalityroutine
44a7e14dcfSSatish Balay #define taosetinequalityconstraintsroutine_ taosetinequalityconstraintsroutine
45a7e14dcfSSatish Balay #define taosetequalityconstraintsroutine_   taosetequalityconstraintsroutine
46a7e14dcfSSatish Balay #define taosetvariableboundsroutine_        taosetvariableboundsroutine
47a7e14dcfSSatish Balay #define taosetconstraintsroutine_           taosetconstraintsroutine
48a7e14dcfSSatish Balay #define taosetmonitor_                      taosetmonitor
49a7e14dcfSSatish Balay #define taosettype_                         taosettype
50a7e14dcfSSatish Balay #define taoview_                            taoview
51ae93cb3cSJason Sarich #define taogetconvergencehistory_           taogetconvergencehistory
52a7e14dcfSSatish Balay #define taosetconvergencetest_              taosetconvergencetest
53a7e14dcfSSatish Balay #define taogetoptionsprefix_                taogetoptionsprefix
54a7e14dcfSSatish Balay #define taosetoptionsprefix_                taosetoptionsprefix
55a7e14dcfSSatish Balay #define taoappendoptionsprefix_             taoappendoptionsprefix
56a7e14dcfSSatish Balay #define taogettype_                         taogettype
57a7e14dcfSSatish Balay #endif
58a7e14dcfSSatish Balay 
598732526dSAlp Dener static struct {
608732526dSAlp Dener   PetscFortranCallbackId obj;
618732526dSAlp Dener   PetscFortranCallbackId grad;
628732526dSAlp Dener   PetscFortranCallbackId objgrad;
638732526dSAlp Dener   PetscFortranCallbackId hess;
64*737f463aSAlp Dener   PetscFortranCallbackId lsres;
65*737f463aSAlp Dener   PetscFortranCallbackId lsjac;
668732526dSAlp Dener   PetscFortranCallbackId jac;
678732526dSAlp Dener   PetscFortranCallbackId jacstate;
688732526dSAlp Dener   PetscFortranCallbackId jacdesign;
698732526dSAlp Dener   PetscFortranCallbackId bounds;
708732526dSAlp Dener   PetscFortranCallbackId mon;
718732526dSAlp Dener   PetscFortranCallbackId mondestroy;
728732526dSAlp Dener   PetscFortranCallbackId convtest;
738732526dSAlp Dener   PetscFortranCallbackId constraints;
748732526dSAlp Dener   PetscFortranCallbackId jacineq;
758732526dSAlp Dener   PetscFortranCallbackId jaceq;
768732526dSAlp Dener   PetscFortranCallbackId conineq;
778732526dSAlp Dener   PetscFortranCallbackId coneq;
788732526dSAlp Dener   PetscFortranCallbackId nfuncs;
798732526dSAlp Dener #if defined(PETSC_HAVE_F90_2PTR_ARG)
808732526dSAlp Dener   PetscFortranCallbackId function_pgiptr;
818732526dSAlp Dener #endif
828732526dSAlp Dener } _cb;
83a7e14dcfSSatish Balay 
84441846f8SBarry Smith static PetscErrorCode ourtaoobjectiveroutine(Tao tao, Vec x, PetscReal *f, void *ctx)
85a7e14dcfSSatish Balay {
868732526dSAlp Dener     PetscObjectUseFortranCallback(tao,_cb.obj,(Tao*,Vec*,PetscReal*,void*,PetscErrorCode*),(&tao,&x,f,_ctx,&ierr));
87a7e14dcfSSatish Balay }
88a7e14dcfSSatish Balay 
89441846f8SBarry Smith static PetscErrorCode ourtaogradientroutine(Tao tao, Vec x, Vec g, void *ctx)
90a7e14dcfSSatish Balay {
918732526dSAlp Dener     PetscObjectUseFortranCallback(tao,_cb.grad,(Tao*,Vec*,Vec*,void*,PetscErrorCode*),(&tao,&x,&g,_ctx,&ierr));
92a7e14dcfSSatish Balay }
93a7e14dcfSSatish Balay 
94441846f8SBarry Smith static PetscErrorCode ourtaoobjectiveandgradientroutine(Tao tao, Vec x, PetscReal *f, Vec g, void* ctx)
95a7e14dcfSSatish Balay {
968732526dSAlp Dener     PetscObjectUseFortranCallback(tao,_cb.objgrad,(Tao*,Vec*,PetscReal*,Vec*,void*,PetscErrorCode*),(&tao,&x,f,&g,_ctx,&ierr));
97a7e14dcfSSatish Balay }
98a7e14dcfSSatish Balay 
99ffad9901SBarry Smith static PetscErrorCode ourtaohessianroutine(Tao tao, Vec x, Mat H, Mat Hpre, void *ctx)
100a7e14dcfSSatish Balay {
1018732526dSAlp Dener     PetscObjectUseFortranCallback(tao,_cb.hess,(Tao*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),(&tao,&x,&H,&Hpre,_ctx,&ierr));
102a7e14dcfSSatish Balay }
103a7e14dcfSSatish Balay 
104ffad9901SBarry Smith static PetscErrorCode ourtaojacobianroutine(Tao tao, Vec x, Mat H, Mat Hpre, void *ctx)
105a7e14dcfSSatish Balay {
1068732526dSAlp Dener     PetscObjectUseFortranCallback(tao,_cb.jac,(Tao*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),(&tao,&x,&H,&Hpre,_ctx,&ierr));
107a7e14dcfSSatish Balay }
108a7e14dcfSSatish Balay 
109ffad9901SBarry Smith static PetscErrorCode ourtaojacobianstateroutine(Tao tao, Vec x, Mat H, Mat Hpre, Mat Hinv, void *ctx)
110a7e14dcfSSatish Balay {
1118732526dSAlp Dener     PetscObjectUseFortranCallback(tao,_cb.jacstate,(Tao*,Vec*,Mat*,Mat*,Mat*,void*,PetscErrorCode*),(&tao,&x,&H,&Hpre,&Hinv,_ctx,&ierr));
112a7e14dcfSSatish Balay }
113a7e14dcfSSatish Balay 
11494ab13aaSBarry Smith static PetscErrorCode ourtaojacobiandesignroutine(Tao tao, Vec x, Mat H, void *ctx)
115a7e14dcfSSatish Balay {
1168732526dSAlp Dener     PetscObjectUseFortranCallback(tao,_cb.jacdesign,(Tao*,Vec*,Mat*,void*,PetscErrorCode*),(&tao,&x,&H,_ctx,&ierr));
117a7e14dcfSSatish Balay }
118a7e14dcfSSatish Balay 
119441846f8SBarry Smith static PetscErrorCode ourtaoboundsroutine(Tao tao, Vec xl, Vec xu, void *ctx)
120a7e14dcfSSatish Balay {
1218732526dSAlp Dener     PetscObjectUseFortranCallback(tao,_cb.bounds,(Tao*,Vec*,Vec*,void*,PetscErrorCode*),(&tao,&xl,&xu,_ctx,&ierr));
122a7e14dcfSSatish Balay }
123*737f463aSAlp Dener static PetscErrorCode ourtaoresidualroutine(Tao tao, Vec x, Vec f, void *ctx)
124a7e14dcfSSatish Balay {
125*737f463aSAlp Dener     PetscObjectUseFortranCallback(tao,_cb.lsres,(Tao*,Vec*,Vec*,void*,PetscErrorCode*),(&tao,&x,&f,_ctx,&ierr));
126*737f463aSAlp Dener }
127*737f463aSAlp Dener 
128*737f463aSAlp Dener static PetscErrorCode ourtaoresidualjacobianroutine(Tao tao, Vec x, Mat J, Mat Jpre, void *ctx)
129*737f463aSAlp Dener {
130*737f463aSAlp Dener     PetscObjectUseFortranCallback(tao,_cb.lsjac,(Tao*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),(&tao,&x,&J,&Jpre,_ctx,&ierr));
131a7e14dcfSSatish Balay }
132a7e14dcfSSatish Balay 
133441846f8SBarry Smith static PetscErrorCode ourtaomonitor(Tao tao, void *ctx)
134a7e14dcfSSatish Balay {
1358732526dSAlp Dener     PetscObjectUseFortranCallback(tao,_cb.mon,(Tao *,void*,PetscErrorCode*),(&tao,_ctx,&ierr));
136a7e14dcfSSatish Balay }
137a7e14dcfSSatish Balay 
138a7e14dcfSSatish Balay static PetscErrorCode ourtaomondestroy(void **ctx)
139a7e14dcfSSatish Balay {
1408732526dSAlp Dener     Tao tao = (Tao)*ctx;
1418732526dSAlp Dener     PetscObjectUseFortranCallback(tao,_cb.mondestroy,(void*,PetscErrorCode*),(_ctx,&ierr));
142a7e14dcfSSatish Balay }
143441846f8SBarry Smith static PetscErrorCode ourtaoconvergencetest(Tao tao, void *ctx)
144a7e14dcfSSatish Balay {
1458732526dSAlp Dener     PetscObjectUseFortranCallback(tao,_cb.convtest,(Tao *,void*,PetscErrorCode*),(&tao,_ctx,&ierr));
146a7e14dcfSSatish Balay }
147a7e14dcfSSatish Balay 
148441846f8SBarry Smith static PetscErrorCode ourtaoconstraintsroutine(Tao tao, Vec x, Vec c, void *ctx)
149a7e14dcfSSatish Balay {
1508732526dSAlp Dener     PetscObjectUseFortranCallback(tao,_cb.constraints,(Tao*,Vec*,Vec*,void*,PetscErrorCode*),(&tao,&x,&c,_ctx,&ierr));
151a7e14dcfSSatish Balay }
152a7e14dcfSSatish Balay 
153ffad9901SBarry Smith static PetscErrorCode ourtaojacobianinequalityroutine(Tao tao, Vec x, Mat J, Mat Jpre, void *ctx)
154a7e14dcfSSatish Balay {
1558732526dSAlp Dener     PetscObjectUseFortranCallback(tao,_cb.jacineq,(Tao*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),(&tao,&x,&J,&Jpre,_ctx,&ierr));
156a7e14dcfSSatish Balay }
157a7e14dcfSSatish Balay 
158ffad9901SBarry Smith static PetscErrorCode ourtaojacobianequalityroutine(Tao tao, Vec x, Mat J, Mat Jpre, void *ctx)
159a7e14dcfSSatish Balay {
1608732526dSAlp Dener     PetscObjectUseFortranCallback(tao,_cb.jaceq,(Tao*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),(&tao,&x,&J,&Jpre,_ctx,&ierr));
161a7e14dcfSSatish Balay }
162a7e14dcfSSatish Balay 
163441846f8SBarry Smith static PetscErrorCode ourtaoinequalityconstraintsroutine(Tao tao, Vec x, Vec c, void *ctx)
164a7e14dcfSSatish Balay {
1658732526dSAlp Dener     PetscObjectUseFortranCallback(tao,_cb.conineq,(Tao*,Vec*,Vec*,void*,PetscErrorCode*),(&tao,&x,&c,_ctx,&ierr));
166a7e14dcfSSatish Balay }
167a7e14dcfSSatish Balay 
168441846f8SBarry Smith static PetscErrorCode ourtaoequalityconstraintsroutine(Tao tao, Vec x, Vec c, void *ctx)
169a7e14dcfSSatish Balay {
1708732526dSAlp Dener     PetscObjectUseFortranCallback(tao,_cb.coneq,(Tao*,Vec*,Vec*,void*,PetscErrorCode*),(&tao,&x,&c,_ctx,&ierr));
171a7e14dcfSSatish Balay }
172a7e14dcfSSatish Balay 
173a7e14dcfSSatish Balay EXTERN_C_BEGIN
174a7e14dcfSSatish Balay 
175db87b0f2SBarry Smith PETSC_EXTERN void PETSC_STDCALL taosetobjectiveroutine_(Tao *tao, void (PETSC_STDCALL *func)(Tao*, Vec *, PetscReal *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
176a7e14dcfSSatish Balay {
1778732526dSAlp Dener     CHKFORTRANNULLFUNCTION(func);
1788732526dSAlp Dener     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.obj,(PetscVoidFunction)func,ctx);
1798732526dSAlp Dener     if(!*ierr) *ierr = TaoSetObjectiveRoutine(*tao,ourtaoobjectiveroutine,ctx);
180a7e14dcfSSatish Balay }
181a7e14dcfSSatish Balay 
182db87b0f2SBarry Smith PETSC_EXTERN void PETSC_STDCALL taosetgradientroutine_(Tao *tao, void (PETSC_STDCALL *func)(Tao*, Vec *, Vec *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
183a7e14dcfSSatish Balay {
1848732526dSAlp Dener     CHKFORTRANNULLFUNCTION(func);
1858732526dSAlp Dener     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.grad,(PetscVoidFunction)func,ctx);
1868732526dSAlp Dener     if(!*ierr) *ierr = TaoSetGradientRoutine(*tao,ourtaogradientroutine,ctx);
187a7e14dcfSSatish Balay }
188a7e14dcfSSatish Balay 
189db87b0f2SBarry Smith PETSC_EXTERN void PETSC_STDCALL taosetobjectiveandgradientroutine_(Tao *tao, void (PETSC_STDCALL *func)(Tao*, Vec *, PetscReal *, Vec *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
190a7e14dcfSSatish Balay {
1918732526dSAlp Dener     CHKFORTRANNULLFUNCTION(func);
1928732526dSAlp Dener     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.objgrad,(PetscVoidFunction)func,ctx);
1938732526dSAlp Dener     if(!*ierr) *ierr = TaoSetObjectiveAndGradientRoutine(*tao,ourtaoobjectiveandgradientroutine,ctx);
194a7e14dcfSSatish Balay }
195a7e14dcfSSatish Balay 
196*737f463aSAlp Dener PETSC_EXTERN void PETSC_STDCALL taosetresidualroutine_(Tao *tao, Vec *F, void (PETSC_STDCALL *func)(Tao*, Vec *, Vec *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
197a7e14dcfSSatish Balay {
1988732526dSAlp Dener     CHKFORTRANNULLFUNCTION(func);
199*737f463aSAlp Dener     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.lsres,(PetscVoidFunction)func,ctx);
200*737f463aSAlp Dener     if(!*ierr) *ierr = TaoSetResidualRoutine(*tao,*F,ourtaoresidualroutine,ctx);
201*737f463aSAlp Dener }
202*737f463aSAlp Dener 
203*737f463aSAlp Dener PETSC_EXTERN void PETSC_STDCALL taosetresidualjacobianroutine_(Tao *tao, Mat *J, Mat *Jpre, void (PETSC_STDCALL *func)(Tao*, Vec *, Mat *, Mat *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
204*737f463aSAlp Dener {
205*737f463aSAlp Dener     CHKFORTRANNULLFUNCTION(func);
206*737f463aSAlp Dener     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.lsjac,(PetscVoidFunction)func,ctx);
207*737f463aSAlp Dener     if(!*ierr) *ierr = TaoSetResidualJacobianRoutine(*tao,*J,*Jpre,ourtaoresidualjacobianroutine,ctx);
208a7e14dcfSSatish Balay }
209a7e14dcfSSatish Balay 
210db87b0f2SBarry 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)
211a7e14dcfSSatish Balay {
2128732526dSAlp Dener     CHKFORTRANNULLFUNCTION(func);
2138732526dSAlp Dener     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.jac,(PetscVoidFunction)func,ctx);
2148732526dSAlp Dener     if(!*ierr) *ierr = TaoSetJacobianRoutine(*tao,*J,*Jp,ourtaojacobianroutine,ctx);
215a7e14dcfSSatish Balay }
216a7e14dcfSSatish Balay 
217db87b0f2SBarry 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)
218a7e14dcfSSatish Balay {
2198732526dSAlp Dener     CHKFORTRANNULLFUNCTION(func);
2208732526dSAlp Dener     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.jacstate,(PetscVoidFunction)func,ctx);
2218732526dSAlp Dener     if(!*ierr) *ierr = TaoSetJacobianStateRoutine(*tao,*J,*Jp,*Jinv,ourtaojacobianstateroutine,ctx);
222a7e14dcfSSatish Balay }
223a7e14dcfSSatish Balay 
224db87b0f2SBarry Smith PETSC_EXTERN void PETSC_STDCALL taosetjacobiandesignroutine_(Tao *tao, Mat *J, void (PETSC_STDCALL *func)(Tao*, Vec *, Mat *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
225a7e14dcfSSatish Balay {
2268732526dSAlp Dener     CHKFORTRANNULLFUNCTION(func);
2278732526dSAlp Dener     *ierr = PetscObjectSetFortranCallback((PetscObject)tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.jacdesign,(PetscVoidFunction)func,ctx);
2288732526dSAlp Dener     if(!*ierr) *ierr = TaoSetJacobianDesignRoutine(*tao,*J,ourtaojacobiandesignroutine,ctx);
229a7e14dcfSSatish Balay }
230a7e14dcfSSatish Balay 
231db87b0f2SBarry 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)
232a7e14dcfSSatish Balay {
2338732526dSAlp Dener     CHKFORTRANNULLFUNCTION(func);
2348732526dSAlp Dener     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.hess,(PetscVoidFunction)func,ctx);
2358732526dSAlp Dener     if(!*ierr) *ierr = TaoSetHessianRoutine(*tao,*J, *Jp, ourtaohessianroutine,ctx);
236a7e14dcfSSatish Balay }
237a7e14dcfSSatish Balay 
238db87b0f2SBarry Smith PETSC_EXTERN void PETSC_STDCALL taosetvariableboundsroutine_(Tao *tao, void (PETSC_STDCALL *func)(Tao*,Vec*,Vec*,void*,PetscErrorCode*),void *ctx, PetscErrorCode *ierr)
239a7e14dcfSSatish Balay {
2408732526dSAlp Dener     CHKFORTRANNULLFUNCTION(func);
2418732526dSAlp Dener     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.bounds,(PetscVoidFunction)func,ctx);
2428732526dSAlp Dener     if(!*ierr) *ierr = TaoSetVariableBoundsRoutine(*tao,ourtaoboundsroutine,ctx);
243a7e14dcfSSatish Balay }
244a7e14dcfSSatish Balay 
245db87b0f2SBarry 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)
246a7e14dcfSSatish Balay {
247aecf964fSBarry Smith     CHKFORTRANNULLFUNCTION(mondestroy);
2488732526dSAlp Dener     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.mon,(PetscVoidFunction)func,ctx); if (*ierr) return;
2498732526dSAlp Dener     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.mondestroy,(PetscVoidFunction)mondestroy,ctx); if (*ierr) return;
2508732526dSAlp Dener     *ierr = TaoSetMonitor(*tao,ourtaomonitor,*tao,ourtaomondestroy);
251a7e14dcfSSatish Balay }
252a7e14dcfSSatish Balay 
253db87b0f2SBarry Smith PETSC_EXTERN void PETSC_STDCALL taosetconvergencetest_(Tao *tao, void (PETSC_STDCALL *func)(Tao*,void*,PetscErrorCode*),void *ctx, PetscErrorCode *ierr)
254a7e14dcfSSatish Balay {
2558732526dSAlp Dener     CHKFORTRANNULLFUNCTION(func);
2568732526dSAlp Dener     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.convtest,(PetscVoidFunction)func,ctx);
2578732526dSAlp Dener     if(!*ierr) *ierr = TaoSetConvergenceTest(*tao,ourtaoconvergencetest,ctx);
258a7e14dcfSSatish Balay }
259a7e14dcfSSatish Balay 
260db87b0f2SBarry Smith PETSC_EXTERN void PETSC_STDCALL taosetconstraintsroutine_(Tao *tao, Vec *C, void (PETSC_STDCALL *func)(Tao*, Vec *, Vec *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
261a7e14dcfSSatish Balay {
2628732526dSAlp Dener     CHKFORTRANNULLFUNCTION(func);
2638732526dSAlp Dener     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.constraints,(PetscVoidFunction)func,ctx);
2648732526dSAlp Dener     if(!*ierr) *ierr = TaoSetConstraintsRoutine(*tao,*C,ourtaoconstraintsroutine,ctx);
265a7e14dcfSSatish Balay }
266a7e14dcfSSatish Balay 
267390e1bf2SBarry Smith PETSC_EXTERN void PETSC_STDCALL taosettype_(Tao *tao, char* type_name PETSC_MIXED_LEN(len), PetscErrorCode *ierr PETSC_END_LEN(len))
268a7e14dcfSSatish Balay {
269a7e14dcfSSatish Balay     char *t;
270a7e14dcfSSatish Balay 
271a7e14dcfSSatish Balay     FIXCHAR(type_name,len,t);
272a7e14dcfSSatish Balay     *ierr = TaoSetType(*tao,t);
273a7e14dcfSSatish Balay     FREECHAR(type_name,t);
274a7e14dcfSSatish Balay 
275a7e14dcfSSatish Balay }
276a7e14dcfSSatish Balay 
277db87b0f2SBarry Smith PETSC_EXTERN void PETSC_STDCALL taoview_(Tao *tao, PetscViewer *viewer, PetscErrorCode *ierr)
278a7e14dcfSSatish Balay {
279a7e14dcfSSatish Balay     PetscViewer v;
280a7e14dcfSSatish Balay     PetscPatchDefaultViewers_Fortran(viewer,v);
281a7e14dcfSSatish Balay     *ierr = TaoView(*tao,v);
282a7e14dcfSSatish Balay }
283a7e14dcfSSatish Balay 
284db87b0f2SBarry Smith PETSC_EXTERN void PETSC_STDCALL taogetconvergencehistory_(Tao *tao, PetscInt *nhist, PetscErrorCode *ierr)
285a7e14dcfSSatish Balay {
286ae93cb3cSJason Sarich   *ierr = TaoGetConvergenceHistory(*tao,NULL,NULL,NULL,NULL,nhist);
287a7e14dcfSSatish Balay }
288a7e14dcfSSatish Balay 
289390e1bf2SBarry Smith PETSC_EXTERN void PETSC_STDCALL taogetoptionsprefix_(Tao *tao, char* prefix PETSC_MIXED_LEN(len), PetscErrorCode *ierr PETSC_END_LEN(len))
290a7e14dcfSSatish Balay {
291a7e14dcfSSatish Balay   const char *name;
292a7e14dcfSSatish Balay   *ierr = TaoGetOptionsPrefix(*tao,&name);
293a7e14dcfSSatish Balay   *ierr = PetscStrncpy(prefix,name,len); if (*ierr) return;
294a7e14dcfSSatish Balay   FIXRETURNCHAR(PETSC_TRUE,prefix,len);
295a7e14dcfSSatish Balay 
296a7e14dcfSSatish Balay }
297a7e14dcfSSatish Balay 
298390e1bf2SBarry Smith PETSC_EXTERN void PETSC_STDCALL taoappendoptionsprefix_(Tao *tao, char* prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
299a7e14dcfSSatish Balay {
300a7e14dcfSSatish Balay   char *name;
301a7e14dcfSSatish Balay   FIXCHAR(prefix,len,name);
302a7e14dcfSSatish Balay   *ierr = TaoAppendOptionsPrefix(*tao,name);
303a7e14dcfSSatish Balay   FREECHAR(prefix,name);
304a7e14dcfSSatish Balay }
305a7e14dcfSSatish Balay 
306390e1bf2SBarry Smith PETSC_EXTERN void PETSC_STDCALL taosetoptionsprefix_(Tao *tao, char* prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
307a7e14dcfSSatish Balay {
308a7e14dcfSSatish Balay   char *t;
309a7e14dcfSSatish Balay   FIXCHAR(prefix,len,t);
310a7e14dcfSSatish Balay   *ierr = TaoSetOptionsPrefix(*tao,t);
311a7e14dcfSSatish Balay   FREECHAR(prefix,t);
312a7e14dcfSSatish Balay }
313a7e14dcfSSatish Balay 
314390e1bf2SBarry Smith PETSC_EXTERN void PETSC_STDCALL taogettype_(Tao *tao, char* name PETSC_MIXED_LEN(len), PetscErrorCode *ierr  PETSC_END_LEN(len))
315a7e14dcfSSatish Balay {
316a7e14dcfSSatish Balay   const char *tname;
317a7e14dcfSSatish Balay   *ierr = TaoGetType(*tao,&tname);
318a7e14dcfSSatish Balay   *ierr = PetscStrncpy(name,tname,len); if (*ierr) return;
319a7e14dcfSSatish Balay   FIXRETURNCHAR(PETSC_TRUE,name,len);
320a7e14dcfSSatish Balay 
321a7e14dcfSSatish Balay }
322a7e14dcfSSatish Balay 
323db87b0f2SBarry 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)
324a7e14dcfSSatish Balay {
3258732526dSAlp Dener     CHKFORTRANNULLFUNCTION(func);
3268732526dSAlp Dener     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.jacineq,(PetscVoidFunction)func,ctx);
3278732526dSAlp Dener     if(!*ierr) *ierr = TaoSetJacobianInequalityRoutine(*tao,*J,*Jp,ourtaojacobianinequalityroutine,ctx);
328a7e14dcfSSatish Balay }
329a7e14dcfSSatish Balay 
330db87b0f2SBarry 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)
331a7e14dcfSSatish Balay {
3328732526dSAlp Dener     CHKFORTRANNULLFUNCTION(func);
3338732526dSAlp Dener     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.jaceq,(PetscVoidFunction)func,ctx);
3348732526dSAlp Dener     if(!*ierr) *ierr = TaoSetJacobianEqualityRoutine(*tao,*J,*Jp,ourtaojacobianequalityroutine,ctx);
335a7e14dcfSSatish Balay }
336a7e14dcfSSatish Balay 
337db87b0f2SBarry Smith PETSC_EXTERN void PETSC_STDCALL taosetinequalityconstraintsroutine_(Tao *tao, Vec *C, void (PETSC_STDCALL *func)(Tao*, Vec *, Vec *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
338a7e14dcfSSatish Balay {
3398732526dSAlp Dener     CHKFORTRANNULLFUNCTION(func);
3408732526dSAlp Dener     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.conineq,(PetscVoidFunction)func,ctx);
3418732526dSAlp Dener     if(!*ierr) *ierr = TaoSetInequalityConstraintsRoutine(*tao,*C,ourtaoinequalityconstraintsroutine,ctx);
342a7e14dcfSSatish Balay }
343a7e14dcfSSatish Balay 
344db87b0f2SBarry Smith PETSC_EXTERN void PETSC_STDCALL taosetequalityconstraintsroutine_(Tao *tao, Vec *C, void (PETSC_STDCALL *func)(Tao*, Vec *, Vec *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
345a7e14dcfSSatish Balay {
3468732526dSAlp Dener     CHKFORTRANNULLFUNCTION(func);
3478732526dSAlp Dener     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.coneq,(PetscVoidFunction)func,ctx);
3488732526dSAlp Dener     if(!*ierr) *ierr = TaoSetEqualityConstraintsRoutine(*tao, *C, ourtaoequalityconstraintsroutine,ctx);
349a7e14dcfSSatish Balay }
350a7e14dcfSSatish Balay 
351a7e14dcfSSatish Balay EXTERN_C_END
352a7e14dcfSSatish Balay 
353a7e14dcfSSatish Balay 
354