Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
59 commits
Select commit Hold shift + click to select a range
979a259
Add cmod_pv_smoothing for testing pv smoothing algorithm in c++
sjanzou Apr 29, 2021
ad29cb0
Add pv_smoothing compute module
sjanzou Apr 29, 2021
7117cd8
pv smoothing through resampling Python code.
sjanzou Apr 30, 2021
1c1965f
Merge remote-tracking branch 'origin/develop' into EPRI_CRADA
sjanzou May 1, 2021
ab68947
matching through resampling with test data from Danny
sjanzou May 1, 2021
1c55067
Match energy forecast with ramp_rate_control.py Python code
sjanzou May 2, 2021
b4c0cdd
cmod_pv_smoothing matching with example_script.py and data from EPRI
sjanzou May 3, 2021
288e093
Add ssc test for pv smoothing to match example_script.py base from ERPI
sjanzou May 4, 2021
97f3340
Merge remote-tracking branch 'origin/develop' into EPRI_CRADA
sjanzou May 5, 2021
80452ac
Additional pv_smoothing tests - ready to connect as dispatch or post …
sjanzou May 5, 2021
cc854da
Merge remote-tracking branch 'origin/develop' into EPRI_CRADA
sjanzou May 9, 2021
69f5623
Merge remote-tracking branch 'origin/develop' into EPRI_CRADA
sjanzou May 18, 2021
2b2135b
Work on heap errors on windows for ssc tests per Microsoft_C6262_Stac…
sjanzou May 24, 2021
aea4c8c
2 test working without SEH error
sjanzou May 25, 2021
f0c8605
Final SEH cleanup
sjanzou May 27, 2021
e9ee3c2
SEH exception testing and clean up for PV Smoothing tests and library
sjanzou May 30, 2021
fb931e9
Add pv smoothing enums and layout lib_battery_dispatch_pvsmoothing_fom
sjanzou May 30, 2021
6477ec0
Stub out lib_battery_dispatch_pvsmoothing_fom and update CMakeLists a…
sjanzou May 31, 2021
372b2c2
more pv smoothing updates
sjanzou Jun 1, 2021
fef6613
Merge branch 'develop' into PVSmoothing
sjanzou Jun 2, 2021
48ba656
All PV smoothing inputs set and lib_battery_dispatch_pvsmoothing_fom …
sjanzou Jun 3, 2021
fed6f61
PV smoothing updates - initialization and cmod_battery working on upd…
sjanzou Jun 9, 2021
5bf78d5
PV smoothing constructor update
sjanzou Jun 9, 2021
21d2434
Fix std::find_if type argument warning
sjanzou Jun 10, 2021
b4f710f
PV Smoothing - add intermediat outputs and calculattions to dispatch …
sjanzou Jun 10, 2021
11e3c1a
Additional copy updates for PV Smoothing
sjanzou Jun 10, 2021
10fb997
PV Smoothing updates to library and using in compute modules
sjanzou Jun 11, 2021
1f9b8b4
PV Smoothing scaling and output accumulators
sjanzou Jun 12, 2021
6f57752
Fix inputs to match with EPRI code
sjanzou Jun 13, 2021
5b63e81
PV smoothing updates with intervals
sjanzou Jun 14, 2021
2694675
PV Smoothing updates and intermediate calculation validations
sjanzou Jun 15, 2021
08b7196
Additional scaled outputs for validation work with Python PV Smoothin…
sjanzou Jun 16, 2021
eae769e
Remove unused code and use smoothing SOC as previous value and better…
sjanzou Jun 16, 2021
a9d16e4
Merge remote-tracking branch 'origin/develop' into PVSmoothing
sjanzou Jun 25, 2021
078f46c
Merge remote-tracking branch 'origin/develop' into PVSmoothing
sjanzou Jun 29, 2021
96d8583
Add single timestep library and update main pv smoothing algorithm to…
sjanzou Jun 29, 2021
551b3eb
Preprocessed PVSmoothing library added
sjanzou Jun 29, 2021
f6c8530
Fix scaled vector output matching with Python. SOC bias in SAM remains
sjanzou Jun 30, 2021
6b9c56e
Update shift in interpolated values
sjanzou Jul 1, 2021
b92ad1e
Merge remote-tracking branch 'origin/develop' into PVSmoothing
sjanzou Jul 6, 2021
0f4f602
Merge remote-tracking branch 'origin/develop' into PVSmoothing
sjanzou Jul 8, 2021
b88295c
Validated with Python code from EPRI with bounds on and forecast off …
sjanzou Jul 8, 2021
81ad3d7
PV Smoothing matching with Python with and without forecast on at ram…
sjanzou Jul 9, 2021
bc0a70f
Merge remote-tracking branch 'origin/develop' into PVSmoothing
sjanzou Jul 12, 2021
c786888
2021.7.12 ssc 258 EPRI beta
sjanzou Jul 12, 2021
bcf42bf
Added batt_meter_position checks to pvs inputs to allow Price Signal
mjprilliman Jul 15, 2021
376c8ba
7/14/2021 meeting updates to PV smoothing ramp interval values
sjanzou Jul 16, 2021
e1fa38d
Merge remote-tracking branch 'origin/develop' into PVSmoothing
sjanzou Jul 19, 2021
d13f6fe
Add battery losses to update_dispatch for PV Smoothing
sjanzou Jul 19, 2021
c19e0e6
Account for PV Smoothing ramp hour limited curtailment
sjanzou Jul 20, 2021
d29915d
Merge remote-tracking branch 'origin/develop' into PVSmoothing
sjanzou Jul 22, 2021
9027f60
Add PVSmoothing 1 minute data test with all options enabled
sjanzou Jul 22, 2021
d772db9
Remove cmod_pv_smoothing standalone test module and update tests
sjanzou Jul 22, 2021
503381a
Update fuel cell to run for single year
sjanzou Jul 23, 2021
abaa54c
Added tests for generic battery / SO and Fuel Cell / SO for PV smoothing
sjanzou Jul 23, 2021
a6fddb5
Remove test filter to run all tests
sjanzou Jul 23, 2021
b5199b2
Run PV Smoothing tests only - works fine on Windows
sjanzou Jul 25, 2021
7df9187
Requested review changes
sjanzou Jul 26, 2021
bef7463
Running PV Smoothing tests so Travis does not time out
sjanzou Jul 27, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions shared/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,10 @@ set(SHARED_SRC
lib_battery_dispatch.h
lib_battery_dispatch_automatic_btm.cpp
lib_battery_dispatch_automatic_btm.h
lib_battery_dispatch_automatic_fom.cpp
lib_battery_dispatch_automatic_fom.h
lib_battery_dispatch_automatic_fom.cpp
lib_battery_dispatch_automatic_fom.h
lib_battery_dispatch_pvsmoothing_fom.cpp
lib_battery_dispatch_pvsmoothing_fom.h
lib_battery_dispatch_manual.cpp
lib_battery_dispatch_manual.h
lib_battery_lifetime.cpp
Expand Down
4 changes: 2 additions & 2 deletions shared/lib_battery_dispatch.h
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ class dispatch_t
{
public:

enum FOM_MODES { FOM_LOOK_AHEAD, FOM_LOOK_BEHIND, FOM_FORECAST, FOM_CUSTOM_DISPATCH, FOM_MANUAL };
enum FOM_MODES { FOM_LOOK_AHEAD, FOM_LOOK_BEHIND, FOM_FORECAST, FOM_CUSTOM_DISPATCH, FOM_MANUAL, FOM_PV_SMOOTHING };
enum BTM_MODES { LOOK_AHEAD, LOOK_BEHIND, MAINTAIN_TARGET, CUSTOM_DISPATCH, MANUAL, FORECAST };
enum METERING { BEHIND, FRONT };
enum PV_PRIORITY { MEET_LOAD, CHARGE_BATTERY };
Expand Down Expand Up @@ -151,7 +151,7 @@ class dispatch_t
/**
The dispatch mode.
For behind-the-meter dispatch: 0 = LOOK_AHEAD, 1 = LOOK_BEHIND, 2 = MAINTAIN_TARGET, 3 = CUSTOM, 4 = MANUAL, 5 = FORECAST
For front-of-meter dispatch: 0 = FOM_LOOK_AHEAD, 1 = FOM_LOOK_BEHIND, 2 = INPUT FORECAST, 3 = CUSTOM, 4 = MANUAL
For front-of-meter dispatch: 0 = FOM_LOOK_AHEAD, 1 = FOM_LOOK_BEHIND, 2 = INPUT FORECAST, 3 = CUSTOM, 4 = MANUAL, 5 = PV Smoothing
*/
int _mode;

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 @@ -194,7 +194,7 @@ void dispatch_automatic_front_of_meter_t::update_dispatch(size_t year, size_t ho
double revenueToPVChargeMax = 0;
if (m_batteryPower->canSystemCharge) {
std::vector<double> revenueToPVChargeForecast;
for (size_t i = idx_year1; i < idx_year1 + idx_lookahead; i++) {
for (size_t i = idx_year1; i < idx_year1 + idx_lookahead && i < _P_pv_ac.size(); i++) {
// when considering grid charging, require PV output to exceed battery input capacity before accepting as a better option
bool system_on = _P_pv_ac[i] >= m_batteryPower->powerBatteryChargeMaxDC ? 1 : 0;
if (system_on) {
Expand Down
390 changes: 390 additions & 0 deletions shared/lib_battery_dispatch_pvsmoothing_fom.cpp

Large diffs are not rendered by default.

184 changes: 184 additions & 0 deletions shared/lib_battery_dispatch_pvsmoothing_fom.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,184 @@
/**
BSD-3-Clause
Copyright 2019 Alliance for Sustainable Energy, LLC
Redistribution and use in source and binary forms, with or without modification, are permitted provided
that the following conditions are met :
1. Redistributions of source code must retain the above copyright notice, this list of conditions
and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions
and the following disclaimer in the documentation and/or other materials provided with the distribution.
3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse
or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT HOLDER, CONTRIBUTORS, UNITED STATES GOVERNMENT OR UNITED STATES
DEPARTMENT OF ENERGY, NOR ANY OF THEIR EMPLOYEES, BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
OR CONSEQUENTIAL DAMAGES(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef __LIB_BATTERY_DISPATCH_PVSMOOTHING_FOM_H__
#define __LIB_BATTERY_DISPATCH_PVSMOOTHING_FOM_H__

#include "lib_battery_dispatch.h"

/*! PV Smoothing Front of Meter battery dispatch */
class dispatch_pvsmoothing_front_of_meter_t : public dispatch_automatic_t
{
public:
/**
Class takes forecast information about the PV production and user inputs and constraints
and programs battery to strategically dispatch to maximize ramp rates to avoid penalties.
Developed in conjunction with work from EPRI and Southern Company
*/
dispatch_pvsmoothing_front_of_meter_t(
battery_t * Battery,
double dt,
double SOC_min,
double SOC_max,
int current_choice,
double Ic_max,
double Id_max,
double Pc_max_kwdc,
double Pd_max_kwdc,
double Pc_max_kwac,
double Pd_max_kwac,
double t_min,
int dispatch_mode,
int pv_dispatch,
size_t nyears,
size_t look_ahead_hours,
double dispatch_update_frequency_hours,
bool can_charge,
bool can_clipcharge,
bool can_grid_charge,
bool can_fuelcell_charge,
double inverter_paco,
std::vector<double> battReplacementCostPerkWh, // required for base class
int battCycleCostChoice,
std::vector<double> battCycleCost, // required for base class
double etaPVCharge,
double etaGridCharge,
double etaDischarge,
// PVSmoothing inputs
double batt_dispatch_pvs_nameplate_ac,
double batt_dispatch_pvs_ac_lb,
bool batt_dispatch_pvs_ac_lb_enable,
double batt_dispatch_pvs_ac_ub,
bool batt_dispatch_pvs_ac_ub_enable,
bool batt_dispatch_pvs_curtail_as_control,
bool batt_dispatch_pvs_curtail_if_violation,
size_t batt_dispatch_pvs_forecast_shift_periods,
double batt_dispatch_pvs_kf,
double batt_dispatch_pvs_ki,
double batt_dispatch_pvs_kp,
double batt_dispatch_pvs_max_ramp,
bool batt_dispatch_pvs_short_forecast_enable,
double batt_dispatch_pvs_soc_rest,
size_t batt_dispatch_pvs_timestep_multiplier,
double batt_dispatch_pvs_initial_SOC
);

~dispatch_pvsmoothing_front_of_meter_t();

/*! deep copy constructor (new memory), from dispatch to this */
dispatch_pvsmoothing_front_of_meter_t(const dispatch_t& dispatch);

/*! shallow copy from dispatch to this */
void copy(const dispatch_t* dispatch);

/// Public API to run the battery dispatch model for the current timestep, given the system power, and optionally the electric load, amount of system clipping, or specified battery power
void dispatch(size_t year,
size_t hour_of_year,
size_t step);

/// Compute the updated power to send to the battery over the next N hours
void update_dispatch(size_t year, size_t hour_of_year, size_t step, size_t lifetimeIndex);


/// Pass in the PV power forecast [kW]
void update_pv_data(double_vec P_pv_ac);

/// Return intermediate calculations for validation - unscale by nameplate = min(system ac rating, grid interconnection limit)
double batt_dispatch_pvs_outpower() { return m_batt_dispatch_pvs_nameplate_ac * m_batt_dispatch_pvs_outpower; };
double batt_dispatch_pvs_battpower() { return m_batt_dispatch_pvs_nameplate_ac * m_batt_dispatch_pvs_battpower; };
double batt_dispatch_pvs_battsoc() { return m_batt_dispatch_pvs_nameplate_ac * m_batt_dispatch_pvs_battsoc ; };
double batt_dispatch_pvs_curtail() { return m_batt_dispatch_pvs_nameplate_ac * m_batt_dispatch_pvs_curtail ; };
double batt_dispatch_pvs_violation_list() { return m_batt_dispatch_pvs_violation_list; };
double batt_dispatch_pvs_P_pv_ac() { return m_batt_dispatch_pvs_P_pv_ac; };
double batt_dispatch_pvs_PV_ramp_interval() { return m_batt_dispatch_pvs_nameplate_ac * m_batt_dispatch_pvs_PV_ramp_interval ; };
double batt_dispatch_pvs_forecast_pv_energy() { return m_batt_dispatch_pvs_nameplate_ac * m_batt_dispatch_pvs_forecast_pv_energy ; };


/*
// validation outputs at ramp interval - use for debugging and remove for release
double_vec batt_dispatch_pvs_outpower_vec() { return m_batt_dispatch_pvs_outpower_vec; };
double_vec batt_dispatch_pvs_battpower_vec() { return m_batt_dispatch_pvs_battpower_vec; };
double_vec batt_dispatch_pvs_battsoc_vec() { return m_batt_dispatch_pvs_battsoc_vec; };
double_vec batt_dispatch_pvs_curtail_vec() { return m_batt_dispatch_pvs_curtail_vec; };
double_vec batt_dispatch_pvs_violation_list_vec() { return m_batt_dispatch_pvs_violation_list_vec; };
double_vec batt_dispatch_pvs_PV_ramp_interval_vec() { return m_pv_power_input_sampled_vec; };
double_vec batt_dispatch_pvs_forecast_pv_energy_vec() { return m_forecast_pv_energy_vec; };
*/
protected:

void init_with_pointer(const dispatch_pvsmoothing_front_of_meter_t* tmp);

/*! Calculate the cost to cycle per kWh */
void costToCycle();

/*! Setup PV smoothing ramp interval vectors */
void setup_pvsmoothing_ramp_interval_vectors();

/*! Inverter AC power limit */
double _inverter_paco;

/*! Efficiencies of the charge and discharge of the battery*/
double m_etaPVCharge;
double m_etaGridCharge;
double m_etaDischarge;

/* Computed smoothing outputs */
double m_batt_dispatch_pvs_outpower;
double m_batt_dispatch_pvs_battpower;
double m_batt_dispatch_pvs_battsoc;
double m_batt_dispatch_pvs_curtail;
double m_batt_dispatch_pvs_violation_list;
double m_batt_dispatch_pvs_P_pv_ac;
double m_batt_dispatch_pvs_PV_ramp_interval;
double m_batt_dispatch_pvs_forecast_pv_energy;



// PVSmoothing inputs
double m_batt_dispatch_pvs_nameplate_ac;
double m_batt_dispatch_pvs_ac_lb;
bool m_batt_dispatch_pvs_ac_lb_enable;
double m_batt_dispatch_pvs_ac_ub;
bool m_batt_dispatch_pvs_ac_ub_enable;
bool m_batt_dispatch_pvs_curtail_as_control;
bool m_batt_dispatch_pvs_curtail_if_violation;
size_t m_batt_dispatch_pvs_forecast_shift_periods;
double m_batt_dispatch_pvs_kf;
double m_batt_dispatch_pvs_ki;
double m_batt_dispatch_pvs_kp;
double m_batt_dispatch_pvs_max_ramp;
bool m_batt_dispatch_pvs_short_forecast_enable;
double m_batt_dispatch_pvs_soc_rest;
size_t m_batt_dispatch_pvs_timestep_multiplier;
double m_batt_dispatch_pvs_initial_SOC;

// PV Smoothing validation and local ramp interval vectors calculated in setup_pvsmoothing_ramp_interval_vectors
double_vec m_pv_power_input_sampled_vec;
double_vec m_forecast_pv_energy_vec;
double_vec m_batt_dispatch_pvs_outpower_vec;
double_vec m_batt_dispatch_pvs_battpower_vec;
double_vec m_batt_dispatch_pvs_battsoc_vec;
double_vec m_batt_dispatch_pvs_curtail_vec;
double_vec m_batt_dispatch_pvs_violation_list_vec;

};

#endif // __LIB_BATTERY_DISPATCH_PVSMOOTHING_FOM_H__
Loading