From 4186cbcf9804451cad3c275b93495e6efffa8bd3 Mon Sep 17 00:00:00 2001 From: Matt Prilliman <54449384+mjprilliman@users.noreply.github.com> Date: Wed, 1 Apr 2026 13:10:25 -0500 Subject: [PATCH 1/2] Add warnings for no more than 6 periods in manual dispatch schedule --- ssc/cmod_fuelcell.cpp | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/ssc/cmod_fuelcell.cpp b/ssc/cmod_fuelcell.cpp index 06b89b58a..1879d9ad7 100644 --- a/ssc/cmod_fuelcell.cpp +++ b/ssc/cmod_fuelcell.cpp @@ -166,6 +166,21 @@ void cm_fuelcell::exec() percent_complete = as_float("percent_complete"); } */ + if (as_integer("fuelcell_dispatch_choice") == FuelCellDispatch::MANUAL) { + + size_t max_period = 6; + util::matrix_t m_scheduleWeekday = as_matrix_unsigned_long("dispatch_manual_fuelcell_sched"); + util::matrix_t m_scheduleWeekend = as_matrix_unsigned_long("dispatch_manual_fuelcell_sched_weekend"); + size_t* discharge_schedule_vec = m_scheduleWeekday.data(); + size_t* period_num = std::find_if(discharge_schedule_vec, discharge_schedule_vec + m_scheduleWeekday.ncells() - 1, [max_period](size_t element) { return (max_period < element); }); + if (*period_num > max_period) + throw exec_error("fuelcell", "Invalid manual dispatch period in weekday schedule. Period numbers must be less than or equal to 6."); + + discharge_schedule_vec = m_scheduleWeekend.data(); + period_num = std::find_if(discharge_schedule_vec, discharge_schedule_vec + m_scheduleWeekend.ncells() - 1, [max_period](size_t element) { return (max_period < element); }); + if (*period_num > max_period) + throw exec_error("fuelcell", "Invalid manual dispatch period in weekend schedule. Period numbers must be less than or equal to 6."); + } construct(); size_t idx = 0; From ca5f7fdee96d828a1b3f1cdba96d835ab7bfa15c Mon Sep 17 00:00:00 2001 From: Paul Gilman Date: Fri, 29 May 2026 10:02:49 -0700 Subject: [PATCH 2/2] Revise dispatch period error messages to include "battery" and "fuel cell" for clarity. --- ssc/cmod_battery.cpp | 14 +++++++------- ssc/cmod_fuelcell.cpp | 4 ++-- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/ssc/cmod_battery.cpp b/ssc/cmod_battery.cpp index 39c99111b..e845df090 100644 --- a/ssc/cmod_battery.cpp +++ b/ssc/cmod_battery.cpp @@ -1240,33 +1240,33 @@ battstor::battstor(var_table& vt, bool setup_model, size_t nrec, double dt_hr, c { /*! Generic manual dispatch model inputs */ if (batt_vars->batt_can_charge.size() != 6 || batt_vars->batt_can_discharge.size() != 6 || batt_vars->batt_can_gridcharge.size() != 6) - throw exec_error("battery", "Invalid manual dispatch control vector length, must be length 6."); + throw exec_error("battery", "Invalid battery manual dispatch control vector length, must be length 6."); if (batt_vars->batt_discharge_schedule_weekday.nrows() != 12 || batt_vars->batt_discharge_schedule_weekday.ncols() != 24) - throw exec_error("battery", "Invalid manual dispatch schedule matrix batt_discharge_schedule dimensions, must be 12 x 24."); + throw exec_error("battery", "Invalid battery manual dispatch schedule matrix batt_discharge_schedule dimensions, must be 12 x 24."); size_t max_period = 6; size_t* discharge_schedule_vec = batt_vars->batt_discharge_schedule_weekday.data(); size_t* period_num = std::find_if(discharge_schedule_vec, discharge_schedule_vec + batt_vars->batt_discharge_schedule_weekday.ncells() - 1, [max_period](size_t element) { return (max_period < element); }); if (*period_num > max_period) - throw exec_error("battery", "Invalid manual dispatch period in weekday schedule. Period numbers must be less than or equal to 6."); + throw exec_error("battery", "Invalid battery manual dispatch period in weekday schedule. Period numbers must be less than or equal to 6."); if (batt_vars->batt_discharge_schedule_weekend.nrows() != 12 || batt_vars->batt_discharge_schedule_weekend.ncols() != 24) - throw exec_error("battery", "Invalid weekend manual dispatch schedule matrix dimensions, must be 12 x 24."); + throw exec_error("battery", "Invalid weekend battery manual dispatch schedule matrix dimensions, must be 12 x 24."); discharge_schedule_vec = batt_vars->batt_discharge_schedule_weekend.data(); period_num = std::find_if(discharge_schedule_vec, discharge_schedule_vec + batt_vars->batt_discharge_schedule_weekend.ncells() - 1, [max_period](size_t element) { return (max_period < element); }); if (*period_num > max_period) - throw exec_error("battery", "Invalid manual dispatch period in weekend schedule. Period numbers must be less than or equal to 6."); + throw exec_error("battery", "Invalid battery manual dispatch period in weekend schedule. Period numbers must be less than or equal to 6."); if (batt_vars->en_fuelcell) { if (batt_vars->batt_can_fuelcellcharge.size() != 6) - throw exec_error("fuelcell", "Invalid manual dispatch control vector lengths, must be length 6."); + throw exec_error("fuelcell", "Invalid battery manual dispatch control vector lengths, must be length 6."); } if (batt_vars->batt_meter_position == dispatch_t::BEHIND) { if (batt_vars->batt_btm_can_discharge_to_grid.size() != 6) { - throw exec_error("Battery", "Invalid manual dispatch control vector lenghts, must be length 6."); + throw exec_error("Battery", "Invalid battery manual dispatch control vector lenghts, must be length 6."); } if (batt_vars->batt_dispatch_batt_system_charge_first && batt_vars->batt_dispatch_charge_only_system_exceeds_load) { diff --git a/ssc/cmod_fuelcell.cpp b/ssc/cmod_fuelcell.cpp index 577b86758..1eec45b73 100644 --- a/ssc/cmod_fuelcell.cpp +++ b/ssc/cmod_fuelcell.cpp @@ -174,12 +174,12 @@ void cm_fuelcell::exec() size_t* discharge_schedule_vec = m_scheduleWeekday.data(); size_t* period_num = std::find_if(discharge_schedule_vec, discharge_schedule_vec + m_scheduleWeekday.ncells() - 1, [max_period](size_t element) { return (max_period < element); }); if (*period_num > max_period) - throw exec_error("fuelcell", "Invalid manual dispatch period in weekday schedule. Period numbers must be less than or equal to 6."); + throw exec_error("fuelcell", "Invalid fuel cell manual dispatch period in weekday schedule. Period numbers must be less than or equal to 6."); discharge_schedule_vec = m_scheduleWeekend.data(); period_num = std::find_if(discharge_schedule_vec, discharge_schedule_vec + m_scheduleWeekend.ncells() - 1, [max_period](size_t element) { return (max_period < element); }); if (*period_num > max_period) - throw exec_error("fuelcell", "Invalid manual dispatch period in weekend schedule. Period numbers must be less than or equal to 6."); + throw exec_error("fuelcell", "Invalid fuel cell manual dispatch period in weekend schedule. Period numbers must be less than or equal to 6."); } construct();