Skip to content

Commit

Permalink
Solve crash in retail rates dispatch SAM 1629 (#1100)
Browse files Browse the repository at this point in the history
* Add an exec error for retail rates dispatch when rate data isn't provided to avoid hard crash

* Remove error handling with battery to merge in hybrids cmod from the getgo

* update test data to match new defaults
  • Loading branch information
brtietz authored Dec 6, 2023
1 parent d70de30 commit 0e711b9
Show file tree
Hide file tree
Showing 3 changed files with 8,787 additions and 29 deletions.
5 changes: 4 additions & 1 deletion ssc/cmod_battery.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1335,7 +1335,10 @@ battstor::battstor(var_table& vt, bool setup_model, size_t nrec, double dt_hr, c
if (batt_vars->ec_rate_defined) {
util_rate_data = new rate_data();
rate_setup::setup(&vt, (int)step_per_year, batt_vars->analysis_period, *util_rate_data, "cmod_battery");
}
}
else if (batt_vars->batt_dispatch == dispatch_t::RETAIL_RATE) {
throw exec_error("Battery", "Cannot select retail rate dispatch without providing utility rate data.");
}
dispatch_model = new dispatch_automatic_behind_the_meter_t(battery_model, dt_hr, batt_vars->batt_minimum_SOC, batt_vars->batt_maximum_SOC,
batt_vars->batt_current_choice, batt_vars->batt_current_charge_max, batt_vars->batt_current_discharge_max,
batt_vars->batt_power_charge_max_kwdc, batt_vars->batt_power_discharge_max_kwdc,
Expand Down
42 changes: 19 additions & 23 deletions ssc/cmod_hybrid.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -290,16 +290,14 @@ class cm_hybrid : public compute_module
ssc_data_set_array(static_cast<ssc_data_t>(&input), "gen", pGen, (int)genLength);
ssc_data_set_number(static_cast<ssc_data_t>(&input), "system_use_lifetime_output", 1); // for fuelcell_annual_energy_discharged

if (!ssc_module_exec(module, static_cast<ssc_data_t>(&input))) {
// merge in hybrid vartable for configurations where battery and fuel cell dispatch are combined and not in the technology bin
std::string hybridVarTable("Hybrid");
var_data* hybrid_inputs = input_table->table.lookup(hybridVarTable);
if (compute_module_inputs->type != SSC_TABLE)
throw exec_error("hybrid", "No input input_table found for ." + hybridVarTable);
var_table& hybridinput = hybrid_inputs->table;
input.merge(hybridinput, false);
ssc_module_exec(module, static_cast<ssc_data_t>(&input));
}
// merge in hybrid vartable for configurations where battery and fuel cell dispatch are combined and not in the technology bin
std::string hybridVarTable("Hybrid");
var_data* hybrid_inputs = input_table->table.lookup(hybridVarTable);
if (compute_module_inputs->type != SSC_TABLE)
throw exec_error("hybrid", "No input input_table found for ." + hybridVarTable);
var_table& hybridinput = hybrid_inputs->table;
input.merge(hybridinput, false);
ssc_module_exec(module, static_cast<ssc_data_t>(&input));

ssc_data_t compute_module_outputs = ssc_data_create();

Expand Down Expand Up @@ -404,22 +402,20 @@ class cm_hybrid : public compute_module
ssc_module_t module = ssc_module_create(compute_module.c_str());

var_table& input = compute_module_inputs->table;

// merge in hybrid vartable for configurations where battery dispatch variables are combined and not in the technology bin
std::string hybridVarTable("Hybrid");
var_data* hybrid_inputs = input_table->table.lookup(hybridVarTable);
if (compute_module_inputs->type != SSC_TABLE)
throw exec_error("hybrid", "No input input_table found for ." + hybridVarTable);
var_table& hybridinput = hybrid_inputs->table;
input.merge(hybridinput, false);

ssc_data_set_array(static_cast<ssc_data_t>(&input), "gen", pGen, (int)genLength); // check if issue with lookahead dispatch with hourly PV and subhourly wind
ssc_data_set_number(static_cast<ssc_data_t>(&input), "system_use_lifetime_output", 1);
ssc_data_set_number(static_cast<ssc_data_t>(&input), "en_batt", 1); // should be done at UI level

if (!ssc_module_exec(module, static_cast<ssc_data_t>(&input))) {
// merge in hybrid vartable for configurations where battery and fuel cell dispatch are combined and not in the technology bin
std::string hybridVarTable("Hybrid");
var_data* hybrid_inputs = input_table->table.lookup(hybridVarTable);
if (compute_module_inputs->type != SSC_TABLE)
throw exec_error("hybrid", "No input input_table found for ." + hybridVarTable);
var_table& hybridinput = hybrid_inputs->table;
input.merge(hybridinput, false);
ssc_data_set_number(static_cast<ssc_data_t>(&input), "en_batt", 1);

ssc_module_exec(module, static_cast<ssc_data_t>(&input));
}
ssc_module_exec(module, static_cast<ssc_data_t>(&input));

ssc_data_t compute_module_outputs = ssc_data_create();

Expand Down Expand Up @@ -449,7 +445,7 @@ class cm_hybrid : public compute_module
battery_discharged.resize(analysisPeriod, first_val);
}
else if (len != analysisPeriod) {
throw exec_error("hybrid", util::format("battery_discharged size (%d) incorrect", (int)battery_discharged.size()));
throw exec_error("hybrid", util::format("battery_discharged size (%d) incorrect", (int)len));
}
else {
for (int i = 0; i < len; i++)
Expand Down
Loading

0 comments on commit 0e711b9

Please sign in to comment.