From 4d4456b8d69a3125ab94805fc3fd932feaabbf1d Mon Sep 17 00:00:00 2001
From: Michel Juillard <michel.juillard@mjui.fr>
Date: Sun, 24 Jul 2011 20:52:03 +0200
Subject: [PATCH] adding creation of <fname>_set_auxiliary_variables.m
 containing recursive definition of auxiliary variables

---
 StaticModel.cc | 32 ++++++++++++++++++++++++++++++++
 StaticModel.hh |  3 +++
 2 files changed, 35 insertions(+)

diff --git a/StaticModel.cc b/StaticModel.cc
index c81f2191..fb21b94d 100644
--- a/StaticModel.cc
+++ b/StaticModel.cc
@@ -396,6 +396,7 @@ StaticModel::writeModelEquationsOrdered_M(const string &static_basename) const
           break;
         }
       output << "end" << endl;
+      writePowerDeriv(output, false);
       output.close();
     }
 }
@@ -1237,6 +1238,7 @@ StaticModel::writeStaticMFile(const string &func_name) const
 
   output << "end" << endl; // Close the if nargout >= 3 statement
   output << "end" << endl; // Close the *_static function
+  writePowerDeriv(output, false);
   output.close();
 }
 
@@ -1270,6 +1272,7 @@ StaticModel::writeStaticFile(const string &basename, bool block, bool bytecode)
     }
   else
     writeStaticMFile(basename);
+  writeAuxVarRecursiveDefinitions(basename);
 }
 
 void
@@ -1320,6 +1323,7 @@ StaticModel::writeStaticBlockMFSFile(const string &basename) const
     }
   output << "  end" << endl
          << "end" << endl;
+  writePowerDeriv(output, false);
   output.close();
 }
 
@@ -1596,3 +1600,31 @@ StaticModel::writeAuxVarInitval(ostream &output, ExprNodeOutputType output_type)
       output << ";" << endl;
     }
 }
+
+void StaticModel::writeAuxVarRecursiveDefinitions(const string &basename) const
+{
+  string func_name = basename + "_set_auxiliary_variables";
+  string filename = func_name + ".m";
+
+  ofstream output;
+  output.open(filename.c_str(), ios::out | ios::binary);
+  if (!output.is_open())
+    {
+      cerr << "ERROR: Can't open file " << filename << " for writing" << endl;
+      exit(EXIT_FAILURE);
+    }
+
+  output << "function y = " << func_name + "(y, x, params)" << endl
+         << "%" << endl
+         << "% Status : Computes static model for Dynare" << endl
+         << "%" << endl
+         << "% Warning : this file is generated automatically by Dynare" << endl
+         << "%           from model file (.mod)" << endl
+         << endl;
+
+    for (int i = 0; i < (int) aux_equations.size(); i++)
+    {
+      dynamic_cast<ExprNode *>(aux_equations[i])->writeOutput(output, oMatlabStaticModel);
+      output << ";" << endl;
+    }
+}
diff --git a/StaticModel.hh b/StaticModel.hh
index 2f8bd36f..1cd6caea 100644
--- a/StaticModel.hh
+++ b/StaticModel.hh
@@ -190,6 +190,9 @@ public:
   //! Writes initializations in oo_.steady_state or steady state file for the auxiliary variables
   void writeAuxVarInitval(ostream &output, ExprNodeOutputType output_type) const;
 
+  //! Writes definition of the auxiliary variables in a M file
+  void writeAuxVarRecursiveDefinitions(const string &basename) const;
+
   virtual int getDerivID(int symb_id, int lag) const throw (UnknownDerivIDException);
 
   //! Return the number of blocks
-- 
GitLab