commit
c87b45a763
1
.gitignore
vendored
1
.gitignore
vendored
@ -26,6 +26,7 @@ gurobi.log
|
||||
/data/switzerland*
|
||||
/data/.nfs*
|
||||
/data/Industrial_Database.csv
|
||||
/data/retro/tabula-calculator-calcsetbuilding.csv
|
||||
|
||||
*.org
|
||||
|
||||
|
@ -281,14 +281,15 @@ rule build_industrial_demand:
|
||||
rule build_retro_cost:
|
||||
input:
|
||||
building_stock="data/retro/data_building_stock.csv",
|
||||
data_tabula="data/retro/tabula-calculator-calcsetbuilding.csv",
|
||||
air_temperature = "resources/temp_air_total_{network}_s{simpl}_{clusters}.nc",
|
||||
u_values_PL="data/retro/u_values_poland.csv",
|
||||
tax_w="data/retro/electricity_taxes_eu.csv",
|
||||
construction_index="data/retro/comparative_level_investment.csv",
|
||||
average_surface="data/retro/average_surface_components.csv",
|
||||
floor_area_missing="data/retro/floor_area_missing.csv",
|
||||
clustered_pop_layout="resources/pop_layout_elec_s{simpl}_{clusters}.csv",
|
||||
cost_germany="data/retro/retro_cost_germany.csv",
|
||||
window_assumptions="data/retro/window_assumptions.csv"
|
||||
window_assumptions="data/retro/window_assumptions.csv",
|
||||
output:
|
||||
retro_cost="resources/retro_cost_elec_s{simpl}_{clusters}.csv",
|
||||
floor_area="resources/floor_area_elec_s{simpl}_{clusters}.csv"
|
||||
|
@ -119,20 +119,25 @@ sector:
|
||||
'time_dep_hp_cop' : True #time dependent heat pump coefficient of performance
|
||||
'heat_pump_sink_T' : 55. # Celsius, based on DTU / large area radiators; used in build_cop_profiles.py
|
||||
# conservatively high to cover hot water and space heating in poorly-insulated buildings
|
||||
'retrofitting' :
|
||||
'retro_exogen': True # space heat demand savings exogenously
|
||||
'dE': # reduction of space heat demand (applied before losses in DH)
|
||||
2020 : 0.
|
||||
2030 : 0.15
|
||||
2040 : 0.3
|
||||
2050 : 0.4
|
||||
'reduce_space_heat_exogenously': True # reduces space heat demand by a given factor (applied before losses in DH)
|
||||
# this can represent e.g. building renovation, building demolition, or if
|
||||
# the factor is negative: increasing floor area, increased thermal comfort, population growth
|
||||
'reduce_space_heat_exogenously_factor': # per unit reduction in space heat demand
|
||||
# the default factors are determined by the LTS scenario from http://tool.european-calculator.eu/app/buildings/building-types-area/?levers=1ddd4444421213bdbbbddd44444ffffff11f411111221111211l212221
|
||||
2020: 0.10 # this results in a space heat demand reduction of 10%
|
||||
2025: 0.09 # first heat demand increases compared to 2020 because of larger floor area per capita
|
||||
2030: 0.09
|
||||
2035: 0.11
|
||||
2040: 0.16
|
||||
2045: 0.21
|
||||
2050: 0.29
|
||||
'retrofitting' : # co-optimises building renovation to reduce space heat demand
|
||||
'retro_endogen': False # co-optimise space heat savings
|
||||
'cost_factor' : 1.0
|
||||
'cost_factor' : 1.0 # weight costs for building renovation
|
||||
'interest_rate': 0.04 # for investment in building components
|
||||
'annualise_cost': True # annualise the investment costs
|
||||
'tax_weighting': False # weight costs depending on taxes in countries
|
||||
'construction_index': True # weight costs depending on labour/material costs per ct
|
||||
'l_strength': ["0.076", "0.197"] # additional insulation thickness[m], determines number of retro steps(=generators per bus) and maximum possible savings
|
||||
'construction_index': True # weight costs depending on labour/material costs per country
|
||||
'tes' : True
|
||||
'tes_tau' : 3.
|
||||
'boilers' : True
|
||||
|
@ -1,7 +0,0 @@
|
||||
,Dwelling,Ceilling,Standard component surfaces (m2),component,surfaces,(m2),,
|
||||
Building type,Space(m²),Height(m),Roof,Facade,Floor,Windows,,
|
||||
Single/two family house,120,2.5,90,166,63,29,,
|
||||
Large apartment house,1457,2.5,354,1189,354,380,,
|
||||
Apartment house,5276,,598.337,2992.1,598.337,756,tabula ,http://webtool.building-typology.eu/#pdfes
|
||||
,,,,,,,,
|
||||
"Source: https://link.springer.com/article/10.1007/s12053-010-9090-6 ,p.4",,,,,,,,
|
|
@ -22,5 +22,5 @@ U-values Poland,u_values_poland.csv,unknown,https://data.europa.eu/euodp/de/data
|
||||
Floor area missing in hotmaps building stock data,floor_area_missing.csv,unknown,https://data.europa.eu/euodp/de/data/dataset/building-stock-observatory
|
||||
Comparative level investment,comparative_level_investment.csv,Eurostat,https://ec.europa.eu/eurostat/statistics-explained/index.php?title=Comparative_price_levels_for_investment
|
||||
Electricity taxes,electricity_taxes_eu.csv,Eurostat,https://appsso.eurostat.ec.europa.eu/nui/show.do?dataset=nrg_pc_204&lang=en
|
||||
Average surface components,average_surface_components.csv,unknown,http://webtool.building-typology.eu/#bm
|
||||
Building topologies and corresponding standard values,tabula-calculator-calcsetbuilding.csv,unknown,https://episcope.eu/fileadmin/tabula/public/calc/tabula-calculator.xlsx
|
||||
Retrofitting thermal envelope costs for Germany,retro_cost_germany.csv,unkown,https://www.iwu.de/forschung/handlungslogiken/kosten-energierelevanter-bau-und-anlagenteile-bei-modernisierung/
|
||||
|
|
@ -73,8 +73,8 @@ To download and extract the data bundle on the command line:
|
||||
|
||||
.. code:: bash
|
||||
|
||||
projects/pypsa-eur-sec/data % wget "https://nworbmot.org/pypsa-eur-sec-data-bundle-210125.tar.gz"
|
||||
projects/pypsa-eur-sec/data % tar xvzf pypsa-eur-sec-data-bundle-210125.tar.gz
|
||||
projects/pypsa-eur-sec/data % wget "https://nworbmot.org/pypsa-eur-sec-data-bundle-210418.tar.gz"
|
||||
projects/pypsa-eur-sec/data % tar xvzf pypsa-eur-sec-data-bundle-210418.tar.gz
|
||||
|
||||
|
||||
The data licences and sources are given in the following table.
|
||||
|
@ -6,6 +6,7 @@ Future release
|
||||
===================
|
||||
|
||||
* For the myopic investment option, a carbon budget and a type of decay (exponential or beta) can be selected in the ``config.yaml`` file to distribute the budget across the ``planning_horizons``. For example, ``cb40ex0`` in the ``{sector_opts}`` wildcard will distribute a carbon budget of 40 GtCO2 following an exponential decay with initial growth rate 0.
|
||||
* The cost database for retrofitting of the thermal envelope of buildings has been updated. Now, for calculating the space heat savings of a building, losses by thermal bridges and ventilation are included as well as heat gains (internal and by solar radiation). See the section :ref:`retro` for more details on the retrofitting module.
|
||||
* Added an option to alter the capital cost or maximum capacity of carriers by a factor via ``carrier+factor`` in the ``{sector_opts}`` wildcard. This can be useful for exploring uncertain cost parameters. Example: ``solar+c0.5`` reduces the ``capital_cost`` of solar to 50\% of original values. Similarly ``solar+p3`` multiplies the ``p_nom_max`` by 3.
|
||||
* Rename the bus for European liquid hydrocarbons from ``Fischer-Tropsch`` to ``EU oil``, since it can be supplied not just with the Fischer-Tropsch process, but also with fossil oil.
|
||||
* Bugfix: The new separation of land transport by carrier in Version 0.4.0 failed to account for the carbon dioxide emissions from internal combustion engines. This is now treated as a negative load on the atmospheric carbon dioxide bus, just like aviation emissions.
|
||||
@ -137,4 +138,4 @@ To make a new release of the data bundle, make an archive of the files in ``data
|
||||
|
||||
.. code:: bash
|
||||
|
||||
data % tar pczf pypsa-eur-sec-data-bundle-YYMMDD.tar.gz eea/UNFCCC_v23.csv switzerland-sfoe biomass eurostat-energy_balances-* jrc-idees-2015 emobility urban_percent.csv timezone_mappings.csv heat_load_profile_DK_AdamJensen.csv WindWaveWEC_GLTB.xlsx myb1-2017-nitro.xls Industrial_Database.csv
|
||||
data % tar pczf pypsa-eur-sec-data-bundle-YYMMDD.tar.gz eea/UNFCCC_v23.csv switzerland-sfoe biomass eurostat-energy_balances-* jrc-idees-2015 emobility urban_percent.csv timezone_mappings.csv heat_load_profile_DK_AdamJensen.csv WindWaveWEC_GLTB.xlsx myb1-2017-nitro.xls Industrial_Database.csv retro/tabula-calculator-calcsetbuilding.csv
|
||||
|
@ -108,6 +108,43 @@ Small for decentral applications.
|
||||
|
||||
Big water pit storage for district heating.
|
||||
|
||||
.. _retro:
|
||||
|
||||
Retrofitting of the thermal envelope of buildings
|
||||
===================================================
|
||||
Co-optimising building renovation is only enabled if in the ``config.yaml`` the
|
||||
option :mod:`retro_endogen: True`. To reduce the computational burden
|
||||
default setting is
|
||||
|
||||
.. literalinclude:: ../config.default.yaml
|
||||
:language: yaml
|
||||
:lines: 134-135
|
||||
|
||||
Renovation of the thermal envelope reduces the space heating demand and is
|
||||
optimised at each node for every heat bus. Renovation measures through additional
|
||||
insulation material and replacement of energy inefficient windows are considered.
|
||||
|
||||
In a first step, costs per energy savings are estimated in :mod:`build_retro_cost.py`.
|
||||
They depend on the insulation condition of the building stock and costs for
|
||||
renovation of the building elements.
|
||||
In a second step, for those cost per energy savings two possible renovation
|
||||
strengths are determined: a moderate renovation with lower costs and lower
|
||||
maximum possible space heat savings, and an ambitious renovation with associated
|
||||
higher costs and higher efficiency gains. They are added by step-wise
|
||||
linearisation in form of two additional generations in
|
||||
:mod:`prepare_sector_network.py`.
|
||||
|
||||
Settings in the config.yaml concerning the endogenously optimisation of building
|
||||
renovation
|
||||
|
||||
.. literalinclude:: ../config.default.yaml
|
||||
:language: yaml
|
||||
:lines: 136-140
|
||||
|
||||
Further information are given in the publication
|
||||
|
||||
`Mitigating heat demand peaks in buildings in a highly renewable European energy system, (2021) <https://arxiv.org/abs/2012.01831>`_.
|
||||
|
||||
|
||||
Hydrogen demand
|
||||
==================
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -196,25 +196,25 @@ def calculate_costs(n,label,costs):
|
||||
|
||||
return costs
|
||||
|
||||
def calculate_cumulative_cost():
|
||||
def calculate_cumulative_cost():
|
||||
planning_horizons = snakemake.config['scenario']['planning_horizons']
|
||||
|
||||
cumulative_cost = pd.DataFrame(index = df["costs"].sum().index,
|
||||
columns=pd.Series(data=np.arange(0,0.1, 0.01), name='social discount rate'))
|
||||
|
||||
|
||||
#discount cost and express them in money value of planning_horizons[0]
|
||||
for r in cumulative_cost.columns:
|
||||
cumulative_cost[r]=[df["costs"].sum()[index]/((1+r)**(index[-1]-planning_horizons[0])) for index in cumulative_cost.index]
|
||||
|
||||
|
||||
#integrate cost throughout the transition path
|
||||
for r in cumulative_cost.columns:
|
||||
for r in cumulative_cost.columns:
|
||||
for cluster in cumulative_cost.index.get_level_values(level=0).unique():
|
||||
for lv in cumulative_cost.index.get_level_values(level=1).unique():
|
||||
for sector_opts in cumulative_cost.index.get_level_values(level=2).unique():
|
||||
cumulative_cost.loc[(cluster, lv, sector_opts,'cumulative cost'),r] = np.trapz(cumulative_cost.loc[idx[cluster, lv, sector_opts,planning_horizons],r].values, x=planning_horizons)
|
||||
|
||||
return cumulative_cost
|
||||
|
||||
return cumulative_cost
|
||||
|
||||
def calculate_nodal_capacities(n,label,nodal_capacities):
|
||||
#Beware this also has extraneous locations for country (e.g. biomass) or continent-wide (e.g. fossil gas/oil) stuff
|
||||
for c in n.iterate_components(n.branch_components|n.controllable_one_port_components^{"Load"}):
|
||||
@ -285,7 +285,7 @@ def calculate_supply(n,label,supply):
|
||||
|
||||
for c in n.iterate_components(n.one_port_components):
|
||||
|
||||
items = c.df.index[c.df.bus.map(bus_map)]
|
||||
items = c.df.index[c.df.bus.map(bus_map).fillna(False)]
|
||||
|
||||
if len(items) == 0:
|
||||
continue
|
||||
@ -330,7 +330,7 @@ def calculate_supply_energy(n,label,supply_energy):
|
||||
|
||||
for c in n.iterate_components(n.one_port_components):
|
||||
|
||||
items = c.df.index[c.df.bus.map(bus_map)]
|
||||
items = c.df.index[c.df.bus.map(bus_map).fillna(False)]
|
||||
|
||||
if len(items) == 0:
|
||||
continue
|
||||
@ -611,7 +611,7 @@ if __name__ == "__main__":
|
||||
print(networks_dict)
|
||||
|
||||
Nyears = 1
|
||||
|
||||
|
||||
costs_db = prepare_costs(snakemake.input.costs,
|
||||
snakemake.config['costs']['USD2013_to_EUR2013'],
|
||||
snakemake.config['costs']['discountrate'],
|
||||
@ -623,10 +623,9 @@ if __name__ == "__main__":
|
||||
df["metrics"].loc["total costs"] = df["costs"].sum()
|
||||
|
||||
to_csv(df)
|
||||
|
||||
|
||||
if snakemake.config["foresight"]=='myopic':
|
||||
cumulative_cost=calculate_cumulative_cost()
|
||||
cumulative_cost.to_csv(snakemake.config['summary_dir'] + '/' + snakemake.config['run'] + '/csvs/cumulative_cost.csv')
|
||||
|
||||
|
||||
|
@ -248,6 +248,14 @@ def remove_elec_base_techs(n):
|
||||
n.carriers.drop(to_remove, inplace=True, errors="ignore")
|
||||
|
||||
|
||||
def remove_non_electric_buses(n):
|
||||
"""
|
||||
remove buses from pypsa-eur with carriers which are not AC buses
|
||||
"""
|
||||
print("drop buses from PyPSA-Eur with carrier: ", n.buses[~n.buses.carrier.isin(["AC", "DC"])].carrier.unique())
|
||||
n.buses = n.buses[n.buses.carrier.isin(["AC", "DC"])]
|
||||
|
||||
|
||||
def add_co2_tracking(n):
|
||||
|
||||
|
||||
@ -1174,11 +1182,10 @@ def add_heat(network):
|
||||
|
||||
urban_fraction = options['central_fraction']*pop_layout["urban"]/(pop_layout[["urban","rural"]].sum(axis=1))
|
||||
|
||||
# building retrofitting, exogenously reduce space heat demand
|
||||
if options["retrofitting"]["retro_exogen"]:
|
||||
dE = get_parameter(options["retrofitting"]["dE"])
|
||||
print("retrofitting exogenously, assumed space heat reduction of ",
|
||||
dE)
|
||||
# exogenously reduce space heat demand
|
||||
if options["reduce_space_heat_exogenously"]:
|
||||
dE = get_parameter(options["reduce_space_heat_exogenously_factor"])
|
||||
print("assumed space heat reduction of {} %".format(dE*100))
|
||||
for sector in sectors:
|
||||
heat_demand[sector + " space"] = (1-dE)*heat_demand[sector + " space"]
|
||||
|
||||
@ -1908,8 +1915,7 @@ if __name__ == "__main__":
|
||||
retro_cost_energy = "resources/retro_cost_elec_s{simpl}_{clusters}.csv",
|
||||
floor_area = "resources/floor_area_elec_s{simpl}_{clusters}.csv"
|
||||
),
|
||||
output=['results/version-cb48be3/prenetworks/elec_s{simpl}_{clusters}_lv{lv}__{sector_opts}_{planning_horizons}.nc']
|
||||
|
||||
output=['results/version-cb48be3/prenetworks/{network}_s{simpl}_{clusters}_lv{lv}__{sector_opts}_{planning_horizons}.nc']
|
||||
)
|
||||
import yaml
|
||||
with open('config.yaml', encoding='utf8') as f:
|
||||
@ -1949,6 +1955,8 @@ if __name__ == "__main__":
|
||||
|
||||
n.loads["carrier"] = "electricity"
|
||||
|
||||
remove_non_electric_buses(n)
|
||||
|
||||
n.buses["location"] = n.buses.index
|
||||
|
||||
update_wind_solar_costs(n, costs)
|
||||
|
Loading…
Reference in New Issue
Block a user