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