add concept for management of spatial resolutions
This commit is contained in:
parent
933e25d8fc
commit
4f9d2f9d5f
@ -19,6 +19,37 @@ from helper import override_component_attrs
|
|||||||
import logging
|
import logging
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
from types import SimpleNamespace
|
||||||
|
spatial = SimpleNamespace()
|
||||||
|
|
||||||
|
|
||||||
|
def define_spatial(nodes):
|
||||||
|
"""
|
||||||
|
Namespace for spatial
|
||||||
|
|
||||||
|
Parameters
|
||||||
|
----------
|
||||||
|
nodes : list-like
|
||||||
|
"""
|
||||||
|
|
||||||
|
global spatial
|
||||||
|
global options
|
||||||
|
|
||||||
|
spatial.nodes = nodes
|
||||||
|
|
||||||
|
spatial.co2 = SimpleNamespace()
|
||||||
|
|
||||||
|
if options["co2_network"]:
|
||||||
|
spatial.co2.nodes = nodes + " co2 stored"
|
||||||
|
spatial.co2.locations = nodes
|
||||||
|
spatial.co2.vents = nodes + " co2 vent"
|
||||||
|
else:
|
||||||
|
spatial.co2.nodes = ["co2 stored"]
|
||||||
|
spatial.co2.locations = "EU"
|
||||||
|
spatial.co2.vents = ["co2 vent"]
|
||||||
|
|
||||||
|
spatial.co2.df = pd.DataFrame(vars(spatial.co2), index=nodes)
|
||||||
|
|
||||||
|
|
||||||
def emission_sectors_from_opts(opts):
|
def emission_sectors_from_opts(opts):
|
||||||
|
|
||||||
@ -310,18 +341,6 @@ def patch_electricity_network(n):
|
|||||||
|
|
||||||
def add_co2_tracking(n, options):
|
def add_co2_tracking(n, options):
|
||||||
|
|
||||||
if options["co2_network"]:
|
|
||||||
nodes = pop_layout.index
|
|
||||||
co2_nodes = nodes + " co2 stored"
|
|
||||||
co2_locations = nodes
|
|
||||||
co2_vents = nodes + " co2 vent"
|
|
||||||
co2_max_sequestration = np.inf
|
|
||||||
else:
|
|
||||||
co2_nodes = ["co2 stored"]
|
|
||||||
co2_locations = "EU"
|
|
||||||
co2_vents = ["co2 vent"]
|
|
||||||
co2_max_sequestration = np.inf # TODO should be nodal sequestration potentials
|
|
||||||
|
|
||||||
# minus sign because opposite to how fossil fuels used:
|
# minus sign because opposite to how fossil fuels used:
|
||||||
# CH4 burning puts CH4 down, atmosphere up
|
# CH4 burning puts CH4 down, atmosphere up
|
||||||
n.add("Carrier", "co2",
|
n.add("Carrier", "co2",
|
||||||
@ -345,18 +364,18 @@ def add_co2_tracking(n, options):
|
|||||||
|
|
||||||
# this tracks CO2 stored, e.g. underground
|
# this tracks CO2 stored, e.g. underground
|
||||||
n.madd("Bus",
|
n.madd("Bus",
|
||||||
co2_nodes,
|
spatial.co2.nodes,
|
||||||
location=co2_locations,
|
location=spatial.co2.locations,
|
||||||
carrier="co2 stored"
|
carrier="co2 stored"
|
||||||
)
|
)
|
||||||
|
|
||||||
n.madd("Store",
|
n.madd("Store",
|
||||||
co2_nodes,
|
spatial.co2.nodes,
|
||||||
e_nom_extendable=True,
|
e_nom_extendable=True,
|
||||||
e_nom_max=co2_max_sequestration,
|
e_nom_max=np.inf,
|
||||||
capital_cost=options['co2_sequestration_cost'],
|
capital_cost=options['co2_sequestration_cost'],
|
||||||
carrier="co2 stored",
|
carrier="co2 stored",
|
||||||
bus=co2_nodes
|
bus=spatial.co2.nodes
|
||||||
)
|
)
|
||||||
|
|
||||||
# TODO if nodally resolved total allowed sequestration needs to
|
# TODO if nodally resolved total allowed sequestration needs to
|
||||||
@ -369,8 +388,8 @@ def add_co2_tracking(n, options):
|
|||||||
if options['co2_vent']:
|
if options['co2_vent']:
|
||||||
|
|
||||||
n.madd("Link",
|
n.madd("Link",
|
||||||
co2_vents,
|
spatial.co2.vents,
|
||||||
bus0=co2_nodes,
|
bus0=spatial.co2.nodes,
|
||||||
bus1="co2 atmosphere",
|
bus1="co2 atmosphere",
|
||||||
carrier="co2 vent",
|
carrier="co2 vent",
|
||||||
efficiency=1.,
|
efficiency=1.,
|
||||||
@ -408,7 +427,7 @@ def add_dac(n, costs):
|
|||||||
locations,
|
locations,
|
||||||
suffix=" DAC",
|
suffix=" DAC",
|
||||||
bus0="co2 atmosphere",
|
bus0="co2 atmosphere",
|
||||||
bus1="co2 stored",
|
bus1=spatial.co2.df.loc[locations, "nodes"].values,
|
||||||
bus2=locations.values,
|
bus2=locations.values,
|
||||||
bus3=heat_buses,
|
bus3=heat_buses,
|
||||||
carrier="DAC",
|
carrier="DAC",
|
||||||
@ -1058,10 +1077,11 @@ def add_storage(n, costs):
|
|||||||
if options['methanation']:
|
if options['methanation']:
|
||||||
|
|
||||||
n.madd("Link",
|
n.madd("Link",
|
||||||
nodes + " Sabatier",
|
spatial.nodes,
|
||||||
|
suffix=" Sabatier",
|
||||||
bus0=nodes + " H2",
|
bus0=nodes + " H2",
|
||||||
bus1="EU gas",
|
bus1="EU gas",
|
||||||
bus2="co2 stored",
|
bus2=spatial.co2.nodes,
|
||||||
p_nom_extendable=True,
|
p_nom_extendable=True,
|
||||||
carrier="Sabatier",
|
carrier="Sabatier",
|
||||||
efficiency=costs.at["methanation", "efficiency"],
|
efficiency=costs.at["methanation", "efficiency"],
|
||||||
@ -1073,10 +1093,11 @@ def add_storage(n, costs):
|
|||||||
if options['helmeth']:
|
if options['helmeth']:
|
||||||
|
|
||||||
n.madd("Link",
|
n.madd("Link",
|
||||||
nodes + " helmeth",
|
spatial.nodes,
|
||||||
|
suffix=" helmeth",
|
||||||
bus0=nodes,
|
bus0=nodes,
|
||||||
bus1="EU gas",
|
bus1="EU gas",
|
||||||
bus2="co2 stored",
|
bus2=spatial.co2.nodes,
|
||||||
carrier="helmeth",
|
carrier="helmeth",
|
||||||
p_nom_extendable=True,
|
p_nom_extendable=True,
|
||||||
efficiency=costs.at["helmeth", "efficiency"],
|
efficiency=costs.at["helmeth", "efficiency"],
|
||||||
@ -1089,11 +1110,12 @@ def add_storage(n, costs):
|
|||||||
if options['SMR']:
|
if options['SMR']:
|
||||||
|
|
||||||
n.madd("Link",
|
n.madd("Link",
|
||||||
nodes + " SMR CC",
|
spatial.nodes,
|
||||||
|
suffix=" SMR CC",
|
||||||
bus0="EU gas",
|
bus0="EU gas",
|
||||||
bus1=nodes + " H2",
|
bus1=nodes + " H2",
|
||||||
bus2="co2 atmosphere",
|
bus2="co2 atmosphere",
|
||||||
bus3="co2 stored",
|
bus3=spatial.co2.nodes,
|
||||||
p_nom_extendable=True,
|
p_nom_extendable=True,
|
||||||
carrier="SMR CC",
|
carrier="SMR CC",
|
||||||
efficiency=costs.at["SMR CC", "efficiency"],
|
efficiency=costs.at["SMR CC", "efficiency"],
|
||||||
@ -1442,7 +1464,7 @@ def add_heat(n, costs):
|
|||||||
bus1=nodes[name],
|
bus1=nodes[name],
|
||||||
bus2=nodes[name] + " urban central heat",
|
bus2=nodes[name] + " urban central heat",
|
||||||
bus3="co2 atmosphere",
|
bus3="co2 atmosphere",
|
||||||
bus4="co2 stored",
|
bus4=spatial.co2.df.loc[nodes[name], "nodes"].values,
|
||||||
carrier="urban central gas CHP CC",
|
carrier="urban central gas CHP CC",
|
||||||
p_nom_extendable=True,
|
p_nom_extendable=True,
|
||||||
capital_cost=costs.at['central gas CHP', 'fixed']*costs.at['central gas CHP', 'efficiency'] + costs.at['biomass CHP capture', 'fixed']*costs.at['gas', 'CO2 intensity'],
|
capital_cost=costs.at['central gas CHP', 'fixed']*costs.at['central gas CHP', 'efficiency'] + costs.at['biomass CHP capture', 'fixed']*costs.at['gas', 'CO2 intensity'],
|
||||||
@ -1675,7 +1697,7 @@ def add_biomass(n, costs):
|
|||||||
bus1=urban_central,
|
bus1=urban_central,
|
||||||
bus2=urban_central + " urban central heat",
|
bus2=urban_central + " urban central heat",
|
||||||
bus3="co2 atmosphere",
|
bus3="co2 atmosphere",
|
||||||
bus4="co2 stored",
|
bus4=spatial.co2.df.loc[urban_central, "nodes"].values,
|
||||||
carrier="urban central solid biomass CHP CC",
|
carrier="urban central solid biomass CHP CC",
|
||||||
p_nom_extendable=True,
|
p_nom_extendable=True,
|
||||||
capital_cost=costs.at[key, 'fixed'] * costs.at[key, 'efficiency'] + costs.at['biomass CHP capture', 'fixed'] * costs.at['solid biomass', 'CO2 intensity'],
|
capital_cost=costs.at[key, 'fixed'] * costs.at[key, 'efficiency'] + costs.at['biomass CHP capture', 'fixed'] * costs.at['solid biomass', 'CO2 intensity'],
|
||||||
@ -1726,7 +1748,7 @@ def add_industry(n, costs):
|
|||||||
bus0="EU solid biomass",
|
bus0="EU solid biomass",
|
||||||
bus1="solid biomass for industry",
|
bus1="solid biomass for industry",
|
||||||
bus2="co2 atmosphere",
|
bus2="co2 atmosphere",
|
||||||
bus3="co2 stored",
|
bus3="co2 stored", # TODO co2: where to allocate if co2 is spatially resolved?
|
||||||
carrier="solid biomass for industry CC",
|
carrier="solid biomass for industry CC",
|
||||||
p_nom_extendable=True,
|
p_nom_extendable=True,
|
||||||
capital_cost=costs.at["cement capture", "fixed"] * costs.at['solid biomass', 'CO2 intensity'],
|
capital_cost=costs.at["cement capture", "fixed"] * costs.at['solid biomass', 'CO2 intensity'],
|
||||||
@ -1764,7 +1786,7 @@ def add_industry(n, costs):
|
|||||||
bus0="EU gas",
|
bus0="EU gas",
|
||||||
bus1="gas for industry",
|
bus1="gas for industry",
|
||||||
bus2="co2 atmosphere",
|
bus2="co2 atmosphere",
|
||||||
bus3="co2 stored",
|
bus3="co2 stored", # TODO co2: where to allocate if co2 is spatially resolved?
|
||||||
carrier="gas for industry CC",
|
carrier="gas for industry CC",
|
||||||
p_nom_extendable=True,
|
p_nom_extendable=True,
|
||||||
capital_cost=costs.at["cement capture", "fixed"] * costs.at['gas', 'CO2 intensity'],
|
capital_cost=costs.at["cement capture", "fixed"] * costs.at['gas', 'CO2 intensity'],
|
||||||
@ -1847,7 +1869,7 @@ def add_industry(n, costs):
|
|||||||
nodes + " Fischer-Tropsch",
|
nodes + " Fischer-Tropsch",
|
||||||
bus0=nodes + " H2",
|
bus0=nodes + " H2",
|
||||||
bus1="EU oil",
|
bus1="EU oil",
|
||||||
bus2="co2 stored",
|
bus2=spatial.co2.nodes,
|
||||||
carrier="Fischer-Tropsch",
|
carrier="Fischer-Tropsch",
|
||||||
efficiency=costs.at["Fischer-Tropsch", 'efficiency'],
|
efficiency=costs.at["Fischer-Tropsch", 'efficiency'],
|
||||||
capital_cost=costs.at["Fischer-Tropsch", 'fixed'],
|
capital_cost=costs.at["Fischer-Tropsch", 'fixed'],
|
||||||
@ -1940,7 +1962,7 @@ def add_industry(n, costs):
|
|||||||
"process emissions CC",
|
"process emissions CC",
|
||||||
bus0="process emissions",
|
bus0="process emissions",
|
||||||
bus1="co2 atmosphere",
|
bus1="co2 atmosphere",
|
||||||
bus2="co2 stored",
|
bus2="co2 stored", # TODO co2: where to allocate if co2 is spatially resolved?
|
||||||
carrier="process emissions CC",
|
carrier="process emissions CC",
|
||||||
p_nom_extendable=True,
|
p_nom_extendable=True,
|
||||||
capital_cost=costs.at["cement capture", "fixed"],
|
capital_cost=costs.at["cement capture", "fixed"],
|
||||||
|
Loading…
Reference in New Issue
Block a user