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 32fe2efc57SMark #define taoviewfromoptions_ TAOVIEWFROMOPTIONS 33*1fb7b255SJunchao Zhang #define taodestroy_ TAODESTROY 34a7e14dcfSSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE) 35a7e14dcfSSatish Balay 36a7e14dcfSSatish Balay #define taosetobjectiveroutine_ taosetobjectiveroutine 37a7e14dcfSSatish Balay #define taosetgradientroutine_ taosetgradientroutine 38a7e14dcfSSatish Balay #define taosetobjectiveandgradientroutine_ taosetobjectiveandgradientroutine 39a7e14dcfSSatish Balay #define taosethessianroutine_ taosethessianroutine 40737f463aSAlp Dener #define taosetresidualroutine_ taosetresidualroutine 414ffbe8acSAlp Dener #define taosetjacobianresidualroutine_ taosetjacobianresidualroutine 42a7e14dcfSSatish Balay #define taosetjacobianroutine_ taosetjacobianroutine 43a7e14dcfSSatish Balay #define taosetjacobianstateroutine_ taosetjacobianstateroutine 44a7e14dcfSSatish Balay #define taosetjacobiandesignroutine_ taosetjacobiandesignroutine 45a7e14dcfSSatish Balay #define taosetjacobianinequalityroutine_ taosetjacobianinequalityroutine 46a7e14dcfSSatish Balay #define taosetjacobianequalityroutine_ taosetjacobianequalityroutine 47a7e14dcfSSatish Balay #define taosetinequalityconstraintsroutine_ taosetinequalityconstraintsroutine 48a7e14dcfSSatish Balay #define taosetequalityconstraintsroutine_ taosetequalityconstraintsroutine 49a7e14dcfSSatish Balay #define taosetvariableboundsroutine_ taosetvariableboundsroutine 50a7e14dcfSSatish Balay #define taosetconstraintsroutine_ taosetconstraintsroutine 51a7e14dcfSSatish Balay #define taosetmonitor_ taosetmonitor 52a7e14dcfSSatish Balay #define taosettype_ taosettype 53a7e14dcfSSatish Balay #define taoview_ taoview 54ae93cb3cSJason Sarich #define taogetconvergencehistory_ taogetconvergencehistory 55a7e14dcfSSatish Balay #define taosetconvergencetest_ taosetconvergencetest 56a7e14dcfSSatish Balay #define taogetoptionsprefix_ taogetoptionsprefix 57a7e14dcfSSatish Balay #define taosetoptionsprefix_ taosetoptionsprefix 58a7e14dcfSSatish Balay #define taoappendoptionsprefix_ taoappendoptionsprefix 59a7e14dcfSSatish Balay #define taogettype_ taogettype 60e1e80dc8SAlp Dener #define taosetupdate_ taosetupdate 61fe2efc57SMark #define taoviewfromoptions_ taoviewfromoptions 62*1fb7b255SJunchao Zhang #define taodestroy_ taodestroy 63a7e14dcfSSatish Balay #endif 64a7e14dcfSSatish Balay 658732526dSAlp Dener static struct { 668732526dSAlp Dener PetscFortranCallbackId obj; 678732526dSAlp Dener PetscFortranCallbackId grad; 688732526dSAlp Dener PetscFortranCallbackId objgrad; 698732526dSAlp Dener PetscFortranCallbackId hess; 70737f463aSAlp Dener PetscFortranCallbackId lsres; 71737f463aSAlp Dener PetscFortranCallbackId lsjac; 728732526dSAlp Dener PetscFortranCallbackId jac; 738732526dSAlp Dener PetscFortranCallbackId jacstate; 748732526dSAlp Dener PetscFortranCallbackId jacdesign; 758732526dSAlp Dener PetscFortranCallbackId bounds; 768732526dSAlp Dener PetscFortranCallbackId mon; 778732526dSAlp Dener PetscFortranCallbackId mondestroy; 788732526dSAlp Dener PetscFortranCallbackId convtest; 798732526dSAlp Dener PetscFortranCallbackId constraints; 808732526dSAlp Dener PetscFortranCallbackId jacineq; 818732526dSAlp Dener PetscFortranCallbackId jaceq; 828732526dSAlp Dener PetscFortranCallbackId conineq; 838732526dSAlp Dener PetscFortranCallbackId coneq; 848732526dSAlp Dener PetscFortranCallbackId nfuncs; 85e1e80dc8SAlp Dener PetscFortranCallbackId update; 868732526dSAlp Dener #if defined(PETSC_HAVE_F90_2PTR_ARG) 878732526dSAlp Dener PetscFortranCallbackId function_pgiptr; 888732526dSAlp Dener #endif 898732526dSAlp Dener } _cb; 90a7e14dcfSSatish Balay 91441846f8SBarry Smith static PetscErrorCode ourtaoobjectiveroutine(Tao tao, Vec x, PetscReal *f, void *ctx) 92a7e14dcfSSatish Balay { 938732526dSAlp Dener PetscObjectUseFortranCallback(tao,_cb.obj,(Tao*,Vec*,PetscReal*,void*,PetscErrorCode*),(&tao,&x,f,_ctx,&ierr)); 94a7e14dcfSSatish Balay } 95a7e14dcfSSatish Balay 96441846f8SBarry Smith static PetscErrorCode ourtaogradientroutine(Tao tao, Vec x, Vec g, void *ctx) 97a7e14dcfSSatish Balay { 988732526dSAlp Dener PetscObjectUseFortranCallback(tao,_cb.grad,(Tao*,Vec*,Vec*,void*,PetscErrorCode*),(&tao,&x,&g,_ctx,&ierr)); 99a7e14dcfSSatish Balay } 100a7e14dcfSSatish Balay 101441846f8SBarry Smith static PetscErrorCode ourtaoobjectiveandgradientroutine(Tao tao, Vec x, PetscReal *f, Vec g, void* ctx) 102a7e14dcfSSatish Balay { 1038732526dSAlp Dener PetscObjectUseFortranCallback(tao,_cb.objgrad,(Tao*,Vec*,PetscReal*,Vec*,void*,PetscErrorCode*),(&tao,&x,f,&g,_ctx,&ierr)); 104a7e14dcfSSatish Balay } 105a7e14dcfSSatish Balay 106ffad9901SBarry Smith static PetscErrorCode ourtaohessianroutine(Tao tao, Vec x, Mat H, Mat Hpre, void *ctx) 107a7e14dcfSSatish Balay { 1088732526dSAlp Dener PetscObjectUseFortranCallback(tao,_cb.hess,(Tao*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),(&tao,&x,&H,&Hpre,_ctx,&ierr)); 109a7e14dcfSSatish Balay } 110a7e14dcfSSatish Balay 111ffad9901SBarry Smith static PetscErrorCode ourtaojacobianroutine(Tao tao, Vec x, Mat H, Mat Hpre, void *ctx) 112a7e14dcfSSatish Balay { 1138732526dSAlp Dener PetscObjectUseFortranCallback(tao,_cb.jac,(Tao*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),(&tao,&x,&H,&Hpre,_ctx,&ierr)); 114a7e14dcfSSatish Balay } 115a7e14dcfSSatish Balay 116ffad9901SBarry Smith static PetscErrorCode ourtaojacobianstateroutine(Tao tao, Vec x, Mat H, Mat Hpre, Mat Hinv, void *ctx) 117a7e14dcfSSatish Balay { 1188732526dSAlp Dener PetscObjectUseFortranCallback(tao,_cb.jacstate,(Tao*,Vec*,Mat*,Mat*,Mat*,void*,PetscErrorCode*),(&tao,&x,&H,&Hpre,&Hinv,_ctx,&ierr)); 119a7e14dcfSSatish Balay } 120a7e14dcfSSatish Balay 12194ab13aaSBarry Smith static PetscErrorCode ourtaojacobiandesignroutine(Tao tao, Vec x, Mat H, void *ctx) 122a7e14dcfSSatish Balay { 1238732526dSAlp Dener PetscObjectUseFortranCallback(tao,_cb.jacdesign,(Tao*,Vec*,Mat*,void*,PetscErrorCode*),(&tao,&x,&H,_ctx,&ierr)); 124a7e14dcfSSatish Balay } 125a7e14dcfSSatish Balay 126441846f8SBarry Smith static PetscErrorCode ourtaoboundsroutine(Tao tao, Vec xl, Vec xu, void *ctx) 127a7e14dcfSSatish Balay { 1288732526dSAlp Dener PetscObjectUseFortranCallback(tao,_cb.bounds,(Tao*,Vec*,Vec*,void*,PetscErrorCode*),(&tao,&xl,&xu,_ctx,&ierr)); 129a7e14dcfSSatish Balay } 130737f463aSAlp Dener static PetscErrorCode ourtaoresidualroutine(Tao tao, Vec x, Vec f, void *ctx) 131a7e14dcfSSatish Balay { 132737f463aSAlp Dener PetscObjectUseFortranCallback(tao,_cb.lsres,(Tao*,Vec*,Vec*,void*,PetscErrorCode*),(&tao,&x,&f,_ctx,&ierr)); 133737f463aSAlp Dener } 134737f463aSAlp Dener 1354ffbe8acSAlp Dener static PetscErrorCode ourtaojacobianresidualroutine(Tao tao, Vec x, Mat J, Mat Jpre, void *ctx) 136737f463aSAlp Dener { 137737f463aSAlp Dener PetscObjectUseFortranCallback(tao,_cb.lsjac,(Tao*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),(&tao,&x,&J,&Jpre,_ctx,&ierr)); 138a7e14dcfSSatish Balay } 139a7e14dcfSSatish Balay 140441846f8SBarry Smith static PetscErrorCode ourtaomonitor(Tao tao, void *ctx) 141a7e14dcfSSatish Balay { 1428732526dSAlp Dener PetscObjectUseFortranCallback(tao,_cb.mon,(Tao *,void*,PetscErrorCode*),(&tao,_ctx,&ierr)); 143a7e14dcfSSatish Balay } 144a7e14dcfSSatish Balay 145a7e14dcfSSatish Balay static PetscErrorCode ourtaomondestroy(void **ctx) 146a7e14dcfSSatish Balay { 1478732526dSAlp Dener Tao tao = (Tao)*ctx; 1488732526dSAlp Dener PetscObjectUseFortranCallback(tao,_cb.mondestroy,(void*,PetscErrorCode*),(_ctx,&ierr)); 149a7e14dcfSSatish Balay } 150441846f8SBarry Smith static PetscErrorCode ourtaoconvergencetest(Tao tao, void *ctx) 151a7e14dcfSSatish Balay { 1528732526dSAlp Dener PetscObjectUseFortranCallback(tao,_cb.convtest,(Tao *,void*,PetscErrorCode*),(&tao,_ctx,&ierr)); 153a7e14dcfSSatish Balay } 154a7e14dcfSSatish Balay 155441846f8SBarry Smith static PetscErrorCode ourtaoconstraintsroutine(Tao tao, Vec x, Vec c, void *ctx) 156a7e14dcfSSatish Balay { 1578732526dSAlp Dener PetscObjectUseFortranCallback(tao,_cb.constraints,(Tao*,Vec*,Vec*,void*,PetscErrorCode*),(&tao,&x,&c,_ctx,&ierr)); 158a7e14dcfSSatish Balay } 159a7e14dcfSSatish Balay 160ffad9901SBarry Smith static PetscErrorCode ourtaojacobianinequalityroutine(Tao tao, Vec x, Mat J, Mat Jpre, void *ctx) 161a7e14dcfSSatish Balay { 1628732526dSAlp Dener PetscObjectUseFortranCallback(tao,_cb.jacineq,(Tao*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),(&tao,&x,&J,&Jpre,_ctx,&ierr)); 163a7e14dcfSSatish Balay } 164a7e14dcfSSatish Balay 165ffad9901SBarry Smith static PetscErrorCode ourtaojacobianequalityroutine(Tao tao, Vec x, Mat J, Mat Jpre, void *ctx) 166a7e14dcfSSatish Balay { 1678732526dSAlp Dener PetscObjectUseFortranCallback(tao,_cb.jaceq,(Tao*,Vec*,Mat*,Mat*,void*,PetscErrorCode*),(&tao,&x,&J,&Jpre,_ctx,&ierr)); 168a7e14dcfSSatish Balay } 169a7e14dcfSSatish Balay 170441846f8SBarry Smith static PetscErrorCode ourtaoinequalityconstraintsroutine(Tao tao, Vec x, Vec c, void *ctx) 171a7e14dcfSSatish Balay { 1728732526dSAlp Dener PetscObjectUseFortranCallback(tao,_cb.conineq,(Tao*,Vec*,Vec*,void*,PetscErrorCode*),(&tao,&x,&c,_ctx,&ierr)); 173a7e14dcfSSatish Balay } 174a7e14dcfSSatish Balay 175441846f8SBarry Smith static PetscErrorCode ourtaoequalityconstraintsroutine(Tao tao, Vec x, Vec c, void *ctx) 176a7e14dcfSSatish Balay { 1778732526dSAlp Dener PetscObjectUseFortranCallback(tao,_cb.coneq,(Tao*,Vec*,Vec*,void*,PetscErrorCode*),(&tao,&x,&c,_ctx,&ierr)); 178a7e14dcfSSatish Balay } 179a7e14dcfSSatish Balay 1808fcddce6SStefano Zampini static PetscErrorCode ourtaoupdateroutine(Tao tao, PetscInt iter, void *ctx) 181e1e80dc8SAlp Dener { 1828fcddce6SStefano Zampini PetscObjectUseFortranCallback(tao,_cb.update,(Tao*,PetscInt*,void*),(&tao,&iter,_ctx)); 183e1e80dc8SAlp Dener } 184e1e80dc8SAlp Dener 185a7e14dcfSSatish Balay EXTERN_C_BEGIN 186a7e14dcfSSatish Balay 18719caf8f3SSatish Balay PETSC_EXTERN void taosetobjectiveroutine_(Tao *tao, void (*func)(Tao*, Vec *, PetscReal *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr) 188a7e14dcfSSatish Balay { 1898732526dSAlp Dener CHKFORTRANNULLFUNCTION(func); 1908732526dSAlp Dener *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.obj,(PetscVoidFunction)func,ctx); 1918732526dSAlp Dener if (!*ierr) *ierr = TaoSetObjectiveRoutine(*tao,ourtaoobjectiveroutine,ctx); 192a7e14dcfSSatish Balay } 193a7e14dcfSSatish Balay 19419caf8f3SSatish Balay PETSC_EXTERN void taosetgradientroutine_(Tao *tao, void (*func)(Tao*, Vec *, Vec *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr) 195a7e14dcfSSatish Balay { 1968732526dSAlp Dener CHKFORTRANNULLFUNCTION(func); 1978732526dSAlp Dener *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.grad,(PetscVoidFunction)func,ctx); 1988732526dSAlp Dener if (!*ierr) *ierr = TaoSetGradientRoutine(*tao,ourtaogradientroutine,ctx); 199a7e14dcfSSatish Balay } 200a7e14dcfSSatish Balay 20119caf8f3SSatish Balay PETSC_EXTERN void taosetobjectiveandgradientroutine_(Tao *tao, void (*func)(Tao*, Vec *, PetscReal *, Vec *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr) 202a7e14dcfSSatish Balay { 2038732526dSAlp Dener CHKFORTRANNULLFUNCTION(func); 2048732526dSAlp Dener *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.objgrad,(PetscVoidFunction)func,ctx); 2058732526dSAlp Dener if (!*ierr) *ierr = TaoSetObjectiveAndGradientRoutine(*tao,ourtaoobjectiveandgradientroutine,ctx); 206a7e14dcfSSatish Balay } 207a7e14dcfSSatish Balay 20819caf8f3SSatish Balay PETSC_EXTERN void taosetresidualroutine_(Tao *tao, Vec *F, void (*func)(Tao*, Vec *, Vec *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr) 209a7e14dcfSSatish Balay { 2108732526dSAlp Dener CHKFORTRANNULLFUNCTION(func); 211737f463aSAlp Dener *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.lsres,(PetscVoidFunction)func,ctx); 212737f463aSAlp Dener if (!*ierr) *ierr = TaoSetResidualRoutine(*tao,*F,ourtaoresidualroutine,ctx); 213737f463aSAlp Dener } 214737f463aSAlp Dener 21519caf8f3SSatish Balay PETSC_EXTERN void taosetjacobianresidualroutine_(Tao *tao, Mat *J, Mat *Jpre, void (*func)(Tao*, Vec *, Mat *, Mat *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr) 216737f463aSAlp Dener { 217737f463aSAlp Dener CHKFORTRANNULLFUNCTION(func); 218737f463aSAlp Dener *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.lsjac,(PetscVoidFunction)func,ctx); 2194ffbe8acSAlp Dener if (!*ierr) *ierr = TaoSetJacobianResidualRoutine(*tao,*J,*Jpre,ourtaojacobianresidualroutine,ctx); 220a7e14dcfSSatish Balay } 221a7e14dcfSSatish Balay 22219caf8f3SSatish Balay PETSC_EXTERN void taosetjacobianroutine_(Tao *tao, Mat *J, Mat *Jp, void (*func)(Tao*, Vec *, Mat *, Mat *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr) 223a7e14dcfSSatish Balay { 2248732526dSAlp Dener CHKFORTRANNULLFUNCTION(func); 2258732526dSAlp Dener *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.jac,(PetscVoidFunction)func,ctx); 2268732526dSAlp Dener if (!*ierr) *ierr = TaoSetJacobianRoutine(*tao,*J,*Jp,ourtaojacobianroutine,ctx); 227a7e14dcfSSatish Balay } 228a7e14dcfSSatish Balay 22919caf8f3SSatish Balay PETSC_EXTERN void taosetjacobianstateroutine_(Tao *tao, Mat *J, Mat *Jp, Mat*Jinv, void (*func)(Tao*, Vec *, Mat *, Mat *, Mat*, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr) 230a7e14dcfSSatish Balay { 2318732526dSAlp Dener CHKFORTRANNULLFUNCTION(func); 2328732526dSAlp Dener *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.jacstate,(PetscVoidFunction)func,ctx); 2338732526dSAlp Dener if (!*ierr) *ierr = TaoSetJacobianStateRoutine(*tao,*J,*Jp,*Jinv,ourtaojacobianstateroutine,ctx); 234a7e14dcfSSatish Balay } 235a7e14dcfSSatish Balay 23619caf8f3SSatish Balay PETSC_EXTERN void taosetjacobiandesignroutine_(Tao *tao, Mat *J, void (*func)(Tao*, Vec *, Mat *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr) 237a7e14dcfSSatish Balay { 2388732526dSAlp Dener CHKFORTRANNULLFUNCTION(func); 2398732526dSAlp Dener *ierr = PetscObjectSetFortranCallback((PetscObject)tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.jacdesign,(PetscVoidFunction)func,ctx); 2408732526dSAlp Dener if (!*ierr) *ierr = TaoSetJacobianDesignRoutine(*tao,*J,ourtaojacobiandesignroutine,ctx); 241a7e14dcfSSatish Balay } 242a7e14dcfSSatish Balay 24319caf8f3SSatish Balay PETSC_EXTERN void taosethessianroutine_(Tao *tao, Mat *J, Mat *Jp, void (*func)(Tao*, Vec *, Mat *, Mat *,void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr) 244a7e14dcfSSatish Balay { 2458732526dSAlp Dener CHKFORTRANNULLFUNCTION(func); 2468732526dSAlp Dener *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.hess,(PetscVoidFunction)func,ctx); 2478732526dSAlp Dener if (!*ierr) *ierr = TaoSetHessianRoutine(*tao,*J, *Jp, ourtaohessianroutine,ctx); 248a7e14dcfSSatish Balay } 249a7e14dcfSSatish Balay 25019caf8f3SSatish Balay PETSC_EXTERN void taosetvariableboundsroutine_(Tao *tao, void (*func)(Tao*,Vec*,Vec*,void*,PetscErrorCode*),void *ctx, PetscErrorCode *ierr) 251a7e14dcfSSatish Balay { 2528732526dSAlp Dener CHKFORTRANNULLFUNCTION(func); 2538732526dSAlp Dener *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.bounds,(PetscVoidFunction)func,ctx); 2548732526dSAlp Dener if (!*ierr) *ierr = TaoSetVariableBoundsRoutine(*tao,ourtaoboundsroutine,ctx); 255a7e14dcfSSatish Balay } 256a7e14dcfSSatish Balay 25719caf8f3SSatish Balay PETSC_EXTERN void taosetmonitor_(Tao *tao, void (*func)(Tao*,void*,PetscErrorCode*),void *ctx, void (*mondestroy)(void*,PetscErrorCode*),PetscErrorCode *ierr) 258a7e14dcfSSatish Balay { 259aecf964fSBarry Smith CHKFORTRANNULLFUNCTION(mondestroy); 2608732526dSAlp Dener *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.mon,(PetscVoidFunction)func,ctx); if (*ierr) return; 2618732526dSAlp Dener *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.mondestroy,(PetscVoidFunction)mondestroy,ctx); if (*ierr) return; 2628732526dSAlp Dener *ierr = TaoSetMonitor(*tao,ourtaomonitor,*tao,ourtaomondestroy); 263a7e14dcfSSatish Balay } 264a7e14dcfSSatish Balay 26519caf8f3SSatish Balay PETSC_EXTERN void taosetconvergencetest_(Tao *tao, void (*func)(Tao*,void*,PetscErrorCode*),void *ctx, PetscErrorCode *ierr) 266a7e14dcfSSatish Balay { 2678732526dSAlp Dener CHKFORTRANNULLFUNCTION(func); 2688732526dSAlp Dener *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.convtest,(PetscVoidFunction)func,ctx); 2698732526dSAlp Dener if (!*ierr) *ierr = TaoSetConvergenceTest(*tao,ourtaoconvergencetest,ctx); 270a7e14dcfSSatish Balay } 271a7e14dcfSSatish Balay 27219caf8f3SSatish Balay PETSC_EXTERN void taosetconstraintsroutine_(Tao *tao, Vec *C, void (*func)(Tao*, Vec *, Vec *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr) 273a7e14dcfSSatish Balay { 2748732526dSAlp Dener CHKFORTRANNULLFUNCTION(func); 2758732526dSAlp Dener *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.constraints,(PetscVoidFunction)func,ctx); 2768732526dSAlp Dener if (!*ierr) *ierr = TaoSetConstraintsRoutine(*tao,*C,ourtaoconstraintsroutine,ctx); 277a7e14dcfSSatish Balay } 278a7e14dcfSSatish Balay 27919caf8f3SSatish Balay PETSC_EXTERN void taosettype_(Tao *tao, char* type_name, PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len) 280a7e14dcfSSatish Balay { 281a7e14dcfSSatish Balay char *t; 282a7e14dcfSSatish Balay 283a7e14dcfSSatish Balay FIXCHAR(type_name,len,t); 284d49bb8f9SBarry Smith *ierr = TaoSetType(*tao,t);if (*ierr) return; 285a7e14dcfSSatish Balay FREECHAR(type_name,t); 286a7e14dcfSSatish Balay 287a7e14dcfSSatish Balay } 288a7e14dcfSSatish Balay 28919caf8f3SSatish Balay PETSC_EXTERN void taoview_(Tao *tao, PetscViewer *viewer, PetscErrorCode *ierr) 290a7e14dcfSSatish Balay { 291a7e14dcfSSatish Balay PetscViewer v; 292a7e14dcfSSatish Balay PetscPatchDefaultViewers_Fortran(viewer,v); 293a7e14dcfSSatish Balay *ierr = TaoView(*tao,v); 294a7e14dcfSSatish Balay } 295a7e14dcfSSatish Balay 29619caf8f3SSatish Balay PETSC_EXTERN void taogetconvergencehistory_(Tao *tao, PetscInt *nhist, PetscErrorCode *ierr) 297a7e14dcfSSatish Balay { 298ae93cb3cSJason Sarich *ierr = TaoGetConvergenceHistory(*tao,NULL,NULL,NULL,NULL,nhist); 299a7e14dcfSSatish Balay } 300a7e14dcfSSatish Balay 30119caf8f3SSatish Balay PETSC_EXTERN void taogetoptionsprefix_(Tao *tao, char* prefix, PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len) 302a7e14dcfSSatish Balay { 303a7e14dcfSSatish Balay const char *name; 304a7e14dcfSSatish Balay *ierr = TaoGetOptionsPrefix(*tao,&name); 305a7e14dcfSSatish Balay *ierr = PetscStrncpy(prefix,name,len); if (*ierr) return; 306a7e14dcfSSatish Balay FIXRETURNCHAR(PETSC_TRUE,prefix,len); 307a7e14dcfSSatish Balay 308a7e14dcfSSatish Balay } 309a7e14dcfSSatish Balay 31019caf8f3SSatish Balay PETSC_EXTERN void taoappendoptionsprefix_(Tao *tao, char* prefix,PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len) 311a7e14dcfSSatish Balay { 312a7e14dcfSSatish Balay char *name; 313a7e14dcfSSatish Balay FIXCHAR(prefix,len,name); 314d49bb8f9SBarry Smith *ierr = TaoAppendOptionsPrefix(*tao,name);if (*ierr) return; 315a7e14dcfSSatish Balay FREECHAR(prefix,name); 316a7e14dcfSSatish Balay } 317a7e14dcfSSatish Balay 31819caf8f3SSatish Balay PETSC_EXTERN void taosetoptionsprefix_(Tao *tao, char* prefix,PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len) 319a7e14dcfSSatish Balay { 320a7e14dcfSSatish Balay char *t; 321a7e14dcfSSatish Balay FIXCHAR(prefix,len,t); 322d49bb8f9SBarry Smith *ierr = TaoSetOptionsPrefix(*tao,t);if (*ierr) return; 323a7e14dcfSSatish Balay FREECHAR(prefix,t); 324a7e14dcfSSatish Balay } 325a7e14dcfSSatish Balay 32619caf8f3SSatish Balay PETSC_EXTERN void taogettype_(Tao *tao, char* name, PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len) 327a7e14dcfSSatish Balay { 328a7e14dcfSSatish Balay const char *tname; 329a7e14dcfSSatish Balay *ierr = TaoGetType(*tao,&tname); 330a7e14dcfSSatish Balay *ierr = PetscStrncpy(name,tname,len); if (*ierr) return; 331a7e14dcfSSatish Balay FIXRETURNCHAR(PETSC_TRUE,name,len); 332a7e14dcfSSatish Balay 333a7e14dcfSSatish Balay } 334a7e14dcfSSatish Balay 33519caf8f3SSatish Balay PETSC_EXTERN void taosetjacobianinequalityroutine_(Tao *tao, Mat *J, Mat *Jp, void (*func)(Tao*, Vec *, Mat *, Mat *,void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr) 336a7e14dcfSSatish Balay { 3378732526dSAlp Dener CHKFORTRANNULLFUNCTION(func); 3388732526dSAlp Dener *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.jacineq,(PetscVoidFunction)func,ctx); 3398732526dSAlp Dener if (!*ierr) *ierr = TaoSetJacobianInequalityRoutine(*tao,*J,*Jp,ourtaojacobianinequalityroutine,ctx); 340a7e14dcfSSatish Balay } 341a7e14dcfSSatish Balay 34219caf8f3SSatish Balay PETSC_EXTERN void taosetjacobianequalityroutine_(Tao *tao, Mat *J, Mat *Jp, void (*func)(Tao*, Vec *, Mat *, Mat *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr) 343a7e14dcfSSatish Balay { 3448732526dSAlp Dener CHKFORTRANNULLFUNCTION(func); 3458732526dSAlp Dener *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.jaceq,(PetscVoidFunction)func,ctx); 3468732526dSAlp Dener if (!*ierr) *ierr = TaoSetJacobianEqualityRoutine(*tao,*J,*Jp,ourtaojacobianequalityroutine,ctx); 347a7e14dcfSSatish Balay } 348a7e14dcfSSatish Balay 34919caf8f3SSatish Balay PETSC_EXTERN void taosetinequalityconstraintsroutine_(Tao *tao, Vec *C, void (*func)(Tao*, Vec *, Vec *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr) 350a7e14dcfSSatish Balay { 3518732526dSAlp Dener CHKFORTRANNULLFUNCTION(func); 3528732526dSAlp Dener *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.conineq,(PetscVoidFunction)func,ctx); 3538732526dSAlp Dener if (!*ierr) *ierr = TaoSetInequalityConstraintsRoutine(*tao,*C,ourtaoinequalityconstraintsroutine,ctx); 354a7e14dcfSSatish Balay } 355a7e14dcfSSatish Balay 35619caf8f3SSatish Balay PETSC_EXTERN void taosetequalityconstraintsroutine_(Tao *tao, Vec *C, void (*func)(Tao*, Vec *, Vec *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr) 357a7e14dcfSSatish Balay { 3588732526dSAlp Dener CHKFORTRANNULLFUNCTION(func); 3598732526dSAlp Dener *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.coneq,(PetscVoidFunction)func,ctx); 3608732526dSAlp Dener if (!*ierr) *ierr = TaoSetEqualityConstraintsRoutine(*tao, *C, ourtaoequalityconstraintsroutine,ctx); 361a7e14dcfSSatish Balay } 362a7e14dcfSSatish Balay 36319caf8f3SSatish Balay PETSC_EXTERN void taosetupdate_(Tao *tao, void (*func)(Tao *, PetscInt *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr) 364e1e80dc8SAlp Dener { 365e1e80dc8SAlp Dener CHKFORTRANNULLFUNCTION(func); 366e1e80dc8SAlp Dener *ierr = PetscObjectSetFortranCallback((PetscObject)*tao,PETSC_FORTRAN_CALLBACK_CLASS,&_cb.update,(PetscVoidFunction)func,ctx); 367e1e80dc8SAlp Dener if (!*ierr) *ierr = TaoSetUpdate(*tao, ourtaoupdateroutine, ctx); 368e1e80dc8SAlp Dener } 369e1e80dc8SAlp Dener 37019caf8f3SSatish Balay PETSC_EXTERN void taoviewfromoptions_(Tao *ao,PetscObject obj,char* type,PetscErrorCode *ierr,PETSC_FORTRAN_CHARLEN_T len) 371fe2efc57SMark { 372fe2efc57SMark char *t; 373fe2efc57SMark 374fe2efc57SMark FIXCHAR(type,len,t); 375b14c0cbaSBlaise Bourdin CHKFORTRANNULLOBJECT(obj); 376fe2efc57SMark *ierr = TaoViewFromOptions(*ao,obj,t);if (*ierr) return; 377fe2efc57SMark FREECHAR(type,t); 378fe2efc57SMark } 379fe2efc57SMark 380*1fb7b255SJunchao Zhang PETSC_EXTERN void taodestroy_(Tao *x,int *ierr) 381*1fb7b255SJunchao Zhang { 382*1fb7b255SJunchao Zhang PETSC_FORTRAN_OBJECT_F_DESTROYED_TO_C_NULL(x); 383*1fb7b255SJunchao Zhang *ierr = TaoDestroy(x); if (*ierr) return; 384*1fb7b255SJunchao Zhang PETSC_FORTRAN_OBJECT_C_NULL_TO_F_DESTROYED(x); 385*1fb7b255SJunchao Zhang } 386*1fb7b255SJunchao Zhang 387a7e14dcfSSatish Balay EXTERN_C_END 388a7e14dcfSSatish Balay 389a7e14dcfSSatish Balay 390