From 41f7f44dcf2877d34c6856acc82a77e277793411 Mon Sep 17 00:00:00 2001 From: Tom Brown Date: Fri, 13 Dec 2019 18:06:38 +0100 Subject: [PATCH] Make CCS optional for SMR and industry process emissions --- config.yaml | 4 +- data/costs.csv | 50 +++++++----- scripts/prepare_sector_network.py | 128 ++++++++++++++++++++++-------- scripts/solve_network.py | 2 +- 4 files changed, 125 insertions(+), 59 deletions(-) diff --git a/config.yaml b/config.yaml index dc5f1bda..20365258 100644 --- a/config.yaml +++ b/config.yaml @@ -2,7 +2,7 @@ logging_level: INFO results_dir: 'results/' summary_dir: results -run: '191212-chp' +run: '191212-ccs' scenario: sectors: [E] # ,E+EV,E+BEV,E+BEV+V2G] # [ E+EV, E+BEV, E+BEV+V2G ] @@ -10,7 +10,7 @@ scenario: lv: [1.0]#, 1.125, 1.25, 1.5, 2.0]# or opt clusters: [50] #[90, 128, 181] #[45, 64, 90, 128, 181, 256] #, 362] # (2**np.r_[5.5:9:.5]).astype(int) minimum is 37 opts: [''] #for pypsa-eur - sector_opts: [Co2L0-3H-T-H-B-I]#,Co2L0p1-3H-T-H-B-I,Co2L0p25-3H-T-H-B-I,Co2L0p5-3H-T-H-B-I]#[Co2L0-3H-T-H-B-I-onwind0-solar3,Co2L0-3H-T-H-B-I-onwind0p125-solar3,Co2L0-3H-T-H-B-I-onwind0p25-solar3,Co2L0-3H-T-H-B-I-onwind0p50-solar3,Co2L0-3H-T-H-B-I-solar3]#,Co2L0-3H-T-H-B-I-onwind0p25-solar3]#,Co2L0p05-3H-T-H-B-I,Co2L0p10-3H-T-H-B-I,Co2L0p20-3H-T-H-B-I,Co2L0p30-3H-T-H-B-I,Co2L0p50-3H-T-H-B-I]#[Co2L-3H-T-H,Co2L0p10-3H-T-H,Co2L0-3H-T-H,Co2L0p20-3H-T-H] #Co2L-3H-T-H,Co2L0p10-3H-T-H,Co2L0p20-3H-T-HCo2L-3H-T-H,Co2L0p10-3H-T-H,Co2L0p30-3H-T-H,Co2L0p50-3H-T-H] #Co2L-3H,Co2L-3H-T,, LC-FL, LC-T, Ep-T, Co2L-T] + sector_opts: [Co2L0-3H-T-H-B-I,Co2L0p2-3H-T-H-B-I,Co2L0p5-3H-T-H-B-I]#,Co2L0p1-3H-T-H-B-I,Co2L0p25-3H-T-H-B-I,Co2L0p5-3H-T-H-B-I]#[Co2L0-3H-T-H-B-I-onwind0-solar3,Co2L0-3H-T-H-B-I-onwind0p125-solar3,Co2L0-3H-T-H-B-I-onwind0p25-solar3,Co2L0-3H-T-H-B-I-onwind0p50-solar3,Co2L0-3H-T-H-B-I-solar3]#,Co2L0-3H-T-H-B-I-onwind0p25-solar3]#,Co2L0p05-3H-T-H-B-I,Co2L0p10-3H-T-H-B-I,Co2L0p20-3H-T-H-B-I,Co2L0p30-3H-T-H-B-I,Co2L0p50-3H-T-H-B-I]#[Co2L-3H-T-H,Co2L0p10-3H-T-H,Co2L0-3H-T-H,Co2L0p20-3H-T-H] #Co2L-3H-T-H,Co2L0p10-3H-T-H,Co2L0p20-3H-T-HCo2L-3H-T-H,Co2L0p10-3H-T-H,Co2L0p30-3H-T-H,Co2L0p50-3H-T-H] #Co2L-3H,Co2L-3H-T,, LC-FL, LC-T, Ep-T, Co2L-T] # Co2L will give default (5%); Co2L0p25 will give 25% CO2 emissions; Co2Lm0p05 will give 5% negative emissions diff --git a/data/costs.csv b/data/costs.csv index dd6571e0..7779533b 100644 --- a/data/costs.csv +++ b/data/costs.csv @@ -73,15 +73,15 @@ CCGT,2030,efficiency,0.5,per unit,DIW DataDoc http://hdl.handle.net/10419/80348 biomass,2030,efficiency,0.468,per unit,DIW DataDoc http://hdl.handle.net/10419/80348 geothermal,2030,efficiency,0.239,per unit,DIW DataDoc http://hdl.handle.net/10419/80348 nuclear,2030,efficiency,0.337,per unit,DIW DataDoc http://hdl.handle.net/10419/80348 -gas,2030,CO2 intensity,0.187,tCO2/MWth,https://www.eia.gov/environment/emissions/co2_vol_mass.php +gas,2030,CO2 intensity,0.187,tCO2/MWhth,https://www.eia.gov/environment/emissions/co2_vol_mass.php coal,2030,efficiency,0.464,per unit,DIW DataDoc http://hdl.handle.net/10419/80348 PC (Advanced/SuperC) lignite,2030,efficiency,0.447,per unit,DIW DataDoc http://hdl.handle.net/10419/80348 oil,2030,efficiency,0.393,per unit,DIW DataDoc http://hdl.handle.net/10419/80348 CT -coal,2030,CO2 intensity,0.354,tCO2/MWth,https://www.eia.gov/environment/emissions/co2_vol_mass.php -lignite,2030,CO2 intensity,0.4,tCO2/MWth,German sources -oil,2030,CO2 intensity,0.248,tCO2/MWth,https://www.eia.gov/environment/emissions/co2_vol_mass.php -geothermal,2030,CO2 intensity,0.026,tCO2/MWth,https://www.eia.gov/environment/emissions/co2_vol_mass.php -solid biomass,2030,CO2 intensity,0.3,tCO2/MWth,TODO +coal,2030,CO2 intensity,0.354,tCO2/MWhth,https://www.eia.gov/environment/emissions/co2_vol_mass.php +lignite,2030,CO2 intensity,0.4,tCO2/MWhth,German sources +oil,2030,CO2 intensity,0.248,tCO2/MWhth,https://www.eia.gov/environment/emissions/co2_vol_mass.php +geothermal,2030,CO2 intensity,0.026,tCO2/MWhth,https://www.eia.gov/environment/emissions/co2_vol_mass.php +solid biomass,2030,CO2 intensity,0.3,tCO2/MWhth,TODO electrolysis,2030,investment,350,EUR/kWel,Palzer Thesis electrolysis,2030,FOM,4,%/year,NREL http://www.nrel.gov/docs/fy09osti/45873.pdf; budischak2013 electrolysis,2030,lifetime,18,years,NREL http://www.nrel.gov/docs/fy09osti/45873.pdf; budischak2013 @@ -109,6 +109,14 @@ SMR,2030,investment,540.56,EUR/kWCH4,https://www.gov.uk/government/publications/ SMR,2030,lifetime,25,years,TODO SMR,2030,FOM,5.4,%/year,https://www.gov.uk/government/publications/hydrogen-supply-chain-evidence-base; slide 42 assumption for 2030 SMR,2030,efficiency,0.74,per unit,https://www.gov.uk/government/publications/hydrogen-supply-chain-evidence-base; slide 42 assumption for 2030 +SMR CCS,2030,investment,1032,EUR/kWCH4,https://www.gov.uk/government/publications/hydrogen-supply-chain-evidence-base; slide 42 assumption for 2030; GBP 466 exchange 1.16; CCS costed at 300 EUR/tCO2/a +SMR CCS,2030,lifetime,25,years,TODO +SMR CCS,2030,FOM,5.4,%/year,https://www.gov.uk/government/publications/hydrogen-supply-chain-evidence-base; slide 42 assumption for 2030 +SMR CCS,2030,efficiency,0.67,per unit,https://www.gov.uk/government/publications/hydrogen-supply-chain-evidence-base; slide 42 assumption for 2030; CCS uses 10% of gas +industry CCS,2030,investment,300,EUR/tCO2/a,Saygin et al 2013 https://doi.org/10.1016/j.ijggc.2013.05.032 +industry CCS,2030,FOM,2,%/year,Saygin et al 2013 https://doi.org/10.1016/j.ijggc.2013.05.032 +industry CCS,2030,lifetime,25,years,Saygin et al 2013 https://doi.org/10.1016/j.ijggc.2013.05.032 +industry CCS,2030,efficiency,0.9,per unit,Saygin et al 2013 https://doi.org/10.1016/j.ijggc.2013.05.032 Fischer-Tropsch,2030,investment,677.6,EUR/kWH2,Fasihi doi:10.3390/su9020306 (60 kEUR/bpd = 847 EUR/kWL (1b = 1.7 MWh) 847*0.8 = 677.6) Fischer-Tropsch,2030,lifetime,30,years,doi:10.3390/su9020306 Fischer-Tropsch,2030,FOM,3,%/year,doi:10.3390/su9020306 @@ -118,7 +126,7 @@ DAC,2030,lifetime,30,years,Fasihi DAC,2030,FOM,4,%/year,Fasihi battery inverter,2030,investment,411,USD/kWel,budischak2013 battery inverter,2030,lifetime,20,years,budischak2013 -battery inverter,2030,efficiency,0.81,per unit,budischak2013; Lund and Kempton (2008) http://dx.doi.org/10.1016/j.enpol.2008.06.007 +battery inverter,2030,efficiency,0.81,per unit,budischak2013; Lund and Kempton (2008) https://doi.org/10.1016/j.enpol.2008.06.007 battery inverter,2030,FOM,3,%/year,budischak2013 battery storage,2030,investment,192,USD/kWh,budischak2013 battery storage,2030,lifetime,15,years,budischak2013 @@ -191,22 +199,22 @@ central gas CHP CCS,2030,c_b,0.7,per unit,DEA (backpressure ratio) central gas CHP CCS,2030,c_v,0.17,per unit,DEA (loss of fuel for additional heat) central gas CHP CCS,2030,p_nom_ratio,1.,per unit, central gas CHP CCS,2030,VOM,0.82,EUR/MWh,DEA -central solid biomass CHP,2030,lifetime,40,years,DEA -central solid biomass CHP,2030,investment,1990,EUR/kWel,DEA -central solid biomass CHP,2030,FOM,3,%/year,DEA -central solid biomass CHP,2030,efficiency,0.52,per unit,DEA (condensation mode) -central solid biomass CHP,2030,c_b,1.01,per unit,DEA (backpressure ratio) -central solid biomass CHP,2030,c_v,0.15,per unit,DEA (loss of fuel for additional heat) +central solid biomass CHP,2030,lifetime,40,years,DEA for wood pellets CHP +central solid biomass CHP,2030,investment,1990,EUR/kWel,DEA for wood pellets CHP +central solid biomass CHP,2030,FOM,3,%/year,DEA for wood pellets CHP +central solid biomass CHP,2030,efficiency,0.52,per unit,DEA for wood pellets CHP (condensation mode) +central solid biomass CHP,2030,c_b,1.01,per unit,DEA for wood pellets CHP (backpressure ratio) +central solid biomass CHP,2030,c_v,0.15,per unit,DEA for wood pellets CHP (loss of fuel for additional heat) central solid biomass CHP,2030,p_nom_ratio,1.,per unit, -central solid biomass CHP,2030,VOM,2.2,EUR/MWh,DEA -central solid biomass CHP CCS,2030,lifetime,40,years,DEA -central solid biomass CHP CCS,2030,investment,2590,EUR/kWel,DEA + DIW extra for CCS on gas plant -central solid biomass CHP CCS,2030,FOM,3,%/year,DEA -central solid biomass CHP CCS,2030,efficiency,0.468,per unit,DEA (condensation mode + efficiency loss due to capture) -central solid biomass CHP CCS,2030,c_b,1.01,per unit,DEA (backpressure ratio) -central solid biomass CHP CCS,2030,c_v,0.15,per unit,DEA (loss of fuel for additional heat) +central solid biomass CHP,2030,VOM,2.2,EUR/MWh,DEA for wood pellets CHP +central solid biomass CHP CCS,2030,lifetime,40,years,DEA for wood pellets CHP +central solid biomass CHP CCS,2030,investment,2590,EUR/kWel,DEA for wood pellets CHP + DIW extra for CCS on gas plant +central solid biomass CHP CCS,2030,FOM,3,%/year,DEA for wood pellets CHP +central solid biomass CHP CCS,2030,efficiency,0.468,per unit,DEA for wood pellets CHP (condensation mode + efficiency loss due to capture) +central solid biomass CHP CCS,2030,c_b,1.01,per unit,DEA for wood pellets CHP (backpressure ratio) +central solid biomass CHP CCS,2030,c_v,0.15,per unit,DEA for wood pellets CHP (loss of fuel for additional heat) central solid biomass CHP CCS,2030,p_nom_ratio,1.,per unit, -central solid biomass CHP CCS,2030,VOM,2.2,EUR/MWh,DEA +central solid biomass CHP CCS,2030,VOM,2.2,EUR/MWh,DEA for wood pellets CHP micro CHP,2030,lifetime,20,years,DEA for PEMFC with methane (for unit consuming 2kW CH4) micro CHP,2030,investment,4500,EUR/kWCH4,DEA for PEMFC with methane (for unit consuming 2kW CH4) micro CHP,2030,FOM,6,%/year,DEA for PEMFC with methane (for unit consuming 2kW CH4) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index b7233be8..3e89146d 100644 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -623,16 +623,27 @@ def add_storage(network): if options['SMR']: network.madd("Link", - nodes + " SMR", + nodes + " SMR CCS", bus0=["EU gas"]*len(nodes), bus1=nodes+" H2", bus2="co2 atmosphere", bus3="co2 stored", p_nom_extendable=True, - carrier="SMR", - efficiency=costs.at["SMR","efficiency"], + carrier="SMR CCS", + efficiency=costs.at["SMR CCS","efficiency"], efficiency2=costs.at['gas','CO2 intensity']*(1-options["ccs_fraction"]), efficiency3=costs.at['gas','CO2 intensity']*options["ccs_fraction"], + capital_cost=costs.at["SMR CCS","fixed"]) + + network.madd("Link", + nodes + " SMR", + bus0=["EU gas"]*len(nodes), + bus1=nodes+" H2", + bus2="co2 atmosphere", + p_nom_extendable=True, + carrier="SMR", + efficiency=costs.at["SMR","efficiency"], + efficiency2=costs.at['gas','CO2 intensity'], capital_cost=costs.at["SMR","fixed"]) @@ -1123,43 +1134,70 @@ def add_industry(network): solid_biomass_by_country = industrial_demand["solid biomass"].groupby(pop_layout.ct).sum() countries = solid_biomass_by_country.index + network.madd("Bus", + ["solid biomass for industry"], + carrier="solid biomass for industry") + network.madd("Load", ["solid biomass for industry"], - bus="EU solid biomass", + bus="solid biomass for industry", carrier="solid biomass for industry", p_set=solid_biomass_by_country.sum()/8760.) - #Net transfer of CO2 from atmosphere to stored - network.madd("Load", - ["solid biomass for industry co2 from atmosphere"], - bus="co2 atmosphere", - carrier="solid biomass for industry co2 from atmosphere", - p_set=solid_biomass_by_country.sum()*costs.at['solid biomass','CO2 intensity']*options["ccs_fraction"]/8760.) + network.madd("Link", + ["solid biomass for industry"], + bus0="EU solid biomass", + bus1="solid biomass for industry", + carrier="solid biomass for industry", + p_nom_extendable=True, + efficiency=1.) - network.madd("Load", - ["solid biomass for industry co2 to stored"], - bus="co2 stored", - carrier="solid biomass for industry co2 to stored", - p_set=-solid_biomass_by_country.sum()*costs.at['solid biomass','CO2 intensity']*options["ccs_fraction"]/8760.) + network.madd("Link", + ["solid biomass for industry CCS"], + bus0="EU solid biomass", + bus1="solid biomass for industry", + bus2="co2 atmosphere", + bus3="co2 stored", + carrier="solid biomass for industry CCS", + p_nom_extendable=True, + capital_cost=costs.at["industry CCS","fixed"]*costs.at['solid biomass','CO2 intensity']*8760, #8760 converts EUR/(tCO2/a) to EUR/(tCO2/h) + efficiency=0.9, + efficiency2=-costs.at['solid biomass','CO2 intensity']*options["ccs_fraction"], + efficiency3=costs.at['solid biomass','CO2 intensity']*options["ccs_fraction"]) + network.madd("Bus", + ["gas for industry"], + carrier="gas for industry") + network.madd("Load", ["gas for industry"], - bus="EU gas", + bus="gas for industry", carrier="gas for industry", p_set=industrial_demand.loc[nodes,"methane"].sum()/8760.) - network.madd("Load", - ["gas for industry co2 to atmosphere"], - bus="co2 atmosphere", - carrier="gas for industry co2 to atmosphere", - p_set=-industrial_demand.loc[nodes,"methane"].sum()*costs.at['gas','CO2 intensity']*(1-options["ccs_fraction"])/8760.) + network.madd("Link", + ["gas for industry"], + bus0="EU gas", + bus1="gas for industry", + bus2="co2 atmosphere", + carrier="gas for industry", + p_nom_extendable=True, + efficiency=1., + efficiency2=costs.at['gas','CO2 intensity']) - network.madd("Load", - ["gas for industry co2 to stored"], - bus="co2 stored", - carrier="gas for industry co2 to stored", - p_set=-industrial_demand.loc[nodes,"methane"].sum()*costs.at['gas','CO2 intensity']*options["ccs_fraction"]/8760.) + network.madd("Link", + ["gas for industry CCS"], + bus0="EU gas", + bus1="gas for industry", + bus2="co2 atmosphere", + bus3="co2 stored", + carrier="gas for industry CCS", + p_nom_extendable=True, + capital_cost=costs.at["industry CCS","fixed"]*costs.at['gas','CO2 intensity']*8760, #8760 converts EUR/(tCO2/a) to EUR/(tCO2/h) + efficiency=0.9, + efficiency2=costs.at['gas','CO2 intensity']*(1-options["ccs_fraction"]), + efficiency3=costs.at['gas','CO2 intensity']*options["ccs_fraction"]) network.madd("Load", @@ -1250,17 +1288,37 @@ def add_industry(network): carrier="industry new electricity", p_set = (industrial_demand.loc[nodes,"electricity"]-industrial_demand.loc[nodes,"current electricity"])/8760.) - network.madd("Load", - ["process emissions to atmosphere"], - bus="co2 atmosphere", - carrier="process emissions to atmosphere", - p_set = -industrial_demand.loc[nodes,"process emission"].sum()*(1-options["ccs_fraction"])/8760.) + network.madd("Bus", + ["process emissions"], + carrier="process emissions") + #this should be process emissions fossil+feedstock + #then need load on atmosphere for feedstock emissions that are currently going to atmosphere via Link Fischer-Tropsch demand network.madd("Load", - ["process emissions to stored"], - bus="co2 stored", - carrier="process emissions to stored", - p_set = -industrial_demand.loc[nodes,"process emission"].sum()*options["ccs_fraction"]/8760.) + ["process emissions"], + bus="process emissions", + carrier="process emissions", + p_set = -industrial_demand.loc[nodes,"process emission"].sum()/8760.) + + network.madd("Link", + ["process emissions"], + bus0="process emissions", + bus1="co2 atmosphere", + carrier="process emissions", + p_nom_extendable=True, + efficiency=1.) + + #assume enough local waste heat for CCS + network.madd("Link", + ["process emissions CCS"], + bus0="process emissions", + bus1="co2 atmosphere", + bus2="co2 stored", + carrier="process emissions CCS", + p_nom_extendable=True, + capital_cost=costs.at["industry CCS","fixed"]*8760, #8760 converts EUR/(tCO2/a) to EUR/(tCO2/h) + efficiency=(1-options["ccs_fraction"]), + efficiency2=options["ccs_fraction"]) diff --git a/scripts/solve_network.py b/scripts/solve_network.py index 512e4fc7..502c7142 100644 --- a/scripts/solve_network.py +++ b/scripts/solve_network.py @@ -126,7 +126,7 @@ def add_battery_constraints(n): link_p_nom = get_var(n, "Link", "p_nom") lhs = linexpr((1,link_p_nom[nodes + " charger"]), - (-n.links.loc[nodes + " discharger", "efficiency"], + (-n.links.loc[nodes + " discharger", "efficiency"].values, link_p_nom[nodes + " discharger"].values)) define_constraints(n, lhs, "=", 0, 'Link', 'charger_ratio')