From 25b3c84b40d7da6bcc08f730c1b842b1f830919d Mon Sep 17 00:00:00 2001
From: Ferhat Mihoubi <ferhat.mihoubi@univ-evry.fr>
Date: Fri, 17 Sep 2010 16:53:27 +0200
Subject: [PATCH] RESID command is compatible now with block option and without
 bytecode option (closes ticket #45)

---
 matlab/resid.m              | 15 ++++++++++++++-
 preprocessor/StaticModel.cc | 14 ++++++++++++--
 2 files changed, 26 insertions(+), 3 deletions(-)

diff --git a/matlab/resid.m b/matlab/resid.m
index 37d2a8a017..e88b20a828 100644
--- a/matlab/resid.m
+++ b/matlab/resid.m
@@ -55,7 +55,20 @@ end
 
 % Compute the residuals
 if options_.block && ~options_.bytecode
-    error('RESID: incompatibility with "block" without "bytecode" option')
+    z = zeros(M_.endo_nbr,1);
+    for i = 1:length(M_.blocksMFS)
+      [r, g, yy, var_indx] = feval([M_.fname '_static'],...
+              i,...
+              oo_.steady_state,...
+              [oo_.exo_steady_state; ...
+               oo_.exo_det_steady_state], M_.params);
+      if isempty(M_.blocksMFS{i})
+          idx = var_indx;
+      else
+          idx = M_.blocksMFS{i};
+      end
+      z(idx) = r;
+    end
 elseif options_.block && options_.bytecode
     [z,check] = bytecode('evaluate','static');
 else
diff --git a/preprocessor/StaticModel.cc b/preprocessor/StaticModel.cc
index d060556c5f..64aa97b091 100644
--- a/preprocessor/StaticModel.cc
+++ b/preprocessor/StaticModel.cc
@@ -1069,9 +1069,10 @@ StaticModel::writeStaticBlockMFSFile(const string &basename) const
 
   string func_name = basename + "_static";
 
-  output << "function [residual, g1, y] = " << func_name << "(nblock, y, x, params)" << endl
+  output << "function [residual, g1, y, var_index] = " << func_name << "(nblock, y, x, params)" << endl
          << "  residual = [];" << endl
          << "  g1 = [];" << endl
+         << "  var_index = [];\n" << endl
          << "  switch nblock" << endl;
 
   unsigned int nb_blocks = getNbBlocks();
@@ -1086,9 +1087,18 @@ StaticModel::writeStaticBlockMFSFile(const string &basename) const
       BlockSimulationType simulation_type = getBlockSimulationType(b);
 
       if (simulation_type == EVALUATE_BACKWARD || simulation_type == EVALUATE_FORWARD)
-        output << "      y = " << func_name << "_" << b+1 << "(y, x, params);\n";
+        {
+          output << "      y_tmp = " << func_name << "_" << b+1 << "(y, x, params);\n";
+          ostringstream tmp;
+          for (int i = 0; i < getBlockSize(b); i++)
+            tmp << " " << getBlockVariableID(b, i)+1;
+          output << "      var_index = [" << tmp.str() << "];\n";
+          output << "      residual  = y(var_index) - y_tmp(var_index);\n";
+          output << "      y = y_tmp;\n";
+        }
       else
         output << "      [residual, y, g1] = " << func_name << "_" << b+1 << "(y, x, params);\n";
+
     }
   output << "  end" << endl
          << "end" << endl;
-- 
GitLab