CLASS = "LSODE"

INCLUDE = "ODE.h"

OPTION
  NAME = "absolute tolerance"
  DOC_ITEM
Absolute tolerance.  May be either vector or scalar.  If a vector, it
must match the dimension of the state vector.
  END_DOC_ITEM
  TYPE = "Array<double>"
  SET_ARG_TYPE = "const $TYPE&"
  INIT_BODY
    $OPTVAR.resize (1);
    $OPTVAR(0) = ::sqrt (DBL_EPSILON);
  END_INIT_BODY
  SET_CODE
    void set_$OPT (double val)
      {
        $OPTVAR.resize (1);
        $OPTVAR(0) = (val > 0.0) ? val : ::sqrt (DBL_EPSILON);
        reset = true;
      }

    void set_$OPT (const $TYPE& val)
      { $OPTVAR = val; reset = true; }
  END_SET_CODE
END_OPTION

OPTION
  NAME = "relative tolerance"
  DOC_ITEM
Relative tolerance parameter.  Unlike the absolute tolerance, this
parameter may only be a scalar.

The local error test applied at each integration step is

@example
  abs (local error in x(i)) <= rtol * abs (y(i)) + atol(i)
@end example
  END_DOC_ITEM
  TYPE = "double"
  INIT_VALUE = "::sqrt (DBL_EPSILON)"
  SET_EXPR = "(val > 0.0) ? val : ::sqrt (DBL_EPSILON)"
END_OPTION

OPTION
  NAME = "integration method"
A string specifing the method of integration to use to solve the ODE
system.  Valid values are

@table @asis
@item \"adams\"
@itemx \"non-stiff\"
No Jacobian used (even if it is available).
@item \"bdf\"
@item \"stiff\"
Use stiff backward differentiation formula (BDF) method.  If a
function to compute the Jacobian is not supplied, @code{lsode} will
compute a finite difference approximation of the Jacobian matrix.
@end table
  DOC_ITEM
  END_DOC_ITEM
  TYPE = "std::string"
  SET_ARG_TYPE = "const $TYPE&"
  INIT_VALUE = ""stiff""
  SET_BODY
    if (val == "stiff" || val == "bdf")
      $OPTVAR = "stiff";
    else if (val == "non-stiff" || val == "adams")
      $OPTVAR = "non-stiff";
    else
      (*current_liboctave_error_handler)
        ("lsode_options: method must be \"stiff\", \"bdf\", \"non-stiff\", or \"adams\"");
  END_SET_BODY
END_OPTION

OPTION
  NAME = "initial step size"
  DOC_ITEM
The step size to be attempted on the first step (default is determined
automatically).
  END_DOC_ITEM
  TYPE = "double"
  INIT_VALUE = "-1.0"
  SET_EXPR = "(val >= 0.0) ? val : -1.0"
END_OPTION

OPTION
  NAME = "maximum step size"
  DOC_ITEM
Setting the maximum stepsize will avoid passing over very large
regions  (default is not specified).
  END_DOC_ITEM
  TYPE = "double"
  INIT_VALUE = "-1.0"
  SET_EXPR = "(val >= 0.0) ? val : -1.0"
END_OPTION

OPTION
  NAME = "minimum step size"
  DOC_ITEM
The minimum absolute step size allowed (default is 0).
  END_DOC_ITEM
  TYPE = "double"
  INIT_VALUE = "0.0"
  SET_EXPR = "(val >= 0.0) ? val : 0.0"
END_OPTION

OPTION
  NAME = "step limit"
  DOC_ITEM
Maximum number of steps allowed (default is 100000).
  END_DOC_ITEM
  TYPE = "int"
  INIT_VALUE = "100000"
  SET_EXPR = "val"
END_OPTION
