Skip to content

Industry transport fixed#2109

Open
AbiAfthab wants to merge 31 commits intoPyPSA:masterfrom
AbiAfthab:industry_transport_fixed
Open

Industry transport fixed#2109
AbiAfthab wants to merge 31 commits intoPyPSA:masterfrom
AbiAfthab:industry_transport_fixed

Conversation

@AbiAfthab
Copy link
Copy Markdown

Closes # (if applicable).

Changes proposed in this Pull Request

In this version, passenger cars have been treated separately along with the industrial flexibility. Scripts changes are build_electricity_demand.py, build_energy_totals.py

Checklist

  • I tested my contribution locally and it works as intended.
  • Code and workflow changes are sufficiently documented.
  • Changed dependencies are added to pixi.toml (using pixi add <dependency-name>).
  • Changes in configuration options are added in config/config.default.yaml.
  • Changes in configuration options are documented in doc/configtables/*.csv.
  • For new data sources or versions, these instructions have been followed.
  • A release note doc/release_notes.rst is added.

AbiAfthab and others added 30 commits November 26, 2025 13:02
- Add retrieve_ffe_load_profiles rule to download FfE industry load profiles
- Fix sign error in DSR store-link coupling constraint (discharge - charge)
- Fix DRI-H2 node extraction to use store name instead of bus name
- Revert biomass-to-methanol cost formula from * to / efficiency
- Remove duplicate "Non-specified (Industry)" YAML key in DSR config
- Remove unused imports in build_industrial_energy_demand_per_node.py
Key changes:
- Make DSR store capacity extendable (e_nom_extendable=True) with capital cost
  (5 EUR/MWh/year), so optimizer decides whether to build DSR based on value
- Add charge/discharge efficiency losses (0.98) to DSR links
- Vectorize ramp constraints using linopy/xarray for performance (4 bulk calls
  instead of millions of individual constraints)
- Apply ramp constraints only to physically rigid technologies (BF-BOF, kilns,
  primary aluminium) with technology-specific rates from config
- Remove redundant store-link coupling constraint that duplicated PyPSA's
  built-in bus balance (KCL), fixing numerical instability
- Fix geopandas JSON auto-parsing in gas network scripts
- Add temporal-demand-only config for proper A/B comparison
- Add DSR impact analysis notebook (Temporal NO DSR vs Temporal + DSR)

Results: DSR reduces system cost by 3.85B EUR/year (-0.62%), average
electricity prices by 0.53%, and renewable curtailment by 26% compared
to an equivalent temporal-demand baseline.

Co-authored-by: Cursor <cursoragent@cursor.com>
- Replace weekly average plot (misleading mirror effect) with daily net
  DSR position over the year
- Add DSR-vs-price correlation on representative days (highest activity,
  winter, summer) showing charge during low prices, discharge during high
- Add average hourly DSR dispatch vs price profile across full year

Co-authored-by: Cursor <cursoragent@cursor.com>
…ling constraint

- Fix bug: use `h2_bus` instead of `dri_bus` in DRI H2 coupling log message
- Remove `add_dsr_link_store_coupling_constraint` function (redundant with
  PyPSA's bus balance / KCL)

Co-authored-by: Cursor <cursoragent@cursor.com>
…mall overrides

- Move all DSR v3 parameters (economic costs, technology_breakdown,
  technology-specific flexibility/shift/ramp/restriction, negative_only,
  min_load) into config/config.default.yaml with enable: false
- Create small override files in config/test/ for each scenario:
  - config.eu_38_2030_base.yaml: shared EU27 scenario settings
  - config.dsr_v3_test.yaml: DSR enabled test run
  - config.temporal_no_dsr.yaml: no-DSR baseline
  - config.dsr_v3_renewable.yaml: DSR + Fit-for-55 renewables
  - config.no_dsr_renewable.yaml: no-DSR + Fit-for-55 renewables
- Replace config/test/config.industry.flex.yaml (1374 lines) with small override
- Remove config/config.yaml and config/config.temporal_no_dsr.yaml from tracking
  (config/config.yaml stays local-only via .gitignore)
- Update Snakefile with config stacking documentation
- Add analysis_output/ and *Zone.Identifier to .gitignore

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
28 clusters (1/country), 3h resolution, 2030 costs & CO2 budget.
Temporal industry load enabled but all flexibility disabled
(no DSR, no heat DSM, no BEV DSM, no V2G). Custom space heat
reduction factors. Intended as baseline for flex vs no-flex comparison.

Co-authored-by: Cursor <cursoragent@cursor.com>
Standalone config files that bypass the planning_horizons wildcard bug
(PyPSA-Eur PyPSA#2100) by hardcoding all year-dependent parameters.

Key changes vs previous scenario-based approach:
- V2G degradation cost via adjustments (100/60/30 EUR/MWh for 2030/2040/2050)
- "Other chemicals" (petrochemicals) added to industry DSR
- Industry DSR fractions and shift hours escalate with year
- DSR store capital cost decreases over time (5.0/3.0/1.5)
- hydrogen_fuel_cell enabled
- CO2 budget, EV share, heat params hardcoded per year

Made-with: Cursor
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants