Skip to content

Commit

Permalink
Bugfix: limit number of vehicles participating in V2G by dsm rate (#1423
Browse files Browse the repository at this point in the history
)

Moreover, V2G is now only enabled if demand-side-management (DSM) is also
enabled; V2G had no effect without DSM anyway.

Finally, rename the `bev_availability` option to
`bev_dsm_availability` to avoid confusion with time-dependent BEV
charge/discharge availability profiles, which are also referred to as
`bev_availability` elsewhere.
  • Loading branch information
koen-vg authored Nov 15, 2024
1 parent ef748f9 commit c45591f
Show file tree
Hide file tree
Showing 4 changed files with 20 additions and 18 deletions.
2 changes: 1 addition & 1 deletion config/config.default.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -499,7 +499,7 @@ sector:
EV_lower_degree_factor: 0.98
EV_upper_degree_factor: 0.63
bev_dsm: true
bev_availability: 0.5
bev_dsm_availability: 0.5
bev_energy: 0.05
bev_charge_efficiency: 0.9
bev_charge_rate: 0.011
Expand Down
4 changes: 2 additions & 2 deletions doc/configtables/sector.csv
Original file line number Diff line number Diff line change
Expand Up @@ -40,13 +40,13 @@ EV_lower_degree_factor,--,float,Share increase in energy demand in electric vehi
EV_upper_degree_factor,--,float,Share increase in energy demand in electric vehicles (EV) for each degree difference between the hot environment and the maximum temperature.
bev_dsm,--,"{true, false}",Add the option for battery electric vehicles (BEV) to participate in demand-side management (DSM)
,,,
bev_availability,--,float,The share for battery electric vehicles (BEV) that are able to do demand side management (DSM)
bev_dsm_availability,--,float,The share for battery electric vehicles (BEV) that are able to do demand side management (DSM)
bev_energy,--,float,The average size of battery electric vehicles (BEV) in MWh
bev_charge_efficiency,--,float,Battery electric vehicles (BEV) charge and discharge efficiency
bev_charge_rate,MWh,float,The power consumption for one electric vehicle (EV) in MWh. Value derived from 3-phase charger with 11 kW.
bev_avail_max,--,float,The maximum share plugged-in availability for passenger electric vehicles.
bev_avail_mean,--,float,The average share plugged-in availability for passenger electric vehicles.
v2g,--,"{true, false}",Allows feed-in to grid from EV battery
v2g,--,"{true, false}","Allows feed-in to grid from EV battery. This is only enabled if BEV demand-side management is enabled, and the share of vehicles participating is V2G is given by `bev_dsm_availability`."
land_transport_fuel_cell _share,--,Dictionary with planning horizons as keys.,The share of vehicles that uses fuel cells in a given year
land_transport_electric _share,--,Dictionary with planning horizons as keys.,The share of vehicles that uses electric vehicles (EV) in a given year
land_transport_ice _share,--,Dictionary with planning horizons as keys.,The share of vehicles that uses internal combustion engines (ICE) in a given year. What is not EV or FCEV is oil-fuelled ICE.
Expand Down
2 changes: 2 additions & 0 deletions doc/release_notes.rst
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,8 @@ Upcoming Release

* Updated osm-prebuilt base network to version 0.5, for changelog, see https://zenodo.org/records/13981528

* Bugfix: vehicle-to-grid dispatch capacity is now limited by the fraction of vehicles participating in demand-side-management, halving the dispatch capacity under the default demand-side management participation rate of 0.5.


PyPSA-Eur 0.13.0 (13th September 2024)
======================================
Expand Down
30 changes: 15 additions & 15 deletions scripts/prepare_sector_network.py
Original file line number Diff line number Diff line change
Expand Up @@ -1831,25 +1831,11 @@ def add_EVs(
efficiency=options["bev_charge_efficiency"],
)

if options["v2g"]:
n.add(
"Link",
spatial.nodes,
suffix=" V2G",
bus1=spatial.nodes,
bus0=spatial.nodes + " EV battery",
p_nom=p_nom,
carrier="V2G",
p_max_pu=avail_profile.loc[n.snapshots, spatial.nodes],
lifetime=1,
efficiency=options["bev_charge_efficiency"],
)

if options["bev_dsm"]:
e_nom = (
number_cars
* options["bev_energy"]
* options["bev_availability"]
* options["bev_dsm_availability"]
* electric_share
)

Expand All @@ -1865,6 +1851,20 @@ def add_EVs(
e_min_pu=dsm_profile.loc[n.snapshots, spatial.nodes],
)

if options["v2g"]:
n.add(
"Link",
spatial.nodes,
suffix=" V2G",
bus1=spatial.nodes,
bus0=spatial.nodes + " EV battery",
p_nom=p_nom * options["bev_dsm_availability"],
carrier="V2G",
p_max_pu=avail_profile.loc[n.snapshots, spatial.nodes],
lifetime=1,
efficiency=options["bev_charge_efficiency"],
)


def add_fuel_cell_cars(n, p_set, fuel_cell_share, temperature):
car_efficiency = options["transport_fuel_cell_efficiency"]
Expand Down

0 comments on commit c45591f

Please sign in to comment.