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