diff --git a/docs/source/config-configuration.md b/docs/source/config-configuration.md index 6765c60c1..462b00aab 100644 --- a/docs/source/config-configuration.md +++ b/docs/source/config-configuration.md @@ -177,8 +177,10 @@ Specifies the types of generators that are included in the network, which are ex (co2_cf)= ## `co2` + The `co2` section specifies whether the model may use underground storage to sequester captured CO2 or not. In case underground storage is specified, each node (composing the network) has a specific storage potential and a cost associated with it. The storage potential (in tonnes) is calculated by aggregating all the underlying storage potentials of the U.S. counties encompassed in the node's geographical area. Counties that are only partially covered by the node's geographical area have their potential fractionated accordingly. The storage cost (in $/tonne) is calculated by weighting the potential with the cost of each county encompassed. The dataset containing information about underground CO2 storage potentials and costs at a county level (and used in PyPSA-USA) was provided by Edna Calzado at The University of Texas (Austin), which was derived from the Roads to Removal project (https://roads2removal.org). To get an illustration, enabling underground co2 storage for a sector-less network will render its topography similar to this, while for a sector-based network will render its topography similar to this. As a reference, disabling underground co2 storage (i.e. no CCTS), a sector-less network has a topography similar to this, while a sector-based network has a topography similar to this. + In addition, the section specifies whether the model may transport captured CO2 between nodes or not. In case transportation is specified, a network of CO2 pipelines is built based on the electricity grid layout represented in PyPSA-USA to determine where/how to build pipelines to connect nodes. To get an illustration, enabling co2 transport for a sector-less network will render its topography similar to this, while for a sector-based network will render its topography similar to this. ```{eval-rst} @@ -226,6 +228,7 @@ For a sector-based model: :file: configtables/dac.csv ``` + (costs_cf)= ## `costs` diff --git a/workflow/repo_data/config/config.default.yaml b/workflow/repo_data/config/config.default.yaml index 46d3f6bf2..49d82d8f5 100644 --- a/workflow/repo_data/config/config.default.yaml +++ b/workflow/repo_data/config/config.default.yaml @@ -117,7 +117,6 @@ lines: max_extension: 20000 #MW length_factor: 1.25 - # docs : links: p_max_pu: 1.0 @@ -137,7 +136,7 @@ co2: # docs : dac: enable: false # [false, true] - granularity: "node" # ["node", "state", "nation"] + granularity: "node" # ["node", "state", "nation"] (note: "nation" is not applicable for a network based on sectors - it defaults to "node" in this case) capital_cost: 6000000 # in USD/tCO2/h electricity_input: 2.5 # in MWh/tCO2 lifetime: 20 # in years diff --git a/workflow/scripts/add_extra_components.py b/workflow/scripts/add_extra_components.py index 71f2832cf..e8db4fe09 100644 --- a/workflow/scripts/add_extra_components.py +++ b/workflow/scripts/add_extra_components.py @@ -1291,7 +1291,7 @@ def add_co2_storage(n: pypsa.Network, config: dict, co2_storage_csv: str, costs: ) # calculate efficiencies - efficiency2 = [] # to node or state atmosphere bus (e.g. "p9 atmosphere", "CA atmosphere") + efficiency2 = [] # to node, state or nation atmosphere bus (e.g. "p9 atmosphere", "CA atmosphere", "atmosphere") efficiency3 = [] # to node co2 capture bus (e.g. "p9 co2 capture") for index in indexes: generator_efficiency = n.generators.loc[index]["efficiency"] @@ -1307,8 +1307,9 @@ def add_co2_storage(n: pypsa.Network, config: dict, co2_storage_csv: str, costs: cc_level = ( int(index.split("-")[1].split("CC")[0]) / 100 ) # extract CC level from index (e.g. index "p1 CCGT-95CCS_2030" returns 0.95) - efficiency2.append(efficiency) - efficiency3.append(efficiency * (1 - cc_level) / cc_level) + + efficiency2.append(efficiency * (1 - cc_level) / cc_level) + efficiency3.append(efficiency) # add links to represent sending electricity (in MW) to the electricity bus (e.g. "p9" if ReEDS or "p100 0" if TAMU) as well as sending emitted CO2 (by the generator) to both the atmosphere bus and the co2 capture bus n.madd( diff --git a/workflow/scripts/build_co2_storage.py b/workflow/scripts/build_co2_storage.py index 9528e631b..fe4623cbb 100644 --- a/workflow/scripts/build_co2_storage.py +++ b/workflow/scripts/build_co2_storage.py @@ -7,7 +7,10 @@ def build_co2_storage(regions_onshore_geojson, co2_storage_geojson, output_csv, logger): # get PyPSA-USA network nodes and CO2 storage information at a county level - logger.info("Calculate CO2 storage potentials and costs") + + if logger is not None: + logger.info("Calculate CO2 storage potentials and costs") + regions_onshore = geopandas.read_file(regions_onshore_geojson) co2_storage = geopandas.read_file(co2_storage_geojson) diff --git a/workflow/scripts/opts/policy.py b/workflow/scripts/opts/policy.py index e0ec946d7..98a5a70a2 100644 --- a/workflow/scripts/opts/policy.py +++ b/workflow/scripts/opts/policy.py @@ -14,6 +14,7 @@ logger = logging.getLogger(__name__) + RPS_CARRIERS = [ "onwind", "offwind", diff --git a/workflow/scripts/plot_network_maps.py b/workflow/scripts/plot_network_maps.py index f3e266ae9..b9d30ba22 100644 --- a/workflow/scripts/plot_network_maps.py +++ b/workflow/scripts/plot_network_maps.py @@ -615,6 +615,7 @@ def plot_lmp_map(network: pypsa.Network, save: str, **wildcards): + snakemake.params.electricity["extendable_carriers"]["StorageUnit"] + snakemake.params.electricity["extendable_carriers"]["Store"] + snakemake.params.electricity["extendable_carriers"]["Link"] + + ["imports"] ) carriers = list(set(carriers)) # remove any duplicates diff --git a/workflow/scripts/solve_network.py b/workflow/scripts/solve_network.py index b998af29e..5eada97f2 100644 --- a/workflow/scripts/solve_network.py +++ b/workflow/scripts/solve_network.py @@ -383,7 +383,7 @@ def solve_network(n, config, solving, opts="", **kwargs): ll="v1.0", opts="8h-RPS", sector="E-G", - planning_horizons="2030", + planning_horizons="2018", ) configure_logging(snakemake) update_config_from_wildcards(snakemake.config, snakemake.wildcards)