make sequestration options configurable
This commit is contained in:
parent
6b8e69cf81
commit
ccde2e7f93
4
.gitignore
vendored
4
.gitignore
vendored
@ -51,3 +51,7 @@ doc/_build
|
|||||||
*.xls
|
*.xls
|
||||||
|
|
||||||
*.geojson
|
*.geojson
|
||||||
|
|
||||||
|
*.ipynb
|
||||||
|
|
||||||
|
data/costs_*
|
@ -288,7 +288,7 @@ else:
|
|||||||
build_biomass_transport_costs_output = {}
|
build_biomass_transport_costs_output = {}
|
||||||
|
|
||||||
|
|
||||||
if config["sector"].get("sequestration_potential", False):
|
if config["sector"]["regional_co2_sequestration_potential"]["enable"]:
|
||||||
rule build_sequestration_potentials:
|
rule build_sequestration_potentials:
|
||||||
input:
|
input:
|
||||||
sequestration_potential=HTTP.remote("https://raw.githubusercontent.com/ericzhou571/Co2Storage/main/resources/complete_map_2020_unit_Mt.geojson", keep_local=True),
|
sequestration_potential=HTTP.remote("https://raw.githubusercontent.com/ericzhou571/Co2Storage/main/resources/complete_map_2020_unit_Mt.geojson", keep_local=True),
|
||||||
|
@ -250,8 +250,15 @@ sector:
|
|||||||
coal_cc: false
|
coal_cc: false
|
||||||
dac: true
|
dac: true
|
||||||
co2_vent: false
|
co2_vent: false
|
||||||
|
allam_cycle: false
|
||||||
SMR: true
|
SMR: true
|
||||||
sequestration_potential: true # geological co2 storage potential
|
regional_co2_sequestration_potential:
|
||||||
|
enable: false # enable regionally resolved geological co2 storage potential
|
||||||
|
attribute: 'conservative estimate Mt'
|
||||||
|
include_onshore: false # include onshore sequestration potentials
|
||||||
|
min_size: 3 # Gt, sites with lower potential will be excluded
|
||||||
|
max_size: 25 # Gt, max sequestration potential for any one site, TODO research suitable value
|
||||||
|
years_of_storage: 25 # years until potential exhausted at optimised annual rate
|
||||||
co2_sequestration_potential: 200 #MtCO2/a sequestration potential for Europe
|
co2_sequestration_potential: 200 #MtCO2/a sequestration potential for Europe
|
||||||
co2_sequestration_cost: 10 #EUR/tCO2 for sequestration of CO2
|
co2_sequestration_cost: 10 #EUR/tCO2 for sequestration of CO2
|
||||||
co2_spatial: false
|
co2_spatial: false
|
||||||
@ -281,8 +288,8 @@ sector:
|
|||||||
gas_network_connectivity_upgrade: 1 # https://networkx.org/documentation/stable/reference/algorithms/generated/networkx.algorithms.connectivity.edge_augmentation.k_edge_augmentation.html#networkx.algorithms.connectivity.edge_augmentation.k_edge_augmentation
|
gas_network_connectivity_upgrade: 1 # https://networkx.org/documentation/stable/reference/algorithms/generated/networkx.algorithms.connectivity.edge_augmentation.k_edge_augmentation.html#networkx.algorithms.connectivity.edge_augmentation.k_edge_augmentation
|
||||||
gas_distribution_grid: true
|
gas_distribution_grid: true
|
||||||
gas_distribution_grid_cost_factor: 1.0 #multiplies cost in data/costs.csv
|
gas_distribution_grid_cost_factor: 1.0 #multiplies cost in data/costs.csv
|
||||||
biomass_spatial: false # biomass transport between nodes
|
biomass_spatial: false # regionally resolve biomass (e.g. potentials)
|
||||||
biomass_transport: false # biomass transport between nodes
|
biomass_transport: false # allow transport of solid biomass between nodes
|
||||||
conventional_generation: # generator : carrier
|
conventional_generation: # generator : carrier
|
||||||
OCGT: gas
|
OCGT: gas
|
||||||
biomass_to_liquid: false
|
biomass_to_liquid: false
|
||||||
|
@ -27,22 +27,17 @@ if __name__ == "__main__":
|
|||||||
clusters="181"
|
clusters="181"
|
||||||
)
|
)
|
||||||
|
|
||||||
# TODO move to config.yaml
|
cf = snakemake.config["sector"]["regional_co2_sequestration_potential"]
|
||||||
threshold = 3
|
|
||||||
include_onshore = False
|
|
||||||
|
|
||||||
gdf = gpd.read_file(snakemake.input.sequestration_potential[0])
|
gdf = gpd.read_file(snakemake.input.sequestration_potential[0])
|
||||||
|
|
||||||
regions = gpd.read_file(snakemake.input.regions_offshore)
|
regions = gpd.read_file(snakemake.input.regions_offshore)
|
||||||
if include_onshore:
|
if cf["include_onshore"]:
|
||||||
onregions = gpd.read_file(snakemake.input.regions_onshore)
|
onregions = gpd.read_file(snakemake.input.regions_onshore)
|
||||||
regions = pd.concat([regions, onregions]).dissolve(by='name').reset_index()
|
regions = pd.concat([regions, onregions]).dissolve(by='name').reset_index()
|
||||||
|
|
||||||
attr = snakemake.config['sector']["sequestration_potential"]
|
s = allocate_sequestration_potential(gdf, regions, attr=cf["attribute"], threshold=cf["min_size"])
|
||||||
kwargs = dict(attr=attr, threshold=threshold) if isinstance(attr, str) else {}
|
|
||||||
|
|
||||||
s = allocate_sequestration_potential(gdf, regions, **kwargs)
|
s = s.where(s>cf["min_size"]).dropna()
|
||||||
|
|
||||||
s = s.where(s>threshold).dropna()
|
|
||||||
|
|
||||||
s.to_csv(snakemake.output.sequestration_potential)
|
s.to_csv(snakemake.output.sequestration_potential)
|
||||||
|
@ -517,10 +517,9 @@ def add_co2_tracking(n, options):
|
|||||||
unit="t_co2"
|
unit="t_co2"
|
||||||
)
|
)
|
||||||
|
|
||||||
if options["sequestration_potential"]:
|
if options["regional_co2_sequestration_potential"]["enable"]:
|
||||||
# TODO make configurable options
|
upper_limit = options["regional_co2_sequestration_potential"]["max_size"] * 1e3 # Mt
|
||||||
upper_limit = 25000 # Mt
|
annualiser = options["regional_co2_sequestration_potential"]["years_of_storage"]
|
||||||
annualiser = 25 # TODO research suitable value
|
|
||||||
e_nom_max = pd.read_csv(snakemake.input.sequestration_potential, index_col=0).squeeze()
|
e_nom_max = pd.read_csv(snakemake.input.sequestration_potential, index_col=0).squeeze()
|
||||||
e_nom_max = e_nom_max.reindex(spatial.co2.locations).fillna(0.).clip(upper=upper_limit).mul(1e6) / annualiser # t
|
e_nom_max = e_nom_max.reindex(spatial.co2.locations).fillna(0.).clip(upper=upper_limit).mul(1e6) / annualiser # t
|
||||||
e_nom_max = e_nom_max.rename(index=lambda x: x + " co2 stored")
|
e_nom_max = e_nom_max.rename(index=lambda x: x + " co2 stored")
|
||||||
@ -570,12 +569,13 @@ def add_co2_network(n, costs):
|
|||||||
|
|
||||||
def add_allam(n, costs):
|
def add_allam(n, costs):
|
||||||
|
|
||||||
logger.info("Adding Allam cycle generators")
|
logger.info("Adding Allam cycle gas power plants.")
|
||||||
|
|
||||||
nodes = pop_layout.index
|
nodes = pop_layout.index
|
||||||
|
|
||||||
n.madd("Link",
|
n.madd("Link",
|
||||||
nodes + " allam",
|
nodes,
|
||||||
|
suffix=" allam",
|
||||||
bus0=spatial.gas.df.loc[nodes, "nodes"].values,
|
bus0=spatial.gas.df.loc[nodes, "nodes"].values,
|
||||||
bus1=nodes,
|
bus1=nodes,
|
||||||
bus2=spatial.co2.df.loc[nodes, "nodes"].values,
|
bus2=spatial.co2.df.loc[nodes, "nodes"].values,
|
||||||
@ -2923,6 +2923,8 @@ if __name__ == "__main__":
|
|||||||
|
|
||||||
if options["co2network"]:
|
if options["co2network"]:
|
||||||
add_co2_network(n, costs)
|
add_co2_network(n, costs)
|
||||||
|
|
||||||
|
if options["allam_cycle"]:
|
||||||
add_allam(n, costs)
|
add_allam(n, costs)
|
||||||
|
|
||||||
solver_name = snakemake.config["solving"]["solver"]["name"]
|
solver_name = snakemake.config["solving"]["solver"]["name"]
|
||||||
|
Loading…
Reference in New Issue
Block a user