diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index f528c28d..da984fd3 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -64,7 +64,7 @@ jobs: - name: Add solver to environment run: | - echo -e " - coincbc\n - ipopt<3.13.3" >> ../pypsa-eur/envs/environment.yaml + echo -e "- coincbc\n- ipopt<3.13.3" >> ../pypsa-eur/envs/environment.yaml - name: Setup Mambaforge uses: conda-incubator/setup-miniconda@v2 diff --git a/.gitignore b/.gitignore index aa531c3d..a7049efe 100644 --- a/.gitignore +++ b/.gitignore @@ -46,3 +46,5 @@ config.yaml doc/_build *.xls + +*.geojson diff --git a/Snakefile b/Snakefile index 6db0bca0..43beaf08 100644 --- a/Snakefile +++ b/Snakefile @@ -256,9 +256,9 @@ rule build_biomass_potentials: enspreso_biomass=HTTP.remote("https://cidportal.jrc.ec.europa.eu/ftp/jrc-opendata/ENSPRESO/ENSPRESO_BIOMASS.xlsx", keep_local=True), nuts2="data/nuts/NUTS_RG_10M_2013_4326_LEVL_2.geojson", # https://gisco-services.ec.europa.eu/distribution/v2/nuts/download/#nuts21 regions_onshore=pypsaeur("resources/regions_onshore_elec_s{simpl}_{clusters}.geojson"), - nuts3_population="../pypsa-eur/data/bundle/nama_10r_3popgdp.tsv.gz", - swiss_cantons="../pypsa-eur/data/bundle/ch_cantons.csv", - swiss_population="../pypsa-eur/data/bundle/je-e-21.03.02.xls", + nuts3_population=pypsaeur("data/bundle/nama_10r_3popgdp.tsv.gz"), + swiss_cantons=pypsaeur("data/bundle/ch_cantons.csv"), + swiss_population=pypsaeur("data/bundle/je-e-21.03.02.xls"), country_shapes=pypsaeur('resources/country_shapes.geojson') output: biomass_potentials_all='resources/biomass_potentials_all_s{simpl}_{clusters}.csv', @@ -474,7 +474,7 @@ rule prepare_sector_network: co2="data/eea/UNFCCC_v23.csv", biomass_potentials='resources/biomass_potentials_s{simpl}_{clusters}.csv', heat_profile="data/heat_load_profile_BDEW.csv", - costs=CDIR + "costs_{planning_horizons}.csv", + costs=CDIR + "costs_{}.csv".format(config['costs']['year']) if config["foresight"] == "overnight" else CDIR + "costs_{planning_horizons}.csv", profile_offwind_ac=pypsaeur("resources/profile_offwind-ac.nc"), profile_offwind_dc=pypsaeur("resources/profile_offwind-dc.nc"), h2_cavern="resources/salt_cavern_potentials_s{simpl}_{clusters}.csv", @@ -532,6 +532,14 @@ rule copy_config: script: "scripts/copy_config.py" +rule copy_conda_env: + output: SDIR + '/configs/environment.yaml' + threads: 1 + resources: mem_mb=500 + benchmark: SDIR + "/benchmarks/copy_conda_env" + shell: "conda env export -f {output} --no-builds" + + rule make_summary: input: overrides="data/override_component_attrs", @@ -539,7 +547,7 @@ rule make_summary: RDIR + "/postnetworks/elec_s{simpl}_{clusters}_lv{lv}_{opts}_{sector_opts}_{planning_horizons}.nc", **config['scenario'] ), - costs=CDIR + "costs_{}.csv".format(config['scenario']['planning_horizons'][0]), + costs=CDIR + "costs_{}.csv".format(config['costs']['year']) if config["foresight"] == "overnight" else CDIR + "costs_{}.csv".format(config['scenario']['planning_horizons'][0]), plots=expand( RDIR + "/maps/elec_s{simpl}_{clusters}_lv{lv}_{opts}_{sector_opts}-costs-all_{planning_horizons}.pdf", **config['scenario'] @@ -589,8 +597,9 @@ if config["foresight"] == "overnight": input: overrides="data/override_component_attrs", network=RDIR + "/prenetworks/elec_s{simpl}_{clusters}_lv{lv}_{opts}_{sector_opts}_{planning_horizons}.nc", - costs=CDIR + "costs_{planning_horizons}.csv", - config=SDIR + '/configs/config.yaml' + costs=CDIR + "costs_{}.csv".format(config['costs']['year']), + config=SDIR + '/configs/config.yaml', + env=SDIR + '/configs/environment.yaml', output: RDIR + "/postnetworks/elec_s{simpl}_{clusters}_lv{lv}_{opts}_{sector_opts}_{planning_horizons}.nc" shadow: "shallow" log: diff --git a/config.default.yaml b/config.default.yaml index 5f7cbb33..4078ee01 100644 --- a/config.default.yaml +++ b/config.default.yaml @@ -33,15 +33,15 @@ scenario: # A for agriculture, forestry and fishing # solar+c0.5 reduces the capital cost of solar to 50\% of reference value # solar+p3 multiplies the available installable potential by factor 3 - # co2 stored+e2 multiplies the potential of CO2 sequestration by a factor 2 + # seq400 sets the potential of CO2 sequestration to 400 Mt CO2 per year # dist{n} includes distribution grids with investment cost of n times cost in data/costs.csv # for myopic/perfect foresight cb states the carbon budget in GtCO2 (cumulative # emissions throughout the transition path in the timeframe determined by the # planning_horizons), be:beta decay; ex:exponential decay # cb40ex0 distributes a carbon budget of 40 GtCO2 following an exponential # decay with initial growth rate 0 - planning_horizons: # investment years for myopic and perfect; or costs year for overnight - - 2030 + planning_horizons: # investment years for myopic and perfect; for overnight, year of cost assumptions can be different and is defined under 'costs' + - 2050 # for example, set to # - 2020 # - 2030 @@ -154,11 +154,11 @@ sector: potential: 0.6 # maximum fraction of urban demand which can be supplied by district heating # increase of today's district heating demand to potential maximum district heating share # progress = 0 means today's district heating share, progress = 1 means maximum fraction of urban demand is supplied by district heating - progress: 1 - # 2020: 0.0 - # 2030: 0.3 - # 2040: 0.6 - # 2050: 1.0 + progress: + 2020: 0.0 + 2030: 0.3 + 2040: 0.6 + 2050: 1.0 district_heating_loss: 0.15 bev_dsm_restriction_value: 0.75 #Set to 0 for no restriction on BEV DSM bev_dsm_restriction_time: 7 #Time at which SOC of BEV has to be dsm_restriction_value @@ -178,16 +178,16 @@ sector: bev_avail_mean: 0.8 v2g: true #allows feed-in to grid from EV battery #what is not EV or FCEV is oil-fuelled ICE - land_transport_fuel_cell_share: 0.15 # 1 means all FCEVs - # 2020: 0 - # 2030: 0.05 - # 2040: 0.1 - # 2050: 0.15 - land_transport_electric_share: 0.85 # 1 means all EVs - # 2020: 0 - # 2030: 0.25 - # 2040: 0.6 - # 2050: 0.85 + land_transport_fuel_cell_share: # 1 means all FCEVs + 2020: 0 + 2030: 0.05 + 2040: 0.1 + 2050: 0.15 + land_transport_electric_share: # 1 means all EVs + 2020: 0 + 2030: 0.25 + 2040: 0.6 + 2050: 0.85 transport_fuel_cell_efficiency: 0.5 transport_internal_combustion_efficiency: 0.3 agriculture_machinery_electric_share: 0 @@ -195,29 +195,22 @@ sector: agriculture_machinery_electric_efficiency: 0.3 # electricity per use shipping_average_efficiency: 0.4 #For conversion of fuel oil to propulsion in 2011 shipping_hydrogen_liquefaction: false # whether to consider liquefaction costs for shipping H2 demands - shipping_hydrogen_share: 1 # 1 means all hydrogen FC - # 2020: 0 - # 2025: 0 - # 2030: 0.05 - # 2035: 0.15 - # 2040: 0.3 - # 2045: 0.6 - # 2050: 1 + shipping_hydrogen_share: 0 time_dep_hp_cop: true #time dependent heat pump coefficient of performance heat_pump_sink_T: 55. # Celsius, based on DTU / large area radiators; used in build_cop_profiles.py # conservatively high to cover hot water and space heating in poorly-insulated buildings reduce_space_heat_exogenously: true # reduces space heat demand by a given factor (applied before losses in DH) # this can represent e.g. building renovation, building demolition, or if # the factor is negative: increasing floor area, increased thermal comfort, population growth - reduce_space_heat_exogenously_factor: 0.29 # per unit reduction in space heat demand + reduce_space_heat_exogenously_factor: # per unit reduction in space heat demand # the default factors are determined by the LTS scenario from http://tool.european-calculator.eu/app/buildings/building-types-area/?levers=1ddd4444421213bdbbbddd44444ffffff11f411111221111211l212221 - # 2020: 0.10 # this results in a space heat demand reduction of 10% - # 2025: 0.09 # first heat demand increases compared to 2020 because of larger floor area per capita - # 2030: 0.09 - # 2035: 0.11 - # 2040: 0.16 - # 2045: 0.21 - # 2050: 0.29 + 2020: 0.10 # this results in a space heat demand reduction of 10% + 2025: 0.09 # first heat demand increases compared to 2020 because of larger floor area per capita + 2030: 0.09 + 2035: 0.11 + 2040: 0.16 + 2045: 0.21 + 2050: 0.29 retrofitting : # co-optimises building renovation to reduce space heat demand retro_endogen: false # co-optimise space heat savings cost_factor: 1.0 # weight costs for building renovation @@ -252,6 +245,7 @@ sector: # - onshore # more than 50 km from sea - nearshore # within 50 km of sea # - offshore + ammonia: false # can be false (no NH3 carrier), true (copperplated NH3), "regional" (regionalised NH3 without network) use_fischer_tropsch_waste_heat: true use_fuel_cell_waste_heat: true electricity_distribution_grid: true @@ -276,36 +270,38 @@ sector: industry: - St_primary_fraction: 0.3 # fraction of steel produced via primary route versus secondary route (scrap+EAF); today fraction is 0.6 - # 2020: 0.6 - # 2025: 0.55 - # 2030: 0.5 - # 2035: 0.45 - # 2040: 0.4 - # 2045: 0.35 - # 2050: 0.3 - DRI_fraction: 1 # fraction of the primary route converted to DRI + EAF - # 2020: 0 - # 2025: 0 - # 2030: 0.05 - # 2035: 0.2 - # 2040: 0.4 - # 2045: 0.7 - # 2050: 1 + St_primary_fraction: # fraction of steel produced via primary route versus secondary route (scrap+EAF); today fraction is 0.6 + 2020: 0.6 + 2025: 0.55 + 2030: 0.5 + 2035: 0.45 + 2040: 0.4 + 2045: 0.35 + 2050: 0.3 + DRI_fraction: # fraction of the primary route converted to DRI + EAF + 2020: 0 + 2025: 0 + 2030: 0.05 + 2035: 0.2 + 2040: 0.4 + 2045: 0.7 + 2050: 1 H2_DRI: 1.7 #H2 consumption in Direct Reduced Iron (DRI), MWh_H2,LHV/ton_Steel from 51kgH2/tSt in Vogl et al (2018) doi:10.1016/j.jclepro.2018.08.279 elec_DRI: 0.322 #electricity consumption in Direct Reduced Iron (DRI) shaft, MWh/tSt HYBRIT brochure https://ssabwebsitecdn.azureedge.net/-/media/hybrit/files/hybrit_brochure.pdf - Al_primary_fraction: 0.2 # fraction of aluminium produced via the primary route versus scrap; today fraction is 0.4 - # 2020: 0.4 - # 2025: 0.375 - # 2030: 0.35 - # 2035: 0.325 - # 2040: 0.3 - # 2045: 0.25 - # 2050: 0.2 + Al_primary_fraction: # fraction of aluminium produced via the primary route versus scrap; today fraction is 0.4 + 2020: 0.4 + 2025: 0.375 + 2030: 0.35 + 2035: 0.325 + 2040: 0.3 + 2045: 0.25 + 2050: 0.2 + MWh_NH3_per_tNH3: 5.166 # LHV MWh_CH4_per_tNH3_SMR: 10.8 # 2012's demand from https://ec.europa.eu/docsroom/documents/4165/attachments/1/translations/en/renditions/pdf MWh_elec_per_tNH3_SMR: 0.7 # same source, assuming 94-6% split methane-elec of total energy demand 11.5 MWh/tNH3 MWh_H2_per_tNH3_electrolysis: 6.5 # from https://doi.org/10.1016/j.joule.2018.04.017, around 0.197 tH2/tHN3 (>3/17 since some H2 lost and used for energy) MWh_elec_per_tNH3_electrolysis: 1.17 # from https://doi.org/10.1016/j.joule.2018.04.017 Table 13 (air separation and HB) + MWh_NH3_per_MWh_H2_cracker: 1.46 # https://github.com/euronion/trace/blob/44a5ff8401762edbef80eff9cfe5a47c8d3c8be4/data/efficiencies.csv NH3_process_emissions: 24.5 # in MtCO2/a from SMR for H2 production for NH3 from UNFCCC for 2015 for EU28 petrochemical_process_emissions: 25.5 # in MtCO2/a for petrochemical and other from UNFCCC for 2015 for EU28 HVC_primary_fraction: 1. # fraction of today's HVC produced via primary route @@ -327,6 +323,7 @@ industry: # Material Economics (2019): https://materialeconomics.com/latest-updates/industrial-transformation-2050 costs: + year: 2030 lifetime: 25 #default lifetime # From a Lion Hirth paper, also reflects average of Noothout et al 2016 discountrate: 0.07 @@ -585,6 +582,12 @@ plotting: H2 pipeline retrofitted: '#ba99b5' H2 Fuel Cell: '#c251ae' H2 Electrolysis: '#ff29d9' + # ammonia + NH3: '#46caf0' + ammonia: '#46caf0' + ammonia store: '#00ace0' + ammonia cracker: '#87d0e6' + Haber-Bosch: '#076987' # syngas Sabatier: '#9850ad' methanation: '#c44ce6' diff --git a/doc/data.csv b/doc/data.csv index 2c6ac8c8..49fbc536 100644 --- a/doc/data.csv +++ b/doc/data.csv @@ -23,7 +23,7 @@ Floor area missing in hotmaps building stock data,floor_area_missing.csv,unknown Comparative level investment,comparative_level_investment.csv,Eurostat,https://ec.europa.eu/eurostat/statistics-explained/index.php?title=Comparative_price_levels_for_investment Electricity taxes,electricity_taxes_eu.csv,Eurostat,https://appsso.eurostat.ec.europa.eu/nui/show.do?dataset=nrg_pc_204&lang=en Building topologies and corresponding standard values,tabula-calculator-calcsetbuilding.csv,unknown,https://episcope.eu/fileadmin/tabula/public/calc/tabula-calculator.xlsx -Retrofitting thermal envelope costs for Germany,retro_cost_germany.csv,unkown,https://www.iwu.de/forschung/handlungslogiken/kosten-energierelevanter-bau-und-anlagenteile-bei-modernisierung/ +Retrofitting thermal envelope costs for Germany,retro_cost_germany.csv,unknown,https://www.iwu.de/forschung/handlungslogiken/kosten-energierelevanter-bau-und-anlagenteile-bei-modernisierung/ District heating most countries,jrc-idees-2015/,CC BY 4.0,https://ec.europa.eu/jrc/en/potencia/jrc-idees,, -District heating missing countries,district_heat_share.csv,unkown,https://www.euroheat.org/knowledge-hub/country-profiles,, +District heating missing countries,district_heat_share.csv,unknown,https://www.euroheat.org/knowledge-hub/country-profiles,, diff --git a/doc/installation.rst b/doc/installation.rst index 6637cdfd..f5cb7c7a 100644 --- a/doc/installation.rst +++ b/doc/installation.rst @@ -54,7 +54,7 @@ The requirements are the same as `PyPSA-Eur xarray version >= 0.15.1, you will need the latest master branch of atlite version 0.0.2. -You can create an enviroment using the environment.yaml file in pypsa-eur/envs: +You can create an environment using the environment.yaml file in pypsa-eur/envs: .. code:: bash diff --git a/doc/release_notes.rst b/doc/release_notes.rst index 931ca060..be66a9ba 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -28,7 +28,7 @@ incorporates retrofitting options to hydrogen. * New rule ``cluster_gas_network`` that clusters the gas transmission network data to the model resolution. Cross-regional pipeline capacities are aggregated - (while pressure and diameter compability is ignored), intra-regional pipelines + (while pressure and diameter compatibility is ignored), intra-regional pipelines are dropped. Lengths are recalculated based on the regions' centroids. * With the option ``sector: gas_network:``, the existing gas network is @@ -57,11 +57,13 @@ incorporates retrofitting options to hydrogen. **New features and functionality** +* Add option to aggregate network temporally using representative snapshots or segments (with tsam package) + * Add option for biomass boilers (wood pellets) for decentral heating -* Add option for BioSNG (methane from biomass) with and without CC +* Add option for BioSNG (methane from biomass) with and without CC -* Add option for BtL (Biomass to liquid fuel/oil) with and without CC +* Add option for BtL (Biomass to liquid fuel/oil) with and without CC * Units are assigned to the buses. These only provide a better understanding. The specifications of the units are not taken into account in the optimisation, which means that no automatic conversion of units takes place. @@ -71,10 +73,17 @@ incorporates retrofitting options to hydrogen. * Add option to sweep the global CO2 sequestration potentials with keyword ``seq200`` in the ``{sector_opts}`` wildcard (for limit of 200 Mt CO2). +* Add option to resolve ammonia as separate energy carrier with Haber-Bosch + synthesis, ammonia cracking, storage and industrial demand. The ammonia + carrier can be nodally resolved or copperplated across Europe. This feature is + controlled by ``sector: ammonia:``. + * Updated `data bundle `_ that includes the hydrogan salt cavern storage potentials. * Updated and extended documentation in +* Shipping demand now defaults to (synthetic) oil rather than liquefied hydrogen until 2050. + **Bugfixes** * The CO2 sequestration limit implemented as GlobalConstraint (introduced in the previous version) diff --git a/doc/spatial_resolution.rst b/doc/spatial_resolution.rst index fa87ae99..31cc8378 100644 --- a/doc/spatial_resolution.rst +++ b/doc/spatial_resolution.rst @@ -6,6 +6,8 @@ Spatial resolution The default nodal resolution of the model follows the electricity generation and transmission model `PyPSA-Eur `_, which clusters down the electricity transmission substations in each European country based on the k-means algorithm (See `cluster_network `_ for a complete explanation). This gives nodes which correspond to major load and generation centres (typically cities). +The total number of nodes for Europe is set in the ``config.yaml`` file under ``clusters``. The number of nodes can vary between 37, the number of independent countries / synchronous areas, and several hundred. With 200-300 nodes the model needs 100-150 GB RAM to solve with a commercial solver like Gurobi. + Exemplary unsolved network clustered to 512 nodes: .. image:: ../graphics/elec_s_512.png diff --git a/scripts/add_existing_baseyear.py b/scripts/add_existing_baseyear.py index 0c60288a..e5b7e1d1 100644 --- a/scripts/add_existing_baseyear.py +++ b/scripts/add_existing_baseyear.py @@ -165,11 +165,11 @@ def add_power_capacities_installed_before_baseyear(n, grouping_years, costs, bas df_agg.loc[biomass_i, 'DateOut'] = df_agg.loc[biomass_i, 'DateOut'].fillna(dateout) - # drop assets which are already phased out / decomissioned + # drop assets which are already phased out / decommissioned phased_out = df_agg[df_agg["DateOut"] Euro/MWh capital_cost = retro_data.loc[(ct, sec), ("cost")] * floor_area_node / \ @@ -2278,6 +2346,20 @@ def add_industry(n, costs): lifetime=costs.at['cement capture', 'lifetime'] ) + if options.get("ammonia"): + + if options["ammonia"] == 'regional': + p_set = industrial_demand.loc[spatial.ammonia.locations, "ammonia"].rename(index=lambda x: x + " NH3") / 8760 + else: + p_set = industrial_demand["ammonia"].sum() / 8760 + + n.madd("Load", + spatial.ammonia.nodes, + bus=spatial.ammonia.nodes, + carrier="NH3", + p_set=p_set + ) + def add_waste_heat(n): # TODO options? @@ -2417,6 +2499,88 @@ def limit_individual_line_extension(n, maxext): hvdc = n.links.index[n.links.carrier == 'DC'] n.links.loc[hvdc, 'p_nom_max'] = n.links.loc[hvdc, 'p_nom'] + maxext + +def apply_time_segmentation(n, segments, solver_name="cbc", + overwrite_time_dependent=True): + """Aggregating time series to segments with different lengths + + Input: + n: pypsa Network + segments: (int) number of segments in which the typical period should be + subdivided + solver_name: (str) name of solver + overwrite_time_dependent: (bool) overwrite time dependent data of pypsa network + with typical time series created by tsam + """ + try: + import tsam.timeseriesaggregation as tsam + except: + raise ModuleNotFoundError("Optional dependency 'tsam' not found." + "Install via 'pip install tsam'") + + # get all time-dependent data + columns = pd.MultiIndex.from_tuples([],names=['component', 'key', 'asset']) + raw = pd.DataFrame(index=n.snapshots,columns=columns) + for c in n.iterate_components(): + for attr, pnl in c.pnl.items(): + # exclude e_min_pu which is used for SOC of EVs in the morning + if not pnl.empty and attr != 'e_min_pu': + df = pnl.copy() + df.columns = pd.MultiIndex.from_product([[c.name], [attr], df.columns]) + raw = pd.concat([raw, df], axis=1) + + # normalise all time-dependent data + annual_max = raw.max().replace(0,1) + raw = raw.div(annual_max, level=0) + + # get representative segments + agg = tsam.TimeSeriesAggregation(raw, hoursPerPeriod=len(raw), + noTypicalPeriods=1, noSegments=int(segments), + segmentation=True, solver=solver_name) + segmented = agg.createTypicalPeriods() + + + weightings = segmented.index.get_level_values("Segment Duration") + offsets = np.insert(np.cumsum(weightings[:-1]), 0, 0) + timesteps = [raw.index[0] + pd.Timedelta(f"{offset}h") for offset in offsets] + snapshots = pd.DatetimeIndex(timesteps) + sn_weightings = pd.Series(weightings, index=snapshots, name="weightings", dtype="float64") + + n.set_snapshots(sn_weightings.index) + n.snapshot_weightings = n.snapshot_weightings.mul(sn_weightings, axis=0) + + # overwrite time-dependent data with timeseries created by tsam + if overwrite_time_dependent: + values_t = segmented.mul(annual_max).set_index(snapshots) + for component, key in values_t.columns.droplevel(2).unique(): + n.pnl(component)[key] = values_t[component, key] + + return n + +def set_temporal_aggregation(n, opts, solver_name): + """Aggregate network temporally.""" + for o in opts: + # temporal averaging + m = re.match(r"^\d+h$", o, re.IGNORECASE) + if m is not None: + n = average_every_nhours(n, m.group(0)) + break + # representative snapshots + m = re.match(r"(^\d+)sn$", o, re.IGNORECASE) + if m is not None: + sn = int(m[1]) + logger.info(f"use every {sn} snapshot as representative") + n.set_snapshots(n.snapshots[::sn]) + n.snapshot_weightings *= sn + break + # segments with package tsam + m = re.match(r"^(\d+)seg$", o, re.IGNORECASE) + if m is not None: + segments = int(m[1]) + logger.info(f"use temporal segmentation with {segments} segments") + n = apply_time_segmentation(n, segments, solver_name=solver_name) + break + return n #%% if __name__ == "__main__": if 'snakemake' not in globals(): @@ -2509,6 +2673,9 @@ if __name__ == "__main__": if options['dac']: add_dac(n, costs) + if options['ammonia']: + add_ammonia(n, costs) + if "decentral" in opts: decentral(n) @@ -2518,11 +2685,8 @@ if __name__ == "__main__": if options["co2_network"]: add_co2_network(n, costs) - for o in opts: - m = re.match(r'^\d+h$', o, re.IGNORECASE) - if m is not None: - n = average_every_nhours(n, m.group(0)) - break + solver_name = snakemake.config["solving"]["solver"]["name"] + n = set_temporal_aggregation(n, opts, solver_name) limit_type = "config" limit = get(snakemake.config["co2_budget"], investment_year) diff --git a/scripts/solve_network.py b/scripts/solve_network.py index 563d8c29..93442a41 100644 --- a/scripts/solve_network.py +++ b/scripts/solve_network.py @@ -227,7 +227,7 @@ def add_co2_sequestration_limit(n, sns): limit = n.config["sector"].get("co2_sequestration_potential", 200) * 1e6 for o in opts: if not "seq" in o: continue - limit = float(o[o.find("seq")+3:]) + limit = float(o[o.find("seq")+3:]) * 1e6 break name = 'co2_sequestration_limit' diff --git a/test/config.myopic.yaml b/test/config.myopic.yaml index 1a54b937..d0a6a918 100644 --- a/test/config.myopic.yaml +++ b/test/config.myopic.yaml @@ -262,6 +262,9 @@ sector: biomass_transport: false # biomass transport between nodes conventional_generation: # generator : carrier OCGT: gas + biomass_boiler: false + biomass_to_liquid: false + biosng: false industry: @@ -316,6 +319,7 @@ industry: # Material Economics (2019): https://materialeconomics.com/latest-updates/industrial-transformation-2050 costs: + year: 2030 lifetime: 25 #default lifetime # From a Lion Hirth paper, also reflects average of Noothout et al 2016 discountrate: 0.07 diff --git a/test/config.overnight.yaml b/test/config.overnight.yaml index 3764c8fa..1dc314dd 100644 --- a/test/config.overnight.yaml +++ b/test/config.overnight.yaml @@ -260,6 +260,9 @@ sector: biomass_transport: false # biomass transport between nodes conventional_generation: # generator : carrier OCGT: gas + biomass_boiler: false + biomass_to_liquid: false + biosng: false industry: @@ -314,6 +317,7 @@ industry: # Material Economics (2019): https://materialeconomics.com/latest-updates/industrial-transformation-2050 costs: + year: 2030 lifetime: 25 #default lifetime # From a Lion Hirth paper, also reflects average of Noothout et al 2016 discountrate: 0.07