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");