// Bound2D constructor (Flow2D,uint,uint,uint,uint)
Bound2D::Bound2D(char* name,   
                 UMatrix2D< FlowNode2D<FP, NUM_COMPONENTS> >* J,
                 unsigned int X1, unsigned int Y1,
                 unsigned int X2, unsigned int Y2,
                 int      bt,
                 Flow2D*  pInFlow2D,
                 FP*  p_Y,
                 int     btc) {
    pBoundFlow2D = pInFlow2D;

    pBoundFlow   = NULL;

    InitBound(name,J,bt,p_Y,btc);
    
    Start.SetX(X1);
    Start.SetY(Y1);

    End.SetX(X2);
    End.SetY(Y2);

    fStart.SetX((FP)X1);
    fStart.SetY((FP)Y1);

    fEnd.SetX((FP)X2);
    fEnd.SetY((FP)Y2);
}
// Bound constructor (Flow2D,FP,FP,FP,FP)
Bound2D::Bound2D(char* name,   
                 UMatrix2D< FlowNode2D<FP, NUM_COMPONENTS> >* J,
                 FP  x1,
                 FP  y1,
                 FP  x2,
                 FP  y2,
                 int     bt,
                 Flow2D*           pInFlow2D,
                 FP* p_Y,
                 int     btc) {

    pBoundFlow2D = pInFlow2D;

    pBoundFlow   = NULL;

    InitBound(name, J, bt,p_Y,btc);
    
    Start.SetX(static_cast<unsigned int>(x1/dx));
    Start.SetY(static_cast<unsigned int>(y1/dy));

    End.SetX(static_cast<unsigned int>(x2/dx));
    End.SetY(static_cast<unsigned int>(y2/dy));
    
    fStart.SetX(x1);
    fStart.SetY(y1);

    fEnd.SetX(x2);
    fEnd.SetY(y2);
}
VectorXd VoxelSolver::solveEx()
{
  VectorXd res(num);
  real_1d_array x;
  minbleicstate state;
  minbleicreport rep;
  double epsg = 0;
  double epsf = 0;
  double epsx = 0;
  ae_int_t maxits = 0;

  x.setlength(num);
  for (int i=0;i<num;i++)
  {
    x[i]=0;
  }
  minbleiccreate(x, state);

  InitBound();
  minbleicsetbc(state, lb, ub);

  InitConstrainEx();
  minbleicsetlc(state, cs, ct);

  minbleicsetcond(state, epsg, epsf, epsx, maxits);
  alglib::minbleicoptimize(state, function_grad2);
  minbleicresults(state, x, rep);

  for (int i=0;i<num;i++)
  {
    res[i]=x[i];
  }

  return res;
}
// Bound2D constructor (Flow2D,XY<uint,uint>,XY<uint,uint>)
Bound2D::Bound2D(char* name,   
                 UMatrix2D< FlowNode2D<FP, NUM_COMPONENTS> >* J,
                 XY<FP>*  p_start,
                 XY<FP>*  p_end,
                 int      bt,
                 Flow2D*  pInFlow2D,
                 FP*      p_Y,
                 int      btc) {

    pBoundFlow2D = pInFlow2D;

    pBoundFlow   = NULL;

    InitBound(name, J, bt,p_Y,btc);
    fStart.SetXY(p_start);
    fEnd.SetXY(p_end);
    Start.SetX(static_cast<unsigned int>(fStart.GetX()));
    Start.SetY(static_cast<unsigned int>(fStart.GetY()));

    End.SetX(static_cast<unsigned int>(fEnd.GetX()));
    End.SetY(static_cast<unsigned int>(fEnd.GetY()));
}