User Guide#
Design Problem Description#
SHIPP relies on two classes to describe a sizing optimization problem:
a
Productionobject describe a renewable energy production (e.g. wind or solar PV) throughits power production in time
power. Note that in the optimization problem, the power can be curtailled.its cost per power capacity
p_cost
a
Storageobject describe abstract storage systems through:its cost per energy and power capacity
e_costandp_costits energy and power capacity
e_capandp_capits efficiency in charge and discharge
eff_inandeff_out. Note that only constant efficiencies are considered here.
Finally, the optimization problem requires the time series of electricity prices on the day-ahead market.
Solving the optimization problem#
The optimization problem is formulated and solved using a command of the form:
os = solve_lp_pyomo(price, production1, production1, storage1, storage2, discount_rate, n_year, p_min, p_max, n, name_solver)
where the discount rate and the number of years n_year are used for the calculation of the NPV. The parameters p_min and p_max are used to describe the constraints for the maximum and minimum power production. The number of time steps is n. The parameter name_solver refers to a solver compatible with pyomo, for example ‘mosek’, ‘cplex’, ‘gurobi’.
Alternatively, the problem can be solved with the built-in solver in scipy, scipy.optimize.linprog with the following command:
os = solve_lp_sparse(price, production1, production1, storage1, storage2, discount_rate, n_year, p_min, p_max, n)
Results post-processing#
The optimization results are stored in a OpSchedule object describing the operation schedule of the power plant, with the following members:
production_list: a list ofProductionobjects corresponding to the input objects of the optimization problemstorage_list: a list ofStorageobjects corresponding to the input objects of the optimization problem. However, their power and energy capacity correspond to the optimal design.production_p: a list of the power production for the objects inproduction_list. In case of curtailment, the first production unit assumes all the curtailment and the second production unit operates at full power.storage_p: list of optimal power operation (charge/discharge) for the storage objectsstorage_e: list of optimal energy level evolution for the storage objectslosses: list of power losses corresponding to the storage objects.power_out: total power to the grid for the production and storage unitsrevenue: total annual revenues from selling electricity.revenue_storage: revenue contribution from the storage units.npv: NPV for the total systema_npv: Added NPV due to the addition of storage unitsirr: Internal Rate of Return for the power plant.
The operation schedule can be visualized using the following commands:
os.plot_powerflow(): line plot of the power production and the energy level evolutionos.plot_powerout(xlim = [start_time, end_time]): bar plot of the power send to the grid