From 623bde1b56612f16d5aeec6059107a6082c06aa5 Mon Sep 17 00:00:00 2001
From: sebastien <sebastien@ac1d8469-bf42-47a9-8791-bf33cf982152>
Date: Fri, 17 Oct 2008 17:21:22 +0000
Subject: [PATCH] trunk preprocessor: removed LCC_COMPILER and GCC_COMPILER
 options of SPARSE_DLL mode

git-svn-id: https://www.dynare.org/svn/dynare/dynare_v4@2177 ac1d8469-bf42-47a9-8791-bf33cf982152
---
 ComputingTasks.cc         |   22 +-
 DynareBison.yy            |   30 +-
 DynareFlex.ll             |    3 -
 ModelTree.cc              | 1871 ++++++++++---------------------------
 ParsingDriver.cc          |   16 +-
 include/ComputingTasks.hh |    4 +-
 include/ModelTree.hh      |   17 +-
 include/ParsingDriver.hh  |    7 -
 8 files changed, 490 insertions(+), 1480 deletions(-)

diff --git a/ComputingTasks.cc b/ComputingTasks.cc
index c357d32f..612c56ec 100644
--- a/ComputingTasks.cc
+++ b/ComputingTasks.cc
@@ -104,9 +104,8 @@ SimulStatement::writeOutput(ostream &output, const string &basename) const
 }
 
 SimulSparseStatement::SimulSparseStatement(const OptionsList &options_list_arg,
-                                           int compiler_arg, int mode_arg) :
+                                           int mode_arg) :
   options_list(options_list_arg),
-  compiler(compiler_arg),
   mode(mode_arg)
 {
 }
@@ -130,24 +129,7 @@ SimulSparseStatement::writeOutput(ostream &output, const string &basename) const
   output << "  end\n";
   output << "end\n";
   if(mode==eSparseDLLMode)
-    {
-      if(compiler!=NO_COMPILE)
-        {
-          output << "disp('compiling...');\n";
-          output << "t0=clock;\n";
-          if (compiler == 0)
-            output << "mex " << basename << "_dynamic.c;\n";
-          else
-            output << "mex " << basename << "_dynamic.cc;\n";
-          output << "disp(['compiling time: ' num2str(etime(clock,t0))]);\n";
-          output << "oo_.endo_simul=" << basename << "_dynamic;\n";
-        }
-      else
-        {
-          output << "oo_.endo_simul=simulate;\n";
-          output << "clear simulate.dll;\n";
-        }
-    }
+    output << "oo_.endo_simul=simulate;\n";
   else
     {
       //output << "oo_.endo_simul=" << basename << "_dynamic();\n";
diff --git a/DynareBison.yy b/DynareBison.yy
index 89fcf57d..ccdcaf96 100644
--- a/DynareBison.yy
+++ b/DynareBison.yy
@@ -90,19 +90,19 @@ class ParsingDriver;
 %token FILENAME FILTER_STEP_AHEAD FILTERED_VARS FIRST_OBS
 %token <string_val> FLOAT_NUMBER
 %token FORECAST
-%token GAMMA_PDF GAUSSIAN_ELIMINATION GCC_COMPILER GMRES GRAPH
+%token GAMMA_PDF GAUSSIAN_ELIMINATION GMRES GRAPH
 %token HISTVAL HP_FILTER HP_NGRID
 %token INITVAL INITVAL_FILE
 %token <string_val> INT_NUMBER
 %token INV_GAMMA1_PDF INV_GAMMA2_PDF IRF
 %token KALMAN_ALGO KALMAN_TOL
-%token LAPLACE LCC_COMPILER LIK_ALGO LIK_INIT LINEAR LOAD_MH_FILE LOGLINEAR LU
+%token LAPLACE LIK_ALGO LIK_INIT LINEAR LOAD_MH_FILE LOGLINEAR LU
 %token MARKOWITZ MARGINAL_DENSITY MAX
 %token METHOD MH_DROP MH_INIT_SCALE MH_JSCALE MH_MODE MH_NBLOCKS MH_REPLIC MH_RECOVER MIN
 %token MODE_CHECK MODE_COMPUTE MODE_FILE MODEL MODEL_COMPARISON MODEL_INFO MSHOCKS
 %token MODIFIEDHARMONICMEAN MOMENTS_VARENDO DIFFUSE_FILTER
 %token <string_val> NAME
-%token NO_COMPILER NOBS NOCONSTANT NOCORR NODIAGNOSTIC NOFUNCTIONS
+%token NOBS NOCONSTANT NOCORR NODIAGNOSTIC NOFUNCTIONS
 %token NOGRAPH NOMOMENTS NOPRINT NORMAL_PDF
 %token OBSERVATION_TRENDS OPTIM OPTIM_WEIGHTS ORDER OSR OSR_PARAMS
 %token PARAMETERS PERIODS PLANNER_OBJECTIVE PREFILTER PRESAMPLE
@@ -393,27 +393,11 @@ histval_list : histval_list histval_elem
 
 histval_elem : NAME '(' signed_integer ')' EQUAL expression ';' { driver.hist_val($1, $3, $6); };
 
-model_sparse_dll_options_list : model_sparse_dll_options_list COMMA model_sparse_dll_options
-                          | model_sparse_dll_options
+model_sparse_options_list : model_sparse_options_list COMMA model_sparse_options
+                          | model_sparse_options
                           ;
 
-model_sparse_options_list : model_sparse_options_list COMMA model_sparse_common_options
-                          | model_sparse_common_options
-                          ;
-
-model_sparse_dll_options : model_compiler_options
-                         | model_sparse_common_options
-                         ;
-
-model_compiler_options : LCC_COMPILER
-                       { driver.init_compiler(0); }
-                     | GCC_COMPILER
-                       { driver.init_compiler(1); }
-                     | NO_COMPILER
-                       { driver.init_compiler(2); }
-                      ;
-
-model_sparse_common_options : o_cutoff
+model_sparse_options : o_cutoff
                      | o_markowitz
                      ;
 
@@ -423,7 +407,7 @@ model : MODEL ';' { driver.begin_model(); }
         equation_list END { driver.reset_data_tree(); }
       | MODEL '(' USE_DLL ')' ';' { driver.begin_model(); driver.use_dll(); }
         equation_list END { driver.reset_data_tree(); }
-      | MODEL '(' SPARSE_DLL COMMA model_sparse_dll_options_list ')'
+      | MODEL '(' SPARSE_DLL COMMA model_sparse_options_list ')'
         { driver.begin_model(); driver.sparse_dll(); } ';'
         equation_list END { driver.reset_data_tree(); }
       | MODEL '(' SPARSE_DLL ')' { driver.begin_model(); driver.sparse_dll(); } ';'
diff --git a/DynareFlex.ll b/DynareFlex.ll
index 30ee679c..a7df257f 100644
--- a/DynareFlex.ll
+++ b/DynareFlex.ll
@@ -283,9 +283,6 @@ int sigma_e = 0;
 <DYNARE_STATEMENT,DYNARE_BLOCK>bicgstab {return token::BICGSTAB;}
 <DYNARE_STATEMENT,DYNARE_BLOCK>sparse {return token::SPARSE;}
 <DYNARE_STATEMENT,DYNARE_BLOCK>sparse_dll {return token::SPARSE_DLL;}
-<DYNARE_STATEMENT,DYNARE_BLOCK>gcc_compiler {return token::GCC_COMPILER;}
-<DYNARE_STATEMENT,DYNARE_BLOCK>lcc_compiler {return token::LCC_COMPILER;}
-<DYNARE_STATEMENT,DYNARE_BLOCK>no_compiler {return token::NO_COMPILER;}
 <DYNARE_STATEMENT,DYNARE_BLOCK>linear {return token::LINEAR;}
 <DYNARE_STATEMENT,DYNARE_BLOCK>[,] {return token::COMMA;}
 <DYNARE_STATEMENT,DYNARE_BLOCK>[:] {return Dynare::parser::token_type (yytext[0]);}
diff --git a/ModelTree.cc b/ModelTree.cc
index 86a0fd93..becc64be 100644
--- a/ModelTree.cc
+++ b/ModelTree.cc
@@ -32,7 +32,6 @@ ModelTree::ModelTree(SymbolTable &symbol_table_arg,
                      NumericalConstants &num_constants_arg) :
   DataTree(symbol_table_arg, num_constants_arg),
   mode(eStandardMode),
-  compiler(NO_COMPILE),
   cutoff(1e-12),
   markowitz(0.7),
   new_SGE(true),
@@ -344,244 +343,6 @@ ModelTree::computeTemporaryTermsOrdered(int order, Model_Block *ModelBlock)
   /*EndNew*/
 }
 
-void
-ModelTree::writeModelEquationsOrdered_C(ostream &output, Model_Block *ModelBlock) const
-{
-  int i,j,k,m;
-  string tmp_s;
-  ostringstream tmp_output;
-  NodeID lhs=NULL, rhs=NULL;
-  BinaryOpNode *eq_node;
-  bool OK, lhs_rhs_done, skip_the_head;
-  ostringstream Uf[symbol_table.endo_nbr];
-  map<NodeID, int> reference_count;
-  int prev_Simulation_Type=-1;
-  temporary_terms_type::const_iterator it_temp=temporary_terms.begin();
-  //----------------------------------------------------------------------
-  //Temporary variables declaration
-  OK=true;
-  for(temporary_terms_type::const_iterator it = temporary_terms.begin();
-      it != temporary_terms.end(); it++)
-    {
-      if (OK)
-        OK=false;
-      else
-        tmp_output << ", ";
-
-      (*it)->writeOutput(tmp_output, oCDynamicModel, temporary_terms);
-
-      tmp_output << "[" << block_triangular.periods + variable_table.max_lag+variable_table.max_lead << "]";
-    }
-  if (tmp_output.str().length()>0)
-    {
-      output << "double " << tmp_output.str() << ";\n\n";
-    }
-  //For each block
-  for(j = 0;j < ModelBlock->Size;j++)
-    {
-      //For a block composed of a single equation determines wether we have to evaluate or to solve the equation
-      if (ModelBlock->Block_List[j].Size==1)
-        {
-          lhs_rhs_done=true;
-          eq_node = equations[ModelBlock->Block_List[j].Equation[0]];
-          lhs = eq_node->arg1;
-          rhs = eq_node->arg2;
-          tmp_output.str("");
-          lhs->writeOutput(tmp_output, oCDynamicModelSparseDLL, temporary_terms);
-        }
-      else
-        lhs_rhs_done=false;
-      if (BlockTriangular::BlockSim(prev_Simulation_Type)==BlockTriangular::BlockSim(ModelBlock->Block_List[j].Simulation_Type)
-          && (ModelBlock->Block_List[j].Simulation_Type==EVALUATE_BACKWARD
-              ||ModelBlock->Block_List[j].Simulation_Type==EVALUATE_FOREWARD
-              ||ModelBlock->Block_List[j].Simulation_Type==EVALUATE_BACKWARD_R
-              ||ModelBlock->Block_List[j].Simulation_Type==EVALUATE_FOREWARD_R ))
-        skip_the_head=true;
-      else
-        skip_the_head=false;
-      if (!skip_the_head)
-        {
-          if (j>0)
-            output << "}\n\n";
-          output << "void Dynamic" << j+1 << "(double *y, double *x, double *residual, double *g1, double *g2)\n";
-          output << "{\n";
-          output << "  ////////////////////////////////////////////////////////////////////////\n" <<
-            "  //" << string("                     Block ").substr(int(log10(j + 1))) << j + 1 << " " << BlockTriangular::BlockType0(ModelBlock->Block_List[j].Type) <<
-            "          //\n" <<
-            "  //                     Simulation type ";
-          output << BlockTriangular::BlockSim(ModelBlock->Block_List[j].Simulation_Type) << "  //\n" <<
-            "  ////////////////////////////////////////////////////////////////////////\n";
-#ifdef CONDITION
-          if (ModelBlock->Block_List[j].Simulation_Type==SOLVE_TWO_BOUNDARIES_COMPLETE)
-            output << "  longd condition[" << ModelBlock->Block_List[j].Size << "]; /*to improve condition*/\n";
-#endif
-        }
-      //The Temporary terms
-      temporary_terms_type tt2;
-      if (ModelBlock->Block_List[j].Temporary_terms->size())
-        output << "  //Temporary variables\n";
-      i=0;
-      for(temporary_terms_type::const_iterator it = ModelBlock->Block_List[j].Temporary_terms->begin();
-          it != ModelBlock->Block_List[j].Temporary_terms->end(); it++)
-        {
-          output << "  ";
-          (*it)->writeOutput(output, oCDynamicModelSparseDLL, temporary_terms);
-          output << " = ";
-          (*it)->writeOutput(output, oCDynamicModelSparseDLL, tt2);
-          // Insert current node into tt2
-          tt2.insert(*it);
-          output << ";" << endl;
-          i++;
-        }
-      // The equations
-      for(i = 0;i < ModelBlock->Block_List[j].Size;i++)
-        {
-          ModelBlock->Block_List[j].Variable_Sorted[i] = variable_table.getID(eEndogenous, ModelBlock->Block_List[j].Variable[i], 0);
-          string sModel = symbol_table.getNameByID(eEndogenous, ModelBlock->Block_List[j].Variable[i]) ;
-          output << "  //equation " << ModelBlock->Block_List[j].Equation[i] << " variable : " <<
-            sModel << " (" << ModelBlock->Block_List[j].Variable[i] << ")\n";
-          if (!lhs_rhs_done)
-            {
-              eq_node = equations[ModelBlock->Block_List[j].Equation[i]];
-              lhs = eq_node->arg1;
-              rhs = eq_node->arg2;
-              tmp_output.str("");
-              lhs->writeOutput(tmp_output, oCDynamicModelSparseDLL, temporary_terms);
-            }
-          output << "  ";
-          switch(ModelBlock->Block_List[j].Simulation_Type)
-            {
-            case EVALUATE_BACKWARD:
-            case EVALUATE_FOREWARD:
-              output << tmp_output.str();
-              output << " = ";
-              rhs->writeOutput(output, oCDynamicModelSparseDLL, temporary_terms);
-              output << ";\n";
-              break;
-            case EVALUATE_BACKWARD_R:
-            case EVALUATE_FOREWARD_R:
-              rhs->writeOutput(output, oCDynamicModelSparseDLL, temporary_terms);
-              output << " = ";
-              lhs->writeOutput(output, oCDynamicModelSparseDLL, temporary_terms);
-              output << ";\n";
-              break;
-            case SOLVE_BACKWARD_COMPLETE:
-            case SOLVE_FOREWARD_COMPLETE:
-              Uf[ModelBlock->Block_List[j].Equation[i]] << "  u[" << i << "] = residual[" << i << "]";
-              goto end;
-            case SOLVE_TWO_BOUNDARIES_COMPLETE:
-              Uf[ModelBlock->Block_List[j].Equation[i]] << "  u[" << i << "+Per_u_] = residual[" << i << "]";
-              goto end;
-            default:
-            end:
-              output << "residual[" << i << "] = (";
-              output << tmp_output.str();
-              output << ") - (";
-              rhs->writeOutput(output, oCDynamicModelSparseDLL, temporary_terms);
-              output << ");\n";
-#ifdef CONDITION
-              if (ModelBlock->Block_List[j].Simulation_Type==SOLVE_TWO_BOUNDARIES_COMPLETE)
-                output << "  condition[" << i << "]=0;\n";
-#endif
-            }
-        }
-      // The Jacobian if we have to solve the block
-      if (ModelBlock->Block_List[j].Simulation_Type!=EVALUATE_BACKWARD
-          && ModelBlock->Block_List[j].Simulation_Type!=EVALUATE_FOREWARD
-          && ModelBlock->Block_List[j].Simulation_Type!=EVALUATE_BACKWARD_R
-          && ModelBlock->Block_List[j].Simulation_Type!=EVALUATE_FOREWARD_R)
-        {
-          output << "  /* Jacobian  */\n";
-          switch(ModelBlock->Block_List[j].Simulation_Type)
-            {
-            case SOLVE_BACKWARD_SIMPLE:
-            case SOLVE_FOREWARD_SIMPLE:
-              output << "  g1[0]=";
-              writeDerivative(output, ModelBlock->Block_List[j].Equation[0], ModelBlock->Block_List[j].Variable[0], 0, oCDynamicModelSparseDLL, temporary_terms);
-              output << "; /* variable=" <<  symbol_table.getNameByID(eEndogenous, ModelBlock->Block_List[j].Variable[0])
-                     <<"(" << variable_table.getLag(variable_table.getSymbolID(ModelBlock->Block_List[j].Variable[0])) << ") " << ModelBlock->Block_List[j].Variable[0]
-                     << ", equation=" <<  ModelBlock->Block_List[j].Equation[0] << "*/\n";
-              break;
-            case SOLVE_BACKWARD_COMPLETE:
-            case SOLVE_FOREWARD_COMPLETE:
-              m=ModelBlock->Block_List[j].Max_Lag;
-              for(i=0;i<ModelBlock->Block_List[j].IM_lead_lag[m].size;i++)
-                {
-                  int eq=ModelBlock->Block_List[j].IM_lead_lag[m].Equ_Index[i];
-                  int var=ModelBlock->Block_List[j].IM_lead_lag[m].Var_Index[i];
-                  int u=ModelBlock->Block_List[j].IM_lead_lag[m].us[i];
-                  int eqr=ModelBlock->Block_List[j].IM_lead_lag[m].Equ[i];
-                  Uf[ModelBlock->Block_List[j].Equation[eqr]] << "-u[" << u << "]*y[Per_y_+" << var << "]";
-                  output << "  u[" << u << "] = ";
-                  writeDerivative(output, eq, var, 0, oCDynamicModelSparseDLL, temporary_terms);
-                  output << "; // variable=" <<  symbol_table.getNameByID(eEndogenous, var)
-                         <<"(" << variable_table.getLag(variable_table.getSymbolID(var))<< ") " << var
-                         << ", equation=" <<  eq << "\n";
-                }
-              for(i = 0;i < ModelBlock->Block_List[j].Size;i++)
-                output << Uf[ModelBlock->Block_List[j].Equation[i]].str() << ";\n";
-              break;
-            case SOLVE_TWO_BOUNDARIES_COMPLETE:
-              for(m=0;m<=ModelBlock->Block_List[j].Max_Lead+ModelBlock->Block_List[j].Max_Lag;m++)
-                {
-                  k=m-ModelBlock->Block_List[j].Max_Lag;
-                  for(i=0;i<ModelBlock->Block_List[j].IM_lead_lag[m].size;i++)
-                    {
-                      int eq=ModelBlock->Block_List[j].IM_lead_lag[m].Equ_Index[i];
-                      int var=ModelBlock->Block_List[j].IM_lead_lag[m].Var_Index[i];
-                      int u=ModelBlock->Block_List[j].IM_lead_lag[m].u[i];
-                      int eqr=ModelBlock->Block_List[j].IM_lead_lag[m].Equ[i];
-                      if (k==0)
-                        Uf[ModelBlock->Block_List[j].Equation[eqr]] << "-u[" << u << "+Per_u_]*y[Per_y_+" << var << "]";
-                      else if (k>0)
-                        Uf[ModelBlock->Block_List[j].Equation[eqr]] << "-u[" << u << "+Per_u_]*y[(it_+" << k << ")*y_size+" << var << "]";
-                      else if (k<0)
-                        Uf[ModelBlock->Block_List[j].Equation[eqr]] << "-u[" << u << "+Per_u_]*y[(it_" << k << ")*y_size+" << var << "]";
-                      output << "  u[" << u << "+Per_u_] = ";
-                      writeDerivative(output, eq, var, k, oCDynamicModelSparseDLL, temporary_terms);
-                      output << "; // variable=" <<  symbol_table.getNameByID(eEndogenous, var)
-                             <<"(" << k << ") " << var
-                             << ", equation=" <<  eq << "\n";
-#ifdef CONDITION
-                      output << "  if (fabs(condition[" << eqr << "])<fabs(u[" << u << "+Per_u_]))\n";
-                      output << "    condition[" << eqr << "]=u[" << u << "+Per_u_];\n";
-#endif
-                    }
-                }
-              for(i = 0;i < ModelBlock->Block_List[j].Size;i++)
-                {
-                  output << Uf[ModelBlock->Block_List[j].Equation[i]].str() << ";\n";
-#ifdef CONDITION
-                  output << "  if (fabs(condition[" << i << "])<fabs(u[" << i << "+Per_u_]))\n";
-                  output << "    condition[" << i << "]=u[" << i << "+Per_u_];\n";
-#endif
-                }
-#ifdef CONDITION
-              for(m=0;m<=ModelBlock->Block_List[j].Max_Lead+ModelBlock->Block_List[j].Max_Lag;m++)
-                {
-                  k=m-ModelBlock->Block_List[j].Max_Lag;
-                  for(i=0;i<ModelBlock->Block_List[j].IM_lead_lag[m].size;i++)
-                    {
-                      int eq=ModelBlock->Block_List[j].IM_lead_lag[m].Equ_Index[i];
-                      int var=ModelBlock->Block_List[j].IM_lead_lag[m].Var_Index[i];
-                      int u=ModelBlock->Block_List[j].IM_lead_lag[m].u[i];
-                      int eqr=ModelBlock->Block_List[j].IM_lead_lag[m].Equ[i];
-                      output << "  u[" << u << "+Per_u_] /= condition[" << eqr << "];\n";
-                    }
-                }
-              for(i = 0;i < ModelBlock->Block_List[j].Size;i++)
-                output << "  u[" << i << "+Per_u_] /= condition[" << i << "];\n";
-#endif
-              break;
-            }
-        }
-      prev_Simulation_Type=ModelBlock->Block_List[j].Simulation_Type;
-    }
-  output << "}\n\n";
-}
-
-
-
 void
 ModelTree::writeModelEquationsOrdered_M(ostream &output, Model_Block *ModelBlock, const string &dynamic_basename) const
 {
@@ -1923,97 +1684,6 @@ ModelTree::reform(const string name1) const
   return (name);
 }
 
-void
-ModelTree::writeSparseDLLDynamicHFile(const string &dynamic_basename) const
-{
-  string filename;
-  ofstream mDynamicModelFile;
-  string tmp_s;
-  int i, j;
-
-  if (compiler == LCC_COMPILE)
-    filename = dynamic_basename + ".h";
-  else
-    filename = dynamic_basename + ".hh";
-  mDynamicModelFile.open(filename.c_str(), ios::out | ios::binary);
-  if (!mDynamicModelFile.is_open())
-    {
-      cout << "ModelTree::Open : Error : Can't open file " << filename
-           << ".h for writing\n";
-      exit(-1);
-    }
-  filename.erase(filename.end() - 2, filename.end());
-  tmp_s = filename;
-  j = tmp_s.size();
-  for(i = 0;i < j;i++)
-    if ((tmp_s[i] == '\\') || (tmp_s[i] == '.') || (tmp_s[i] == ':'))
-      tmp_s[i] = '_';
-  mDynamicModelFile << "#ifndef " << tmp_s << "\n";
-  mDynamicModelFile << "#define " << tmp_s << "\n";
-  if (compiler==LCC_COMPILE)
-    {
-      mDynamicModelFile << "typedef struct IM_compact\n";
-      mDynamicModelFile << "{\n";
-      mDynamicModelFile << "  int size, u_init, u_finish, nb_endo;\n";
-      mDynamicModelFile << "  int *u, *Var, *Equ, *Var_Index, *Equ_Index, *Var_dyn_Index;\n";
-      mDynamicModelFile << "} IM_compact;\n";
-      mDynamicModelFile << "typedef struct Variable_l\n";
-      mDynamicModelFile << "{\n";
-      mDynamicModelFile << "  int* Index;\n";
-      mDynamicModelFile << "} Variable_l;\n";
-      mDynamicModelFile << "typedef struct tBlock\n";
-      mDynamicModelFile << "{\n";
-      mDynamicModelFile << "    int Size, Sized, Type, Max_Lead, Max_Lag, Simulation_Type, /*icc1_size,*/ Nb_Lead_Lag_Endo;\n";
-      mDynamicModelFile << "    int *Variable, *dVariable, *Equation/*, *icc1, *ics*/;\n";
-      mDynamicModelFile << "    int *variable_dyn_index, *variable_dyn_leadlag;\n";
-      mDynamicModelFile << "    IM_compact *IM_lead_lag;\n";
-      mDynamicModelFile << "} tBlock;\n";
-      mDynamicModelFile << "\n";
-      mDynamicModelFile << "typedef struct tModel_Block\n";
-      mDynamicModelFile << "{\n";
-      mDynamicModelFile << "    int Size;\n";
-      mDynamicModelFile << "    tBlock * List;\n";
-      mDynamicModelFile << "} tModel_Block;\n";
-      mDynamicModelFile << "\n";
-      mDynamicModelFile << "double *u, slowc, max_res, res2, res1;\n";
-      mDynamicModelFile << "double *params;\n";
-      mDynamicModelFile << "int it_,Per_u_;\n";
-      mDynamicModelFile << "bool cvg;\n";
-      mDynamicModelFile << "int nb_row_x;\n";
-      mDynamicModelFile << "int y_kmin, y_kmax,periods, x_size, y_size, u_size, maxit_;\n";
-      mDynamicModelFile << "double *y=NULL, *x=NULL, *r=NULL, *g1=NULL, *g2=NULL, solve_tolf, dynaretol;\n";
-      mDynamicModelFile << "pctimer_t t0, t1;\n";
-    }
-  else
-    {
-      mDynamicModelFile << "typedef struct IM_compact\n";
-      mDynamicModelFile << "{\n";
-      mDynamicModelFile << "  int size, u_init, u_finish, nb_endo;\n";
-      mDynamicModelFile << "  int *u, *Var, *Equ, *Var_Index, *Equ_Index, *Var_dyn_Index;\n";
-      mDynamicModelFile << "};\n";
-      mDynamicModelFile << "typedef struct Variable_l\n";
-      mDynamicModelFile << "{\n";
-      mDynamicModelFile << "  int* Index;\n";
-      mDynamicModelFile << "};\n";
-      mDynamicModelFile << "typedef struct tBlock\n";
-      mDynamicModelFile << "{\n";
-      mDynamicModelFile << "    int Size, Sized, Type, Max_Lead, Max_Lag, Simulation_Type, /*icc1_size,*/ Nb_Lead_Lag_Endo;\n";
-      mDynamicModelFile << "    int *Variable, *dVariable, *Equation/*, *icc1, *ics*/;\n";
-      mDynamicModelFile << "    int *variable_dyn_index, *variable_dyn_leadlag;\n";
-      mDynamicModelFile << "    IM_compact *IM_lead_lag;\n";
-      mDynamicModelFile << "};\n";
-      mDynamicModelFile << "\n";
-      mDynamicModelFile << "typedef struct tModel_Block\n";
-      mDynamicModelFile << "{\n";
-      mDynamicModelFile << "    int Size;\n";
-      mDynamicModelFile << "    tBlock * List;\n";
-      mDynamicModelFile << "};\n";
-      mDynamicModelFile << "\n";
-    }
-  mDynamicModelFile << "#endif\n";
-  mDynamicModelFile.close();
-}
-
 void
 ModelTree::Write_Inf_To_Bin_File(const string &dynamic_basename, const string &bin_basename, const int &num,
                                  int &u_count_int, bool &file_open) const
@@ -2291,1107 +1961,518 @@ ModelTree::writeSparseStaticMFile(const string &static_basename, const string &b
   mStaticModelFile.close();
 }
 
-
-/*void
-ModelTree::writeSparseDLLDynamicCFileAndBinFile(const string &dynamic_basename, const string &bin_basename, ExprNodeOutputType output_type) const*/
 void
-ModelTree::writeSparseDynamicFileAndBinFile(const string &dynamic_basename, const string &bin_basename, ExprNodeOutputType output_type, const int mode) const
+ModelTree::writeSparseDynamicMFile(const string &dynamic_basename, const string &basename, const int mode) const
 {
-  string filename, sp;
+  string sp;
   ofstream mDynamicModelFile;
   ostringstream tmp, tmp1, tmp_eq;
   int prev_Simulation_Type;
   SymbolicGaussElimination SGE;
   bool OK;
-  if(mode==eSparseDLLMode)
+  string filename = dynamic_basename + ".m";
+  mDynamicModelFile.open(filename.c_str(), ios::out | ios::binary);
+  if (!mDynamicModelFile.is_open())
     {
-      if (compiler == LCC_COMPILE || compiler == GCC_COMPILE)
+      cerr << "Error: Can't open file " << filename << " for writing" << endl;
+      exit(-1);
+    }
+  mDynamicModelFile << "%\n";
+  mDynamicModelFile << "% " << filename << " : Computes dynamic model for Dynare\n";
+  mDynamicModelFile << "%\n";
+  mDynamicModelFile << "% Warning : this file is generated automatically by Dynare\n";
+  mDynamicModelFile << "%           from model file (.mod)\n\n";
+  mDynamicModelFile << "%/\n";
+
+  int i, k, Nb_SGE=0;
+  bool printed = false, skip_head, open_par=false;
+  if (computeJacobian || computeJacobianExo || computeHessian)
+    {
+      mDynamicModelFile << "function [varargout] = " << dynamic_basename << "(varargin)\n";
+      mDynamicModelFile << "  global oo_ options_ M_ ;\n";
+      mDynamicModelFile << "  g2=[];g3=[];\n";
+      //Temporary variables declaration
+      OK=true;
+      ostringstream tmp_output;
+      for(temporary_terms_type::const_iterator it = temporary_terms.begin();
+          it != temporary_terms.end(); it++)
         {
-          if (compiler == LCC_COMPILE)
-            filename = dynamic_basename + ".c";
+          if (OK)
+            OK=false;
           else
-            filename = dynamic_basename + ".cc";
-          mDynamicModelFile.open(filename.c_str(), ios::out | ios::binary);
-          if (!mDynamicModelFile.is_open())
+            tmp_output << " ";
+          (*it)->writeOutput(tmp_output, oMatlabDynamicModel, temporary_terms);
+        }
+      if (tmp_output.str().length()>0)
+        mDynamicModelFile << "  global " << tmp_output.str() << " M_ ;\n";
+
+      mDynamicModelFile << "  T_init=zeros(1,options_.periods+M_.maximum_lag+M_.maximum_lead);\n";
+      tmp_output.clear();
+      OK=true;
+      for(temporary_terms_type::const_iterator it = temporary_terms.begin();
+          it != temporary_terms.end(); it++)
+        {
+          if (OK)
+            OK=false;
+          else
+            tmp_output << "=T_init;\n  ";
+          (*it)->writeOutput(tmp_output, oMatlabDynamicModel, temporary_terms);
+        }
+      if (tmp_output.str().length()>0)
+        mDynamicModelFile << tmp_output.str() << "=T_init;\n";
+
+      mDynamicModelFile << "  y_kmin=M_.maximum_lag;\n";
+      mDynamicModelFile << "  y_kmax=M_.maximum_lead;\n";
+      mDynamicModelFile << "  y_size=M_.endo_nbr;\n";
+      mDynamicModelFile << "  if(length(varargin)>0)\n";
+      mDynamicModelFile << "    %it is a simple evaluation of the dynamic model for time _it\n";
+      //mDynamicModelFile << "    global it_;\n";
+      mDynamicModelFile << "    it_=varargin{3};\n";
+      //mDynamicModelFile << "    g=zeros(y_size,y_size*(M_.maximum_endo_lag+M_.maximum_endo_lead+1));\n";
+      mDynamicModelFile << "    g1=spalloc(y_size,y_size*(M_.maximum_endo_lag+M_.maximum_endo_lead+1),y_size*y_size*(M_.maximum_endo_lag+M_.maximum_endo_lead+1));\n";
+      mDynamicModelFile << "    Per_u_=0;\n";
+      mDynamicModelFile << "    Per_y_=it_*y_size;\n";
+      mDynamicModelFile << "    y=varargin{1};\n";
+      mDynamicModelFile << "    ys=y(it_,:);\n";
+      /*mDynamicModelFile << "    y1=varargin{1};\n";
+        mDynamicModelFile << "    cnb_nz_elem=1;\n";
+        mDynamicModelFile << "    for i = -y_kmin:y_kmax\n";
+        mDynamicModelFile << "      nz_elem=find(M_.lead_lag_incidence(:,1+i+y_kmin));\n";
+        mDynamicModelFile << "      nb_nz_elem=length(nz_elem);\n";
+        mDynamicModelFile << "      y(it_+i, nz_elem)=y1(cnb_nz_elem:(cnb_nz_elem+nb_nz_elem));\n";
+        mDynamicModelFile << "      if(i==0)\n";
+        mDynamicModelFile << "        ys(nz_elem)=y(it_, nz_elem);\n";
+        mDynamicModelFile << "        nz_elem_s=nz_elem;\n";
+        mDynamicModelFile << "      end;\n";
+        mDynamicModelFile << "      cnb_nz_elem=cnb_nz_elem+nb_nz_elem;\n";
+        mDynamicModelFile << "    end;\n";*/
+      mDynamicModelFile << "    x=varargin{2};\n";
+      prev_Simulation_Type=-1;
+      tmp.str("");
+      tmp_eq.str("");
+      for(i = 0;i < block_triangular.ModelBlock->Size;i++)
+        {
+          k=block_triangular.ModelBlock->Block_List[i].Simulation_Type;
+          if ((BlockTriangular::BlockSim(prev_Simulation_Type)!=BlockTriangular::BlockSim(k))  &&
+              ((prev_Simulation_Type==EVALUATE_FOREWARD || prev_Simulation_Type==EVALUATE_BACKWARD || prev_Simulation_Type==EVALUATE_FOREWARD_R || prev_Simulation_Type==EVALUATE_BACKWARD_R)
+               || (k==EVALUATE_FOREWARD || k==EVALUATE_BACKWARD || k==EVALUATE_FOREWARD_R || k==EVALUATE_BACKWARD_R)))
             {
-              cerr << "Error: Can't open file " << filename << " for writing" << endl;
-              exit(-1);
+              mDynamicModelFile << "    y_index_eq=[" << tmp_eq.str() << "];\n";
+              tmp_eq.str("");
+              mDynamicModelFile << "    y_index=[" << tmp.str() << "];\n";
+              tmp.str("");
+              mDynamicModelFile << tmp1.str();
+              tmp1.str("");
             }
-          mDynamicModelFile << "/*\n";
-          mDynamicModelFile << " * " << filename << " : Computes dynamic model for Dynare\n";
-          mDynamicModelFile << " *\n";
-          mDynamicModelFile << " * Warning : this file is generated automatically by Dynare\n";
-          mDynamicModelFile << " *           from model file (.mod)\n\n";
-          mDynamicModelFile << " */\n";
-          if (compiler==LCC_COMPILE)
+          //mDynamicModelFile << "    y_index=[";
+          for(int ik=0;ik<block_triangular.ModelBlock->Block_List[i].Size;ik++)
             {
-              mDynamicModelFile << "#include <math.h>\n";
-              mDynamicModelFile << "#include <stdio.h>\n";
-              mDynamicModelFile << "#include <string.h>\n";
-              mDynamicModelFile << "#include \"pctimer_h.h\"\n";
-              mDynamicModelFile << "#include \"mex.h\" /* The Last include file*/\n";
-              mDynamicModelFile << "#include \"" << dynamic_basename.c_str() << ".h\"\n";
-              mDynamicModelFile << "#include \"simulate.h\"\n";
+              tmp << " " << block_triangular.ModelBlock->Block_List[i].Variable[ik]+1;
+              tmp_eq << " " << block_triangular.ModelBlock->Block_List[i].Equation[ik]+1;
             }
+          //mDynamicModelFile << " ];\n";
+          if(k==EVALUATE_FOREWARD || k==EVALUATE_BACKWARD || k==EVALUATE_FOREWARD_R || k==EVALUATE_BACKWARD_R)
+            {
+              if(i==block_triangular.ModelBlock->Size-1)
+                {
+                  mDynamicModelFile << "    y_index_eq=[" << tmp_eq.str() << "];\n";
+                  tmp_eq.str("");
+                  mDynamicModelFile << "    y_index=[" << tmp.str() << "];\n";
+                  tmp.str("");
+                  mDynamicModelFile << tmp1.str();
+                  tmp1.str("");
+                }
+            }
+          if (BlockTriangular::BlockSim(prev_Simulation_Type)==BlockTriangular::BlockSim(k) &&
+              (k==EVALUATE_FOREWARD || k==EVALUATE_BACKWARD || k==EVALUATE_FOREWARD_R || k==EVALUATE_BACKWARD_R))
+            skip_head=true;
           else
+            skip_head=false;
+          switch(k)
             {
-              mDynamicModelFile << "#include \"" << dynamic_basename.c_str() << ".hh\"\n";
-              mDynamicModelFile << "#include \"simulate.cc\"\n";
+            case EVALUATE_FOREWARD:
+            case EVALUATE_BACKWARD:
+            case EVALUATE_FOREWARD_R:
+            case EVALUATE_BACKWARD_R:
+              if(!skip_head)
+                {
+                  tmp1 << "    [y, g1, g2, g3]=" << dynamic_basename << "_" << i + 1 << "(y, x, it_, 1, g1, g2, g3);\n";
+                  tmp1 << "    residual(y_index_eq)=ys(y_index)-y(it_, y_index);\n";
+                }
+              break;
+            case SOLVE_FOREWARD_SIMPLE:
+            case SOLVE_BACKWARD_SIMPLE:
+              mDynamicModelFile << "    y_index=" << block_triangular.ModelBlock->Block_List[i].Variable[0]+1 << ";\n";
+              mDynamicModelFile << "    [r, g1, g2, g3]=" << dynamic_basename << "_" << i + 1 << "(y, x, it_, g1, g2, g3, y_index, 1);\n";
+              mDynamicModelFile << "    residual(y_index_eq)=r;\n";
+              break;
+            case SOLVE_FOREWARD_COMPLETE:
+            case SOLVE_BACKWARD_COMPLETE:
+            case SOLVE_TWO_BOUNDARIES_COMPLETE:
+              //mDynamicModelFile << "    [r, g1, g2, g3, b]=" << dynamic_basename << "_" <<  i + 1 << "(y, x, it_, y_size, 1);\n";
+              mDynamicModelFile << "    y_index_eq = [" << tmp_eq.str() << "];\n";
+              mDynamicModelFile << "    y_index = [" << tmp.str() << "];\n";
+              tmp.str("");
+              tmp_eq.str("");
+              int tmp_i=variable_table.max_lag+variable_table.max_lead+1;
+              mDynamicModelFile << "    ga=spalloc(" << block_triangular.ModelBlock->Block_List[i].Size << ", " << block_triangular.ModelBlock->Block_List[i].Size*tmp_i << ", " << block_triangular.ModelBlock->Block_List[i].Size*block_triangular.ModelBlock->Block_List[i].Size*tmp_i << ");\n";
+              mDynamicModelFile << "    y_index_c = y_index;\n";
+              tmp_i=block_triangular.ModelBlock->Block_List[i].Max_Lag+block_triangular.ModelBlock->Block_List[i].Max_Lead+1;
+              mDynamicModelFile << "    for i=1:" << tmp_i-1 << ",\n";
+              mDynamicModelFile << "      y_index_c = [y_index_c (y_index+i*y_size)];\n";
+              mDynamicModelFile << "    end;\n";
+              mDynamicModelFile << "    [r, ga, g2, g3, b]=" << dynamic_basename << "_" <<  i + 1 << "(y, x, it_-1, " << block_triangular.ModelBlock->Block_List[i].Size << ", 1, ga, g2, g3);\n";
+              if(block_triangular.ModelBlock->Block_List[i].Max_Lag==variable_table.max_lag && block_triangular.ModelBlock->Block_List[i].Max_Lead==variable_table.max_lead)
+                mDynamicModelFile << "    g1(y_index_eq,y_index_c) = ga;\n";
+              else
+                mDynamicModelFile << "    g1(y_index_eq,y_index_c) = ga(:," << 1+(variable_table.max_lag-block_triangular.ModelBlock->Block_List[i].Max_Lag)*block_triangular.ModelBlock->Block_List[i].Size << ":" << (variable_table.max_lag+1+block_triangular.ModelBlock->Block_List[i].Max_Lead)*block_triangular.ModelBlock->Block_List[i].Size << ");\n";
+              mDynamicModelFile << "    residual(y_index_eq)=r(:,M_.maximum_lag+1);\n";
+              break;
             }
-          mDynamicModelFile << "//#define DEBUG\n";
+          prev_Simulation_Type=k;
         }
-      writeModelLocalVariables(mDynamicModelFile, oCDynamicModelSparseDLL);
-      if (compiler==NO_COMPILE)
-        writeModelEquationsCodeOrdered(dynamic_basename, block_triangular.ModelBlock, bin_basename, oCDynamicModelSparseDLL);
-      else
-        writeModelEquationsOrdered_C(mDynamicModelFile, block_triangular.ModelBlock);
-    }
-  else
-    {
-      filename = dynamic_basename + ".m";
-      mDynamicModelFile.open(filename.c_str(), ios::out | ios::binary);
-      if (!mDynamicModelFile.is_open())
+      if(tmp1.str().length())
         {
-          cerr << "Error: Can't open file " << filename << " for writing" << endl;
-          exit(-1);
+          mDynamicModelFile << tmp1.str();
+          tmp1.str("");
         }
-      mDynamicModelFile << "%\n";
-      mDynamicModelFile << "% " << filename << " : Computes dynamic model for Dynare\n";
-      mDynamicModelFile << "%\n";
-      mDynamicModelFile << "% Warning : this file is generated automatically by Dynare\n";
-      mDynamicModelFile << "%           from model file (.mod)\n\n";
-      mDynamicModelFile << "%/\n";
+      mDynamicModelFile << "    varargout{1}=residual;\n";
+      mDynamicModelFile << "    varargout{2}=g1;\n";
+      mDynamicModelFile << "    return;\n";
+      mDynamicModelFile << "  end;\n";
+      mDynamicModelFile << "  %it is the deterministic simulation of the block decomposed dynamic model\n";
+      mDynamicModelFile << "  if(options_.simulation_method==0)\n";
+      mDynamicModelFile << "    mthd='Sparse LU';\n";
+      mDynamicModelFile << "  elseif(options_.simulation_method==2)\n";
+      mDynamicModelFile << "    mthd='GMRES';\n";
+      mDynamicModelFile << "  elseif(options_.simulation_method==3)\n";
+      mDynamicModelFile << "    mthd='BICGSTAB';\n";
+      mDynamicModelFile << "  else\n";
+      mDynamicModelFile << "    mthd='UNKNOWN';\n";
+      mDynamicModelFile << "  end;\n";
+      mDynamicModelFile << "  disp (['-----------------------------------------------------']) ;\n";
+      mDynamicModelFile << "  disp (['MODEL SIMULATION: (method=' mthd ')']) ;\n";
+      mDynamicModelFile << "  fprintf('\\n') ;\n";
+      mDynamicModelFile << "  periods=options_.periods;\n";
+      mDynamicModelFile << "  maxit_=options_.maxit_;\n";
+      mDynamicModelFile << "  solve_tolf=options_.solve_tolf;\n";
+      mDynamicModelFile << "  y=oo_.endo_simul';\n";
+      mDynamicModelFile << "  x=oo_.exo_simul;\n";
     }
-  int i, j, k, Nb_SGE=0;
-  bool printed = false, skip_head, open_par=false;
-  if (computeJacobian || computeJacobianExo || computeHessian)
+  prev_Simulation_Type=-1;
+  for(i = 0;i < block_triangular.ModelBlock->Size;i++)
     {
-      if (compiler!=NO_COMPILE || mode==eSparseMode)
+      k = block_triangular.ModelBlock->Block_List[i].Simulation_Type;
+      if (BlockTriangular::BlockSim(prev_Simulation_Type)==BlockTriangular::BlockSim(k) &&
+          (k==EVALUATE_FOREWARD || k==EVALUATE_BACKWARD || k==EVALUATE_FOREWARD_R || k==EVALUATE_BACKWARD_R))
+        skip_head=true;
+      else
+        skip_head=false;
+      if ((k == EVALUATE_FOREWARD || k == EVALUATE_FOREWARD_R) && (block_triangular.ModelBlock->Block_List[i].Size))
         {
-          //mDynamicModelFile << "void Dynamic_Init(tModel_Block *Model_Block)\n";
-          if(mode==eSparseDLLMode)
-            {
-              mDynamicModelFile << "void Dynamic_Init()\n";
-              mDynamicModelFile << "  {\n";
-            }
-          else
+          if (!skip_head)
             {
-              mDynamicModelFile << "function [varargout] = " << dynamic_basename << "(varargin)\n";
-              mDynamicModelFile << "  global oo_ options_ M_ ;\n";
-              mDynamicModelFile << "  g2=[];g3=[];\n";
-              //Temporary variables declaration
-              {
-                OK=true;
-                ostringstream tmp_output;
-                for(temporary_terms_type::const_iterator it = temporary_terms.begin();
-                    it != temporary_terms.end(); it++)
-                  {
-                    if (OK)
-                      OK=false;
-                    else
-                      tmp_output << " ";
-                    (*it)->writeOutput(tmp_output, oMatlabDynamicModel, temporary_terms);
-                  }
-                if (tmp_output.str().length()>0)
-                  {
-                    mDynamicModelFile << "  global " << tmp_output.str() << " M_ ;\n";
-                  }
-              }
-              mDynamicModelFile << "  T_init=zeros(1,options_.periods+M_.maximum_lag+M_.maximum_lead);\n";
-              {
-                ostringstream tmp_output;
-                OK=true;
-                for(temporary_terms_type::const_iterator it = temporary_terms.begin();
-                    it != temporary_terms.end(); it++)
-                  {
-                    if (OK)
-                      OK=false;
-                    else
-                      tmp_output << "=T_init;\n  ";
-                    (*it)->writeOutput(tmp_output, oMatlabDynamicModel, temporary_terms);
-                  }
-                if (tmp_output.str().length()>0)
-                  {
-                    mDynamicModelFile << tmp_output.str() << "=T_init;\n";
-                  }
-              }
-              mDynamicModelFile << "  y_kmin=M_.maximum_lag;\n";
-              mDynamicModelFile << "  y_kmax=M_.maximum_lead;\n";
-              mDynamicModelFile << "  y_size=M_.endo_nbr;\n";
-              mDynamicModelFile << "  if(length(varargin)>0)\n";
-              mDynamicModelFile << "    %it is a simple evaluation of the dynamic model for time _it\n";
-              //mDynamicModelFile << "    global it_;\n";
-              mDynamicModelFile << "    it_=varargin{3};\n";
-              //mDynamicModelFile << "    g=zeros(y_size,y_size*(M_.maximum_endo_lag+M_.maximum_endo_lead+1));\n";
-              mDynamicModelFile << "    g1=spalloc(y_size,y_size*(M_.maximum_endo_lag+M_.maximum_endo_lead+1),y_size*y_size*(M_.maximum_endo_lag+M_.maximum_endo_lead+1));\n";
-              mDynamicModelFile << "    Per_u_=0;\n";
-              mDynamicModelFile << "    Per_y_=it_*y_size;\n";
-              mDynamicModelFile << "    y=varargin{1};\n";
-              mDynamicModelFile << "    ys=y(it_,:);\n";
-              /*mDynamicModelFile << "    y1=varargin{1};\n";
-              mDynamicModelFile << "    cnb_nz_elem=1;\n";
-              mDynamicModelFile << "    for i = -y_kmin:y_kmax\n";
-              mDynamicModelFile << "      nz_elem=find(M_.lead_lag_incidence(:,1+i+y_kmin));\n";
-              mDynamicModelFile << "      nb_nz_elem=length(nz_elem);\n";
-              mDynamicModelFile << "      y(it_+i, nz_elem)=y1(cnb_nz_elem:(cnb_nz_elem+nb_nz_elem));\n";
-              mDynamicModelFile << "      if(i==0)\n";
-              mDynamicModelFile << "        ys(nz_elem)=y(it_, nz_elem);\n";
-              mDynamicModelFile << "        nz_elem_s=nz_elem;\n";
-              mDynamicModelFile << "      end;\n";
-              mDynamicModelFile << "      cnb_nz_elem=cnb_nz_elem+nb_nz_elem;\n";
-              mDynamicModelFile << "    end;\n";*/
-              mDynamicModelFile << "    x=varargin{2};\n";
-              prev_Simulation_Type=-1;
-              tmp.str("");
-              tmp_eq.str("");
-              for(i = 0;i < block_triangular.ModelBlock->Size;i++)
-                {
-
-                  k=block_triangular.ModelBlock->Block_List[i].Simulation_Type;
-                  if ((BlockTriangular::BlockSim(prev_Simulation_Type)!=BlockTriangular::BlockSim(k))  &&
-                     ((prev_Simulation_Type==EVALUATE_FOREWARD || prev_Simulation_Type==EVALUATE_BACKWARD || prev_Simulation_Type==EVALUATE_FOREWARD_R || prev_Simulation_Type==EVALUATE_BACKWARD_R)
-                     || (k==EVALUATE_FOREWARD || k==EVALUATE_BACKWARD || k==EVALUATE_FOREWARD_R || k==EVALUATE_BACKWARD_R)))
-                      {
-                      mDynamicModelFile << "    y_index_eq=[" << tmp_eq.str() << "];\n";
-                      tmp_eq.str("");
-                      mDynamicModelFile << "    y_index=[" << tmp.str() << "];\n";
-                      tmp.str("");
-                      mDynamicModelFile << tmp1.str();
-                      tmp1.str("");
-                    }
-                  //mDynamicModelFile << "    y_index=[";
-                  for(int ik=0;ik<block_triangular.ModelBlock->Block_List[i].Size;ik++)
-                    {
-                       tmp << " " << block_triangular.ModelBlock->Block_List[i].Variable[ik]+1;
-                       tmp_eq << " " << block_triangular.ModelBlock->Block_List[i].Equation[ik]+1;
-                    }
-                  //mDynamicModelFile << " ];\n";
-                  if(k==EVALUATE_FOREWARD || k==EVALUATE_BACKWARD || k==EVALUATE_FOREWARD_R || k==EVALUATE_BACKWARD_R
-                     )
-                    {
-                      if(i==block_triangular.ModelBlock->Size-1)
-                        {
-                          mDynamicModelFile << "    y_index_eq=[" << tmp_eq.str() << "];\n";
-                          tmp_eq.str("");
-                          mDynamicModelFile << "    y_index=[" << tmp.str() << "];\n";
-                          tmp.str("");
-                          mDynamicModelFile << tmp1.str();
-                          tmp1.str("");
-                        }
-                    }
-                  if (BlockTriangular::BlockSim(prev_Simulation_Type)==BlockTriangular::BlockSim(k) &&
-                     (k==EVALUATE_FOREWARD || k==EVALUATE_BACKWARD || k==EVALUATE_FOREWARD_R || k==EVALUATE_BACKWARD_R))
-                    skip_head=true;
-                  else
-                    skip_head=false;
-                  switch(k)
-                    {
-                       case EVALUATE_FOREWARD:
-                       case EVALUATE_BACKWARD:
-                       case EVALUATE_FOREWARD_R:
-                       case EVALUATE_BACKWARD_R:
-                          if(!skip_head)
-                            {
-                              tmp1 << "    [y, g1, g2, g3]=" << dynamic_basename << "_" << i + 1 << "(y, x, it_, 1, g1, g2, g3);\n";
-                              tmp1 << "    residual(y_index_eq)=ys(y_index)-y(it_, y_index);\n";
-                            }
-                          break;
-                       case SOLVE_FOREWARD_SIMPLE:
-                       case SOLVE_BACKWARD_SIMPLE:
-                          mDynamicModelFile << "    y_index=" << block_triangular.ModelBlock->Block_List[i].Variable[0]+1 << ";\n";
-                          mDynamicModelFile << "    [r, g1, g2, g3]=" << dynamic_basename << "_" << i + 1 << "(y, x, it_, g1, g2, g3, y_index, 1);\n";
-                          mDynamicModelFile << "    residual(y_index_eq)=r;\n";
-                          break;
-                       case SOLVE_FOREWARD_COMPLETE:
-                       case SOLVE_BACKWARD_COMPLETE:
-                       case SOLVE_TWO_BOUNDARIES_COMPLETE:
-                          //mDynamicModelFile << "    [r, g1, g2, g3, b]=" << dynamic_basename << "_" <<  i + 1 << "(y, x, it_, y_size, 1);\n";
-                          mDynamicModelFile << "    y_index_eq = [" << tmp_eq.str() << "];\n";
-                          mDynamicModelFile << "    y_index = [" << tmp.str() << "];\n";
-                          tmp.str("");
-                          tmp_eq.str("");
-                          int tmp_i=variable_table.max_lag+variable_table.max_lead+1;
-                          mDynamicModelFile << "    ga=spalloc(" << block_triangular.ModelBlock->Block_List[i].Size << ", " << block_triangular.ModelBlock->Block_List[i].Size*tmp_i << ", " << block_triangular.ModelBlock->Block_List[i].Size*block_triangular.ModelBlock->Block_List[i].Size*tmp_i << ");\n";
-                          mDynamicModelFile << "    y_index_c = y_index;\n";
-                          tmp_i=block_triangular.ModelBlock->Block_List[i].Max_Lag+block_triangular.ModelBlock->Block_List[i].Max_Lead+1;
-                          mDynamicModelFile << "    for i=1:" << tmp_i-1 << ",\n";
-                          mDynamicModelFile << "      y_index_c = [y_index_c (y_index+i*y_size)];\n";
-                          mDynamicModelFile << "    end;\n";
-                          mDynamicModelFile << "    [r, ga, g2, g3, b]=" << dynamic_basename << "_" <<  i + 1 << "(y, x, it_-1, " << block_triangular.ModelBlock->Block_List[i].Size << ", 1, ga, g2, g3);\n";
-                          if(block_triangular.ModelBlock->Block_List[i].Max_Lag==variable_table.max_lag && block_triangular.ModelBlock->Block_List[i].Max_Lead==variable_table.max_lead)
-                            mDynamicModelFile << "    g1(y_index_eq,y_index_c) = ga;\n";
-                          else
-                            mDynamicModelFile << "    g1(y_index_eq,y_index_c) = ga(:," << 1+(variable_table.max_lag-block_triangular.ModelBlock->Block_List[i].Max_Lag)*block_triangular.ModelBlock->Block_List[i].Size << ":" << (variable_table.max_lag+1+block_triangular.ModelBlock->Block_List[i].Max_Lead)*block_triangular.ModelBlock->Block_List[i].Size << ");\n";
-                          mDynamicModelFile << "    residual(y_index_eq)=r(:,M_.maximum_lag+1);\n";
-                          break;
-                    }
-                  prev_Simulation_Type=k;
-                }
-              if(tmp1.str().length())
+              if (open_par)
                 {
-                  mDynamicModelFile << tmp1.str();
-                  tmp1.str("");
+                  mDynamicModelFile << "  end\n";
                 }
-              mDynamicModelFile << "    varargout{1}=residual;\n";
-              mDynamicModelFile << "    varargout{2}=g1;\n";
-              mDynamicModelFile << "    return;\n";
-              mDynamicModelFile << "  end;\n";
-              mDynamicModelFile << "  %it is the deterministic simulation of the block decomposed dynamic model\n";
-              mDynamicModelFile << "  if(options_.simulation_method==0)\n";
-              mDynamicModelFile << "    mthd='Sparse LU';\n";
-              mDynamicModelFile << "  elseif(options_.simulation_method==2)\n";
-              mDynamicModelFile << "    mthd='GMRES';\n";
-              mDynamicModelFile << "  elseif(options_.simulation_method==3)\n";
-              mDynamicModelFile << "    mthd='BICGSTAB';\n";
-              mDynamicModelFile << "  else\n";
-              mDynamicModelFile << "    mthd='UNKNOWN';\n";
-              mDynamicModelFile << "  end;\n";
-              mDynamicModelFile << "  disp (['-----------------------------------------------------']) ;\n";
-              mDynamicModelFile << "  disp (['MODEL SIMULATION: (method=' mthd ')']) ;\n";
-              mDynamicModelFile << "  fprintf('\\n') ;\n";
-              mDynamicModelFile << "  periods=options_.periods;\n";
-              mDynamicModelFile << "  maxit_=options_.maxit_;\n";
-              mDynamicModelFile << "  solve_tolf=options_.solve_tolf;\n";
-              mDynamicModelFile << "  y=oo_.endo_simul';\n";
-              mDynamicModelFile << "  x=oo_.exo_simul;\n";
+              mDynamicModelFile << "  Per_u_=0;\n";
+              mDynamicModelFile << "  for it_ = y_kmin+1:(periods+y_kmin)\n";
+              mDynamicModelFile << "    Per_y_=it_*y_size;\n";
+              mDynamicModelFile << "    g1=[];g2=[];g3=[];\n";
+              mDynamicModelFile << "    y=" << dynamic_basename << "_" << i + 1 << "(y, x, it_, 0, g1, g2, g3);\n";
             }
-          prev_Simulation_Type=-1;
-          for(i = 0;i < block_triangular.ModelBlock->Size;i++)
+          open_par=true;
+        }
+      else if ((k == EVALUATE_BACKWARD || k == EVALUATE_BACKWARD_R) && (block_triangular.ModelBlock->Block_List[i].Size))
+        {
+          if (!skip_head)
             {
-              k = block_triangular.ModelBlock->Block_List[i].Simulation_Type;
-              if (BlockTriangular::BlockSim(prev_Simulation_Type)==BlockTriangular::BlockSim(k) &&
-                (k==EVALUATE_FOREWARD || k==EVALUATE_BACKWARD || k==EVALUATE_FOREWARD_R || k==EVALUATE_BACKWARD_R))
-                skip_head=true;
-              else
-                skip_head=false;
-              if ((k == EVALUATE_FOREWARD || k == EVALUATE_FOREWARD_R) && (block_triangular.ModelBlock->Block_List[i].Size))
-                {
-                  if (!skip_head)
-                    {
-                      if(mode==eSparseDLLMode)
-                        {
-                          if (open_par)
-                            {
-                              mDynamicModelFile << "#endif\n";
-                              mDynamicModelFile << "      }\n";
-                            }
-                          mDynamicModelFile << "    for(it_=y_kmin;it_<periods+y_kmin;it_++)\n";
-                          mDynamicModelFile << "      {\n";
-                          mDynamicModelFile << "        Per_y_=it_*y_size;\n";
-                          mDynamicModelFile << "        Dynamic" << i + 1 << "(y, x, r, g1, g2);\n";
-                          mDynamicModelFile << "#ifdef DEBUG\n";
-                        }
-                      else
-                        {
-                          if (open_par)
-                            {
-                              mDynamicModelFile << "  end\n";
-                            }
-                          mDynamicModelFile << "  Per_u_=0;\n";
-                          mDynamicModelFile << "  for it_ = y_kmin+1:(periods+y_kmin)\n";
-                          mDynamicModelFile << "    Per_y_=it_*y_size;\n";
-                          mDynamicModelFile << "    g1=[];g2=[];g3=[];\n";
-                          mDynamicModelFile << "    y=" << dynamic_basename << "_" << i + 1 << "(y, x, it_, 0, g1, g2, g3);\n";
-                        }
-                    }
-                  if(mode==eSparseDLLMode)
-                    for(j = 0;j < block_triangular.ModelBlock->Block_List[i].Size;j++)
-                      mDynamicModelFile << "        mexPrintf(\"y[%d, %d]=%f \\n\",it_," << block_triangular.ModelBlock->Block_List[i].Variable[j] << ",double(y[it_," << block_triangular.ModelBlock->Block_List[i].Variable[j] << "]));\n";
-                  open_par=true;
-                }
-              else if ((k == EVALUATE_BACKWARD || k == EVALUATE_BACKWARD_R) && (block_triangular.ModelBlock->Block_List[i].Size))
+              if (open_par)
                 {
-                  if (!skip_head)
-                    {
-                      if(mode==eSparseDLLMode)
-                        {
-                          if (open_par)
-                            {
-                              mDynamicModelFile << "#endif\n";
-                              mDynamicModelFile << "      }\n";
-                            }
-                          mDynamicModelFile << "    for(it_=periods+y_kmin;it_>y_kmin;it_--)\n";
-                          mDynamicModelFile << "      {\n";
-                          mDynamicModelFile << "        Per_y_=it_*y_size;\n";
-                          mDynamicModelFile << "        y=" << dynamic_basename << "_" << i + 1 << "(y, x, r, g1, g2);\n";
-                          mDynamicModelFile << "#ifdef DEBUG\n";
-                        }
-                      else
-                        {
-                          if (open_par)
-                            {
-                              mDynamicModelFile << "  end\n";
-                            }
-                          mDynamicModelFile << "  Per_u_=0;\n";
-                          mDynamicModelFile << "  for it_ = y_kmin+1:(periods+y_kmin)\n";
-                          mDynamicModelFile << "    Per_y_=it_*y_size;\n";
-                          mDynamicModelFile << "    " << dynamic_basename << "_" << i + 1 << "(y, x, it_, g1, g2, g3);\n";
-                        }
-                    }
-                  if(mode==eSparseDLLMode)
-                    for(j = 0;j < block_triangular.ModelBlock->Block_List[i].Size;j++)
-                      mDynamicModelFile << "        mexPrintf(\"y[%d, %d]=%f \\n\",it_," << block_triangular.ModelBlock->Block_List[i].Variable[j] << ",double(y[it_," << block_triangular.ModelBlock->Block_List[i].Variable[j] << "]));\n";
-                  open_par=true;
+                  mDynamicModelFile << "  end\n";
                 }
-              else if ((k == SOLVE_FOREWARD_SIMPLE) && (block_triangular.ModelBlock->Block_List[i].Size))
-                {
-                  if (open_par)
-                    {
-                      if(mode==eSparseDLLMode)
-                        {
-                          mDynamicModelFile << "#endif\n";
-                          mDynamicModelFile << "      }\n";
-                        }
-                      else
-                        {
-                          //if (!skip_head)
-                            mDynamicModelFile << "  end\n";
-                        }
-                    }
-                  open_par=false;
-                  if(mode==eSparseDLLMode)
-                    {
-                      mDynamicModelFile << "    g1=(double*)mxMalloc(" << block_triangular.ModelBlock->Block_List[i].Size*block_triangular.ModelBlock->Block_List[i].Size << "*sizeof(double));\n";
-                      mDynamicModelFile << "    r=(double*)mxMalloc(" << block_triangular.ModelBlock->Block_List[i].Size << "*sizeof(double));\n";
-                      mDynamicModelFile << "    for(it_=y_kmin;it_<periods+y_kmin;it_++)\n";
-                      mDynamicModelFile << "      {\n";
-                      mDynamicModelFile << "        cvg=false;\n";
-                      mDynamicModelFile << "        iter=0;\n";
-                      mDynamicModelFile << "        Per_y_=it_*y_size;\n";
-                      mDynamicModelFile << "        while(!((cvg)||(iter>maxit_)))\n";
-                      mDynamicModelFile << "          {\n";
-                      mDynamicModelFile << "            Dynamic" << i + 1 << "(y, x, r, g1, g2);\n";
-                      mDynamicModelFile << "            y[Per_y_+" << block_triangular.ModelBlock->Block_List[i].Variable[0] << "] += -r[0]/g1[0];\n";
-                      mDynamicModelFile << "            cvg=((r[0]*r[0])<solve_tolf);\n";
-                      mDynamicModelFile << "            iter++;\n";
-                      mDynamicModelFile << "          }\n";
-                      mDynamicModelFile << "        if (!cvg)\n";
-                      mDynamicModelFile << "          {\n";
-                      mDynamicModelFile << "            mexPrintf(\"Convergence not achieved in block " << i << ", at time %d after %d iterations\\n\",it_,iter);\n";
-                      mDynamicModelFile << "            mexErrMsgTxt(\"End of simulate\");\n";
-                      mDynamicModelFile << "          }\n";
-                      mDynamicModelFile << "#ifdef DEBUG\n";
-                      mDynamicModelFile << "        mexPrintf(\"y[%d, %d]=%f \\n\",it_," << block_triangular.ModelBlock->Block_List[i].Variable[0] << ",y[it_," << block_triangular.ModelBlock->Block_List[i].Variable[0] << "]);\n";
-                      mDynamicModelFile << "#endif\n";
-                      mDynamicModelFile << "      }\n";
-                      mDynamicModelFile << "    mxFree(g1);\n";
-                      mDynamicModelFile << "    mxFree(r);\n";
-                    }
-                  else
-                    {
-                      mDynamicModelFile << "  g1=0;\n";
-                      mDynamicModelFile << "  r=0;\n";
-                      mDynamicModelFile << "  for it_=y_kmin+1:periods+y_kmin\n";
-                      mDynamicModelFile << "    cvg=0;\n";
-                      mDynamicModelFile << "    iter=0;\n";
-                      mDynamicModelFile << "    Per_y_=it_*y_size;\n";
-                      mDynamicModelFile << "    while ~(cvg==1 | iter>maxit_),\n";
-                      mDynamicModelFile << "      [r, g1] = " << dynamic_basename << "_" << i + 1 << "(y, x, it_, g1, g2, g3, 1, 0);\n";
-                      mDynamicModelFile << "      y(it_, " << block_triangular.ModelBlock->Block_List[i].Variable[0]+1 << ") = y(it_, " << block_triangular.ModelBlock->Block_List[i].Variable[0]+1 << ")-r/g1;\n";
-                      mDynamicModelFile << "      cvg=((r*r)<solve_tolf);\n";
-                      mDynamicModelFile << "      iter=iter+1;\n";
-                      mDynamicModelFile << "    end\n";
-                      mDynamicModelFile << "    if cvg==0\n";
-                      mDynamicModelFile << "      fprintf('Convergence not achieved in block " << i << ", at time %d after %d iterations\\n',it_,iter);\n";
-                      mDynamicModelFile << "      return;\n";
-                      mDynamicModelFile << "    end\n";
-                      mDynamicModelFile << "  end\n";
-                    }
-                }
-              else if ((k == SOLVE_BACKWARD_SIMPLE) && (block_triangular.ModelBlock->Block_List[i].Size))
-                {
-                  if (open_par)
-                    {
-                      if(mode==eSparseDLLMode)
-                        {
-                          mDynamicModelFile << "#endif\n";
-                          mDynamicModelFile << "      }\n";
-                        }
-                      else
-                        {
-                          mDynamicModelFile << "  end\n";
-                        }
-                    }
-                  open_par=false;
-                  if(mode==eSparseDLLMode)
-                    {
-                      mDynamicModelFile << "    g1=(double*)mxMalloc(" << block_triangular.ModelBlock->Block_List[i].Size*block_triangular.ModelBlock->Block_List[i].Size << "*sizeof(double));\n";
-                      mDynamicModelFile << "    r=(double*)mxMalloc(" << block_triangular.ModelBlock->Block_List[i].Size << "*sizeof(double));\n";
-                      mDynamicModelFile << "    for(it_=periods+y_kmin;it_>y_kmin;it_--)\n";
-                      mDynamicModelFile << "      {\n";
-                      mDynamicModelFile << "        cvg=false;\n";
-                      mDynamicModelFile << "        iter=0;\n";
-                      mDynamicModelFile << "        Per_y_=it_*y_size;\n";
-                      mDynamicModelFile << "        while(!((cvg)||(iter>maxit_)))\n";
-                      mDynamicModelFile << "          {\n";
-                      mDynamicModelFile << "            Dynamic" << i + 1 << "(y, x, r, g1, g2);\n";
-                      mDynamicModelFile << "            y[Per_y_+" << block_triangular.ModelBlock->Block_List[i].Variable[0] << "] += -r[0]/g1[0];\n";
-                      mDynamicModelFile << "            cvg=((r[0]*r[0])<solve_tolf);\n";
-                      mDynamicModelFile << "            iter++;\n";
-                      mDynamicModelFile << "          }\n";
-                      mDynamicModelFile << "        if (!cvg)\n";
-                      mDynamicModelFile << "          {\n";
-                      mDynamicModelFile << "            mexPrintf(\"Convergence not achieved in block " << i << ", at time %d after %d iterations\\n\",it_,iter);\n";
-                      mDynamicModelFile << "            mexErrMsgTxt(\"End of simulate\");\n";
-                      mDynamicModelFile << "          }\n";
-                      mDynamicModelFile << "#ifdef DEBUG\n";
-                      mDynamicModelFile << "        mexPrintf(\"y[%d, %d]=%f \\n\",it_," << block_triangular.ModelBlock->Block_List[i].Variable[0] << ",y[it_," << block_triangular.ModelBlock->Block_List[i].Variable[0] << "]);\n";
-                      mDynamicModelFile << "#endif\n";
-                      mDynamicModelFile << "      }\n";
-                      mDynamicModelFile << "    mxFree(g1);\n";
-                      mDynamicModelFile << "    mxFree(r);\n";
-                    }
-                  else
-                    {
-                      mDynamicModelFile << "  g1=0;\n";
-                      mDynamicModelFile << "  r=0;\n";
-                      mDynamicModelFile << "  for it_=periods+y_kmin:-1:y_kmin+1\n";
-                      mDynamicModelFile << "    cvg=0;\n";
-                      mDynamicModelFile << "    iter=0;\n";
-                      mDynamicModelFile << "    Per_y_=it_*y_size;\n";
-                      mDynamicModelFile << "    while ~(cvg==1 | iter>maxit_),\n";
-                      mDynamicModelFile << "      [r, g1] = " << dynamic_basename << "_" << i + 1 << "(y, x, it_, g1, g2, g3, 1, 0);\n";
-                      mDynamicModelFile << "      y(it_, " << block_triangular.ModelBlock->Block_List[i].Variable[0]+1 << ") = y(it_, " << block_triangular.ModelBlock->Block_List[i].Variable[0]+1 << ")-r/g1;\n";
-                      mDynamicModelFile << "      cvg=((r*r)<solve_tolf);\n";
-                      mDynamicModelFile << "      iter=iter+1;\n";
-                      mDynamicModelFile << "    end\n";
-                      mDynamicModelFile << "    if cvg==0\n";
-                      mDynamicModelFile << "      fprintf('Convergence not achieved in block " << i << ", at time %d after %d iterations\\n',it_,iter);\n";
-                      mDynamicModelFile << "      return;\n";
-                      mDynamicModelFile << "    end\n";
-                      mDynamicModelFile << "  end\n";
-                    }
-                }
-              else if ((k == SOLVE_TWO_BOUNDARIES_SIMPLE) && (block_triangular.ModelBlock->Block_List[i].Size))
-                {
-                  if (open_par)
-                    {
-                      if(mode==eSparseDLLMode)
-                        {
-                          mDynamicModelFile << "#endif\n";
-                          mDynamicModelFile << "      }\n";
-                        }
-                      else
-                        {
-                          mDynamicModelFile << "  end\n";
-                        }
-                    }
-                  open_par=false;
-                  if (!printed)
-                    {
-                      printed = true;
-                    }
-                  SGE.SGE_compute(block_triangular.ModelBlock, i, true, bin_basename, symbol_table.endo_nbr);
-                  Nb_SGE++;
+              mDynamicModelFile << "  Per_u_=0;\n";
+              mDynamicModelFile << "  for it_ = y_kmin+1:(periods+y_kmin)\n";
+              mDynamicModelFile << "    Per_y_=it_*y_size;\n";
+              mDynamicModelFile << "    " << dynamic_basename << "_" << i + 1 << "(y, x, it_, g1, g2, g3);\n";
+            }
+          open_par=true;
+        }
+      else if ((k == SOLVE_FOREWARD_SIMPLE) && (block_triangular.ModelBlock->Block_List[i].Size))
+        {
+          if (open_par)
+            mDynamicModelFile << "  end\n";
+          open_par=false;
+          mDynamicModelFile << "  g1=0;\n";
+          mDynamicModelFile << "  r=0;\n";
+          mDynamicModelFile << "  for it_=y_kmin+1:periods+y_kmin\n";
+          mDynamicModelFile << "    cvg=0;\n";
+          mDynamicModelFile << "    iter=0;\n";
+          mDynamicModelFile << "    Per_y_=it_*y_size;\n";
+          mDynamicModelFile << "    while ~(cvg==1 | iter>maxit_),\n";
+          mDynamicModelFile << "      [r, g1] = " << dynamic_basename << "_" << i + 1 << "(y, x, it_, g1, g2, g3, 1, 0);\n";
+          mDynamicModelFile << "      y(it_, " << block_triangular.ModelBlock->Block_List[i].Variable[0]+1 << ") = y(it_, " << block_triangular.ModelBlock->Block_List[i].Variable[0]+1 << ")-r/g1;\n";
+          mDynamicModelFile << "      cvg=((r*r)<solve_tolf);\n";
+          mDynamicModelFile << "      iter=iter+1;\n";
+          mDynamicModelFile << "    end\n";
+          mDynamicModelFile << "    if cvg==0\n";
+          mDynamicModelFile << "      fprintf('Convergence not achieved in block " << i << ", at time %d after %d iterations\\n',it_,iter);\n";
+          mDynamicModelFile << "      return;\n";
+          mDynamicModelFile << "    end\n";
+          mDynamicModelFile << "  end\n";
+        }
+      else if ((k == SOLVE_BACKWARD_SIMPLE) && (block_triangular.ModelBlock->Block_List[i].Size))
+        {
+          if (open_par)
+            mDynamicModelFile << "  end\n";
+          open_par=false;
+          mDynamicModelFile << "  g1=0;\n";
+          mDynamicModelFile << "  r=0;\n";
+          mDynamicModelFile << "  for it_=periods+y_kmin:-1:y_kmin+1\n";
+          mDynamicModelFile << "    cvg=0;\n";
+          mDynamicModelFile << "    iter=0;\n";
+          mDynamicModelFile << "    Per_y_=it_*y_size;\n";
+          mDynamicModelFile << "    while ~(cvg==1 | iter>maxit_),\n";
+          mDynamicModelFile << "      [r, g1] = " << dynamic_basename << "_" << i + 1 << "(y, x, it_, g1, g2, g3, 1, 0);\n";
+          mDynamicModelFile << "      y(it_, " << block_triangular.ModelBlock->Block_List[i].Variable[0]+1 << ") = y(it_, " << block_triangular.ModelBlock->Block_List[i].Variable[0]+1 << ")-r/g1;\n";
+          mDynamicModelFile << "      cvg=((r*r)<solve_tolf);\n";
+          mDynamicModelFile << "      iter=iter+1;\n";
+          mDynamicModelFile << "    end\n";
+          mDynamicModelFile << "    if cvg==0\n";
+          mDynamicModelFile << "      fprintf('Convergence not achieved in block " << i << ", at time %d after %d iterations\\n',it_,iter);\n";
+          mDynamicModelFile << "      return;\n";
+          mDynamicModelFile << "    end\n";
+          mDynamicModelFile << "  end\n";
+        }
+      else if ((k == SOLVE_TWO_BOUNDARIES_SIMPLE) && (block_triangular.ModelBlock->Block_List[i].Size))
+        {
+          if (open_par)
+            mDynamicModelFile << "  end\n";
+          open_par=false;
+          if (!printed)
+            {
+              printed = true;
+            }
+          SGE.SGE_compute(block_triangular.ModelBlock, i, true, basename, symbol_table.endo_nbr);
+          Nb_SGE++;
 #ifdef PRINT_OUT
-                  cout << "end of Gaussian elimination\n";
+          cout << "end of Gaussian elimination\n";
 #endif
-                  mDynamicModelFile << "    Read_file(\"" << reform(bin_basename) << "\",periods," <<
-                    block_triangular.ModelBlock->Block_List[i].IM_lead_lag[block_triangular.ModelBlock->Block_List[i].Max_Lag + block_triangular.ModelBlock->Block_List[i].Max_Lead].u_finish + 1 << ", " << /*mod_param.endo_nbr*/symbol_table.endo_nbr <<
-                    ", " << block_triangular.ModelBlock->Block_List[i].Max_Lag << ", " << block_triangular.ModelBlock->Block_List[i].Max_Lead << ");\n";
-                  mDynamicModelFile << "    g1=(double*)mxMalloc(" << block_triangular.ModelBlock->Block_List[i].Size*block_triangular.ModelBlock->Block_List[i].Size << "*sizeof(double));\n";
-                  mDynamicModelFile << "    r=(double*)mxMalloc(" << block_triangular.ModelBlock->Block_List[i].Size << "*sizeof(double));\n";
-                  if (!block_triangular.ModelBlock->Block_List[i].is_linear)
-                    {
-                      mDynamicModelFile << "    cvg=false;\n";
-                      mDynamicModelFile << "    iter=0;\n";
-                      mDynamicModelFile << "    while(!((cvg)||(iter>maxit_)))\n";
-                      mDynamicModelFile << "      {\n";
-                      mDynamicModelFile << "        res2=0;\n";
-                      mDynamicModelFile << "        res1=0;\n";
-                      mDynamicModelFile << "        max_res=0;\n";
-                      mDynamicModelFile << "        for(it_=y_kmin;it_<periods+y_kmin;it_++)\n";
-                      mDynamicModelFile << "          {\n";
-                      mDynamicModelFile << "            Per_u_=(it_-y_kmin)*" << block_triangular.ModelBlock->Block_List[i].IM_lead_lag[block_triangular.ModelBlock->Block_List[i].Max_Lag + block_triangular.ModelBlock->Block_List[i].Max_Lead].u_finish + 1 << ";\n";
-                      mDynamicModelFile << "            Per_y_=it_*y_size;\n";
-                      mDynamicModelFile << "            Dynamic" << i + 1 << "(y, x, r, g1, g2);\n";
-                      mDynamicModelFile << "            for(i=0;i<" << block_triangular.ModelBlock->Block_List[i].Size << ";i++)\n";
-                      mDynamicModelFile << "              {\n";
-                      mDynamicModelFile << "                if (max_res<fabs(r[i]))\n";
-                      mDynamicModelFile << "                  max_res=fabs(r[i]);\n";
-                      mDynamicModelFile << "                res2+=r[i]*r[i];\n";
-                      mDynamicModelFile << "                res1+=fabs(r[i]);\n";
-                      mDynamicModelFile << "              }\n";
-                      mDynamicModelFile << "          }\n";
-                      mDynamicModelFile << "        iter++;\n";
-                      mDynamicModelFile << "        cvg=(max_res<solve_tolf);\n";
-                      mDynamicModelFile << "        simulate(" << i << ", " << /*mod_param.endo_nbr*/symbol_table.endo_nbr << ", it_, y_kmin, y_kmax," << block_triangular.ModelBlock->Block_List[i].Size  << ", periods, true);\n";
-                      mDynamicModelFile << "      }\n";
-                      mDynamicModelFile << "    if (!cvg)\n";
-                      mDynamicModelFile << "      {\n";
-                      mDynamicModelFile << "        mexPrintf(\"Convergence not achieved in block " << i << ", after %d iterations\\n\",iter);\n";
-                      mDynamicModelFile << "        mexErrMsgTxt(\"End of simulate\");\n";
-                      mDynamicModelFile << "      }\n";
-                    }
-                  else
-                    {
-                      mDynamicModelFile << "    for(it_=y_kmin;it_<periods+y_kmin;it_++)\n";
-                      mDynamicModelFile << "      {\n";
-                      mDynamicModelFile << "        Per_u_=(it_-y_kmin)*" << block_triangular.ModelBlock->Block_List[i].IM_lead_lag[block_triangular.ModelBlock->Block_List[i].Max_Lag + block_triangular.ModelBlock->Block_List[i].Max_Lead].u_finish + 1 << ";\n";
-                      mDynamicModelFile << "        Per_y_=it_*y_size;\n";
-                      mDynamicModelFile << "        " << dynamic_basename << "_" << i + 1 << "(y, x, r, g1, g2, g3);\n";
-                      mDynamicModelFile << "#ifdef PRINT_OUT\n";
-                      mDynamicModelFile << "        for(j=0;j<" << block_triangular.ModelBlock->Block_List[i].IM_lead_lag[block_triangular.ModelBlock->Block_List[i].Max_Lag + block_triangular.ModelBlock->Block_List[i].Max_Lead].u_finish + 1 << ";j++)\n";
-                      mDynamicModelFile << "          {\n";
-                      mDynamicModelFile << "            mexPrintf(\" %f\",u[Per_u_+j]);\n";
-                      mDynamicModelFile << "          }\n";
-                      mDynamicModelFile << "        mexPrintf(\"\\n\");\n";
-                      mDynamicModelFile << "#endif\n";
-                      mDynamicModelFile << "      }\n";
-                      mDynamicModelFile << "    simulate(" << i << ", " << /*mod_param.endo_nbr*/symbol_table.endo_nbr << ", it_, y_kmin, y_kmax," << block_triangular.ModelBlock->Block_List[i].Size  << ", periods, true);\n";
-                    }
-                  mDynamicModelFile << "    mxFree(g1);\n";
-                  mDynamicModelFile << "    mxFree(r);\n";
-                  mDynamicModelFile << "    mxFree(u);\n";
-                  mDynamicModelFile << "    //mexErrMsgTxt(\"Exit from Dynare\");\n";
-                }
-              else if ((k == SOLVE_FOREWARD_COMPLETE) && (block_triangular.ModelBlock->Block_List[i].Size))
-                {
-                  if (open_par)
-                    {
-                      if(mode==eSparseDLLMode)
-                        {
-                          mDynamicModelFile << "#endif\n";
-                          mDynamicModelFile << "      }\n";
-                        }
-                      else
-                        {
-                          mDynamicModelFile << "  end\n";
-                        }
-                    }
-                  open_par=false;
-                  if (!printed)
-                    {
-                      printed = true;
-                    }
-                  SGE.SGE_compute(block_triangular.ModelBlock, i, false, bin_basename, /*mod_param.endo_nbr*/symbol_table.endo_nbr);
-                  Nb_SGE++;
-                  mDynamicModelFile << "    Read_file(\"" << reform(bin_basename) << "\", periods, 0, " << symbol_table.endo_nbr << ", " << block_triangular.ModelBlock->Block_List[i].Max_Lag << ", " << block_triangular.ModelBlock->Block_List[i].Max_Lead << " );\n";
-                  mDynamicModelFile << "    g1=(double*)mxMalloc(" << block_triangular.ModelBlock->Block_List[i].Size*block_triangular.ModelBlock->Block_List[i].Size << "*sizeof(double));\n";
-                  mDynamicModelFile << "    r=(double*)mxMalloc(" << block_triangular.ModelBlock->Block_List[i].Size << "*sizeof(double));\n";
-                  mDynamicModelFile << "    for(it_=y_kmin;it_<periods+y_kmin;it_++)\n";
-                  mDynamicModelFile << "      {\n";
-                  if (!block_triangular.ModelBlock->Block_List[i].is_linear)
-                    {
-                      mDynamicModelFile << "        cvg=false;\n";
-                      mDynamicModelFile << "        iter=0;\n";
-                      mDynamicModelFile << "        Per_y_=it_*y_size;\n";
-                      mDynamicModelFile << "        while(!((cvg)||(iter>maxit_)))\n";
-                      mDynamicModelFile << "          {\n";
-                      mDynamicModelFile << "            Dynamic" << i + 1 << "(y, x, r, g1, g2);\n";
-                      mDynamicModelFile << "            simulate(" << i << ", " << /*mod_param.endo_nbr*/symbol_table.endo_nbr << ", it_, y_kmin, y_kmax," << block_triangular.ModelBlock->Block_List[i].Size  << ", 0, false);\n";
-                      mDynamicModelFile << "            res2=0;\n";
-                      mDynamicModelFile << "            res1=0;\n";
-                      mDynamicModelFile << "            max_res=0;\n";
-                      mDynamicModelFile << "            for(i=0;i<" << block_triangular.ModelBlock->Block_List[i].Size << ";i++)\n";
-                      mDynamicModelFile << "              {\n";
-                      mDynamicModelFile << "                if (max_res<fabs(r[i]))\n";
-                      mDynamicModelFile << "                  max_res=fabs(r[i]);\n";
-                      mDynamicModelFile << "                res2+=r[i]*r[i];\n";
-                      mDynamicModelFile << "                res1+=fabs(r[i]);\n";
-                      mDynamicModelFile << "              }\n";
-                      mDynamicModelFile << "            cvg=(max_res<solve_tolf);\n";
-                      mDynamicModelFile << "            iter++;\n";
-                      mDynamicModelFile << "          }\n";
-                      mDynamicModelFile << "        if (!cvg)\n";
-                      mDynamicModelFile << "          {\n";
-                      mDynamicModelFile << "            mexPrintf(\"Convergence not achieved in block " << i << ", at time %d after %d iterations\\n\",it_,iter);\n";
-                      mDynamicModelFile << "            mexErrMsgTxt(\"End of simulate\");\n";
-                      mDynamicModelFile << "          }\n";
-                    }
-                  else
-                    {
-                      mDynamicModelFile << "        Dynamic" << i + 1 << "(y, x, r, g1, g2, g3);\n";
-                      mDynamicModelFile << "        simulate(" << i << ", " << /*mod_param.endo_nbr*/symbol_table.endo_nbr << ", it_, y_kmin, y_kmax," << block_triangular.ModelBlock->Block_List[i].Size  << ", 0, false);\n";
-                    }
-                  mDynamicModelFile << "      }\n";
-                  mDynamicModelFile << "    mxFree(g1);\n";
-                  mDynamicModelFile << "    mxFree(r);\n";
-                  mDynamicModelFile << "    mxFree(u);\n";
-                }
-              else if ((k == SOLVE_BACKWARD_COMPLETE) && (block_triangular.ModelBlock->Block_List[i].Size))
-                {
-                  if (open_par)
-                    {
-                      if(mode==eSparseDLLMode)
-                        {
-                          mDynamicModelFile << "#endif\n";
-                          mDynamicModelFile << "      }\n";
-                        }
-                      else
-                        {
-                          mDynamicModelFile << "  end\n";
-                        }
-                    }
-                  open_par=false;
-                  SGE.SGE_compute(block_triangular.ModelBlock, i, false, bin_basename, /*mod_param.endo_nbr*/symbol_table.endo_nbr);
-                  Nb_SGE++;
-                  mDynamicModelFile << "    Read_file(\"" << reform(bin_basename) << "\", periods, 0, " << symbol_table.endo_nbr << ", " << block_triangular.ModelBlock->Block_List[i].Max_Lag << ", " << block_triangular.ModelBlock->Block_List[i].Max_Lead << " );\n";
-                  mDynamicModelFile << "    g1=(double*)mxMalloc(" << block_triangular.ModelBlock->Block_List[i].Size*block_triangular.ModelBlock->Block_List[i].Size << "*sizeof(double));\n";
-                  mDynamicModelFile << "    r=(double*)mxMalloc(" << block_triangular.ModelBlock->Block_List[i].Size << "*sizeof(double));\n";
-                  mDynamicModelFile << "    for(it_=periods+y_kmin;it_>y_kmin;it_--)\n";
-                  mDynamicModelFile << "      {\n";
-                  if (!block_triangular.ModelBlock->Block_List[i].is_linear)
-                    {
-                      mDynamicModelFile << "        cvg=false;\n";
-                      mDynamicModelFile << "        iter=0;\n";
-                      mDynamicModelFile << "        Per_y_=it_*y_size;\n";
-                      mDynamicModelFile << "        while(!((cvg)||(iter>maxit_)))\n";
-                      mDynamicModelFile << "          {\n";
-                      mDynamicModelFile << "            Dynamic" << i + 1 << "(y, x, r, g1, g2);\n";
-                      mDynamicModelFile << "            simulate(" << i << ", " << /*mod_param.endo_nbr*/symbol_table.endo_nbr << ", it_, y_kmin, y_kmax," << block_triangular.ModelBlock->Block_List[i].Size  << ", 0, false);\n";
-                      mDynamicModelFile << "            res2=0;\n";
-                      mDynamicModelFile << "            for(i=0;i<" << block_triangular.ModelBlock->Block_List[i].Size << ";i++)\n";
-                      mDynamicModelFile << "              res2+=r[i]*r[i];\n";
-                      mDynamicModelFile << "            cvg=(res2<solve_tolf);\n";
-                      mDynamicModelFile << "            iter++;\n";
-                      mDynamicModelFile << "          }\n";
-                      mDynamicModelFile << "        if (!cvg)\n";
-                      mDynamicModelFile << "          {\n";
-                      mDynamicModelFile << "            mexPrintf(\"Convergence not achieved in block " << i << ", at time %d after %d iterations\\n\",it_,iter);\n";
-                      mDynamicModelFile << "            mexErrMsgTxt(\"End of simulate\");\n";
-                      mDynamicModelFile << "          }\n";
-                    }
-                  else
-                    {
-                      mDynamicModelFile << "        Dynamic" << i + 1 << "(y, x, r, g1, g2);\n";
-                      mDynamicModelFile << "        simulate(" << i << ", " << /*mod_param.endo_nbr*/symbol_table.endo_nbr << ", it_, y_kmin, y_kmax," << block_triangular.ModelBlock->Block_List[i].Size  << ", 0, false);\n";
-                    }
-                  mDynamicModelFile << "      }\n";
-                  mDynamicModelFile << "    mxFree(g1);\n";
-                  mDynamicModelFile << "    mxFree(r);\n";
-                  mDynamicModelFile << "    mxFree(u);\n";
-                }
-              else if ((k == SOLVE_TWO_BOUNDARIES_COMPLETE) && (block_triangular.ModelBlock->Block_List[i].Size))
-                {
-                  if (open_par)
-                    {
-                      if(mode==eSparseDLLMode)
-                        {
-                          mDynamicModelFile << "#endif\n";
-                          mDynamicModelFile << "      }\n";
-                        }
-                      else
-                        {
-                          mDynamicModelFile << "  end\n";
-                        }
-                    }
-                  open_par=false;
-                  if (!printed)
-                    {
-                      printed = true;
-                    }
-                  Nb_SGE++;
-                  //cout << "new_SGE=" << new_SGE << "\n";
-                  if(mode==eSparseDLLMode)
-                    {
-                      if (new_SGE)
-                        {
-                          int u_count_int=0;
-                          Write_Inf_To_Bin_File(dynamic_basename, bin_basename, i, u_count_int,SGE.file_open);
-                          SGE.file_is_open();
-                          mDynamicModelFile << "    u_count=" << u_count_int << "*periods;\n";
-                          mDynamicModelFile << "    u_count_alloc = 2*u_count;\n";
-                          mDynamicModelFile << "    u=(longd*)mxMalloc(u_count_alloc*sizeof(longd));\n";
-                          mDynamicModelFile << "    memset(u, 0, u_count_alloc*sizeof(longd));\n";
-                          mDynamicModelFile << "    u_count_init=" <<
-                                                      block_triangular.ModelBlock->Block_List[i].IM_lead_lag[block_triangular.ModelBlock->Block_List[i].Max_Lag +
-                                                      block_triangular.ModelBlock->Block_List[i].Max_Lead].u_finish + 1  << ";\n";
-                          mDynamicModelFile << "    Read_SparseMatrix(\"" << reform(bin_basename) <<  "\","
-                            << block_triangular.ModelBlock->Block_List[i].Size << ", periods, y_kmin, y_kmax"
-                            << ");\n";
-                          mDynamicModelFile << "    u_count=" << u_count_int << "*(periods+y_kmax+y_kmin);\n";
-                        }
-                      else
-                        {
-                          SGE.SGE_compute(block_triangular.ModelBlock, i, true, bin_basename, /*mod_param.endo_nbr*/symbol_table.endo_nbr);
-                          mDynamicModelFile << "    Read_file(\"" << reform(bin_basename) << "\",periods," <<
-                            block_triangular.ModelBlock->Block_List[i].IM_lead_lag[block_triangular.ModelBlock->Block_List[i].Max_Lag + block_triangular.ModelBlock->Block_List[i].Max_Lead].u_finish + 1 << ", " << /*mod_param.endo_nbr*/symbol_table.endo_nbr <<
-                            ", " << block_triangular.ModelBlock->Block_List[i].Max_Lag << ", " << block_triangular.ModelBlock->Block_List[i].Max_Lead << ");\n";
-                        }
-                      mDynamicModelFile << "    g1=(double*)mxMalloc(" << block_triangular.ModelBlock->Block_List[i].Size*block_triangular.ModelBlock->Block_List[i].Size << "*sizeof(double));\n";
-                      mDynamicModelFile << "    r=(double*)mxMalloc(" << block_triangular.ModelBlock->Block_List[i].Size << "*sizeof(double));\n";
-                      if (!block_triangular.ModelBlock->Block_List[i].is_linear)
-                        {
-                          mDynamicModelFile << "    cvg=false;\n";
-                          mDynamicModelFile << "    iter=0;\n";
-                          mDynamicModelFile << "    while(!((cvg)||(iter>maxit_)))\n";
-                          mDynamicModelFile << "      {\n";
-                          mDynamicModelFile << "        res2=0;\n";
-                          mDynamicModelFile << "        res1=0;\n";
-                          mDynamicModelFile << "        max_res=0;\n";
-                          mDynamicModelFile << "        for(it_=y_kmin;it_<periods+y_kmin;it_++)\n";
-                          mDynamicModelFile << "          {\n";
-                          mDynamicModelFile << "            Per_u_=(it_-y_kmin)*" << block_triangular.ModelBlock->Block_List[i].IM_lead_lag[block_triangular.ModelBlock->Block_List[i].Max_Lag + block_triangular.ModelBlock->Block_List[i].Max_Lead].u_finish + 1 << ";\n";
-                          mDynamicModelFile << "            Per_y_=it_*y_size;\n";
-                          mDynamicModelFile << "            Dynamic" << i + 1 << "(y, x, r, g1, g2);\n";
-                          mDynamicModelFile << "            if (isnan(res1)||isinf(res1))\n";
-                          mDynamicModelFile << "              break;\n";
-                          mDynamicModelFile << "            for(i=0;i<" << block_triangular.ModelBlock->Block_List[i].Size << ";i++)\n";
-                          mDynamicModelFile << "              {\n";
-                          mDynamicModelFile << "                if (max_res<fabs(r[i]))\n";
-                          mDynamicModelFile << "                  max_res=fabs(r[i]);\n";
-                          mDynamicModelFile << "                res2+=r[i]*r[i];\n";
-                          mDynamicModelFile << "                res1+=fabs(r[i]);\n";
-                          mDynamicModelFile << "              }\n";
-                          mDynamicModelFile << "          }\n";
-                          mDynamicModelFile << "        cvg=(max_res<solve_tolf);\n";
-                          if (new_SGE)
-                            mDynamicModelFile << "      simulate_NG1(" << i << ", " << /*mod_param.endo_nbr*/symbol_table.endo_nbr << ", it_, y_kmin, y_kmax," << block_triangular.ModelBlock->Block_List[i].Size  << ", periods, true, cvg);\n";
-                          else
-                            mDynamicModelFile << "      simulate(" << i << ", " << /*mod_param.endo_nbr*/symbol_table.endo_nbr << ", it_, y_kmin, y_kmax," << block_triangular.ModelBlock->Block_List[i].Size  << ", periods, true);\n";
-                          mDynamicModelFile << "        iter++;\n";
-                          mDynamicModelFile << "      }\n";
-                          mDynamicModelFile << "    if (!cvg)\n";
-                          mDynamicModelFile << "      {\n";
-                          mDynamicModelFile << "        mexPrintf(\"Convergence not achieved in block " << i << ", after %d iterations\\n\",iter);\n";
-                          mDynamicModelFile << "        mexErrMsgTxt(\"End of simulate\");\n";
-                          mDynamicModelFile << "      }\n";
-                        }
-                      else
-                        {
-                          mDynamicModelFile << "    for(it_=y_kmin;it_<periods+y_kmin;it_++)\n";
-                          mDynamicModelFile << "      {\n";
-                          mDynamicModelFile << "        Per_u_=(it_-y_kmin)*" << block_triangular.ModelBlock->Block_List[i].IM_lead_lag[block_triangular.ModelBlock->Block_List[i].Max_Lag + block_triangular.ModelBlock->Block_List[i].Max_Lead].u_finish + 1 << ";\n";
-                          mDynamicModelFile << "        Per_y_=it_*y_size;\n";
-                          mDynamicModelFile << "        Dynamic" << i + 1 << "(y, x, r, g1, g2);\n";
-                          mDynamicModelFile << "#ifdef PRINT_OUT\n";
-                          mDynamicModelFile << "        for(j=0;j<" << block_triangular.ModelBlock->Block_List[i].IM_lead_lag[block_triangular.ModelBlock->Block_List[i].Max_Lag + block_triangular.ModelBlock->Block_List[i].Max_Lead].u_finish + 1 << ";j++)\n";
-                          mDynamicModelFile << "          {\n";
-                          mDynamicModelFile << "            mexPrintf(\" %f\",u[Per_u_+j]);\n";
-                          mDynamicModelFile << "          }\n";
-                          mDynamicModelFile << "        mexPrintf(\"\\n\");\n";
-                          mDynamicModelFile << "#endif\n";
-                          mDynamicModelFile << "      }\n";
-                          if (new_SGE)
-                            mDynamicModelFile << "        simulate_NG1(" << i << ", " << /*mod_param.endo_nbr*/symbol_table.endo_nbr << ", it_, y_kmin, y_kmax," << block_triangular.ModelBlock->Block_List[i].Size  << ", periods, true, cvg);\n";
-                          else
-                            mDynamicModelFile << "        simulate(" << i << ", " << /*mod_param.endo_nbr*/symbol_table.endo_nbr << ", it_, y_kmin, y_kmax," << block_triangular.ModelBlock->Block_List[i].Size  << ", periods, true);\n";
-                        }
-                      mDynamicModelFile << "    mxFree(g1);\n";
-                      mDynamicModelFile << "    mxFree(r);\n";
-                      mDynamicModelFile << "    mxFree(u);\n";
-                      mDynamicModelFile << "    mxFree(index_vara);\n";
-                      mDynamicModelFile << "    memset(direction,0,size_of_direction);\n";
-                      mDynamicModelFile << "    //mexErrMsgTxt(\"Exit from Dynare\");\n";
-                    }
-                  else
-                    {
-                      mDynamicModelFile << "  cvg=0;\n";
-                      mDynamicModelFile << "  iter=0;\n";
-                      mDynamicModelFile << "  Per_u_=0;\n";
-                      mDynamicModelFile << "  y_index=[";
-                      for(int ik=0;ik<block_triangular.ModelBlock->Block_List[i].Size;ik++)
-                        {
-                          mDynamicModelFile << " " << block_triangular.ModelBlock->Block_List[i].Variable[ik]+1;
-                        }
-                      mDynamicModelFile << "  ];\n";
-                      mDynamicModelFile << "  Blck_size=" << block_triangular.ModelBlock->Block_List[i].Size << ";\n";
-                      /*mDynamicModelFile << "  if(options_.simulation_method==2 | options_.simulation_method==3),\n";
-                      mDynamicModelFile << "    [r, g1]= " << bin_basename << "_static(y, x);\n";
-                      mDynamicModelFile << "    [L1,U1] = lu(g1,1e-5);\n";
-                      mDynamicModelFile << "    I = speye(periods);\n";
-                      mDynamicModelFile << "    L1=kron(I,L1);\n";
-                      mDynamicModelFile << "    U1=kron(I,U1);\n";
-                      mDynamicModelFile << "  end;\n";*/
-                      mDynamicModelFile << "  y_kmin_l=" << block_triangular.ModelBlock->Block_List[i].Max_Lag << ";\n";
-                      mDynamicModelFile << "  y_kmax_l=" << block_triangular.ModelBlock->Block_List[i].Max_Lead << ";\n";
-                      mDynamicModelFile << "  lambda=options_.slowc;\n";
-                      mDynamicModelFile << "  correcting_factor=0.01;\n";
-                      mDynamicModelFile << "  luinc_tol=1e-10;\n";
-                      mDynamicModelFile << "  max_resa=1e100;\n";
-                      int nze, m;
-                      for(nze=0,m=0;m<=block_triangular.ModelBlock->Block_List[i].Max_Lead+block_triangular.ModelBlock->Block_List[i].Max_Lag;m++)
-                        nze+=block_triangular.ModelBlock->Block_List[i].IM_lead_lag[m].size;
-                      mDynamicModelFile << "  Jacobian_Size=" << block_triangular.ModelBlock->Block_List[i].Size << "*(y_kmin+" << block_triangular.ModelBlock->Block_List[i].Max_Lead << " +periods);\n";
-                      mDynamicModelFile << "  g1=spalloc( length(y_index)*periods, Jacobian_Size, " << nze << "*periods" << ");\n";
-                      /*mDynamicModelFile << "  cpath=path;\n";
-                      mDynamicModelFile << "  addpath(fullfile(matlabroot,'toolbox','matlab','sparfun'));\n";*/
-                      mDynamicModelFile << "  bicgstabh=@bicgstab;\n";
-                      //mDynamicModelFile << "  path(cpath);\n";
-                      mDynamicModelFile << sp << "  reduced = 0;\n";
-                      //mDynamicModelFile << "  functions(bicgstabh)\n";
-                      if (!block_triangular.ModelBlock->Block_List[i].is_linear)
-                        {
-                          sp="  ";
-                          mDynamicModelFile << "  while ~(cvg==1 | iter>maxit_),\n";
-                        }
-                      else
-                        {
-                          sp="";
-                        }
-                      mDynamicModelFile << sp << "  [r, g1, g2, g3, b]=" << dynamic_basename << "_" <<  i + 1 << "(y, x, y_kmin, Blck_size, periods, g1, g2, g3);\n";
-                      mDynamicModelFile << sp << "  g1a=g1(:, y_kmin*Blck_size+1:(periods+y_kmin)*Blck_size);\n";
-                      mDynamicModelFile << sp << "  b = b' -g1(:, 1+(y_kmin-y_kmin_l)*Blck_size:y_kmin*Blck_size)*reshape(y(1+y_kmin-y_kmin_l:y_kmin,y_index)',1,y_kmin_l*Blck_size)'-g1(:, (periods+y_kmin)*Blck_size+1:(periods+y_kmin+y_kmax_l)*Blck_size)*reshape(y(periods+y_kmin+1:periods+y_kmin+y_kmax_l,y_index)',1,y_kmax_l*Blck_size)';\n";
-                      mDynamicModelFile << sp << "  if(~isreal(r))\n";
-                      mDynamicModelFile << sp << "    max_res=(-(max(max(abs(r))))^2)^0.5;\n";
-                      mDynamicModelFile << sp << "  else\n";
-                      mDynamicModelFile << sp << "    max_res=max(max(abs(r)));\n";
-                      mDynamicModelFile << sp << "  end;\n";
-                      mDynamicModelFile << sp << "  if(iter>0)\n";
-                      mDynamicModelFile << sp << "    if(~isreal(max_res) | isnan(max_res) | (max_resa<max_res && iter>1))\n";
-                      mDynamicModelFile << sp << "      if(isnan(max_res))\n";
-                      mDynamicModelFile << sp << "        detJ=det(g1aa);\n";
-                      mDynamicModelFile << sp << "        if(abs(detJ)<1e-7)\n";
-                      mDynamicModelFile << sp << "          max_factor=max(max(abs(g1aa)));\n";
-                      mDynamicModelFile << sp << "          ze_elem=sum(diag(g1aa)<options_.cutoff);\n";
-                      mDynamicModelFile << sp << "          disp([num2str(full(ze_elem),'%d') ' elements on the Jacobian diagonal are below the cutoff (' num2str(options_.cutoff,'%f') ')']);\n";
-                      mDynamicModelFile << sp << "          if(correcting_factor<max_factor)\n";
-                      mDynamicModelFile << sp << "            correcting_factor=correcting_factor*4;\n";
-                      mDynamicModelFile << sp << "            disp(['The Jacobain matrix is singular, det(Jacobian)=' num2str(detJ,'%f') '.']);\n";
-                      mDynamicModelFile << sp << "            disp(['    trying to correct the Jacobian matrix:']);\n";
-                      mDynamicModelFile << sp << "            disp(['    correcting_factor=' num2str(correcting_factor,'%f') ' max(Jacobian)=' num2str(full(max_factor),'%f')]);\n";
-                      mDynamicModelFile << sp << "            dx = (g1aa+correcting_factor*speye(periods*Blck_size))\\ba- ya;\n";
-                      mDynamicModelFile << sp << "            y(1+y_kmin:periods+y_kmin,y_index)=reshape((ya_save+lambda*dx)',length(y_index),periods)';\n";
-                      if (!block_triangular.ModelBlock->Block_List[i].is_linear)
-                        mDynamicModelFile << sp << "            continue;\n";
-                      mDynamicModelFile << sp << "          else\n";
-                      mDynamicModelFile << sp << "            disp('The singularity of the jacobian matrix could not be corrected');\n";
-                      mDynamicModelFile << sp << "            return;\n";
-                      mDynamicModelFile << sp << "          end;\n";
-                      mDynamicModelFile << sp << "        end;\n";
-                      mDynamicModelFile << sp << "      elseif(lambda>1e-8)\n";
-                      mDynamicModelFile << sp << "        lambda=lambda/2;\n";
-                      mDynamicModelFile << sp << "        reduced = 1;\n";
-                      mDynamicModelFile << sp << "        disp(['reducing the path length: lambda=' num2str(lambda,'%f')]);\n";
-                      mDynamicModelFile << sp << "        y(1+y_kmin:periods+y_kmin,y_index)=reshape((ya_save+lambda*dx)',length(y_index),periods)';\n";
-                      if (!block_triangular.ModelBlock->Block_List[i].is_linear)
-                        mDynamicModelFile << sp << "        continue;\n";
-                      mDynamicModelFile << sp << "      else\n";
-                      mDynamicModelFile << sp << "        disp(['No convergence after ' num2str(iter,'%d') ' iterations']);\n";
-                      mDynamicModelFile << sp << "        return;\n";
-                      mDynamicModelFile << sp << "      end;\n";
-                      mDynamicModelFile << sp << "    else\n";
-                      mDynamicModelFile << sp << "      if(lambda<1)\n";
-                      mDynamicModelFile << sp << "        lambda=max(lambda*2, 1);\n";
-                      mDynamicModelFile << sp << "      end;\n";
-                      mDynamicModelFile << sp << "    end;\n";
-                      mDynamicModelFile << sp << "  end;\n";
-
-                      mDynamicModelFile << sp << "  ya = reshape(y(y_kmin+1:y_kmin+periods,y_index)',1,periods*Blck_size)';\n";
-                      mDynamicModelFile << sp << "  ya_save=ya;\n";
-                      mDynamicModelFile << sp << "  g1aa=g1a;\n";
-                      mDynamicModelFile << sp << "  ba=b;\n";
-                      mDynamicModelFile << sp << "  max_resa=max_res;\n";
-                      mDynamicModelFile << sp << "  if(options_.simulation_method==0),\n";
-                      mDynamicModelFile << sp << "    dx = g1a\\b- ya;\n";
-                      mDynamicModelFile << sp << "    ya = ya + lambda*dx;\n";
-                      mDynamicModelFile << sp << "    y(1+y_kmin:periods+y_kmin,y_index)=reshape(ya',length(y_index),periods)';\n";
-                      mDynamicModelFile << sp << "  elseif(options_.simulation_method==2),\n";
-                      mDynamicModelFile << sp << "    flag1=1;\n";
-                      mDynamicModelFile << sp << "    while(flag1>0)\n";
-                      mDynamicModelFile << sp << "      [L1, U1]=luinc(g1a,luinc_tol);\n";
-                      mDynamicModelFile << sp << "      [za,flag1] = gmres(g1a,b," << block_triangular.ModelBlock->Block_List[i].Size << ",1e-6," << block_triangular.ModelBlock->Block_List[i].Size << "*periods,L1,U1);\n";
-                      mDynamicModelFile << sp << "      if (flag1>0 | reduced)\n";
-                      mDynamicModelFile << sp << "        if(flag1==1)\n";
-                      mDynamicModelFile << sp << "          disp(['No convergence inside GMRES after ' num2str(periods*" <<  block_triangular.ModelBlock->Block_List[i].Size << ",'%6d') ' iterations']);\n";
-                      mDynamicModelFile << sp << "        elseif(flag1==2)\n";
-                      mDynamicModelFile << sp << "          disp(['Preconditioner is ill-conditioned ']);\n";
-                      mDynamicModelFile << sp << "        elseif(flag1==3)\n";
-                      mDynamicModelFile << sp << "          disp(['GMRES stagnated. (Two consecutive iterates were the same.)']);\n";
-                      mDynamicModelFile << sp << "        end;\n";
-                      mDynamicModelFile << sp << "        luinc_tol = luinc_tol/10;\n";
-                      mDynamicModelFile << sp << "        reduced = 0;\n";
-                      mDynamicModelFile << sp << "      else\n";
-                      mDynamicModelFile << sp << "        dx = za - ya;\n";
-                      mDynamicModelFile << sp << "        ya = ya + lambda*dx;\n";
-                      mDynamicModelFile << sp << "        y(1+y_kmin:periods+y_kmin,y_index)=reshape(ya',length(y_index),periods)';\n";
-                      mDynamicModelFile << sp << "      end;\n";
-                      mDynamicModelFile << sp << "    end;\n";
-                      mDynamicModelFile << sp << "  elseif(options_.simulation_method==3),\n";
-                      mDynamicModelFile << sp << "    flag1=1;\n";
-                      mDynamicModelFile << sp << "    while(flag1>0)\n";
-                      mDynamicModelFile << sp << "      [L1, U1]=luinc(g1a,luinc_tol);\n";
-                      mDynamicModelFile << sp << "      [za,flag1] = bicgstabh(g1a,b,1e-7," << block_triangular.ModelBlock->Block_List[i].Size << "*periods,L1,U1);\n";
-                      mDynamicModelFile << sp << "      if (flag1>0 | reduced)\n";
-                      mDynamicModelFile << sp << "        if(flag1==1)\n";
-                      mDynamicModelFile << sp << "          disp(['No convergence inside BICGSTAB after ' num2str(periods*" <<  block_triangular.ModelBlock->Block_List[i].Size << ",'%6d') ' iterations']);\n";
-                      mDynamicModelFile << sp << "        elseif(flag1==2)\n";
-                      mDynamicModelFile << sp << "          disp(['Preconditioner is ill-conditioned ']);\n";
-                      mDynamicModelFile << sp << "        elseif(flag1==3)\n";
-                      mDynamicModelFile << sp << "          disp(['BICGSTAB stagnated. (Two consecutive iterates were the same.)']);\n";
-                      mDynamicModelFile << sp << "        end;\n";
-                      mDynamicModelFile << sp << "        luinc_tol = luinc_tol/10;\n";
-                      mDynamicModelFile << sp << "        reduced = 0;\n";
-                      mDynamicModelFile << sp << "      else\n";
-                      mDynamicModelFile << sp << "        dx = za - ya;\n";
-                      mDynamicModelFile << sp << "        ya = ya + lambda*dx;\n";
-                      mDynamicModelFile << sp << "        y(1+y_kmin:periods+y_kmin,y_index)=reshape(ya',length(y_index),periods)';\n";
-                      mDynamicModelFile << sp << "      end;\n";
-                      mDynamicModelFile << sp << "    end;\n";
-                      mDynamicModelFile << sp << "  end;\n";
-                      if(!block_triangular.ModelBlock->Block_List[i].is_linear)
-                        {
-                          mDynamicModelFile << "    cvg=(max_res<solve_tolf);\n";
-                          mDynamicModelFile << "    iter=iter+1;\n";
-                        }
-                      mDynamicModelFile << "    disp(['iteration: ' num2str(iter,'%d') ' error: ' num2str(max_res,'%e')]);\n";
-                      if(!block_triangular.ModelBlock->Block_List[i].is_linear)
-                        {
-                          mDynamicModelFile << "  end\n";
-                          mDynamicModelFile << "  if (iter>maxit_)\n";
-                          mDynamicModelFile << "    disp(['No convergence after ' num2str(iter,'%4d') ' iterations']);\n";
-                          mDynamicModelFile << "    return;\n";
-                          mDynamicModelFile << "  end;\n";
-                        }
-                    }
+          mDynamicModelFile << "    Read_file(\"" << reform(basename) << "\",periods," <<
+            block_triangular.ModelBlock->Block_List[i].IM_lead_lag[block_triangular.ModelBlock->Block_List[i].Max_Lag + block_triangular.ModelBlock->Block_List[i].Max_Lead].u_finish + 1 << ", " << /*mod_param.endo_nbr*/symbol_table.endo_nbr <<
+            ", " << block_triangular.ModelBlock->Block_List[i].Max_Lag << ", " << block_triangular.ModelBlock->Block_List[i].Max_Lead << ");\n";
+          cerr << "Not implemented block SOLVE_TWO_BOUNDARIES_COMPLETE" << endl;
+          exit(-1);
+        }
+      else if ((k == SOLVE_FOREWARD_COMPLETE) && (block_triangular.ModelBlock->Block_List[i].Size))
+        {
+          if (open_par)
+            mDynamicModelFile << "  end\n";
+          open_par=false;
+          if (!printed)
+            {
+              printed = true;
+            }
+          SGE.SGE_compute(block_triangular.ModelBlock, i, false, basename, /*mod_param.endo_nbr*/symbol_table.endo_nbr);
+          Nb_SGE++;
+          mDynamicModelFile << "    Read_file(\"" << reform(basename) << "\", periods, 0, " << symbol_table.endo_nbr << ", " << block_triangular.ModelBlock->Block_List[i].Max_Lag << ", " << block_triangular.ModelBlock->Block_List[i].Max_Lead << " );\n";
+          cerr << "Not implemented block SOLVE_FOREWARD_COMPLETE" << endl;
+          exit(-1);
+        }
+      else if ((k == SOLVE_BACKWARD_COMPLETE) && (block_triangular.ModelBlock->Block_List[i].Size))
+        {
+          if (open_par)
+            mDynamicModelFile << "  end\n";
+          open_par=false;
+          SGE.SGE_compute(block_triangular.ModelBlock, i, false, basename, /*mod_param.endo_nbr*/symbol_table.endo_nbr);
+          Nb_SGE++;
+          mDynamicModelFile << "    Read_file(\"" << reform(basename) << "\", periods, 0, " << symbol_table.endo_nbr << ", " << block_triangular.ModelBlock->Block_List[i].Max_Lag << ", " << block_triangular.ModelBlock->Block_List[i].Max_Lead << " );\n";
+          cerr << "Not implemented block SOLVE_BACKWARD_COMPLETE" << endl;
+          exit(-1);
+        }
+      else if ((k == SOLVE_TWO_BOUNDARIES_COMPLETE) && (block_triangular.ModelBlock->Block_List[i].Size))
+        {
+          if (open_par)
+            mDynamicModelFile << "  end\n";
+          open_par=false;
+          if (!printed)
+            {
+              printed = true;
+            }
+          Nb_SGE++;
+          //cout << "new_SGE=" << new_SGE << "\n";
 
-                }
-              prev_Simulation_Type=k;
+          mDynamicModelFile << "  cvg=0;\n";
+          mDynamicModelFile << "  iter=0;\n";
+          mDynamicModelFile << "  Per_u_=0;\n";
+          mDynamicModelFile << "  y_index=[";
+          for(int ik=0;ik<block_triangular.ModelBlock->Block_List[i].Size;ik++)
+            {
+              mDynamicModelFile << " " << block_triangular.ModelBlock->Block_List[i].Variable[ik]+1;
             }
-          // Writing the gateway routine
-          if(mode==eSparseDLLMode)
-              {
-                mDynamicModelFile << "#endif\n";
-                mDynamicModelFile << "      }\n";
-                mDynamicModelFile << " }\n";
-              }
-          if(mode==eSparseMode)
+          mDynamicModelFile << "  ];\n";
+          mDynamicModelFile << "  Blck_size=" << block_triangular.ModelBlock->Block_List[i].Size << ";\n";
+          /*mDynamicModelFile << "  if(options_.simulation_method==2 | options_.simulation_method==3),\n";
+            mDynamicModelFile << "    [r, g1]= " << basename << "_static(y, x);\n";
+            mDynamicModelFile << "    [L1,U1] = lu(g1,1e-5);\n";
+            mDynamicModelFile << "    I = speye(periods);\n";
+            mDynamicModelFile << "    L1=kron(I,L1);\n";
+            mDynamicModelFile << "    U1=kron(I,U1);\n";
+            mDynamicModelFile << "  end;\n";*/
+          mDynamicModelFile << "  y_kmin_l=" << block_triangular.ModelBlock->Block_List[i].Max_Lag << ";\n";
+          mDynamicModelFile << "  y_kmax_l=" << block_triangular.ModelBlock->Block_List[i].Max_Lead << ";\n";
+          mDynamicModelFile << "  lambda=options_.slowc;\n";
+          mDynamicModelFile << "  correcting_factor=0.01;\n";
+          mDynamicModelFile << "  luinc_tol=1e-10;\n";
+          mDynamicModelFile << "  max_resa=1e100;\n";
+          int nze, m;
+          for(nze=0,m=0;m<=block_triangular.ModelBlock->Block_List[i].Max_Lead+block_triangular.ModelBlock->Block_List[i].Max_Lag;m++)
+            nze+=block_triangular.ModelBlock->Block_List[i].IM_lead_lag[m].size;
+          mDynamicModelFile << "  Jacobian_Size=" << block_triangular.ModelBlock->Block_List[i].Size << "*(y_kmin+" << block_triangular.ModelBlock->Block_List[i].Max_Lead << " +periods);\n";
+          mDynamicModelFile << "  g1=spalloc( length(y_index)*periods, Jacobian_Size, " << nze << "*periods" << ");\n";
+          /*mDynamicModelFile << "  cpath=path;\n";
+            mDynamicModelFile << "  addpath(fullfile(matlabroot,'toolbox','matlab','sparfun'));\n";*/
+          mDynamicModelFile << "  bicgstabh=@bicgstab;\n";
+          //mDynamicModelFile << "  path(cpath);\n";
+          mDynamicModelFile << sp << "  reduced = 0;\n";
+          //mDynamicModelFile << "  functions(bicgstabh)\n";
+          if (!block_triangular.ModelBlock->Block_List[i].is_linear)
             {
-              if(open_par)
-                mDynamicModelFile << "  end;\n";
-              mDynamicModelFile << "  oo_.endo_simul = y';\n";
-              mDynamicModelFile << "return;\n";
+              sp="  ";
+              mDynamicModelFile << "  while ~(cvg==1 | iter>maxit_),\n";
             }
-          if(mode==eSparseDLLMode)
+          else
             {
-              mDynamicModelFile << "/* The gateway routine */\n";
-              mDynamicModelFile << "void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])\n";
-              mDynamicModelFile << "{\n";
-              mDynamicModelFile << "  mxArray *M_, *oo_, *options_;\n";
-              mDynamicModelFile << "  int i, row_y, col_y, row_x, col_x, nb_row_xd;\n";
-              mDynamicModelFile << "  double * pind ;\n";
-              mDynamicModelFile << "\n";
-              mDynamicModelFile << "  /* Gets model parameters from global workspace of Matlab */\n";
-              mDynamicModelFile << "  M_ = mexGetVariable(\"global\",\"M_\");\n";
-              mDynamicModelFile << "  if (M_ == NULL )\n";
-              mDynamicModelFile << "    {\n";
-              mDynamicModelFile << "      mexPrintf(\"Global variable not found : \");\n";
-              mDynamicModelFile << "      mexErrMsgTxt(\"M_ \\n\");\n";
-              mDynamicModelFile << "    }\n";
-              mDynamicModelFile << "  /* Gets variables and parameters from global workspace of Matlab */\n";
-              mDynamicModelFile << "  oo_ = mexGetVariable(\"global\",\"oo_\");\n";
-              mDynamicModelFile << "  if (oo_ == NULL )\n";
-              mDynamicModelFile << "    {\n";
-              mDynamicModelFile << "      mexPrintf(\"Global variable not found : \");\n";
-              mDynamicModelFile << "      mexErrMsgTxt(\"oo_ \\n\");\n";
-              mDynamicModelFile << "    }\n";
-              mDynamicModelFile << "  options_ = mexGetVariable(\"global\",\"options_\");\n";
-              mDynamicModelFile << "  if (options_ == NULL )\n";
-              mDynamicModelFile << "    {\n";
-              mDynamicModelFile << "      mexPrintf(\"Global variable not found : \");\n";
-              mDynamicModelFile << "      mexErrMsgTxt(\"options_ \\n\");\n";
-              mDynamicModelFile << "    }\n";
-              mDynamicModelFile << "  params = mxGetPr(mxGetFieldByNumber(M_, 0, mxGetFieldNumber(M_,\"params\")));\n";
-              mDynamicModelFile << "  double *yd, *xd;\n";
-              mDynamicModelFile << "  yd= mxGetPr(mxGetFieldByNumber(oo_, 0, mxGetFieldNumber(oo_,\"endo_simul\")));\n";
-              mDynamicModelFile << "  row_y=mxGetM(mxGetFieldByNumber(oo_, 0, mxGetFieldNumber(oo_,\"endo_simul\")));\n";
-              mDynamicModelFile << "  xd= mxGetPr(mxGetFieldByNumber(oo_, 0, mxGetFieldNumber(oo_,\"exo_simul\")));\n";
-              mDynamicModelFile << "  row_x=mxGetM(mxGetFieldByNumber(oo_, 0, mxGetFieldNumber(oo_,\"exo_simul\")));\n";
-              mDynamicModelFile << "  col_x=mxGetN(mxGetFieldByNumber(oo_, 0, mxGetFieldNumber(oo_,\"exo_simul\")));\n";
-              if (compiler==GCC_COMPILE)
-                {
-                  mDynamicModelFile << "  y_kmin=int(floor(*(mxGetPr(mxGetFieldByNumber(M_, 0, mxGetFieldNumber(M_,\"maximum_lag\"))))));\n";
-                  mDynamicModelFile << "  y_kmax=int(floor(*(mxGetPr(mxGetFieldByNumber(M_, 0, mxGetFieldNumber(M_,\"maximum_lead\"))))));\n";
-                  mDynamicModelFile << "  y_decal=max(0,y_kmin-int(floor(*(mxGetPr(mxGetFieldByNumber(M_, 0, mxGetFieldNumber(M_,\"maximum_endo_lag\")))))));\n";
-                  mDynamicModelFile << "  periods=int(floor(*(mxGetPr(mxGetFieldByNumber(options_, 0, mxGetFieldNumber(options_,\"periods\"))))));\n";
-                  mDynamicModelFile << "  maxit_=int(floor(*(mxGetPr(mxGetFieldByNumber(options_, 0, mxGetFieldNumber(options_,\"maxit_\"))))));\n";
-                  mDynamicModelFile << "  slowc=double(*(mxGetPr(mxGetFieldByNumber(options_, 0, mxGetFieldNumber(options_,\"slowc\")))));\n";
-                  mDynamicModelFile << "  markowitz_c=double(*(mxGetPr(mxGetFieldByNumber(options_, 0, mxGetFieldNumber(options_,\"markowitz\")))));\n";
-                  mDynamicModelFile << "  nb_row_xd=int(floor(*(mxGetPr(mxGetFieldByNumber(M_, 0, mxGetFieldNumber(M_,\"exo_det_nbr\"))))));\n";
-                }
-              else
-                {
-                  mDynamicModelFile << "  y_kmin=(int)floor(*(mxGetPr(mxGetFieldByNumber(M_, 0, mxGetFieldNumber(M_,\"maximum_lag\")))));\n";
-                  mDynamicModelFile << "  y_kmax=(int)floor(*(mxGetPr(mxGetFieldByNumber(M_, 0, mxGetFieldNumber(M_,\"maximum_lead\")))));\n";
-                  mDynamicModelFile << "  y_decal=max(0,y_kmin-int(floor(*(mxGetPr(mxGetFieldByNumber(M_, 0, mxGetFieldNumber(M_,\"maximum_endo_lag\")))))));\n";
-                  mDynamicModelFile << "  periods=(int)floor(*(mxGetPr(mxGetFieldByNumber(options_, 0, mxGetFieldNumber(options_,\"periods\")))));\n";
-                  mDynamicModelFile << "  maxit_=(int)floor(*(mxGetPr(mxGetFieldByNumber(options_, 0, mxGetFieldNumber(options_,\"maxit_\")))));\n";
-                  mDynamicModelFile << "  slowc=double(*(mxGetPr(mxGetFieldByNumber(options_, 0, mxGetFieldNumber(options_,\"slowc\")))));\n";
-                  mDynamicModelFile << "  markowitz_c=double(*(mxGetPr(mxGetFieldByNumber(options_, 0, mxGetFieldNumber(options_,\"markowitz\")))));\n";
-                  mDynamicModelFile << "  nb_row_xd=int(floor(*(mxGetPr(mxGetFieldByNumber(M_, 0, mxGetFieldNumber(M_,\"exo_det_nbr\"))))));\n";
-                }
-              mDynamicModelFile << "  mxArray *mxa=mxGetFieldByNumber(M_, 0, mxGetFieldNumber(M_,\"fname\"));\n";
-              mDynamicModelFile << "  int buflen=mxGetM(mxa) * mxGetN(mxa) + 1;\n";
-              mDynamicModelFile << "  char *fname;\n";
-              mDynamicModelFile << "  fname=(char*)mxCalloc(buflen, sizeof(char));\n";
-              mDynamicModelFile << "  int status = mxGetString(mxa, fname, buflen);\n";
-              mDynamicModelFile << "  if (status != 0)\n";
-              mDynamicModelFile << "    mexWarnMsgTxt(\"Not enough space. Filename is truncated.\");\n";
-              mDynamicModelFile << "  mexPrintf(\"fname=%s\\n\",fname);\n";
-              mDynamicModelFile << "  col_y=mxGetN(mxGetFieldByNumber(oo_, 0, mxGetFieldNumber(oo_,\"endo_simul\")));;\n";
-              mDynamicModelFile << "  if (col_y<row_x)\n";
-              mDynamicModelFile << "    {\n";
-              mDynamicModelFile << "      row_y=row_y/row_x;\n";
-              mDynamicModelFile << "      col_y=row_x;\n";
-              mDynamicModelFile << "    }\n";
-              mDynamicModelFile << "  solve_tolf=*(mxGetPr(mxGetFieldByNumber(options_, 0, mxGetFieldNumber(options_,\"dynatol\"))));\n";
-              mDynamicModelFile << "  size_of_direction=col_y*row_y*sizeof(longd);\n";
-              mDynamicModelFile << "  y=(longd*)mxMalloc(size_of_direction);\n";
-              mDynamicModelFile << "  ya=(longd*)mxMalloc(size_of_direction);\n";
-              mDynamicModelFile << "  direction=(longd*)mxMalloc(size_of_direction);\n";
-              mDynamicModelFile << "  memset(direction,0,size_of_direction);\n";
-              mDynamicModelFile << "  x=(longd*)mxMalloc(col_x*row_x*sizeof(longd));\n";
-              mDynamicModelFile << "  for(i=0;i<row_x*col_x;i++)\n";
-              mDynamicModelFile << "    x[i]=longd(xd[i]);\n";
-              mDynamicModelFile << "  for(i=0;i<row_y*col_y;i++)\n";
-              mDynamicModelFile << "    y[i]=longd(yd[i]);\n";
-              mDynamicModelFile << "  \n";
-              mDynamicModelFile << "  y_size=row_y;\n";
-              mDynamicModelFile << "  x_size=row_x;\n";
-              mDynamicModelFile << "  nb_row_x=row_x;\n";
-              mDynamicModelFile << "#ifdef DEBUG\n";
-              mDynamicModelFile << "  for(j=0;j<periods+y_kmin+y_kmax;j++)\n";
-              mDynamicModelFile << "    {\n";
-              mDynamicModelFile << "      for(i=0;i<row_y;i++)\n";
-              mDynamicModelFile << "        mexPrintf(\"y[%d,%d]=%f \",j,i,y[j*y_size+i]);\n";
-              mDynamicModelFile << "      mexPrintf(\"\\n\");\n";
-              mDynamicModelFile << "    }\n";
-              mDynamicModelFile << "    mexPrintf(\"\\n\");\n";
-              mDynamicModelFile << "    mexPrintf(\"x=%x\\n\",x);\n";
-              mDynamicModelFile << "  for(j=0;j<periods+y_kmin+y_kmax;j++)\n";
-              mDynamicModelFile << "    {\n";
-              mDynamicModelFile << "      for(i=0;i<col_x;i++)\n";
-              mDynamicModelFile << "        mexPrintf(\"x[%d,%d]=%f \",j,i,x[i*x_size+j]);\n";
-              mDynamicModelFile << "      mexPrintf(\"\\n\");\n";
-              mDynamicModelFile << "    }\n";
-              mDynamicModelFile << "    mexPrintf(\"x[1]=%f\\n\",x[1]);\n";
-              mDynamicModelFile << "#endif\n";
-              mDynamicModelFile << "  /* Gets it_ from global workspace of Matlab */\n";
-              mDynamicModelFile << "  //it_ = (int) floor(mxGetScalar(mexGetVariable(\"global\", \"it_\")))-1;\n";
-              mDynamicModelFile << "  /* Call the C subroutines. */\n";
-              mDynamicModelFile << "  t0= pctimer();\n";
-              mDynamicModelFile << "  Dynamic_Init();\n";
-              mDynamicModelFile << "  t1= pctimer();\n";
-              mDynamicModelFile << "  mexPrintf(\"Simulation Time=%f milliseconds\\n\",1000*(t1-t0));\n";
-              if (compiler==LCC_COMPILE  )
-                {
-                  mDynamicModelFile << "  if (SaveCode)\n";
-                  mDynamicModelFile << "    fclose(SaveCode);\n";
-                }
-              else
-                {
-                  mDynamicModelFile << "  if (SaveCode.is_open())\n";
-                  mDynamicModelFile << "    SaveCode.close();\n";
-                }
-              mDynamicModelFile << "  if (nlhs>0)\n";
-              mDynamicModelFile << "    {\n";
-              mDynamicModelFile << "      plhs[0] = mxCreateDoubleMatrix(row_y, col_y, mxREAL);\n";
-              mDynamicModelFile << "      pind = mxGetPr(plhs[0]);\n";
-              mDynamicModelFile << "      for(i=0;i<row_y*col_y;i++)\n";
-              mDynamicModelFile << "        pind[i]=y[i];\n";
-              mDynamicModelFile << "    }\n";
-              mDynamicModelFile << "  mxFree(x);\n";
-              mDynamicModelFile << "  mxFree(y);\n";
-              mDynamicModelFile << "  mxFree(ya);\n";
-              mDynamicModelFile << "  mxFree(direction);\n";
-              mDynamicModelFile << "}\n";
+              sp="";
+            }
+          mDynamicModelFile << sp << "  [r, g1, g2, g3, b]=" << dynamic_basename << "_" <<  i + 1 << "(y, x, y_kmin, Blck_size, periods, g1, g2, g3);\n";
+          mDynamicModelFile << sp << "  g1a=g1(:, y_kmin*Blck_size+1:(periods+y_kmin)*Blck_size);\n";
+          mDynamicModelFile << sp << "  b = b' -g1(:, 1+(y_kmin-y_kmin_l)*Blck_size:y_kmin*Blck_size)*reshape(y(1+y_kmin-y_kmin_l:y_kmin,y_index)',1,y_kmin_l*Blck_size)'-g1(:, (periods+y_kmin)*Blck_size+1:(periods+y_kmin+y_kmax_l)*Blck_size)*reshape(y(periods+y_kmin+1:periods+y_kmin+y_kmax_l,y_index)',1,y_kmax_l*Blck_size)';\n";
+          mDynamicModelFile << sp << "  if(~isreal(r))\n";
+          mDynamicModelFile << sp << "    max_res=(-(max(max(abs(r))))^2)^0.5;\n";
+          mDynamicModelFile << sp << "  else\n";
+          mDynamicModelFile << sp << "    max_res=max(max(abs(r)));\n";
+          mDynamicModelFile << sp << "  end;\n";
+          mDynamicModelFile << sp << "  if(iter>0)\n";
+          mDynamicModelFile << sp << "    if(~isreal(max_res) | isnan(max_res) | (max_resa<max_res && iter>1))\n";
+          mDynamicModelFile << sp << "      if(isnan(max_res))\n";
+          mDynamicModelFile << sp << "        detJ=det(g1aa);\n";
+          mDynamicModelFile << sp << "        if(abs(detJ)<1e-7)\n";
+          mDynamicModelFile << sp << "          max_factor=max(max(abs(g1aa)));\n";
+          mDynamicModelFile << sp << "          ze_elem=sum(diag(g1aa)<options_.cutoff);\n";
+          mDynamicModelFile << sp << "          disp([num2str(full(ze_elem),'%d') ' elements on the Jacobian diagonal are below the cutoff (' num2str(options_.cutoff,'%f') ')']);\n";
+          mDynamicModelFile << sp << "          if(correcting_factor<max_factor)\n";
+          mDynamicModelFile << sp << "            correcting_factor=correcting_factor*4;\n";
+          mDynamicModelFile << sp << "            disp(['The Jacobain matrix is singular, det(Jacobian)=' num2str(detJ,'%f') '.']);\n";
+          mDynamicModelFile << sp << "            disp(['    trying to correct the Jacobian matrix:']);\n";
+          mDynamicModelFile << sp << "            disp(['    correcting_factor=' num2str(correcting_factor,'%f') ' max(Jacobian)=' num2str(full(max_factor),'%f')]);\n";
+          mDynamicModelFile << sp << "            dx = (g1aa+correcting_factor*speye(periods*Blck_size))\\ba- ya;\n";
+          mDynamicModelFile << sp << "            y(1+y_kmin:periods+y_kmin,y_index)=reshape((ya_save+lambda*dx)',length(y_index),periods)';\n";
+          if (!block_triangular.ModelBlock->Block_List[i].is_linear)
+            mDynamicModelFile << sp << "            continue;\n";
+          mDynamicModelFile << sp << "          else\n";
+          mDynamicModelFile << sp << "            disp('The singularity of the jacobian matrix could not be corrected');\n";
+          mDynamicModelFile << sp << "            return;\n";
+          mDynamicModelFile << sp << "          end;\n";
+          mDynamicModelFile << sp << "        end;\n";
+          mDynamicModelFile << sp << "      elseif(lambda>1e-8)\n";
+          mDynamicModelFile << sp << "        lambda=lambda/2;\n";
+          mDynamicModelFile << sp << "        reduced = 1;\n";
+          mDynamicModelFile << sp << "        disp(['reducing the path length: lambda=' num2str(lambda,'%f')]);\n";
+          mDynamicModelFile << sp << "        y(1+y_kmin:periods+y_kmin,y_index)=reshape((ya_save+lambda*dx)',length(y_index),periods)';\n";
+          if (!block_triangular.ModelBlock->Block_List[i].is_linear)
+            mDynamicModelFile << sp << "        continue;\n";
+          mDynamicModelFile << sp << "      else\n";
+          mDynamicModelFile << sp << "        disp(['No convergence after ' num2str(iter,'%d') ' iterations']);\n";
+          mDynamicModelFile << sp << "        return;\n";
+          mDynamicModelFile << sp << "      end;\n";
+          mDynamicModelFile << sp << "    else\n";
+          mDynamicModelFile << sp << "      if(lambda<1)\n";
+          mDynamicModelFile << sp << "        lambda=max(lambda*2, 1);\n";
+          mDynamicModelFile << sp << "      end;\n";
+          mDynamicModelFile << sp << "    end;\n";
+          mDynamicModelFile << sp << "  end;\n";
+
+          mDynamicModelFile << sp << "  ya = reshape(y(y_kmin+1:y_kmin+periods,y_index)',1,periods*Blck_size)';\n";
+          mDynamicModelFile << sp << "  ya_save=ya;\n";
+          mDynamicModelFile << sp << "  g1aa=g1a;\n";
+          mDynamicModelFile << sp << "  ba=b;\n";
+          mDynamicModelFile << sp << "  max_resa=max_res;\n";
+          mDynamicModelFile << sp << "  if(options_.simulation_method==0),\n";
+          mDynamicModelFile << sp << "    dx = g1a\\b- ya;\n";
+          mDynamicModelFile << sp << "    ya = ya + lambda*dx;\n";
+          mDynamicModelFile << sp << "    y(1+y_kmin:periods+y_kmin,y_index)=reshape(ya',length(y_index),periods)';\n";
+          mDynamicModelFile << sp << "  elseif(options_.simulation_method==2),\n";
+          mDynamicModelFile << sp << "    flag1=1;\n";
+          mDynamicModelFile << sp << "    while(flag1>0)\n";
+          mDynamicModelFile << sp << "      [L1, U1]=luinc(g1a,luinc_tol);\n";
+          mDynamicModelFile << sp << "      [za,flag1] = gmres(g1a,b," << block_triangular.ModelBlock->Block_List[i].Size << ",1e-6," << block_triangular.ModelBlock->Block_List[i].Size << "*periods,L1,U1);\n";
+          mDynamicModelFile << sp << "      if (flag1>0 | reduced)\n";
+          mDynamicModelFile << sp << "        if(flag1==1)\n";
+          mDynamicModelFile << sp << "          disp(['No convergence inside GMRES after ' num2str(periods*" <<  block_triangular.ModelBlock->Block_List[i].Size << ",'%6d') ' iterations']);\n";
+          mDynamicModelFile << sp << "        elseif(flag1==2)\n";
+          mDynamicModelFile << sp << "          disp(['Preconditioner is ill-conditioned ']);\n";
+          mDynamicModelFile << sp << "        elseif(flag1==3)\n";
+          mDynamicModelFile << sp << "          disp(['GMRES stagnated. (Two consecutive iterates were the same.)']);\n";
+          mDynamicModelFile << sp << "        end;\n";
+          mDynamicModelFile << sp << "        luinc_tol = luinc_tol/10;\n";
+          mDynamicModelFile << sp << "        reduced = 0;\n";
+          mDynamicModelFile << sp << "      else\n";
+          mDynamicModelFile << sp << "        dx = za - ya;\n";
+          mDynamicModelFile << sp << "        ya = ya + lambda*dx;\n";
+          mDynamicModelFile << sp << "        y(1+y_kmin:periods+y_kmin,y_index)=reshape(ya',length(y_index),periods)';\n";
+          mDynamicModelFile << sp << "      end;\n";
+          mDynamicModelFile << sp << "    end;\n";
+          mDynamicModelFile << sp << "  elseif(options_.simulation_method==3),\n";
+          mDynamicModelFile << sp << "    flag1=1;\n";
+          mDynamicModelFile << sp << "    while(flag1>0)\n";
+          mDynamicModelFile << sp << "      [L1, U1]=luinc(g1a,luinc_tol);\n";
+          mDynamicModelFile << sp << "      [za,flag1] = bicgstabh(g1a,b,1e-7," << block_triangular.ModelBlock->Block_List[i].Size << "*periods,L1,U1);\n";
+          mDynamicModelFile << sp << "      if (flag1>0 | reduced)\n";
+          mDynamicModelFile << sp << "        if(flag1==1)\n";
+          mDynamicModelFile << sp << "          disp(['No convergence inside BICGSTAB after ' num2str(periods*" <<  block_triangular.ModelBlock->Block_List[i].Size << ",'%6d') ' iterations']);\n";
+          mDynamicModelFile << sp << "        elseif(flag1==2)\n";
+          mDynamicModelFile << sp << "          disp(['Preconditioner is ill-conditioned ']);\n";
+          mDynamicModelFile << sp << "        elseif(flag1==3)\n";
+          mDynamicModelFile << sp << "          disp(['BICGSTAB stagnated. (Two consecutive iterates were the same.)']);\n";
+          mDynamicModelFile << sp << "        end;\n";
+          mDynamicModelFile << sp << "        luinc_tol = luinc_tol/10;\n";
+          mDynamicModelFile << sp << "        reduced = 0;\n";
+          mDynamicModelFile << sp << "      else\n";
+          mDynamicModelFile << sp << "        dx = za - ya;\n";
+          mDynamicModelFile << sp << "        ya = ya + lambda*dx;\n";
+          mDynamicModelFile << sp << "        y(1+y_kmin:periods+y_kmin,y_index)=reshape(ya',length(y_index),periods)';\n";
+          mDynamicModelFile << sp << "      end;\n";
+          mDynamicModelFile << sp << "    end;\n";
+          mDynamicModelFile << sp << "  end;\n";
+          if(!block_triangular.ModelBlock->Block_List[i].is_linear)
+            {
+              mDynamicModelFile << "    cvg=(max_res<solve_tolf);\n";
+              mDynamicModelFile << "    iter=iter+1;\n";
+            }
+          mDynamicModelFile << "    disp(['iteration: ' num2str(iter,'%d') ' error: ' num2str(max_res,'%e')]);\n";
+          if(!block_triangular.ModelBlock->Block_List[i].is_linear)
+            {
+              mDynamicModelFile << "  end\n";
+              mDynamicModelFile << "  if (iter>maxit_)\n";
+              mDynamicModelFile << "    disp(['No convergence after ' num2str(iter,'%4d') ' iterations']);\n";
+              mDynamicModelFile << "    return;\n";
+              mDynamicModelFile << "  end;\n";
             }
         }
-      if(mode==eSparseMode)
-        writeModelEquationsOrdered_M(mDynamicModelFile, block_triangular.ModelBlock, dynamic_basename);
-      mDynamicModelFile.close();
+
+      prev_Simulation_Type=k;
+      if(open_par)
+        mDynamicModelFile << "  end;\n";
+      mDynamicModelFile << "  oo_.endo_simul = y';\n";
+      mDynamicModelFile << "return;\n";
     }
+
+  writeModelEquationsOrdered_M(mDynamicModelFile, block_triangular.ModelBlock, dynamic_basename);
+
+  mDynamicModelFile.close();
+
   if (printed)
     cout << "done\n";
 }
@@ -4007,6 +3088,7 @@ ModelTree::writeStaticFile(const string &basename) const
       break;
     case eSparseMode:
       writeSparseStaticMFile(basename + "_static", basename, mode);
+      break;
     case eDLLMode:
       writeStaticCFile(basename + "_static");
       break;
@@ -4016,14 +3098,13 @@ ModelTree::writeStaticFile(const string &basename) const
 void
 ModelTree::writeDynamicFile(const string &basename) const
 {
-  ExprNodeOutputType output_type = (mode == eDLLMode ? oCStaticModel : oMatlabStaticModel);
   switch(mode)
     {
     case eStandardMode:
       writeDynamicMFile(basename + "_dynamic");
       break;
     case eSparseMode:
-      writeSparseDynamicFileAndBinFile(basename + "_dynamic", basename, output_type, mode);
+      writeSparseDynamicMFile(basename + "_dynamic", basename, mode);
       block_triangular.Free_Block(block_triangular.ModelBlock);
       block_triangular.Free_IM(block_triangular.First_IM);
       break;
@@ -4031,9 +3112,7 @@ ModelTree::writeDynamicFile(const string &basename) const
       writeDynamicCFile(basename + "_dynamic");
       break;
     case eSparseDLLMode:
-      writeSparseDynamicFileAndBinFile(basename + "_dynamic", basename, output_type, mode);
-      if (compiler==GCC_COMPILE || compiler==LCC_COMPILE )
-        writeSparseDLLDynamicHFile(basename + "_dynamic");
+      writeModelEquationsCodeOrdered(basename + "_dynamic", block_triangular.ModelBlock, basename, oCDynamicModelSparseDLL);
       block_triangular.Free_Block(block_triangular.ModelBlock);
       block_triangular.Free_IM(block_triangular.First_IM);
       break;
diff --git a/ParsingDriver.cc b/ParsingDriver.cc
index 52e885ec..cd2cd313 100644
--- a/ParsingDriver.cc
+++ b/ParsingDriver.cc
@@ -24,14 +24,6 @@
 #include "ParsingDriver.hh"
 #include "Statement.hh"
 
-ParsingDriver::ParsingDriver()
-{
-}
-
-ParsingDriver::~ParsingDriver()
-{
-}
-
 bool
 ParsingDriver::symbol_exists_and_is_not_modfile_local_variable(const char *s)
 {
@@ -705,16 +697,10 @@ void ParsingDriver::simulate()
 void
 ParsingDriver::simul_sparse()
 {
-  mod_file->addStatement(new SimulSparseStatement(options_list, mod_file->model_tree.compiler, mod_file->model_tree.mode));
+  mod_file->addStatement(new SimulSparseStatement(options_list, mod_file->model_tree.mode));
   options_list.clear();
 }
 
-void
-ParsingDriver::init_compiler(int compiler_type)
-{
-  mod_file->model_tree.compiler = compiler_type;
-}
-
 void
 ParsingDriver::simul()
 {
diff --git a/include/ComputingTasks.hh b/include/ComputingTasks.hh
index 08d24a1d..96e547e2 100644
--- a/include/ComputingTasks.hh
+++ b/include/ComputingTasks.hh
@@ -69,9 +69,9 @@ class SimulSparseStatement : public Statement
 {
 private:
   const OptionsList options_list;
-  const int compiler, mode;
+  const int mode;
 public:
-  SimulSparseStatement(const OptionsList &options_list_arg, int compiler_arg, int mode_arg);
+  SimulSparseStatement(const OptionsList &options_list_arg, int mode_arg);
   virtual void checkPass(ModFileStructure &mod_file_struct);
   virtual void writeOutput(ostream &output, const string &basename) const;
 };
diff --git a/include/ModelTree.hh b/include/ModelTree.hh
index 1e4fbcea..7cb392e6 100644
--- a/include/ModelTree.hh
+++ b/include/ModelTree.hh
@@ -33,11 +33,6 @@ using namespace std;
 #include "BlockTriangular.hh"
 #include "SymbolGaussElim.hh"
 
-#define LCC_COMPILE 0
-#define GCC_COMPILE 1
-#define NO_COMPILE 2
-//#define CONDITION
-
 //! The three in which ModelTree can work
 enum ModelTreeMode
   {
@@ -106,13 +101,11 @@ private:
   //! Writes the dynamic model equations and its derivatives
   /*! \todo add third derivatives handling in C output */
   void writeDynamicModel(ostream &DynamicOutput) const;
-  //! Writes the Block reordred structure of the model in C output
-  void writeModelEquationsOrdered_C(ostream &output, Model_Block *ModelBlock) const;
   //! Writes the Block reordred structure of the model in M output
   void writeModelEquationsOrdered_M(ostream &output, Model_Block *ModelBlock, const string &dynamic_basename) const;
   //! Writes the Block reordred structure of the static model in M output
   void writeModelStaticEquationsOrdered_M(ostream &output, Model_Block *ModelBlock, const string &static_basename) const;
-  //! Writes the code of the Block reordred structure of the model in C output
+  //! Writes the code of the Block reordred structure of the model in virtual machine bytecode
   void writeModelEquationsCodeOrdered(const string file_name, const Model_Block *ModelBlock, const string bin_basename, ExprNodeOutputType output_type) const;
   //! Writes static model file (Matlab version)
   void writeStaticMFile(const string &static_basename) const;
@@ -125,10 +118,8 @@ private:
   //! Writes dynamic model file (C version)
   /*! \todo add third derivatives handling */
   void writeDynamicCFile(const string &dynamic_basename) const;
-  //! Writes dynamic model header file when SparseDLL option is on
-  void writeSparseDLLDynamicHFile(const string &dynamic_basename) const;
   //! Writes dynamic model file when SparseDLL option is on
-  void writeSparseDynamicFileAndBinFile(const string &dynamic_basename, const string &bin_basename, ExprNodeOutputType output_type, const int mode) const;
+  void writeSparseDynamicMFile(const string &dynamic_basename, const string &basename, const int mode) const;
   //! Computes jacobian and prepares for equation normalization
   /*! Using values from initval/endval blocks and parameter initializations:
     - computes the jacobian for the model w.r. to contemporaneous variables
@@ -145,8 +136,6 @@ public:
   ModelTree(SymbolTable &symbol_table_arg, NumericalConstants &num_constants);
   //! Mode in which the ModelTree is supposed to work (Matlab, DLL or SparseDLL)
   ModelTreeMode mode;
-  //! Type of compiler used in matlab for SPARSE_DLL option: 0 = LCC or 1 = GCC or 2 = NO
-  int compiler;
   //! Absolute value under which a number is considered to be zero
   double cutoff;
   //! The weight of the Markowitz criteria to determine the pivot in the linear solver (simul_NG1 from simulate.cc)
@@ -181,7 +170,7 @@ public:
   //! Adds informations for simulation in a binary file
   void Write_Inf_To_Bin_File(const string &dynamic_basename, const string &bin_basename,
                              const int &num, int &u_count_int, bool &file_open) const;
-
+  //! Returns the number of equations in the model
   int equation_number() const;
 };
 
diff --git a/include/ParsingDriver.hh b/include/ParsingDriver.hh
index 3ce2065f..c9f60996 100644
--- a/include/ParsingDriver.hh
+++ b/include/ParsingDriver.hh
@@ -139,11 +139,6 @@ private:
   ModFile *mod_file;
 
 public:
-  //! Constructor
-  ParsingDriver();
-  //! Destructor
-  virtual ~ParsingDriver();
-
   //! Starts parsing, and constructs the MOD file representation
   /*! The returned pointer should be deleted after use */
   ModFile *parse(istream &in, bool debug);
@@ -172,8 +167,6 @@ public:
   void sparse_dll();
   //! Sets mode of ModelTree class to block decompose the model and triggers the creation of the incidence matrix in Matlab context
   void sparse();
-  //! Sets the compiler type used in conjunction with SPARCE_DLL
-  void init_compiler(int compiler_type);
   //! Sets the FILENAME for the initial value in initval
   void initval_file(string *filename);
   //! Declares an endogenous variable
-- 
GitLab