| 1126 | |
| 1127 | |
| 1128 | bool Simulation::InvokeWithHandler(ISimulationHandler *ih, wxString folder) |
| 1129 | { |
| 1130 | assert( 0 != ih ); |
| 1131 | |
| 1132 | m_totalElapsedMsec = 0; |
| 1133 | m_sscElapsedMsec = 0; |
| 1134 | wxStopWatch sw; |
| 1135 | |
| 1136 | ssc_data_t p_data = ssc_data_create(); |
| 1137 | |
| 1138 | if ( m_simlist.size() == 0 ) |
| 1139 | ih->Error("No simulation compute modules defined for this configuration."); |
| 1140 | |
| 1141 | // hybrids (already gone through equations in Prepare) |
| 1142 | if (m_case->GetConfiguration()->Technology.size() > 1) { |
| 1143 | // set "input" table |
| 1144 | ssc_data_t p_input = ssc_data_create(); |
| 1145 | // set "compute_modules" |
| 1146 | ssc_var_t p_compute_modules[10]; // only constant allowed here - assumes m_simlist.size() < 10 |
| 1147 | for (size_t i = 0; i < m_simlist.size() && i<10; i++) { |
| 1148 | p_compute_modules[i] = ssc_var_create(); |
| 1149 | ssc_var_set_string(p_compute_modules[i], m_simlist[i].c_str()); |
| 1150 | } |
| 1151 | ssc_data_set_data_array(p_input, "compute_modules", &p_compute_modules[0], (int)m_simlist.size()); |
| 1152 | for (size_t i = 0; i < m_simlist.size() && i < 10; i++) |
| 1153 | ssc_var_free(p_compute_modules[i]); |
| 1154 | |
| 1155 | for (size_t i = 0; i < m_case->GetConfiguration()->Technology.size() && i < m_simlist.size(); i++) { // each vartable |
| 1156 | ssc_data_t p_val = ssc_data_create(); |
| 1157 | // m_case->Values(i).AsSSCData(p_val); // skips overrides |
| 1158 | m_inputs[i].AsSSCData(p_val); // includes overrides |
| 1159 | if (i == m_case->GetConfiguration()->Technology.size() - 1) // "Hybrid" captures all non-generators and non-battery and non-fuel cell compute modules, e.g. "grid", "utility rate5","singleowner", etc. |
| 1160 | ssc_data_set_table(p_input, m_case->GetConfiguration()->Technology[i].c_str(), p_val); |
| 1161 | else |
| 1162 | ssc_data_set_table(p_input, m_simlist[i].c_str(), p_val); |
| 1163 | ssc_data_free(p_val); |
| 1164 | } |
| 1165 | // set "input" SSC_TABLE |
| 1166 | ssc_data_set_table(p_data, "input", p_input); |
| 1167 | ssc_data_free(p_input); // after deep copy above |
| 1168 | // invoke "hybrid" compute module |
| 1169 | ssc_module_t p_modhybrid = ssc_module_create("hybrid"); |
| 1170 | if (!p_modhybrid) { |
| 1171 | wxString err = "could not create ssc module: hybrid"; |
| 1172 | ssc_data_set_string(p_data, "error", err.c_str()); |
| 1173 | return false; |
| 1174 | } |
| 1175 | wxStopWatch ssctime; |
| 1176 | ssc_bool_t ok = ssc_module_exec_with_handler(p_modhybrid, p_data, ssc_invoke_handler, ih); |
| 1177 | m_sscElapsedMsec += (int)ssctime.Time(); |
| 1178 | // process "output" table |
| 1179 | if (!ok) { |
| 1180 | ih->Error("Simulation " + m_case->GetConfiguration()->Technology[m_case->GetConfiguration()->Technology.size() - 1] + " failed :" + ssc_module_log(p_modhybrid, 0, nullptr, nullptr)); |
| 1181 | } |
| 1182 | else { |
| 1183 | int poutidx = 0; |
| 1184 | while (const ssc_info_t p_outinf = ssc_module_var_info(p_modhybrid, poutidx++)) |
| 1185 | { |
no test coverage detected