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:
|
||||
- ubuntu-latest
|
||||
- macos-latest
|
||||
# - windows-latest
|
||||
- windows-latest
|
||||
inhouse:
|
||||
- stable
|
||||
- master
|
||||
|
@ -51,7 +51,7 @@ repos:
|
||||
|
||||
# Formatting with "black" coding style
|
||||
- repo: https://github.com/psf/black-pre-commit-mirror
|
||||
rev: 24.3.0
|
||||
rev: 24.4.2
|
||||
hooks:
|
||||
# Format Python files
|
||||
- id: black
|
||||
@ -74,7 +74,7 @@ repos:
|
||||
|
||||
# Format Snakemake rule / workflow files
|
||||
- repo: https://github.com/snakemake/snakefmt
|
||||
rev: v0.10.0
|
||||
rev: v0.10.1
|
||||
hooks:
|
||||
- id: snakefmt
|
||||
|
||||
|
@ -8,7 +8,7 @@ from os.path import normpath, exists
|
||||
from shutil import copyfile, move, rmtree
|
||||
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
|
||||
|
||||
|
@ -71,7 +71,6 @@ enable:
|
||||
retrieve_databundle: true
|
||||
retrieve_cost_data: true
|
||||
build_cutout: false
|
||||
retrieve_irena: false
|
||||
retrieve_cutout: true
|
||||
custom_busmap: false
|
||||
drop_leap_day: true
|
||||
@ -767,7 +766,7 @@ solving:
|
||||
|
||||
solver_options:
|
||||
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
|
||||
solver: "ipm"
|
||||
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_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`."
|
||||
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`."
|
||||
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"
|
||||
|
|
@ -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``
|
||||
-- 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,,,
|
||||
-- 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.
|
||||
solver_options,,dict,Dictionaries with solver-specific parameter settings.
|
||||
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
|
||||
========
|
||||
|
||||
.. image:: ../graphics/workflow.png
|
||||
.. image:: img/workflow.png
|
||||
:class: full-width
|
||||
:align: center
|
||||
|
||||
|
@ -62,7 +62,7 @@ PyPSA is known to work with the free software
|
||||
- `HiGHS <https://highs.dev/>`__
|
||||
- `Cbc <https://projects.coin-or.org/Cbc#DownloadandInstall>`__
|
||||
- `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)
|
||||
|
||||
@ -80,7 +80,7 @@ Nevertheless, you can still use open-source solvers for smaller problems.
|
||||
|
||||
.. note::
|
||||
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
|
||||
|
||||
.. code:: bash
|
||||
|
@ -21,8 +21,7 @@ Having downloaded the necessary data,
|
||||
With these and the externally extracted ENTSO-E online map topology
|
||||
(``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:`build_bus_regions` determines `Voronoi cells <https://en.wikipedia.org/wiki/Voronoi_diagram>`__ for all substations.
|
||||
- :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.
|
||||
|
||||
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
|
||||
together into a detailed PyPSA network stored in ``networks/elec.nc``.
|
||||
|
||||
.. _busregions:
|
||||
|
||||
Rule ``build_bus_regions``
|
||||
=============================
|
||||
|
||||
.. automodule:: build_bus_regions
|
||||
|
||||
.. _cutout:
|
||||
|
||||
Rule ``build_cutout``
|
||||
|
@ -194,6 +194,10 @@ Upcoming Release
|
||||
|
||||
* 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.
|
||||
|
||||
* 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`.
|
||||
|
||||
* 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
|
||||
|
||||
|
||||
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``
|
||||
|
||||
Rule ``retrieve_irena``
|
||||
================================
|
||||
|
||||
.. automodule:: retrieve_irena
|
||||
|
||||
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];
|
||||
node[shape=box, style=rounded, fontname=sans, fontsize=10, penwidth=2];
|
||||
edge[penwidth=2, color=grey];
|
||||
0[label = "solve_network", color = "0.39 0.6 0.85", style="rounded"];
|
||||
1[label = "prepare_network\nll: copt\nopts: Co2L-24H", color = "0.29 0.6 0.85", style="rounded"];
|
||||
2[label = "add_extra_components", color = "0.28 0.6 0.85", style="rounded"];
|
||||
3[label = "cluster_network\nclusters: 6", color = "0.19 0.6 0.85", style="rounded"];
|
||||
4[label = "simplify_network\nsimpl: ", color = "0.01 0.6 0.85", style="rounded"];
|
||||
5[label = "add_electricity", color = "0.49 0.6 0.85", style="rounded"];
|
||||
6[label = "build_renewable_profiles\ntechnology: solar", color = "0.21 0.6 0.85", style="rounded"];
|
||||
7[label = "base_network", color = "0.27 0.6 0.85", style="rounded"];
|
||||
8[label = "build_shapes", color = "0.26 0.6 0.85", style="rounded"];
|
||||
9[label = "retrieve_databundle", color = "0.59 0.6 0.85", style="rounded"];
|
||||
11[label = "build_bus_regions", color = "0.13 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"];
|
||||
13[label = "build_renewable_profiles\ntechnology: onwind", color = "0.21 0.6 0.85", style="rounded"];
|
||||
14[label = "build_renewable_profiles\ntechnology: offwind-ac", color = "0.21 0.6 0.85", style="rounded"];
|
||||
15[label = "build_ship_raster", color = "0.00 0.6 0.85", style="rounded"];
|
||||
16[label = "retrieve_ship_raster", color = "0.51 0.6 0.85", style="rounded,dashed"];
|
||||
17[label = "build_renewable_profiles\ntechnology: offwind-dc", color = "0.21 0.6 0.85", style="rounded"];
|
||||
18[label = "build_line_rating", color = "0.05 0.6 0.85", style="rounded"];
|
||||
19[label = "retrieve_cost_data\nyear: 2030", color = "0.15 0.6 0.85", style="rounded"];
|
||||
20[label = "build_powerplants", color = "0.54 0.6 0.85", style="rounded"];
|
||||
21[label = "build_electricity_demand", color = "0.52 0.6 0.85", style="rounded"];
|
||||
22[label = "retrieve_electricity_demand", color = "0.22 0.6 0.85", style="rounded"];
|
||||
23[label = "copy_config", color = "0.44 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.53 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.03 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.10 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.22 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.29 0.6 0.85", style="rounded"];
|
||||
10[label = "retrieve_cutout\ncutout: be-03-2013-era5", color = "0.49 0.6 0.85", style="rounded"];
|
||||
11[label = "build_renewable_profiles\ntechnology: onwind", color = "0.50 0.6 0.85", style="rounded"];
|
||||
12[label = "build_renewable_profiles\ntechnology: offwind-ac", color = "0.50 0.6 0.85", style="rounded"];
|
||||
13[label = "build_ship_raster", color = "0.19 0.6 0.85", style="rounded"];
|
||||
14[label = "retrieve_ship_raster", color = "0.35 0.6 0.85", style="rounded"];
|
||||
15[label = "build_renewable_profiles\ntechnology: offwind-dc", color = "0.50 0.6 0.85", style="rounded"];
|
||||
16[label = "build_line_rating", color = "0.60 0.6 0.85", style="rounded"];
|
||||
17[label = "retrieve_cost_data\nyear: 2030", color = "0.59 0.6 0.85", style="rounded"];
|
||||
18[label = "build_powerplants", color = "0.06 0.6 0.85", style="rounded"];
|
||||
19[label = "build_electricity_demand", color = "0.13 0.6 0.85", style="rounded"];
|
||||
20[label = "retrieve_electricity_demand", color = "0.49 0.6 0.85", style="rounded"];
|
||||
21[label = "retrieve_synthetic_electricity_demand", color = "0.41 0.6 0.85", style="rounded"];
|
||||
1 -> 0
|
||||
23 -> 0
|
||||
2 -> 1
|
||||
19 -> 1
|
||||
17 -> 1
|
||||
3 -> 2
|
||||
19 -> 2
|
||||
17 -> 2
|
||||
4 -> 3
|
||||
19 -> 3
|
||||
17 -> 3
|
||||
5 -> 4
|
||||
19 -> 4
|
||||
11 -> 4
|
||||
17 -> 4
|
||||
7 -> 4
|
||||
6 -> 5
|
||||
13 -> 5
|
||||
14 -> 5
|
||||
17 -> 5
|
||||
11 -> 5
|
||||
12 -> 5
|
||||
15 -> 5
|
||||
7 -> 5
|
||||
16 -> 5
|
||||
17 -> 5
|
||||
18 -> 5
|
||||
19 -> 5
|
||||
11 -> 5
|
||||
20 -> 5
|
||||
9 -> 5
|
||||
21 -> 5
|
||||
8 -> 5
|
||||
7 -> 6
|
||||
9 -> 6
|
||||
10 -> 6
|
||||
8 -> 6
|
||||
11 -> 6
|
||||
12 -> 6
|
||||
10 -> 6
|
||||
8 -> 7
|
||||
9 -> 8
|
||||
8 -> 11
|
||||
7 -> 11
|
||||
7 -> 13
|
||||
9 -> 13
|
||||
9 -> 11
|
||||
8 -> 11
|
||||
10 -> 11
|
||||
7 -> 12
|
||||
9 -> 12
|
||||
13 -> 12
|
||||
8 -> 12
|
||||
10 -> 12
|
||||
14 -> 13
|
||||
10 -> 13
|
||||
8 -> 13
|
||||
11 -> 13
|
||||
12 -> 13
|
||||
7 -> 14
|
||||
9 -> 14
|
||||
10 -> 14
|
||||
15 -> 14
|
||||
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 -> 15
|
||||
9 -> 15
|
||||
13 -> 15
|
||||
8 -> 15
|
||||
10 -> 15
|
||||
7 -> 16
|
||||
10 -> 16
|
||||
7 -> 18
|
||||
12 -> 18
|
||||
7 -> 20
|
||||
22 -> 21
|
||||
}
|
||||
20 -> 19
|
||||
21 -> 19
|
||||
}
|
||||
|
||||
|
|
||||
|
||||
@ -224,27 +211,28 @@ In the terminal, this will show up as a list of jobs to be run:
|
||||
|
||||
Building DAG of jobs...
|
||||
Job stats:
|
||||
job count
|
||||
--------------------------- -------
|
||||
add_electricity 1
|
||||
add_extra_components 1
|
||||
base_network 1
|
||||
build_bus_regions 1
|
||||
build_electricity_demand 1
|
||||
build_line_rating 1
|
||||
build_powerplants 1
|
||||
build_renewable_profiles 4
|
||||
build_shapes 1
|
||||
build_ship_raster 1
|
||||
cluster_network 1
|
||||
copy_config 1
|
||||
prepare_network 1
|
||||
retrieve_cost_data 1
|
||||
retrieve_databundle 1
|
||||
retrieve_electricity_demand 1
|
||||
simplify_network 1
|
||||
solve_network 1
|
||||
total 22
|
||||
job count
|
||||
------------------------------------- -------
|
||||
add_electricity 1
|
||||
add_extra_components 1
|
||||
base_network 1
|
||||
build_electricity_demand 1
|
||||
build_line_rating 1
|
||||
build_powerplants 1
|
||||
build_renewable_profiles 4
|
||||
build_shapes 1
|
||||
build_ship_raster 1
|
||||
cluster_network 1
|
||||
prepare_network 1
|
||||
retrieve_cost_data 1
|
||||
retrieve_cutout 1
|
||||
retrieve_databundle 1
|
||||
retrieve_electricity_demand 1
|
||||
retrieve_ship_raster 1
|
||||
retrieve_synthetic_electricity_demand 1
|
||||
simplify_network 1
|
||||
solve_network 1
|
||||
total 22
|
||||
|
||||
|
||||
``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
|
||||
- http://conda.anaconda.org/gurobi
|
||||
- conda-forge
|
||||
- defaults
|
||||
dependencies:
|
||||
- _libgcc_mutex=0.1
|
||||
- _openmp_mutex=4.5
|
||||
- affine=2.4.0
|
||||
- alsa-lib=1.2.10
|
||||
- ampl-mp=3.1.0
|
||||
- amply=0.1.6
|
||||
- appdirs=1.4.4
|
||||
- asttokens=2.4.1
|
||||
- atk-1.0=2.38.0
|
||||
- atlite=0.2.12
|
||||
- attr=2.5.1
|
||||
- attrs=23.2.0
|
||||
- aws-c-auth=0.7.15
|
||||
- aws-c-cal=0.6.9
|
||||
- aws-c-common=0.9.12
|
||||
- aws-c-compression=0.2.17
|
||||
- aws-c-event-stream=0.4.1
|
||||
- aws-c-http=0.8.0
|
||||
- aws-c-io=0.14.3
|
||||
- aws-c-mqtt=0.10.1
|
||||
- aws-c-s3=0.5.0
|
||||
- aws-c-sdkutils=0.1.14
|
||||
- aws-checksums=0.1.17
|
||||
- aws-crt-cpp=0.26.1
|
||||
- aws-sdk-cpp=1.11.242
|
||||
- azure-core-cpp=1.10.3
|
||||
- azure-storage-blobs-cpp=12.10.0
|
||||
- azure-storage-common-cpp=12.5.0
|
||||
- beautifulsoup4=4.12.3
|
||||
- blosc=1.21.5
|
||||
- bokeh=3.3.4
|
||||
- bottleneck=1.3.7
|
||||
- branca=0.7.1
|
||||
- brotli=1.1.0
|
||||
- brotli-bin=1.1.0
|
||||
- brotli-python=1.1.0
|
||||
- bzip2=1.0.8
|
||||
- c-ares=1.26.0
|
||||
- c-blosc2=2.13.2
|
||||
- ca-certificates=2024.2.2
|
||||
- cairo=1.18.0
|
||||
- cartopy=0.22.0
|
||||
- cdsapi=0.6.1
|
||||
- certifi=2024.2.2
|
||||
- cffi=1.16.0
|
||||
- cfgv=3.3.1
|
||||
- cfitsio=4.3.1
|
||||
- cftime=1.6.3
|
||||
- charset-normalizer=3.3.2
|
||||
- click=8.1.7
|
||||
- click-plugins=1.1.1
|
||||
- cligj=0.7.2
|
||||
- cloudpickle=3.0.0
|
||||
- coin-or-cbc=2.10.10
|
||||
- coin-or-cgl=0.60.7
|
||||
- coin-or-clp=1.17.8
|
||||
- coin-or-osi=0.108.8
|
||||
- coin-or-utils=2.11.9
|
||||
- coincbc=2.10.10
|
||||
- colorama=0.4.6
|
||||
- configargparse=1.7
|
||||
- connection_pool=0.0.3
|
||||
- contourpy=1.2.0
|
||||
- country_converter=1.2
|
||||
- cppad=20240000.2
|
||||
- cycler=0.12.1
|
||||
- cytoolz=0.12.3
|
||||
- dask=2024.2.0
|
||||
- dask-core=2024.2.0
|
||||
- datrie=0.8.2
|
||||
- dbus=1.13.6
|
||||
- decorator=5.1.1
|
||||
- deprecation=2.1.0
|
||||
- descartes=1.1.0
|
||||
- distlib=0.3.8
|
||||
- distributed=2024.2.0
|
||||
- distro=1.9.0
|
||||
- docutils=0.20.1
|
||||
- dpath=2.1.6
|
||||
- entsoe-py=0.6.6
|
||||
- et_xmlfile=1.1.0
|
||||
- exceptiongroup=1.2.0
|
||||
- executing=2.0.1
|
||||
- expat=2.5.0
|
||||
- filelock=3.13.1
|
||||
- fiona=1.9.5
|
||||
- folium=0.15.1
|
||||
- font-ttf-dejavu-sans-mono=2.37
|
||||
- font-ttf-inconsolata=3.000
|
||||
- font-ttf-source-code-pro=2.038
|
||||
- font-ttf-ubuntu=0.83
|
||||
- fontconfig=2.14.2
|
||||
- fonts-conda-ecosystem=1
|
||||
- fonts-conda-forge=1
|
||||
- fonttools=4.49.0
|
||||
- freetype=2.12.1
|
||||
- freexl=2.0.0
|
||||
- fribidi=1.0.10
|
||||
- fsspec=2024.2.0
|
||||
- gdal=3.8.4
|
||||
- gdk-pixbuf=2.42.10
|
||||
- geographiclib=1.52
|
||||
- geojson-rewind=1.1.0
|
||||
- geopandas=0.14.3
|
||||
- geopandas-base=0.14.3
|
||||
- geopy=2.4.1
|
||||
- geos=3.12.1
|
||||
- geotiff=1.7.1
|
||||
- gettext=0.21.1
|
||||
- gflags=2.2.2
|
||||
- giflib=5.2.1
|
||||
- gitdb=4.0.11
|
||||
- gitpython=3.1.42
|
||||
- glib=2.78.4
|
||||
- glib-tools=2.78.4
|
||||
- glog=0.6.0
|
||||
- glpk=5.0
|
||||
- gmp=6.3.0
|
||||
- graphite2=1.3.13
|
||||
- graphviz=9.0.0
|
||||
- gst-plugins-base=1.22.9
|
||||
- gstreamer=1.22.9
|
||||
- gtk2=2.24.33
|
||||
- gts=0.7.6
|
||||
- harfbuzz=8.3.0
|
||||
- hdf4=4.2.15
|
||||
- hdf5=1.14.3
|
||||
- humanfriendly=10.0
|
||||
- icu=73.2
|
||||
- identify=2.5.35
|
||||
- idna=3.6
|
||||
- importlib-metadata=7.0.1
|
||||
- importlib_metadata=7.0.1
|
||||
- importlib_resources=6.1.1
|
||||
- iniconfig=2.0.0
|
||||
- ipopt=3.14.14
|
||||
- ipython=8.21.0
|
||||
- jedi=0.19.1
|
||||
- jinja2=3.1.3
|
||||
- joblib=1.3.2
|
||||
- json-c=0.17
|
||||
- jsonschema=4.21.1
|
||||
- jsonschema-specifications=2023.12.1
|
||||
- jupyter_core=5.7.1
|
||||
- kealib=1.5.3
|
||||
- keyutils=1.6.1
|
||||
- kiwisolver=1.4.5
|
||||
- krb5=1.21.2
|
||||
- lame=3.100
|
||||
- lcms2=2.16
|
||||
- ld_impl_linux-64=2.40
|
||||
- lerc=4.0.0
|
||||
- libabseil=20230802.1
|
||||
- libaec=1.1.2
|
||||
- libarchive=3.7.2
|
||||
- libarrow=15.0.0
|
||||
- libarrow-acero=15.0.0
|
||||
- libarrow-dataset=15.0.0
|
||||
- libarrow-flight=15.0.0
|
||||
- libarrow-flight-sql=15.0.0
|
||||
- libarrow-gandiva=15.0.0
|
||||
- libarrow-substrait=15.0.0
|
||||
- libblas=3.9.0
|
||||
- libboost-headers=1.84.0
|
||||
- libbrotlicommon=1.1.0
|
||||
- libbrotlidec=1.1.0
|
||||
- libbrotlienc=1.1.0
|
||||
- libcap=2.69
|
||||
- libcblas=3.9.0
|
||||
- libclang=15.0.7
|
||||
- libclang13=15.0.7
|
||||
- libcrc32c=1.1.2
|
||||
- libcups=2.3.3
|
||||
- libcurl=8.5.0
|
||||
- libdeflate=1.19
|
||||
- libedit=3.1.20191231
|
||||
- libev=4.33
|
||||
- libevent=2.1.12
|
||||
- libexpat=2.5.0
|
||||
- libffi=3.4.2
|
||||
- libflac=1.4.3
|
||||
- libgcc-ng=13.2.0
|
||||
- libgcrypt=1.10.3
|
||||
- libgd=2.3.3
|
||||
- libgdal=3.8.4
|
||||
- libgfortran-ng=13.2.0
|
||||
- libgfortran5=13.2.0
|
||||
- libglib=2.78.4
|
||||
- libgomp=13.2.0
|
||||
- libgoogle-cloud=2.12.0
|
||||
- libgpg-error=1.47
|
||||
- libgrpc=1.60.1
|
||||
- libhwloc=2.9.3
|
||||
- libiconv=1.17
|
||||
- libjpeg-turbo=3.0.0
|
||||
- libkml=1.3.0
|
||||
- liblapack=3.9.0
|
||||
- liblapacke=3.9.0
|
||||
- libllvm15=15.0.7
|
||||
- libnetcdf=4.9.2
|
||||
- libnghttp2=1.58.0
|
||||
- libnl=3.9.0
|
||||
- libnsl=2.0.1
|
||||
- libnuma=2.0.16
|
||||
- libogg=1.3.4
|
||||
- libopenblas=0.3.26
|
||||
- libopus=1.3.1
|
||||
- libparquet=15.0.0
|
||||
- libpng=1.6.42
|
||||
- libpq=16.2
|
||||
- libprotobuf=4.25.1
|
||||
- libre2-11=2023.06.02
|
||||
- librsvg=2.56.3
|
||||
- librttopo=1.1.0
|
||||
- libscotch=7.0.4
|
||||
- libsndfile=1.2.2
|
||||
- libspatialindex=1.9.3
|
||||
- libspatialite=5.1.0
|
||||
- libspral=2023.09.07
|
||||
- libsqlite=3.45.1
|
||||
- libssh2=1.11.0
|
||||
- libstdcxx-ng=13.2.0
|
||||
- libsystemd0=255
|
||||
- libthrift=0.19.0
|
||||
- libtiff=4.6.0
|
||||
- libutf8proc=2.8.0
|
||||
- libuuid=2.38.1
|
||||
- libvorbis=1.3.7
|
||||
- libwebp=1.3.2
|
||||
- libwebp-base=1.3.2
|
||||
- libxcb=1.15
|
||||
- libxcrypt=4.4.36
|
||||
- libxkbcommon=1.6.0
|
||||
- libxml2=2.12.5
|
||||
- libxslt=1.1.39
|
||||
- libzip=1.10.1
|
||||
- libzlib=1.2.13
|
||||
- linopy=0.3.4
|
||||
- locket=1.0.0
|
||||
- lxml=5.1.0
|
||||
- lz4=4.3.3
|
||||
- lz4-c=1.9.4
|
||||
- lzo=2.10
|
||||
- mapclassify=2.6.1
|
||||
- markupsafe=2.1.5
|
||||
- matplotlib=3.8.3
|
||||
- matplotlib-base=3.8.3
|
||||
- matplotlib-inline=0.1.6
|
||||
- memory_profiler=0.61.0
|
||||
- metis=5.1.0
|
||||
- minizip=4.0.4
|
||||
- mpg123=1.32.4
|
||||
- msgpack-python=1.0.7
|
||||
- mumps-include=5.6.2
|
||||
- mumps-seq=5.6.2
|
||||
- munkres=1.1.4
|
||||
- mysql-common=8.0.33
|
||||
- mysql-libs=8.0.33
|
||||
- nbformat=5.9.2
|
||||
- ncurses=6.4
|
||||
- netcdf4=1.6.5
|
||||
- networkx=3.2.1
|
||||
- nodeenv=1.8.0
|
||||
- nomkl=1.0
|
||||
- nspr=4.35
|
||||
- nss=3.98
|
||||
- numexpr=2.9.0
|
||||
- numpy=1.26.4
|
||||
- openjdk=21.0.2
|
||||
- openjpeg=2.5.0
|
||||
- openpyxl=3.1.2
|
||||
- openssl=3.2.1
|
||||
- orc=1.9.2
|
||||
- packaging=23.2
|
||||
- pandas=2.2.0
|
||||
- pango=1.50.14
|
||||
- parso=0.8.3
|
||||
- partd=1.4.1
|
||||
- patsy=0.5.6
|
||||
- pcre2=10.42
|
||||
- pexpect=4.9.0
|
||||
- pickleshare=0.7.5
|
||||
- pillow=10.2.0
|
||||
- pip=24.0
|
||||
- pixman=0.43.2
|
||||
- pkgutil-resolve-name=1.3.10
|
||||
- plac=1.4.2
|
||||
- platformdirs=4.2.0
|
||||
- pluggy=1.4.0
|
||||
- ply=3.11
|
||||
- poppler=24.02.0
|
||||
- poppler-data=0.4.12
|
||||
- postgresql=16.2
|
||||
- powerplantmatching=0.5.11
|
||||
- pre-commit=3.6.2
|
||||
- progressbar2=4.3.2
|
||||
- proj=9.3.1
|
||||
- prompt-toolkit=3.0.42
|
||||
- psutil=5.9.8
|
||||
- pthread-stubs=0.4
|
||||
- ptyprocess=0.7.0
|
||||
- pulp=2.7.0
|
||||
- pulseaudio-client=16.1
|
||||
- pure_eval=0.2.2
|
||||
- py-cpuinfo=9.0.0
|
||||
- pyarrow=15.0.0
|
||||
- pyarrow-hotfix=0.6
|
||||
- pycountry=22.3.5
|
||||
- pycparser=2.21
|
||||
- pygments=2.17.2
|
||||
- pyomo=6.6.1
|
||||
- pyparsing=3.1.1
|
||||
- pyproj=3.6.1
|
||||
- pypsa=0.27.0
|
||||
- pyqt=5.15.9
|
||||
- pyqt5-sip=12.12.2
|
||||
- pyscipopt=4.4.0
|
||||
- pyshp=2.3.1
|
||||
- pysocks=1.7.1
|
||||
- pytables=3.9.2
|
||||
- pytest=8.0.0
|
||||
- python=3.11.8
|
||||
- python-dateutil=2.8.2
|
||||
- python-fastjsonschema=2.19.1
|
||||
- python-tzdata=2024.1
|
||||
- python-utils=3.8.2
|
||||
- python_abi=3.11
|
||||
- pytz=2024.1
|
||||
- pyxlsb=1.0.10
|
||||
- pyyaml=6.0.1
|
||||
- qt-main=5.15.8
|
||||
- rasterio=1.3.9
|
||||
- rdma-core=50.0
|
||||
- re2=2023.06.02
|
||||
- readline=8.2
|
||||
- referencing=0.33.0
|
||||
- requests=2.31.0
|
||||
- reretry=0.11.8
|
||||
- rioxarray=0.15.1
|
||||
- rpds-py=0.18.0
|
||||
- rtree=1.2.0
|
||||
- s2n=1.4.3
|
||||
- scikit-learn=1.4.1.post1
|
||||
- scip=8.1.0
|
||||
- scipy=1.12.0
|
||||
- scotch=7.0.4
|
||||
- seaborn=0.13.2
|
||||
- seaborn-base=0.13.2
|
||||
- setuptools=69.1.0
|
||||
- setuptools-scm=8.0.4
|
||||
- setuptools_scm=8.0.4
|
||||
- shapely=2.0.2
|
||||
- sip=6.7.12
|
||||
- six=1.16.0
|
||||
- smart_open=6.4.0
|
||||
- smmap=5.0.0
|
||||
- snakemake-minimal=7.32.4
|
||||
- snappy=1.1.10
|
||||
- snuggs=1.4.7
|
||||
- sortedcontainers=2.4.0
|
||||
- soupsieve=2.5
|
||||
- sqlite=3.45.1
|
||||
- stack_data=0.6.2
|
||||
- statsmodels=0.14.1
|
||||
- stopit=1.1.2
|
||||
- tabula-py=2.7.0
|
||||
- tabulate=0.9.0
|
||||
- tbb=2021.11.0
|
||||
- tblib=3.0.0
|
||||
- threadpoolctl=3.3.0
|
||||
- throttler=1.2.2
|
||||
- tiledb=2.20.0
|
||||
- tk=8.6.13
|
||||
- toml=0.10.2
|
||||
- tomli=2.0.1
|
||||
- toolz=0.12.1
|
||||
- toposort=1.10
|
||||
- tornado=6.3.3
|
||||
- tqdm=4.66.2
|
||||
- traitlets=5.14.1
|
||||
- typing-extensions=4.9.0
|
||||
- typing_extensions=4.9.0
|
||||
- tzcode=2024a
|
||||
- tzdata=2024a
|
||||
- ucx=1.15.0
|
||||
- ukkonen=1.0.1
|
||||
- unidecode=1.3.8
|
||||
- unixodbc=2.3.12
|
||||
- uriparser=0.9.7
|
||||
- urllib3=2.2.1
|
||||
- validators=0.22.0
|
||||
- virtualenv=20.25.0
|
||||
- wcwidth=0.2.13
|
||||
- wheel=0.42.0
|
||||
- wrapt=1.16.0
|
||||
- xarray=2024.2.0
|
||||
- xcb-util=0.4.0
|
||||
- xcb-util-image=0.4.0
|
||||
- xcb-util-keysyms=0.4.0
|
||||
- xcb-util-renderutil=0.3.9
|
||||
- xcb-util-wm=0.4.1
|
||||
- xerces-c=3.2.5
|
||||
- xkeyboard-config=2.41
|
||||
- xlrd=2.0.1
|
||||
- xorg-fixesproto=5.0
|
||||
- xorg-inputproto=2.3.2
|
||||
- xorg-kbproto=1.0.7
|
||||
- xorg-libice=1.1.1
|
||||
- xorg-libsm=1.2.4
|
||||
- xorg-libx11=1.8.7
|
||||
- xorg-libxau=1.0.11
|
||||
- xorg-libxdmcp=1.1.3
|
||||
- xorg-libxext=1.3.4
|
||||
- xorg-libxfixes=5.0.3
|
||||
- xorg-libxi=1.7.10
|
||||
- xorg-libxrender=0.9.11
|
||||
- xorg-libxt=1.3.0
|
||||
- xorg-libxtst=1.2.3
|
||||
- xorg-recordproto=1.14.2
|
||||
- xorg-renderproto=0.11.1
|
||||
- xorg-xextproto=7.3.0
|
||||
- xorg-xf86vidmodeproto=2.3.1
|
||||
- xorg-xproto=7.0.31
|
||||
- xyzservices=2023.10.1
|
||||
- xz=5.2.6
|
||||
- yaml=0.2.5
|
||||
- yte=1.5.4
|
||||
- zict=3.0.0
|
||||
- zipp=3.17.0
|
||||
- zlib=1.2.13
|
||||
- zlib-ng=2.0.7
|
||||
- zstd=1.5.5
|
||||
- _libgcc_mutex=0.1=conda_forge
|
||||
- _openmp_mutex=4.5=2_gnu
|
||||
- affine=2.4.0=pyhd8ed1ab_0
|
||||
- alsa-lib=1.2.11=hd590300_1
|
||||
- ampl-mp=3.1.0=h2cc385e_1006
|
||||
- amply=0.1.6=pyhd8ed1ab_0
|
||||
- appdirs=1.4.4=pyh9f0ad1d_0
|
||||
- argparse-dataclass=2.0.0=pyhd8ed1ab_0
|
||||
- asttokens=2.4.1=pyhd8ed1ab_0
|
||||
- atk-1.0=2.38.0=h04ea711_2
|
||||
- atlite=0.2.12=pyhd8ed1ab_0
|
||||
- attr=2.5.1=h166bdaf_1
|
||||
- attrs=23.2.0=pyh71513ae_0
|
||||
- aws-c-auth=0.7.18=he0b1f16_0
|
||||
- aws-c-cal=0.6.11=heb1d5e4_0
|
||||
- aws-c-common=0.9.15=hd590300_0
|
||||
- aws-c-compression=0.2.18=hce8ee76_3
|
||||
- aws-c-event-stream=0.4.2=h01f5eca_8
|
||||
- aws-c-http=0.8.1=hdb68c23_10
|
||||
- aws-c-io=0.14.7=hbfbeace_6
|
||||
- aws-c-mqtt=0.10.4=h50844eb_0
|
||||
- aws-c-s3=0.5.7=h6be9164_2
|
||||
- aws-c-sdkutils=0.1.15=hce8ee76_3
|
||||
- aws-checksums=0.1.18=hce8ee76_3
|
||||
- aws-crt-cpp=0.26.8=h2150271_2
|
||||
- aws-sdk-cpp=1.11.267=hddb5a97_7
|
||||
- azure-core-cpp=1.11.1=h91d86a7_1
|
||||
- azure-identity-cpp=1.6.0=hf1915f5_1
|
||||
- azure-storage-blobs-cpp=12.10.0=h00ab1b0_1
|
||||
- azure-storage-common-cpp=12.5.0=h94269e2_4
|
||||
- beautifulsoup4=4.12.3=pyha770c72_0
|
||||
- blosc=1.21.5=hc2324a3_1
|
||||
- bokeh=3.4.1=pyhd8ed1ab_0
|
||||
- bottleneck=1.3.8=py311h1f0f07a_0
|
||||
- branca=0.7.2=pyhd8ed1ab_0
|
||||
- brotli=1.1.0=hd590300_1
|
||||
- brotli-bin=1.1.0=hd590300_1
|
||||
- brotli-python=1.1.0=py311hb755f60_1
|
||||
- bzip2=1.0.8=hd590300_5
|
||||
- c-ares=1.28.1=hd590300_0
|
||||
- c-blosc2=2.14.4=hb4ffafa_1
|
||||
- ca-certificates=2024.2.2=hbcca054_0
|
||||
- cads-api-client=1.0.0=pyhd8ed1ab_0
|
||||
- cairo=1.18.0=h3faef2a_0
|
||||
- cartopy=0.23.0=py311h320fe9a_0
|
||||
- cdsapi=0.7.0=pyhd8ed1ab_0
|
||||
- certifi=2024.2.2=pyhd8ed1ab_0
|
||||
- cffi=1.16.0=py311hb3a22ac_0
|
||||
- cfgv=3.3.1=pyhd8ed1ab_0
|
||||
- cfitsio=4.4.0=hbdc6101_1
|
||||
- cftime=1.6.3=py311h1f0f07a_0
|
||||
- charset-normalizer=3.3.2=pyhd8ed1ab_0
|
||||
- click=8.1.7=unix_pyh707e725_0
|
||||
- click-plugins=1.1.1=py_0
|
||||
- cligj=0.7.2=pyhd8ed1ab_1
|
||||
- cloudpickle=3.0.0=pyhd8ed1ab_0
|
||||
- coin-or-cbc=2.10.10=h9002f0b_0
|
||||
- coin-or-cgl=0.60.7=h516709c_0
|
||||
- coin-or-clp=1.17.8=h1ee7a9c_0
|
||||
- coin-or-osi=0.108.10=haf5fa05_0
|
||||
- coin-or-utils=2.11.11=hee58242_0
|
||||
- coincbc=2.10.10=0_metapackage
|
||||
- colorama=0.4.6=pyhd8ed1ab_0
|
||||
- conda-inject=1.3.1=pyhd8ed1ab_0
|
||||
- configargparse=1.7=pyhd8ed1ab_0
|
||||
- connection_pool=0.0.3=pyhd3deb0d_0
|
||||
- contourpy=1.2.1=py311h9547e67_0
|
||||
- country_converter=1.2=pyhd8ed1ab_0
|
||||
- cppad=20240000.4=h59595ed_0
|
||||
- cycler=0.12.1=pyhd8ed1ab_0
|
||||
- cytoolz=0.12.3=py311h459d7ec_0
|
||||
- dask=2024.4.2=pyhd8ed1ab_0
|
||||
- dask-core=2024.4.2=pyhd8ed1ab_0
|
||||
- dask-expr=1.0.14=pyhd8ed1ab_0
|
||||
- datrie=0.8.2=py311h459d7ec_7
|
||||
- dbus=1.13.6=h5008d03_3
|
||||
- decorator=5.1.1=pyhd8ed1ab_0
|
||||
- deprecation=2.1.0=pyh9f0ad1d_0
|
||||
- descartes=1.1.0=py_4
|
||||
- distlib=0.3.8=pyhd8ed1ab_0
|
||||
- distributed=2024.4.2=pyhd8ed1ab_0
|
||||
- distro=1.9.0=pyhd8ed1ab_0
|
||||
- docutils=0.21.2=pyhd8ed1ab_0
|
||||
- dpath=2.1.6=pyha770c72_0
|
||||
- entsoe-py=0.6.7=pyhd8ed1ab_0
|
||||
- et_xmlfile=1.1.0=pyhd8ed1ab_0
|
||||
- exceptiongroup=1.2.0=pyhd8ed1ab_2
|
||||
- executing=2.0.1=pyhd8ed1ab_0
|
||||
- expat=2.6.2=h59595ed_0
|
||||
- filelock=3.14.0=pyhd8ed1ab_0
|
||||
- fiona=1.9.6=py311hf8e0aa6_0
|
||||
- fmt=10.2.1=h00ab1b0_0
|
||||
- folium=0.16.0=pyhd8ed1ab_0
|
||||
- font-ttf-dejavu-sans-mono=2.37=hab24e00_0
|
||||
- font-ttf-inconsolata=3.000=h77eed37_0
|
||||
- font-ttf-source-code-pro=2.038=h77eed37_0
|
||||
- font-ttf-ubuntu=0.83=h77eed37_2
|
||||
- fontconfig=2.14.2=h14ed4e7_0
|
||||
- fonts-conda-ecosystem=1=0
|
||||
- fonts-conda-forge=1=0
|
||||
- fonttools=4.51.0=py311h459d7ec_0
|
||||
- freetype=2.12.1=h267a509_2
|
||||
- freexl=2.0.0=h743c826_0
|
||||
- fribidi=1.0.10=h36c2ea0_0
|
||||
- fsspec=2024.3.1=pyhca7485f_0
|
||||
- gdal=3.8.5=py311hd032c08_2
|
||||
- gdk-pixbuf=2.42.11=hb9ae30d_0
|
||||
- geographiclib=2.0=pyhd8ed1ab_0
|
||||
- geojson-rewind=1.1.0=pyhd8ed1ab_0
|
||||
- geopandas=0.14.4=pyhd8ed1ab_0
|
||||
- geopandas-base=0.14.4=pyha770c72_0
|
||||
- geopy=2.4.1=pyhd8ed1ab_1
|
||||
- geos=3.12.1=h59595ed_0
|
||||
- geotiff=1.7.1=h6cf1f90_16
|
||||
- gettext=0.22.5=h59595ed_2
|
||||
- gettext-tools=0.22.5=h59595ed_2
|
||||
- gflags=2.2.2=he1b5a44_1004
|
||||
- giflib=5.2.2=hd590300_0
|
||||
- gitdb=4.0.11=pyhd8ed1ab_0
|
||||
- gitpython=3.1.43=pyhd8ed1ab_0
|
||||
- glib=2.80.0=hf2295e7_6
|
||||
- glib-tools=2.80.0=hde27a5a_6
|
||||
- glog=0.7.0=hed5481d_0
|
||||
- glpk=5.0=h445213a_0
|
||||
- gmp=6.3.0=h59595ed_1
|
||||
- graphite2=1.3.13=h59595ed_1003
|
||||
- graphviz=9.0.0=h78e8752_1
|
||||
- gst-plugins-base=1.24.1=hfa15dee_2
|
||||
- gstreamer=1.24.1=h98fc4e7_2
|
||||
- gtk2=2.24.33=h280cfa0_4
|
||||
- gts=0.7.6=h977cf35_4
|
||||
- harfbuzz=8.4.0=h3d44ed6_0
|
||||
- hdf4=4.2.15=h2a13503_7
|
||||
- hdf5=1.14.3=nompi_h4f84152_101
|
||||
- humanfriendly=10.0=pyhd8ed1ab_6
|
||||
- icu=73.2=h59595ed_0
|
||||
- identify=2.5.36=pyhd8ed1ab_0
|
||||
- idna=3.7=pyhd8ed1ab_0
|
||||
- immutables=0.20=py311h459d7ec_1
|
||||
- importlib-metadata=7.1.0=pyha770c72_0
|
||||
- importlib_metadata=7.1.0=hd8ed1ab_0
|
||||
- importlib_resources=6.4.0=pyhd8ed1ab_0
|
||||
- iniconfig=2.0.0=pyhd8ed1ab_0
|
||||
- ipopt=3.14.16=hf967516_0
|
||||
- ipython=8.22.2=pyh707e725_0
|
||||
- jedi=0.19.1=pyhd8ed1ab_0
|
||||
- jinja2=3.1.3=pyhd8ed1ab_0
|
||||
- joblib=1.4.2=pyhd8ed1ab_0
|
||||
- json-c=0.17=h7ab15ed_0
|
||||
- jsonschema=4.22.0=pyhd8ed1ab_0
|
||||
- jsonschema-specifications=2023.12.1=pyhd8ed1ab_0
|
||||
- jupyter_core=5.7.2=py311h38be061_0
|
||||
- kealib=1.5.3=h2f55d51_0
|
||||
- keyutils=1.6.1=h166bdaf_0
|
||||
- kiwisolver=1.4.5=py311h9547e67_1
|
||||
- krb5=1.21.2=h659d440_0
|
||||
- lame=3.100=h166bdaf_1003
|
||||
- lcms2=2.16=hb7c19ff_0
|
||||
- ld_impl_linux-64=2.40=h55db66e_0
|
||||
- lerc=4.0.0=h27087fc_0
|
||||
- libabseil=20240116.2=cxx17_h59595ed_0
|
||||
- libaec=1.1.3=h59595ed_0
|
||||
- libarchive=3.7.2=h2aa1ff5_1
|
||||
- libarrow=15.0.2=hefa796f_6_cpu
|
||||
- libarrow-acero=15.0.2=hbabe93e_6_cpu
|
||||
- libarrow-dataset=15.0.2=hbabe93e_6_cpu
|
||||
- libarrow-flight=15.0.2=hc4f8a93_6_cpu
|
||||
- libarrow-flight-sql=15.0.2=he4f5ca8_6_cpu
|
||||
- libarrow-gandiva=15.0.2=hc1954e9_6_cpu
|
||||
- libarrow-substrait=15.0.2=he4f5ca8_6_cpu
|
||||
- libasprintf=0.22.5=h661eb56_2
|
||||
- libasprintf-devel=0.22.5=h661eb56_2
|
||||
- libblas=3.9.0=22_linux64_openblas
|
||||
- libboost-headers=1.84.0=ha770c72_2
|
||||
- libbrotlicommon=1.1.0=hd590300_1
|
||||
- libbrotlidec=1.1.0=hd590300_1
|
||||
- libbrotlienc=1.1.0=hd590300_1
|
||||
- libcap=2.69=h0f662aa_0
|
||||
- libcblas=3.9.0=22_linux64_openblas
|
||||
- libclang-cpp15=15.0.7=default_h127d8a8_5
|
||||
- libclang13=18.1.4=default_h5d6823c_0
|
||||
- libcrc32c=1.1.2=h9c3ff4c_0
|
||||
- libcups=2.3.3=h4637d8d_4
|
||||
- libcurl=8.7.1=hca28451_0
|
||||
- libdeflate=1.20=hd590300_0
|
||||
- libedit=3.1.20191231=he28a2e2_2
|
||||
- libev=4.33=hd590300_2
|
||||
- libevent=2.1.12=hf998b51_1
|
||||
- libexpat=2.6.2=h59595ed_0
|
||||
- libffi=3.4.2=h7f98852_5
|
||||
- libflac=1.4.3=h59595ed_0
|
||||
- libgcc-ng=13.2.0=h77fa898_6
|
||||
- libgcrypt=1.10.3=hd590300_0
|
||||
- libgd=2.3.3=h119a65a_9
|
||||
- libgdal=3.8.5=hf9625ee_2
|
||||
- libgettextpo=0.22.5=h59595ed_2
|
||||
- libgettextpo-devel=0.22.5=h59595ed_2
|
||||
- libgfortran-ng=13.2.0=h69a702a_6
|
||||
- libgfortran5=13.2.0=h43f5ff8_6
|
||||
- libglib=2.80.0=hf2295e7_6
|
||||
- libgomp=13.2.0=h77fa898_6
|
||||
- libgoogle-cloud=2.23.0=h9be4e54_1
|
||||
- libgoogle-cloud-storage=2.23.0=hc7a4891_1
|
||||
- libgpg-error=1.49=h4f305b6_0
|
||||
- libgrpc=1.62.2=h15f2491_0
|
||||
- libhwloc=2.9.3=default_h554bfaf_1009
|
||||
- libiconv=1.17=hd590300_2
|
||||
- libjpeg-turbo=3.0.0=hd590300_1
|
||||
- libkml=1.3.0=h01aab08_1018
|
||||
- liblapack=3.9.0=22_linux64_openblas
|
||||
- liblapacke=3.9.0=22_linux64_openblas
|
||||
- libllvm15=15.0.7=hb3ce162_4
|
||||
- libllvm16=16.0.6=hb3ce162_3
|
||||
- libllvm18=18.1.4=h2448989_0
|
||||
- libnetcdf=4.9.2=nompi_h9612171_113
|
||||
- libnghttp2=1.58.0=h47da74e_1
|
||||
- libnl=3.9.0=hd590300_0
|
||||
- libnsl=2.0.1=hd590300_0
|
||||
- libogg=1.3.4=h7f98852_1
|
||||
- libopenblas=0.3.27=pthreads_h413a1c8_0
|
||||
- libopus=1.3.1=h7f98852_1
|
||||
- libparquet=15.0.2=hacf5a1f_6_cpu
|
||||
- libpng=1.6.43=h2797004_0
|
||||
- libpq=16.2=h33b98f1_1
|
||||
- libprotobuf=4.25.3=h08a7969_0
|
||||
- libre2-11=2023.09.01=h5a48ba9_2
|
||||
- librsvg=2.58.0=hadf69e7_1
|
||||
- librttopo=1.1.0=h8917695_15
|
||||
- libscotch=7.0.4=h91e35bf_1
|
||||
- libsndfile=1.2.2=hc60ed4a_1
|
||||
- libspatialindex=1.9.3=h9c3ff4c_4
|
||||
- libspatialite=5.1.0=h6f065fc_5
|
||||
- libspral=2024.01.18=h6aa6db2_0
|
||||
- libsqlite=3.45.3=h2797004_0
|
||||
- libssh2=1.11.0=h0841786_0
|
||||
- libstdcxx-ng=13.2.0=hc0a3c3a_6
|
||||
- libsystemd0=255=h3516f8a_1
|
||||
- libthrift=0.19.0=hb90f79a_1
|
||||
- libtiff=4.6.0=h1dd3fc0_3
|
||||
- libutf8proc=2.8.0=h166bdaf_0
|
||||
- libuuid=2.38.1=h0b41bf4_0
|
||||
- libvorbis=1.3.7=h9c3ff4c_0
|
||||
- libwebp=1.4.0=h2c329e2_0
|
||||
- libwebp-base=1.4.0=hd590300_0
|
||||
- libxcb=1.15=h0b41bf4_0
|
||||
- libxcrypt=4.4.36=hd590300_1
|
||||
- libxkbcommon=1.7.0=h662e7e4_0
|
||||
- libxml2=2.12.6=h232c23b_2
|
||||
- libxslt=1.1.39=h76b75d6_0
|
||||
- libzip=1.10.1=h2629f0a_3
|
||||
- libzlib=1.2.13=hd590300_5
|
||||
- linopy=0.3.8=pyhd8ed1ab_0
|
||||
- locket=1.0.0=pyhd8ed1ab_0
|
||||
- lxml=5.2.1=py311hc0a218f_0
|
||||
- lz4=4.3.3=py311h38e4bf4_0
|
||||
- lz4-c=1.9.4=hcb278e6_0
|
||||
- lzo=2.10=hd590300_1001
|
||||
- mapclassify=2.6.1=pyhd8ed1ab_0
|
||||
- markupsafe=2.1.5=py311h459d7ec_0
|
||||
- matplotlib=3.8.4=py311h38be061_0
|
||||
- matplotlib-base=3.8.4=py311h54ef318_0
|
||||
- matplotlib-inline=0.1.7=pyhd8ed1ab_0
|
||||
- memory_profiler=0.61.0=pyhd8ed1ab_0
|
||||
- metis=5.1.0=h59595ed_1007
|
||||
- minizip=4.0.5=h0ab5242_0
|
||||
- mpfr=4.2.1=h9458935_1
|
||||
- mpg123=1.32.6=h59595ed_0
|
||||
- msgpack-python=1.0.7=py311h9547e67_0
|
||||
- multiurl=0.3.1=pyhd8ed1ab_0
|
||||
- mumps-include=5.6.2=ha770c72_4
|
||||
- mumps-seq=5.6.2=hfef103a_4
|
||||
- munkres=1.1.4=pyh9f0ad1d_0
|
||||
- mysql-common=8.3.0=hf1915f5_4
|
||||
- mysql-libs=8.3.0=hca2cd23_4
|
||||
- nbformat=5.10.4=pyhd8ed1ab_0
|
||||
- ncurses=6.4.20240210=h59595ed_0
|
||||
- netcdf4=1.6.5=nompi_py311he8ad708_100
|
||||
- networkx=3.3=pyhd8ed1ab_1
|
||||
- nodeenv=1.8.0=pyhd8ed1ab_0
|
||||
- nomkl=1.0=h5ca1d4c_0
|
||||
- nspr=4.35=h27087fc_0
|
||||
- nss=3.98=h1d7d5a4_0
|
||||
- numexpr=2.9.0=py311h039bad6_100
|
||||
- numpy=1.26.4=py311h64a7726_0
|
||||
- openjdk=22.0.1=hb622114_0
|
||||
- openjpeg=2.5.2=h488ebb8_0
|
||||
- openpyxl=3.1.2=py311h459d7ec_1
|
||||
- openssl=3.3.0=hd590300_0
|
||||
- orc=2.0.0=h17fec99_1
|
||||
- packaging=24.0=pyhd8ed1ab_0
|
||||
- pandas=2.2.2=py311h320fe9a_0
|
||||
- pango=1.52.2=ha41ecd1_0
|
||||
- parso=0.8.4=pyhd8ed1ab_0
|
||||
- partd=1.4.1=pyhd8ed1ab_0
|
||||
- patsy=0.5.6=pyhd8ed1ab_0
|
||||
- pcre2=10.43=hcad00b1_0
|
||||
- pexpect=4.9.0=pyhd8ed1ab_0
|
||||
- pickleshare=0.7.5=py_1003
|
||||
- pillow=10.3.0=py311h18e6fac_0
|
||||
- pip=24.0=pyhd8ed1ab_0
|
||||
- pixman=0.43.2=h59595ed_0
|
||||
- pkgutil-resolve-name=1.3.10=pyhd8ed1ab_1
|
||||
- plac=1.4.3=pyhd8ed1ab_0
|
||||
- platformdirs=4.2.1=pyhd8ed1ab_0
|
||||
- pluggy=1.5.0=pyhd8ed1ab_0
|
||||
- ply=3.11=pyhd8ed1ab_2
|
||||
- poppler=24.04.0=hb6cd0d7_0
|
||||
- poppler-data=0.4.12=hd8ed1ab_0
|
||||
- postgresql=16.2=h82ecc9d_1
|
||||
- powerplantmatching=0.5.14=pyhd8ed1ab_0
|
||||
- pre-commit=3.7.0=pyha770c72_0
|
||||
- progressbar2=4.4.2=pyhd8ed1ab_0
|
||||
- proj=9.4.0=h1d62c97_1
|
||||
- prompt-toolkit=3.0.42=pyha770c72_0
|
||||
- psutil=5.9.8=py311h459d7ec_0
|
||||
- pthread-stubs=0.4=h36c2ea0_1001
|
||||
- ptyprocess=0.7.0=pyhd3deb0d_0
|
||||
- pulp=2.8.0=py311h38be061_0
|
||||
- pulseaudio-client=17.0=hb77b528_0
|
||||
- pure_eval=0.2.2=pyhd8ed1ab_0
|
||||
- py-cpuinfo=9.0.0=pyhd8ed1ab_0
|
||||
- pyarrow=15.0.2=py311hd5e4297_6_cpu
|
||||
- pyarrow-hotfix=0.6=pyhd8ed1ab_0
|
||||
- pycountry=22.3.5=pyhd8ed1ab_0
|
||||
- pycparser=2.22=pyhd8ed1ab_0
|
||||
- pygments=2.17.2=pyhd8ed1ab_0
|
||||
- pyomo=6.6.1=py311hb755f60_0
|
||||
- pyparsing=3.1.2=pyhd8ed1ab_0
|
||||
- pyproj=3.6.1=py311hb3a3e68_6
|
||||
- pypsa=0.27.1=pyhd8ed1ab_0
|
||||
- pyqt=5.15.9=py311hf0fb5b6_5
|
||||
- pyqt5-sip=12.12.2=py311hb755f60_5
|
||||
- pyscipopt=5.0.1=py311hb755f60_0
|
||||
- pyshp=2.3.1=pyhd8ed1ab_0
|
||||
- pysocks=1.7.1=pyha2e5f31_6
|
||||
- pytables=3.9.2=py311h3e8b7c9_2
|
||||
- pytest=8.2.0=pyhd8ed1ab_0
|
||||
- python=3.11.9=hb806964_0_cpython
|
||||
- python-dateutil=2.9.0=pyhd8ed1ab_0
|
||||
- python-fastjsonschema=2.19.1=pyhd8ed1ab_0
|
||||
- python-tzdata=2024.1=pyhd8ed1ab_0
|
||||
- python-utils=3.8.2=pyhd8ed1ab_0
|
||||
- python_abi=3.11=4_cp311
|
||||
- pytz=2024.1=pyhd8ed1ab_0
|
||||
- pyxlsb=1.0.10=pyhd8ed1ab_0
|
||||
- pyyaml=6.0.1=py311h459d7ec_1
|
||||
- qt-main=5.15.8=hc9dc06e_21
|
||||
- rasterio=1.3.10=py311h375a7ea_0
|
||||
- rdma-core=51.0=hd3aeb46_0
|
||||
- re2=2023.09.01=h7f4b329_2
|
||||
- readline=8.2=h8228510_1
|
||||
- referencing=0.35.1=pyhd8ed1ab_0
|
||||
- requests=2.31.0=pyhd8ed1ab_0
|
||||
- reretry=0.11.8=pyhd8ed1ab_0
|
||||
- rioxarray=0.15.5=pyhd8ed1ab_0
|
||||
- rpds-py=0.18.0=py311h46250e7_0
|
||||
- rtree=1.2.0=py311h3bb2b0f_0
|
||||
- s2n=1.4.12=h06160fa_0
|
||||
- scikit-learn=1.4.2=py311hc009520_0
|
||||
- scip=9.0.0=hded5f35_4
|
||||
- scipy=1.13.0=py311h64a7726_0
|
||||
- scotch=7.0.4=h23d43cc_1
|
||||
- seaborn=0.13.2=hd8ed1ab_2
|
||||
- seaborn-base=0.13.2=pyhd8ed1ab_2
|
||||
- setuptools=69.5.1=pyhd8ed1ab_0
|
||||
- setuptools-scm=8.0.4=pyhd8ed1ab_1
|
||||
- setuptools_scm=8.0.4=hd8ed1ab_1
|
||||
- shapely=2.0.4=py311h2032efe_0
|
||||
- sip=6.7.12=py311hb755f60_0
|
||||
- six=1.16.0=pyh6c4a22f_0
|
||||
- smart_open=7.0.4=pyhd8ed1ab_0
|
||||
- smmap=5.0.0=pyhd8ed1ab_0
|
||||
- snakemake-interface-common=1.17.2=pyhdfd78af_0
|
||||
- snakemake-interface-executor-plugins=9.1.1=pyhdfd78af_0
|
||||
- snakemake-interface-report-plugins=1.0.0=pyhdfd78af_0
|
||||
- snakemake-interface-storage-plugins=3.2.2=pyhdfd78af_0
|
||||
- snakemake-minimal=8.11.1=pyhdfd78af_0
|
||||
- snappy=1.2.0=hdb0a2a9_1
|
||||
- snuggs=1.4.7=py_0
|
||||
- sortedcontainers=2.4.0=pyhd8ed1ab_0
|
||||
- soupsieve=2.5=pyhd8ed1ab_1
|
||||
- spdlog=1.13.0=hd2e6256_0
|
||||
- sqlite=3.45.3=h2c6b66d_0
|
||||
- stack_data=0.6.2=pyhd8ed1ab_0
|
||||
- statsmodels=0.14.1=py311h1f0f07a_0
|
||||
- stopit=1.1.2=py_0
|
||||
- tabula-py=2.7.0=py311h38be061_1
|
||||
- tabulate=0.9.0=pyhd8ed1ab_1
|
||||
- tbb=2021.11.0=h00ab1b0_1
|
||||
- tblib=3.0.0=pyhd8ed1ab_0
|
||||
- threadpoolctl=3.5.0=pyhc1e730c_0
|
||||
- throttler=1.2.2=pyhd8ed1ab_0
|
||||
- tiledb=2.22.0=h27f064a_3
|
||||
- tk=8.6.13=noxft_h4845f30_101
|
||||
- toml=0.10.2=pyhd8ed1ab_0
|
||||
- tomli=2.0.1=pyhd8ed1ab_0
|
||||
- toolz=0.12.1=pyhd8ed1ab_0
|
||||
- toposort=1.10=pyhd8ed1ab_0
|
||||
- tornado=6.4=py311h459d7ec_0
|
||||
- tqdm=4.66.2=pyhd8ed1ab_0
|
||||
- traitlets=5.14.3=pyhd8ed1ab_0
|
||||
- typing-extensions=4.11.0=hd8ed1ab_0
|
||||
- typing_extensions=4.11.0=pyha770c72_0
|
||||
- tzcode=2024a=h3f72095_0
|
||||
- tzdata=2024a=h0c530f3_0
|
||||
- ucx=1.15.0=ha691c75_8
|
||||
- ukkonen=1.0.1=py311h9547e67_4
|
||||
- unidecode=1.3.8=pyhd8ed1ab_0
|
||||
- unixodbc=2.3.12=h661eb56_0
|
||||
- uriparser=0.9.7=h59595ed_1
|
||||
- urllib3=2.2.1=pyhd8ed1ab_0
|
||||
- validators=0.28.1=pyhd8ed1ab_0
|
||||
- virtualenv=20.26.1=pyhd8ed1ab_0
|
||||
- wcwidth=0.2.13=pyhd8ed1ab_0
|
||||
- wheel=0.43.0=pyhd8ed1ab_1
|
||||
- wrapt=1.16.0=py311h459d7ec_0
|
||||
- xarray=2024.3.0=pyhd8ed1ab_0
|
||||
- xcb-util=0.4.0=hd590300_1
|
||||
- xcb-util-image=0.4.0=h8ee46fc_1
|
||||
- xcb-util-keysyms=0.4.0=h8ee46fc_1
|
||||
- xcb-util-renderutil=0.3.9=hd590300_1
|
||||
- xcb-util-wm=0.4.1=h8ee46fc_1
|
||||
- xerces-c=3.2.5=hac6953d_0
|
||||
- xkeyboard-config=2.41=hd590300_0
|
||||
- xlrd=2.0.1=pyhd8ed1ab_3
|
||||
- xorg-fixesproto=5.0=h7f98852_1002
|
||||
- xorg-inputproto=2.3.2=h7f98852_1002
|
||||
- xorg-kbproto=1.0.7=h7f98852_1002
|
||||
- xorg-libice=1.1.1=hd590300_0
|
||||
- xorg-libsm=1.2.4=h7391055_0
|
||||
- xorg-libx11=1.8.9=h8ee46fc_0
|
||||
- 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:
|
||||
- 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
|
||||
|
@ -20,12 +20,12 @@ dependencies:
|
||||
- openpyxl!=3.1.1
|
||||
- pycountry
|
||||
- seaborn
|
||||
- snakemake-minimal>=8.5
|
||||
- snakemake-minimal>=8.11
|
||||
- memory_profiler
|
||||
- yaml
|
||||
- pytables
|
||||
- lxml
|
||||
- powerplantmatching>=0.5.5,!=0.5.9
|
||||
- powerplantmatching>=0.5.13
|
||||
- numpy
|
||||
- pandas>=2.1
|
||||
- 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"),
|
||||
europe_shape=resources("europe_shape.geojson"),
|
||||
output:
|
||||
resources("networks/base.nc"),
|
||||
base_network=resources("networks/base.nc"),
|
||||
regions_onshore=resources("regions_onshore.geojson"),
|
||||
regions_offshore=resources("regions_offshore.geojson"),
|
||||
log:
|
||||
logs("base_network.log"),
|
||||
benchmark:
|
||||
@ -127,27 +129,6 @@ rule build_shapes:
|
||||
"../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):
|
||||
|
||||
rule build_cutout:
|
||||
@ -412,7 +393,7 @@ rule add_electricity:
|
||||
else resources("networks/base.nc")
|
||||
),
|
||||
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"),
|
||||
powerplants=resources("powerplants.csv"),
|
||||
@ -457,7 +438,7 @@ rule simplify_network:
|
||||
input:
|
||||
network=resources("networks/elec.nc"),
|
||||
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_offshore=resources("regions_offshore.geojson"),
|
||||
@ -466,7 +447,6 @@ rule simplify_network:
|
||||
regions_onshore=resources("regions_onshore_elec_s{simpl}.geojson"),
|
||||
regions_offshore=resources("regions_offshore_elec_s{simpl}.geojson"),
|
||||
busmap=resources("busmap_elec_s{simpl}.csv"),
|
||||
connection_costs=resources("connection_costs_s{simpl}.csv"),
|
||||
log:
|
||||
logs("simplify_network/elec_s{simpl}.log"),
|
||||
benchmark:
|
||||
@ -506,7 +486,7 @@ rule cluster_network:
|
||||
else []
|
||||
),
|
||||
tech_costs=lambda w: resources(
|
||||
f"costs_{config_provider('costs', 'year')(w)}.csv"
|
||||
f"costs_{config_provider('costs', 'year') (w)}.csv"
|
||||
),
|
||||
output:
|
||||
network=resources("networks/elec_s{simpl}_{clusters}.nc"),
|
||||
@ -535,7 +515,7 @@ rule add_extra_components:
|
||||
input:
|
||||
network=resources("networks/elec_s{simpl}_{clusters}.nc"),
|
||||
tech_costs=lambda w: resources(
|
||||
f"costs_{config_provider('costs', 'year')(w)}.csv"
|
||||
f"costs_{config_provider('costs', 'year') (w)}.csv"
|
||||
),
|
||||
output:
|
||||
resources("networks/elec_s{simpl}_{clusters}_ec.nc"),
|
||||
@ -570,7 +550,7 @@ rule prepare_network:
|
||||
input:
|
||||
resources("networks/elec_s{simpl}_{clusters}_ec.nc"),
|
||||
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 [],
|
||||
output:
|
||||
|
@ -55,24 +55,6 @@ if config["enable"]["retrieve"] and config["enable"].get("retrieve_databundle",
|
||||
"../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):
|
||||
|
||||
rule retrieve_cutout:
|
||||
|
@ -26,9 +26,6 @@ rule add_existing_baseyear:
|
||||
existing_heating_distribution=resources(
|
||||
"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:
|
||||
RESULTS
|
||||
+ "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="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:
|
||||
RESULTS
|
||||
+ "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 numpy as np
|
||||
import pandas as pd
|
||||
import powerplantmatching as pm
|
||||
import pypsa
|
||||
import xarray as xr
|
||||
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
|
||||
power plants.
|
||||
"""
|
||||
carriers = {"solar": "solar", "onwind": "onwind", "offwind": "offwind-ac"}
|
||||
tech_map = {"solar": "PV", "onwind": "Onshore", "offwind": "Offshore"}
|
||||
|
||||
for tech in ["solar", "onwind", "offwind"]:
|
||||
carrier = carriers[tech]
|
||||
countries = snakemake.config["countries"]
|
||||
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.index = cc.convert(df.index, to="iso2")
|
||||
|
||||
# calculate yearly differences
|
||||
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 node in nodal_df.index:
|
||||
name = f"{node}-{tech}-{year}"
|
||||
name = f"{node}-{carrier}-{year}"
|
||||
capacity = nodal_df.loc[node, year]
|
||||
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, "DateIn"] = year
|
||||
df_agg.at[name, "lifetime"] = costs.at[tech, "lifetime"]
|
||||
df_agg.at[name, "DateOut"] = year + costs.at[tech, "lifetime"] - 1
|
||||
df_agg.at[name, "lifetime"] = costs.at[carrier, "lifetime"]
|
||||
df_agg.at[name, "DateOut"] = (
|
||||
year + costs.at[carrier, "lifetime"] - 1
|
||||
)
|
||||
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(
|
||||
"Generator",
|
||||
new_capacity.index,
|
||||
suffix=" " + name_suffix,
|
||||
suffix=name_suffix,
|
||||
bus=new_capacity.index,
|
||||
carrier=generator,
|
||||
p_nom=new_capacity,
|
||||
|
@ -5,10 +5,7 @@
|
||||
|
||||
# coding: utf-8
|
||||
"""
|
||||
Creates the network topology from a `ENTSO-E map extract.
|
||||
|
||||
<https://github.com/PyPSA/GridKit/tree/master/entsoe>`_ (March 2022) as a PyPSA
|
||||
network.
|
||||
Creates the network topology from an `ENTSO-E map extract <https://github.com/PyPSA/GridKit/tree/master/entsoe>`_ (March 2022) as a PyPSA network.
|
||||
|
||||
Relevant Settings
|
||||
-----------------
|
||||
@ -59,8 +56,19 @@ Outputs
|
||||
.. image:: img/base.png
|
||||
: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
|
||||
-----------
|
||||
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
|
||||
@ -75,11 +83,11 @@ import shapely
|
||||
import shapely.prepared
|
||||
import shapely.wkt
|
||||
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 scipy import spatial
|
||||
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")
|
||||
|
||||
@ -698,6 +706,22 @@ def _adjust_capacities_of_under_construction_branches(n, config):
|
||||
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(
|
||||
eg_buses,
|
||||
eg_converters,
|
||||
@ -758,9 +782,150 @@ def base_network(
|
||||
|
||||
n = _adjust_capacities_of_under_construction_branches(n, config)
|
||||
|
||||
_set_shapes(n, country_shapes, offshore_shapes)
|
||||
|
||||
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 "snakemake" not in globals():
|
||||
from _helpers import mock_snakemake
|
||||
@ -784,5 +949,22 @@ if __name__ == "__main__":
|
||||
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.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[
|
||||
start - delta : stop - delta, cntry
|
||||
].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)
|
||||
load_raw = load_timeseries(fn_load, duration, [cntry])
|
||||
load.loc[start:stop, cntry] = load_raw.loc[
|
||||
@ -311,6 +311,8 @@ if __name__ == "__main__":
|
||||
logger.info("Supplement missing data with synthetic data.")
|
||||
fn = snakemake.input.synthetic
|
||||
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]
|
||||
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)
|
||||
|
||||
# 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]
|
||||
|
||||
|
@ -135,6 +135,7 @@ import pypsa
|
||||
import seaborn as sns
|
||||
from _helpers import configure_logging, set_scenario_config, update_p_nom_max
|
||||
from add_electricity import load_costs
|
||||
from base_network import append_bus_shapes
|
||||
from packaging.version import Version, parse
|
||||
from pypsa.clustering.spatial import (
|
||||
busmap_by_greedy_modularity,
|
||||
@ -428,20 +429,27 @@ def clustering_for_n_clusters(
|
||||
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])
|
||||
|
||||
for which in ("regions_onshore", "regions_offshore"):
|
||||
regions = gpd.read_file(getattr(input, which))
|
||||
regions = regions.reindex(columns=["name", "geometry"]).set_index("name")
|
||||
regions_c = regions.dissolve(busmap)
|
||||
regions_c.index.name = "name"
|
||||
regions_c = regions_c.reset_index()
|
||||
regions_c.to_file(getattr(output, which))
|
||||
regions = regions.reindex(columns=["name", "geometry"]).set_index("name")
|
||||
regions_c = regions.dissolve(busmap)
|
||||
regions_c.index.name = "name"
|
||||
return regions_c.reset_index()
|
||||
|
||||
|
||||
def plot_busmap_for_n_clusters(n, n_clusters, fn=None):
|
||||
busmap = busmap_for_n_clusters(n, n_clusters)
|
||||
def plot_busmap_for_n_clusters(n, n_clusters, solver_name="scip", fn=None):
|
||||
busmap = busmap_for_n_clusters(n, n_clusters, solver_name)
|
||||
cs = busmap.unique()
|
||||
cr = sns.color_palette("hls", len(cs))
|
||||
n.plot(bus_colors=busmap.map(dict(zip(cs, cr))))
|
||||
@ -538,21 +546,25 @@ if __name__ == "__main__":
|
||||
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"):
|
||||
labels = [f" {label} efficiency" for label in ["low", "medium", "high"]]
|
||||
nc = clustering.network
|
||||
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 (
|
||||
"busmap",
|
||||
"linemap",
|
||||
): # also available: linemap_positive, linemap_negative
|
||||
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_cc = nodes + " gas for industry CC"
|
||||
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:
|
||||
spatial.gas.nodes = ["EU gas"]
|
||||
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
|
||||
from functools import reduce
|
||||
|
||||
import geopandas as gpd
|
||||
import numpy as np
|
||||
import pandas as pd
|
||||
import pypsa
|
||||
import scipy as sp
|
||||
from _helpers import configure_logging, set_scenario_config, update_p_nom_max
|
||||
from add_electricity import load_costs
|
||||
from base_network import append_bus_shapes
|
||||
from cluster_network import cluster_regions, clustering_for_n_clusters
|
||||
from pypsa.clustering.spatial import (
|
||||
aggregateoneport,
|
||||
@ -207,7 +209,7 @@ def _compute_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 = {}
|
||||
for tech in connection_costs_to_bus:
|
||||
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
|
||||
pd.DataFrame(connection_costs).to_csv(output.connection_costs)
|
||||
|
||||
|
||||
def _aggregate_and_move_components(
|
||||
n,
|
||||
busmap,
|
||||
connection_costs_to_bus,
|
||||
output,
|
||||
aggregate_one_ports={"Load", "StorageUnit"},
|
||||
aggregation_strategies=dict(),
|
||||
exclude_carriers=None,
|
||||
@ -248,7 +248,7 @@ def _aggregate_and_move_components(
|
||||
if not df.empty:
|
||||
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"]
|
||||
|
||||
@ -281,7 +281,6 @@ def simplify_links(
|
||||
length_factor,
|
||||
p_max_pu,
|
||||
exclude_carriers,
|
||||
output,
|
||||
aggregation_strategies=dict(),
|
||||
):
|
||||
## Complex multi-node links are folded into end-points
|
||||
@ -406,7 +405,6 @@ def simplify_links(
|
||||
n,
|
||||
busmap,
|
||||
connection_costs_to_bus,
|
||||
output,
|
||||
aggregation_strategies=aggregation_strategies,
|
||||
exclude_carriers=exclude_carriers,
|
||||
)
|
||||
@ -419,7 +417,6 @@ def remove_stubs(
|
||||
renewable_carriers,
|
||||
length_factor,
|
||||
simplify_network,
|
||||
output,
|
||||
aggregation_strategies=dict(),
|
||||
):
|
||||
logger.info("Removing stubs")
|
||||
@ -436,7 +433,6 @@ def remove_stubs(
|
||||
n,
|
||||
busmap,
|
||||
connection_costs_to_bus,
|
||||
output,
|
||||
aggregation_strategies=aggregation_strategies,
|
||||
exclude_carriers=simplify_network["exclude_carriers"],
|
||||
)
|
||||
@ -556,7 +552,6 @@ if __name__ == "__main__":
|
||||
params.length_factor,
|
||||
params.p_max_pu,
|
||||
params.simplify_network["exclude_carriers"],
|
||||
snakemake.output,
|
||||
params.aggregation_strategies,
|
||||
)
|
||||
|
||||
@ -569,7 +564,6 @@ if __name__ == "__main__":
|
||||
params.renewable_carriers,
|
||||
params.length_factor,
|
||||
params.simplify_network,
|
||||
snakemake.output,
|
||||
aggregation_strategies=params.aggregation_strategies,
|
||||
)
|
||||
busmaps.append(stub_map)
|
||||
@ -610,6 +604,7 @@ if __name__ == "__main__":
|
||||
n.lines.drop(remove, axis=1, errors="ignore", inplace=True)
|
||||
|
||||
if snakemake.wildcards.simpl:
|
||||
shapes = n.shapes
|
||||
n, cluster_map = cluster(
|
||||
n,
|
||||
int(snakemake.wildcards.simpl),
|
||||
@ -619,14 +614,19 @@ if __name__ == "__main__":
|
||||
params.simplify_network["feature"],
|
||||
params.aggregation_strategies,
|
||||
)
|
||||
n.shapes = shapes
|
||||
busmaps.append(cluster_map)
|
||||
|
||||
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.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
|
||||
|
||||
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"]
|
||||
ind = list(
|
||||
{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
|
||||
].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)
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user