diff --git a/ExprNode.hh b/ExprNode.hh index fd53a62d183bf624a5b8b3ca070f451e8637401c..c77c8cbcf711af24a0c00990e930ce97089cc45c 100644 --- a/ExprNode.hh +++ b/ExprNode.hh @@ -86,7 +86,10 @@ enum ExprNodeOutputType || (output_type) == oMatlabDynamicSparseSteadyStateOperator \ || (output_type) == oSteadyStateFile) -#define IS_C(output_type) ((output_type) == oCDynamicModel || (output_type) == oCStaticModel || (output_type) == oCDynamicSteadyStateOperator) +#define IS_C(output_type) ((output_type) == oCDynamicModel \ + || (output_type) == oCStaticModel \ + || (output_type) == oCDynamicSteadyStateOperator \ + || (output_type) == oCSteadyStateFile) #define IS_LATEX(output_type) ((output_type) == oLatexStaticModel \ || (output_type) == oLatexDynamicModel \ diff --git a/SteadyStateModel.cc b/SteadyStateModel.cc index d84b4f770d862ce03f9770e1a06c2569908c12a9..2128f1bcb05a1b5f57be0c91458ea5ad79bee3dd 100644 --- a/SteadyStateModel.cc +++ b/SteadyStateModel.cc @@ -158,14 +158,16 @@ SteadyStateModel::writeSteadyStateFileCC(const string &basename, bool ramsey_pol exit(EXIT_FAILURE); } + output << "#include <math.h>" << endl; + if (cuda) output << "__global__ "; output << "void steadystate(" - << "const double *exo_, const double *params_, double *ys_, int *info)" << endl + << "const double *exo_, const double *params, double *ys_, int *info)" << endl << "// Steady state file generated by Dynare preprocessor" << endl << "{" << endl - << " info = 0;" << endl; + << " *info = 0;" << endl; if (recursive_order.size() == 0) { @@ -179,24 +181,18 @@ SteadyStateModel::writeSteadyStateFileCC(const string &basename, bool ramsey_pol const vector<int> &symb_ids = recursive_order[i]; output << " "; if (symb_ids.size() > 1) - output << "["; - for (size_t j = 0; j < symb_ids.size(); j++) - { - variable_node_map_t::const_iterator it = variable_node_map.find(make_pair(symb_ids[j], 0)); - assert(it != variable_node_map.end()); - dynamic_cast<ExprNode *>(it->second)->writeOutput(output, oSteadyStateFile); - if (j < symb_ids.size()-1) - output << ","; - } - if (symb_ids.size() > 1) - output << "]"; - + std::cout << "Error: in C, multiple returns are not permitted in steady_state_model" << std::endl; + variable_node_map_t::const_iterator it = variable_node_map.find(make_pair(symb_ids[0], 0)); + assert(it != variable_node_map.end()); + if (it->second->get_type() == eModFileLocalVariable) + output << "double "; + dynamic_cast<ExprNode *>(it->second)->writeOutput(output, oCSteadyStateFile); output << "="; - def_table.find(symb_ids)->second->writeOutput(output, oSteadyStateFile); + def_table.find(symb_ids)->second->writeOutput(output, oCSteadyStateFile); output << ";" << endl; } output << " // Auxiliary equations" << endl; - static_model.writeAuxVarInitval(output, oSteadyStateFile); + static_model.writeAuxVarInitval(output, oCSteadyStateFile); output << "}" << endl; }