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