xref: /petsc/src/tao/interface/ftn-custom/ztaosolverf.c (revision 8732526d62dc38b5661c18cf585e9ea16c431ed4)
1af0996ceSBarry Smith #include <petsc/private/fortranimpl.h>
2*8732526dSAlp 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
11a7e14dcfSSatish Balay #define taosetseparableobjectiveroutine_    TAOSETSEPARABLEOBJECTIVEROUTINE
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
30a7e14dcfSSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE)
31a7e14dcfSSatish Balay 
32a7e14dcfSSatish Balay #define taosetobjectiveroutine_             taosetobjectiveroutine
33a7e14dcfSSatish Balay #define taosetgradientroutine_              taosetgradientroutine
34a7e14dcfSSatish Balay #define taosetobjectiveandgradientroutine_  taosetobjectiveandgradientroutine
35a7e14dcfSSatish Balay #define taosethessianroutine_               taosethessianroutine
36a7e14dcfSSatish Balay #define taosetseparableobjectiveroutine_    taosetseparableobjectiveroutine
37a7e14dcfSSatish Balay #define taosetjacobianroutine_              taosetjacobianroutine
38a7e14dcfSSatish Balay #define taosetjacobianstateroutine_         taosetjacobianstateroutine
39a7e14dcfSSatish Balay #define taosetjacobiandesignroutine_        taosetjacobiandesignroutine
40a7e14dcfSSatish Balay #define taosetjacobianinequalityroutine_    taosetjacobianinequalityroutine
41a7e14dcfSSatish Balay #define taosetjacobianequalityroutine_      taosetjacobianequalityroutine
42a7e14dcfSSatish Balay #define taosetinequalityconstraintsroutine_ taosetinequalityconstraintsroutine
43a7e14dcfSSatish Balay #define taosetequalityconstraintsroutine_   taosetequalityconstraintsroutine
44a7e14dcfSSatish Balay #define taosetvariableboundsroutine_        taosetvariableboundsroutine
45a7e14dcfSSatish Balay #define taosetconstraintsroutine_           taosetconstraintsroutine
46a7e14dcfSSatish Balay #define taosetmonitor_                      taosetmonitor
47a7e14dcfSSatish Balay #define taosettype_                         taosettype
48a7e14dcfSSatish Balay #define taoview_                            taoview
49ae93cb3cSJason Sarich #define taogetconvergencehistory_           taogetconvergencehistory
50a7e14dcfSSatish Balay #define taosetconvergencetest_              taosetconvergencetest
51a7e14dcfSSatish Balay #define taogetoptionsprefix_                taogetoptionsprefix
52a7e14dcfSSatish Balay #define taosetoptionsprefix_                taosetoptionsprefix
53a7e14dcfSSatish Balay #define taoappendoptionsprefix_             taoappendoptionsprefix
54a7e14dcfSSatish Balay #define taogettype_                         taogettype
55a7e14dcfSSatish Balay #endif
56a7e14dcfSSatish Balay 
57*8732526dSAlp Dener static struct {
58*8732526dSAlp Dener   PetscFortranCallbackId obj;
59*8732526dSAlp Dener   PetscFortranCallbackId grad;
60*8732526dSAlp Dener   PetscFortranCallbackId objgrad;
61*8732526dSAlp Dener   PetscFortranCallbackId hess;
62*8732526dSAlp Dener   PetscFortranCallbackId sepobj;
63*8732526dSAlp Dener   PetscFortranCallbackId jac;
64*8732526dSAlp Dener   PetscFortranCallbackId jacstate;
65*8732526dSAlp Dener   PetscFortranCallbackId jacdesign;
66*8732526dSAlp Dener   PetscFortranCallbackId bounds;
67*8732526dSAlp Dener   PetscFortranCallbackId mon;
68*8732526dSAlp Dener   PetscFortranCallbackId mondestroy;
69*8732526dSAlp Dener   PetscFortranCallbackId convtest;
70*8732526dSAlp Dener   PetscFortranCallbackId constraints;
71*8732526dSAlp Dener   PetscFortranCallbackId jacineq;
72*8732526dSAlp Dener   PetscFortranCallbackId jaceq;
73*8732526dSAlp Dener   PetscFortranCallbackId conineq;
74*8732526dSAlp Dener   PetscFortranCallbackId coneq;
75*8732526dSAlp Dener   PetscFortranCallbackId nfuncs;
76*8732526dSAlp Dener #if defined(PETSC_HAVE_F90_2PTR_ARG)
77*8732526dSAlp Dener   PetscFortranCallbackId function_pgiptr;
78*8732526dSAlp Dener #endif
79*8732526dSAlp Dener } _cb;
80a7e14dcfSSatish Balay 
81441846f8SBarry Smith static PetscErrorCode ourtaoobjectiveroutine(Tao tao, Vec x, PetscReal *f, void *ctx)
82a7e14dcfSSatish Balay {
83*8732526dSAlp Dener     PetscObjectUseFortranCallback(tao,_cb.obj,(Tao*,Vec*,PetscReal*,void*,PetscErrorCode*),(&tao,&x,f,_ctx,&ierr));
84a7e14dcfSSatish Balay }
85a7e14dcfSSatish Balay 
86441846f8SBarry Smith static PetscErrorCode ourtaogradientroutine(Tao tao, Vec x, Vec g, void *ctx)
87a7e14dcfSSatish Balay {
88*8732526dSAlp Dener     PetscObjectUseFortranCallback(tao,_cb.grad,(Tao*,Vec*,Vec*,void*,PetscErrorCode*),(&tao,&x,&g,_ctx,&ierr));
89a7e14dcfSSatish Balay }
90a7e14dcfSSatish Balay 
91441846f8SBarry Smith static PetscErrorCode ourtaoobjectiveandgradientroutine(Tao tao, Vec x, PetscReal *f, Vec g, void* ctx)
92a7e14dcfSSatish Balay {
93*8732526dSAlp Dener     PetscObjectUseFortranCallback(tao,_cb.objgrad,(Tao*,Vec*,PetscReal*,Vec*,void*,PetscErrorCode*),(&tao,&x,f,&g,_ctx,&ierr));
94a7e14dcfSSatish Balay }
95a7e14dcfSSatish Balay 
96ffad9901SBarry Smith static PetscErrorCode ourtaohessianroutine(Tao tao, Vec x, Mat H, Mat Hpre, void *ctx)
97a7e14dcfSSatish Balay {
98*8732526dSAlp Dener     PetscObjectUseFortranCallback(tao,_cb.hess,(Tao*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),(&tao,&x,&H,&Hpre,_ctx,&ierr));
99a7e14dcfSSatish Balay }
100a7e14dcfSSatish Balay 
101ffad9901SBarry Smith static PetscErrorCode ourtaojacobianroutine(Tao tao, Vec x, Mat H, Mat Hpre, void *ctx)
102a7e14dcfSSatish Balay {
103*8732526dSAlp Dener     PetscObjectUseFortranCallback(tao,_cb.jac,(Tao*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),(&tao,&x,&H,&Hpre,_ctx,&ierr));
104a7e14dcfSSatish Balay }
105a7e14dcfSSatish Balay 
106ffad9901SBarry Smith static PetscErrorCode ourtaojacobianstateroutine(Tao tao, Vec x, Mat H, Mat Hpre, Mat Hinv, void *ctx)
107a7e14dcfSSatish Balay {
108*8732526dSAlp Dener     PetscObjectUseFortranCallback(tao,_cb.jacstate,(Tao*,Vec*,Mat*,Mat*,Mat*,void*,PetscErrorCode*),(&tao,&x,&H,&Hpre,&Hinv,_ctx,&ierr));
109a7e14dcfSSatish Balay }
110a7e14dcfSSatish Balay 
11194ab13aaSBarry Smith static PetscErrorCode ourtaojacobiandesignroutine(Tao tao, Vec x, Mat H, void *ctx)
112a7e14dcfSSatish Balay {
113*8732526dSAlp Dener     PetscObjectUseFortranCallback(tao,_cb.jacdesign,(Tao*,Vec*,Mat*,void*,PetscErrorCode*),(&tao,&x,&H,_ctx,&ierr));
114a7e14dcfSSatish Balay }
115a7e14dcfSSatish Balay 
116441846f8SBarry Smith static PetscErrorCode ourtaoboundsroutine(Tao tao, Vec xl, Vec xu, void *ctx)
117a7e14dcfSSatish Balay {
118*8732526dSAlp Dener     PetscObjectUseFortranCallback(tao,_cb.bounds,(Tao*,Vec*,Vec*,void*,PetscErrorCode*),(&tao,&xl,&xu,_ctx,&ierr));
119a7e14dcfSSatish Balay }
120441846f8SBarry Smith static PetscErrorCode ourtaoseparableobjectiveroutine(Tao tao, Vec x, Vec f, void *ctx)
121a7e14dcfSSatish Balay {
122*8732526dSAlp Dener     PetscObjectUseFortranCallback(tao,_cb.sepobj,(Tao*,Vec*,Vec*,void*,PetscErrorCode*),(&tao,&x,&f,_ctx,&ierr));
123a7e14dcfSSatish Balay }
124a7e14dcfSSatish Balay 
125441846f8SBarry Smith static PetscErrorCode ourtaomonitor(Tao tao, void *ctx)
126a7e14dcfSSatish Balay {
127*8732526dSAlp Dener     PetscObjectUseFortranCallback(tao,_cb.mon,(Tao *,void*,PetscErrorCode*),(&tao,_ctx,&ierr));
128a7e14dcfSSatish Balay }
129a7e14dcfSSatish Balay 
130a7e14dcfSSatish Balay static PetscErrorCode ourtaomondestroy(void **ctx)
131a7e14dcfSSatish Balay {
132*8732526dSAlp Dener     Tao tao = (Tao)*ctx;
133*8732526dSAlp Dener     PetscObjectUseFortranCallback(tao,_cb.mondestroy,(void*,PetscErrorCode*),(_ctx,&ierr));
134a7e14dcfSSatish Balay }
135441846f8SBarry Smith static PetscErrorCode ourtaoconvergencetest(Tao tao, void *ctx)
136a7e14dcfSSatish Balay {
137*8732526dSAlp Dener     PetscObjectUseFortranCallback(tao,_cb.convtest,(Tao *,void*,PetscErrorCode*),(&tao,_ctx,&ierr));
138a7e14dcfSSatish Balay }
139a7e14dcfSSatish Balay 
140441846f8SBarry Smith static PetscErrorCode ourtaoconstraintsroutine(Tao tao, Vec x, Vec c, void *ctx)
141a7e14dcfSSatish Balay {
142*8732526dSAlp Dener     PetscObjectUseFortranCallback(tao,_cb.constraints,(Tao*,Vec*,Vec*,void*,PetscErrorCode*),(&tao,&x,&c,_ctx,&ierr));
143a7e14dcfSSatish Balay }
144a7e14dcfSSatish Balay 
145ffad9901SBarry Smith static PetscErrorCode ourtaojacobianinequalityroutine(Tao tao, Vec x, Mat J, Mat Jpre, void *ctx)
146a7e14dcfSSatish Balay {
147*8732526dSAlp Dener     PetscObjectUseFortranCallback(tao,_cb.jacineq,(Tao*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),(&tao,&x,&J,&Jpre,_ctx,&ierr));
148a7e14dcfSSatish Balay }
149a7e14dcfSSatish Balay 
150ffad9901SBarry Smith static PetscErrorCode ourtaojacobianequalityroutine(Tao tao, Vec x, Mat J, Mat Jpre, void *ctx)
151a7e14dcfSSatish Balay {
152*8732526dSAlp Dener     PetscObjectUseFortranCallback(tao,_cb.jaceq,(Tao*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),(&tao,&x,&J,&Jpre,_ctx,&ierr));
153a7e14dcfSSatish Balay }
154a7e14dcfSSatish Balay 
155441846f8SBarry Smith static PetscErrorCode ourtaoinequalityconstraintsroutine(Tao tao, Vec x, Vec c, void *ctx)
156a7e14dcfSSatish Balay {
157*8732526dSAlp Dener     PetscObjectUseFortranCallback(tao,_cb.conineq,(Tao*,Vec*,Vec*,void*,PetscErrorCode*),(&tao,&x,&c,_ctx,&ierr));
158a7e14dcfSSatish Balay }
159a7e14dcfSSatish Balay 
160441846f8SBarry Smith static PetscErrorCode ourtaoequalityconstraintsroutine(Tao tao, Vec x, Vec c, void *ctx)
161a7e14dcfSSatish Balay {
162*8732526dSAlp Dener     PetscObjectUseFortranCallback(tao,_cb.coneq,(Tao*,Vec*,Vec*,void*,PetscErrorCode*),(&tao,&x,&c,_ctx,&ierr));
163a7e14dcfSSatish Balay }
164a7e14dcfSSatish Balay 
165a7e14dcfSSatish Balay EXTERN_C_BEGIN
166a7e14dcfSSatish Balay 
167db87b0f2SBarry Smith PETSC_EXTERN void PETSC_STDCALL taosetobjectiveroutine_(Tao *tao, void (PETSC_STDCALL *func)(Tao*, Vec *, PetscReal *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
168a7e14dcfSSatish Balay {
169*8732526dSAlp Dener     CHKFORTRANNULLFUNCTION(func);
170*8732526dSAlp Dener     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.obj,(PetscVoidFunction)func,ctx);
171*8732526dSAlp Dener     if(!*ierr) *ierr = TaoSetObjectiveRoutine(*tao,ourtaoobjectiveroutine,ctx);
172a7e14dcfSSatish Balay }
173a7e14dcfSSatish Balay 
174db87b0f2SBarry Smith PETSC_EXTERN void PETSC_STDCALL taosetgradientroutine_(Tao *tao, void (PETSC_STDCALL *func)(Tao*, Vec *, Vec *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
175a7e14dcfSSatish Balay {
176*8732526dSAlp Dener     CHKFORTRANNULLFUNCTION(func);
177*8732526dSAlp Dener     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.grad,(PetscVoidFunction)func,ctx);
178*8732526dSAlp Dener     if(!*ierr) *ierr = TaoSetGradientRoutine(*tao,ourtaogradientroutine,ctx);
179a7e14dcfSSatish Balay }
180a7e14dcfSSatish Balay 
181db87b0f2SBarry Smith PETSC_EXTERN void PETSC_STDCALL taosetobjectiveandgradientroutine_(Tao *tao, void (PETSC_STDCALL *func)(Tao*, Vec *, PetscReal *, Vec *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
182a7e14dcfSSatish Balay {
183*8732526dSAlp Dener     CHKFORTRANNULLFUNCTION(func);
184*8732526dSAlp Dener     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.objgrad,(PetscVoidFunction)func,ctx);
185*8732526dSAlp Dener     if(!*ierr) *ierr = TaoSetObjectiveAndGradientRoutine(*tao,ourtaoobjectiveandgradientroutine,ctx);
186a7e14dcfSSatish Balay }
187a7e14dcfSSatish Balay 
188db87b0f2SBarry Smith PETSC_EXTERN void PETSC_STDCALL taosetseparableobjectiveroutine_(Tao *tao, Vec *F, void (PETSC_STDCALL *func)(Tao*, Vec *, Vec *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
189a7e14dcfSSatish Balay {
190*8732526dSAlp Dener     CHKFORTRANNULLFUNCTION(func);
191*8732526dSAlp Dener     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.sepobj,(PetscVoidFunction)func,ctx);
192*8732526dSAlp Dener     if(!*ierr) *ierr = TaoSetSeparableObjectiveRoutine(*tao,*F,ourtaoseparableobjectiveroutine,ctx);
193a7e14dcfSSatish Balay }
194a7e14dcfSSatish Balay 
195db87b0f2SBarry 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)
196a7e14dcfSSatish Balay {
197*8732526dSAlp Dener     CHKFORTRANNULLFUNCTION(func);
198*8732526dSAlp Dener     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.jac,(PetscVoidFunction)func,ctx);
199*8732526dSAlp Dener     if(!*ierr) *ierr = TaoSetJacobianRoutine(*tao,*J,*Jp,ourtaojacobianroutine,ctx);
200a7e14dcfSSatish Balay }
201a7e14dcfSSatish Balay 
202db87b0f2SBarry 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)
203a7e14dcfSSatish Balay {
204*8732526dSAlp Dener     CHKFORTRANNULLFUNCTION(func);
205*8732526dSAlp Dener     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.jacstate,(PetscVoidFunction)func,ctx);
206*8732526dSAlp Dener     if(!*ierr) *ierr = TaoSetJacobianStateRoutine(*tao,*J,*Jp,*Jinv,ourtaojacobianstateroutine,ctx);
207a7e14dcfSSatish Balay }
208a7e14dcfSSatish Balay 
209db87b0f2SBarry Smith PETSC_EXTERN void PETSC_STDCALL taosetjacobiandesignroutine_(Tao *tao, Mat *J, void (PETSC_STDCALL *func)(Tao*, Vec *, Mat *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
210a7e14dcfSSatish Balay {
211*8732526dSAlp Dener     CHKFORTRANNULLFUNCTION(func);
212*8732526dSAlp Dener     *ierr = PetscObjectSetFortranCallback((PetscObject)tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.jacdesign,(PetscVoidFunction)func,ctx);
213*8732526dSAlp Dener     if(!*ierr) *ierr = TaoSetJacobianDesignRoutine(*tao,*J,ourtaojacobiandesignroutine,ctx);
214a7e14dcfSSatish Balay }
215a7e14dcfSSatish Balay 
216db87b0f2SBarry 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)
217a7e14dcfSSatish Balay {
218*8732526dSAlp Dener     CHKFORTRANNULLFUNCTION(func);
219*8732526dSAlp Dener     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.hess,(PetscVoidFunction)func,ctx);
220*8732526dSAlp Dener     if(!*ierr) *ierr = TaoSetHessianRoutine(*tao,*J, *Jp, ourtaohessianroutine,ctx);
221a7e14dcfSSatish Balay }
222a7e14dcfSSatish Balay 
223db87b0f2SBarry Smith PETSC_EXTERN void PETSC_STDCALL taosetvariableboundsroutine_(Tao *tao, void (PETSC_STDCALL *func)(Tao*,Vec*,Vec*,void*,PetscErrorCode*),void *ctx, PetscErrorCode *ierr)
224a7e14dcfSSatish Balay {
225*8732526dSAlp Dener     CHKFORTRANNULLFUNCTION(func);
226*8732526dSAlp Dener     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.bounds,(PetscVoidFunction)func,ctx);
227*8732526dSAlp Dener     if(!*ierr) *ierr = TaoSetVariableBoundsRoutine(*tao,ourtaoboundsroutine,ctx);
228a7e14dcfSSatish Balay }
229a7e14dcfSSatish Balay 
230db87b0f2SBarry 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)
231a7e14dcfSSatish Balay {
232*8732526dSAlp Dener     CHKFORTRANNULLOBJECT(ctx);
233aecf964fSBarry Smith     CHKFORTRANNULLFUNCTION(mondestroy);
234*8732526dSAlp Dener     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.mon,(PetscVoidFunction)func,ctx); if (*ierr) return;
235*8732526dSAlp Dener     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.mondestroy,(PetscVoidFunction)mondestroy,ctx); if (*ierr) return;
236*8732526dSAlp Dener     *ierr = TaoSetMonitor(*tao,ourtaomonitor,*tao,ourtaomondestroy);
237a7e14dcfSSatish Balay }
238a7e14dcfSSatish Balay 
239db87b0f2SBarry Smith PETSC_EXTERN void PETSC_STDCALL taosetconvergencetest_(Tao *tao, void (PETSC_STDCALL *func)(Tao*,void*,PetscErrorCode*),void *ctx, PetscErrorCode *ierr)
240a7e14dcfSSatish Balay {
241*8732526dSAlp Dener     CHKFORTRANNULLFUNCTION(func);
242*8732526dSAlp Dener     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.convtest,(PetscVoidFunction)func,ctx);
243*8732526dSAlp Dener     if(!*ierr) *ierr = TaoSetConvergenceTest(*tao,ourtaoconvergencetest,ctx);
244a7e14dcfSSatish Balay }
245a7e14dcfSSatish Balay 
246db87b0f2SBarry Smith PETSC_EXTERN void PETSC_STDCALL taosetconstraintsroutine_(Tao *tao, Vec *C, void (PETSC_STDCALL *func)(Tao*, Vec *, Vec *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
247a7e14dcfSSatish Balay {
248*8732526dSAlp Dener     CHKFORTRANNULLFUNCTION(func);
249*8732526dSAlp Dener     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.constraints,(PetscVoidFunction)func,ctx);
250*8732526dSAlp Dener     if(!*ierr) *ierr = TaoSetConstraintsRoutine(*tao,*C,ourtaoconstraintsroutine,ctx);
251a7e14dcfSSatish Balay }
252a7e14dcfSSatish Balay 
253390e1bf2SBarry Smith PETSC_EXTERN void PETSC_STDCALL taosettype_(Tao *tao, char* type_name PETSC_MIXED_LEN(len), PetscErrorCode *ierr PETSC_END_LEN(len))
254a7e14dcfSSatish Balay {
255a7e14dcfSSatish Balay     char *t;
256a7e14dcfSSatish Balay 
257a7e14dcfSSatish Balay     FIXCHAR(type_name,len,t);
258a7e14dcfSSatish Balay     *ierr = TaoSetType(*tao,t);
259a7e14dcfSSatish Balay     FREECHAR(type_name,t);
260a7e14dcfSSatish Balay 
261a7e14dcfSSatish Balay }
262a7e14dcfSSatish Balay 
263db87b0f2SBarry Smith PETSC_EXTERN void PETSC_STDCALL taoview_(Tao *tao, PetscViewer *viewer, PetscErrorCode *ierr)
264a7e14dcfSSatish Balay {
265a7e14dcfSSatish Balay     PetscViewer v;
266a7e14dcfSSatish Balay     PetscPatchDefaultViewers_Fortran(viewer,v);
267a7e14dcfSSatish Balay     *ierr = TaoView(*tao,v);
268a7e14dcfSSatish Balay }
269a7e14dcfSSatish Balay 
270db87b0f2SBarry Smith PETSC_EXTERN void PETSC_STDCALL taogetconvergencehistory_(Tao *tao, PetscInt *nhist, PetscErrorCode *ierr)
271a7e14dcfSSatish Balay {
272ae93cb3cSJason Sarich   *ierr = TaoGetConvergenceHistory(*tao,NULL,NULL,NULL,NULL,nhist);
273a7e14dcfSSatish Balay }
274a7e14dcfSSatish Balay 
275390e1bf2SBarry Smith PETSC_EXTERN void PETSC_STDCALL taogetoptionsprefix_(Tao *tao, char* prefix PETSC_MIXED_LEN(len), PetscErrorCode *ierr PETSC_END_LEN(len))
276a7e14dcfSSatish Balay {
277a7e14dcfSSatish Balay   const char *name;
278a7e14dcfSSatish Balay   *ierr = TaoGetOptionsPrefix(*tao,&name);
279a7e14dcfSSatish Balay   *ierr = PetscStrncpy(prefix,name,len); if (*ierr) return;
280a7e14dcfSSatish Balay   FIXRETURNCHAR(PETSC_TRUE,prefix,len);
281a7e14dcfSSatish Balay 
282a7e14dcfSSatish Balay }
283a7e14dcfSSatish Balay 
284390e1bf2SBarry Smith PETSC_EXTERN void PETSC_STDCALL taoappendoptionsprefix_(Tao *tao, char* prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
285a7e14dcfSSatish Balay {
286a7e14dcfSSatish Balay   char *name;
287a7e14dcfSSatish Balay   FIXCHAR(prefix,len,name);
288a7e14dcfSSatish Balay   *ierr = TaoAppendOptionsPrefix(*tao,name);
289a7e14dcfSSatish Balay   FREECHAR(prefix,name);
290a7e14dcfSSatish Balay }
291a7e14dcfSSatish Balay 
292390e1bf2SBarry Smith PETSC_EXTERN void PETSC_STDCALL taosetoptionsprefix_(Tao *tao, char* prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len))
293a7e14dcfSSatish Balay {
294a7e14dcfSSatish Balay   char *t;
295a7e14dcfSSatish Balay   FIXCHAR(prefix,len,t);
296a7e14dcfSSatish Balay   *ierr = TaoSetOptionsPrefix(*tao,t);
297a7e14dcfSSatish Balay   FREECHAR(prefix,t);
298a7e14dcfSSatish Balay }
299a7e14dcfSSatish Balay 
300390e1bf2SBarry Smith PETSC_EXTERN void PETSC_STDCALL taogettype_(Tao *tao, char* name PETSC_MIXED_LEN(len), PetscErrorCode *ierr  PETSC_END_LEN(len))
301a7e14dcfSSatish Balay {
302a7e14dcfSSatish Balay   const char *tname;
303a7e14dcfSSatish Balay   *ierr = TaoGetType(*tao,&tname);
304a7e14dcfSSatish Balay   *ierr = PetscStrncpy(name,tname,len); if (*ierr) return;
305a7e14dcfSSatish Balay   FIXRETURNCHAR(PETSC_TRUE,name,len);
306a7e14dcfSSatish Balay 
307a7e14dcfSSatish Balay }
308a7e14dcfSSatish Balay 
309db87b0f2SBarry 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)
310a7e14dcfSSatish Balay {
311*8732526dSAlp Dener     CHKFORTRANNULLFUNCTION(func);
312*8732526dSAlp Dener     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.jacineq,(PetscVoidFunction)func,ctx);
313*8732526dSAlp Dener     if(!*ierr) *ierr = TaoSetJacobianInequalityRoutine(*tao,*J,*Jp,ourtaojacobianinequalityroutine,ctx);
314a7e14dcfSSatish Balay }
315a7e14dcfSSatish Balay 
316db87b0f2SBarry 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)
317a7e14dcfSSatish Balay {
318*8732526dSAlp Dener     CHKFORTRANNULLFUNCTION(func);
319*8732526dSAlp Dener     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.jaceq,(PetscVoidFunction)func,ctx);
320*8732526dSAlp Dener     if(!*ierr) *ierr = TaoSetJacobianEqualityRoutine(*tao,*J,*Jp,ourtaojacobianequalityroutine,ctx);
321a7e14dcfSSatish Balay }
322a7e14dcfSSatish Balay 
323db87b0f2SBarry Smith PETSC_EXTERN void PETSC_STDCALL taosetinequalityconstraintsroutine_(Tao *tao, Vec *C, void (PETSC_STDCALL *func)(Tao*, Vec *, Vec *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
324a7e14dcfSSatish Balay {
325*8732526dSAlp Dener     CHKFORTRANNULLFUNCTION(func);
326*8732526dSAlp Dener     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.conineq,(PetscVoidFunction)func,ctx);
327*8732526dSAlp Dener     if(!*ierr) *ierr = TaoSetInequalityConstraintsRoutine(*tao,*C,ourtaoinequalityconstraintsroutine,ctx);
328a7e14dcfSSatish Balay }
329a7e14dcfSSatish Balay 
330db87b0f2SBarry Smith PETSC_EXTERN void PETSC_STDCALL taosetequalityconstraintsroutine_(Tao *tao, Vec *C, void (PETSC_STDCALL *func)(Tao*, Vec *, Vec *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr)
331a7e14dcfSSatish Balay {
332*8732526dSAlp Dener     CHKFORTRANNULLFUNCTION(func);
333*8732526dSAlp Dener     *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.coneq,(PetscVoidFunction)func,ctx);
334*8732526dSAlp Dener     if(!*ierr) *ierr = TaoSetEqualityConstraintsRoutine(*tao, *C, ourtaoequalityconstraintsroutine,ctx);
335a7e14dcfSSatish Balay }
336a7e14dcfSSatish Balay 
337a7e14dcfSSatish Balay EXTERN_C_END
338a7e14dcfSSatish Balay 
339a7e14dcfSSatish Balay 
340