40604e5
diff -up octave-5.0.91/configure.ac.sundials3 octave-5.0.91/configure.ac
40604e5
--- octave-5.0.91/configure.ac.sundials3	2019-02-04 10:50:20.000000000 -0700
40604e5
+++ octave-5.0.91/configure.ac	2019-02-05 22:05:44.096260529 -0700
40604e5
@@ -2220,15 +2220,15 @@ OCTAVE_CHECK_LIB(sundials_ida, [SUNDIALS
Orion Poplawski 281df3b
   [], [don't use SUNDIALS IDA library, solvers ode15i and ode15s will be disabled],
Orion Poplawski 281df3b
   [warn_sundials_ida=
Orion Poplawski 281df3b
    OCTAVE_CHECK_SUNDIALS_SIZEOF_REALTYPE
Orion Poplawski 281df3b
-   OCTAVE_CHECK_SUNDIALS_IDA_DENSE
Orion Poplawski 281df3b
-   OCTAVE_CHECK_SUNDIALS_IDAKLU])
Orion Poplawski 281df3b
+   OCTAVE_CHECK_SUNDIALS_SUNLINSOL_DENSE
Orion Poplawski 281df3b
+   OCTAVE_CHECK_SUNDIALS_SUNLINSOL_KLU])
Orion Poplawski 281df3b
 LIBS="$save_LIBS"
Orion Poplawski 281df3b
 
Orion Poplawski 281df3b
 dnl Define this way instead of with an #if in oct-conf-post.h so that
Orion Poplawski 281df3b
 dnl the build features script will get the correct value.
Orion Poplawski 281df3b
 if test -n "$SUNDIALS_IDA_LIBS" \
Orion Poplawski 281df3b
     && test -n "$SUNDIALS_NVECSERIAL_LIBS" \
Orion Poplawski 281df3b
-    && test $octave_cv_sundials_ida_dense = yes \
Orion Poplawski 281df3b
+    && test $octave_cv_sundials_sunlinsol_dense = yes \
Orion Poplawski 281df3b
     && test $octave_cv_sundials_realtype_is_double = yes; then
Orion Poplawski 281df3b
   AC_DEFINE(HAVE_SUNDIALS, 1, [Define to 1 if SUNDIALS is available.])
Orion Poplawski 281df3b
 fi
40604e5
diff -up octave-5.0.91/libinterp/dldfcn/__ode15__.cc.sundials3 octave-5.0.91/libinterp/dldfcn/__ode15__.cc
40604e5
--- octave-5.0.91/libinterp/dldfcn/__ode15__.cc.sundials3	2019-02-04 10:50:20.000000000 -0700
40604e5
+++ octave-5.0.91/libinterp/dldfcn/__ode15__.cc	2019-02-05 22:06:48.074012827 -0700
Orion Poplawski 281df3b
@@ -1,6 +1,7 @@
Orion Poplawski 281df3b
 /*
Orion Poplawski 281df3b
 
40604e5
 Copyright (C) 2016-2019 Francesco Faccio <francesco.faccio@mail.polimi.it>
Orion Poplawski 281df3b
+Copyright (C) 2018 William Greene <w.h.greene@gmail.com>
Orion Poplawski 281df3b
 
Orion Poplawski 281df3b
 This file is part of Octave.
Orion Poplawski 281df3b
 
40604e5
@@ -44,15 +45,34 @@ along with Octave; see the file COPYING.
Orion Poplawski 281df3b
 #    include <ida/ida.h>
Orion Poplawski 281df3b
 #  endif
Orion Poplawski 281df3b
 
Orion Poplawski 281df3b
-#  if defined (HAVE_IDA_IDA_DENSE_H)
Orion Poplawski 281df3b
-#    include <ida/ida_dense.h>
Orion Poplawski 281df3b
+#  if defined (HAVE_SUNDIALS_SUNDIALS_MATRIX_H)
Orion Poplawski 281df3b
+#    include <sundials/sundials_matrix.h>
Orion Poplawski 281df3b
 #  endif
Orion Poplawski 281df3b
 
Orion Poplawski 281df3b
-#  if defined (HAVE_IDA_IDA_KLU_H)
Orion Poplawski 281df3b
-#    include <ida/ida_klu.h>
Orion Poplawski 281df3b
+#  if defined (HAVE_SUNDIALS_SUNDIALS_LINEARSOLVER_H)
Orion Poplawski 281df3b
+#    include <sundials/sundials_linearsolver.h>
Orion Poplawski 281df3b
+#  endif
Orion Poplawski 281df3b
+
Orion Poplawski 281df3b
+#  if defined (HAVE_SUNLINSOL_SUNLINSOL_DENSE_H)
Orion Poplawski 281df3b
+#    include <sunlinsol/sunlinsol_dense.h>
Orion Poplawski 281df3b
+#  endif
Orion Poplawski 281df3b
+
Orion Poplawski 281df3b
+#  if defined (HAVE_IDA_IDA_DIRECT_H)
Orion Poplawski 281df3b
+#    include <ida/ida_direct.h>
Orion Poplawski 281df3b
+#  endif
Orion Poplawski 281df3b
+
Orion Poplawski 281df3b
+#  if defined (HAVE_SUNDIALS_SUNDIALS_SPARSE_H)
Orion Poplawski 281df3b
 #    include <sundials/sundials_sparse.h>
Orion Poplawski 281df3b
 #  endif
Orion Poplawski 281df3b
 
Orion Poplawski 281df3b
+#  if defined (HAVE_SUNLINSOL_SUNLINSOL_KLU_H)
Orion Poplawski 281df3b
+#    include <sunlinsol/sunlinsol_klu.h>
Orion Poplawski 281df3b
+#  endif
Orion Poplawski 281df3b
+
Orion Poplawski 281df3b
+#  if defined (HAVE_SUNMATRIX_SUNMATRIX_SPARSE_H)
Orion Poplawski 281df3b
+#    include <sunmatrix/sunmatrix_sparse.h>
Orion Poplawski 281df3b
+#  endif
Orion Poplawski 281df3b
+
Orion Poplawski 281df3b
 #  if defined (HAVE_NVECTOR_NVECTOR_SERIAL_H)
Orion Poplawski 281df3b
 #    include <nvector/nvector_serial.h>
Orion Poplawski 281df3b
 #  endif
40604e5
@@ -112,7 +132,8 @@ namespace octave
Orion Poplawski 281df3b
         havejacsparse (false), mem (nullptr), num (), ida_fun (nullptr),
Orion Poplawski 281df3b
         ida_jac (nullptr), dfdy (nullptr), dfdyp (nullptr), spdfdy (nullptr),
Orion Poplawski 281df3b
         spdfdyp (nullptr), fun (nullptr), jacfun (nullptr), jacspfun (nullptr),
Orion Poplawski 281df3b
-        jacdcell (nullptr), jacspcell (nullptr)
Orion Poplawski 281df3b
+        jacdcell (nullptr), jacspcell (nullptr),
Orion Poplawski 281df3b
+        sunJacMatrix (nullptr), sunLinearSolver (nullptr)
Orion Poplawski 281df3b
     { }
Orion Poplawski 281df3b
 
Orion Poplawski 281df3b
 
40604e5
@@ -122,11 +143,17 @@ namespace octave
Orion Poplawski 281df3b
         havejacsparse (false), mem (nullptr), num (), ida_fun (ida_fcn),
Orion Poplawski 281df3b
         ida_jac (nullptr), dfdy (nullptr), dfdyp (nullptr), spdfdy (nullptr),
Orion Poplawski 281df3b
         spdfdyp (nullptr), fun (daefun), jacfun (nullptr), jacspfun (nullptr),
Orion Poplawski 281df3b
-        jacdcell (nullptr), jacspcell (nullptr)
Orion Poplawski 281df3b
+        jacdcell (nullptr), jacspcell (nullptr),
Orion Poplawski 281df3b
+        sunJacMatrix (nullptr), sunLinearSolver (nullptr)
Orion Poplawski 281df3b
     { }
Orion Poplawski 281df3b
 
Orion Poplawski 281df3b
 
Orion Poplawski 281df3b
-    ~IDA (void) { IDAFree (&mem;; }
Orion Poplawski 281df3b
+    ~IDA (void)
Orion Poplawski 281df3b
+    {
Orion Poplawski 281df3b
+      IDAFree (&mem;;
Orion Poplawski 281df3b
+      SUNLinSolFree(sunLinearSolver);
Orion Poplawski 281df3b
+      SUNMatDestroy(sunJacMatrix);
Orion Poplawski 281df3b
+    }
Orion Poplawski 281df3b
 
Orion Poplawski 281df3b
     IDA&
Orion Poplawski 281df3b
     set_jacobian (octave_function *jac, DAEJacFuncDense j)
40604e5
@@ -184,7 +211,7 @@ namespace octave
Orion Poplawski 281df3b
     static N_Vector ColToNVec (const ColumnVector& data, long int n);
Orion Poplawski 281df3b
 
Orion Poplawski 281df3b
     void
Orion Poplawski 281df3b
-    set_up (void);
Orion Poplawski 281df3b
+    set_up (const ColumnVector& y);
Orion Poplawski 281df3b
 
Orion Poplawski 281df3b
     void
Orion Poplawski 281df3b
     set_tolerance (ColumnVector& abstol, realtype reltol);
40604e5
@@ -199,25 +226,24 @@ namespace octave
Orion Poplawski 281df3b
     void
Orion Poplawski 281df3b
     resfun_impl (realtype t, N_Vector& yy,
Orion Poplawski 281df3b
                  N_Vector& yyp, N_Vector& rr);
Orion Poplawski 281df3b
-
Orion Poplawski 281df3b
     static int
Orion Poplawski 281df3b
-    jacdense (long int Neq, realtype t,  realtype cj, N_Vector yy,
Orion Poplawski 281df3b
-              N_Vector yyp, N_Vector, DlsMat JJ, void *user_data,
Orion Poplawski 281df3b
+    jacdense (realtype t, realtype cj, N_Vector yy,
Orion Poplawski 281df3b
+              N_Vector yyp, N_Vector, SUNMatrix JJ, void *user_data,
Orion Poplawski 281df3b
               N_Vector, N_Vector, N_Vector)
Orion Poplawski 281df3b
     {
Orion Poplawski 281df3b
       IDA *self = static_cast <IDA *> (user_data);
Orion Poplawski 281df3b
-      self->jacdense_impl (Neq, t, cj, yy, yyp, JJ);
Orion Poplawski 281df3b
+      self->jacdense_impl (t, cj, yy, yyp, JJ);
Orion Poplawski 281df3b
       return 0;
Orion Poplawski 281df3b
     }
Orion Poplawski 281df3b
 
Orion Poplawski 281df3b
     void
Orion Poplawski 281df3b
-    jacdense_impl (long int Neq, realtype t, realtype cj,
Orion Poplawski 281df3b
-                   N_Vector& yy, N_Vector& yyp, DlsMat& JJ);
Orion Poplawski 281df3b
+    jacdense_impl (realtype t, realtype cj,
Orion Poplawski 281df3b
+                   N_Vector& yy, N_Vector& yyp, SUNMatrix& JJ);
Orion Poplawski 281df3b
 
Orion Poplawski 281df3b
-#  if defined (HAVE_SUNDIALS_IDAKLU)
Orion Poplawski 281df3b
+#  if defined (HAVE_SUNDIALS_SUNLINSOL_KLU)
Orion Poplawski 281df3b
     static int
Orion Poplawski 281df3b
     jacsparse (realtype t, realtype cj, N_Vector yy, N_Vector yyp,
Orion Poplawski 281df3b
-               N_Vector, SlsMat Jac, void *user_data, N_Vector,
Orion Poplawski 281df3b
+               N_Vector, SUNMatrix Jac, void *user_data, N_Vector,
Orion Poplawski 281df3b
                N_Vector, N_Vector)
Orion Poplawski 281df3b
     {
Orion Poplawski 281df3b
       IDA *self = static_cast <IDA *> (user_data);
40604e5
@@ -227,7 +253,7 @@ namespace octave
Orion Poplawski 281df3b
 
Orion Poplawski 281df3b
     void
Orion Poplawski 281df3b
     jacsparse_impl (realtype t, realtype cj, N_Vector& yy,
Orion Poplawski 281df3b
-                    N_Vector& yyp, SlsMat& Jac);
Orion Poplawski 281df3b
+                    N_Vector& yyp, SUNMatrix& Jac);
Orion Poplawski 281df3b
 #endif
Orion Poplawski 281df3b
 
Orion Poplawski 281df3b
     void set_maxstep (realtype maxstep);
40604e5
@@ -291,6 +317,8 @@ namespace octave
Orion Poplawski 281df3b
     DAEJacFuncSparse jacspfun;
Orion Poplawski 281df3b
     DAEJacCellDense jacdcell;
Orion Poplawski 281df3b
     DAEJacCellSparse jacspcell;
Orion Poplawski 281df3b
+    SUNMatrix sunJacMatrix;
Orion Poplawski 281df3b
+    SUNLinearSolver sunLinearSolver;
Orion Poplawski 281df3b
   };
Orion Poplawski 281df3b
 
Orion Poplawski 281df3b
   int
40604e5
@@ -323,36 +351,61 @@ namespace octave
Orion Poplawski 281df3b
   }
Orion Poplawski 281df3b
 
Orion Poplawski 281df3b
   void
Orion Poplawski 281df3b
-  IDA::set_up (void)
Orion Poplawski 281df3b
+  IDA::set_up (const ColumnVector& y)
Orion Poplawski 281df3b
   {
Orion Poplawski 281df3b
+    N_Vector yy = ColToNVec(y, num);
Orion Poplawski 281df3b
+
Orion Poplawski 281df3b
     if (havejacsparse)
Orion Poplawski 281df3b
       {
Orion Poplawski 281df3b
-#  if defined (HAVE_SUNDIALS_IDAKLU)
Orion Poplawski 281df3b
-        if (IDAKLU (mem, num, num*num, CSC_MAT) != 0)
Orion Poplawski 281df3b
-          error ("IDAKLU solver not initialized");
Orion Poplawski 281df3b
+#if defined (HAVE_SUNDIALS_SUNLINSOL_KLU)
Orion Poplawski 281df3b
+
Orion Poplawski 281df3b
+        sunJacMatrix = SUNSparseMatrix (num, num, num*num, CSC_MAT);
Orion Poplawski 281df3b
+        if (! sunJacMatrix)
Orion Poplawski 281df3b
+          error ("Unable to create sparse Jacobian for Sundials");
Orion Poplawski 281df3b
+
Orion Poplawski 281df3b
+        sunLinearSolver = SUNKLU (yy, sunJacMatrix);
Orion Poplawski 281df3b
+        if (! sunLinearSolver)
Orion Poplawski 281df3b
+          error ("Unable to create KLU sparse solver");
Orion Poplawski 281df3b
+
Orion Poplawski 281df3b
+        if (IDADlsSetLinearSolver (mem, sunLinearSolver, sunJacMatrix))
Orion Poplawski 281df3b
+          error ("Unable to set sparse linear solver");
Orion Poplawski 281df3b
+
Orion Poplawski 281df3b
+        IDADlsSetJacFn(mem, IDA::jacsparse);
Orion Poplawski 281df3b
 
Orion Poplawski 281df3b
-        IDASlsSetSparseJacFn (mem, IDA::jacsparse);
Orion Poplawski 281df3b
 #  else
Orion Poplawski 281df3b
-        error ("IDAKLU is not available in this version of Octave");
Orion Poplawski 281df3b
+        error ("SUNDIALS SUNLINSOL KLU is not available in this version of Octave");
Orion Poplawski 281df3b
 #  endif
Orion Poplawski 281df3b
+
Orion Poplawski 281df3b
       }
Orion Poplawski 281df3b
     else
Orion Poplawski 281df3b
       {
Orion Poplawski 281df3b
-        if (IDADense (mem, num) != 0)
Orion Poplawski 281df3b
-          error ("IDADense solver not initialized");
Orion Poplawski 281df3b
 
Orion Poplawski 281df3b
-        if (havejac && IDADlsSetDenseJacFn (mem, IDA::jacdense) != 0)
Orion Poplawski 281df3b
-          error ("Dense Jacobian not set");
Orion Poplawski 281df3b
+        sunJacMatrix = SUNDenseMatrix (num, num);
Orion Poplawski 281df3b
+        if (! sunJacMatrix)
Orion Poplawski 281df3b
+          error ("Unable to create dense Jacobian for Sundials");
Orion Poplawski 281df3b
+
Orion Poplawski 281df3b
+        sunLinearSolver = SUNDenseLinearSolver(yy, sunJacMatrix);
Orion Poplawski 281df3b
+        if (! sunLinearSolver)
Orion Poplawski 281df3b
+          error ("Unable to create dense linear solver");
Orion Poplawski 281df3b
+
Orion Poplawski 281df3b
+        if (IDADlsSetLinearSolver (mem, sunLinearSolver, sunJacMatrix))
Orion Poplawski 281df3b
+          error ("Unable to set dense linear solver");
Orion Poplawski 281df3b
+
Orion Poplawski 281df3b
+        if (havejac && IDADlsSetJacFn (mem, IDA::jacdense) != 0)
Orion Poplawski 281df3b
+          error("Unable to set dense Jacobian function");
Orion Poplawski 281df3b
+
Orion Poplawski 281df3b
       }
Orion Poplawski 281df3b
   }
Orion Poplawski 281df3b
 
Orion Poplawski 281df3b
   void
Orion Poplawski 281df3b
-  IDA::jacdense_impl (long int Neq, realtype t, realtype cj,
Orion Poplawski 281df3b
-                      N_Vector& yy, N_Vector& yyp, DlsMat& JJ)
Orion Poplawski 281df3b
+  IDA::jacdense_impl (realtype t, realtype cj,
Orion Poplawski 281df3b
+                      N_Vector& yy, N_Vector& yyp, SUNMatrix& JJ)
Orion Poplawski 281df3b
 
Orion Poplawski 281df3b
   {
Orion Poplawski 281df3b
     BEGIN_INTERRUPT_WITH_EXCEPTIONS;
Orion Poplawski 281df3b
 
Orion Poplawski 281df3b
+    long int Neq = NV_LENGTH_S(yy);
Orion Poplawski 281df3b
+
Orion Poplawski 281df3b
     ColumnVector y = NVecToCol (yy, Neq);
Orion Poplawski 281df3b
 
Orion Poplawski 281df3b
     ColumnVector yp = NVecToCol (yyp, Neq);
40604e5
@@ -366,15 +419,15 @@ namespace octave
Orion Poplawski 281df3b
 
Orion Poplawski 281df3b
     std::copy (jac.fortran_vec (),
Orion Poplawski 281df3b
                jac.fortran_vec () + jac.numel (),
Orion Poplawski 281df3b
-               JJ->data);
Orion Poplawski 281df3b
+      SUNDenseMatrix_Data(JJ));
Orion Poplawski 281df3b
 
Orion Poplawski 281df3b
     END_INTERRUPT_WITH_EXCEPTIONS;
Orion Poplawski 281df3b
   }
Orion Poplawski 281df3b
 
Orion Poplawski 281df3b
-#  if defined (HAVE_SUNDIALS_IDAKLU)
Orion Poplawski 281df3b
+#  if defined (HAVE_SUNDIALS_SUNLINSOL_KLU)
Orion Poplawski 281df3b
   void
Orion Poplawski 281df3b
   IDA::jacsparse_impl (realtype t, realtype cj, N_Vector& yy, N_Vector& yyp,
Orion Poplawski 281df3b
-                       SlsMat& Jac)
Orion Poplawski 281df3b
+                       SUNMatrix& Jac)
Orion Poplawski 281df3b
 
Orion Poplawski 281df3b
   {
Orion Poplawski 281df3b
     BEGIN_INTERRUPT_WITH_EXCEPTIONS;
40604e5
@@ -390,17 +443,18 @@ namespace octave
Orion Poplawski 281df3b
     else
Orion Poplawski 281df3b
       jac = (*jacspcell) (spdfdy, spdfdyp, cj);
Orion Poplawski 281df3b
 
Orion Poplawski 281df3b
-    SparseSetMatToZero (Jac);
Orion Poplawski 281df3b
-    int *colptrs = *(Jac->colptrs);
Orion Poplawski 281df3b
-    int *rowvals = *(Jac->rowvals);
Orion Poplawski 281df3b
+    SUNMatZero_Sparse (Jac);
Orion Poplawski 281df3b
+    sunindextype *colptrs = SUNSparseMatrix_IndexPointers (Jac);
Orion Poplawski 281df3b
+    sunindextype *rowvals = SUNSparseMatrix_IndexValues (Jac);
Orion Poplawski 281df3b
 
Orion Poplawski 281df3b
     for (int i = 0; i < num + 1; i++)
Orion Poplawski 281df3b
       colptrs[i] = jac.cidx(i);
Orion Poplawski 281df3b
 
Orion Poplawski 281df3b
+    double *d = SUNSparseMatrix_Data (Jac);
Orion Poplawski 281df3b
     for (int i = 0; i < jac.nnz (); i++)
Orion Poplawski 281df3b
       {
Orion Poplawski 281df3b
         rowvals[i] = jac.ridx(i);
Orion Poplawski 281df3b
-        Jac->data[i] = jac.data(i);
Orion Poplawski 281df3b
+        d[i] = jac.data(i);
Orion Poplawski 281df3b
       }
Orion Poplawski 281df3b
 
Orion Poplawski 281df3b
     END_INTERRUPT_WITH_EXCEPTIONS;
40604e5
@@ -567,7 +621,7 @@ namespace octave
Orion Poplawski 281df3b
 
Orion Poplawski 281df3b
         //main loop
Orion Poplawski 281df3b
         while (((posdirection == 1 && tsol < tend)
Orion Poplawski 281df3b
-                || (posdirection == 0 && tsol > tend))
Orion Poplawski 281df3b
+               || (posdirection == 0 && tsol > tend))
Orion Poplawski 281df3b
                && status == 0)
Orion Poplawski 281df3b
           {
Orion Poplawski 281df3b
             if (IDASolve (mem, tend, &tsol, yy, yyp, IDA_ONE_STEP) != 0)
40604e5
@@ -692,7 +746,7 @@ namespace octave
Orion Poplawski 281df3b
             // Linear interpolation
Orion Poplawski 281df3b
             ie(0) = index(0);
Orion Poplawski 281df3b
             te(0) = tsol - val (index(0)) * (tsol - told)
Orion Poplawski 281df3b
-                    / (val (index(0)) - oldval (index(0)));
Orion Poplawski 281df3b
+              / (val (index(0)) - oldval (index(0)));
Orion Poplawski 281df3b
 
Orion Poplawski 281df3b
             ColumnVector ytemp
Orion Poplawski 281df3b
               = y - ((tsol - te(0)) * (y - yold) / (tsol - told));
40604e5
@@ -717,7 +771,7 @@ namespace octave
Orion Poplawski 281df3b
                 // Linear interpolation
Orion Poplawski 281df3b
                 ie(temp+i) = index(i);
Orion Poplawski 281df3b
                 te(temp+i) = tsol - val(index(i)) * (tsol - told)
Orion Poplawski 281df3b
-                             / (val(index(i)) - oldval(index(i)));
Orion Poplawski 281df3b
+                  / (val(index(i)) - oldval(index(i)));
Orion Poplawski 281df3b
 
Orion Poplawski 281df3b
                 ColumnVector ytemp
Orion Poplawski 281df3b
                   = y - (tsol - te (temp + i)) * (y - yold) / (tsol - told);
40604e5
@@ -1096,7 +1150,7 @@ namespace octave
Orion Poplawski 281df3b
       event_fcn = options.getfield("Events").function_value ();
Orion Poplawski 281df3b
 
Orion Poplawski 281df3b
     // Set up linear solver
Orion Poplawski 281df3b
-    dae.set_up ();
Orion Poplawski 281df3b
+    dae.set_up (y0);
Orion Poplawski 281df3b
 
Orion Poplawski 281df3b
     // Integrate
Orion Poplawski 281df3b
     retval = dae.integrate (numt, tspan, y0, yp0, refine,
40604e5
diff -up octave-5.0.91/m4/acinclude.m4.sundials3 octave-5.0.91/m4/acinclude.m4
40604e5
--- octave-5.0.91/m4/acinclude.m4.sundials3	2019-02-04 10:50:20.000000000 -0700
40604e5
+++ octave-5.0.91/m4/acinclude.m4	2019-02-05 22:05:44.100260576 -0700
40604e5
@@ -2210,14 +2210,11 @@ dnl Check whether SUNDIALS IDA library i
Orion Poplawski 281df3b
 dnl precision realtype.
Orion Poplawski 281df3b
 dnl
Orion Poplawski 281df3b
 AC_DEFUN([OCTAVE_CHECK_SUNDIALS_SIZEOF_REALTYPE], [
Orion Poplawski 281df3b
-  AC_CHECK_HEADERS([ida/ida.h ida.h])
Orion Poplawski 281df3b
   AC_CACHE_CHECK([whether SUNDIALS IDA is configured with double precision realtype],
Orion Poplawski 281df3b
     [octave_cv_sundials_realtype_is_double],
Orion Poplawski 281df3b
     [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
Orion Poplawski 281df3b
         #if defined (HAVE_IDA_IDA_H)
Orion Poplawski 281df3b
         #include <ida/ida.h>
Orion Poplawski 281df3b
-        #else
Orion Poplawski 281df3b
-        #include <ida.h>
Orion Poplawski 281df3b
         #endif
Orion Poplawski 281df3b
         #include <assert.h>
Orion Poplawski 281df3b
         ]], [[
40604e5
@@ -2233,61 +2230,72 @@ AC_DEFUN([OCTAVE_CHECK_SUNDIALS_SIZEOF_R
Orion Poplawski 281df3b
   fi
Orion Poplawski 281df3b
 ])
Orion Poplawski 281df3b
 dnl
Orion Poplawski 281df3b
-dnl Check whether SUNDIALS IDA library is configured with IDAKLU
Orion Poplawski 281df3b
+dnl Check whether SUNDIALS IDA library is configured with SUNLINSOL_KLU
Orion Poplawski 281df3b
 dnl enabled.
Orion Poplawski 281df3b
 dnl
Orion Poplawski 281df3b
-AC_DEFUN([OCTAVE_CHECK_SUNDIALS_IDAKLU], [
Orion Poplawski 281df3b
-  AC_CHECK_HEADERS([ida/ida_klu.h ida_klu.h])
Orion Poplawski 281df3b
-  AC_CACHE_CHECK([whether SUNDIALS IDA is configured with IDAKLU enabled],
Orion Poplawski 281df3b
-    [octave_cv_sundials_idaklu],
Orion Poplawski 281df3b
+AC_DEFUN([OCTAVE_CHECK_SUNDIALS_SUNLINSOL_KLU], [
Orion Poplawski 281df3b
+  AC_CHECK_HEADERS([sundials/sundials_sparse.h sunlinsol/sunlinsol_klu.h sunmatrix/sunmatrix_sparse.h])
Orion Poplawski 281df3b
+  AC_CACHE_CHECK([whether SUNDIALS IDA is configured with SUNLINSOL_KLU enabled],
Orion Poplawski 281df3b
+    [octave_cv_sundials_sunlinsol_klu],
Orion Poplawski 281df3b
     [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
Orion Poplawski 281df3b
-         #if defined (HAVE_IDA_IDA_KLU_H)
Orion Poplawski 281df3b
-         #include <ida/ida_klu.h>
Orion Poplawski 281df3b
-         #else
Orion Poplawski 281df3b
-         #include <ida_klu.h>
Orion Poplawski 281df3b
+         #if defined (HAVE_IDA_IDA_H)
Orion Poplawski 281df3b
+         #include <ida/ida.h>
Orion Poplawski 281df3b
+         #endif
Orion Poplawski 281df3b
+         #if defined (HAVE_SUNDIALS_SUNDIALS_SPARSE_H)
Orion Poplawski 281df3b
+         #include <sundials/sundials_sparse.h>
Orion Poplawski 281df3b
+         #endif
Orion Poplawski 281df3b
+         #if defined (HAVE_SUNLINSOL_SUNLINSOL_KLU_H)
Orion Poplawski 281df3b
+         #include <sunlinsol/sunlinsol_klu.h>
Orion Poplawski 281df3b
          #endif
Orion Poplawski 281df3b
          ]], [[
Orion Poplawski 281df3b
-         IDAKLU (0, 0, 0, 0);
Orion Poplawski 281df3b
+         SUNKLU (0, 0);
Orion Poplawski 281df3b
       ]])],
Orion Poplawski 281df3b
-      octave_cv_sundials_idaklu=yes,
Orion Poplawski 281df3b
-      octave_cv_sundials_idaklu=no)
Orion Poplawski 281df3b
+      octave_cv_sundials_sunlinsol_klu=yes,
Orion Poplawski 281df3b
+      octave_cv_sundials_sunlinsol_klu=no)
Orion Poplawski 281df3b
     ])
Orion Poplawski 281df3b
-  if test $octave_cv_sundials_idaklu = yes; then
Orion Poplawski 281df3b
-    AC_DEFINE(HAVE_SUNDIALS_IDAKLU, 1,
Orion Poplawski 281df3b
-      [Define to 1 if SUNDIALS IDA is configured with IDAKLU enabled.])
Orion Poplawski 281df3b
+  if test $octave_cv_sundials_sunlinsol_klu = yes; then
Orion Poplawski 281df3b
+    AC_DEFINE(HAVE_SUNDIALS_SUNLINSOL_KLU, 1,
Orion Poplawski 281df3b
+      [Define to 1 if SUNDIALS IDA is configured with SUNLINSOL_KLU enabled.])
Orion Poplawski 281df3b
   else
Orion Poplawski 281df3b
-    warn_sundials_idaklu="SUNDIALS IDA library not configured with IDAKLU, ode15i and ode15s will not support the sparse Jacobian feature"
Orion Poplawski 281df3b
-    OCTAVE_CONFIGURE_WARNING([warn_sundials_idaklu])
Orion Poplawski 281df3b
+    warn_sundials_idaklu="SUNDIALS IDA library not configured with SUNLINSOL_KLU, ode15i and ode15s will not support the sparse Jacobian feature"
Orion Poplawski 281df3b
+    OCTAVE_CONFIGURE_WARNING([warn_sundials_sunlinsol_klu])
Orion Poplawski 281df3b
   fi
Orion Poplawski 281df3b
 ])
Orion Poplawski 281df3b
 dnl
Orion Poplawski 281df3b
-dnl Check whether SUNDIALS IDA library has the IDADENSE linear solver.
Orion Poplawski 281df3b
+dnl Check whether SUNDIALS IDA library has the SUNLINSOL_DENSE linear solver.
Orion Poplawski 281df3b
 dnl The IDADENSE API was removed in SUNDIALS version 3.0.0.
Orion Poplawski 281df3b
 dnl
Orion Poplawski 281df3b
-AC_DEFUN([OCTAVE_CHECK_SUNDIALS_IDA_DENSE], [
Orion Poplawski 281df3b
-  AC_CHECK_HEADERS([ida/ida_dense.h ida_dense.h])
Orion Poplawski 281df3b
-  AC_CACHE_CHECK([whether SUNDIALS IDA includes the IDADENSE linear solver],
Orion Poplawski 281df3b
-    [octave_cv_sundials_ida_dense],
Orion Poplawski 281df3b
+AC_DEFUN([OCTAVE_CHECK_SUNDIALS_SUNLINSOL_DENSE], [
Orion Poplawski 281df3b
+  AC_CHECK_HEADERS([sunlinsol/sunlinsol_dense.h sundials/sundials_matrix.h sundials/sundials_linearsolver.h ida/ida_direct.h])
Orion Poplawski 281df3b
+  AC_CACHE_CHECK([whether SUNDIALS IDA includes the SUNLINSOL_DENSE linear solver],
Orion Poplawski 281df3b
+    [octave_cv_sundials_sunlinsol_dense],
Orion Poplawski 281df3b
     [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
Orion Poplawski 281df3b
-         #if defined (HAVE_IDA_IDA_DENSE_H)
Orion Poplawski 281df3b
-         #include <ida/ida_dense.h>
Orion Poplawski 281df3b
-         #else
Orion Poplawski 281df3b
-         #include <ida_dense.h>
Orion Poplawski 281df3b
+         #if defined (HAVE_IDA_IDA_H)
Orion Poplawski 281df3b
+         #include <ida/ida.h>
Orion Poplawski 281df3b
+         #endif
Orion Poplawski 281df3b
+         #if defined (HAVE_SUNDIALS_SUNDIALS_MATRIX_H)
Orion Poplawski 281df3b
+         #include <sundials/sundials_matrix.h>
Orion Poplawski 281df3b
+         #endif
Orion Poplawski 281df3b
+         #if defined (HAVE_SUNDIALS_SUNDIALS_LINEARSOLVER_H)
Orion Poplawski 281df3b
+         #include <sundials/sundials_linearsolver.h>
Orion Poplawski 281df3b
          #endif
Orion Poplawski 281df3b
+         #if defined (HAVE_IDA_IDA_DIRECT_H)
Orion Poplawski 281df3b
+         #include <ida/ida_direct.h>
Orion Poplawski 281df3b
+         #endif         
Orion Poplawski 281df3b
          ]], [[
Orion Poplawski 281df3b
          void *mem = 0;
Orion Poplawski 281df3b
          long int num = 0;
Orion Poplawski 281df3b
          IDADense (mem, num);
Orion Poplawski 281df3b
       ]])],
Orion Poplawski 281df3b
-      octave_cv_sundials_ida_dense=yes,
Orion Poplawski 281df3b
-      octave_cv_sundials_ida_dense=no)
Orion Poplawski 281df3b
+      octave_cv_sundials_sunlinsol_dense=yes,
Orion Poplawski 281df3b
+      octave_cv_sundials_sunlinsol_dense=no)
Orion Poplawski 281df3b
     ])
Orion Poplawski 281df3b
-  if test $octave_cv_sundials_ida_dense = yes; then
Orion Poplawski 281df3b
-    AC_DEFINE(HAVE_SUNDIALS_IDADENSE, 1,
Orion Poplawski 281df3b
-      [Define to 1 if SUNDIALS IDA includes the IDADENSE linear solver.])
Orion Poplawski 281df3b
+  if test $octave_cv_sundials_sunlinsol_dense = yes; then
Orion Poplawski 281df3b
+    AC_DEFINE(HAVE_SUNDIALS_SUNLINSOL_DENSE, 1,
Orion Poplawski 281df3b
+      [Define to 1 if SUNDIALS IDA includes the SUNLINSOL_DENSE linear solver.])
Orion Poplawski 281df3b
   else
Orion Poplawski 281df3b
-    warn_sundials_ida_dense="SUNDIALS IDA library does not include the IDADENSE linear solver, ode15i and ode15s will be disabled"
Orion Poplawski 281df3b
-    OCTAVE_CONFIGURE_WARNING([warn_sundials_ida_dense])
Orion Poplawski 281df3b
+    warn_sundials_ida_dense="SUNDIALS IDA library does not include the SUNLINSOL_DENSE linear solver, ode15i and ode15s will be disabled"
Orion Poplawski 281df3b
+    OCTAVE_CONFIGURE_WARNING([warn_sundials_sunlinsol_dense])
Orion Poplawski 281df3b
   fi
Orion Poplawski 281df3b
 ])
Orion Poplawski 281df3b
 dnl
40604e5
diff -up octave-5.0.91/scripts/ode/ode15i.m.sundials3 octave-5.0.91/scripts/ode/ode15i.m
40604e5
--- octave-5.0.91/scripts/ode/ode15i.m.sundials3	2019-02-04 10:50:20.000000000 -0700
40604e5
+++ octave-5.0.91/scripts/ode/ode15i.m	2019-02-05 22:05:44.101260588 -0700
Orion Poplawski 281df3b
@@ -452,7 +452,7 @@ endfunction
Orion Poplawski 281df3b
 %! assert ([t(end), y(end,:)], fref, 1e-3);
Orion Poplawski 281df3b
 
Orion Poplawski 281df3b
 ## Jacobian fun sparse
Orion Poplawski 281df3b
-%!testif HAVE_SUNDIALS_IDAKLU
Orion Poplawski 281df3b
+%!testif HAVE_SUNDIALS_SUNLINSOL_KLU
Orion Poplawski 281df3b
 %! opt = odeset ("Jacobian", @jacfunsparse, "AbsTol", 1e-7, "RelTol", 1e-7);
Orion Poplawski 281df3b
 %! [t, y] = ode15i (@rob, [0, 100], [1; 0; 0], [-1e-4; 1e-4; 0], opt);
Orion Poplawski 281df3b
 %! assert ([t(end), y(end,:)], fref, 1e-3);
Orion Poplawski 281df3b
@@ -545,7 +545,7 @@ endfunction
Orion Poplawski 281df3b
 %!       "invalid value assigned to field 'Jacobian'");
Orion Poplawski 281df3b
 
Orion Poplawski 281df3b
 ## Jacobian cell sparse wrong dimension
Orion Poplawski 281df3b
-%!testif HAVE_SUNDIALS_IDAKLU
Orion Poplawski 281df3b
+%!testif HAVE_SUNDIALS_SUNLINSOL_KLU
Orion Poplawski 281df3b
 %! DFDY = sparse ([-0.04, 1;
Orion Poplawski 281df3b
 %!                  0.04, 1]);
Orion Poplawski 281df3b
 %! DFDYP = sparse ([-1,  0, 0;
40604e5
diff -up octave-5.0.91/scripts/ode/ode15s.m.sundials3 octave-5.0.91/scripts/ode/ode15s.m
40604e5
--- octave-5.0.91/scripts/ode/ode15s.m.sundials3	2019-02-04 10:50:20.000000000 -0700
40604e5
+++ octave-5.0.91/scripts/ode/ode15s.m	2019-02-05 22:05:44.102260599 -0700
Orion Poplawski 281df3b
@@ -545,21 +545,21 @@ endfunction
Orion Poplawski 281df3b
 %! [t, y] = ode15s (@rob, [0, 100], [1; 0; 0], opt);
Orion Poplawski 281df3b
 %! assert ([t(end), y(end,:)], frefrob, 1e-3);
Orion Poplawski 281df3b
 
Orion Poplawski 281df3b
-%!testif HAVE_SUNDIALS_IDAKLU
Orion Poplawski 281df3b
+%!testif HAVE_SUNDIALS_SUNLINSOL_KLU
Orion Poplawski 281df3b
 %! opt = odeset ("MStateDependence", "none",
Orion Poplawski 281df3b
 %!               "Mass", [1, 0, 0; 0, 1, 0; 0, 0, 0],
Orion Poplawski 281df3b
 %!               "Jacobian", @jacfunsparse);
Orion Poplawski 281df3b
 %! [t, y] = ode15s (@rob, [0, 100], [1; 0; 0], opt);
Orion Poplawski 281df3b
 %! assert ([t(end), y(end,:)], frefrob, 1e-3);
Orion Poplawski 281df3b
 
Orion Poplawski 281df3b
-%!testif HAVE_SUNDIALS_IDAKLU
Orion Poplawski 281df3b
+%!testif HAVE_SUNDIALS_SUNLINSOL_KLU
Orion Poplawski 281df3b
 %! opt = odeset ("MStateDependence", "none",
Orion Poplawski 281df3b
 %!               "Mass", sparse ([1, 0, 0; 0, 1, 0; 0, 0, 0]),
Orion Poplawski 281df3b
 %!               "Jacobian", @jacfunsparse);
Orion Poplawski 281df3b
 %! [t, y] = ode15s (@rob, [0, 100], [1; 0; 0], opt);
Orion Poplawski 281df3b
 %! assert ([t(end), y(end,:)], frefrob, 1e-3);
Orion Poplawski 281df3b
 
Orion Poplawski 281df3b
-%!testif HAVE_SUNDIALS_IDAKLU
Orion Poplawski 281df3b
+%!testif HAVE_SUNDIALS_SUNLINSOL_KLU
Orion Poplawski 281df3b
 %! warning ("off", "ode15s:mass_state_dependent_provided", "local");
Orion Poplawski 281df3b
 %! opt = odeset ("MStateDependence", "none",
Orion Poplawski 281df3b
 %!               "Mass", @massdensefunstate,
Orion Poplawski 281df3b
@@ -575,14 +575,14 @@ endfunction
Orion Poplawski 281df3b
 %! [t, y] = ode15s (@rob, [0, 100], [1; 0; 0], opt);
Orion Poplawski 281df3b
 %! assert ([t(end), y(end,:)], frefrob, 1e-3);
Orion Poplawski 281df3b
 
Orion Poplawski 281df3b
-%!testif HAVE_SUNDIALS_IDAKLU
Orion Poplawski 281df3b
+%!testif HAVE_SUNDIALS_SUNLINSOL_KLU
Orion Poplawski 281df3b
 %! opt = odeset ("MStateDependence", "none",
Orion Poplawski 281df3b
 %!               "Mass", @massdensefuntime,
Orion Poplawski 281df3b
 %!               "Jacobian", @jacfunsparse);
Orion Poplawski 281df3b
 %! [t, y] = ode15s (@rob, [0, 100], [1; 0; 0], opt);
Orion Poplawski 281df3b
 %! assert ([t(end), y(end,:)], frefrob, 1e-3);
Orion Poplawski 281df3b
 
Orion Poplawski 281df3b
-%!testif HAVE_SUNDIALS_IDAKLU
Orion Poplawski 281df3b
+%!testif HAVE_SUNDIALS_SUNLINSOL_KLU
Orion Poplawski 281df3b
 %! opt = odeset ("MStateDependence", "none",
Orion Poplawski 281df3b
 %!               "Mass", @masssparsefuntime,
Orion Poplawski 281df3b
 %!               "Jacobian", @jacfunsparse);