Skip to content
Snippets Groups Projects
Commit e1f666ab authored by Christiane Reinert's avatar Christiane Reinert
Browse files

Initial commit of public branch of the SecMOD framework

parent de8318db
Branches
No related tags found
No related merge requests found
Showing
with 9452 additions and 0 deletions
EXTERNAL DATA PACKAGES
===========================================================================
SecMOD can include external data from the OPSD-database. The folder "scripts" contains the code we used to include data about existing conventional and renewable plants. Please note that existing infrastructure is not included automatically in the current settings.
We follow the Data Package standard by the [Frictionless Data project](http://frictionlessdata.io/),
a part of the Open Knowledge Foundation.
Field documentation
===========================================================================
external_data_packages.csv
---------------------------------------------------------------------------
* internal_name
* Type: string
* Description: unique and fixed name for the internal use of the external data package
* source_url
* Type: string
* Description: unique and fixed name for the internal use of the external data package
{
"profile": "tabular-data-package",
"resources": [
{
"path": "external_data_packages.csv",
"profile": "tabular-data-resource",
"name": "external_data_packages",
"format": "csv",
"mediatype": "text/csv",
"encoding": "utf-8",
"schema": {
"fields": [
{
"name": "internal_name",
"type": "string",
"format": "default"
},
{
"name": "source_url",
"type": "string",
"format": "default"
}
],
"missingValues": [
""
]
}
}
]
}
\ No newline at end of file
internal_name,source_url
renewable_power_plants,https://data.open-power-system-data.org/renewable_power_plants/2016-10-21
conventional_power_plants,https://data.open-power-system-data.org/conventional_power_plants/2016-10-27
# Important columns of the file renewable_power_plants_DE.csv:
# - commissioned_original
# - shutdown
# - fuel
# - capacity_net_bnetza
# - lat
# - lon
import pandas as pd
import numpy as np
from geopy import distance
from pathlib import Path
from tqdm import tqdm
import secmod.helpers as helpers
def setup(working_directory: Path, data_package_name: str, grid: str = "DE", unit: str = "MW", years: list =[1900,1905,1910,1915,1920,1925,1930,1935,1940,1945,1950,1955,1960,1965,1970,1975,1980,1985,1990,1995,2000,2005,2010,2016,2020,2025,2030,2035,2040,2045,2050], debug=False):
"""This method is called in order to import the data from this data package to the input data."""
tqdm.pandas()
used_processes = {"Natural gas", "Hard coal", "Hydro", "Waste", "Biomass and biogas", "Lignite", "Nuclear"}
process_to_limit_potential = {"Hydro", "Waste", "Biomass and biogas"}
internal_process_name = {"Natural gas": "natural_gas_turbine", "Hard coal": "hard_coal", "Hydro": "pumped_storage_hydro", "Waste": "waste_incineration", "Biomass and biogas": "biogas-to-power", "Lignite": "lignite", "Nuclear": "nuclear"}
process_classes = {"Natural gas": "production", "Hard coal": "production", "Hydro": "storage", "Waste": "production", "Biomass and biogas": "production", "Lignite": "production", "Nuclear": "production"}
fuel = "fuel"
columns = ["commissioned_original", "shutdown", fuel, "technology", "capacity_net_bnetza", "lat", "lon"]
print("Load data")
plants = pd.read_csv(working_directory / "SecMOD" / "00-INPUT" / "00-RAW-INPUT" / "00-EXTERNAL" / data_package_name / "conventional_power_plants_{0}.csv".format(grid), float_precision="high", usecols=(lambda column: column in columns), parse_dates=["commissioned_original", "shutdown"])
# check if all columns are present and replace columns that at some point in time change their names
if fuel not in plants.columns: # check if fuels were loaded, i.e., if the fuel column is missing
fuel = 'energy_source' # staring in 2020, 'fuel' has been renamed to 'energy_source'
plants = pd.read_csv(working_directory / "SecMOD" / "00-INPUT" / "00-RAW-INPUT" / "00-EXTERNAL" / data_package_name / "conventional_power_plants_{0}.csv".format(grid), float_precision="high", usecols=(lambda column: column in columns), parse_dates=["commissioned_original", "shutdown"])
assert (plants.columns.isin(["commissioned_original", "shutdown", fuel, "technology", "capacity_net_bnetza", "lat", "lon"]).all()), 'At least one of the columns could not be loaded. Check if any of the column names has been updated.'
if debug:
plants = plants.sample(500)
nodes = pd.read_csv(working_directory / "SecMOD" / "00-INPUT" / "00-RAW-INPUT" / "01-GRID" / grid / "nodes.csv", index_col="node", usecols=lambda x: "Unnamed" not in x, float_precision="high")
print("Select used technologies")
plants = plants[plants[fuel].isin(used_processes)]
print("Determine commissioning year")
plants["commissioning_year"] = plants["commissioned_original"].progress_apply(lambda date: parse_year(date))
print("Determine decommissioning year")
plants["decommissioning_year"] = plants["shutdown"].progress_apply(lambda date: parse_year(date))
plants = plants[[fuel, "capacity_net_bnetza", "lat", "lon", "commissioning_year", "decommissioning_year", "technology"]]
print("Determine actual construction year")
plants["construction_year"] = plants.progress_apply(lambda plant: get_construction_year(plant, working_directory, internal_process_name[plant.fuel], process_classes[plant.fuel]), axis=1)
print("Get used construction year")
plants["construction_year"] = plants["construction_year"].progress_apply(lambda year: get_closest_year(years, year))
plants = plants[[fuel, "capacity_net_bnetza", "lat", "lon", "construction_year", "technology"]]
plants = plants.dropna()
print("Determine closest nodes")
plants["node"] = plants[["lat", "lon"]].progress_apply(lambda plant: find_closest_node(nodes, plant.lon, plant.lat), axis=1)
plants = plants.loc[plants["technology"] != "Run-of-river"]
plants = plants[[fuel, "capacity_net_bnetza", "node", "construction_year"]]
plants.set_index([fuel, "node", "construction_year"], inplace=True)
plants.sort_index(inplace=True)
print("Aggregate capacities by fuel, nodes and year of construction")
plants = plants["capacity_net_bnetza"].groupby(level=[0,1,2]).sum()
print("Write existing capacity for {0}".format(list(plants.index.get_level_values(fuel).unique())))
for process in tqdm(list(plants.index.get_level_values(fuel).unique())):
capacity = plants.loc[process].unstack("construction_year").reindex(index=nodes.index).fillna(0)
capacity_columns = list(capacity.columns)
capacity_columns.sort()
if process != "Hydro":
capacity["unit"] = unit
else:
capacity = capacity / 0.164332428589893
capacity["unit"] = unit + "h"
capacity["comments"] = ""
capacity.reset_index(inplace=True)
capacity = capacity[["node", "unit"] + capacity_columns + ["comments"]]
export_existing_capacity(capacity, working_directory, internal_process_name[process], grid, process_classes[process])
if process in process_to_limit_potential:
potential = get_nodal_capacity_by_latest_year(capacity, working_directory, internal_process_name[process], process_classes[process], years)
export_potential_capacity(potential, working_directory, internal_process_name[process], grid, process_classes[process])
print("Done!")
def parse_year(date):
try:
return int(pd.to_datetime(date, format="%d.%m.%Y").year)
except:
try:
return int(pd.to_datetime(date, format="%Y").year)
except:
return np.nan
def get_nodal_capacity_by_latest_year(capacity: pd.DataFrame, working_directory: Path, process: str, process_class: str, years: list):
relevant_years = [int(column) for column in capacity.columns if helpers.isInteger(column)]
reference_year = max(relevant_years)
lifetime_duration = get_lifetime_duration(working_directory, reference_year, process, process_class)
relevant_years = [year for year in relevant_years if (reference_year - year) <= lifetime_duration]
pd.options.mode.chained_assignment = None # default='warn'
potential = capacity[relevant_years]
potential["total"] = potential.sum(axis=1)
potential[["node", "unit"]] = capacity[["node", "unit"]]
potential["comments"] = "Based on the total existing capacity in {0}".format(reference_year)
for year in years:
potential[year] = potential["total"]
potential = potential[["node", "unit"] + years + ["comments"]]
pd.options.mode.chained_assignment = "warn" # default='warn'
return potential
def get_construction_year(plant, working_directory: Path, process: str, process_class: str = "production"):
"""Returns the construction year, to be used"""
if np.isnan(plant.decommissioning_year):
return plant.commissioning_year
elif not np.isnan(plant.commissioning_year):
return (plant.decommissioning_year - get_lifetime_duration(working_directory, plant.commissioning_year, process, process_class))
else:
return np.nan
def find_closest_node(nodes: pd.DataFrame, longitude, latitude):
"""This method return the ID of the node, which is closest to the plant."""
nodes["distance"] = nodes.apply(lambda node: distance.great_circle((node.latitude, node.longitude), (latitude, longitude)).km, axis=1)
return nodes["distance"].idxmin()
def get_lifetime_duration(working_directory: Path, construction_year: int, process: str, process_class: str = "production"):
"""Return the lifetime duration of a process from lifetime_duration.csv"""
process_class_directories = {"production": "01-PRODUCTION", "storage": "02-STORAGE", "transshipment": "03-TRANSSHIPMENT", "transmission": "04-TRANSMISSION"}
target_directory = working_directory / "SecMOD" / "00-INPUT" / "00-RAW-INPUT" / "02-PROCESSES" / process_class_directories[process_class] / "01-ECOINVENT-BASED" / process / "lifetime_duration.csv"
lifetime_duration = pd.read_csv(target_directory, float_precision="high", usecols=(lambda column: (column != "comments") and (column != "unit")))
years_of_data = [int(column) for column in lifetime_duration.columns]
lifetime_duration.columns = years_of_data
closest_year = get_closest_year(years_of_data, construction_year)
return lifetime_duration.at[0,get_closest_year(years_of_data, construction_year)]
def get_closest_year(years: list, year_of_construction: int):
"""Return the closest year"""
difference = [abs(year - year_of_construction) for year in years]
return years[difference.index(min(difference))]
def export_existing_capacity(capacity: pd.DataFrame, working_directory: Path, process: str, grid: str, process_class: str = "production"):
"""This method saves a dataframe to the correct position in a process and grid-subfolder."""
process_class_directories = {"production": "01-PRODUCTION", "storage": "02-STORAGE", "transshipment": "03-TRANSSHIPMENT", "transmission": "04-TRANSMISSION"}
target_directory = working_directory / "SecMOD" / "00-INPUT" / "00-RAW-INPUT" / "02-PROCESSES" / process_class_directories[process_class] / "01-ECOINVENT-BASED" / process / grid / "existing_capacity.csv"
capacity.to_csv(path_or_buf=target_directory, index=False)
def export_potential_capacity(potential: pd.DataFrame, working_directory: Path, process: str, grid: str, process_class: str):
"""This method saves a dataframe to the correct position in a process and grid-subfolder."""
process_class_directories = {"production": "01-PRODUCTION", "storage": "02-STORAGE", "transshipment": "03-TRANSSHIPMENT", "transmission": "04-TRANSMISSION"}
target_directory = working_directory / "SecMOD" / "00-INPUT" / "00-RAW-INPUT" / "02-PROCESSES" / process_class_directories[process_class] / "01-ECOINVENT-BASED" / process / grid / "potential_capacity.csv"
potential.to_csv(path_or_buf=target_directory)
if __name__ == "__main__":
setup(Path().cwd(), "conventional_power_plants", debug=False)
\ No newline at end of file
# Important columns of the file renewable_power_plants_DE.csv:
# - commissioning_date
# - decommissioning_date
# - technology
# - electrical_capacity
# - lat
# - lon
import pandas as pd
import numpy as np
from geopy import distance
from pathlib import Path
from tqdm import tqdm
import secmod.helpers as helpers
def setup(working_directory: Path, data_package_name: str, grid: str = "DE", unit: str = "MW", years: list =[1900,1905,1910,1915,1920,1925,1930,1935,1940,1945,1950,1955,1960,1965,1970,1975,1980,1985,1990,1995,2000,2005,2010,2016,2020,2025,2030,2035,2040,2045,2050], debug=False):
"""This method is called in order to import the data from this data package to the input data."""
tqdm.pandas()
used_processes = {"Run-of-river", "Onshore", "Photovoltaics", "Geothermal", "Offshore"}
process_to_limit_potential = {"Run-of-river", "Geothermal"}
internal_process_name = {"Run-of-river": "run-of-river_hydro", "Onshore": "wind_onshore", "Photovoltaics": "photovoltaics", "Geothermal": "geothermal", "Offshore": "wind_offshore"}
process_classes = {"Run-of-river": "production", "Biomass and biogas": "production", "Sewage and landfill gas": "production", "Onshore": "production", "Photovoltaics": "production", "Other fossil fuels": "production", "Geothermal": "production", "Offshore": "production", "Photovoltaics ground": "production", "Storage": "storage"}
columns = ["commissioning_date", "decommissioning_date", "technology", "electrical_capacity", "lat", "lon"]
print("Load data")
plants = pd.read_csv(working_directory / "SecMOD" / "00-INPUT" / "00-RAW-INPUT" / "00-EXTERNAL" / data_package_name / "renewable_power_plants_{0}.csv".format(grid), float_precision="high", usecols=(lambda column: column in columns), parse_dates=["commissioning_date", "decommissioning_date"])
if debug:
plants = plants.sample(500)
nodes = pd.read_csv(working_directory / "SecMOD" / "00-INPUT" / "00-RAW-INPUT" / "01-GRID" / grid / "nodes.csv", index_col="node", usecols=lambda x: "Unnamed" not in x, float_precision="high")
print("Select used technologies")
plants = plants[plants["technology"].isin(used_processes)]
print("Determine commissioning year")
plants["commissioning_year"] = plants["commissioning_date"].progress_apply(lambda date: date.year)
print("Determine decommissioning year")
plants["decommissioning_year"] = plants["decommissioning_date"].progress_apply(lambda date: date.year)
plants = plants[["technology", "electrical_capacity", "lat", "lon", "commissioning_year", "decommissioning_year"]]
print("Determine actual construction year")
plants["construction_year"] = plants.progress_apply(lambda plant: get_construction_year(plant, working_directory, internal_process_name[plant.technology], process_classes[plant.technology]), axis=1)
print("Get used construction year")
plants["construction_year"] = plants["construction_year"].progress_apply(lambda year: get_closest_year(years, year))
plants = plants[["technology", "electrical_capacity", "lat", "lon", "construction_year"]]
plants = plants.dropna()
print("Determine closest nodes")
plants["node"] = plants[["lat", "lon"]].progress_apply(lambda plant: find_closest_node(nodes, plant.lon, plant.lat), axis=1)
plants = plants[["technology", "electrical_capacity", "node", "construction_year"]]
plants.set_index(["technology", "node", "construction_year"], inplace=True)
plants.sort_index(inplace=True)
print("Aggregate capacities by technology, nodes and year of construction")
plants = plants["electrical_capacity"].groupby(level=[0,1,2]).sum()
print("Write existing capacity for {0}".format(list(plants.index.get_level_values("technology").unique())))
for process in tqdm(list(plants.index.get_level_values("technology").unique())):
capacity = plants.loc[process].unstack("construction_year").reindex(index=nodes.index).fillna(0)
capacity_columns = list(capacity.columns)
capacity_columns.sort()
capacity["unit"] = unit
capacity["comments"] = ""
capacity.reset_index(inplace=True)
capacity = capacity[["node", "unit"] + capacity_columns + ["comments"]]
export_existing_capacity(capacity, working_directory, internal_process_name[process], grid, process_classes[process])
if process in process_to_limit_potential:
potential = get_nodal_capacity_by_latest_year(capacity, working_directory, internal_process_name[process], process_classes[process], years)
export_potential_capacity(potential, working_directory, internal_process_name[process], grid, process_classes[process])
print("Done!")
def get_nodal_capacity_by_latest_year(capacity: pd.DataFrame, working_directory: Path, process: str, process_class: str, years: list):
relevant_years = [int(column) for column in capacity.columns if helpers.isInteger(column)]
reference_year = max(relevant_years)
lifetime_duration = get_lifetime_duration(working_directory, reference_year, process, process_class)
relevant_years = [year for year in relevant_years if (reference_year - year) <= lifetime_duration]
pd.options.mode.chained_assignment = None # default='warn'
potential = capacity[relevant_years]
potential["total"] = potential.sum(axis=1)
potential[["node", "unit"]] = capacity[["node", "unit"]]
potential["comments"] = "Based on the total existing capacity in {0}".format(reference_year)
for year in years:
potential[year] = potential["total"]
potential = potential[["node", "unit"] + years + ["comments"]]
pd.options.mode.chained_assignment = "warn" # default='warn'
return potential
def get_construction_year(plant, working_directory: Path, process: str, process_class: str = "production"):
"""Returns the construction year, to be used"""
if np.isnan(plant.decommissioning_year):
return plant.commissioning_year
elif not np.isnan(plant.commissioning_year):
return (plant.decommissioning_year - get_lifetime_duration(working_directory, plant.commissioning_year, process, process_class))
else:
return np.nan
def find_closest_node(nodes: pd.DataFrame, longitude, latitude):
"""This method return the ID of the node, which is closest to the plant."""
nodes["distance"] = nodes.apply(lambda node: distance.great_circle((node.latitude, node.longitude), (latitude, longitude)).km, axis=1)
return nodes["distance"].idxmin()
def get_lifetime_duration(working_directory: Path, construction_year: int, process: str, process_class: str = "production"):
"""Return the lifetime duration of a process from lifetime_duration.csv"""
process_class_directories = {"production": "01-PRODUCTION", "storage": "02-STORAGE", "transshipment": "03-TRANSSHIPMENT", "transmission": "04-TRANSMISSION"}
target_directory = working_directory / "SecMOD" / "00-INPUT" / "00-RAW-INPUT" / "02-PROCESSES" / process_class_directories[process_class] / "01-ECOINVENT-BASED" / process / "lifetime_duration.csv"
lifetime_duration = pd.read_csv(target_directory, float_precision="high", usecols=(lambda column: (column != "comments") and (column != "unit")))
years_of_data = [int(column) for column in lifetime_duration.columns]
lifetime_duration.columns = years_of_data
closest_year = get_closest_year(years_of_data, construction_year)
return lifetime_duration.at[0,get_closest_year(years_of_data, construction_year)]
def get_closest_year(years: list, year_of_construction: int):
"""Return the closest year"""
difference = [abs(year - year_of_construction) for year in years]
return years[difference.index(min(difference))]
def export_existing_capacity(capacity: pd.DataFrame, working_directory: Path, process: str, grid: str, process_class: str = "production"):
"""This method saves a dataframe to the correct position in a process and grid-subfolder."""
process_class_directories = {"production": "01-PRODUCTION", "storage": "02-STORAGE", "transshipment": "03-TRANSSHIPMENT", "transmission": "04-TRANSMISSION"}
target_directory = working_directory / "SecMOD" / "00-INPUT" / "00-RAW-INPUT" / "02-PROCESSES" / process_class_directories[process_class] / "01-ECOINVENT-BASED" / process / grid / "existing_capacity.csv"
capacity.to_csv(path_or_buf=target_directory, index=False)
def export_potential_capacity(potential: pd.DataFrame, working_directory: Path, process: str, grid: str, process_class: str):
"""This method saves a dataframe to the correct position in a process and grid-subfolder."""
process_class_directories = {"production": "01-PRODUCTION", "storage": "02-STORAGE", "transshipment": "03-TRANSSHIPMENT", "transmission": "04-TRANSMISSION"}
target_directory = working_directory / "SecMOD" / "00-INPUT" / "00-RAW-INPUT" / "02-PROCESSES" / process_class_directories[process_class] / "01-ECOINVENT-BASED" / process / grid / "potential_capacity.csv"
potential.to_csv(path_or_buf=target_directory)
if __name__ == "__main__":
setup(Path().cwd(), "renewable_power_plants", debug=False)
\ No newline at end of file
m3 = m ** 3 = cubic_meter
m2 = m ** 2 = square_meter
mass_CO2_equivalent = [Global_Warming_Potential_100a] = CO2_eq = CO2_Eq = CO2_EQ
megajoule_equivalent = [cumulative_energy_demand] = MJ_Eq = MJ_EQ = MJ_eq
mole_h_plus_equivalent = [acidification] = H_plus_eq = H_plus_Eq = H_plus_EQ
comparative_toxic_unit_for_humans = [ecotoxicity] = CTUh
phosphor_equivalent = [freshwater_eutrophication] = P_Eq = P_EQ = P_eq
nitrogen_equivalent = [marine_eutrophication] = N_Eq = N_EQ = N_eq
mass_uranium_235_equivalent = [ionising_radiation] = U235_Eq = U235_EQ = U235_eq
mass_CFC_11_equivalent = [ozone_layer_depletion] = CFC_11_Eq = CFC_11_EQ = CFC_11_eq
mass_ethylen_equivalent = [photochemical_ozone_creation] = ethylen_Eq = ethylen_EQ = ethylen_eq = C2H4_Eq = C2H4_EQ = C2H4_eq
mass_particulate_matter_2_5_equivalent = [respiratory_effects] = PM2_5_Eq = PM2_5_EQ = PM2_5_eq = PM2_5
mass_deficit_of_soil_organic_carbon = [land_use] = soil_organic_carbon = SOC
mass_antimony_equivalent = [mineral] = Sb_Eq = Sb_EQ = Sb_eq
oil_equivalent = [FDP] = oil_Eq = oil_EQ = oil_eq
mass_1_4_DCB_equivalent = [FETPinf] = DCB_Eq = DCB_EQ = DCB_eq
iron_equivalent = [MDP] = Fe_Eq = Fe_EQ = Fe_eq
particulate_matter_10_equivalent = [PMFP] = PM10_Eq = PM10_EQ = PM10_eq = PM10
NMVOC_equivalent = [POFP] = NMVOC_Eq = NMVOC_EQ = NMVOC_eq = NMVOC
mass_sulfur_dioxide = [TAP100] = SO2_Eq = SO2_EQ = SO2_eq
Euro = [money] = EURO
car = [car]
meter_vehicle = [mobility] = meter * car
circuit = [power_circuit]
\ No newline at end of file
# README - GRID DE
This data package contains all the data about the German Electricity
grid. It consists of nodes and connections. Nodes have an integer
ID and geo coordinates. Connections have an integer ID as well
and are defined by the two nodes they connect.
connection,node1,node2,manual_distance,manual_distance_unit
1,1,16,48.9379,km
2,1,16,52.1117,km
3,1,2,57.3021,km
4,1,16,49.3466,km
5,1,16,52.0148,km
6,1,16,57.3962,km
7,1,16,62.8176,km
8,2,3,131.201,km
9,2,9,46.991,km
10,2,9,47.2844,km
11,2,16,28.7351,km
12,2,3,34.6007,km
13,2,3,104.834,km
14,2,9,105.559,km
15,2,16,24.004,km
16,3,11,27.5512,km
17,3,11,34.2476,km
18,3,11,45.6801,km
19,3,4,15.4317,km
20,3,4,29.0022,km
21,3,4,56.892,km
22,3,9,79.2796,km
23,3,11,32.0209,km
24,3,11,60.8896,km
25,3,15,48.9509,km
26,3,16,28.5293,km
27,4,5,29.9327,km
28,4,5,116.183,km
29,4,11,86.3902,km
30,4,12,37.9364,km
31,4,17,58.4932,km
32,4,17,130.04,km
33,4,5,29.5558,km
34,4,11,33.4769,km
35,4,11,54.2218,km
36,4,12,54.4385,km
37,4,13,20.7582,km
38,4,13,23.5401,km
39,5,6,73.9456,km
40,5,6,95,km
41,5,6,89.7931,km
42,5,6,93.1178,km
43,5,6,100.562,km
44,5,6,112.844,km
45,5,7,92.4486,km
46,5,7,101.55,km
47,5,17,56.3032,km
48,6,14,50.1904,km
49,7,8,13.3963,km
50,7,8,20.279,km
51,7,8,104.812,km
52,7,13,21.0193,km
53,7,13,26.7976,km
54,7,8,14.1789,km
55,7,8,23.5505,km
56,7,8,45.7653,km
57,7,8,55.481,km
58,7,8,120.971,km
59,7,8,204.077,km
60,7,13,47.3946,km
61,7,13,61.5578,km
62,7,13,74.1112,km
63,7,13,152.519,km
64,8,13,111.813,km
65,8,13,86.4628,km
66,8,13,138.549,km
67,8,14,16.9606,km
68,8,14,19.9738,km
69,8,14,26.6516,km
70,8,14,40.8788,km
71,8,14,41.1006,km
72,8,14,46.9505,km
73,9,10,64.6059,km
74,9,10,64.6962,km
75,9,10,110.981,km
76,9,11,42.3182,km
77,9,11,69.992,km
78,9,11,115.669,km
79,9,11,59.2155,km
80,10,11,10.0014,km
81,10,11,21.97,km
82,10,11,22.4985,km
83,10,11,24.2453,km
84,10,11,26.707,km
85,10,11,28.8168,km
86,10,11,77.1936,km
87,10,12,3.98041,km
88,10,12,5.3362,km
89,10,12,11.3042,km
90,10,12,18.9789,km
91,10,12,18.9865,km
92,10,12,22.6509,km
93,10,12,22.764,km
94,10,12,24.5185,km
95,10,12,27.1188,km
96,10,12,31.2371,km
97,10,12,31.3148,km
98,10,12,43.979,km
99,10,11,25.743,km
100,10,11,34.8071,km
101,10,11,37.6526,km
102,10,11,57.8004,km
103,10,12,10.1819,km
104,10,12,30.9199,km
105,10,12,74.0115,km
106,10,12,83.9702,km
107,11,12,51.9124,km
108,12,13,56.9823,km
109,12,13,58.7159,km
110,12,13,73.8307,km
111,12,13,95.3573,km
112,12,13,118.637,km
113,12,13,124.115,km
114,15,16,87.3598,km
115,15,17,119.15,km
116,15,18,62.4058,km
117,15,18,94.9249,km
118,15,18,125.677,km
119,15,18,130.612,km
120,15,18,208.282,km
121,17,18,61.8101,km
122,17,18,98.654,km
123,17,18,109.47,km
124,17,18,131.693,km
125,17,18,157.592,km
126,17,18,169.377,km
127,17,18,67.4574,km
128,17,18,103.507,km
129,17,18,104.592,km
{
"profile": "tabular-data-package",
"resources": [
{
"path": "connections.csv",
"profile": "tabular-data-resource",
"name": "connections",
"format": "csv",
"mediatype": "text/csv",
"encoding": "utf-8",
"schema": {
"fields": [
{
"name": "connection",
"type": "integer",
"format": "default"
},
{
"name": "node1",
"type": "integer",
"format": "default"
},
{
"name": "node2",
"type": "integer",
"format": "default"
}
],
"missingValues": [
""
]
}
},
{
"path": "nodes.csv",
"profile": "tabular-data-resource",
"name": "nodes",
"format": "csv",
"mediatype": "text/csv",
"encoding": "utf-8",
"schema": {
"fields": [
{
"name": "node",
"type": "integer",
"format": "default"
},
{
"name": "country",
"type": "string",
"format": "default"
},
{
"name": "state",
"type": "string",
"format": "default"
},
{
"name": "dena_region",
"type": "string",
"format": "default"
},
{
"name": "z6_region",
"type": "string",
"format": "default"
},
{
"name": "latitude",
"type": "number",
"format": "default"
},
{
"name": "longitude",
"type": "number",
"format": "default"
}
],
"missingValues": [
""
]
}
}
]
}
\ No newline at end of file
node,latitude,longitude,country,state,dena_region,z6_region
1,54.29,9.725,DE,DE_SH,dena21,DE_NW
2,53.235,8.406,DE,DE_NI,dena22,DE_NW
3,52.278,9.917,DE,DE_NI,dena23,DE_NW
4,51.059,9.258,DE,DE_HE,dena24,DE_WE
5,49.929,10.836,DE,DE_BY,dena25,DE_SE
6,48.207,11.868,DE,DE_BY,dena26,DE_SE
7,49.29,8.674,DE,DE_BW,dena41,DE_SW
8,48.31,8.873,DE,DE_BW,dena42,DE_SW
9,52.288,7.748,DE,DE_NRW,dena71,DE_NW
10,51.445,6.948,DE,DE_NRW,dena72,DE_WE
11,51.684,7.992,DE,DE_NRW,dena73,DE_WE
12,50.795,6.973,DE,DE_NRW,dena74,DE_WE
13,49.483,7.729,DE,DE_RP,dena75,DE_SW
14,48.027,10.642,DE,DE_BY,dena76,DE_SE
15,52.562,12.941,DE,DE_BB,dena81,DE_NE
16,53.555,10.158,DE,DE_HH,dena82,DE_NW
17,50.93,11.471,DE,DE_TH,dena83,DE_EA
18,51.356,13.382,DE,DE_SN,dena84,DE_EA
# README - 01-GRID
This directory contains all data packages which define
a grid model. A grid definition contains the information
about the nodes of the grid, their geo coordinates
and connections between the nodes. A connection is only
defined by the two nodes it connects.
SecMOD can handle multiple grid folders at once. The grid which should be used in the optimization must be indicated in the config.py.
[
"megameter",
"kilocar",
"MW",
"MWh",
"circuit",
"hour",
"cubic_meter",
"",
"gigagram",
"mass_CO2_equivalent",
"gigaEuro",
"ohm",
"kV"
]
\ No newline at end of file
# README - 01-ECOINVENT-BASED
This directory contains all data packages which define
production processes using ecoinvent.
# README - NATURAL GAS COMBINED CYCLE - DE
This data package contains all necessary information
about the production process **natural gas combined cycle** in the grid: **DE**
node,unit,2016,comments
1,MW ,,
2,MW ,,
3,MW ,,
4,MW ,,
5,MW ,,
6,MW ,,
7,MW ,,
8,MW ,,
9,MW ,,
10,MW ,,
11,MW ,,
12,MW ,,
13,MW ,,
14,MW ,,
15,MW ,,
16,MW ,,
17,MW ,,
18,MW ,,
node,unit,2016,2020,2025,2030,2035,2040,2045,2050,comments
1,1,,,,,,,,,
2,1,,,,,,,,,
3,1,,,,,,,,,
4,1,,,,,,,,,
5,1,,,,,,,,,
6,1,,,,,,,,,
7,1,,,,,,,,,
8,1,,,,,,,,,
9,1,,,,,,,,,
10,1,,,,,,,,,
11,1,,,,,,,,,
12,1,,,,,,,,,
13,1,,,,,,,,,
14,1,,,,,,,,,
15,1,,,,,,,,,
16,1,,,,,,,,,
17,1,,,,,,,,,
18,1,,,,,,,,,
node,unit,2016,2020,2025,2030,2035,2040,2045,2050,comments
1,MW ,,,,,,,,,
2,MW ,,,,,,,,,
3,MW ,,,,,,,,,
4,MW ,,,,,,,,,
5,MW ,,,,,,,,,
6,MW ,,,,,,,,,
7,MW ,,,,,,,,,
8,MW ,,,,,,,,,
9,MW ,,,,,,,,,
10,MW ,,,,,,,,,
11,MW ,,,,,,,,,
12,MW ,,,,,,,,,
13,MW ,,,,,,,,,
14,MW ,,,,,,,,,
15,MW ,,,,,,,,,
16,MW ,,,,,,,,,
17,MW ,,,,,,,,,
18,MW ,,,,,,,,,
# README - NATURAL GAS COMBINED CYCLE
This data package contains all necessary information
about the production process **natural gas combined cycle**. Additional information for a specific grid can be modified in the folder named similar to the grid which is used.
All ecoinvent files contain randomly assigned exemplary values which were not taken from the ecoinvent database.
phase,unit,2016,2020,2025,2030,2035,2040,2045,2050,comments
invest,kiloEuro * MW ** (-1),700,700,700,700,700,700,700,700,
operation,kiloEuro * MWh ** (-1),0,0,0,0,0,0,0,0,
maintenance_absolute,kiloEuro * MW ** (-1),24,24,24,24,24,24,24,24,
maintenance_relative_invest,1,0,0,0,0,0,0,0,0,
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment