Skip to content

Commit

Permalink
Add to retail rates dispatch, consider curtailment limits FOM
Browse files Browse the repository at this point in the history
  • Loading branch information
brtietz committed Oct 18, 2024
1 parent 23fa7a8 commit a43949f
Show file tree
Hide file tree
Showing 3 changed files with 12 additions and 5 deletions.
13 changes: 10 additions & 3 deletions shared/lib_battery_dispatch_automatic_btm.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -403,10 +403,10 @@ double dispatch_automatic_behind_the_meter_t::compute_costs(size_t idx, size_t y
year++;
}
for (size_t step = 0; step != _steps_per_hour && idx < _P_load_ac.size(); step++)
{
{
double power = _P_load_ac[idx] - _P_pv_ac[idx];
// One at a time so we can sort grid points by no-dispatch cost
std::vector<double> forecast_power = { -power }; // Correct sign convention for cost forecast
// One at a time so we can sort grid points by no-dispatch cost; TODO: consider curtailment limits - would need to pass in a forecast of these...
std::vector<double> forecast_power = { std::fmin(-1.0*power, m_batteryPower->powerInterconnectionLimit)}; // Correct sign convention for cost forecast
double step_cost = noDispatchForecast->forecastCost(forecast_power, year, (hour_of_year + hour) % 8760, step);
no_dispatch_cost += step_cost;

Expand Down Expand Up @@ -749,6 +749,13 @@ void dispatch_automatic_behind_the_meter_t::plan_dispatch_for_cost(dispatch_plan
}

}
else if (m_batteryPower->canCurtailCharge) {
if (sorted_grid[i].Grid() < 0) {
double powerLimit = std::fmin(m_batteryPower->powerInterconnectionLimit, m_batteryPower->powerCurtailmentLimit);
requiredPower = sorted_grid[i].Grid() + powerLimit;
requiredPower = std::fmin(0.0, requiredPower);
}
}

if (requiredPower < 0)
{
Expand Down
2 changes: 1 addition & 1 deletion shared/lib_battery_dispatch_automatic_fom.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -275,7 +275,7 @@ void dispatch_automatic_front_of_meter_t::update_dispatch(size_t year, size_t ho
double energyNeededToFillBattery = _Battery->energy_to_fill(m_batteryPower->stateOfChargeMax);

// Positive: spare power to discharge. Negative: system power will be curtailed. Negative number can be fed directly into powerBattery to support charging
double interconnectionCapacity = m_batteryPower->powerInterconnectionLimit - m_batteryPower->powerSystem;
double interconnectionCapacity = std::fmin(m_batteryPower->powerInterconnectionLimit, m_batteryPower->powerCurtailmentLimit) - m_batteryPower->powerSystem;

/* Booleans to assist decisions */
bool highDischargeValuePeriod = ppa_cost >= discharge_ppa_cost && ppa_cost >= charge_ppa_cost;
Expand Down
2 changes: 1 addition & 1 deletion shared/lib_battery_powerflow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -289,7 +289,7 @@ void BatteryPowerFlow::initialize(double stateOfCharge, bool systemPriorityCharg
}

if (m_BatteryPower->canCurtailCharge) {
double interconnectionCapacity = m_BatteryPower->powerInterconnectionLimit - m_BatteryPower->powerSystem;
double interconnectionCapacity = std::fmin(m_BatteryPower->powerInterconnectionLimit, m_BatteryPower->powerCurtailmentLimit) - m_BatteryPower->powerSystem;
if (interconnectionCapacity < 0.0 )
{
m_BatteryPower->powerBatteryDC = interconnectionCapacity;
Expand Down

0 comments on commit a43949f

Please sign in to comment.