diff src/DLD-FUNCTIONS/lsode.cc @ 3955:dc970f5941ee

[project @ 2002-05-23 20:28:56 by jwe]
author jwe
date Thu, 23 May 2002 20:28:56 +0000
parents 945e8c160191
children 5490981096f1
line wrap: on
line diff
--- a/src/DLD-FUNCTIONS/lsode.cc
+++ b/src/DLD-FUNCTIONS/lsode.cc
@@ -298,9 +298,12 @@
 typedef void (LSODE_options::*da_set_opt_mf) (const Array<double>&);
 typedef void (LSODE_options::*d_set_opt_mf) (double);
 typedef void (LSODE_options::*i_set_opt_mf) (int);
+typedef void (LSODE_options::*s_set_opt_mf) (const std::string&);
+
 typedef Array<double> (LSODE_options::*da_get_opt_mf) (void) const;
 typedef double (LSODE_options::*d_get_opt_mf) (void) const;
 typedef int (LSODE_options::*i_get_opt_mf) (void) const;
+typedef std::string (LSODE_options::*s_get_opt_mf) (void) const;
 
 #define MAX_TOKENS 3
 
@@ -313,9 +316,11 @@
   da_set_opt_mf da_set_fcn;
   d_set_opt_mf d_set_fcn;
   i_set_opt_mf i_set_fcn;
+  s_set_opt_mf s_set_fcn;
   da_get_opt_mf da_get_fcn;
   d_get_opt_mf d_get_fcn;
   i_get_opt_mf i_get_fcn;
+  s_get_opt_mf s_get_fcn;
 };
 
 static LSODE_OPTIONS lsode_option_table [] =
@@ -323,43 +328,50 @@
   { "absolute tolerance",
     { "absolute", "tolerance", 0, 0, },
     { 1, 0, 0, 0, }, 1,
-    &LSODE_options::set_absolute_tolerance, 0, 0,
-    &LSODE_options::absolute_tolerance, 0, 0, },
+    &LSODE_options::set_absolute_tolerance, 0, 0, 0,
+    &LSODE_options::absolute_tolerance, 0, 0, 0, },
 
   { "initial step size",
     { "initial", "step", "size", 0, },
-    { 1, 0, 0, 0, }, 1,
-    0, &LSODE_options::set_initial_step_size, 0,
-    0, &LSODE_options::initial_step_size, 0, },
+    { 3, 0, 0, 0, }, 1,
+    0, &LSODE_options::set_initial_step_size, 0, 0,
+    0, &LSODE_options::initial_step_size, 0, 0, },
+
+  { "integration method",
+    { "integration", "method", 0, 0, },
+    { 3, 0, 0, 0, }, 1,
+    0, 0, 0, &LSODE_options::set_integration_method,
+    0, 0, 0, &LSODE_options::integration_method, },
 
   { "maximum step size",
     { "maximum", "step", "size", 0, },
     { 2, 0, 0, 0, }, 1,
-    0, &LSODE_options::set_maximum_step_size, 0,
-    0, &LSODE_options::maximum_step_size, 0, },
+    0, &LSODE_options::set_maximum_step_size, 0, 0,
+    0, &LSODE_options::maximum_step_size, 0, 0, },
 
   { "minimum step size",
     { "minimum", "step", "size", 0, },
     { 2, 0, 0, 0, }, 1,
-    0, &LSODE_options::set_minimum_step_size, 0,
-    0, &LSODE_options::minimum_step_size, 0, },
+    0, &LSODE_options::set_minimum_step_size, 0, 0,
+    0, &LSODE_options::minimum_step_size, 0, 0, },
 
   { "relative tolerance",
     { "relative", "tolerance", 0, 0, },
     { 1, 0, 0, 0, }, 1,
-    0, &LSODE_options::set_relative_tolerance, 0,
-    0, &LSODE_options::relative_tolerance, 0, },
+    0, &LSODE_options::set_relative_tolerance, 0, 0,
+    0, &LSODE_options::relative_tolerance, 0, 0, },
 
   { "step limit",
     { "step", "limit", 0, 0, },
     { 1, 0, 0, 0, }, 1,
-    0, 0, &LSODE_options::set_step_limit,
-    0, 0, &LSODE_options::step_limit, },
+    0, 0, &LSODE_options::set_step_limit, 0,
+    0, 0, &LSODE_options::step_limit, 0, },
 
   { 0,
     { 0, 0, 0, 0, },
     { 0, 0, 0, 0, }, 0,
-    0, 0, 0, 0, 0, 0, },
+    0, 0, 0, 0,
+    0, 0, 0, 0, },
 };
 
 static void
@@ -410,7 +422,7 @@
 	  else
 	    os << val;
 	}
-      else
+      else if (list->i_get_fcn)
 	{
 	  int val = (lsode_opts.*list->i_get_fcn) ();
 	  if (val < 0)
@@ -418,6 +430,13 @@
 	  else
 	    os << val;
 	}
+      else if (list->s_get_fcn)
+	{
+	  os << (lsode_opts.*list->s_get_fcn) ();
+	}
+      else
+	panic_impossible ();
+
       os << "\n";
       list++;
     }
@@ -478,6 +497,29 @@
   warning ("lsode_options: no match for `%s'", keyword.c_str ());
 }
 
+static void
+set_lsode_option (const std::string& keyword, const std::string& val)
+{
+  LSODE_OPTIONS *list = lsode_option_table;
+
+  while (list->keyword != 0)
+    {
+      if (keyword_almost_match (list->kw_tok, list->min_len, keyword,
+				list->min_toks_to_match, MAX_TOKENS))
+	{
+	  if (list->s_set_fcn)
+	    (lsode_opts.*list->s_set_fcn) (val);
+	  else
+	    error ("lsode_options: no function to handle string option");
+
+	  return;
+	}
+      list++;
+    }
+
+  warning ("lsode_options: no match for `%s'", keyword.c_str ());
+}
+
 static octave_value_list
 show_lsode_option (const std::string& keyword)
 {
@@ -511,7 +553,7 @@
 	      else
 		retval = val;
 	    }
-	  else
+	  else if (list->i_get_fcn)
 	    {
 	      int val = (lsode_opts.*list->i_get_fcn) ();
 	      if (val < 0)
@@ -519,6 +561,12 @@
 	      else
 		retval = static_cast<double> (val);
 	    }
+	  else if (list->s_get_fcn)
+	    {
+	      retval = (lsode_opts.*list->s_get_fcn) ();
+	    }
+	  else
+	    panic_impossible ();
 
 	  return retval;
 	}
@@ -558,7 +606,14 @@
 	    retval = show_lsode_option (keyword);
 	  else
 	    {
-	      if (args(1).is_scalar_type ())
+	      if (args(1).is_string ())
+		{
+		  std::string val = args(1).string_value ();
+
+		  if (! error_state)
+		    set_lsode_option (keyword, val);
+		}
+	      else if (args(1).is_scalar_type ())
 		{
 		  double val = args(1).double_value ();