diff --git a/Snakefile b/Snakefile index 218041c67..a00aef0f8 100644 --- a/Snakefile +++ b/Snakefile @@ -30,6 +30,12 @@ copy_default_files() configfile: "config.default.yaml" configfile: "configs/bundle_config.yaml" configfile: "configs/powerplantmatching_config.yaml" +configfile: "config.spatial.yaml" +configfile: "config.weather.yaml" +configfile: "config.elec.yaml" +configfile: "config.costs.yaml" +configfile: "config.solve.yaml" +configfile: "config.plot.yaml" configfile: "config.yaml" diff --git a/config.default.yaml b/config.default.yaml deleted file mode 100644 index 431812b94..000000000 --- a/config.default.yaml +++ /dev/null @@ -1,976 +0,0 @@ -# SPDX-FileCopyrightText: PyPSA-Earth and PyPSA-Eur Authors -# -# SPDX-License-Identifier: CC0-1.0 - -version: 0.4.1 -tutorial: false - -logging: - level: INFO - format: "%(levelname)s:%(name)s:%(message)s" - -results_dir: results/ -summary_dir: results/ -costs_dir: data/ # TODO change to the equivalent of technology data - -foresight: overnight - - -countries: ["NG", "BJ"] -# Can be replaced by country ["NG", "BJ"], continent ["Africa"] or user-specific region, see more at https://pypsa-earth.readthedocs.io/en/latest/configuration.html#top-level-configuration - -enable: - retrieve_databundle: true # Recommended 'true', for the first run. Otherwise data might be missing. - retrieve_databundle_sector: true - retrieve_cost_data: true # true: retrieves cost data from technology data and saves in resources/costs.csv, false: uses cost data in data/costs.csv - download_osm_data: true # If 'true', OpenStreetMap data will be downloaded for the above given countries - build_natura_raster: false # If True, then an exclusion raster will be build - build_cutout: false - # If "build_cutout" : true, then environmental data is extracted according to `snapshots` date range and `countries` - # requires cds API key https://cds.climate.copernicus.eu/api-how-to - # More information https://atlite.readthedocs.io/en/latest/introduction.html#datasets - progress_bar: true # show progress bar during downloading routines and other long-running tasks - - - -custom_rules: [] # Default empty [] or link to custom rule file e.g. ["my_folder/my_rules.smk"] that add rules to Snakefile - -run: - name: "" # use this to keep track of runs with different settings - shared_cutouts: true # set to true to share the default cutout(s) across runs - # Note: value false requires build_cutout to be enabled - allow_scenario_failure: false # If True, the workflow will continue even if a scenario in run_scnenario fails - -scenario: - simpl: [""] - ll: ["copt"] - clusters: [10] - opts: [Co2L-3H] - planning_horizons: # investment years for myopic and perfect; or costs year for overnight - - 2030 - sopts: - - "144H" - demand: - - "AB" - -snapshots: - start: "2013-01-01" - end: "2014-01-01" - inclusive: "left" # end is not inclusive - -# definition of the Coordinate Reference Systems -crs: - geo_crs: EPSG:4326 # general geographic projection, not used for metric measures. "EPSG:4326" is the standard used by OSM and google maps - distance_crs: EPSG:3857 # projection for distance measurements only. Possible recommended values are "EPSG:3857" (used by OSM and Google Maps) - area_crs: ESRI:54009 # projection for area measurements only. Possible recommended values are Global Mollweide "ESRI:54009" - -# download_osm_data_nprocesses: 10 # (optional) number of threads used to download osm data - -augmented_line_connection: - add_to_snakefile: false # If True, includes this rule to the workflow - connectivity_upgrade: 2 # Min. lines connection per node, - # 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 - new_line_type: ["HVAC"] # Expanded lines can be either ["HVAC"] or ["HVDC"] or both ["HVAC", "HVDC"] - min_expansion: 1 # [MW] New created line expands by float/int input - min_DC_length: 600 # [km] Minimum line length of DC line - -cluster_options: - simplify_network: - to_substations: false # network is simplified to nodes with positive or negative power injection (i.e. substations or offwind connections) - algorithm: kmeans # choose from: [hac, kmeans] - feature: solar+onwind-time # only for hac. choose from: [solar+onwind-time, solar+onwind-cap, solar-time, solar-cap, solar+offwind-cap] etc. - exclude_carriers: [] - remove_stubs: true - remove_stubs_across_borders: true - p_threshold_drop_isolated: 20 # [MW] isolated buses are being discarded if bus mean power is below the specified threshold - p_threshold_merge_isolated: 300 # [MW] isolated buses are being merged into a single isolated bus if a bus mean power is below the specified threshold - s_threshold_fetch_isolated: 0.05 # [-] a share of the national load for merging an isolated network into a backbone network - cluster_network: - algorithm: kmeans - feature: solar+onwind-time - exclude_carriers: [] - alternative_clustering: false # "False" use Voronoi shapes, "True" use GADM shapes - distribute_cluster: ["load"] # Distributes cluster nodes per country according to ['load'],['pop'] or ['gdp'] - out_logging: true # When "True", logging is printed to console - aggregation_strategies: - generators: # use "min" for more conservative assumptions - p_nom: sum - p_nom_max: sum - p_nom_min: sum - p_min_pu: mean - marginal_cost: mean - committable: any - ramp_limit_up: max - ramp_limit_down: max - efficiency: mean - -build_shape_options: - gadm_layer_id: 1 # GADM level area used for the gadm_shapes. Codes are country-dependent but roughly: 0: country, 1: region/county-like, 2: municipality-like - update_file: false # When true, all the input files are downloaded again and replace the existing files - out_logging: true # When true, logging is printed to console - year: 2020 # reference year used to derive shapes, info on population and info on GDP - nprocesses: 3 # number of processes to be used in build_shapes - worldpop_method: "standard" # "standard" pulls from web 1kmx1km raster, "api" pulls from API 100mx100m raster, - # false (not "false") no pop addition to shape which is useful when generating only cutout - gdp_method: "standard" # "standard" pulls from web 1x1km raster, false (not "false") no gdp addition to shape which useful when generating only cutout - contended_flag: "set_by_country" # "set_by_country" assigns the contended areas to the countries according to the GADM database, "drop" drops these contended areas from the model - -clean_osm_data_options: # osm = OpenStreetMap - names_by_shapes: true # Set the country name based on the extended country shapes - threshold_voltage: 51000 # [V] minimum voltage threshold to keep the asset (cable, line, generator, etc.) [V] - tag_substation: "transmission" # Filters only substations with 'transmission' tag, ('distribution' also available) - add_line_endings: true # When "True", then line endings are added to the dataset of the substations - generator_name_method: OSM # Methodology to specify the name to the generator. Options: OSM (name as by OSM dataset), closest_city (name by the closest city) - use_custom_lines: "OSM_only" # Use OSM (OSM_only), customized (custom_only), or both data sets (add_custom) - path_custom_lines: false # If exists, provide the specific absolute path of the custom file e.g. (...\data\custom_lines.geojson) - use_custom_substations: "OSM_only" # Use OSM (OSM_only), customized (custom_only), or both data sets (add_custom) - path_custom_substations: false # If exists, provide the specific absolute path of the custom file e.g. (...\data\custom_substations.geojson) - use_custom_cables: "OSM_only" # Use OSM (OSM_only), customized (custom_only), or both data sets (add_custom) - path_custom_cables: false # If exists, provide the specific absolute path of the custom file e.g. (...\data\custom_cables.geojson) - -build_osm_network: # Options of the build_osm_network script; osm = OpenStreetMap - group_close_buses: true # When "True", close buses are merged and guarantee the voltage matching among line endings - group_tolerance_buses: 5000 # [m] (default 5000) Tolerance in meters of the close buses to merge - split_overpassing_lines: true # When True, lines overpassing buses are splitted and connected to the bueses - overpassing_lines_tolerance: 1 # [m] (default 1) Tolerance to identify lines overpassing buses - force_ac: false # When true, it forces all components (lines and substation) to be AC-only. To be used if DC assets create problem. - -base_network: - min_voltage_substation_offshore: 51000 # [V] minimum voltage of the offshore substations - min_voltage_rebase_voltage: 51000 # [V] minimum voltage in base network - -load_options: - ssp: "ssp2-2.6" # shared socio-economic pathway (GDP and population growth) scenario to consider - weather_year: 2013 # Load scenarios available with different weather year (different renewable potentials) - prediction_year: 2030 # Load scenarios available with different prediction year (GDP, population) - scale: 1 # scales all load time-series, i.e. 2 = doubles load - -electricity: - base_voltage: 380. - voltages: [132., 220., 300., 380., 500., 750.] - co2limit: 7.75e+7 # European default, 0.05 * 3.1e9*0.5, needs to be adjusted for Africa - co2base: 1.487e+9 # European default, adjustment to Africa necessary - agg_p_nom_limits: data/agg_p_nom_minmax.csv - hvdc_as_lines: false # should HVDC lines be modeled as `Line` or as `Link` component? - automatic_emission: false - automatic_emission_base_year: 1990 # 1990 is taken as default. Any year from 1970 to 2018 can be selected. - - operational_reserve: # like https://genxproject.github.io/GenX/dev/core/#Reserves - activate: false - epsilon_load: 0.02 # share of total load - epsilon_vres: 0.02 # share of total renewable supply - contingency: 0 # fixed capacity in MW - - max_hours: - battery: 6 - H2: 168 - - extendable_carriers: - Generator: [solar, onwind, offwind-ac, offwind-dc, OCGT] - StorageUnit: [] # battery, H2 - Store: [battery, H2] - Link: [] # H2 pipeline - - powerplants_filter: (DateOut >= 2022 or DateOut != DateOut) - custom_powerplants: false # "false" use only powerplantmatching (ppm) data, "merge" combines ppm and custom powerplants, "replace" use only custom powerplants - - conventional_carriers: [nuclear, oil, OCGT, CCGT, coal, lignite, geothermal, biomass] - renewable_carriers: [solar, onwind, offwind-ac, offwind-dc, hydro] - - estimate_renewable_capacities: - stats: "irena" # False, = greenfield expansion, 'irena' uses IRENA stats to add expansion limits - year: 2023 # Reference year, available years for IRENA stats are 2000 to 2023 - p_nom_min: 1 # any float, scales the minimum expansion acquired from stats, i.e. 110% of 's capacities => p_nom_min: 1.1 - p_nom_max: false # sets the expansion constraint, False to deactivate this option and use estimated renewable potentials determine by the workflow, float scales the p_nom_min factor accordingly - technology_mapping: - # Wind is the Fueltype in ppm.data.Capacity_stats, onwind, offwind-{ac,dc} the carrier in PyPSA-Earth - Offshore: [offwind-ac, offwind-dc] - Onshore: [onwind] - PV: [solar] - -lines: - ac_types: - 132.: "243-AL1/39-ST1A 20.0" - 220.: "Al/St 240/40 2-bundle 220.0" - 300.: "Al/St 240/40 3-bundle 300.0" - 380.: "Al/St 240/40 4-bundle 380.0" - 500.: "Al/St 240/40 4-bundle 380.0" - 750.: "Al/St 560/50 4-bundle 750.0" - dc_types: - 500.: "HVDC XLPE 1000" - s_max_pu: 0.7 - s_nom_max: .inf - length_factor: 1.25 - under_construction: "zero" # 'zero': set capacity to zero, 'remove': remove, 'keep': with full capacity - -links: - p_max_pu: 1.0 - p_nom_max: .inf - under_construction: "zero" # 'zero': set capacity to zero, 'remove': remove, 'keep': with full capacity - -transformers: - x: 0.1 - s_nom: 2000. - type: "" - -atlite: - nprocesses: 4 - cutouts: - cutout-2013-era5: - module: era5 - dx: 0.3 # cutout resolution - dy: 0.3 # cutout resolution - # The cutout time is automatically set by the snapshot range. See `snapshot:` option above and 'build_cutout.py'. - # time: ["2013-01-01", "2014-01-01"] # to manually specify a different weather year (~70 years available) - # The cutout spatial extent [x,y] is automatically set by country selection. See `countires:` option above and 'build_cutout.py'. - # x: [-12., 35.] # set cutout range manual, instead of automatic by boundaries of country - # y: [33., 72] # manual set cutout range - -renewable: - onwind: - cutout: cutout-2013-era5 - resource: - method: wind - turbine: Vestas_V112_3MW - capacity_per_sqkm: 3 # conservative, ScholzPhd Tab 4.3.1: 10MW/km^2 - # correction_factor: 0.93 - copernicus: - # Scholz, Y. (2012). Renewable energy based electricity supply at low costs: - # development of the REMix model and application for Europe. ( p.42 / p.28) - # CLC grid codes: - # 11X/12X - Various forest types - # 20 - Shrubs - # 30 - Herbaceus vegetation - # 40 - Cropland - # 50 - Urban - # 60 - Bare / Sparse vegetation - # 80 - Permanent water bodies - # 100 - Moss and lichen - # 200 - Open sea - grid_codes: [20, 30, 40, 60, 100, 111, 112, 113, 114, 115, 116, 121, 122, 123, 124, 125, 126] - distance: 1000 - distance_grid_codes: [50] - natura: true - potential: simple # or conservative - clip_p_max_pu: 1.e-2 - extendable: true - offwind-ac: - cutout: cutout-2013-era5 - resource: - method: wind - turbine: NREL_ReferenceTurbine_5MW_offshore - capacity_per_sqkm: 2 - # correction_factor: 0.8855 - # proxy for wake losses - # from 10.1016/j.energy.2018.08.153 - # until done more rigorously in #153 - copernicus: - grid_codes: [80, 200] - natura: true - max_depth: 50 - max_shore_distance: 30000 - potential: simple # or conservative - clip_p_max_pu: 1.e-2 - extendable: true - offwind-dc: - cutout: cutout-2013-era5 - resource: - method: wind - turbine: NREL_ReferenceTurbine_5MW_offshore - # ScholzPhd Tab 4.3.1: 10MW/km^2 - capacity_per_sqkm: 3 - # correction_factor: 0.8855 - # proxy for wake losses - # from 10.1016/j.energy.2018.08.153 - # until done more rigorously in #153 - copernicus: - grid_codes: [80, 200] - natura: true - max_depth: 50 - min_shore_distance: 30000 - potential: simple # or conservative - clip_p_max_pu: 1.e-2 - extendable: true - solar: - cutout: cutout-2013-era5 - resource: - method: pv - panel: CSi - orientation: latitude_optimal # will lead into optimal design - # slope: 0. # slope: 0 represent a flat panel - # azimuth: 180. # azimuth: 180 south orientation - capacity_per_sqkm: 4.6 # From 1.7 to 4.6 addresses issue #361 - # Determined by comparing uncorrected area-weighted full-load hours to those - # published in Supplementary Data to - # Pietzcker, Robert Carl, et al. "Using the sun to decarbonize the power - # sector: The economic potential of photovoltaics and concentrating solar - # power." Applied Energy 135 (2014): 704-720. - correction_factor: 0.854337 - copernicus: - grid_codes: [20, 30, 40, 50, 60, 90, 100] - natura: true - potential: simple # or conservative - clip_p_max_pu: 1.e-2 - extendable: true - hydro: - cutout: cutout-2013-era5 - hydrobasins_level: 6 - resource: - method: hydro - hydrobasins: data/hydrobasins/hybas_world.shp - flowspeed: 1.0 # m/s - # weight_with_height: false - # show_progress: true - carriers: [ror, PHS, hydro] - PHS_max_hours: 6 - hydro_max_hours: "energy_capacity_totals_by_country" # not active - hydro_max_hours_default: 6.0 # (optional, default 6) Default value of max_hours for hydro when NaN values are found - clip_min_inflow: 1.0 - extendable: true - normalization: - method: hydro_capacities # 'hydro_capacities' to rescale country hydro production by using hydro_capacities, 'eia' to rescale by eia data, false for no rescaling - year: 2013 # (optional) year of statistics used to rescale the runoff time series. When not provided, the cutout weather year is used - multiplier: 1.1 # multiplier applied after the normalization of the hydro production; default 1.0 - csp: - cutout: cutout-2013-era5 - resource: - method: csp - installation: SAM_solar_tower - capacity_per_sqkm: 2.392 # From 1.7 to 4.6 addresses issue #361 - # Determined by comparing uncorrected area-weighted full-load hours to those - # published in Supplementary Data to - # Pietzcker, Robert Carl, et al. "Using the sun to decarbonize the power - # sector: The economic potential of photovoltaics and concentrating solar - # power." Applied Energy 135 (2014): 704-720. - copernicus: - grid_codes: [20, 30, 40, 60, 90] - distancing_codes: [50] - distance_to_codes: 3000 - natura: true - potential: simple # or conservative - clip_p_max_pu: 1.e-2 - extendable: true - csp_model: advanced # simple or advanced - -# TODO: Needs to be adjusted for Africa. -costs: - year: 2030 - version: v0.6.2 - discountrate: [0.071] #, 0.086, 0.111] - # [EUR/USD] ECB: https://www.ecb.europa.eu/stats/exchange/eurofxref/html/eurofxref-graph-usd.en.html # noqa: E501 - USD2013_to_EUR2013: 0.7532 # [EUR/USD] ECB: https://www.ecb.europa.eu/stats/exchange/eurofxref/html/eurofxref-graph-usd.en.html - rooftop_share: 0.14 # based on the potentials, assuming (0.1 kW/m2 and 10 m2/person) - fill_values: - FOM: 0 - VOM: 0 - efficiency: 1 - fuel: 0 - investment: 0 - lifetime: 25 - CO2 intensity: 0 - discount rate: 0.07 - marginal_cost: # EUR/MWh - solar: 0.01 - onwind: 0.015 - offwind: 0.015 - hydro: 0. - H2: 0. - electrolysis: 0. - fuel cell: 0. - battery: 0. - battery inverter: 0. - emission_prices: # in currency per tonne emission, only used with the option Ep - co2: 0. - # investment: # EUR/MW - # CCGT: 830000 - # FOM: # %/year - # CCGT: 3.35 - # VOM: # EUR/MWh - # CCGT: 4.2 - # fuel: # EUR/MWh - # gas: 10.1 - # lifetime: # years - # CCGT: 25.0 - # efficiency: # per unit - # CCGT: 0.58 - lines: - length_factor: 1.25 #to estimate offwind connection costs - - -monte_carlo: - # Description: Specify Monte Carlo sampling options for uncertainty analysis. - # Define the option list for Monte Carlo sampling. - # Make sure add_to_snakefile is set to true to enable Monte-Carlo - options: - add_to_snakefile: false # When set to true, enables Monte Carlo sampling - samples: 9 # number of optimizations. Note that number of samples when using scipy has to be the square of a prime number - sampling_strategy: "chaospy" # "pydoe2", "chaospy", "scipy", packages that are supported - seed: 42 # set seedling for reproducibilty - # Uncertanties on any PyPSA object are specified by declaring the specific PyPSA object under the key 'uncertainties'. - # For each PyPSA object, the 'type' and 'args' keys represent the type of distribution and its argument, respectively. - # Supported distributions types are uniform, normal, lognormal, triangle, beta and gamma. - # The arguments of the distribution are passed using the key 'args' as follows, tailored by distribution type - # normal: [mean, std], lognormal: [mean, std], uniform: [lower_bound, upper_bound], - # triangle: [mid_point (between 0 - 1)], beta: [alpha, beta], gamma: [shape, scale] - # More info on the distributions are documented in the Chaospy reference guide... - # https://chaospy.readthedocs.io/en/master/reference/distribution/index.html - # An abstract example is as follows: - # {pypsa network object, e.g. "loads_t.p_set"}: - # type: {any supported distribution among the previous: "uniform", "normal", ...} - # args: {arguments passed as a list depending on the distribution, see the above and more at https://pypsa.readthedocs.io/} - uncertainties: - loads_t.p_set: - type: uniform - args: [0, 1] - generators_t.p_max_pu.loc[:, n.generators.carrier == "onwind"]: - type: lognormal - args: [1.5] - generators_t.p_max_pu.loc[:, n.generators.carrier == "solar"]: - type: beta - args: [0.5, 2] - -# ------------------- SECTOR OPTIONS ------------------- - -policy_config: - hydrogen: - temporal_matching: "no_res_matching" # either "h2_yearly_matching", "h2_monthly_matching", "no_res_matching" - spatial_matching: false - additionality: false # RE electricity is equal to the amount required for additional hydrogen export compared to the 0 export case ("reference_case") - allowed_excess: 1.0 - is_reference: false # Whether or not this network is a reference case network, relevant only if additionality is _true_ - remove_h2_load: false #Whether or not to remove the h2 load from the network, relevant only if is_reference is _true_ - path_to_ref: "" # Path to the reference case network for additionality calculation, relevant only if additionality is _true_ and is_reference is _false_ - re_country_load: false # Set to "True" to force the RE electricity to be equal to the electricity required for hydrogen export and the country electricity load. "False" excludes the country electricity load from the constraint. - - -demand_data: - update_data: true # if true, the workflow downloads the energy balances data saved in data/demand/unsd/data again. Turn on for the first run. - base_year: 2019 - - other_industries: false # Whether or not to include industries that are not specified. some countries have has exaggerated numbers, check carefully. - aluminium_year: 2019 # Year of the aluminium demand data specified in `data/AL_production.csv` - - -fossil_reserves: - oil: 100 #TWh Maybe redundant - -export: - h2export: [10] # Yearly export demand in TWh - store: true # [True, False] # specifies whether an export store to balance demand is implemented - store_capital_costs: "no_costs" # ["standard_costs", "no_costs"] # specifies the costs of the export store. "standard_costs" takes CAPEX of "hydrogen storage tank type 1 including compressor" - export_profile: "ship" # use "ship" or "constant" - ship: - ship_capacity: 0.4 # TWh # 0.05 TWh for new ones, 0.003 TWh for Susio Frontier, 0.4 TWh according to Hampp2021: "Corresponds to 11360 t H2 (l) with LHV of 33.3333 Mwh/t_H2. Cihlar et al 2020 based on IEA 2019, Table 3-B" - travel_time: 288 # hours # From Agadir to Rotterdam and back (12*24) - fill_time: 24 # hours, for 48h see Hampp2021 - unload_time: 24 # hours for 48h see Hampp2021 - -custom_data: - renewables: [] # ['csp', 'rooftop-solar', 'solar'] - elec_demand: false - heat_demand: false - industry_demand: false - industry_database: false - transport_demand: false - water_costs: false - h2_underground: false - add_existing: false - custom_sectors: false - gas_network: false # If "True" then a custom .csv file must be placed in "resources/custom_data/pipelines.csv" , If "False" the user can choose btw "greenfield" or Model built-in datasets. Please refer to ["sector"] below. - -industry: - reference_year: 2015 - -solar_thermal: - clearsky_model: simple - orientation: - slope: 45. - azimuth: 180. - -existing_capacities: - grouping_years_power: [1960, 1965, 1970, 1975, 1980, 1985, 1990, 1995, 2000, 2005, 2010, 2015, 2020, 2025, 2030] - grouping_years_heat: [1980, 1985, 1990, 1995, 2000, 2005, 2010, 2015, 2019] # these should not extend 2020 - threshold_capacity: 10 - default_heating_lifetime: 20 - conventional_carriers: - - lignite - - coal - - oil - - uranium - -sector: - gas: - spatial_gas: true # ALWAYS TRUE - network: false # ALWAYS FALSE for now (NOT USED) - network_data: GGIT # Global dataset -> 'GGIT' , European dataset -> 'IGGIELGN' - network_data_GGIT_status: ["Construction", "Operating", "Idle", "Shelved", "Mothballed", "Proposed"] - hydrogen: - network: true - H2_retrofit_capacity_per_CH4: 0.6 - network_limit: 2000 #GWkm - network_routes: gas # "gas or "greenfield". If "gas" -> the network data are fetched from ["sector"]["gas"]["network_data"]. If "greenfield" -> the network follows the topology of electrical transmission lines - gas_network_repurposing: true # If true -> ["sector"]["gas"]["network"] is automatically false - underground_storage: false - hydrogen_colors: false - set_color_shares: false - blue_share: 0.40 - pink_share: 0.05 - coal: - shift_to_elec: true # If true, residential and services demand of coal is shifted to electricity. If false, the final energy demand of coal is disregarded - - international_bunkers: false #Whether or not to count the emissions of international aviation and navigation - - oil: - spatial_oil: true - - district_heating: - potential: 0.3 #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 - district_heating_loss: 0.15 - 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 - # 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 - - tes: true - tes_tau: # 180 day time constant for centralised, 3 day for decentralised - decentral: 3 - central: 180 - boilers: true - oil_boilers: false - chp: true - micro_chp: false - solar_thermal: true - heat_pump_sink_T: 55 #Celsius, based on DTU / large area radiators; used un build_cop_profiles.py - time_dep_hp_cop: true #time dependent heat pump coefficient of performance - solar_cf_correction: 0.788457 # = >>>1/1.2683 - bev_plug_to_wheel_efficiency: 0.2 #kWh/km from EPA https://www.fueleconomy.gov/feg/ for Tesla Model S - bev_charge_efficiency: 0.9 #BEV (dis-)charging efficiency - transport_heating_deadband_upper: 20. - transport_heating_deadband_lower: 15. - ICE_lower_degree_factor: 0.375 #in per cent increase in fuel consumption per degree above deadband - ICE_upper_degree_factor: 1.6 - EV_lower_degree_factor: 0.98 - EV_upper_degree_factor: 0.63 - bev_avail_max: 0.95 - bev_avail_mean: 0.8 - 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 - v2g: true #allows feed-in to grid from EV battery - bev_dsm: true #turns on EV battery - bev_energy: 0.05 #average battery size in MWh - bev_availability: 0.5 #How many cars do smart charging - transport_fuel_cell_efficiency: 0.5 - transport_internal_combustion_efficiency: 0.3 - industry_util_factor: 0.7 - - biomass_transport: true # biomass transport between nodes - biomass_transport_default_cost: 0.1 #EUR/km/MWh - solid_biomass_potential: 40 # TWh/a, Potential of whole modelled area - biogas_potential: 0.5 # TWh/a, Potential of whole modelled area - - efficiency_heat_oil_to_elec: 0.9 - efficiency_heat_biomass_to_elec: 0.9 - efficiency_heat_gas_to_elec: 0.9 - - dynamic_transport: - enable: false # If "True", then the BEV and FCEV shares are obtained depending on the "Co2L"-wildcard (e.g. "Co2L0.70: 0.10"). If "False", then the shares are obtained depending on the "demand" wildcard and "planning_horizons" wildcard as listed below (e.g. "DF_2050: 0.08") - land_transport_electric_share: - Co2L2.0: 0.00 - Co2L1.0: 0.01 - Co2L0.90: 0.03 - Co2L0.80: 0.06 - Co2L0.70: 0.10 - Co2L0.60: 0.17 - Co2L0.50: 0.27 - Co2L0.40: 0.40 - Co2L0.30: 0.55 - Co2L0.20: 0.69 - Co2L0.10: 0.80 - Co2L0.00: 0.88 - land_transport_fuel_cell_share: - Co2L2.0: 0.01 - Co2L1.0: 0.01 - Co2L0.90: 0.01 - Co2L0.80: 0.01 - Co2L0.70: 0.01 - Co2L0.60: 0.01 - Co2L0.50: 0.01 - Co2L0.40: 0.01 - Co2L0.30: 0.01 - Co2L0.20: 0.01 - Co2L0.10: 0.01 - Co2L0.00: 0.01 - - land_transport_fuel_cell_share: # 1 means all FCEVs HERE - BU_2030: 0.00 - AP_2030: 0.004 - NZ_2030: 0.02 - DF_2030: 0.01 - AB_2030: 0.01 - BU_2050: 0.00 - AP_2050: 0.06 - NZ_2050: 0.28 - DF_2050: 0.08 - - land_transport_electric_share: # 1 means all EVs # This leads to problems when non-zero HERE - BU_2030: 0.00 - AP_2030: 0.075 - NZ_2030: 0.13 - DF_2030: 0.01 - AB_2030: 0.01 - BU_2050: 0.00 - AP_2050: 0.42 - NZ_2050: 0.68 - DF_2050: 0.011 - - co2_network: true - co2_sequestration_potential: 200 #MtCO2/a sequestration potential for Europe - co2_sequestration_cost: 10 #EUR/tCO2 for sequestration of CO2 - hydrogen_underground_storage: true - shipping_hydrogen_liquefaction: false - shipping_average_efficiency: 0.4 #For conversion of fuel oil to propulsion in 2011 - - shipping_hydrogen_share: #1.0 - BU_2030: 0.00 - AP_2030: 0.00 - NZ_2030: 0.10 - DF_2030: 0.05 - AB_2030: 0.05 - BU_2050: 0.00 - AP_2050: 0.25 - NZ_2050: 0.36 - DF_2050: 0.12 - - gadm_level: 1 - h2_cavern: true - marginal_cost_storage: 0 - methanation: true - helmeth: true - dac: true - SMR: true - SMR CC: true - cc_fraction: 0.9 - cc: true - space_heat_share: 0.6 # the share of space heating from all heating. Remainder goes to water heating. - airport_sizing_factor: 3 - - min_part_load_fischer_tropsch: 0.9 - - conventional_generation: # generator : carrier - OCGT: gas - #Gen_Test: oil # Just for testing purposes - - -solving: - options: - formulation: kirchhoff - load_shedding: true - noisy_costs: true - min_iterations: 4 - max_iterations: 6 - clip_p_max_pu: 0.01 - skip_iterations: true - track_iterations: false - # nhours: 10 - - solver: - name: gurobi - options: gurobi-default - - solver_options: - highs-default: - # refer to https://ergo-code.github.io/HiGHS/dev/options/definitions/ - threads: 4 - solver: "ipm" - run_crossover: "off" - small_matrix_value: 1e-6 - large_matrix_value: 1e9 - primal_feasibility_tolerance: 1e-5 - dual_feasibility_tolerance: 1e-5 - ipm_optimality_tolerance: 1e-4 - parallel: "on" - random_seed: 123 - gurobi-default: - threads: 4 - method: 2 # barrier - crossover: 0 - BarConvTol: 1.e-6 - Seed: 123 - AggFill: 0 - PreDual: 0 - GURO_PAR_BARDENSETHRESH: 200 - gurobi-numeric-focus: - NumericFocus: 3 # Favour numeric stability over speed - method: 2 # barrier - crossover: 0 # do not use crossover - BarHomogeneous: 1 # Use homogeneous barrier if standard does not converge - BarConvTol: 1.e-5 - FeasibilityTol: 1.e-4 - OptimalityTol: 1.e-4 - ObjScale: -0.5 - threads: 8 - Seed: 123 - gurobi-fallback: # Use gurobi defaults - crossover: 0 - method: 2 # barrier - BarHomogeneous: 1 # Use homogeneous barrier if standard does not converge - BarConvTol: 1.e-5 - FeasibilityTol: 1.e-5 - OptimalityTol: 1.e-5 - Seed: 123 - threads: 8 - cplex-default: - threads: 4 - lpmethod: 4 # barrier - solutiontype: 2 # non basic solution, ie no crossover - barrier.convergetol: 1.e-5 - feasopt.tolerance: 1.e-6 - copt-default: - Threads: 8 - LpMethod: 2 - Crossover: 0 - cbc-default: {} # Used in CI - glpk-default: {} # Used in CI - - mem: 30000 #memory in MB; 20 GB enough for 50+B+I+H2; 100 GB for 181+B+I+H2 - - -plotting: - map: - figsize: [7, 7] - boundaries: [-10.2, 29, 35, 72] - p_nom: - bus_size_factor: 5.e+4 - linewidth_factor: 3.e+3 - color_geomap: - ocean: white - land: whitesmoke - - costs_max: 10 - costs_threshold: 0.2 - - energy_max: 20000 - energy_min: -20000 - energy_threshold: 15 - - vre_techs: - - onwind - - offwind-ac - - offwind-dc - - solar - - ror - conv_techs: - - OCGT - - CCGT - - nuclear - - Nuclear - - coal - - oil - storage_techs: - - hydro+PHS - - battery - - H2 - renewable_storage_techs: - - PHS - - hydro - load_carriers: - - AC load - AC_carriers: - - AC line - - AC transformer - link_carriers: - - DC line - - Converter AC-DC - heat_links: - - heat pump - - resistive heater - - CHP heat - - CHP electric - - gas boiler - - central heat pump - - central resistive heater - - central CHP heat - - central CHP electric - - central gas boiler - heat_generators: - - gas boiler - - central gas boiler - - solar thermal collector - - central solar thermal collector - - tech_colors: - onwind: #235ebc - onshore wind: #235ebc - offwind: #6895dd - offwind-ac: #6895dd - offshore wind: #6895dd - offshore wind ac: #6895dd - offshore wind (AC): #6895dd - offwind-dc: #74c6f2 - offshore wind dc: #74c6f2 - offshore wind (DC): #74c6f2 - wave: #004444 - hydro: #08ad97 - hydro+PHS: #08ad97 - PHS: #08ad97 - hydro reservoir: #08ad97 - hydroelectricity: #08ad97 - ror: #4adbc8 - run of river: #4adbc8 - solar: #f9d002 - solar PV: #f9d002 - solar thermal: #ffef60 - solar rooftop: #ffef60 - biomass: #0c6013 - solid biomass: #06540d - solid biomass for industry co2 from atmosphere: #654321 - solid biomass for industry co2 to stored: #654321 - solid biomass for industry CC: #654321 - biogas: #23932d - waste: #68896b - geothermal: #ba91b1 - OCGT: #d35050 - OCGT marginal: sandybrown - OCGT-heat: #ee8340 - gas: #d35050 - natural gas: #d35050 - gas boiler: #ee8340 - gas boilers: #ee8340 - gas boiler marginal: #ee8340 - gas-to-power/heat: brown - SMR: #4F4F2F - SMR CC: darkblue - oil: #262626 - oil boiler: #B5A642 - oil emissions: #666666 - gas for industry: #333333 - gas for industry CC: brown - gas for industry co2 to atmosphere: #654321 - gas for industry co2 to stored: #654321 - nuclear: #ff9000 - Nuclear: r - Nuclear marginal: r - uranium: r - coal: #707070 - Coal: k - Coal marginal: k - lignite: #9e5a01 - Lignite: grey - Lignite marginal: grey - H2: #ea048a - H2 for industry: #222222 - H2 for shipping: #6495ED - H2 liquefaction: m - hydrogen storage: #ea048a - battery: slategray - battery discharger: slategray - battery charger: slategray - battery storage: slategray - home battery: #614700 - home battery storage: #614700 - lines: #70af1d - transmission lines: #70af1d - AC: #70af1d - AC-AC: #70af1d - AC line: #70af1d - links: #8a1caf - HVDC links: #8a1caf - DC: #8a1caf - DC-DC: #8a1caf - DC link: #8a1caf - load: #ff0000 - load shedding: #ff0000 - Electric load: b - electricity: k - electric demand: k - electricity distribution grid: y - heat: darkred - Heat load: r - heat pumps: #76EE00 - heat pump: #76EE00 - air heat pump: #76EE00 - ground heat pump: #40AA00 - CHP: r - CHP heat: r - CHP electric: r - heat demand: darkred - rural heat: #880000 - central heat: #b22222 - decentral heat: #800000 - low-temperature heat for industry: #991111 - process heat: #FF3333 - power-to-heat: red - resistive heater: pink - Sabatier: #FF1493 - methanation: #FF1493 - power-to-gas: purple - power-to-liquid: darkgreen - helmeth: #7D0552 - DAC: deeppink - co2 stored: #123456 - CO2 pipeline: gray - CO2 sequestration: #123456 - co2: #123456 - co2 vent: #654321 - process emissions: #222222 - process emissions CC: gray - process emissions to stored: #444444 - process emissions to atmosphere: #888888 - agriculture heat: #D07A7A - agriculture machinery oil: #1e1e1e - agriculture machinery oil emissions: #111111 - agriculture electricity: #222222 - Fischer-Tropsch: #44DD33 - kerosene for aviation: #44BB11 - naphtha for industry: #44FF55 - land transport oil: #44DD33 - land transport oil emissions: #666666 - land transport fuel cell: #AAAAAA - land transport EV: grey - V2G: grey - BEV charger: grey - shipping: #6495ED - shipping oil: #6495ED - shipping oil emissions: #6495ED - water tanks: #BBBBBB - hot water storage: #BBBBBB - hot water charging: #BBBBBB - hot water discharging: #999999 - Li ion: grey - district heating: #CC4E5C - retrofitting: purple - building retrofitting: purple - solid biomass transport: green - biomass EOP: green - high-temp electrolysis: magenta - today: #D2691E - Ambient: k - - nice_names: - OCGT: Open-Cycle Gas - CCGT: Combined-Cycle Gas - offwind-ac: Offshore Wind (AC) - offwind-dc: Offshore Wind (DC) - onwind: Onshore Wind - solar: Solar - PHS: Pumped Hydro Storage - hydro: Reservoir & Dam - battery: Battery Storage - H2: Hydrogen Storage - lines: Transmission Lines - ror: Run of River diff --git a/configs/config.costs.yaml b/configs/config.costs.yaml new file mode 100644 index 000000000..0613d7255 --- /dev/null +++ b/configs/config.costs.yaml @@ -0,0 +1,49 @@ +# SPDX-FileCopyrightText: PyPSA-Earth and PyPSA-Eur Authors +# +# SPDX-License-Identifier: CC0-1.0 + +version: 0.4.1 + +# TODO: Needs to be adjusted for Africa. +costs: + year: 2030 + version: v0.6.2 + discountrate: [0.071] #, 0.086, 0.111] + # [EUR/USD] ECB: https://www.ecb.europa.eu/stats/exchange/eurofxref/html/eurofxref-graph-usd.en.html # noqa: E501 + USD2013_to_EUR2013: 0.7532 # [EUR/USD] ECB: https://www.ecb.europa.eu/stats/exchange/eurofxref/html/eurofxref-graph-usd.en.html + rooftop_share: 0.14 # based on the potentials, assuming (0.1 kW/m2 and 10 m2/person) + fill_values: + FOM: 0 + VOM: 0 + efficiency: 1 + fuel: 0 + investment: 0 + lifetime: 25 + CO2 intensity: 0 + discount rate: 0.07 + marginal_cost: # EUR/MWh + solar: 0.01 + onwind: 0.015 + offwind: 0.015 + hydro: 0. + H2: 0. + electrolysis: 0. + fuel cell: 0. + battery: 0. + battery inverter: 0. + emission_prices: # in currency per tonne emission, only used with the option Ep + co2: 0. + # investment: # EUR/MW + # CCGT: 830000 + # FOM: # %/year + # CCGT: 3.35 + # VOM: # EUR/MWh + # CCGT: 4.2 + # fuel: # EUR/MWh + # gas: 10.1 + # lifetime: # years + # CCGT: 25.0 + # efficiency: # per unit + # CCGT: 0.58 + lines: + length_factor: 1.25 #to estimate offwind connection costs diff --git a/configs/config.elec.yaml b/configs/config.elec.yaml new file mode 100644 index 000000000..adce6abfe --- /dev/null +++ b/configs/config.elec.yaml @@ -0,0 +1,71 @@ +# SPDX-FileCopyrightText: PyPSA-Earth and PyPSA-Eur Authors +# +# SPDX-License-Identifier: CC0-1.0 + +version: 0.4.1 + +clean_osm_data_options: # osm = OpenStreetMap + names_by_shapes: true # Set the country name based on the extended country shapes + threshold_voltage: 51000 # [V] minimum voltage threshold to keep the asset (cable, line, generator, etc.) [V] + tag_substation: "transmission" # Filters only substations with 'transmission' tag, ('distribution' also available) + add_line_endings: true # When "True", then line endings are added to the dataset of the substations + generator_name_method: OSM # Methodology to specify the name to the generator. Options: OSM (name as by OSM dataset), closest_city (name by the closest city) + use_custom_lines: "OSM_only" # Use OSM (OSM_only), customized (custom_only), or both data sets (add_custom) + path_custom_lines: false # If exists, provide the specific absolute path of the custom file e.g. (...\data\custom_lines.geojson) + use_custom_substations: "OSM_only" # Use OSM (OSM_only), customized (custom_only), or both data sets (add_custom) + path_custom_substations: false # If exists, provide the specific absolute path of the custom file e.g. (...\data\custom_substations.geojson) + use_custom_cables: "OSM_only" # Use OSM (OSM_only), customized (custom_only), or both data sets (add_custom) + path_custom_cables: false # If exists, provide the specific absolute path of the custom file e.g. (...\data\custom_cables.geojson) + +build_osm_network: # Options of the build_osm_network script; osm = OpenStreetMap + group_close_buses: true # When "True", close buses are merged and guarantee the voltage matching among line endings + group_tolerance_buses: 5000 # [m] (default 5000) Tolerance in meters of the close buses to merge + split_overpassing_lines: true # When True, lines overpassing buses are splitted and connected to the bueses + overpassing_lines_tolerance: 1 # [m] (default 1) Tolerance to identify lines overpassing buses + force_ac: false # When true, it forces all components (lines and substation) to be AC-only. To be used if DC assets create problem. + +base_network: + min_voltage_substation_offshore: 51000 # [V] minimum voltage of the offshore substations + min_voltage_rebase_voltage: 51000 # [V] minimum voltage in base network + +electricity: + base_voltage: 380. + voltages: [132., 220., 300., 380., 500., 750.] + co2limit: 7.75e+7 # European default, 0.05 * 3.1e9*0.5, needs to be adjusted for Africa + co2base: 1.487e+9 # European default, adjustment to Africa necessary + agg_p_nom_limits: data/agg_p_nom_minmax.csv + hvdc_as_lines: false # should HVDC lines be modeled as `Line` or as `Link` component? + automatic_emission: false + automatic_emission_base_year: 1990 # 1990 is taken as default. Any year from 1970 to 2018 can be selected. + + operational_reserve: # like https://genxproject.github.io/GenX/dev/core/#Reserves + activate: false + epsilon_load: 0.02 # share of total load + epsilon_vres: 0.02 # share of total renewable supply + contingency: 0 # fixed capacity in MW + + +lines: + ac_types: + 132.: "243-AL1/39-ST1A 20.0" + 220.: "Al/St 240/40 2-bundle 220.0" + 300.: "Al/St 240/40 3-bundle 300.0" + 380.: "Al/St 240/40 4-bundle 380.0" + 500.: "Al/St 240/40 4-bundle 380.0" + 750.: "Al/St 560/50 4-bundle 750.0" + dc_types: + 500.: "HVDC XLPE 1000" + s_max_pu: 0.7 + s_nom_max: .inf + length_factor: 1.25 + under_construction: "zero" # 'zero': set capacity to zero, 'remove': remove, 'keep': with full capacity + +links: + p_max_pu: 1.0 + p_nom_max: .inf + under_construction: "zero" # 'zero': set capacity to zero, 'remove': remove, 'keep': with full capacity + +transformers: + x: 0.1 + s_nom: 2000. + type: "" diff --git a/configs/config.plot.yaml b/configs/config.plot.yaml new file mode 100644 index 000000000..aca1fa410 --- /dev/null +++ b/configs/config.plot.yaml @@ -0,0 +1,230 @@ +# SPDX-FileCopyrightText: PyPSA-Earth and PyPSA-Eur Authors +# +# SPDX-License-Identifier: CC0-1.0 + +version: 0.4.1 + +plotting: + map: + figsize: [7, 7] + boundaries: [-10.2, 29, 35, 72] + p_nom: + bus_size_factor: 5.e+4 + linewidth_factor: 3.e+3 + color_geomap: + ocean: white + land: whitesmoke + + costs_max: 10 + costs_threshold: 0.2 + + energy_max: 20000 + energy_min: -20000 + energy_threshold: 15 + + vre_techs: + - onwind + - offwind-ac + - offwind-dc + - solar + - ror + conv_techs: + - OCGT + - CCGT + - nuclear + - Nuclear + - coal + - oil + storage_techs: + - hydro+PHS + - battery + - H2 + renewable_storage_techs: + - PHS + - hydro + load_carriers: + - AC load + AC_carriers: + - AC line + - AC transformer + link_carriers: + - DC line + - Converter AC-DC + heat_links: + - heat pump + - resistive heater + - CHP heat + - CHP electric + - gas boiler + - central heat pump + - central resistive heater + - central CHP heat + - central CHP electric + - central gas boiler + heat_generators: + - gas boiler + - central gas boiler + - solar thermal collector + - central solar thermal collector + + tech_colors: + onwind: #235ebc + onshore wind: #235ebc + offwind: #6895dd + offwind-ac: #6895dd + offshore wind: #6895dd + offshore wind ac: #6895dd + offshore wind (AC): #6895dd + offwind-dc: #74c6f2 + offshore wind dc: #74c6f2 + offshore wind (DC): #74c6f2 + wave: #004444 + hydro: #08ad97 + hydro+PHS: #08ad97 + PHS: #08ad97 + hydro reservoir: #08ad97 + hydroelectricity: #08ad97 + ror: #4adbc8 + run of river: #4adbc8 + solar: #f9d002 + solar PV: #f9d002 + solar thermal: #ffef60 + solar rooftop: #ffef60 + biomass: #0c6013 + solid biomass: #06540d + solid biomass for industry co2 from atmosphere: #654321 + solid biomass for industry co2 to stored: #654321 + solid biomass for industry CC: #654321 + biogas: #23932d + waste: #68896b + geothermal: #ba91b1 + OCGT: #d35050 + OCGT marginal: sandybrown + OCGT-heat: #ee8340 + gas: #d35050 + natural gas: #d35050 + gas boiler: #ee8340 + gas boilers: #ee8340 + gas boiler marginal: #ee8340 + gas-to-power/heat: brown + SMR: #4F4F2F + SMR CC: darkblue + oil: #262626 + oil boiler: #B5A642 + oil emissions: #666666 + gas for industry: #333333 + gas for industry CC: brown + gas for industry co2 to atmosphere: #654321 + gas for industry co2 to stored: #654321 + nuclear: #ff9000 + Nuclear: r + Nuclear marginal: r + uranium: r + coal: #707070 + Coal: k + Coal marginal: k + lignite: #9e5a01 + Lignite: grey + Lignite marginal: grey + H2: #ea048a + H2 for industry: #222222 + H2 for shipping: #6495ED + H2 liquefaction: m + hydrogen storage: #ea048a + battery: slategray + battery discharger: slategray + battery charger: slategray + battery storage: slategray + home battery: #614700 + home battery storage: #614700 + lines: #70af1d + transmission lines: #70af1d + AC: #70af1d + AC-AC: #70af1d + AC line: #70af1d + links: #8a1caf + HVDC links: #8a1caf + DC: #8a1caf + DC-DC: #8a1caf + DC link: #8a1caf + load: #ff0000 + load shedding: #ff0000 + Electric load: b + electricity: k + electric demand: k + electricity distribution grid: y + heat: darkred + Heat load: r + heat pumps: #76EE00 + heat pump: #76EE00 + air heat pump: #76EE00 + ground heat pump: #40AA00 + CHP: r + CHP heat: r + CHP electric: r + heat demand: darkred + rural heat: #880000 + central heat: #b22222 + decentral heat: #800000 + low-temperature heat for industry: #991111 + process heat: #FF3333 + power-to-heat: red + resistive heater: pink + Sabatier: #FF1493 + methanation: #FF1493 + power-to-gas: purple + power-to-liquid: darkgreen + helmeth: #7D0552 + DAC: deeppink + co2 stored: #123456 + CO2 pipeline: gray + CO2 sequestration: #123456 + co2: #123456 + co2 vent: #654321 + process emissions: #222222 + process emissions CC: gray + process emissions to stored: #444444 + process emissions to atmosphere: #888888 + agriculture heat: #D07A7A + agriculture machinery oil: #1e1e1e + agriculture machinery oil emissions: #111111 + agriculture electricity: #222222 + Fischer-Tropsch: #44DD33 + kerosene for aviation: #44BB11 + naphtha for industry: #44FF55 + land transport oil: #44DD33 + land transport oil emissions: #666666 + land transport fuel cell: #AAAAAA + land transport EV: grey + V2G: grey + BEV charger: grey + shipping: #6495ED + shipping oil: #6495ED + shipping oil emissions: #6495ED + water tanks: #BBBBBB + hot water storage: #BBBBBB + hot water charging: #BBBBBB + hot water discharging: #999999 + Li ion: grey + district heating: #CC4E5C + retrofitting: purple + building retrofitting: purple + solid biomass transport: green + biomass EOP: green + high-temp electrolysis: magenta + today: #D2691E + Ambient: k + + nice_names: + OCGT: Open-Cycle Gas + CCGT: Combined-Cycle Gas + offwind-ac: Offshore Wind (AC) + offwind-dc: Offshore Wind (DC) + onwind: Onshore Wind + solar: Solar + PHS: Pumped Hydro Storage + hydro: Reservoir & Dam + battery: Battery Storage + H2: Hydrogen Storage + lines: Transmission Lines + ror: Run of River diff --git a/configs/config.sector.yaml b/configs/config.sector.yaml new file mode 100644 index 000000000..d0d8ef38f --- /dev/null +++ b/configs/config.sector.yaml @@ -0,0 +1,157 @@ +# SPDX-FileCopyrightText: PyPSA-Earth and PyPSA-Eur Authors +# +# SPDX-License-Identifier: CC0-1.0 + +version: 0.4.1 + +sector: + + # parameters of the heating sector + district_heating: + potential: 0.3 #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 + district_heating_loss: 0.15 + 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 + # 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 + + tes: true + tes_tau: # 180 day time constant for centralised, 3 day for decentralised + decentral: 3 + central: 180 + boilers: true + oil_boilers: false + chp: true + micro_chp: false + solar_thermal: true + heat_pump_sink_T: 55 #Celsius, based on DTU / large area radiators; used un build_cop_profiles.py + time_dep_hp_cop: true #time dependent heat pump coefficient of performance + solar_cf_correction: 0.788457 # = >>>1/1.2683 + + + # parameters of the mobility sector + bev_plug_to_wheel_efficiency: 0.2 #kWh/km from EPA https://www.fueleconomy.gov/feg/ for Tesla Model S + bev_charge_efficiency: 0.9 #BEV (dis-)charging efficiency + transport_heating_deadband_upper: 20. + transport_heating_deadband_lower: 15. + ICE_lower_degree_factor: 0.375 #in per cent increase in fuel consumption per degree above deadband + ICE_upper_degree_factor: 1.6 + EV_lower_degree_factor: 0.98 + EV_upper_degree_factor: 0.63 + bev_avail_max: 0.95 + bev_avail_mean: 0.8 + 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 + v2g: true #allows feed-in to grid from EV battery + bev_dsm: true #turns on EV battery + bev_energy: 0.05 #average battery size in MWh + bev_availability: 0.5 #How many cars do smart charging + transport_fuel_cell_efficiency: 0.5 + transport_internal_combustion_efficiency: 0.3 + industry_util_factor: 0.7 + + biomass_transport: true # biomass transport between nodes + biomass_transport_default_cost: 0.1 #EUR/km/MWh + solid_biomass_potential: 40 # TWh/a, Potential of whole modelled area + biogas_potential: 0.5 # TWh/a, Potential of whole modelled area + + efficiency_heat_oil_to_elec: 0.9 + efficiency_heat_biomass_to_elec: 0.9 + efficiency_heat_gas_to_elec: 0.9 + + dynamic_transport: + enable: false # If "True", then the BEV and FCEV shares are obtained depending on the "Co2L"-wildcard (e.g. "Co2L0.70: 0.10"). If "False", then the shares are obtained depending on the "demand" wildcard and "planning_horizons" wildcard as listed below (e.g. "DF_2050: 0.08") + land_transport_electric_share: + Co2L2.0: 0.00 + Co2L1.0: 0.01 + Co2L0.90: 0.03 + Co2L0.80: 0.06 + Co2L0.70: 0.10 + Co2L0.60: 0.17 + Co2L0.50: 0.27 + Co2L0.40: 0.40 + Co2L0.30: 0.55 + Co2L0.20: 0.69 + Co2L0.10: 0.80 + Co2L0.00: 0.88 + land_transport_fuel_cell_share: + Co2L2.0: 0.01 + Co2L1.0: 0.01 + Co2L0.90: 0.01 + Co2L0.80: 0.01 + Co2L0.70: 0.01 + Co2L0.60: 0.01 + Co2L0.50: 0.01 + Co2L0.40: 0.01 + Co2L0.30: 0.01 + Co2L0.20: 0.01 + Co2L0.10: 0.01 + Co2L0.00: 0.01 + + land_transport_fuel_cell_share: # 1 means all FCEVs HERE + BU_2030: 0.00 + AP_2030: 0.004 + NZ_2030: 0.02 + DF_2030: 0.01 + AB_2030: 0.01 + BU_2050: 0.00 + AP_2050: 0.06 + NZ_2050: 0.28 + DF_2050: 0.08 + + land_transport_electric_share: # 1 means all EVs # This leads to problems when non-zero HERE + BU_2030: 0.00 + AP_2030: 0.075 + NZ_2030: 0.13 + DF_2030: 0.01 + AB_2030: 0.01 + BU_2050: 0.00 + AP_2050: 0.42 + NZ_2050: 0.68 + DF_2050: 0.011 + + # parameters of H2 production, transport and storage + hydrogen: + network: true + H2_retrofit_capacity_per_CH4: 0.6 + network_limit: 2000 #GWkm + network_routes: gas # "gas or "greenfield". If "gas" -> the network data are fetched from ["sector"]["gas"]["network_data"]. If "greenfield" -> the network follows the topology of electrical transmission lines + gas_network_repurposing: true # If true -> ["sector"]["gas"]["network"] is automatically false + underground_storage: false + hydrogen_colors: false + set_color_shares: false + blue_share: 0.40 + pink_share: 0.05 + + hydrogen_underground_storage: true + shipping_hydrogen_liquefaction: false + shipping_average_efficiency: 0.4 #For conversion of fuel oil to propulsion in 2011 + + gadm_level: 1 + h2_cavern: true + marginal_cost_storage: 0 + methanation: true + helmeth: true + dac: true + SMR: true + SMR CC: true + cc_fraction: 0.9 + cc: true + airport_sizing_factor: 3 + + min_part_load_fischer_tropsch: 0.9 diff --git a/configs/config.solve.yaml b/configs/config.solve.yaml new file mode 100644 index 000000000..d152adc9d --- /dev/null +++ b/configs/config.solve.yaml @@ -0,0 +1,110 @@ +# SPDX-FileCopyrightText: PyPSA-Earth and PyPSA-Eur Authors +# +# SPDX-License-Identifier: CC0-1.0 + +version: 0.4.1 + +monte_carlo: + # Description: Specify Monte Carlo sampling options for uncertainty analysis. + # Define the option list for Monte Carlo sampling. + # Make sure add_to_snakefile is set to true to enable Monte-Carlo + options: + add_to_snakefile: false # When set to true, enables Monte Carlo sampling + samples: 9 # number of optimizations. Note that number of samples when using scipy has to be the square of a prime number + sampling_strategy: "chaospy" # "pydoe2", "chaospy", "scipy", packages that are supported + seed: 42 # set seedling for reproducibilty + # Uncertanties on any PyPSA object are specified by declaring the specific PyPSA object under the key 'uncertainties'. + # For each PyPSA object, the 'type' and 'args' keys represent the type of distribution and its argument, respectively. + # Supported distributions types are uniform, normal, lognormal, triangle, beta and gamma. + # The arguments of the distribution are passed using the key 'args' as follows, tailored by distribution type + # normal: [mean, std], lognormal: [mean, std], uniform: [lower_bound, upper_bound], + # triangle: [mid_point (between 0 - 1)], beta: [alpha, beta], gamma: [shape, scale] + # More info on the distributions are documented in the Chaospy reference guide... + # https://chaospy.readthedocs.io/en/master/reference/distribution/index.html + # An abstract example is as follows: + # {pypsa network object, e.g. "loads_t.p_set"}: + # type: {any supported distribution among the previous: "uniform", "normal", ...} + # args: {arguments passed as a list depending on the distribution, see the above and more at https://pypsa.readthedocs.io/} + uncertainties: + loads_t.p_set: + type: uniform + args: [0, 1] + generators_t.p_max_pu.loc[:, n.generators.carrier == "onwind"]: + type: lognormal + args: [1.5] + generators_t.p_max_pu.loc[:, n.generators.carrier == "solar"]: + type: beta + args: [0.5, 2] + +solving: + options: + formulation: kirchhoff + load_shedding: true + noisy_costs: true + min_iterations: 4 + max_iterations: 6 + clip_p_max_pu: 0.01 + skip_iterations: true + track_iterations: false + # nhours: 10 + + solver: + name: gurobi + options: gurobi-default + + solver_options: + highs-default: + # refer to https://ergo-code.github.io/HiGHS/dev/options/definitions/ + threads: 4 + solver: "ipm" + run_crossover: "off" + small_matrix_value: 1e-6 + large_matrix_value: 1e9 + primal_feasibility_tolerance: 1e-5 + dual_feasibility_tolerance: 1e-5 + ipm_optimality_tolerance: 1e-4 + parallel: "on" + random_seed: 123 + gurobi-default: + threads: 4 + method: 2 # barrier + crossover: 0 + BarConvTol: 1.e-6 + Seed: 123 + AggFill: 0 + PreDual: 0 + GURO_PAR_BARDENSETHRESH: 200 + gurobi-numeric-focus: + NumericFocus: 3 # Favour numeric stability over speed + method: 2 # barrier + crossover: 0 # do not use crossover + BarHomogeneous: 1 # Use homogeneous barrier if standard does not converge + BarConvTol: 1.e-5 + FeasibilityTol: 1.e-4 + OptimalityTol: 1.e-4 + ObjScale: -0.5 + threads: 8 + Seed: 123 + gurobi-fallback: # Use gurobi defaults + crossover: 0 + method: 2 # barrier + BarHomogeneous: 1 # Use homogeneous barrier if standard does not converge + BarConvTol: 1.e-5 + FeasibilityTol: 1.e-5 + OptimalityTol: 1.e-5 + Seed: 123 + threads: 8 + cplex-default: + threads: 4 + lpmethod: 4 # barrier + solutiontype: 2 # non basic solution, ie no crossover + barrier.convergetol: 1.e-5 + feasopt.tolerance: 1.e-6 + copt-default: + Threads: 8 + LpMethod: 2 + Crossover: 0 + cbc-default: {} # Used in CI + glpk-default: {} # Used in CI + + mem: 30000 #memory in MB; 20 GB enough for 50+B+I+H2; 100 GB for 181+B+I+H2 diff --git a/configs/config.spatial.yaml b/configs/config.spatial.yaml new file mode 100644 index 000000000..219da9177 --- /dev/null +++ b/configs/config.spatial.yaml @@ -0,0 +1,52 @@ +# SPDX-FileCopyrightText: PyPSA-Earth and PyPSA-Eur Authors +# +# SPDX-License-Identifier: CC0-1.0 + +version: 0.4.1 + +# definition of the Coordinate Reference Systems +crs: + geo_crs: EPSG:4326 # general geographic projection, not used for metric measures. "EPSG:4326" is the standard used by OSM and google maps + distance_crs: EPSG:3857 # projection for distance measurements only. Possible recommended values are "EPSG:3857" (used by OSM and Google Maps) + area_crs: ESRI:54009 # projection for area measurements only. Possible recommended values are Global Mollweide "ESRI:54009" + +cluster_options: + simplify_network: + to_substations: false # network is simplified to nodes with positive or negative power injection (i.e. substations or offwind connections) + algorithm: kmeans # choose from: [hac, kmeans] + feature: solar+onwind-time # only for hac. choose from: [solar+onwind-time, solar+onwind-cap, solar-time, solar-cap, solar+offwind-cap] etc. + exclude_carriers: [] + remove_stubs: true + remove_stubs_across_borders: true + p_threshold_drop_isolated: 20 # [MW] isolated buses are being discarded if bus mean power is below the specified threshold + p_threshold_merge_isolated: 300 # [MW] isolated buses are being merged into a single isolated bus if a bus mean power is below the specified threshold + s_threshold_fetch_isolated: 0.05 # [-] a share of the national load for merging an isolated network into a backbone network + cluster_network: + algorithm: kmeans + feature: solar+onwind-time + exclude_carriers: [] + alternative_clustering: false # "False" use Voronoi shapes, "True" use GADM shapes + distribute_cluster: ["load"] # Distributes cluster nodes per country according to ['load'],['pop'] or ['gdp'] + out_logging: true # When "True", logging is printed to console + aggregation_strategies: + generators: # use "min" for more conservative assumptions + p_nom: sum + p_nom_max: sum + p_nom_min: sum + p_min_pu: mean + marginal_cost: mean + committable: any + ramp_limit_up: max + ramp_limit_down: max + efficiency: mean + +build_shape_options: + gadm_layer_id: 1 # GADM level area used for the gadm_shapes. Codes are country-dependent but roughly: 0: country, 1: region/county-like, 2: municipality-like + update_file: false # When true, all the input files are downloaded again and replace the existing files + out_logging: true # When true, logging is printed to console + year: 2020 # reference year used to derive shapes, info on population and info on GDP + nprocesses: 3 # number of processes to be used in build_shapes + worldpop_method: "standard" # "standard" pulls from web 1kmx1km raster, "api" pulls from API 100mx100m raster, + # false (not "false") no pop addition to shape which is useful when generating only cutout + gdp_method: "standard" # "standard" pulls from web 1x1km raster, false (not "false") no gdp addition to shape which useful when generating only cutout + contended_flag: "set_by_country" # "set_by_country" assigns the contended areas to the countries according to the GADM database, "drop" drops these contended areas from the model diff --git a/configs/config.weather.yaml b/configs/config.weather.yaml new file mode 100644 index 000000000..706b0063b --- /dev/null +++ b/configs/config.weather.yaml @@ -0,0 +1,154 @@ +# SPDX-FileCopyrightText: PyPSA-Earth and PyPSA-Eur Authors +# +# SPDX-License-Identifier: CC0-1.0 + +version: 0.4.1 + +load_options: + weather_year: 2013 # Load scenarios available with different weather year (different renewable potentials) + + +atlite: + nprocesses: 4 + cutouts: + cutout-2013-era5: + module: era5 + dx: 0.3 # cutout resolution + dy: 0.3 # cutout resolution + # The cutout time is automatically set by the snapshot range. See `snapshot:` option above and 'build_cutout.py'. + # time: ["2013-01-01", "2014-01-01"] # to manually specify a different weather year (~70 years available) + # The cutout spatial extent [x,y] is automatically set by country selection. See `countires:` option above and 'build_cutout.py'. + # x: [-12., 35.] # set cutout range manual, instead of automatic by boundaries of country + # y: [33., 72] # manual set cutout range + +renewable: + onwind: + cutout: cutout-2013-era5 + resource: + method: wind + turbine: Vestas_V112_3MW + capacity_per_sqkm: 3 # conservative, ScholzPhd Tab 4.3.1: 10MW/km^2 + # correction_factor: 0.93 + copernicus: + # Scholz, Y. (2012). Renewable energy based electricity supply at low costs: + # development of the REMix model and application for Europe. ( p.42 / p.28) + # CLC grid codes: + # 11X/12X - Various forest types + # 20 - Shrubs + # 30 - Herbaceus vegetation + # 40 - Cropland + # 50 - Urban + # 60 - Bare / Sparse vegetation + # 80 - Permanent water bodies + # 100 - Moss and lichen + # 200 - Open sea + grid_codes: [20, 30, 40, 60, 100, 111, 112, 113, 114, 115, 116, 121, 122, 123, 124, 125, 126] + distance: 1000 + distance_grid_codes: [50] + natura: true + potential: simple # or conservative + clip_p_max_pu: 1.e-2 + extendable: true + offwind-ac: + cutout: cutout-2013-era5 + resource: + method: wind + turbine: NREL_ReferenceTurbine_5MW_offshore + capacity_per_sqkm: 2 + # correction_factor: 0.8855 + # proxy for wake losses + # from 10.1016/j.energy.2018.08.153 + # until done more rigorously in #153 + copernicus: + grid_codes: [80, 200] + natura: true + max_depth: 50 + max_shore_distance: 30000 + potential: simple # or conservative + clip_p_max_pu: 1.e-2 + extendable: true + offwind-dc: + cutout: cutout-2013-era5 + resource: + method: wind + turbine: NREL_ReferenceTurbine_5MW_offshore + # ScholzPhd Tab 4.3.1: 10MW/km^2 + capacity_per_sqkm: 3 + # correction_factor: 0.8855 + # proxy for wake losses + # from 10.1016/j.energy.2018.08.153 + # until done more rigorously in #153 + copernicus: + grid_codes: [80, 200] + natura: true + max_depth: 50 + min_shore_distance: 30000 + potential: simple # or conservative + clip_p_max_pu: 1.e-2 + extendable: true + solar: + cutout: cutout-2013-era5 + resource: + method: pv + panel: CSi + orientation: latitude_optimal # will lead into optimal design + # slope: 0. # slope: 0 represent a flat panel + # azimuth: 180. # azimuth: 180 south orientation + capacity_per_sqkm: 4.6 # From 1.7 to 4.6 addresses issue #361 + # Determined by comparing uncorrected area-weighted full-load hours to those + # published in Supplementary Data to + # Pietzcker, Robert Carl, et al. "Using the sun to decarbonize the power + # sector: The economic potential of photovoltaics and concentrating solar + # power." Applied Energy 135 (2014): 704-720. + correction_factor: 0.854337 + copernicus: + grid_codes: [20, 30, 40, 50, 60, 90, 100] + natura: true + potential: simple # or conservative + clip_p_max_pu: 1.e-2 + extendable: true + hydro: + cutout: cutout-2013-era5 + hydrobasins_level: 6 + resource: + method: hydro + hydrobasins: data/hydrobasins/hybas_world.shp + flowspeed: 1.0 # m/s + # weight_with_height: false + # show_progress: true + carriers: [ror, PHS, hydro] + PHS_max_hours: 6 + hydro_max_hours: "energy_capacity_totals_by_country" # not active + hydro_max_hours_default: 6.0 # (optional, default 6) Default value of max_hours for hydro when NaN values are found + clip_min_inflow: 1.0 + extendable: true + normalization: + method: hydro_capacities # 'hydro_capacities' to rescale country hydro production by using hydro_capacities, 'eia' to rescale by eia data, false for no rescaling + year: 2013 # (optional) year of statistics used to rescale the runoff time series. When not provided, the cutout weather year is used + multiplier: 1.1 # multiplier applied after the normalization of the hydro production; default 1.0 + csp: + cutout: cutout-2013-era5 + resource: + method: csp + installation: SAM_solar_tower + capacity_per_sqkm: 2.392 # From 1.7 to 4.6 addresses issue #361 + # Determined by comparing uncorrected area-weighted full-load hours to those + # published in Supplementary Data to + # Pietzcker, Robert Carl, et al. "Using the sun to decarbonize the power + # sector: The economic potential of photovoltaics and concentrating solar + # power." Applied Energy 135 (2014): 704-720. + copernicus: + grid_codes: [20, 30, 40, 60, 90] + distancing_codes: [50] + distance_to_codes: 3000 + natura: true + potential: simple # or conservative + clip_p_max_pu: 1.e-2 + extendable: true + csp_model: advanced # simple or advanced + +solar_thermal: + clearsky_model: simple + orientation: + slope: 45. + azimuth: 180.