Mercurial > octave
changeset 26907:1d3730539776
use octave_value instead of pointer to octave_function in __ode15__
* __ode15__.cc: In all functions that use user-defined functions
(function handles, inline functions, function names), use octave_value
objects instead of pointers to octave_function objects.
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Thu, 14 Mar 2019 05:42:35 +0000 |
parents | db59dabf1685 |
children | 6bd408bde569 |
files | libinterp/dldfcn/__ode15__.cc |
diffstat | 1 files changed, 35 insertions(+), 37 deletions(-) [+] |
line wrap: on
line diff
--- a/libinterp/dldfcn/__ode15__.cc Thu Mar 14 06:09:29 2019 +0000 +++ b/libinterp/dldfcn/__ode15__.cc Thu Mar 14 05:42:35 2019 +0000 @@ -136,18 +136,18 @@ typedef ColumnVector (*DAERHSFuncIDA) (const ColumnVector& x, const ColumnVector& xdot, - realtype t, octave_function *idaf); + realtype t, const octave_value& idaf); typedef Matrix (*DAEJacFuncDense) (const ColumnVector& x, const ColumnVector& xdot, realtype t, - realtype cj, octave_function *idaj); + realtype cj, const octave_value& idaj); typedef SparseMatrix (*DAEJacFuncSparse) (const ColumnVector& x, const ColumnVector& xdot, realtype t, realtype cj, - octave_function *idaj); + const octave_value& idaj); typedef Matrix (*DAEJacCellDense) (Matrix *dfdy, Matrix *dfdyp, @@ -160,8 +160,8 @@ //Default IDA (void) : t0 (0.0), y0 (), yp0 (), havejac (false), havejacfun (false), - havejacsparse (false), mem (nullptr), num (), ida_fun (nullptr), - ida_jac (nullptr), dfdy (nullptr), dfdyp (nullptr), spdfdy (nullptr), + havejacsparse (false), mem (nullptr), num (), ida_fun (), + ida_jac (), dfdy (nullptr), dfdyp (nullptr), spdfdy (nullptr), spdfdyp (nullptr), fun (nullptr), jacfun (nullptr), jacspfun (nullptr), jacdcell (nullptr), jacspcell (nullptr), sunJacMatrix (nullptr), sunLinearSolver (nullptr) @@ -169,10 +169,10 @@ IDA (realtype t, ColumnVector y, ColumnVector yp, - octave_function *ida_fcn, DAERHSFuncIDA daefun) + const octave_value& ida_fcn, DAERHSFuncIDA daefun) : t0 (t), y0 (y), yp0 (yp), havejac (false), havejacfun (false), havejacsparse (false), mem (nullptr), num (), ida_fun (ida_fcn), - ida_jac (nullptr), dfdy (nullptr), dfdyp (nullptr), spdfdy (nullptr), + ida_jac (), dfdy (nullptr), dfdyp (nullptr), spdfdy (nullptr), spdfdyp (nullptr), fun (daefun), jacfun (nullptr), jacspfun (nullptr), jacdcell (nullptr), jacspcell (nullptr), sunJacMatrix (nullptr), sunLinearSolver (nullptr) @@ -187,7 +187,7 @@ } IDA& - set_jacobian (octave_function *jac, DAEJacFuncDense j) + set_jacobian (const octave_value& jac, DAEJacFuncDense j) { jacfun = j; ida_jac = jac; @@ -198,7 +198,7 @@ } IDA& - set_jacobian (octave_function *jac, DAEJacFuncSparse j) + set_jacobian (const octave_value& jac, DAEJacFuncSparse j) { jacspfun = j; ida_jac = jac; @@ -294,21 +294,21 @@ bool interpolate (int& cont, Matrix& output, ColumnVector& tout, int refine, realtype tend, bool haveoutputfcn, - bool haveoutputsel, octave_function *output_fcn, + bool haveoutputsel, const octave_value& output_fcn, ColumnVector& outputsel, bool haveeventfunction, - octave_function *event_fcn, ColumnVector& te, + const octave_value& event_fcn, ColumnVector& te, Matrix& ye, ColumnVector& ie, ColumnVector& oldval, ColumnVector& oldisterminal, ColumnVector& olddir, int& temp, ColumnVector& yold); bool - outputfun (octave_function *output_fcn, bool haveoutputsel, + outputfun (const octave_value& output_fcn, bool haveoutputsel, const ColumnVector& output, realtype tout, realtype tend, ColumnVector& outputsel, const std::string& flag); bool - event (octave_function *event_fcn, + event (const octave_value& event_fcn, ColumnVector& te, Matrix& ye, ColumnVector& ie, realtype tsol, const ColumnVector& y, const std::string& flag, const ColumnVector& yp, ColumnVector& oldval, @@ -321,9 +321,9 @@ integrate (const int numt, const ColumnVector& tt, const ColumnVector& y0, const ColumnVector& yp0, const int refine, bool haverefine, bool haveoutputfcn, - octave_function *output_fcn, bool haveoutputsel, + const octave_value& output_fcn, bool haveoutputsel, ColumnVector& outputsel, bool haveeventfunction, - octave_function *event_fcn); + const octave_value& event_fcn); void print_stat (void); @@ -337,8 +337,8 @@ bool havejacsparse; void *mem; int num; - octave_function *ida_fun; - octave_function *ida_jac; + octave_value ida_fun; + octave_value ida_jac; Matrix *dfdy; Matrix *dfdyp; SparseMatrix *spdfdy; @@ -566,9 +566,9 @@ IDA::integrate (const int numt, const ColumnVector& tspan, const ColumnVector& y, const ColumnVector& yp, const int refine, bool haverefine, bool haveoutputfcn, - octave_function *output_fcn, bool haveoutputsel, + const octave_value& output_fcn, bool haveoutputsel, ColumnVector& outputsel, bool haveeventfunction, - octave_function *event_fcn) + const octave_value& event_fcn) { // Set up output ColumnVector tout, yout (num), ypout (num), ysel (outputsel.numel ()); @@ -729,7 +729,7 @@ } bool - IDA::event (octave_function *event_fcn, + IDA::event (const octave_value& event_fcn, ColumnVector& te, Matrix& ye, ColumnVector& ie, realtype tsol, const ColumnVector& y, const std::string& flag, const ColumnVector& yp, ColumnVector& oldval, @@ -831,9 +831,9 @@ bool IDA::interpolate (int& cont, Matrix& output, ColumnVector& tout, int refine, realtype tend, bool haveoutputfcn, - bool haveoutputsel, octave_function *output_fcn, + bool haveoutputsel, const octave_value& output_fcn, ColumnVector& outputsel, bool haveeventfunction, - octave_function *event_fcn, ColumnVector& te, + const octave_value& event_fcn, ColumnVector& te, Matrix& ye, ColumnVector& ie, ColumnVector& oldval, ColumnVector& oldisterminal, ColumnVector& olddir, int& temp, ColumnVector& yold) @@ -897,7 +897,7 @@ } bool - IDA::outputfun (octave_function *output_fcn, bool haveoutputsel, + IDA::outputfun (const octave_value& output_fcn, bool haveoutputsel, const ColumnVector& yout, realtype tsol, realtype tend, ColumnVector& outputsel, const std::string& flag) @@ -988,7 +988,7 @@ ColumnVector ida_user_function (const ColumnVector& x, const ColumnVector& xdot, - double t, octave_function *ida_fc) + double t, const octave_value& ida_fc) { octave_value_list tmp; @@ -1006,7 +1006,7 @@ Matrix ida_dense_jac (const ColumnVector& x, const ColumnVector& xdot, - double t, double cj, octave_function *ida_jc) + double t, double cj, const octave_value& ida_jc) { octave_value_list tmp; @@ -1024,7 +1024,7 @@ SparseMatrix ida_sparse_jac (const ColumnVector& x, const ColumnVector& xdot, - double t, double cj, octave_function *ida_jc) + double t, double cj, const octave_value& ida_jc) { octave_value_list tmp; @@ -1054,7 +1054,7 @@ } octave_value_list - do_ode15 (octave_function *ida_fcn, + do_ode15 (const octave_value& ida_fcn, const ColumnVector& tspan, const int numt, const realtype t0, @@ -1076,14 +1076,14 @@ Matrix ida_dfdy, ida_dfdyp, *dfdy, *dfdyp; SparseMatrix ida_spdfdy, ida_spdfdyp, *spdfdy, *spdfdyp; - octave_function *ida_jac; + octave_value ida_jac; Cell jaccell; if (havejac) { if (havejacfun) { - ida_jac = options.getfield ("Jacobian").function_value (); + ida_jac = options.getfield ("Jacobian"); if (havejacsparse) dae.set_jacobian (ida_jac, ida_sparse_jac); @@ -1157,7 +1157,7 @@ bool haverefine = (refine > 1); - octave_function *output_fcn = nullptr; + octave_value output_fcn; ColumnVector outputsel; // OutputFcn @@ -1165,7 +1165,7 @@ = options.getfield("haveoutputfunction").bool_value (); if (haveoutputfunction) - output_fcn = options.getfield("OutputFcn").function_value (); + output_fcn = options.getfield("OutputFcn"); // OutputSel bool haveoutputsel = options.getfield("haveoutputselection").bool_value (); @@ -1173,14 +1173,14 @@ if (haveoutputsel) outputsel = options.getfield("OutputSel").vector_value (); - octave_function *event_fcn = nullptr; + octave_value event_fcn; // Events bool haveeventfunction = options.getfield("haveeventfunction").bool_value (); if (haveeventfunction) - event_fcn = options.getfield("Events").function_value (); + event_fcn = options.getfield("Events"); // Set up linear solver dae.set_up (y0); @@ -1219,13 +1219,11 @@ print_usage (); // Check odefun - octave_value f_arg = args(0); + octave_value ida_fcn = args(0); - if (! f_arg.is_function_handle ()) + if (! ida_fcn.is_function_handle ()) error ("__ode15__: odefun must be a function handle"); - octave_function *ida_fcn = f_arg.function_value (); - // Check input tspan ColumnVector tspan = args(1).xvector_value ("__ode15__: TRANGE must be a vector of numbers");