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 #if defined(PETSC_HAVE_FORTRAN_CAPS) 6a82e8c82SStefano Zampini #define taosetobjective_ TAOSETOBJECTIVE 7a82e8c82SStefano Zampini #define taosetgradient_ TAOSETGRADIENT 8a82e8c82SStefano Zampini #define taosetobjectiveandgradient_ TAOSETOBJECTIVEANDGRADIENT 9a82e8c82SStefano Zampini #define taosethessian_ TAOSETHESSIAN 10737f463aSAlp Dener #define taosetresidualroutine_ TAOSETRESIDUALROUTINE 114ffbe8acSAlp Dener #define taosetjacobianresidualroutine_ TAOSETJACOBIANRESIDUALROUTINE 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 30e1e80dc8SAlp Dener #define taosetupdate_ TAOSETUPDATE 31fe2efc57SMark #define taoviewfromoptions_ TAOVIEWFROMOPTIONS 321fb7b255SJunchao Zhang #define taodestroy_ TAODESTROY 33a7e14dcfSSatish Balay #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE) 34a82e8c82SStefano Zampini #define taosetobjective_ taosetobjective 35a82e8c82SStefano Zampini #define taosetgradient_ taosetgradient 36a82e8c82SStefano Zampini #define taosetobjectiveandgradient_ taosetobjectiveandgradient 37a82e8c82SStefano Zampini #define taosethessian_ taosethessian 38737f463aSAlp Dener #define taosetresidualroutine_ taosetresidualroutine 394ffbe8acSAlp Dener #define taosetjacobianresidualroutine_ taosetjacobianresidualroutine 40a7e14dcfSSatish Balay #define taosetjacobianroutine_ taosetjacobianroutine 41a7e14dcfSSatish Balay #define taosetjacobianstateroutine_ taosetjacobianstateroutine 42a7e14dcfSSatish Balay #define taosetjacobiandesignroutine_ taosetjacobiandesignroutine 43a7e14dcfSSatish Balay #define taosetjacobianinequalityroutine_ taosetjacobianinequalityroutine 44a7e14dcfSSatish Balay #define taosetjacobianequalityroutine_ taosetjacobianequalityroutine 45a7e14dcfSSatish Balay #define taosetinequalityconstraintsroutine_ taosetinequalityconstraintsroutine 46a7e14dcfSSatish Balay #define taosetequalityconstraintsroutine_ taosetequalityconstraintsroutine 47a7e14dcfSSatish Balay #define taosetvariableboundsroutine_ taosetvariableboundsroutine 48a7e14dcfSSatish Balay #define taosetconstraintsroutine_ taosetconstraintsroutine 49a7e14dcfSSatish Balay #define taosetmonitor_ taosetmonitor 50a7e14dcfSSatish Balay #define taosettype_ taosettype 51a7e14dcfSSatish Balay #define taoview_ taoview 52ae93cb3cSJason Sarich #define taogetconvergencehistory_ taogetconvergencehistory 53a7e14dcfSSatish Balay #define taosetconvergencetest_ taosetconvergencetest 54a7e14dcfSSatish Balay #define taogetoptionsprefix_ taogetoptionsprefix 55a7e14dcfSSatish Balay #define taosetoptionsprefix_ taosetoptionsprefix 56a7e14dcfSSatish Balay #define taoappendoptionsprefix_ taoappendoptionsprefix 57a7e14dcfSSatish Balay #define taogettype_ taogettype 58e1e80dc8SAlp Dener #define taosetupdate_ taosetupdate 59fe2efc57SMark #define taoviewfromoptions_ taoviewfromoptions 601fb7b255SJunchao Zhang #define taodestroy_ taodestroy 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 185a82e8c82SStefano Zampini PETSC_EXTERN void taosetobjective_(Tao *tao, void (*func)(Tao *, Vec *, PetscReal *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr) 186a7e14dcfSSatish Balay { 1878732526dSAlp Dener CHKFORTRANNULLFUNCTION(func); 188*8434afd1SBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*tao, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.obj, (PetscVoidFn *)func, ctx); 189a82e8c82SStefano Zampini if (!*ierr) *ierr = TaoSetObjective(*tao, ourtaoobjectiveroutine, ctx); 190a7e14dcfSSatish Balay } 191a7e14dcfSSatish Balay 192a82e8c82SStefano Zampini PETSC_EXTERN void taosetgradient_(Tao *tao, Vec *g, void (*func)(Tao *, Vec *, Vec *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr) 193a7e14dcfSSatish Balay { 1948732526dSAlp Dener CHKFORTRANNULLFUNCTION(func); 195*8434afd1SBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*tao, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.grad, (PetscVoidFn *)func, ctx); 196a82e8c82SStefano Zampini if (!*ierr) *ierr = TaoSetGradient(*tao, *g, ourtaogradientroutine, ctx); 197a7e14dcfSSatish Balay } 198a7e14dcfSSatish Balay 199a82e8c82SStefano Zampini PETSC_EXTERN void taosetobjectiveandgradient_(Tao *tao, Vec *g, void (*func)(Tao *, Vec *, PetscReal *, Vec *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr) 200a7e14dcfSSatish Balay { 2018732526dSAlp Dener CHKFORTRANNULLFUNCTION(func); 202*8434afd1SBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*tao, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.objgrad, (PetscVoidFn *)func, ctx); 203a82e8c82SStefano Zampini if (!*ierr) *ierr = TaoSetObjectiveAndGradient(*tao, *g, ourtaoobjectiveandgradientroutine, ctx); 204a82e8c82SStefano Zampini } 205a82e8c82SStefano Zampini 206a82e8c82SStefano Zampini PETSC_EXTERN void taosethessian_(Tao *tao, Mat *J, Mat *Jp, void (*func)(Tao *, Vec *, Mat *, Mat *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr) 207a82e8c82SStefano Zampini { 208a82e8c82SStefano Zampini CHKFORTRANNULLFUNCTION(func); 209*8434afd1SBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*tao, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.hess, (PetscVoidFn *)func, ctx); 210a82e8c82SStefano Zampini if (!*ierr) *ierr = TaoSetHessian(*tao, *J, *Jp, ourtaohessianroutine, ctx); 211a7e14dcfSSatish Balay } 212a7e14dcfSSatish Balay 21319caf8f3SSatish Balay PETSC_EXTERN void taosetresidualroutine_(Tao *tao, Vec *F, void (*func)(Tao *, Vec *, Vec *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr) 214a7e14dcfSSatish Balay { 2158732526dSAlp Dener CHKFORTRANNULLFUNCTION(func); 216*8434afd1SBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*tao, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.lsres, (PetscVoidFn *)func, ctx); 217737f463aSAlp Dener if (!*ierr) *ierr = TaoSetResidualRoutine(*tao, *F, ourtaoresidualroutine, ctx); 218737f463aSAlp Dener } 219737f463aSAlp Dener 22019caf8f3SSatish Balay PETSC_EXTERN void taosetjacobianresidualroutine_(Tao *tao, Mat *J, Mat *Jpre, void (*func)(Tao *, Vec *, Mat *, Mat *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr) 221737f463aSAlp Dener { 222737f463aSAlp Dener CHKFORTRANNULLFUNCTION(func); 223*8434afd1SBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*tao, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.lsjac, (PetscVoidFn *)func, ctx); 2244ffbe8acSAlp Dener if (!*ierr) *ierr = TaoSetJacobianResidualRoutine(*tao, *J, *Jpre, ourtaojacobianresidualroutine, ctx); 225a7e14dcfSSatish Balay } 226a7e14dcfSSatish Balay 22719caf8f3SSatish Balay PETSC_EXTERN void taosetjacobianroutine_(Tao *tao, Mat *J, Mat *Jp, void (*func)(Tao *, Vec *, Mat *, Mat *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr) 228a7e14dcfSSatish Balay { 2298732526dSAlp Dener CHKFORTRANNULLFUNCTION(func); 230*8434afd1SBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*tao, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.jac, (PetscVoidFn *)func, ctx); 2318732526dSAlp Dener if (!*ierr) *ierr = TaoSetJacobianRoutine(*tao, *J, *Jp, ourtaojacobianroutine, ctx); 232a7e14dcfSSatish Balay } 233a7e14dcfSSatish Balay 23419caf8f3SSatish 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) 235a7e14dcfSSatish Balay { 2368732526dSAlp Dener CHKFORTRANNULLFUNCTION(func); 237*8434afd1SBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*tao, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.jacstate, (PetscVoidFn *)func, ctx); 2388732526dSAlp Dener if (!*ierr) *ierr = TaoSetJacobianStateRoutine(*tao, *J, *Jp, *Jinv, ourtaojacobianstateroutine, ctx); 239a7e14dcfSSatish Balay } 240a7e14dcfSSatish Balay 24119caf8f3SSatish Balay PETSC_EXTERN void taosetjacobiandesignroutine_(Tao *tao, Mat *J, void (*func)(Tao *, Vec *, Mat *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr) 242a7e14dcfSSatish Balay { 2438732526dSAlp Dener CHKFORTRANNULLFUNCTION(func); 244*8434afd1SBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)tao, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.jacdesign, (PetscVoidFn *)func, ctx); 2458732526dSAlp Dener if (!*ierr) *ierr = TaoSetJacobianDesignRoutine(*tao, *J, ourtaojacobiandesignroutine, ctx); 246a7e14dcfSSatish Balay } 247a7e14dcfSSatish Balay 24819caf8f3SSatish Balay PETSC_EXTERN void taosetvariableboundsroutine_(Tao *tao, void (*func)(Tao *, Vec *, Vec *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr) 249a7e14dcfSSatish Balay { 2508732526dSAlp Dener CHKFORTRANNULLFUNCTION(func); 251*8434afd1SBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*tao, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.bounds, (PetscVoidFn *)func, ctx); 2528732526dSAlp Dener if (!*ierr) *ierr = TaoSetVariableBoundsRoutine(*tao, ourtaoboundsroutine, ctx); 253a7e14dcfSSatish Balay } 254a7e14dcfSSatish Balay 25519caf8f3SSatish Balay PETSC_EXTERN void taosetmonitor_(Tao *tao, void (*func)(Tao *, void *, PetscErrorCode *), void *ctx, void (*mondestroy)(void *, PetscErrorCode *), PetscErrorCode *ierr) 256a7e14dcfSSatish Balay { 257aecf964fSBarry Smith CHKFORTRANNULLFUNCTION(mondestroy); 258*8434afd1SBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*tao, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.mon, (PetscVoidFn *)func, ctx); 2595975b3b6SBarry Smith if (*ierr) return; 260*8434afd1SBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*tao, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.mondestroy, (PetscVoidFn *)mondestroy, ctx); 2615975b3b6SBarry Smith 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); 268*8434afd1SBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*tao, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.convtest, (PetscVoidFn *)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); 275*8434afd1SBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*tao, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.constraints, (PetscVoidFn *)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); 2845975b3b6SBarry Smith *ierr = TaoSetType(*tao, t); 2855975b3b6SBarry Smith if (*ierr) return; 286a7e14dcfSSatish Balay FREECHAR(type_name, t); 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); 3055975b3b6SBarry Smith *ierr = PetscStrncpy(prefix, name, len); 3065975b3b6SBarry Smith if (*ierr) return; 307a7e14dcfSSatish Balay FIXRETURNCHAR(PETSC_TRUE, prefix, len); 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); 3145975b3b6SBarry Smith *ierr = TaoAppendOptionsPrefix(*tao, name); 3155975b3b6SBarry Smith if (*ierr) return; 316a7e14dcfSSatish Balay FREECHAR(prefix, name); 317a7e14dcfSSatish Balay } 318a7e14dcfSSatish Balay 31919caf8f3SSatish Balay PETSC_EXTERN void taosetoptionsprefix_(Tao *tao, char *prefix, PetscErrorCode *ierr, PETSC_FORTRAN_CHARLEN_T len) 320a7e14dcfSSatish Balay { 321a7e14dcfSSatish Balay char *t; 322a7e14dcfSSatish Balay FIXCHAR(prefix, len, t); 3235975b3b6SBarry Smith *ierr = TaoSetOptionsPrefix(*tao, t); 3245975b3b6SBarry Smith if (*ierr) return; 325a7e14dcfSSatish Balay FREECHAR(prefix, t); 326a7e14dcfSSatish Balay } 327a7e14dcfSSatish Balay 32819caf8f3SSatish Balay PETSC_EXTERN void taogettype_(Tao *tao, char *name, PetscErrorCode *ierr, PETSC_FORTRAN_CHARLEN_T len) 329a7e14dcfSSatish Balay { 330a7e14dcfSSatish Balay const char *tname; 331a7e14dcfSSatish Balay *ierr = TaoGetType(*tao, &tname); 3325975b3b6SBarry Smith *ierr = PetscStrncpy(name, tname, len); 3335975b3b6SBarry Smith if (*ierr) return; 334a7e14dcfSSatish Balay FIXRETURNCHAR(PETSC_TRUE, name, len); 335a7e14dcfSSatish Balay } 336a7e14dcfSSatish Balay 33719caf8f3SSatish Balay PETSC_EXTERN void taosetjacobianinequalityroutine_(Tao *tao, Mat *J, Mat *Jp, void (*func)(Tao *, Vec *, Mat *, Mat *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr) 338a7e14dcfSSatish Balay { 3398732526dSAlp Dener CHKFORTRANNULLFUNCTION(func); 340*8434afd1SBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*tao, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.jacineq, (PetscVoidFn *)func, ctx); 3418732526dSAlp Dener if (!*ierr) *ierr = TaoSetJacobianInequalityRoutine(*tao, *J, *Jp, ourtaojacobianinequalityroutine, ctx); 342a7e14dcfSSatish Balay } 343a7e14dcfSSatish Balay 34419caf8f3SSatish Balay PETSC_EXTERN void taosetjacobianequalityroutine_(Tao *tao, Mat *J, Mat *Jp, void (*func)(Tao *, Vec *, Mat *, Mat *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr) 345a7e14dcfSSatish Balay { 3468732526dSAlp Dener CHKFORTRANNULLFUNCTION(func); 347*8434afd1SBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*tao, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.jaceq, (PetscVoidFn *)func, ctx); 3488732526dSAlp Dener if (!*ierr) *ierr = TaoSetJacobianEqualityRoutine(*tao, *J, *Jp, ourtaojacobianequalityroutine, ctx); 349a7e14dcfSSatish Balay } 350a7e14dcfSSatish Balay 35119caf8f3SSatish Balay PETSC_EXTERN void taosetinequalityconstraintsroutine_(Tao *tao, Vec *C, void (*func)(Tao *, Vec *, Vec *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr) 352a7e14dcfSSatish Balay { 3538732526dSAlp Dener CHKFORTRANNULLFUNCTION(func); 354*8434afd1SBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*tao, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.conineq, (PetscVoidFn *)func, ctx); 3558732526dSAlp Dener if (!*ierr) *ierr = TaoSetInequalityConstraintsRoutine(*tao, *C, ourtaoinequalityconstraintsroutine, ctx); 356a7e14dcfSSatish Balay } 357a7e14dcfSSatish Balay 35819caf8f3SSatish Balay PETSC_EXTERN void taosetequalityconstraintsroutine_(Tao *tao, Vec *C, void (*func)(Tao *, Vec *, Vec *, void *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr) 359a7e14dcfSSatish Balay { 3608732526dSAlp Dener CHKFORTRANNULLFUNCTION(func); 361*8434afd1SBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*tao, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.coneq, (PetscVoidFn *)func, ctx); 3628732526dSAlp Dener if (!*ierr) *ierr = TaoSetEqualityConstraintsRoutine(*tao, *C, ourtaoequalityconstraintsroutine, ctx); 363a7e14dcfSSatish Balay } 364a7e14dcfSSatish Balay 36519caf8f3SSatish Balay PETSC_EXTERN void taosetupdate_(Tao *tao, void (*func)(Tao *, PetscInt *, PetscErrorCode *), void *ctx, PetscErrorCode *ierr) 366e1e80dc8SAlp Dener { 367e1e80dc8SAlp Dener CHKFORTRANNULLFUNCTION(func); 368*8434afd1SBarry Smith *ierr = PetscObjectSetFortranCallback((PetscObject)*tao, PETSC_FORTRAN_CALLBACK_CLASS, &_cb.update, (PetscVoidFn *)func, ctx); 369e1e80dc8SAlp Dener if (!*ierr) *ierr = TaoSetUpdate(*tao, ourtaoupdateroutine, ctx); 370e1e80dc8SAlp Dener } 371e1e80dc8SAlp Dener 37219caf8f3SSatish Balay PETSC_EXTERN void taoviewfromoptions_(Tao *ao, PetscObject obj, char *type, PetscErrorCode *ierr, PETSC_FORTRAN_CHARLEN_T len) 373fe2efc57SMark { 374fe2efc57SMark char *t; 375fe2efc57SMark 376fe2efc57SMark FIXCHAR(type, len, t); 377b14c0cbaSBlaise Bourdin CHKFORTRANNULLOBJECT(obj); 3785975b3b6SBarry Smith *ierr = TaoViewFromOptions(*ao, obj, t); 3795975b3b6SBarry Smith if (*ierr) return; 380fe2efc57SMark FREECHAR(type, t); 381fe2efc57SMark } 382fe2efc57SMark 3831fb7b255SJunchao Zhang PETSC_EXTERN void taodestroy_(Tao *x, int *ierr) 3841fb7b255SJunchao Zhang { 3851fb7b255SJunchao Zhang PETSC_FORTRAN_OBJECT_F_DESTROYED_TO_C_NULL(x); 3865975b3b6SBarry Smith *ierr = TaoDestroy(x); 3875975b3b6SBarry Smith if (*ierr) return; 3881fb7b255SJunchao Zhang PETSC_FORTRAN_OBJECT_C_NULL_TO_F_DESTROYED(x); 3891fb7b255SJunchao Zhang } 3901fb7b255SJunchao Zhang 391a7e14dcfSSatish Balay EXTERN_C_END 392