Merge pull request #1207 from p-glaum/add_methanol_techs
Add methanol techs
This commit is contained in:
commit
6f39dc7da1
@ -605,7 +605,6 @@ sector:
|
||||
hydrogen_turbine: false
|
||||
SMR: true
|
||||
SMR_cc: true
|
||||
regional_methanol_demand: false
|
||||
regional_oil_demand: false
|
||||
regional_coal_demand: false
|
||||
regional_co2_sequestration_potential:
|
||||
@ -638,6 +637,19 @@ sector:
|
||||
# - onshore # more than 50 km from sea
|
||||
- nearshore # within 50 km of sea
|
||||
# - offshore
|
||||
methanol:
|
||||
regional_methanol_demand: false
|
||||
methanol_reforming: false
|
||||
methanol_reforming_cc: false
|
||||
methanol_to_kerosene: false
|
||||
methanol_to_olefins: false
|
||||
methanol_to_power:
|
||||
ccgt: false
|
||||
ccgt_cc: false
|
||||
ocgt: false
|
||||
allam: false
|
||||
biomass_to_methanol: false
|
||||
biomass_to_methanol_cc: false
|
||||
ammonia: false
|
||||
min_part_load_fischer_tropsch: 0.5
|
||||
min_part_load_methanolisation: 0.3
|
||||
@ -803,7 +815,7 @@ industry:
|
||||
# docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#costs
|
||||
costs:
|
||||
year: 2030
|
||||
version: v0.9.1
|
||||
version: v0.9.2
|
||||
social_discountrate: 0.02
|
||||
fill_values:
|
||||
FOM: 0
|
||||
@ -1254,8 +1266,19 @@ plotting:
|
||||
liquid: '#25c49a'
|
||||
kerosene for aviation: '#a1ffe6'
|
||||
naphtha for industry: '#57ebc4'
|
||||
methanolisation: '#83d6d5'
|
||||
methanol: '#468c8b'
|
||||
methanol-to-kerosene: '#C98468'
|
||||
methanol-to-olefins/aromatics: '#FFA07A'
|
||||
Methanol steam reforming: '#FFBF00'
|
||||
Methanol steam reforming CC: '#A2EA8A'
|
||||
methanolisation: '#00FFBF'
|
||||
biomass-to-methanol: '#EAD28A'
|
||||
biomass-to-methanol CC: '#EADBAD'
|
||||
allam methanol: '#B98F76'
|
||||
CCGT methanol: '#B98F76'
|
||||
CCGT methanol CC: '#B98F76'
|
||||
OCGT methanol: '#B98F76'
|
||||
methanol: '#FF7B00'
|
||||
methanol transport: '#FF7B00'
|
||||
shipping methanol: '#468c8b'
|
||||
industry methanol: '#468c8b'
|
||||
# co2
|
||||
|
@ -96,7 +96,7 @@ chp,--,"{true, false}",Add option for using Combined Heat and Power (CHP)
|
||||
micro_chp,--,"{true, false}",Add option for using Combined Heat and Power (CHP) for decentral areas.
|
||||
solar_thermal,--,"{true, false}",Add option for using solar thermal to generate heat.
|
||||
solar_cf_correction,--,float,The correction factor for the value provided by the solar thermal profile calculations
|
||||
marginal_cost_storage,currency/MWh ,float,The marginal cost of discharging batteries in distributed grids
|
||||
marginal_cost_storage,"currency/MWh ",float,The marginal cost of discharging batteries in distributed grids
|
||||
methanation,--,"{true, false}",Add option for transforming hydrogen and CO2 into methane using methanation.
|
||||
coal_cc,--,"{true, false}",Add option for coal CHPs with carbon capture
|
||||
dac,--,"{true, false}",Add option for Direct Air Capture (DAC)
|
||||
@ -106,7 +106,6 @@ hydrogen_fuel_cell,--,"{true, false}",Add option to include hydrogen fuel cell f
|
||||
hydrogen_turbine,--,"{true, false}",Add option to include hydrogen turbine for re-electrification. Assuming OCGT technology costs
|
||||
SMR,--,"{true, false}",Add option for transforming natural gas into hydrogen and CO2 using Steam Methane Reforming (SMR)
|
||||
SMR CC,--,"{true, false}",Add option for transforming natural gas into hydrogen and CO2 using Steam Methane Reforming (SMR) and Carbon Capture (CC)
|
||||
regional_methanol_demand,--,"{true, false}",Spatially resolve methanol demand. Set to true if regional CO2 constraints needed.
|
||||
regional_oil_demand,--,"{true, false}",Spatially resolve oil demand. Set to true if regional CO2 constraints needed.
|
||||
regional_co2 _sequestration_potential,,,
|
||||
-- enable,--,"{true, false}",Add option for regionally-resolved geological carbon dioxide sequestration potentials based on `CO2StoP <https://setis.ec.europa.eu/european-co2-storage-database_en>`_.
|
||||
@ -127,6 +126,18 @@ cc_fraction,--,float,The default fraction of CO2 captured with post-combustion c
|
||||
hydrogen_underground _storage,--,"{true, false}",Add options for storing hydrogen underground. Storage potential depends regionally.
|
||||
hydrogen_underground _storage_locations,,"{onshore, nearshore, offshore}","The location where hydrogen underground storage can be located. Onshore, nearshore, offshore means it must be located more than 50 km away from the sea, within 50 km of the sea, or within the sea itself respectively."
|
||||
,,,
|
||||
methanol,--,--,Add methanol as carrrier and add enabled methnol technologies
|
||||
-- regional_methanol_demand,--,"{true, false}",Spatially resolve methanol demand. Set to true if regional CO2 constraints needed.
|
||||
-- methanol_reforming,--,"{true, false}"," Add methanol reforming"
|
||||
-- methanol_reforming_cc,--,"{true, false}"," Add methanol reforming with carbon capture"
|
||||
-- methanol_to_kerosene,--,"{true, false}"," Add methanol to kerosene"
|
||||
-- methanol_to_olefins,--,"{true, false}"," Add methanol to olefins"
|
||||
-- methanol_to_power,--,--," Add different methanol to power technologies"
|
||||
-- -- ccgt,--,"{true, false}"," Add combined cycle gas turbine (CCGT) using methanol"
|
||||
-- -- ccgt_cc,--,"{true, false}"," Add combined cycle gas turbine (CCGT) with carbon capture using methanol"
|
||||
-- -- ocgt,--,"{true, false}"," Add open cycle gas turbine (OCGT) using methanol"
|
||||
-- -- allam,--,"{true, false}"," Add Allam cycle gas power plants using methanol"
|
||||
,,,
|
||||
ammonia,--,"{true, false, regional}","Add ammonia as a carrrier. It can be either true (copperplated NH3), false (no NH3 carrier) or ""regional"" (regionalised NH3 without network)"
|
||||
min_part_load_fischer _tropsch,per unit of p_nom ,float,The minimum unit dispatch (``p_min_pu``) for the Fischer-Tropsch process
|
||||
min_part_load _methanolisation,per unit of p_nom ,float,The minimum unit dispatch (``p_min_pu``) for the methanolisation process
|
||||
@ -148,7 +159,7 @@ H2_network,--,"{true, false}",Add option for new hydrogen pipelines
|
||||
gas_network,--,"{true, false}","Add existing natural gas infrastructure, incl. LNG terminals, production and entry-points. The existing gas network is added with a lossless transport model. A length-weighted `k-edge augmentation algorithm <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>`_ can be run to add new candidate gas pipelines such that all regions of the model can be connected to the gas network. When activated, all the gas demands are regionally disaggregated as well."
|
||||
H2_retrofit,--,"{true, false}",Add option for retrofiting existing pipelines to transport hydrogen.
|
||||
H2_retrofit_capacity _per_CH4,--,float,"The ratio for H2 capacity per original CH4 capacity of retrofitted pipelines. The `European Hydrogen Backbone (April, 2020) p.15 <https://gasforclimate2050.eu/wp-content/uploads/2020/07/2020_European-Hydrogen-Backbone_Report.pdf>`_ 60% of original natural gas capacity could be used in cost-optimal case as H2 capacity."
|
||||
gas_network_connectivity _upgrade ,--,float,The number of desired edge connectivity (k) in the length-weighted `k-edge augmentation algorithm <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>`_ used for the gas network
|
||||
"gas_network_connectivity _upgrade ",--,float,The number of desired edge connectivity (k) in the length-weighted `k-edge augmentation algorithm <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>`_ used for the gas network
|
||||
gas_distribution_grid,--,"{true, false}",Add a gas distribution grid
|
||||
gas_distribution_grid _cost_factor,,,Multiplier for the investment cost of the gas distribution grid
|
||||
,,,
|
||||
|
|
@ -10,9 +10,13 @@ Release Notes
|
||||
|
||||
.. Upcoming Release
|
||||
|
||||
|
||||
* Add technology options for methanol, like electricity production from methanol, biomass to methanol, methanol to kerosene, ...
|
||||
|
||||
* Change the heating demand from final energy which includes losses in legacy equipment to thermal energy service based on JRC-IDEES. Efficiencies of existing heating capacities are lowered according to the conversion of final energy to thermal energy service. For overnight scenarios or future planning horizon this change leads to a reduction in heat supply.
|
||||
|
||||
* Updated district heating supply temperatures based on `Euroheat's DHC Market Outlook 2024<https://api.euroheat.org/uploads/Market_Outlook_2024_beeecd62d4.pdf>`__ and `AGFW-Hauptbericht 2022 <https://www.agfw.de/securedl/sdl-eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE3MjU2MjI2MTUsImV4cCI6MTcyNTcxMjYxNSwidXNlciI6MCwiZ3JvdXBzIjpbMCwtMV0sImZpbGUiOiJmaWxlYWRtaW4vdXNlcl91cGxvYWQvWmFobGVuX3VuZF9TdGF0aXN0aWtlbi9IYXVwdGJlcmljaHRfMjAyMi9BR0ZXX0hhdXB0YmVyaWNodF8yMDIyLnBkZiIsInBhZ2UiOjQzNn0.Bhma3PKg9uJnC57Ixi2p9STW5-II9VXPTDXS544M208/AGFW_Hauptbericht_2022.pdf>`__. `min_forward_temperature` and `return_temperature` (not given by Euroheat) are extrapolated based on German values.
|
||||
|
||||
* Made the overdimensioning factor for heating systems specific for central/decentral heating, defaults to no overdimensionining for central heating and no changes to decentral heating compared to previous version.
|
||||
|
||||
* bugfix: The carrier of stores was silently overwritten by their bus_carrier as a side effect when building the co2 constraints
|
||||
|
@ -1088,6 +1088,9 @@ rule prepare_sector_network:
|
||||
hourly_heat_demand_total=resources(
|
||||
"hourly_heat_demand_total_elec_s{simpl}_{clusters}.nc"
|
||||
),
|
||||
industrial_production=resources(
|
||||
"industrial_production_elec_s{simpl}_{clusters}_{planning_horizons}.csv"
|
||||
),
|
||||
district_heat_share=resources(
|
||||
"district_heat_share_elec_s{simpl}_{clusters}_{planning_horizons}.csv"
|
||||
),
|
||||
|
@ -157,7 +157,7 @@ def define_spatial(nodes, options):
|
||||
spatial.methanol.nodes = ["EU methanol"]
|
||||
spatial.methanol.locations = ["EU"]
|
||||
|
||||
if options["regional_methanol_demand"]:
|
||||
if options["methanol"]["regional_methanol_demand"]:
|
||||
spatial.methanol.demand_locations = nodes
|
||||
spatial.methanol.industry = nodes + " industry methanol"
|
||||
spatial.methanol.shipping = nodes + " shipping methanol"
|
||||
@ -819,11 +819,315 @@ def add_allam(n, costs):
|
||||
carrier="allam",
|
||||
p_nom_extendable=True,
|
||||
# TODO: add costs to technology-data
|
||||
capital_cost=0.6 * 1.5e6 * 0.1, # efficiency * EUR/MW * annuity
|
||||
marginal_cost=2,
|
||||
efficiency=0.6,
|
||||
capital_cost=costs.at["allam", "fixed"] * costs.at["allam", "efficiency"],
|
||||
marginal_cost=costs.at["allam", "VOM"] * costs.at["allam", "efficiency"],
|
||||
efficiency=costs.at["allam", "efficiency"],
|
||||
efficiency2=costs.at["gas", "CO2 intensity"],
|
||||
lifetime=30.0,
|
||||
lifetime=costs.at["allam", "lifetime"],
|
||||
)
|
||||
|
||||
|
||||
def add_biomass_to_methanol(n, costs):
|
||||
|
||||
n.madd(
|
||||
"Link",
|
||||
spatial.biomass.nodes,
|
||||
suffix=" biomass-to-methanol",
|
||||
bus0=spatial.biomass.nodes,
|
||||
bus1=spatial.methanol.nodes,
|
||||
bus2="co2 atmosphere",
|
||||
carrier="biomass-to-methanol",
|
||||
lifetime=costs.at["biomass-to-methanol", "lifetime"],
|
||||
efficiency=costs.at["biomass-to-methanol", "efficiency"],
|
||||
efficiency2=-costs.at["solid biomass", "CO2 intensity"]
|
||||
+ costs.at["biomass-to-methanol", "CO2 stored"],
|
||||
p_nom_extendable=True,
|
||||
capital_cost=costs.at["biomass-to-methanol", "fixed"]
|
||||
/ costs.at["biomass-to-methanol", "efficiency"],
|
||||
marginal_cost=costs.loc["biomass-to-methanol", "VOM"]
|
||||
/ costs.at["biomass-to-methanol", "efficiency"],
|
||||
)
|
||||
|
||||
|
||||
def add_biomass_to_methanol_cc(n, costs):
|
||||
|
||||
n.madd(
|
||||
"Link",
|
||||
spatial.biomass.nodes,
|
||||
suffix=" biomass-to-methanol CC",
|
||||
bus0=spatial.biomass.nodes,
|
||||
bus1=spatial.methanol.nodes,
|
||||
bus2="co2 atmosphere",
|
||||
bus3=spatial.co2.nodes,
|
||||
carrier="biomass-to-methanol CC",
|
||||
lifetime=costs.at["biomass-to-methanol", "lifetime"],
|
||||
efficiency=costs.at["biomass-to-methanol", "efficiency"],
|
||||
efficiency2=-costs.at["solid biomass", "CO2 intensity"]
|
||||
+ costs.at["biomass-to-methanol", "CO2 stored"]
|
||||
* (1 - costs.at["biomass-to-methanol", "capture rate"]),
|
||||
efficiency3=costs.at["biomass-to-methanol", "CO2 stored"]
|
||||
* costs.at["biomass-to-methanol", "capture rate"],
|
||||
p_nom_extendable=True,
|
||||
capital_cost=costs.at["biomass-to-methanol", "fixed"]
|
||||
/ costs.at["biomass-to-methanol", "efficiency"]
|
||||
+ costs.at["biomass CHP capture", "fixed"]
|
||||
* costs.at["biomass-to-methanol", "CO2 stored"],
|
||||
marginal_cost=costs.loc["biomass-to-methanol", "VOM"]
|
||||
/ costs.at["biomass-to-methanol", "efficiency"],
|
||||
)
|
||||
|
||||
|
||||
def add_methanol_to_power(n, costs, types={}):
|
||||
# TODO: add costs to technology-data
|
||||
|
||||
nodes = pop_layout.index
|
||||
|
||||
if types["allam"]:
|
||||
logger.info("Adding Allam cycle methanol power plants.")
|
||||
|
||||
n.madd(
|
||||
"Link",
|
||||
nodes,
|
||||
suffix=" allam methanol",
|
||||
bus0=spatial.methanol.nodes,
|
||||
bus1=nodes,
|
||||
bus2=spatial.co2.df.loc[nodes, "nodes"].values,
|
||||
bus3="co2 atmosphere",
|
||||
carrier="allam methanol",
|
||||
p_nom_extendable=True,
|
||||
capital_cost=costs.at["allam", "fixed"] * costs.at["allam", "efficiency"],
|
||||
marginal_cost=costs.at["allam", "VOM"] * costs.at["allam", "efficiency"],
|
||||
efficiency=costs.at["allam", "efficiency"],
|
||||
efficiency2=0.98 * costs.at["methanolisation", "carbondioxide-input"],
|
||||
efficiency3=0.02 * costs.at["methanolisation", "carbondioxide-input"],
|
||||
lifetime=25,
|
||||
)
|
||||
|
||||
if types["ccgt"]:
|
||||
logger.info("Adding methanol CCGT power plants.")
|
||||
|
||||
# efficiency * EUR/MW * (annuity + FOM)
|
||||
capital_cost = costs.at["CCGT", "efficiency"] * costs.at["CCGT", "fixed"]
|
||||
|
||||
n.madd(
|
||||
"Link",
|
||||
nodes,
|
||||
suffix=" CCGT methanol",
|
||||
bus0=spatial.methanol.nodes,
|
||||
bus1=nodes,
|
||||
bus2="co2 atmosphere",
|
||||
carrier="CCGT methanol",
|
||||
p_nom_extendable=True,
|
||||
capital_cost=capital_cost,
|
||||
marginal_cost=costs.at["CCGT", "VOM"],
|
||||
efficiency=costs.at["CCGT", "efficiency"],
|
||||
efficiency2=costs.at["methanolisation", "carbondioxide-input"],
|
||||
lifetime=costs.at["CCGT", "lifetime"],
|
||||
)
|
||||
|
||||
if types["ccgt_cc"]:
|
||||
logger.info(
|
||||
"Adding methanol CCGT power plants with post-combustion carbon capture."
|
||||
)
|
||||
|
||||
# TODO consider efficiency changes / energy inputs for CC
|
||||
|
||||
# efficiency * EUR/MW * (annuity + FOM)
|
||||
capital_cost = costs.at["CCGT", "efficiency"] * costs.at["CCGT", "fixed"]
|
||||
|
||||
capital_cost_cc = (
|
||||
capital_cost
|
||||
+ costs.at["cement capture", "fixed"]
|
||||
* costs.at["methanolisation", "carbondioxide-input"]
|
||||
)
|
||||
|
||||
n.madd(
|
||||
"Link",
|
||||
nodes,
|
||||
suffix=" CCGT methanol CC",
|
||||
bus0=spatial.methanol.nodes,
|
||||
bus1=nodes,
|
||||
bus2=spatial.co2.df.loc[nodes, "nodes"].values,
|
||||
bus3="co2 atmosphere",
|
||||
carrier="CCGT methanol CC",
|
||||
p_nom_extendable=True,
|
||||
capital_cost=capital_cost_cc,
|
||||
marginal_cost=costs.at["CCGT", "VOM"],
|
||||
efficiency=costs.at["CCGT", "efficiency"],
|
||||
efficiency2=costs.at["cement capture", "capture_rate"]
|
||||
* costs.at["methanolisation", "carbondioxide-input"],
|
||||
efficiency3=(1 - costs.at["cement capture", "capture_rate"])
|
||||
* costs.at["methanolisation", "carbondioxide-input"],
|
||||
lifetime=costs.at["CCGT", "lifetime"],
|
||||
)
|
||||
|
||||
if types["ocgt"]:
|
||||
logger.info("Adding methanol OCGT power plants.")
|
||||
|
||||
n.madd(
|
||||
"Link",
|
||||
nodes,
|
||||
suffix=" OCGT methanol",
|
||||
bus0=spatial.methanol.nodes,
|
||||
bus1=nodes,
|
||||
bus2="co2 atmosphere",
|
||||
carrier="OCGT methanol",
|
||||
p_nom_extendable=True,
|
||||
capital_cost=costs.at["OCGT", "fixed"] * costs.at["OCGT", "efficiency"],
|
||||
marginal_cost=costs.at["OCGT", "VOM"] * costs.at["OCGT", "efficiency"],
|
||||
efficiency=costs.at["OCGT", "efficiency"],
|
||||
efficiency2=costs.at["methanolisation", "carbondioxide-input"],
|
||||
lifetime=costs.at["OCGT", "lifetime"],
|
||||
)
|
||||
|
||||
|
||||
def add_methanol_to_olefins(n, costs):
|
||||
nodes = spatial.nodes
|
||||
nhours = n.snapshot_weightings.generators.sum()
|
||||
nyears = nhours / 8760
|
||||
|
||||
tech = "methanol-to-olefins/aromatics"
|
||||
|
||||
logger.info(f"Adding {tech}.")
|
||||
|
||||
demand_factor = options["HVC_demand_factor"]
|
||||
|
||||
industrial_production = (
|
||||
pd.read_csv(snakemake.input.industrial_production, index_col=0)
|
||||
* 1e3
|
||||
* nyears # kt/a -> t/a
|
||||
)
|
||||
|
||||
p_nom_max = (
|
||||
demand_factor
|
||||
* industrial_production.loc[nodes, "HVC"]
|
||||
/ nhours
|
||||
* costs.at[tech, "methanol-input"]
|
||||
)
|
||||
|
||||
co2_release = (
|
||||
costs.at[tech, "carbondioxide-output"] / costs.at[tech, "methanol-input"]
|
||||
+ costs.at["methanolisation", "carbondioxide-input"]
|
||||
)
|
||||
|
||||
n.madd(
|
||||
"Link",
|
||||
nodes,
|
||||
suffix=f" {tech}",
|
||||
carrier=tech,
|
||||
capital_cost=costs.at[tech, "fixed"] / costs.at[tech, "methanol-input"],
|
||||
marginal_cost=costs.at[tech, "VOM"] / costs.at[tech, "methanol-input"],
|
||||
p_nom_extendable=True,
|
||||
bus0=spatial.methanol.nodes,
|
||||
bus1=spatial.oil.naphtha,
|
||||
bus2=nodes,
|
||||
bus3="co2 atmosphere",
|
||||
p_min_pu=1,
|
||||
p_nom_max=p_nom_max.values,
|
||||
efficiency=1 / costs.at[tech, "methanol-input"],
|
||||
efficiency2=-costs.at[tech, "electricity-input"]
|
||||
/ costs.at[tech, "methanol-input"],
|
||||
efficiency3=co2_release,
|
||||
)
|
||||
|
||||
|
||||
def add_methanol_to_kerosene(n, costs):
|
||||
nodes = pop_layout.index
|
||||
nhours = n.snapshot_weightings.generators.sum()
|
||||
|
||||
demand_factor = options["aviation_demand_factor"]
|
||||
|
||||
tech = "methanol-to-kerosene"
|
||||
|
||||
logger.info(f"Adding {tech}.")
|
||||
|
||||
all_aviation = ["total international aviation", "total domestic aviation"]
|
||||
|
||||
p_nom_max = (
|
||||
demand_factor
|
||||
* pop_weighted_energy_totals.loc[nodes, all_aviation].sum(axis=1)
|
||||
* 1e6
|
||||
/ nhours
|
||||
* costs.at[tech, "methanol-input"]
|
||||
)
|
||||
|
||||
capital_cost = costs.at[tech, "fixed"] / costs.at[tech, "methanol-input"]
|
||||
|
||||
n.madd(
|
||||
"Link",
|
||||
spatial.h2.locations,
|
||||
suffix=f" {tech}",
|
||||
carrier=tech,
|
||||
capital_cost=capital_cost,
|
||||
bus0=spatial.methanol.nodes,
|
||||
bus1=spatial.oil.kerosene,
|
||||
bus2=spatial.h2.nodes,
|
||||
efficiency=costs.at[tech, "methanol-input"],
|
||||
efficiency2=-costs.at[tech, "hydrogen-input"]
|
||||
/ costs.at[tech, "methanol-input"],
|
||||
p_nom_extendable=True,
|
||||
p_min_pu=1,
|
||||
p_nom_max=p_nom_max.values,
|
||||
)
|
||||
|
||||
|
||||
def add_methanol_reforming(n, costs):
|
||||
logger.info("Adding methanol steam reforming.")
|
||||
|
||||
tech = "Methanol steam reforming"
|
||||
|
||||
capital_cost = costs.at[tech, "fixed"] / costs.at[tech, "methanol-input"]
|
||||
|
||||
n.madd(
|
||||
"Link",
|
||||
spatial.h2.locations,
|
||||
suffix=f" {tech}",
|
||||
bus0=spatial.methanol.nodes,
|
||||
bus1=spatial.h2.nodes,
|
||||
bus2="co2 atmosphere",
|
||||
p_nom_extendable=True,
|
||||
capital_cost=capital_cost,
|
||||
efficiency=1 / costs.at[tech, "methanol-input"],
|
||||
efficiency2=costs.at["methanolisation", "carbondioxide-input"],
|
||||
carrier=tech,
|
||||
lifetime=costs.at[tech, "lifetime"],
|
||||
)
|
||||
|
||||
|
||||
def add_methanol_reforming_cc(n, costs):
|
||||
logger.info("Adding methanol steam reforming with carbon capture.")
|
||||
|
||||
tech = "Methanol steam reforming"
|
||||
|
||||
# TODO: heat release and electricity demand for process and carbon capture
|
||||
# but the energy demands for carbon capture have not yet been added for other CC processes
|
||||
# 10.1016/j.rser.2020.110171: 0.129 kWh_e/kWh_H2, -0.09 kWh_heat/kWh_H2
|
||||
|
||||
capital_cost = costs.at[tech, "fixed"] / costs.at[tech, "methanol-input"]
|
||||
|
||||
capital_cost_cc = (
|
||||
capital_cost
|
||||
+ costs.at["cement capture", "fixed"]
|
||||
* costs.at["methanolisation", "carbondioxide-input"]
|
||||
)
|
||||
|
||||
n.madd(
|
||||
"Link",
|
||||
spatial.h2.locations,
|
||||
suffix=f" {tech} CC",
|
||||
bus0=spatial.methanol.nodes,
|
||||
bus1=spatial.h2.nodes,
|
||||
bus2="co2 atmosphere",
|
||||
bus3=spatial.co2.nodes,
|
||||
p_nom_extendable=True,
|
||||
capital_cost=capital_cost_cc,
|
||||
efficiency=1 / costs.at[tech, "methanol-input"],
|
||||
efficiency2=(1 - costs.at["cement capture", "capture_rate"])
|
||||
* costs.at["methanolisation", "carbondioxide-input"],
|
||||
efficiency3=costs.at["cement capture", "capture_rate"]
|
||||
* costs.at["methanolisation", "carbondioxide-input"],
|
||||
carrier=f"{tech} CC",
|
||||
lifetime=costs.at[tech, "lifetime"],
|
||||
)
|
||||
|
||||
|
||||
@ -2309,6 +2613,32 @@ def add_heat(n: pypsa.Network, costs: pd.DataFrame, cop: xr.DataArray):
|
||||
)
|
||||
|
||||
|
||||
def add_methanol(n, costs):
|
||||
|
||||
methanol_options = options["methanol"]
|
||||
if not any(methanol_options.values()):
|
||||
return
|
||||
|
||||
logger.info("Add methanol")
|
||||
add_carrier_buses(n, "methanol")
|
||||
|
||||
if options["biomass"]:
|
||||
if methanol_options["biomass_to_methanol"]:
|
||||
add_biomass_to_methanol(n, costs)
|
||||
|
||||
if methanol_options["biomass_to_methanol"]:
|
||||
add_biomass_to_methanol_cc(n, costs)
|
||||
|
||||
if methanol_options["methanol_to_power"]:
|
||||
add_methanol_to_power(n, costs, types=methanol_options["methanol_to_power"])
|
||||
|
||||
if methanol_options["methanol_reforming"]:
|
||||
add_methanol_reforming(n, costs)
|
||||
|
||||
if methanol_options["methanol_reforming_cc"]:
|
||||
add_methanol_reforming_cc(n, costs)
|
||||
|
||||
|
||||
def add_biomass(n, costs):
|
||||
logger.info("Add biomass")
|
||||
|
||||
@ -3129,7 +3459,7 @@ def add_industry(n, costs):
|
||||
/ nhours
|
||||
)
|
||||
|
||||
if not options["regional_methanol_demand"]:
|
||||
if not options["methanol"]["regional_methanol_demand"]:
|
||||
p_set_methanol = p_set_methanol.sum()
|
||||
|
||||
n.madd(
|
||||
@ -3252,7 +3582,7 @@ def add_industry(n, costs):
|
||||
* efficiency
|
||||
)
|
||||
|
||||
if not options["regional_methanol_demand"]:
|
||||
if not options["methanol"]["regional_methanol_demand"]:
|
||||
p_set_methanol_shipping = p_set_methanol_shipping.sum()
|
||||
|
||||
n.madd(
|
||||
@ -3526,6 +3856,9 @@ def add_industry(n, costs):
|
||||
efficiency3=process_co2_per_naphtha,
|
||||
)
|
||||
|
||||
if options["methanol"]["methanol_to_olefins"]:
|
||||
add_methanol_to_olefins(n, costs)
|
||||
|
||||
# aviation
|
||||
demand_factor = options.get("aviation_demand_factor", 1)
|
||||
if demand_factor != 1:
|
||||
@ -3570,6 +3903,9 @@ def add_industry(n, costs):
|
||||
efficiency2=costs.at["oil", "CO2 intensity"],
|
||||
)
|
||||
|
||||
if options["methanol"]["methanol_to_kerosene"]:
|
||||
add_methanol_to_kerosene(n, costs)
|
||||
|
||||
# TODO simplify bus expression
|
||||
n.madd(
|
||||
"Load",
|
||||
@ -4413,6 +4749,9 @@ if __name__ == "__main__":
|
||||
if options["ammonia"]:
|
||||
add_ammonia(n, costs)
|
||||
|
||||
if options["methanol"]:
|
||||
add_methanol(n, costs)
|
||||
|
||||
if options["industry"]:
|
||||
add_industry(n, costs)
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user