diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 6384b2c3..bad6039f 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -31,7 +31,7 @@ jobs: os: - ubuntu-latest - macos-latest -# - windows-latest + - windows-latest inhouse: - stable - master diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 055b9080..3ffe8d9e 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -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 diff --git a/Snakefile b/Snakefile index ba93a869..e6980708 100644 --- a/Snakefile +++ b/Snakefile @@ -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 diff --git a/config/config.default.yaml b/config/config.default.yaml index 78fd1c59..6a5c6f3f 100644 --- a/config/config.default.yaml +++ b/config/config.default.yaml @@ -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" diff --git a/data/existing_infrastructure/offwind_capacity_IRENA.csv b/data/existing_infrastructure/offwind_capacity_IRENA.csv deleted file mode 100644 index d2a3f0f1..00000000 --- a/data/existing_infrastructure/offwind_capacity_IRENA.csv +++ /dev/null @@ -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 diff --git a/data/existing_infrastructure/onwind_capacity_IRENA.csv b/data/existing_infrastructure/onwind_capacity_IRENA.csv deleted file mode 100644 index cd5ac19c..00000000 --- a/data/existing_infrastructure/onwind_capacity_IRENA.csv +++ /dev/null @@ -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 diff --git a/data/existing_infrastructure/solar_capacity_IRENA.csv b/data/existing_infrastructure/solar_capacity_IRENA.csv deleted file mode 100644 index 01683f8d..00000000 --- a/data/existing_infrastructure/solar_capacity_IRENA.csv +++ /dev/null @@ -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 diff --git a/doc/configtables/enable.csv b/doc/configtables/enable.csv index 15c12cf9..c74d0eff 100644 --- a/doc/configtables/enable.csv +++ b/doc/configtables/enable.csv @@ -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 `_." 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" diff --git a/doc/configtables/solving.csv b/doc/configtables/solving.csv index 7189399b..4d245195 100644 --- a/doc/configtables/solving.csv +++ b/doc/configtables/solving.csv @@ -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. diff --git a/doc/img/intro-workflow.png b/doc/img/intro-workflow.png index 27b5a389..a273ab39 100644 Binary files a/doc/img/intro-workflow.png and b/doc/img/intro-workflow.png differ diff --git a/doc/img/workflow.png b/doc/img/workflow.png new file mode 100644 index 00000000..96ce7f37 Binary files /dev/null and b/doc/img/workflow.png differ diff --git a/doc/index.rst b/doc/index.rst index 07ee28d1..8a523ea0 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -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 diff --git a/doc/installation.rst b/doc/installation.rst index dd5c912e..45404e1f 100644 --- a/doc/installation.rst +++ b/doc/installation.rst @@ -62,7 +62,7 @@ PyPSA is known to work with the free software - `HiGHS `__ - `Cbc `__ - `GLPK `__ (`WinGLKP `__) -- `Ipopt `__ +- `SCIP `__ 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 diff --git a/doc/preparation.rst b/doc/preparation.rst index edaf5079..06e8b19b 100644 --- a/doc/preparation.rst +++ b/doc/preparation.rst @@ -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 `__ for all substations. +- :mod:`base_network` builds and stores the base network with all buses, HVAC lines and HVDC links, and determines `Voronoi cells `__ 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`` diff --git a/doc/release_notes.rst b/doc/release_notes.rst index 907379da..e80a49c8 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -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) ===================================== diff --git a/doc/retrieve.rst b/doc/retrieve.rst index 85a37dff..6b339355 100644 --- a/doc/retrieve.rst +++ b/doc/retrieve.rst @@ -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`` ================================ diff --git a/doc/tutorial.rst b/doc/tutorial.rst index 843b0fe6..b587e895 100644 --- a/doc/tutorial.rst +++ b/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. diff --git a/doc/tutorial_sector.rst b/doc/tutorial_sector.rst index 26f7dc2d..464d9f42 100644 --- a/doc/tutorial_sector.rst +++ b/doc/tutorial_sector.rst @@ -71,18 +71,16 @@ which were already included in the electricity-only tutorial: add_electricity 1 add_extra_components 1 all 1 - base_network 1 build_ammonia_production 1 build_biomass_potentials 1 - build_bus_regions 1 build_clustered_population_layouts 1 build_cop_profiles 1 build_daily_heat_demand 1 build_district_heat_share 1 - build_electricity_demand 1 build_energy_totals 1 build_gas_input_locations 1 build_gas_network 1 + build_heat_totals 1 build_hourly_heat_demand 1 build_industrial_distribution_key 1 build_industrial_energy_demand_per_country_today 1 @@ -94,19 +92,17 @@ which were already included in the electricity-only tutorial: build_industry_sector_ratios 1 build_industry_sector_ratios_intermediate 1 build_population_layouts 1 - build_population_weighted_energy_totals 1 - build_powerplants 1 + build_population_weighted_energy_totals 2 build_renewable_profiles 4 build_salt_cavern_potentials 1 - build_shapes 1 build_ship_raster 1 build_shipping_demand 1 build_simplified_population_layouts 1 + build_solar_thermal_profiles 3 build_temperature_profiles 3 build_transport_demand 1 cluster_gas_network 1 cluster_network 1 - copy_config 1 make_summary 1 plot_gas_network 1 plot_hydrogen_network 1 @@ -116,12 +112,14 @@ which were already included in the electricity-only tutorial: prepare_network 1 prepare_sector_network 1 retrieve_cost_data 1 + retrieve_cutout 1 retrieve_databundle 1 retrieve_electricity_demand 1 + retrieve_eurostat_data 1 retrieve_gas_infrastructure_data 1 simplify_network 1 solve_sector_network 1 - total 60 + total 63 This covers the retrieval of additional raw data from online resources and preprocessing data about the transport, industry, and heating sectors as well as @@ -140,190 +138,191 @@ successfully. graph[bgcolor=white, margin=0]; node[shape=box, style=rounded, fontname=sans, fontsize=10, penwidth=2]; edge[penwidth=2, color=grey]; - 0[label = "all", color = "0.55 0.6 0.85", style="rounded"]; - 1[label = "plot_summary", color = "0.31 0.6 0.85", style="rounded"]; - 2[label = "make_summary", color = "0.37 0.6 0.85", style="rounded"]; - 3[label = "plot_power_network_clustered", color = "0.50 0.6 0.85", style="rounded"]; - 4[label = "cluster_network\nclusters: 5", color = "0.62 0.6 0.85", style="rounded"]; - 5[label = "simplify_network\nsimpl: ", color = "0.18 0.6 0.85", style="rounded"]; - 6[label = "add_electricity", color = "0.33 0.6 0.85", style="rounded"]; - 7[label = "build_renewable_profiles\ntechnology: solar", color = "0.20 0.6 0.85", style="rounded"]; - 8[label = "base_network", color = "0.31 0.6 0.85", style="rounded"]; - 9[label = "build_shapes", color = "0.36 0.6 0.85", style="rounded"]; - 10[label = "retrieve_databundle", color = "0.29 0.6 0.85", style="rounded"]; - 12[label = "build_bus_regions", color = "0.10 0.6 0.85", style="rounded"]; - 13[label = "retrieve_cutout\ncutout: be-03-2013-era5", color = "0.37 0.6 0.85", style="rounded,dashed"]; - 14[label = "build_renewable_profiles\ntechnology: onwind", color = "0.20 0.6 0.85", style="rounded"]; - 15[label = "build_renewable_profiles\ntechnology: offwind-ac", color = "0.20 0.6 0.85", style="rounded"]; - 16[label = "build_ship_raster", color = "0.64 0.6 0.85", style="rounded"]; - 17[label = "retrieve_ship_raster", color = "0.64 0.6 0.85", style="rounded,dashed"]; - 18[label = "build_renewable_profiles\ntechnology: offwind-dc", color = "0.20 0.6 0.85", style="rounded"]; - 19[label = "retrieve_cost_data\nyear: 2030", color = "0.12 0.6 0.85", style="rounded"]; - 20[label = "build_powerplants", color = "0.23 0.6 0.85", style="rounded"]; - 21[label = "build_electricity_demand", color = "0.54 0.6 0.85", style="rounded"]; - 22[label = "retrieve_electricity_demand", color = "0.07 0.6 0.85", style="rounded"]; - 23[label = "solve_sector_network", color = "0.41 0.6 0.85", style="rounded"]; - 24[label = "prepare_sector_network\nsector_opts: CO2L0-24h-T-H-B-I-A-dist1", color = "0.22 0.6 0.85", style="rounded"]; - 25[label = "cluster_gas_network", color = "0.24 0.6 0.85", style="rounded"]; - 26[label = "build_gas_network", color = "0.10 0.6 0.85", style="rounded"]; - 27[label = "retrieve_gas_infrastructure_data", color = "0.17 0.6 0.85", style="rounded"]; - 28[label = "build_gas_input_locations", color = "0.16 0.6 0.85", style="rounded"]; - 29[label = "prepare_network\nll: v1.5\nopts: ", color = "0.49 0.6 0.85", style="rounded"]; - 30[label = "add_extra_components", color = "0.14 0.6 0.85", style="rounded"]; - 31[label = "build_energy_totals", color = "0.39 0.6 0.85", style="rounded"]; - 33[label = "build_population_weighted_energy_totals", color = "0.56 0.6 0.85", style="rounded"]; - 34[label = "build_clustered_population_layouts", color = "0.49 0.6 0.85", style="rounded"]; - 35[label = "build_population_layouts", color = "0.06 0.6 0.85", style="rounded"]; - 36[label = "build_shipping_demand", color = "0.47 0.6 0.85", style="rounded"]; - 37[label = "build_transport_demand", color = "0.45 0.6 0.85", style="rounded"]; - 38[label = "build_temperature_profiles\nscope: total", color = "0.04 0.6 0.85", style="rounded"]; - 39[label = "build_biomass_potentials\nplanning_horizons: 2030", color = "0.11 0.6 0.85", style="rounded"]; - 40[label = "build_salt_cavern_potentials", color = "0.15 0.6 0.85", style="rounded"]; - 41[label = "build_simplified_population_layouts", color = "0.46 0.6 0.85", style="rounded"]; - 42[label = "build_industrial_energy_demand_per_node", color = "0.63 0.6 0.85", style="rounded"]; - 43[label = "build_industry_sector_ratios_intermediate\nplanning_horizons: 2030", color = "0.07 0.6 0.85", style="rounded"]; - 44[label = "build_industry_sector_ratios", color = "0.59 0.6 0.85", style="rounded"]; - 45[label = "build_ammonia_production", color = "0.04 0.6 0.85", style="rounded"]; - 46[label = "build_industrial_energy_demand_per_country_today", color = "0.44 0.6 0.85", style="rounded"]; - 47[label = "build_industrial_production_per_country", color = "0.34 0.6 0.85", style="rounded"]; - 48[label = "build_industrial_production_per_node", color = "0.26 0.6 0.85", style="rounded"]; - 49[label = "build_industrial_distribution_key", color = "0.13 0.6 0.85", style="rounded"]; - 50[label = "build_industrial_production_per_country_tomorrow\nplanning_horizons: 2030", color = "0.32 0.6 0.85", style="rounded"]; - 51[label = "build_industrial_energy_demand_per_node_today", color = "0.48 0.6 0.85", style="rounded"]; - 52[label = "build_hourly_heat_demand", color = "0.28 0.6 0.85", style="rounded"]; - 53[label = "build_daily_heat_demand\nscope: total", color = "0.28 0.6 0.85", style="rounded"]; - 54[label = "build_district_heat_share\nplanning_horizons: 2030", color = "0.52 0.6 0.85", style="rounded"]; - 55[label = "build_temperature_profiles\nscope: rural", color = "0.04 0.6 0.85", style="rounded"]; - 56[label = "build_temperature_profiles\nscope: urban", color = "0.04 0.6 0.85", style="rounded"]; - 57[label = "build_cop_profiles", color = "0.38 0.6 0.85", style="rounded"]; - 58[label = "copy_config", color = "0.19 0.6 0.85", style="rounded"]; - 59[label = "plot_power_network", color = "0.60 0.6 0.85", style="rounded"]; - 60[label = "plot_hydrogen_network", color = "0.27 0.6 0.85", style="rounded"]; - 61[label = "plot_gas_network", color = "0.08 0.6 0.85", style="rounded"]; + 0[label = "all", color = "0.44 0.6 0.85", style="rounded"]; + 1[label = "plot_summary", color = "0.63 0.6 0.85", style="rounded"]; + 2[label = "make_summary", color = "0.59 0.6 0.85", style="rounded"]; + 3[label = "solve_sector_network", color = "0.47 0.6 0.85", style="rounded"]; + 4[label = "prepare_sector_network\nsector_opts: CO2L0-24h-T-H-B-I-A-dist1", color = "0.47 0.6 0.85", style="rounded"]; + 5[label = "build_renewable_profiles\ntechnology: offwind-ac", color = "0.62 0.6 0.85", style="rounded"]; + 6[label = "base_network", color = "0.27 0.6 0.85", style="rounded"]; + 7[label = "build_shapes", color = "0.43 0.6 0.85", style="rounded"]; + 8[label = "retrieve_databundle", color = "0.55 0.6 0.85", style="rounded"]; + 9[label = "build_ship_raster", color = "0.29 0.6 0.85", style="rounded"]; + 10[label = "retrieve_ship_raster", color = "0.33 0.6 0.85", style="rounded"]; + 11[label = "retrieve_cutout\ncutout: be-03-2013-era5", color = "0.06 0.6 0.85", style="rounded"]; + 12[label = "build_renewable_profiles\ntechnology: offwind-dc", color = "0.62 0.6 0.85", style="rounded"]; + 13[label = "cluster_gas_network", color = "0.60 0.6 0.85", style="rounded"]; + 14[label = "build_gas_network", color = "0.34 0.6 0.85", style="rounded"]; + 15[label = "retrieve_gas_infrastructure_data", color = "0.44 0.6 0.85", style="rounded"]; + 16[label = "cluster_network\nclusters: 5", color = "0.03 0.6 0.85", style="rounded"]; + 17[label = "simplify_network\nsimpl: ", color = "0.64 0.6 0.85", style="rounded"]; + 18[label = "add_electricity", color = "0.51 0.6 0.85", style="rounded"]; + 19[label = "build_renewable_profiles\ntechnology: solar", color = "0.62 0.6 0.85", style="rounded"]; + 20[label = "build_renewable_profiles\ntechnology: onwind", color = "0.62 0.6 0.85", style="rounded"]; + 21[label = "retrieve_cost_data\nyear: 2030", color = "0.57 0.6 0.85", style="rounded"]; + 22[label = "build_powerplants", color = "0.39 0.6 0.85", style="rounded"]; + 23[label = "build_electricity_demand", color = "0.22 0.6 0.85", style="rounded"]; + 24[label = "retrieve_electricity_demand", color = "0.09 0.6 0.85", style="rounded"]; + 25[label = "retrieve_synthetic_electricity_demand", color = "0.66 0.6 0.85", style="rounded"]; + 26[label = "build_gas_input_locations", color = "0.50 0.6 0.85", style="rounded"]; + 27[label = "prepare_network\nll: v1.5\nopts: ", color = "0.52 0.6 0.85", style="rounded"]; + 28[label = "add_extra_components", color = "0.02 0.6 0.85", style="rounded"]; + 29[label = "retrieve_eurostat_data", color = "0.04 0.6 0.85", style="rounded,dashed"]; + 30[label = "build_population_weighted_energy_totals\nkind: energy", color = "0.07 0.6 0.85", style="rounded"]; + 31[label = "build_energy_totals", color = "0.24 0.6 0.85", style="rounded"]; + 32[label = "build_clustered_population_layouts", color = "0.38 0.6 0.85", style="rounded"]; + 33[label = "build_population_layouts", color = "0.61 0.6 0.85", style="rounded"]; + 34[label = "build_population_weighted_energy_totals\nkind: heat", color = "0.07 0.6 0.85", style="rounded"]; + 35[label = "build_heat_totals", color = "0.22 0.6 0.85", style="rounded"]; + 36[label = "build_shipping_demand", color = "0.19 0.6 0.85", style="rounded"]; + 37[label = "build_transport_demand", color = "0.42 0.6 0.85", style="rounded"]; + 38[label = "build_temperature_profiles\nscope: total", color = "0.58 0.6 0.85", style="rounded"]; + 39[label = "build_biomass_potentials\nplanning_horizons: 2030", color = "0.18 0.6 0.85", style="rounded"]; + 40[label = "build_salt_cavern_potentials", color = "0.19 0.6 0.85", style="rounded"]; + 41[label = "build_simplified_population_layouts", color = "0.37 0.6 0.85", style="rounded"]; + 42[label = "build_industrial_energy_demand_per_node", color = "0.57 0.6 0.85", style="rounded"]; + 43[label = "build_industry_sector_ratios_intermediate\nplanning_horizons: 2030", color = "0.06 0.6 0.85", style="rounded"]; + 44[label = "build_industry_sector_ratios", color = "0.45 0.6 0.85", style="rounded"]; + 45[label = "build_ammonia_production", color = "0.42 0.6 0.85", style="rounded"]; + 46[label = "build_industrial_energy_demand_per_country_today", color = "0.12 0.6 0.85", style="rounded"]; + 47[label = "build_industrial_production_per_country", color = "0.01 0.6 0.85", style="rounded"]; + 48[label = "build_industrial_production_per_node", color = "0.30 0.6 0.85", style="rounded"]; + 49[label = "build_industrial_distribution_key", color = "0.62 0.6 0.85", style="rounded"]; + 50[label = "build_industrial_production_per_country_tomorrow\nplanning_horizons: 2030", color = "0.13 0.6 0.85", style="rounded"]; + 51[label = "build_industrial_energy_demand_per_node_today", color = "0.29 0.6 0.85", style="rounded"]; + 52[label = "build_hourly_heat_demand", color = "0.24 0.6 0.85", style="rounded"]; + 53[label = "build_daily_heat_demand\nscope: total", color = "0.27 0.6 0.85", style="rounded"]; + 54[label = "build_district_heat_share\nplanning_horizons: 2030", color = "0.46 0.6 0.85", style="rounded"]; + 55[label = "build_temperature_profiles\nscope: rural", color = "0.58 0.6 0.85", style="rounded"]; + 56[label = "build_temperature_profiles\nscope: urban", color = "0.58 0.6 0.85", style="rounded"]; + 57[label = "build_cop_profiles", color = "0.65 0.6 0.85", style="rounded"]; + 58[label = "build_solar_thermal_profiles\nscope: total", color = "0.23 0.6 0.85", style="rounded"]; + 59[label = "build_solar_thermal_profiles\nscope: urban", color = "0.23 0.6 0.85", style="rounded"]; + 60[label = "build_solar_thermal_profiles\nscope: rural", color = "0.23 0.6 0.85", style="rounded"]; + 61[label = "plot_power_network_clustered", color = "0.49 0.6 0.85", style="rounded"]; + 62[label = "plot_power_network", color = "0.05 0.6 0.85", style="rounded"]; + 63[label = "plot_hydrogen_network", color = "0.56 0.6 0.85", style="rounded"]; + 64[label = "plot_gas_network", color = "0.59 0.6 0.85", style="rounded"]; 1 -> 0 2 -> 1 - 32 -> 1 + 29 -> 1 + 8 -> 1 3 -> 2 - 23 -> 2 - 19 -> 2 - 59 -> 2 - 60 -> 2 + 21 -> 2 61 -> 2 + 62 -> 2 + 63 -> 2 + 64 -> 2 4 -> 3 5 -> 4 - 19 -> 4 + 12 -> 4 + 13 -> 4 + 26 -> 4 + 27 -> 4 + 29 -> 4 + 30 -> 4 + 34 -> 4 + 36 -> 4 + 37 -> 4 + 31 -> 4 + 8 -> 4 + 39 -> 4 + 21 -> 4 + 40 -> 4 + 17 -> 4 + 16 -> 4 + 32 -> 4 + 41 -> 4 + 42 -> 4 + 52 -> 4 + 54 -> 4 + 38 -> 4 + 55 -> 4 + 56 -> 4 + 57 -> 4 + 58 -> 4 + 59 -> 4 + 60 -> 4 6 -> 5 - 19 -> 5 - 12 -> 5 + 8 -> 5 + 9 -> 5 + 7 -> 5 + 11 -> 5 7 -> 6 - 14 -> 6 - 15 -> 6 - 18 -> 6 - 8 -> 6 - 19 -> 6 - 12 -> 6 - 20 -> 6 - 10 -> 6 - 21 -> 6 - 9 -> 6 8 -> 7 - 10 -> 7 - 11 -> 7 - 9 -> 7 - 12 -> 7 - 13 -> 7 - 9 -> 8 10 -> 9 - 9 -> 12 + 11 -> 9 + 6 -> 12 8 -> 12 - 8 -> 14 - 10 -> 14 - 11 -> 14 - 9 -> 14 - 12 -> 14 - 13 -> 14 - 8 -> 15 - 10 -> 15 - 11 -> 15 - 16 -> 15 - 9 -> 15 - 12 -> 15 - 13 -> 15 + 9 -> 12 + 7 -> 12 + 11 -> 12 + 14 -> 13 + 16 -> 13 + 15 -> 14 17 -> 16 - 13 -> 16 - 8 -> 18 - 10 -> 18 - 11 -> 18 - 16 -> 18 - 9 -> 18 + 21 -> 16 + 18 -> 17 + 21 -> 17 + 6 -> 17 + 19 -> 18 + 20 -> 18 + 5 -> 18 12 -> 18 - 13 -> 18 + 6 -> 18 + 21 -> 18 + 22 -> 18 + 23 -> 18 + 7 -> 18 + 6 -> 19 + 8 -> 19 + 7 -> 19 + 11 -> 19 + 6 -> 20 8 -> 20 - 22 -> 21 + 7 -> 20 + 11 -> 20 + 6 -> 22 24 -> 23 - 58 -> 23 - 25 -> 24 - 28 -> 24 - 29 -> 24 - 31 -> 24 - 32 -> 24 - 33 -> 24 - 36 -> 24 - 37 -> 24 - 39 -> 24 - 19 -> 24 - 15 -> 24 - 18 -> 24 - 40 -> 24 - 5 -> 24 - 4 -> 24 - 34 -> 24 - 41 -> 24 - 42 -> 24 - 52 -> 24 - 54 -> 24 - 38 -> 24 - 55 -> 24 - 56 -> 24 - 57 -> 24 - 26 -> 25 - 4 -> 25 - 27 -> 26 - 27 -> 28 - 4 -> 28 - 30 -> 29 - 19 -> 29 - 4 -> 30 - 19 -> 30 - 9 -> 31 - 32 -> 31 - 31 -> 33 - 34 -> 33 + 25 -> 23 + 15 -> 26 + 16 -> 26 + 28 -> 27 + 21 -> 27 + 16 -> 28 + 21 -> 28 + 31 -> 30 + 32 -> 30 + 7 -> 31 + 8 -> 31 + 29 -> 31 + 33 -> 32 + 16 -> 32 + 11 -> 32 + 7 -> 33 + 11 -> 33 35 -> 34 - 4 -> 34 - 13 -> 34 - 9 -> 35 - 13 -> 35 - 9 -> 36 - 4 -> 36 + 32 -> 34 + 31 -> 35 + 7 -> 36 + 16 -> 36 31 -> 36 - 34 -> 37 - 33 -> 37 - 31 -> 37 32 -> 37 + 30 -> 37 + 31 -> 37 + 8 -> 37 38 -> 37 - 35 -> 38 - 4 -> 38 - 13 -> 38 - 32 -> 39 - 4 -> 39 - 10 -> 39 - 9 -> 39 - 32 -> 40 - 4 -> 40 - 35 -> 41 - 5 -> 41 - 13 -> 41 + 33 -> 38 + 16 -> 38 + 11 -> 38 + 8 -> 39 + 16 -> 39 + 7 -> 39 + 8 -> 40 + 16 -> 40 + 33 -> 41 + 17 -> 41 + 11 -> 41 43 -> 42 48 -> 42 51 -> 42 @@ -331,41 +330,51 @@ successfully. 46 -> 43 47 -> 43 45 -> 44 - 32 -> 44 - 32 -> 45 - 32 -> 46 + 8 -> 44 + 8 -> 45 + 8 -> 46 47 -> 46 45 -> 47 - 32 -> 47 + 8 -> 47 + 29 -> 47 49 -> 48 50 -> 48 - 4 -> 49 - 34 -> 49 + 16 -> 49 32 -> 49 47 -> 50 49 -> 51 46 -> 51 53 -> 52 - 35 -> 53 - 4 -> 53 - 13 -> 53 + 33 -> 53 + 16 -> 53 + 11 -> 53 31 -> 54 - 34 -> 54 - 35 -> 55 - 4 -> 55 - 13 -> 55 - 35 -> 56 - 4 -> 56 - 13 -> 56 + 32 -> 54 + 33 -> 55 + 16 -> 55 + 11 -> 55 + 33 -> 56 + 16 -> 56 + 11 -> 56 38 -> 57 55 -> 57 56 -> 57 - 23 -> 59 - 4 -> 59 - 23 -> 60 - 4 -> 60 - 23 -> 61 - 4 -> 61 + 33 -> 58 + 16 -> 58 + 11 -> 58 + 33 -> 59 + 16 -> 59 + 11 -> 59 + 33 -> 60 + 16 -> 60 + 11 -> 60 + 16 -> 61 + 3 -> 62 + 16 -> 62 + 3 -> 63 + 16 -> 63 + 3 -> 64 + 16 -> 64 } | @@ -425,229 +434,230 @@ workflow: graph[bgcolor=white, margin=0]; node[shape=box, style=rounded, fontname=sans, fontsize=10, penwidth=2]; edge[penwidth=2, color=grey]; - 0[label = "all", color = "0.46 0.6 0.85", style="rounded"]; - 1[label = "plot_summary", color = "0.40 0.6 0.85", style="rounded"]; - 2[label = "make_summary", color = "0.59 0.6 0.85", style="rounded"]; - 3[label = "plot_power_network_clustered", color = "0.17 0.6 0.85", style="rounded"]; - 4[label = "cluster_network\nclusters: 5", color = "0.49 0.6 0.85", style="rounded"]; - 5[label = "simplify_network\nsimpl: ", color = "0.16 0.6 0.85", style="rounded"]; - 6[label = "add_electricity", color = "0.32 0.6 0.85", style="rounded"]; - 7[label = "build_renewable_profiles\ntechnology: solar", color = "0.63 0.6 0.85", style="rounded"]; - 8[label = "base_network", color = "0.12 0.6 0.85", style="rounded"]; - 9[label = "build_shapes", color = "0.23 0.6 0.85", style="rounded"]; - 10[label = "retrieve_databundle", color = "0.61 0.6 0.85", style="rounded"]; - 12[label = "build_bus_regions", color = "0.51 0.6 0.85", style="rounded"]; - 13[label = "retrieve_cutout\ncutout: be-03-2013-era5", color = "0.37 0.6 0.85", style="rounded,dashed"]; - 14[label = "build_renewable_profiles\ntechnology: onwind", color = "0.63 0.6 0.85", style="rounded"]; - 15[label = "build_renewable_profiles\ntechnology: offwind-ac", color = "0.63 0.6 0.85", style="rounded"]; - 16[label = "build_ship_raster", color = "0.24 0.6 0.85", style="rounded"]; - 17[label = "retrieve_ship_raster", color = "0.14 0.6 0.85", style="rounded,dashed"]; - 18[label = "build_renewable_profiles\ntechnology: offwind-dc", color = "0.63 0.6 0.85", style="rounded"]; - 19[label = "retrieve_cost_data\nyear: 2030", color = "0.04 0.6 0.85", style="rounded"]; - 20[label = "build_powerplants", color = "0.58 0.6 0.85", style="rounded"]; - 21[label = "build_electricity_demand", color = "0.04 0.6 0.85", style="rounded"]; - 22[label = "retrieve_electricity_demand", color = "0.62 0.6 0.85", style="rounded"]; - 23[label = "solve_sector_network_myopic", color = "0.30 0.6 0.85", style="rounded"]; - 24[label = "add_existing_baseyear", color = "0.34 0.6 0.85", style="rounded"]; - 25[label = "prepare_sector_network\nsector_opts: 24h-T-H-B-I-A-dist1", color = "0.42 0.6 0.85", style="rounded"]; - 26[label = "cluster_gas_network", color = "0.39 0.6 0.85", style="rounded"]; - 27[label = "build_gas_network", color = "0.59 0.6 0.85", style="rounded"]; - 28[label = "retrieve_gas_infrastructure_data", color = "0.15 0.6 0.85", style="rounded"]; - 29[label = "build_gas_input_locations", color = "0.07 0.6 0.85", style="rounded"]; - 30[label = "prepare_network\nll: v1.5\nopts: ", color = "0.56 0.6 0.85", style="rounded"]; - 31[label = "add_extra_components", color = "0.11 0.6 0.85", style="rounded"]; - 32[label = "build_energy_totals", color = "0.18 0.6 0.85", style="rounded"]; - 34[label = "build_population_weighted_energy_totals", color = "0.03 0.6 0.85", style="rounded"]; - 35[label = "build_clustered_population_layouts", color = "0.25 0.6 0.85", style="rounded"]; - 36[label = "build_population_layouts", color = "0.57 0.6 0.85", style="rounded"]; - 37[label = "build_shipping_demand", color = "0.45 0.6 0.85", style="rounded"]; - 38[label = "build_transport_demand", color = "0.18 0.6 0.85", style="rounded"]; - 39[label = "build_temperature_profiles\nscope: total", color = "0.54 0.6 0.85", style="rounded"]; - 40[label = "build_biomass_potentials\nplanning_horizons: 2030", color = "0.41 0.6 0.85", style="rounded"]; - 41[label = "build_salt_cavern_potentials", color = "0.02 0.6 0.85", style="rounded"]; - 42[label = "build_simplified_population_layouts", color = "0.15 0.6 0.85", style="rounded"]; - 43[label = "build_industrial_energy_demand_per_node", color = "0.47 0.6 0.85", style="rounded"]; - 44[label = "build_industry_sector_ratios_intermediate\nplanning_horizons: 2030", color = "0.31 0.6 0.85", style="rounded"]; - 45[label = "build_industry_sector_ratios", color = "0.48 0.6 0.85", style="rounded"]; - 46[label = "build_ammonia_production", color = "0.00 0.6 0.85", style="rounded"]; - 47[label = "build_industrial_energy_demand_per_country_today", color = "0.32 0.6 0.85", style="rounded"]; - 48[label = "build_industrial_production_per_country", color = "0.60 0.6 0.85", style="rounded"]; - 49[label = "build_industrial_production_per_node", color = "0.05 0.6 0.85", style="rounded"]; - 50[label = "build_industrial_distribution_key", color = "0.21 0.6 0.85", style="rounded"]; - 51[label = "build_industrial_production_per_country_tomorrow\nplanning_horizons: 2030", color = "0.33 0.6 0.85", style="rounded"]; - 52[label = "build_industrial_energy_demand_per_node_today", color = "0.62 0.6 0.85", style="rounded"]; - 53[label = "build_hourly_heat_demand", color = "0.28 0.6 0.85", style="rounded"]; - 54[label = "build_daily_heat_demand\nscope: total", color = "0.22 0.6 0.85", style="rounded"]; - 55[label = "build_district_heat_share\nplanning_horizons: 2030", color = "0.21 0.6 0.85", style="rounded"]; - 56[label = "build_temperature_profiles\nscope: rural", color = "0.54 0.6 0.85", style="rounded"]; - 57[label = "build_temperature_profiles\nscope: urban", color = "0.54 0.6 0.85", style="rounded"]; - 58[label = "build_cop_profiles", color = "0.52 0.6 0.85", style="rounded"]; - 59[label = "build_existing_heating_distribution", color = "0.09 0.6 0.85", style="rounded"]; - 60[label = "copy_config", color = "0.42 0.6 0.85", style="rounded"]; - 61[label = "solve_sector_network_myopic", color = "0.30 0.6 0.85", style="rounded"]; - 62[label = "add_brownfield", color = "0.10 0.6 0.85", style="rounded"]; - 63[label = "prepare_sector_network\nsector_opts: 24h-T-H-B-I-A-dist1", color = "0.42 0.6 0.85", style="rounded"]; - 64[label = "build_biomass_potentials\nplanning_horizons: 2040", color = "0.41 0.6 0.85", style="rounded"]; - 65[label = "retrieve_cost_data\nyear: 2040", color = "0.04 0.6 0.85", style="rounded"]; - 66[label = "build_industrial_energy_demand_per_node", color = "0.47 0.6 0.85", style="rounded"]; - 67[label = "build_industry_sector_ratios_intermediate\nplanning_horizons: 2040", color = "0.31 0.6 0.85", style="rounded"]; - 68[label = "build_industrial_production_per_node", color = "0.05 0.6 0.85", style="rounded"]; - 69[label = "build_industrial_production_per_country_tomorrow\nplanning_horizons: 2040", color = "0.33 0.6 0.85", style="rounded"]; - 70[label = "build_district_heat_share\nplanning_horizons: 2040", color = "0.21 0.6 0.85", style="rounded"]; - 71[label = "solve_sector_network_myopic", color = "0.30 0.6 0.85", style="rounded"]; - 72[label = "add_brownfield", color = "0.10 0.6 0.85", style="rounded"]; - 73[label = "prepare_sector_network\nsector_opts: 24h-T-H-B-I-A-dist1", color = "0.42 0.6 0.85", style="rounded"]; - 74[label = "build_biomass_potentials\nplanning_horizons: 2050", color = "0.41 0.6 0.85", style="rounded"]; - 75[label = "retrieve_cost_data\nyear: 2050", color = "0.04 0.6 0.85", style="rounded"]; - 76[label = "build_industrial_energy_demand_per_node", color = "0.47 0.6 0.85", style="rounded"]; - 77[label = "build_industry_sector_ratios_intermediate\nplanning_horizons: 2050", color = "0.31 0.6 0.85", style="rounded"]; - 78[label = "build_industrial_production_per_node", color = "0.05 0.6 0.85", style="rounded"]; - 79[label = "build_industrial_production_per_country_tomorrow\nplanning_horizons: 2050", color = "0.33 0.6 0.85", style="rounded"]; - 80[label = "build_district_heat_share\nplanning_horizons: 2050", color = "0.21 0.6 0.85", style="rounded"]; - 81[label = "plot_power_network", color = "0.48 0.6 0.85", style="rounded"]; - 82[label = "plot_power_network", color = "0.48 0.6 0.85", style="rounded"]; - 83[label = "plot_power_network", color = "0.48 0.6 0.85", style="rounded"]; - 84[label = "plot_hydrogen_network", color = "0.37 0.6 0.85", style="rounded"]; - 85[label = "plot_hydrogen_network", color = "0.37 0.6 0.85", style="rounded"]; - 86[label = "plot_hydrogen_network", color = "0.37 0.6 0.85", style="rounded"]; + 0[label = "all", color = "0.30 0.6 0.85", style="rounded"]; + 1[label = "plot_summary", color = "0.58 0.6 0.85", style="rounded"]; + 2[label = "make_summary", color = "0.56 0.6 0.85", style="rounded"]; + 3[label = "solve_sector_network_myopic", color = "0.40 0.6 0.85", style="rounded"]; + 4[label = "add_existing_baseyear", color = "0.22 0.6 0.85", style="rounded"]; + 5[label = "prepare_sector_network\nsector_opts: 24h-T-H-B-I-A-dist1", color = "0.05 0.6 0.85", style="rounded"]; + 6[label = "build_renewable_profiles\ntechnology: offwind-ac", color = "0.58 0.6 0.85", style="rounded"]; + 7[label = "base_network", color = "0.50 0.6 0.85", style="rounded"]; + 8[label = "build_shapes", color = "0.11 0.6 0.85", style="rounded"]; + 9[label = "retrieve_databundle", color = "0.15 0.6 0.85", style="rounded"]; + 10[label = "build_ship_raster", color = "0.07 0.6 0.85", style="rounded"]; + 11[label = "retrieve_ship_raster", color = "0.26 0.6 0.85", style="rounded"]; + 12[label = "retrieve_cutout\ncutout: be-03-2013-era5", color = "0.31 0.6 0.85", style="rounded"]; + 13[label = "build_renewable_profiles\ntechnology: offwind-dc", color = "0.58 0.6 0.85", style="rounded"]; + 14[label = "cluster_gas_network", color = "0.13 0.6 0.85", style="rounded"]; + 15[label = "build_gas_network", color = "0.22 0.6 0.85", style="rounded"]; + 16[label = "retrieve_gas_infrastructure_data", color = "0.08 0.6 0.85", style="rounded"]; + 17[label = "cluster_network\nclusters: 5", color = "0.13 0.6 0.85", style="rounded"]; + 18[label = "simplify_network\nsimpl: ", color = "0.60 0.6 0.85", style="rounded"]; + 19[label = "add_electricity", color = "0.61 0.6 0.85", style="rounded"]; + 20[label = "build_renewable_profiles\ntechnology: solar", color = "0.58 0.6 0.85", style="rounded"]; + 21[label = "build_renewable_profiles\ntechnology: onwind", color = "0.58 0.6 0.85", style="rounded"]; + 22[label = "retrieve_cost_data\nyear: 2030", color = "0.09 0.6 0.85", style="rounded"]; + 23[label = "build_powerplants", color = "0.19 0.6 0.85", style="rounded"]; + 24[label = "build_electricity_demand", color = "0.54 0.6 0.85", style="rounded"]; + 25[label = "retrieve_electricity_demand", color = "0.18 0.6 0.85", style="rounded"]; + 26[label = "retrieve_synthetic_electricity_demand", color = "0.39 0.6 0.85", style="rounded"]; + 27[label = "build_gas_input_locations", color = "0.37 0.6 0.85", style="rounded"]; + 28[label = "prepare_network\nll: v1.5\nopts: ", color = "0.53 0.6 0.85", style="rounded"]; + 29[label = "add_extra_components", color = "0.65 0.6 0.85", style="rounded"]; + 30[label = "retrieve_eurostat_data", color = "0.35 0.6 0.85", style="rounded,dashed"]; + 31[label = "build_population_weighted_energy_totals\nkind: energy", color = "0.60 0.6 0.85", style="rounded"]; + 32[label = "build_energy_totals", color = "0.04 0.6 0.85", style="rounded"]; + 33[label = "build_clustered_population_layouts", color = "0.43 0.6 0.85", style="rounded"]; + 34[label = "build_population_layouts", color = "0.66 0.6 0.85", style="rounded"]; + 35[label = "build_population_weighted_energy_totals\nkind: heat", color = "0.60 0.6 0.85", style="rounded"]; + 36[label = "build_heat_totals", color = "0.62 0.6 0.85", style="rounded"]; + 37[label = "build_shipping_demand", color = "0.36 0.6 0.85", style="rounded"]; + 38[label = "build_transport_demand", color = "0.21 0.6 0.85", style="rounded"]; + 39[label = "build_temperature_profiles\nscope: total", color = "0.14 0.6 0.85", style="rounded"]; + 40[label = "build_biomass_potentials\nplanning_horizons: 2030", color = "0.46 0.6 0.85", style="rounded"]; + 41[label = "build_salt_cavern_potentials", color = "0.46 0.6 0.85", style="rounded"]; + 42[label = "build_simplified_population_layouts", color = "0.55 0.6 0.85", style="rounded"]; + 43[label = "build_industrial_energy_demand_per_node", color = "0.32 0.6 0.85", style="rounded"]; + 44[label = "build_industry_sector_ratios_intermediate\nplanning_horizons: 2030", color = "0.27 0.6 0.85", style="rounded"]; + 45[label = "build_industry_sector_ratios", color = "0.08 0.6 0.85", style="rounded"]; + 46[label = "build_ammonia_production", color = "0.49 0.6 0.85", style="rounded"]; + 47[label = "build_industrial_energy_demand_per_country_today", color = "0.29 0.6 0.85", style="rounded"]; + 48[label = "build_industrial_production_per_country", color = "0.33 0.6 0.85", style="rounded"]; + 49[label = "build_industrial_production_per_node", color = "0.34 0.6 0.85", style="rounded"]; + 50[label = "build_industrial_distribution_key", color = "0.34 0.6 0.85", style="rounded"]; + 51[label = "build_industrial_production_per_country_tomorrow\nplanning_horizons: 2030", color = "0.62 0.6 0.85", style="rounded"]; + 52[label = "build_industrial_energy_demand_per_node_today", color = "0.11 0.6 0.85", style="rounded"]; + 53[label = "build_hourly_heat_demand", color = "0.16 0.6 0.85", style="rounded"]; + 54[label = "build_daily_heat_demand\nscope: total", color = "0.28 0.6 0.85", style="rounded"]; + 55[label = "build_district_heat_share\nplanning_horizons: 2030", color = "0.51 0.6 0.85", style="rounded"]; + 56[label = "build_temperature_profiles\nscope: rural", color = "0.14 0.6 0.85", style="rounded"]; + 57[label = "build_temperature_profiles\nscope: urban", color = "0.14 0.6 0.85", style="rounded"]; + 58[label = "build_cop_profiles", color = "0.51 0.6 0.85", style="rounded"]; + 59[label = "build_solar_thermal_profiles\nscope: total", color = "0.52 0.6 0.85", style="rounded"]; + 60[label = "build_solar_thermal_profiles\nscope: urban", color = "0.52 0.6 0.85", style="rounded"]; + 61[label = "build_solar_thermal_profiles\nscope: rural", color = "0.52 0.6 0.85", style="rounded"]; + 62[label = "build_existing_heating_distribution", color = "0.17 0.6 0.85", style="rounded"]; + 63[label = "solve_sector_network_myopic", color = "0.40 0.6 0.85", style="rounded"]; + 64[label = "add_brownfield", color = "0.00 0.6 0.85", style="rounded"]; + 65[label = "prepare_sector_network\nsector_opts: 24h-T-H-B-I-A-dist1", color = "0.05 0.6 0.85", style="rounded"]; + 66[label = "build_biomass_potentials\nplanning_horizons: 2040", color = "0.46 0.6 0.85", style="rounded"]; + 67[label = "retrieve_cost_data\nyear: 2040", color = "0.09 0.6 0.85", style="rounded"]; + 68[label = "build_industrial_energy_demand_per_node", color = "0.32 0.6 0.85", style="rounded"]; + 69[label = "build_industry_sector_ratios_intermediate\nplanning_horizons: 2040", color = "0.27 0.6 0.85", style="rounded"]; + 70[label = "build_industrial_production_per_node", color = "0.34 0.6 0.85", style="rounded"]; + 71[label = "build_industrial_production_per_country_tomorrow\nplanning_horizons: 2040", color = "0.62 0.6 0.85", style="rounded"]; + 72[label = "build_district_heat_share\nplanning_horizons: 2040", color = "0.51 0.6 0.85", style="rounded"]; + 73[label = "solve_sector_network_myopic", color = "0.40 0.6 0.85", style="rounded"]; + 74[label = "add_brownfield", color = "0.00 0.6 0.85", style="rounded"]; + 75[label = "prepare_sector_network\nsector_opts: 24h-T-H-B-I-A-dist1", color = "0.05 0.6 0.85", style="rounded"]; + 76[label = "build_biomass_potentials\nplanning_horizons: 2050", color = "0.46 0.6 0.85", style="rounded"]; + 77[label = "retrieve_cost_data\nyear: 2050", color = "0.09 0.6 0.85", style="rounded"]; + 78[label = "build_industrial_energy_demand_per_node", color = "0.32 0.6 0.85", style="rounded"]; + 79[label = "build_industry_sector_ratios_intermediate\nplanning_horizons: 2050", color = "0.27 0.6 0.85", style="rounded"]; + 80[label = "build_industrial_production_per_node", color = "0.34 0.6 0.85", style="rounded"]; + 81[label = "build_industrial_production_per_country_tomorrow\nplanning_horizons: 2050", color = "0.62 0.6 0.85", style="rounded"]; + 82[label = "build_district_heat_share\nplanning_horizons: 2050", color = "0.51 0.6 0.85", style="rounded"]; + 83[label = "plot_power_network_clustered", color = "0.02 0.6 0.85", style="rounded"]; + 84[label = "plot_power_network", color = "0.45 0.6 0.85", style="rounded"]; + 85[label = "plot_power_network", color = "0.45 0.6 0.85", style="rounded"]; + 86[label = "plot_power_network", color = "0.45 0.6 0.85", style="rounded"]; + 87[label = "plot_hydrogen_network", color = "0.38 0.6 0.85", style="rounded"]; + 88[label = "plot_hydrogen_network", color = "0.38 0.6 0.85", style="rounded"]; + 89[label = "plot_hydrogen_network", color = "0.38 0.6 0.85", style="rounded"]; 1 -> 0 2 -> 1 - 33 -> 1 + 30 -> 1 + 9 -> 1 3 -> 2 - 23 -> 2 - 61 -> 2 - 71 -> 2 - 19 -> 2 - 81 -> 2 - 82 -> 2 + 63 -> 2 + 73 -> 2 + 22 -> 2 83 -> 2 84 -> 2 85 -> 2 86 -> 2 + 87 -> 2 + 88 -> 2 + 89 -> 2 4 -> 3 + 22 -> 3 5 -> 4 - 19 -> 4 + 23 -> 4 + 18 -> 4 + 17 -> 4 + 33 -> 4 + 22 -> 4 + 58 -> 4 + 62 -> 4 6 -> 5 - 19 -> 5 - 12 -> 5 + 13 -> 5 + 14 -> 5 + 27 -> 5 + 28 -> 5 + 30 -> 5 + 31 -> 5 + 35 -> 5 + 37 -> 5 + 38 -> 5 + 32 -> 5 + 9 -> 5 + 40 -> 5 + 22 -> 5 + 41 -> 5 + 18 -> 5 + 17 -> 5 + 33 -> 5 + 42 -> 5 + 43 -> 5 + 53 -> 5 + 55 -> 5 + 39 -> 5 + 56 -> 5 + 57 -> 5 + 58 -> 5 + 59 -> 5 + 60 -> 5 + 61 -> 5 7 -> 6 - 14 -> 6 - 15 -> 6 - 18 -> 6 - 8 -> 6 - 19 -> 6 - 12 -> 6 - 20 -> 6 - 10 -> 6 - 21 -> 6 9 -> 6 + 10 -> 6 + 8 -> 6 + 12 -> 6 8 -> 7 - 10 -> 7 - 11 -> 7 - 9 -> 7 - 12 -> 7 - 13 -> 7 9 -> 8 - 10 -> 9 - 9 -> 12 - 8 -> 12 - 8 -> 14 - 10 -> 14 - 11 -> 14 - 9 -> 14 - 12 -> 14 - 13 -> 14 - 8 -> 15 - 10 -> 15 - 11 -> 15 + 11 -> 10 + 12 -> 10 + 7 -> 13 + 9 -> 13 + 10 -> 13 + 8 -> 13 + 12 -> 13 + 15 -> 14 + 17 -> 14 16 -> 15 - 9 -> 15 - 12 -> 15 - 13 -> 15 - 17 -> 16 - 13 -> 16 - 8 -> 18 - 10 -> 18 - 11 -> 18 - 16 -> 18 - 9 -> 18 - 12 -> 18 - 13 -> 18 + 18 -> 17 + 22 -> 17 + 19 -> 18 + 22 -> 18 + 7 -> 18 + 20 -> 19 + 21 -> 19 + 6 -> 19 + 13 -> 19 + 7 -> 19 + 22 -> 19 + 23 -> 19 + 24 -> 19 + 8 -> 19 + 7 -> 20 + 9 -> 20 8 -> 20 - 22 -> 21 - 24 -> 23 - 19 -> 23 - 60 -> 23 + 12 -> 20 + 7 -> 21 + 9 -> 21 + 8 -> 21 + 12 -> 21 + 7 -> 23 25 -> 24 - 20 -> 24 - 5 -> 24 - 4 -> 24 - 35 -> 24 - 19 -> 24 - 58 -> 24 - 59 -> 24 - 26 -> 25 - 29 -> 25 - 30 -> 25 - 32 -> 25 - 33 -> 25 - 34 -> 25 - 37 -> 25 - 38 -> 25 - 40 -> 25 - 19 -> 25 - 15 -> 25 - 18 -> 25 - 41 -> 25 - 5 -> 25 - 4 -> 25 - 35 -> 25 - 42 -> 25 - 43 -> 25 - 53 -> 25 - 55 -> 25 - 39 -> 25 - 56 -> 25 - 57 -> 25 - 58 -> 25 - 27 -> 26 - 4 -> 26 - 28 -> 27 - 28 -> 29 - 4 -> 29 - 31 -> 30 - 19 -> 30 - 4 -> 31 - 19 -> 31 + 26 -> 24 + 16 -> 27 + 17 -> 27 + 29 -> 28 + 22 -> 28 + 17 -> 29 + 22 -> 29 + 32 -> 31 + 33 -> 31 + 8 -> 32 9 -> 32 - 33 -> 32 - 32 -> 34 - 35 -> 34 + 30 -> 32 + 34 -> 33 + 17 -> 33 + 12 -> 33 + 8 -> 34 + 12 -> 34 36 -> 35 - 4 -> 35 - 13 -> 35 - 9 -> 36 - 13 -> 36 - 9 -> 37 - 4 -> 37 + 33 -> 35 + 32 -> 36 + 8 -> 37 + 17 -> 37 32 -> 37 - 35 -> 38 - 34 -> 38 - 32 -> 38 33 -> 38 + 31 -> 38 + 32 -> 38 + 9 -> 38 39 -> 38 - 36 -> 39 - 4 -> 39 - 13 -> 39 - 33 -> 40 - 4 -> 40 - 10 -> 40 + 34 -> 39 + 17 -> 39 + 12 -> 39 9 -> 40 - 33 -> 41 - 4 -> 41 - 36 -> 42 - 5 -> 42 - 13 -> 42 + 17 -> 40 + 8 -> 40 + 9 -> 41 + 17 -> 41 + 34 -> 42 + 18 -> 42 + 12 -> 42 44 -> 43 49 -> 43 52 -> 43 @@ -655,155 +665,171 @@ workflow: 47 -> 44 48 -> 44 46 -> 45 - 33 -> 45 - 33 -> 46 - 33 -> 47 + 9 -> 45 + 9 -> 46 + 9 -> 47 48 -> 47 46 -> 48 - 33 -> 48 + 9 -> 48 + 30 -> 48 50 -> 49 51 -> 49 - 4 -> 50 - 35 -> 50 + 17 -> 50 33 -> 50 48 -> 51 50 -> 52 47 -> 52 54 -> 53 - 36 -> 54 - 4 -> 54 - 13 -> 54 + 34 -> 54 + 17 -> 54 + 12 -> 54 32 -> 55 - 35 -> 55 - 36 -> 56 - 4 -> 56 - 13 -> 56 - 36 -> 57 - 4 -> 57 - 13 -> 57 + 33 -> 55 + 34 -> 56 + 17 -> 56 + 12 -> 56 + 34 -> 57 + 17 -> 57 + 12 -> 57 39 -> 58 56 -> 58 57 -> 58 - 35 -> 59 34 -> 59 - 55 -> 59 - 62 -> 61 - 65 -> 61 - 60 -> 61 - 7 -> 62 - 14 -> 62 - 15 -> 62 - 18 -> 62 - 5 -> 62 - 4 -> 62 - 63 -> 62 - 23 -> 62 - 65 -> 62 - 58 -> 62 - 26 -> 63 - 29 -> 63 - 30 -> 63 - 32 -> 63 - 33 -> 63 - 34 -> 63 - 37 -> 63 - 38 -> 63 + 17 -> 59 + 12 -> 59 + 34 -> 60 + 17 -> 60 + 12 -> 60 + 34 -> 61 + 17 -> 61 + 12 -> 61 + 33 -> 62 + 31 -> 62 + 55 -> 62 64 -> 63 - 65 -> 63 - 15 -> 63 - 18 -> 63 - 41 -> 63 - 5 -> 63 - 4 -> 63 - 35 -> 63 - 42 -> 63 - 66 -> 63 - 53 -> 63 - 70 -> 63 - 39 -> 63 - 56 -> 63 - 57 -> 63 - 58 -> 63 - 33 -> 64 - 4 -> 64 - 10 -> 64 - 9 -> 64 - 67 -> 66 - 68 -> 66 - 52 -> 66 - 45 -> 67 - 47 -> 67 - 48 -> 67 - 50 -> 68 + 67 -> 63 + 20 -> 64 + 21 -> 64 + 6 -> 64 + 13 -> 64 + 18 -> 64 + 17 -> 64 + 65 -> 64 + 3 -> 64 + 67 -> 64 + 58 -> 64 + 6 -> 65 + 13 -> 65 + 14 -> 65 + 27 -> 65 + 28 -> 65 + 30 -> 65 + 31 -> 65 + 35 -> 65 + 37 -> 65 + 38 -> 65 + 32 -> 65 + 9 -> 65 + 66 -> 65 + 67 -> 65 + 41 -> 65 + 18 -> 65 + 17 -> 65 + 33 -> 65 + 42 -> 65 + 68 -> 65 + 53 -> 65 + 72 -> 65 + 39 -> 65 + 56 -> 65 + 57 -> 65 + 58 -> 65 + 59 -> 65 + 60 -> 65 + 61 -> 65 + 9 -> 66 + 17 -> 66 + 8 -> 66 69 -> 68 + 70 -> 68 + 52 -> 68 + 45 -> 69 + 47 -> 69 48 -> 69 - 32 -> 70 - 35 -> 70 - 72 -> 71 - 75 -> 71 - 60 -> 71 - 7 -> 72 - 14 -> 72 - 15 -> 72 - 18 -> 72 - 5 -> 72 - 4 -> 72 - 73 -> 72 - 61 -> 72 - 75 -> 72 - 58 -> 72 - 26 -> 73 - 29 -> 73 - 30 -> 73 - 32 -> 73 - 33 -> 73 - 34 -> 73 - 37 -> 73 - 38 -> 73 + 50 -> 70 + 71 -> 70 + 48 -> 71 + 32 -> 72 + 33 -> 72 74 -> 73 - 75 -> 73 - 15 -> 73 - 18 -> 73 - 41 -> 73 - 5 -> 73 - 4 -> 73 - 35 -> 73 - 42 -> 73 - 76 -> 73 - 53 -> 73 - 80 -> 73 - 39 -> 73 - 56 -> 73 - 57 -> 73 - 58 -> 73 - 33 -> 74 - 4 -> 74 - 10 -> 74 - 9 -> 74 - 77 -> 76 - 78 -> 76 - 52 -> 76 - 45 -> 77 - 47 -> 77 - 48 -> 77 - 50 -> 78 + 77 -> 73 + 20 -> 74 + 21 -> 74 + 6 -> 74 + 13 -> 74 + 18 -> 74 + 17 -> 74 + 75 -> 74 + 63 -> 74 + 77 -> 74 + 58 -> 74 + 6 -> 75 + 13 -> 75 + 14 -> 75 + 27 -> 75 + 28 -> 75 + 30 -> 75 + 31 -> 75 + 35 -> 75 + 37 -> 75 + 38 -> 75 + 32 -> 75 + 9 -> 75 + 76 -> 75 + 77 -> 75 + 41 -> 75 + 18 -> 75 + 17 -> 75 + 33 -> 75 + 42 -> 75 + 78 -> 75 + 53 -> 75 + 82 -> 75 + 39 -> 75 + 56 -> 75 + 57 -> 75 + 58 -> 75 + 59 -> 75 + 60 -> 75 + 61 -> 75 + 9 -> 76 + 17 -> 76 + 8 -> 76 79 -> 78 + 80 -> 78 + 52 -> 78 + 45 -> 79 + 47 -> 79 48 -> 79 - 32 -> 80 - 35 -> 80 - 23 -> 81 - 4 -> 81 - 61 -> 82 - 4 -> 82 - 71 -> 83 - 4 -> 83 - 23 -> 84 - 4 -> 84 - 61 -> 85 - 4 -> 85 - 71 -> 86 - 4 -> 86 - } + 50 -> 80 + 81 -> 80 + 48 -> 81 + 32 -> 82 + 33 -> 82 + 17 -> 83 + 3 -> 84 + 17 -> 84 + 63 -> 85 + 17 -> 85 + 73 -> 86 + 17 -> 86 + 3 -> 87 + 17 -> 87 + 63 -> 88 + 17 -> 88 + 73 -> 89 + 17 -> 89 + } | diff --git a/envs/environment.fixed.yaml b/envs/environment.fixed.yaml index 8bbd70bf..260c17fd 100644 --- a/envs/environment.fixed.yaml +++ b/envs/environment.fixed.yaml @@ -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 diff --git a/envs/environment.yaml b/envs/environment.yaml index ee1d1605..cbb1a364 100644 --- a/envs/environment.yaml +++ b/envs/environment.yaml @@ -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 diff --git a/graphics/workflow.png b/graphics/workflow.png deleted file mode 100644 index a7fbc5ad..00000000 Binary files a/graphics/workflow.png and /dev/null differ diff --git a/rules/build_electricity.smk b/rules/build_electricity.smk index 0cb9d028..0c4c4b01 100644 --- a/rules/build_electricity.smk +++ b/rules/build_electricity.smk @@ -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: diff --git a/rules/retrieve.smk b/rules/retrieve.smk index 5147e564..64afdc13 100644 --- a/rules/retrieve.smk +++ b/rules/retrieve.smk @@ -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: diff --git a/rules/solve_myopic.smk b/rules/solve_myopic.smk index fe291c6d..6220af2a 100644 --- a/rules/solve_myopic.smk +++ b/rules/solve_myopic.smk @@ -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", diff --git a/rules/solve_perfect.smk b/rules/solve_perfect.smk index 70acc830..51cb3920 100644 --- a/rules/solve_perfect.smk +++ b/rules/solve_perfect.smk @@ -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", diff --git a/scripts/add_existing_baseyear.py b/scripts/add_existing_baseyear.py index e75fe5a2..77000ade 100644 --- a/scripts/add_existing_baseyear.py +++ b/scripts/add_existing_baseyear.py @@ -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, diff --git a/scripts/base_network.py b/scripts/base_network.py index 346f99a5..432813cf 100644 --- a/scripts/base_network.py +++ b/scripts/base_network.py @@ -5,10 +5,7 @@ # coding: utf-8 """ -Creates the network topology from a `ENTSO-E map extract. - -`_ (March 2022) as a PyPSA -network. +Creates the network topology from an `ENTSO-E map extract `_ (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) diff --git a/scripts/build_bus_regions.py b/scripts/build_bus_regions.py deleted file mode 100644 index 9d993c17..00000000 --- a/scripts/build_bus_regions.py +++ /dev/null @@ -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) diff --git a/scripts/build_electricity_demand.py b/scripts/build_electricity_demand.py index 9174672d..fc8af372 100755 --- a/scripts/build_electricity_demand.py +++ b/scripts/build_electricity_demand.py @@ -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) diff --git a/scripts/build_hydro_profile.py b/scripts/build_hydro_profile.py index cd51ce90..6a0315c7 100644 --- a/scripts/build_hydro_profile.py +++ b/scripts/build_hydro_profile.py @@ -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] diff --git a/scripts/cluster_network.py b/scripts/cluster_network.py index b0b73ade..87762b36 100644 --- a/scripts/cluster_network.py +++ b/scripts/cluster_network.py @@ -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) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index b6ec98b2..9f53e317 100755 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -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"] diff --git a/scripts/retrieve_irena.py b/scripts/retrieve_irena.py deleted file mode 100644 index 04e48db1..00000000 --- a/scripts/retrieve_irena.py +++ /dev/null @@ -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 `_ 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"]) diff --git a/scripts/simplify_network.py b/scripts/simplify_network.py index 24df7312..558e4cf2 100644 --- a/scripts/simplify_network.py +++ b/scripts/simplify_network.py @@ -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) diff --git a/scripts/solve_network.py b/scripts/solve_network.py index b1463b35..dbde8813 100644 --- a/scripts/solve_network.py +++ b/scripts/solve_network.py @@ -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)