Separate CHP gas/solid biomass, with/without CCS

Also fix CHP p_nom_ratio constraint, and battery charger/discharger
constraint.
This commit is contained in:
Tom Brown 2019-12-12 15:03:51 +01:00
parent ec9b447949
commit 49a68bdd35
4 changed files with 149 additions and 69 deletions

View File

@ -2,12 +2,12 @@ logging_level: INFO
results_dir: 'results/'
summary_dir: results
run: '191202-nomopyomo'
run: '191212-chp'
scenario:
sectors: [E] # ,E+EV,E+BEV,E+BEV+V2G] # [ E+EV, E+BEV, E+BEV+V2G ]
simpl: ['']
lv: [1.0,1.25]#, 1.125, 1.25, 1.5, 2.0]# or opt
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]
@ -73,11 +73,6 @@ sector:
'tes_tau' : 3.
'boilers' : True
'chp' : True
'chp_parameters':
'eta_elec' : 0.468 #electrical efficiency with no heat output
'c_v' : 0.15 #loss of fuel for each addition of heat
'c_m' : 0.75 #backpressure ratio
'p_nom_ratio' : 1. #ratio of max heat output to max electrical output
'solar_thermal' : True
'solar_cf_correction': 0.788457 # = >>> 1/1.2683
'marginal_cost_storage' : 0. #1e-4

View File

@ -175,9 +175,38 @@ decentral CHP,2030,lifetime,25,years,HP
decentral CHP,2030,investment,1400,EUR/kWel,HP
decentral CHP,2030,FOM,3,%/year,HP
decentral CHP,2030,discount rate,0.04,per unit,Palzer thesis
central CHP,2030,lifetime,25,years,HP
central CHP,2030,investment,650,EUR/kWel,HP
central CHP,2030,FOM,3,%/year,HP
central gas CHP,2030,lifetime,30,years,DEA
central gas CHP,2030,investment,1300,EUR/kWel,DEA
central gas CHP,2030,FOM,3,%/year,DEA
central gas CHP,2030,efficiency,0.45,per unit,DEA (condensation mode)
central gas CHP,2030,c_b,0.7,per unit,DEA (backpressure ratio)
central gas CHP,2030,c_v,0.17,per unit,DEA (loss of fuel for additional heat)
central gas CHP,2030,p_nom_ratio,1.,per unit,
central gas CHP,2030,VOM,0.82,EUR/MWh,DEA
central gas CHP CCS,2030,lifetime,30,years,DEA
central gas CHP CCS,2030,investment,1900,EUR/kWel,DEA + DIW extra for CCS on gas plant
central gas CHP CCS,2030,FOM,3,%/year,DEA
central gas CHP CCS,2030,efficiency,0.405,per unit,DEA (condensation mode + efficiency loss due to capture)
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,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 CCS,2030,p_nom_ratio,1.,per unit,
central solid biomass CHP CCS,2030,VOM,2.2,EUR/MWh,DEA
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)

1 technology year parameter value unit source
175 decentral CHP 2030 investment 1400 EUR/kWel HP
176 decentral CHP 2030 FOM 3 %/year HP
177 decentral CHP 2030 discount rate 0.04 per unit Palzer thesis
178 central CHP central gas CHP 2030 lifetime 25 30 years HP DEA
179 central CHP central gas CHP 2030 investment 650 1300 EUR/kWel HP DEA
180 central CHP central gas CHP 2030 FOM 3 %/year HP DEA
181 central gas CHP 2030 efficiency 0.45 per unit DEA (condensation mode)
182 central gas CHP 2030 c_b 0.7 per unit DEA (backpressure ratio)
183 central gas CHP 2030 c_v 0.17 per unit DEA (loss of fuel for additional heat)
184 central gas CHP 2030 p_nom_ratio 1. per unit
185 central gas CHP 2030 VOM 0.82 EUR/MWh DEA
186 central gas CHP CCS 2030 lifetime 30 years DEA
187 central gas CHP CCS 2030 investment 1900 EUR/kWel DEA + DIW extra for CCS on gas plant
188 central gas CHP CCS 2030 FOM 3 %/year DEA
189 central gas CHP CCS 2030 efficiency 0.405 per unit DEA (condensation mode + efficiency loss due to capture)
190 central gas CHP CCS 2030 c_b 0.7 per unit DEA (backpressure ratio)
191 central gas CHP CCS 2030 c_v 0.17 per unit DEA (loss of fuel for additional heat)
192 central gas CHP CCS 2030 p_nom_ratio 1. per unit
193 central gas CHP CCS 2030 VOM 0.82 EUR/MWh DEA
194 central solid biomass CHP 2030 lifetime 40 years DEA
195 central solid biomass CHP 2030 investment 1990 EUR/kWel DEA
196 central solid biomass CHP 2030 FOM 3 %/year DEA
197 central solid biomass CHP 2030 efficiency 0.52 per unit DEA (condensation mode)
198 central solid biomass CHP 2030 c_b 1.01 per unit DEA (backpressure ratio)
199 central solid biomass CHP 2030 c_v 0.15 per unit DEA (loss of fuel for additional heat)
200 central solid biomass CHP 2030 p_nom_ratio 1. per unit
201 central solid biomass CHP 2030 VOM 2.2 EUR/MWh DEA
202 central solid biomass CHP CCS 2030 lifetime 40 years DEA
203 central solid biomass CHP CCS 2030 investment 2590 EUR/kWel DEA + DIW extra for CCS on gas plant
204 central solid biomass CHP CCS 2030 FOM 3 %/year DEA
205 central solid biomass CHP CCS 2030 efficiency 0.468 per unit DEA (condensation mode + efficiency loss due to capture)
206 central solid biomass CHP CCS 2030 c_b 1.01 per unit DEA (backpressure ratio)
207 central solid biomass CHP CCS 2030 c_v 0.15 per unit DEA (loss of fuel for additional heat)
208 central solid biomass CHP CCS 2030 p_nom_ratio 1. per unit
209 central solid biomass CHP CCS 2030 VOM 2.2 EUR/MWh DEA
210 micro CHP 2030 lifetime 20 years DEA for PEMFC with methane (for unit consuming 2kW CH4)
211 micro CHP 2030 investment 4500 EUR/kWCH4 DEA for PEMFC with methane (for unit consuming 2kW CH4)
212 micro CHP 2030 FOM 6 %/year DEA for PEMFC with methane (for unit consuming 2kW CH4)

View File

@ -765,7 +765,7 @@ def add_heat(network):
network.madd("Load",
nodes[name],
suffix=" " + name + "heat",
suffix=" " + name + " heat",
bus=nodes[name] + " " + name + " heat",
carrier=name + " heat",
p_set=heat_load)
@ -868,47 +868,72 @@ def add_heat(network):
if options["chp"]:
if name == "urban central":
#additional bus, to which we can also connect biomass
network.madd("Bus",
nodes[name] + " urban central CHP",
carrier="urban central CHP")
#add gas CHP; biomass CHP is added in biomass section
network.madd("Link",
nodes[name] + " urban central gas CHP electric",
bus0="EU gas",
bus1=nodes[name],
bus2="co2 atmosphere",
carrier="urban central gas CHP electric",
p_nom_extendable=True,
capital_cost=costs.at['central gas CHP','fixed']*costs.at['central gas CHP','efficiency'],
marginal_cost=costs.at['central gas CHP','VOM'],
efficiency=costs.at['central gas CHP','efficiency'],
efficiency2=costs.at['gas','CO2 intensity'],
c_b=costs.at['central gas CHP','c_b'],
c_v=costs.at['central gas CHP','c_v'],
p_nom_ratio=costs.at['central gas CHP','p_nom_ratio'])
network.madd("Link",
nodes[name] + " gas to urban central CHP",
nodes[name] + " urban central gas CHP heat",
bus0="EU gas",
bus1=nodes[name] + " urban central CHP",
bus1=nodes[name] + " urban central heat",
bus2="co2 atmosphere",
carrier="urban central gas CHP heat",
p_nom_extendable=True,
marginal_cost=costs.at['central gas CHP','VOM'],
efficiency=costs.at['central gas CHP','efficiency']/costs.at['central gas CHP','c_v'],
efficiency2=costs.at['gas','CO2 intensity'])
network.madd("Link",
nodes[name] + " urban central gas CHP CCS electric",
bus0="EU gas",
bus1=nodes[name],
bus2="co2 atmosphere",
bus3="co2 stored",
carrier="urban central gas CHP CCS electric",
p_nom_extendable=True,
capital_cost=costs.at['central gas CHP CCS','fixed']*costs.at['central gas CHP CCS','efficiency'],
marginal_cost=costs.at['central gas CHP CCS','VOM'],
efficiency=costs.at['central gas CHP CCS','efficiency'],
efficiency2=costs.at['gas','CO2 intensity']*(1-options["ccs_fraction"]),
efficiency3=costs.at['gas','CO2 intensity']*options["ccs_fraction"],
carrier="gas to central CHP",
p_nom_extendable=True)
c_b=costs.at['central gas CHP CCS','c_b'],
c_v=costs.at['central gas CHP CCS','c_v'],
p_nom_ratio=costs.at['central gas CHP CCS','p_nom_ratio'])
network.madd("Link",
nodes[name] + " urban central CHP electric",
bus0=nodes[name] + " urban central CHP",
bus1=nodes[name],
carrier="urban central CHP electric",
p_nom_extendable=True,
capital_cost=costs.at['central CHP','fixed']*options['chp_parameters']['eta_elec'],
efficiency=options['chp_parameters']['eta_elec'])
network.madd("Link",
nodes[name] + " urban central CHP heat",
bus0=nodes[name] + " urban central CHP",
nodes[name] + " urban central gas CHP CCS heat",
bus0="EU gas",
bus1=nodes[name] + " urban central heat",
carrier="urban central CHP heat",
bus2="co2 atmosphere",
bus3="co2 stored",
carrier="urban central gas CHP CCS heat",
p_nom_extendable=True,
efficiency=options['chp_parameters']['eta_elec']/options['chp_parameters']['c_v'])
marginal_cost=costs.at['central gas CHP CCS','VOM'],
efficiency=costs.at['central gas CHP CCS','efficiency']/costs.at['central gas CHP CCS','c_v'],
efficiency2=costs.at['gas','CO2 intensity']*(1-options["ccs_fraction"]),
efficiency3=costs.at['gas','CO2 intensity']*options["ccs_fraction"])
else:
network.madd("Link",
nodes[name] + " " + name + " micro CHP",
nodes[name] + " " + name + " micro gas CHP",
p_nom_extendable=True,
bus0=["EU gas"]*len(nodes[name]),
bus0="EU gas",
bus1=nodes[name],
bus2=nodes[name] + " " + name + " heat",
bus3="co2 atmosphere",
carrier=name + " micro CHP",
carrier=name + " micro gas CHP",
efficiency=costs.at['micro CHP','efficiency'],
efficiency2=costs.at['micro CHP','efficiency-heat'],
efficiency3=costs.at['gas','CO2 intensity'],
@ -1028,20 +1053,61 @@ def add_biomass(network):
#AC buses with district heating
urban_central = n.buses.index[n.buses.carrier == "urban central heat"]
if not urban_central.empty:
if not urban_central.empty and options["chp"]:
urban_central = urban_central.str[:-len(" urban central heat")]
#with BECCS
network.madd("Link",
urban_central + " solid biomass to urban central CHP",
urban_central + " urban central solid biomass CHP electric",
bus0="EU solid biomass",
bus1=urban_central + " urban central CHP",
bus1=urban_central,
carrier="urban central solid biomass CHP electric",
p_nom_extendable=True,
capital_cost=costs.at['central solid biomass CHP','fixed']*costs.at['central solid biomass CHP','efficiency'],
marginal_cost=costs.at['central solid biomass CHP','VOM'],
efficiency=costs.at['central solid biomass CHP','efficiency'],
c_b=costs.at['central solid biomass CHP','c_b'],
c_v=costs.at['central solid biomass CHP','c_v'],
p_nom_ratio=costs.at['central solid biomass CHP','p_nom_ratio'])
network.madd("Link",
urban_central + " urban central solid biomass CHP heat",
bus0="EU solid biomass",
bus1=urban_central + " urban central heat",
carrier="urban central solid biomass CHP heat",
p_nom_extendable=True,
marginal_cost=costs.at['central solid biomass CHP','VOM'],
efficiency=costs.at['central solid biomass CHP','efficiency']/costs.at['central solid biomass CHP','c_v'])
network.madd("Link",
urban_central + " urban central solid biomass CHP CCS electric",
bus0="EU solid biomass",
bus1=urban_central,
bus2="co2 atmosphere",
bus3="co2 stored",
carrier="urban central solid biomass CHP CCS electric",
p_nom_extendable=True,
capital_cost=costs.at['central solid biomass CHP CCS','fixed']*costs.at['central solid biomass CHP CCS','efficiency'],
marginal_cost=costs.at['central solid biomass CHP CCS','VOM'],
efficiency=costs.at['central solid biomass CHP CCS','efficiency'],
efficiency2=-costs.at['solid biomass','CO2 intensity']*options["ccs_fraction"],
efficiency3=costs.at['solid biomass','CO2 intensity']*options["ccs_fraction"],
carrier="solid biomass to urban central CHP",
p_nom_extendable=True)
c_b=costs.at['central solid biomass CHP','c_b'],
c_v=costs.at['central solid biomass CHP','c_v'],
p_nom_ratio=costs.at['central solid biomass CHP','p_nom_ratio'])
network.madd("Link",
urban_central + " urban central solid biomass CHP CCS heat",
bus0="EU solid biomass",
bus1=urban_central + " urban central heat",
bus2="co2 atmosphere",
bus3="co2 stored",
carrier="urban central solid biomass CHP CCS heat",
p_nom_extendable=True,
marginal_cost=costs.at['central solid biomass CHP CCS','VOM'],
efficiency=costs.at['central solid biomass CHP CCS','efficiency']/costs.at['central solid biomass CHP CCS','c_v'],
efficiency2=-costs.at['solid biomass','CO2 intensity']*options["ccs_fraction"],
efficiency3=costs.at['solid biomass','CO2 intensity']*options["ccs_fraction"])
def add_industry(network):

View File

@ -126,53 +126,43 @@ 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 + " charger", "efficiency"],
(-n.links.loc[nodes + " discharger", "efficiency"],
link_p_nom[nodes + " discharger"].values))
define_constraints(n, lhs, "=", 0, 'Link', 'charger_ratio')
def add_chp_constraints(n):
electric = n.links.index[n.links.index.str.contains("urban central") & n.links.index.str.contains("CHP") & n.links.index.str.contains("electric")]
heat = n.links.index[n.links.index.str.contains("urban central") & n.links.index.str.contains("CHP") & n.links.index.str.contains("heat")]
options = { "chp_parameters" : { 'eta_elec' : 0.468, #electrical efficiency with no heat output
'c_v' : 0.15, #loss of fuel for each addition of heat
'c_m' : 0.75, #backpressure ratio
'p_nom_ratio' : 1., #ratio of max heat output to max electrical output
}}
if hasattr(n.links.index,"str") and n.links.index.str.contains("CHP").any():
#AC buses with district heating
urban_central = n.buses.index[n.buses.carrier == "urban central heat"]
if not urban_central.empty:
urban_central = urban_central.str[:-len(" urban central heat")]
if not electric.empty:
link_p_nom = get_var(n, "Link", "p_nom")
#chp_nom
lhs = linexpr((n.links.loc[urban_central + " urban central CHP electric","efficiency"]
*options['chp_parameters']['p_nom_ratio'],
link_p_nom[urban_central + " urban central CHP electric"]),
(-n.links.loc[urban_central + " urban central CHP heat","efficiency"].values
*options['chp_parameters']['p_nom_ratio'],
link_p_nom[urban_central + " urban central CHP heat"].values))
#ratio of output heat to electricity set by p_nom_ratio
lhs = linexpr((n.links.loc[electric,"efficiency"]
*n.links.loc[electric,'p_nom_ratio'],
link_p_nom[electric]),
(-n.links.loc[heat,"efficiency"].values,
link_p_nom[heat].values))
define_constraints(n, lhs, "=", 0, 'chplink', 'fix_p_nom_ratio')
link_p = get_var(n, "Link", "p")
#backpressure
lhs = linexpr((options['chp_parameters']['c_m']
*n.links.loc[urban_central + " urban central CHP heat","efficiency"],
link_p[urban_central + " urban central CHP heat"]),
(-n.links.loc[urban_central + " urban central CHP electric","efficiency"].values,
link_p[urban_central + " urban central CHP electric"].values))
lhs = linexpr((n.links.loc[electric,'c_b'].values
*n.links.loc[heat,"efficiency"],
link_p[heat]),
(-n.links.loc[electric,"efficiency"].values,
link_p[electric].values))
define_constraints(n, lhs, "<=", 0, 'chplink', 'backpressure')
#top_iso_fuel_line
lhs = linexpr((1,link_p[urban_central + " urban central CHP heat"]),
(1,link_p[urban_central + " urban central CHP electric"].values),
(-1,link_p_nom[urban_central + " urban central CHP electric"].values))
lhs = linexpr((1,link_p[heat]),
(1,link_p[electric].values),
(-1,link_p_nom[electric].values))
define_constraints(n, lhs, "<=", 0, 'chplink', 'top_iso_fuel_line')