Merge branch 'master' into reduced-data-bundle
This commit is contained in:
commit
0d9e0f34fd
2
.github/workflows/ci.yaml
vendored
2
.github/workflows/ci.yaml
vendored
@ -31,7 +31,7 @@ jobs:
|
|||||||
os:
|
os:
|
||||||
- ubuntu-latest
|
- ubuntu-latest
|
||||||
- macos-latest
|
- macos-latest
|
||||||
# - windows-latest
|
- windows-latest
|
||||||
inhouse:
|
inhouse:
|
||||||
- stable
|
- stable
|
||||||
- master
|
- master
|
||||||
|
@ -51,7 +51,7 @@ repos:
|
|||||||
|
|
||||||
# Formatting with "black" coding style
|
# Formatting with "black" coding style
|
||||||
- repo: https://github.com/psf/black-pre-commit-mirror
|
- repo: https://github.com/psf/black-pre-commit-mirror
|
||||||
rev: 24.3.0
|
rev: 24.4.2
|
||||||
hooks:
|
hooks:
|
||||||
# Format Python files
|
# Format Python files
|
||||||
- id: black
|
- id: black
|
||||||
@ -74,7 +74,7 @@ repos:
|
|||||||
|
|
||||||
# Format Snakemake rule / workflow files
|
# Format Snakemake rule / workflow files
|
||||||
- repo: https://github.com/snakemake/snakefmt
|
- repo: https://github.com/snakemake/snakefmt
|
||||||
rev: v0.10.0
|
rev: v0.10.1
|
||||||
hooks:
|
hooks:
|
||||||
- id: snakefmt
|
- id: snakefmt
|
||||||
|
|
||||||
|
@ -8,7 +8,7 @@ from os.path import normpath, exists
|
|||||||
from shutil import copyfile, move, rmtree
|
from shutil import copyfile, move, rmtree
|
||||||
from snakemake.utils import min_version
|
from snakemake.utils import min_version
|
||||||
|
|
||||||
min_version("8.5")
|
min_version("8.11")
|
||||||
|
|
||||||
from scripts._helpers import path_provider, copy_default_files, get_scenarios, get_rdir
|
from scripts._helpers import path_provider, copy_default_files, get_scenarios, get_rdir
|
||||||
|
|
||||||
|
@ -71,7 +71,6 @@ enable:
|
|||||||
retrieve_databundle: true
|
retrieve_databundle: true
|
||||||
retrieve_cost_data: true
|
retrieve_cost_data: true
|
||||||
build_cutout: false
|
build_cutout: false
|
||||||
retrieve_irena: false
|
|
||||||
retrieve_cutout: true
|
retrieve_cutout: true
|
||||||
custom_busmap: false
|
custom_busmap: false
|
||||||
drop_leap_day: true
|
drop_leap_day: true
|
||||||
@ -767,7 +766,7 @@ solving:
|
|||||||
|
|
||||||
solver_options:
|
solver_options:
|
||||||
highs-default:
|
highs-default:
|
||||||
# refer to https://ergo-code.github.io/HiGHS/options/definitions.html#solver
|
# refer to https://ergo-code.github.io/HiGHS/dev/options/definitions/
|
||||||
threads: 4
|
threads: 4
|
||||||
solver: "ipm"
|
solver: "ipm"
|
||||||
run_crossover: "off"
|
run_crossover: "off"
|
||||||
|
@ -1,34 +0,0 @@
|
|||||||
Country/area,2000,2001,2002,2003,2004,2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015,2016,2017,2018,2019,2020,2021,2022
|
|
||||||
Albania,,,,,,,,,,,,,,,,,,,,,,,
|
|
||||||
Austria,,,,,,,,,,,,,,,,,,,,,,,
|
|
||||||
Belgium,,,,,,,,,,31.5,196.5,196.5,381.0,707.7,707.7,712.0,712.2,877.2,1185.9,1555.5,2261.8,2261.8,2261.8
|
|
||||||
Bosnia Herzg,,,,,,,,,,,,,,,,,,,,,,,
|
|
||||||
Bulgaria,,,,,,,,,,,,,,,,,,,,,,,
|
|
||||||
Croatia,,,,,,,,,,,,,,,,,,,,,,,
|
|
||||||
Czechia,,,,,,,,,,,,,,,,,,,,,,,
|
|
||||||
Denmark,49.95,49.95,213.95,423.35,423.35,423.35,423.35,423.35,423.35,660.85,867.85,871.45,921.85,1271.05,1271.05,1271.05,1271.05,1263.8,1700.8,1700.8,1700.8,2305.6,2305.6
|
|
||||||
Estonia,,,,,,,,,,,,,,,,,,,,,,,
|
|
||||||
Finland,,,,,,,,,24.0,24.0,26.3,26.3,26.3,26.3,26.3,32.0,32.0,72.7,72.7,73.0,73.0,73.0,73.0
|
|
||||||
France,,,,,,,,,,,,,,,,,,2.0,2.0,2.0,2.0,2.0,482.0
|
|
||||||
Germany,,,,,,,,,,35.0,80.0,188.0,268.0,508.0,994.0,3283.0,4132.0,5406.0,6393.0,7555.0,7787.0,7787.0,8129.0
|
|
||||||
Greece,,,,,,,,,,,,,,,,,,,,,,,
|
|
||||||
Hungary,,,,,,,,,,,,,,,,,,,,,,,
|
|
||||||
Ireland,,,,,25.2,25.2,25.2,25.2,25.2,25.2,25.2,25.2,25.2,25.2,25.2,25.2,25.2,25.2,25.2,25.2,25.2,25.2,25.2
|
|
||||||
Italy,,,,,,,,,,,,,,,,,,,,,,,30.0
|
|
||||||
Latvia,,,,,,,,,,,,,,,,,,,,,,,
|
|
||||||
Lithuania,,,,,,,,,,,,,,,,,,,,,,,
|
|
||||||
Luxembourg,,,,,,,,,,,,,,,,,,,,,,,
|
|
||||||
Montenegro,,,,,,,,,,,,,,,,,,,,,,,
|
|
||||||
Netherlands,,,,,,,108.0,108.0,228.0,228.0,228.0,228.0,228.0,228.0,228.0,357.0,957.0,957.0,957.0,957.0,2459.5,2459.5,2571.0
|
|
||||||
North Macedonia,,,,,,,,,,,,,,,,,,,,,,,
|
|
||||||
Norway,,,,,,,,,,2.3,2.3,2.3,2.3,2.3,2.3,2.3,2.3,2.3,2.3,2.3,2.3,6.3,66.3
|
|
||||||
Poland,,,,,,,,,,,,,,,,,,,,,,,
|
|
||||||
Portugal,,,,,,,,,,,,1.86,2.0,2.0,2.0,2.0,,,,,25.0,25.0,25.0
|
|
||||||
Romania,,,,,,,,,,,,,,,,,,,,,,,
|
|
||||||
Serbia,,,,,,,,,,,,,,,,,,,,,,,
|
|
||||||
Slovakia,,,,,,,,,,,,,,,,,,,,,,,
|
|
||||||
Slovenia,,,,,,,,,,,,,,,,,,,,,,,
|
|
||||||
Spain,,,,,,,,,,,,,,5.0,5.0,5.0,5.0,5.0,5.0,5.0,5.0,5.0,5.0
|
|
||||||
Sweden,13.0,22.0,22.0,22.0,22.0,22.0,22.0,131.0,133.0,163.0,163.0,163.0,163.0,212.0,213.0,213.0,203.0,203.0,203.0,203.0,203.0,193.0,193.0
|
|
||||||
Switzerland,,,,,,,,,,,,,,,,,,,,,,,
|
|
||||||
UK,4.0,4.0,4.0,64.0,124.0,214.0,304.0,394.0,596.2,951.0,1341.0,1838.0,2995.0,3696.0,4501.0,5093.0,5293.0,6988.0,8181.0,9888.0,10383.0,11255.0,13928.0
|
|
|
@ -1,34 +0,0 @@
|
|||||||
Country/area,2000,2001,2002,2003,2004,2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015,2016,2017,2018,2019,2020,2021,2022
|
|
||||||
Albania,,,,,,,,,,,,,,,,,,,,,,,
|
|
||||||
Austria,50.0,67.0,109.0,322.0,581.0,825.22,968.27,991.16,991.97,1000.99,1015.83,1105.97,1337.15,1674.54,2110.28,2488.73,2730.0,2886.7,3132.71,3224.12,3225.98,3407.81,3735.81
|
|
||||||
Belgium,14.0,26.0,31.0,67.0,96.0,167.0,212.0,276.0,324.0,576.5,715.5,872.5,985.9,1061.3,1225.0,1469.3,1621.6,1902.2,2119.0,2308.0,2410.9,2686.6,2989.6
|
|
||||||
Bosnia Herzg,,,,,,,,,,,,0.3,0.3,0.3,0.3,0.3,0.3,0.3,51.0,87.0,87.0,135.0,135.0
|
|
||||||
Bulgaria,,,,,1.0,8.0,27.0,30.0,114.0,333.0,488.0,541.0,677.0,683.0,699.0,699.0,699.0,698.39,698.92,703.12,702.8,704.38,704.38
|
|
||||||
Croatia,,,,,6.0,6.0,17.0,17.0,17.0,70.0,79.0,130.0,180.0,254.0,339.0,418.0,483.0,576.1,586.3,646.3,801.3,986.9,1042.9
|
|
||||||
Czechia,2.0,,6.4,10.6,16.5,22.0,43.5,113.8,150.0,193.0,213.0,213.0,258.0,262.0,278.0,281.0,282.0,308.21,316.2,339.41,339.42,339.41,339.41
|
|
||||||
Denmark,2340.07,2447.2,2680.58,2696.57,2700.36,2704.49,2712.35,2700.86,2739.52,2821.24,2933.98,3080.53,3240.09,3547.87,3615.35,3805.92,3974.09,4225.15,4421.86,4409.74,4566.23,4715.24,4782.24
|
|
||||||
Estonia,,,1.0,3.0,7.0,31.0,31.0,50.0,77.0,104.0,108.0,180.0,266.0,248.0,275.0,300.0,310.0,311.8,310.0,316.0,317.0,315.0,315.0
|
|
||||||
Finland,38.0,39.0,43.0,52.0,82.0,82.0,86.0,110.0,119.0,123.0,170.7,172.7,230.7,420.7,600.7,973.0,1533.0,1971.3,1968.3,2211.0,2513.0,3184.0,5541.0
|
|
||||||
France,38.0,66.0,138.0,218.0,358.0,690.0,1412.0,2223.0,3403.0,4582.0,5912.0,6758.02,7607.5,8155.96,9201.42,10298.18,11566.56,13497.35,14898.14,16424.85,17512.0,18737.98,20637.98
|
|
||||||
Germany,6095.0,8754.0,12001.0,14381.0,16419.0,18248.0,20474.0,22116.0,22794.0,25697.0,26823.0,28524.0,30711.0,32969.0,37620.0,41297.0,45303.0,50174.0,52328.0,53187.0,54414.0,56046.0,58165.0
|
|
||||||
Greece,226.0,270.0,287.0,371.0,470.0,491.0,749.0,846.0,1022.0,1171.0,1298.0,1640.0,1753.0,1809.0,1978.0,2091.0,2370.0,2624.0,2877.5,3589.0,4119.25,4649.13,4879.13
|
|
||||||
Hungary,,1.0,1.0,3.0,3.0,17.0,33.0,61.0,134.0,203.0,293.0,331.0,325.0,329.0,329.0,329.0,329.0,329.0,329.0,323.0,323.0,324.0,324.0
|
|
||||||
Ireland,116.5,122.9,134.8,210.3,311.2,468.1,651.3,715.3,917.1,1226.1,1365.2,1559.4,1679.15,1898.1,2258.05,2425.95,2776.45,3293.95,3648.65,4101.25,4281.5,4313.84,4593.84
|
|
||||||
Italy,363.0,664.0,780.0,874.0,1127.0,1635.0,1902.0,2702.0,3525.0,4879.0,5794.0,6918.0,8102.0,8542.0,8683.0,9137.0,9384.0,9736.58,10230.25,10679.46,10870.62,11253.73,11749.73
|
|
||||||
Latvia,2.0,2.0,22.0,26.0,26.0,26.0,26.0,26.0,28.0,29.0,30.0,36.0,59.0,65.89,68.92,68.17,69.91,77.11,78.17,78.07,78.07,77.13,136.13
|
|
||||||
Lithuania,,,,,1.0,1.0,31.0,47.0,54.0,98.0,133.0,202.0,275.0,279.0,288.0,436.0,509.0,518.0,533.0,534.0,540.0,671.0,814.0
|
|
||||||
Luxembourg,14.0,13.9,13.9,20.5,34.9,34.9,34.9,34.9,42.92,42.93,43.73,44.53,58.33,58.33,58.34,63.79,119.69,119.69,122.89,135.79,152.74,136.44,165.44
|
|
||||||
Montenegro,,,,,,,,,,,,,,,,,,72.0,72.0,118.0,118.0,118.0,118.0
|
|
||||||
Netherlands,447.0,486.0,672.0,905.0,1075.0,1224.0,1453.0,1641.0,1921.0,1994.0,2009.0,2088.0,2205.0,2485.0,2637.0,3033.84,3300.12,3245.0,3436.11,3527.16,4188.38,5309.87,6176.0
|
|
||||||
North Macedonia,,,,,,,,,,,,,,,37.0,37.0,37.0,37.0,37.0,37.0,37.0,37.0,37.0
|
|
||||||
Norway,13.0,13.0,97.0,97.0,152.0,265.0,284.0,348.0,395.0,420.7,422.7,509.7,702.7,815.7,856.7,864.7,880.7,1204.7,1707.7,2911.7,4027.7,5042.7,5067.7
|
|
||||||
Poland,4.0,19.0,32.0,35.0,40.0,121.0,172.0,306.0,526.0,709.0,1108.0,1800.0,2564.0,3429.0,3836.0,4886.0,5747.0,5759.36,5766.08,5837.76,6298.25,6967.34,7987.34
|
|
||||||
Portugal,83.0,125.0,190.0,268.0,553.0,1064.0,1681.0,2201.0,2857.0,3326.0,3796.0,4254.35,4409.55,4607.95,4854.56,4934.84,5124.1,5124.1,5172.36,5222.75,5097.26,5402.33,5430.33
|
|
||||||
Romania,,,,,,1.0,1.0,3.0,5.0,15.0,389.0,988.0,1822.0,2773.0,3244.0,3130.0,3025.0,3029.8,3032.26,3037.52,3012.53,3014.96,3014.96
|
|
||||||
Serbia,,,,,,,,,,,,,0.5,0.5,0.5,10.4,17.0,25.0,227.0,398.0,398.0,398.0,398.0
|
|
||||||
Slovakia,,,,3.0,3.0,5.0,5.0,5.0,5.0,3.0,3.0,3.0,3.0,5.0,3.0,3.0,3.0,4.0,3.0,4.0,4.0,4.0,4.0
|
|
||||||
Slovenia,,,,,,,,,,,,,2.0,2.0,3.0,3.0,3.0,3.3,3.3,3.3,3.3,3.33,3.33
|
|
||||||
Spain,2206.0,3397.0,4891.0,5945.0,8317.0,9918.0,11722.0,14820.0,16555.0,19176.0,20693.0,21529.0,22789.0,22953.0,22920.0,22938.0,22985.0,23119.48,23400.06,25585.08,26814.19,27902.65,29302.84
|
|
||||||
Sweden,196.0,273.0,335.0,395.0,453.0,500.0,563.0,692.0,956.0,1312.0,1854.0,2601.0,3443.0,3982.0,4875.0,5606.0,6232.0,6408.0,7097.0,8478.0,9773.0,11923.0,14364.0
|
|
||||||
Switzerland,3.0,5.0,5.0,5.0,9.0,12.0,12.0,12.0,14.0,18.0,42.0,46.0,49.0,60.0,60.0,60.0,75.0,75.0,75.0,75.0,87.0,87.0,87.0
|
|
||||||
UK,431.0,490.0,531.0,678.0,809.0,1351.0,1651.0,2083.0,2849.8,3468.0,4080.0,4758.0,6035.0,7586.0,8573.0,9212.0,10833.0,12597.0,13425.0,13999.0,14075.0,14492.0,14832.0
|
|
|
@ -1,34 +0,0 @@
|
|||||||
Country/area,2000,2001,2002,2003,2004,2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015,2016,2017,2018,2019,2020,2021,2022
|
|
||||||
Albania,,0.1,0.2,0.2,0.2,0.2,0.2,0.2,0.2,0.3,0.4,0.56,0.68,0.76,0.87,1.05,1.0,1.0,1.0,14.0,21.0,23.0,28.6
|
|
||||||
Austria,5.0,7.0,9.0,23.0,27.0,18.49,19.61,21.42,27.0,45.56,85.27,169.88,333.09,620.78,779.76,931.56,1089.53,1262.01,1447.94,1694.4,2034.74,2773.91,3538.91
|
|
||||||
Belgium,,,1.0,1.0,1.0,2.0,2.0,20.0,62.0,386.0,1006.6,1978.6,2646.6,2901.6,3015.0,3131.6,3328.8,3620.6,4000.0,4636.6,5572.8,6012.4,6898.4
|
|
||||||
Bosnia Herzg,,,,0.1,0.2,0.3,0.3,0.3,0.3,0.3,0.3,0.3,0.35,1.34,7.17,8.17,14.12,16.0,18.15,22.35,34.89,56.51,107.47
|
|
||||||
Bulgaria,,,,,,,,0.03,0.1,2.0,25.0,154.0,921.99,1038.54,1028.92,1027.89,1029.89,1030.7,1033.06,1044.39,1100.21,1274.71,1948.36
|
|
||||||
Croatia,,,,,,,,,,0.3,0.3,0.3,4.0,19.0,33.0,47.8,55.8,60.0,67.7,84.8,108.5,138.3,182.3
|
|
||||||
Czechia,0.1,0.1,0.2,0.3,0.4,0.59,0.84,3.96,39.5,464.6,1727.0,1913.0,2022.0,2063.5,2067.4,2074.9,2067.9,2075.44,2081.05,2110.67,2171.96,2246.09,2627.09
|
|
||||||
Denmark,1.0,1.0,2.0,2.0,2.0,3.0,3.0,3.0,3.0,5.0,7.0,17.0,402.0,571.0,607.0,782.11,850.95,906.35,998.0,1080.0,1304.29,1704.04,3122.04
|
|
||||||
Estonia,,,,,,,,,,0.1,0.1,0.2,0.38,1.5,3.34,6.5,10.0,15.0,31.9,120.6,207.67,394.77,534.77
|
|
||||||
Finland,2.0,3.0,3.0,3.0,4.0,4.0,5.0,5.0,6.0,6.0,7.0,7.0,8.0,9.0,11.0,17.0,39.0,82.0,140.0,222.0,318.0,425.0,590.6
|
|
||||||
France,7.0,7.0,8.0,9.0,11.0,13.0,15.0,26.0,80.0,277.0,1044.0,3003.57,4358.75,5277.29,6034.42,7137.52,7702.08,8610.44,9638.88,10738.39,11812.2,14436.97,17036.97
|
|
||||||
Germany,114.0,195.0,260.0,435.0,1105.0,2056.0,2899.0,4170.0,6120.0,10564.0,18004.0,25914.0,34075.0,36708.0,37898.0,39222.0,40677.0,42291.0,45156.0,48912.0,53669.0,59371.0,66662.0
|
|
||||||
Greece,,1.0,1.0,1.0,1.0,1.0,5.0,9.0,12.0,46.0,202.0,612.0,1536.0,2579.0,2596.0,2604.0,2604.0,2605.53,2651.57,2833.79,3287.72,4277.42,5557.42
|
|
||||||
Hungary,,,,,,,,0.4,1.0,1.0,2.0,4.0,12.0,35.0,89.0,172.0,235.0,344.0,728.0,1400.0,2131.0,2968.0,2988.0
|
|
||||||
Ireland,,,,,,,,,,,,,,,,,,,,,,,
|
|
||||||
Italy,19.0,20.0,22.0,26.0,31.0,34.0,45.0,110.0,483.0,1264.0,3592.0,13131.0,16785.0,18185.0,18594.0,18901.0,19283.0,19682.29,20107.59,20865.28,21650.04,22594.26,25076.56
|
|
||||||
Latvia,,,,,,,,,,,,,,,,,0.69,0.69,1.96,3.3,5.1,7.16,56.16
|
|
||||||
Lithuania,,,,,,,,,0.1,0.1,0.1,0.3,7.0,68.0,69.0,69.0,70.0,70.08,72.0,73.0,80.0,84.0,397.0
|
|
||||||
Luxembourg,,0.16,1.59,14.17,23.56,23.58,23.7,23.93,24.56,26.36,29.45,40.67,74.65,95.02,109.93,116.27,121.9,128.1,130.62,159.74,186.64,277.16,319.16
|
|
||||||
Montenegro,,,,,,,,,,,,,,,,,,,,,2.57,2.57,22.2
|
|
||||||
Netherlands,13.0,21.0,26.0,46.0,50.0,51.0,53.0,54.0,59.0,69.0,90.0,149.0,287.0,650.0,1007.0,1526.26,2135.02,2910.89,4608.0,7226.0,11108.43,14910.69,18848.69
|
|
||||||
North Macedonia,,,,,,,,,,,,2.0,4.0,7.0,15.0,17.0,16.7,16.7,16.7,16.71,84.93,84.93,84.93
|
|
||||||
Norway,6.0,6.0,6.0,7.0,7.0,7.0,8.0,8.0,8.3,8.7,9.1,9.5,10.0,11.0,13.0,15.0,26.7,44.9,53.11,102.53,141.53,186.53,302.53
|
|
||||||
Poland,,,,,,,,,,,,1.11,1.3,2.39,27.15,107.78,187.25,287.09,561.98,1539.26,3954.96,7415.52,11166.52
|
|
||||||
Portugal,1.0,1.0,1.0,2.0,2.0,2.0,3.0,24.0,59.0,115.0,134.0,169.6,235.6,293.6,412.6,441.75,493.05,539.42,617.85,832.74,1010.07,1474.78,2364.78
|
|
||||||
Romania,,,,,,,,,0.1,0.1,0.1,1.0,41.0,761.0,1293.0,1326.0,1372.0,1374.13,1385.82,1397.71,1382.54,1393.92,1413.92
|
|
||||||
Serbia,,,,,,0.1,0.2,0.4,0.9,1.2,1.3,1.5,3.1,4.7,6.0,9.0,11.0,10.0,11.0,11.0,11.5,11.94,11.94
|
|
||||||
Slovakia,,,,,,,,,,,19.0,496.0,513.0,533.0,533.0,533.0,533.0,528.0,472.0,590.0,535.0,537.0,537.0
|
|
||||||
Slovenia,1.0,1.0,,,,0.05,0.19,0.59,1.0,4.0,12.0,57.0,142.0,187.0,223.0,238.0,233.0,246.8,246.8,277.88,369.78,461.16,632.16
|
|
||||||
Spain,1.0,3.0,6.0,10.0,19.0,37.0,113.0,476.0,3365.0,3403.0,3851.0,4260.0,4545.0,4665.0,4672.0,4677.0,4687.0,4696.0,4730.7,8772.02,10100.42,13678.4,18176.73
|
|
||||||
Sweden,3.0,3.0,3.0,4.0,4.0,4.0,5.0,6.0,8.0,9.0,11.0,12.0,24.0,43.0,60.0,104.0,153.0,231.0,411.0,698.0,1090.0,1587.0,2587.0
|
|
||||||
Switzerland,16.0,18.0,20.0,22.0,24.0,28.0,30.0,37.0,49.0,79.0,125.0,223.0,437.0,756.0,1061.0,1394.0,1664.0,1906.0,2173.0,2498.0,2973.0,3655.0,4339.92
|
|
||||||
UK,2.0,3.0,4.0,6.0,8.0,11.0,14.0,18.0,23.0,27.0,95.0,1000.0,1753.0,2937.0,5528.0,9601.0,11914.0,12760.0,13059.0,13345.0,13579.0,13965.0,14660.0
|
|
|
@ -4,7 +4,6 @@ prepare_links_p_nom,bool,"{true, false}","Switch to retrieve current HVDC projec
|
|||||||
retrieve_databundle,bool,"{true, false}","Switch to retrieve databundle from zenodo via the rule :mod:`retrieve_databundle` or whether to keep a custom databundle located in the corresponding folder."
|
retrieve_databundle,bool,"{true, false}","Switch to retrieve databundle from zenodo via the rule :mod:`retrieve_databundle` or whether to keep a custom databundle located in the corresponding folder."
|
||||||
retrieve_cost_data,bool,"{true, false}","Switch to retrieve technology cost data from `technology-data repository <https://github.com/PyPSA/technology-data>`_."
|
retrieve_cost_data,bool,"{true, false}","Switch to retrieve technology cost data from `technology-data repository <https://github.com/PyPSA/technology-data>`_."
|
||||||
build_cutout,bool,"{true, false}","Switch to enable the building of cutouts via the rule :mod:`build_cutout`."
|
build_cutout,bool,"{true, false}","Switch to enable the building of cutouts via the rule :mod:`build_cutout`."
|
||||||
retrieve_irena,bool,"{true, false}",Switch to enable the retrieval of ``existing_capacities`` from IRENASTAT with :mod:`retrieve_irena`.
|
|
||||||
retrieve_cutout,bool,"{true, false}","Switch to enable the retrieval of cutouts from zenodo with :mod:`retrieve_cutout`."
|
retrieve_cutout,bool,"{true, false}","Switch to enable the retrieval of cutouts from zenodo with :mod:`retrieve_cutout`."
|
||||||
custom_busmap,bool,"{true, false}","Switch to enable the use of custom busmaps in rule :mod:`cluster_network`. If activated the rule looks for provided busmaps at ``data/custom_busmap_elec_s{simpl}_{clusters}.csv`` which should have the same format as ``resources/busmap_elec_s{simpl}_{clusters}.csv``, i.e. the index should contain the buses of ``networks/elec_s{simpl}.nc``."
|
custom_busmap,bool,"{true, false}","Switch to enable the use of custom busmaps in rule :mod:`cluster_network`. If activated the rule looks for provided busmaps at ``data/custom_busmap_elec_s{simpl}_{clusters}.csv`` which should have the same format as ``resources/busmap_elec_s{simpl}_{clusters}.csv``, i.e. the index should contain the buses of ``networks/elec_s{simpl}.nc``."
|
||||||
drop_leap_day,bool,"{true, false}","Switch to drop February 29 from all time-dependent data in leap years"
|
drop_leap_day,bool,"{true, false}","Switch to drop February 29 from all time-dependent data in leap years"
|
||||||
|
|
@ -20,7 +20,7 @@ constraints ,,,
|
|||||||
-- BAU,bool,"{'true','false'}",Add a per-``carrier`` minimal overall capacity; i.e. at least ``40GW`` of ``OCGT`` in Europe; configured in ``electricity: BAU_mincapacities``
|
-- BAU,bool,"{'true','false'}",Add a per-``carrier`` minimal overall capacity; i.e. at least ``40GW`` of ``OCGT`` in Europe; configured in ``electricity: BAU_mincapacities``
|
||||||
-- SAFE,bool,"{'true','false'}",Add a capacity reserve margin of a certain fraction above the peak demand to which renewable generators and storage do *not* contribute. Ignores network.
|
-- SAFE,bool,"{'true','false'}",Add a capacity reserve margin of a certain fraction above the peak demand to which renewable generators and storage do *not* contribute. Ignores network.
|
||||||
solver,,,
|
solver,,,
|
||||||
-- name,--,"One of {'gurobi', 'cplex', 'cbc', 'glpk', 'ipopt'}; potentially more possible",Solver to use for optimisation problems in the workflow; e.g. clustering and linear optimal power flow.
|
-- name,--,"One of {'gurobi', 'cplex', 'highs', 'cbc', 'glpk'}; potentially more possible",Solver to use for optimisation problems in the workflow; e.g. clustering and linear optimal power flow.
|
||||||
-- options,--,Key listed under ``solver_options``.,Link to specific parameter settings.
|
-- options,--,Key listed under ``solver_options``.,Link to specific parameter settings.
|
||||||
solver_options,,dict,Dictionaries with solver-specific parameter settings.
|
solver_options,,dict,Dictionaries with solver-specific parameter settings.
|
||||||
mem,MB,int,Estimated maximum memory requirement for solving networks.
|
mem,MB,int,Estimated maximum memory requirement for solving networks.
|
||||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 227 KiB After Width: | Height: | Size: 208 KiB |
BIN
doc/img/workflow.png
Normal file
BIN
doc/img/workflow.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 700 KiB |
@ -135,7 +135,7 @@ as part of the `Stromnetze Research Initiative
|
|||||||
Workflow
|
Workflow
|
||||||
========
|
========
|
||||||
|
|
||||||
.. image:: ../graphics/workflow.png
|
.. image:: img/workflow.png
|
||||||
:class: full-width
|
:class: full-width
|
||||||
:align: center
|
:align: center
|
||||||
|
|
||||||
|
@ -62,7 +62,7 @@ PyPSA is known to work with the free software
|
|||||||
- `HiGHS <https://highs.dev/>`__
|
- `HiGHS <https://highs.dev/>`__
|
||||||
- `Cbc <https://projects.coin-or.org/Cbc#DownloadandInstall>`__
|
- `Cbc <https://projects.coin-or.org/Cbc#DownloadandInstall>`__
|
||||||
- `GLPK <https://www.gnu.org/software/glpk/>`__ (`WinGLKP <http://winglpk.sourceforge.net/>`__)
|
- `GLPK <https://www.gnu.org/software/glpk/>`__ (`WinGLKP <http://winglpk.sourceforge.net/>`__)
|
||||||
- `Ipopt <https://coin-or.github.io/Ipopt/INSTALL.html>`__
|
- `SCIP <https://scipopt.github.io/PySCIPOpt/docs/html/index.html>`__
|
||||||
|
|
||||||
and the non-free, commercial software (for some of which free academic licenses are available)
|
and the non-free, commercial software (for some of which free academic licenses are available)
|
||||||
|
|
||||||
@ -80,7 +80,7 @@ Nevertheless, you can still use open-source solvers for smaller problems.
|
|||||||
|
|
||||||
.. note::
|
.. note::
|
||||||
The rules :mod:`cluster_network` and :mod:`simplify_network` solve a mixed-integer quadratic optimisation problem for clustering.
|
The rules :mod:`cluster_network` and :mod:`simplify_network` solve a mixed-integer quadratic optimisation problem for clustering.
|
||||||
The open-source solvers HiGHS, Cbc and GlPK cannot handle this. A fallback to SCIP is implemented in this case.
|
The open-source solvers HiGHS, Cbc and GlPK cannot handle this. A fallback to SCIP is implemented in this case, which is included in the standard environment specifications.
|
||||||
For an open-source solver setup install in your ``conda`` environment on OSX/Linux. To install the default solver Gurobi, run
|
For an open-source solver setup install in your ``conda`` environment on OSX/Linux. To install the default solver Gurobi, run
|
||||||
|
|
||||||
.. code:: bash
|
.. code:: bash
|
||||||
|
@ -21,8 +21,7 @@ Having downloaded the necessary data,
|
|||||||
With these and the externally extracted ENTSO-E online map topology
|
With these and the externally extracted ENTSO-E online map topology
|
||||||
(``data/entsoegridkit``), it can build a base PyPSA network with the following rules:
|
(``data/entsoegridkit``), it can build a base PyPSA network with the following rules:
|
||||||
|
|
||||||
- :mod:`base_network` builds and stores the base network with all buses, HVAC lines and HVDC links, while
|
- :mod:`base_network` builds and stores the base network with all buses, HVAC lines and HVDC links, and determines `Voronoi cells <https://en.wikipedia.org/wiki/Voronoi_diagram>`__ for all substations.
|
||||||
- :mod:`build_bus_regions` determines `Voronoi cells <https://en.wikipedia.org/wiki/Voronoi_diagram>`__ for all substations.
|
|
||||||
|
|
||||||
Then the process continues by calculating conventional power plant capacities, potentials, and per-unit availability time series for variable renewable energy carriers and hydro power plants with the following rules:
|
Then the process continues by calculating conventional power plant capacities, potentials, and per-unit availability time series for variable renewable energy carriers and hydro power plants with the following rules:
|
||||||
|
|
||||||
@ -34,13 +33,6 @@ Then the process continues by calculating conventional power plant capacities, p
|
|||||||
The central rule :mod:`add_electricity` then ties all the different data inputs
|
The central rule :mod:`add_electricity` then ties all the different data inputs
|
||||||
together into a detailed PyPSA network stored in ``networks/elec.nc``.
|
together into a detailed PyPSA network stored in ``networks/elec.nc``.
|
||||||
|
|
||||||
.. _busregions:
|
|
||||||
|
|
||||||
Rule ``build_bus_regions``
|
|
||||||
=============================
|
|
||||||
|
|
||||||
.. automodule:: build_bus_regions
|
|
||||||
|
|
||||||
.. _cutout:
|
.. _cutout:
|
||||||
|
|
||||||
Rule ``build_cutout``
|
Rule ``build_cutout``
|
||||||
|
@ -194,6 +194,10 @@ Upcoming Release
|
|||||||
|
|
||||||
* Bugfix: allow modelling sector-coupled landlocked regions. (Fixed handling of offshore wind.)
|
* Bugfix: allow modelling sector-coupled landlocked regions. (Fixed handling of offshore wind.)
|
||||||
|
|
||||||
|
* Bugfix: approximation of hydro power generation if Portugal or Spain are not included works now.
|
||||||
|
|
||||||
|
* Bugfix: copy_timeslice does not copy anymore, if country not present in load data.
|
||||||
|
|
||||||
* Adapt the disabling of transmission expansion in myopic foresight optimisations when limit is already reached to also handle cost limits.
|
* Adapt the disabling of transmission expansion in myopic foresight optimisations when limit is already reached to also handle cost limits.
|
||||||
|
|
||||||
* Fix duplicated years and grouping years reference in `add_land_use_constraint_m`.
|
* Fix duplicated years and grouping years reference in `add_land_use_constraint_m`.
|
||||||
@ -206,8 +210,15 @@ Upcoming Release
|
|||||||
|
|
||||||
* Fix custom busmap read in `cluster_network`.
|
* Fix custom busmap read in `cluster_network`.
|
||||||
|
|
||||||
|
* Data on existing renewable capacities is now consistently taken from powerplantmatching (instead of being retrieved separately); the dataset has also been updated to include 2023 values.
|
||||||
|
|
||||||
|
* Added shapes to .nc file for different stages of the network object in `base_network`, `simplify_network`, and `cluster_network`; the `build_bus_regions` rule is now integrated into the `base_network` rule.
|
||||||
|
|
||||||
|
* Fix p_nom_min of renewables generators for myopic approach and add check of existing capacities in `add_land_use_constraint_m`.
|
||||||
|
|
||||||
* Add documentation section for how to contribute documentation
|
* Add documentation section for how to contribute documentation
|
||||||
|
|
||||||
|
|
||||||
PyPSA-Eur 0.10.0 (19th February 2024)
|
PyPSA-Eur 0.10.0 (19th February 2024)
|
||||||
=====================================
|
=====================================
|
||||||
|
|
||||||
|
@ -92,11 +92,6 @@ This rule downloads techno-economic assumptions from the `technology-data reposi
|
|||||||
|
|
||||||
- ``resources/costs.csv``
|
- ``resources/costs.csv``
|
||||||
|
|
||||||
Rule ``retrieve_irena``
|
|
||||||
================================
|
|
||||||
|
|
||||||
.. automodule:: retrieve_irena
|
|
||||||
|
|
||||||
Rule ``retrieve_ship_raster``
|
Rule ``retrieve_ship_raster``
|
||||||
================================
|
================================
|
||||||
|
|
||||||
|
160
doc/tutorial.rst
160
doc/tutorial.rst
@ -132,89 +132,76 @@ This triggers a workflow of multiple preceding jobs that depend on each rule's i
|
|||||||
graph[bgcolor=white, margin=0];
|
graph[bgcolor=white, margin=0];
|
||||||
node[shape=box, style=rounded, fontname=sans, fontsize=10, penwidth=2];
|
node[shape=box, style=rounded, fontname=sans, fontsize=10, penwidth=2];
|
||||||
edge[penwidth=2, color=grey];
|
edge[penwidth=2, color=grey];
|
||||||
0[label = "solve_network", color = "0.39 0.6 0.85", style="rounded"];
|
0[label = "solve_network", color = "0.38 0.6 0.85", style="rounded"];
|
||||||
1[label = "prepare_network\nll: copt\nopts: Co2L-24H", color = "0.29 0.6 0.85", style="rounded"];
|
1[label = "prepare_network\nll: copt\nopts: Co2L-24H", color = "0.53 0.6 0.85", style="rounded"];
|
||||||
2[label = "add_extra_components", color = "0.28 0.6 0.85", style="rounded"];
|
2[label = "add_extra_components", color = "0.01 0.6 0.85", style="rounded"];
|
||||||
3[label = "cluster_network\nclusters: 6", color = "0.19 0.6 0.85", style="rounded"];
|
3[label = "cluster_network\nclusters: 6", color = "0.03 0.6 0.85", style="rounded"];
|
||||||
4[label = "simplify_network\nsimpl: ", color = "0.01 0.6 0.85", style="rounded"];
|
4[label = "simplify_network\nsimpl: ", color = "0.42 0.6 0.85", style="rounded"];
|
||||||
5[label = "add_electricity", color = "0.49 0.6 0.85", style="rounded"];
|
5[label = "add_electricity", color = "0.10 0.6 0.85", style="rounded"];
|
||||||
6[label = "build_renewable_profiles\ntechnology: solar", color = "0.21 0.6 0.85", style="rounded"];
|
6[label = "build_renewable_profiles\ntechnology: solar", color = "0.50 0.6 0.85", style="rounded"];
|
||||||
7[label = "base_network", color = "0.27 0.6 0.85", style="rounded"];
|
7[label = "base_network", color = "0.22 0.6 0.85", style="rounded"];
|
||||||
8[label = "build_shapes", color = "0.26 0.6 0.85", style="rounded"];
|
8[label = "build_shapes", color = "0.44 0.6 0.85", style="rounded"];
|
||||||
9[label = "retrieve_databundle", color = "0.59 0.6 0.85", style="rounded"];
|
9[label = "retrieve_databundle", color = "0.29 0.6 0.85", style="rounded"];
|
||||||
11[label = "build_bus_regions", color = "0.13 0.6 0.85", style="rounded"];
|
10[label = "retrieve_cutout\ncutout: be-03-2013-era5", color = "0.49 0.6 0.85", style="rounded"];
|
||||||
12[label = "retrieve_cutout\ncutout: be-03-2013-era5", color = "0.36 0.6 0.85", style="rounded,dashed"];
|
11[label = "build_renewable_profiles\ntechnology: onwind", color = "0.50 0.6 0.85", style="rounded"];
|
||||||
13[label = "build_renewable_profiles\ntechnology: onwind", color = "0.21 0.6 0.85", style="rounded"];
|
12[label = "build_renewable_profiles\ntechnology: offwind-ac", color = "0.50 0.6 0.85", style="rounded"];
|
||||||
14[label = "build_renewable_profiles\ntechnology: offwind-ac", color = "0.21 0.6 0.85", style="rounded"];
|
13[label = "build_ship_raster", color = "0.19 0.6 0.85", style="rounded"];
|
||||||
15[label = "build_ship_raster", color = "0.00 0.6 0.85", style="rounded"];
|
14[label = "retrieve_ship_raster", color = "0.35 0.6 0.85", style="rounded"];
|
||||||
16[label = "retrieve_ship_raster", color = "0.51 0.6 0.85", style="rounded,dashed"];
|
15[label = "build_renewable_profiles\ntechnology: offwind-dc", color = "0.50 0.6 0.85", style="rounded"];
|
||||||
17[label = "build_renewable_profiles\ntechnology: offwind-dc", color = "0.21 0.6 0.85", style="rounded"];
|
16[label = "build_line_rating", color = "0.60 0.6 0.85", style="rounded"];
|
||||||
18[label = "build_line_rating", color = "0.05 0.6 0.85", style="rounded"];
|
17[label = "retrieve_cost_data\nyear: 2030", color = "0.59 0.6 0.85", style="rounded"];
|
||||||
19[label = "retrieve_cost_data\nyear: 2030", color = "0.15 0.6 0.85", style="rounded"];
|
18[label = "build_powerplants", color = "0.06 0.6 0.85", style="rounded"];
|
||||||
20[label = "build_powerplants", color = "0.54 0.6 0.85", style="rounded"];
|
19[label = "build_electricity_demand", color = "0.13 0.6 0.85", style="rounded"];
|
||||||
21[label = "build_electricity_demand", color = "0.52 0.6 0.85", style="rounded"];
|
20[label = "retrieve_electricity_demand", color = "0.49 0.6 0.85", style="rounded"];
|
||||||
22[label = "retrieve_electricity_demand", color = "0.22 0.6 0.85", style="rounded"];
|
21[label = "retrieve_synthetic_electricity_demand", color = "0.41 0.6 0.85", style="rounded"];
|
||||||
23[label = "copy_config", color = "0.44 0.6 0.85", style="rounded"];
|
|
||||||
1 -> 0
|
1 -> 0
|
||||||
23 -> 0
|
|
||||||
2 -> 1
|
2 -> 1
|
||||||
19 -> 1
|
17 -> 1
|
||||||
3 -> 2
|
3 -> 2
|
||||||
19 -> 2
|
17 -> 2
|
||||||
4 -> 3
|
4 -> 3
|
||||||
19 -> 3
|
17 -> 3
|
||||||
5 -> 4
|
5 -> 4
|
||||||
19 -> 4
|
17 -> 4
|
||||||
11 -> 4
|
7 -> 4
|
||||||
6 -> 5
|
6 -> 5
|
||||||
13 -> 5
|
11 -> 5
|
||||||
14 -> 5
|
12 -> 5
|
||||||
17 -> 5
|
15 -> 5
|
||||||
7 -> 5
|
7 -> 5
|
||||||
|
16 -> 5
|
||||||
|
17 -> 5
|
||||||
18 -> 5
|
18 -> 5
|
||||||
19 -> 5
|
19 -> 5
|
||||||
11 -> 5
|
|
||||||
20 -> 5
|
|
||||||
9 -> 5
|
|
||||||
21 -> 5
|
|
||||||
8 -> 5
|
8 -> 5
|
||||||
7 -> 6
|
7 -> 6
|
||||||
9 -> 6
|
9 -> 6
|
||||||
10 -> 6
|
|
||||||
8 -> 6
|
8 -> 6
|
||||||
11 -> 6
|
10 -> 6
|
||||||
12 -> 6
|
|
||||||
8 -> 7
|
8 -> 7
|
||||||
9 -> 8
|
9 -> 8
|
||||||
8 -> 11
|
|
||||||
7 -> 11
|
7 -> 11
|
||||||
7 -> 13
|
9 -> 11
|
||||||
9 -> 13
|
8 -> 11
|
||||||
|
10 -> 11
|
||||||
|
7 -> 12
|
||||||
|
9 -> 12
|
||||||
|
13 -> 12
|
||||||
|
8 -> 12
|
||||||
|
10 -> 12
|
||||||
|
14 -> 13
|
||||||
10 -> 13
|
10 -> 13
|
||||||
8 -> 13
|
7 -> 15
|
||||||
11 -> 13
|
9 -> 15
|
||||||
12 -> 13
|
13 -> 15
|
||||||
7 -> 14
|
8 -> 15
|
||||||
9 -> 14
|
10 -> 15
|
||||||
10 -> 14
|
7 -> 16
|
||||||
15 -> 14
|
10 -> 16
|
||||||
8 -> 14
|
|
||||||
11 -> 14
|
|
||||||
12 -> 14
|
|
||||||
16 -> 15
|
|
||||||
12 -> 15
|
|
||||||
7 -> 17
|
|
||||||
9 -> 17
|
|
||||||
10 -> 17
|
|
||||||
15 -> 17
|
|
||||||
8 -> 17
|
|
||||||
11 -> 17
|
|
||||||
12 -> 17
|
|
||||||
7 -> 18
|
7 -> 18
|
||||||
12 -> 18
|
20 -> 19
|
||||||
7 -> 20
|
21 -> 19
|
||||||
22 -> 21
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
|
|
|
||||||
|
|
||||||
@ -224,27 +211,28 @@ In the terminal, this will show up as a list of jobs to be run:
|
|||||||
|
|
||||||
Building DAG of jobs...
|
Building DAG of jobs...
|
||||||
Job stats:
|
Job stats:
|
||||||
job count
|
job count
|
||||||
--------------------------- -------
|
------------------------------------- -------
|
||||||
add_electricity 1
|
add_electricity 1
|
||||||
add_extra_components 1
|
add_extra_components 1
|
||||||
base_network 1
|
base_network 1
|
||||||
build_bus_regions 1
|
build_electricity_demand 1
|
||||||
build_electricity_demand 1
|
build_line_rating 1
|
||||||
build_line_rating 1
|
build_powerplants 1
|
||||||
build_powerplants 1
|
build_renewable_profiles 4
|
||||||
build_renewable_profiles 4
|
build_shapes 1
|
||||||
build_shapes 1
|
build_ship_raster 1
|
||||||
build_ship_raster 1
|
cluster_network 1
|
||||||
cluster_network 1
|
prepare_network 1
|
||||||
copy_config 1
|
retrieve_cost_data 1
|
||||||
prepare_network 1
|
retrieve_cutout 1
|
||||||
retrieve_cost_data 1
|
retrieve_databundle 1
|
||||||
retrieve_databundle 1
|
retrieve_electricity_demand 1
|
||||||
retrieve_electricity_demand 1
|
retrieve_ship_raster 1
|
||||||
simplify_network 1
|
retrieve_synthetic_electricity_demand 1
|
||||||
solve_network 1
|
simplify_network 1
|
||||||
total 22
|
solve_network 1
|
||||||
|
total 22
|
||||||
|
|
||||||
|
|
||||||
``snakemake`` then runs these jobs in the correct order.
|
``snakemake`` then runs these jobs in the correct order.
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -7,440 +7,466 @@ channels:
|
|||||||
- bioconda
|
- bioconda
|
||||||
- http://conda.anaconda.org/gurobi
|
- http://conda.anaconda.org/gurobi
|
||||||
- conda-forge
|
- conda-forge
|
||||||
- defaults
|
|
||||||
dependencies:
|
dependencies:
|
||||||
- _libgcc_mutex=0.1
|
- _libgcc_mutex=0.1=conda_forge
|
||||||
- _openmp_mutex=4.5
|
- _openmp_mutex=4.5=2_gnu
|
||||||
- affine=2.4.0
|
- affine=2.4.0=pyhd8ed1ab_0
|
||||||
- alsa-lib=1.2.10
|
- alsa-lib=1.2.11=hd590300_1
|
||||||
- ampl-mp=3.1.0
|
- ampl-mp=3.1.0=h2cc385e_1006
|
||||||
- amply=0.1.6
|
- amply=0.1.6=pyhd8ed1ab_0
|
||||||
- appdirs=1.4.4
|
- appdirs=1.4.4=pyh9f0ad1d_0
|
||||||
- asttokens=2.4.1
|
- argparse-dataclass=2.0.0=pyhd8ed1ab_0
|
||||||
- atk-1.0=2.38.0
|
- asttokens=2.4.1=pyhd8ed1ab_0
|
||||||
- atlite=0.2.12
|
- atk-1.0=2.38.0=h04ea711_2
|
||||||
- attr=2.5.1
|
- atlite=0.2.12=pyhd8ed1ab_0
|
||||||
- attrs=23.2.0
|
- attr=2.5.1=h166bdaf_1
|
||||||
- aws-c-auth=0.7.15
|
- attrs=23.2.0=pyh71513ae_0
|
||||||
- aws-c-cal=0.6.9
|
- aws-c-auth=0.7.18=he0b1f16_0
|
||||||
- aws-c-common=0.9.12
|
- aws-c-cal=0.6.11=heb1d5e4_0
|
||||||
- aws-c-compression=0.2.17
|
- aws-c-common=0.9.15=hd590300_0
|
||||||
- aws-c-event-stream=0.4.1
|
- aws-c-compression=0.2.18=hce8ee76_3
|
||||||
- aws-c-http=0.8.0
|
- aws-c-event-stream=0.4.2=h01f5eca_8
|
||||||
- aws-c-io=0.14.3
|
- aws-c-http=0.8.1=hdb68c23_10
|
||||||
- aws-c-mqtt=0.10.1
|
- aws-c-io=0.14.7=hbfbeace_6
|
||||||
- aws-c-s3=0.5.0
|
- aws-c-mqtt=0.10.4=h50844eb_0
|
||||||
- aws-c-sdkutils=0.1.14
|
- aws-c-s3=0.5.7=h6be9164_2
|
||||||
- aws-checksums=0.1.17
|
- aws-c-sdkutils=0.1.15=hce8ee76_3
|
||||||
- aws-crt-cpp=0.26.1
|
- aws-checksums=0.1.18=hce8ee76_3
|
||||||
- aws-sdk-cpp=1.11.242
|
- aws-crt-cpp=0.26.8=h2150271_2
|
||||||
- azure-core-cpp=1.10.3
|
- aws-sdk-cpp=1.11.267=hddb5a97_7
|
||||||
- azure-storage-blobs-cpp=12.10.0
|
- azure-core-cpp=1.11.1=h91d86a7_1
|
||||||
- azure-storage-common-cpp=12.5.0
|
- azure-identity-cpp=1.6.0=hf1915f5_1
|
||||||
- beautifulsoup4=4.12.3
|
- azure-storage-blobs-cpp=12.10.0=h00ab1b0_1
|
||||||
- blosc=1.21.5
|
- azure-storage-common-cpp=12.5.0=h94269e2_4
|
||||||
- bokeh=3.3.4
|
- beautifulsoup4=4.12.3=pyha770c72_0
|
||||||
- bottleneck=1.3.7
|
- blosc=1.21.5=hc2324a3_1
|
||||||
- branca=0.7.1
|
- bokeh=3.4.1=pyhd8ed1ab_0
|
||||||
- brotli=1.1.0
|
- bottleneck=1.3.8=py311h1f0f07a_0
|
||||||
- brotli-bin=1.1.0
|
- branca=0.7.2=pyhd8ed1ab_0
|
||||||
- brotli-python=1.1.0
|
- brotli=1.1.0=hd590300_1
|
||||||
- bzip2=1.0.8
|
- brotli-bin=1.1.0=hd590300_1
|
||||||
- c-ares=1.26.0
|
- brotli-python=1.1.0=py311hb755f60_1
|
||||||
- c-blosc2=2.13.2
|
- bzip2=1.0.8=hd590300_5
|
||||||
- ca-certificates=2024.2.2
|
- c-ares=1.28.1=hd590300_0
|
||||||
- cairo=1.18.0
|
- c-blosc2=2.14.4=hb4ffafa_1
|
||||||
- cartopy=0.22.0
|
- ca-certificates=2024.2.2=hbcca054_0
|
||||||
- cdsapi=0.6.1
|
- cads-api-client=1.0.0=pyhd8ed1ab_0
|
||||||
- certifi=2024.2.2
|
- cairo=1.18.0=h3faef2a_0
|
||||||
- cffi=1.16.0
|
- cartopy=0.23.0=py311h320fe9a_0
|
||||||
- cfgv=3.3.1
|
- cdsapi=0.7.0=pyhd8ed1ab_0
|
||||||
- cfitsio=4.3.1
|
- certifi=2024.2.2=pyhd8ed1ab_0
|
||||||
- cftime=1.6.3
|
- cffi=1.16.0=py311hb3a22ac_0
|
||||||
- charset-normalizer=3.3.2
|
- cfgv=3.3.1=pyhd8ed1ab_0
|
||||||
- click=8.1.7
|
- cfitsio=4.4.0=hbdc6101_1
|
||||||
- click-plugins=1.1.1
|
- cftime=1.6.3=py311h1f0f07a_0
|
||||||
- cligj=0.7.2
|
- charset-normalizer=3.3.2=pyhd8ed1ab_0
|
||||||
- cloudpickle=3.0.0
|
- click=8.1.7=unix_pyh707e725_0
|
||||||
- coin-or-cbc=2.10.10
|
- click-plugins=1.1.1=py_0
|
||||||
- coin-or-cgl=0.60.7
|
- cligj=0.7.2=pyhd8ed1ab_1
|
||||||
- coin-or-clp=1.17.8
|
- cloudpickle=3.0.0=pyhd8ed1ab_0
|
||||||
- coin-or-osi=0.108.8
|
- coin-or-cbc=2.10.10=h9002f0b_0
|
||||||
- coin-or-utils=2.11.9
|
- coin-or-cgl=0.60.7=h516709c_0
|
||||||
- coincbc=2.10.10
|
- coin-or-clp=1.17.8=h1ee7a9c_0
|
||||||
- colorama=0.4.6
|
- coin-or-osi=0.108.10=haf5fa05_0
|
||||||
- configargparse=1.7
|
- coin-or-utils=2.11.11=hee58242_0
|
||||||
- connection_pool=0.0.3
|
- coincbc=2.10.10=0_metapackage
|
||||||
- contourpy=1.2.0
|
- colorama=0.4.6=pyhd8ed1ab_0
|
||||||
- country_converter=1.2
|
- conda-inject=1.3.1=pyhd8ed1ab_0
|
||||||
- cppad=20240000.2
|
- configargparse=1.7=pyhd8ed1ab_0
|
||||||
- cycler=0.12.1
|
- connection_pool=0.0.3=pyhd3deb0d_0
|
||||||
- cytoolz=0.12.3
|
- contourpy=1.2.1=py311h9547e67_0
|
||||||
- dask=2024.2.0
|
- country_converter=1.2=pyhd8ed1ab_0
|
||||||
- dask-core=2024.2.0
|
- cppad=20240000.4=h59595ed_0
|
||||||
- datrie=0.8.2
|
- cycler=0.12.1=pyhd8ed1ab_0
|
||||||
- dbus=1.13.6
|
- cytoolz=0.12.3=py311h459d7ec_0
|
||||||
- decorator=5.1.1
|
- dask=2024.4.2=pyhd8ed1ab_0
|
||||||
- deprecation=2.1.0
|
- dask-core=2024.4.2=pyhd8ed1ab_0
|
||||||
- descartes=1.1.0
|
- dask-expr=1.0.14=pyhd8ed1ab_0
|
||||||
- distlib=0.3.8
|
- datrie=0.8.2=py311h459d7ec_7
|
||||||
- distributed=2024.2.0
|
- dbus=1.13.6=h5008d03_3
|
||||||
- distro=1.9.0
|
- decorator=5.1.1=pyhd8ed1ab_0
|
||||||
- docutils=0.20.1
|
- deprecation=2.1.0=pyh9f0ad1d_0
|
||||||
- dpath=2.1.6
|
- descartes=1.1.0=py_4
|
||||||
- entsoe-py=0.6.6
|
- distlib=0.3.8=pyhd8ed1ab_0
|
||||||
- et_xmlfile=1.1.0
|
- distributed=2024.4.2=pyhd8ed1ab_0
|
||||||
- exceptiongroup=1.2.0
|
- distro=1.9.0=pyhd8ed1ab_0
|
||||||
- executing=2.0.1
|
- docutils=0.21.2=pyhd8ed1ab_0
|
||||||
- expat=2.5.0
|
- dpath=2.1.6=pyha770c72_0
|
||||||
- filelock=3.13.1
|
- entsoe-py=0.6.7=pyhd8ed1ab_0
|
||||||
- fiona=1.9.5
|
- et_xmlfile=1.1.0=pyhd8ed1ab_0
|
||||||
- folium=0.15.1
|
- exceptiongroup=1.2.0=pyhd8ed1ab_2
|
||||||
- font-ttf-dejavu-sans-mono=2.37
|
- executing=2.0.1=pyhd8ed1ab_0
|
||||||
- font-ttf-inconsolata=3.000
|
- expat=2.6.2=h59595ed_0
|
||||||
- font-ttf-source-code-pro=2.038
|
- filelock=3.14.0=pyhd8ed1ab_0
|
||||||
- font-ttf-ubuntu=0.83
|
- fiona=1.9.6=py311hf8e0aa6_0
|
||||||
- fontconfig=2.14.2
|
- fmt=10.2.1=h00ab1b0_0
|
||||||
- fonts-conda-ecosystem=1
|
- folium=0.16.0=pyhd8ed1ab_0
|
||||||
- fonts-conda-forge=1
|
- font-ttf-dejavu-sans-mono=2.37=hab24e00_0
|
||||||
- fonttools=4.49.0
|
- font-ttf-inconsolata=3.000=h77eed37_0
|
||||||
- freetype=2.12.1
|
- font-ttf-source-code-pro=2.038=h77eed37_0
|
||||||
- freexl=2.0.0
|
- font-ttf-ubuntu=0.83=h77eed37_2
|
||||||
- fribidi=1.0.10
|
- fontconfig=2.14.2=h14ed4e7_0
|
||||||
- fsspec=2024.2.0
|
- fonts-conda-ecosystem=1=0
|
||||||
- gdal=3.8.4
|
- fonts-conda-forge=1=0
|
||||||
- gdk-pixbuf=2.42.10
|
- fonttools=4.51.0=py311h459d7ec_0
|
||||||
- geographiclib=1.52
|
- freetype=2.12.1=h267a509_2
|
||||||
- geojson-rewind=1.1.0
|
- freexl=2.0.0=h743c826_0
|
||||||
- geopandas=0.14.3
|
- fribidi=1.0.10=h36c2ea0_0
|
||||||
- geopandas-base=0.14.3
|
- fsspec=2024.3.1=pyhca7485f_0
|
||||||
- geopy=2.4.1
|
- gdal=3.8.5=py311hd032c08_2
|
||||||
- geos=3.12.1
|
- gdk-pixbuf=2.42.11=hb9ae30d_0
|
||||||
- geotiff=1.7.1
|
- geographiclib=2.0=pyhd8ed1ab_0
|
||||||
- gettext=0.21.1
|
- geojson-rewind=1.1.0=pyhd8ed1ab_0
|
||||||
- gflags=2.2.2
|
- geopandas=0.14.4=pyhd8ed1ab_0
|
||||||
- giflib=5.2.1
|
- geopandas-base=0.14.4=pyha770c72_0
|
||||||
- gitdb=4.0.11
|
- geopy=2.4.1=pyhd8ed1ab_1
|
||||||
- gitpython=3.1.42
|
- geos=3.12.1=h59595ed_0
|
||||||
- glib=2.78.4
|
- geotiff=1.7.1=h6cf1f90_16
|
||||||
- glib-tools=2.78.4
|
- gettext=0.22.5=h59595ed_2
|
||||||
- glog=0.6.0
|
- gettext-tools=0.22.5=h59595ed_2
|
||||||
- glpk=5.0
|
- gflags=2.2.2=he1b5a44_1004
|
||||||
- gmp=6.3.0
|
- giflib=5.2.2=hd590300_0
|
||||||
- graphite2=1.3.13
|
- gitdb=4.0.11=pyhd8ed1ab_0
|
||||||
- graphviz=9.0.0
|
- gitpython=3.1.43=pyhd8ed1ab_0
|
||||||
- gst-plugins-base=1.22.9
|
- glib=2.80.0=hf2295e7_6
|
||||||
- gstreamer=1.22.9
|
- glib-tools=2.80.0=hde27a5a_6
|
||||||
- gtk2=2.24.33
|
- glog=0.7.0=hed5481d_0
|
||||||
- gts=0.7.6
|
- glpk=5.0=h445213a_0
|
||||||
- harfbuzz=8.3.0
|
- gmp=6.3.0=h59595ed_1
|
||||||
- hdf4=4.2.15
|
- graphite2=1.3.13=h59595ed_1003
|
||||||
- hdf5=1.14.3
|
- graphviz=9.0.0=h78e8752_1
|
||||||
- humanfriendly=10.0
|
- gst-plugins-base=1.24.1=hfa15dee_2
|
||||||
- icu=73.2
|
- gstreamer=1.24.1=h98fc4e7_2
|
||||||
- identify=2.5.35
|
- gtk2=2.24.33=h280cfa0_4
|
||||||
- idna=3.6
|
- gts=0.7.6=h977cf35_4
|
||||||
- importlib-metadata=7.0.1
|
- harfbuzz=8.4.0=h3d44ed6_0
|
||||||
- importlib_metadata=7.0.1
|
- hdf4=4.2.15=h2a13503_7
|
||||||
- importlib_resources=6.1.1
|
- hdf5=1.14.3=nompi_h4f84152_101
|
||||||
- iniconfig=2.0.0
|
- humanfriendly=10.0=pyhd8ed1ab_6
|
||||||
- ipopt=3.14.14
|
- icu=73.2=h59595ed_0
|
||||||
- ipython=8.21.0
|
- identify=2.5.36=pyhd8ed1ab_0
|
||||||
- jedi=0.19.1
|
- idna=3.7=pyhd8ed1ab_0
|
||||||
- jinja2=3.1.3
|
- immutables=0.20=py311h459d7ec_1
|
||||||
- joblib=1.3.2
|
- importlib-metadata=7.1.0=pyha770c72_0
|
||||||
- json-c=0.17
|
- importlib_metadata=7.1.0=hd8ed1ab_0
|
||||||
- jsonschema=4.21.1
|
- importlib_resources=6.4.0=pyhd8ed1ab_0
|
||||||
- jsonschema-specifications=2023.12.1
|
- iniconfig=2.0.0=pyhd8ed1ab_0
|
||||||
- jupyter_core=5.7.1
|
- ipopt=3.14.16=hf967516_0
|
||||||
- kealib=1.5.3
|
- ipython=8.22.2=pyh707e725_0
|
||||||
- keyutils=1.6.1
|
- jedi=0.19.1=pyhd8ed1ab_0
|
||||||
- kiwisolver=1.4.5
|
- jinja2=3.1.3=pyhd8ed1ab_0
|
||||||
- krb5=1.21.2
|
- joblib=1.4.2=pyhd8ed1ab_0
|
||||||
- lame=3.100
|
- json-c=0.17=h7ab15ed_0
|
||||||
- lcms2=2.16
|
- jsonschema=4.22.0=pyhd8ed1ab_0
|
||||||
- ld_impl_linux-64=2.40
|
- jsonschema-specifications=2023.12.1=pyhd8ed1ab_0
|
||||||
- lerc=4.0.0
|
- jupyter_core=5.7.2=py311h38be061_0
|
||||||
- libabseil=20230802.1
|
- kealib=1.5.3=h2f55d51_0
|
||||||
- libaec=1.1.2
|
- keyutils=1.6.1=h166bdaf_0
|
||||||
- libarchive=3.7.2
|
- kiwisolver=1.4.5=py311h9547e67_1
|
||||||
- libarrow=15.0.0
|
- krb5=1.21.2=h659d440_0
|
||||||
- libarrow-acero=15.0.0
|
- lame=3.100=h166bdaf_1003
|
||||||
- libarrow-dataset=15.0.0
|
- lcms2=2.16=hb7c19ff_0
|
||||||
- libarrow-flight=15.0.0
|
- ld_impl_linux-64=2.40=h55db66e_0
|
||||||
- libarrow-flight-sql=15.0.0
|
- lerc=4.0.0=h27087fc_0
|
||||||
- libarrow-gandiva=15.0.0
|
- libabseil=20240116.2=cxx17_h59595ed_0
|
||||||
- libarrow-substrait=15.0.0
|
- libaec=1.1.3=h59595ed_0
|
||||||
- libblas=3.9.0
|
- libarchive=3.7.2=h2aa1ff5_1
|
||||||
- libboost-headers=1.84.0
|
- libarrow=15.0.2=hefa796f_6_cpu
|
||||||
- libbrotlicommon=1.1.0
|
- libarrow-acero=15.0.2=hbabe93e_6_cpu
|
||||||
- libbrotlidec=1.1.0
|
- libarrow-dataset=15.0.2=hbabe93e_6_cpu
|
||||||
- libbrotlienc=1.1.0
|
- libarrow-flight=15.0.2=hc4f8a93_6_cpu
|
||||||
- libcap=2.69
|
- libarrow-flight-sql=15.0.2=he4f5ca8_6_cpu
|
||||||
- libcblas=3.9.0
|
- libarrow-gandiva=15.0.2=hc1954e9_6_cpu
|
||||||
- libclang=15.0.7
|
- libarrow-substrait=15.0.2=he4f5ca8_6_cpu
|
||||||
- libclang13=15.0.7
|
- libasprintf=0.22.5=h661eb56_2
|
||||||
- libcrc32c=1.1.2
|
- libasprintf-devel=0.22.5=h661eb56_2
|
||||||
- libcups=2.3.3
|
- libblas=3.9.0=22_linux64_openblas
|
||||||
- libcurl=8.5.0
|
- libboost-headers=1.84.0=ha770c72_2
|
||||||
- libdeflate=1.19
|
- libbrotlicommon=1.1.0=hd590300_1
|
||||||
- libedit=3.1.20191231
|
- libbrotlidec=1.1.0=hd590300_1
|
||||||
- libev=4.33
|
- libbrotlienc=1.1.0=hd590300_1
|
||||||
- libevent=2.1.12
|
- libcap=2.69=h0f662aa_0
|
||||||
- libexpat=2.5.0
|
- libcblas=3.9.0=22_linux64_openblas
|
||||||
- libffi=3.4.2
|
- libclang-cpp15=15.0.7=default_h127d8a8_5
|
||||||
- libflac=1.4.3
|
- libclang13=18.1.4=default_h5d6823c_0
|
||||||
- libgcc-ng=13.2.0
|
- libcrc32c=1.1.2=h9c3ff4c_0
|
||||||
- libgcrypt=1.10.3
|
- libcups=2.3.3=h4637d8d_4
|
||||||
- libgd=2.3.3
|
- libcurl=8.7.1=hca28451_0
|
||||||
- libgdal=3.8.4
|
- libdeflate=1.20=hd590300_0
|
||||||
- libgfortran-ng=13.2.0
|
- libedit=3.1.20191231=he28a2e2_2
|
||||||
- libgfortran5=13.2.0
|
- libev=4.33=hd590300_2
|
||||||
- libglib=2.78.4
|
- libevent=2.1.12=hf998b51_1
|
||||||
- libgomp=13.2.0
|
- libexpat=2.6.2=h59595ed_0
|
||||||
- libgoogle-cloud=2.12.0
|
- libffi=3.4.2=h7f98852_5
|
||||||
- libgpg-error=1.47
|
- libflac=1.4.3=h59595ed_0
|
||||||
- libgrpc=1.60.1
|
- libgcc-ng=13.2.0=h77fa898_6
|
||||||
- libhwloc=2.9.3
|
- libgcrypt=1.10.3=hd590300_0
|
||||||
- libiconv=1.17
|
- libgd=2.3.3=h119a65a_9
|
||||||
- libjpeg-turbo=3.0.0
|
- libgdal=3.8.5=hf9625ee_2
|
||||||
- libkml=1.3.0
|
- libgettextpo=0.22.5=h59595ed_2
|
||||||
- liblapack=3.9.0
|
- libgettextpo-devel=0.22.5=h59595ed_2
|
||||||
- liblapacke=3.9.0
|
- libgfortran-ng=13.2.0=h69a702a_6
|
||||||
- libllvm15=15.0.7
|
- libgfortran5=13.2.0=h43f5ff8_6
|
||||||
- libnetcdf=4.9.2
|
- libglib=2.80.0=hf2295e7_6
|
||||||
- libnghttp2=1.58.0
|
- libgomp=13.2.0=h77fa898_6
|
||||||
- libnl=3.9.0
|
- libgoogle-cloud=2.23.0=h9be4e54_1
|
||||||
- libnsl=2.0.1
|
- libgoogle-cloud-storage=2.23.0=hc7a4891_1
|
||||||
- libnuma=2.0.16
|
- libgpg-error=1.49=h4f305b6_0
|
||||||
- libogg=1.3.4
|
- libgrpc=1.62.2=h15f2491_0
|
||||||
- libopenblas=0.3.26
|
- libhwloc=2.9.3=default_h554bfaf_1009
|
||||||
- libopus=1.3.1
|
- libiconv=1.17=hd590300_2
|
||||||
- libparquet=15.0.0
|
- libjpeg-turbo=3.0.0=hd590300_1
|
||||||
- libpng=1.6.42
|
- libkml=1.3.0=h01aab08_1018
|
||||||
- libpq=16.2
|
- liblapack=3.9.0=22_linux64_openblas
|
||||||
- libprotobuf=4.25.1
|
- liblapacke=3.9.0=22_linux64_openblas
|
||||||
- libre2-11=2023.06.02
|
- libllvm15=15.0.7=hb3ce162_4
|
||||||
- librsvg=2.56.3
|
- libllvm16=16.0.6=hb3ce162_3
|
||||||
- librttopo=1.1.0
|
- libllvm18=18.1.4=h2448989_0
|
||||||
- libscotch=7.0.4
|
- libnetcdf=4.9.2=nompi_h9612171_113
|
||||||
- libsndfile=1.2.2
|
- libnghttp2=1.58.0=h47da74e_1
|
||||||
- libspatialindex=1.9.3
|
- libnl=3.9.0=hd590300_0
|
||||||
- libspatialite=5.1.0
|
- libnsl=2.0.1=hd590300_0
|
||||||
- libspral=2023.09.07
|
- libogg=1.3.4=h7f98852_1
|
||||||
- libsqlite=3.45.1
|
- libopenblas=0.3.27=pthreads_h413a1c8_0
|
||||||
- libssh2=1.11.0
|
- libopus=1.3.1=h7f98852_1
|
||||||
- libstdcxx-ng=13.2.0
|
- libparquet=15.0.2=hacf5a1f_6_cpu
|
||||||
- libsystemd0=255
|
- libpng=1.6.43=h2797004_0
|
||||||
- libthrift=0.19.0
|
- libpq=16.2=h33b98f1_1
|
||||||
- libtiff=4.6.0
|
- libprotobuf=4.25.3=h08a7969_0
|
||||||
- libutf8proc=2.8.0
|
- libre2-11=2023.09.01=h5a48ba9_2
|
||||||
- libuuid=2.38.1
|
- librsvg=2.58.0=hadf69e7_1
|
||||||
- libvorbis=1.3.7
|
- librttopo=1.1.0=h8917695_15
|
||||||
- libwebp=1.3.2
|
- libscotch=7.0.4=h91e35bf_1
|
||||||
- libwebp-base=1.3.2
|
- libsndfile=1.2.2=hc60ed4a_1
|
||||||
- libxcb=1.15
|
- libspatialindex=1.9.3=h9c3ff4c_4
|
||||||
- libxcrypt=4.4.36
|
- libspatialite=5.1.0=h6f065fc_5
|
||||||
- libxkbcommon=1.6.0
|
- libspral=2024.01.18=h6aa6db2_0
|
||||||
- libxml2=2.12.5
|
- libsqlite=3.45.3=h2797004_0
|
||||||
- libxslt=1.1.39
|
- libssh2=1.11.0=h0841786_0
|
||||||
- libzip=1.10.1
|
- libstdcxx-ng=13.2.0=hc0a3c3a_6
|
||||||
- libzlib=1.2.13
|
- libsystemd0=255=h3516f8a_1
|
||||||
- linopy=0.3.4
|
- libthrift=0.19.0=hb90f79a_1
|
||||||
- locket=1.0.0
|
- libtiff=4.6.0=h1dd3fc0_3
|
||||||
- lxml=5.1.0
|
- libutf8proc=2.8.0=h166bdaf_0
|
||||||
- lz4=4.3.3
|
- libuuid=2.38.1=h0b41bf4_0
|
||||||
- lz4-c=1.9.4
|
- libvorbis=1.3.7=h9c3ff4c_0
|
||||||
- lzo=2.10
|
- libwebp=1.4.0=h2c329e2_0
|
||||||
- mapclassify=2.6.1
|
- libwebp-base=1.4.0=hd590300_0
|
||||||
- markupsafe=2.1.5
|
- libxcb=1.15=h0b41bf4_0
|
||||||
- matplotlib=3.8.3
|
- libxcrypt=4.4.36=hd590300_1
|
||||||
- matplotlib-base=3.8.3
|
- libxkbcommon=1.7.0=h662e7e4_0
|
||||||
- matplotlib-inline=0.1.6
|
- libxml2=2.12.6=h232c23b_2
|
||||||
- memory_profiler=0.61.0
|
- libxslt=1.1.39=h76b75d6_0
|
||||||
- metis=5.1.0
|
- libzip=1.10.1=h2629f0a_3
|
||||||
- minizip=4.0.4
|
- libzlib=1.2.13=hd590300_5
|
||||||
- mpg123=1.32.4
|
- linopy=0.3.8=pyhd8ed1ab_0
|
||||||
- msgpack-python=1.0.7
|
- locket=1.0.0=pyhd8ed1ab_0
|
||||||
- mumps-include=5.6.2
|
- lxml=5.2.1=py311hc0a218f_0
|
||||||
- mumps-seq=5.6.2
|
- lz4=4.3.3=py311h38e4bf4_0
|
||||||
- munkres=1.1.4
|
- lz4-c=1.9.4=hcb278e6_0
|
||||||
- mysql-common=8.0.33
|
- lzo=2.10=hd590300_1001
|
||||||
- mysql-libs=8.0.33
|
- mapclassify=2.6.1=pyhd8ed1ab_0
|
||||||
- nbformat=5.9.2
|
- markupsafe=2.1.5=py311h459d7ec_0
|
||||||
- ncurses=6.4
|
- matplotlib=3.8.4=py311h38be061_0
|
||||||
- netcdf4=1.6.5
|
- matplotlib-base=3.8.4=py311h54ef318_0
|
||||||
- networkx=3.2.1
|
- matplotlib-inline=0.1.7=pyhd8ed1ab_0
|
||||||
- nodeenv=1.8.0
|
- memory_profiler=0.61.0=pyhd8ed1ab_0
|
||||||
- nomkl=1.0
|
- metis=5.1.0=h59595ed_1007
|
||||||
- nspr=4.35
|
- minizip=4.0.5=h0ab5242_0
|
||||||
- nss=3.98
|
- mpfr=4.2.1=h9458935_1
|
||||||
- numexpr=2.9.0
|
- mpg123=1.32.6=h59595ed_0
|
||||||
- numpy=1.26.4
|
- msgpack-python=1.0.7=py311h9547e67_0
|
||||||
- openjdk=21.0.2
|
- multiurl=0.3.1=pyhd8ed1ab_0
|
||||||
- openjpeg=2.5.0
|
- mumps-include=5.6.2=ha770c72_4
|
||||||
- openpyxl=3.1.2
|
- mumps-seq=5.6.2=hfef103a_4
|
||||||
- openssl=3.2.1
|
- munkres=1.1.4=pyh9f0ad1d_0
|
||||||
- orc=1.9.2
|
- mysql-common=8.3.0=hf1915f5_4
|
||||||
- packaging=23.2
|
- mysql-libs=8.3.0=hca2cd23_4
|
||||||
- pandas=2.2.0
|
- nbformat=5.10.4=pyhd8ed1ab_0
|
||||||
- pango=1.50.14
|
- ncurses=6.4.20240210=h59595ed_0
|
||||||
- parso=0.8.3
|
- netcdf4=1.6.5=nompi_py311he8ad708_100
|
||||||
- partd=1.4.1
|
- networkx=3.3=pyhd8ed1ab_1
|
||||||
- patsy=0.5.6
|
- nodeenv=1.8.0=pyhd8ed1ab_0
|
||||||
- pcre2=10.42
|
- nomkl=1.0=h5ca1d4c_0
|
||||||
- pexpect=4.9.0
|
- nspr=4.35=h27087fc_0
|
||||||
- pickleshare=0.7.5
|
- nss=3.98=h1d7d5a4_0
|
||||||
- pillow=10.2.0
|
- numexpr=2.9.0=py311h039bad6_100
|
||||||
- pip=24.0
|
- numpy=1.26.4=py311h64a7726_0
|
||||||
- pixman=0.43.2
|
- openjdk=22.0.1=hb622114_0
|
||||||
- pkgutil-resolve-name=1.3.10
|
- openjpeg=2.5.2=h488ebb8_0
|
||||||
- plac=1.4.2
|
- openpyxl=3.1.2=py311h459d7ec_1
|
||||||
- platformdirs=4.2.0
|
- openssl=3.3.0=hd590300_0
|
||||||
- pluggy=1.4.0
|
- orc=2.0.0=h17fec99_1
|
||||||
- ply=3.11
|
- packaging=24.0=pyhd8ed1ab_0
|
||||||
- poppler=24.02.0
|
- pandas=2.2.2=py311h320fe9a_0
|
||||||
- poppler-data=0.4.12
|
- pango=1.52.2=ha41ecd1_0
|
||||||
- postgresql=16.2
|
- parso=0.8.4=pyhd8ed1ab_0
|
||||||
- powerplantmatching=0.5.11
|
- partd=1.4.1=pyhd8ed1ab_0
|
||||||
- pre-commit=3.6.2
|
- patsy=0.5.6=pyhd8ed1ab_0
|
||||||
- progressbar2=4.3.2
|
- pcre2=10.43=hcad00b1_0
|
||||||
- proj=9.3.1
|
- pexpect=4.9.0=pyhd8ed1ab_0
|
||||||
- prompt-toolkit=3.0.42
|
- pickleshare=0.7.5=py_1003
|
||||||
- psutil=5.9.8
|
- pillow=10.3.0=py311h18e6fac_0
|
||||||
- pthread-stubs=0.4
|
- pip=24.0=pyhd8ed1ab_0
|
||||||
- ptyprocess=0.7.0
|
- pixman=0.43.2=h59595ed_0
|
||||||
- pulp=2.7.0
|
- pkgutil-resolve-name=1.3.10=pyhd8ed1ab_1
|
||||||
- pulseaudio-client=16.1
|
- plac=1.4.3=pyhd8ed1ab_0
|
||||||
- pure_eval=0.2.2
|
- platformdirs=4.2.1=pyhd8ed1ab_0
|
||||||
- py-cpuinfo=9.0.0
|
- pluggy=1.5.0=pyhd8ed1ab_0
|
||||||
- pyarrow=15.0.0
|
- ply=3.11=pyhd8ed1ab_2
|
||||||
- pyarrow-hotfix=0.6
|
- poppler=24.04.0=hb6cd0d7_0
|
||||||
- pycountry=22.3.5
|
- poppler-data=0.4.12=hd8ed1ab_0
|
||||||
- pycparser=2.21
|
- postgresql=16.2=h82ecc9d_1
|
||||||
- pygments=2.17.2
|
- powerplantmatching=0.5.14=pyhd8ed1ab_0
|
||||||
- pyomo=6.6.1
|
- pre-commit=3.7.0=pyha770c72_0
|
||||||
- pyparsing=3.1.1
|
- progressbar2=4.4.2=pyhd8ed1ab_0
|
||||||
- pyproj=3.6.1
|
- proj=9.4.0=h1d62c97_1
|
||||||
- pypsa=0.27.0
|
- prompt-toolkit=3.0.42=pyha770c72_0
|
||||||
- pyqt=5.15.9
|
- psutil=5.9.8=py311h459d7ec_0
|
||||||
- pyqt5-sip=12.12.2
|
- pthread-stubs=0.4=h36c2ea0_1001
|
||||||
- pyscipopt=4.4.0
|
- ptyprocess=0.7.0=pyhd3deb0d_0
|
||||||
- pyshp=2.3.1
|
- pulp=2.8.0=py311h38be061_0
|
||||||
- pysocks=1.7.1
|
- pulseaudio-client=17.0=hb77b528_0
|
||||||
- pytables=3.9.2
|
- pure_eval=0.2.2=pyhd8ed1ab_0
|
||||||
- pytest=8.0.0
|
- py-cpuinfo=9.0.0=pyhd8ed1ab_0
|
||||||
- python=3.11.8
|
- pyarrow=15.0.2=py311hd5e4297_6_cpu
|
||||||
- python-dateutil=2.8.2
|
- pyarrow-hotfix=0.6=pyhd8ed1ab_0
|
||||||
- python-fastjsonschema=2.19.1
|
- pycountry=22.3.5=pyhd8ed1ab_0
|
||||||
- python-tzdata=2024.1
|
- pycparser=2.22=pyhd8ed1ab_0
|
||||||
- python-utils=3.8.2
|
- pygments=2.17.2=pyhd8ed1ab_0
|
||||||
- python_abi=3.11
|
- pyomo=6.6.1=py311hb755f60_0
|
||||||
- pytz=2024.1
|
- pyparsing=3.1.2=pyhd8ed1ab_0
|
||||||
- pyxlsb=1.0.10
|
- pyproj=3.6.1=py311hb3a3e68_6
|
||||||
- pyyaml=6.0.1
|
- pypsa=0.27.1=pyhd8ed1ab_0
|
||||||
- qt-main=5.15.8
|
- pyqt=5.15.9=py311hf0fb5b6_5
|
||||||
- rasterio=1.3.9
|
- pyqt5-sip=12.12.2=py311hb755f60_5
|
||||||
- rdma-core=50.0
|
- pyscipopt=5.0.1=py311hb755f60_0
|
||||||
- re2=2023.06.02
|
- pyshp=2.3.1=pyhd8ed1ab_0
|
||||||
- readline=8.2
|
- pysocks=1.7.1=pyha2e5f31_6
|
||||||
- referencing=0.33.0
|
- pytables=3.9.2=py311h3e8b7c9_2
|
||||||
- requests=2.31.0
|
- pytest=8.2.0=pyhd8ed1ab_0
|
||||||
- reretry=0.11.8
|
- python=3.11.9=hb806964_0_cpython
|
||||||
- rioxarray=0.15.1
|
- python-dateutil=2.9.0=pyhd8ed1ab_0
|
||||||
- rpds-py=0.18.0
|
- python-fastjsonschema=2.19.1=pyhd8ed1ab_0
|
||||||
- rtree=1.2.0
|
- python-tzdata=2024.1=pyhd8ed1ab_0
|
||||||
- s2n=1.4.3
|
- python-utils=3.8.2=pyhd8ed1ab_0
|
||||||
- scikit-learn=1.4.1.post1
|
- python_abi=3.11=4_cp311
|
||||||
- scip=8.1.0
|
- pytz=2024.1=pyhd8ed1ab_0
|
||||||
- scipy=1.12.0
|
- pyxlsb=1.0.10=pyhd8ed1ab_0
|
||||||
- scotch=7.0.4
|
- pyyaml=6.0.1=py311h459d7ec_1
|
||||||
- seaborn=0.13.2
|
- qt-main=5.15.8=hc9dc06e_21
|
||||||
- seaborn-base=0.13.2
|
- rasterio=1.3.10=py311h375a7ea_0
|
||||||
- setuptools=69.1.0
|
- rdma-core=51.0=hd3aeb46_0
|
||||||
- setuptools-scm=8.0.4
|
- re2=2023.09.01=h7f4b329_2
|
||||||
- setuptools_scm=8.0.4
|
- readline=8.2=h8228510_1
|
||||||
- shapely=2.0.2
|
- referencing=0.35.1=pyhd8ed1ab_0
|
||||||
- sip=6.7.12
|
- requests=2.31.0=pyhd8ed1ab_0
|
||||||
- six=1.16.0
|
- reretry=0.11.8=pyhd8ed1ab_0
|
||||||
- smart_open=6.4.0
|
- rioxarray=0.15.5=pyhd8ed1ab_0
|
||||||
- smmap=5.0.0
|
- rpds-py=0.18.0=py311h46250e7_0
|
||||||
- snakemake-minimal=7.32.4
|
- rtree=1.2.0=py311h3bb2b0f_0
|
||||||
- snappy=1.1.10
|
- s2n=1.4.12=h06160fa_0
|
||||||
- snuggs=1.4.7
|
- scikit-learn=1.4.2=py311hc009520_0
|
||||||
- sortedcontainers=2.4.0
|
- scip=9.0.0=hded5f35_4
|
||||||
- soupsieve=2.5
|
- scipy=1.13.0=py311h64a7726_0
|
||||||
- sqlite=3.45.1
|
- scotch=7.0.4=h23d43cc_1
|
||||||
- stack_data=0.6.2
|
- seaborn=0.13.2=hd8ed1ab_2
|
||||||
- statsmodels=0.14.1
|
- seaborn-base=0.13.2=pyhd8ed1ab_2
|
||||||
- stopit=1.1.2
|
- setuptools=69.5.1=pyhd8ed1ab_0
|
||||||
- tabula-py=2.7.0
|
- setuptools-scm=8.0.4=pyhd8ed1ab_1
|
||||||
- tabulate=0.9.0
|
- setuptools_scm=8.0.4=hd8ed1ab_1
|
||||||
- tbb=2021.11.0
|
- shapely=2.0.4=py311h2032efe_0
|
||||||
- tblib=3.0.0
|
- sip=6.7.12=py311hb755f60_0
|
||||||
- threadpoolctl=3.3.0
|
- six=1.16.0=pyh6c4a22f_0
|
||||||
- throttler=1.2.2
|
- smart_open=7.0.4=pyhd8ed1ab_0
|
||||||
- tiledb=2.20.0
|
- smmap=5.0.0=pyhd8ed1ab_0
|
||||||
- tk=8.6.13
|
- snakemake-interface-common=1.17.2=pyhdfd78af_0
|
||||||
- toml=0.10.2
|
- snakemake-interface-executor-plugins=9.1.1=pyhdfd78af_0
|
||||||
- tomli=2.0.1
|
- snakemake-interface-report-plugins=1.0.0=pyhdfd78af_0
|
||||||
- toolz=0.12.1
|
- snakemake-interface-storage-plugins=3.2.2=pyhdfd78af_0
|
||||||
- toposort=1.10
|
- snakemake-minimal=8.11.1=pyhdfd78af_0
|
||||||
- tornado=6.3.3
|
- snappy=1.2.0=hdb0a2a9_1
|
||||||
- tqdm=4.66.2
|
- snuggs=1.4.7=py_0
|
||||||
- traitlets=5.14.1
|
- sortedcontainers=2.4.0=pyhd8ed1ab_0
|
||||||
- typing-extensions=4.9.0
|
- soupsieve=2.5=pyhd8ed1ab_1
|
||||||
- typing_extensions=4.9.0
|
- spdlog=1.13.0=hd2e6256_0
|
||||||
- tzcode=2024a
|
- sqlite=3.45.3=h2c6b66d_0
|
||||||
- tzdata=2024a
|
- stack_data=0.6.2=pyhd8ed1ab_0
|
||||||
- ucx=1.15.0
|
- statsmodels=0.14.1=py311h1f0f07a_0
|
||||||
- ukkonen=1.0.1
|
- stopit=1.1.2=py_0
|
||||||
- unidecode=1.3.8
|
- tabula-py=2.7.0=py311h38be061_1
|
||||||
- unixodbc=2.3.12
|
- tabulate=0.9.0=pyhd8ed1ab_1
|
||||||
- uriparser=0.9.7
|
- tbb=2021.11.0=h00ab1b0_1
|
||||||
- urllib3=2.2.1
|
- tblib=3.0.0=pyhd8ed1ab_0
|
||||||
- validators=0.22.0
|
- threadpoolctl=3.5.0=pyhc1e730c_0
|
||||||
- virtualenv=20.25.0
|
- throttler=1.2.2=pyhd8ed1ab_0
|
||||||
- wcwidth=0.2.13
|
- tiledb=2.22.0=h27f064a_3
|
||||||
- wheel=0.42.0
|
- tk=8.6.13=noxft_h4845f30_101
|
||||||
- wrapt=1.16.0
|
- toml=0.10.2=pyhd8ed1ab_0
|
||||||
- xarray=2024.2.0
|
- tomli=2.0.1=pyhd8ed1ab_0
|
||||||
- xcb-util=0.4.0
|
- toolz=0.12.1=pyhd8ed1ab_0
|
||||||
- xcb-util-image=0.4.0
|
- toposort=1.10=pyhd8ed1ab_0
|
||||||
- xcb-util-keysyms=0.4.0
|
- tornado=6.4=py311h459d7ec_0
|
||||||
- xcb-util-renderutil=0.3.9
|
- tqdm=4.66.2=pyhd8ed1ab_0
|
||||||
- xcb-util-wm=0.4.1
|
- traitlets=5.14.3=pyhd8ed1ab_0
|
||||||
- xerces-c=3.2.5
|
- typing-extensions=4.11.0=hd8ed1ab_0
|
||||||
- xkeyboard-config=2.41
|
- typing_extensions=4.11.0=pyha770c72_0
|
||||||
- xlrd=2.0.1
|
- tzcode=2024a=h3f72095_0
|
||||||
- xorg-fixesproto=5.0
|
- tzdata=2024a=h0c530f3_0
|
||||||
- xorg-inputproto=2.3.2
|
- ucx=1.15.0=ha691c75_8
|
||||||
- xorg-kbproto=1.0.7
|
- ukkonen=1.0.1=py311h9547e67_4
|
||||||
- xorg-libice=1.1.1
|
- unidecode=1.3.8=pyhd8ed1ab_0
|
||||||
- xorg-libsm=1.2.4
|
- unixodbc=2.3.12=h661eb56_0
|
||||||
- xorg-libx11=1.8.7
|
- uriparser=0.9.7=h59595ed_1
|
||||||
- xorg-libxau=1.0.11
|
- urllib3=2.2.1=pyhd8ed1ab_0
|
||||||
- xorg-libxdmcp=1.1.3
|
- validators=0.28.1=pyhd8ed1ab_0
|
||||||
- xorg-libxext=1.3.4
|
- virtualenv=20.26.1=pyhd8ed1ab_0
|
||||||
- xorg-libxfixes=5.0.3
|
- wcwidth=0.2.13=pyhd8ed1ab_0
|
||||||
- xorg-libxi=1.7.10
|
- wheel=0.43.0=pyhd8ed1ab_1
|
||||||
- xorg-libxrender=0.9.11
|
- wrapt=1.16.0=py311h459d7ec_0
|
||||||
- xorg-libxt=1.3.0
|
- xarray=2024.3.0=pyhd8ed1ab_0
|
||||||
- xorg-libxtst=1.2.3
|
- xcb-util=0.4.0=hd590300_1
|
||||||
- xorg-recordproto=1.14.2
|
- xcb-util-image=0.4.0=h8ee46fc_1
|
||||||
- xorg-renderproto=0.11.1
|
- xcb-util-keysyms=0.4.0=h8ee46fc_1
|
||||||
- xorg-xextproto=7.3.0
|
- xcb-util-renderutil=0.3.9=hd590300_1
|
||||||
- xorg-xf86vidmodeproto=2.3.1
|
- xcb-util-wm=0.4.1=h8ee46fc_1
|
||||||
- xorg-xproto=7.0.31
|
- xerces-c=3.2.5=hac6953d_0
|
||||||
- xyzservices=2023.10.1
|
- xkeyboard-config=2.41=hd590300_0
|
||||||
- xz=5.2.6
|
- xlrd=2.0.1=pyhd8ed1ab_3
|
||||||
- yaml=0.2.5
|
- xorg-fixesproto=5.0=h7f98852_1002
|
||||||
- yte=1.5.4
|
- xorg-inputproto=2.3.2=h7f98852_1002
|
||||||
- zict=3.0.0
|
- xorg-kbproto=1.0.7=h7f98852_1002
|
||||||
- zipp=3.17.0
|
- xorg-libice=1.1.1=hd590300_0
|
||||||
- zlib=1.2.13
|
- xorg-libsm=1.2.4=h7391055_0
|
||||||
- zlib-ng=2.0.7
|
- xorg-libx11=1.8.9=h8ee46fc_0
|
||||||
- zstd=1.5.5
|
- xorg-libxau=1.0.11=hd590300_0
|
||||||
|
- xorg-libxdmcp=1.1.3=h7f98852_0
|
||||||
|
- xorg-libxext=1.3.4=h0b41bf4_2
|
||||||
|
- xorg-libxfixes=5.0.3=h7f98852_1004
|
||||||
|
- xorg-libxi=1.7.10=h7f98852_0
|
||||||
|
- xorg-libxrender=0.9.11=hd590300_0
|
||||||
|
- xorg-libxt=1.3.0=hd590300_1
|
||||||
|
- xorg-libxtst=1.2.3=h7f98852_1002
|
||||||
|
- xorg-recordproto=1.14.2=h7f98852_1002
|
||||||
|
- xorg-renderproto=0.11.1=h7f98852_1002
|
||||||
|
- xorg-xextproto=7.3.0=h0b41bf4_1003
|
||||||
|
- xorg-xf86vidmodeproto=2.3.1=h7f98852_1002
|
||||||
|
- xorg-xproto=7.0.31=h7f98852_1007
|
||||||
|
- xyzservices=2024.4.0=pyhd8ed1ab_0
|
||||||
|
- xz=5.2.6=h166bdaf_0
|
||||||
|
- yaml=0.2.5=h7f98852_2
|
||||||
|
- yte=1.5.4=pyha770c72_0
|
||||||
|
- zict=3.0.0=pyhd8ed1ab_0
|
||||||
|
- zipp=3.17.0=pyhd8ed1ab_0
|
||||||
|
- zlib=1.2.13=hd590300_5
|
||||||
|
- zlib-ng=2.0.7=h0b41bf4_0
|
||||||
|
- zstd=1.5.5=hfc55251_0
|
||||||
- pip:
|
- pip:
|
||||||
- highspy==1.5.3
|
- highspy==1.5.3
|
||||||
|
- oauthlib==3.2.2
|
||||||
|
- requests-oauthlib==1.3.1
|
||||||
|
- snakemake-executor-plugin-cluster-generic==1.0.9
|
||||||
|
- snakemake-executor-plugin-slurm==0.4.5
|
||||||
|
- snakemake-executor-plugin-slurm-jobstep==0.2.1
|
||||||
|
- snakemake-storage-plugin-http==0.2.3
|
||||||
- tsam==2.3.1
|
- tsam==2.3.1
|
||||||
|
@ -20,12 +20,12 @@ dependencies:
|
|||||||
- openpyxl!=3.1.1
|
- openpyxl!=3.1.1
|
||||||
- pycountry
|
- pycountry
|
||||||
- seaborn
|
- seaborn
|
||||||
- snakemake-minimal>=8.5
|
- snakemake-minimal>=8.11
|
||||||
- memory_profiler
|
- memory_profiler
|
||||||
- yaml
|
- yaml
|
||||||
- pytables
|
- pytables
|
||||||
- lxml
|
- lxml
|
||||||
- powerplantmatching>=0.5.5,!=0.5.9
|
- powerplantmatching>=0.5.13
|
||||||
- numpy
|
- numpy
|
||||||
- pandas>=2.1
|
- pandas>=2.1
|
||||||
- geopandas>=0.11.0
|
- geopandas>=0.11.0
|
||||||
|
Binary file not shown.
Before Width: | Height: | Size: 664 KiB |
@ -86,7 +86,9 @@ rule base_network:
|
|||||||
offshore_shapes=resources("offshore_shapes.geojson"),
|
offshore_shapes=resources("offshore_shapes.geojson"),
|
||||||
europe_shape=resources("europe_shape.geojson"),
|
europe_shape=resources("europe_shape.geojson"),
|
||||||
output:
|
output:
|
||||||
resources("networks/base.nc"),
|
base_network=resources("networks/base.nc"),
|
||||||
|
regions_onshore=resources("regions_onshore.geojson"),
|
||||||
|
regions_offshore=resources("regions_offshore.geojson"),
|
||||||
log:
|
log:
|
||||||
logs("base_network.log"),
|
logs("base_network.log"),
|
||||||
benchmark:
|
benchmark:
|
||||||
@ -127,27 +129,6 @@ rule build_shapes:
|
|||||||
"../scripts/build_shapes.py"
|
"../scripts/build_shapes.py"
|
||||||
|
|
||||||
|
|
||||||
rule build_bus_regions:
|
|
||||||
params:
|
|
||||||
countries=config_provider("countries"),
|
|
||||||
input:
|
|
||||||
country_shapes=resources("country_shapes.geojson"),
|
|
||||||
offshore_shapes=resources("offshore_shapes.geojson"),
|
|
||||||
base_network=resources("networks/base.nc"),
|
|
||||||
output:
|
|
||||||
regions_onshore=resources("regions_onshore.geojson"),
|
|
||||||
regions_offshore=resources("regions_offshore.geojson"),
|
|
||||||
log:
|
|
||||||
logs("build_bus_regions.log"),
|
|
||||||
threads: 1
|
|
||||||
resources:
|
|
||||||
mem_mb=1000,
|
|
||||||
conda:
|
|
||||||
"../envs/environment.yaml"
|
|
||||||
script:
|
|
||||||
"../scripts/build_bus_regions.py"
|
|
||||||
|
|
||||||
|
|
||||||
if config["enable"].get("build_cutout", False):
|
if config["enable"].get("build_cutout", False):
|
||||||
|
|
||||||
rule build_cutout:
|
rule build_cutout:
|
||||||
@ -412,7 +393,7 @@ rule add_electricity:
|
|||||||
else resources("networks/base.nc")
|
else resources("networks/base.nc")
|
||||||
),
|
),
|
||||||
tech_costs=lambda w: resources(
|
tech_costs=lambda w: resources(
|
||||||
f"costs_{config_provider('costs', 'year')(w)}.csv"
|
f"costs_{config_provider('costs', 'year') (w)}.csv"
|
||||||
),
|
),
|
||||||
regions=resources("regions_onshore.geojson"),
|
regions=resources("regions_onshore.geojson"),
|
||||||
powerplants=resources("powerplants.csv"),
|
powerplants=resources("powerplants.csv"),
|
||||||
@ -457,7 +438,7 @@ rule simplify_network:
|
|||||||
input:
|
input:
|
||||||
network=resources("networks/elec.nc"),
|
network=resources("networks/elec.nc"),
|
||||||
tech_costs=lambda w: resources(
|
tech_costs=lambda w: resources(
|
||||||
f"costs_{config_provider('costs', 'year')(w)}.csv"
|
f"costs_{config_provider('costs', 'year') (w)}.csv"
|
||||||
),
|
),
|
||||||
regions_onshore=resources("regions_onshore.geojson"),
|
regions_onshore=resources("regions_onshore.geojson"),
|
||||||
regions_offshore=resources("regions_offshore.geojson"),
|
regions_offshore=resources("regions_offshore.geojson"),
|
||||||
@ -466,7 +447,6 @@ rule simplify_network:
|
|||||||
regions_onshore=resources("regions_onshore_elec_s{simpl}.geojson"),
|
regions_onshore=resources("regions_onshore_elec_s{simpl}.geojson"),
|
||||||
regions_offshore=resources("regions_offshore_elec_s{simpl}.geojson"),
|
regions_offshore=resources("regions_offshore_elec_s{simpl}.geojson"),
|
||||||
busmap=resources("busmap_elec_s{simpl}.csv"),
|
busmap=resources("busmap_elec_s{simpl}.csv"),
|
||||||
connection_costs=resources("connection_costs_s{simpl}.csv"),
|
|
||||||
log:
|
log:
|
||||||
logs("simplify_network/elec_s{simpl}.log"),
|
logs("simplify_network/elec_s{simpl}.log"),
|
||||||
benchmark:
|
benchmark:
|
||||||
@ -506,7 +486,7 @@ rule cluster_network:
|
|||||||
else []
|
else []
|
||||||
),
|
),
|
||||||
tech_costs=lambda w: resources(
|
tech_costs=lambda w: resources(
|
||||||
f"costs_{config_provider('costs', 'year')(w)}.csv"
|
f"costs_{config_provider('costs', 'year') (w)}.csv"
|
||||||
),
|
),
|
||||||
output:
|
output:
|
||||||
network=resources("networks/elec_s{simpl}_{clusters}.nc"),
|
network=resources("networks/elec_s{simpl}_{clusters}.nc"),
|
||||||
@ -535,7 +515,7 @@ rule add_extra_components:
|
|||||||
input:
|
input:
|
||||||
network=resources("networks/elec_s{simpl}_{clusters}.nc"),
|
network=resources("networks/elec_s{simpl}_{clusters}.nc"),
|
||||||
tech_costs=lambda w: resources(
|
tech_costs=lambda w: resources(
|
||||||
f"costs_{config_provider('costs', 'year')(w)}.csv"
|
f"costs_{config_provider('costs', 'year') (w)}.csv"
|
||||||
),
|
),
|
||||||
output:
|
output:
|
||||||
resources("networks/elec_s{simpl}_{clusters}_ec.nc"),
|
resources("networks/elec_s{simpl}_{clusters}_ec.nc"),
|
||||||
@ -570,7 +550,7 @@ rule prepare_network:
|
|||||||
input:
|
input:
|
||||||
resources("networks/elec_s{simpl}_{clusters}_ec.nc"),
|
resources("networks/elec_s{simpl}_{clusters}_ec.nc"),
|
||||||
tech_costs=lambda w: resources(
|
tech_costs=lambda w: resources(
|
||||||
f"costs_{config_provider('costs', 'year')(w)}.csv"
|
f"costs_{config_provider('costs', 'year') (w)}.csv"
|
||||||
),
|
),
|
||||||
co2_price=lambda w: resources("co2_price.csv") if "Ept" in w.opts else [],
|
co2_price=lambda w: resources("co2_price.csv") if "Ept" in w.opts else [],
|
||||||
output:
|
output:
|
||||||
|
@ -55,24 +55,6 @@ if config["enable"]["retrieve"] and config["enable"].get("retrieve_databundle",
|
|||||||
"../scripts/retrieve_eurostat_data.py"
|
"../scripts/retrieve_eurostat_data.py"
|
||||||
|
|
||||||
|
|
||||||
if config["enable"].get("retrieve_irena"):
|
|
||||||
|
|
||||||
rule retrieve_irena:
|
|
||||||
output:
|
|
||||||
offwind="data/existing_infrastructure/offwind_capacity_IRENA.csv",
|
|
||||||
onwind="data/existing_infrastructure/onwind_capacity_IRENA.csv",
|
|
||||||
solar="data/existing_infrastructure/solar_capacity_IRENA.csv",
|
|
||||||
log:
|
|
||||||
"logs/retrieve_irena.log",
|
|
||||||
resources:
|
|
||||||
mem_mb=1000,
|
|
||||||
retries: 2
|
|
||||||
conda:
|
|
||||||
"../envs/retrieve.yaml"
|
|
||||||
script:
|
|
||||||
"../scripts/retrieve_irena.py"
|
|
||||||
|
|
||||||
|
|
||||||
if config["enable"]["retrieve"] and config["enable"].get("retrieve_cutout", True):
|
if config["enable"]["retrieve"] and config["enable"].get("retrieve_cutout", True):
|
||||||
|
|
||||||
rule retrieve_cutout:
|
rule retrieve_cutout:
|
||||||
|
@ -26,9 +26,6 @@ rule add_existing_baseyear:
|
|||||||
existing_heating_distribution=resources(
|
existing_heating_distribution=resources(
|
||||||
"existing_heating_distribution_elec_s{simpl}_{clusters}_{planning_horizons}.csv"
|
"existing_heating_distribution_elec_s{simpl}_{clusters}_{planning_horizons}.csv"
|
||||||
),
|
),
|
||||||
existing_solar="data/existing_infrastructure/solar_capacity_IRENA.csv",
|
|
||||||
existing_onwind="data/existing_infrastructure/onwind_capacity_IRENA.csv",
|
|
||||||
existing_offwind="data/existing_infrastructure/offwind_capacity_IRENA.csv",
|
|
||||||
output:
|
output:
|
||||||
RESULTS
|
RESULTS
|
||||||
+ "prenetworks-brownfield/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.nc",
|
+ "prenetworks-brownfield/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.nc",
|
||||||
|
@ -25,9 +25,6 @@ rule add_existing_baseyear:
|
|||||||
"existing_heating_distribution_elec_s{simpl}_{clusters}_{planning_horizons}.csv"
|
"existing_heating_distribution_elec_s{simpl}_{clusters}_{planning_horizons}.csv"
|
||||||
),
|
),
|
||||||
existing_heating="data/existing_infrastructure/existing_heating_raw.csv",
|
existing_heating="data/existing_infrastructure/existing_heating_raw.csv",
|
||||||
existing_solar="data/existing_infrastructure/solar_capacity_IRENA.csv",
|
|
||||||
existing_onwind="data/existing_infrastructure/onwind_capacity_IRENA.csv",
|
|
||||||
existing_offwind="data/existing_infrastructure/offwind_capacity_IRENA.csv",
|
|
||||||
output:
|
output:
|
||||||
RESULTS
|
RESULTS
|
||||||
+ "prenetworks-brownfield/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.nc",
|
+ "prenetworks-brownfield/elec_s{simpl}_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.nc",
|
||||||
|
@ -13,6 +13,7 @@ from types import SimpleNamespace
|
|||||||
import country_converter as coco
|
import country_converter as coco
|
||||||
import numpy as np
|
import numpy as np
|
||||||
import pandas as pd
|
import pandas as pd
|
||||||
|
import powerplantmatching as pm
|
||||||
import pypsa
|
import pypsa
|
||||||
import xarray as xr
|
import xarray as xr
|
||||||
from _helpers import (
|
from _helpers import (
|
||||||
@ -60,14 +61,22 @@ def add_existing_renewables(df_agg, costs):
|
|||||||
Append existing renewables to the df_agg pd.DataFrame with the conventional
|
Append existing renewables to the df_agg pd.DataFrame with the conventional
|
||||||
power plants.
|
power plants.
|
||||||
"""
|
"""
|
||||||
carriers = {"solar": "solar", "onwind": "onwind", "offwind": "offwind-ac"}
|
tech_map = {"solar": "PV", "onwind": "Onshore", "offwind": "Offshore"}
|
||||||
|
|
||||||
for tech in ["solar", "onwind", "offwind"]:
|
countries = snakemake.config["countries"]
|
||||||
carrier = carriers[tech]
|
irena = pm.data.IRENASTAT().powerplant.convert_country_to_alpha2()
|
||||||
|
irena = irena.query("Country in @countries")
|
||||||
|
irena = irena.groupby(["Technology", "Country", "Year"]).Capacity.sum()
|
||||||
|
|
||||||
df = pd.read_csv(snakemake.input[f"existing_{tech}"], index_col=0).fillna(0.0)
|
irena = irena.unstack().reset_index()
|
||||||
|
|
||||||
|
for carrier, tech in tech_map.items():
|
||||||
|
df = (
|
||||||
|
irena[irena.Technology.str.contains(tech)]
|
||||||
|
.drop(columns=["Technology"])
|
||||||
|
.set_index("Country")
|
||||||
|
)
|
||||||
df.columns = df.columns.astype(int)
|
df.columns = df.columns.astype(int)
|
||||||
df.index = cc.convert(df.index, to="iso2")
|
|
||||||
|
|
||||||
# calculate yearly differences
|
# calculate yearly differences
|
||||||
df.insert(loc=0, value=0.0, column="1999")
|
df.insert(loc=0, value=0.0, column="1999")
|
||||||
@ -97,14 +106,16 @@ def add_existing_renewables(df_agg, costs):
|
|||||||
|
|
||||||
for year in nodal_df.columns:
|
for year in nodal_df.columns:
|
||||||
for node in nodal_df.index:
|
for node in nodal_df.index:
|
||||||
name = f"{node}-{tech}-{year}"
|
name = f"{node}-{carrier}-{year}"
|
||||||
capacity = nodal_df.loc[node, year]
|
capacity = nodal_df.loc[node, year]
|
||||||
if capacity > 0.0:
|
if capacity > 0.0:
|
||||||
df_agg.at[name, "Fueltype"] = tech
|
df_agg.at[name, "Fueltype"] = carrier
|
||||||
df_agg.at[name, "Capacity"] = capacity
|
df_agg.at[name, "Capacity"] = capacity
|
||||||
df_agg.at[name, "DateIn"] = year
|
df_agg.at[name, "DateIn"] = year
|
||||||
df_agg.at[name, "lifetime"] = costs.at[tech, "lifetime"]
|
df_agg.at[name, "lifetime"] = costs.at[carrier, "lifetime"]
|
||||||
df_agg.at[name, "DateOut"] = year + costs.at[tech, "lifetime"] - 1
|
df_agg.at[name, "DateOut"] = (
|
||||||
|
year + costs.at[carrier, "lifetime"] - 1
|
||||||
|
)
|
||||||
df_agg.at[name, "cluster_bus"] = node
|
df_agg.at[name, "cluster_bus"] = node
|
||||||
|
|
||||||
|
|
||||||
@ -310,7 +321,7 @@ def add_power_capacities_installed_before_baseyear(n, grouping_years, costs, bas
|
|||||||
n.madd(
|
n.madd(
|
||||||
"Generator",
|
"Generator",
|
||||||
new_capacity.index,
|
new_capacity.index,
|
||||||
suffix=" " + name_suffix,
|
suffix=name_suffix,
|
||||||
bus=new_capacity.index,
|
bus=new_capacity.index,
|
||||||
carrier=generator,
|
carrier=generator,
|
||||||
p_nom=new_capacity,
|
p_nom=new_capacity,
|
||||||
|
@ -5,10 +5,7 @@
|
|||||||
|
|
||||||
# coding: utf-8
|
# coding: utf-8
|
||||||
"""
|
"""
|
||||||
Creates the network topology from a `ENTSO-E map extract.
|
Creates the network topology from an `ENTSO-E map extract <https://github.com/PyPSA/GridKit/tree/master/entsoe>`_ (March 2022) as a PyPSA network.
|
||||||
|
|
||||||
<https://github.com/PyPSA/GridKit/tree/master/entsoe>`_ (March 2022) as a PyPSA
|
|
||||||
network.
|
|
||||||
|
|
||||||
Relevant Settings
|
Relevant Settings
|
||||||
-----------------
|
-----------------
|
||||||
@ -59,8 +56,19 @@ Outputs
|
|||||||
.. image:: img/base.png
|
.. image:: img/base.png
|
||||||
:scale: 33 %
|
:scale: 33 %
|
||||||
|
|
||||||
|
- ``resources/regions_onshore.geojson``:
|
||||||
|
|
||||||
|
.. image:: img/regions_onshore.png
|
||||||
|
:scale: 33 %
|
||||||
|
|
||||||
|
- ``resources/regions_offshore.geojson``:
|
||||||
|
|
||||||
|
.. image:: img/regions_offshore.png
|
||||||
|
:scale: 33 %
|
||||||
|
|
||||||
Description
|
Description
|
||||||
-----------
|
-----------
|
||||||
|
Creates the network topology from an ENTSO-E map extract, and create Voronoi shapes for each bus representing both onshore and offshore regions.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import logging
|
import logging
|
||||||
@ -75,11 +83,11 @@ import shapely
|
|||||||
import shapely.prepared
|
import shapely.prepared
|
||||||
import shapely.wkt
|
import shapely.wkt
|
||||||
import yaml
|
import yaml
|
||||||
from _helpers import configure_logging, get_snapshots, set_scenario_config
|
from _helpers import REGION_COLS, configure_logging, get_snapshots, set_scenario_config
|
||||||
from packaging.version import Version, parse
|
from packaging.version import Version, parse
|
||||||
from scipy import spatial
|
from scipy import spatial
|
||||||
from scipy.sparse import csgraph
|
from scipy.sparse import csgraph
|
||||||
from shapely.geometry import LineString, Point
|
from shapely.geometry import LineString, Point, Polygon
|
||||||
|
|
||||||
PD_GE_2_2 = parse(pd.__version__) >= Version("2.2")
|
PD_GE_2_2 = parse(pd.__version__) >= Version("2.2")
|
||||||
|
|
||||||
@ -698,6 +706,22 @@ def _adjust_capacities_of_under_construction_branches(n, config):
|
|||||||
return n
|
return n
|
||||||
|
|
||||||
|
|
||||||
|
def _set_shapes(n, country_shapes, offshore_shapes):
|
||||||
|
# Write the geodataframes country_shapes and offshore_shapes to the network.shapes component
|
||||||
|
country_shapes = gpd.read_file(country_shapes).rename(columns={"name": "idx"})
|
||||||
|
country_shapes["type"] = "country"
|
||||||
|
offshore_shapes = gpd.read_file(offshore_shapes).rename(columns={"name": "idx"})
|
||||||
|
offshore_shapes["type"] = "offshore"
|
||||||
|
all_shapes = pd.concat([country_shapes, offshore_shapes], ignore_index=True)
|
||||||
|
n.madd(
|
||||||
|
"Shape",
|
||||||
|
all_shapes.index,
|
||||||
|
geometry=all_shapes.geometry,
|
||||||
|
idx=all_shapes.idx,
|
||||||
|
type=all_shapes["type"],
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def base_network(
|
def base_network(
|
||||||
eg_buses,
|
eg_buses,
|
||||||
eg_converters,
|
eg_converters,
|
||||||
@ -758,9 +782,150 @@ def base_network(
|
|||||||
|
|
||||||
n = _adjust_capacities_of_under_construction_branches(n, config)
|
n = _adjust_capacities_of_under_construction_branches(n, config)
|
||||||
|
|
||||||
|
_set_shapes(n, country_shapes, offshore_shapes)
|
||||||
|
|
||||||
return n
|
return n
|
||||||
|
|
||||||
|
|
||||||
|
def voronoi_partition_pts(points, outline):
|
||||||
|
"""
|
||||||
|
Compute the polygons of a voronoi partition of `points` within the polygon
|
||||||
|
`outline`. Taken from
|
||||||
|
https://github.com/FRESNA/vresutils/blob/master/vresutils/graph.py.
|
||||||
|
|
||||||
|
Attributes
|
||||||
|
----------
|
||||||
|
points : Nx2 - ndarray[dtype=float]
|
||||||
|
outline : Polygon
|
||||||
|
Returns
|
||||||
|
-------
|
||||||
|
polygons : N - ndarray[dtype=Polygon|MultiPolygon]
|
||||||
|
"""
|
||||||
|
points = np.asarray(points)
|
||||||
|
|
||||||
|
if len(points) == 1:
|
||||||
|
polygons = [outline]
|
||||||
|
else:
|
||||||
|
xmin, ymin = np.amin(points, axis=0)
|
||||||
|
xmax, ymax = np.amax(points, axis=0)
|
||||||
|
xspan = xmax - xmin
|
||||||
|
yspan = ymax - ymin
|
||||||
|
|
||||||
|
# to avoid any network positions outside all Voronoi cells, append
|
||||||
|
# the corners of a rectangle framing these points
|
||||||
|
vor = spatial.Voronoi(
|
||||||
|
np.vstack(
|
||||||
|
(
|
||||||
|
points,
|
||||||
|
[
|
||||||
|
[xmin - 3.0 * xspan, ymin - 3.0 * yspan],
|
||||||
|
[xmin - 3.0 * xspan, ymax + 3.0 * yspan],
|
||||||
|
[xmax + 3.0 * xspan, ymin - 3.0 * yspan],
|
||||||
|
[xmax + 3.0 * xspan, ymax + 3.0 * yspan],
|
||||||
|
],
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
polygons = []
|
||||||
|
for i in range(len(points)):
|
||||||
|
poly = Polygon(vor.vertices[vor.regions[vor.point_region[i]]])
|
||||||
|
|
||||||
|
if not poly.is_valid:
|
||||||
|
poly = poly.buffer(0)
|
||||||
|
|
||||||
|
with np.errstate(invalid="ignore"):
|
||||||
|
poly = poly.intersection(outline)
|
||||||
|
|
||||||
|
polygons.append(poly)
|
||||||
|
|
||||||
|
return polygons
|
||||||
|
|
||||||
|
|
||||||
|
def build_bus_shapes(n, country_shapes, offshore_shapes, countries):
|
||||||
|
country_shapes = gpd.read_file(country_shapes).set_index("name")["geometry"]
|
||||||
|
offshore_shapes = gpd.read_file(offshore_shapes)
|
||||||
|
offshore_shapes = offshore_shapes.reindex(columns=REGION_COLS).set_index("name")[
|
||||||
|
"geometry"
|
||||||
|
]
|
||||||
|
|
||||||
|
onshore_regions = []
|
||||||
|
offshore_regions = []
|
||||||
|
|
||||||
|
for country in countries:
|
||||||
|
c_b = n.buses.country == country
|
||||||
|
|
||||||
|
onshore_shape = country_shapes[country]
|
||||||
|
onshore_locs = (
|
||||||
|
n.buses.loc[c_b & n.buses.onshore_bus]
|
||||||
|
.sort_values(
|
||||||
|
by="substation_lv", ascending=False
|
||||||
|
) # preference for substations
|
||||||
|
.drop_duplicates(subset=["x", "y"], keep="first")[["x", "y"]]
|
||||||
|
)
|
||||||
|
onshore_regions.append(
|
||||||
|
gpd.GeoDataFrame(
|
||||||
|
{
|
||||||
|
"name": onshore_locs.index,
|
||||||
|
"x": onshore_locs["x"],
|
||||||
|
"y": onshore_locs["y"],
|
||||||
|
"geometry": voronoi_partition_pts(
|
||||||
|
onshore_locs.values, onshore_shape
|
||||||
|
),
|
||||||
|
"country": country,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
if country not in offshore_shapes.index:
|
||||||
|
continue
|
||||||
|
offshore_shape = offshore_shapes[country]
|
||||||
|
offshore_locs = n.buses.loc[c_b & n.buses.substation_off, ["x", "y"]]
|
||||||
|
offshore_regions_c = gpd.GeoDataFrame(
|
||||||
|
{
|
||||||
|
"name": offshore_locs.index,
|
||||||
|
"x": offshore_locs["x"],
|
||||||
|
"y": offshore_locs["y"],
|
||||||
|
"geometry": voronoi_partition_pts(offshore_locs.values, offshore_shape),
|
||||||
|
"country": country,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
offshore_regions_c = offshore_regions_c.loc[offshore_regions_c.area > 1e-2]
|
||||||
|
offshore_regions.append(offshore_regions_c)
|
||||||
|
|
||||||
|
shapes = pd.concat(onshore_regions, ignore_index=True)
|
||||||
|
|
||||||
|
return onshore_regions, offshore_regions, shapes
|
||||||
|
|
||||||
|
|
||||||
|
def append_bus_shapes(n, shapes, type):
|
||||||
|
"""
|
||||||
|
Append shapes to the network. If shapes with the same component and type
|
||||||
|
already exist, they will be removed.
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
n (pypsa.Network): The network to which the shapes will be appended.
|
||||||
|
shapes (geopandas.GeoDataFrame): The shapes to be appended.
|
||||||
|
**kwargs: Additional keyword arguments used in `n.madd`.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
None
|
||||||
|
"""
|
||||||
|
remove = n.shapes.query("component == 'Bus' and type == @type").index
|
||||||
|
n.mremove("Shape", remove)
|
||||||
|
|
||||||
|
offset = n.shapes.index.astype(int).max() + 1 if not n.shapes.empty else 0
|
||||||
|
shapes = shapes.rename(lambda x: int(x) + offset)
|
||||||
|
n.madd(
|
||||||
|
"Shape",
|
||||||
|
shapes.index,
|
||||||
|
geometry=shapes.geometry,
|
||||||
|
idx=shapes.name,
|
||||||
|
component="Bus",
|
||||||
|
type=type,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
if "snakemake" not in globals():
|
if "snakemake" not in globals():
|
||||||
from _helpers import mock_snakemake
|
from _helpers import mock_snakemake
|
||||||
@ -784,5 +949,22 @@ if __name__ == "__main__":
|
|||||||
snakemake.config,
|
snakemake.config,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
onshore_regions, offshore_regions, shapes = build_bus_shapes(
|
||||||
|
n,
|
||||||
|
snakemake.input.country_shapes,
|
||||||
|
snakemake.input.offshore_shapes,
|
||||||
|
snakemake.params.countries,
|
||||||
|
)
|
||||||
|
|
||||||
|
shapes.to_file(snakemake.output.regions_onshore)
|
||||||
|
append_bus_shapes(n, shapes, "onshore")
|
||||||
|
|
||||||
|
if offshore_regions:
|
||||||
|
shapes = pd.concat(offshore_regions, ignore_index=True)
|
||||||
|
shapes.to_file(snakemake.output.regions_offshore)
|
||||||
|
append_bus_shapes(n, shapes, "offshore")
|
||||||
|
else:
|
||||||
|
offshore_shapes.to_frame().to_file(snakemake.output.regions_offshore)
|
||||||
|
|
||||||
n.meta = snakemake.config
|
n.meta = snakemake.config
|
||||||
n.export_to_netcdf(snakemake.output[0])
|
n.export_to_netcdf(snakemake.output.base_network)
|
||||||
|
@ -1,184 +0,0 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
# SPDX-FileCopyrightText: : 2017-2024 The PyPSA-Eur Authors
|
|
||||||
#
|
|
||||||
# SPDX-License-Identifier: MIT
|
|
||||||
"""
|
|
||||||
Creates Voronoi shapes for each bus representing both onshore and offshore
|
|
||||||
regions.
|
|
||||||
|
|
||||||
Relevant Settings
|
|
||||||
-----------------
|
|
||||||
|
|
||||||
.. code:: yaml
|
|
||||||
|
|
||||||
countries:
|
|
||||||
|
|
||||||
.. seealso::
|
|
||||||
Documentation of the configuration file ``config/config.yaml`` at
|
|
||||||
:ref:`toplevel_cf`
|
|
||||||
|
|
||||||
Inputs
|
|
||||||
------
|
|
||||||
|
|
||||||
- ``resources/country_shapes.geojson``: confer :ref:`shapes`
|
|
||||||
- ``resources/offshore_shapes.geojson``: confer :ref:`shapes`
|
|
||||||
- ``networks/base.nc``: confer :ref:`base`
|
|
||||||
|
|
||||||
Outputs
|
|
||||||
-------
|
|
||||||
|
|
||||||
- ``resources/regions_onshore.geojson``:
|
|
||||||
|
|
||||||
.. image:: img/regions_onshore.png
|
|
||||||
:scale: 33 %
|
|
||||||
|
|
||||||
- ``resources/regions_offshore.geojson``:
|
|
||||||
|
|
||||||
.. image:: img/regions_offshore.png
|
|
||||||
:scale: 33 %
|
|
||||||
|
|
||||||
Description
|
|
||||||
-----------
|
|
||||||
"""
|
|
||||||
|
|
||||||
import logging
|
|
||||||
|
|
||||||
import geopandas as gpd
|
|
||||||
import numpy as np
|
|
||||||
import pandas as pd
|
|
||||||
import pypsa
|
|
||||||
from _helpers import REGION_COLS, configure_logging, set_scenario_config
|
|
||||||
from scipy.spatial import Voronoi
|
|
||||||
from shapely.geometry import Polygon
|
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
|
||||||
|
|
||||||
|
|
||||||
def voronoi_partition_pts(points, outline):
|
|
||||||
"""
|
|
||||||
Compute the polygons of a voronoi partition of `points` within the polygon
|
|
||||||
`outline`. Taken from
|
|
||||||
https://github.com/FRESNA/vresutils/blob/master/vresutils/graph.py.
|
|
||||||
|
|
||||||
Attributes
|
|
||||||
----------
|
|
||||||
points : Nx2 - ndarray[dtype=float]
|
|
||||||
outline : Polygon
|
|
||||||
Returns
|
|
||||||
-------
|
|
||||||
polygons : N - ndarray[dtype=Polygon|MultiPolygon]
|
|
||||||
"""
|
|
||||||
points = np.asarray(points)
|
|
||||||
|
|
||||||
if len(points) == 1:
|
|
||||||
polygons = [outline]
|
|
||||||
else:
|
|
||||||
xmin, ymin = np.amin(points, axis=0)
|
|
||||||
xmax, ymax = np.amax(points, axis=0)
|
|
||||||
xspan = xmax - xmin
|
|
||||||
yspan = ymax - ymin
|
|
||||||
|
|
||||||
# to avoid any network positions outside all Voronoi cells, append
|
|
||||||
# the corners of a rectangle framing these points
|
|
||||||
vor = Voronoi(
|
|
||||||
np.vstack(
|
|
||||||
(
|
|
||||||
points,
|
|
||||||
[
|
|
||||||
[xmin - 3.0 * xspan, ymin - 3.0 * yspan],
|
|
||||||
[xmin - 3.0 * xspan, ymax + 3.0 * yspan],
|
|
||||||
[xmax + 3.0 * xspan, ymin - 3.0 * yspan],
|
|
||||||
[xmax + 3.0 * xspan, ymax + 3.0 * yspan],
|
|
||||||
],
|
|
||||||
)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
polygons = []
|
|
||||||
for i in range(len(points)):
|
|
||||||
poly = Polygon(vor.vertices[vor.regions[vor.point_region[i]]])
|
|
||||||
|
|
||||||
if not poly.is_valid:
|
|
||||||
poly = poly.buffer(0)
|
|
||||||
|
|
||||||
with np.errstate(invalid="ignore"):
|
|
||||||
poly = poly.intersection(outline)
|
|
||||||
|
|
||||||
polygons.append(poly)
|
|
||||||
|
|
||||||
return polygons
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
if "snakemake" not in globals():
|
|
||||||
from _helpers import mock_snakemake
|
|
||||||
|
|
||||||
snakemake = mock_snakemake("build_bus_regions")
|
|
||||||
configure_logging(snakemake)
|
|
||||||
set_scenario_config(snakemake)
|
|
||||||
|
|
||||||
countries = snakemake.params.countries
|
|
||||||
|
|
||||||
n = pypsa.Network(snakemake.input.base_network)
|
|
||||||
|
|
||||||
country_shapes = gpd.read_file(snakemake.input.country_shapes).set_index("name")[
|
|
||||||
"geometry"
|
|
||||||
]
|
|
||||||
offshore_shapes = gpd.read_file(snakemake.input.offshore_shapes)
|
|
||||||
offshore_shapes = offshore_shapes.reindex(columns=REGION_COLS).set_index("name")[
|
|
||||||
"geometry"
|
|
||||||
]
|
|
||||||
|
|
||||||
onshore_regions = []
|
|
||||||
offshore_regions = []
|
|
||||||
|
|
||||||
for country in countries:
|
|
||||||
c_b = n.buses.country == country
|
|
||||||
|
|
||||||
onshore_shape = country_shapes[country]
|
|
||||||
onshore_locs = (
|
|
||||||
n.buses.loc[c_b & n.buses.onshore_bus]
|
|
||||||
.sort_values(
|
|
||||||
by="substation_lv", ascending=False
|
|
||||||
) # preference for substations
|
|
||||||
.drop_duplicates(subset=["x", "y"], keep="first")[["x", "y"]]
|
|
||||||
)
|
|
||||||
onshore_regions.append(
|
|
||||||
gpd.GeoDataFrame(
|
|
||||||
{
|
|
||||||
"name": onshore_locs.index,
|
|
||||||
"x": onshore_locs["x"],
|
|
||||||
"y": onshore_locs["y"],
|
|
||||||
"geometry": voronoi_partition_pts(
|
|
||||||
onshore_locs.values, onshore_shape
|
|
||||||
),
|
|
||||||
"country": country,
|
|
||||||
}
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
if country not in offshore_shapes.index:
|
|
||||||
continue
|
|
||||||
offshore_shape = offshore_shapes[country]
|
|
||||||
offshore_locs = n.buses.loc[c_b & n.buses.substation_off, ["x", "y"]]
|
|
||||||
offshore_regions_c = gpd.GeoDataFrame(
|
|
||||||
{
|
|
||||||
"name": offshore_locs.index,
|
|
||||||
"x": offshore_locs["x"],
|
|
||||||
"y": offshore_locs["y"],
|
|
||||||
"geometry": voronoi_partition_pts(offshore_locs.values, offshore_shape),
|
|
||||||
"country": country,
|
|
||||||
}
|
|
||||||
)
|
|
||||||
offshore_regions_c = offshore_regions_c.loc[offshore_regions_c.area > 1e-2]
|
|
||||||
offshore_regions.append(offshore_regions_c)
|
|
||||||
|
|
||||||
pd.concat(onshore_regions, ignore_index=True).to_file(
|
|
||||||
snakemake.output.regions_onshore
|
|
||||||
)
|
|
||||||
if offshore_regions:
|
|
||||||
pd.concat(offshore_regions, ignore_index=True).to_file(
|
|
||||||
snakemake.output.regions_offshore
|
|
||||||
)
|
|
||||||
else:
|
|
||||||
offshore_shapes.to_frame().to_file(snakemake.output.regions_offshore)
|
|
@ -129,7 +129,7 @@ def copy_timeslice(load, cntry, start, stop, delta, fn_load=None):
|
|||||||
load.loc[start:stop, cntry] = load.loc[
|
load.loc[start:stop, cntry] = load.loc[
|
||||||
start - delta : stop - delta, cntry
|
start - delta : stop - delta, cntry
|
||||||
].values
|
].values
|
||||||
elif fn_load is not None:
|
elif fn_load is not None and cntry in load:
|
||||||
duration = pd.date_range(freq="h", start=start - delta, end=stop - delta)
|
duration = pd.date_range(freq="h", start=start - delta, end=stop - delta)
|
||||||
load_raw = load_timeseries(fn_load, duration, [cntry])
|
load_raw = load_timeseries(fn_load, duration, [cntry])
|
||||||
load.loc[start:stop, cntry] = load_raw.loc[
|
load.loc[start:stop, cntry] = load_raw.loc[
|
||||||
@ -311,6 +311,8 @@ if __name__ == "__main__":
|
|||||||
logger.info("Supplement missing data with synthetic data.")
|
logger.info("Supplement missing data with synthetic data.")
|
||||||
fn = snakemake.input.synthetic
|
fn = snakemake.input.synthetic
|
||||||
synthetic_load = pd.read_csv(fn, index_col=0, parse_dates=True)
|
synthetic_load = pd.read_csv(fn, index_col=0, parse_dates=True)
|
||||||
|
# "UA" does not appear in synthetic load data
|
||||||
|
countries = list(set(countries) - set(["UA"]))
|
||||||
synthetic_load = synthetic_load.loc[snapshots, countries]
|
synthetic_load = synthetic_load.loc[snapshots, countries]
|
||||||
load = load.combine_first(synthetic_load)
|
load = load.combine_first(synthetic_load)
|
||||||
|
|
||||||
|
@ -139,7 +139,10 @@ def approximate_missing_eia_stats(eia_stats, runoff_fn, countries):
|
|||||||
runoff.index = runoff.index.astype(int)
|
runoff.index = runoff.index.astype(int)
|
||||||
|
|
||||||
# fix outliers; exceptional floods in 1977-1979 in ES & PT
|
# fix outliers; exceptional floods in 1977-1979 in ES & PT
|
||||||
runoff.loc[1978, ["ES", "PT"]] = runoff.loc[1979, ["ES", "PT"]]
|
if "ES" in runoff:
|
||||||
|
runoff.loc[1978, "ES"] = runoff.loc[1979, "ES"]
|
||||||
|
if "PT" in runoff:
|
||||||
|
runoff.loc[1978, "PT"] = runoff.loc[1979, "PT"]
|
||||||
|
|
||||||
runoff_eia = runoff.loc[eia_stats.index]
|
runoff_eia = runoff.loc[eia_stats.index]
|
||||||
|
|
||||||
|
@ -135,6 +135,7 @@ import pypsa
|
|||||||
import seaborn as sns
|
import seaborn as sns
|
||||||
from _helpers import configure_logging, set_scenario_config, update_p_nom_max
|
from _helpers import configure_logging, set_scenario_config, update_p_nom_max
|
||||||
from add_electricity import load_costs
|
from add_electricity import load_costs
|
||||||
|
from base_network import append_bus_shapes
|
||||||
from packaging.version import Version, parse
|
from packaging.version import Version, parse
|
||||||
from pypsa.clustering.spatial import (
|
from pypsa.clustering.spatial import (
|
||||||
busmap_by_greedy_modularity,
|
busmap_by_greedy_modularity,
|
||||||
@ -428,20 +429,27 @@ def clustering_for_n_clusters(
|
|||||||
return clustering
|
return clustering
|
||||||
|
|
||||||
|
|
||||||
def cluster_regions(busmaps, input=None, output=None):
|
def cluster_regions(busmaps, regions):
|
||||||
|
"""
|
||||||
|
Cluster regions based on busmaps and save the results to a file and to the
|
||||||
|
network.
|
||||||
|
|
||||||
|
Parameters:
|
||||||
|
- busmaps (list): A list of busmaps used for clustering.
|
||||||
|
- which (str): The type of regions to cluster.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
None
|
||||||
|
"""
|
||||||
busmap = reduce(lambda x, y: x.map(y), busmaps[1:], busmaps[0])
|
busmap = reduce(lambda x, y: x.map(y), busmaps[1:], busmaps[0])
|
||||||
|
regions = regions.reindex(columns=["name", "geometry"]).set_index("name")
|
||||||
for which in ("regions_onshore", "regions_offshore"):
|
regions_c = regions.dissolve(busmap)
|
||||||
regions = gpd.read_file(getattr(input, which))
|
regions_c.index.name = "name"
|
||||||
regions = regions.reindex(columns=["name", "geometry"]).set_index("name")
|
return regions_c.reset_index()
|
||||||
regions_c = regions.dissolve(busmap)
|
|
||||||
regions_c.index.name = "name"
|
|
||||||
regions_c = regions_c.reset_index()
|
|
||||||
regions_c.to_file(getattr(output, which))
|
|
||||||
|
|
||||||
|
|
||||||
def plot_busmap_for_n_clusters(n, n_clusters, fn=None):
|
def plot_busmap_for_n_clusters(n, n_clusters, solver_name="scip", fn=None):
|
||||||
busmap = busmap_for_n_clusters(n, n_clusters)
|
busmap = busmap_for_n_clusters(n, n_clusters, solver_name)
|
||||||
cs = busmap.unique()
|
cs = busmap.unique()
|
||||||
cr = sns.color_palette("hls", len(cs))
|
cr = sns.color_palette("hls", len(cs))
|
||||||
n.plot(bus_colors=busmap.map(dict(zip(cs, cr))))
|
n.plot(bus_colors=busmap.map(dict(zip(cs, cr))))
|
||||||
@ -538,21 +546,25 @@ if __name__ == "__main__":
|
|||||||
params.focus_weights,
|
params.focus_weights,
|
||||||
)
|
)
|
||||||
|
|
||||||
update_p_nom_max(clustering.network)
|
nc = clustering.network
|
||||||
|
update_p_nom_max(nc)
|
||||||
|
|
||||||
if params.cluster_network.get("consider_efficiency_classes"):
|
if params.cluster_network.get("consider_efficiency_classes"):
|
||||||
labels = [f" {label} efficiency" for label in ["low", "medium", "high"]]
|
labels = [f" {label} efficiency" for label in ["low", "medium", "high"]]
|
||||||
nc = clustering.network
|
|
||||||
nc.generators["carrier"] = nc.generators.carrier.replace(labels, "", regex=True)
|
nc.generators["carrier"] = nc.generators.carrier.replace(labels, "", regex=True)
|
||||||
|
|
||||||
clustering.network.meta = dict(
|
|
||||||
snakemake.config, **dict(wildcards=dict(snakemake.wildcards))
|
|
||||||
)
|
|
||||||
clustering.network.export_to_netcdf(snakemake.output.network)
|
|
||||||
for attr in (
|
for attr in (
|
||||||
"busmap",
|
"busmap",
|
||||||
"linemap",
|
"linemap",
|
||||||
): # also available: linemap_positive, linemap_negative
|
): # also available: linemap_positive, linemap_negative
|
||||||
getattr(clustering, attr).to_csv(snakemake.output[attr])
|
getattr(clustering, attr).to_csv(snakemake.output[attr])
|
||||||
|
|
||||||
cluster_regions((clustering.busmap,), snakemake.input, snakemake.output)
|
nc.shapes = n.shapes.copy()
|
||||||
|
for which in ["regions_onshore", "regions_offshore"]:
|
||||||
|
regions = gpd.read_file(snakemake.input[which])
|
||||||
|
clustered_regions = cluster_regions((clustering.busmap,), regions)
|
||||||
|
clustered_regions.to_file(snakemake.output[which])
|
||||||
|
append_bus_shapes(nc, clustered_regions, type=which.split("_")[1])
|
||||||
|
|
||||||
|
nc.meta = dict(snakemake.config, **dict(wildcards=dict(snakemake.wildcards)))
|
||||||
|
nc.export_to_netcdf(snakemake.output.network)
|
||||||
|
@ -97,7 +97,7 @@ def define_spatial(nodes, options):
|
|||||||
spatial.gas.industry = nodes + " gas for industry"
|
spatial.gas.industry = nodes + " gas for industry"
|
||||||
spatial.gas.industry_cc = nodes + " gas for industry CC"
|
spatial.gas.industry_cc = nodes + " gas for industry CC"
|
||||||
spatial.gas.biogas_to_gas = nodes + " biogas to gas"
|
spatial.gas.biogas_to_gas = nodes + " biogas to gas"
|
||||||
spatial.gas.biogas_to_gas_cc = nodes + "biogas to gas CC"
|
spatial.gas.biogas_to_gas_cc = nodes + " biogas to gas CC"
|
||||||
else:
|
else:
|
||||||
spatial.gas.nodes = ["EU gas"]
|
spatial.gas.nodes = ["EU gas"]
|
||||||
spatial.gas.locations = ["EU"]
|
spatial.gas.locations = ["EU"]
|
||||||
|
@ -1,108 +0,0 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
# Copyright 2023 Thomas Gilon (Climact)
|
|
||||||
# SPDX-FileCopyrightText: : 2017-2024 The PyPSA-Eur Authors
|
|
||||||
#
|
|
||||||
# SPDX-License-Identifier: MIT
|
|
||||||
"""
|
|
||||||
This rule downloads the existing capacities from `IRENASTAT <https://www.irena.org/Data/Downloads/IRENASTAT>`_ and extracts it in the ``data/existing_capacities`` sub-directory.
|
|
||||||
|
|
||||||
**Relevant Settings**
|
|
||||||
|
|
||||||
.. code:: yaml
|
|
||||||
|
|
||||||
enable:
|
|
||||||
retrieve_irena:
|
|
||||||
|
|
||||||
.. seealso::
|
|
||||||
Documentation of the configuration file ``config.yaml`` at
|
|
||||||
:ref:`enable_cf`
|
|
||||||
|
|
||||||
**Outputs**
|
|
||||||
|
|
||||||
- ``data/existing_capacities``: existing capacities for offwind, onwind and solar
|
|
||||||
|
|
||||||
"""
|
|
||||||
|
|
||||||
import logging
|
|
||||||
|
|
||||||
import pandas as pd
|
|
||||||
from _helpers import configure_logging, set_scenario_config
|
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
|
||||||
|
|
||||||
REGIONS = [
|
|
||||||
"Albania",
|
|
||||||
"Austria",
|
|
||||||
"Belgium",
|
|
||||||
"Bosnia and Herzegovina",
|
|
||||||
"Bulgaria",
|
|
||||||
"Croatia",
|
|
||||||
"Czechia",
|
|
||||||
"Denmark",
|
|
||||||
"Estonia",
|
|
||||||
"Finland",
|
|
||||||
"France",
|
|
||||||
"Germany",
|
|
||||||
"Greece",
|
|
||||||
"Hungary",
|
|
||||||
"Ireland",
|
|
||||||
"Italy",
|
|
||||||
"Latvia",
|
|
||||||
"Lithuania",
|
|
||||||
"Luxembourg",
|
|
||||||
"Montenegro",
|
|
||||||
# "Netherlands",
|
|
||||||
"Netherlands (Kingdom of the)",
|
|
||||||
"North Macedonia",
|
|
||||||
"Norway",
|
|
||||||
"Poland",
|
|
||||||
"Portugal",
|
|
||||||
"Romania",
|
|
||||||
"Serbia",
|
|
||||||
"Slovakia",
|
|
||||||
"Slovenia",
|
|
||||||
"Spain",
|
|
||||||
"Sweden",
|
|
||||||
"Switzerland",
|
|
||||||
# "United Kingdom",
|
|
||||||
"United Kingdom of Great Britain and Northern Ireland (the)",
|
|
||||||
]
|
|
||||||
|
|
||||||
REGIONS_DICT = {
|
|
||||||
"Bosnia and Herzegovina": "Bosnia Herzg",
|
|
||||||
"Netherlands (Kingdom of the)": "Netherlands",
|
|
||||||
"United Kingdom of Great Britain and Northern Ireland (the)": "UK",
|
|
||||||
}
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
if "snakemake" not in globals():
|
|
||||||
from _helpers import mock_snakemake
|
|
||||||
|
|
||||||
snakemake = mock_snakemake("retrieve_irena")
|
|
||||||
configure_logging(snakemake)
|
|
||||||
set_scenario_config(snakemake)
|
|
||||||
|
|
||||||
irena_raw = pd.read_csv(
|
|
||||||
"https://pxweb.irena.org:443/sq/99e64b12-fe03-4a7b-92ea-a22cc3713b92",
|
|
||||||
skiprows=2,
|
|
||||||
index_col=[0, 1, 3],
|
|
||||||
encoding="latin-1",
|
|
||||||
)
|
|
||||||
|
|
||||||
var = "Installed electricity capacity (MW)"
|
|
||||||
irena = irena_raw[var].unstack(level=2).reset_index(level=1).replace(0, "")
|
|
||||||
|
|
||||||
irena = irena[irena.index.isin(REGIONS)]
|
|
||||||
irena.rename(index=REGIONS_DICT, inplace=True)
|
|
||||||
|
|
||||||
df_offwind = irena[irena.Technology.str.contains("Offshore")].drop(
|
|
||||||
columns=["Technology"]
|
|
||||||
)
|
|
||||||
df_onwind = irena[irena.Technology.str.contains("Onshore")].drop(
|
|
||||||
columns=["Technology"]
|
|
||||||
)
|
|
||||||
df_pv = irena[irena.Technology.str.contains("Solar")].drop(columns=["Technology"])
|
|
||||||
|
|
||||||
df_offwind.to_csv(snakemake.output["offwind"])
|
|
||||||
df_onwind.to_csv(snakemake.output["onwind"])
|
|
||||||
df_pv.to_csv(snakemake.output["solar"])
|
|
@ -88,12 +88,14 @@ The rule :mod:`simplify_network` does up to four things:
|
|||||||
import logging
|
import logging
|
||||||
from functools import reduce
|
from functools import reduce
|
||||||
|
|
||||||
|
import geopandas as gpd
|
||||||
import numpy as np
|
import numpy as np
|
||||||
import pandas as pd
|
import pandas as pd
|
||||||
import pypsa
|
import pypsa
|
||||||
import scipy as sp
|
import scipy as sp
|
||||||
from _helpers import configure_logging, set_scenario_config, update_p_nom_max
|
from _helpers import configure_logging, set_scenario_config, update_p_nom_max
|
||||||
from add_electricity import load_costs
|
from add_electricity import load_costs
|
||||||
|
from base_network import append_bus_shapes
|
||||||
from cluster_network import cluster_regions, clustering_for_n_clusters
|
from cluster_network import cluster_regions, clustering_for_n_clusters
|
||||||
from pypsa.clustering.spatial import (
|
from pypsa.clustering.spatial import (
|
||||||
aggregateoneport,
|
aggregateoneport,
|
||||||
@ -207,7 +209,7 @@ def _compute_connection_costs_to_bus(
|
|||||||
return connection_costs_to_bus
|
return connection_costs_to_bus
|
||||||
|
|
||||||
|
|
||||||
def _adjust_capital_costs_using_connection_costs(n, connection_costs_to_bus, output):
|
def _adjust_capital_costs_using_connection_costs(n, connection_costs_to_bus):
|
||||||
connection_costs = {}
|
connection_costs = {}
|
||||||
for tech in connection_costs_to_bus:
|
for tech in connection_costs_to_bus:
|
||||||
tech_b = n.generators.carrier == tech
|
tech_b = n.generators.carrier == tech
|
||||||
@ -228,14 +230,12 @@ def _adjust_capital_costs_using_connection_costs(n, connection_costs_to_bus, out
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
connection_costs[tech] = costs
|
connection_costs[tech] = costs
|
||||||
pd.DataFrame(connection_costs).to_csv(output.connection_costs)
|
|
||||||
|
|
||||||
|
|
||||||
def _aggregate_and_move_components(
|
def _aggregate_and_move_components(
|
||||||
n,
|
n,
|
||||||
busmap,
|
busmap,
|
||||||
connection_costs_to_bus,
|
connection_costs_to_bus,
|
||||||
output,
|
|
||||||
aggregate_one_ports={"Load", "StorageUnit"},
|
aggregate_one_ports={"Load", "StorageUnit"},
|
||||||
aggregation_strategies=dict(),
|
aggregation_strategies=dict(),
|
||||||
exclude_carriers=None,
|
exclude_carriers=None,
|
||||||
@ -248,7 +248,7 @@ def _aggregate_and_move_components(
|
|||||||
if not df.empty:
|
if not df.empty:
|
||||||
import_series_from_dataframe(n, df, c, attr)
|
import_series_from_dataframe(n, df, c, attr)
|
||||||
|
|
||||||
_adjust_capital_costs_using_connection_costs(n, connection_costs_to_bus, output)
|
_adjust_capital_costs_using_connection_costs(n, connection_costs_to_bus)
|
||||||
|
|
||||||
generator_strategies = aggregation_strategies["generators"]
|
generator_strategies = aggregation_strategies["generators"]
|
||||||
|
|
||||||
@ -281,7 +281,6 @@ def simplify_links(
|
|||||||
length_factor,
|
length_factor,
|
||||||
p_max_pu,
|
p_max_pu,
|
||||||
exclude_carriers,
|
exclude_carriers,
|
||||||
output,
|
|
||||||
aggregation_strategies=dict(),
|
aggregation_strategies=dict(),
|
||||||
):
|
):
|
||||||
## Complex multi-node links are folded into end-points
|
## Complex multi-node links are folded into end-points
|
||||||
@ -406,7 +405,6 @@ def simplify_links(
|
|||||||
n,
|
n,
|
||||||
busmap,
|
busmap,
|
||||||
connection_costs_to_bus,
|
connection_costs_to_bus,
|
||||||
output,
|
|
||||||
aggregation_strategies=aggregation_strategies,
|
aggregation_strategies=aggregation_strategies,
|
||||||
exclude_carriers=exclude_carriers,
|
exclude_carriers=exclude_carriers,
|
||||||
)
|
)
|
||||||
@ -419,7 +417,6 @@ def remove_stubs(
|
|||||||
renewable_carriers,
|
renewable_carriers,
|
||||||
length_factor,
|
length_factor,
|
||||||
simplify_network,
|
simplify_network,
|
||||||
output,
|
|
||||||
aggregation_strategies=dict(),
|
aggregation_strategies=dict(),
|
||||||
):
|
):
|
||||||
logger.info("Removing stubs")
|
logger.info("Removing stubs")
|
||||||
@ -436,7 +433,6 @@ def remove_stubs(
|
|||||||
n,
|
n,
|
||||||
busmap,
|
busmap,
|
||||||
connection_costs_to_bus,
|
connection_costs_to_bus,
|
||||||
output,
|
|
||||||
aggregation_strategies=aggregation_strategies,
|
aggregation_strategies=aggregation_strategies,
|
||||||
exclude_carriers=simplify_network["exclude_carriers"],
|
exclude_carriers=simplify_network["exclude_carriers"],
|
||||||
)
|
)
|
||||||
@ -556,7 +552,6 @@ if __name__ == "__main__":
|
|||||||
params.length_factor,
|
params.length_factor,
|
||||||
params.p_max_pu,
|
params.p_max_pu,
|
||||||
params.simplify_network["exclude_carriers"],
|
params.simplify_network["exclude_carriers"],
|
||||||
snakemake.output,
|
|
||||||
params.aggregation_strategies,
|
params.aggregation_strategies,
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -569,7 +564,6 @@ if __name__ == "__main__":
|
|||||||
params.renewable_carriers,
|
params.renewable_carriers,
|
||||||
params.length_factor,
|
params.length_factor,
|
||||||
params.simplify_network,
|
params.simplify_network,
|
||||||
snakemake.output,
|
|
||||||
aggregation_strategies=params.aggregation_strategies,
|
aggregation_strategies=params.aggregation_strategies,
|
||||||
)
|
)
|
||||||
busmaps.append(stub_map)
|
busmaps.append(stub_map)
|
||||||
@ -610,6 +604,7 @@ if __name__ == "__main__":
|
|||||||
n.lines.drop(remove, axis=1, errors="ignore", inplace=True)
|
n.lines.drop(remove, axis=1, errors="ignore", inplace=True)
|
||||||
|
|
||||||
if snakemake.wildcards.simpl:
|
if snakemake.wildcards.simpl:
|
||||||
|
shapes = n.shapes
|
||||||
n, cluster_map = cluster(
|
n, cluster_map = cluster(
|
||||||
n,
|
n,
|
||||||
int(snakemake.wildcards.simpl),
|
int(snakemake.wildcards.simpl),
|
||||||
@ -619,14 +614,19 @@ if __name__ == "__main__":
|
|||||||
params.simplify_network["feature"],
|
params.simplify_network["feature"],
|
||||||
params.aggregation_strategies,
|
params.aggregation_strategies,
|
||||||
)
|
)
|
||||||
|
n.shapes = shapes
|
||||||
busmaps.append(cluster_map)
|
busmaps.append(cluster_map)
|
||||||
|
|
||||||
update_p_nom_max(n)
|
update_p_nom_max(n)
|
||||||
|
|
||||||
n.meta = dict(snakemake.config, **dict(wildcards=dict(snakemake.wildcards)))
|
|
||||||
n.export_to_netcdf(snakemake.output.network)
|
|
||||||
|
|
||||||
busmap_s = reduce(lambda x, y: x.map(y), busmaps[1:], busmaps[0])
|
busmap_s = reduce(lambda x, y: x.map(y), busmaps[1:], busmaps[0])
|
||||||
busmap_s.to_csv(snakemake.output.busmap)
|
busmap_s.to_csv(snakemake.output.busmap)
|
||||||
|
|
||||||
cluster_regions(busmaps, snakemake.input, snakemake.output)
|
for which in ["regions_onshore", "regions_offshore"]:
|
||||||
|
regions = gpd.read_file(snakemake.input[which])
|
||||||
|
clustered_regions = cluster_regions(busmaps, regions)
|
||||||
|
clustered_regions.to_file(snakemake.output[which])
|
||||||
|
append_bus_shapes(n, clustered_regions, type=which.split("_")[1])
|
||||||
|
|
||||||
|
n.meta = dict(snakemake.config, **dict(wildcards=dict(snakemake.wildcards)))
|
||||||
|
n.export_to_netcdf(snakemake.output.network)
|
||||||
|
@ -159,6 +159,9 @@ def _add_land_use_constraint_m(n, planning_horizons, config):
|
|||||||
current_horizon = snakemake.wildcards.planning_horizons
|
current_horizon = snakemake.wildcards.planning_horizons
|
||||||
|
|
||||||
for carrier in ["solar", "onwind", "offwind-ac", "offwind-dc"]:
|
for carrier in ["solar", "onwind", "offwind-ac", "offwind-dc"]:
|
||||||
|
extendable_i = (n.generators.carrier == carrier) & n.generators.p_nom_extendable
|
||||||
|
n.generators.loc[extendable_i, "p_nom_min"] = 0
|
||||||
|
|
||||||
existing = n.generators.loc[n.generators.carrier == carrier, "p_nom"]
|
existing = n.generators.loc[n.generators.carrier == carrier, "p_nom"]
|
||||||
ind = list(
|
ind = list(
|
||||||
{i.split(sep=" ")[0] + " " + i.split(sep=" ")[1] for i in existing.index}
|
{i.split(sep=" ")[0] + " " + i.split(sep=" ")[1] for i in existing.index}
|
||||||
@ -180,6 +183,19 @@ def _add_land_use_constraint_m(n, planning_horizons, config):
|
|||||||
sel_p_year
|
sel_p_year
|
||||||
].rename(lambda x: x[:-4] + current_horizon)
|
].rename(lambda x: x[:-4] + current_horizon)
|
||||||
|
|
||||||
|
# check if existing capacities are larger than technical potential
|
||||||
|
existing_large = n.generators[
|
||||||
|
n.generators["p_nom_min"] > n.generators["p_nom_max"]
|
||||||
|
].index
|
||||||
|
if len(existing_large):
|
||||||
|
logger.warning(
|
||||||
|
f"Existing capacities larger than technical potential for {existing_large},\
|
||||||
|
adjust technical potential to existing capacities"
|
||||||
|
)
|
||||||
|
n.generators.loc[existing_large, "p_nom_max"] = n.generators.loc[
|
||||||
|
existing_large, "p_nom_min"
|
||||||
|
]
|
||||||
|
|
||||||
n.generators.p_nom_max.clip(lower=0, inplace=True)
|
n.generators.p_nom_max.clip(lower=0, inplace=True)
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user