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 11737f463aSAlp Dener #define taosetresidualroutine_ TAOSETRESIDUALROUTINE 124ffbe8acSAlp Dener #define taosetjacobianresidualroutine_ TAOSETJACOBIANRESIDUALROUTINE 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 31e1e80dc8SAlp Dener #define taosetupdate_ TAOSETUPDATE 32*fe2efc57SMark #define taoviewfromoptions_ TAOVIEWFROMOPTIONS 33a7e14dcfSSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE) 34a7e14dcfSSatish Balay 35a7e14dcfSSatish Balay #define taosetobjectiveroutine_ taosetobjectiveroutine 36a7e14dcfSSatish Balay #define taosetgradientroutine_ taosetgradientroutine 37a7e14dcfSSatish Balay #define taosetobjectiveandgradientroutine_ taosetobjectiveandgradientroutine 38a7e14dcfSSatish Balay #define taosethessianroutine_ taosethessianroutine 39737f463aSAlp Dener #define taosetresidualroutine_ taosetresidualroutine 404ffbe8acSAlp Dener #define taosetjacobianresidualroutine_ taosetjacobianresidualroutine 41a7e14dcfSSatish Balay #define taosetjacobianroutine_ taosetjacobianroutine 42a7e14dcfSSatish Balay #define taosetjacobianstateroutine_ taosetjacobianstateroutine 43a7e14dcfSSatish Balay #define taosetjacobiandesignroutine_ taosetjacobiandesignroutine 44a7e14dcfSSatish Balay #define taosetjacobianinequalityroutine_ taosetjacobianinequalityroutine 45a7e14dcfSSatish Balay #define taosetjacobianequalityroutine_ taosetjacobianequalityroutine 46a7e14dcfSSatish Balay #define taosetinequalityconstraintsroutine_ taosetinequalityconstraintsroutine 47a7e14dcfSSatish Balay #define taosetequalityconstraintsroutine_ taosetequalityconstraintsroutine 48a7e14dcfSSatish Balay #define taosetvariableboundsroutine_ taosetvariableboundsroutine 49a7e14dcfSSatish Balay #define taosetconstraintsroutine_ taosetconstraintsroutine 50a7e14dcfSSatish Balay #define taosetmonitor_ taosetmonitor 51a7e14dcfSSatish Balay #define taosettype_ taosettype 52a7e14dcfSSatish Balay #define taoview_ taoview 53ae93cb3cSJason Sarich #define taogetconvergencehistory_ taogetconvergencehistory 54a7e14dcfSSatish Balay #define taosetconvergencetest_ taosetconvergencetest 55a7e14dcfSSatish Balay #define taogetoptionsprefix_ taogetoptionsprefix 56a7e14dcfSSatish Balay #define taosetoptionsprefix_ taosetoptionsprefix 57a7e14dcfSSatish Balay #define taoappendoptionsprefix_ taoappendoptionsprefix 58a7e14dcfSSatish Balay #define taogettype_ taogettype 59e1e80dc8SAlp Dener #define taosetupdate_ taosetupdate 60*fe2efc57SMark #define taoviewfromoptions_ taoviewfromoptions 61a7e14dcfSSatish Balay #endif 62a7e14dcfSSatish Balay 638732526dSAlp Dener static struct { 648732526dSAlp Dener PetscFortranCallbackId obj; 658732526dSAlp Dener PetscFortranCallbackId grad; 668732526dSAlp Dener PetscFortranCallbackId objgrad; 678732526dSAlp Dener PetscFortranCallbackId hess; 68737f463aSAlp Dener PetscFortranCallbackId lsres; 69737f463aSAlp Dener PetscFortranCallbackId lsjac; 708732526dSAlp Dener PetscFortranCallbackId jac; 718732526dSAlp Dener PetscFortranCallbackId jacstate; 728732526dSAlp Dener PetscFortranCallbackId jacdesign; 738732526dSAlp Dener PetscFortranCallbackId bounds; 748732526dSAlp Dener PetscFortranCallbackId mon; 758732526dSAlp Dener PetscFortranCallbackId mondestroy; 768732526dSAlp Dener PetscFortranCallbackId convtest; 778732526dSAlp Dener PetscFortranCallbackId constraints; 788732526dSAlp Dener PetscFortranCallbackId jacineq; 798732526dSAlp Dener PetscFortranCallbackId jaceq; 808732526dSAlp Dener PetscFortranCallbackId conineq; 818732526dSAlp Dener PetscFortranCallbackId coneq; 828732526dSAlp Dener PetscFortranCallbackId nfuncs; 83e1e80dc8SAlp Dener PetscFortranCallbackId update; 848732526dSAlp Dener #if defined(PETSC_HAVE_F90_2PTR_ARG) 858732526dSAlp Dener PetscFortranCallbackId function_pgiptr; 868732526dSAlp Dener #endif 878732526dSAlp Dener } _cb; 88a7e14dcfSSatish Balay 89441846f8SBarry Smith static PetscErrorCode ourtaoobjectiveroutine(Tao tao, Vec x, PetscReal *f, void *ctx) 90a7e14dcfSSatish Balay { 918732526dSAlp Dener PetscObjectUseFortranCallback(tao,_cb.obj,(Tao*,Vec*,PetscReal*,void*,PetscErrorCode*),(&tao,&x,f,_ctx,&ierr)); 92a7e14dcfSSatish Balay } 93a7e14dcfSSatish Balay 94441846f8SBarry Smith static PetscErrorCode ourtaogradientroutine(Tao tao, Vec x, Vec g, void *ctx) 95a7e14dcfSSatish Balay { 968732526dSAlp Dener PetscObjectUseFortranCallback(tao,_cb.grad,(Tao*,Vec*,Vec*,void*,PetscErrorCode*),(&tao,&x,&g,_ctx,&ierr)); 97a7e14dcfSSatish Balay } 98a7e14dcfSSatish Balay 99441846f8SBarry Smith static PetscErrorCode ourtaoobjectiveandgradientroutine(Tao tao, Vec x, PetscReal *f, Vec g, void* ctx) 100a7e14dcfSSatish Balay { 1018732526dSAlp Dener PetscObjectUseFortranCallback(tao,_cb.objgrad,(Tao*,Vec*,PetscReal*,Vec*,void*,PetscErrorCode*),(&tao,&x,f,&g,_ctx,&ierr)); 102a7e14dcfSSatish Balay } 103a7e14dcfSSatish Balay 104ffad9901SBarry Smith static PetscErrorCode ourtaohessianroutine(Tao tao, Vec x, Mat H, Mat Hpre, void *ctx) 105a7e14dcfSSatish Balay { 1068732526dSAlp Dener PetscObjectUseFortranCallback(tao,_cb.hess,(Tao*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),(&tao,&x,&H,&Hpre,_ctx,&ierr)); 107a7e14dcfSSatish Balay } 108a7e14dcfSSatish Balay 109ffad9901SBarry Smith static PetscErrorCode ourtaojacobianroutine(Tao tao, Vec x, Mat H, Mat Hpre, void *ctx) 110a7e14dcfSSatish Balay { 1118732526dSAlp Dener PetscObjectUseFortranCallback(tao,_cb.jac,(Tao*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),(&tao,&x,&H,&Hpre,_ctx,&ierr)); 112a7e14dcfSSatish Balay } 113a7e14dcfSSatish Balay 114ffad9901SBarry Smith static PetscErrorCode ourtaojacobianstateroutine(Tao tao, Vec x, Mat H, Mat Hpre, Mat Hinv, void *ctx) 115a7e14dcfSSatish Balay { 1168732526dSAlp Dener PetscObjectUseFortranCallback(tao,_cb.jacstate,(Tao*,Vec*,Mat*,Mat*,Mat*,void*,PetscErrorCode*),(&tao,&x,&H,&Hpre,&Hinv,_ctx,&ierr)); 117a7e14dcfSSatish Balay } 118a7e14dcfSSatish Balay 11994ab13aaSBarry Smith static PetscErrorCode ourtaojacobiandesignroutine(Tao tao, Vec x, Mat H, void *ctx) 120a7e14dcfSSatish Balay { 1218732526dSAlp Dener PetscObjectUseFortranCallback(tao,_cb.jacdesign,(Tao*,Vec*,Mat*,void*,PetscErrorCode*),(&tao,&x,&H,_ctx,&ierr)); 122a7e14dcfSSatish Balay } 123a7e14dcfSSatish Balay 124441846f8SBarry Smith static PetscErrorCode ourtaoboundsroutine(Tao tao, Vec xl, Vec xu, void *ctx) 125a7e14dcfSSatish Balay { 1268732526dSAlp Dener PetscObjectUseFortranCallback(tao,_cb.bounds,(Tao*,Vec*,Vec*,void*,PetscErrorCode*),(&tao,&xl,&xu,_ctx,&ierr)); 127a7e14dcfSSatish Balay } 128737f463aSAlp Dener static PetscErrorCode ourtaoresidualroutine(Tao tao, Vec x, Vec f, void *ctx) 129a7e14dcfSSatish Balay { 130737f463aSAlp Dener PetscObjectUseFortranCallback(tao,_cb.lsres,(Tao*,Vec*,Vec*,void*,PetscErrorCode*),(&tao,&x,&f,_ctx,&ierr)); 131737f463aSAlp Dener } 132737f463aSAlp Dener 1334ffbe8acSAlp Dener static PetscErrorCode ourtaojacobianresidualroutine(Tao tao, Vec x, Mat J, Mat Jpre, void *ctx) 134737f463aSAlp Dener { 135737f463aSAlp Dener PetscObjectUseFortranCallback(tao,_cb.lsjac,(Tao*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),(&tao,&x,&J,&Jpre,_ctx,&ierr)); 136a7e14dcfSSatish Balay } 137a7e14dcfSSatish Balay 138441846f8SBarry Smith static PetscErrorCode ourtaomonitor(Tao tao, void *ctx) 139a7e14dcfSSatish Balay { 1408732526dSAlp Dener PetscObjectUseFortranCallback(tao,_cb.mon,(Tao *,void*,PetscErrorCode*),(&tao,_ctx,&ierr)); 141a7e14dcfSSatish Balay } 142a7e14dcfSSatish Balay 143a7e14dcfSSatish Balay static PetscErrorCode ourtaomondestroy(void **ctx) 144a7e14dcfSSatish Balay { 1458732526dSAlp Dener Tao tao = (Tao)*ctx; 1468732526dSAlp Dener PetscObjectUseFortranCallback(tao,_cb.mondestroy,(void*,PetscErrorCode*),(_ctx,&ierr)); 147a7e14dcfSSatish Balay } 148441846f8SBarry Smith static PetscErrorCode ourtaoconvergencetest(Tao tao, void *ctx) 149a7e14dcfSSatish Balay { 1508732526dSAlp Dener PetscObjectUseFortranCallback(tao,_cb.convtest,(Tao *,void*,PetscErrorCode*),(&tao,_ctx,&ierr)); 151a7e14dcfSSatish Balay } 152a7e14dcfSSatish Balay 153441846f8SBarry Smith static PetscErrorCode ourtaoconstraintsroutine(Tao tao, Vec x, Vec c, void *ctx) 154a7e14dcfSSatish Balay { 1558732526dSAlp Dener PetscObjectUseFortranCallback(tao,_cb.constraints,(Tao*,Vec*,Vec*,void*,PetscErrorCode*),(&tao,&x,&c,_ctx,&ierr)); 156a7e14dcfSSatish Balay } 157a7e14dcfSSatish Balay 158ffad9901SBarry Smith static PetscErrorCode ourtaojacobianinequalityroutine(Tao tao, Vec x, Mat J, Mat Jpre, void *ctx) 159a7e14dcfSSatish Balay { 1608732526dSAlp Dener PetscObjectUseFortranCallback(tao,_cb.jacineq,(Tao*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),(&tao,&x,&J,&Jpre,_ctx,&ierr)); 161a7e14dcfSSatish Balay } 162a7e14dcfSSatish Balay 163ffad9901SBarry Smith static PetscErrorCode ourtaojacobianequalityroutine(Tao tao, Vec x, Mat J, Mat Jpre, void *ctx) 164a7e14dcfSSatish Balay { 1658732526dSAlp Dener PetscObjectUseFortranCallback(tao,_cb.jaceq,(Tao*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),(&tao,&x,&J,&Jpre,_ctx,&ierr)); 166a7e14dcfSSatish Balay } 167a7e14dcfSSatish Balay 168441846f8SBarry Smith static PetscErrorCode ourtaoinequalityconstraintsroutine(Tao tao, Vec x, Vec c, void *ctx) 169a7e14dcfSSatish Balay { 1708732526dSAlp Dener PetscObjectUseFortranCallback(tao,_cb.conineq,(Tao*,Vec*,Vec*,void*,PetscErrorCode*),(&tao,&x,&c,_ctx,&ierr)); 171a7e14dcfSSatish Balay } 172a7e14dcfSSatish Balay 173441846f8SBarry Smith static PetscErrorCode ourtaoequalityconstraintsroutine(Tao tao, Vec x, Vec c, void *ctx) 174a7e14dcfSSatish Balay { 1758732526dSAlp Dener PetscObjectUseFortranCallback(tao,_cb.coneq,(Tao*,Vec*,Vec*,void*,PetscErrorCode*),(&tao,&x,&c,_ctx,&ierr)); 176a7e14dcfSSatish Balay } 177a7e14dcfSSatish Balay 1788fcddce6SStefano Zampini static PetscErrorCode ourtaoupdateroutine(Tao tao, PetscInt iter, void *ctx) 179e1e80dc8SAlp Dener { 1808fcddce6SStefano Zampini PetscObjectUseFortranCallback(tao,_cb.update,(Tao*,PetscInt*,void*),(&tao,&iter,_ctx)); 181e1e80dc8SAlp Dener } 182e1e80dc8SAlp Dener 183a7e14dcfSSatish Balay EXTERN_C_BEGIN 184a7e14dcfSSatish Balay 185db87b0f2SBarry Smith PETSC_EXTERN void PETSC_STDCALL taosetobjectiveroutine_(Tao *tao, void (PETSC_STDCALL *func)(Tao*, Vec *, PetscReal *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr) 186a7e14dcfSSatish Balay { 1878732526dSAlp Dener CHKFORTRANNULLFUNCTION(func); 1888732526dSAlp Dener *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.obj,(PetscVoidFunction)func,ctx); 1898732526dSAlp Dener if(!*ierr) *ierr = TaoSetObjectiveRoutine(*tao,ourtaoobjectiveroutine,ctx); 190a7e14dcfSSatish Balay } 191a7e14dcfSSatish Balay 192db87b0f2SBarry Smith PETSC_EXTERN void PETSC_STDCALL taosetgradientroutine_(Tao *tao, void (PETSC_STDCALL *func)(Tao*, Vec *, Vec *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr) 193a7e14dcfSSatish Balay { 1948732526dSAlp Dener CHKFORTRANNULLFUNCTION(func); 1958732526dSAlp Dener *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.grad,(PetscVoidFunction)func,ctx); 1968732526dSAlp Dener if(!*ierr) *ierr = TaoSetGradientRoutine(*tao,ourtaogradientroutine,ctx); 197a7e14dcfSSatish Balay } 198a7e14dcfSSatish Balay 199db87b0f2SBarry Smith PETSC_EXTERN void PETSC_STDCALL taosetobjectiveandgradientroutine_(Tao *tao, void (PETSC_STDCALL *func)(Tao*, Vec *, PetscReal *, Vec *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr) 200a7e14dcfSSatish Balay { 2018732526dSAlp Dener CHKFORTRANNULLFUNCTION(func); 2028732526dSAlp Dener *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.objgrad,(PetscVoidFunction)func,ctx); 2038732526dSAlp Dener if(!*ierr) *ierr = TaoSetObjectiveAndGradientRoutine(*tao,ourtaoobjectiveandgradientroutine,ctx); 204a7e14dcfSSatish Balay } 205a7e14dcfSSatish Balay 206737f463aSAlp Dener PETSC_EXTERN void PETSC_STDCALL taosetresidualroutine_(Tao *tao, Vec *F, void (PETSC_STDCALL *func)(Tao*, Vec *, Vec *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr) 207a7e14dcfSSatish Balay { 2088732526dSAlp Dener CHKFORTRANNULLFUNCTION(func); 209737f463aSAlp Dener *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.lsres,(PetscVoidFunction)func,ctx); 210737f463aSAlp Dener if(!*ierr) *ierr = TaoSetResidualRoutine(*tao,*F,ourtaoresidualroutine,ctx); 211737f463aSAlp Dener } 212737f463aSAlp Dener 2134ffbe8acSAlp Dener PETSC_EXTERN void PETSC_STDCALL taosetjacobianresidualroutine_(Tao *tao, Mat *J, Mat *Jpre, void (PETSC_STDCALL *func)(Tao*, Vec *, Mat *, Mat *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr) 214737f463aSAlp Dener { 215737f463aSAlp Dener CHKFORTRANNULLFUNCTION(func); 216737f463aSAlp Dener *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.lsjac,(PetscVoidFunction)func,ctx); 2174ffbe8acSAlp Dener if(!*ierr) *ierr = TaoSetJacobianResidualRoutine(*tao,*J,*Jpre,ourtaojacobianresidualroutine,ctx); 218a7e14dcfSSatish Balay } 219a7e14dcfSSatish Balay 220db87b0f2SBarry 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) 221a7e14dcfSSatish Balay { 2228732526dSAlp Dener CHKFORTRANNULLFUNCTION(func); 2238732526dSAlp Dener *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.jac,(PetscVoidFunction)func,ctx); 2248732526dSAlp Dener if(!*ierr) *ierr = TaoSetJacobianRoutine(*tao,*J,*Jp,ourtaojacobianroutine,ctx); 225a7e14dcfSSatish Balay } 226a7e14dcfSSatish Balay 227db87b0f2SBarry 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) 228a7e14dcfSSatish Balay { 2298732526dSAlp Dener CHKFORTRANNULLFUNCTION(func); 2308732526dSAlp Dener *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.jacstate,(PetscVoidFunction)func,ctx); 2318732526dSAlp Dener if(!*ierr) *ierr = TaoSetJacobianStateRoutine(*tao,*J,*Jp,*Jinv,ourtaojacobianstateroutine,ctx); 232a7e14dcfSSatish Balay } 233a7e14dcfSSatish Balay 234db87b0f2SBarry Smith PETSC_EXTERN void PETSC_STDCALL taosetjacobiandesignroutine_(Tao *tao, Mat *J, void (PETSC_STDCALL *func)(Tao*, Vec *, Mat *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr) 235a7e14dcfSSatish Balay { 2368732526dSAlp Dener CHKFORTRANNULLFUNCTION(func); 2378732526dSAlp Dener *ierr = PetscObjectSetFortranCallback((PetscObject)tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.jacdesign,(PetscVoidFunction)func,ctx); 2388732526dSAlp Dener if(!*ierr) *ierr = TaoSetJacobianDesignRoutine(*tao,*J,ourtaojacobiandesignroutine,ctx); 239a7e14dcfSSatish Balay } 240a7e14dcfSSatish Balay 241db87b0f2SBarry 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) 242a7e14dcfSSatish Balay { 2438732526dSAlp Dener CHKFORTRANNULLFUNCTION(func); 2448732526dSAlp Dener *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.hess,(PetscVoidFunction)func,ctx); 2458732526dSAlp Dener if(!*ierr) *ierr = TaoSetHessianRoutine(*tao,*J, *Jp, ourtaohessianroutine,ctx); 246a7e14dcfSSatish Balay } 247a7e14dcfSSatish Balay 248db87b0f2SBarry Smith PETSC_EXTERN void PETSC_STDCALL taosetvariableboundsroutine_(Tao *tao, void (PETSC_STDCALL *func)(Tao*,Vec*,Vec*,void*,PetscErrorCode*),void *ctx, PetscErrorCode *ierr) 249a7e14dcfSSatish Balay { 2508732526dSAlp Dener CHKFORTRANNULLFUNCTION(func); 2518732526dSAlp Dener *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.bounds,(PetscVoidFunction)func,ctx); 2528732526dSAlp Dener if(!*ierr) *ierr = TaoSetVariableBoundsRoutine(*tao,ourtaoboundsroutine,ctx); 253a7e14dcfSSatish Balay } 254a7e14dcfSSatish Balay 255db87b0f2SBarry 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) 256a7e14dcfSSatish Balay { 257aecf964fSBarry Smith CHKFORTRANNULLFUNCTION(mondestroy); 2588732526dSAlp Dener *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.mon,(PetscVoidFunction)func,ctx); if (*ierr) return; 2598732526dSAlp Dener *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.mondestroy,(PetscVoidFunction)mondestroy,ctx); if (*ierr) return; 2608732526dSAlp Dener *ierr = TaoSetMonitor(*tao,ourtaomonitor,*tao,ourtaomondestroy); 261a7e14dcfSSatish Balay } 262a7e14dcfSSatish Balay 263db87b0f2SBarry Smith PETSC_EXTERN void PETSC_STDCALL taosetconvergencetest_(Tao *tao, void (PETSC_STDCALL *func)(Tao*,void*,PetscErrorCode*),void *ctx, PetscErrorCode *ierr) 264a7e14dcfSSatish Balay { 2658732526dSAlp Dener CHKFORTRANNULLFUNCTION(func); 2668732526dSAlp Dener *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.convtest,(PetscVoidFunction)func,ctx); 2678732526dSAlp Dener if(!*ierr) *ierr = TaoSetConvergenceTest(*tao,ourtaoconvergencetest,ctx); 268a7e14dcfSSatish Balay } 269a7e14dcfSSatish Balay 270db87b0f2SBarry Smith PETSC_EXTERN void PETSC_STDCALL taosetconstraintsroutine_(Tao *tao, Vec *C, void (PETSC_STDCALL *func)(Tao*, Vec *, Vec *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr) 271a7e14dcfSSatish Balay { 2728732526dSAlp Dener CHKFORTRANNULLFUNCTION(func); 2738732526dSAlp Dener *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.constraints,(PetscVoidFunction)func,ctx); 2748732526dSAlp Dener if(!*ierr) *ierr = TaoSetConstraintsRoutine(*tao,*C,ourtaoconstraintsroutine,ctx); 275a7e14dcfSSatish Balay } 276a7e14dcfSSatish Balay 277390e1bf2SBarry Smith PETSC_EXTERN void PETSC_STDCALL taosettype_(Tao *tao, char* type_name PETSC_MIXED_LEN(len), PetscErrorCode *ierr PETSC_END_LEN(len)) 278a7e14dcfSSatish Balay { 279a7e14dcfSSatish Balay char *t; 280a7e14dcfSSatish Balay 281a7e14dcfSSatish Balay FIXCHAR(type_name,len,t); 282d49bb8f9SBarry Smith *ierr = TaoSetType(*tao,t);if (*ierr) return; 283a7e14dcfSSatish Balay FREECHAR(type_name,t); 284a7e14dcfSSatish Balay 285a7e14dcfSSatish Balay } 286a7e14dcfSSatish Balay 287db87b0f2SBarry Smith PETSC_EXTERN void PETSC_STDCALL taoview_(Tao *tao, PetscViewer *viewer, PetscErrorCode *ierr) 288a7e14dcfSSatish Balay { 289a7e14dcfSSatish Balay PetscViewer v; 290a7e14dcfSSatish Balay PetscPatchDefaultViewers_Fortran(viewer,v); 291a7e14dcfSSatish Balay *ierr = TaoView(*tao,v); 292a7e14dcfSSatish Balay } 293a7e14dcfSSatish Balay 294db87b0f2SBarry Smith PETSC_EXTERN void PETSC_STDCALL taogetconvergencehistory_(Tao *tao, PetscInt *nhist, PetscErrorCode *ierr) 295a7e14dcfSSatish Balay { 296ae93cb3cSJason Sarich *ierr = TaoGetConvergenceHistory(*tao,NULL,NULL,NULL,NULL,nhist); 297a7e14dcfSSatish Balay } 298a7e14dcfSSatish Balay 299390e1bf2SBarry Smith PETSC_EXTERN void PETSC_STDCALL taogetoptionsprefix_(Tao *tao, char* prefix PETSC_MIXED_LEN(len), PetscErrorCode *ierr PETSC_END_LEN(len)) 300a7e14dcfSSatish Balay { 301a7e14dcfSSatish Balay const char *name; 302a7e14dcfSSatish Balay *ierr = TaoGetOptionsPrefix(*tao,&name); 303a7e14dcfSSatish Balay *ierr = PetscStrncpy(prefix,name,len); if (*ierr) return; 304a7e14dcfSSatish Balay FIXRETURNCHAR(PETSC_TRUE,prefix,len); 305a7e14dcfSSatish Balay 306a7e14dcfSSatish Balay } 307a7e14dcfSSatish Balay 308390e1bf2SBarry Smith PETSC_EXTERN void PETSC_STDCALL taoappendoptionsprefix_(Tao *tao, char* prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len)) 309a7e14dcfSSatish Balay { 310a7e14dcfSSatish Balay char *name; 311a7e14dcfSSatish Balay FIXCHAR(prefix,len,name); 312d49bb8f9SBarry Smith *ierr = TaoAppendOptionsPrefix(*tao,name);if (*ierr) return; 313a7e14dcfSSatish Balay FREECHAR(prefix,name); 314a7e14dcfSSatish Balay } 315a7e14dcfSSatish Balay 316390e1bf2SBarry Smith PETSC_EXTERN void PETSC_STDCALL taosetoptionsprefix_(Tao *tao, char* prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len)) 317a7e14dcfSSatish Balay { 318a7e14dcfSSatish Balay char *t; 319a7e14dcfSSatish Balay FIXCHAR(prefix,len,t); 320d49bb8f9SBarry Smith *ierr = TaoSetOptionsPrefix(*tao,t);if (*ierr) return; 321a7e14dcfSSatish Balay FREECHAR(prefix,t); 322a7e14dcfSSatish Balay } 323a7e14dcfSSatish Balay 324390e1bf2SBarry Smith PETSC_EXTERN void PETSC_STDCALL taogettype_(Tao *tao, char* name PETSC_MIXED_LEN(len), PetscErrorCode *ierr PETSC_END_LEN(len)) 325a7e14dcfSSatish Balay { 326a7e14dcfSSatish Balay const char *tname; 327a7e14dcfSSatish Balay *ierr = TaoGetType(*tao,&tname); 328a7e14dcfSSatish Balay *ierr = PetscStrncpy(name,tname,len); if (*ierr) return; 329a7e14dcfSSatish Balay FIXRETURNCHAR(PETSC_TRUE,name,len); 330a7e14dcfSSatish Balay 331a7e14dcfSSatish Balay } 332a7e14dcfSSatish Balay 333db87b0f2SBarry 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) 334a7e14dcfSSatish Balay { 3358732526dSAlp Dener CHKFORTRANNULLFUNCTION(func); 3368732526dSAlp Dener *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.jacineq,(PetscVoidFunction)func,ctx); 3378732526dSAlp Dener if(!*ierr) *ierr = TaoSetJacobianInequalityRoutine(*tao,*J,*Jp,ourtaojacobianinequalityroutine,ctx); 338a7e14dcfSSatish Balay } 339a7e14dcfSSatish Balay 340db87b0f2SBarry 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) 341a7e14dcfSSatish Balay { 3428732526dSAlp Dener CHKFORTRANNULLFUNCTION(func); 3438732526dSAlp Dener *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.jaceq,(PetscVoidFunction)func,ctx); 3448732526dSAlp Dener if(!*ierr) *ierr = TaoSetJacobianEqualityRoutine(*tao,*J,*Jp,ourtaojacobianequalityroutine,ctx); 345a7e14dcfSSatish Balay } 346a7e14dcfSSatish Balay 347db87b0f2SBarry Smith PETSC_EXTERN void PETSC_STDCALL taosetinequalityconstraintsroutine_(Tao *tao, Vec *C, void (PETSC_STDCALL *func)(Tao*, Vec *, Vec *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr) 348a7e14dcfSSatish Balay { 3498732526dSAlp Dener CHKFORTRANNULLFUNCTION(func); 3508732526dSAlp Dener *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.conineq,(PetscVoidFunction)func,ctx); 3518732526dSAlp Dener if(!*ierr) *ierr = TaoSetInequalityConstraintsRoutine(*tao,*C,ourtaoinequalityconstraintsroutine,ctx); 352a7e14dcfSSatish Balay } 353a7e14dcfSSatish Balay 354db87b0f2SBarry Smith PETSC_EXTERN void PETSC_STDCALL taosetequalityconstraintsroutine_(Tao *tao, Vec *C, void (PETSC_STDCALL *func)(Tao*, Vec *, Vec *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr) 355a7e14dcfSSatish Balay { 3568732526dSAlp Dener CHKFORTRANNULLFUNCTION(func); 3578732526dSAlp Dener *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.coneq,(PetscVoidFunction)func,ctx); 3588732526dSAlp Dener if(!*ierr) *ierr = TaoSetEqualityConstraintsRoutine(*tao, *C, ourtaoequalityconstraintsroutine,ctx); 359a7e14dcfSSatish Balay } 360a7e14dcfSSatish Balay 361e1e80dc8SAlp Dener PETSC_EXTERN void PETSC_STDCALL taosetupdate_(Tao *tao, void (PETSC_STDCALL *func)(Tao *, PetscInt *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr) 362e1e80dc8SAlp Dener { 363e1e80dc8SAlp Dener CHKFORTRANNULLFUNCTION(func); 364e1e80dc8SAlp Dener *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.update,(PetscVoidFunction)func,ctx); 365e1e80dc8SAlp Dener if(!*ierr) *ierr = TaoSetUpdate(*tao, ourtaoupdateroutine, ctx); 366e1e80dc8SAlp Dener } 367e1e80dc8SAlp Dener 368*fe2efc57SMark PETSC_EXTERN void PETSC_STDCALL taoviewfromoptions_(Tao *ao,PetscObject obj,char* type PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len)) 369*fe2efc57SMark { 370*fe2efc57SMark char *t; 371*fe2efc57SMark 372*fe2efc57SMark FIXCHAR(type,len,t); 373*fe2efc57SMark *ierr = TaoViewFromOptions(*ao,obj,t);if (*ierr) return; 374*fe2efc57SMark FREECHAR(type,t); 375*fe2efc57SMark } 376*fe2efc57SMark 377a7e14dcfSSatish Balay EXTERN_C_END 378a7e14dcfSSatish Balay 379a7e14dcfSSatish Balay 380