#include <octave/oct.h>
#include <octave/DASSL.h>
#ifdef OCTAVE_DEV
#include <octave/parse.h>
#define VECTOR_VALUE column_vector_value
#else // !OCTAVE_DEV
#include <octave/toplev.h>
#define VECTOR_VALUE vector_value
#endif // OCTAVE_DEV
// Code generation directives
#define STANDALONE 0
#define OCTAVEDLD 1
#if (! defined (CODEGENTARGET))
#define CODEGENTARGET STANDALONE
#endif // (! defined (CODEGENTARGET))
#if (CODEGENTARGET == STANDALONE)
extern ColumnVector
Fmtt_residual (const ColumnVector &X, const ColumnVector &DX, double t, int &ires);
#endif // (CODEGENTARGET == STANDALONE)
ColumnVector
mtt_residual (const ColumnVector &X, const ColumnVector &DX, double t, int &ires)
{
#if (CODEGENTARGET == STANDALONE)
return Fmtt_residual (X, DX, t, ires);
#elif (CODEGENTARGET == OCTAVEDLD)
static octave_value_list args, f;
args(0) = octave_value (X);
args(1) = octave_value (DX);
args(2) = octave_value (t);
args(3) = octave_value (static_cast<double>(ires));
f = feval ("mtt_residual", args, 1);
return f(0).VECTOR_VALUE ();
#endif // (CODEGENTARGET == STANDALONE)
}
#if (CODEGENTARGET == STANDALONE)
ColumnVector
Fmtt_dassl ( ColumnVector &x,
const ColumnVector &u,
const double &t,
const ColumnVector &par,
const ColumnVector &dx,
const double &ddt,
const int Nx,
const int Nyz,
const ColumnVector &openx)
{
#elif (CODEGENTARGET == OCTAVEDLD)
DEFUN_DLD (mtt_dassl, args, ,
"dassl integration method")
{
ColumnVector x = args(0).VECTOR_VALUE();
const ColumnVector u = args(1).VECTOR_VALUE();
const double t = args(2).double_value();
const ColumnVector par = args(3).VECTOR_VALUE();
const ColumnVector dx = args(4).VECTOR_VALUE();
const double ddt = args(5).double_value();
const int Nx = static_cast<int> (args(6).double_value());
const int Nyz = static_cast<int> (args(7).double_value());
const ColumnVector openx = args(8).VECTOR_VALUE();
#endif // (CODEGENTARGET == STANDALONE)
static DAEFunc fdae(mtt_residual);
static ColumnVector XX (Nx+Nyz);
XX.insert (x,0);
for (register int i = Nx; i < Nx+Nyz; i++)
XX(i) = 0.0;
double tout = t + ddt;
DASSL fdassl (XX, t, fdae);
x = fdassl.do_integrate (tout).extract (0,Nx-1);
for (register int i = 0; i < Nx; i++)
if (openx (i) > 0.5)
x (i) = 0.0;
#if (CODEGENTARGET == STANDALONE)
return x;
#elif (CODEGENTARGET == OCTAVEDLD)
return octave_value (x);
#endif // (CODEGENTARGET == STANDALONE)
}