Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Biomass (spatial and nonspatial) overestimated? 150 TW of solid biomass for 2050 in the Nordics #1434

Closed
2 tasks done
LRydin opened this issue Nov 24, 2024 · 2 comments
Closed
2 tasks done
Labels

Comments

@LRydin
Copy link

LRydin commented Nov 24, 2024

Checklist

  • I am using the current master branch or the latest release. Please indicate. (it's maybe 1~2 weeks old, the branch I cloned)
  • I am running on an up-to-date pypsa-eur environment. Update via conda env update -f envs/environment.yaml.

Describe the Bug

Configuration

I am running a simple sector-coupled 3H-THBIA with CCL for the Nordics ['FI', 'SE', 'NO'] with a 2050 horizon. I've set a few minor CCL targets for offwind and onwind, with values roughly around 8000 to 10000 MW for NO, 11000 to 12000 MW for SE, and 0 to 2000 MW for FI.

I have tried running both a spatially resolved as well as a single-node EU solid biomass (that is, in the config.yaml):

sector:
  biomass_spatial: true  # regionally resolve biomass (e.g. potentials)
  biomass_transport: true  # allow transport of solid biomass between nodes

as well as the default setting, which is false for both above.

Bug (?)

After a 1-year optimisation (for either of the case above), I have (for p_nom_opt)

n.generators.groupby('carrier').p_nom_opt.sum() / 1e3 # Nominal capacity in GW
carrier
biogas                             6809.135684
gas                                  30.254674
nuclear                              12.979000
offwind-ac                            0.120270
offwind-dc                            0.123729
offwind-float                        20.900000
oil primary                           6.932309
onwind                               40.111108
ror                                   3.642100
rural solar thermal                   0.000012
solar                                35.074000
solar rooftop                        35.719182
solar-hsat                            0.000000
solid biomass                    153038.243301
urban central solar thermal           0.000018
urban decentral solar thermal         0.000012
Name: p_nom_opt, dtype: float64

But what I think is strange is that the p_nom for solid biomass is

n.generators.groupby('carrier').p_nom.sum() / 1e3 # Nominal capacity in GW 
carrier
biogas                             6809.135684
gas                                   0.000000
nuclear                              12.979000
offwind-ac                            0.120270
offwind-dc                            0.123729
offwind-float                         0.111125
oil primary                           0.000000
onwind                               19.800390
ror                                   3.642100
rural solar thermal                   0.000000
solar                                 1.584825
solar rooftop                         0.000000
solar-hsat                            0.000000
solid biomass                    153038.243301
urban central solar thermal           0.000000
urban decentral solar thermal         0.000000
Name: p_nom, dtype: float64

That is a nominal power of 150 TW for biomass, for 3 countries. Is that not too much?

Other info

Nominal link capacity points to 18 GW for biomass transport (reasonable in my view for 2050)

np.round(n.links.groupby('carrier').p_nom.sum() / 1e3) # Nominal capacity in GW 
carrier
BEV charger                                 121.0
DAC                                           0.0
DC                                            5.0
Fischer-Tropsch                               0.0
H2 Electrolysis                               0.0
H2 Fuel Cell                                  0.0
H2 pipeline                                   0.0
OCGT                                          0.0
SMR                                           0.0
SMR CC                                        0.0
Sabatier                                      0.0
V2G                                         121.0
agriculture machinery oil                     0.0
battery charger                               0.0
battery discharger                            0.0
biogas to gas                                 0.0
co2 sequestered                               0.0
electricity distribution grid                 0.0
gas for industry                              0.0
gas for industry CC                           0.0
home battery charger                          0.0
home battery discharger                       0.0
industry methanol                             0.0
kerosene for aviation                         0.0
methanolisation                               0.0
naphtha for industry                          0.0
oil refining                               1000.0
process emissions                             0.0
process emissions CC                          0.0
rural air heat pump                           0.0
rural biomass boiler                          0.0
rural gas boiler                              0.0
rural ground heat pump                        0.0
rural resistive heater                        0.0
rural water tanks charger                     0.0
rural water tanks discharger                  0.0
shipping methanol                             0.0
solid biomass for industry                    0.0
solid biomass for industry CC                 0.0
solid biomass transport                   18100.0
urban central CHP                             0.0
urban central CHP CC                          0.0
urban central air heat pump                   0.0
urban central gas boiler                      0.0
urban central resistive heater                0.0
urban central solid biomass CHP               0.0
urban central solid biomass CHP CC            0.0
urban central water tanks charger             0.0
urban central water tanks discharger          0.0
urban decentral air heat pump                 0.0
urban decentral biomass boiler                0.0
urban decentral gas boiler                    0.0
urban decentral resistive heater              0.0
urban decentral water tanks charger           0.0
urban decentral water tanks discharger        0.0
Name: p_nom, dtype: float64

And looking at the loads, we find

n.loads.groupby(['carrier']).p_set.sum()
carrier
H2 for industry                        752.283105
agriculture electricity                231.281557
agriculture heat                      1258.908682
agriculture machinery oil              630.652141
electricity                              0.000000
gas for industry                      1714.611872
industry electricity                 16166.666667
industry methanol                       67.351598
kerosene for aviation                 3801.595338
land transport EV                        0.000000
low-temperature heat for industry      521.689498
naphtha for industry                  2149.543379
process emissions                    -1051.369863
rural heat                               0.000000
shipping methanol                     4910.150419
solid biomass for industry           15138.127854
urban central heat                       0.000000
urban decentral heat                     0.000000
Name: p_set, dtype: float64

Note that the industry electricity is roughly in the same order as the solid biomass for industry, so why expect 150 TW of biomass for 2050?

Potential issue (?)

I've looked for a potential issue here and all that I came across was in, e.g., line 442 of the build_industry_sector_ratios.py. Therein we find:

    # convert from ktoe/a to GWh/a
    sources = ["elec", "biomass", "methane", "hydrogen", "heat", "naphtha"]
    df.loc[sources, sector] *= toe_to_MWh

Is there a misconversion of the ratios? Point being, I think 150 GW of biomass for Norway, Finland, and Sweden for 2050 is reasonable, in a sector coupled simulations (150 TW / 1000). Ideas?

Error Message

If applicable, paste any terminal output to help illustrating your problem.
In some cases it may also be useful to share your list of installed packages: conda list.

<paste here>
@LRydin LRydin added the bug label Nov 24, 2024
@LRydin
Copy link
Author

LRydin commented Nov 25, 2024

Potential bug

I believe I have located a potential source of the issue here. Note that in the release notes for we find

Replaced the Store representation of biogenic carriers (solid biomass, biogas, bioliquids, MSW) in prepare_sector_network with the extended Generator component that uses the e_sum_min and e_sum_max attributes to enforce minimum usage and limit maximum potential, respectively.

which is implemented in line 2622 of prepare_sector_network.py as

n.add(
     "Generator",
    spatial.biomass.nodes,
    bus=spatial.biomass.nodes,
    carrier="solid biomass",
    p_nom=solid_biomass_potentials_spatial,
    marginal_cost=costs.at["solid biomass", "fuel"],
    e_sum_min=0,
    e_sum_max=solid_biomass_potentials_spatial,
    )

First, this is not an extendable (p_nom_extendable) is not defined (there are in total 86 "Link" and 16 "Generator", of which only solid biomass and biogas are not explicitly given. In my view, the fact that they are potentials, means they should be extendable. Note that the unsustainable sources are all set as p_nom_extendable=False, which makes sense.

Potential solution

Should we not consider instead something of the type:

n.add(
     "Generator",
    spatial.biomass.nodes,
    bus=spatial.biomass.nodes,
    carrier="solid biomass",
    p_nom_extendable=True,
    p_nom_max=solid_biomass_potentials_spatial,
    marginal_cost=costs.at["solid biomass", "fuel"],
    e_sum_min=0,
    e_sum_max=solid_biomass_potentials_spatial,
    )

Note the p_nom_extendable=True and p_nom_max=solid_biomass_potentials_spatial. A similar argument goes for biogas around line 2606.

Issues

Potentially connected to #1373, @cpschau?

@LRydin
Copy link
Author

LRydin commented Dec 13, 2024

Marking this as closed. The issue seems to be centrally around the n.plot import, or potentially in the loading of the postnetwork. The CSVs and SVGs that are produced are all within reason.

@LRydin LRydin closed this as completed Dec 13, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant