Commit 0710b9e9 authored by Jaber Ibne Mahboob's avatar Jaber Ibne Mahboob
Browse files

Update 28.01.2021

update
parent f66cbc9d
Pipeline #20069 failed with stages
in 48 seconds
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
......@@ -18,7 +18,7 @@ import matplotlib.pyplot as plt
class hpp_reliability(object):
"""
A class used to evaluate availability of the components
A class used to evaluate availability time-series of the components individually
...
......@@ -78,7 +78,6 @@ class hpp_reliability(object):
"""
"""
def __init__
@input:
......@@ -94,7 +93,6 @@ class hpp_reliability(object):
self.period_for_moving_avg = 3 # in months
"""
def plot_component_pdf
@input:
......@@ -120,7 +118,6 @@ class hpp_reliability(object):
plt.show() # show the plot for TTR
"""
def plot_availability_ts
@input:
......@@ -136,7 +133,6 @@ class hpp_reliability(object):
plt.show() # Show the figure
"""
def moving_average
@input:
......@@ -151,7 +147,6 @@ class hpp_reliability(object):
return moving_avg
"""
def plot_moving_average_ts
@input:
......@@ -172,10 +167,32 @@ class hpp_reliability(object):
"-r",
label=("Rolling avg of the availability of "+component_name))
plt.legend()
plt.show()
"""
def plot_availability_and_moving_average_ts
@input:
component_name: string (name of the unit / component)
availability_df: dataframe of availability of a unit / component
interval_in_months: int (interval of moving average in the number of months)
"""
def plot_availability_and_moving_average_ts(self, component_name, availability_df, interval_in_months):
interval_in_hrs = interval_in_months * 30 * 24 # calculate interval in hrs
ts_indices = availability_df.index # get the timeseries indicies
npdata = availability_df.to_numpy() # convert the data into numpy array
moving_avg = self.moving_average(npdata,interval_in_hrs) # get the moving average
plt.figure(figsize=(15,12)) # make a plot to show moving average
plt.title(f'Performance of reliability model (sampling-constant: {self.sampling_const_of_current_component})')
plt.plot(ts_indices, availability_df, label=("Availability of "+component_name))
plt.plot(
ts_indices[(interval_in_hrs-1):len(ts_indices)],
moving_avg,
"-r",
label=(f'Rolling avg of the availability of {component_name} (period of rolling avg: {interval_in_months} months)'))
plt.legend()
plt.show() # now show the plot
"""
def availability_ts
@input:
......@@ -228,7 +245,6 @@ class hpp_reliability(object):
return availability_df
"""
def hpp_availability_ts
@return:
......@@ -275,13 +291,13 @@ class hpp_reliability(object):
component_name)
sub_df = df.loc[resulting_indices].mean(axis=1) # if sub_system_flag is True, we need to calculate the availability of each unit, rather than for each component
sub_df.name = component_name # make sure the column name is set properly
if self.debugging_mode == True:
self.plot_availability_ts( # plot the availability of each unit
component_name,
sub_df)
self.plot_moving_average_ts( # plot the moving average of 4 months interval for each unit to cross check the convergence of the result
component_name,
sub_df, self.period_for_moving_avg)
# if self.debugging_mode == True:
# self.plot_availability_ts( # plot the availability of each unit
# component_name,
# sub_df)
# self.plot_moving_average_ts( # plot the moving average of 4 months interval for each unit to cross check the convergence of the result
# component_name,
# sub_df, self.period_for_moving_avg)
result_df = pd.merge( # combine the result of all units in a single dataframe
result_df,
sub_df,
......@@ -304,24 +320,29 @@ class hpp_reliability(object):
self.plot_moving_average_ts( # plot the overall moving average of 4 months interval for all components to cross check the convergence of the result
component_name,
sub_df.mean(axis=1), self.period_for_moving_avg)
self.plot_availability_and_moving_average_ts( # plot the availability and moving average of 4 months interval for all components to cross check the convergence of the result
component_name,
sub_df.mean(axis=1), self.period_for_moving_avg)
result_df = sub_df # take the availability directly, if the N_units == 1
elapsed_time = time.time() - current_time # Check time consumption & print it into the output console log
print(f'Availability of {N_components} {component}s is calculated in {elapsed_time} seconds')
print("")
if sub_system_flag == True and self.debugging_mode == True:
component_name = f'all {N_units} {component} units'
self.plot_availability_ts( # plot the overall availability of all components
self.plot_availability_ts( # plot the overall availability of all components
component_name,
sub_df)
result_df.mean(axis=1))
self.plot_moving_average_ts( # plot the overall moving average of 4 months interval for all components of the components that has multiple units
component_name,
result_df.mean(axis=1), self.period_for_moving_avg)
self.plot_availability_and_moving_average_ts( # plot the availability and moving average of 4 months interval for all components to cross check the convergence of the result
component_name,
result_df.mean(axis=1), self.period_for_moving_avg)
availability_df[component] = result_df # collect resulted data into result variable
self.hpp_availbility_result = availability_df
return self.hpp_availbility_result
"""
def hpp_availability_ts_to_csv
"""
......@@ -343,8 +364,6 @@ class hpp_reliability(object):
self.hpp_availbility_result[component].drop(columns=['Time']) # make sure you dropped Time column, that just to make sure date is properly stored in file
"""
def get_availability_result
@return:
......
List_of_parameters,Values_for_ms73_cf1.05
Number_of_WTs:,28
Number_of_PV_units:,391
Number_of_Transformers:,4
Wind_Capacity:,59
Solar_Capacity:,391
Battery_storage_Power_Rating:,27
Battery_storage_Energy_Rating:,90
AEP:,884
Curtailed_Energy:,6
HPP_Investment_cost:,339
HPP_Maintenance_cost:,127
LCOE:,36.48
NPV:,34
IRR:,8.1
Number_of_Iterations:,10
......@@ -22,6 +22,7 @@ if __name__ == "__main__":
input_solar_av_filename = './Data/av_PV.csv'
input_inverter_av_filename = './Data/av_inverter.csv'
input_transformer_av_filename = './Data/av_transformer.csv'
input_bess_av_filename = './Data/av_BESS.csv'
input_price_ts_filename = './Data/PriceProfilePPA.csv'
start_date = pd.to_datetime('2018-09-01 00:00')
......@@ -35,7 +36,7 @@ if __name__ == "__main__":
timeZone_solar = 'Asia/Kolkata'
timeZone_price = 'Asia/Kolkata'
timeZone_analysis = 'Asia/Kolkata'
# inputs
# Alessandra's data
parameter_dict = {
......@@ -46,13 +47,12 @@ if __name__ == "__main__":
'hpp_discount_factor': 0.07,
'hpp_BOS_soft_cost': 119940, # [Eur/MW]
#'hpp_grid_connection_cost': 37074, # [Eur/MW] # this is original data
'hpp_grid_connection_cost': round(11122 * 1.05), # [Eur/MW] # 70% of original hpp_grid_connection_cost
'hpp_grid_connection_cost': round(11122 * 1.00), # [Eur/MW] # 70% of original hpp_grid_connection_cost
# grid connection parameters
'hpp_transformer_cost': round(25952 * 1.05), # [Eur/MW] # 30% of original hpp_grid_connection_cost
'hpp_transformer_cost': round(25952 * 1.00), # [Eur/MW] # 30% of original hpp_grid_connection_cost
'hpp_transformer_rating': 100, # [MW]
# hpp wind parameters
'wind_rating_WT': 2.1, # 2.1 [MW]
'wind_nWT_per_string': 20,
......@@ -61,26 +61,26 @@ if __name__ == "__main__":
'wind_hub_height': 120, # in m
'wind_turbine_spacing': 5, # in terms of Rotor Diameter
'wind_turbine_row_spacing': 10, # in terms of Rotor Diameter
'wind_turbine_cost': round(851000 * 1.05), # [EUR/MW]
'wind_civil_works_cost': round(116986 * 1.05), # [Eur/MW]
'wind_fixed_onm_cost': round(12805 * 1.05), # Wind fixed O&M cost per year [Eur/MW]
'wind_turbine_cost': round(851000 * 1.00), # [EUR/MW]
'wind_civil_works_cost': round(116986 * 1.00), # [Eur/MW]
'wind_fixed_onm_cost': round(12805 * 1.00), # Wind fixed O&M cost per year [Eur/MW]
# hpp solar parameters
'solar_rating_PV_unit': 1, # [MW]
'solar_lifetime_PV': 30,
'solar_PV_cost': round(219000 * 1.05), # [EUR/MW]
'solar_hardware_installation_cost': (241854 * 1.05), # [Eur/MW]
'solar_fixed_onm_cost': (8149 * 1.05), # Solar O&M cost per year [Eur/MW]
'solar_PV_cost': round(219000 * 1.00), # [EUR/MW]
'solar_hardware_installation_cost': (241854 * 1.00), # [Eur/MW]
'solar_fixed_onm_cost': (8149 * 1.00), # Solar O&M cost per year [Eur/MW]
# hpp battery parameters
'battery_energy_cost': 181596, # Eur/MWh
'battery_power_cost': 64190, # Power conversion system cost[Eur/MW]
'battery_energy_cost': round(181596 * 1.00), # Eur/MWh
'battery_power_cost': round(64190 * 1.00), # Power conversion system cost[Eur/MW]
# Electric Balance of Plant, installation, commissioning cost [Eur/MW]
'battery_BOP_installation_commissioning_cost': 73360,
'battery_BOP_installation_commissioning_cost': round(73360 * 1.00),
# Grid management control system cost[Eur/MW]
'battery_control_system_cost': 18340,
'battery_control_system_cost': round(18340 * 1.00),
# Battery energy capacity maintenance cost [Eur/MWh] per year
'battery_energy_onm_cost': 10000,
'battery_energy_onm_cost': round(10000 * 1.00),
'battery_depth_of_discharge': 0.9,
}
......@@ -89,12 +89,12 @@ if __name__ == "__main__":
'solar_as_component': 1,
'battery_as_component': 1,
}
ExampleHPP = HPP(
parameter_dict=parameter_dict,
simulation_dict=simulation_dict,
)
wind_power_t = read_csv_Data(
input_wind_ts_filename,
timename,
......@@ -127,14 +127,21 @@ if __name__ == "__main__":
input_inverter_av_filename,
timename,
timeFormat_solar,
timeZone_price,
timeZone_solar,
timeZone_analysis,
)
transformer_av_t = read_csv_Data(
input_transformer_av_filename,
timename,
timeFormat_price,
timeZone_solar,
timeZone_price,
timeZone_analysis,
)
bess_av_t = read_csv_Data(
input_bess_av_filename,
timename,
timeFormat_price,
timeZone_price,
timeZone_analysis,
)
spot_price_t = read_csv_Data(
......@@ -144,50 +151,51 @@ if __name__ == "__main__":
timeZone_price,
timeZone_analysis,
)
wind_power_t = wind_power_t.loc[start_date:end_date, 'Pwind'] / 100
solar_power_t = solar_power_t.loc[start_date:end_date, 'Psolar'] / 100
spot_price_t = spot_price_t.loc[start_date:end_date, 'Price']
capacity_factor_wind = ExampleHPP.calculate_Capacity_Factor(
wind_power_t, 1)
capacity_factor_solar = ExampleHPP.calculate_Capacity_Factor(
solar_power_t, 1)
# %% -----------------------------------------------
# Optimize the sizing of HPP (wind and solar)
# Optimize the sizing of HPP by Alessandra (wind and solar)
# --------------------------------------------------
print("")
print("HPP size optimization by Alessandra's Model:")
[hpp_wind_capacity, hpp_solar_capacity, P_HPP_t,
P_curtailment_t, hpp_investment_cost, hpp_maintenance_cost,
LCOE, NPV, IRR] = ExampleHPP.sizing_Wind_Solar(
wind_power_t, solar_power_t, spot_price_t)
# %%
AEP = P_HPP_t.mean() * 8760 / 1000
Curtailed_Energy = P_curtailment_t.sum() / 1000
# print("\033[H\033[J")
print()
print('Wind Capacity = %d MW' % hpp_wind_capacity)
print('Solar Capacity = %d MW' % hpp_solar_capacity)
print('AEP = %.0f GWh' % AEP)
print('Curtailed Energy = %.0f GWh' % Curtailed_Energy)
print('HPP Investment Cost = %.0f MEUR' % (hpp_investment_cost / 1e6))
print('HPP Maintenance Cost = %.0f MEUR' %
(hpp_maintenance_cost.sum() / 1e6))
print('HPP LCOE = %.2f EUR/MWh' % LCOE)
print('HPP NPV= %.0f MEUR' % (NPV / 1000000))
print('HPP IRR = %.0f%%' % (IRR * 100))
# print("")
# print("HPP size optimization by Alessandra's Model:")
# [hpp_wind_capacity, hpp_solar_capacity, P_HPP_t,
# P_curtailment_t, hpp_investment_cost, hpp_maintenance_cost,
# LCOE, NPV, IRR] = ExampleHPP.sizing_Wind_Solar(
# wind_power_t, solar_power_t, spot_price_t)
# %% -----------------------------------------------
# Optimize the sizing of HPP (wind and solar) with Availability
# --------------------------------------------------
# # %%
print()
print("HPP size optimization with availability factors:")
# AEP = P_HPP_t.mean() * 8760 / 1000
# Curtailed_Energy = P_curtailment_t.sum() / 1000
# # print("\033[H\033[J")
# print()
# print('Wind Capacity = %d MW' % hpp_wind_capacity)
# print('Solar Capacity = %d MW' % hpp_solar_capacity)
# print('AEP = %.0f GWh' % AEP)
# print('Curtailed Energy = %.0f GWh' % Curtailed_Energy)
# print('HPP Investment Cost = %.0f MEUR' % (hpp_investment_cost / 1e6))
# print('HPP Maintenance Cost = %.0f MEUR' %
# (hpp_maintenance_cost.sum() / 1e6))
# print('HPP LCOE = %.2f EUR/MWh' % LCOE)
# print('HPP NPV= %.0f MEUR' % (NPV / 1000000))
# print('HPP IRR = %.0f%%' % (IRR * 100))
# %% --------------------------------------------------
# Optimize the sizing of HPP (wind, solar and transformer)
# -----------------------------------------------------
print("")
print("HPP (wind + solar + transformer) size optimization - sizing_Wind_Solar_transformer_AV():")
[hpp_wind_capacity, hpp_solar_capacity, P_HPP_t,
P_curtailment_t, hpp_investment_cost, hpp_maintenance_cost,
LCOE, NPV, IRR] = ExampleHPP.sizing_Wind_Solar_transformer_AV(
......@@ -196,56 +204,19 @@ if __name__ == "__main__":
inverter_av_t,
transformer_av_t,
spot_price_t, {
"wind":1,
"solar":1,
"inverter":1,
"transformer":0,
"wind": 1, # 0 for 100% availability and 1 for availability from the reliability model
"solar": 1, # 0 for 100% availability and 1 for availability from the reliability model
"inverter": 1, # 0 for 100% availability and 1 for availability from the reliability model
"transformer": 1, # 0 for 100% availability and 1 for availability from the reliability model
})
rs_tbl = ExampleHPP.get_last_rs_tbl()
rs_tbl1 = ExampleHPP.get_last_rs_tbl()
# %%
AEP = P_HPP_t.sum() / 1000
AEP = P_HPP_t.mean() * 8760 / 1000
Curtailed_Energy = P_curtailment_t.sum() / 1000
# print("\033[H\033[J")
print('Wind Capacity = %d MW' % hpp_wind_capacity)
print('Solar Capacity = %d MW' % hpp_solar_capacity)
print('AEP = %.0f GWh' % AEP)
print('Curtailed Energy = %.0f GWh' % Curtailed_Energy)
print('HPP Investment Cost = %.0f MEUR' % (hpp_investment_cost / 1e6))
print('HPP Maintenance Cost = %.0f MEUR' %
(hpp_maintenance_cost.sum() / 1e6))
print('HPP LCOE = %.2f EUR/MWh' % LCOE)
print('HPP NPV= %.0f MEUR' % (NPV / 1000000))
print('HPP IRR = %.1f%%' % (IRR * 100))
# %% -----------------------------------------------
# Optimize the sizing of HPP (wind and solar) with Availability
# --------------------------------------------------
print()
print("HPP size optimization with availability factors:")
[hpp_wind_capacity, hpp_solar_capacity, P_HPP_t,
P_curtailment_t, hpp_investment_cost, hpp_maintenance_cost,
LCOE, NPV, IRR] = ExampleHPP.sizing_Wind_Solar_transformer_AV(
wind_power_t, wind_av_t,
solar_power_t, solar_av_t,
inverter_av_t,
transformer_av_t,
spot_price_t, {
"wind":1,
"solar":1,
"inverter":1,
"transformer":1,
})
rs_tbl = ExampleHPP.get_last_rs_tbl()
# %%
AEP = P_HPP_t.sum() / 1000
Curtailed_Energy = P_curtailment_t.sum() / 1000
# print("\033[H\033[J")
print('Wind Capacity = %d MW' % hpp_wind_capacity)
print('Solar Capacity = %d MW' % hpp_solar_capacity)
print('AEP = %.0f GWh' % AEP)
......@@ -255,63 +226,37 @@ if __name__ == "__main__":
(hpp_maintenance_cost.sum() / 1e6))
print('HPP LCOE = %.2f EUR/MWh' % LCOE)
print('HPP NPV= %.0f MEUR' % (NPV / 1000000))
print('HPP IRR = %.1f%%' % (IRR * 100))
print('HPP IRR = %.0f%%' % (IRR * 100))
# %% -----------------------------------------------
# Optimize the sizing of HPP (wind and solar) with Availability of Solar
# Optimize the sizing of HPP by Alessandra (wind, solar and Battery)
# --------------------------------------------------
# print()
# print("HPP size optimization with availability factor of Solar PV units:")
# [hpp_wind_capacity, hpp_solar_capacity, P_HPP_t,
# P_curtailment_t, hpp_investment_cost, hpp_maintenance_cost,
# LCOE, NPV, IRR] = ExampleHPP.sizing_Wind_Solar_PVAV(
# wind_power_t, solar_power_t, solar_av_t, spot_price_t)
# rs_tbl = ExampleHPP.get_last_rs_tbl()
# # %%
# AEP = P_HPP_t.sum() / 1000
# Curtailed_Energy = P_curtailment_t.sum() / 1000
# # print("\033[H\033[J")
# print('Wind Capacity = %d MW' % hpp_wind_capacity)
# print('Solar Capacity = %d MW' % hpp_solar_capacity)
# print('AEP = %.0f GWh' % AEP)
# print('Curtailed Energy = %.0f GWh' % Curtailed_Energy)
# print('HPP Investment Cost = %.0f MEUR' % (hpp_investment_cost / 1e6))
# print('HPP Maintenance Cost = %.0f MEUR' %
# (hpp_maintenance_cost.sum() / 1e6))
# print('HPP LCOE = %.2f EUR/MWh' % LCOE)
# print('HPP NPV= %.0f MEUR' % (NPV / 1000000))
# print('HPP IRR = %.0f%%' % (IRR * 100))
# %% --------------------------------------------------
# Optimize the sizing of HPP (wind, solar and battery)
# -----------------------------------------------------
# print("")
# print("HPP (wind+solar+storage) size optimization by Alessandra's Model:")
# [hpp_wind_capacity,
# hpp_solar_capacity,
# hpp_battery_power_rating,
# hpp_battery_energy_capacity,
# P_RES_available_t,
# P_HPP_t,
# P_curtailment_t,
# P_charge_discharge_t,
# E_SOC_t,
# hpp_investment_cost,
# hpp_maintenance_cost,
# LCOE,
# NPV,
# IRR] = ExampleHPP.sizing_Wind_Solar_Battery(wind_power_t,
# solar_power_t,
# spot_price_t)
# hpp_solar_capacity,
# hpp_battery_power_rating,
# hpp_battery_energy_capacity,
# P_RES_available_t,
# P_HPP_t,
# P_curtailment_t,
# P_charge_discharge_t,
# E_SOC_t,
# hpp_investment_cost,
# hpp_maintenance_cost,
# LCOE,
# NPV,
# IRR] = ExampleHPP.sizing_Wind_Solar_Battery(
# wind_power_t, solar_power_t, spot_price_t)
# # %%
# AEP = P_HPP_t.mean() * 8760 / 1000
# Curtailed_Energy = P_curtailment_t.sum() / 1000
# # print("\033[H\033[J")
# print()
# print("")
# print('Wind Capacity = %d MW' % hpp_wind_capacity)
# print('Solar Capacity = %d MW' % hpp_solar_capacity)
# print('Battery Storage Power Rating = %d MW' % hpp_battery_power_rating)
......@@ -326,51 +271,62 @@ if __name__ == "__main__":
# print('HPP LCOE = %.2f EUR/MWh' % LCOE)
# print('HPP NPV= %.0f MEUR' % (NPV / 1000000))
# print('HPP IRR = %.0f%%' % (IRR * 100))
# %% --------------------------------------------------
# Optimize the sizing of HPP (wind, solar, transformer and battery)
# -----------------------------------------------------
print("")
print("HPP (wind + solar + BESS + transformer) size optimization - sizing_Wind_Solar_BESS_transformer_AV()")
[hpp_wind_capacity,
hpp_solar_capacity,
hpp_battery_power_rating,
hpp_battery_energy_capacity,
P_RES_available_t,
P_HPP_t,
P_curtailment_t,
P_charge_discharge_t,
E_SOC_t,
hpp_investment_cost,
hpp_maintenance_cost,
LCOE,
NPV,
IRR] = ExampleHPP.sizing_Wind_Solar_BESS_transformer_AV(
wind_power_t, wind_av_t,
solar_power_t, solar_av_t,
inverter_av_t,
transformer_av_t,
bess_av_t,
spot_price_t, {
"wind": 1, # 0 for 100% availability and 1 for availability from the reliability model
"solar": 1, # 0 for 100% availability and 1 for availability from the reliability model
"inverter": 1, # 0 for 100% availability and 1 for availability from the reliability model
"transformer": 1, # 0 for 100% availability and 1 for availability from the reliability model
"bess": 1, # -1 for remove the BESS from HPP, 0 for 100% availability and 1 for availability from the reliability model
})
rs_tbl5 = ExampleHPP.get_last_rs_tbl()
# # %% --------------------------------------------------
# # Eval a HPP (wind, solar and battery)
# # -----------------------------------------------------
# [hpp_wind_capacity,
# hpp_solar_capacity,
# hpp_battery_power_rating,
# hpp_battery_energy_capacity,
# P_RES_available_t,
# P_HPP_t,
# P_curtailment_t,
# P_charge_discharge_t,
# E_SOC_t,
# hpp_investment_cost,
# hpp_maintenance_cost,
# LCOE,
# NPV,
# IRR] = ExampleHPP.eval_Wind_Solar_Battery(
# wind_power_t,
# solar_power_t,
# spot_price_t,
# Wind_MW=200,
# Solar_MW=300,
# P_batt_MW=100,
# E_batt_MWh=300
# )
# # %%
# %%
# AEP = P_HPP_t.mean() * 8760 / 1000
# Curtailed_Energy = P_curtailment_t.sum() / 1000
# # print("\033[H\033[J")
# print()
# print('Wind Capacity = %d MW' % hpp_wind_capacity)
# print('Solar Capacity = %d MW' % hpp_solar_capacity)
# print('Battery Storage Power Rating = %d MW' % hpp_battery_power_rating)
# print(
# 'Battery Storage Energy Rating = %d MWh' %
# hpp_battery_energy_capacity)
# print('AEP = %.0f GWh' % AEP)
# print('Curtailed Energy = %.0f GWh' % Curtailed_Energy)
# print('HPP Investment Cost = %.0f MEUR' % (hpp_investment_cost / 1e6))
# print('HPP Maintenance Cost = %.0f MEUR' %
# (hpp_maintenance_cost.sum() / 1e6))
# print('HPP LCOE = %.2f EUR/MWh' % LCOE)
# print('HPP NPV= %.0f MEUR' % (NPV / 1000000))
# print('HPP IRR = %.0f%%' % (IRR * 100))
AEP = P_HPP_t.mean() * 8760 / 1000
Curtailed_Energy = P_curtailment_t.sum() / 1000
# print("\033[H\033[J")
print("")
print('Wind Capacity = %d MW' % hpp_wind_capacity)
print('Solar Capacity = %d MW' % hpp_solar_capacity)
print('Battery Storage Power Rating = %d MW' % hpp_battery_power_rating)
print(
'Battery Storage Energy Rating = %d MWh' %
hpp_battery_energy_capacity)
print('AEP = %.0f GWh' % AEP)
print('Curtailed Energy = %.0f GWh' % Curtailed_Energy)
print('HPP Investment Cost = %.0f MEUR' % (hpp_investment_cost / 1e6))
print('HPP Maintenance Cost = %.0f MEUR' %
(hpp_maintenance_cost.sum() / 1e6))
print('HPP LCOE = %.2f EUR/MWh' % LCOE)
print('HPP NPV= %.0f MEUR' % (NPV / 1000000))