pypsa-eur
pypsa-eur copied to clipboard
Adding CHPs to the existing heating baseyear
Closes # (if applicable).
Adding CHPs to the existing heating sector
In add_existing_baseyear.py
, the code now checks for the wildcard H
. If the heating sector is not part of the network, CHP plants are added to the electricity grid only. Otherwise, the CHPs are added with the heating sector. If the column Capacity_thermal
exists, the MaStR data was read in and the German CHPs are added with the efficiency calculated by Triebs et al.
Checklist
- [x] I tested my contribution locally and it seems to work fine.
- [x] Code and workflow changes are sufficiently documented.
- [x] Changed dependencies are added to
envs/environment.yaml
. - [x] Changes in configuration options are added in all of
config.default.yaml
. - [x] Changes in configuration options are also documented in
doc/configtables/*.csv
. - [ ] A release note
doc/release_notes.rst
is added.
@toniseibold, I changed a few additional things and I condensed a few remaining TODOs for you. We can revert parts that I overlooked that were necessary.
- limit changes to
add_existing_baseyear
rule, so the PR becomes more modular. - hydro and waste are dropped later anyways, hence I dropped them from the powerplant query
-
skipna=True
in mean calculation is not required as this is already the default behaviour -
try-except
block for lifetimes was not required in my case; if it is needed, I would implement asif-else
block - hardcoded heat efficiency (0.71) was removed by using the backpressure coefficient (https://ens.dk/sites/ens.dk/files/Analyser/technology_data_catalogue_for_el_and_dh.pdf, page 21: "The Cb -coefficient (backpressure coefficient) is defined as the maximum power generation capacity in backpressure mode divided by the maximum heat production capacity (including flue gas condensation if applicable)")
- read custom powerplants here, rather than in
build_powerplants
rule. - I added a mechanism to exclude small CHPs below 500 kW (threshold debatable)
- I use the backpressure coefficient
c_b
for calculating the heat efficiency of power-driven CHPs and followed roughly your approach for strongly heat-driven CHPs while adjusting the split and giving some upper limits forc_b
andEfficiency
depending onefficiency-heat
. - It should be fine for
DateIn
andDateOut
to be floats. - There was a bug which only used the first capacity value in a pandas.Series (
p_nom=capacity[0],
andcapacity[0] / costs.at[key, "efficiency"]
)
TODOs
- [x] Double-check my changes
- [x] Handle Fueltypes Other/Waste (relatively large capacity dropped, also linked to duplicates in
pypsa-ariadne
PR) - [x] Potentially: keep oil CHPs and use gas CHP for techno-economic data
- [ ] Test run with capacity and energy output comparison to historical statistics.
in add_existing_baseyear.py
why are oil CHPs kept?
if "H" in snakemake.wildcards.sector_opts.split("-"):
df_agg = df_agg.query("Set != 'CHP' or Fueltype == 'Oil'")
Oil and waste CHPs are now kept in the heating sector.
Installed capacity of CHP plants in Germany 2020:
urban central coal CHP 24.096386
urban central gas CHP 1292.031899
urban central gas CHP CC 0.000000
urban central lignite CHP 561.611424
urban central solid biomass CHP 42.487920
urban central solid biomass CHP CC 0.000000
Heating supply
urban central air heat pump 4.255723e-06
urban central gas CHP 4.075471e-06
urban central gas CHP CC 1.599523e-06
urban central gas boiler 8.522301e+07
urban central resistive heater 5.342906e-06
urban central solar thermal 8.890480e-07
urban central solid biomass CHP 6.361950e+03
please add the CHPs in add_existing_power and not in add_existing_heating (because of the differences in the grouping year logic)
- [ ] also make sure not to add power-only biomass plants twice
- [x] and perhaps lets find another name for the power only plants, the
OP
is somewhat confusing