diff --git a/others/cpp/dynare_cpp_driver.cc b/others/cpp/dynare_cpp_driver.cc index da0a58e4d2a4c732504c50115b59a2378248f9ba..5d72ee5b45218054844c7c0ba73c9ff93b52af5c 100644 --- a/others/cpp/dynare_cpp_driver.cc +++ b/others/cpp/dynare_cpp_driver.cc @@ -45,6 +45,10 @@ DynareInfo::DynareInfo(map<string, int > exo_names_arg, lead_lag_incidence(lead_lag_incidence_arg), NNZDerivatives(NNZDerivatives_arg) { + endo_nbr = endo_names.size(); + exo_nbr = exo_names.size(); + exo_det_nbr = exo_det_names.size(); + param_nbr = param_names.size(); } DynareInfo::~DynareInfo() diff --git a/others/cpp/dynare_cpp_driver.hh b/others/cpp/dynare_cpp_driver.hh index d031fd0f9dfc127f73cd3d413f03271ae28723d4..3deb23e3e29bbcb243c86092b9924e772bede81d 100644 --- a/others/cpp/dynare_cpp_driver.hh +++ b/others/cpp/dynare_cpp_driver.hh @@ -244,6 +244,7 @@ private: vector<int> varobs; vector<vector<int > >lead_lag_incidence; vector<int> NNZDerivatives; + int endo_nbr, exo_nbr, exo_det_nbr, param_nbr; public: DynareInfo(map<string, int > exo_names_arg, map<string, int > exo_det_names_arg, @@ -308,6 +309,11 @@ public: inline vector<vector<int > > get_lead_lag_incidence() { return lead_lag_incidence; }; inline vector<int> get_NNZDerivatives() { return NNZDerivatives; }; + inline int get_endo_nbr(void) { return endo_nbr; }; + inline int get_exo_nbr(void) { return exo_nbr; }; + inline int get_exo_det_nbr(void) { return exo_det_nbr; }; + inline int get_param_nbr(void) { return param_nbr; }; + string get_exo_name_by_index(int index) throw (ValueNotSetException); int get_exo_index_by_name(string name) throw (ValueNotSetException); string get_exo_det_name_by_index(int index) throw (ValueNotSetException); diff --git a/others/cpp/tests/Makefile b/others/cpp/tests/Makefile index 39917c2490677b92739f833dcf18b3bc3e05832c..aea41e2ed841a7a798b12c5bf10873e3c624d47f 100644 --- a/others/cpp/tests/Makefile +++ b/others/cpp/tests/Makefile @@ -4,8 +4,11 @@ test1.o : test1.cc ../dynare_cpp_driver.hh ../dynare_cpp_driver.cc gcc -g -c test1.cc -I.. -I../../../mex/sources -I../../../mex/sources/estimation -I../../../mex/sources/estimation/libmat dynare_cpp_driver.o: ../dynare_cpp_driver.cc ../dynare_cpp_driver.hh gcc -g -c ../dynare_cpp_driver.cc -I.. -example1.o: example1.mod +example1.cc example1_steadystate.cc: example1.mod $(DYNARE) example1.mod output=first +example1.o: example1.cc gcc -g -c example1.cc -I.. -test1 : test1.o example1.o dynare_cpp_driver.o - gcc -g -o test1 test1.o example1.o dynare_cpp_driver.o -lstdc++ +example1_steadystate.o: example1_steadystate.cc + gcc -g -c example1_steadystate.cc +test1 : test1.o example1.o example1_steadystate.o dynare_cpp_driver.o + gcc -g -o test1 test1.o example1.o example1_steadystate.o dynare_cpp_driver.o -lm -lstdc++ diff --git a/preprocessor/ExprNode.hh b/preprocessor/ExprNode.hh index fd53a62d183bf624a5b8b3ca070f451e8637401c..c77c8cbcf711af24a0c00990e930ce97089cc45c 100644 --- a/preprocessor/ExprNode.hh +++ b/preprocessor/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/preprocessor/SteadyStateModel.cc b/preprocessor/SteadyStateModel.cc index d84b4f770d862ce03f9770e1a06c2569908c12a9..2128f1bcb05a1b5f57be0c91458ea5ad79bee3dd 100644 --- a/preprocessor/SteadyStateModel.cc +++ b/preprocessor/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; }