diff --git a/DataTree.cc b/DataTree.cc index 5c545779..34c97ddb 100644 --- a/DataTree.cc +++ b/DataTree.cc @@ -39,6 +39,8 @@ DataTree::DataTree(SymbolTable &symbol_table_arg, NumericalConstants &num_consta MinusInfinity = AddUMinus(Infinity); Pi = AddNumConstant("3.141592653589793"); + + steady_state_found = false; } DataTree::~DataTree() @@ -416,6 +418,7 @@ DataTree::AddNormcdf(NodeID iArg1, NodeID iArg2, NodeID iArg3) NodeID DataTree::AddSteadyState(NodeID iArg1) { + steady_state_found = true; return AddUnaryOp(oSteadyState, iArg1); } diff --git a/DataTree.hh b/DataTree.hh index 494ee6a9..f9cfd42c 100644 --- a/DataTree.hh +++ b/DataTree.hh @@ -64,6 +64,9 @@ protected: //! Stores local variables value (maps symbol ID to corresponding node) map local_variables_table; + //! true when oSteadyState is encountered in a dynamic model + bool steady_state_found; + //! Internal implementation of AddVariable(), without the check on the lag VariableNode *AddVariableInternal(int symb_id, int lag); @@ -175,6 +178,8 @@ public: //! Checks if a given symbol is used somewhere in the data tree bool isSymbolUsed(int symb_id) const; //! Thrown when trying to access an unknown variable by deriv_id + bool containsSteadyStateOperator() const { return steady_state_found; }; + //! Thrown when trying to access an unknown variable by deriv_id class UnknownDerivIDException { }; @@ -183,7 +188,7 @@ public: virtual int getDerivID(int symb_id, int lag) const throw (UnknownDerivIDException); //! Returns the column of the dynamic Jacobian associated to a derivation ID virtual int getDynJacobianCol(int deriv_id) const throw (UnknownDerivIDException); - + //! Returns bool indicating whether DataTree represents a Dynamic Model (returns true in DynamicModel.hh) virtual bool isDynamic() const { return false; }; }; diff --git a/DynamicModel.cc b/DynamicModel.cc index 1451f7a9..46b4d585 100644 --- a/DynamicModel.cc +++ b/DynamicModel.cc @@ -1129,6 +1129,9 @@ DynamicModel::writeDynamicMFile(const string &dynamic_basename) const << "% Warning : this file is generated automatically by Dynare" << endl << "% from model file (.mod)" << endl << endl; + if (containsSteadyStateOperator()) + mDynamicModelFile << "global oo_;" << endl << endl; + writeDynamicModel(mDynamicModelFile, false); mDynamicModelFile.close();