From 092205680f77de2b966623b7fe540464f0f9b4a1 Mon Sep 17 00:00:00 2001 From: martin-springer Date: Fri, 21 Nov 2025 15:14:14 -0500 Subject: [PATCH 01/61] initial re-structure attempt --- .github/workflows/nbval.yaml | 42 +- .github/workflows/testbook.yaml | 21 +- .gitignore | 2 + .pre-commit-config.yaml | 14 +- jupytext.toml | 9 + pyproject.toml | 1 + tools/README.md | 25 + .../Tools - Degradation.ipynb | 154 +- .../Tools - Edge Seal Oxygen Ingress.ipynb | 13 +- ...s - Module Standoff for IEC TS 63126.ipynb | 75 +- tools/_toc.yml | 8 + .../images}/T98_70C_standoff_Map.png | Bin tools/intro.md | 8 + tools/scripts/Tools - Degradation.py | 256 + .../Tools - Edge Seal Oxygen Ingress.py | 201 + ...ools - Module Standoff for IEC TS 63126.py | 247 +- .../01_basics/01_basics_humidity_design.ipynb | 12 +- .../01_basics/02_degradation.ipynb | 11 +- .../01_basics/03_spectral_degradation.ipynb | 10 +- .../04_weather_database_access.ipynb | 4 +- tutorials/01_basics/README.md | 16 + .../scripts/01_basics_humidity_design.py | 141 +- .../01_basics/scripts/02_degradation.py | 76 +- .../scripts/03_spectral_degradation.py | 42 +- .../scripts/04_weather_database_access.py | 84 +- .../01_bo_lid_accelerated_test.ipynb | 10 +- .../02_letid_accelerated_test.ipynb | 17 +- .../02_degradation/03_letid_outdoor.ipynb | 2 +- .../04_letid_outdoor_scenario.ipynb | 0 .../05_letid_passivated_wafer.ipynb | 2 +- .../06_vant_hoff_degradation_model.ipynb | 2 +- tutorials/02_degradation/README.md | 20 + .../scripts/01_bo_lid_accelerated_test.py | 100 +- .../scripts/02_letid_accelerated_test.py | 129 +- .../scripts/03_letid_outdoor.py | 146 +- .../scripts/04_letid_outdoor_scenario.py | 201 +- .../scripts/05_letid_passivated_wafer.py | 209 +- .../scripts/06_vant_hoff_degradation_model.py | 231 + .../03_monte_carlo/01_arrhenius.ipynb | 22 +- .../03_monte_carlo/02_standoff.ipynb | 6 +- tutorials/03_monte_carlo/README.md | 16 + .../03_monte_carlo/scripts/01_arrhenius.py | 102 +- .../03_monte_carlo/scripts/02_standoff.py | 77 +- .../04_geospatial/01_local_scenario.ipynb | 0 .../02_geospatial_templates.ipynb | 22 +- .../03_scenario_geographical_features.ipynb | 6 +- .../04_scenario_geospatial.ipynb | 16 +- .../05_scenario_mountain_downselect.ipynb | 4 +- .../06_scenario_single_location.ipynb | 14 +- .../07_scenario_temperature.ipynb | 10 +- .../08_module_standoff_iec63126.ipynb | 723 + tutorials/04_geospatial/README.md | 36 + .../scripts/01_local_scenario.py | 18 + .../scripts/02_geospatial_templates.py | 278 + .../03_scenario_geographical_features.py | 112 + .../scripts/04_scenario_geospatial.py | 92 + .../05_scenario_mountain_downselect.py | 120 + .../scripts/06_scenario_single_location.py | 154 + .../scripts/07_scenario_temperature.py | 164 + .../scripts/08_module_standoff_iec63126.py | 499 + .../01_custom_functions_nopython.ipynb | 24 +- .../02_pysam_single_location.ipynb | 2 +- .../05_advanced/03_pysam_api.ipynb | 34 +- .../04_nsrdb_distributed_api.ipynb | 6 +- .../05_advanced/05_pvgis_distributed.ipynb | 26 +- tutorials/05_advanced/README.md | 34 + .../scripts/01_custom_functions_nopython.py | 152 + .../scripts/02_pysam_single_location.py | 43 + tutorials/05_advanced/scripts/03_pysam_api.py | 161 + .../scripts/04_nsrdb_distributed_api.py | 91 + .../scripts/05_pvgis_distributed.py | 242 + .../06_nrel_hpc/01_geospatial_world_map.ipynb | 78 +- .../02_letid_outdoor_geospatial_demo.ipynb | 0 tutorials/06_nrel_hpc/README.md | 35 + .../scripts/01_geospatial_world_map.py | 670 + .../02_letid_outdoor_geospatial_demo.py | 77 +- .../07_workshop_demos/01_astm_live_demo.ipynb | 4 +- .../02_duramat_live_demo.ipynb | 2 +- tutorials/07_workshop_demos/README.md | 42 + .../scripts/01_astm_live_demo.py | 135 +- .../scripts/02_duramat_live_demo.py | 100 +- {tutorials_and_tools => tutorials}/README.md | 0 tutorials/TUTORIAL_INDEX.md | 103 + .../_config.yml | 2 +- tutorials/_toc.yml | 58 + .../data/temperature_and_degradation.json | 0 .../images}/tutorial_1_NSRDB_example.PNG | Bin .../images/xarray.webp | Bin .../html/_sources => tutorials}/intro.md | 14 +- .../references.bib | 0 .../requirements.txt | 0 .../_build/.doctrees/README.doctree | Bin 10617 -> 0 bytes .../_build/.doctrees/environment.pickle | Bin 1130779 -> 0 bytes .../_build/.doctrees/intro.doctree | Bin 6282 -> 0 bytes .../1 - Basics, Humidity, Design.doctree | Bin 107442 -> 0 bytes .../tutorials/2 - Degradation.doctree | Bin 30251 -> 0 bytes .../3 - Spectral Degradation.doctree | Bin 18090 -> 0 bytes .../.doctrees/tutorials/4 - Standards.doctree | Bin 18529 -> 0 bytes .../5 - Weather Database Access.doctree | Bin 30670 -> 0 bytes .../tutorials/ASTM Live Demo.doctree | Bin 66369 -> 0 bytes .../B-O LID - Accelerated Test.doctree | Bin 53725 -> 0 bytes .../LETID - Accelerated Test.doctree | Bin 81923 -> 0 bytes .../tutorials/LETID - Outdoor LETID.doctree | Bin 108226 -> 0 bytes ...o Based on Accelerated Test Result.doctree | Bin 177565 -> 0 bytes .../LETID - Passivated Wafer.doctree | Bin 97887 -> 0 bytes .../1 - Basics, Humidity, Design.doctree | Bin 110789 -> 0 bytes .../2 - Degradation.doctree | Bin 36054 -> 0 bytes .../3 - Spectral Degradation.doctree | Bin 20391 -> 0 bytes .../4 - Weather Database Access.doctree | Bin 31040 -> 0 bytes .../ASTM Live Demo.doctree | Bin 93219 -> 0 bytes .../B-O LID - Accelerated Test.doctree | Bin 55132 -> 0 bytes .../LETID - Accelerated Test.doctree | Bin 84649 -> 0 bytes .../LETID - Outdoor LETID.doctree | Bin 109634 -> 0 bytes ...o Based on Accelerated Test Result.doctree | Bin 209126 -> 0 bytes .../LETID - Passivated Wafer.doctree | Bin 100671 -> 0 bytes ...- Module Standoff for IEC TS 63126.doctree | Bin 82636 -> 0 bytes tutorials_and_tools/_build/html/.buildinfo | 4 - tutorials_and_tools/_build/html/README.html | 542 - ...3ede63b6f2c49cc28e8bed9978b78a2fc25f9d.png | Bin 36505 -> 0 bytes ...03d8be0bc62fd2db687db91b2a8295e3e9714e.png | Bin 49729 -> 0 bytes ...c0dff9bd00e18d854f76e1d1ff0d71676be23e.png | Bin 33008 -> 0 bytes ...1722ae2fe80ee499727ea3af871df5db449f6a.png | Bin 32764 -> 0 bytes ...02c436c791ca65967f80eaf6df5a15c42608a0.png | Bin 32746 -> 0 bytes ...3497450f2876ebff4bfd96d0b728e8c9869e42.png | Bin 35650 -> 0 bytes ...72e808cd03e0b0679c4caa4b2e126fa443a74d.png | Bin 61193 -> 0 bytes ...8d61117aab373d7340c4c1edfb6fe460f26fdb.png | Bin 29051 -> 0 bytes ...db2f12af2762c68e879e813c52d20184f31e13.png | Bin 55761 -> 0 bytes ...91f4634d41142ea9a3c7811ec4050e970c4b79.png | Bin 57179 -> 0 bytes ...508d07ce25e0cdb2e338b73bc4dfe058bf0a73.png | Bin 59746 -> 0 bytes ...5c9bee777190fd1b6c82a55946243f011a679f.png | Bin 128297 -> 0 bytes .../_images/CAMS Radiation Satellite map.jpg | Bin 94520 -> 0 bytes .../_images/NSRDB Graphic Update 2021.jpg | Bin 4988904 -> 0 bytes .../html/_images/NSRDB PSM3 Satellite map.jpg | Bin 90752 -> 0 bytes .../_build/html/_images/NSRDB-data-viewer.png | Bin 1039042 -> 0 bytes ...ault Solar Radiation Database 100ppi_1.png | Bin 267292 -> 0 bytes .../_images/SARAH (PVGIS) Satellite map.jpg | Bin 86969 -> 0 bytes ...61bd420f0a2a046ffe926049540d55dce3db7b.png | Bin 64426 -> 0 bytes ...7a30e4560482ae6f665332ca5c34c00581af44.png | Bin 64812 -> 0 bytes ...2e192a0b45c4987bb90ff10cb7156a089d55d8.png | Bin 14265 -> 0 bytes ...d251a83ec48611c97d99de2a3f0386d6f85e65.png | Bin 63810 -> 0 bytes ...71f2623e8fa6b4caa5fe081a934a0a95e677a5.png | Bin 65016 -> 0 bytes ...67b106d6b7cfedf39d36bf3b1ed247f7603e34.png | Bin 49680 -> 0 bytes ...75b7cfd758488337a0e5c3090e05b68d166c40.png | Bin 128317 -> 0 bytes ...9d9cb6dcb41467c123c119e2f9d85ef491d62d.png | Bin 59858 -> 0 bytes ...c128d6c8059725a5c531be5766a5ae26006893.png | Bin 59132 -> 0 bytes ...ef7d83e55865e57f15ac7db963704e8b99f3f8.png | Bin 29189 -> 0 bytes ...be8c74fff7e2129acc0fe1d8d0af0755ad9c15.png | Bin 62825 -> 0 bytes ...35f084437bbba1384c14d2b44ab5c509adcff6.png | Bin 59719 -> 0 bytes .../_build/html/_sources/README.md | 55 - .../1 - Basics, Humidity, Design.ipynb | 1731 --- .../_sources/tutorials/2 - Degradation.ipynb | 330 - .../tutorials/3 - Spectral Degradation.ipynb | 227 - .../_sources/tutorials/4 - Standards.ipynb | 157 - .../5 - Weather Database Access.ipynb | 278 - .../_sources/tutorials/ASTM Live Demo.ipynb | 337 - .../B-O LID - Accelerated Test.ipynb | 769 -- .../tutorials/LETID - Accelerated Test.ipynb | 1258 -- .../tutorials/LETID - Outdoor LETID.ipynb | 1776 --- ...rio Based on Accelerated Test Result.ipynb | 3021 ----- .../tutorials/LETID - Passivated Wafer.ipynb | 1376 -- .../1 - Basics, Humidity, Design.ipynb | 1775 --- .../tutorials_and_tools/2 - Degradation.ipynb | 400 - .../3 - Spectral Degradation.ipynb | 263 - .../4 - Weather Database Access.ipynb | 306 - .../tutorials_and_tools/ASTM Live Demo.ipynb | 1112 -- .../B-O LID - Accelerated Test.ipynb | 804 -- .../LETID - Accelerated Test.ipynb | 1282 -- .../LETID - Outdoor LETID.ipynb | 1813 --- ...rio Based on Accelerated Test Result.ipynb | 3451 ----- .../LETID - Passivated Wafer.ipynb | 1432 -- ...s - Module Standoff for IEC TS 63126.ipynb | 777 -- ...e.1e8bd061cd6da7fc9cf755528e8ffc24.min.css | 1 - .../html/_sphinx_design_static/design-tabs.js | 27 - .../_sphinx_javascript_frameworks_compat.js | 134 - .../_build/html/_static/basic.css | 925 -- .../_build/html/_static/check-solid.svg | 4 - .../_build/html/_static/clipboard.min.js | 7 - .../_build/html/_static/copy-button.svg | 5 - .../_build/html/_static/copybutton.css | 94 - .../_build/html/_static/copybutton.js | 248 - .../_build/html/_static/copybutton_funcs.js | 73 - ...e.1e8bd061cd6da7fc9cf755528e8ffc24.min.css | 1 - ...e.4045f2051d55cab465a707391d5b2007.min.css | 1 - .../_build/html/_static/design-tabs.js | 27 - .../_build/html/_static/doctools.js | 156 - .../html/_static/documentation_options.js | 13 - .../_build/html/_static/file.png | Bin 286 -> 0 bytes .../html/_static/images/logo_binder.svg | 19 - .../_build/html/_static/images/logo_colab.png | Bin 7601 -> 0 bytes .../html/_static/images/logo_deepnote.svg | 1 - .../html/_static/images/logo_jupyterhub.svg | 1 - .../_build/html/_static/jquery-3.6.0.js | 10881 ---------------- .../_build/html/_static/jquery.js | 2 - .../_build/html/_static/language_data.js | 198 - .../locales/ar/LC_MESSAGES/booktheme.po | 75 - .../locales/bg/LC_MESSAGES/booktheme.po | 75 - .../locales/bn/LC_MESSAGES/booktheme.po | 63 - .../locales/ca/LC_MESSAGES/booktheme.po | 66 - .../locales/cs/LC_MESSAGES/booktheme.po | 75 - .../locales/da/LC_MESSAGES/booktheme.po | 75 - .../locales/de/LC_MESSAGES/booktheme.po | 75 - .../locales/el/LC_MESSAGES/booktheme.po | 75 - .../locales/eo/LC_MESSAGES/booktheme.po | 75 - .../locales/es/LC_MESSAGES/booktheme.po | 75 - .../locales/et/LC_MESSAGES/booktheme.po | 75 - .../locales/fi/LC_MESSAGES/booktheme.po | 75 - .../locales/fr/LC_MESSAGES/booktheme.po | 75 - .../locales/hr/LC_MESSAGES/booktheme.po | 75 - .../locales/id/LC_MESSAGES/booktheme.po | 75 - .../locales/it/LC_MESSAGES/booktheme.po | 75 - .../locales/iw/LC_MESSAGES/booktheme.po | 75 - .../locales/ja/LC_MESSAGES/booktheme.po | 75 - .../locales/ko/LC_MESSAGES/booktheme.po | 75 - .../locales/lt/LC_MESSAGES/booktheme.po | 75 - .../locales/lv/LC_MESSAGES/booktheme.po | 75 - .../locales/ml/LC_MESSAGES/booktheme.po | 66 - .../locales/mr/LC_MESSAGES/booktheme.po | 66 - .../locales/ms/LC_MESSAGES/booktheme.po | 66 - .../locales/nl/LC_MESSAGES/booktheme.po | 75 - .../locales/no/LC_MESSAGES/booktheme.po | 75 - .../locales/pl/LC_MESSAGES/booktheme.po | 75 - .../locales/pt/LC_MESSAGES/booktheme.po | 75 - .../locales/ro/LC_MESSAGES/booktheme.po | 75 - .../locales/ru/LC_MESSAGES/booktheme.po | 75 - .../locales/sk/LC_MESSAGES/booktheme.po | 75 - .../locales/sl/LC_MESSAGES/booktheme.po | 75 - .../locales/sr/LC_MESSAGES/booktheme.po | 75 - .../locales/sv/LC_MESSAGES/booktheme.po | 75 - .../locales/ta/LC_MESSAGES/booktheme.po | 66 - .../locales/te/LC_MESSAGES/booktheme.po | 66 - .../locales/tg/LC_MESSAGES/booktheme.po | 75 - .../locales/th/LC_MESSAGES/booktheme.po | 75 - .../locales/tl/LC_MESSAGES/booktheme.po | 66 - .../locales/tr/LC_MESSAGES/booktheme.po | 75 - .../locales/uk/LC_MESSAGES/booktheme.po | 75 - .../locales/ur/LC_MESSAGES/booktheme.po | 66 - .../locales/vi/LC_MESSAGES/booktheme.po | 75 - .../locales/zh_CN/LC_MESSAGES/booktheme.po | 75 - .../locales/zh_TW/LC_MESSAGES/booktheme.po | 75 - .../_build/html/_static/minus.png | Bin 90 -> 0 bytes ...69c37c29e427902b24a333a5f9fcb2f0b3ac41.css | 2342 ---- .../_build/html/_static/play-solid.svg | 1 - .../_build/html/_static/plus.png | Bin 90 -> 0 bytes .../_build/html/_static/pygments.css | 152 - .../html/_static/sbt-webpack-macros.html | 11 - .../_build/html/_static/scripts/bootstrap.js | 3 - .../_static/scripts/bootstrap.js.LICENSE.txt | 5 - .../html/_static/scripts/bootstrap.js.map | 1 - .../_static/scripts/pydata-sphinx-theme.js | 2 - .../scripts/pydata-sphinx-theme.js.map | 1 - .../html/_static/scripts/sphinx-book-theme.js | 2 - .../_static/scripts/sphinx-book-theme.js.map | 1 - .../_build/html/_static/searchtools.js | 619 - .../_build/html/_static/sphinx-thebe.css | 129 - .../_build/html/_static/sphinx-thebe.js | 127 - .../_build/html/_static/sphinx_highlight.js | 154 - .../_build/html/_static/styles/bootstrap.css | 6 - .../html/_static/styles/bootstrap.css.map | 1 - .../_static/styles/pydata-sphinx-theme.css | 2 - .../styles/pydata-sphinx-theme.css.map | 1 - .../html/_static/styles/sphinx-book-theme.css | 8 - .../_build/html/_static/styles/theme.css | 2 - .../_build/html/_static/togglebutton.css | 160 - .../_build/html/_static/togglebutton.js | 187 - .../_build/html/_static/underscore-1.13.1.js | 2042 --- .../_build/html/_static/underscore.js | 6 - .../vendor/fontawesome/6.1.2/LICENSE.txt | 165 - .../vendor/fontawesome/6.1.2/css/all.min.css | 5 - .../6.1.2/webfonts/fa-brands-400.ttf | Bin 181264 -> 0 bytes .../6.1.2/webfonts/fa-brands-400.woff2 | Bin 105112 -> 0 bytes .../6.1.2/webfonts/fa-regular-400.ttf | Bin 60236 -> 0 bytes .../6.1.2/webfonts/fa-regular-400.woff2 | Bin 24028 -> 0 bytes .../6.1.2/webfonts/fa-solid-900.ttf | Bin 389948 -> 0 bytes .../6.1.2/webfonts/fa-solid-900.woff2 | Bin 154840 -> 0 bytes .../6.1.2/webfonts/fa-v4compatibility.ttf | Bin 10084 -> 0 bytes .../6.1.2/webfonts/fa-v4compatibility.woff2 | Bin 4776 -> 0 bytes .../vendor/fontawesome/6.5.1/LICENSE.txt | 165 - .../vendor/fontawesome/6.5.1/css/all.min.css | 5 - .../vendor/fontawesome/6.5.1/js/all.min.js | 2 - .../6.5.1/js/all.min.js.LICENSE.txt | 5 - .../6.5.1/webfonts/fa-brands-400.ttf | Bin 207972 -> 0 bytes .../6.5.1/webfonts/fa-brands-400.woff2 | Bin 117372 -> 0 bytes .../6.5.1/webfonts/fa-regular-400.ttf | Bin 68004 -> 0 bytes .../6.5.1/webfonts/fa-regular-400.woff2 | Bin 25452 -> 0 bytes .../6.5.1/webfonts/fa-solid-900.ttf | Bin 419720 -> 0 bytes .../6.5.1/webfonts/fa-solid-900.woff2 | Bin 156496 -> 0 bytes .../6.5.1/webfonts/fa-v4compatibility.ttf | Bin 10832 -> 0 bytes .../6.5.1/webfonts/fa-v4compatibility.woff2 | Bin 4792 -> 0 bytes .../_build/html/_static/webpack-macros.html | 31 - tutorials_and_tools/_build/html/genindex.html | 415 - tutorials_and_tools/_build/html/index.html | 1 - tutorials_and_tools/_build/html/intro.html | 515 - tutorials_and_tools/_build/html/objects.inv | 7 - tutorials_and_tools/_build/html/search.html | 427 - .../_build/html/searchindex.js | 1 - .../1 - Basics, Humidity, Design.html | 1899 --- .../html/tutorials/2 - Degradation.html | 787 -- .../tutorials/3 - Spectral Degradation.html | 696 - .../_build/html/tutorials/4 - Standards.html | 652 - .../5 - Weather Database Access.html | 739 -- .../_build/html/tutorials/ASTM Live Demo.html | 1019 -- .../tutorials/B-O LID - Accelerated Test.html | 1091 -- .../tutorials/LETID - Accelerated Test.html | 1534 --- .../html/tutorials/LETID - Outdoor LETID.html | 1896 --- ...ario Based on Accelerated Test Result.html | 2725 ---- .../tutorials/LETID - Passivated Wafer.html | 1571 --- .../1 - Basics, Humidity, Design.html | 1956 --- .../tutorials_and_tools/2 - Degradation.html | 867 -- .../3 - Spectral Degradation.html | 744 -- .../4 - Weather Database Access.html | 753 -- .../tutorials_and_tools/ASTM Live Demo.html | 1372 -- .../B-O LID - Accelerated Test.html | 1110 -- .../LETID - Accelerated Test.html | 1562 --- .../LETID - Outdoor LETID.html | 1895 --- ...ario Based on Accelerated Test Result.html | 3209 ----- .../LETID - Passivated Wafer.html | 1626 --- ...ls - Module Standoff for IEC TS 63126.html | 1060 -- ...3ede63b6f2c49cc28e8bed9978b78a2fc25f9d.png | Bin 36505 -> 0 bytes ...03d8be0bc62fd2db687db91b2a8295e3e9714e.png | Bin 49729 -> 0 bytes ...c0dff9bd00e18d854f76e1d1ff0d71676be23e.png | Bin 33008 -> 0 bytes ...1722ae2fe80ee499727ea3af871df5db449f6a.png | Bin 32764 -> 0 bytes ...02c436c791ca65967f80eaf6df5a15c42608a0.png | Bin 32746 -> 0 bytes ...3497450f2876ebff4bfd96d0b728e8c9869e42.png | Bin 35650 -> 0 bytes ...72e808cd03e0b0679c4caa4b2e126fa443a74d.png | Bin 61193 -> 0 bytes ...8d61117aab373d7340c4c1edfb6fe460f26fdb.png | Bin 29051 -> 0 bytes ...db2f12af2762c68e879e813c52d20184f31e13.png | Bin 55761 -> 0 bytes ...91f4634d41142ea9a3c7811ec4050e970c4b79.png | Bin 57179 -> 0 bytes ...508d07ce25e0cdb2e338b73bc4dfe058bf0a73.png | Bin 59746 -> 0 bytes ...5c9bee777190fd1b6c82a55946243f011a679f.png | Bin 128297 -> 0 bytes ...61bd420f0a2a046ffe926049540d55dce3db7b.png | Bin 64426 -> 0 bytes ...7a30e4560482ae6f665332ca5c34c00581af44.png | Bin 64812 -> 0 bytes ...2e192a0b45c4987bb90ff10cb7156a089d55d8.png | Bin 14265 -> 0 bytes ...d251a83ec48611c97d99de2a3f0386d6f85e65.png | Bin 63810 -> 0 bytes ...71f2623e8fa6b4caa5fe081a934a0a95e677a5.png | Bin 65016 -> 0 bytes ...67b106d6b7cfedf39d36bf3b1ed247f7603e34.png | Bin 49680 -> 0 bytes ...75b7cfd758488337a0e5c3090e05b68d166c40.png | Bin 128317 -> 0 bytes ...9d9cb6dcb41467c123c119e2f9d85ef491d62d.png | Bin 59858 -> 0 bytes ...c128d6c8059725a5c531be5766a5ae26006893.png | Bin 59132 -> 0 bytes ...ef7d83e55865e57f15ac7db963704e8b99f3f8.png | Bin 29189 -> 0 bytes ...be8c74fff7e2129acc0fe1d8d0af0755ad9c15.png | Bin 62825 -> 0 bytes ...35f084437bbba1384c14d2b44ab5c509adcff6.png | Bin 59719 -> 0 bytes .../1 - Basics, Humidity, Design.ipynb | 1737 --- .../tutorials/2 - Degradation.ipynb | 330 - .../tutorials/3 - Spectral Degradation.ipynb | 227 - .../tutorials/4 - Standards.ipynb | 157 - .../5 - Weather Database Access.ipynb | 285 - .../tutorials/ASTM Live Demo.ipynb | 648 - .../B-O LID - Accelerated Test.ipynb | 769 -- .../tutorials/LETID - Accelerated Test.ipynb | 1273 -- .../tutorials/LETID - Outdoor LETID.ipynb | 1789 --- ...rio Based on Accelerated Test Result.ipynb | 2921 ----- .../tutorials/LETID - Passivated Wafer.ipynb | 1392 -- .../1 - Basics, Humidity, Design.ipynb | 1790 --- .../tutorials_and_tools/2 - Degradation.ipynb | 421 - .../3 - Spectral Degradation.ipynb | 263 - .../4 - Weather Database Access.ipynb | 306 - .../tutorials_and_tools/ASTM Live Demo.ipynb | 1112 -- .../B-O LID - Accelerated Test.ipynb | 804 -- .../LETID - Accelerated Test.ipynb | 1298 -- .../LETID - Outdoor LETID.ipynb | 1813 --- ...rio Based on Accelerated Test Result.ipynb | 3469 ----- .../LETID - Passivated Wafer.ipynb | 1446 -- ...s - Module Standoff for IEC TS 63126.ipynb | 769 -- tutorials_and_tools/_toc.yml | 18 - tutorials_and_tools/intro.md | 14 - .../images/T98_70C_standoff_Map.png | Bin 9097748 -> 0 bytes .../images/tutorial_1_NSRDB_example.PNG | Bin 296873 -> 0 bytes .../temperature and degradation.json | 164 - 368 files changed, 5658 insertions(+), 106581 deletions(-) create mode 100644 jupytext.toml create mode 100644 tools/README.md rename {tutorials_and_tools/tutorials_and_tools => tools}/Tools - Degradation.ipynb (97%) rename {tutorials_and_tools/tutorials_and_tools => tools}/Tools - Edge Seal Oxygen Ingress.ipynb (99%) rename tutorials_and_tools/tutorials_and_tools/HPC Connection Required - Tools - Module Standoff for IEC TS 63126.ipynb => tools/Tools - Module Standoff for IEC TS 63126.ipynb (92%) create mode 100644 tools/_toc.yml rename {tutorials_and_tools/tutorials_and_tools => tools/images}/T98_70C_standoff_Map.png (100%) create mode 100644 tools/intro.md create mode 100644 tools/scripts/Tools - Degradation.py create mode 100644 tools/scripts/Tools - Edge Seal Oxygen Ingress.py rename {tutorials_and_tools/tutorials_and_tools => tools/scripts}/Tools - Module Standoff for IEC TS 63126.py (79%) rename tutorials_and_tools/tutorials_and_tools/1 - Basics, Humidity, Design.ipynb => tutorials/01_basics/01_basics_humidity_design.ipynb (99%) rename tutorials_and_tools/tutorials_and_tools/2 - Degradation.ipynb => tutorials/01_basics/02_degradation.ipynb (98%) rename tutorials_and_tools/tutorials_and_tools/3 - Spectral Degradation.ipynb => tutorials/01_basics/03_spectral_degradation.ipynb (97%) rename tutorials_and_tools/tutorials_and_tools/4 - Weather Database Access.ipynb => tutorials/01_basics/04_weather_database_access.ipynb (98%) create mode 100644 tutorials/01_basics/README.md rename tutorials_and_tools/tutorials_and_tools/1 - Basics, Humidity, Design.py => tutorials/01_basics/scripts/01_basics_humidity_design.py (85%) rename tutorials_and_tools/tutorials_and_tools/2 - Degradation.py => tutorials/01_basics/scripts/02_degradation.py (95%) rename tutorials_and_tools/tutorials_and_tools/3 - Spectral Degradation.py => tutorials/01_basics/scripts/03_spectral_degradation.py (85%) rename tutorials_and_tools/tutorials_and_tools/4 - Weather Database Access.py => tutorials/01_basics/scripts/04_weather_database_access.py (86%) rename tutorials_and_tools/tutorials_and_tools/B-O LID - Accelerated Test.ipynb => tutorials/02_degradation/01_bo_lid_accelerated_test.ipynb (99%) rename tutorials_and_tools/tutorials_and_tools/LETID - Accelerated Test.ipynb => tutorials/02_degradation/02_letid_accelerated_test.ipynb (99%) rename tutorials_and_tools/tutorials_and_tools/LETID - Outdoor LETID.ipynb => tutorials/02_degradation/03_letid_outdoor.ipynb (99%) rename tutorials_and_tools/tutorials_and_tools/LETID - Outdoor Scenario Based on Accelerated Test Result.ipynb => tutorials/02_degradation/04_letid_outdoor_scenario.ipynb (100%) rename tutorials_and_tools/tutorials_and_tools/LETID - Passivated Wafer.ipynb => tutorials/02_degradation/05_letid_passivated_wafer.ipynb (99%) rename tutorials_and_tools/tutorials_and_tools/Van't Hoff Degradation Model.ipynb => tutorials/02_degradation/06_vant_hoff_degradation_model.ipynb (99%) create mode 100644 tutorials/02_degradation/README.md rename tutorials_and_tools/tutorials_and_tools/B-O LID - Accelerated Test.py => tutorials/02_degradation/scripts/01_bo_lid_accelerated_test.py (95%) rename tutorials_and_tools/tutorials_and_tools/LETID - Accelerated Test.py => tutorials/02_degradation/scripts/02_letid_accelerated_test.py (93%) rename tutorials_and_tools/tutorials_and_tools/LETID - Outdoor LETID.py => tutorials/02_degradation/scripts/03_letid_outdoor.py (95%) rename tutorials_and_tools/tutorials_and_tools/LETID - Outdoor Scenario Based on Accelerated Test Result.py => tutorials/02_degradation/scripts/04_letid_outdoor_scenario.py (96%) rename tutorials_and_tools/tutorials_and_tools/LETID - Passivated Wafer.py => tutorials/02_degradation/scripts/05_letid_passivated_wafer.py (96%) create mode 100644 tutorials/02_degradation/scripts/06_vant_hoff_degradation_model.py rename tutorials_and_tools/tutorials_and_tools/Monte Carlo - Arrhenius.ipynb => tutorials/03_monte_carlo/01_arrhenius.ipynb (99%) rename tutorials_and_tools/tutorials_and_tools/Monte Carlo - Standoff.ipynb => tutorials/03_monte_carlo/02_standoff.ipynb (99%) create mode 100644 tutorials/03_monte_carlo/README.md rename tutorials_and_tools/tutorials_and_tools/Monte Carlo - Arrhenius.py => tutorials/03_monte_carlo/scripts/01_arrhenius.py (91%) rename tutorials_and_tools/tutorials_and_tools/Monte Carlo - Standoff.py => tutorials/03_monte_carlo/scripts/02_standoff.py (91%) rename tutorials_and_tools/tutorials_and_tools/Geospatial - Local Scenario.ipynb => tutorials/04_geospatial/01_local_scenario.ipynb (100%) rename tutorials_and_tools/tutorials_and_tools/HPC Connection Required - Geospatial Templates.ipynb => tutorials/04_geospatial/02_geospatial_templates.ipynb (99%) rename tutorials_and_tools/tutorials_and_tools/HPC Connection Required - Scenario - Geographical Features.ipynb => tutorials/04_geospatial/03_scenario_geographical_features.ipynb (98%) rename tutorials_and_tools/tutorials_and_tools/HPC Connection Required - Scenario - Geospatial.ipynb => tutorials/04_geospatial/04_scenario_geospatial.ipynb (93%) rename tutorials_and_tools/tutorials_and_tools/HPC Connection Required - Scenario - Non-uniform Mountain Prefferential Downselect.ipynb => tutorials/04_geospatial/05_scenario_mountain_downselect.ipynb (98%) rename tutorials_and_tools/tutorials_and_tools/HPC Connection Required - Scenario - Single Location.ipynb => tutorials/04_geospatial/06_scenario_single_location.ipynb (99%) rename tutorials_and_tools/tutorials_and_tools/HPC Connection Required - Scenario - Temperature.ipynb => tutorials/04_geospatial/07_scenario_temperature.ipynb (99%) create mode 100644 tutorials/04_geospatial/08_module_standoff_iec63126.ipynb create mode 100644 tutorials/04_geospatial/README.md create mode 100644 tutorials/04_geospatial/scripts/01_local_scenario.py create mode 100644 tutorials/04_geospatial/scripts/02_geospatial_templates.py create mode 100644 tutorials/04_geospatial/scripts/03_scenario_geographical_features.py create mode 100644 tutorials/04_geospatial/scripts/04_scenario_geospatial.py create mode 100644 tutorials/04_geospatial/scripts/05_scenario_mountain_downselect.py create mode 100644 tutorials/04_geospatial/scripts/06_scenario_single_location.py create mode 100644 tutorials/04_geospatial/scripts/07_scenario_temperature.py create mode 100644 tutorials/04_geospatial/scripts/08_module_standoff_iec63126.py rename tutorials_and_tools/tutorials_and_tools/Custom-Functions-Nopython.ipynb => tutorials/05_advanced/01_custom_functions_nopython.ipynb (99%) rename tutorials_and_tools/tutorials_and_tools/Pysam - Single Location.ipynb => tutorials/05_advanced/02_pysam_single_location.ipynb (99%) rename tutorials_and_tools/tutorials_and_tools/API Call Required - PYSam.ipynb => tutorials/05_advanced/03_pysam_api.ipynb (87%) rename tutorials_and_tools/tutorials_and_tools/API Call Required - load_nsrdb_distributed.ipynb => tutorials/05_advanced/04_nsrdb_distributed_api.ipynb (99%) rename tutorials_and_tools/tutorials_and_tools/Removed store.py Required - load_pvgis_distributed.ipynb => tutorials/05_advanced/05_pvgis_distributed.ipynb (97%) create mode 100644 tutorials/05_advanced/README.md create mode 100644 tutorials/05_advanced/scripts/01_custom_functions_nopython.py create mode 100644 tutorials/05_advanced/scripts/02_pysam_single_location.py create mode 100644 tutorials/05_advanced/scripts/03_pysam_api.py create mode 100644 tutorials/05_advanced/scripts/04_nsrdb_distributed_api.py create mode 100644 tutorials/05_advanced/scripts/05_pvgis_distributed.py rename tutorials_and_tools/tutorials_and_tools/nrel-only/HPC Connection Required - Geospatial_world_map.ipynb => tutorials/06_nrel_hpc/01_geospatial_world_map.ipynb (96%) rename tutorials_and_tools/tutorials_and_tools/nrel-only/HPC Connection Required - LETID - Outdoor Geospatial Demo.ipynb => tutorials/06_nrel_hpc/02_letid_outdoor_geospatial_demo.ipynb (100%) create mode 100644 tutorials/06_nrel_hpc/README.md create mode 100644 tutorials/06_nrel_hpc/scripts/01_geospatial_world_map.py rename tutorials_and_tools/tutorials_and_tools/LETID - Outdoor Geospatial Demo.py => tutorials/06_nrel_hpc/scripts/02_letid_outdoor_geospatial_demo.py (94%) rename tutorials_and_tools/tutorials_and_tools/ASTM Live Demo.ipynb => tutorials/07_workshop_demos/01_astm_live_demo.ipynb (99%) rename tutorials_and_tools/tutorials_and_tools/nrel-only/HPC Connection Required - DuraMAT Live Demo.ipynb => tutorials/07_workshop_demos/02_duramat_live_demo.ipynb (99%) create mode 100644 tutorials/07_workshop_demos/README.md rename tutorials_and_tools/tutorials_and_tools/ASTM Live Demo.py => tutorials/07_workshop_demos/scripts/01_astm_live_demo.py (87%) rename tutorials_and_tools/tutorials_and_tools/DuraMAT Live Demo.py => tutorials/07_workshop_demos/scripts/02_duramat_live_demo.py (92%) rename {tutorials_and_tools => tutorials}/README.md (100%) create mode 100644 tutorials/TUTORIAL_INDEX.md rename {tutorials_and_tools => tutorials}/_config.yml (91%) create mode 100644 tutorials/_toc.yml rename tutorials_and_tools/tutorials_and_tools/temperature and degradation.json => tutorials/data/temperature_and_degradation.json (100%) rename {tutorials_and_tools/_build/html/_images => tutorials/images}/tutorial_1_NSRDB_example.PNG (100%) rename {tutorials_and_tools/tutorials_and_tools => tutorials}/images/xarray.webp (100%) rename {tutorials_and_tools/_build/html/_sources => tutorials}/intro.md (50%) rename {tutorials_and_tools => tutorials}/references.bib (100%) rename {tutorials_and_tools => tutorials}/requirements.txt (100%) delete mode 100644 tutorials_and_tools/_build/.doctrees/README.doctree delete mode 100644 tutorials_and_tools/_build/.doctrees/environment.pickle delete mode 100644 tutorials_and_tools/_build/.doctrees/intro.doctree delete mode 100644 tutorials_and_tools/_build/.doctrees/tutorials/1 - Basics, Humidity, Design.doctree delete mode 100644 tutorials_and_tools/_build/.doctrees/tutorials/2 - Degradation.doctree delete mode 100644 tutorials_and_tools/_build/.doctrees/tutorials/3 - Spectral Degradation.doctree delete mode 100644 tutorials_and_tools/_build/.doctrees/tutorials/4 - Standards.doctree delete mode 100644 tutorials_and_tools/_build/.doctrees/tutorials/5 - Weather Database Access.doctree delete mode 100644 tutorials_and_tools/_build/.doctrees/tutorials/ASTM Live Demo.doctree delete mode 100644 tutorials_and_tools/_build/.doctrees/tutorials/B-O LID - Accelerated Test.doctree delete mode 100644 tutorials_and_tools/_build/.doctrees/tutorials/LETID - Accelerated Test.doctree delete mode 100644 tutorials_and_tools/_build/.doctrees/tutorials/LETID - Outdoor LETID.doctree delete mode 100644 tutorials_and_tools/_build/.doctrees/tutorials/LETID - Outdoor Scenario Based on Accelerated Test Result.doctree delete mode 100644 tutorials_and_tools/_build/.doctrees/tutorials/LETID - Passivated Wafer.doctree delete mode 100644 tutorials_and_tools/_build/.doctrees/tutorials_and_tools/1 - Basics, Humidity, Design.doctree delete mode 100644 tutorials_and_tools/_build/.doctrees/tutorials_and_tools/2 - Degradation.doctree delete mode 100644 tutorials_and_tools/_build/.doctrees/tutorials_and_tools/3 - Spectral Degradation.doctree delete mode 100644 tutorials_and_tools/_build/.doctrees/tutorials_and_tools/4 - Weather Database Access.doctree delete mode 100644 tutorials_and_tools/_build/.doctrees/tutorials_and_tools/ASTM Live Demo.doctree delete mode 100644 tutorials_and_tools/_build/.doctrees/tutorials_and_tools/B-O LID - Accelerated Test.doctree delete mode 100644 tutorials_and_tools/_build/.doctrees/tutorials_and_tools/LETID - Accelerated Test.doctree delete mode 100644 tutorials_and_tools/_build/.doctrees/tutorials_and_tools/LETID - Outdoor LETID.doctree delete mode 100644 tutorials_and_tools/_build/.doctrees/tutorials_and_tools/LETID - Outdoor Scenario Based on Accelerated Test Result.doctree delete mode 100644 tutorials_and_tools/_build/.doctrees/tutorials_and_tools/LETID - Passivated Wafer.doctree delete mode 100644 tutorials_and_tools/_build/.doctrees/tutorials_and_tools/Tools - Module Standoff for IEC TS 63126.doctree delete mode 100644 tutorials_and_tools/_build/html/.buildinfo delete mode 100644 tutorials_and_tools/_build/html/README.html delete mode 100644 tutorials_and_tools/_build/html/_images/107f7fef49ab36e6af4427e6bb3ede63b6f2c49cc28e8bed9978b78a2fc25f9d.png delete mode 100644 tutorials_and_tools/_build/html/_images/12a7219e98973ba28ce9b9e91603d8be0bc62fd2db687db91b2a8295e3e9714e.png delete mode 100644 tutorials_and_tools/_build/html/_images/14c37892c8b58d28a264bc3509c0dff9bd00e18d854f76e1d1ff0d71676be23e.png delete mode 100644 tutorials_and_tools/_build/html/_images/289ba833c6ff3492e05e012cae1722ae2fe80ee499727ea3af871df5db449f6a.png delete mode 100644 tutorials_and_tools/_build/html/_images/4f6a6327b2f96578f28da787a302c436c791ca65967f80eaf6df5a15c42608a0.png delete mode 100644 tutorials_and_tools/_build/html/_images/62a814bc767852db0cebc742523497450f2876ebff4bfd96d0b728e8c9869e42.png delete mode 100644 tutorials_and_tools/_build/html/_images/640486cb8d5836d69776fccd5472e808cd03e0b0679c4caa4b2e126fa443a74d.png delete mode 100644 tutorials_and_tools/_build/html/_images/7301c268ac687a32bd45452ecc8d61117aab373d7340c4c1edfb6fe460f26fdb.png delete mode 100644 tutorials_and_tools/_build/html/_images/78392251ce93847fb1ad4d1529db2f12af2762c68e879e813c52d20184f31e13.png delete mode 100644 tutorials_and_tools/_build/html/_images/85d967582ae2bb9bb9a45e1cfc91f4634d41142ea9a3c7811ec4050e970c4b79.png delete mode 100644 tutorials_and_tools/_build/html/_images/889fab6bd387f5c1cdbd3697ad508d07ce25e0cdb2e338b73bc4dfe058bf0a73.png delete mode 100644 tutorials_and_tools/_build/html/_images/8ca345321f03990ea6b8c541d35c9bee777190fd1b6c82a55946243f011a679f.png delete mode 100644 tutorials_and_tools/_build/html/_images/CAMS Radiation Satellite map.jpg delete mode 100644 tutorials_and_tools/_build/html/_images/NSRDB Graphic Update 2021.jpg delete mode 100644 tutorials_and_tools/_build/html/_images/NSRDB PSM3 Satellite map.jpg delete mode 100644 tutorials_and_tools/_build/html/_images/NSRDB-data-viewer.png delete mode 100644 tutorials_and_tools/_build/html/_images/PVGIS Default Solar Radiation Database 100ppi_1.png delete mode 100644 tutorials_and_tools/_build/html/_images/SARAH (PVGIS) Satellite map.jpg delete mode 100644 tutorials_and_tools/_build/html/_images/a2338a98873f28f70d1022004561bd420f0a2a046ffe926049540d55dce3db7b.png delete mode 100644 tutorials_and_tools/_build/html/_images/a4fc985792ddf3301a6a1d2d827a30e4560482ae6f665332ca5c34c00581af44.png delete mode 100644 tutorials_and_tools/_build/html/_images/ac084646d15990889dcd2453552e192a0b45c4987bb90ff10cb7156a089d55d8.png delete mode 100644 tutorials_and_tools/_build/html/_images/b95b6944f31d700b58e70ea247d251a83ec48611c97d99de2a3f0386d6f85e65.png delete mode 100644 tutorials_and_tools/_build/html/_images/baa77bfc7071cdb8dbe6db743471f2623e8fa6b4caa5fe081a934a0a95e677a5.png delete mode 100644 tutorials_and_tools/_build/html/_images/bb1b5e01b51209571f7c16f07967b106d6b7cfedf39d36bf3b1ed247f7603e34.png delete mode 100644 tutorials_and_tools/_build/html/_images/ca65efc28b548b68b33737945575b7cfd758488337a0e5c3090e05b68d166c40.png delete mode 100644 tutorials_and_tools/_build/html/_images/d1e14a95a0238c112b229d421d9d9cb6dcb41467c123c119e2f9d85ef491d62d.png delete mode 100644 tutorials_and_tools/_build/html/_images/d36a4cab4a9ad1f61e5f22cbfdc128d6c8059725a5c531be5766a5ae26006893.png delete mode 100644 tutorials_and_tools/_build/html/_images/e4247cbd99ddedad38a3ec627def7d83e55865e57f15ac7db963704e8b99f3f8.png delete mode 100644 tutorials_and_tools/_build/html/_images/e49f2de7f2cc33da5133d8bce4be8c74fff7e2129acc0fe1d8d0af0755ad9c15.png delete mode 100644 tutorials_and_tools/_build/html/_images/f8b7c3747a7fc0703bb86ab35f35f084437bbba1384c14d2b44ab5c509adcff6.png delete mode 100644 tutorials_and_tools/_build/html/_sources/README.md delete mode 100644 tutorials_and_tools/_build/html/_sources/tutorials/1 - Basics, Humidity, Design.ipynb delete mode 100644 tutorials_and_tools/_build/html/_sources/tutorials/2 - Degradation.ipynb delete mode 100644 tutorials_and_tools/_build/html/_sources/tutorials/3 - Spectral Degradation.ipynb delete mode 100644 tutorials_and_tools/_build/html/_sources/tutorials/4 - Standards.ipynb delete mode 100644 tutorials_and_tools/_build/html/_sources/tutorials/5 - Weather Database Access.ipynb delete mode 100644 tutorials_and_tools/_build/html/_sources/tutorials/ASTM Live Demo.ipynb delete mode 100644 tutorials_and_tools/_build/html/_sources/tutorials/B-O LID - Accelerated Test.ipynb delete mode 100644 tutorials_and_tools/_build/html/_sources/tutorials/LETID - Accelerated Test.ipynb delete mode 100644 tutorials_and_tools/_build/html/_sources/tutorials/LETID - Outdoor LETID.ipynb delete mode 100644 tutorials_and_tools/_build/html/_sources/tutorials/LETID - Outdoor Scenario Based on Accelerated Test Result.ipynb delete mode 100644 tutorials_and_tools/_build/html/_sources/tutorials/LETID - Passivated Wafer.ipynb delete mode 100644 tutorials_and_tools/_build/html/_sources/tutorials_and_tools/1 - Basics, Humidity, Design.ipynb delete mode 100644 tutorials_and_tools/_build/html/_sources/tutorials_and_tools/2 - Degradation.ipynb delete mode 100644 tutorials_and_tools/_build/html/_sources/tutorials_and_tools/3 - Spectral Degradation.ipynb delete mode 100644 tutorials_and_tools/_build/html/_sources/tutorials_and_tools/4 - Weather Database Access.ipynb delete mode 100644 tutorials_and_tools/_build/html/_sources/tutorials_and_tools/ASTM Live Demo.ipynb delete mode 100644 tutorials_and_tools/_build/html/_sources/tutorials_and_tools/B-O LID - Accelerated Test.ipynb delete mode 100644 tutorials_and_tools/_build/html/_sources/tutorials_and_tools/LETID - Accelerated Test.ipynb delete mode 100644 tutorials_and_tools/_build/html/_sources/tutorials_and_tools/LETID - Outdoor LETID.ipynb delete mode 100644 tutorials_and_tools/_build/html/_sources/tutorials_and_tools/LETID - Outdoor Scenario Based on Accelerated Test Result.ipynb delete mode 100644 tutorials_and_tools/_build/html/_sources/tutorials_and_tools/LETID - Passivated Wafer.ipynb delete mode 100644 tutorials_and_tools/_build/html/_sources/tutorials_and_tools/Tools - Module Standoff for IEC TS 63126.ipynb delete mode 100644 tutorials_and_tools/_build/html/_sphinx_design_static/design-style.1e8bd061cd6da7fc9cf755528e8ffc24.min.css delete mode 100644 tutorials_and_tools/_build/html/_sphinx_design_static/design-tabs.js delete mode 100644 tutorials_and_tools/_build/html/_static/_sphinx_javascript_frameworks_compat.js delete mode 100644 tutorials_and_tools/_build/html/_static/basic.css delete mode 100644 tutorials_and_tools/_build/html/_static/check-solid.svg delete mode 100644 tutorials_and_tools/_build/html/_static/clipboard.min.js delete mode 100644 tutorials_and_tools/_build/html/_static/copy-button.svg delete mode 100644 tutorials_and_tools/_build/html/_static/copybutton.css delete mode 100644 tutorials_and_tools/_build/html/_static/copybutton.js delete mode 100644 tutorials_and_tools/_build/html/_static/copybutton_funcs.js delete mode 100644 tutorials_and_tools/_build/html/_static/design-style.1e8bd061cd6da7fc9cf755528e8ffc24.min.css delete mode 100644 tutorials_and_tools/_build/html/_static/design-style.4045f2051d55cab465a707391d5b2007.min.css delete mode 100644 tutorials_and_tools/_build/html/_static/design-tabs.js delete mode 100644 tutorials_and_tools/_build/html/_static/doctools.js delete mode 100644 tutorials_and_tools/_build/html/_static/documentation_options.js delete mode 100644 tutorials_and_tools/_build/html/_static/file.png delete mode 100644 tutorials_and_tools/_build/html/_static/images/logo_binder.svg delete mode 100644 tutorials_and_tools/_build/html/_static/images/logo_colab.png delete mode 100644 tutorials_and_tools/_build/html/_static/images/logo_deepnote.svg delete mode 100644 tutorials_and_tools/_build/html/_static/images/logo_jupyterhub.svg delete mode 100644 tutorials_and_tools/_build/html/_static/jquery-3.6.0.js delete mode 100644 tutorials_and_tools/_build/html/_static/jquery.js delete mode 100644 tutorials_and_tools/_build/html/_static/language_data.js delete mode 100644 tutorials_and_tools/_build/html/_static/locales/ar/LC_MESSAGES/booktheme.po delete mode 100644 tutorials_and_tools/_build/html/_static/locales/bg/LC_MESSAGES/booktheme.po delete mode 100644 tutorials_and_tools/_build/html/_static/locales/bn/LC_MESSAGES/booktheme.po delete mode 100644 tutorials_and_tools/_build/html/_static/locales/ca/LC_MESSAGES/booktheme.po delete mode 100644 tutorials_and_tools/_build/html/_static/locales/cs/LC_MESSAGES/booktheme.po delete mode 100644 tutorials_and_tools/_build/html/_static/locales/da/LC_MESSAGES/booktheme.po delete mode 100644 tutorials_and_tools/_build/html/_static/locales/de/LC_MESSAGES/booktheme.po delete mode 100644 tutorials_and_tools/_build/html/_static/locales/el/LC_MESSAGES/booktheme.po delete mode 100644 tutorials_and_tools/_build/html/_static/locales/eo/LC_MESSAGES/booktheme.po delete mode 100644 tutorials_and_tools/_build/html/_static/locales/es/LC_MESSAGES/booktheme.po delete mode 100644 tutorials_and_tools/_build/html/_static/locales/et/LC_MESSAGES/booktheme.po delete mode 100644 tutorials_and_tools/_build/html/_static/locales/fi/LC_MESSAGES/booktheme.po delete mode 100644 tutorials_and_tools/_build/html/_static/locales/fr/LC_MESSAGES/booktheme.po delete mode 100644 tutorials_and_tools/_build/html/_static/locales/hr/LC_MESSAGES/booktheme.po delete mode 100644 tutorials_and_tools/_build/html/_static/locales/id/LC_MESSAGES/booktheme.po delete mode 100644 tutorials_and_tools/_build/html/_static/locales/it/LC_MESSAGES/booktheme.po delete mode 100644 tutorials_and_tools/_build/html/_static/locales/iw/LC_MESSAGES/booktheme.po delete mode 100644 tutorials_and_tools/_build/html/_static/locales/ja/LC_MESSAGES/booktheme.po delete mode 100644 tutorials_and_tools/_build/html/_static/locales/ko/LC_MESSAGES/booktheme.po delete mode 100644 tutorials_and_tools/_build/html/_static/locales/lt/LC_MESSAGES/booktheme.po delete mode 100644 tutorials_and_tools/_build/html/_static/locales/lv/LC_MESSAGES/booktheme.po delete mode 100644 tutorials_and_tools/_build/html/_static/locales/ml/LC_MESSAGES/booktheme.po delete mode 100644 tutorials_and_tools/_build/html/_static/locales/mr/LC_MESSAGES/booktheme.po delete mode 100644 tutorials_and_tools/_build/html/_static/locales/ms/LC_MESSAGES/booktheme.po delete mode 100644 tutorials_and_tools/_build/html/_static/locales/nl/LC_MESSAGES/booktheme.po delete mode 100644 tutorials_and_tools/_build/html/_static/locales/no/LC_MESSAGES/booktheme.po delete mode 100644 tutorials_and_tools/_build/html/_static/locales/pl/LC_MESSAGES/booktheme.po delete mode 100644 tutorials_and_tools/_build/html/_static/locales/pt/LC_MESSAGES/booktheme.po delete mode 100644 tutorials_and_tools/_build/html/_static/locales/ro/LC_MESSAGES/booktheme.po delete mode 100644 tutorials_and_tools/_build/html/_static/locales/ru/LC_MESSAGES/booktheme.po delete mode 100644 tutorials_and_tools/_build/html/_static/locales/sk/LC_MESSAGES/booktheme.po delete mode 100644 tutorials_and_tools/_build/html/_static/locales/sl/LC_MESSAGES/booktheme.po delete mode 100644 tutorials_and_tools/_build/html/_static/locales/sr/LC_MESSAGES/booktheme.po delete mode 100644 tutorials_and_tools/_build/html/_static/locales/sv/LC_MESSAGES/booktheme.po delete mode 100644 tutorials_and_tools/_build/html/_static/locales/ta/LC_MESSAGES/booktheme.po delete mode 100644 tutorials_and_tools/_build/html/_static/locales/te/LC_MESSAGES/booktheme.po delete mode 100644 tutorials_and_tools/_build/html/_static/locales/tg/LC_MESSAGES/booktheme.po delete mode 100644 tutorials_and_tools/_build/html/_static/locales/th/LC_MESSAGES/booktheme.po delete mode 100644 tutorials_and_tools/_build/html/_static/locales/tl/LC_MESSAGES/booktheme.po delete mode 100644 tutorials_and_tools/_build/html/_static/locales/tr/LC_MESSAGES/booktheme.po delete mode 100644 tutorials_and_tools/_build/html/_static/locales/uk/LC_MESSAGES/booktheme.po delete mode 100644 tutorials_and_tools/_build/html/_static/locales/ur/LC_MESSAGES/booktheme.po delete mode 100644 tutorials_and_tools/_build/html/_static/locales/vi/LC_MESSAGES/booktheme.po delete mode 100644 tutorials_and_tools/_build/html/_static/locales/zh_CN/LC_MESSAGES/booktheme.po delete mode 100644 tutorials_and_tools/_build/html/_static/locales/zh_TW/LC_MESSAGES/booktheme.po delete mode 100644 tutorials_and_tools/_build/html/_static/minus.png delete mode 100644 tutorials_and_tools/_build/html/_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css delete mode 100644 tutorials_and_tools/_build/html/_static/play-solid.svg delete mode 100644 tutorials_and_tools/_build/html/_static/plus.png delete mode 100644 tutorials_and_tools/_build/html/_static/pygments.css delete mode 100644 tutorials_and_tools/_build/html/_static/sbt-webpack-macros.html delete mode 100644 tutorials_and_tools/_build/html/_static/scripts/bootstrap.js delete mode 100644 tutorials_and_tools/_build/html/_static/scripts/bootstrap.js.LICENSE.txt delete mode 100644 tutorials_and_tools/_build/html/_static/scripts/bootstrap.js.map delete mode 100644 tutorials_and_tools/_build/html/_static/scripts/pydata-sphinx-theme.js delete mode 100644 tutorials_and_tools/_build/html/_static/scripts/pydata-sphinx-theme.js.map delete mode 100644 tutorials_and_tools/_build/html/_static/scripts/sphinx-book-theme.js delete mode 100644 tutorials_and_tools/_build/html/_static/scripts/sphinx-book-theme.js.map delete mode 100644 tutorials_and_tools/_build/html/_static/searchtools.js delete mode 100644 tutorials_and_tools/_build/html/_static/sphinx-thebe.css delete mode 100644 tutorials_and_tools/_build/html/_static/sphinx-thebe.js delete mode 100644 tutorials_and_tools/_build/html/_static/sphinx_highlight.js delete mode 100644 tutorials_and_tools/_build/html/_static/styles/bootstrap.css delete mode 100644 tutorials_and_tools/_build/html/_static/styles/bootstrap.css.map delete mode 100644 tutorials_and_tools/_build/html/_static/styles/pydata-sphinx-theme.css delete mode 100644 tutorials_and_tools/_build/html/_static/styles/pydata-sphinx-theme.css.map delete mode 100644 tutorials_and_tools/_build/html/_static/styles/sphinx-book-theme.css delete mode 100644 tutorials_and_tools/_build/html/_static/styles/theme.css delete mode 100644 tutorials_and_tools/_build/html/_static/togglebutton.css delete mode 100644 tutorials_and_tools/_build/html/_static/togglebutton.js delete mode 100644 tutorials_and_tools/_build/html/_static/underscore-1.13.1.js delete mode 100644 tutorials_and_tools/_build/html/_static/underscore.js delete mode 100644 tutorials_and_tools/_build/html/_static/vendor/fontawesome/6.1.2/LICENSE.txt delete mode 100644 tutorials_and_tools/_build/html/_static/vendor/fontawesome/6.1.2/css/all.min.css delete mode 100644 tutorials_and_tools/_build/html/_static/vendor/fontawesome/6.1.2/webfonts/fa-brands-400.ttf delete mode 100644 tutorials_and_tools/_build/html/_static/vendor/fontawesome/6.1.2/webfonts/fa-brands-400.woff2 delete mode 100644 tutorials_and_tools/_build/html/_static/vendor/fontawesome/6.1.2/webfonts/fa-regular-400.ttf delete mode 100644 tutorials_and_tools/_build/html/_static/vendor/fontawesome/6.1.2/webfonts/fa-regular-400.woff2 delete mode 100644 tutorials_and_tools/_build/html/_static/vendor/fontawesome/6.1.2/webfonts/fa-solid-900.ttf delete mode 100644 tutorials_and_tools/_build/html/_static/vendor/fontawesome/6.1.2/webfonts/fa-solid-900.woff2 delete mode 100644 tutorials_and_tools/_build/html/_static/vendor/fontawesome/6.1.2/webfonts/fa-v4compatibility.ttf delete mode 100644 tutorials_and_tools/_build/html/_static/vendor/fontawesome/6.1.2/webfonts/fa-v4compatibility.woff2 delete mode 100644 tutorials_and_tools/_build/html/_static/vendor/fontawesome/6.5.1/LICENSE.txt delete mode 100644 tutorials_and_tools/_build/html/_static/vendor/fontawesome/6.5.1/css/all.min.css delete mode 100644 tutorials_and_tools/_build/html/_static/vendor/fontawesome/6.5.1/js/all.min.js delete mode 100644 tutorials_and_tools/_build/html/_static/vendor/fontawesome/6.5.1/js/all.min.js.LICENSE.txt delete mode 100644 tutorials_and_tools/_build/html/_static/vendor/fontawesome/6.5.1/webfonts/fa-brands-400.ttf delete mode 100644 tutorials_and_tools/_build/html/_static/vendor/fontawesome/6.5.1/webfonts/fa-brands-400.woff2 delete mode 100644 tutorials_and_tools/_build/html/_static/vendor/fontawesome/6.5.1/webfonts/fa-regular-400.ttf delete mode 100644 tutorials_and_tools/_build/html/_static/vendor/fontawesome/6.5.1/webfonts/fa-regular-400.woff2 delete mode 100644 tutorials_and_tools/_build/html/_static/vendor/fontawesome/6.5.1/webfonts/fa-solid-900.ttf delete mode 100644 tutorials_and_tools/_build/html/_static/vendor/fontawesome/6.5.1/webfonts/fa-solid-900.woff2 delete mode 100644 tutorials_and_tools/_build/html/_static/vendor/fontawesome/6.5.1/webfonts/fa-v4compatibility.ttf delete mode 100644 tutorials_and_tools/_build/html/_static/vendor/fontawesome/6.5.1/webfonts/fa-v4compatibility.woff2 delete mode 100644 tutorials_and_tools/_build/html/_static/webpack-macros.html delete mode 100644 tutorials_and_tools/_build/html/genindex.html delete mode 100644 tutorials_and_tools/_build/html/index.html delete mode 100644 tutorials_and_tools/_build/html/intro.html delete mode 100644 tutorials_and_tools/_build/html/objects.inv delete mode 100644 tutorials_and_tools/_build/html/search.html delete mode 100644 tutorials_and_tools/_build/html/searchindex.js delete mode 100644 tutorials_and_tools/_build/html/tutorials/1 - Basics, Humidity, Design.html delete mode 100644 tutorials_and_tools/_build/html/tutorials/2 - Degradation.html delete mode 100644 tutorials_and_tools/_build/html/tutorials/3 - Spectral Degradation.html delete mode 100644 tutorials_and_tools/_build/html/tutorials/4 - Standards.html delete mode 100644 tutorials_and_tools/_build/html/tutorials/5 - Weather Database Access.html delete mode 100644 tutorials_and_tools/_build/html/tutorials/ASTM Live Demo.html delete mode 100644 tutorials_and_tools/_build/html/tutorials/B-O LID - Accelerated Test.html delete mode 100644 tutorials_and_tools/_build/html/tutorials/LETID - Accelerated Test.html delete mode 100644 tutorials_and_tools/_build/html/tutorials/LETID - Outdoor LETID.html delete mode 100644 tutorials_and_tools/_build/html/tutorials/LETID - Outdoor Scenario Based on Accelerated Test Result.html delete mode 100644 tutorials_and_tools/_build/html/tutorials/LETID - Passivated Wafer.html delete mode 100644 tutorials_and_tools/_build/html/tutorials_and_tools/1 - Basics, Humidity, Design.html delete mode 100644 tutorials_and_tools/_build/html/tutorials_and_tools/2 - Degradation.html delete mode 100644 tutorials_and_tools/_build/html/tutorials_and_tools/3 - Spectral Degradation.html delete mode 100644 tutorials_and_tools/_build/html/tutorials_and_tools/4 - Weather Database Access.html delete mode 100644 tutorials_and_tools/_build/html/tutorials_and_tools/ASTM Live Demo.html delete mode 100644 tutorials_and_tools/_build/html/tutorials_and_tools/B-O LID - Accelerated Test.html delete mode 100644 tutorials_and_tools/_build/html/tutorials_and_tools/LETID - Accelerated Test.html delete mode 100644 tutorials_and_tools/_build/html/tutorials_and_tools/LETID - Outdoor LETID.html delete mode 100644 tutorials_and_tools/_build/html/tutorials_and_tools/LETID - Outdoor Scenario Based on Accelerated Test Result.html delete mode 100644 tutorials_and_tools/_build/html/tutorials_and_tools/LETID - Passivated Wafer.html delete mode 100644 tutorials_and_tools/_build/html/tutorials_and_tools/Tools - Module Standoff for IEC TS 63126.html delete mode 100644 tutorials_and_tools/_build/jupyter_execute/107f7fef49ab36e6af4427e6bb3ede63b6f2c49cc28e8bed9978b78a2fc25f9d.png delete mode 100644 tutorials_and_tools/_build/jupyter_execute/12a7219e98973ba28ce9b9e91603d8be0bc62fd2db687db91b2a8295e3e9714e.png delete mode 100644 tutorials_and_tools/_build/jupyter_execute/14c37892c8b58d28a264bc3509c0dff9bd00e18d854f76e1d1ff0d71676be23e.png delete mode 100644 tutorials_and_tools/_build/jupyter_execute/289ba833c6ff3492e05e012cae1722ae2fe80ee499727ea3af871df5db449f6a.png delete mode 100644 tutorials_and_tools/_build/jupyter_execute/4f6a6327b2f96578f28da787a302c436c791ca65967f80eaf6df5a15c42608a0.png delete mode 100644 tutorials_and_tools/_build/jupyter_execute/62a814bc767852db0cebc742523497450f2876ebff4bfd96d0b728e8c9869e42.png delete mode 100644 tutorials_and_tools/_build/jupyter_execute/640486cb8d5836d69776fccd5472e808cd03e0b0679c4caa4b2e126fa443a74d.png delete mode 100644 tutorials_and_tools/_build/jupyter_execute/7301c268ac687a32bd45452ecc8d61117aab373d7340c4c1edfb6fe460f26fdb.png delete mode 100644 tutorials_and_tools/_build/jupyter_execute/78392251ce93847fb1ad4d1529db2f12af2762c68e879e813c52d20184f31e13.png delete mode 100644 tutorials_and_tools/_build/jupyter_execute/85d967582ae2bb9bb9a45e1cfc91f4634d41142ea9a3c7811ec4050e970c4b79.png delete mode 100644 tutorials_and_tools/_build/jupyter_execute/889fab6bd387f5c1cdbd3697ad508d07ce25e0cdb2e338b73bc4dfe058bf0a73.png delete mode 100644 tutorials_and_tools/_build/jupyter_execute/8ca345321f03990ea6b8c541d35c9bee777190fd1b6c82a55946243f011a679f.png delete mode 100644 tutorials_and_tools/_build/jupyter_execute/a2338a98873f28f70d1022004561bd420f0a2a046ffe926049540d55dce3db7b.png delete mode 100644 tutorials_and_tools/_build/jupyter_execute/a4fc985792ddf3301a6a1d2d827a30e4560482ae6f665332ca5c34c00581af44.png delete mode 100644 tutorials_and_tools/_build/jupyter_execute/ac084646d15990889dcd2453552e192a0b45c4987bb90ff10cb7156a089d55d8.png delete mode 100644 tutorials_and_tools/_build/jupyter_execute/b95b6944f31d700b58e70ea247d251a83ec48611c97d99de2a3f0386d6f85e65.png delete mode 100644 tutorials_and_tools/_build/jupyter_execute/baa77bfc7071cdb8dbe6db743471f2623e8fa6b4caa5fe081a934a0a95e677a5.png delete mode 100644 tutorials_and_tools/_build/jupyter_execute/bb1b5e01b51209571f7c16f07967b106d6b7cfedf39d36bf3b1ed247f7603e34.png delete mode 100644 tutorials_and_tools/_build/jupyter_execute/ca65efc28b548b68b33737945575b7cfd758488337a0e5c3090e05b68d166c40.png delete mode 100644 tutorials_and_tools/_build/jupyter_execute/d1e14a95a0238c112b229d421d9d9cb6dcb41467c123c119e2f9d85ef491d62d.png delete mode 100644 tutorials_and_tools/_build/jupyter_execute/d36a4cab4a9ad1f61e5f22cbfdc128d6c8059725a5c531be5766a5ae26006893.png delete mode 100644 tutorials_and_tools/_build/jupyter_execute/e4247cbd99ddedad38a3ec627def7d83e55865e57f15ac7db963704e8b99f3f8.png delete mode 100644 tutorials_and_tools/_build/jupyter_execute/e49f2de7f2cc33da5133d8bce4be8c74fff7e2129acc0fe1d8d0af0755ad9c15.png delete mode 100644 tutorials_and_tools/_build/jupyter_execute/f8b7c3747a7fc0703bb86ab35f35f084437bbba1384c14d2b44ab5c509adcff6.png delete mode 100644 tutorials_and_tools/_build/jupyter_execute/tutorials/1 - Basics, Humidity, Design.ipynb delete mode 100644 tutorials_and_tools/_build/jupyter_execute/tutorials/2 - Degradation.ipynb delete mode 100644 tutorials_and_tools/_build/jupyter_execute/tutorials/3 - Spectral Degradation.ipynb delete mode 100644 tutorials_and_tools/_build/jupyter_execute/tutorials/4 - Standards.ipynb delete mode 100644 tutorials_and_tools/_build/jupyter_execute/tutorials/5 - Weather Database Access.ipynb delete mode 100644 tutorials_and_tools/_build/jupyter_execute/tutorials/ASTM Live Demo.ipynb delete mode 100644 tutorials_and_tools/_build/jupyter_execute/tutorials/B-O LID - Accelerated Test.ipynb delete mode 100644 tutorials_and_tools/_build/jupyter_execute/tutorials/LETID - Accelerated Test.ipynb delete mode 100644 tutorials_and_tools/_build/jupyter_execute/tutorials/LETID - Outdoor LETID.ipynb delete mode 100644 tutorials_and_tools/_build/jupyter_execute/tutorials/LETID - Outdoor Scenario Based on Accelerated Test Result.ipynb delete mode 100644 tutorials_and_tools/_build/jupyter_execute/tutorials/LETID - Passivated Wafer.ipynb delete mode 100644 tutorials_and_tools/_build/jupyter_execute/tutorials_and_tools/1 - Basics, Humidity, Design.ipynb delete mode 100644 tutorials_and_tools/_build/jupyter_execute/tutorials_and_tools/2 - Degradation.ipynb delete mode 100644 tutorials_and_tools/_build/jupyter_execute/tutorials_and_tools/3 - Spectral Degradation.ipynb delete mode 100644 tutorials_and_tools/_build/jupyter_execute/tutorials_and_tools/4 - Weather Database Access.ipynb delete mode 100644 tutorials_and_tools/_build/jupyter_execute/tutorials_and_tools/ASTM Live Demo.ipynb delete mode 100644 tutorials_and_tools/_build/jupyter_execute/tutorials_and_tools/B-O LID - Accelerated Test.ipynb delete mode 100644 tutorials_and_tools/_build/jupyter_execute/tutorials_and_tools/LETID - Accelerated Test.ipynb delete mode 100644 tutorials_and_tools/_build/jupyter_execute/tutorials_and_tools/LETID - Outdoor LETID.ipynb delete mode 100644 tutorials_and_tools/_build/jupyter_execute/tutorials_and_tools/LETID - Outdoor Scenario Based on Accelerated Test Result.ipynb delete mode 100644 tutorials_and_tools/_build/jupyter_execute/tutorials_and_tools/LETID - Passivated Wafer.ipynb delete mode 100644 tutorials_and_tools/_build/jupyter_execute/tutorials_and_tools/Tools - Module Standoff for IEC TS 63126.ipynb delete mode 100644 tutorials_and_tools/_toc.yml delete mode 100644 tutorials_and_tools/intro.md delete mode 100644 tutorials_and_tools/tutorials_and_tools/images/T98_70C_standoff_Map.png delete mode 100644 tutorials_and_tools/tutorials_and_tools/images/tutorial_1_NSRDB_example.PNG delete mode 100644 tutorials_and_tools/tutorials_and_tools/pvd_job_temperature and degradation/temperature and degradation.json diff --git a/.github/workflows/nbval.yaml b/.github/workflows/nbval.yaml index 45ffbe289..2e63b9f4b 100644 --- a/.github/workflows/nbval.yaml +++ b/.github/workflows/nbval.yaml @@ -15,23 +15,25 @@ jobs: env: # Notebooks with estimated runtime in seconds (format: "notebook:runtime") ALL_NOTEBOOKS: | - "1 - Basics, Humidity, Design.ipynb:10" - "2 - Degradation.ipynb:5" - "3 - Spectral Degradation.ipynb:5" - "4 - Weather Database Access.ipynb:15" - "ASTM Live Demo.ipynb:10" - "B-O LID - Accelerated Test.ipynb:10" - "Custom-Functions-Nopython.ipynb:30" - "LETID - Accelerated Test.ipynb:120" - "LETID - Outdoor LETID.ipynb:30" - "LETID - Outdoor Scenario Based on Accelerated Test Result.ipynb:45" - "LETID - Passivated Wafer.ipynb:80" - "Monte Carlo - Arrhenius.ipynb:180" - "Monte Carlo - Standoff.ipynb:30" - "Pysam - Single Location.ipynb:25" - "Tools - Edge Seal Oxygen Ingress.ipynb:15" - "Van't Hoff Degradation Model.ipynb:5" - "Geospatial - Local Scenario.ipynb:1" + "01_basics/01_basics_humidity_design.ipynb:10" + "01_basics/02_degradation.ipynb:5" + "01_basics/03_spectral_degradation.ipynb:5" + "01_basics/04_weather_database_access.ipynb:15" + "02_degradation/01_bo_lid_accelerated_test.ipynb:10" + "02_degradation/02_letid_accelerated_test.ipynb:120" + "02_degradation/03_letid_outdoor.ipynb:30" + "02_degradation/04_letid_outdoor_scenario.ipynb:45" + "02_degradation/05_letid_passivated_wafer.ipynb:80" + "02_degradation/06_vant_hoff_degradation_model.ipynb:5" + "03_monte_carlo/01_arrhenius.ipynb:180" + "03_monte_carlo/02_standoff.ipynb:30" + "04_geospatial/01_local_scenario.ipynb:1" + "05_advanced/01_custom_functions_nopython.ipynb:30" + "05_advanced/02_pysam_single_location.ipynb:25" + "07_workshop_demos/01_astm_live_demo.ipynb:10" + "../tools/Tools - Degradation.ipynb:15" + "../tools/Tools - Edge Seal Oxygen Ingress.ipynb:15" + "../tools/Tools - Module Standoff for IEC TS 63126.ipynb:20" steps: - name: Calculate batch matrix id: set-matrix @@ -151,7 +153,7 @@ jobs: fail-fast: false matrix: ${{ fromJson(needs.calculate-batches.outputs.matrix) }} env: - NOTEBOOK_DIR: "tutorials_and_tools/tutorials_and_tools" + NOTEBOOK_DIR: "tutorials" SANITIZE_CFG: "nbval_sanitization_rules.cfg" ALL_NOTEBOOKS: ${{ needs.calculate-batches.outputs.notebooks }} BATCH_ASSIGNMENTS: ${{ needs.calculate-batches.outputs.batch_assignments }} @@ -168,14 +170,14 @@ jobs: uses: actions/cache@v4 with: path: ~/.cache/pip - key: ${{ runner.os }}-pip-${{ hashFiles('tutorials_and_tools/requirements.txt', 'pyproject.toml') }} + key: ${{ runner.os }}-pip-${{ hashFiles('tutorials/requirements.txt', 'pyproject.toml') }} restore-keys: | ${{ runner.os }}-pip- - name: Install notebook environment run: | python -m pip install --upgrade pip wheel - pip install --timeout=300 -r tutorials_and_tools/requirements.txt + pip install --timeout=300 -r tutorials/requirements.txt pip install --timeout=300 -e .[test] pip install nbval global_land_mask dotenv imageio nrel-pysam pip install nbconvert[webpdf] diff --git a/.github/workflows/testbook.yaml b/.github/workflows/testbook.yaml index 161dc41ed..8ab761d4f 100644 --- a/.github/workflows/testbook.yaml +++ b/.github/workflows/testbook.yaml @@ -6,17 +6,16 @@ jobs: notebook-testbook-check: runs-on: ubuntu-latest env: - NOTEBOOK_DIR: "tutorials_and_tools/tutorials_and_tools" + NOTEBOOK_DIR: "tutorials" TESTBOOK_NOTEBOOK_LIST: | - "API Call Required - PYSam.ipynb" - "API Call Required - load_nsrdb_distributed.ipynb" - "HPC Connection Required - Scenario - Geographical Features.ipynb" - "HPC Connection Required - Scenario - Geospatial.ipynb" - "HPC Connection Required - Scenario - Non-uniform Mountain Prefferential Downselect.ipynb" - "HPC Connection Required - Scenario - Single Location.ipynb" - "HPC Connection Required - Scenario - Temperature.ipynb" - "HPC Connection Required - Tools - Module Standoff for IEC TS 63126.ipynb" - "HPC Connection Required - Geospatial Templates.ipynb" + "05_advanced/03_pysam_api.ipynb" + "05_advanced/04_nsrdb_distributed_api.ipynb" + "04_geospatial/03_scenario_geographical_features.ipynb" + "04_geospatial/04_scenario_geospatial.ipynb" + "04_geospatial/05_scenario_mountain_downselect.ipynb" + "04_geospatial/06_scenario_single_location.ipynb" + "04_geospatial/07_scenario_temperature.ipynb" + "04_geospatial/02_geospatial_templates.ipynb" steps: - uses: actions/checkout@v4 @@ -27,7 +26,7 @@ jobs: - name: Install notebook environment run: | python -m pip install --upgrade pip wheel - pip install --timeout=300 -r tutorials_and_tools/requirements.txt + pip install --timeout=300 -r tutorials/requirements.txt pip install --timeout=300 -e .[test] pip install testbook pip install global_land_mask dotenv imageio nrel-pysam diff --git a/.gitignore b/.gitignore index a4c303f76..0fe206002 100644 --- a/.gitignore +++ b/.gitignore @@ -70,6 +70,8 @@ docs/sphinx/_build/ # tutorial jupyter-book pvdeg_tutorials/_build/ +tutorials/_build/ +tutorials_and_tools/_build/ # PyBuilder target/ diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index f641d7edb..80e6ee21f 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,6 +1,6 @@ # See https://pre-commit.com for more information # See https://pre-commit.com/hooks.html for more hooks -exclude: '^(docs/source/|tutorials_and_tools/_build/)' +exclude: '^(docs/source/|tutorials/_build/)' repos: - repo: https://github.com/pre-commit/pre-commit-hooks rev: v6.0.0 @@ -14,9 +14,17 @@ repos: rev: 25.9.0 hooks: - id: black - exclude: '^tutorials_and_tools/' + exclude: '^(tutorials/|tools/)' - repo: https://github.com/PyCQA/flake8 rev: 7.3.0 # Use the desired flake8 version hooks: - id: flake8 - exclude: '^tutorials_and_tools/' + exclude: '^(tutorials/|tools/)' +- repo: https://github.com/mwouts/jupytext + rev: v1.18.1 + hooks: + - id: jupytext + args: [--sync, --pipe, black] + files: '^(tutorials/|tools/).*\.ipynb$' + additional_dependencies: + - black==25.9.0 diff --git a/jupytext.toml b/jupytext.toml new file mode 100644 index 000000000..5345bcdcc --- /dev/null +++ b/jupytext.toml @@ -0,0 +1,9 @@ +# Jupytext configuration +# Sync notebooks to scripts/ subdirectories as Python files with percent format + +# Default formats for notebooks +formats = "ipynb,scripts//py:percent" + +# Notebook metadata filter (reduce diff noise) +notebook_metadata_filter = "-all" +cell_metadata_filter = "-all" diff --git a/pyproject.toml b/pyproject.toml index 75e157332..cbd7243a0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -57,6 +57,7 @@ dependencies = [ "pre-commit", "sympy", "zarr", + "jupytext", ] dynamic = ["version"] diff --git a/tools/README.md b/tools/README.md new file mode 100644 index 000000000..c44cc3cb5 --- /dev/null +++ b/tools/README.md @@ -0,0 +1,25 @@ +# PVDeg Tools + +This folder contains standalone computational tools for specific PV degradation calculations. + +## Tools Overview + +### Tools - Degradation +General degradation calculation tools and utilities. + +### Tools - Edge Seal Oxygen Ingress +Calculations for oxygen ingress through edge seals in PV modules. + +### Tools - Module Standoff for IEC TS 63126 +**âš ï¸ Requires NREL HPC Access** + +Calculation of module standoff distance according to IEC TS 63126. This tool performs geospatial analysis across multiple locations and requires access to NREL's High Performance Computing (HPC) resources for execution. + +## Requirements + +Most tools can run locally with standard dependencies. Tools marked with âš ï¸ require: +- NREL HPC cluster access +- Additional authentication/credentials +- Specific environment setup + +See individual notebooks for detailed requirements. diff --git a/tutorials_and_tools/tutorials_and_tools/Tools - Degradation.ipynb b/tools/Tools - Degradation.ipynb similarity index 97% rename from tutorials_and_tools/tutorials_and_tools/Tools - Degradation.ipynb rename to tools/Tools - Degradation.ipynb index 8e3d190f5..4981b4a7c 100644 --- a/tutorials_and_tools/tutorials_and_tools/Tools - Degradation.ipynb +++ b/tools/Tools - Degradation.ipynb @@ -25,7 +25,7 @@ "5. Generate chamber or field data for environmental comparison\n", "6. Calculate degradation acceleration factor of field location to chamber (or another location)\n", "7. Produce a map of acceleration factors for a geographic region\n", - " Select a geographic region of interest \n", + " Select a geographic region of interest\n", " downsample to select specific site coordinates\n", " Download or access the meteorological data for the chosen site coordinates.\n", " Run the calculation" @@ -78,6 +78,7 @@ "from IPython.display import display, Math\n", "\n", "import pvlib\n", + "\n", "print(pvlib.__version__)\n", "from pvlib import iotools" ] @@ -109,6 +110,7 @@ "source": [ "# This information helps with debugging and getting support :)\n", "import sys, platform\n", + "\n", "print(\"Working on a \", platform.system(), platform.release())\n", "print(\"Python version \", sys.version)\n", "print(\"Pandas version \", pd.__version__)\n", @@ -152,8 +154,8 @@ ], "source": [ "# Get data from a supplied data file (Do not use the next box of code if using your own file)\n", - "weather_file = os.path.join(DATA_DIR, 'psm3_demo.csv')\n", - "weather_df, meta = pvdeg.weather.read(weather_file,'csv', find_meta=True)\n", + "weather_file = os.path.join(DATA_DIR, \"psm3_demo.csv\")\n", + "weather_df, meta = pvdeg.weather.read(weather_file, \"csv\", find_meta=True)\n", "print(weather_file)\n", "print(meta)" ] @@ -180,16 +182,16 @@ ], "source": [ "# This routine will get a meteorological dataset from anywhere in the world where it is available\n", - "#weather_id = (24.7136, 46.6753) #Riyadh, Saudi Arabia\n", - "#weather_id = (35.6754, 139.65) #Tokyo, Japan\n", - "#weather_id = (-43.52646, 172.62165) #Christchurch, New Zealand\n", - "#weather_id = (64.84031, -147.73836) #Fairbanks, Alaska\n", - "#weather_id = (65.14037, -21.91633) #Reykjavik, Iceland\n", - "weather_id = (33.4152, -111.8315) #Mesa, Arizona\n", - "#weather_id = (0,0) # Somewhere else you are interested in.\n", + "# weather_id = (24.7136, 46.6753) #Riyadh, Saudi Arabia\n", + "# weather_id = (35.6754, 139.65) #Tokyo, Japan\n", + "# weather_id = (-43.52646, 172.62165) #Christchurch, New Zealand\n", + "# weather_id = (64.84031, -147.73836) #Fairbanks, Alaska\n", + "# weather_id = (65.14037, -21.91633) #Reykjavik, Iceland\n", + "weather_id = (33.4152, -111.8315) # Mesa, Arizona\n", + "# weather_id = (0,0) # Somewhere else you are interested in.\n", "weather_df, meta = pvdeg.weather.get_anywhere(id=weather_id)\n", "print(meta)\n", - "#display(weather_df)" + "# display(weather_df)" ] }, { @@ -198,12 +200,12 @@ "source": [ "#### POA Irradiance\n", "Next we need to calculate the stress parameters including temperature and humidity. We start with POA irradiance.\n", - "Irradiance_kwarg governs the array orientation for doing the POA calculations. \n", - "It is defaulted to a north-south single axis tracking. A fixed tilt set of parameters is included but is blocked out. \n", - "Look in spectral.py and/or PVLib here for 1-axis kwargs, \n", - "https://pvlib-python.readthedocs.io/en/v0.7.2/generated/pvlib.tracking.singleaxis.html#pvlib.tracking.singleaxis \n", - "and for fixed tilt, \n", - "https://pvlib-python.readthedocs.io/en/v0.7.2/generated/pvlib.irradiance.gti_dirint.html?highlight=poa . \n", + "Irradiance_kwarg governs the array orientation for doing the POA calculations.\n", + "It is defaulted to a north-south single axis tracking. A fixed tilt set of parameters is included but is blocked out.\n", + "Look in spectral.py and/or PVLib here for 1-axis kwargs,\n", + "https://pvlib-python.readthedocs.io/en/v0.7.2/generated/pvlib.tracking.singleaxis.html#pvlib.tracking.singleaxis\n", + "and for fixed tilt,\n", + "https://pvlib-python.readthedocs.io/en/v0.7.2/generated/pvlib.irradiance.gti_dirint.html?highlight=poa .\n", "Here, the POA global calculation is appended to the meteorolgical data dataframe." ] }, @@ -220,17 +222,16 @@ }, "outputs": [], "source": [ - "#irradiance_kwarg ={\n", - " #\"tilt\": None,\n", - " #\"azimuth\": None,\n", - " #\"module_mount\": 'fixed'}\n", - "irradiance_kwarg ={\n", - " \"axis_tilt\": 0,\n", - " \"axis_azimuth\": 180,\n", - " \"module_mount\": 'single_axis'}\n", - "poa_df = pvdeg.spectral.poa_irradiance(weather_df=weather_df, meta=meta, **irradiance_kwarg)\n", + "# irradiance_kwarg ={\n", + "# \"tilt\": None,\n", + "# \"azimuth\": None,\n", + "# \"module_mount\": 'fixed'}\n", + "irradiance_kwarg = {\"axis_tilt\": 0, \"axis_azimuth\": 180, \"module_mount\": \"single_axis\"}\n", + "poa_df = pvdeg.spectral.poa_irradiance(\n", + " weather_df=weather_df, meta=meta, **irradiance_kwarg\n", + ")\n", "\n", - "weather_df['poa_global'] = poa_df['poa_global']" + "weather_df[\"poa_global\"] = poa_df[\"poa_global\"]" ] }, { @@ -239,7 +240,7 @@ "source": [ "\n", "#### Get Spectrally Resolved Irradiance Data\n", - "This first set of commands will calculate spectrally resolved irradiance data. This may or may not be needed for a given degradation model and can be skipped here. " + "This first set of commands will calculate spectrally resolved irradiance data. This may or may not be needed for a given degradation model and can be skipped here." ] }, { @@ -251,7 +252,8 @@ "iopub.status.busy": "2025-10-04T11:18:58.272896Z", "iopub.status.idle": "2025-10-04T11:18:58.290765Z", "shell.execute_reply": "2025-10-04T11:18:58.290052Z" - } + }, + "lines_to_next_cell": 2 }, "outputs": [ { @@ -266,21 +268,22 @@ "# this whole block needs to be replaced with call to calculate spectrally resolved irradiance.\n", "\n", "from pvdeg import TEST_DATA_DIR\n", + "\n", "INPUT_SPECTRA = os.path.join(TEST_DATA_DIR, r\"spectra_pytest.csv\")\n", "data = pd.read_csv(INPUT_SPECTRA)\n", - "#display(data)\n", + "# display(data)\n", "print(INPUT_SPECTRA)\n", "\n", - "#Test function\n", - "#cusotm_albedo['Summer']\n", - "#custom_albedo['Winter']\n", + "# Test function\n", + "# cusotm_albedo['Summer']\n", + "# custom_albedo['Winter']\n", "# custom_albedo['Snow']\n", - "#defaults - Grass, Dry Grass, Snow\n", - "#Flexible to add complexity later\n", - "#merge in development branch changes\n", - "#KGPCY Python package\n", - "custom_albedo_summer = 'A006'\n", - "custom_albedo_winter = { #required: startDate, wavelength (if len(albedo) > 1), albedo, isSnow defaults to False\n", + "# defaults - Grass, Dry Grass, Snow\n", + "# Flexible to add complexity later\n", + "# merge in development branch changes\n", + "# KGPCY Python package\n", + "custom_albedo_summer = \"A006\"\n", + "custom_albedo_winter = { # required: startDate, wavelength (if len(albedo) > 1), albedo, isSnow defaults to False\n", " \"data_entry_person\": \"Michael Kempe\",\n", " \"date_entered\": \"7/28/2025\",\n", " \"DOI\": \"10.3390/ijerph15071507\",\n", @@ -289,24 +292,26 @@ " \"reference\": \"Turner J, Parisi AV. Ultraviolet Radiation Albedo and Reflectance in Review: The Influence to Ultraviolet Exposure in Occupational Settings. Int J Environ Res Public Health. 2018 Jul 17;15(7):1507.\",\n", " \"keywords\": \"snow, ground\",\n", " \"months\": \"1,2,3,10,11,12\",\n", - " \"startDate\": \"January 1\", #Day of Year? 0-365\n", - " \"HourOfYear\": \"1\", #Hour of Year? 1-8760\n", + " \"startDate\": \"January 1\", # Day of Year? 0-365\n", + " \"HourOfYear\": \"1\", # Hour of Year? 1-8760\n", " \"isSnow\": \"False\",\n", " \"comments\": \"Data is emperically extrapolated from 280 nm to 297 nm. Data extracted from Turner et al. Figure 1 as a reference to Doda & Green Snow-Ground. Doda D., Green A. Surface Reflectance Measurements in the UV from an Airborne Platform. Part 1. Appl. Opt. 1980;19:2140-2145. doi: 10.1364/AO.19.002140. Doda D., Green A. Surface Reflectance Measurements in the Ultraviolet from an Airborne Platform. Part 2. Appl. Opt. 1981;20:636-642. doi: 10.1364/AO.20.000636.\",\n", " \"wavelength\": \"280, 297.32034, 300.02435, 301.8514, 305.79782, 310.10962, 313.21558, 317.4543, 322.86237, 329.9513, 331.19366, 339.89038, 343.06943, 350.34103, 360.02435, 369.96347, 380.3776, 386.77222, 390.0609, 400.14615\",\n", - " \"albedo\": \"20, 29.515152, 28.30303, 29.454546, 28.90909, 34.696968, 36.757576, 39.363636, 39.21212, 38.60606, 41.272728, 40.909092, 42.242424, 42.21212, 40.575756, 43.21212, 43.090908, 43.454544, 43.60606, 39.757576\"\n", + " \"albedo\": \"20, 29.515152, 28.30303, 29.454546, 28.90909, 34.696968, 36.757576, 39.363636, 39.21212, 38.60606, 41.272728, 40.909092, 42.242424, 42.21212, 40.575756, 43.21212, 43.090908, 43.454544, 43.60606, 39.757576\",\n", "}\n", - "#Startdate, albedo, wavelength -> then next one + boolean logic for snow ()\n", + "# Startdate, albedo, wavelength -> then next one + boolean logic for snow ()\n", "custom_albedo_snow = {}\n", "# custom_albedo_snow\n", - "spectra_folder = 'spectra' #If you have already pulled the spectra from SMARTS, pass the folder path to avoid going through the donwload process again.\n", - "wavelengths = np.arange(280, 400, 25) # Example wavelengths from 280 nm to 400 nm in steps of 25 nm\n", - "#data = pvdeg.spectral.spectrally_resolved_irradiance(weather_df=weather_df, meta=meta, wavelengths=wavelengths, frontResultsOnly=None,\n", + "spectra_folder = \"spectra\" # If you have already pulled the spectra from SMARTS, pass the folder path to avoid going through the donwload process again.\n", + "wavelengths = np.arange(\n", + " 280, 400, 25\n", + ") # Example wavelengths from 280 nm to 400 nm in steps of 25 nm\n", + "# data = pvdeg.spectral.spectrally_resolved_irradiance(weather_df=weather_df, meta=meta, wavelengths=wavelengths, frontResultsOnly=None,\n", "# spectra_folder=spectra_folder, custom_albedo_summer=custom_albedo_summer, custom_albedo_winter=custom_albedo_winter, **irradiance_kwarg)\n", - "#return front, back, or both (True, False, None)\n", - "#bool frontResultsonly = True for front only\n", - "#separate columns for front and back irradiance: spectra_front: etc. , spectra_back: etc. (see spectra_pytest.csv)\n", - "#Check albedo boolean snow, winter non-snow, summer non-snow\n" + "# return front, back, or both (True, False, None)\n", + "# bool frontResultsonly = True for front only\n", + "# separate columns for front and back irradiance: spectra_front: etc. , spectra_back: etc. (see spectra_pytest.csv)\n", + "# Check albedo boolean snow, winter non-snow, summer non-snow" ] }, { @@ -314,7 +319,7 @@ "metadata": {}, "source": [ "#### Get Cell Temperature and Module Surface Temperature\n", - "The following will calculate the cell and module surface temperature using the King model as a default. Other models can be used as described at, \n", + "The following will calculate the cell and module surface temperature using the King model as a default. Other models can be used as described at,\n", "https://pvlib-python.readthedocs.io/en/stable/reference/pv_modeling/temperature.html. The difference is less than one °C for ground mounted systems\n", "but can be as high as 3 °C for a high temperature building integrated system.\n", "\n", @@ -337,11 +342,11 @@ "temp_cell = pvdeg.temperature.cell(weather_df=weather_df, meta=meta, poa=poa_df)\n", "temp_module = pvdeg.temperature.module(weather_df=weather_df, meta=meta, poa=poa_df)\n", "\n", - "weather_df['temp_cell'] = temp_cell\n", - "weather_df['temp_module'] = temp_module\n", + "weather_df[\"temp_cell\"] = temp_cell\n", + "weather_df[\"temp_module\"] = temp_module\n", "\n", - "weather_df['temperature'] = weather_df['temp_module']\n", - "#weather_df['temperature'] = weather_df['temp_cell']" + "weather_df[\"temperature\"] = weather_df[\"temp_module\"]\n", + "# weather_df['temperature'] = weather_df['temp_cell']" ] }, { @@ -371,13 +376,14 @@ "RH_module = pvdeg.humidity.module(\n", " weather_df=weather_df,\n", " poa=poa_df,\n", - " temp_module = temp_module,\n", - " backsheet='W017',\n", + " temp_module=temp_module,\n", + " backsheet=\"W017\",\n", " backsheet_thickness=0.30,\n", - " encapsulant='W001',\n", - " back_encap_thickness=0.50)\n", + " encapsulant=\"W001\",\n", + " back_encap_thickness=0.50,\n", + ")\n", "\n", - "weather_df=pd.concat([weather_df, RH_module], axis=1)" + "weather_df = pd.concat([weather_df, RH_module], axis=1)" ] }, { @@ -404,11 +410,11 @@ "outputs": [], "source": [ "\n", - "weather_df['RH'] = RH_module['RH_surface_outside']\n", - "#weather_df['RH'] = RH_module['RH_front_encap']\n", - "#weather_df['RH'] = RH_module['Ce_back_encap']\n", - "#weather_df['RH'] = RH_module['RH_back_encap']\n", - "#weather_df['RH'] = RH_module['RH_backsheet']" + "weather_df[\"RH\"] = RH_module[\"RH_surface_outside\"]\n", + "# weather_df['RH'] = RH_module['RH_front_encap']\n", + "# weather_df['RH'] = RH_module['Ce_back_encap']\n", + "# weather_df['RH'] = RH_module['RH_back_encap']\n", + "# weather_df['RH'] = RH_module['RH_backsheet']" ] }, { @@ -455,8 +461,8 @@ } ], "source": [ - "#kwarg_variables = pvdeg.utilities._read_material(name=None, fname=\"DegradationDatabase\", item=(\"Material\", \"Equation\", \"KeyWords\", \"EquationType\"))\n", - "#print(json.dumps(kwarg_variables, skipkeys = True, indent = 0 ).replace(\"{\" + \"\\n\", \"{\").replace('\\\"' + \"\\n\", \"\\\"\").replace(': {' , ':' + \"\\n\" + \"{\").replace('},' + \"\\n\", '},' +'\\n' +'\\n'))\n", + "# kwarg_variables = pvdeg.utilities._read_material(name=None, fname=\"DegradationDatabase\", item=(\"Material\", \"Equation\", \"KeyWords\", \"EquationType\"))\n", + "# print(json.dumps(kwarg_variables, skipkeys = True, indent = 0 ).replace(\"{\" + \"\\n\", \"{\").replace('\\\"' + \"\\n\", \"\\\"\").replace(': {' , ':' + \"\\n\" + \"{\").replace('},' + \"\\n\", '},' +'\\n' +'\\n'))\n", "pvdeg.utilities.display_json(pvdeg_file=\"DegradationDatabase\", fp=DATA_DIR)" ] }, @@ -505,7 +511,9 @@ } ], "source": [ - "deg_data = pvdeg.utilities.read_material(fp=DATA_DIR, key=\"D036\", pvdeg_file=\"DegradationDatabase\")\n", + "deg_data = pvdeg.utilities.read_material(\n", + " fp=DATA_DIR, key=\"D036\", pvdeg_file=\"DegradationDatabase\"\n", + ")\n", "display(deg_data)" ] }, @@ -560,7 +568,7 @@ "source": [ "## 3. Calculate Absolute Degradation Rate\n", "\n", - "To do this calculation, we must have degradation parameter data for a process that is complete with all the necessary variables. " + "To do this calculation, we must have degradation parameter data for a process that is complete with all the necessary variables." ] }, { @@ -588,7 +596,9 @@ "source": [ "func_call = getattr(pvdeg.degradation, deg_data[\"EquationType\"])\n", "degradation = func_call(weather_df=weather_df, parameters=deg_data)\n", - "print(\"Average degradation rate for a year\", degradation/8760, deg_data[\"R_0\"][\"units\"])" + "print(\n", + " \"Average degradation rate for a year\", degradation / 8760, deg_data[\"R_0\"][\"units\"]\n", + ")" ] }, { @@ -596,9 +606,7 @@ "execution_count": null, "metadata": {}, "outputs": [], - "source": [ - "\n" - ] + "source": [] } ], "metadata": { diff --git a/tutorials_and_tools/tutorials_and_tools/Tools - Edge Seal Oxygen Ingress.ipynb b/tools/Tools - Edge Seal Oxygen Ingress.ipynb similarity index 99% rename from tutorials_and_tools/tutorials_and_tools/Tools - Edge Seal Oxygen Ingress.ipynb rename to tools/Tools - Edge Seal Oxygen Ingress.ipynb index ed7f2c442..ffbaf7522 100644 --- a/tutorials_and_tools/tutorials_and_tools/Tools - Edge Seal Oxygen Ingress.ipynb +++ b/tools/Tools - Edge Seal Oxygen Ingress.ipynb @@ -89,6 +89,7 @@ "source": [ "# This information helps with debugging and getting support :)\n", "import sys, platform\n", + "\n", "print(\"Working on a \", platform.system(), platform.release())\n", "print(\"Python version \", sys.version)\n", "print(\"Pandas version \", pd.__version__)\n", @@ -244,8 +245,16 @@ "sn = 20 # This is the number of edge seal nodes to use\n", "en = 50 # This is the number of encapsulant nodes to use\n", "pressure = 0.2109 * (1 - 0.0065 * meta.get(\"altitude\") / 288.15) ** 5.25588\n", - "print(pvdeg.utilities.read_material(pvdeg_file=\"O2permeation\", key=\"OX003\", values_only=True))\n", - "print(pvdeg.utilities.read_material(pvdeg_file=\"H2Opermeation\", key=\"W003\", values_only=True))" + "print(\n", + " pvdeg.utilities.read_material(\n", + " pvdeg_file=\"O2permeation\", key=\"OX003\", values_only=True\n", + " )\n", + ")\n", + "print(\n", + " pvdeg.utilities.read_material(\n", + " pvdeg_file=\"H2Opermeation\", key=\"W003\", values_only=True\n", + " )\n", + ")" ] }, { diff --git a/tutorials_and_tools/tutorials_and_tools/HPC Connection Required - Tools - Module Standoff for IEC TS 63126.ipynb b/tools/Tools - Module Standoff for IEC TS 63126.ipynb similarity index 92% rename from tutorials_and_tools/tutorials_and_tools/HPC Connection Required - Tools - Module Standoff for IEC TS 63126.ipynb rename to tools/Tools - Module Standoff for IEC TS 63126.ipynb index 83b906aa8..fa4fd4c2a 100644 --- a/tutorials_and_tools/tutorials_and_tools/HPC Connection Required - Tools - Module Standoff for IEC TS 63126.ipynb +++ b/tools/Tools - Module Standoff for IEC TS 63126.ipynb @@ -27,7 +27,7 @@ "\n", "where $T_0$ is the temperature for $X=0$ (insulated-back) and $\\Delta T$ is the temperature difference between an insulated-back ($X=0$) and open-rack mounting configuration ($X=\\infty)$.\n", "\n", - " We used pvlib and data from the National Solar Radiation Database (NSRDB) to calculate the module temperatures for the insulated-back and open-rack mounting configurations and apply our model to obtain the minimum standoff distance for roof-mounted PV systems to achieve a temperature lower than a specified $T_{98}$. The following figure showcases this calulation for the entire world for an $X_{eff}$ that results in $T_{98}$=70°C. Values of $X_{eff}$ higher than this will require Level 1 or Level 2 certification. \n", + " We used pvlib and data from the National Solar Radiation Database (NSRDB) to calculate the module temperatures for the insulated-back and open-rack mounting configurations and apply our model to obtain the minimum standoff distance for roof-mounted PV systems to achieve a temperature lower than a specified $T_{98}$. The following figure showcases this calulation for the entire world for an $X_{eff}$ that results in $T_{98}$=70°C. Values of $X_{eff}$ higher than this will require Level 1 or Level 2 certification.\n", "\n", "$*$ D. L. King, W. E. Boyson, and J. A. Kratochvil, \"Photovoltaic array performance model,\" SAND2004-3535, Sandia National Laboratories, Albuquerque, NM, 2004. '\\\n", "$**$ M. K. Fuentes, \"A simplified thermal model for Flat-Plate photovoltaic arrays,\" United States, 1987-05-01 1987. https://www.osti.gov/biblio/6802914\n" @@ -37,7 +37,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "![alt text](T98_70C_standoff_Map.png)" + "![alt text](images/T98_70C_standoff_Map.png)" ] }, { @@ -118,14 +118,14 @@ "outputs": [], "source": [ "# This routine will get a meteorological dataset from anywhere in the world where it is available\n", - "#weather_id = (24.7136, 46.6753) #Riyadh, Saudi Arabia\n", - "#weather_id = (35.6754, 139.65) #Tokyo, Japan\n", - "#weather_id = (-43.52646, 172.62165) #Christchurch, New Zealand\n", - "#weather_id = (64.84031, -147.73836) #Fairbanks, Alaska\n", - "#weather_id = (65.14037, -21.91633) #Reykjavik, Iceland\n", - "#weather_id = (33.4152, -111.8315) #Mesa, Arizona\n", - "#WEATHER_df, META = pvdeg.weather.get_anywhere(id=weather_id)\n", - "#print(META)" + "# weather_id = (24.7136, 46.6753) #Riyadh, Saudi Arabia\n", + "# weather_id = (35.6754, 139.65) #Tokyo, Japan\n", + "# weather_id = (-43.52646, 172.62165) #Christchurch, New Zealand\n", + "# weather_id = (64.84031, -147.73836) #Fairbanks, Alaska\n", + "# weather_id = (65.14037, -21.91633) #Reykjavik, Iceland\n", + "# weather_id = (33.4152, -111.8315) #Mesa, Arizona\n", + "# WEATHER_df, META = pvdeg.weather.get_anywhere(id=weather_id)\n", + "# print(META)" ] }, { @@ -134,7 +134,7 @@ "source": [ "## 2. Calculate Installation Standoff Minimum - Level 1 and Level 2\n", "\n", - "According to IEC TS 63126, Level 0, Level 1 and Level 2 certification is limited to T₉₈<70°C, <80°C and <90°C, respectively. Level 0 certification is essentially compliance to IEC 61730 and IEC 61215. The default value of T₉₈<70°C represents the minimium gap to avoid higher temperature certification according to IEC TS 63126. This minimum standoff ($x_{min}$) is the distance between the bottom of the module frame and the roof and can be extimated for a given environment as, \n", + "According to IEC TS 63126, Level 0, Level 1 and Level 2 certification is limited to T₉₈<70°C, <80°C and <90°C, respectively. Level 0 certification is essentially compliance to IEC 61730 and IEC 61215. The default value of T₉₈<70°C represents the minimium gap to avoid higher temperature certification according to IEC TS 63126. This minimum standoff ($x_{min}$) is the distance between the bottom of the module frame and the roof and can be extimated for a given environment as,\n", "\n", "$$ X_{min} = -X_0 \\ln\\left(1-\\frac{T_{98,0}-T}{ T_{98,0}- T_{98,inf}}\\right), Equation 2 $$\n", "\n", @@ -174,7 +174,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "The following is a full function call for both T₉₈=70°C and 80°C separately even though the second standoff distance can be calculated using only T98_0 and T98_inf. With this function, one may also want to change the tilt, azimuth, or T98. " + "The following is a full function call for both T₉₈=70°C and 80°C separately even though the second standoff distance can be calculated using only T98_0 and T98_inf. With this function, one may also want to change the tilt, azimuth, or T98." ] }, { @@ -220,7 +220,7 @@ "source": [ "## 3. Calculate $X_{eff}$ from provided module temperature data.\n", "\n", - "To do this calculation, one must use a set of data with: \n", + "To do this calculation, one must use a set of data with:\n", " - meterological irradiance data sufficient to calculate the POA irradiance (DHI, GHI, and DNI),\n", " - ambient temperature data,\n", " - wind speed at module height, (wind_factor=0.33 will be used unless otherwise specified)\n", @@ -286,12 +286,9 @@ "source": [ "# This is the minimal function call using the common default settings to estimate T₉₈.\n", "T_98 = pvdeg.standards.T98_estimate(\n", - " weather_df=WEATHER_df,\n", - " meta=META,\n", - " tilt=-META['latitude'],\n", - " azimuth=None,\n", - " x_eff=10)\n", - "print ('The 98ᵗʰ percential temperature is estimated to be' , '%.1f' % T_98 , '°C.')" + " weather_df=WEATHER_df, meta=META, tilt=-META[\"latitude\"], azimuth=None, x_eff=10\n", + ")\n", + "print(\"The 98ᵗʰ percential temperature is estimated to be\", \"%.1f\" % T_98, \"°C.\")" ] }, { @@ -301,23 +298,27 @@ "outputs": [], "source": [ "# This code will calculate the temperature for an arbitrary x_eff distance. Either set of kwargs can be modified and use.\n", - "#irradiance_kwarg ={\n", + "# irradiance_kwarg ={\n", "# \"axis_tilt\": None,\n", "# \"axis_azimuth\": None,\n", "# \"x_eff\": 10,\n", "# \"module_mount\": '1_axis'}\n", - "irradiance_kwarg ={\n", - " \"tilt\": META['latitude'],\n", + "irradiance_kwarg = {\n", + " \"tilt\": META[\"latitude\"],\n", " \"azimuth\": None,\n", " \"x_eff\": 10,\n", - " \"module_mount\": \"fixed\"}\n", + " \"module_mount\": \"fixed\",\n", + "}\n", "\n", "T_xeff = pvdeg.standards.x_eff_temperature_estimate(\n", - " weather_df=WEATHER_df,\n", - " meta=META,\n", - " **irradiance_kwarg)\n", + " weather_df=WEATHER_df, meta=META, **irradiance_kwarg\n", + ")\n", "\n", - "print ('The 98ᵗʰ percential temperature is estimated to be' , '%.1f' % np.percentile(T_xeff, 98) , '°C.')" + "print(\n", + " \"The 98ᵗʰ percential temperature is estimated to be\",\n", + " \"%.1f\" % np.percentile(T_xeff, 98),\n", + " \"°C.\",\n", + ")" ] }, { @@ -565,7 +566,7 @@ "source": [ "## 7. Plot $X_{min}$ for a $T_{98}$, and plot $T_{98}$ for a given region.\n", "\n", - "This last Objective is much more complicated and is set up to utilize acess to a lot of computational power to run many sites simultaneously to create a regional map of standoff distance. \n", + "This last Objective is much more complicated and is set up to utilize acess to a lot of computational power to run many sites simultaneously to create a regional map of standoff distance.\n", "For more in-depth instructions on doing this, look at the tutorial \"Scenario - Geospatial.ipynb\" here in PVDeg.\n", "\n", "Step #1: Create an object, \"geospatial_standoff_scenario\" to be used to run the computations." @@ -679,14 +680,22 @@ }, "outputs": [], "source": [ - "print (\"Your results will be stored in %s\" % output_folder)\n", - "print ('The folder must already exist or the file will not be created')\n", + "print(\"Your results will be stored in %s\" % output_folder)\n", + "print(\"The folder must already exist or the file will not be created\")\n", "\n", - "pvdeg.weather.write(data_df=WEATHER_df, metadata=META, savefile=os.path.join(output_folder, 'WeatherFile.csv')) #Writes the meterological data to an *.csv file.\n", + "pvdeg.weather.write(\n", + " data_df=WEATHER_df,\n", + " metadata=META,\n", + " savefile=os.path.join(output_folder, \"WeatherFile.csv\"),\n", + ") # Writes the meterological data to an *.csv file.\n", "\n", - "pd.DataFrame(standoff_series_df).to_csv(os.path.join(output_folder, 'Standoff_Scan.csv')) #Writes a file with the Tilt and Azimuth scan calculations of standoff.\n", + "pd.DataFrame(standoff_series_df).to_csv(\n", + " os.path.join(output_folder, \"Standoff_Scan.csv\")\n", + ") # Writes a file with the Tilt and Azimuth scan calculations of standoff.\n", "\n", - "pd.DataFrame(T98_series_df).to_csv(os.path.join(output_folder, 'T98_Scan.csv')) #Writes a file with the Tilt and Azimuth scan calculations of T98.\n" + "pd.DataFrame(T98_series_df).to_csv(\n", + " os.path.join(output_folder, \"T98_Scan.csv\")\n", + ") # Writes a file with the Tilt and Azimuth scan calculations of T98." ] } ], diff --git a/tools/_toc.yml b/tools/_toc.yml new file mode 100644 index 000000000..e3f485bd6 --- /dev/null +++ b/tools/_toc.yml @@ -0,0 +1,8 @@ +# Table of contents for Tools +# Learn more at https://jupyterbook.org/customize/toc.html + +format: jb-book +root: intro +chapters: +- file: Tools - Edge Seal Oxygen Ingress +- file: Tools - Degradation diff --git a/tutorials_and_tools/tutorials_and_tools/T98_70C_standoff_Map.png b/tools/images/T98_70C_standoff_Map.png similarity index 100% rename from tutorials_and_tools/tutorials_and_tools/T98_70C_standoff_Map.png rename to tools/images/T98_70C_standoff_Map.png diff --git a/tools/intro.md b/tools/intro.md new file mode 100644 index 000000000..66c3353cb --- /dev/null +++ b/tools/intro.md @@ -0,0 +1,8 @@ +# PVDegradationTools - Tools + +This section contains tools for photovoltaic degradation analysis. + +## Available Tools + +- **Edge Seal Oxygen Ingress**: Analysis tools for edge seal oxygen ingress +- **Degradation Tools**: Additional degradation analysis tools diff --git a/tools/scripts/Tools - Degradation.py b/tools/scripts/Tools - Degradation.py new file mode 100644 index 000000000..66dbe72d7 --- /dev/null +++ b/tools/scripts/Tools - Degradation.py @@ -0,0 +1,256 @@ +# %% [markdown] +# # Degradation and Acceleration Factors +# This tool will provide a simple method for estimating degradation and for calculating acceleration factors. It interfaces with the degradation database to simplify acquisition of the degradation parameters. +# +# **Requirements**: +# - compatible weather file (e.g., PSM3, TMY3, EPW...) +# - Accelerated testing chamber parameters +# - chamber irradiance [W/m^2] +# - chamber temperature [C] +# - chamber humidity [%] +# - & etc. +# - Activation energies for test material [kJ/mol] +# - Other degradation parameters +# +# **Objectives**: +# 1. Read in the weather data +# 2. Gather basic degradation modeling data for a material of interest +# 3. Calculate absolute degradation rate +# 4. Run Monte Carlo simulation at a single site +# 5. Generate chamber or field data for environmental comparison +# 6. Calculate degradation acceleration factor of field location to chamber (or another location) +# 7. Produce a map of acceleration factors for a geographic region +# Select a geographic region of interest +# downsample to select specific site coordinates +# Download or access the meteorological data for the chosen site coordinates. +# Run the calculation + +# %% +# if running on google colab, uncomment the next line and execute this cell to install the dependencies and prevent "ModuleNotFoundError" in later cells: +# # !pip install pvdeg==0.4.2 + +# %% +import os +import pvdeg +import pandas as pd +import numpy as np +from pvdeg import DATA_DIR +import json +from IPython.display import display, Math + +import pvlib + +print(pvlib.__version__) +from pvlib import iotools + +# %% +# This information helps with debugging and getting support :) +import sys, platform + +print("Working on a ", platform.system(), platform.release()) +print("Python version ", sys.version) +print("Pandas version ", pd.__version__) +print("pvdeg version ", pvdeg.__version__) +print(DATA_DIR) + +# %% [markdown] +# ## 1. Read In the Weather Data +# +# The function has these minimum requirements when using a weather data file: +# - Weather data containing (at least) DNI, DHI, GHI, Temperature, RH, and Wind-Speed data at module level. +# - Site meta-data containing (at least) latitude, longitude, and time zone +# +# Alternatively one may can get meterological data from the NSRDB or PVGIS with just the longitude and latitude. This function for the NSRDB (via NSRDB 'PSM3') works primarily for most of North America and South America. PVGIS works for most of the rest of the world (via SARAH 'PVGIS'). See the tutorial "Weather Database Access.ipynb" tutorial on PVdeg or Jensen et al. https://doi.org/10.1016/j.solener.2023.112092 for satellite coverage information. + +# %% +# Get data from a supplied data file (Do not use the next box of code if using your own file) +weather_file = os.path.join(DATA_DIR, "psm3_demo.csv") +weather_df, meta = pvdeg.weather.read(weather_file, "csv", find_meta=True) +print(weather_file) +print(meta) + +# %% +# This routine will get a meteorological dataset from anywhere in the world where it is available +# weather_id = (24.7136, 46.6753) #Riyadh, Saudi Arabia +# weather_id = (35.6754, 139.65) #Tokyo, Japan +# weather_id = (-43.52646, 172.62165) #Christchurch, New Zealand +# weather_id = (64.84031, -147.73836) #Fairbanks, Alaska +# weather_id = (65.14037, -21.91633) #Reykjavik, Iceland +weather_id = (33.4152, -111.8315) # Mesa, Arizona +# weather_id = (0,0) # Somewhere else you are interested in. +weather_df, meta = pvdeg.weather.get_anywhere(id=weather_id) +print(meta) +# display(weather_df) + +# %% [markdown] +# #### POA Irradiance +# Next we need to calculate the stress parameters including temperature and humidity. We start with POA irradiance. +# Irradiance_kwarg governs the array orientation for doing the POA calculations. +# It is defaulted to a north-south single axis tracking. A fixed tilt set of parameters is included but is blocked out. +# Look in spectral.py and/or PVLib here for 1-axis kwargs, +# https://pvlib-python.readthedocs.io/en/v0.7.2/generated/pvlib.tracking.singleaxis.html#pvlib.tracking.singleaxis +# and for fixed tilt, +# https://pvlib-python.readthedocs.io/en/v0.7.2/generated/pvlib.irradiance.gti_dirint.html?highlight=poa . +# Here, the POA global calculation is appended to the meteorolgical data dataframe. + +# %% +# irradiance_kwarg ={ +# "tilt": None, +# "azimuth": None, +# "module_mount": 'fixed'} +irradiance_kwarg = {"axis_tilt": 0, "axis_azimuth": 180, "module_mount": "single_axis"} +poa_df = pvdeg.spectral.poa_irradiance( + weather_df=weather_df, meta=meta, **irradiance_kwarg +) + +weather_df["poa_global"] = poa_df["poa_global"] + +# %% [markdown] +# +# #### Get Spectrally Resolved Irradiance Data +# This first set of commands will calculate spectrally resolved irradiance data. This may or may not be needed for a given degradation model and can be skipped here. + +# %% +# this whole block needs to be replaced with call to calculate spectrally resolved irradiance. + +from pvdeg import TEST_DATA_DIR + +INPUT_SPECTRA = os.path.join(TEST_DATA_DIR, r"spectra_pytest.csv") +data = pd.read_csv(INPUT_SPECTRA) +# display(data) +print(INPUT_SPECTRA) + +# Test function +# cusotm_albedo['Summer'] +# custom_albedo['Winter'] +# custom_albedo['Snow'] +# defaults - Grass, Dry Grass, Snow +# Flexible to add complexity later +# merge in development branch changes +# KGPCY Python package +custom_albedo_summer = "A006" +custom_albedo_winter = { # required: startDate, wavelength (if len(albedo) > 1), albedo, isSnow defaults to False + "data_entry_person": "Michael Kempe", + "date_entered": "7/28/2025", + "DOI": "10.3390/ijerph15071507", + "source_title": "Ultraviolet Radiation Albedo and Reflectance in Review: The Influence to Ultraviolet Exposure in Occupational Settings", + "authors": "Joanna Turner, Alfio V. Parisi", + "reference": "Turner J, Parisi AV. Ultraviolet Radiation Albedo and Reflectance in Review: The Influence to Ultraviolet Exposure in Occupational Settings. Int J Environ Res Public Health. 2018 Jul 17;15(7):1507.", + "keywords": "snow, ground", + "months": "1,2,3,10,11,12", + "startDate": "January 1", # Day of Year? 0-365 + "HourOfYear": "1", # Hour of Year? 1-8760 + "isSnow": "False", + "comments": "Data is emperically extrapolated from 280 nm to 297 nm. Data extracted from Turner et al. Figure 1 as a reference to Doda & Green Snow-Ground. Doda D., Green A. Surface Reflectance Measurements in the UV from an Airborne Platform. Part 1. Appl. Opt. 1980;19:2140-2145. doi: 10.1364/AO.19.002140. Doda D., Green A. Surface Reflectance Measurements in the Ultraviolet from an Airborne Platform. Part 2. Appl. Opt. 1981;20:636-642. doi: 10.1364/AO.20.000636.", + "wavelength": "280, 297.32034, 300.02435, 301.8514, 305.79782, 310.10962, 313.21558, 317.4543, 322.86237, 329.9513, 331.19366, 339.89038, 343.06943, 350.34103, 360.02435, 369.96347, 380.3776, 386.77222, 390.0609, 400.14615", + "albedo": "20, 29.515152, 28.30303, 29.454546, 28.90909, 34.696968, 36.757576, 39.363636, 39.21212, 38.60606, 41.272728, 40.909092, 42.242424, 42.21212, 40.575756, 43.21212, 43.090908, 43.454544, 43.60606, 39.757576", +} +# Startdate, albedo, wavelength -> then next one + boolean logic for snow () +custom_albedo_snow = {} +# custom_albedo_snow +spectra_folder = "spectra" # If you have already pulled the spectra from SMARTS, pass the folder path to avoid going through the donwload process again. +wavelengths = np.arange( + 280, 400, 25 +) # Example wavelengths from 280 nm to 400 nm in steps of 25 nm +# data = pvdeg.spectral.spectrally_resolved_irradiance(weather_df=weather_df, meta=meta, wavelengths=wavelengths, frontResultsOnly=None, +# spectra_folder=spectra_folder, custom_albedo_summer=custom_albedo_summer, custom_albedo_winter=custom_albedo_winter, **irradiance_kwarg) +# return front, back, or both (True, False, None) +# bool frontResultsonly = True for front only +# separate columns for front and back irradiance: spectra_front: etc. , spectra_back: etc. (see spectra_pytest.csv) +# Check albedo boolean snow, winter non-snow, summer non-snow + + +# %% [markdown] +# #### Get Cell Temperature and Module Surface Temperature +# The following will calculate the cell and module surface temperature using the King model as a default. Other models can be used as described at, +# https://pvlib-python.readthedocs.io/en/stable/reference/pv_modeling/temperature.html. The difference is less than one °C for ground mounted systems +# but can be as high as 3 °C for a high temperature building integrated system. +# +# Here the temperatures are added to the dataframe and the 'temp_module' temperature is selected as the default 'temperature' for the degradation calculations. If it is a cell degradation that is being investigated, 'temp_cell' should be used for the temperature. + +# %% +temp_cell = pvdeg.temperature.cell(weather_df=weather_df, meta=meta, poa=poa_df) +temp_module = pvdeg.temperature.module(weather_df=weather_df, meta=meta, poa=poa_df) + +weather_df["temp_cell"] = temp_cell +weather_df["temp_module"] = temp_module + +weather_df["temperature"] = weather_df["temp_module"] +# weather_df['temperature'] = weather_df['temp_cell'] + +# %% [markdown] +# #### Humidity +# Depending on the component for which the calculation is being run on, the desired humidity may be the atmospheric humidity, the module surface humidity, the humidity in front of a cell with a permeable backsheet, the humidity in the backsheet, the humidity in the back encapsulant or another custom humidity location such as a diffusion limited location. The folowing are options for doing all of these calculations. Here all the different humidities are put in the weather_df dataframe, but to select one to be specifically used it should be named 'RH' for most degradation functions (check the documentation of a specific degradation calculation if in doubt). Here the surface humidity is selected as a default. +# +# Append the calculated values into the weather DataFrame. +# Note: putting the values into the weather_df DataFrame is not strictly necessary, but may be convenient for later use in the degradation calculations. + +# %% +RH_module = pvdeg.humidity.module( + weather_df=weather_df, + poa=poa_df, + temp_module=temp_module, + backsheet="W017", + backsheet_thickness=0.30, + encapsulant="W001", + back_encap_thickness=0.50, +) + +weather_df = pd.concat([weather_df, RH_module], axis=1) + +# %% [markdown] +# Each of the necessary arrays of data can be individually sent to a function for calculation in the function call, or they can be combined into a single dataframe. The degradation functions are set up to first check for a specific data set in the function call but if not found it looks for specific data or a suitable substitute in the weather dataframe. +# +# You can select one of the RH values to be used as the relative humidity in the degradation model calculations by assigning it to to column "RH" in the dataframe. +# Alternatively, the "RH" data can be sent to the degradation function explicitly in the function call. + +# %% + +weather_df["RH"] = RH_module["RH_surface_outside"] +# weather_df['RH'] = RH_module['RH_front_encap'] +# weather_df['RH'] = RH_module['Ce_back_encap'] +# weather_df['RH'] = RH_module['RH_back_encap'] +# weather_df['RH'] = RH_module['RH_backsheet'] + +# %% [markdown] +# ## 2. Gather Basic Degradation Modeling Data for a Material of Interest +# +# First we need to gather in the parameters for the degradation process of interest. This includes things such as the activiation energy and parameters defining the sensitivity to moisture, UV light, voltage, and other stressors. +# For this tutorial we will need solar position, POA, PV cell and module temperature. Let's gernate those individually with their respective functions. +# The blocked out text will produce a list of key fields from the database for each entry. + +# %% +# kwarg_variables = pvdeg.utilities._read_material(name=None, fname="DegradationDatabase", item=("Material", "Equation", "KeyWords", "EquationType")) +# print(json.dumps(kwarg_variables, skipkeys = True, indent = 0 ).replace("{" + "\n", "{").replace('\"' + "\n", "\"").replace(': {' , ':' + "\n" + "{").replace('},' + "\n", '},' +'\n' +'\n')) +pvdeg.utilities.display_json(pvdeg_file="DegradationDatabase", fp=DATA_DIR) + +# %% [markdown] +# This next set of codes will take the data from the extracted portion of the Json library and create a list of variables from it. If more variables need to be modified or added, this is where it should be done. + +# %% +deg_data = pvdeg.utilities.read_material( + fp=DATA_DIR, key="D036", pvdeg_file="DegradationDatabase" +) +display(deg_data) + +# %% [markdown] +# Here we pull out the relevant equation code identifier needed for running the calculations. + +# %% +func = "pvdeg.degradation." + deg_data["EquationType"] +print(func) +display(Math("\\Large " + deg_data["Equation"])) + +# %% [markdown] +# ## 3. Calculate Absolute Degradation Rate +# +# To do this calculation, we must have degradation parameter data for a process that is complete with all the necessary variables. + +# %% +func_call = getattr(pvdeg.degradation, deg_data["EquationType"]) +degradation = func_call(weather_df=weather_df, parameters=deg_data) +print( + "Average degradation rate for a year", degradation / 8760, deg_data["R_0"]["units"] +) + +# %% diff --git a/tools/scripts/Tools - Edge Seal Oxygen Ingress.py b/tools/scripts/Tools - Edge Seal Oxygen Ingress.py new file mode 100644 index 000000000..45a347149 --- /dev/null +++ b/tools/scripts/Tools - Edge Seal Oxygen Ingress.py @@ -0,0 +1,201 @@ +# %% [markdown] +# # Tools - Edge Seal Oxygen Ingress Calculator tool +# +# ### Calculation of oxygen ingress profile through an edge seal and into the encapsulant. +# +# **Requirements:** +# - Local weather data file or site longitude and latittude. +# - Properties and dimensions of the edge seal. +# +# **Objectives:** +# 1. Import weather data. +# 2. Set up the calculations. +# 3. Calculate oxygen ingress into an edge seal. +# 3. Incorporate an oxygen consumption model. +# 4. Plot the data. +# +# **Background:** +# +# This performs a 1-D finite difference model for oxygen ingress through an edge seal and into an encapsulant. This is effectively an infinitely long module with a prescribed width.The output is then displayed graphically. + +# %% +# if running on google colab, uncomment the next line and execute this cell to install the dependencies and prevent "ModuleNotFoundError" in later cells: +# # !pip install pvdeg==0.4.2 + +# %% +import os +import pvdeg +import pandas as pd +from pvdeg import DATA_DIR +import matplotlib.pyplot as plt +import numpy as np +import json + +# %% +# This information helps with debugging and getting support :) +import sys, platform + +print("Working on a ", platform.system(), platform.release()) +print("Python version ", sys.version) +print("Pandas version ", pd.__version__) +print("pvdeg version ", pvdeg.__version__) + +# %% [markdown] +# ## 1. Import Weather Data +# +# The function has these minimum requirements when using a weather data file: +# - Weather data containing (at least) DNI, DHI, GHI, Temperature, RH, and Wind-Speed data at module level. +# - Site meta-data containing (at least) latitude, longitude, and time zone +# +# Alternatively one may can get meterological data from the NSRDB or PVGIS with just the longitude and latitude. This function for the NSRDB (via NSRDB 'PSM3') works primarily for most of North America and South America. PVGIS works for most of the rest of the world (via SARAH 'PVGIS'). See the tutorial "Weather Database Access.ipynb" tutorial on PVdeg or Jensen et al. https://doi.org/10.1016/j.solener.2023.112092 for satellite coverage information. + +# %% +# Get data from a supplied data file (Do not use the next box of code if using your own file) +weather_file = os.path.join(DATA_DIR, "psm3_demo.csv") +weather_df, meta = pvdeg.weather.read(weather_file, "psm") +print(sorted(meta.keys())) + +# %% +# This routine will get a meteorological dataset from anywhere in the world where it is available +# weather_id = (24.7136, 46.6753) #Riyadh, Saudi Arabia +# weather_id = (35.6754, 139.65) #Tokyo, Japan +# weather_id = (-43.52646, 172.62165) #Christchurch, New Zealand +# weather_id = (64.84031, -147.73836) #Fairbanks, Alaska +# weather_id = (65.14037, -21.91633) #Reykjavik, Iceland +weather_id = (33.4152, -111.8315) # Mesa, Arizona +weather_df, meta = pvdeg.weather.get_anywhere(id=weather_id, database="PVGIS") +print(meta) + +# %% +# This computes a module temperature. Here the default is an open rack system, but other options include: +# 'open_rack_glass_glass', +# 'close_mount_glass_glass', +# 'insulated_back_glass_polymer' + +temperature = pvdeg.temperature.temperature( + weather_df=weather_df, + meta=meta, + cell_or_mod="module", + temp_model="sapm", + conf="open_rack_glass_polymer", +) + +temperature = pd.DataFrame(temperature, columns=["module_temperature"]) +temperature["time"] = list(range(8760)) + +# %% [markdown] +# ## 2. Set up the Calculations +# +# There is a library of some materials and the relevant oxygen ingress parameters that can be used. + +# %% +es = "OX005" # This is the number for the edge seal in the json file +enc = "OX003" # This is the number for the encapsulant in the json file +esw = 1.5 # This is the edge seal width in [cm] +encw = 10 # This is the encapsulant width in [cm] +sn = 20 # This is the number of edge seal nodes to use +en = 50 # This is the number of encapsulant nodes to use +pressure = 0.2109 * (1 - 0.0065 * meta.get("altitude") / 288.15) ** 5.25588 +print( + pvdeg.utilities.read_material( + pvdeg_file="O2permeation", key="OX003", values_only=True + ) +) +print( + pvdeg.utilities.read_material( + pvdeg_file="H2Opermeation", key="W003", values_only=True + ) +) + +# %% [markdown] +# ## 3. Run the Calculations +# +# This runs the calculations for diffusion using a simple 1-D finite difference calculation. The first set of calculations is just for diffusion, then the next two (when written) will include some consumption of oxygen. In typical PV applications, it is common for oxygen ingress distance to be limited by its consumption rate in the encapsulant. + +# %% +oxygen_profile = pvdeg.diffusion.esdiffusion( + temperature=temperature, + edge_seal=es, + encapsulant=enc, + edge_seal_width=esw, + encapsulant_width=encw, + seal_nodes=sn, + encapsulant_nodes=en, + press=pressure, + repeat=2, +) + +# %% +# This sets up an a variable with the output folder information. +output_folder = os.path.join( + os.path.dirname(os.path.dirname(os.getcwd())), "TEMP", "results" +) +try: + os.makedirs(output_folder) + print(f"Created directory: {output_folder}") +except OSError as error: + print(error) + +# %% +n_lines = 10 +times = oxygen_profile.index.tolist() +for index in range(n_lines): + plt.plot( + oxygen_profile.iloc[ + int(np.trunc((index + 1) * (len(oxygen_profile) - 1) / n_lines)) + ], + label=np.round( + times[int(np.trunc((index + 1) * ((len(oxygen_profile) - 1) / n_lines)))] + / 365.25 + / 24, + 2, + ), + ) +plt.legend(title="Time [year]") +plt.ylabel("Oxygen Concentration [g/cm³]") +plt.xlabel("Distance From Edge [cm]") +plt.ticklabel_format(axis="y", style="plain") + +plt.savefig( + os.path.join(output_folder, "Edge_Seal_O2_ingress.png"), bbox_inches="tight" +) # Creates an image file of the standoff plot +plt.show() + +# %% [markdown] +# ## 5. Save data outputs. +# +# This cell contains a number of pre-scripted commands for exporting and saving data. The code to save plots is located after the plot creation. First check that the output folder exists. + +# %% +fpath = os.path.join(DATA_DIR, "O2permeation.json") +with open(fpath) as f: + data = json.load(f) +f.close() + +material_list = "" +for key in data: + if "name" in data[key].keys(): + material_list = material_list + key + "=" + data[key]["name"] + "\n" +material_list = material_list[0 : len(material_list) - 1] +print(material_list) + +# %% +print("Your results will be stored in %s" % output_folder) +print("The folder must already exist or the file will not be created") + +# Writes the meterological data to an *.csv file. +pvdeg.weather.write( + data_df=weather_df, + metadata=meta, + savefile=os.path.join(output_folder, "WeatherFile.csv"), +) + +# Writes a file with the edge seal oxygen profile calculations. +pd.DataFrame(oxygen_profile).to_csv( + os.path.join(output_folder, "ES_Oxygen_profile.csv") +) + +# Writes a file with temperature data used in the model calculations. +pd.DataFrame(temperature).to_csv( + os.path.join(output_folder, "ES_Temperature_profile.csv") +) diff --git a/tutorials_and_tools/tutorials_and_tools/Tools - Module Standoff for IEC TS 63126.py b/tools/scripts/Tools - Module Standoff for IEC TS 63126.py similarity index 79% rename from tutorials_and_tools/tutorials_and_tools/Tools - Module Standoff for IEC TS 63126.py rename to tools/scripts/Tools - Module Standoff for IEC TS 63126.py index 80efddf7e..27b5b4b63 100644 --- a/tutorials_and_tools/tutorials_and_tools/Tools - Module Standoff for IEC TS 63126.py +++ b/tools/scripts/Tools - Module Standoff for IEC TS 63126.py @@ -1,9 +1,7 @@ -#!/usr/bin/env python -# coding: utf-8 - +# %% [markdown] # # Tools - Module Standoff for IEC TS 63126 -# ## Calculation of module standoff distance according to IEC TS 63126 # +# ### Calculation of module standoff distance according to IEC TS 63126 # # **Requirements:** # - Local weather data file or site longitude and latittude @@ -30,18 +28,15 @@ # $**$ M. K. Fuentes, "A simplified thermal model for Flat-Plate photovoltaic arrays," United States, 1987-05-01 1987. https://www.osti.gov/biblio/6802914 # -# ![T98 70C standoff Map.png](attachment:62279573-41e3-45dd-bf62-4fa60c1e7e69.png) - -# In[ ]: - - -# if running on google colab, uncomment the next line and execute this cell to install the dependencies and prevent "ModuleNotFoundError" in later cells: -# !pip install pvdeg==0.3.3 - - -# In[3]: +# %% [markdown] +# ![alt text](images/T98_70C_standoff_Map.png) +# %% +# if running on google colab, uncomment the next line and execute this cell to install the dependencies +# and prevent "ModuleNotFoundError" in later cells: +# #!pip install pvdeg==0.4.2 +# %% import os import pvdeg import pandas as pd @@ -50,11 +45,9 @@ import matplotlib.pyplot as plt import seaborn as sns import math +import numpy as np - -# In[2]: - - +# %% # This information helps with debugging and getting support :) import sys import platform @@ -66,47 +59,34 @@ print("dask version", dask.__version__) print(DATA_DIR) - +# %% [markdown] # ## 1. Import Weather Data # # The function has these minimum requirements when using a weather data file: # - Weather data containing (at least) DNI, DHI, GHI, Temperature, RH, and Wind-Speed data at module level. # - Site meta-data containing (at least) latitude, longitude, and time zone # -# Alternatively one may can get meterological data from the NSRDB with just the longitude and latitude. +# Alternatively one may can get meterological data from the NSRDB or PVGIS with just the longitude and latitude. This function for the NSRDB (via NSRDB 'PSM3') works primarily for most of North America and South America. PVGIS works for most of the rest of the world (via SARAH 'PVGIS'). See the tutorial "Weather Database Access.ipynb" tutorial on PVdeg or Jensen et al. https://doi.org/10.1016/j.solener.2023.112092 for satellite coverage information. # -# In[4]: - - +# %% # Get data from a supplied data file (Do not use the next box of code if using your own file) weather_file = os.path.join(DATA_DIR, "psm3_demo.csv") -WEATHER, META = pvdeg.weather.read(weather_file, "psm") - - -# In[5]: - - -# From Tutorial 5 EXAMPLE, this works. -# API_KEY = 'your_api_key_here' -API_KEY = "DEMO_KEY" # you can activate this line to use the demonstration API key but it has limited usage. -# The example API key here is for demonstation and is rate-limited per IP. -# To get your own API key, visit https://developer.nrel.gov/signup/ - -weather_db = "PSM3" -weather_id = (33.4152, -111.8315) -weather_arg = { - "api_key": API_KEY, - "email": "user@mail.com", - "names": "tmy", - "attributes": [], - "map_variables": True, -} - -WEATHER_df, META = pvdeg.weather.get(weather_db, weather_id, **weather_arg) +WEATHER_df, META = pvdeg.weather.read(weather_file, "csv") print(META) - +# %% +# This routine will get a meteorological dataset from anywhere in the world where it is available +# weather_id = (24.7136, 46.6753) #Riyadh, Saudi Arabia +# weather_id = (35.6754, 139.65) #Tokyo, Japan +# weather_id = (-43.52646, 172.62165) #Christchurch, New Zealand +# weather_id = (64.84031, -147.73836) #Fairbanks, Alaska +# weather_id = (65.14037, -21.91633) #Reykjavik, Iceland +# weather_id = (33.4152, -111.8315) #Mesa, Arizona +# WEATHER_df, META = pvdeg.weather.get_anywhere(id=weather_id) +# print(META) + +# %% [markdown] # ## 2. Calculate Installation Standoff Minimum - Level 1 and Level 2 # # According to IEC TS 63126, Level 0, Level 1 and Level 2 certification is limited to T₉₈<70°C, <80°C and <90°C, respectively. Level 0 certification is essentially compliance to IEC 61730 and IEC 61215. The default value of T₉₈<70°C represents the minimium gap to avoid higher temperature certification according to IEC TS 63126. This minimum standoff ($x_{min}$) is the distance between the bottom of the module frame and the roof and can be extimated for a given environment as, @@ -127,21 +107,17 @@ # - x_0 : thermal decay constant [cm] (see documentation). The default is 6.5 cm. # - wind_factor : Wind speed power law correction factor to account for different wind speed measurement heights between weather database (e.g. NSRDB) and the tempeature model (e.g. SAPM). The default is 0.33. -# The following is the minimum function call. It defaults to horizontal tilt. - -# In[6]: - +# %% [markdown] +# The following is the minimum function call. It defaults to horizontal tilt and T₉₈=70°C. +# %% standoff = pvdeg.standards.standoff(weather_df=WEATHER_df, meta=META) -output = pvdeg.standards.interpret_standoff(standoff) -print(output) - - -# The following is a full function call for both T₉₈=70°C and 80°C. This also includes the ability to print out a detailed interpretation of the results. With this function, one may also want to change the tilt, azimuth, or T_98 - -# In[8]: +print(pvdeg.standards.interpret_standoff(standoff)) +# %% [markdown] +# The following is a full function call for both T₉₈=70°C and 80°C separately even though the second standoff distance can be calculated using only T98_0 and T98_inf. With this function, one may also want to change the tilt, azimuth, or T98. +# %% standoff_1 = pvdeg.standards.standoff( weather_df=WEATHER_df, meta=META, @@ -170,10 +146,9 @@ wind_factor=0.33, ) print("Second calculation standoff = ", "%.1f" % standoff_2["x"].iloc[0], " cm.") -print("\n") -print(pvdeg.standards.interpret_standoff(standoff_1, standoff_2)) - +print(pvdeg.standards.interpret_standoff(standoff_1=standoff_1, standoff_2=standoff_2)) +# %% [markdown] # ## 3. Calculate $X_{eff}$ from provided module temperature data. # # To do this calculation, one must use a set of data with: @@ -187,37 +162,34 @@ # # To do this calculation, one should also filter the data to remove times when the sun is not shining or when snow is likely to be on the module. The recommendations and programmed defaults are to use poa_min=100 W/m² and data when the minimum ambient temperature t_amb_min=0. -# In[9]: - - +# %% # Read the weather file -weather_file = os.path.join(DATA_DIR, "psm3_demo.csv") -Xeff_WEATHER, Xeff_META = pvdeg.weather.read(weather_file, "psm3") - -# Get module data from a supplied data file -measured = pd.read_csv(os.path.join(DATA_DIR, "module_temperature.csv")) - +weather_file = os.path.join(DATA_DIR, "xeff_demo.csv") +xeff_weather, xeff_meta = pvdeg.weather.read(weather_file, "csv") # Pull measured temperature and calculate theoretical insulated back module temperature and open rack module temperature -T_0, T_inf, T_measured, temp_air, POA = pvdeg.standards.eff_gap_parameters( - weather_df=Xeff_WEATHER, - meta=Xeff_META, - module_temp=measured["Module_Temperature"], +T_0, T_inf, xeff_poa = pvdeg.standards.eff_gap_parameters( + weather_df=xeff_weather, + meta=xeff_meta, sky_model="isotropic", temp_model="sapm", conf_0="insulated_back_glass_polymer", conf_inf="open_rack_glass_polymer", - tilt=39.73, - azimuth=180, wind_factor=0.33, ) - # Now calculate X_eff. x_eff = pvdeg.standards.eff_gap( - T_0, T_inf, T_measured, temp_air, POA, x_0=6.5, poa_min=100, t_amb_min=0 + T_0, + T_inf, + xeff_weather["module_temperature"], + xeff_weather["temp_air"], + xeff_poa["poa_global"], + x_0=6.5, + poa_min=100, + t_amb_min=0, ) print("The effective standoff for this system is", "%.1f" % x_eff, "cm.") - +# %% [markdown] # ## 4. Calculate $T_{98}$ for a given azimuth, tilt, and $X_{eff}$. # # Equation 2 can be reorganized as, @@ -226,29 +198,45 @@ # # and used to calculate the $98^{th}$ percential temperature, $T_{98}$, for a PV system having a given effective standoff height, $X_{eff}$, for an arbitrarily oriented module. Here, $T_{98,0}$ is the $98^{th}$ percentile for an insulated-back module and $T_{98,inf}$ is the $98^{th}$ percentile for a rack-mounted module. The input parameter possibilities are the same as shown in Objective #2 above, but the example below uses the default parameters. The actual tilt [degrees], azimuth [degrees] and $X_{eff}$ [cm] can be modifed as desired. -# In[10]: - - +# %% # This is the minimal function call using the common default settings to estimate T₉₈. T_98 = pvdeg.standards.T98_estimate( - weather_df=WEATHER_df, - meta=META, - tilt=META["latitude"], - azimuth=None, - x_eff=0, + weather_df=WEATHER_df, meta=META, tilt=-META["latitude"], azimuth=None, x_eff=10 ) print("The 98ᵗʰ percential temperature is estimated to be", "%.1f" % T_98, "°C.") +# %% +# This code will calculate the temperature for an arbitrary x_eff distance. Either set of kwargs can be modified and use. +# irradiance_kwarg ={ +# "axis_tilt": None, +# "axis_azimuth": None, +# "x_eff": 10, +# "module_mount": '1_axis'} +irradiance_kwarg = { + "tilt": META["latitude"], + "azimuth": None, + "x_eff": 10, + "module_mount": "fixed", +} + +T_xeff = pvdeg.standards.x_eff_temperature_estimate( + weather_df=WEATHER_df, meta=META, **irradiance_kwarg +) + +print( + "The 98ᵗʰ percential temperature is estimated to be", + "%.1f" % np.percentile(T_xeff, 98), + "°C.", +) +# %% [markdown] # ## 5. Plot $X_{min}$ for all azimuth and tilt for a given $T_{98}$. # # The temperature of a system is affected by the orientation. This section will scan all possible tilts and azimuths calculating the minimum standoff distance for a given $T_{98}$. Similar additional factors as above can also be modified but are not included here for simplicity. The tilt_step and azimuth_step are the number of degrees for each step for the 90° and 180° tilt and azimuth spans, respectively. The default for this calculation is for $T_{98}$=70°C, the boundary between Level 0 and Level 1 requirements. The temperature model information given below is unnecessary as these are default values that would get populated automatically. However, they were included here for clarity into a standard practice as per IEC TS 63126. # # $$ X_{min} = -X_0 \ln\left(1-\frac{T_{98,0}-T}{ T_{98,0}- T_{98,inf}}\right), Equation 2 $$ -# In[11]: - - +# %% # Scans through all the azimuth and tilt running the minimum standoff calculation # Set up keyword parameters for the calculation @@ -273,7 +261,7 @@ **kwarg_x, ) - +# %% [markdown] # The next cell creates a plot of the calculated data. Some of the things you may want to change are: # - cmap="Spectral_r": Change to have different colors # - plt.title : This will change the plot title. @@ -284,9 +272,7 @@ # - h_ticks=10 : This changes the number of horizontal tick marks # - Unblock the last two lines to ouput the plot as an *.png image file -# In[12]: - - +# %% standoff_series_df = pd.DataFrame( { "Tilt": standoff_series[:, 0], @@ -337,23 +323,21 @@ os.path.dirname(os.path.dirname(os.getcwd())), "TEMP", "results" ) try: - os.mkdir(output_folder) + os.makedirs(output_folder) except OSError as error: print(error) plt.savefig( - output_folder + r"\Standoff_Scan.png", bbox_inches="tight" + os.path.join(output_folder, "Standoff_Scan.png"), bbox_inches="tight" ) # Creates an image file of the standoff plot plt.show() - +# %% [markdown] # ## 6. Plot $T_{98}$ for all azimuth and tilt for a given $X_{eff}$. # # The temperature of a system is affected by the orientation and the effective standoff, $X_{eff}$, of the system. This section will scan all possible tilts and azimuths calculating the $T_{98}$ for a given $X_{eff}$. As above, additional factors can be modified but are not included here for simplicity. The tilt_step and azimuth_step are the number of degrees for each step for the 90° and 180° tilt and azimuth spans, respectively. The default for this calculation is for $X_{eff}$=10 cm, a common effective standoff distance on a rooftop system. A value of $X_{eff}$=None will run the calculations for an open rack system and $X_{eff}$=0 for an insulated-back system. -# In[13]: - - +# %% # Scans through all the azimuth and tilt running the 98ᵗʰ percentile temperature calculation. # Set up keyword parameters for the calculation kwarg_T = dict( @@ -377,7 +361,7 @@ **kwarg_T, ) - +# %% [markdown] # The next cell creates a plot of the calculated data. Some of the things you may want to change are: # - cmap="Spectral_r": Change to have different colors # - plt.title : This will change the plot title. @@ -388,9 +372,7 @@ # - h_ticks=10 : This changes the number of horizontal tick marks # - Unblock the last two lines to ouput the plot as an *.png image file -# In[14]: - - +# %% # This produces the plot of the data T98_series_df = pd.DataFrame( {"Tilt": T98_series[:, 0], "Azimuth": T98_series[:, 1], "T₉₈": T98_series[:, 2]} @@ -446,18 +428,59 @@ ) # Creates an image file of the standoff plot plt.show(T98_fig) - -# ## 7. Plot $X_{min}$ for Level 1, Level 2, and $T_{98}$ for a given region. +# %% [markdown] +# ## 7. Plot $X_{min}$ for a $T_{98}$, and plot $T_{98}$ for a given region. # -# This last Objective is much more complicated and is set up to utilize acess to a lot of computational power to run many sites simultaneously to create a regional map of standoff distance. This is presented as doing the computations on Amazon Web Services (AWS) for which you will need a paid account, and will be covered on a subsequent journal. +# This last Objective is much more complicated and is set up to utilize acess to a lot of computational power to run many sites simultaneously to create a regional map of standoff distance. +# For more in-depth instructions on doing this, look at the tutorial "Scenario - Geospatial.ipynb" here in PVDeg. +# +# Step #1: Create an object, "geospatial_standoff_scenario" to be used to run the computations. + +# %% +geospatial_standoff_scenario = pvdeg.GeospatialScenario( + name="standoff geospatial", + geospatial=True, +) + +# %% [markdown] +# Step #2: Identifies a subset of locations from the database to run the computations. +# Specifically all are from the NSRDB. + +# %% +geospatial_standoff_scenario.addLocation( + state="Colorado", county="Summit" +) # Identifies a subset of locations from the database to run the computations. Specifically all are from the NSRDB. + +# %% [markdown] +# Step #3: indicate which function will be run. Here the default is the standoff calculation, but it could be any other function with a key word argument dictionary. +# Here the 98th percential temperature is defined as 70C, but any arbitrary value can be specified. +# %% +geospatial_standoff_scenario.addJob( + func=pvdeg.standards.standoff, func_params={"T98": 70} +) + +# %% [markdown] +# Step #4: Run the scenario + +# %% +geospatial_standoff_scenario.run() + +# %% [markdown] +# Step #5: Create a plot of the standoff calculation. + +# %% +geospatial_standoff_scenario.plot_world("x") + +# %% +geospatial_standoff_scenario.plot_world("T98_inf") + +# %% [markdown] # ## 8. Save data outputs. # # This cell contains a number of pre-scripted commands for exporting and saving data. The code to save plots is located after the plot creation and is blocked by default. First check that the output folder exists, then unblock the code for data you would like to save. -# In[15]: - - +# %% print("Your results will be stored in %s" % output_folder) print("The folder must already exist or the file will not be created") @@ -471,4 +494,6 @@ os.path.join(output_folder, "Standoff_Scan.csv") ) # Writes a file with the Tilt and Azimuth scan calculations of standoff. -pd.DataFrame(T98_series_df).to_csv(os.path.join(output_folder, "T98_Scan.csv")) +pd.DataFrame(T98_series_df).to_csv( + os.path.join(output_folder, "T98_Scan.csv") +) # Writes a file with the Tilt and Azimuth scan calculations of T98. diff --git a/tutorials_and_tools/tutorials_and_tools/1 - Basics, Humidity, Design.ipynb b/tutorials/01_basics/01_basics_humidity_design.ipynb similarity index 99% rename from tutorials_and_tools/tutorials_and_tools/1 - Basics, Humidity, Design.ipynb rename to tutorials/01_basics/01_basics_humidity_design.ipynb index ac2fdd503..7c1357620 100644 --- a/tutorials_and_tools/tutorials_and_tools/1 - Basics, Humidity, Design.ipynb +++ b/tutorials/01_basics/01_basics_humidity_design.ipynb @@ -1586,7 +1586,7 @@ "metadata": {}, "source": [ "## 3. Module Humidities\n", - "`PVDEG` can be used to calculate the relative humidity of several layers within a PV module: the outside surface of the module, front ecapsulant, back encapsulant, and backsheet. This can be done with 2 techniques: Automatically and Manually. " + "`PVDEG` can be used to calculate the relative humidity of several layers within a PV module: the outside surface of the module, front ecapsulant, back encapsulant, and backsheet. This can be done with 2 techniques: Automatically and Manually." ] }, { @@ -1711,7 +1711,9 @@ } ], "source": [ - "rh_module = pvdeg.humidity.module(weather_df=WEATHER, meta=META, backsheet_thickness=0.3, back_encap_thickness=0.46)\n", + "rh_module = pvdeg.humidity.module(\n", + " weather_df=WEATHER, meta=META, backsheet_thickness=0.3, back_encap_thickness=0.46\n", + ")\n", "rh_module.head()" ] }, @@ -1740,7 +1742,7 @@ }, "outputs": [], "source": [ - "surface_relative_humidity=WEATHER[\"relative_humidity\"]\n", + "surface_relative_humidity = WEATHER[\"relative_humidity\"]\n", "temperature_ambient = WEATHER[\"temp_air\"]\n", "\n", "rh_surface_relative = pvdeg.humidity.surface_relative(\n", @@ -1832,7 +1834,9 @@ } ], "source": [ - "water_saturation_pressure, avg_water_saturation_pressure = pvdeg.humidity.water_saturation_pressure(WEATHER[\"temp_air\"])\n", + "water_saturation_pressure, avg_water_saturation_pressure = (\n", + " pvdeg.humidity.water_saturation_pressure(WEATHER[\"temp_air\"])\n", + ")\n", "\n", "k = pvdeg.design.edge_seal_ingress_rate(avg_water_saturation_pressure)\n", "\n", diff --git a/tutorials_and_tools/tutorials_and_tools/2 - Degradation.ipynb b/tutorials/01_basics/02_degradation.ipynb similarity index 98% rename from tutorials_and_tools/tutorials_and_tools/2 - Degradation.ipynb rename to tutorials/01_basics/02_degradation.ipynb index a6a909a36..4654dbb05 100644 --- a/tutorials_and_tools/tutorials_and_tools/2 - Degradation.ipynb +++ b/tutorials/01_basics/02_degradation.ipynb @@ -373,7 +373,7 @@ "source": [ "## 6. Solder Fatigue\n", "\n", - "Estimate the thermomechanical fatigue of flat plate photovoltaic module solder joints over the time range given using estimated cell temperature. Like other `pvdeg` funcitons, the minimal parameters are (weather_df, meta). Running the function with only these two inputs will use default PV module configurations ( open_rack_glass_polymer ) and the 'sapm' temperature model over the entire length of the weather data. " + "Estimate the thermomechanical fatigue of flat plate photovoltaic module solder joints over the time range given using estimated cell temperature. Like other `pvdeg` funcitons, the minimal parameters are (weather_df, meta). Running the function with only these two inputs will use default PV module configurations ( open_rack_glass_polymer ) and the 'sapm' temperature model over the entire length of the weather data." ] }, { @@ -440,9 +440,12 @@ "\n", "# calculate cell temperature over our selected date-time range.\n", "# specify the module configuration\n", - "temp_cell = pvdeg.temperature.cell(weather_df=WEATHER.loc[time_range],\n", - " meta=META,temp_model=\"sapm\",\n", - " conf=\"insulated_back_glass_polymer\")\n", + "temp_cell = pvdeg.temperature.cell(\n", + " weather_df=WEATHER.loc[time_range],\n", + " meta=META,\n", + " temp_model=\"sapm\",\n", + " conf=\"insulated_back_glass_polymer\",\n", + ")\n", "\n", "fatigue = pvdeg.fatigue.solder_fatigue(\n", " weather_df=WEATHER, meta=META, time_range=time_range, temp_cell=temp_cell\n", diff --git a/tutorials_and_tools/tutorials_and_tools/3 - Spectral Degradation.ipynb b/tutorials/01_basics/03_spectral_degradation.ipynb similarity index 97% rename from tutorials_and_tools/tutorials_and_tools/3 - Spectral Degradation.ipynb rename to tutorials/01_basics/03_spectral_degradation.ipynb index 5a3e8c44c..e405ebf50 100644 --- a/tutorials_and_tools/tutorials_and_tools/3 - Spectral Degradation.ipynb +++ b/tutorials/01_basics/03_spectral_degradation.ipynb @@ -55,7 +55,9 @@ "import pvdeg\n", "from pvdeg import DATA_DIR\n", "\n", - "warnings.filterwarnings('ignore', message='.*Pyarrow will become a required dependency.*')" + "warnings.filterwarnings(\n", + " \"ignore\", message=\".*Pyarrow will become a required dependency.*\"\n", + ")" ] }, { @@ -100,14 +102,14 @@ "\n", "Spectral degradation has 4 main requirements:\n", "- Spectral Irradiance [W/m^2 nm]\n", - "- Wavelength [nm] \n", + "- Wavelength [nm]\n", "- Module Relative Humidity [%]\n", "- Module Temperature [C]\n", "\n", "For more advanced scenarios, you may want to calculate the degradation of a particular layer within the module. Below, we are using *backside* irradiance and therefore a slightly different temperature and humidity have been calculated. To calculate degradation on the backside, we used `pvdeg.humidity.rh_backsheet`. For the the front side, you should use `pvdeg.humidity.rh_surface_outside` or `rh_front_encap`\n", "\n", "\n", - "For this tutorial we are using pre-generated data from a ray-tracing simulation. To calculate the degradation rate, we will need the wavelengths used in the simulation. " + "For this tutorial we are using pre-generated data from a ray-tracing simulation. To calculate the degradation rate, we will need the wavelengths used in the simulation." ] }, { @@ -254,7 +256,7 @@ " rh=SPECTRA[\"RH\"],\n", " temp=SPECTRA[\"Temperature\"],\n", " wavelengths=wavelengths,\n", - " time=SPECTRA.index\n", + " time=SPECTRA.index,\n", ")" ] } diff --git a/tutorials_and_tools/tutorials_and_tools/4 - Weather Database Access.ipynb b/tutorials/01_basics/04_weather_database_access.ipynb similarity index 98% rename from tutorials_and_tools/tutorials_and_tools/4 - Weather Database Access.ipynb rename to tutorials/01_basics/04_weather_database_access.ipynb index 4e52db21d..934571eaa 100644 --- a/tutorials_and_tools/tutorials_and_tools/4 - Weather Database Access.ipynb +++ b/tutorials/01_basics/04_weather_database_access.ipynb @@ -253,7 +253,7 @@ "print(pvdeg.standards.interpret_standoff(res))\n", "\n", "# Clean metadata for consistent output\n", - "meta_clean = {k: v for k, v in meta.items() if k not in ['irradiance_time_offset']}\n", + "meta_clean = {k: v for k, v in meta.items() if k not in [\"irradiance_time_offset\"]}\n", "print(meta_clean)" ] }, @@ -318,7 +318,7 @@ "print(pvdeg.standards.interpret_standoff(res))\n", "\n", "# Clean metadata for consistent output (remove variable fields)\n", - "meta_clean = {k: v for k, v in meta.items() if k not in ['irradiance_time_offset']}\n", + "meta_clean = {k: v for k, v in meta.items() if k not in [\"irradiance_time_offset\"]}\n", "print(meta_clean)" ] }, diff --git a/tutorials/01_basics/README.md b/tutorials/01_basics/README.md new file mode 100644 index 000000000..56f425d90 --- /dev/null +++ b/tutorials/01_basics/README.md @@ -0,0 +1,16 @@ +# Basics Tutorials + +Introduction to PVDegradationTools covering fundamental concepts and workflows. + +## Tutorials + +1. **01_basics_humidity_design.ipynb** - Introduction to basic concepts, humidity calculations, and design parameters +2. **02_degradation.ipynb** - Overview of degradation modeling and calculations +3. **03_spectral_degradation.ipynb** - Spectral degradation analysis +4. **04_weather_database_access.ipynb** - Accessing and working with weather databases + +## Getting Started + +These tutorials are designed to be completed in sequence. Start with tutorial 01 and progress through to 04. + +All tutorials can be run locally or in Google Colab by clicking the rocket icon at the top of each notebook. diff --git a/tutorials_and_tools/tutorials_and_tools/1 - Basics, Humidity, Design.py b/tutorials/01_basics/scripts/01_basics_humidity_design.py similarity index 85% rename from tutorials_and_tools/tutorials_and_tools/1 - Basics, Humidity, Design.py rename to tutorials/01_basics/scripts/01_basics_humidity_design.py index 66842b3ca..6b68499cb 100644 --- a/tutorials_and_tools/tutorials_and_tools/1 - Basics, Humidity, Design.py +++ b/tutorials/01_basics/scripts/01_basics_humidity_design.py @@ -1,6 +1,4 @@ -#!/usr/bin/env python -# coding: utf-8 - +# %% [markdown] # # 1 - Basics, Humidity, Design # ### Module Humidity and Edge Seal Width # @@ -14,26 +12,18 @@ # 3. Generate module humidities # 4. Calculate edge seal width -# In[1]: - - +# %% # if running on google colab, uncomment the next line and execute this cell to install the dependencies and prevent "ModuleNotFoundError" in later cells: -# !pip install pvdeg==0.3.3 - - -# In[1]: - +# # !pip install pvdeg==0.3.3 +# %% import os import pandas as pd import pvdeg from pvdeg import DATA_DIR - -# In[ ]: - - +# %% # This information helps with debugging and getting support :) import sys import platform @@ -43,7 +33,7 @@ print("Pandas version ", pd.__version__) print("pvdeg version ", pvdeg.__version__) - +# %% [markdown] # ## 1. Reading in Weather Data and Site Meta-Data # Most `pvdeg` functions have been standardized to operate from popular weather files such as TMY3, EPW, and PSM3. For high-performance computer users, NSRDB and other database fetching tools can be used. For these tutorials, we will use local weather files. Unless otherwise stated, functions require the following fields within a weather file: # @@ -62,30 +52,24 @@ # - Longitude # - Altitude -# In[2]: - - +# %% PSM_FILE = os.path.join(DATA_DIR, "psm3_demo.csv") WEATHER, META = pvdeg.weather.read(PSM_FILE, "psm") - +# %% [markdown] # Let's take a closer look at the dataframe (weather) and dictionary (meta) imported above. The structure will be used by most `pvdeg` functions. -# In[3]: - - +# %% WEATHER.head() - +# %% [markdown] # Meta-Data will vary greatly between weather files. However, at a minimum they should all contain the fields required by `pvdeg` listed above. Let's look at the meta-data generated by our PSM3 weather file. It provides much more information that we need, but at the very end are the three most important fields. -# In[4]: - - +# %% META - +# %% [markdown] # We'll be working with a lot of time series data, generally with a date-time index. If you're # processing an entire year of data, you don't need to sort or filter the data. However, you may want # to filter the data by a few different criteria. Below are some common examples. @@ -94,38 +78,28 @@ # - range of months # - Filter by sun-up hours -# In[5]: - - +# %% # Let's select the month of June june_weather = WEATHER[WEATHER.index.month == 6] june_weather - -# In[6]: - - +# %% # Let's filter the summer months for the northern hemisphere summer_months = [6, 7, 8, 9] summer_weather = WEATHER[WEATHER.index.month.isin(summer_months)] summer_weather - -# In[7]: - - +# %% # lets just select hours from the year where the sun is above the horizon sunup_weather = WEATHER[WEATHER["ghi"] > 0] sunup_weather - +# %% [markdown] # ## 2. Solar Position, POA, and Module Temperature # # Many operations with `PVDEG` require solar position, POA irradiance, and module temperature. Usually a `pvdeg` method will calculate these data sets automatically when it is required, however it will not keep the data for external use. For now, we will calculate them directly. This is helpful when you need to use the data for an external calculation. Here, we generate the solar position (azimuth, elevation, etc), plane of array irradiance (POA), and module temperature. `PVDEG` has wrappers for quickly using `PVLIB` to generate these figures with minimal input -# In[8]: - - +# %% sol_pos = pvdeg.spectral.solar_position(weather_df=WEATHER, meta=META) poa_df = pvdeg.spectral.poa_irradiance( @@ -134,7 +108,7 @@ temp_mod = pvdeg.temperature.module(weather_df=WEATHER, meta=META) # , poa=poa_df) - +# %% [markdown] # For more advanced usage of these functions, refer to the documentation for `pvdeg` and `pvlib`. # # Lets inspect the output from each of these functions @@ -142,20 +116,16 @@ # `solar_position` returns a datetime-indexed dataframe of solar position for the length and frequency given by the weather file. # -# In[9]: - - +# %% sol_pos - +# %% [markdown] # `poa_irradiance` returns a datetime-indexed dataframe as well. Each column contains either the global plane of array irradiance or a particular contribition. Lets look at a time in the index we expect to have daylight. -# In[10]: - - +# %% poa_df.loc["1999-01-01 13:30:00-07:00":"1999-01-01 17:30:00-07:00"] - +# %% [markdown] # `temperature.module` has several optional parameters. Below is an example which explicity uses all of the default values. This function will return a datetime-indexed series matching the index of the given weather file. For more options, see the pvlib documentation for temperature models. # # https://pvlib-python.readthedocs.io/en/stable/reference/pv_modeling/temperature.html @@ -166,34 +136,32 @@ # - conf : choose a recognized module configuration # - wind_speed_factor : change the empirical wind speed fit paramter -# In[11]: - - +# %% temp_mod = pvdeg.temperature.module( weather_df=WEATHER, meta=META, poa=poa_df, temp_model="sapm", conf="open_rack_glass_polymer", - wind_speed_factor=1, ) temp_mod.loc["1999-01-01 13:30:00-07:00":"1999-01-01 17:30:00-07:00"] - +# %% [markdown] # ## 3. Module Humidities # `PVDEG` can be used to calculate the relative humidity of several layers within a PV module: the outside surface of the module, front ecapsulant, back encapsulant, and backsheet. This can be done with 2 techniques: Automatically and Manually. +# %% [markdown] # ### 3.a. Automatic # Use the function `humidity.module`. This method does all of the calculations behind the scenes. It requires only 2 inputs (weather data and meta data). It will return a dataframe with all the layers of the module. -# In[12]: - - -rh_module = pvdeg.humidity.module(weather_df=WEATHER, meta=META) +# %% +rh_module = pvdeg.humidity.module( + weather_df=WEATHER, meta=META, backsheet_thickness=0.3, back_encap_thickness=0.46 +) rh_module.head() - +# %% [markdown] # ### 3.b. Manual # Use the individual functions to calculate the RH in each layer. These are named and require more extensive input parameters. This must be done in the correct order: # 1. Surface Outside @@ -201,52 +169,51 @@ # 2. Back Encapsulant # 3. Backsheet -# In[13]: +# %% +surface_relative_humidity = WEATHER["relative_humidity"] +temperature_ambient = WEATHER["temp_air"] - -rh_surface_outside = pvdeg.humidity.surface_relative( - rh_ambient=WEATHER["relative_humidity"], - temp_ambient=WEATHER["temp_air"], +rh_surface_relative = pvdeg.humidity.surface_relative( + rh_ambient=surface_relative_humidity, + temp_ambient=temperature_ambient, temp_module=temp_mod, ) -rh_front_encap = pvdeg.humidity.front_encapsulant( - rh_ambient=rh_surface_outside, - temp_ambient=WEATHER["temp_air"], +rh_front_encapsulant = pvdeg.humidity.front_encapsulant( + rh_ambient=surface_relative_humidity, + temp_ambient=temperature_ambient, temp_module=temp_mod, ) -rh_back_encap = pvdeg.humidity.back_encapsulant_water_concentration( - rh_ambient=rh_surface_relative, - temp_ambient=WEATHER["temp_air"], +rh_back_encap = pvdeg.humidity.back_encapsulant( + rh_ambient=surface_relative_humidity, + temp_ambient=temperature_ambient, temp_module=temp_mod, ) rh_backsheet = pvdeg.humidity.backsheet_from_encap( - rh_back_encap=rh_back_encap, rh_surface_outside=WEATHER["relative_humidity"] + rh_back_encap=rh_back_encap, rh_surface_outside=surface_relative_humidity ) - +# %% [markdown] # ## 4. Design: Edge Seal Width # `pvdeg.design.edge_seal_width` calculates the width [cm] required for several years of water ingress. If you do not specify the number of years, it will use the default value of 25. As with most `pvdeg` functions, we can automatically generate all necessary data if we pass the two arguments (weather_df, meta). -# In[14]: - - +# %% edge_seal_width = pvdeg.design.edge_seal_width(weather_df=WEATHER, meta=META) edge_seal_width - +# %% [markdown] # Lets look at the calculation step by step. To get the estimated edge seal width, we need the following: # 1. Humidity Saturation Point # 2. Edge seal ingress rate ( k ) or the estimated rate of water ingress through edge seal in [cm/hour^0.5] -# In[15]: - - -psat, psat_avg = pvdeg.humidity.psat(WEATHER["temp_air"]) +# %% +water_saturation_pressure, avg_water_saturation_pressure = ( + pvdeg.humidity.water_saturation_pressure(WEATHER["temp_air"]) +) -k = pvdeg.design.edge_seal_ingress_rate(avg_psat=psat_avg) +k = pvdeg.design.edge_seal_ingress_rate(avg_water_saturation_pressure) edge_seal_width = pvdeg.design.edge_seal_width( weather_df=WEATHER, meta=META, k=k, years=25 @@ -254,13 +221,11 @@ print(edge_seal_width) - +# %% [markdown] # ### Alternate Edge Seal Width # If you have the dew point, or wet-bulb temperature, you can calculate the edge seal width directly. -# In[17]: - - +# %% edge_seal_width = pvdeg.design.edge_seal_width( weather_df=WEATHER, meta=META, from_dew_point=True ) diff --git a/tutorials_and_tools/tutorials_and_tools/2 - Degradation.py b/tutorials/01_basics/scripts/02_degradation.py similarity index 95% rename from tutorials_and_tools/tutorials_and_tools/2 - Degradation.py rename to tutorials/01_basics/scripts/02_degradation.py index 6da786f50..0f4f59c78 100644 --- a/tutorials_and_tools/tutorials_and_tools/2 - Degradation.py +++ b/tutorials/01_basics/scripts/02_degradation.py @@ -1,6 +1,4 @@ -#!/usr/bin/env python -# coding: utf-8 - +# %% [markdown] # # 2 - Degradation # Degradation and Solder Fatigue # @@ -20,26 +18,18 @@ # 5. Quick Method # 5. Solder Fatigue -# In[1]: - - +# %% # if running on google colab, uncomment the next line and execute this cell to install the dependencies and prevent "ModuleNotFoundError" in later cells: -# !pip install pvdeg==0.3.3 - - -# In[2]: - +# # !pip install pvdeg==0.3.3 +# %% import os import pandas as pd import pvdeg from pvdeg import DATA_DIR - -# In[3]: - - +# %% # This information helps with debugging and getting support :) import sys import platform @@ -49,25 +39,21 @@ print("Pandas version ", pd.__version__) print("pvdeg version ", pvdeg.__version__) - +# %% [markdown] # ## 1. Read In the Weather File # # This is usually the first step. Use a PSM3, TMY3, or EPW file. For this demo, use the provided PSM3 weather file. -# In[2]: - - +# %% PSM_FILE = os.path.join(DATA_DIR, "psm3_demo.csv") WEATHER, META = pvdeg.weather.read(PSM_FILE, "psm") - +# %% [markdown] # ## 2. Generate Basic Modeling Data # # For this tutorial we will need solar position, POA, PV cell and module temperature. Let's gernate those individually with their respective functions. -# In[3]: - - +# %% sol_pos = pvdeg.spectral.solar_position(weather_df=WEATHER, meta=META) poa_df = pvdeg.spectral.poa_irradiance( @@ -78,7 +64,7 @@ temp_module = pvdeg.temperature.module(weather_df=WEATHER, meta=META, poa=poa_df) - +# %% [markdown] # ## 3. VantHoff Degradation # # Van 't Hoff Irradiance Degradation @@ -87,9 +73,7 @@ # # As with most `pvdeg` functions, the following functions will always require two arguments (weather_df and meta) -# In[4]: - - +# %% # chamber irradiance (W/m^2) I_chamber = 1000 # chamber temperature (C) @@ -102,15 +86,15 @@ I_chamber=I_chamber, temp_chamber=temp_chamber, poa=poa_df, - temp_cell=temp_cell, + temp=temp_cell, ) # calculate the VantHoff weighted irradiance irr_weighted_avg_v = pvdeg.degradation.IwaVantHoff( - weather_df=WEATHER, meta=META, poa=poa_df, temp_cell=temp_cell + weather_df=WEATHER, meta=META, poa=poa_df, temp=temp_cell ) - +# %% [markdown] # ## 4. Arrhenius # Calculate the Acceleration Factor between the rate of degredation of a modeled environmnet versus a modeled controlled environmnet # @@ -124,9 +108,7 @@ # Equation: # $$ I_{WA} = [ \frac{ \Sigma (I_{outdoor}^x * RH_{outdoor}^n e^{\frac{-E_a}{k T_{outdood}}}) }{ N * RH_{WA}^n * e^{- \frac{E_a}{k T_eq}} } ]^{\frac{1}{x}} $$ -# In[6]: - - +# %% # relative humidity within chamber (%) rh_chamber = 15 # arrhenius activation energy (kj/mol) @@ -146,7 +128,7 @@ rh_chamber=rh_chamber, temp_chamber=temp_chamber, poa=poa_df, - temp_cell=temp_cell, + temp=temp_cell, Ea=Ea, ) @@ -155,18 +137,16 @@ meta=META, poa=poa_df, rh_outdoor=WEATHER["relative_humidity"], - temp_cell=temp_cell, + temp=temp_cell, Ea=Ea, ) - +# %% [markdown] # ## 5. Quick Method (Degradation) # # For quick calculations, you can omit POA and both module and cell temperature. The function will calculate these figures as needed using the available weather data with the default options for PV module configuration. -# In[7]: - - +# %% # chamber settings I_chamber = 1000 temp_chamber = 60 @@ -181,10 +161,7 @@ irr_weighted_avg_v = pvdeg.degradation.IwaVantHoff(weather_df=WEATHER, meta=META) - -# In[8]: - - +# %% rh_surface = pvdeg.humidity.surface_relative( rh_ambient=WEATHER["relative_humidity"], temp_ambient=WEATHER["temp_air"], @@ -205,17 +182,15 @@ weather_df=WEATHER, meta=META, rh_outdoor=WEATHER["relative_humidity"], Ea=Ea ) - +# %% [markdown] # ## 6. Solder Fatigue # # Estimate the thermomechanical fatigue of flat plate photovoltaic module solder joints over the time range given using estimated cell temperature. Like other `pvdeg` funcitons, the minimal parameters are (weather_df, meta). Running the function with only these two inputs will use default PV module configurations ( open_rack_glass_polymer ) and the 'sapm' temperature model over the entire length of the weather data. -# In[9]: - - +# %% fatigue = pvdeg.fatigue.solder_fatigue(weather_df=WEATHER, meta=META) - +# %% [markdown] # If you wish to reduce the span of time or use a non-default temperature model, you may specify the parameters manually. Let's try an explicit example. # We want the solder fatigue estimated over the month of June for a roof mounted glass-front polymer-back module. # @@ -223,9 +198,7 @@ # 2. Next, generate the cell temperature. Make sure to explicity restrict the weather data to our dt-index for June. Next, declare the PV module configuration. # 3. Calculate the fatigue. Explicity specify the time_range (our dt-index for June from step 1) and the cell temperature as we caculated in step 2 -# In[ ]: - - +# %% # select the month of June time_range = WEATHER.index[WEATHER.index.month == 6] @@ -238,7 +211,6 @@ conf="insulated_back_glass_polymer", ) - fatigue = pvdeg.fatigue.solder_fatigue( weather_df=WEATHER, meta=META, time_range=time_range, temp_cell=temp_cell ) diff --git a/tutorials_and_tools/tutorials_and_tools/3 - Spectral Degradation.py b/tutorials/01_basics/scripts/03_spectral_degradation.py similarity index 85% rename from tutorials_and_tools/tutorials_and_tools/3 - Spectral Degradation.py rename to tutorials/01_basics/scripts/03_spectral_degradation.py index 36f5db8b6..43b605524 100644 --- a/tutorials_and_tools/tutorials_and_tools/3 - Spectral Degradation.py +++ b/tutorials/01_basics/scripts/03_spectral_degradation.py @@ -1,6 +1,4 @@ -#!/usr/bin/env python -# coding: utf-8 - +# %% [markdown] # # 3 - Spectral Degradation # # **Requirements:** @@ -14,26 +12,23 @@ # 1. Read in spectral irradiance # 2. Calculate spectral degradation -# In[1]: - - +# %% # if running on google colab, uncomment the next line and execute this cell to install the dependencies and prevent "ModuleNotFoundError" in later cells: -# !pip install pvdeg==0.3.3 - - -# In[1]: - +# # !pip install pvdeg==0.3.3 +# %% import os +import warnings import pandas as pd import numpy as np import pvdeg from pvdeg import DATA_DIR +warnings.filterwarnings( + "ignore", message=".*Pyarrow will become a required dependency.*" +) -# In[ ]: - - +# %% # This information helps with debugging and getting support :) import sys import platform @@ -43,7 +38,7 @@ print("Pandas version ", pd.__version__) print("pvdeg version ", pvdeg.__version__) - +# %% [markdown] # ## 1. Read in spectral irradiance data # # Spectral degradation has 4 main requirements: @@ -57,25 +52,22 @@ # # For this tutorial we are using pre-generated data from a ray-tracing simulation. To calculate the degradation rate, we will need the wavelengths used in the simulation. -# In[2]: - - +# %% wavelengths = np.array(range(280, 420, 20)) SPECTRA = pd.read_csv(os.path.join(DATA_DIR, "spectra.csv"), header=0, index_col=0) SPECTRA.head() - +# %% [markdown] # ### 2. Calculate Degradation # # The spectral degradation function has several optional paramters. For more information, refer to the documentation. Below is a function call with the minimum required information. -# In[3]: - - -degradation = pvdeg.degradation.degradation( +# %% +degradation = pvdeg.degradation.degradation_spectral( spectra=SPECTRA["Spectra"], - rh_module=SPECTRA["RH"], - temp_module=SPECTRA["Temperature"], + rh=SPECTRA["RH"], + temp=SPECTRA["Temperature"], wavelengths=wavelengths, + time=SPECTRA.index, ) diff --git a/tutorials_and_tools/tutorials_and_tools/4 - Weather Database Access.py b/tutorials/01_basics/scripts/04_weather_database_access.py similarity index 86% rename from tutorials_and_tools/tutorials_and_tools/4 - Weather Database Access.py rename to tutorials/01_basics/scripts/04_weather_database_access.py index a2406aad9..76f696422 100644 --- a/tutorials_and_tools/tutorials_and_tools/4 - Weather Database Access.py +++ b/tutorials/01_basics/scripts/04_weather_database_access.py @@ -1,6 +1,4 @@ -#!/usr/bin/env python -# coding: utf-8 - +# %% [markdown] # # 4 - Weather Database Access # # **Requirements:** @@ -21,6 +19,7 @@ # # For all users and all steps: This journal will run significantly longer than other tutorials and have significant internet traffic as you fetch large datasets. +# %% [markdown] # This example demonstrates the calculation of a minimum standoff distance necessary for roof-mounted PV modules to ensure that the $T_{98}$ operational temperature remains under 70°C, in which case the more rigorous thermal stability testing requirements of IEC TS 63126 would not needed to be considered. We use data from [Fuentes, 1987] to model the approximate exponential decay in temperature, $T(X)$, with increasing standoff distance, $X$, as, # # $$ X = -X_0 \ln\left(1-\frac{T_0-T}{\Delta T}\right)$$ @@ -29,24 +28,17 @@ # # The following figure showcases this calulation for the entire United States. We used pvlib and data from the National Solar Radiation Database (NSRDB) to calculate the module temperatures for different mounting configuration and applied our model to obtain the standoff distance for roof-mounted PV systems. +# %% [markdown] # ## Single location example -# In[1]: - - +# %% # if running on google colab, uncomment the next line and execute this cell to install the dependencies and prevent "ModuleNotFoundError" in later cells: -# !pip install pvdeg==0.3.3 - - -# In[2]: - +# # !pip install pvdeg==0.3.3 +# %% import pvdeg - -# In[3]: - - +# %% # This information helps with debugging and getting support :) import sys import platform @@ -55,8 +47,8 @@ print("Python version ", sys.version) print("pvdeg version ", pvdeg.__version__) - -# ## 1. NSRDB - HSDS on Eagle +# %% [markdown] +# ## 1. NSRDB - HSDS on Kestrel # # This method requires a direct connection to NREL's high performance computer "Eagle". If you are not running this journal from Eagle, skip this section and proceed to section **2.** # @@ -66,15 +58,12 @@ # # Next, we want to select a satellite, named dataset (year of data), and what weather attributes we want to fetch. For further options, see the documentation for `pvdeg.weather.get` -# In[ ]: - - +# %% # Get weather data weather_db = "NSRDB" # Latitude and Longitude weather_id = (33.448376, -112.074036) -weather_id = (39.741931, -105.169891) # weather_id = 1933572 weather_arg = { "satellite": "GOES", @@ -90,33 +79,21 @@ ], } -weather_df, meta = pvdeg.weather.get(weather_db, weather_id, **weather_arg) +# Uncomment the following when working on NREL Kestrel + +# weather_df, meta = pvdeg.weather.get(weather_db, weather_id, **weather_arg) +# res = pvdeg.standards.standoff(weather_df=weather_df, meta=meta, tilt=None, azimuth=180, sky_model='isotropic', temp_model='sapm', +# conf_0='insulated_back_glass_polymer', conf_inf='open_rack_glass_polymer', T98=70, x_0=6.5, wind_factor=0.33) +# print(pvdeg.standards.interpret_standoff(res)) +# print(meta) +# %% [markdown] # `pvdeg.weather.get` returns the same variables as `weather.read` which we have used in each journal before this. We get a weather DataFrame and a meta-data dicitonary. Each contains a minimum of consistent fields, but may have additional fields based on the database accessed or the attributes requested. # # Lets verify the weather data we fetched by running a familiar calculation; standoff distance. -# In[ ]: - - -res = pvdeg.standards.standoff( - weather_df=weather_df, - meta=meta, - tilt=None, - azimuth=180, - sky_model="isotropic", - temp_model="sapm", - conf_0="insulated_back_glass_polymer", - conf_inf="open_rack_glass_polymer", - T98=70, - x_0=6.5, - wind_factor=0.33, -) -print(pvdeg.standards.interpret_standoff(res)) -print(meta) - - +# %% [markdown] # ## 2. NSRDB - API # # To access the NREL NSRDB, you will need an API key. Key's are free, but require you to set up an account. Without an API key, you can use a demonstration API which is severely limited. To set up an account and get your API key, visit https://developer.nrel.gov/signup/ @@ -127,20 +104,16 @@ # - names = 'tmy' : generate a TMY-like weather dataframe aggregate. This will calculate the relative humidity from temperature and dew point. # - names = '2019' : collect a weather dataframe including measured relative humidity. -# In[ ]: - - +# %% API_KEY = "your_api_key_here" # The example API key here is for demonstation and is rate-limited per IP. # To get your own API key, visit https://developer.nrel.gov/signup/ -weather_db = "PSM3" +weather_db = "PSM4" weather_id = (39.741931, -105.169891) weather_arg = { "api_key": "DEMO_KEY", "email": "user@mail.com", - "names": "tmy", - "attributes": [], "map_variables": True, } @@ -160,16 +133,17 @@ wind_factor=0.33, ) print(pvdeg.standards.interpret_standoff(res)) -print(meta) +# Clean metadata for consistent output +meta_clean = {k: v for k, v in meta.items() if k not in ["irradiance_time_offset"]} +print(meta_clean) +# %% [markdown] # ## 3. PVGIS # # This method uses the PVGIS database, a public resource. It requires no API key or user account. -# In[ ]: - - +# %% weather_db = "PVGIS" # weather_id = (39.741931, -105.169891) weather_id = (24.7136, 46.6753) # Riyadh, Saudi Arabia @@ -193,7 +167,9 @@ wind_factor=0.33, ) print(pvdeg.standards.interpret_standoff(res)) -print(meta) +# Clean metadata for consistent output (remove variable fields) +meta_clean = {k: v for k, v in meta.items() if k not in ["irradiance_time_offset"]} +print(meta_clean) -# In[ ]: +# %% diff --git a/tutorials_and_tools/tutorials_and_tools/B-O LID - Accelerated Test.ipynb b/tutorials/02_degradation/01_bo_lid_accelerated_test.ipynb similarity index 99% rename from tutorials_and_tools/tutorials_and_tools/B-O LID - Accelerated Test.ipynb rename to tutorials/02_degradation/01_bo_lid_accelerated_test.ipynb index 17812df26..d4a7404cd 100644 --- a/tutorials_and_tools/tutorials_and_tools/B-O LID - Accelerated Test.ipynb +++ b/tutorials/02_degradation/01_bo_lid_accelerated_test.ipynb @@ -330,14 +330,18 @@ "iopub.status.busy": "2025-11-13T21:54:16.954627Z", "iopub.status.idle": "2025-11-13T21:54:16.958966Z", "shell.execute_reply": "2025-11-13T21:54:16.958966Z" - } + }, + "lines_to_next_cell": 2 }, "outputs": [], "source": [ "mechanism_params = utilities.get_kinetics(\"D045\")\n", "\n", "# Flatten the nested dictionary to get only the \"value\" for each parameter\n", - "mechanism_params = {k: v[\"value\"] if isinstance(v, dict) and \"value\" in v else v for k, v in mechanism_params.items()}\n" + "mechanism_params = {\n", + " k: v[\"value\"] if isinstance(v, dict) and \"value\" in v else v\n", + " for k, v in mechanism_params.items()\n", + "}" ] }, { @@ -345,7 +349,7 @@ "metadata": {}, "source": [ "## Set up timeseries\n", - "In this example, we are going to model test with constant temperature and injection. IEC 61215 MQT 19.1 prescribes 10 $kWh/m^2$ of 1-sun illumination (i.e., 10 hours of 1-sun) with maximum power point tracking at $50\\degree C$. For most typical c-Si modules, MPP injection is roughly $I_{sc}-I_{mp}$, or roughly equal to $0.05\\times I_{sc}$. So we will set injection equal to 0.05 \"suns\" of injection. \n", + "In this example, we are going to model test with constant temperature and injection. IEC 61215 MQT 19.1 prescribes 10 $kWh/m^2$ of 1-sun illumination (i.e., 10 hours of 1-sun) with maximum power point tracking at $50\\degree C$. For most typical c-Si modules, MPP injection is roughly $I_{sc}-I_{mp}$, or roughly equal to $0.05\\times I_{sc}$. So we will set injection equal to 0.05 \"suns\" of injection.\n", "\n", "We will create a pandas datetime series and calculate the changes in defect states for each timestep. As B-O LID can initially proceed quickly, we will create a timeseries with 1-second intervals for the first 10 minutes, then proceed with 1-minute intervals" ] diff --git a/tutorials_and_tools/tutorials_and_tools/LETID - Accelerated Test.ipynb b/tutorials/02_degradation/02_letid_accelerated_test.ipynb similarity index 99% rename from tutorials_and_tools/tutorials_and_tools/LETID - Accelerated Test.ipynb rename to tutorials/02_degradation/02_letid_accelerated_test.ipynb index 319acd760..1a61e5a5a 100644 --- a/tutorials_and_tools/tutorials_and_tools/LETID - Accelerated Test.ipynb +++ b/tutorials/02_degradation/02_letid_accelerated_test.ipynb @@ -181,7 +181,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Let's see how much maximum power degradation these parameters will result in: " + "Let's see how much maximum power degradation these parameters will result in:" ] }, { @@ -377,7 +377,7 @@ "metadata": {}, "source": [ "## Set up timeseries\n", - "In this example, we are going to model test with constant temperature and current injection. IEC TS 63342 prescribes two to three weeks of injection equivalent to $2\\times(I_{sc}-I_{mp})$, at $75\\degree C$. For most typical c-Si modules, $2\\times(I_{sc}-I_{mp})$ is roughly equal to $0.1\\times I_{sc}$. So we will set injection equal to 0.1 \"suns\" of injection. \n", + "In this example, we are going to model test with constant temperature and current injection. IEC TS 63342 prescribes two to three weeks of injection equivalent to $2\\times(I_{sc}-I_{mp})$, at $75\\degree C$. For most typical c-Si modules, $2\\times(I_{sc}-I_{mp})$ is roughly equal to $0.1\\times I_{sc}$. So we will set injection equal to 0.1 \"suns\" of injection.\n", "\n", "We will create a pandas datetime series and calculate the changes in defect states for each timestep." ] @@ -1191,8 +1191,17 @@ "source": [ "FIXED_START_DATE = dt.datetime(2025, 9, 9, 0, 0)\n", "result = letid.calc_letid_lab(\n", - " tau_0, tau_deg, wafer_thickness, s_rear, nA_0, nB_0, nC_0, 0.1, 75, \"D037\",\n", - " start=FIXED_START_DATE\n", + " tau_0,\n", + " tau_deg,\n", + " wafer_thickness,\n", + " s_rear,\n", + " nA_0,\n", + " nB_0,\n", + " nC_0,\n", + " 0.1,\n", + " 75,\n", + " \"D037\",\n", + " start=FIXED_START_DATE,\n", ")\n", "result[\"Datetime\"] = result[\"Datetime\"].dt.round(\"s\")\n", "print(result)" diff --git a/tutorials_and_tools/tutorials_and_tools/LETID - Outdoor LETID.ipynb b/tutorials/02_degradation/03_letid_outdoor.ipynb similarity index 99% rename from tutorials_and_tools/tutorials_and_tools/LETID - Outdoor LETID.ipynb rename to tutorials/02_degradation/03_letid_outdoor.ipynb index d705afbdb..d19f0c7cb 100644 --- a/tutorials_and_tools/tutorials_and_tools/LETID - Outdoor LETID.ipynb +++ b/tutorials/02_degradation/03_letid_outdoor.ipynb @@ -4,7 +4,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# LETID - Outdoor Environments \n", + "# LETID - Outdoor Environments\n", "\n", "This is an example on how to model LETID progression in outdoor environments\n", "\n", diff --git a/tutorials_and_tools/tutorials_and_tools/LETID - Outdoor Scenario Based on Accelerated Test Result.ipynb b/tutorials/02_degradation/04_letid_outdoor_scenario.ipynb similarity index 100% rename from tutorials_and_tools/tutorials_and_tools/LETID - Outdoor Scenario Based on Accelerated Test Result.ipynb rename to tutorials/02_degradation/04_letid_outdoor_scenario.ipynb diff --git a/tutorials_and_tools/tutorials_and_tools/LETID - Passivated Wafer.ipynb b/tutorials/02_degradation/05_letid_passivated_wafer.ipynb similarity index 99% rename from tutorials_and_tools/tutorials_and_tools/LETID - Passivated Wafer.ipynb rename to tutorials/02_degradation/05_letid_passivated_wafer.ipynb index 7747a2a65..e88e57793 100644 --- a/tutorials_and_tools/tutorials_and_tools/LETID - Passivated Wafer.ipynb +++ b/tutorials/02_degradation/05_letid_passivated_wafer.ipynb @@ -99,7 +99,7 @@ "metadata": {}, "source": [ "## Device parameters\n", - "For modeling a wafer, we don't need as many device parameters. Wafer thickness, lifetime, and an optical generation profile, which allows us to calculate generation current, which we take to be device current assuming surface recombination is very low. " + "For modeling a wafer, we don't need as many device parameters. Wafer thickness, lifetime, and an optical generation profile, which allows us to calculate generation current, which we take to be device current assuming surface recombination is very low." ] }, { diff --git a/tutorials_and_tools/tutorials_and_tools/Van't Hoff Degradation Model.ipynb b/tutorials/02_degradation/06_vant_hoff_degradation_model.ipynb similarity index 99% rename from tutorials_and_tools/tutorials_and_tools/Van't Hoff Degradation Model.ipynb rename to tutorials/02_degradation/06_vant_hoff_degradation_model.ipynb index e87a3c92f..9234ea294 100644 --- a/tutorials_and_tools/tutorials_and_tools/Van't Hoff Degradation Model.ipynb +++ b/tutorials/02_degradation/06_vant_hoff_degradation_model.ipynb @@ -383,7 +383,7 @@ "source": [ "## 6. Solder Fatigue\n", "\n", - "Estimate the thermomechanical fatigue of flat plate photovoltaic module solder joints over the time range given using estimated cell temperature. Like other `pvdeg` funcitons, the minimal parameters are (weather_df, meta). Running the function with only these two inputs will use default PV module configurations ( open_rack_glass_polymer ) and the 'sapm' temperature model over the entire length of the weather data. " + "Estimate the thermomechanical fatigue of flat plate photovoltaic module solder joints over the time range given using estimated cell temperature. Like other `pvdeg` funcitons, the minimal parameters are (weather_df, meta). Running the function with only these two inputs will use default PV module configurations ( open_rack_glass_polymer ) and the 'sapm' temperature model over the entire length of the weather data." ] }, { diff --git a/tutorials/02_degradation/README.md b/tutorials/02_degradation/README.md new file mode 100644 index 000000000..7e1f9d7f2 --- /dev/null +++ b/tutorials/02_degradation/README.md @@ -0,0 +1,20 @@ +# Degradation Tutorials + +Advanced tutorials focused on specific degradation mechanisms including LID and LETID. + +## Tutorials + +- **bo_lid_accelerated_test.ipynb** - Boron-Oxygen Light Induced Degradation (B-O LID) accelerated testing +- **letid_accelerated_test.ipynb** - Light and Elevated Temperature Induced Degradation (LETID) accelerated testing +- **letid_outdoor.ipynb** - LETID modeling for outdoor conditions +- **letid_outdoor_scenario.ipynb** - LETID outdoor scenarios based on accelerated test results +- **letid_passivated_wafer.ipynb** - LETID analysis for passivated wafer technologies +- **vant_hoff_degradation_model.ipynb** - Van't Hoff degradation modeling approach + +## Topics Covered + +- Light Induced Degradation (LID) +- Light and Elevated Temperature Induced Degradation (LETID) +- Accelerated testing methods +- Outdoor degradation prediction +- Degradation kinetics diff --git a/tutorials_and_tools/tutorials_and_tools/B-O LID - Accelerated Test.py b/tutorials/02_degradation/scripts/01_bo_lid_accelerated_test.py similarity index 95% rename from tutorials_and_tools/tutorials_and_tools/B-O LID - Accelerated Test.py rename to tutorials/02_degradation/scripts/01_bo_lid_accelerated_test.py index b2f05a485..1112230f6 100644 --- a/tutorials_and_tools/tutorials_and_tools/B-O LID - Accelerated Test.py +++ b/tutorials/02_degradation/scripts/01_bo_lid_accelerated_test.py @@ -1,6 +1,4 @@ -#!/usr/bin/env python -# coding: utf-8 - +# %% [markdown] # # B-O LID - Accelerated Test # # ## Example: Boron-oxygen light-induced degradation (B-O LID) progression in accelerated tests @@ -20,27 +18,20 @@ # # -# In[1]: - - +# %% # if running on google colab, uncomment the next line and execute this cell to install the dependencies and prevent "ModuleNotFoundError" in later cells: -# !pip install pvdeg==0.3.3 - - -# In[2]: - +# # !pip install pvdeg==0.3.3 +# %% from pvdeg import letid, collection, utilities, DATA_DIR import os import pandas as pd import numpy as np import matplotlib.pyplot as plt +import pvlib - -# In[ ]: - - +# %% # This information helps with debugging and getting support :) import sys import platform @@ -52,25 +43,21 @@ print("pvlib version ", pvlib.__version__) print("pvdeg version ", pvdeg.__version__) - +# %% [markdown] # ## Device parameters # To define a device, we need to define several important quantities about the device: wafer thickness (in $\mu m$), rear surface recombination velocity (in cm/s), and cell area (in cm2). -# In[3]: - - +# %% wafer_thickness = 180 # um s_rear = 46 # cm/s cell_area = 243 # cm^2 - +# %% [markdown] # Other device parameters # # Other required parameters are base diffusivity (in $cm^2/s$), and optical generation profile, which allow us to estimate current collection in the device. -# In[4]: - - +# %% generation_df = pd.read_excel( os.path.join(DATA_DIR, "PVL_GenProfile.xlsx"), header=0 ) # this is an optical generation profile generated by PVLighthouse's OPAL2 default model for 1-sun, normal incident AM1.5 sunlight on a 180-um thick SiNx-coated, pyramid-textured wafer. @@ -79,69 +66,61 @@ d_base = 27 # cm^2/s electron diffusivity. See https://www2.pvlighthouse.com.au/calculators/mobility%20calculator/mobility%20calculator.aspx for details - +# %% [markdown] # ## Degradation parameters # To model the device's degradation, we need to define several more important quantities about the degradation the device will experience. These include undegraded and degraded lifetime (in $\mu s$). -# In[5]: - - +# %% tau_0 = 115 # us, carrier lifetime in non-degraded states, e.g. LETID/LID states A or C tau_deg = 55 # us, carrier lifetime in fully-degraded state, e.g. LETID/LID state B - +# %% [markdown] # Let's see how much maximum power degradation these parameters will result in: -# In[6]: - - +# %% letid.calc_pmp_loss_from_tau_loss( tau_0, tau_deg, cell_area, wafer_thickness, s_rear ) # returns % power loss, pmp_0, pmp_deg - +# %% [markdown] # Remaining degradation parameters: # # The rest of the quantities to define are: the initial percentage of defects in each state (A, B, and C), and the dictionary of mechanism parameters. # # In this example, we'll assume the device starts in the fully-undegraded state (100% state A), and we'll use the parameters for B-O LID -# In[7]: - - +# %% # starting defect state percentages nA_0 = 100 nB_0 = 0 nC_0 = 0 - -# In[8]: - - +# %% # Here's a list of the possible sets of kinetic parameters from kinetic_parameters.json: utilities.get_kinetics() +# %% +mechanism_params = utilities.get_kinetics("D045") -# In[9]: - - -mechanism_params = utilities.get_kinetics("D054") -print(mechanism_params) +# Flatten the nested dictionary to get only the "value" for each parameter +mechanism_params = { + k: v["value"] if isinstance(v, dict) and "value" in v else v + for k, v in mechanism_params.items() +} +# %% [markdown] # ## Set up timeseries # In this example, we are going to model test with constant temperature and injection. IEC 61215 MQT 19.1 prescribes 10 $kWh/m^2$ of 1-sun illumination (i.e., 10 hours of 1-sun) with maximum power point tracking at $50\degree C$. For most typical c-Si modules, MPP injection is roughly $I_{sc}-I_{mp}$, or roughly equal to $0.05\times I_{sc}$. So we will set injection equal to 0.05 "suns" of injection. # # We will create a pandas datetime series and calculate the changes in defect states for each timestep. As B-O LID can initially proceed quickly, we will create a timeseries with 1-second intervals for the first 10 minutes, then proceed with 1-minute intervals -# In[10]: - - +# %% temperature = 50 # degrees celsius suns = 0.05 # "suns" of injection, e.g 1-sun illumination at open circuit would be 1; dark current injection is given as a fraction of Isc, e.g., injecting Isc would be 1. For this example we assume injection is 0.05*Isc. timesteps_initial = pd.date_range( - start="2022-01-01 00:00:00", end="2022-01-01 00:10:00", freq="S" + start="2022-01-01 00:00:00", end="2022-01-01 00:10:00", freq="s" ) # 10 minutes of 1-second interval timesteps. In general, we should select small timesteps unless we are sure defect reactions are proceeding very slowly timesteps = pd.date_range( start="2022-01-01 00:10:00", end="2022-01-01 10:00:00", freq="min" @@ -172,10 +151,7 @@ tau_0, tau_deg, nB_0 ) # calculate tau for the first timestep - -# In[11]: - - +# %% for index, timestep in timesteps.iterrows(): # first row tau has already been assigned if index == 0: @@ -256,13 +232,11 @@ timesteps.at[index, "NB"] = n_B + dN_Bdt * t_step timesteps.at[index, "NC"] = n_C + dN_Cdt * t_step - +# %% [markdown] # ## Finish calculating degraded device parameters. # Now that we have calculated defect states, we can calculate all the quantities that depend on defect states. -# In[12]: - - +# %% timesteps["tau"] = letid.tau_now(tau_0, tau_deg, timesteps["NB"]) # calculate device Jsc for every timestep. Unfortunately this requires an integration so I think we have to run through a loop. Device Jsc allows calculation of device Voc. @@ -275,10 +249,7 @@ timesteps.at[index, "tau"], wafer_thickness, s_rear, jsc_now, temperature=25 ) - -# In[13]: - - +# %% # this function quickly calculates the rest of the device parameters: Isc, FF, max power, and normalized max power timesteps = letid.calc_device_params(timesteps, cell_area=243) timesteps["time (days)"] = ( @@ -287,14 +258,12 @@ timesteps - +# %% [markdown] # ## Plot the results # # -# In[14]: - - +# %% from cycler import cycler plt.style.use("default") @@ -327,6 +296,3 @@ ) plt.show() - - -# In[ ]: diff --git a/tutorials_and_tools/tutorials_and_tools/LETID - Accelerated Test.py b/tutorials/02_degradation/scripts/02_letid_accelerated_test.py similarity index 93% rename from tutorials_and_tools/tutorials_and_tools/LETID - Accelerated Test.py rename to tutorials/02_degradation/scripts/02_letid_accelerated_test.py index 4d959807e..edf98efd0 100644 --- a/tutorials_and_tools/tutorials_and_tools/LETID - Accelerated Test.py +++ b/tutorials/02_degradation/scripts/02_letid_accelerated_test.py @@ -1,6 +1,4 @@ -#!/usr/bin/env python -# coding: utf-8 - +# %% [markdown] # # LETID - Accelerated Tests # # @@ -19,27 +17,21 @@ # # -# In[1]: - - +# %% # if running on google colab, uncomment the next line and execute this cell to install the dependencies and prevent "ModuleNotFoundError" in later cells: -# !pip install pvdeg==0.3.3 - - -# In[1]: - +# # !pip install pvdeg==0.3.3 +# %% from pvdeg import letid, collection, utilities, DATA_DIR import os import pandas as pd import numpy as np import matplotlib.pyplot as plt +import pvdeg +import datetime as dt - -# In[ ]: - - +# %% # This information helps with debugging and getting support :) import sys import platform @@ -49,24 +41,20 @@ print("Pandas version ", pd.__version__) print("pvdeg version ", pvdeg.__version__) - +# %% [markdown] # ## Device parameters # To define a device, we need to define several important quantities about the device: wafer thickness (in $\mu m$), rear surface recombination velocity (in cm/s), and cell area (in cm2). The values defined below are representative of a typical PERC solar cell. -# In[2]: - - +# %% wafer_thickness = 180 # um s_rear = 46 # cm/s cell_area = 243 # cm^2 - +# %% [markdown] # ##### Other device parameters # Other required device parameters: base diffusivity (in $cm^2/s$), and optical generation profile, which allow us to estimate current collection in the device. -# In[3]: - - +# %% generation_df = pd.read_excel( os.path.join(DATA_DIR, "PVL_GenProfile.xlsx"), header=0 ) # this is an optical generation profile generated by PVLighthouse's OPAL2 default model for 1-sun, normal incident AM1.5 sunlight on a 180-um thick SiNx-coated, pyramid-textured wafer. @@ -75,76 +63,60 @@ d_base = 27 # cm^2/s electron diffusivity. See https://www2.pvlighthouse.com.au/calculators/mobility%20calculator/mobility%20calculator.aspx for details - +# %% [markdown] # ## Degradation parameters # To model the device's degradation, we need to define several more important quantities about the degradation the device will experience. These include undegraded and degraded lifetime (in $\mu s$). -# In[4]: - - +# %% tau_0 = 115 # us, carrier lifetime in non-degraded states, e.g. LETID/LID states A or C tau_deg = 55 # us, carrier lifetime in fully-degraded state, e.g. LETID/LID state B - +# %% [markdown] # Let's see how much maximum power degradation these parameters will result in: -# In[5]: - - +# %% loss, pmp_0, pmp_deg = letid.calc_pmp_loss_from_tau_loss( tau_0, tau_deg, cell_area, wafer_thickness, s_rear ) # returns % power loss, pmp_0, pmp_deg print(loss) - +# %% [markdown] # Check to see the device's current collection -# In[6]: - - +# %% jsc_0 = collection.calculate_jsc_from_tau_cp( tau_0, wafer_thickness, d_base, s_rear, generation, depth ) # returns short-circuit current (Jsc) in mA/cm^2 given required cell parameters print(jsc_0) - +# %% [markdown] # Remaining degradation parameters: # # The rest of the quantities to define are: the initial percentage of defects in each state (A, B, and C), and the dictionary of mechanism parameters. # # In this example, we'll assume the device starts in the fully-undegraded state (100% state A), and we'll use the parameters for LETID degradation from Repins. -# In[7]: - - +# %% # starting defect state percentages nA_0 = 100 nB_0 = 0 nC_0 = 0 - -# In[10]: - - -# Here's a list of the possible sets of kinetic parameters from kinetic_parameters.json: +# %% +# Here's a list of the possible sets of kinetic parameters from DegradationDatabase.json: utilities.get_kinetics() - -# In[12]: - - -mechanism_params = utilities.get_kinetics('D037') +# %% +mechanism_params = utilities.get_kinetics("D037") print(mechanism_params) - +# %% [markdown] # ## Set up timeseries # In this example, we are going to model test with constant temperature and current injection. IEC TS 63342 prescribes two to three weeks of injection equivalent to $2\times(I_{sc}-I_{mp})$, at $75\degree C$. For most typical c-Si modules, $2\times(I_{sc}-I_{mp})$ is roughly equal to $0.1\times I_{sc}$. So we will set injection equal to 0.1 "suns" of injection. # # We will create a pandas datetime series and calculate the changes in defect states for each timestep. -# In[13]: - - +# %% temperature = 75 # degrees celsius suns = 0.1 # "suns" of injection, e.g 1-sun illumination at open circuit would be 1; dark current injection is given as a fraction of Isc, e.g., injecting Isc would be 1. For this example we assume injection is 0.1*Isc. @@ -178,19 +150,14 @@ tau_0, tau_deg, nB_0 ) # calculate tau for the first timestep - -# In[14]: - - +# %% timesteps - +# %% [markdown] # ## Run through timesteps # Since each timestep depends on the preceding timestep, we need to calculate in a loop. This will take a few minutes depending on the length of the timeseries. -# In[15]: - - +# %% for index, timestep in timesteps.iterrows(): # first row tau has already been assigned if index == 0: @@ -271,13 +238,11 @@ timesteps.at[index, "NB"] = n_B + dN_Bdt * t_step timesteps.at[index, "NC"] = n_C + dN_Cdt * t_step - +# %% [markdown] # ## Finish calculating degraded device parameters. # Now that we have calculated defect states, we can calculate all the quantities that depend on defect states. -# In[16]: - - +# %% timesteps["tau"] = letid.tau_now(tau_0, tau_deg, timesteps["NB"]) # calculate device Jsc for every timestep. Unfortunately this requires an integration so I think we have to run through a loop. Device Jsc allows calculation of device Voc. @@ -290,10 +255,7 @@ timesteps.at[index, "tau"], wafer_thickness, s_rear, jsc_now, temperature=25 ) - -# In[17]: - - +# %% # this function quickly calculates the rest of the device parameters: Isc, FF, max power, and normalized max power timesteps = letid.calc_device_params(timesteps, cell_area=243) timesteps["time (days)"] = ( @@ -302,14 +264,12 @@ timesteps - +# %% [markdown] # ## Plot the results # # -# In[18]: - - +# %% from cycler import cycler plt.style.use("default") @@ -350,12 +310,23 @@ plt.show() - +# %% [markdown] # The function `calc_letid_lab` wraps all of the steps above into a single function: -# In[11]: - - -letid.calc_letid_lab( - tau_0, tau_deg, wafer_thickness, s_rear, nA_0, nB_0, nC_0, 0.1, 75, 'D037' +# %% +FIXED_START_DATE = dt.datetime(2025, 9, 9, 0, 0) +result = letid.calc_letid_lab( + tau_0, + tau_deg, + wafer_thickness, + s_rear, + nA_0, + nB_0, + nC_0, + 0.1, + 75, + "D037", + start=FIXED_START_DATE, ) +result["Datetime"] = result["Datetime"].dt.round("s") +print(result) diff --git a/tutorials_and_tools/tutorials_and_tools/LETID - Outdoor LETID.py b/tutorials/02_degradation/scripts/03_letid_outdoor.py similarity index 95% rename from tutorials_and_tools/tutorials_and_tools/LETID - Outdoor LETID.py rename to tutorials/02_degradation/scripts/03_letid_outdoor.py index 221f8a6df..d80895d1e 100644 --- a/tutorials_and_tools/tutorials_and_tools/LETID - Outdoor LETID.py +++ b/tutorials/02_degradation/scripts/03_letid_outdoor.py @@ -1,6 +1,4 @@ -#!/usr/bin/env python -# coding: utf-8 - +# %% [markdown] # # LETID - Outdoor Environments # # This is an example on how to model LETID progression in outdoor environments @@ -21,16 +19,11 @@ # 5. Calculate device degradation and plot # -# In[1]: - - +# %% # if running on google colab, uncomment the next line and execute this cell to install the dependencies and prevent "ModuleNotFoundError" in later cells: -# !pip install pvdeg==0.3.3 - - -# In[1]: - +# # !pip install pvdeg==0.3.3 +# %% from pvdeg import letid, collection, utilities, DATA_DIR import pvlib @@ -38,11 +31,9 @@ import pandas as pd import numpy as np import matplotlib.pyplot as plt +import pvdeg - -# In[ ]: - - +# %% # This information helps with debugging and getting support :) import sys import platform @@ -53,40 +44,29 @@ print("pvlib version ", pvlib.__version__) print("pvdeg version ", pvdeg.__version__) - +# %% [markdown] # First, we'll use pvlib to create and run a model system, and use the irradiance, temperature, and operating point of that model to set up our LETID model # For this example, we'll model a fixed latitude tilt system at NREL, in Golden, CO, USA, using [NSRDB](https://nsrdb.nrel.gov/) hourly PSM weather data, SAPM temperature models, and module and inverter models from the CEC database. -# In[2]: - - +# %% # load weather and location data, use pvlib read_psm3 function with map_variables = True sam_file = "psm3.csv" -weather, meta = pvlib.iotools.read_psm3( - os.path.join(DATA_DIR, sam_file), map_variables=True +weather, meta = pvdeg.weather.read( + os.path.join(DATA_DIR, sam_file), file_type="PSM3", map_variables=True ) - -# In[3]: - - +# %% weather - -# In[4]: - - +# %% # if our weather file doesn't have precipitable water, calculate it with pvlib if "precipitable_water" not in weather.columns: weather["precipitable_water"] = pvlib.atmosphere.gueymard94_pw( weather["temp_air"], weather["relative_humidity"] ) - -# In[5]: - - +# %% # rename some columns for pvlib if they haven't been already weather.rename( columns={ @@ -112,16 +92,10 @@ ] ] - -# In[6]: - - +# %% weather - -# In[7]: - - +# %% # import pvlib stuff and pick a module and inverter. Choice of these things will slightly affect the pvlib results which we later use to calculate injection. # we'll use the SAPM temperature model open-rack glass/polymer coeffecients. @@ -140,14 +114,11 @@ "open_rack_glass_polymer" ] - -# In[8]: - - +# %% # set up system in pvlib lat = meta["latitude"] lon = meta["longitude"] -tz = meta["Local Time Zone"] +tz = meta["tz"] elevation = meta["altitude"] surface_tilt = lat # fixed, latitude tilt surface_azimuth = 180 # south-facing @@ -162,23 +133,18 @@ temperature_model_parameters=temperature_model_parameters, ) - -# In[9]: - - +# %% # create and run pvlib modelchain mc = ModelChain(system, location, aoi_model="physical") mc.run_model(weather) - +# %% [markdown] # ## Set up timeseries # In this example, injection is a function of both the operating point of the module (which we will assume is maximum power point) and irradiance. Maximum power point injection is equivalent to $(I_{sc}-I_{mp})/I_{sc}\times Ee$, where $Ee$ is effective irradiance, the irradiance absorbed by the module's cells. We normalize it to 1-sun irradiance, 1000 $W/m^2$. # # We will use the irradiance, DC operating point, and cell temperature from the pvlib modelchain results. -# In[10]: - - +# %% ee = mc.results.effective_irradiance # injection = (mc.results.dc['i_sc']-mc.results.dc['i_mp'])/(mc.results.dc['i_sc'])*(ee/1000) injection = letid.calc_injection_outdoors(mc.results) @@ -192,38 +158,28 @@ ) # reset the index so datetime is a column. I prefer integer indexing. timesteps.rename(columns={"index": "Datetime"}, inplace=True) - -# In[11]: - - +# %% # filter out times when injection is NaN, these won't progress LETID, and it'll make the calculations below run faster timesteps = timesteps[timesteps["Injection"].notnull()] timesteps.reset_index(inplace=True, drop=True) - -# In[12]: - - +# %% timesteps - +# %% [markdown] # ## Device parameters # To define a device, we need to define several important quantities about the device: wafer thickness (in $\mu m$), rear surface recombination velocity (in cm/s), and cell area (in cm2). -# In[1]: - - +# %% wafer_thickness = 180 # um s_rear = 46 # cm/s cell_area = 243 # cm^2 - +# %% [markdown] # Other device parameters # Other required device parameters: base diffusivity (in cm2/s), and optical generation profile, which allow us to estimate current collection in the device. -# In[14]: - - +# %% generation_df = pd.read_excel( os.path.join(DATA_DIR, "PVL_GenProfile.xlsx"), header=0 ) # this is an optical generation profile generated by PVLighthouse's OPAL2 default model for 1-sun, normal incident AM1.5 sunlight on a 180-um thick SiNx-coated, pyramid-textured wafer. @@ -232,32 +188,28 @@ d_base = 27 # cm^2/s electron diffusivity. See https://www2.pvlighthouse.com.au/calculators/mobility%20calculator/mobility%20calculator.aspx for details - +# %% [markdown] # ## Degradation parameters # To model the device's degradation, we need to define several more important quantities about the degradation the device will experience. These include undegraded and degraded lifetime (in $\mu s$). -# In[15]: - - +# %% tau_0 = 115 # us, carrier lifetime in non-degraded states, e.g. LETID/LID states A or C tau_deg = 55 # us, carrier lifetime in fully-degraded state, e.g. LETID/LID state B - +# %% [markdown] # Remaining degradation parameters: # # The rest of the quantities to define are: the initial percentage of defects in each state (A, B, and C), and the dictionary of mechanism parameters. # # In this example, we'll assume the device starts in the fully-undegraded state (100% state A), and we'll use the kinetic parameters for LETID degradation from Repins. -# In[16]: - - +# %% # starting defect state percentages nA_0 = 100 nB_0 = 0 nC_0 = 0 -mechanism_params = utilities.get_kinetics('D037') +mechanism_params = utilities.get_kinetics("D037") timesteps[["NA", "NB", "NC", "tau"]] = ( np.nan @@ -272,13 +224,11 @@ tau_0, tau_deg, nB_0 ) # calculate tau for the first timestep - +# %% [markdown] # ## Run through timesteps # Since each timestep depends on the preceding timestep, we need to calculate in a loop. This will take a few minutes depending on the length of the timeseries. -# In[17]: - - +# %% for index, timestep in timesteps.iterrows(): # first row tau has already been assigned if index == 0: @@ -373,13 +323,11 @@ tau, wafer_thickness, s_rear, jsc, temperature=25 ) - +# %% [markdown] # ## Finish calculating degraded device parameters. # Now that we have calculated defect states, we can calculate all the quantities that depend on defect states. -# In[18]: - - +# %% timesteps["tau"] = letid.tau_now(tau_0, tau_deg, timesteps["NB"]) # calculate device Jsc for every timestep. Unfortunately this requires an integration so I think we have to run through a loop. Device Jsc allows calculation of device Voc. @@ -392,24 +340,20 @@ timesteps.at[index, "tau"], wafer_thickness, s_rear, jsc_now, temperature=25 ) - -# In[19]: - - +# %% timesteps = letid.calc_device_params( timesteps, cell_area=243 ) # this function quickly calculates the rest of the device parameters: Isc, FF, max power, and normalized max power timesteps - +# %% [markdown] # Note of course that all these calculated device parameters are modeled STC device parameters, not the instantaneous, weather-dependent values. This isn't a robust performance model of a degraded module. +# %% [markdown] # ## Plot the results -# In[20]: - - +# %% from cycler import cycler plt.style.use("default") @@ -440,18 +384,17 @@ plt.show() - +# %% [markdown] # The example data provided for Golden, CO, shows how $N_A$ increases in cold weather, and power temporarily recovers, due to temporary recovery of LETID (B->A). +# %% [markdown] # ##### The function `calc_letid_outdoors` wraps all of the steps above into a single function: -# In[21]: - - +# %% nA_0 = 100 nB_0 = 0 nC_0 = 0 -mechanism_params = 'D037' +mechanism_params = "D037" letid.calc_letid_outdoors( tau_0, @@ -468,5 +411,4 @@ module_parameters=cec_module, ) - -# In[ ]: +# %% diff --git a/tutorials_and_tools/tutorials_and_tools/LETID - Outdoor Scenario Based on Accelerated Test Result.py b/tutorials/02_degradation/scripts/04_letid_outdoor_scenario.py similarity index 96% rename from tutorials_and_tools/tutorials_and_tools/LETID - Outdoor Scenario Based on Accelerated Test Result.py rename to tutorials/02_degradation/scripts/04_letid_outdoor_scenario.py index 91e7ee2f2..0a9db3086 100644 --- a/tutorials_and_tools/tutorials_and_tools/LETID - Outdoor Scenario Based on Accelerated Test Result.py +++ b/tutorials/02_degradation/scripts/04_letid_outdoor_scenario.py @@ -1,6 +1,4 @@ -#!/usr/bin/env python -# coding: utf-8 - +# %% [markdown] # # LETID - Outdoor Scenario Based on Accelerated Test # # This is an example for using a test result to model LETID progression in outdoor environments @@ -25,16 +23,11 @@ # 6. Calculate device degradation and plot # -# In[1]: - - +# %% # if running on google colab, uncomment the next line and execute this cell to install the dependencies and prevent "ModuleNotFoundError" in later cells: -# !pip install pvdeg==0.3.3 - - -# In[1]: - +# # !pip install pvdeg==0.3.3 +# %% from pvdeg import letid, collection, utilities, DATA_DIR import pvdeg @@ -45,10 +38,7 @@ import matplotlib.pyplot as plt - -# In[ ]: - - +# %% # This information helps with debugging and getting support :) import sys import platform @@ -58,30 +48,23 @@ print("Pandas version ", pd.__version__) print("pvdeg version ", pvdeg.__version__) - +# %% [markdown] # First, we'll load some data taken from an accelerated test. See [Karas *et al.* 2022](https://onlinelibrary.wiley.com/doi/10.1002/pip.3573) for full details. This data is the average of "Type S" modules from Lab 3. Type S modules were prototype modules made with 48 monocrystalline cells, and degraded about 4-5% in LETID testing. Data throughout testing is shown below: -# In[2]: - - +# %% cell_area = 243 # cm^2 - -# In[3]: - - +# %% df = pd.read_csv(os.path.join(DATA_DIR, "module test data.csv")) df["cell Voc"] = df["Voc"] / 48 df["Jsc"] = df["Isc"] / cell_area * 1000 df["% degradation"] = (df["Pmp"] - df["Pmp"].iloc[0]) / df["Pmp"] * 100 df - +# %% [markdown] # The module parameter that is most sensitve to our device input parameters is cell open-circuit voltage, which in this case started at about 0.664 V/cell. We will select reasonable values for solar cell input parameters, and use ```letid.calc_voc_from_tau()``` to check if those parameters match the cell Voc of the device we're trying to model. The important quantities here are bulk lifetime in the initial state (```tau_0```), wafer thickness, and rear surface recombination velocity. -# In[4]: - - +# %% tau_0 = 120 # [us] reasonable bulk lifetime for commercial-quality p-type silicon, maybe a little on the low side for typical wafer lifetimes, which could range from 100-500 us. wafer_thickness = 180 # [um] a reasonable wafer thickness for typical commercial silicon solar cells. Wafer thicknesses for Si solar cells are typically 160-180 um. @@ -102,10 +85,7 @@ voc_0 = letid.calc_voc_from_tau(tau_0, wafer_thickness, srv_rear, jsc_0, temperature) voc_0 - -# In[5]: - - +# %% generation_df = pd.read_excel( os.path.join(DATA_DIR, "PVL_GenProfile.xlsx"), header=0 ) # this is an optical generation profile generated by PVLighthouse's OPAL2 default model for 1-sun, normal incident AM1.5 sunlight on a 180-um thick SiNx-coated, pyramid-textured wafer. @@ -114,12 +94,10 @@ d_base = 27 # cm^2/s electron diffusivity. See https://www2.pvlighthouse.com.au/calculators/mobility%20calculator/mobility%20calculator.aspx for details - +# %% [markdown] # Pretty close! -# In[6]: - - +# %% # check to make sure power is close to the measured Week 0 power ff_0 = df.query("Week == 0")["FF"].item() # [%] fill factor @@ -127,12 +105,10 @@ pmp_0 = (voc_0 * 48) * (jsc_0 * cell_area / 1000) * ff_0 / 100 # [W] maximum power pmp_0, df.query("Week == 0")["Pmp"].item() - +# %% [markdown] # Now we do the same thing for the degraded state to determine ```tau_deg```, the bulk lifetime when the module is in its most degraded state. So here the cell Voc target is the roughly 0.656 V measured after 4 weeks of testing. -# In[7]: - - +# %% tau_deg = 80 # [us] degraded bulk lifetime isc_deg = df.query("Week == 4")[ @@ -145,10 +121,7 @@ ) voc_deg - -# In[8]: - - +# %% # check to make sure power is close to the measured Week 4 power ff_deg = df.query("Week == 4")["FF"].item() # [%] fill factor @@ -158,49 +131,35 @@ ) # [W] maximum power pmp_deg, df.query("Week == 4")["Pmp"].item() - -# In[9]: - - +# %% (pmp_0 - pmp_deg) / pmp_0 - +# %% [markdown] # So for modeling this module, we will use ```tau_0``` = 120 $\mu s$, ```tau_deg``` = 80 $\mu s$, with ```wafer_thickness``` = 180 $\mu m$ and ```srv_rear``` = 100 cm/s. # # Great! # # The example proceeds below in similar fashion to the outdoor example, using a fixed latitude tilt system at NREL, in Golden, CO, USA, using [NSRDB](https://nsrdb.nrel.gov/) hourly PSM weather data, SAPM temperature models, and module and inverter models from the CEC database. -# In[10]: - - +# %% # load weather and location data, use pvlib read_psm3 function sam_file = "psm3.csv" -weather, meta = pvlib.iotools.read_psm3( - os.path.join(DATA_DIR, sam_file), map_variables=True +weather, meta = pvdeg.weather.read( + os.path.join(DATA_DIR, sam_file), file_type="PSM3", map_variables=True ) - -# In[11]: - - +# %% weather - -# In[12]: - - +# %% # if our weather file doesn't have precipitable water, calculate it with pvlib if "precipitable_water" not in weather.columns: weather["precipitable_water"] = pvlib.atmosphere.gueymard94_pw( weather["temp_air"], weather["relative_humidity"] ) - -# In[13]: - - +# %% # drop unneeded columns weather = weather[ [ @@ -214,35 +173,25 @@ ] ] - -# In[14]: - - +# %% weather - +# %% [markdown] # ### Set up PVlib model # Note that the module we select here is NOT the same "Type S" module that was tested for LETID. I'm simply trying to find a module in the CEC database with I-V characteristics that are reasonably close to the tested module, so the pvlib calculated DC results are close to how our Type S module might behave in the field. -# In[15]: - - +# %% cec_modules = pvlib.pvsystem.retrieve_sam("CECMod").T cec_modules[cec_modules["STC"].between(220, 250) & (cec_modules["N_s"] == 48)] - +# %% [markdown] # The LG ones look close to the module we're trying to model. Pmp around 235W, Isc around 9.9A. Let's go with 'LG_Electronics_Inc__LG235N8K_G4' -# In[16]: - - +# %% cec_modules = cec_modules.T cec_module = cec_modules["LG_Electronics_Inc__LG235N8K_G4"] - -# In[17]: - - +# %% # import the rest of the pvlib stuff # we'll use the SAPM temperature model open-rack glass/polymer coeffecients. @@ -258,14 +207,11 @@ "open_rack_glass_polymer" ] - -# In[18]: - - +# %% # set up system in pvlib lat = meta["latitude"] lon = meta["longitude"] -tz = meta["Local Time Zone"] +tz = meta["tz"] elevation = meta["altitude"] surface_tilt = lat # fixed, latitude tilt surface_azimuth = 180 # south-facing @@ -280,23 +226,18 @@ temperature_model_parameters=temperature_model_parameters, ) - -# In[19]: - - +# %% # create and run pvlib modelchain mc = ModelChain(system, location, aoi_model="physical") mc.run_model(weather) - +# %% [markdown] # ## Set up timeseries # In this example, injection is a function of both the operating point of the module (which we will assume is maximum power point) and irradiance. Maximum power point injection is equivalent to $(I_{sc}-I_{mp})/I_{sc}\times Ee$, where $Ee$ is effective irradiance, the irradiance absorbed by the module's cells. We normalize it to 1-sun irradiance, 1000 $W/m^2$. # # We will use the irradiance, DC operating point, and cell temperature from the pvlib modelchain results. -# In[21]: - - +# %% ee = mc.results.effective_irradiance # injection = (mc.results.dc['i_sc']-mc.results.dc['i_mp'])/(mc.results.dc['i_sc'])*(ee/1000) injection = letid.calc_injection_outdoors(mc.results) @@ -310,7 +251,7 @@ ) # reset the index so datetime is a column. I prefer integer indexing. timesteps.rename(columns={"index": "Datetime"}, inplace=True) - +# %% [markdown] # # ##### Remaining degradation parameters: # We've already set our important device parameters: ```tau_0```, ```tau_deg```, ```wafer_thickness```, ```srv_rear```, ```cell_area```, etc, but we need a few more: generation profile and carrier diffusivity. These are necessary for calculating current collection, and the "default" values provided here should be sufficient for most use cases. @@ -319,9 +260,7 @@ # # In this example, we'll assume the device starts in the fully-undegraded state (100% state A), and we'll use the parameters for LETID degradation from Repins. -# In[22]: - - +# %% generation_df = pd.read_excel( os.path.join(DATA_DIR, "PVL_GenProfile.xlsx"), header=0 ) # this is an optical generation profile generated by PVLighthouse's OPAL2 default model for 1-sun, normal incident AM1.5 sunlight on a 180-um thick SiNx-coated, pyramid-textured wafer. @@ -330,16 +269,13 @@ d_base = 27 # cm^2/s electron diffusivity. See https://www2.pvlighthouse.com.au/calculators/mobility%20calculator/mobility%20calculator.aspx for details - -# In[29]: - - +# %% # starting defect state percentages nA_0 = 100 nB_0 = 0 nC_0 = 0 -mechanism_params = utilities.get_kinetics('D037') +mechanism_params = utilities.get_kinetics("D037") timesteps[["NA", "NB", "NC", "tau"]] = ( np.nan @@ -354,19 +290,14 @@ tau_0, tau_deg, nB_0 ) # calculate tau for the first timestep - -# In[30]: - - +# %% timesteps - +# %% [markdown] # ## Run through timesteps # Since each timestep depends on the preceding timestep, we need to calculate in a loop. This will take a few minutes depending on the length of the timeseries. -# In[31]: - - +# %% for index, timestep in timesteps.iterrows(): # first row tau has already been assigned if index == 0: @@ -447,10 +378,7 @@ timesteps.at[index, "NB"] = n_B + dN_Bdt * t_step timesteps.at[index, "NC"] = n_C + dN_Cdt * t_step - -# In[32]: - - +# %% timesteps["tau"] = letid.tau_now(tau_0, tau_deg, timesteps["NB"]) # calculate device Jsc for every timestep. Unfortunately this requires an integration so I think we have to run through a loop. Device Jsc allows calculation of device Voc. @@ -463,22 +391,17 @@ timesteps.at[index, "tau"], wafer_thickness, srv_rear, jsc_now, temperature=25 ) - -# In[33]: - - +# %% timesteps = letid.calc_device_params( timesteps, cell_area ) # this function quickly calculates the rest of the device parameters: Isc, FF, max power, and normalized max power timesteps - +# %% [markdown] # Note of course that all these calculated device parameters are modeled STC device parameters, not the instantaneous, weather-dependent values. We'll merge back in the pvlib results for convenience, but these don't reflect the device degradation. We'll calculate energy loss next -# In[34]: - - +# %% timesteps = timesteps.merge(mc.results.dc, left_on="Datetime", right_index=True) timesteps = timesteps.merge( pd.DataFrame(mc.results.effective_irradiance, columns=["Effective irradiance"]), @@ -489,12 +412,10 @@ timesteps - +# %% [markdown] # ### Plot the results -# In[35]: - - +# %% from cycler import cycler plt.style.use("default") @@ -528,10 +449,7 @@ plt.show() - -# In[36]: - - +# %% import matplotlib.dates as mdates plt.style.use("default") @@ -564,10 +482,7 @@ plt.show() - -# In[37]: - - +# %% import matplotlib.dates as mdates from scipy.integrate import cumulative_trapezoid, simpson @@ -689,13 +604,11 @@ plt.show() - +# %% [markdown] # ##### The function `calc_letid_outdoors` wraps all of the steps above into a single function: -# In[39]: - - -mechanism_params = 'D037' +# %% +mechanism_params = "D037" letid.calc_letid_outdoors( tau_0, @@ -712,11 +625,7 @@ module_parameters=cec_module, ) - -# In[38]: - - +# %% timesteps - -# In[ ]: +# %% diff --git a/tutorials_and_tools/tutorials_and_tools/LETID - Passivated Wafer.py b/tutorials/02_degradation/scripts/05_letid_passivated_wafer.py similarity index 96% rename from tutorials_and_tools/tutorials_and_tools/LETID - Passivated Wafer.py rename to tutorials/02_degradation/scripts/05_letid_passivated_wafer.py index d8b3ebb86..0610d9fa7 100644 --- a/tutorials_and_tools/tutorials_and_tools/LETID - Passivated Wafer.py +++ b/tutorials/02_degradation/scripts/05_letid_passivated_wafer.py @@ -1,6 +1,4 @@ -#!/usr/bin/env python -# coding: utf-8 - +# %% [markdown] # # LETID - Passivated Wafer # # This example shows how to simulate an accelerated test performed on a well-passivated Si wafer, rather than a solar cell. @@ -19,16 +17,11 @@ # 5. Calculate device degradation and plot # -# In[1]: - - +# %% # if running on google colab, uncomment the next line and execute this cell to install the dependencies and prevent "ModuleNotFoundError" in later cells: -# !pip install pvdeg==0.3.3 - - -# In[1]: - +# # !pip install pvdeg==0.3.3 +# %% from pvdeg import letid, collection, utilities, DATA_DIR import pvdeg import os @@ -36,10 +29,7 @@ import numpy as np import matplotlib.pyplot as plt - -# In[ ]: - - +# %% # This information helps with debugging and getting support :) import sys import platform @@ -49,13 +39,11 @@ print("Pandas version ", pd.__version__) print("pvdeg version ", pvdeg.__version__) - +# %% [markdown] # ## Device parameters # For modeling a wafer, we don't need as many device parameters. Wafer thickness, lifetime, and an optical generation profile, which allows us to calculate generation current, which we take to be device current assuming surface recombination is very low. -# In[2]: - - +# %% wafer_thickness = 180 # um tau = 350 # us, lifetime of the wafer for demonstration purposes @@ -67,7 +55,7 @@ j_gen = collection.generation_current(generation, depth) - +# %% [markdown] # ## Degradation parameters # Here we'll model LETID under 0.5-sun, open-circuit injection. In a passivated wafer, recombination per volume ($\frac{\Delta n}{\tau}$) must equal generation per volume ($\frac{Jq}{W}$), which gives $\Delta n = \frac{Jq\tau}{W}$ # @@ -77,19 +65,15 @@ # # See [Repins *et al.* 2023](https://doi.org/10.1557/s43577-022-00438-8) for more details. -# In[3]: - - -mechanism_params = utilities.get_kinetics('D037') +# %% +mechanism_params = utilities.get_kinetics("D037") injection = 0.5 # - +# %% [markdown] # ### Demonstrate calculation of dn^x_ij # 1. Calculate $\Delta n$ of the wafer -# In[4]: - - +# %% from scipy.constants import elementary_charge as q # Elementary charge, C dn = ( @@ -97,17 +81,16 @@ ) # calculate excess carrier density dn - +# %% [markdown] # 2. Calculate $\Delta n_{lit}$, the excess carrier density from the literature experiments where kinetic parameters were determined. # Assuming literature experiments were carried out on cells, this requires using the `calc_dn` function -# In[5]: - - +# %% from scipy.constants import convert_temperature transition = "bc" # for this example we'll look at the B -> C transition +# mechanism_params now contains extracted numeric values meas_tau = mechanism_params[f"tau_{transition}"] meas_temp = mechanism_params[f"temperature_{transition}"] meas_temp = convert_temperature(meas_temp, "K", "C") @@ -127,69 +110,48 @@ ) dn_lit - +# %% [markdown] # 3. Return the exponent $x_{ij}$ of the transition in question # -# In[6]: - - +# %% exponent = mechanism_params[f"x_{transition}"] -exponent - - -# 4. Calculate $(\frac{\Delta n}{\Delta n_{lit}})^{x_{ij}}$. This is the acceleration factor of the transition due to excess carriers. -# - -# In[7]: - - (dn / dn_lit) ** exponent - -# In[8]: - - +# %% # the "carrier_factor_wafer" function yields the same result letid.carrier_factor_wafer( tau, transition, injection, j_gen, wafer_thickness, mechanism_params ) - +# %% [markdown] # ## Degradation parameters # To model the device's degradation, we need to define several more important quantities about the degradation the device will experience. These include undegraded and degraded lifetime (in $\mu s$), and starting defect state percentages -# In[9]: - - +# %% tau_0 = 350 # us, carrier lifetime in non-degraded states, e.g. LETID/LID states A or C tau_deg = 41 # us, carrier lifetime in fully-degraded state, e.g. LETID/LID state B - -# In[10]: - - +# %% # starting defect state percentages nA_0 = 100 nB_0 = 0 nC_0 = 0 -mechanism_params = utilities.get_kinetics('D037') +mechanism_params = utilities.get_kinetics("D037") print(mechanism_params) - +# %% [markdown] # ## Set up timeseries # In this example, we are going to model a wafer exposed to 0.5 suns illumination at $125\degree C$ for 24 hours, and compare to experimental data from [Wyller *et al.* 2021](https://doi.org/10.1109/JPHOTOV.2021.3078367). -# In[11]: - - +# %% temperature = 125 # degrees celsius suns = 0.5 # "suns" of injection, e.g 1-sun illumination at open circuit would be 1; dark current injection is given as a fraction of Isc, e.g., injecting Isc would be 1. For this example we assume injection is 0.1*Isc. timesteps = pd.date_range( - start="2022-01-01 00:00:00", end="2022-01-02 00:00:00", freq="S" + start="2022-01-01 00:00:00", end="2022-01-02 00:00:00", freq="s" ) # three weeks of 1-minute interval timesteps. In general, we should select small timesteps unless we are sure defect reactions are proceeding very slowly timesteps = pd.DataFrame(timesteps, columns=["Datetime"]) @@ -212,19 +174,14 @@ tau_0, tau_deg, nB_0 ) # calculate tau for the first timestep - -# In[12]: - - +# %% timesteps - +# %% [markdown] # ## Run through timesteps # Since each timestep depends on the preceding timestep, we need to calculate in a loop. This will take a few minutes depending on the length of the timeseries. -# In[13]: - - +# %% for index, timestep in timesteps.iterrows(): # first row tau has already been assigned if index == 0: @@ -283,7 +240,7 @@ timesteps.at[index, "NB"] = n_B + dN_Bdt * t_step timesteps.at[index, "NC"] = n_C + dN_Cdt * t_step - +# %% [markdown] # ## Finish calculating degraded device parameters. # Now that we have calculated defect states, we can calculate all the quantities that depend on defect states. Since this is a wafer, device parameters like Jsc, Voc, FF, etc., aren't really appropriate # @@ -291,9 +248,7 @@ # # $NDD(t) = \frac{1}{\tau (t)} - \frac{1}{\tau _0}$ -# In[14]: - - +# %% timesteps["tau"] = letid.tau_now(tau_0, tau_deg, timesteps["NB"]) timesteps["NDD"] = letid.calc_ndd(timesteps["tau"].iloc[0], timesteps["tau"]) @@ -302,18 +257,13 @@ timesteps["Datetime"] - timesteps.iloc[0]["Datetime"] ).dt.total_seconds() # create a column for seconds elapsed - -# In[15]: - - +# %% timesteps - +# %% [markdown] # ## Plot the results -# In[18]: - - +# %% from cycler import cycler plt.style.use("default") @@ -355,31 +305,23 @@ plt.show() - +# %% [markdown] # ## Compare model results to experimental data # Experimental data (0.5 suns, 125°C, 150°C, 175°C) from [Wyller 2021](https://doi.org/10.1109/JPHOTOV.2021.3078367). # Comparison with experimental data requires normalization constant ($C_{norm}$), which relates NDD to $N_B$ as described in [Repins 2023](https://doi.org/10.1557/s43577-022-00438-8). -# In[19]: - - +# %% temperatures = [125, 150, 175] # degrees celsius - -# In[20]: - - +# %% timesteps125 = timesteps # we already modeled the 125C experiment above - -# In[21]: - - +# %% temperature = temperatures[1] # degrees celsius suns = 0.5 # "suns" of injection, e.g 1-sun illumination at open circuit would be 1; dark current injection is given as a fraction of Isc, e.g., injecting Isc would be 1. For this example we assume injection is 0.1*Isc. timesteps = pd.date_range( - start="2022-01-01 00:00:00", end="2022-01-02 00:00:00", freq="S" + start="2022-01-01 00:00:00", end="2022-01-02 00:00:00", freq="s" ) # three weeks of 1-minute interval timesteps. In general, we should select small timesteps unless we are sure defect reactions are proceeding very slowly timesteps = pd.DataFrame(timesteps, columns=["Datetime"]) @@ -402,10 +344,7 @@ tau_0, tau_deg, nB_0 ) # calculate tau for the first timestep - -# In[22]: - - +# %% for index, timestep in timesteps.iterrows(): # first row tau has already been assigned if index == 0: @@ -464,31 +403,22 @@ timesteps.at[index, "NB"] = n_B + dN_Bdt * t_step timesteps.at[index, "NC"] = n_C + dN_Cdt * t_step - -# In[23]: - - +# %% timesteps["tau"] = letid.tau_now(tau_0, tau_deg, timesteps["NB"]) timesteps["NDD"] = letid.calc_ndd(timesteps["tau"].iloc[0], timesteps["tau"]) timesteps["time (s)"] = ( timesteps["Datetime"] - timesteps.iloc[0]["Datetime"] ).dt.total_seconds() # create a column for seconds elapsed - -# In[24]: - - +# %% timesteps150 = timesteps - -# In[25]: - - +# %% temperature = temperatures[2] # degrees celsius suns = 0.5 # "suns" of injection, e.g 1-sun illumination at open circuit would be 1; dark current injection is given as a fraction of Isc, e.g., injecting Isc would be 1. For this example we assume injection is 0.1*Isc. timesteps = pd.date_range( - start="2022-01-01 00:00:00", end="2022-01-02 00:00:00", freq="S" + start="2022-01-01 00:00:00", end="2022-01-02 00:00:00", freq="s" ) # three weeks of 1-minute interval timesteps. In general, we should select small timesteps unless we are sure defect reactions are proceeding very slowly timesteps = pd.DataFrame(timesteps, columns=["Datetime"]) @@ -511,10 +441,7 @@ tau_0, tau_deg, nB_0 ) # calculate tau for the first timestep - -# In[26]: - - +# %% for index, timestep in timesteps.iterrows(): # first row tau has already been assigned if index == 0: @@ -573,32 +500,20 @@ timesteps.at[index, "NB"] = n_B + dN_Bdt * t_step timesteps.at[index, "NC"] = n_C + dN_Cdt * t_step - -# In[27]: - - +# %% timesteps["tau"] = letid.tau_now(tau_0, tau_deg, timesteps["NB"]) timesteps["NDD"] = letid.calc_ndd(timesteps["tau"].iloc[0], timesteps["tau"]) timesteps["time (s)"] = ( timesteps["Datetime"] - timesteps.iloc[0]["Datetime"] ).dt.total_seconds() # create a column for seconds elapsed - -# In[28]: - - +# %% timesteps175 = timesteps - -# In[29]: - - +# %% timesteps = pd.concat([timesteps125, timesteps150, timesteps175]) - -# In[30]: - - +# %% normalization_constants = { 125: 1.35, 150: 0.6, @@ -610,16 +525,10 @@ ) timesteps["NDD-normalized"] = timesteps["NDD"] * timesteps["Normalization constant"] - -# In[31]: - - +# %% grouped_model = timesteps.groupby("Temperature") - -# In[32]: - - +# %% literature_data_file = os.path.join(DATA_DIR, "wyller data.csv") data = pd.read_csv(literature_data_file, header=0) @@ -628,16 +537,10 @@ # data['Normalization constant'] = data['Series'].map(normalization_constants) # data['Y-normalized'] = data['Y']*data['Normalization constant'] - -# In[33]: - - +# %% grouped_data = data.groupby("Temperature") - -# In[34]: - - +# %% import itertools fig, ax = plt.subplots() @@ -669,10 +572,7 @@ plt.show() - -# In[35]: - - +# %% import itertools fig, ax = plt.subplots() @@ -718,6 +618,3 @@ # fig.savefig('wafer data.png', dpi = 600) plt.show() - - -# In[ ]: diff --git a/tutorials/02_degradation/scripts/06_vant_hoff_degradation_model.py b/tutorials/02_degradation/scripts/06_vant_hoff_degradation_model.py new file mode 100644 index 000000000..66a0a6625 --- /dev/null +++ b/tutorials/02_degradation/scripts/06_vant_hoff_degradation_model.py @@ -0,0 +1,231 @@ +# %% [markdown] +# # A - Van't Hoff Degradation +# ### Calculate site specific degradation according to the Van't Hoff equation +# *** +# Michael Kempe +# +# 2023.08.31 +# *** +# +# **Requirements**: +# - compatible weather file (PSM3, TMY3, EPW) or lattitude and longitude of desired site +# - Accelerated testing chamber parameters +# - chamber irradiance [W/m^2] +# - chamber temperature [°C] +# - 10°C acceleration factor +# +# **Steps**: +# 1. Read/find the weather data +# 2. Generate basic modeling data +# 3. Calculate VantHoff degradation acceleration factor +# 4. Expand calculations to a region + +# %% +# if running on google colab, uncomment the next line and execute this cell to install the dependencies and prevent "ModuleNotFoundError" in later cells: +# pip install pvdeg==0.1.1 + +# %% +import os + +import pvdeg +from pvdeg import DATA_DIR + +# %% [markdown] +# ## 1. Read In the Weather File +# +# This is usually the first step. Use a PSM3, TMY3, or EPW file. For this demo, use the provided PSM3 weather file. + +# %% +PSM_FILE = os.path.join(DATA_DIR, "psm3_demo.csv") +WEATHER, META = pvdeg.weather.read(PSM_FILE, "psm") +print( + "Latitude =", + META["latitude"], + "Longitude =", + META["longitude"], + META["Country"], + META["City"], +) + +# %% [markdown] +# ## 2. Generate Basic Modeling Data +# +# For this tutorial we will need solar position, POA, PV cell and module temperature. Let's gernate those individually with their respective functions. + +# %% +sol_pos = pvdeg.spectral.solar_position(weather_df=WEATHER, meta=META) + +poa_df = pvdeg.spectral.poa_irradiance( + weather_df=WEATHER, meta=META, sol_position=sol_pos +) + +temp_cell = pvdeg.temperature.cell(weather_df=WEATHER, meta=META, poa=poa_df) + +temp_module = pvdeg.temperature.module(weather_df=WEATHER, meta=META, poa=poa_df) + +# %% [markdown] +# ## 3. VantHoff Degradation +# +# Van't Hoff Irradiance Degradation Equation: +# $$ R_o = R_D · G^p · T_f^{\frac{T}{10} }$$ +# +# For the yearly average degredation outdoors to be the same as the controlled environmnet, the lamp settings will need to be set to *G$_{WA}$* and the temperature set to *T$_{oeq}$*. +# +# As with most `pvdeg` functions, the following functions will always require two arguments (weather_df and meta) + +# %% +# chamber irradiance (W/m²) +I_chamber = 1600 +# chamber temperature (°C) +temp_chamber = 85 +# Schwartzchild Coefficient +p = 0.64 +# Acceleration factor for every 10°C +Tf = 1.41 + +# calculate the Van't Hoff Acceleration factor +vantHoff_deg = pvdeg.degradation.vantHoff_deg( + weather_df=WEATHER, + meta=META, + I_chamber=I_chamber, + temp_chamber=temp_chamber, + poa=poa_df, + temp=temp_cell, + p=p, + Tf=Tf, +) + +# calculate the Van't Hoff weighted irradiance +irr_weighted_avg_v = pvdeg.degradation.IwaVantHoff( + weather_df=WEATHER, meta=META, poa=poa_df, temp=temp_cell, p=p, Tf=Tf +) + +print( + "AF =", + round(vantHoff_deg, 1), + "(°C) , and G_WA =", + round(irr_weighted_avg_v), + "(W/m²)", +) + +# %% [markdown] +# ## 4. Arrhenius +# Calculate the Acceleration Factor between the rate of degredation of a modeled environmnet versus a modeled controlled environmnet +# +# Example: "If the *AF*=25 then 1 year of Controlled Environment exposure is equal to 25 years in the field" +# +# Equation: +# $$ AF = N · \frac{ G_{chamber}^x · RH_{chamber}^n · e^{\frac{- E_a}{k T_{chamber}}} }{ \Sigma (G_{POA}^x · RH_{outdoor}^n · e^{\frac{-E_a}{k T_outdoor}}) }$$ +# +# Function to calculate *G$_{WA}$*, the Environment Characterization (W/m²). If the controlled environmnet lamp settings are set at *G$_{WA}$*, and the temperature set to *T$_{eq}$*, then the degradation will be the same as the yearly average outdoors. +# +# Equation: +# $$ G_{WA} = [ \frac{ \Sigma (G_{outdoor}^x · RH_{outdoor}^n e^{\frac{-E_a}{k T_{outdood}}}) }{ N · RH_{WA}^n · e^{- \frac{E_a}{k T_eq}} } ]^{\frac{1}{x}} $$ + +# %% +# relative humidity within chamber (%) +rh_chamber = 15 +# arrhenius activation energy (kj/mol) +Ea = 40 + +rh_surface = pvdeg.humidity.surface_relative( + rh_ambient=WEATHER["relative_humidity"], + temp_ambient=WEATHER["temp_air"], + temp_module=temp_module, +) + +arrhenius_deg = pvdeg.degradation.arrhenius_deg( + weather_df=WEATHER, + meta=META, + rh_outdoor=rh_surface, + I_chamber=I_chamber, + rh_chamber=rh_chamber, + temp_chamber=temp_chamber, + poa=poa_df, + temp=temp_cell, + Ea=Ea, +) + +irr_weighted_avg_a = pvdeg.degradation.IwaArrhenius( + weather_df=WEATHER, + meta=META, + poa=poa_df, + rh_outdoor=WEATHER["relative_humidity"], + temp=temp_cell, + Ea=Ea, +) + +# %% [markdown] +# ## 5. Quick Method (Degradation) +# +# For quick calculations, you can omit POA and both module and cell temperature. The function will calculate these figures as needed using the available weather data with the default options for PV module configuration. + +# %% +# chamber settings +I_chamber = 1000 +temp_chamber = 60 +rh_chamber = 15 + +# activation energy +Ea = 40 + +vantHoff_deg = pvdeg.degradation.vantHoff_deg( + weather_df=WEATHER, meta=META, I_chamber=I_chamber, temp_chamber=temp_chamber +) + +irr_weighted_avg_v = pvdeg.degradation.IwaVantHoff(weather_df=WEATHER, meta=META) + +# %% +rh_surface = pvdeg.humidity.surface_relative( + rh_ambient=WEATHER["relative_humidity"], + temp_ambient=WEATHER["temp_air"], + temp_module=temp_module, +) + +arrhenius_deg = pvdeg.degradation.arrhenius_deg( + weather_df=WEATHER, + meta=META, + rh_outdoor=rh_surface, + I_chamber=I_chamber, + rh_chamber=rh_chamber, + temp_chamber=temp_chamber, + Ea=Ea, +) + +irr_weighted_avg_a = pvdeg.degradation.IwaArrhenius( + weather_df=WEATHER, meta=META, rh_outdoor=WEATHER["relative_humidity"], Ea=Ea +) + +# %% [markdown] +# ## 6. Solder Fatigue +# +# Estimate the thermomechanical fatigue of flat plate photovoltaic module solder joints over the time range given using estimated cell temperature. Like other `pvdeg` funcitons, the minimal parameters are (weather_df, meta). Running the function with only these two inputs will use default PV module configurations ( open_rack_glass_polymer ) and the 'sapm' temperature model over the entire length of the weather data. + +# %% +fatigue = pvdeg.fatigue.solder_fatigue(weather_df=WEATHER, meta=META) + +# %% [markdown] +# If you wish to reduce the span of time or use a non-default temperature model, you may specify the parameters manually. Let's try an explicit example. +# We want the solder fatigue estimated over the month of June for a roof mounted glass-front polymer-back module. +# +# 1. Lets create a datetime-index for the month of June. +# 2. Next, generate the cell temperature. Make sure to explicity restrict the weather data to our dt-index for June. Next, declare the PV module configuration. +# 3. Calculate the fatigue. Explicity specify the time_range (our dt-index for June from step 1) and the cell temperature as we caculated in step 2 + +# %% +# select the month of June +time_range = WEATHER.index[WEATHER.index.month == 6] + +# calculate cell temperature over our selected date-time range. +# specify the module configuration +temp_cell = pvdeg.temperature.cell( + weather_df=WEATHER.loc[time_range], + meta=META, + temp_model="sapm", + conf="insulated_back_glass_polymer", +) + + +fatigue = pvdeg.fatigue.solder_fatigue( + weather_df=WEATHER, meta=META, time_range=time_range, temp_cell=temp_cell +) diff --git a/tutorials_and_tools/tutorials_and_tools/Monte Carlo - Arrhenius.ipynb b/tutorials/03_monte_carlo/01_arrhenius.ipynb similarity index 99% rename from tutorials_and_tools/tutorials_and_tools/Monte Carlo - Arrhenius.ipynb rename to tutorials/03_monte_carlo/01_arrhenius.ipynb index b5792cd44..9c105cd0a 100644 --- a/tutorials_and_tools/tutorials_and_tools/Monte Carlo - Arrhenius.ipynb +++ b/tutorials/03_monte_carlo/01_arrhenius.ipynb @@ -4,10 +4,10 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Monte Carlo - Arrhenius Degradation \n", + "# Monte Carlo - Arrhenius Degradation\n", "\n", "\n", - "A monte carlo simulation can be used to predict results of an event with a certain amount of uncertainty. This will be introduced to our use case via mean and standard deviation for each modeling constant. Correlated multivariate monte carlo simulations expand on this by linking the behavior of multiple input variables together with correlation data, in our case we will use correlation coefficients but \n", + "A monte carlo simulation can be used to predict results of an event with a certain amount of uncertainty. This will be introduced to our use case via mean and standard deviation for each modeling constant. Correlated multivariate monte carlo simulations expand on this by linking the behavior of multiple input variables together with correlation data, in our case we will use correlation coefficients but\n", "\n", "**Objectives**\n", "1. Define necessary monte carlo simulation parameters : correlation coefficients, mean and standard standard deviation, number of trials, function to apply, requried function input\n", @@ -241,7 +241,7 @@ } ], "source": [ - "np.random.seed(42) # for reproducibility\n", + "np.random.seed(42) # for reproducibility\n", "mc_inputs = pvdeg.montecarlo.generateCorrelatedSamples(\n", " corr=corr_coeff, stats=stats_dict, n=n\n", ")\n", @@ -287,7 +287,9 @@ "source": [ "# mean and standard deviation match inputs\n", "for col in mc_inputs.columns:\n", - " print(f\"{col} : mean {mc_inputs[col].mean():.10f}, stdev {mc_inputs[col].std():.10f}\")\n", + " print(\n", + " f\"{col} : mean {mc_inputs[col].mean():.10f}, stdev {mc_inputs[col].std():.10f}\"\n", + " )\n", "\n", "print()\n", "\n", @@ -300,11 +302,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Other Function Requirements \n", + "### Other Function Requirements\n", "Based on the function chosen to run in the monte carlo simulation, various other data will be required. In this case we will need cell temperature and total plane of array irradiance.\n", "\n", "
\n", - "Please use your own API key: The block below makes an NSRDB API to get weather and meta data and then calculate cell temperature and global poa irradiance. This tutorial will work with the DEMO Key provided, but it will take you less than 3 minutes to obtain your own at https://developer.nrel.gov/signup/ so register now.) \n", + "Please use your own API key: The block below makes an NSRDB API to get weather and meta data and then calculate cell temperature and global poa irradiance. This tutorial will work with the DEMO Key provided, but it will take you less than 3 minutes to obtain your own at https://developer.nrel.gov/signup/ so register now.)\n", "
" ] }, @@ -346,7 +348,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Calculate the sun position, poa irradiance, and module temperature. " + "Calculate the sun position, poa irradiance, and module temperature." ] }, { @@ -403,7 +405,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Runs monte carlo simulation for the example `pvdeg.montecarlo.vecArrhenius` function, using the correlated data dataframe created above and the required function arguments. \n", + "Runs monte carlo simulation for the example `pvdeg.montecarlo.vecArrhenius` function, using the correlated data dataframe created above and the required function arguments.\n", "\n", "We can see the necessary inputs by using the help command:" ] @@ -463,9 +465,9 @@ "metadata": {}, "source": [ "### Running the Monte Carlo Simulation\n", - "We will pass the target function, `pvdeg.degredation.vecArrhenius()`, its required arguments via the correlated_samples and func_kwargs. Our fixed arguments will be passed in the form of a dictionary while the randomized monte carlo input data will be contained in a DataFrame. \n", + "We will pass the target function, `pvdeg.degredation.vecArrhenius()`, its required arguments via the correlated_samples and func_kwargs. Our fixed arguments will be passed in the form of a dictionary while the randomized monte carlo input data will be contained in a DataFrame.\n", "\n", - "All required target function arguments should be contained between the column names of the randomized input data and fixed argument dictionary, \n", + "All required target function arguments should be contained between the column names of the randomized input data and fixed argument dictionary,\n", "\n", "(You can use any data you want here as long as the DataFrame's column names match the required target function's parameter names NOT included in the kwargs)" ] diff --git a/tutorials_and_tools/tutorials_and_tools/Monte Carlo - Standoff.ipynb b/tutorials/03_monte_carlo/02_standoff.ipynb similarity index 99% rename from tutorials_and_tools/tutorials_and_tools/Monte Carlo - Standoff.ipynb rename to tutorials/03_monte_carlo/02_standoff.ipynb index 2e968dbf1..88e23d22f 100644 --- a/tutorials_and_tools/tutorials_and_tools/Monte Carlo - Standoff.ipynb +++ b/tutorials/03_monte_carlo/02_standoff.ipynb @@ -92,7 +92,7 @@ "This is copied from another tutorial called `4 - Standards.ipynb`, please visit this page for a more in depth explanation of the process for a single standoff calculation.\n", "\n", "
\n", - "Please use your own API key: The block below makes an NSRDB API to get weather and meta data. This tutorial will work with the DEMO Key provided, but it will take you less than 3 minutes to obtain your own at https://developer.nrel.gov/signup/ so register now.) \n", + "Please use your own API key: The block below makes an NSRDB API to get weather and meta data. This tutorial will work with the DEMO Key provided, but it will take you less than 3 minutes to obtain your own at https://developer.nrel.gov/signup/ so register now.)\n", "
" ] }, @@ -257,7 +257,7 @@ "source": [ "#### Standoff Monte Carlo Inputs\n", "\n", - "When using the pvdeg.montecarlo.simulate() function on a target function all of the target function's required arguments must still be given. Our non-changing arguments will be stored in a dictionary. The randomized monte carlo input data will also be passed to the target function via the simulate function. All required target function arguments should be contained between the column names of the randomized input data and fixed argument dictionary, " + "When using the pvdeg.montecarlo.simulate() function on a target function all of the target function's required arguments must still be given. Our non-changing arguments will be stored in a dictionary. The randomized monte carlo input data will also be passed to the target function via the simulate function. All required target function arguments should be contained between the column names of the randomized input data and fixed argument dictionary," ] }, { @@ -303,7 +303,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "#### Dealing With Series \n", + "#### Dealing With Series\n", "Notice how our results are contained in a pandas series instead of a dataframe.\n", "\n", "This means we have to do an extra step to view our results. Run the block below to confirm that our results are indeed contained in a series. And convert them into a simpler dataframe." diff --git a/tutorials/03_monte_carlo/README.md b/tutorials/03_monte_carlo/README.md new file mode 100644 index 000000000..4ac51c664 --- /dev/null +++ b/tutorials/03_monte_carlo/README.md @@ -0,0 +1,16 @@ +# Monte Carlo Simulations + +Tutorials on using Monte Carlo methods for uncertainty analysis and probabilistic modeling. + +## Tutorials + +- **arrhenius.ipynb** - Monte Carlo simulations with Arrhenius degradation models +- **standoff.ipynb** - Monte Carlo analysis for module standoff parameters + +## Overview + +These tutorials demonstrate how to: +- Incorporate parameter uncertainty into degradation predictions +- Perform probabilistic risk assessments +- Analyze sensitivity to input parameters +- Generate confidence intervals for degradation estimates diff --git a/tutorials_and_tools/tutorials_and_tools/Monte Carlo - Arrhenius.py b/tutorials/03_monte_carlo/scripts/01_arrhenius.py similarity index 91% rename from tutorials_and_tools/tutorials_and_tools/Monte Carlo - Arrhenius.py rename to tutorials/03_monte_carlo/scripts/01_arrhenius.py index f6e533ae0..caa73c116 100644 --- a/tutorials_and_tools/tutorials_and_tools/Monte Carlo - Arrhenius.py +++ b/tutorials/03_monte_carlo/scripts/01_arrhenius.py @@ -1,6 +1,4 @@ -#!/usr/bin/env python -# coding: utf-8 - +# %% [markdown] # # Monte Carlo - Arrhenius Degradation # # @@ -11,26 +9,18 @@ # 2. Define process for creating and utilizing modeling constant correlation data # 3. Preform simple monte carlo simulation using arrhenius equation to calculate degredation and plot -# In[ ]: - - +# %% # if running on google colab, uncomment the next line and execute this cell to install the dependencies and prevent "ModuleNotFoundError" in later cells: -# !pip install pvdeg==0.3.3 - - -# In[1]: - +# # !pip install pvdeg==0.3.3 +# %% import pvlib import numpy as np import pandas as pd import pvdeg import matplotlib.pyplot as plt - -# In[7]: - - +# %% # This information helps with debugging and getting support :) import sys import platform @@ -41,7 +31,7 @@ print("Pvlib version ", pvlib.__version__) print("pvdeg version ", pvdeg.__version__) - +# %% [markdown] # ## Correlated Monte Carlo Simulation (parameters) # # For this simulation we will be using an arrhenius equation to calculate degredation rate given by $R_D = R_0 * I ^ X * e ^ {\frac{-Ea}{kT}}$, where R0 is prefactor degredation, I is irradiance, X is the irridiance relation, Ea is activation energy and T is degrees K @@ -56,6 +46,7 @@ # - correlation constants (if not entered, default = 0) # - number of trials to run +# %% [markdown] # ### Defining Correlation Coefficients # pvdeg.montecarlo stores correlation coefficients in a ``Corr`` object. To represent a given correlation coefficient follow the given syntax below, replacing the values in the brackets with your correlation coefficients # @@ -65,28 +56,21 @@ # # After defining the all known correlations add them to a list which we will feed into our simulation later -# In[10]: - - +# %% corr_Ea_X = pvdeg.montecarlo.Corr("Ea", "X", 0.0269) corr_Ea_LnR0 = pvdeg.montecarlo.Corr("Ea", "LnR0", -0.9995) corr_X_LnR0 = pvdeg.montecarlo.Corr("X", "LnR0", -0.0400) corr_coeff = [corr_Ea_X, corr_Ea_LnR0, corr_X_LnR0] - -# In[11]: - - +# %% type(corr_Ea_X) - +# %% [markdown] # ### Defining Mean and Standard Deviation # We will store the mean and correlation for each variable, expressed when we defined the correlation cefficients. If a variable is left out at this stage, the monte carlo simulation will throw errors. -# In[12]: - - +# %% stats_dict = { "Ea": {"mean": 62.08, "stdev": 7.3858}, "LnR0": {"mean": 13.7223084, "stdev": 2.47334772}, @@ -96,39 +80,37 @@ # and number of monte carlo trials to run n = 20000 - +# %% [markdown] # ### Generating Monte Carlo Input Data # Next we will use the information collected above to generate correlated data from our modeling constant correlations, means and standard deviations. -# In[15]: - - +# %% +np.random.seed(42) # for reproducibility mc_inputs = pvdeg.montecarlo.generateCorrelatedSamples( corr=corr_coeff, stats=stats_dict, n=n ) print(mc_inputs) - +# %% [markdown] # #### Sanity Check # We can observe the mean and standard deviation of our newly correlated samples before using them for calculations to ensure that we have not incorrectly altered the data. The mean and standard deviation should be the similar (within a range) to your original input (the error comes from the standard distribution of generated random numbers) # # This also applies to the correlation coefficients originally inputted, they should be witin the same range as those orginally supplied. -# In[16]: - - +# %% # mean and standard deviation match inputs for col in mc_inputs.columns: - print(f"{col} : mean {mc_inputs[col].mean()}, stdev {mc_inputs[col].std()}") + print( + f"{col} : mean {mc_inputs[col].mean():.10f}, stdev {mc_inputs[col].std():.10f}" + ) print() -# come up with a better way of checking -print("Ea_X", np.corrcoef(mc_inputs["Ea"], mc_inputs["X"])[0][1]) -print("Ea_lnR0", np.corrcoef(mc_inputs["Ea"], mc_inputs["LnR0"])[0][1]) -print("X_lnR0", np.corrcoef(mc_inputs["X"], mc_inputs["LnR0"])[0][1]) - +print("Ea_X", round(np.corrcoef(mc_inputs["Ea"], mc_inputs["X"])[0][1], 3)) +print("Ea_lnR0", round(np.corrcoef(mc_inputs["Ea"], mc_inputs["LnR0"])[0][1], 3)) +print("X_lnR0", round(np.corrcoef(mc_inputs["X"], mc_inputs["LnR0"])[0][1], 3)) +# %% [markdown] # ### Other Function Requirements # Based on the function chosen to run in the monte carlo simulation, various other data will be required. In this case we will need cell temperature and total plane of array irradiance. # @@ -136,27 +118,21 @@ # Please use your own API key: The block below makes an NSRDB API to get weather and meta data and then calculate cell temperature and global poa irradiance. This tutorial will work with the DEMO Key provided, but it will take you less than 3 minutes to obtain your own at https://developer.nrel.gov/signup/ so register now.) # -# In[17]: - - -weather_db = "PSM3" +# %% +weather_db = "PSM4" weather_id = (25.783388, -80.189029) weather_arg = { "api_key": "DEMO_KEY", "email": "user@mail.com", - "names": "tmy", - "attributes": [], "map_variables": True, } weather_df, meta = pvdeg.weather.get(weather_db, weather_id, **weather_arg) - +# %% [markdown] # Calculate the sun position, poa irradiance, and module temperature. -# In[18]: - - +# %% sol_pos = pvdeg.spectral.solar_position(weather_df, meta) poa_irradiance = pvdeg.spectral.poa_irradiance(weather_df, meta) temp_mod = pvdeg.temperature.module( @@ -167,24 +143,20 @@ poa_global = poa_irradiance["poa_global"].to_numpy() cell_temperature = temp_mod.to_numpy() - -# In[24]: - - +# %% # must already be numpy arrays function_kwargs = {"poa_global": poa_global, "module_temp": cell_temperature} - +# %% [markdown] # Runs monte carlo simulation for the example `pvdeg.montecarlo.vecArrhenius` function, using the correlated data dataframe created above and the required function arguments. # # We can see the necessary inputs by using the help command: -# In[28]: - - +# %% +# NBVAL_SKIP help(pvdeg.montecarlo.simulate) - +# %% [markdown] # ### Running the Monte Carlo Simulation # We will pass the target function, `pvdeg.degredation.vecArrhenius()`, its required arguments via the correlated_samples and func_kwargs. Our fixed arguments will be passed in the form of a dictionary while the randomized monte carlo input data will be contained in a DataFrame. # @@ -192,20 +164,16 @@ # # (You can use any data you want here as long as the DataFrame's column names match the required target function's parameter names NOT included in the kwargs) -# In[31]: - - +# %% results = pvdeg.montecarlo.simulate( func=pvdeg.degradation.vecArrhenius, correlated_samples=mc_inputs, **function_kwargs ) - +# %% [markdown] # ### Viewing Our Data # Let's plot the results using a histogram -# In[41]: - - +# %% lnDeg = np.log10(results) percentile_2p5 = np.percentile(lnDeg, 2.5) percentile_97p5 = np.percentile(lnDeg, 97.5) diff --git a/tutorials_and_tools/tutorials_and_tools/Monte Carlo - Standoff.py b/tutorials/03_monte_carlo/scripts/02_standoff.py similarity index 91% rename from tutorials_and_tools/tutorials_and_tools/Monte Carlo - Standoff.py rename to tutorials/03_monte_carlo/scripts/02_standoff.py index bd027def5..2c864b951 100644 --- a/tutorials_and_tools/tutorials_and_tools/Monte Carlo - Standoff.py +++ b/tutorials/03_monte_carlo/scripts/02_standoff.py @@ -1,32 +1,22 @@ -#!/usr/bin/env python -# coding: utf-8 - +# %% [markdown] # # Monte Carlo - Standoff Calculation # # See Monte Carlo - Arrhenius Degredation for a more in depth guide. Steps will be shortened for brevity. # This journal applies a Monte Carlo to the Standoff Calculation # -# In[ ]: - - +# %% # if running on google colab, uncomment the next line and execute this cell to install the dependencies and prevent "ModuleNotFoundError" in later cells: -# !pip install pvdeg==0.3.3 - - -# In[1]: - +# # !pip install pvdeg==0.3.3 +# %% import pvlib import numpy as np import pandas as pd import pvdeg import matplotlib.pyplot as plt - -# In[2]: - - +# %% # This information helps with debugging and getting support :) import sys import platform @@ -37,7 +27,7 @@ print("Pvlib version ", pvlib.__version__) print("Pvdeg version ", pvdeg.__version__) - +# %% [markdown] # ### Simple Standoff Calculation # # This is copied from another tutorial called `4 - Standards.ipynb`, please visit this page for a more in depth explanation of the process for a single standoff calculation. @@ -46,25 +36,18 @@ # Please use your own API key: The block below makes an NSRDB API to get weather and meta data. This tutorial will work with the DEMO Key provided, but it will take you less than 3 minutes to obtain your own at https://developer.nrel.gov/signup/ so register now.) # -# In[3]: - - -weather_db = "PSM3" +# %% +weather_db = "PSM4" weather_id = (40.633365593159226, -73.9945801019899) # Manhattan, NYC weather_arg = { "api_key": "DEMO_KEY", "email": "user@mail.com", - "names": "tmy", - "attributes": [], "map_variables": True, } WEATHER, META = pvdeg.weather.get(weather_db, weather_id, **weather_arg) - -# In[4]: - - +# %% # simple standoff calculation height1 = pvdeg.standards.standoff(weather_df=WEATHER, meta=META) @@ -83,16 +66,14 @@ print(height1) print(height2) - +# %% [markdown] # ### Defining Correlation Coefficients, Mean and Standard Deviation For Monte Carlo Simulation # # We will leave the list of correlations blank because our variables are not correlated. For a correlated use case visit the `Monte Carlo - Arrhenius.ipynb` tutorial. # # Mean and standard deviation must always be populated if being used to create a dataset. However, you can feed your own correlated or uncorrelated data into the simulate function but column names must be consistent. -# In[5]: - - +# %% # These numbers may not make sense in the context of the problem but work for demonstraiting the process stats = {"X_0": {"mean": 5, "stdev": 3}, "wind_factor": {"mean": 0.33, "stdev": 0.5}} @@ -100,20 +81,15 @@ samples = pvdeg.montecarlo.generateCorrelatedSamples(corr_coeff, stats, 500) - -# In[6]: - - +# %% print(samples) - +# %% [markdown] # #### Standoff Monte Carlo Inputs # # When using the pvdeg.montecarlo.simulate() function on a target function all of the target function's required arguments must still be given. Our non-changing arguments will be stored in a dictionary. The randomized monte carlo input data will also be passed to the target function via the simulate function. All required target function arguments should be contained between the column names of the randomized input data and fixed argument dictionary, -# In[28]: - - +# %% # defining arguments to pass to the target function, standoff() in this case function_kwargs = { "weather_df": WEATHER, @@ -122,46 +98,43 @@ "tilt": 0, "temp_model": "sapm", "sky_model": "isotropic", - "conf_0": "insulated_back_glass_polymer", # or is it conf_inf + "conf_0": "insulated_back_glass_polymer", "conf_inf": "open_rack_glass_polymer", "T98": 70, + "irradiance_kwarg": {}, + "conf_0_kwarg": {}, + "conf_inf_kwarg": {}, + "model_kwarg": {}, } # notice how we left off parts we want to use in the monte carlo simulation because they are already contained in the dataframe results = pvdeg.montecarlo.simulate( func=pvdeg.standards.standoff, - correlated_samples=samples, # in this case correlated_samples is a misnomer, they are not required to be correlated + correlated_samples=samples, **function_kwargs, ) - +# %% [markdown] # #### Dealing With Series # Notice how our results are contained in a pandas series instead of a dataframe. # # This means we have to do an extra step to view our results. Run the block below to confirm that our results are indeed contained in a series. And convert them into a simpler dataframe. -# In[29]: - - +# %% print(type(results)) # Convert from pandas Series to pandas DataFrame results_df = pd.concat(results.tolist()).reset_index(drop=True) - -# In[30]: - - +# %% print(results_df) - +# %% [markdown] # ### Viewing Our Data # Let's plot the results using a histogram -# In[34]: - - +# %% bin_edges = np.arange(results_df["x"].min(), results_df["x"].max() + 0.1, 0.05) plt.figure(figsize=(8, 6)) plt.hist( diff --git a/tutorials_and_tools/tutorials_and_tools/Geospatial - Local Scenario.ipynb b/tutorials/04_geospatial/01_local_scenario.ipynb similarity index 100% rename from tutorials_and_tools/tutorials_and_tools/Geospatial - Local Scenario.ipynb rename to tutorials/04_geospatial/01_local_scenario.ipynb diff --git a/tutorials_and_tools/tutorials_and_tools/HPC Connection Required - Geospatial Templates.ipynb b/tutorials/04_geospatial/02_geospatial_templates.ipynb similarity index 99% rename from tutorials_and_tools/tutorials_and_tools/HPC Connection Required - Geospatial Templates.ipynb rename to tutorials/04_geospatial/02_geospatial_templates.ipynb index 02e9c82ec..95cbdc1df 100644 --- a/tutorials_and_tools/tutorials_and_tools/HPC Connection Required - Geospatial Templates.ipynb +++ b/tutorials/04_geospatial/02_geospatial_templates.ipynb @@ -9,7 +9,8 @@ "iopub.status.busy": "2025-10-17T21:51:06.498163Z", "iopub.status.idle": "2025-10-17T21:51:15.430153Z", "shell.execute_reply": "2025-10-17T21:51:15.429145Z" - } + }, + "lines_to_next_cell": 2 }, "outputs": [], "source": [ @@ -17,7 +18,7 @@ "from pvdeg import TEST_DATA_DIR\n", "import pandas as pd\n", "import os\n", - "import xarray as xr\n" + "import xarray as xr" ] }, { @@ -27,7 +28,7 @@ "# Geospatial Templates\n", "\n", "When running a geospatial analysis using `pvdeg.geospatial.analysis` on arbitary `pvdeg` functions you will need to specify a template for the shape of the output data. This is because the input data comes with dimensions of gid and time while the output will have data in a different shape usually corresonding to coordinates.\n", - "- gid, identification number corresponding to an NSRDB datapoint's location \n", + "- gid, identification number corresponding to an NSRDB datapoint's location\n", "- time, timeseries corresponding to the hourly time indicies of NSRDB datapoint's yearly meteorological data.\n", "\n", "Follow the steps below to see how we generate templates before running the analysis.\n", @@ -57,7 +58,8 @@ "iopub.status.busy": "2025-10-17T21:51:15.430153Z", "iopub.status.idle": "2025-10-17T21:51:15.759623Z", "shell.execute_reply": "2025-10-17T21:51:15.759623Z" - } + }, + "lines_to_next_cell": 2 }, "outputs": [ { @@ -489,7 +491,7 @@ "# Use xarray to open NetCDF file instead of pickle\n", "geo_weather = xr.open_dataset(os.path.join(TEST_DATA_DIR, \"summit-weather.nc\"))\n", "\n", - "geo_weather\n" + "geo_weather" ] }, { @@ -498,9 +500,9 @@ "source": [ "# Creating Templates Manually\n", "\n", - "`pvdeg.geospatial.ouput_template` we can produce a template for our result data. \n", + "`pvdeg.geospatial.ouput_template` we can produce a template for our result data.\n", "\n", - "We need to do this because different functions return different types of values, some return multiple values as tuples, some return only single numerics, others return timeseries results. We need to specify the shape of our data to create an output xarray dataset. " + "We need to do this because different functions return different types of values, some return multiple values as tuples, some return only single numerics, others return timeseries results. We need to specify the shape of our data to create an output xarray dataset." ] }, { @@ -513,8 +515,8 @@ "\n", "Say we want to estimate the 98ᵗʰ percential temperature for the module at the given tilt, azimuth, and x_eff. `PVDeg` has a function to do this, `pvdeg.standards.T98_estimate` BUT it doesn't have a preset geospatial template. We will need to make one.\n", "\n", - "- look at the function return values. \n", - "From the docstring we can see that `T98_estimate` only has one return value. IMPORTANT, this value is a single float, NOT a timeseries. This means our output shape will only be dependent on the input identifier and NOT time. \n", + "- look at the function return values.\n", + "From the docstring we can see that `T98_estimate` only has one return value. IMPORTANT, this value is a single float, NOT a timeseries. This means our output shape will only be dependent on the input identifier and NOT time.\n", "\n", "Therefore we will map the output variable `T98` to the location identifier `gid` using a dictionary with `str: tuple` mappings.\n", "\n", @@ -652,7 +654,7 @@ "source": [ "## Glass Glass Estimated Module Temperature\n", "\n", - "Now we want to calculate geospatial timeseries temperature values for a module using `pvdeg.temperature.module`. This is not super practical because all `pvdeg` functions that need to use tempeature for their calculations preform the temperature calculation internally, this is just for show. \n", + "Now we want to calculate geospatial timeseries temperature values for a module using `pvdeg.temperature.module`. This is not super practical because all `pvdeg` functions that need to use tempeature for their calculations preform the temperature calculation internally, this is just for show.\n", "\n", "This calculation differs from the above because the temperature functions return the module temperature in a timeseries format. So we care about 2 dimensions, location identifier and TIME." ] diff --git a/tutorials_and_tools/tutorials_and_tools/HPC Connection Required - Scenario - Geographical Features.ipynb b/tutorials/04_geospatial/03_scenario_geographical_features.ipynb similarity index 98% rename from tutorials_and_tools/tutorials_and_tools/HPC Connection Required - Scenario - Geographical Features.ipynb rename to tutorials/04_geospatial/03_scenario_geographical_features.ipynb index 80ce96707..f565184aa 100644 --- a/tutorials_and_tools/tutorials_and_tools/HPC Connection Required - Scenario - Geographical Features.ipynb +++ b/tutorials/04_geospatial/03_scenario_geographical_features.ipynb @@ -74,8 +74,8 @@ "\n", "Identify moutains by using the function below. There are currently 2 methods to identify mountains from our data. Both will add a column to our `GeospatialScenario.meta_data` attribute called `mountain` containing boolean values that represent if a data point is in/near mountains or not near mountains.\n", "\n", - "- `classify_mountains_weights` uses k nearest neighbors search and calculates local changes in height with different methods, the default is the `mean` absolute change compared to a points neighbors, then it assigns a weight to each point. If the remaining points are above the threshold then the percentile argument determines sensitivity to classifying points as mountains (higher weight, more mountainous). Much better than the following option. \n", - "- `classify_mountains_radii` uses 2 nearest neighbors radius searches at each point and compares the average elevation of the inner circle to the avg radius of the circle. " + "- `classify_mountains_weights` uses k nearest neighbors search and calculates local changes in height with different methods, the default is the `mean` absolute change compared to a points neighbors, then it assigns a weight to each point. If the remaining points are above the threshold then the percentile argument determines sensitivity to classifying points as mountains (higher weight, more mountainous). Much better than the following option.\n", + "- `classify_mountains_radii` uses 2 nearest neighbors radius searches at each point and compares the average elevation of the inner circle to the avg radius of the circle." ] }, { @@ -131,7 +131,7 @@ "source": [ "## Identifying mountains within a bounding box.\n", "\n", - "Sometimes we only want information from one area. To allow for more control over the selection process. To pick only one area from an existing superset of data we can use a bounding box. \n", + "Sometimes we only want information from one area. To allow for more control over the selection process. To pick only one area from an existing superset of data we can use a bounding box.\n", "Either provide the top left and bottom right (latitude-longitude) pairs or a 2d numpy array of these pairs which will use the most extreme entries to form the bounding box." ] }, diff --git a/tutorials_and_tools/tutorials_and_tools/HPC Connection Required - Scenario - Geospatial.ipynb b/tutorials/04_geospatial/04_scenario_geospatial.ipynb similarity index 93% rename from tutorials_and_tools/tutorials_and_tools/HPC Connection Required - Scenario - Geospatial.ipynb rename to tutorials/04_geospatial/04_scenario_geospatial.ipynb index 8ab8fcd1e..76f700a91 100644 --- a/tutorials_and_tools/tutorials_and_tools/HPC Connection Required - Scenario - Geospatial.ipynb +++ b/tutorials/04_geospatial/04_scenario_geospatial.ipynb @@ -53,7 +53,7 @@ "metadata": {}, "source": [ "## Add Functions to the Pipeline\n", - "The scenario has a queue of jobs to preform. These are stored in an attribute called ``pipeline``, you can directly update the pipeline but this will bypass the assistance given in creating the job function and parameters. The easiest way to add a job to the pipeline is the ``.updatePipeline`` method. For geospatial analysis, weather and metadata is collected and stored in the scenario at the time of the ``.addLocation`` method call so we do not need to include it below, but if we have other function kwargs to include, they should go in the ``func_params`` argument. \n", + "The scenario has a queue of jobs to preform. These are stored in an attribute called ``pipeline``, you can directly update the pipeline but this will bypass the assistance given in creating the job function and parameters. The easiest way to add a job to the pipeline is the ``.updatePipeline`` method. For geospatial analysis, weather and metadata is collected and stored in the scenario at the time of the ``.addLocation`` method call so we do not need to include it below, but if we have other function kwargs to include, they should go in the ``func_params`` argument.\n", "\n", "Only a few pvdeg functions are currently supported for geospatial analysis. See the docstring for ``.updatePipeline`` to view currently supported functions. ``updatePipeline`` will not let you add unsupported geospatial functions. The ``see_added`` flag allows us to see the new job added to the pipeline." ] @@ -136,8 +136,8 @@ "source": [ "## Example Geospatial Functionality\n", "Many functions are supported for geospatial analysis, here are a few.\n", - "- ``pvdeg.standards.standoff`` \n", - "- ``pvdeg.humidity.module`` \n", + "- ``pvdeg.standards.standoff``\n", + "- ``pvdeg.humidity.module``\n", "- ``pvdeg.letid.calc_letid_outdoors``\n", "\n", "See the Geospatial Templates tutorial for an example on this." @@ -160,12 +160,12 @@ "geospatial_humidity_scenario.addJob(\n", " func=pvdeg.humidity.module,\n", " func_params={\n", - " 'backsheet_thickness': 0.3, # mm, thickness of PET backsheet\n", - " 'back_encap_thickness': 0.46, # mm, thickness of EVA backside encapsulant\n", - " 'encapsulant': 'W001', # EVA encapsulant\n", - " 'backsheet': 'W017' # PET backsheet\n", + " \"backsheet_thickness\": 0.3, # mm, thickness of PET backsheet\n", + " \"back_encap_thickness\": 0.46, # mm, thickness of EVA backside encapsulant\n", + " \"encapsulant\": \"W001\", # EVA encapsulant\n", + " \"backsheet\": \"W017\", # PET backsheet\n", " },\n", - " see_added=True\n", + " see_added=True,\n", ")" ] }, diff --git a/tutorials_and_tools/tutorials_and_tools/HPC Connection Required - Scenario - Non-uniform Mountain Prefferential Downselect.ipynb b/tutorials/04_geospatial/05_scenario_mountain_downselect.ipynb similarity index 98% rename from tutorials_and_tools/tutorials_and_tools/HPC Connection Required - Scenario - Non-uniform Mountain Prefferential Downselect.ipynb rename to tutorials/04_geospatial/05_scenario_mountain_downselect.ipynb index 81b3771c6..65e344bf7 100644 --- a/tutorials_and_tools/tutorials_and_tools/HPC Connection Required - Scenario - Non-uniform Mountain Prefferential Downselect.ipynb +++ b/tutorials/04_geospatial/05_scenario_mountain_downselect.ipynb @@ -74,7 +74,7 @@ "\n", "### Normalization\n", "\n", - "At each metadata point in our dataset we will calculate a weight based on its changes in elevation compared to its neighbors. The higher the weight, the greater the change in elevation from a point's immediate neighbors. The downselection methods and functions use these weights to randomly select a subset of the datapoints, prefferentially selecting those with higher weights. \n", + "At each metadata point in our dataset we will calculate a weight based on its changes in elevation compared to its neighbors. The higher the weight, the greater the change in elevation from a point's immediate neighbors. The downselection methods and functions use these weights to randomly select a subset of the datapoints, prefferentially selecting those with higher weights.\n", "\n", "We have some control over which points get selected because all points' weights must be normalized (mapped from 0 to 1) before downselecting. We can apply a function such as $e^x$ or $\\log x$ to the weights during normalization. This could help change the distribution of weights that are chosen. This could remove points from the mountains and add them to areas with fewer changes in elevation, or vice versa.\n", "\n", @@ -87,7 +87,7 @@ "source": [ "### Providing a KdTree\n", "\n", - "As shown below the lines to create a kdtree are commented out. \n" + "As shown below the lines to create a kdtree are commented out.\n" ] }, { diff --git a/tutorials_and_tools/tutorials_and_tools/HPC Connection Required - Scenario - Single Location.ipynb b/tutorials/04_geospatial/06_scenario_single_location.ipynb similarity index 99% rename from tutorials_and_tools/tutorials_and_tools/HPC Connection Required - Scenario - Single Location.ipynb rename to tutorials/04_geospatial/06_scenario_single_location.ipynb index 39c5c3490..7767def65 100644 --- a/tutorials_and_tools/tutorials_and_tools/HPC Connection Required - Scenario - Single Location.ipynb +++ b/tutorials/04_geospatial/06_scenario_single_location.ipynb @@ -90,7 +90,7 @@ "A way around this is to provide the weather and metadata in the pipeline job arguments or you can load data from somewhere else and provide it in the same fashion.\n", "\n", "
\n", - "Please use your own API key: The block below makes an NSRDB API to get weather and meta data. This tutorial will work with the DEMO Key provided, but it will take you less than 3 minutes to obtain your own at https://developer.nrel.gov/signup/ so register now.) \n", + "Please use your own API key: The block below makes an NSRDB API to get weather and meta data. This tutorial will work with the DEMO Key provided, but it will take you less than 3 minutes to obtain your own at https://developer.nrel.gov/signup/ so register now.)\n", "
" ] }, @@ -117,9 +117,9 @@ "metadata": {}, "source": [ "## Adding A Location\n", - "To add a single point using data from the Physical Solar Model (PSM3), simply feed the scenario a single coordinate in tuple form via the ``addLocation`` method. Currently this is the only way to add a location to a non-geospatial scenario, all of the other arguments are unusable when ``Scenario.geospatial == False``. \n", + "To add a single point using data from the Physical Solar Model (PSM3), simply feed the scenario a single coordinate in tuple form via the ``addLocation`` method. Currently this is the only way to add a location to a non-geospatial scenario, all of the other arguments are unusable when ``Scenario.geospatial == False``.\n", "\n", - "Attempting to add a second location by calling the method again with a different coordinate pair will overwrite the old location data stored in the class instance. " + "Attempting to add a second location by calling the method again with a different coordinate pair will overwrite the old location data stored in the class instance." ] }, { @@ -462,7 +462,7 @@ "source": [ "## Scenario Pipelines\n", "\n", - "The pipeline is a list of tasks called jobs for the scenario to run. We will populate the pipeline with a list of jobs before executing them all at once. \n", + "The pipeline is a list of tasks called jobs for the scenario to run. We will populate the pipeline with a list of jobs before executing them all at once.\n", "\n", "To add a job to the pipeline use the ``updatePipeline`` method. Two examples of adding functions to the pipeline will be shown below." ] @@ -516,9 +516,7 @@ "source": [ "kwargs = {\"wind_factor\": 0.33}\n", "\n", - "simple_scenario.addJob(\n", - " func=pvdeg.fatigue.solder_fatigue, func_kwarg=kwargs\n", - " )" + "simple_scenario.addJob(func=pvdeg.fatigue.solder_fatigue, func_kwarg=kwargs)" ] }, { @@ -526,7 +524,7 @@ "metadata": {}, "source": [ "### Adding a job with weather and metadata from outside of the class\n", - "### Not functional \n", + "### Not functional\n", "\n", "could just directly set weather data with scenario.weather_data = weather and scenario.meta_data = meta but that would only work for all of the jobs in the pipeline\n", "\n", diff --git a/tutorials_and_tools/tutorials_and_tools/HPC Connection Required - Scenario - Temperature.ipynb b/tutorials/04_geospatial/07_scenario_temperature.ipynb similarity index 99% rename from tutorials_and_tools/tutorials_and_tools/HPC Connection Required - Scenario - Temperature.ipynb rename to tutorials/04_geospatial/07_scenario_temperature.ipynb index 275218ce7..dcb52d90a 100644 --- a/tutorials_and_tools/tutorials_and_tools/HPC Connection Required - Scenario - Temperature.ipynb +++ b/tutorials/04_geospatial/07_scenario_temperature.ipynb @@ -179,7 +179,9 @@ " func_kwarg={\"I_chamber\": 1000, \"temp_chamber\": 30},\n", ")\n", "\n", - "scene_temp.addJob(func=pvdeg.degradation.IwaVantHoff,)" + "scene_temp.addJob(\n", + " func=pvdeg.degradation.IwaVantHoff,\n", + ")" ] }, { @@ -1538,7 +1540,7 @@ "tf = datetime.datetime(1970, 1, 1, 23, 59)\n", "\n", "# Get the first function result dynamically\n", - "function_ids = [key[1] for key in scene_temp.results.keys() if key[0] == 'function']\n", + "function_ids = [key[1] for key in scene_temp.results.keys() if key[0] == \"function\"]\n", "if function_ids:\n", " temp_df = scene_temp.extract(\n", " (\"function\", function_ids[0]), tmy=True, start_time=t0, end_time=tf\n", @@ -1570,7 +1572,7 @@ ], "source": [ "# Get the first function result dynamically for plotting\n", - "function_ids = [key[1] for key in scene_temp.results.keys() if key[0] == 'function']\n", + "function_ids = [key[1] for key in scene_temp.results.keys() if key[0] == \"function\"]\n", "if function_ids:\n", " scene_temp.plot(\n", " (\"function\", function_ids[0]),\n", @@ -2161,7 +2163,7 @@ " parent_dir\n", " / \"tutorials_and_tools\"\n", " / \"tutorials_and_tools\"\n", - " / \"temperature and degradation.json\"\n", + " / \"temperature_and_degradation.json\"\n", ")\n", "\n", "copy = pvdeg.scenario.Scenario.load_json(\n", diff --git a/tutorials/04_geospatial/08_module_standoff_iec63126.ipynb b/tutorials/04_geospatial/08_module_standoff_iec63126.ipynb new file mode 100644 index 000000000..fa4fd4c2a --- /dev/null +++ b/tutorials/04_geospatial/08_module_standoff_iec63126.ipynb @@ -0,0 +1,723 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Tools - Module Standoff for IEC TS 63126\n", + "\n", + "### Calculation of module standoff distance according to IEC TS 63126\n", + "\n", + "**Requirements:**\n", + "- Local weather data file or site longitude and latittude\n", + "\n", + "**Objectives:**\n", + "1. Import weather data.\n", + "2. Calculate installation standoff - Level 1 and Level 2.\n", + "3. Calculate $X_{eff}$ from provided module temperature data.\n", + "4. Calculate $T_{98}$ for a given azimuth, tilt, and $X_{eff}$.\n", + "5. Plot $X_{min}$ for all azimuth and tilt for a given $T_{98}$.\n", + "6. Plot $X_{min}$ for Level 1, Level 2, or a $T_{98}$ for a given region.\n", + "\n", + "**Background:**\n", + "\n", + "This notebook calculates the a minimum effective standoff distance ($X_{eff}$) necessary for roof-mounted PV modules to ensure that the $98^{th}$ percentile operating temperature, $T_{98}$, remains under 70°C for compliance to IEC 61730 and IEC 61215. For higher $T_{98}$ values above 70°C or 80°C testing must be done to the specifications for Level 1 and Level 2 of IEC TS 63126. This method is outlined in the appendix of IEC TS 63126 and is based on the model from *[King 2004] and data from **[Fuentes, 1987] to model the approximate exponential decay in temperature, $T(X)$, with increasing standoff distance, $X$, as,\n", + "\n", + "$$ X = -X_0 \\ln\\left(1-\\frac{T_0-T}{\\Delta T}\\right), Equation 1 $$\n", + "\n", + "where $T_0$ is the temperature for $X=0$ (insulated-back) and $\\Delta T$ is the temperature difference between an insulated-back ($X=0$) and open-rack mounting configuration ($X=\\infty)$.\n", + "\n", + " We used pvlib and data from the National Solar Radiation Database (NSRDB) to calculate the module temperatures for the insulated-back and open-rack mounting configurations and apply our model to obtain the minimum standoff distance for roof-mounted PV systems to achieve a temperature lower than a specified $T_{98}$. The following figure showcases this calulation for the entire world for an $X_{eff}$ that results in $T_{98}$=70°C. Values of $X_{eff}$ higher than this will require Level 1 or Level 2 certification.\n", + "\n", + "$*$ D. L. King, W. E. Boyson, and J. A. Kratochvil, \"Photovoltaic array performance model,\" SAND2004-3535, Sandia National Laboratories, Albuquerque, NM, 2004. '\\\n", + "$**$ M. K. Fuentes, \"A simplified thermal model for Flat-Plate photovoltaic arrays,\" United States, 1987-05-01 1987. https://www.osti.gov/biblio/6802914\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![alt text](images/T98_70C_standoff_Map.png)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# if running on google colab, uncomment the next line and execute this cell to install the dependencies\n", + "# and prevent \"ModuleNotFoundError\" in later cells:\n", + "#!pip install pvdeg==0.4.2" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import pvdeg\n", + "import pandas as pd\n", + "from pvdeg import DATA_DIR\n", + "import dask\n", + "import matplotlib.pyplot as plt\n", + "import seaborn as sns\n", + "import math\n", + "import numpy as np" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# This information helps with debugging and getting support :)\n", + "import sys\n", + "import platform\n", + "\n", + "print(\"Working on a \", platform.system(), platform.release())\n", + "print(\"Python version \", sys.version)\n", + "print(\"Pandas version \", pd.__version__)\n", + "print(\"pvdeg version \", pvdeg.__version__)\n", + "print(\"dask version\", dask.__version__)\n", + "print(DATA_DIR)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 1. Import Weather Data\n", + "\n", + "The function has these minimum requirements when using a weather data file:\n", + "- Weather data containing (at least) DNI, DHI, GHI, Temperature, RH, and Wind-Speed data at module level.\n", + "- Site meta-data containing (at least) latitude, longitude, and time zone\n", + "\n", + "Alternatively one may can get meterological data from the NSRDB or PVGIS with just the longitude and latitude. This function for the NSRDB (via NSRDB 'PSM3') works primarily for most of North America and South America. PVGIS works for most of the rest of the world (via SARAH 'PVGIS'). See the tutorial \"Weather Database Access.ipynb\" tutorial on PVdeg or Jensen et al. https://doi.org/10.1016/j.solener.2023.112092 for satellite coverage information.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Get data from a supplied data file (Do not use the next box of code if using your own file)\n", + "weather_file = os.path.join(DATA_DIR, \"psm3_demo.csv\")\n", + "WEATHER_df, META = pvdeg.weather.read(weather_file, \"csv\")\n", + "print(META)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# This routine will get a meteorological dataset from anywhere in the world where it is available\n", + "# weather_id = (24.7136, 46.6753) #Riyadh, Saudi Arabia\n", + "# weather_id = (35.6754, 139.65) #Tokyo, Japan\n", + "# weather_id = (-43.52646, 172.62165) #Christchurch, New Zealand\n", + "# weather_id = (64.84031, -147.73836) #Fairbanks, Alaska\n", + "# weather_id = (65.14037, -21.91633) #Reykjavik, Iceland\n", + "# weather_id = (33.4152, -111.8315) #Mesa, Arizona\n", + "# WEATHER_df, META = pvdeg.weather.get_anywhere(id=weather_id)\n", + "# print(META)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2. Calculate Installation Standoff Minimum - Level 1 and Level 2\n", + "\n", + "According to IEC TS 63126, Level 0, Level 1 and Level 2 certification is limited to T₉₈<70°C, <80°C and <90°C, respectively. Level 0 certification is essentially compliance to IEC 61730 and IEC 61215. The default value of T₉₈<70°C represents the minimium gap to avoid higher temperature certification according to IEC TS 63126. This minimum standoff ($x_{min}$) is the distance between the bottom of the module frame and the roof and can be extimated for a given environment as,\n", + "\n", + "$$ X_{min} = -X_0 \\ln\\left(1-\\frac{T_{98,0}-T}{ T_{98,0}- T_{98,inf}}\\right), Equation 2 $$\n", + "\n", + "where $T_{98,0}$ is the $98^{th}$ percentile temperature for an insulated back module and $T_{98,inf}$ is the $98^{th}$ percentile temperature for an open rack mounted module.\n", + "\n", + "Once the meterological data has been obtained, the input parameter possibilities are:\n", + "\n", + "- T₉₈ : Does not necessarily need to be set at 70°C or 80°C for IEC TS 63216, you might want to use a different number to compensate for a thermal aspect of the particular system you are considering. The default is 70°C.\n", + "- tilt : tilt from horizontal of PV module. The default is 0°.\n", + "- azimuth : azimuth in degrees from North. The default is 180° for south facing.\n", + "- sky_model : pvlib compatible model for generating sky characteristics (Options: 'isotropic', 'klucher', 'haydavies', 'reindl', 'king', 'perez'). The default is 'isotropic'.\n", + "- temp_model : pvlib compatible module temperature model. (Options: 'sapm', 'pvsyst', 'faiman', 'sandia'). The default is 'sapm'.\n", + "- conf_0 : Temperature model for hotest mounting configuration. Default is \"insulated_back_glass_polymer\".\n", + "- conf_inf : Temperature model for open rack mounting. Default is \"open_rack_glass_polymer\".\n", + "- x_0 : thermal decay constant [cm] (see documentation). The default is 6.5 cm.\n", + "- wind_factor : Wind speed power law correction factor to account for different wind speed measurement heights between weather database (e.g. NSRDB) and the tempeature model (e.g. SAPM). The default is 0.33." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The following is the minimum function call. It defaults to horizontal tilt and T₉₈=70°C." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "standoff = pvdeg.standards.standoff(weather_df=WEATHER_df, meta=META)\n", + "print(pvdeg.standards.interpret_standoff(standoff))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The following is a full function call for both T₉₈=70°C and 80°C separately even though the second standoff distance can be calculated using only T98_0 and T98_inf. With this function, one may also want to change the tilt, azimuth, or T98." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "standoff_1 = pvdeg.standards.standoff(\n", + " weather_df=WEATHER_df,\n", + " meta=META,\n", + " T98=70,\n", + " tilt=META[\"latitude\"],\n", + " azimuth=None,\n", + " sky_model=\"isotropic\",\n", + " temp_model=\"sapm\",\n", + " conf_0=\"insulated_back_glass_polymer\",\n", + " conf_inf=\"open_rack_glass_polymer\",\n", + " x_0=6.5,\n", + " wind_factor=0.33,\n", + ")\n", + "print(\"First calculation standoff = \", \"%.1f\" % standoff_1[\"x\"].iloc[0], \" cm.\")\n", + "standoff_2 = pvdeg.standards.standoff(\n", + " weather_df=WEATHER_df,\n", + " meta=META,\n", + " T98=80,\n", + " tilt=META[\"latitude\"],\n", + " azimuth=None,\n", + " sky_model=\"isotropic\",\n", + " temp_model=\"sapm\",\n", + " conf_0=\"insulated_back_glass_polymer\",\n", + " conf_inf=\"open_rack_glass_polymer\",\n", + " x_0=6.5,\n", + " wind_factor=0.33,\n", + ")\n", + "print(\"Second calculation standoff = \", \"%.1f\" % standoff_2[\"x\"].iloc[0], \" cm.\")\n", + "print(pvdeg.standards.interpret_standoff(standoff_1=standoff_1, standoff_2=standoff_2))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 3. Calculate $X_{eff}$ from provided module temperature data.\n", + "\n", + "To do this calculation, one must use a set of data with:\n", + " - meterological irradiance data sufficient to calculate the POA irradiance (DHI, GHI, and DNI),\n", + " - ambient temperature data,\n", + " - wind speed at module height, (wind_factor=0.33 will be used unless otherwise specified)\n", + " - temperature measurements of the module in the test system. Ideally this would be measured under a worst case scenario that maximizes the module temperature for a given site,\n", + " - geographic meta data including longitude and latitude,\n", + "\n", + "To create a weather file of your own, copy the format of the example file 'xeff_demo.csv'. This is formatted with the first row containing meta data variable names, the second row containing the corresponding values, the third row containing meteorological data headers, and all the remaining rows containing the meteorological data.\n", + "\n", + "To do this calculation, one should also filter the data to remove times when the sun is not shining or when snow is likely to be on the module. The recommendations and programmed defaults are to use poa_min=100 W/m² and data when the minimum ambient temperature t_amb_min=0." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Read the weather file\n", + "weather_file = os.path.join(DATA_DIR, \"xeff_demo.csv\")\n", + "xeff_weather, xeff_meta = pvdeg.weather.read(weather_file, \"csv\")\n", + "# Pull measured temperature and calculate theoretical insulated back module temperature and open rack module temperature\n", + "T_0, T_inf, xeff_poa = pvdeg.standards.eff_gap_parameters(\n", + " weather_df=xeff_weather,\n", + " meta=xeff_meta,\n", + " sky_model=\"isotropic\",\n", + " temp_model=\"sapm\",\n", + " conf_0=\"insulated_back_glass_polymer\",\n", + " conf_inf=\"open_rack_glass_polymer\",\n", + " wind_factor=0.33,\n", + ")\n", + "# Now calculate X_eff.\n", + "x_eff = pvdeg.standards.eff_gap(\n", + " T_0,\n", + " T_inf,\n", + " xeff_weather[\"module_temperature\"],\n", + " xeff_weather[\"temp_air\"],\n", + " xeff_poa[\"poa_global\"],\n", + " x_0=6.5,\n", + " poa_min=100,\n", + " t_amb_min=0,\n", + ")\n", + "print(\"The effective standoff for this system is\", \"%.1f\" % x_eff, \"cm.\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 4. Calculate $T_{98}$ for a given azimuth, tilt, and $X_{eff}$.\n", + "\n", + "Equation 2 can be reorganized as,\n", + "\n", + "$$ T_{98} = T_{98,0} -( T_{98,0}- T_{98,inf}) \\left(1-e^{-\\frac{x_{eff}}{x_{0}}}\\right), Equation 3 $$\n", + "\n", + "and used to calculate the $98^{th}$ percential temperature, $T_{98}$, for a PV system having a given effective standoff height, $X_{eff}$, for an arbitrarily oriented module. Here, $T_{98,0}$ is the $98^{th}$ percentile for an insulated-back module and $T_{98,inf}$ is the $98^{th}$ percentile for a rack-mounted module. The input parameter possibilities are the same as shown in Objective #2 above, but the example below uses the default parameters. The actual tilt [degrees], azimuth [degrees] and $X_{eff}$ [cm] can be modifed as desired." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# This is the minimal function call using the common default settings to estimate T₉₈.\n", + "T_98 = pvdeg.standards.T98_estimate(\n", + " weather_df=WEATHER_df, meta=META, tilt=-META[\"latitude\"], azimuth=None, x_eff=10\n", + ")\n", + "print(\"The 98ᵗʰ percential temperature is estimated to be\", \"%.1f\" % T_98, \"°C.\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# This code will calculate the temperature for an arbitrary x_eff distance. Either set of kwargs can be modified and use.\n", + "# irradiance_kwarg ={\n", + "# \"axis_tilt\": None,\n", + "# \"axis_azimuth\": None,\n", + "# \"x_eff\": 10,\n", + "# \"module_mount\": '1_axis'}\n", + "irradiance_kwarg = {\n", + " \"tilt\": META[\"latitude\"],\n", + " \"azimuth\": None,\n", + " \"x_eff\": 10,\n", + " \"module_mount\": \"fixed\",\n", + "}\n", + "\n", + "T_xeff = pvdeg.standards.x_eff_temperature_estimate(\n", + " weather_df=WEATHER_df, meta=META, **irradiance_kwarg\n", + ")\n", + "\n", + "print(\n", + " \"The 98ᵗʰ percential temperature is estimated to be\",\n", + " \"%.1f\" % np.percentile(T_xeff, 98),\n", + " \"°C.\",\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 5. Plot $X_{min}$ for all azimuth and tilt for a given $T_{98}$.\n", + "\n", + "The temperature of a system is affected by the orientation. This section will scan all possible tilts and azimuths calculating the minimum standoff distance for a given $T_{98}$. Similar additional factors as above can also be modified but are not included here for simplicity. The tilt_step and azimuth_step are the number of degrees for each step for the 90° and 180° tilt and azimuth spans, respectively. The default for this calculation is for $T_{98}$=70°C, the boundary between Level 0 and Level 1 requirements. The temperature model information given below is unnecessary as these are default values that would get populated automatically. However, they were included here for clarity into a standard practice as per IEC TS 63126.\n", + "\n", + "$$ X_{min} = -X_0 \\ln\\left(1-\\frac{T_{98,0}-T}{ T_{98,0}- T_{98,inf}}\\right), Equation 2 $$" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Scans through all the azimuth and tilt running the minimum standoff calculation\n", + "# Set up keyword parameters for the calculation\n", + "\n", + "kwarg_x = dict(\n", + " sky_model=\"isotropic\",\n", + " temp_model=\"sapm\",\n", + " conf_0=\"insulated_back_glass_polymer\",\n", + " conf_inf=\"open_rack_glass_polymer\",\n", + " T98=70,\n", + " x_0=6.5,\n", + " wind_factor=0.33,\n", + ")\n", + "# Run the calculation\n", + "x_azimuth_step = 10\n", + "x_tilt_step = 10\n", + "standoff_series = pvdeg.utilities.tilt_azimuth_scan(\n", + " weather_df=WEATHER_df,\n", + " meta=META,\n", + " tilt_step=x_tilt_step,\n", + " azimuth_step=x_azimuth_step,\n", + " func=pvdeg.standards.standoff_x,\n", + " **kwarg_x,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The next cell creates a plot of the calculated data. Some of the things you may want to change are:\n", + "- cmap=\"Spectral_r\": Change to have different colors\n", + "- plt.title : This will change the plot title.\n", + "- figsize=(16,4) : Change the plot dimensions and/or aspect ratio.\n", + "- vmax=None : This can be set to a numeric value to control the depth scale maximum\n", + "- vmin=0 : This controls the minimum of the depth scale.\n", + "- v_ticks=37 : This changes the number of vertical tick marks\n", + "- h_ticks=10 : This changes the number of horizontal tick marks\n", + "- Unblock the last two lines to ouput the plot as an *.png image file" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "standoff_series_df = pd.DataFrame(\n", + " {\n", + " \"Tilt\": standoff_series[:, 0],\n", + " \"Azimuth\": standoff_series[:, 1],\n", + " \"Xₘᵢₙ\": standoff_series[:, 2],\n", + " }\n", + ")\n", + "x_fig = plt.figure(figsize=(16, 4))\n", + "plt.title(\n", + " r\"Plot of $\\it{Xₘᵢₙ}$ for all orientations for $\\it{T₉₈}$=\"\n", + " + \"%.0f\" % kwarg_x[\"T98\"]\n", + " + \"°C.\",\n", + " fontsize=15,\n", + " y=1.08,\n", + ")\n", + "x_fig = sns.heatmap(\n", + " standoff_series_df.pivot(index=\"Tilt\", columns=\"Azimuth\", values=\"Xₘᵢₙ\"),\n", + " cbar_kws={\"label\": \"Xₘᵢₙ\", \"format\": \"%.0f\", \"pad\": 0.02},\n", + " cmap=\"Spectral_r\",\n", + " vmin=0,\n", + " vmax=None,\n", + ")\n", + "\n", + "h_ticks = 37\n", + "x_number = math.ceil(360 / x_azimuth_step) + 1\n", + "x_ticks = [\n", + " (x * (360 / (h_ticks - 1)) / x_azimuth_step + 0.5) for x in range(h_ticks - 1)\n", + "]\n", + "x_labels = [(\"%.0f\" % (360 / (h_ticks - 1) * x)) for x in range(h_ticks)]\n", + "x_ticks.append(x_number - 0.5)\n", + "x_fig.set_xticks(x_ticks)\n", + "x_fig.set_xticklabels(x_labels, rotation=90)\n", + "\n", + "v_ticks = 10\n", + "y_number = math.ceil(90 / x_tilt_step) + 1\n", + "y_ticks = [(x * (90 / (v_ticks - 1)) / x_tilt_step + 0.5) for x in range(v_ticks - 1)]\n", + "y_labels = [(\"%.0f\" % (90 / (v_ticks - 1) * x)) for x in range(v_ticks)]\n", + "y_ticks.append(y_number - 0.5)\n", + "x_fig.set_yticks(y_ticks)\n", + "x_fig.set_yticklabels(y_labels, rotation=0)\n", + "\n", + "x_fig.set_xlabel(\"Azimuth [°]\", fontsize=15, labelpad=10)\n", + "x_fig.set_ylabel(\"Tilt [°]\", fontsize=15)\n", + "x_fig.figure.axes[-1].set_ylabel(r\"$\\it{Xₘᵢₙ}$ [cm]\", size=15)\n", + "x_fig.invert_yaxis()\n", + "\n", + "output_folder = os.path.join(\n", + " os.path.dirname(os.path.dirname(os.getcwd())), \"TEMP\", \"results\"\n", + ")\n", + "try:\n", + " os.makedirs(output_folder)\n", + "except OSError as error:\n", + " print(error)\n", + "\n", + "plt.savefig(\n", + " os.path.join(output_folder, \"Standoff_Scan.png\"), bbox_inches=\"tight\"\n", + ") # Creates an image file of the standoff plot\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 6. Plot $T_{98}$ for all azimuth and tilt for a given $X_{eff}$.\n", + "\n", + "The temperature of a system is affected by the orientation and the effective standoff, $X_{eff}$, of the system. This section will scan all possible tilts and azimuths calculating the $T_{98}$ for a given $X_{eff}$. As above, additional factors can be modified but are not included here for simplicity. The tilt_step and azimuth_step are the number of degrees for each step for the 90° and 180° tilt and azimuth spans, respectively. The default for this calculation is for $X_{eff}$=10 cm, a common effective standoff distance on a rooftop system. A value of $X_{eff}$=None will run the calculations for an open rack system and $X_{eff}$=0 for an insulated-back system." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Scans through all the azimuth and tilt running the 98ᵗʰ percentile temperature calculation.\n", + "# Set up keyword parameters for the calculation\n", + "kwarg_T = dict(\n", + " sky_model=\"isotropic\",\n", + " temp_model=\"sapm\",\n", + " conf_0=\"insulated_back_glass_polymer\",\n", + " conf_inf=\"open_rack_glass_polymer\",\n", + " x_eff=5,\n", + " x_0=6.5,\n", + " wind_factor=0.33,\n", + ")\n", + "# Run the calculation\n", + "T_azimuth_step = 10\n", + "T_tilt_step = 10\n", + "T98_series = pvdeg.utilities.tilt_azimuth_scan(\n", + " weather_df=WEATHER_df,\n", + " meta=META,\n", + " tilt_step=T_tilt_step,\n", + " azimuth_step=T_azimuth_step,\n", + " func=pvdeg.standards.T98_estimate,\n", + " **kwarg_T,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The next cell creates a plot of the calculated data. Some of the things you may want to change are:\n", + "- cmap=\"Spectral_r\": Change to have different colors\n", + "- plt.title : This will change the plot title.\n", + "- figsize=(16,4) : Change the plot dimensions and/or aspect ratio.\n", + "- vmax=None : This can be set to a numeric value to control the depth scale maximum\n", + "- vmin=None : This controls the minimum of the depth scale.\n", + "- v_ticks=37 : This changes the number of vertical tick marks\n", + "- h_ticks=10 : This changes the number of horizontal tick marks\n", + "- Unblock the last two lines to ouput the plot as an *.png image file" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# This produces the plot of the data\n", + "T98_series_df = pd.DataFrame(\n", + " {\"Tilt\": T98_series[:, 0], \"Azimuth\": T98_series[:, 1], \"T₉₈\": T98_series[:, 2]}\n", + ")\n", + "T98_fig = plt.figure(figsize=(16, 4))\n", + "if kwarg_T[\"x_eff\"] == None:\n", + " plt.title(\n", + " r\"Plot of $\\it{T₉₈}$ for all orientations for an open-rack mounting.\",\n", + " fontsize=15,\n", + " y=1.08,\n", + " )\n", + "else:\n", + " plt.title(\n", + " r\"Plot of $\\it{T₉₈}$ for all orientations for $X_{eff}$=\"\n", + " + \"%.0f\" % kwarg_T[\"x_eff\"]\n", + " + \" cm.\",\n", + " fontsize=15,\n", + " y=1.08,\n", + " )\n", + "T98_fig = sns.heatmap(\n", + " T98_series_df.pivot(index=\"Tilt\", columns=\"Azimuth\", values=\"T₉₈\"),\n", + " cbar_kws={\"label\": \"Xₘᵢₙ\", \"format\": \"%.0f\", \"pad\": 0.02},\n", + " cmap=\"Spectral_r\",\n", + " vmin=None,\n", + " vmax=None,\n", + ")\n", + "\n", + "h_ticks = 37\n", + "x_number = math.ceil(360 / T_azimuth_step) + 1\n", + "x_ticks = [\n", + " (x * (360 / (h_ticks - 1)) / T_azimuth_step + 0.5) for x in range(h_ticks - 1)\n", + "]\n", + "x_labels = [(\"%.0f\" % (360 / (h_ticks - 1) * x)) for x in range(h_ticks)]\n", + "x_ticks.append(x_number - 0.5)\n", + "T98_fig.set_xticks(x_ticks)\n", + "T98_fig.set_xticklabels(x_labels, rotation=90)\n", + "\n", + "v_ticks = 10\n", + "y_number = math.ceil(90 / T_tilt_step) + 1\n", + "y_ticks = [(x * (90 / (v_ticks - 1)) / T_tilt_step + 0.5) for x in range(v_ticks - 1)]\n", + "y_labels = [(\"%.0f\" % (90 / (v_ticks - 1) * x)) for x in range(v_ticks)]\n", + "y_ticks.append(y_number - 0.5)\n", + "T98_fig.set_yticks(y_ticks)\n", + "T98_fig.set_yticklabels(y_labels, rotation=0)\n", + "\n", + "T98_fig.set_xlabel(\"Azimuth [°]\", fontsize=15, labelpad=10)\n", + "T98_fig.set_ylabel(\"Tilt [°]\", fontsize=15)\n", + "T98_fig.figure.axes[-1].set_ylabel(r\"$\\it{T₉₈}$ [°C]\", size=15)\n", + "T98_fig.invert_yaxis()\n", + "\n", + "plt.savefig(\n", + " os.path.join(output_folder, \"T98_Scan.png\"), bbox_inches=\"tight\"\n", + ") # Creates an image file of the standoff plot\n", + "plt.show(T98_fig)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 7. Plot $X_{min}$ for a $T_{98}$, and plot $T_{98}$ for a given region.\n", + "\n", + "This last Objective is much more complicated and is set up to utilize acess to a lot of computational power to run many sites simultaneously to create a regional map of standoff distance.\n", + "For more in-depth instructions on doing this, look at the tutorial \"Scenario - Geospatial.ipynb\" here in PVDeg.\n", + "\n", + "Step #1: Create an object, \"geospatial_standoff_scenario\" to be used to run the computations." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "geospatial_standoff_scenario = pvdeg.GeospatialScenario(\n", + " name=\"standoff geospatial\",\n", + " geospatial=True,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Step #2: Identifies a subset of locations from the database to run the computations.\n", + "Specifically all are from the NSRDB." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "geospatial_standoff_scenario.addLocation(\n", + " state=\"Colorado\", county=\"Summit\"\n", + ") # Identifies a subset of locations from the database to run the computations. Specifically all are from the NSRDB." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Step #3: indicate which function will be run. Here the default is the standoff calculation, but it could be any other function with a key word argument dictionary.\n", + "Here the 98th percential temperature is defined as 70C, but any arbitrary value can be specified." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "geospatial_standoff_scenario.addJob(\n", + " func=pvdeg.standards.standoff, func_params={\"T98\": 70}\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Step #4: Run the scenario" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "geospatial_standoff_scenario.run()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Step #5: Create a plot of the standoff calculation." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "geospatial_standoff_scenario.plot_world(\"x\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "geospatial_standoff_scenario.plot_world(\"T98_inf\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 8. Save data outputs.\n", + "\n", + "This cell contains a number of pre-scripted commands for exporting and saving data. The code to save plots is located after the plot creation and is blocked by default. First check that the output folder exists, then unblock the code for data you would like to save." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "print(\"Your results will be stored in %s\" % output_folder)\n", + "print(\"The folder must already exist or the file will not be created\")\n", + "\n", + "pvdeg.weather.write(\n", + " data_df=WEATHER_df,\n", + " metadata=META,\n", + " savefile=os.path.join(output_folder, \"WeatherFile.csv\"),\n", + ") # Writes the meterological data to an *.csv file.\n", + "\n", + "pd.DataFrame(standoff_series_df).to_csv(\n", + " os.path.join(output_folder, \"Standoff_Scan.csv\")\n", + ") # Writes a file with the Tilt and Azimuth scan calculations of standoff.\n", + "\n", + "pd.DataFrame(T98_series_df).to_csv(\n", + " os.path.join(output_folder, \"T98_Scan.csv\")\n", + ") # Writes a file with the Tilt and Azimuth scan calculations of T98." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "pvdeg", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.9" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/tutorials/04_geospatial/README.md b/tutorials/04_geospatial/README.md new file mode 100644 index 000000000..c593febc0 --- /dev/null +++ b/tutorials/04_geospatial/README.md @@ -0,0 +1,36 @@ +# Geospatial and Scenario Analysis + +Tutorials for geospatial analysis and scenario-based modeling. + +## Tutorials + +### Local Execution +- **local_scenario.ipynb** - Geospatial analysis for local scenarios (no HPC required) + +### HPC Required Tutorials +The following tutorials require access to High Performance Computing (HPC) resources: + +- **geospatial_templates.ipynb** - Templates for geospatial analysis workflows +- **scenario_geographical_features.ipynb** - Incorporating geographical features into scenarios +- **scenario_geospatial.ipynb** - Large-scale geospatial scenario analysis +- **scenario_mountain_downselect.ipynb** - Non-uniform mountain terrain downselection +- **scenario_single_location.ipynb** - Detailed single-location scenario analysis +- **scenario_temperature.ipynb** - Temperature-based scenario modeling +- **module_standoff_iec63126.ipynb** - Module standoff calculations for IEC TS 63126 standard + +## HPC Access + +âš ï¸ **Note**: Most tutorials in this folder require HPC access. These tutorials involve: +- Large-scale geospatial computations +- Multi-location scenario analyses +- Distributed computing workflows + +If you don't have HPC access, start with **local_scenario.ipynb** which runs on standard hardware. + +## Topics Covered + +- Geospatial degradation mapping +- Multi-site scenario generation +- Geographic feature analysis +- Climate-based scenario development +- Terrain-specific modeling diff --git a/tutorials/04_geospatial/scripts/01_local_scenario.py b/tutorials/04_geospatial/scripts/01_local_scenario.py new file mode 100644 index 000000000..cf1dfd1f6 --- /dev/null +++ b/tutorials/04_geospatial/scripts/01_local_scenario.py @@ -0,0 +1,18 @@ +# %% [markdown] +# # Running Geospatial Analysis Locally # +# +# Author: Tobin Ford +# Email : tobin.ford@nrel.gov + +# %% [markdown] +# ## Use Case +# - If you are unable to access the NSRDB via NREL HPC or AWS + +# %% [markdown] +# ## Sourcing Data ## +# +# On the [NSRDB Dataviewer](https://nsrdb.nrel.gov/data-viewer), you can use the area querys to collect information from the area you want. Only tested with USA & Americas - Typical Meteorological Year so far. Use the dropdowns to select the attributes you will need to run calculations. Select a year and follow the instructions to get the zip file containing the weather data csv's for each location in the selected region. +# +# ![NSRDB Dataviewer](./images/NSRDB-data-viewer.png) + +# %% diff --git a/tutorials/04_geospatial/scripts/02_geospatial_templates.py b/tutorials/04_geospatial/scripts/02_geospatial_templates.py new file mode 100644 index 000000000..e6c124515 --- /dev/null +++ b/tutorials/04_geospatial/scripts/02_geospatial_templates.py @@ -0,0 +1,278 @@ +# %% +import pvdeg +from pvdeg import TEST_DATA_DIR +import pandas as pd +import os +import xarray as xr + + +# %% [markdown] +# # Geospatial Templates +# +# When running a geospatial analysis using `pvdeg.geospatial.analysis` on arbitary `pvdeg` functions you will need to specify a template for the shape of the output data. This is because the input data comes with dimensions of gid and time while the output will have data in a different shape usually corresonding to coordinates. +# - gid, identification number corresponding to an NSRDB datapoint's location +# - time, timeseries corresponding to the hourly time indicies of NSRDB datapoint's yearly meteorological data. +# +# Follow the steps below to see how we generate templates before running the analysis. +# +# The only functions where this is not required are currently `pvdeg.standards.standoff`, `pvdeg.humidity.moduke` and, `letid.calc_letid_outdoors` as they are predefined within the package. + +# %% [markdown] +# ## Loading Geospatial Data +# +# This step skips over making the `pvdeg.weather.get` call with `geospatial == True`. See the [Duramat Demo](./DuraMAT%20Live%20Demo.ipynb) for information on how to do this traditionally. +# +# We can also use a `GeospatialScenario` object. See the [Geospatial Scenario Tutorial](./Scenario%20-%20Geospatial.ipynb) for more information on how to use this approach. +# +# *The cell below loads a pickled xarray object, this is not the best way to do this. xarray datasets should be stored as `.nc` - netcdf files* + +# %% +geo_meta = pd.read_csv(os.path.join(TEST_DATA_DIR, "summit-meta.csv"), index_col=0) + +# Use xarray to open NetCDF file instead of pickle +geo_weather = xr.open_dataset(os.path.join(TEST_DATA_DIR, "summit-weather.nc")) + +geo_weather + + +# %% [markdown] +# # Creating Templates Manually +# +# `pvdeg.geospatial.ouput_template` we can produce a template for our result data. +# +# We need to do this because different functions return different types of values, some return multiple values as tuples, some return only single numerics, others return timeseries results. We need to specify the shape of our data to create an output xarray dataset. + +# %% [markdown] +# ## Examples +# +# ## 98ᵗʰ module percential temperature at Standoff Height +# +# Say we want to estimate the 98ᵗʰ percential temperature for the module at the given tilt, azimuth, and x_eff. `PVDeg` has a function to do this, `pvdeg.standards.T98_estimate` BUT it doesn't have a preset geospatial template. We will need to make one. +# +# - look at the function return values. +# From the docstring we can see that `T98_estimate` only has one return value. IMPORTANT, this value is a single float, NOT a timeseries. This means our output shape will only be dependent on the input identifier and NOT time. +# +# Therefore we will map the output variable `T98` to the location identifier `gid` using a dictionary with `str: tuple` mappings. +# +# *IMPORTANT: you must use the syntax below where the variable maps to a tuple of the coordinates. in this case there needs to be a trailing comma in the tuple or python will iterate over the characters in the tuple instead of the elements. See further examples to alleviate confusion.* + +# %% +# define output shape +shapes = { + "T98": ( + "gid", + ) # one return value at each datapoint, only dependent on datapoint, not time +} + +# create xarray template for output to be populated when analysis is run +template = pvdeg.geospatial.output_template( + ds_gids=geo_weather, + shapes=shapes, +) + +# %% +geo_estimate_temp = pvdeg.geospatial.analysis( + weather_ds=geo_weather, + meta_df=geo_meta, + func=pvdeg.standards.T98_estimate, + template=template, +) + +# %% [markdown] +# ## Glass Glass Estimated Module Temperature +# +# Now we want to calculate geospatial timeseries temperature values for a module using `pvdeg.temperature.module`. This is not super practical because all `pvdeg` functions that need to use tempeature for their calculations preform the temperature calculation internally, this is just for show. +# +# This calculation differs from the above because the temperature functions return the module temperature in a timeseries format. So we care about 2 dimensions, location identifier and TIME. + +# %% +# define output shape +shapes = { + "module_temperature": ( + "gid", + "time", + ) # one return value at each datapoint, only dependent on datapoint, not time +} + +# create xarray template for output to be populated when analysis is run +temperature_template = pvdeg.geospatial.output_template( + ds_gids=geo_weather, + shapes=shapes, +) + +# %% +geo_temperature_res = pvdeg.geospatial.analysis( + weather_ds=geo_weather, + meta_df=geo_meta, + func=pvdeg.temperature.module, + template=temperature_template, # use the template we created + conf="open_rack_glass_glass", # provide kwargs for function here +) + +# %% +# plot the temperature at ONE of the geospatial analysis result locations but we have calculated all of these. +import matplotlib.pyplot as plt + +module_temps = ( + geo_temperature_res["module"].sel(latitude=39.89, longitude="-106.42").values +) + +plt.plot(module_temps) + +# %% [markdown] +# ## Self Explaining Code +# +# If we are looking at adding templates for other functions, we can also look at the 3 presaved templates for existing `pvdeg` functions. Visit [pvdeg.geospatial.template_parameters](../../pvdeg/geospatial.py) and inspect this function to see how these different target functions utilize templates and shapes. + +# %% [markdown] +# # Creating Templates Programatically +# +# We can use `pvdeg.geospatial.autotemplate` to generate a template for a given function. This can return a bad result which will fail or work improperly when running `pvdeg.geospatial.analysis` with the generated template. Results should be scrutinized to make sure they are the right format. + +# %% [markdown] +# ## Examples Below +# Steps +# - Create template using autotemplating function. Pulls in information about function to determine shape of output. Not usable on functions with ambigious return types. +# - Call geospatial analysis function using template + +# %% [markdown] +# ## Geospatial Cell Temperature Calculation +# As shown below, we have two options, we can choose to provide a template that is generated by a function which supports autotemplating. Or we can provide the function to `geospatial.analysis` and let it generate a template internally. +# +# ### Providing a Template with `Geospatial.auto_template` + +# %% +# create a template using auto_template for the desired function +cell_temp_template = pvdeg.geospatial.auto_template( + func=pvdeg.temperature.cell, ds_gids=geo_weather +) + +# run the geospatial analysis with the template +pvdeg.geospatial.analysis( + weather_ds=geo_weather, + meta_df=geo_meta, + func=pvdeg.temperature.cell, + template=cell_temp_template, +) + +# %% [markdown] +# ### Analysis Without Providing a Template +# +# If a function is supported by `geospatial.auto_template` we do not need to create a template outside of the function as shown in the cell above. We can simply pass the function to `geospatial.analysis` and it will create a template for us. + +# %% +pvdeg.geospatial.analysis( + weather_ds=geo_weather, + meta_df=geo_meta, + func=pvdeg.temperature.cell, +) + +# %% [markdown] +# ### Geospatial Module Temperature Calculation + +# %% +module_temp_template = pvdeg.geospatial.auto_template( + func=pvdeg.temperature.module, ds_gids=geo_weather +) + +pvdeg.geospatial.analysis( + weather_ds=geo_weather, + meta_df=geo_meta, + func=pvdeg.temperature.module, + template=module_temp_template, +) + +# %% [markdown] +# ### Geospatial Solar Position Calculation + +# %% +solar_position_template = pvdeg.geospatial.auto_template( + func=pvdeg.spectral.solar_position, ds_gids=geo_weather +) + +pvdeg.geospatial.analysis( + weather_ds=geo_weather, + meta_df=geo_meta, + func=pvdeg.spectral.solar_position, + template=solar_position_template, +) + +# %% [markdown] +# ### Geospatial POA Irradiance Calculation + +# %% +poa_irradiance_template = pvdeg.geospatial.auto_template( + func=pvdeg.spectral.poa_irradiance, ds_gids=geo_weather +) + +pvdeg.geospatial.analysis( + weather_ds=geo_weather, + meta_df=geo_meta, + func=pvdeg.spectral.poa_irradiance, + template=poa_irradiance_template, +) + +# %% [markdown] +# ### Geospatial 98th Percentile Operating Temperature Calculation + +# %% +standoff_template = pvdeg.geospatial.auto_template( + func=pvdeg.standards.T98_estimate, ds_gids=geo_weather +) + +pvdeg.geospatial.analysis( + weather_ds=geo_weather, + meta_df=geo_meta, + func=pvdeg.standards.T98_estimate, + template=standoff_template, +) + +# %% [markdown] +# ### Geospatial Module Humidity Calculation + +# %% +humidity_template = pvdeg.geospatial.auto_template( + func=pvdeg.humidity.module, ds_gids=geo_weather +) + +pvdeg.geospatial.analysis( + weather_ds=geo_weather, + meta_df=geo_meta, + func=pvdeg.humidity.module, + template=humidity_template, + backsheet_thickness=0.3, + back_encap_thickness=0.5, +) + +# %% [markdown] +# ### Geospatial IwaVantHoff Environment Characterization Calculation + +# %% +iwa_vant_hoff_template = pvdeg.geospatial.auto_template( + func=pvdeg.degradation.IwaVantHoff, ds_gids=geo_weather +) + +pvdeg.geospatial.analysis( + weather_ds=geo_weather, + meta_df=geo_meta, + func=pvdeg.degradation.IwaVantHoff, + template=iwa_vant_hoff_template, +) + +# %% [markdown] +# ### Geospatial Edge Seal Width Calculation + +# %% +edge_seal_template = pvdeg.geospatial.auto_template( + func=pvdeg.design.edge_seal_width, ds_gids=geo_weather +) + +pvdeg.geospatial.analysis( + weather_ds=geo_weather, + meta_df=geo_meta, + func=pvdeg.design.edge_seal_width, + template=edge_seal_template, +) + +# %% +edge_seal_template diff --git a/tutorials/04_geospatial/scripts/03_scenario_geographical_features.py b/tutorials/04_geospatial/scripts/03_scenario_geographical_features.py new file mode 100644 index 000000000..085006835 --- /dev/null +++ b/tutorials/04_geospatial/scripts/03_scenario_geographical_features.py @@ -0,0 +1,112 @@ +# %% +import pvdeg +import numpy as np + +# %% [markdown] +# ## Create Scenario and Populate Location +# The default geospatial datapoints for addLocation are from the Americas satellite. This is the only data we are interested in for this case so don't specify any location arguments. +# To speed up calculations we will downsample to get coarser data. The downsampling function is not linear. A downsample factor of 10 takes us from 2018267 entries to only 5109. + +# %% +features = pvdeg.GeospatialScenario(name="finding-features") + +features.addLocation(downsample_factor=10) + +# %% [markdown] +# ## Intro to KDTrees +# +# A K dimensional tree is a datastructure for organizing n points in a k dimensional space. They are often used for nearest neighbors searches and many ML algorithms. Letting k = 2, our dimensions will be latitude and longitude. This is much faster than iterating over tabular data structures to find neighbors. The function to create a kdtree below requires scikit learn (also known as sklearn), a python machine learning library which is not included in the pvdeg dependency list so you will have to install it independently. Scipy also has a kdtree class but it is much slower. Depending on the number of datapoints the tree build time could be quite long but for our purposes, the cell below will be quick. + +# %% +tree = pvdeg.geospatial.meta_KDtree(meta_df=features.meta_data) + +# %% [markdown] +# ## Remaining Points After Downsampling +# +# Use `plot_coords` to see all latitude longitude coordinate pairs included in a scenario's metadata. You can provide corners of a bounding box to change the extent of the matplotlib plot. + +# %% +features.plot_coords() + +# %% [markdown] +# # Identifying Mountains from Geospatial Data I +# +# Identify moutains by using the function below. There are currently 2 methods to identify mountains from our data. Both will add a column to our `GeospatialScenario.meta_data` attribute called `mountain` containing boolean values that represent if a data point is in/near mountains or not near mountains. +# +# - `classify_mountains_weights` uses k nearest neighbors search and calculates local changes in height with different methods, the default is the `mean` absolute change compared to a points neighbors, then it assigns a weight to each point. If the remaining points are above the threshold then the percentile argument determines sensitivity to classifying points as mountains (higher weight, more mountainous). Much better than the following option. +# - `classify_mountains_radii` uses 2 nearest neighbors radius searches at each point and compares the average elevation of the inner circle to the avg radius of the circle. + +# %% +features.classify_mountains_weights(kdtree=tree) + +# %% [markdown] +# # Identifing Mountains from Geospatial Data II +# +# We do not need to provide a `kdtree` when we call this method. We can provide a `kdtree` if we create one first with `pvdeg.geospatial.meta_kdtree` but it will work without supplying it. +# GeospatialScenario will create a kdtree internally for us. So the method can simply be called as shown below. + +# %% +# this will work without running the above cells to create a kdtree or the cell directly above where we utilize the created kdtree. +features.classify_mountains_weights() + +# %% [markdown] +# ## Convenience Plotting for Binary Classifications +# +# the `plot_meta_classification` method allows you to plot your data with respect to a boolean classifier present in the `scenario.meta_data` dataframe columns. + +# %% +features.plot_meta_classification(col_name="mountain") + +# %% [markdown] +# ## Identifying mountains within a bounding box. +# +# Sometimes we only want information from one area. To allow for more control over the selection process. To pick only one area from an existing superset of data we can use a bounding box. +# Either provide the top left and bottom right (latitude-longitude) pairs or a 2d numpy array of these pairs which will use the most extreme entries to form the bounding box. + +# %% +features.classify_mountains_radii( + kdtree=tree, + elevation_floor=0, + bbox_kwarg={ + "coords": np.array( + [ + [47.960502, -115.048828], + [47.842658, -101.118164], + [36.738884, -113.686523], + [36.633162, -100.283203], + ] + ) + }, +) + +# %% +features.plot_meta_classification(col_name="mountain") + +# %% [markdown] +# ## Identifying Coastlines from Geospatial Data +# +# To identify points within a search radius of any [natural earth features](https://www.naturalearthdata.com/features/). The following examples show the process of identifying coastline datapoints. + +# %% +features.classify_feature( + kdtree=tree, + feature_name="coastline", + resolution="10m", + radius=0.5, # change this to get a wider band of selected data near the coastline +) + +# %% +features.plot_meta_classification(col_name="coastline") + +# %% [markdown] +# ## Finding Rivers +# +# Above we saw how to find points near coastlines, now lets do points near rivers. It is very similar + +# %% +features.classify_feature( + kdtree=tree, feature_name="rivers_lake_centerlines", resolution="10m", radius=0.2 +) + +# %% +features.plot_meta_classification(col_name="rivers_lake_centerlines") diff --git a/tutorials/04_geospatial/scripts/04_scenario_geospatial.py b/tutorials/04_geospatial/scripts/04_scenario_geospatial.py new file mode 100644 index 000000000..f89a8363b --- /dev/null +++ b/tutorials/04_geospatial/scripts/04_scenario_geospatial.py @@ -0,0 +1,92 @@ +# %% +import pvdeg + +# %% [markdown] +# ## Define Geospatial Scenario Object +# +# To preform geospatial analysis we can create a `GeospatialScenario` object. Alternatively, to preform single location analysis use `Scenario`. Scenario and GeospatialScenario are generalized classes that can be used to replace the legacy functional pvdeg analysis approach with an object orented one. + +# %% +geospatial_standoff_scenario = pvdeg.GeospatialScenario( + name="standoff geospatial", +) + +# %% [markdown] +# ## Add Location +# To add locations for geospatial analysis we will use the ``.addLocation`` method. We can choose downselect from the NSRDB to a country, state and county in that order. *Support for multiple of each category in list form soon.* The ``see_added`` flag allows us to see the gids we have added to the scenario. + +# %% +geospatial_standoff_scenario.addLocation( + state="Colorado", county="Summit", see_added=True, downsample_factor=3 +) + +# %% [markdown] +# ## Add Functions to the Pipeline +# The scenario has a queue of jobs to preform. These are stored in an attribute called ``pipeline``, you can directly update the pipeline but this will bypass the assistance given in creating the job function and parameters. The easiest way to add a job to the pipeline is the ``.updatePipeline`` method. For geospatial analysis, weather and metadata is collected and stored in the scenario at the time of the ``.addLocation`` method call so we do not need to include it below, but if we have other function kwargs to include, they should go in the ``func_params`` argument. +# +# Only a few pvdeg functions are currently supported for geospatial analysis. See the docstring for ``.updatePipeline`` to view currently supported functions. ``updatePipeline`` will not let you add unsupported geospatial functions. The ``see_added`` flag allows us to see the new job added to the pipeline. + +# %% +geospatial_standoff_scenario.addJob(func=pvdeg.standards.standoff, see_added=True) + +# %% +geospatial_standoff_scenario + +# %% [markdown] +# ## Run the job in the pipeline +# +# Currently ``scenario`` only supports one geospatial analysis at a time. We cannot have two geospatial jobs at the same time. + +# %% +geospatial_standoff_scenario.run() + +# %% [markdown] +# ## Directly Access Results Attribute +# +# We can either view the results of the scenario pipeline using ``.viewScenario`` as shown above. The results will be displayed only if the pipeline has been run. Alternatively, we can directly view the ``results`` atribute of the scenario. + +# %% +geospatial_standoff_scenario.results + +# %% [markdown] +# ## Cleanup +# +# The scenario object will store its attributes in a file the python script's current working directory. If we want to delete this file when we are done with the scenario instance we can use the ``.clean()`` method as shown below. + +# %% +geospatial_standoff_scenario.clean() + +# %% [markdown] +# ## Example Geospatial Functionality +# Many functions are supported for geospatial analysis, here are a few. +# - ``pvdeg.standards.standoff`` +# - ``pvdeg.humidity.module`` +# - ``pvdeg.letid.calc_letid_outdoors`` +# +# See the Geospatial Templates tutorial for an example on this. + +# %% +geospatial_humidity_scenario = pvdeg.GeospatialScenario( + name="humidity scenario", geospatial=True +) + +geospatial_humidity_scenario.addLocation( + state="Colorado", county="Jefferson", see_added=True +) + +geospatial_humidity_scenario.addJob( + func=pvdeg.humidity.module, + func_params={ + "backsheet_thickness": 0.3, # mm, thickness of PET backsheet + "back_encap_thickness": 0.46, # mm, thickness of EVA backside encapsulant + "encapsulant": "W001", # EVA encapsulant + "backsheet": "W017", # PET backsheet + }, + see_added=True, +) + +# %% +geospatial_humidity_scenario.run() + +# %% +geospatial_humidity_scenario.results diff --git a/tutorials/04_geospatial/scripts/05_scenario_mountain_downselect.py b/tutorials/04_geospatial/scripts/05_scenario_mountain_downselect.py new file mode 100644 index 000000000..5692e85d5 --- /dev/null +++ b/tutorials/04_geospatial/scripts/05_scenario_mountain_downselect.py @@ -0,0 +1,120 @@ +# %% +import pvdeg +import numpy as np + +# %% [markdown] +# ## Adding Points +# +# We are going to add all of the points in the American West to the scenario and downsample by a factor of 1. This will include only half of the points in the latitude axis and half in the longitude axis. + +# %% +dynamic_points = pvdeg.GeospatialScenario(name="dynamic-selection") + +dynamic_points.addLocation( + state=["CO", "UT"], # , 'NM', 'NV', 'ID', 'WY', 'AZ', 'CA', 'OR', 'WA'], + downsample_factor=1, +) + +# %% [markdown] +# ### Preview The Scenario's Points +# +# Use `plot_cords` to get a quick snapshot of all coordinates included in the scenario's metadata. + +# %% +dynamic_points.plot_coords( + coord_1=[48.574790, -130.253906], # uncomment to see Larger scale view + coord_2=[25.482951, -68.027344], + size=0.005, +) + +# %% +dynamic_points.meta_data + +# %% [markdown] +# ## Downselecting +# +# Using weighted random choices based on elevation we will create a sparse grid from the full metadata for fast calculations. This requires sklearn to be installed but this is not in the `pvdeg` dependency list to you will have to install it seperately. +# +# ### Normalization +# +# At each metadata point in our dataset we will calculate a weight based on its changes in elevation compared to its neighbors. The higher the weight, the greater the change in elevation from a point's immediate neighbors. The downselection methods and functions use these weights to randomly select a subset of the datapoints, prefferentially selecting those with higher weights. +# +# We have some control over which points get selected because all points' weights must be normalized (mapped from 0 to 1) before downselecting. We can apply a function such as $e^x$ or $\log x$ to the weights during normalization. This could help change the distribution of weights that are chosen. This could remove points from the mountains and add them to areas with fewer changes in elevation, or vice versa. +# +# *Note: `pvdeg`'s downselection functions use `numpy.random`, the random seed is not fixed so the result will change between runs.* + +# %% [markdown] +# ### Providing a KdTree +# +# As shown below the lines to create a kdtree are commented out. +# + +# %% +# Set random seed for reproducible results +np.random.seed(42) + +# west_tree = pvdeg.geospatial.meta_KDtree(meta_df=dynamic_points.meta_data) + +dynamic_points.downselect_elevation_stochastic( + # kdtree=west_tree, + downselect_prop=0.5, + normalization="linear", +) + +# %% +dynamic_points.plot_coords() + +# %% [markdown] +# ## Extracting from Scenario +# +# Scenarios provide an easy way to select and downsample geospatial data but we can easily pull out the data to use other `pvdeg` functions on it. In the cell below, we extract the weather data and meta data from the scenario and take only the matching entries from the weather. Then we load the xarray dataset into memory. Previously, it was stored lazily out of memory but we want to do operations on it. (Chunking causes issues when calculating so this eliminates any chunks) + +# %% +weather = dynamic_points.weather_data + +sub_weather = weather.sel( + gid=dynamic_points.meta_data.index +) # downselect weather using restricted metadata set + +sub_weather = sub_weather.compute() # load into memory + +# %% [markdown] +# ### Geospatial Calculation +# +# Run a standoff calculation on the extracted scenario weather data and scenario meta data. + +# %% +# geospatial analysis now + +geo = { + "func": pvdeg.standards.standoff, + "weather_ds": sub_weather, + "meta_df": dynamic_points.meta_data, +} + +analysis_result = pvdeg.geospatial.analysis(**geo) + +# %% [markdown] +# ### Viewing Results +# +# Inspecting the xarray dataset below shows us that we have many Not a Number (NaN) entries. These occur because we did not provide weather data at every point in the grid of possile latitude-longitude pairs. Expanding the `x` datavariable shows that there are some valid results but these are uncommon. + +# %% +analysis_result + +# %% [markdown] +# ## Plotting Sparse Data I +# +# If we try to plot existing data with the current plotting methods exposed by `pvdeg` we will encounter issues. This will produce weak plotting results. + +# %% +# This cell demonstrates the issue with plotting sparse data directly +# It will raise a TypeError because there's no numeric data to plot +try: + pvdeg.geospatial.plot_USA(analysis_result["x"]) +except TypeError as e: + print(f"Expected error when plotting sparse data: {e}") + print("This is why we need to use plot_sparse_analysis() instead (see next cell)") + +# %% +pvdeg.geospatial.plot_sparse_analysis(analysis_result, data_var="x", method="linear") diff --git a/tutorials/04_geospatial/scripts/06_scenario_single_location.py b/tutorials/04_geospatial/scripts/06_scenario_single_location.py new file mode 100644 index 000000000..878e38540 --- /dev/null +++ b/tutorials/04_geospatial/scripts/06_scenario_single_location.py @@ -0,0 +1,154 @@ +# %% [markdown] +# # Scenario Objects - OOP Approach to PVDEG +# +# Author: Tobin Ford | tobin.ford@nrel.gov +# +# 2024 +# **** +# +# A simple object orented workflow walkthrough using pvdeg. + +# %% +# if running on google colab, uncomment the next line and execute this cell to install the dependencies and prevent "ModuleNotFoundError" in later cells: +# # !pip install pvdeg==0.3.3 + +# %% +import pvdeg +import os + +# %% +# This information helps with debugging and getting support :) +import sys +import platform + +print("Working on a ", platform.system(), platform.release()) +print("Python version ", sys.version) +print("pvdeg version ", pvdeg.__version__) + +# %% [markdown] +# ## Define Single Point Scenario Object +# Scenario is a general class that can be used to replace the legacy functional pvdeg analysis approach with an object orented one. ``Scenario`` can preform single location or geospatial analysis. The scenario constructor takes many arguments but the only required one for the following use cases is the ``name`` attribute. It is visible in when we display the entire scenario and is present in the file of saved information about the scenario. We also need to provide the class constructor with our API key and email. +# +# A way around this is to provide the weather and metadata in the pipeline job arguments or you can load data from somewhere else and provide it in the same fashion. +# +#
+# Please use your own API key: The block below makes an NSRDB API to get weather and meta data. This tutorial will work with the DEMO Key provided, but it will take you less than 3 minutes to obtain your own at https://developer.nrel.gov/signup/ so register now.) +#
+ +# %% +simple_scenario = pvdeg.Scenario( + name="Point Minimum Standoff", email="user@mail.com", api_key="DEMO_KEY" +) + +# %% [markdown] +# ## Adding A Location +# To add a single point using data from the Physical Solar Model (PSM3), simply feed the scenario a single coordinate in tuple form via the ``addLocation`` method. Currently this is the only way to add a location to a non-geospatial scenario, all of the other arguments are unusable when ``Scenario.geospatial == False``. +# +# Attempting to add a second location by calling the method again with a different coordinate pair will overwrite the old location data stored in the class instance. + +# %% +simple_scenario.addLocation( + lat_long=(25.783388, -80.189029), +) + +# %% +simple_scenario.weather_data + +# %% [markdown] +# ## Scenario Pipelines +# +# The pipeline is a list of tasks called jobs for the scenario to run. We will populate the pipeline with a list of jobs before executing them all at once. +# +# To add a job to the pipeline use the ``updatePipeline`` method. Two examples of adding functions to the pipeline will be shown below. + +# %% [markdown] +# ### Adding a job without function arguments +# +# The simplest case of adding a job to the pipeline is when it only requires us to provide simple weather and metadata. In the function definition and docstring these appear as ``weather_df`` and ``meta``. Since these attributes are contained in our scenario class instance we do not have to worry about them. We can simply add the function as shown below. + +# %% +simple_scenario.addJob(func=pvdeg.standards.standoff) + +# %% [markdown] +# ### Adding a job with function arguments +# +# When adding a job that contains a function requiring other arguments such as ``solder_fatigue`` which requires a value for ``wind_factor``, we will need to provide it. The most straightforeward way to do this is using a kwargs dictionary and passing it to the function. We do not unpack the dictionary before passing it. This is done inside of the scenario at pipeline runtime (when ``runPipeline`` is called). + +# %% +kwargs = {"wind_factor": 0.33} + +simple_scenario.addJob(func=pvdeg.fatigue.solder_fatigue, func_kwarg=kwargs) + +# %% [markdown] +# ### Adding a job with weather and metadata from outside of the class +# ### Not functional +# +# could just directly set weather data with scenario.weather_data = weather and scenario.meta_data = meta but that would only work for all of the jobs in the pipeline +# +# Say local weather data is available or other, if we want to use this rather than the PSM3 data at a latitude and longitude we can also provide the weather and metadata in the function arguments. This is probably the best if avoided but follows the same syntax as providing other function arguments. See the example below. + +# %% +PSM_FILE = os.path.join(pvdeg.DATA_DIR, "psm3_demo.csv") +weather, meta = pvdeg.weather.read(PSM_FILE, "psm") + +kwargs = {"weather_df": weather, "meta": meta} + +simple_scenario.addJob(func=pvdeg.standards.standoff, func_kwarg=kwargs) + +# FIX THIS CASE IN SCENARIO CLASS +# (simple_scenario.pipeline[1]['job'])(**simple_scenario.pipeline[1]['params']) + +# %% [markdown] +# ## View Scenario +# +# The ``viewScenario`` method provides an overview of the information contained within your scenario object. Here you can see if it contains the location weather and metadata. As well as the jobs in the pipeline and their arguments. + +# %% +simple_scenario.viewScenario() + +# %% [markdown] +# ## Display +# +# The fancier cousin of viewScenario. Only works in a jupyter environemnt as it uses a special ipython backend to render the html and javascript. +# +# It can be called with just the Scenario instance as follows +# `simple_scenario` +# +# or using the display function +# `display(simple_scenario)` + +# %% +simple_scenario + +# %% [markdown] +# ## Executing Pipeline Jobs +# To run the pipeline after we have populated it with the desired jobs call the ``runPipeline`` method on our scenario instance. This will run all of the jobs we have previously added. The functions that need weather and metadata will grab it from the scenario instance using the correct location added above. The pipeline jobs results will be saved to the scenario instance. + +# %% +simple_scenario.run() + +# %% [markdown] +# ## Results Series ## +# We will use a series to store the various return values of functions run in our pipeline. These can partially obfuscate the dataframes within them so to access the dataframes, use the function name to access it. To get one of the results we can index it using dictionary syntax. If the job was called `'KSDJQ'` do `'simple_scenario.results['KSDJQ']` to directly access the result for that job + +# %% +print(simple_scenario.results) +print("We can't see out data in here so we need to do another step", end="\n\n") + +# to see all available ouputs of results do +print( + f"this is the list of all available frames in results : {simple_scenario.results.index}\n" +) + +# loop over all results and display +for keys, results in simple_scenario.results.items(): + print(keys) + display(results) + +# %% [markdown] +# ## Cleaning Up the Scenario +# +# Each scenario object creates a directory named ``pvd_job_...`` that contains information about the scenario instance. To remove the directory and all of its information call ``clean`` on the scenario. This will permanently delete the directory created by the scenario. + +# %% +simple_scenario.clean() diff --git a/tutorials/04_geospatial/scripts/07_scenario_temperature.py b/tutorials/04_geospatial/scripts/07_scenario_temperature.py new file mode 100644 index 000000000..75467fc9b --- /dev/null +++ b/tutorials/04_geospatial/scripts/07_scenario_temperature.py @@ -0,0 +1,164 @@ +# %% +# if running on google colab, uncomment the next line and execute this cell to install the dependencies and prevent "ModuleNotFoundError" in later cells: +# # !pip install pvdeg==0.3.3 + +# %% +import pvdeg +import os + +# %% +# This information helps with debugging and getting support :) +import sys +import platform + +print("Working on a ", platform.system(), platform.release()) +print("Python version ", sys.version) +print("pvdeg version ", pvdeg.__version__) + +# %% [markdown] +# ## Adding Modules and Pipeline Jobs (Run Functions on Scenario Object) +# +# Material: `OX003` corresponds to a set of EVA material parameters from the default file `O2Permeation.json` in the `pvdeg/data` directory. Look in these files to see available options. + +# %% +scene_temp = pvdeg.Scenario( + name="temperature and degradation", + api_key="DEMO_KEY", + email="user@mail.com", +) + +scene_temp.addLocation( + lat_long=(25.783388, -80.189029), +) + +# this module will be overwritten because another with the same name is added afterwards +scene_temp.addModule(module_name="sapm_1", temperature_model="sapm") + +scene_temp.addModule( + module_name="sapm_1", + racking="open_rack_glass_polymer", + materials="OX003", + temperature_model="sapm", + irradiance_kwarg={"azimuth": 120, "tilt": 30}, + model_kwarg={"irrad_ref": 1100}, +) + +scene_temp.addModule( + module_name="pvsyst_1", + racking="freestanding", + materials="OX003", + temperature_model="pvsyst", + irradiance_kwarg={"azimuth": 180, "tilt": 0}, + model_kwarg={"module_efficiency": 0.15}, +) +scene_temp.addModule( + module_name="sapm_2", + racking="open_rack_glass_polymer", + materials="OX003", + temperature_model="sapm", + irradiance_kwarg={"azimuth": 120, "tilt": 30}, + model_kwarg={"irrad_ref": 1000}, +) +scene_temp.addModule( + module_name="sapm_3", + racking="open_rack_glass_polymer", + materials="OX003", + temperature_model="sapm", + irradiance_kwarg={"azimuth": 180, "tilt": 0}, + model_kwarg={"irrad_ref": 1000}, +) + +scene_temp.addModule( + module_name="pvsyst_2", + racking="freestanding", + materials="OX003", + temperature_model="pvsyst", + irradiance_kwarg={"azimuth": 180, "tilt": 0}, + model_kwarg={"module_efficiency": 0.2}, +) + +scene_temp.addJob( + func=pvdeg.temperature.temperature, + func_kwarg={"cell_or_mod": "cell"}, +) + +scene_temp.addJob( + func=pvdeg.degradation.vantHoff_deg, + func_kwarg={"I_chamber": 1000, "temp_chamber": 25}, +) + +scene_temp.addJob( + func=pvdeg.degradation.vantHoff_deg, + func_kwarg={"I_chamber": 1000, "temp_chamber": 30}, +) + +scene_temp.addJob( + func=pvdeg.degradation.IwaVantHoff, +) + +# %% [markdown] +# ## Run and View Scenario Results + +# %% +scene_temp.run() + +scene_temp + +# %% +scene_temp.dump() + +# %% [markdown] +# ## Plotting and Extracting Results +# These methods are independent of one another (i.e. you do not need to extract before plotting but both are shown below.) + +# %% +import datetime + +t0 = datetime.datetime(1970, 1, 1, 0, 0) +tf = datetime.datetime(1970, 1, 1, 23, 59) + +# Get the first function result dynamically +function_ids = [key[1] for key in scene_temp.results.keys() if key[0] == "function"] +if function_ids: + temp_df = scene_temp.extract( + ("function", function_ids[0]), tmy=True, start_time=t0, end_time=tf + ) + display(temp_df) +else: + print("No function results found") + +# %% +# Get the first function result dynamically for plotting +function_ids = [key[1] for key in scene_temp.results.keys() if key[0] == "function"] +if function_ids: + scene_temp.plot( + ("function", function_ids[0]), + tmy=True, + start_time=t0, + end_time=tf, + title="single day cell temperature", + ) +else: + print("No function results found") + +# %% [markdown] +# ## Create a Copy of a Scenario + +# %% +from pathlib import Path + +parent_dir = Path(pvdeg.PVDEG_DIR).parent +new_path = ( + parent_dir + / "tutorials_and_tools" + / "tutorials_and_tools" + / "temperature_and_degradation.json" +) + +copy = pvdeg.scenario.Scenario.load_json( + file_path=str(new_path), + email="user@mail.com", + api_key="DEMO_KEY", +) + +# copy diff --git a/tutorials/04_geospatial/scripts/08_module_standoff_iec63126.py b/tutorials/04_geospatial/scripts/08_module_standoff_iec63126.py new file mode 100644 index 000000000..27b5b4b63 --- /dev/null +++ b/tutorials/04_geospatial/scripts/08_module_standoff_iec63126.py @@ -0,0 +1,499 @@ +# %% [markdown] +# # Tools - Module Standoff for IEC TS 63126 +# +# ### Calculation of module standoff distance according to IEC TS 63126 +# +# **Requirements:** +# - Local weather data file or site longitude and latittude +# +# **Objectives:** +# 1. Import weather data. +# 2. Calculate installation standoff - Level 1 and Level 2. +# 3. Calculate $X_{eff}$ from provided module temperature data. +# 4. Calculate $T_{98}$ for a given azimuth, tilt, and $X_{eff}$. +# 5. Plot $X_{min}$ for all azimuth and tilt for a given $T_{98}$. +# 6. Plot $X_{min}$ for Level 1, Level 2, or a $T_{98}$ for a given region. +# +# **Background:** +# +# This notebook calculates the a minimum effective standoff distance ($X_{eff}$) necessary for roof-mounted PV modules to ensure that the $98^{th}$ percentile operating temperature, $T_{98}$, remains under 70°C for compliance to IEC 61730 and IEC 61215. For higher $T_{98}$ values above 70°C or 80°C testing must be done to the specifications for Level 1 and Level 2 of IEC TS 63126. This method is outlined in the appendix of IEC TS 63126 and is based on the model from *[King 2004] and data from **[Fuentes, 1987] to model the approximate exponential decay in temperature, $T(X)$, with increasing standoff distance, $X$, as, +# +# $$ X = -X_0 \ln\left(1-\frac{T_0-T}{\Delta T}\right), Equation 1 $$ +# +# where $T_0$ is the temperature for $X=0$ (insulated-back) and $\Delta T$ is the temperature difference between an insulated-back ($X=0$) and open-rack mounting configuration ($X=\infty)$. +# +# We used pvlib and data from the National Solar Radiation Database (NSRDB) to calculate the module temperatures for the insulated-back and open-rack mounting configurations and apply our model to obtain the minimum standoff distance for roof-mounted PV systems to achieve a temperature lower than a specified $T_{98}$. The following figure showcases this calulation for the entire world for an $X_{eff}$ that results in $T_{98}$=70°C. Values of $X_{eff}$ higher than this will require Level 1 or Level 2 certification. +# +# $*$ D. L. King, W. E. Boyson, and J. A. Kratochvil, "Photovoltaic array performance model," SAND2004-3535, Sandia National Laboratories, Albuquerque, NM, 2004. '\ +# $**$ M. K. Fuentes, "A simplified thermal model for Flat-Plate photovoltaic arrays," United States, 1987-05-01 1987. https://www.osti.gov/biblio/6802914 +# + +# %% [markdown] +# ![alt text](images/T98_70C_standoff_Map.png) + +# %% +# if running on google colab, uncomment the next line and execute this cell to install the dependencies +# and prevent "ModuleNotFoundError" in later cells: +# #!pip install pvdeg==0.4.2 + +# %% +import os +import pvdeg +import pandas as pd +from pvdeg import DATA_DIR +import dask +import matplotlib.pyplot as plt +import seaborn as sns +import math +import numpy as np + +# %% +# This information helps with debugging and getting support :) +import sys +import platform + +print("Working on a ", platform.system(), platform.release()) +print("Python version ", sys.version) +print("Pandas version ", pd.__version__) +print("pvdeg version ", pvdeg.__version__) +print("dask version", dask.__version__) +print(DATA_DIR) + +# %% [markdown] +# ## 1. Import Weather Data +# +# The function has these minimum requirements when using a weather data file: +# - Weather data containing (at least) DNI, DHI, GHI, Temperature, RH, and Wind-Speed data at module level. +# - Site meta-data containing (at least) latitude, longitude, and time zone +# +# Alternatively one may can get meterological data from the NSRDB or PVGIS with just the longitude and latitude. This function for the NSRDB (via NSRDB 'PSM3') works primarily for most of North America and South America. PVGIS works for most of the rest of the world (via SARAH 'PVGIS'). See the tutorial "Weather Database Access.ipynb" tutorial on PVdeg or Jensen et al. https://doi.org/10.1016/j.solener.2023.112092 for satellite coverage information. +# + +# %% +# Get data from a supplied data file (Do not use the next box of code if using your own file) +weather_file = os.path.join(DATA_DIR, "psm3_demo.csv") +WEATHER_df, META = pvdeg.weather.read(weather_file, "csv") +print(META) + +# %% +# This routine will get a meteorological dataset from anywhere in the world where it is available +# weather_id = (24.7136, 46.6753) #Riyadh, Saudi Arabia +# weather_id = (35.6754, 139.65) #Tokyo, Japan +# weather_id = (-43.52646, 172.62165) #Christchurch, New Zealand +# weather_id = (64.84031, -147.73836) #Fairbanks, Alaska +# weather_id = (65.14037, -21.91633) #Reykjavik, Iceland +# weather_id = (33.4152, -111.8315) #Mesa, Arizona +# WEATHER_df, META = pvdeg.weather.get_anywhere(id=weather_id) +# print(META) + +# %% [markdown] +# ## 2. Calculate Installation Standoff Minimum - Level 1 and Level 2 +# +# According to IEC TS 63126, Level 0, Level 1 and Level 2 certification is limited to T₉₈<70°C, <80°C and <90°C, respectively. Level 0 certification is essentially compliance to IEC 61730 and IEC 61215. The default value of T₉₈<70°C represents the minimium gap to avoid higher temperature certification according to IEC TS 63126. This minimum standoff ($x_{min}$) is the distance between the bottom of the module frame and the roof and can be extimated for a given environment as, +# +# $$ X_{min} = -X_0 \ln\left(1-\frac{T_{98,0}-T}{ T_{98,0}- T_{98,inf}}\right), Equation 2 $$ +# +# where $T_{98,0}$ is the $98^{th}$ percentile temperature for an insulated back module and $T_{98,inf}$ is the $98^{th}$ percentile temperature for an open rack mounted module. +# +# Once the meterological data has been obtained, the input parameter possibilities are: +# +# - T₉₈ : Does not necessarily need to be set at 70°C or 80°C for IEC TS 63216, you might want to use a different number to compensate for a thermal aspect of the particular system you are considering. The default is 70°C. +# - tilt : tilt from horizontal of PV module. The default is 0°. +# - azimuth : azimuth in degrees from North. The default is 180° for south facing. +# - sky_model : pvlib compatible model for generating sky characteristics (Options: 'isotropic', 'klucher', 'haydavies', 'reindl', 'king', 'perez'). The default is 'isotropic'. +# - temp_model : pvlib compatible module temperature model. (Options: 'sapm', 'pvsyst', 'faiman', 'sandia'). The default is 'sapm'. +# - conf_0 : Temperature model for hotest mounting configuration. Default is "insulated_back_glass_polymer". +# - conf_inf : Temperature model for open rack mounting. Default is "open_rack_glass_polymer". +# - x_0 : thermal decay constant [cm] (see documentation). The default is 6.5 cm. +# - wind_factor : Wind speed power law correction factor to account for different wind speed measurement heights between weather database (e.g. NSRDB) and the tempeature model (e.g. SAPM). The default is 0.33. + +# %% [markdown] +# The following is the minimum function call. It defaults to horizontal tilt and T₉₈=70°C. + +# %% +standoff = pvdeg.standards.standoff(weather_df=WEATHER_df, meta=META) +print(pvdeg.standards.interpret_standoff(standoff)) + +# %% [markdown] +# The following is a full function call for both T₉₈=70°C and 80°C separately even though the second standoff distance can be calculated using only T98_0 and T98_inf. With this function, one may also want to change the tilt, azimuth, or T98. + +# %% +standoff_1 = pvdeg.standards.standoff( + weather_df=WEATHER_df, + meta=META, + T98=70, + tilt=META["latitude"], + azimuth=None, + sky_model="isotropic", + temp_model="sapm", + conf_0="insulated_back_glass_polymer", + conf_inf="open_rack_glass_polymer", + x_0=6.5, + wind_factor=0.33, +) +print("First calculation standoff = ", "%.1f" % standoff_1["x"].iloc[0], " cm.") +standoff_2 = pvdeg.standards.standoff( + weather_df=WEATHER_df, + meta=META, + T98=80, + tilt=META["latitude"], + azimuth=None, + sky_model="isotropic", + temp_model="sapm", + conf_0="insulated_back_glass_polymer", + conf_inf="open_rack_glass_polymer", + x_0=6.5, + wind_factor=0.33, +) +print("Second calculation standoff = ", "%.1f" % standoff_2["x"].iloc[0], " cm.") +print(pvdeg.standards.interpret_standoff(standoff_1=standoff_1, standoff_2=standoff_2)) + +# %% [markdown] +# ## 3. Calculate $X_{eff}$ from provided module temperature data. +# +# To do this calculation, one must use a set of data with: +# - meterological irradiance data sufficient to calculate the POA irradiance (DHI, GHI, and DNI), +# - ambient temperature data, +# - wind speed at module height, (wind_factor=0.33 will be used unless otherwise specified) +# - temperature measurements of the module in the test system. Ideally this would be measured under a worst case scenario that maximizes the module temperature for a given site, +# - geographic meta data including longitude and latitude, +# +# To create a weather file of your own, copy the format of the example file 'xeff_demo.csv'. This is formatted with the first row containing meta data variable names, the second row containing the corresponding values, the third row containing meteorological data headers, and all the remaining rows containing the meteorological data. +# +# To do this calculation, one should also filter the data to remove times when the sun is not shining or when snow is likely to be on the module. The recommendations and programmed defaults are to use poa_min=100 W/m² and data when the minimum ambient temperature t_amb_min=0. + +# %% +# Read the weather file +weather_file = os.path.join(DATA_DIR, "xeff_demo.csv") +xeff_weather, xeff_meta = pvdeg.weather.read(weather_file, "csv") +# Pull measured temperature and calculate theoretical insulated back module temperature and open rack module temperature +T_0, T_inf, xeff_poa = pvdeg.standards.eff_gap_parameters( + weather_df=xeff_weather, + meta=xeff_meta, + sky_model="isotropic", + temp_model="sapm", + conf_0="insulated_back_glass_polymer", + conf_inf="open_rack_glass_polymer", + wind_factor=0.33, +) +# Now calculate X_eff. +x_eff = pvdeg.standards.eff_gap( + T_0, + T_inf, + xeff_weather["module_temperature"], + xeff_weather["temp_air"], + xeff_poa["poa_global"], + x_0=6.5, + poa_min=100, + t_amb_min=0, +) +print("The effective standoff for this system is", "%.1f" % x_eff, "cm.") + +# %% [markdown] +# ## 4. Calculate $T_{98}$ for a given azimuth, tilt, and $X_{eff}$. +# +# Equation 2 can be reorganized as, +# +# $$ T_{98} = T_{98,0} -( T_{98,0}- T_{98,inf}) \left(1-e^{-\frac{x_{eff}}{x_{0}}}\right), Equation 3 $$ +# +# and used to calculate the $98^{th}$ percential temperature, $T_{98}$, for a PV system having a given effective standoff height, $X_{eff}$, for an arbitrarily oriented module. Here, $T_{98,0}$ is the $98^{th}$ percentile for an insulated-back module and $T_{98,inf}$ is the $98^{th}$ percentile for a rack-mounted module. The input parameter possibilities are the same as shown in Objective #2 above, but the example below uses the default parameters. The actual tilt [degrees], azimuth [degrees] and $X_{eff}$ [cm] can be modifed as desired. + +# %% +# This is the minimal function call using the common default settings to estimate T₉₈. +T_98 = pvdeg.standards.T98_estimate( + weather_df=WEATHER_df, meta=META, tilt=-META["latitude"], azimuth=None, x_eff=10 +) +print("The 98ᵗʰ percential temperature is estimated to be", "%.1f" % T_98, "°C.") + +# %% +# This code will calculate the temperature for an arbitrary x_eff distance. Either set of kwargs can be modified and use. +# irradiance_kwarg ={ +# "axis_tilt": None, +# "axis_azimuth": None, +# "x_eff": 10, +# "module_mount": '1_axis'} +irradiance_kwarg = { + "tilt": META["latitude"], + "azimuth": None, + "x_eff": 10, + "module_mount": "fixed", +} + +T_xeff = pvdeg.standards.x_eff_temperature_estimate( + weather_df=WEATHER_df, meta=META, **irradiance_kwarg +) + +print( + "The 98ᵗʰ percential temperature is estimated to be", + "%.1f" % np.percentile(T_xeff, 98), + "°C.", +) + +# %% [markdown] +# ## 5. Plot $X_{min}$ for all azimuth and tilt for a given $T_{98}$. +# +# The temperature of a system is affected by the orientation. This section will scan all possible tilts and azimuths calculating the minimum standoff distance for a given $T_{98}$. Similar additional factors as above can also be modified but are not included here for simplicity. The tilt_step and azimuth_step are the number of degrees for each step for the 90° and 180° tilt and azimuth spans, respectively. The default for this calculation is for $T_{98}$=70°C, the boundary between Level 0 and Level 1 requirements. The temperature model information given below is unnecessary as these are default values that would get populated automatically. However, they were included here for clarity into a standard practice as per IEC TS 63126. +# +# $$ X_{min} = -X_0 \ln\left(1-\frac{T_{98,0}-T}{ T_{98,0}- T_{98,inf}}\right), Equation 2 $$ + +# %% +# Scans through all the azimuth and tilt running the minimum standoff calculation +# Set up keyword parameters for the calculation + +kwarg_x = dict( + sky_model="isotropic", + temp_model="sapm", + conf_0="insulated_back_glass_polymer", + conf_inf="open_rack_glass_polymer", + T98=70, + x_0=6.5, + wind_factor=0.33, +) +# Run the calculation +x_azimuth_step = 10 +x_tilt_step = 10 +standoff_series = pvdeg.utilities.tilt_azimuth_scan( + weather_df=WEATHER_df, + meta=META, + tilt_step=x_tilt_step, + azimuth_step=x_azimuth_step, + func=pvdeg.standards.standoff_x, + **kwarg_x, +) + +# %% [markdown] +# The next cell creates a plot of the calculated data. Some of the things you may want to change are: +# - cmap="Spectral_r": Change to have different colors +# - plt.title : This will change the plot title. +# - figsize=(16,4) : Change the plot dimensions and/or aspect ratio. +# - vmax=None : This can be set to a numeric value to control the depth scale maximum +# - vmin=0 : This controls the minimum of the depth scale. +# - v_ticks=37 : This changes the number of vertical tick marks +# - h_ticks=10 : This changes the number of horizontal tick marks +# - Unblock the last two lines to ouput the plot as an *.png image file + +# %% +standoff_series_df = pd.DataFrame( + { + "Tilt": standoff_series[:, 0], + "Azimuth": standoff_series[:, 1], + "Xₘᵢₙ": standoff_series[:, 2], + } +) +x_fig = plt.figure(figsize=(16, 4)) +plt.title( + r"Plot of $\it{Xₘᵢₙ}$ for all orientations for $\it{T₉₈}$=" + + "%.0f" % kwarg_x["T98"] + + "°C.", + fontsize=15, + y=1.08, +) +x_fig = sns.heatmap( + standoff_series_df.pivot(index="Tilt", columns="Azimuth", values="Xₘᵢₙ"), + cbar_kws={"label": "Xₘᵢₙ", "format": "%.0f", "pad": 0.02}, + cmap="Spectral_r", + vmin=0, + vmax=None, +) + +h_ticks = 37 +x_number = math.ceil(360 / x_azimuth_step) + 1 +x_ticks = [ + (x * (360 / (h_ticks - 1)) / x_azimuth_step + 0.5) for x in range(h_ticks - 1) +] +x_labels = [("%.0f" % (360 / (h_ticks - 1) * x)) for x in range(h_ticks)] +x_ticks.append(x_number - 0.5) +x_fig.set_xticks(x_ticks) +x_fig.set_xticklabels(x_labels, rotation=90) + +v_ticks = 10 +y_number = math.ceil(90 / x_tilt_step) + 1 +y_ticks = [(x * (90 / (v_ticks - 1)) / x_tilt_step + 0.5) for x in range(v_ticks - 1)] +y_labels = [("%.0f" % (90 / (v_ticks - 1) * x)) for x in range(v_ticks)] +y_ticks.append(y_number - 0.5) +x_fig.set_yticks(y_ticks) +x_fig.set_yticklabels(y_labels, rotation=0) + +x_fig.set_xlabel("Azimuth [°]", fontsize=15, labelpad=10) +x_fig.set_ylabel("Tilt [°]", fontsize=15) +x_fig.figure.axes[-1].set_ylabel(r"$\it{Xₘᵢₙ}$ [cm]", size=15) +x_fig.invert_yaxis() + +output_folder = os.path.join( + os.path.dirname(os.path.dirname(os.getcwd())), "TEMP", "results" +) +try: + os.makedirs(output_folder) +except OSError as error: + print(error) + +plt.savefig( + os.path.join(output_folder, "Standoff_Scan.png"), bbox_inches="tight" +) # Creates an image file of the standoff plot +plt.show() + +# %% [markdown] +# ## 6. Plot $T_{98}$ for all azimuth and tilt for a given $X_{eff}$. +# +# The temperature of a system is affected by the orientation and the effective standoff, $X_{eff}$, of the system. This section will scan all possible tilts and azimuths calculating the $T_{98}$ for a given $X_{eff}$. As above, additional factors can be modified but are not included here for simplicity. The tilt_step and azimuth_step are the number of degrees for each step for the 90° and 180° tilt and azimuth spans, respectively. The default for this calculation is for $X_{eff}$=10 cm, a common effective standoff distance on a rooftop system. A value of $X_{eff}$=None will run the calculations for an open rack system and $X_{eff}$=0 for an insulated-back system. + +# %% +# Scans through all the azimuth and tilt running the 98ᵗʰ percentile temperature calculation. +# Set up keyword parameters for the calculation +kwarg_T = dict( + sky_model="isotropic", + temp_model="sapm", + conf_0="insulated_back_glass_polymer", + conf_inf="open_rack_glass_polymer", + x_eff=5, + x_0=6.5, + wind_factor=0.33, +) +# Run the calculation +T_azimuth_step = 10 +T_tilt_step = 10 +T98_series = pvdeg.utilities.tilt_azimuth_scan( + weather_df=WEATHER_df, + meta=META, + tilt_step=T_tilt_step, + azimuth_step=T_azimuth_step, + func=pvdeg.standards.T98_estimate, + **kwarg_T, +) + +# %% [markdown] +# The next cell creates a plot of the calculated data. Some of the things you may want to change are: +# - cmap="Spectral_r": Change to have different colors +# - plt.title : This will change the plot title. +# - figsize=(16,4) : Change the plot dimensions and/or aspect ratio. +# - vmax=None : This can be set to a numeric value to control the depth scale maximum +# - vmin=None : This controls the minimum of the depth scale. +# - v_ticks=37 : This changes the number of vertical tick marks +# - h_ticks=10 : This changes the number of horizontal tick marks +# - Unblock the last two lines to ouput the plot as an *.png image file + +# %% +# This produces the plot of the data +T98_series_df = pd.DataFrame( + {"Tilt": T98_series[:, 0], "Azimuth": T98_series[:, 1], "T₉₈": T98_series[:, 2]} +) +T98_fig = plt.figure(figsize=(16, 4)) +if kwarg_T["x_eff"] == None: + plt.title( + r"Plot of $\it{T₉₈}$ for all orientations for an open-rack mounting.", + fontsize=15, + y=1.08, + ) +else: + plt.title( + r"Plot of $\it{T₉₈}$ for all orientations for $X_{eff}$=" + + "%.0f" % kwarg_T["x_eff"] + + " cm.", + fontsize=15, + y=1.08, + ) +T98_fig = sns.heatmap( + T98_series_df.pivot(index="Tilt", columns="Azimuth", values="T₉₈"), + cbar_kws={"label": "Xₘᵢₙ", "format": "%.0f", "pad": 0.02}, + cmap="Spectral_r", + vmin=None, + vmax=None, +) + +h_ticks = 37 +x_number = math.ceil(360 / T_azimuth_step) + 1 +x_ticks = [ + (x * (360 / (h_ticks - 1)) / T_azimuth_step + 0.5) for x in range(h_ticks - 1) +] +x_labels = [("%.0f" % (360 / (h_ticks - 1) * x)) for x in range(h_ticks)] +x_ticks.append(x_number - 0.5) +T98_fig.set_xticks(x_ticks) +T98_fig.set_xticklabels(x_labels, rotation=90) + +v_ticks = 10 +y_number = math.ceil(90 / T_tilt_step) + 1 +y_ticks = [(x * (90 / (v_ticks - 1)) / T_tilt_step + 0.5) for x in range(v_ticks - 1)] +y_labels = [("%.0f" % (90 / (v_ticks - 1) * x)) for x in range(v_ticks)] +y_ticks.append(y_number - 0.5) +T98_fig.set_yticks(y_ticks) +T98_fig.set_yticklabels(y_labels, rotation=0) + +T98_fig.set_xlabel("Azimuth [°]", fontsize=15, labelpad=10) +T98_fig.set_ylabel("Tilt [°]", fontsize=15) +T98_fig.figure.axes[-1].set_ylabel(r"$\it{T₉₈}$ [°C]", size=15) +T98_fig.invert_yaxis() + +plt.savefig( + os.path.join(output_folder, "T98_Scan.png"), bbox_inches="tight" +) # Creates an image file of the standoff plot +plt.show(T98_fig) + +# %% [markdown] +# ## 7. Plot $X_{min}$ for a $T_{98}$, and plot $T_{98}$ for a given region. +# +# This last Objective is much more complicated and is set up to utilize acess to a lot of computational power to run many sites simultaneously to create a regional map of standoff distance. +# For more in-depth instructions on doing this, look at the tutorial "Scenario - Geospatial.ipynb" here in PVDeg. +# +# Step #1: Create an object, "geospatial_standoff_scenario" to be used to run the computations. + +# %% +geospatial_standoff_scenario = pvdeg.GeospatialScenario( + name="standoff geospatial", + geospatial=True, +) + +# %% [markdown] +# Step #2: Identifies a subset of locations from the database to run the computations. +# Specifically all are from the NSRDB. + +# %% +geospatial_standoff_scenario.addLocation( + state="Colorado", county="Summit" +) # Identifies a subset of locations from the database to run the computations. Specifically all are from the NSRDB. + +# %% [markdown] +# Step #3: indicate which function will be run. Here the default is the standoff calculation, but it could be any other function with a key word argument dictionary. +# Here the 98th percential temperature is defined as 70C, but any arbitrary value can be specified. + +# %% +geospatial_standoff_scenario.addJob( + func=pvdeg.standards.standoff, func_params={"T98": 70} +) + +# %% [markdown] +# Step #4: Run the scenario + +# %% +geospatial_standoff_scenario.run() + +# %% [markdown] +# Step #5: Create a plot of the standoff calculation. + +# %% +geospatial_standoff_scenario.plot_world("x") + +# %% +geospatial_standoff_scenario.plot_world("T98_inf") + +# %% [markdown] +# ## 8. Save data outputs. +# +# This cell contains a number of pre-scripted commands for exporting and saving data. The code to save plots is located after the plot creation and is blocked by default. First check that the output folder exists, then unblock the code for data you would like to save. + +# %% +print("Your results will be stored in %s" % output_folder) +print("The folder must already exist or the file will not be created") + +pvdeg.weather.write( + data_df=WEATHER_df, + metadata=META, + savefile=os.path.join(output_folder, "WeatherFile.csv"), +) # Writes the meterological data to an *.csv file. + +pd.DataFrame(standoff_series_df).to_csv( + os.path.join(output_folder, "Standoff_Scan.csv") +) # Writes a file with the Tilt and Azimuth scan calculations of standoff. + +pd.DataFrame(T98_series_df).to_csv( + os.path.join(output_folder, "T98_Scan.csv") +) # Writes a file with the Tilt and Azimuth scan calculations of T98. diff --git a/tutorials_and_tools/tutorials_and_tools/Custom-Functions-Nopython.ipynb b/tutorials/05_advanced/01_custom_functions_nopython.ipynb similarity index 99% rename from tutorials_and_tools/tutorials_and_tools/Custom-Functions-Nopython.ipynb rename to tutorials/05_advanced/01_custom_functions_nopython.ipynb index ee4f6ac0d..737fb0c5f 100644 --- a/tutorials_and_tools/tutorials_and_tools/Custom-Functions-Nopython.ipynb +++ b/tutorials/05_advanced/01_custom_functions_nopython.ipynb @@ -115,11 +115,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Define Custom Expressions from Latex or \n", + "### Define Custom Expressions from Latex or\n", "\n", "We will use an altered arrhenius equation with an irrandiance relation (ignore the fact that this exists in pvdeg already).\n", "\n", - "$R_{D} = R_{0}I^{X} e^{\\frac{-{Ea}}{kT}}$ *ea is one variable so this may present some issues* \n", + "$R_{D} = R_{0}I^{X} e^{\\frac{-{Ea}}{kT}}$ *ea is one variable so this may present some issues*\n", "the raw latex looks like this `R_{0}I^{X} e^{\\frac{-{Ea}}{kT}}`" ] }, @@ -166,7 +166,7 @@ "source": [ "### Calculating Degradation Expression\n", "\n", - "Generally more processing will have to happen outside of these functions than built in pvdeg functions. \n", + "Generally more processing will have to happen outside of these functions than built in pvdeg functions.\n", "Here we are defining our arguments and correcting units. When trying to calculate using timeseries we will pass `pandas.Series` objects to the arguments.\n", "\n", "Results should be strictly scrutinized to make sure the calculation is iterating over your series correctly. It will generally be easier to write python code\n", @@ -276,21 +276,21 @@ "leakage current\n", "$I_{leak} = \\frac{V_{bias}}{R_{enc}}$\n", "\n", - "$I_{leak}$, leakage current \n", - "${V_{bias}}$, potential difference between cells and frame \n", - "${R_{enc}}$, resistance of the encapsulant \n", + "$I_{leak}$, leakage current\n", + "${V_{bias}}$, potential difference between cells and frame\n", + "${R_{enc}}$, resistance of the encapsulant\n", "\n", "electric field\n", - "$E = \\frac{V_{bias}}{d}$ \n", + "$E = \\frac{V_{bias}}{d}$\n", "\n", - "$E$, electric field \n", - "$d$, thickness of encapsulant \n", + "$E$, electric field\n", + "$d$, thickness of encapsulant\n", "\n", "degradation rage\n", - "$D = k_{D} * E * I{leak}$ \n", + "$D = k_{D} * E * I{leak}$\n", "\n", - "$D$, degradation rate \n", - "$k_D$, degradation constant " + "$D$, degradation rate\n", + "$k_D$, degradation constant" ] }, { diff --git a/tutorials_and_tools/tutorials_and_tools/Pysam - Single Location.ipynb b/tutorials/05_advanced/02_pysam_single_location.ipynb similarity index 99% rename from tutorials_and_tools/tutorials_and_tools/Pysam - Single Location.ipynb rename to tutorials/05_advanced/02_pysam_single_location.ipynb index ed0eaba7d..b25fbe909 100644 --- a/tutorials_and_tools/tutorials_and_tools/Pysam - Single Location.ipynb +++ b/tutorials/05_advanced/02_pysam_single_location.ipynb @@ -388,7 +388,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "subarray1_poa_ground_front_cs \n", + "subarray1_poa_ground_front_cs\n", "subarray1_ground_rear_spatial" ] }, diff --git a/tutorials_and_tools/tutorials_and_tools/API Call Required - PYSam.ipynb b/tutorials/05_advanced/03_pysam_api.ipynb similarity index 87% rename from tutorials_and_tools/tutorials_and_tools/API Call Required - PYSam.ipynb rename to tutorials/05_advanced/03_pysam_api.ipynb index 7a9b03803..9aa84a07e 100644 --- a/tutorials_and_tools/tutorials_and_tools/API Call Required - PYSam.ipynb +++ b/tutorials/05_advanced/03_pysam_api.ipynb @@ -80,7 +80,9 @@ { "cell_type": "code", "execution_count": null, - "metadata": {}, + "metadata": { + "lines_to_next_cell": 2 + }, "outputs": [], "source": [ "GEO_META = pd.read_csv(os.path.join(TEST_DATA_DIR, \"summit-meta.csv\"), index_col=0)\n", @@ -89,7 +91,9 @@ }, { "cell_type": "markdown", - "metadata": {}, + "metadata": { + "lines_to_next_cell": 2 + }, "source": [ "### Local Geospatial - PySAM Integration\n", "\n", @@ -103,12 +107,14 @@ "outputs": [], "source": [ "# this is just a wrapper to grab the result we want\n", - "def pysam_annual_energy(weather_df, meta, pv_model=\"pysamv1\", pv_model_default=\"FlatPlatePVCommercial\"):\n", + "def pysam_annual_energy(\n", + " weather_df, meta, pv_model=\"pysamv1\", pv_model_default=\"FlatPlatePVCommercial\"\n", + "):\n", " # Drop the gid column if present (added by geospatial conversion)\n", - " weather_df = weather_df.drop(columns=['gid'])\n", + " weather_df = weather_df.drop(columns=[\"gid\"])\n", "\n", " # Resample half-hourly data to hourly (PySAM expects hourly)\n", - " weather_df = weather_df.resample('h').mean()\n", + " weather_df = weather_df.resample(\"h\").mean()\n", "\n", " results = pvdeg.pysam.pysam(\n", " weather_df=weather_df,\n", @@ -169,11 +175,9 @@ "metadata": {}, "outputs": [], "source": [ - "weather_db = 'PSM4'\n", + "weather_db = \"PSM4\"\n", "weather_id = (25.783388, -80.189029)\n", - "weather_arg = {'api_key': 'DEMO_KEY',\n", - " 'email': 'user@mail.com',\n", - " 'map_variables': True}\n", + "weather_arg = {\"api_key\": \"DEMO_KEY\", \"email\": \"user@mail.com\", \"map_variables\": True}\n", "\n", "weather_df, meta = pvdeg.weather.get(weather_db, weather_id, **weather_arg)" ] @@ -250,15 +254,19 @@ "outputs": [], "source": [ "# Check weather data time dimension compatibility\n", - "if 'time' in GEO_WEATHER.dims:\n", - " times = pd.to_datetime(GEO_WEATHER['time'].values)\n", + "if \"time\" in GEO_WEATHER.dims:\n", + " times = pd.to_datetime(GEO_WEATHER[\"time\"].values)\n", " years = times.year\n", " unique_years = set(years)\n", " if len(unique_years) != 1:\n", - " print(f\"Warning: Weather data contains multiple years: {unique_years}. Pysam expects a single year.\")\n", + " print(\n", + " f\"Warning: Weather data contains multiple years: {unique_years}. Pysam expects a single year.\"\n", + " )\n", " hours_per_year = times.size / len(unique_years)\n", " if hours_per_year not in [8760, 8784]:\n", - " print(f\"Warning: Unexpected number of timesteps per year: {hours_per_year}. Expected 8760 or 8784.\")\n", + " print(\n", + " f\"Warning: Unexpected number of timesteps per year: {hours_per_year}. Expected 8760 or 8784.\"\n", + " )\n", "else:\n", " print(\"Warning: No 'time' dimension found in weather data. Pysam may fail.\")" ] diff --git a/tutorials_and_tools/tutorials_and_tools/API Call Required - load_nsrdb_distributed.ipynb b/tutorials/05_advanced/04_nsrdb_distributed_api.ipynb similarity index 99% rename from tutorials_and_tools/tutorials_and_tools/API Call Required - load_nsrdb_distributed.ipynb rename to tutorials/05_advanced/04_nsrdb_distributed_api.ipynb index 86213e039..f0e6fd3fa 100644 --- a/tutorials_and_tools/tutorials_and_tools/API Call Required - load_nsrdb_distributed.ipynb +++ b/tutorials/05_advanced/04_nsrdb_distributed_api.ipynb @@ -132,7 +132,7 @@ "source": [ "### Viewing Results\n", "\n", - "Same as in the other tutorial, our results are stored in an xarray dataset with a dask backend so you will have to use `.compute()` on the dataset to inspect the individual values of the dask arrays. \n", + "Same as in the other tutorial, our results are stored in an xarray dataset with a dask backend so you will have to use `.compute()` on the dataset to inspect the individual values of the dask arrays.\n", "\n", "Click on the `Data variables` dropdown to expand the dataset viewer." ] @@ -1885,11 +1885,11 @@ "source": [ "### Spot Check\n", "\n", - "We can plot the entire TMY air_temperature to check that our data has loaded correctly. \n", + "We can plot the entire TMY air_temperature to check that our data has loaded correctly.\n", "\n", "Explanation of steps\n", "\n", - "geo_weather is our weather xarray dataset. We can index into the first entry at the 0th index by using isel (index-select). This will grab the data from the first gid. Then we pick the air temperature attribute. This can be replaced with bracket notation so `.temp_air` becomes `[\"temp_air\"]. \n", + "geo_weather is our weather xarray dataset. We can index into the first entry at the 0th index by using isel (index-select). This will grab the data from the first gid. Then we pick the air temperature attribute. This can be replaced with bracket notation so `.temp_air` becomes `[\"temp_air\"].\n", "\n", "This selects a single array from the dataset that is labeled as \"temp_air\". This array will be a dask array so the values will be stored out of memory, we would have to load it using `.compute()` to directly inspect it but when plotting with matplotlib it will load the array for us." ] diff --git a/tutorials_and_tools/tutorials_and_tools/Removed store.py Required - load_pvgis_distributed.ipynb b/tutorials/05_advanced/05_pvgis_distributed.ipynb similarity index 97% rename from tutorials_and_tools/tutorials_and_tools/Removed store.py Required - load_pvgis_distributed.ipynb rename to tutorials/05_advanced/05_pvgis_distributed.ipynb index 3c4b740c5..01785fb41 100644 --- a/tutorials_and_tools/tutorials_and_tools/Removed store.py Required - load_pvgis_distributed.ipynb +++ b/tutorials/05_advanced/05_pvgis_distributed.ipynb @@ -57,7 +57,7 @@ "source": [ "### Dask\n", "\n", - "We are using dask to parallelize the weather API calls. We need to start a dask client as shown below. This can also be done with `pvdeg.geospatial.start_dask`. \n", + "We are using dask to parallelize the weather API calls. We need to start a dask client as shown below. This can also be done with `pvdeg.geospatial.start_dask`.\n", "\n", "Click on the link to open a localhost dashboard for the dask client. This will allow us to see what happens when we run functions using dask." ] @@ -86,12 +86,12 @@ "source": [ "## Requesting Weather\n", "\n", - "Now that we have our coordinates, and dask client initialized we can make our parallel api calls using `pvdeg.weather.weather_distributed`. \n", + "Now that we have our coordinates, and dask client initialized we can make our parallel api calls using `pvdeg.weather.weather_distributed`.\n", "\n", "We want data from PVGIS so we will use that as the database. For more information about the databases look at the `pvdeg.weather.get` docstring. We will pass in the coordinates list which is a list of tuple pairs for the latitude and longiutudes to request weather at.\n", "\n", - "`weather_ds` is the collected weather dataset from the API calls to PVGIS. \n", - "`meta_df` is the collected meta dataframe from the API calls to PVGIS. \n", + "`weather_ds` is the collected weather dataset from the API calls to PVGIS.\n", + "`meta_df` is the collected meta dataframe from the API calls to PVGIS.\n", "`failed_gids` will be a list of the failed indexes from the input coordinates list that we could not get weather from using PVGIS. These may have failed randomly so it is worth trying again." ] }, @@ -142,10 +142,10 @@ "\n", "We can use `pvdeg.store.store` to save geospatial data to our living dataset in the common form provided by `pvdeg`. The data is stored in various groups and subfolders but they will be arranged based on the *source* and *periodicity*.\n", "\n", - "For example: \n", - " - Hourly PVGIS data will be saved to a group called \"PVGIS-1hr\" \n", - " - 30 minute PVGIS to a group called \"PVGIS-30min\" \n", - " - 15 minute PVGIS will be saved to a group called \"PVGIS-15min\" " + "For example:\n", + " - Hourly PVGIS data will be saved to a group called \"PVGIS-1hr\"\n", + " - 30 minute PVGIS to a group called \"PVGIS-30min\"\n", + " - 15 minute PVGIS will be saved to a group called \"PVGIS-15min\"" ] }, { @@ -163,12 +163,12 @@ "source": [ "## Load\n", "\n", - "`PVDeg` makes use of `dask` to handle larger than memory datasets. Trandionally, this was only useful in our HPC environment but as your local database grows overtime, it will eventually surpass the limits of your computer's volatile memory. Additionally, `dask` allows us to parallelize geospatial calculations via `pvdeg.geospatial.analysis`. This ability can be utilized on local machines or HPC clusters alike. \n", + "`PVDeg` makes use of `dask` to handle larger than memory datasets. Trandionally, this was only useful in our HPC environment but as your local database grows overtime, it will eventually surpass the limits of your computer's volatile memory. Additionally, `dask` allows us to parallelize geospatial calculations via `pvdeg.geospatial.analysis`. This ability can be utilized on local machines or HPC clusters alike.\n", "\n", - "`PVDeg` implements the ability to access your local living database via `pvdeg.store.get`. This method takes a string called `group`. Groups are created automatically in your store when you save data using `pvdeg.store.store`. As described in the `pvdeg.store.store` docstring and the *Store* section above, NSRDB will follow a similar scheme but it not implemented yet. \n", - " - Hourly PVGIS data will be saved to a group called \"PVGIS-1hr\" \n", - " - 30 minute PVGIS to a group called \"PVGIS-30min\" \n", - " - 15 minute PVGIS will be saved to a group called \"PVGIS-15min\" " + "`PVDeg` implements the ability to access your local living database via `pvdeg.store.get`. This method takes a string called `group`. Groups are created automatically in your store when you save data using `pvdeg.store.store`. As described in the `pvdeg.store.store` docstring and the *Store* section above, NSRDB will follow a similar scheme but it not implemented yet.\n", + " - Hourly PVGIS data will be saved to a group called \"PVGIS-1hr\"\n", + " - 30 minute PVGIS to a group called \"PVGIS-30min\"\n", + " - 15 minute PVGIS will be saved to a group called \"PVGIS-15min\"" ] }, { diff --git a/tutorials/05_advanced/README.md b/tutorials/05_advanced/README.md new file mode 100644 index 000000000..957ecd93f --- /dev/null +++ b/tutorials/05_advanced/README.md @@ -0,0 +1,34 @@ +# Advanced Topics + +Advanced tutorials covering custom functions, API integrations, and specialized workflows. + +## Tutorials + +### General Advanced Topics +- **custom_functions_nopython.ipynb** - Creating custom functions with numba/nopython mode +- **pysam_single_location.ipynb** - Using PySAM for single location analysis + +### API Required Tutorials +The following tutorials require API access to external data sources: + +- **pysam_api.ipynb** - PySAM integration with API calls (requires NSRDB API key) +- **nsrdb_distributed_api.ipynb** - Distributed NSRDB data loading (requires NSRDB API key) + +### Special Requirements +- **pvgis_distributed.ipynb** - PVGIS distributed data access (requires specific dependencies) + +## API Access + +âš ï¸ **Note**: Several tutorials require API keys: + +- **NSRDB API Key**: Required for `pysam_api.ipynb` and `nsrdb_distributed_api.ipynb` + - Get your free API key at: https://developer.nrel.gov/signup/ + - Rate limits apply for free tier + +## Topics Covered + +- Custom function development with performance optimization +- PySAM (Python wrapper for System Advisor Model) +- Weather data API integration +- Distributed data processing +- Performance optimization techniques diff --git a/tutorials/05_advanced/scripts/01_custom_functions_nopython.py b/tutorials/05_advanced/scripts/01_custom_functions_nopython.py new file mode 100644 index 000000000..2fb4148e6 --- /dev/null +++ b/tutorials/05_advanced/scripts/01_custom_functions_nopython.py @@ -0,0 +1,152 @@ +# %% +import numpy as np +import sympy as sp +import matplotlib.pyplot as plt +import pvdeg + +# %% [markdown] +# ### Grabbing Weather Data from PVGIS +# +# Use pvdeg to make an API call to PVGIS to collect location and weather data for Manhattan, NYC. + +# %% +weather_df, meta_dict = pvdeg.weather.get( + database="PVGIS", + id=(40.776676, -73.971321), # manhattan (latitude, longitude) +) + +# %% [markdown] +# ### Calculating Temperature and Irradiance +# +# Use pvdeg to calculate timeseries temperature for a theoretical module from the previous metorological data. +# +# *Update this call after scenario has been merged: dev_scenario_geospatial->development->dev_symbolic* + +# %% +module_temps = pvdeg.temperature.module( + weather_df=weather_df, meta=meta_dict, conf="open_rack_glass_glass" +) + +poa_irradiance = pvdeg.spectral.poa_irradiance(weather_df=weather_df, meta=meta_dict) + +plt.figure(figsize=(10, 6)) +plt.subplot(1, 2, 1) +plt.plot( + module_temps.values +) # plotting the values in order because we are using tmy data so the years are not consistent within our data +plt.title("TMY Module Temperature, Manhattan") +plt.subplot(1, 2, 2) +plt.plot(poa_irradiance.values) +plt.legend(poa_irradiance.columns) +plt.title("TML Module Irradiance, Manhattan") +plt.show() + +# %% [markdown] +# ### Define Custom Expressions from Latex or +# +# We will use an altered arrhenius equation with an irrandiance relation (ignore the fact that this exists in pvdeg already). +# +# $R_{D} = R_{0}I^{X} e^{\frac{-{Ea}}{kT}}$ *ea is one variable so this may present some issues* +# the raw latex looks like this `R_{0}I^{X} e^{\frac{-{Ea}}{kT}}` + +# %% +lnR_0, I, X, Ea, k, T = sp.symbols("lnR_0 I X Ea k T") + +ln_R_D_expr = ( + lnR_0 * I**X * sp.exp((-Ea) / (k * T)) +) # python exponentiation is ** rather than ^ + +# viewing output +ln_R_D_expr + +# %% [markdown] +# ### Calculating Degradation Expression +# +# Generally more processing will have to happen outside of these functions than built in pvdeg functions. +# Here we are defining our arguments and correcting units. When trying to calculate using timeseries we will pass `pandas.Series` objects to the arguments. +# +# Results should be strictly scrutinized to make sure the calculation is iterating over your series correctly. It will generally be easier to write python code +# for more complex functions. This is about as complex as we will be able to get using arbitrary symbolic expressions if looping over timeseries data is required. + +# %% +module_temps_k = module_temps + 273.15 # convert C -> K + +poa_global = poa_irradiance[ + "poa_global" +] # take only the global irradiance series from the total irradiance dataframe +poa_global_kw = poa_global / 1000 # [W/m^2] -> [kW/m^2] + +# %% [markdown] +# ### This is quite slow + +# %% +values_kwarg = { + "Ea": 62.08, # activation energy, [kJ/mol] + "k": 8.31446e-3, # boltzmans constant, [kJ/(mol * K)] + "T": module_temps_k, # module temperature, [K] + "I": poa_global_kw, # module plane of array irradiance, [W/m2] + "X": 0.0341, # irradiance relation, [unitless] + "lnR_0": 13.72, # prefactor degradation [ln(%/h)] +} + +res = pvdeg.symbolic.calc_kwarg_timeseries(expr=ln_R_D_expr, kwarg=values_kwarg) + +# %% [markdown] +# ### Total degradation +# +# To calculate accumulated degradation, we can sum each of the substep values and convert to log scale (need to do this because prefactor was in log scale). + +# %% +np.log10(res.sum()) + +# %% [markdown] +# ## Example with Single Values + +# %% [markdown] +# leakage current +# $I_{leak} = \frac{V_{bias}}{R_{enc}}$ +# +# $I_{leak}$, leakage current +# ${V_{bias}}$, potential difference between cells and frame +# ${R_{enc}}$, resistance of the encapsulant +# +# electric field +# $E = \frac{V_{bias}}{d}$ +# +# $E$, electric field +# $d$, thickness of encapsulant +# +# degradation rage +# $D = k_{D} * E * I{leak}$ +# +# $D$, degradation rate +# $k_D$, degradation constant + +# %% +k_d, E, Vbias, Rencap, d = sp.symbols("k_d E Vbias Rencap d") + +pid = k_d * (Vbias / d) * (Vbias / Rencap) + +# %% +import pvdeg + +pid_kwarg = { + "Vbias": 1000, + "Rencap": 1e9, + "d": 0.0005, + "k_d": 1e-9, +} + +res = pvdeg.symbolic.calc_kwarg_floats(expr=pid, kwarg=pid_kwarg) + +res + +# %% [markdown] +# ### Calculate Values in a Dataframe using a symbolic expression +# +# After creating the symbolic expression in using latex with `pvdeg.symbolic.symbolic_from_latex`, feed it to the function to calculate the leakage current at each row in the dataframe. +# This expression calculation only accesses one dataframe row at a time so we cannot do any summations or windowed timeseries averiging within the call. At this point, write your own python function. If you create functions that would be useful, please email us your source code or create an issue and copy and paste your code there. If it is relevant it may be added to the package (credit will be given). + +# %% +# I_leak_expr = pid_kwarg["Vbias"] / pid_kwarg["Rencap"] +# pvdeg.symbolic.calc_df_symbolic(expr=I_leak_expr, df=values_df) diff --git a/tutorials/05_advanced/scripts/02_pysam_single_location.py b/tutorials/05_advanced/scripts/02_pysam_single_location.py new file mode 100644 index 000000000..c915b8847 --- /dev/null +++ b/tutorials/05_advanced/scripts/02_pysam_single_location.py @@ -0,0 +1,43 @@ +# %% +import pvdeg +import matplotlib.pyplot as plt +import seaborn as sns +import numpy as np + +# %% +weather, meta = pvdeg.weather.get( + database="PVGIS", id=(40.633365593159226, -73.9945801019899) +) + +# %% +out_dict = pvdeg.pysam.pysam( + weather_df=weather, + meta=meta, + pv_model="pysamv1", + pv_model_default="FlatPlatePVCommercial", +) +for key in sorted(out_dict.keys()): + print(key) + +# %% +for key, item in out_dict.items(): + if isinstance(item, tuple): + print(key) + +# %% [markdown] +# subarray1_poa_ground_front_cs +# subarray1_ground_rear_spatial + +# %% +x = out_dict["subarray1_ground_rear_spatial"][ + 0 +] # these are the distances where the calculations are done + +data = out_dict["subarray1_ground_rear_spatial"][1:] +row = data[15] + +# %% +row_arr = np.array(row) +plot = sns.heatmap([row_arr], square=True, cmap="magma") + +plt.show() diff --git a/tutorials/05_advanced/scripts/03_pysam_api.py b/tutorials/05_advanced/scripts/03_pysam_api.py new file mode 100644 index 000000000..61aab4393 --- /dev/null +++ b/tutorials/05_advanced/scripts/03_pysam_api.py @@ -0,0 +1,161 @@ +# %% +import pvdeg +from pvdeg import TEST_DATA_DIR +import pandas as pd +import os +import pickle +import xarray as xr + +# %% [markdown] +# ## Pysam +# +# rundown on pysam... +# +# https://nrel-pysam.readthedocs.io/en/main/inputs-from-sam.html + +# %% [markdown] +# ### PVGIS +# +# Only works with PVGIS + +# %% +weather_pvgis, meta_pvgis = pvdeg.weather.get( + database="PVGIS", id=(25.783388, -81.189029) +) + +# %% +results = pvdeg.pysam.pysam( + weather_df=weather_pvgis, + meta=meta_pvgis, + pv_model="pysamv1", + pv_model_default="FlatPlatePVCommercial", +) + +# %% +results["annual_energy"] + +# %% [markdown] +# ### Local Geospatial +# +# Using PySAM with geospatial data requires proper formatting of the weather DataFrame to match PySAM's expectations. + +# %% +GEO_META = pd.read_csv(os.path.join(TEST_DATA_DIR, "summit-meta.csv"), index_col=0) +GEO_WEATHER = xr.open_dataset(os.path.join(TEST_DATA_DIR, "summit-weather.nc")) + + +# %% [markdown] +# ### Local Geospatial - PySAM Integration +# +# The geospatial weather data is in half-hourly format (17520 timesteps) but PySAM expects hourly data (8760 timesteps). The wrapper function below handles this conversion automatically. + + +# %% +# this is just a wrapper to grab the result we want +def pysam_annual_energy( + weather_df, meta, pv_model="pysamv1", pv_model_default="FlatPlatePVCommercial" +): + # Drop the gid column if present (added by geospatial conversion) + weather_df = weather_df.drop(columns=["gid"]) + + # Resample half-hourly data to hourly (PySAM expects hourly) + weather_df = weather_df.resample("h").mean() + + results = pvdeg.pysam.pysam( + weather_df=weather_df, + meta=meta, + pv_model=pv_model, + pv_model_default=pv_model_default, + ) + + return results["annual_energy"] + + +# %% +# Select a small subset (2 gids) for demonstration to avoid timeouts +# PySAM calculations are computationally expensive +subset_gids = GEO_META.index[:2] +GEO_META_SUB = GEO_META.loc[subset_gids] +GEO_WEATHER_SUB = GEO_WEATHER.sel(gid=subset_gids) + +template = pvdeg.geospatial.output_template( + ds_gids=GEO_WEATHER_SUB, + shapes={ + "Annual Energy": ("gid",), + }, +) + +geo_res = pvdeg.geospatial.analysis( + weather_ds=GEO_WEATHER_SUB, + meta_df=GEO_META_SUB, + func=pysam_annual_energy, + template=template, +) + +# %% +geo_res + +# %% [markdown] +# ## NSRDB API + +# %% +weather_db = "PSM4" +weather_id = (25.783388, -80.189029) +weather_arg = {"api_key": "DEMO_KEY", "email": "user@mail.com", "map_variables": True} + +weather_df, meta = pvdeg.weather.get(weather_db, weather_id, **weather_arg) + +# %% [markdown] +# ### Geospatial Scenario + +# %% +location_grabber = pvdeg.GeospatialScenario() + +location_grabber.addLocation(country="United States", downsample_factor=80) + +# %% +location_grabber.plot_coords() + +# %% +geo_weather, geo_meta = location_grabber.geospatial_data + +# Select a small subset (2 gids) for demonstration to avoid timeouts +# PySAM calculations are computationally expensive +subset_gids = geo_meta.index[:2] +geo_meta_sub = geo_meta.loc[subset_gids] +geo_weather_sub = geo_weather.sel(gid=subset_gids) + +template = pvdeg.geospatial.output_template( + ds_gids=geo_weather_sub, + shapes={ + "pysam_annual_energy": ("gid",), + }, +) + +geo_res = pvdeg.geospatial.analysis( + weather_ds=geo_weather_sub, + meta_df=geo_meta_sub, + func=pysam_annual_energy, # using wrapper from before + template=template, +) + +# %% +pvdeg.geospatial.plot_sparse_analysis(geo_res, data_var="pysam_annual_energy") + +# %% +# Check weather data time dimension compatibility +if "time" in GEO_WEATHER.dims: + times = pd.to_datetime(GEO_WEATHER["time"].values) + years = times.year + unique_years = set(years) + if len(unique_years) != 1: + print( + f"Warning: Weather data contains multiple years: {unique_years}. Pysam expects a single year." + ) + hours_per_year = times.size / len(unique_years) + if hours_per_year not in [8760, 8784]: + print( + f"Warning: Unexpected number of timesteps per year: {hours_per_year}. Expected 8760 or 8784." + ) +else: + print("Warning: No 'time' dimension found in weather data. Pysam may fail.") diff --git a/tutorials/05_advanced/scripts/04_nsrdb_distributed_api.py b/tutorials/05_advanced/scripts/04_nsrdb_distributed_api.py new file mode 100644 index 000000000..aca201329 --- /dev/null +++ b/tutorials/05_advanced/scripts/04_nsrdb_distributed_api.py @@ -0,0 +1,91 @@ +# %% +from dask.distributed import LocalCluster, Client +from dotenv import load_dotenv +import pvdeg +import os + +# %% [markdown] +# ### Setting Up +# +# As in [load_pvgis_distributed.ipynb](./load_pvgis_distributed.ipynb) we need to get ready to make our parallelized API calls. The notebook linked here goes through the process in more detail but we need to import our API key and email. This cell will not work for you unless you replace the `api_key` and `email` with your personal NSRDB api keys. [REQUEST A KEY](https://developer.nrel.gov/signup/). +# +# We also need to initalize a dask client. `pvdeg.weather.weather_distributed` will not work without it. It will fail silently and not populate and of the results in the resulting `weather_ds` called `geo_weather` in the example below. It is hard to recognize that this has occured so be careful. Make sure to initialize a dask client first. Visiting the link takes you to a daskboard that shows what dask is doing. + +# %% +load_dotenv() + +### REPLACE WITH YOUR API KEY AND EMAIL ### +api_key = "DEMO_KEY" +email = "user@mail.com" +########################################### + +workers = 4 + +cluster = LocalCluster( + n_workers=workers, + processes=True, +) + +client = Client(cluster) + +print("Daskboard link") +print(client.dashboard_link) + +# %% [markdown] +# **Note on .env file:** Create a file named `.env` in your project root directory (`c:\Users\rdaxini\Documents\GitHub\PVDegradationTools_NREL\`) with the following content: +# ``` +# api_key=YOUR_NREL_API_KEY +# email=YOUR_EMAIL_ADDRESS +# ``` +# Replace `YOUR_NREL_API_KEY` and `YOUR_EMAIL_ADDRESS` with your actual NREL developer credentials. + +# %% [markdown] +# ## Requesting Weather +# +# As with the other script [load_pvgis_distributed.ipynb](./load_pvgis_distributed.ipynb). We will create a list of tuple (latitude, longitude) pairs and call the function on all of them at once. failed will represent a list of failed gids, unique location ID's that correspond to points in space on the NSRDB. These are different than on PVGIS where they are arbitrary indexes that do NOT correspond to a spatial location on earth. +# +# We will request "PSM4" data from the Physical Solar Model that represents a typical meteorological year (TMY) from the NSRDB. We will have to supply the api key and email from above here. Refer to the linked script to see this in further detail. The only difference between the scripts, lies in the NSRDB/PSM4 data requiring Api keys. + +# %% +coords = [ + (25.783388, -80.189029), + (24.783388, -80.189029), +] + +geo_weather, geo_meta, failed = pvdeg.weather.weather_distributed( + database="PSM4", coords=coords, api_key=api_key, email=email +) + +# %% [markdown] +# ### Viewing Results +# +# Same as in the other tutorial, our results are stored in an xarray dataset with a dask backend so you will have to use `.compute()` on the dataset to inspect the individual values of the dask arrays. +# +# Click on the `Data variables` dropdown to expand the dataset viewer. + +# %% +geo_weather + +# %% +geo_weather.compute() + +# %% [markdown] +# ### Spot Check +# +# We can plot the entire TMY air_temperature to check that our data has loaded correctly. +# +# Explanation of steps +# +# geo_weather is our weather xarray dataset. We can index into the first entry at the 0th index by using isel (index-select). This will grab the data from the first gid. Then we pick the air temperature attribute. This can be replaced with bracket notation so `.temp_air` becomes `["temp_air"]. +# +# This selects a single array from the dataset that is labeled as "temp_air". This array will be a dask array so the values will be stored out of memory, we would have to load it using `.compute()` to directly inspect it but when plotting with matplotlib it will load the array for us. + +# %% +import matplotlib.pyplot as plt + +plt.plot(geo_weather.isel(gid=0).temp_air) + +# %% [markdown] +# ### Next Steps +# +# Now we have data ready to use for geospatial calculations. This is shown in the other distributed script [load_pvgis_distributed.ipynb](./load_pvgis_distributed.ipynb). You can also see how to do this in [Geospatial Templates.ipynb](../tutorials_and_tools/tutorials_and_tools/Geospatial%20Templates.ipynb) diff --git a/tutorials/05_advanced/scripts/05_pvgis_distributed.py b/tutorials/05_advanced/scripts/05_pvgis_distributed.py new file mode 100644 index 000000000..f22e4bf3c --- /dev/null +++ b/tutorials/05_advanced/scripts/05_pvgis_distributed.py @@ -0,0 +1,242 @@ +# %% +import pvdeg +from global_land_mask import globe +import matplotlib.pyplot as plt +import numpy as np +from dask.distributed import LocalCluster, Client + +# %% [markdown] +# ### Creating Coordinates List +# +# Lets Generate a Grid of Latitude and Longitude Coordinates over the UK. + +# %% +# decrease the arange step size for more fine resolution +# increase the arange step size for increased granularity +lon_UK = np.arange(-10.5, 1.76, 1) +lat_UK = np.arange(49.95, 60, 2) +lon_grid_UK, lat_grid_UK = np.meshgrid(lon_UK, lat_UK) +land_UK = globe.is_land(lat_grid_UK, lon_grid_UK) + +lon_land_UK = lon_grid_UK[land_UK] +lat_land_UK = lat_grid_UK[land_UK] + +lon_Scan = np.arange(-10.5, 31.6, 0.3) +lat_Scan = np.arange(60, 71.2, 0.3) +lon_grid_Scan, lat_grid_Scan = np.meshgrid(lon_Scan, lat_Scan) +land_Scan = globe.is_land(lat_grid_Scan, lon_grid_Scan) + +lon_land_Scan = lon_grid_Scan[land_Scan] +lat_land_Scan = lat_grid_Scan[land_Scan] + +coords = list( + zip(lat_land_UK, lon_land_UK) +) # easiest way to make a list of the right shape + +# %% [markdown] +# ### Dask +# +# We are using dask to parallelize the weather API calls. We need to start a dask client as shown below. This can also be done with `pvdeg.geospatial.start_dask`. +# +# Click on the link to open a localhost dashboard for the dask client. This will allow us to see what happens when we run functions using dask. + +# %% +workers = 4 + +cluster = LocalCluster( + n_workers=workers, + processes=True, +) + +client = Client(cluster) + +print(client.dashboard_link) + +# %% [markdown] +# ## Requesting Weather +# +# Now that we have our coordinates, and dask client initialized we can make our parallel api calls using `pvdeg.weather.weather_distributed`. +# +# We want data from PVGIS so we will use that as the database. For more information about the databases look at the `pvdeg.weather.get` docstring. We will pass in the coordinates list which is a list of tuple pairs for the latitude and longiutudes to request weather at. +# +# `weather_ds` is the collected weather dataset from the API calls to PVGIS. +# `meta_df` is the collected meta dataframe from the API calls to PVGIS. +# `failed_gids` will be a list of the failed indexes from the input coordinates list that we could not get weather from using PVGIS. These may have failed randomly so it is worth trying again. + +# %% +weather_ds, meta_df, failed_gids = pvdeg.weather.weather_distributed( + database="PVGIS", coords=coords +) + +# %% [markdown] +# ### Viewing Result +# +# The result is stored in an xarray dataset with a dask array backend. This allows us to parallelize the computation/api requests but makes it a little harder to view the data. We can inspect the dataset using the following but we will not be able to inspect any values. +# +# ``` +# weather_ds +# ``` +# +# To load the values from the dask arrays we need to use `.compute()` as follows. +# + +# %% +weather_ds.compute() + +# %% [markdown] +# ### Saving Geospatial Data Locally +# +# The goal of `pvdeg.store` is to create a living local database of meteoroligical data that grows overtime as your geospatial data needs grow. To do this `PVDeg` will save to a folder called `PVDeg-Meteorological` your user home directory. For me this is located at `C:\Users\tford\PVDeg-Meteorological`. This directory will contain a `zarr` store, this is a popular format for storing multi-dimensional array data, not dissimilar to `h5` files. It was chosen over `h5` because `zarr` stores arrays in chunked compressed files that make access very easy without opening an entire file like `h5`. This is an oversimplification of the design process but we felt `zarr` was a better fit. +# +# ## Store +# +# We can use `pvdeg.store.store` to save geospatial data to our living dataset in the common form provided by `pvdeg`. The data is stored in various groups and subfolders but they will be arranged based on the *source* and *periodicity*. +# +# For example: +# - Hourly PVGIS data will be saved to a group called "PVGIS-1hr" +# - 30 minute PVGIS to a group called "PVGIS-30min" +# - 15 minute PVGIS will be saved to a group called "PVGIS-15min" + +# %% +pvdeg.store.store(weather_ds, meta_df) + +# %% [markdown] +# ## Load +# +# `PVDeg` makes use of `dask` to handle larger than memory datasets. Trandionally, this was only useful in our HPC environment but as your local database grows overtime, it will eventually surpass the limits of your computer's volatile memory. Additionally, `dask` allows us to parallelize geospatial calculations via `pvdeg.geospatial.analysis`. This ability can be utilized on local machines or HPC clusters alike. +# +# `PVDeg` implements the ability to access your local living database via `pvdeg.store.get`. This method takes a string called `group`. Groups are created automatically in your store when you save data using `pvdeg.store.store`. As described in the `pvdeg.store.store` docstring and the *Store* section above, NSRDB will follow a similar scheme but it not implemented yet. +# - Hourly PVGIS data will be saved to a group called "PVGIS-1hr" +# - 30 minute PVGIS to a group called "PVGIS-30min" +# - 15 minute PVGIS will be saved to a group called "PVGIS-15min" + +# %% [markdown] +# ### Load PVGIS-1hr Data +# +# The example below shows us loading the hourly tmy data from PVGIS that we gathered and saved to our zarr store in the above cells. This gets us the form of a weather xarray.Dataset (`geo_weather` in this example) and a metadata dataframe (`geo_meta` in this example). +# +# These can be treated like any other geospatial data shown in the `pvdeg` tutorials and tools or documentation. + +# %% +geo_weather, geo_meta = pvdeg.store.get(group="PVGIS-1hr") + +# %% [markdown] +# ### Inspecting the Results +# +# explain *.compute() and dask here* + +# %% +plt.plot(geo_weather.sel(gid=0).dni) + +# %% +geo_meta + +# %% [markdown] +# ## Geospatial Calculations from Locally Stored Data +# +# As shown above we can load from our `zarr` store and treat it like any other geospatial data in `pvdeg`. +# +# For demonstration we can run the analysis below to estimate effective standoff height and operating temperatures for the provided data. It may look like the `geo_res` contains empty results but that is because we did not have input data for all of the points in the input grid (think of this as a 2D plane formed between the latitude and longitude axes). Clicking on the stack of three circles in the bottom cell will expand the datavariable (like an attribute of the multidimensional array structure) and show the results. +# +# Additionally, we can interpolate and plot the results. + +# %% +func = pvdeg.standards.standoff + +template = pvdeg.geospatial.auto_template(func=func, ds_gids=geo_weather) + +geo_res = pvdeg.geospatial.analysis( + weather_ds=geo_weather, meta_df=geo_meta, func=func, template=template +) + +# %% +geo_res + +# %% [markdown] +# This plot lacks information on the area and does not include some political boundary lines. For more information on plotting look at the `Scenario - Non-uniform Mountain Downselect.ipynb` tutorial in the tutorials and tools folder. + +# %% +pvdeg.geospatial.plot_sparse_analysis_land( + geo_res, data_var="T98_0", method="nearest", resolution=10j +) + +# %% [markdown] +# ### Growing Our Living Store +# +# What if we want to download more points from Europe? We can keep our old download in the store and shelve it to look at northern Europe. +# +# We will start by generating a range of points that cover Europe. + +# %% +lon_EU = np.arange(-25.0, 51.0, 1) # Adjusted for EU longitudes +lat_EU = np.arange(34.0, 73.0, 2) # Adjusted for EU latitudes + +# Create meshgrid for EU +lon_grid_EU, lat_grid_EU = np.meshgrid(lon_EU, lat_EU) + +# Check land coverage in the EU +land_EU = globe.is_land(lat_grid_EU, lon_grid_EU) + +# Extract land coordinates in the EU +lon_land_EU = lon_grid_EU[land_EU] +lat_land_EU = lat_grid_EU[land_EU] + +# Define the Scan grid ranges +lon_Scan = np.arange(-10.5, 31.6, 0.3) +lat_Scan = np.arange(60, 71.2, 0.3) +lon_grid_Scan, lat_grid_Scan = np.meshgrid(lon_Scan, lat_Scan) +land_Scan = globe.is_land(lat_grid_Scan, lon_grid_Scan) + +lon_land_Scan = lon_grid_Scan[land_Scan] +lat_land_Scan = lat_grid_Scan[land_Scan] + +# %% +plt.scatter(lon_land_EU, lat_land_EU, c="r", s=1) + +# %% +w, m, failed_gids = pvdeg.weather.weather_distributed( + database="PVGIS", coords=[(lat_land_EU[0], lon_land_EU[0])] +) + +# %% +pvdeg.store.store(weather_ds=w, meta_df=m) + +# %% +loaded_weather, loaded_meta = pvdeg.store.get(group="PVGIS-1hr") + +# %% +loaded_meta + +# %% +loaded_weather + +# %% +loaded_weather.sel(gid=22).compute() + +# %% +import matplotlib.pyplot as plt + +plt.plot(loaded_weather.sel(gid=0).dhi) + +# %% +wet, met = pvdeg.store.get("PVGIS-1hr") + +# %% +wet + +# %% +loaded_meta + +# %% +func = pvdeg.standards.standoff + +template = pvdeg.geospatial.auto_template(func=func, ds_gids=loaded_weather) + +loaded_geo_res = pvdeg.geospatial.analysis( + weather_ds=loaded_weather, meta_df=loaded_meta, func=func, template=template +) + +# %% +pvdeg.geospatial.plot_sparse_analysis_land(loaded_geo_res, data_var="T98_inf") + +# %% diff --git a/tutorials_and_tools/tutorials_and_tools/nrel-only/HPC Connection Required - Geospatial_world_map.ipynb b/tutorials/06_nrel_hpc/01_geospatial_world_map.ipynb similarity index 96% rename from tutorials_and_tools/tutorials_and_tools/nrel-only/HPC Connection Required - Geospatial_world_map.ipynb rename to tutorials/06_nrel_hpc/01_geospatial_world_map.ipynb index c086a6033..8a73f3c55 100644 --- a/tutorials_and_tools/tutorials_and_tools/nrel-only/HPC Connection Required - Geospatial_world_map.ipynb +++ b/tutorials/06_nrel_hpc/01_geospatial_world_map.ipynb @@ -83,6 +83,7 @@ { "cell_type": "code", "execution_count": null, + "id": "a4643119", "metadata": {}, "outputs": [], "source": [ @@ -102,15 +103,28 @@ "\n", "weather_ds_himawari, meta_df_himawari = pvdeg.weather.get(\n", " weather_db, geospatial=True, **weather_arg\n", - ")\n", - "\n", - "# %%\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4cf9f951", + "metadata": {}, + "outputs": [], + "source": [ "meta_df_himawari_sub, gids_meta_df_himawari = pvdeg.utilities.gid_downsampling(\n", " meta_df_himawari, 3\n", ")\n", - "weather_ds_himawari_sub = weather_ds_himawari.sel(gid=meta_df_himawari_sub.index)\n", - "\n", - "# %%\n", + "weather_ds_himawari_sub = weather_ds_himawari.sel(gid=meta_df_himawari_sub.index)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ "geo_himawari = {\n", " \"func\": pvdeg.standards.standoff,\n", " \"weather_ds\": weather_ds_himawari_sub,\n", @@ -127,6 +141,7 @@ { "cell_type": "code", "execution_count": null, + "id": "acf47855", "metadata": {}, "outputs": [], "source": [ @@ -146,13 +161,26 @@ "\n", "weather_ds_goes, meta_df_goes = pvdeg.weather.get(\n", " weather_db, geospatial=True, **weather_arg\n", - ")\n", - "\n", - "# %%\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ba3b18b8", + "metadata": {}, + "outputs": [], + "source": [ "meta_df_goes_sub, gids_meta_df_goes = pvdeg.utilities.gid_downsampling(meta_df_goes, 8)\n", - "weather_ds_goes_sub = weather_ds_goes.sel(gid=meta_df_goes_sub.index)\n", - "\n", - "# %%\n", + "weather_ds_goes_sub = weather_ds_goes.sel(gid=meta_df_goes_sub.index)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ "geo_goes = {\n", " \"func\": pvdeg.standards.standoff,\n", " \"weather_ds\": weather_ds_goes_sub,\n", @@ -167,6 +195,7 @@ { "cell_type": "code", "execution_count": null, + "id": "00fa08de", "metadata": {}, "outputs": [], "source": [ @@ -186,15 +215,28 @@ "\n", "weather_ds_meteosat, meta_df_meteosat = pvdeg.weather.get(\n", " weather_db, geospatial=True, **weather_arg\n", - ")\n", - "\n", - "# %%\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "dcf9d773", + "metadata": {}, + "outputs": [], + "source": [ "meta_df_meteosat_sub, gids_meta_df_meteosat = pvdeg.utilities.gid_downsampling(\n", " meta_df_meteosat, 4\n", ")\n", - "weather_ds_meteosat_sub = weather_ds_meteosat.sel(gid=meta_df_meteosat_sub.index)\n", - "\n", - "# %%\n", + "weather_ds_meteosat_sub = weather_ds_meteosat.sel(gid=meta_df_meteosat_sub.index)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ "geo_meteosat = {\n", " \"func\": pvdeg.standards.standoff,\n", " \"weather_ds\": weather_ds_meteosat_sub,\n", diff --git a/tutorials_and_tools/tutorials_and_tools/nrel-only/HPC Connection Required - LETID - Outdoor Geospatial Demo.ipynb b/tutorials/06_nrel_hpc/02_letid_outdoor_geospatial_demo.ipynb similarity index 100% rename from tutorials_and_tools/tutorials_and_tools/nrel-only/HPC Connection Required - LETID - Outdoor Geospatial Demo.ipynb rename to tutorials/06_nrel_hpc/02_letid_outdoor_geospatial_demo.ipynb diff --git a/tutorials/06_nrel_hpc/README.md b/tutorials/06_nrel_hpc/README.md new file mode 100644 index 000000000..422f405cf --- /dev/null +++ b/tutorials/06_nrel_hpc/README.md @@ -0,0 +1,35 @@ +# NREL HPC Tutorials + +Advanced tutorials that require access to NREL's High Performance Computing (HPC) resources. + +## âš ï¸ HPC Access Required + +All tutorials in this folder require: +- Access to NREL's HPC systems (Kestrel, Eagle, etc.) +- NREL network connectivity or VPN +- Appropriate computing allocations + +These tutorials are intended for NREL staff and collaborators with HPC access. + +## Tutorials + +1. **01_geospatial_world_map.ipynb** - Global geospatial analysis and visualization +2. **02_letid_outdoor_geospatial_demo.ipynb** - LETID modeling across geographic regions + +## Topics Covered + +- Large-scale geospatial computations +- Global PV degradation mapping +- Distributed computing workflows +- High-resolution climate data processing + +## Getting Access + +If you are an NREL employee or collaborator and need HPC access: +1. Visit the NREL HPC website for account requests +2. Request appropriate computing allocations +3. Set up VPN access if working remotely + +## Alternative + +If you don't have HPC access, check out the **04_geospatial** folder which includes `01_local_scenario.ipynb` that can run on standard hardware. diff --git a/tutorials/06_nrel_hpc/scripts/01_geospatial_world_map.py b/tutorials/06_nrel_hpc/scripts/01_geospatial_world_map.py new file mode 100644 index 000000000..10fc0b78b --- /dev/null +++ b/tutorials/06_nrel_hpc/scripts/01_geospatial_world_map.py @@ -0,0 +1,670 @@ +# %% [markdown] +# # Note: This notebook is in development +# M. Springer 2024-06-05 + +# %% +print("Importing libraries...") +import matplotlib.pyplot as plt +import numpy as np +import pandas as pd +import pvdeg +import xarray as xr +import os + +print("Done!") + +# %% [markdown] +# # Calculate Standoff + +# %% +work_dir = "/projects/pvsoiling/pvdeg/analysis/world_map/standoff_fine" +data_dir = "/projects/pvsoiling/pvdeg/analysis/world_map/data" + +# %% +local = { + "manager": "local", + "n_workers": 100, +} + +kestrel = { + "manager": "slurm", + "n_jobs": 8, # Max number of nodes used for parallel processing + "cores": 100, + "processes": 50, + "memory": "245GB", + "account": "pvfem", + "queue": "standard", + "walltime": "8:00:00", + # "scheduler_options": {"host": socket.gethostname()}, +} + +print("Starting Dask client...") +client = pvdeg.geospatial.start_dask(hpc=kestrel) +print("Cluster ready!") + +# %% +# Get weather data +weather_db = "NSRDB" + +# %% +weather_arg = { + "satellite": "Himawari", + "names": "tmy-2020", + "NREL_HPC": True, + "attributes": [ + "air_temperature", + "wind_speed", + "dhi", + "ghi", + "dni", + "relative_humidity", + ], +} + +weather_ds_himawari, meta_df_himawari = pvdeg.weather.get( + weather_db, geospatial=True, **weather_arg +) + +# %% +meta_df_himawari_sub, gids_meta_df_himawari = pvdeg.utilities.gid_downsampling( + meta_df_himawari, 3 +) +weather_ds_himawari_sub = weather_ds_himawari.sel(gid=meta_df_himawari_sub.index) + +# %% +geo_himawari = { + "func": pvdeg.standards.standoff, + "weather_ds": weather_ds_himawari_sub, + "meta_df": meta_df_himawari_sub, +} + +standoff_res_himawari = pvdeg.geospatial.analysis(**geo_himawari) +standoff_res_himawari.to_netcdf(os.path.join(work_dir, "standoff_himawari.nc")) +standoff_res_himawari.to_dataframe().to_csv( + os.path.join(work_dir, "standoff_himawari.csv") +) + +# %% +weather_arg = { + "satellite": "GOES", + "names": 2021, + "NREL_HPC": True, + "attributes": [ + "air_temperature", + "wind_speed", + "dhi", + "ghi", + "dni", + "relative_humidity", + ], +} + +weather_ds_goes, meta_df_goes = pvdeg.weather.get( + weather_db, geospatial=True, **weather_arg +) + +# %% +meta_df_goes_sub, gids_meta_df_goes = pvdeg.utilities.gid_downsampling(meta_df_goes, 8) +weather_ds_goes_sub = weather_ds_goes.sel(gid=meta_df_goes_sub.index) + +# %% +geo_goes = { + "func": pvdeg.standards.standoff, + "weather_ds": weather_ds_goes_sub, + "meta_df": meta_df_goes_sub, +} + +standoff_res_goes = pvdeg.geospatial.analysis(**geo_goes) +standoff_res_goes.to_netcdf(os.path.join(work_dir, "standoff_goes.nc")) +standoff_res_goes.to_dataframe().to_csv(os.path.join(work_dir, "standoff_goes.csv")) + +# %% +weather_arg = { + "satellite": "METEOSAT", + "names": 2019, + "NREL_HPC": True, + "attributes": [ + "air_temperature", + "wind_speed", + "dhi", + "ghi", + "dni", + "relative_humidity", + ], +} + +weather_ds_meteosat, meta_df_meteosat = pvdeg.weather.get( + weather_db, geospatial=True, **weather_arg +) + +# %% +meta_df_meteosat_sub, gids_meta_df_meteosat = pvdeg.utilities.gid_downsampling( + meta_df_meteosat, 4 +) +weather_ds_meteosat_sub = weather_ds_meteosat.sel(gid=meta_df_meteosat_sub.index) + +# %% +geo_meteosat = { + "func": pvdeg.standards.standoff, + "weather_ds": weather_ds_meteosat_sub, + "meta_df": meta_df_meteosat_sub, +} + +standoff_res_meteosat = pvdeg.geospatial.analysis(**geo_meteosat) +standoff_res_meteosat.to_netcdf(os.path.join(work_dir, "standoff_meteosat.nc")) +standoff_res_meteosat.to_dataframe().to_csv( + os.path.join(work_dir, "standoff_meteosat.csv") +) + +# %% +# Auxillary data +import h5py + +fp_weather_aux = "/projects/pvsoiling/pvdeg/data/world_map_aux.h5" +fp_meta_aux = "/projects/pvsoiling/pvdeg/data/meta_world_map_aux.csv" + +# weather_aux = pvdeg.weather.read(fp_weather_aux, 'h5') +meta_aux = pd.read_csv(fp_meta_aux, index_col=0) + +# xarray work around for aux data +dss = [] +drop_variables = ["meta", "time_index", "tmy_year", "tmy_year_short", "coordinates"] + +hf = h5py.File(fp_weather_aux, "r") +attr = list(hf) + +attr_to_read = [elem for elem in attr if elem not in drop_variables] + +chunks = [] +shapes = [] +for var in attr_to_read: + chunks.append(hf[var].chunks if hf[var].chunks is not None else (np.nan, np.nan)) + shapes.append(hf[var].shape if hf[var].shape is not None else (np.nan, np.nan)) +chunks = min(set(chunks)) +shapes = min(set(shapes)) + + +time_index = pd.to_datetime(hf["time_index"][...].astype(str)).values +meta_df = meta_aux +coords = {"gid": meta_df.index.values, "time": time_index} +coords_len = {"time": time_index.shape[0], "gid": meta_df.shape[0]} + +ds = xr.open_dataset( + fp_weather_aux, + engine="h5netcdf", + phony_dims="sort", + chunks={"phony_dim_0": -1, "phony_dim_1": -1}, + drop_variables=drop_variables, + mask_and_scale=False, + decode_cf=True, +) + +for var in ds.data_vars: + if hasattr(getattr(ds, var), "psm_scale_factor"): + scale_factor = 1 / ds[var].psm_scale_factor + print(scale_factor) + getattr(ds, var).attrs["scale_factor"] = scale_factor + +rename = {} +for ( + phony, + length, +) in ds.sizes.items(): + if length == coords_len["time"]: + rename[phony] = "time" + elif length == coords_len["gid"]: + rename[phony] = "gid" +ds = ds.rename(rename) +ds = ds.assign_coords(coords) + +# TODO: In case re-chunking becomes necessary +# ax0 = list(ds.sizes.keys())[list(ds.sizes.values()).index(shapes[0])] +# ax1 = list(ds.sizes.keys())[list(ds.sizes.values()).index(shapes[1])] +# ds = ds.chunk(chunks={ax0:chunks[0], ax1:chunks[1]}) +dss.append(ds) + +ds = xr.merge(dss) +ds = xr.decode_cf(ds) + +# Rechunk time axis +ds = ds.unify_chunks() +ds = ds.chunk(chunks={"time": -1, "gid": ds.chunks["gid"]}) + +weather_ds = ds + +DSET_MAP = {"air_temperature": "temp_air", "Relative Humidity": "relative_humidity"} +META_MAP = {"elevation": "altitude", "Local Time Zone": "tz", "timezone": "tz"} + +for dset in weather_ds.data_vars: + if dset in DSET_MAP.keys(): + weather_ds = weather_ds.rename({dset: DSET_MAP[dset]}) + +for mset in meta_df.columns: + if mset in META_MAP.keys(): + meta_df.rename(columns={mset: META_MAP[mset]}, inplace=True) + +weather_ds_aux = weather_ds + +geo_aux = { + "func": pvdeg.standards.standoff, + "weather_ds": weather_ds_aux, + "meta_df": meta_aux, +} + +standoff_res_aux = pvdeg.geospatial.analysis(**geo_aux) +standoff_res_aux.to_netcdf(os.path.join(work_dir, "standoff_aux.nc")) +standoff_res_aux.to_dataframe().to_csv(os.path.join(work_dir, "standoff_aux.csv")) + +# %% +weather_db = "NSRDB" +weather_arg = { + "satellite": "METEOSAT", + "names": 2019, + "NREL_HPC": True, + "attributes": [ + "air_temperature", + "wind_speed", + "dhi", + "ghi", + "dni", + "relative_humidity", + ], +} +weather_ds_meteosat, meta_df_meteosat = pvdeg.weather.get( + weather_db, geospatial=True, **weather_arg +) + +time_hourly = pd.date_range("2019-01-01", freq="h", periods=365 * 24) +weather_ds_meteosat_hourly = weather_ds_meteosat.sel(time=time_hourly) + +europe = [ + "Spain", + "Portugal", #'Ireland', 'United Kingdom', + "France", + "Belgium", + "Netherlands", + "Norway", + "Luxembourg", + "Germany", + "Switzerland", + "Italy", + "Monaco", + "Denmark", + "Liechtenstein", + "Austria", + "Sweden", + "Czech Republic", + "San Marino", + "Slovenia", + "Croatia", + "Poland", + "Malta", + "Bosnia and Herzegovina", + "Hungary", + "Slovakia", + "Montenegro", + "Serbia", + "Albania", + "Greece", + "Romania", + "Macedonia", + "Latvia", + "Lithuania", + "Finland", + "Estonia", + "Ukraine", + "Bulgaria", + "Belarus", + "Moldova", + "Turkey", + "Cyprus", + "Northern Cyprus", + "Georgia", +] + +meta_df_europe = meta_df_meteosat[meta_df_meteosat["country"].isin(europe)] + +meta_df_europe_sub, gids_sub = pvdeg.utilities.gid_downsampling(meta_df_europe, 4) +weather_europe_sub = weather_ds_meteosat_hourly.sel(gid=meta_df_europe_sub.index) + +meta_uk = pd.read_csv("../../world_map/data/meta_pvgis_uk_4300.csv") +meta_uk_sub, gids_sub = pvdeg.utilities.gid_downsampling(meta_uk, 1) + +meta_scan1 = pd.read_csv(f"{data_dir}/meta_pvgis_scan_coarse1500.csv", index_col=0) +meta_scan12 = pd.read_csv( + f"{data_dir}/meta_pvgis_scan_coarse_1500_1599.csv", index_col=0 +) +meta_scan2 = pd.read_csv(f"{data_dir}/meta_pvgis_scan_coarse2100.csv", index_col=0) +meta_scan = pd.concat([meta_scan1, meta_scan12, meta_scan2]) + +meta_pvgis = pd.concat([meta_scan, meta_uk_sub]) + +lat_NSRDB = meta_df_europe_sub["latitude"].to_numpy() +meta_pvgis["latitude_pvgis"] = meta_pvgis["latitude"] +meta_pvgis["latitude"] = meta_pvgis["latitude"].apply( + lambda x: ( + lat_NSRDB[np.argmin(np.abs(x - lat_NSRDB))] + if x < meta_df_europe_sub["latitude"].max() + else x + ) +) + +lon_NSRDB = meta_df_europe_sub["longitude"].to_numpy() +meta_pvgis["longitude_pvgis"] = meta_pvgis["longitude"] +meta_pvgis["longitude"] = meta_pvgis["longitude"].apply( + lambda x: ( + lon_NSRDB[np.argmin(np.abs(x - lon_NSRDB))] + if x > meta_df_europe_sub["longitude"].min() + else x + ) +) +meta_pvgis["tz"] = 0 +meta_pvgis = meta_pvgis.reset_index() + +meta_eu_coarse = pd.concat([meta_df_europe_sub, meta_pvgis]) +meta_eu_coarse["tz"] = 0 +meta_eu_coarse = meta_eu_coarse.reset_index() +meta_eu_coarse.to_csv("../../world_map/data/meta_eu_coarse.csv") + +weather_uk = xr.open_dataset("../../world_map/data/weather_ds_uk_4300.nc") +weather_uk = weather_uk.sel(gid=meta_uk.index) +weather_uk_sub = weather_uk.sel(gid=meta_uk_sub.index) + +weather_scan1 = xr.open_dataset("../../world_map/data/weather_ds_scan_coarse1500.nc") +weather_scan12 = xr.open_dataset( + "../../world_map/data/weather_ds_scan_coarse_1500_1599.nc" +) +weather_scan2 = xr.open_dataset("../../world_map/data/weather_ds_scan_coarse2100.nc") +weather_scan = xr.concat( + [ + weather_scan1.sel(gid=slice(0, 1500)), + weather_scan12.sel(gid=slice(1501, 1599)), + weather_scan2.sel(gid=slice(1600, None)), + ], + dim="gid", +) +weather_scan = weather_scan.sel(gid=meta_scan.index) +# weather_scan = xr.concat([weather_scan1, weather_scan2], dim='gid') + +weather_pvgis = xr.concat([weather_scan, weather_uk_sub], dim="gid") +weather_pvgis = weather_pvgis.drop_vars(["IR(h)", "wind_direction", "pressure"]) + +weather_pvgis = weather_pvgis.assign_coords({"gid": meta_pvgis.index}) +weather_pvgis = weather_pvgis.chunk(chunks={"time": -1, "gid": 100}) +weather_pvgis = weather_pvgis.unify_chunks() + +meta_df_pvgis_sub, gids_meta_df_pvgis = pvdeg.utilities.gid_downsampling(meta_pvgis, 4) +weather_ds_pvgis_sub = weather_pvgis.sel(gid=meta_df_pvgis_sub.index) + +# weather_europe_sub = weather_europe_sub.assign_coords({'time': pd.date_range("2022-01-01", freq="h", periods=365 * 24),}) +# weather_eu_coarse = xr.concat([weather_europe_sub, weather_pvgis], dim='gid') +# weather_eu_coarse = weather_eu_coarse.assign_coords({'gid': meta_eu_coarse.index}) +# weather_eu_coarse = weather_eu_coarse.chunk(chunks={"time": -1, "gid": 100}) +# weather_eu_coarse = weather_eu_coarse.unify_chunks() + +# with open('weather_eu_coarse.pickle', 'wb') as handle: +# pickle.dump(weather_eu_coarse, handle, protocol=pickle.HIGHEST_PROTOCOL) + + +geo_pvgis = { + "func": pvdeg.standards.standoff, + "weather_ds": weather_pvgis, + "meta_df": meta_pvgis, +} + +standoff_res_pvgis = pvdeg.geospatial.analysis(**geo_pvgis) +standoff_res_pvgis.to_netcdf(os.path.join(work_dir, "standoff_pvgis.nc")) +standoff_res_pvgis.to_dataframe().to_csv(os.path.join(work_dir, "standoff_pvgis.csv")) + +# %% +meta_north = pd.read_csv(f"{data_dir}/meta_pvgis_north_3300.csv", index_col=0) +weather_north = xr.open_dataset(f"{data_dir}/weather_ds_north_3300.nc") +weather_north = weather_north.sel(gid=meta_north.index) + +weather_north = weather_north.assign_coords({"gid": meta_north.index}) +weather_north = weather_north.chunk(chunks={"time": -1, "gid": 100}) +weather_north = weather_north.unify_chunks() + + +geo_pvgis = { + "func": pvdeg.standards.standoff, + "weather_ds": weather_north, + "meta_df": meta_north, +} + +standoff_res_pvgis = pvdeg.geospatial.analysis(**geo_pvgis) +standoff_res_pvgis.to_netcdf(os.path.join(work_dir, "standoff_pvgis_north.nc")) +standoff_res_pvgis.to_dataframe().to_csv( + os.path.join(work_dir, "standoff_pvgis_north.csv") +) + +# %% [markdown] +# # Post process + +# %% +import pvdeg +import os +import pandas as pd +import numpy as np +import xarray as xr +from global_land_mask import globe +import cartopy.crs as ccrs +import cartopy.io.shapereader as shpreader + +work_dir = "/projects/pvsoiling/pvdeg/analysis/world_map/standoff_fine" +data_dir = "/projects/pvsoiling/pvdeg/analysis/world_map/data" + +# %% +# Create 0cm standoff locations + +lon_north = np.arange(-179, 180, 0.25) +lat_north = np.arange(60, 90, 0.25) +lon_grid_north, lat_grid_north = np.meshgrid(lon_north, lat_north) +land_north = globe.is_land(lat_grid_north, lon_grid_north) +lon_land_north = lon_grid_north[land_north] +lat_land_north = lat_grid_north[land_north] + +lon_south = np.arange(-179, 180, 0.25) +lat_south = np.arange(-90, -60, 0.25) +lon_grid_south, lat_grid_south = np.meshgrid(lon_south, lat_south) +land_south = globe.is_land(lat_grid_south, lon_grid_south) +lon_land_south = lon_grid_south[land_south] +lat_land_south = lat_grid_south[land_south] + + +lon_asia = np.arange(80, 105, 0.25) +lat_asia = np.arange(50, 61, 0.25) + +lon = lon_asia +lat = np.full(lon_asia.size, 61) + +for i, lat_coord in enumerate(reversed(lat_asia)): + lon_sub = lon_asia[i:-i] + lat_sub = np.full(lon_sub.size, lat_coord) + lon = np.append(lon, lon_sub) + lat = np.append(lat, lat_sub) + +lon_asia = lon +lat_asia = lat + +# %% +fig, ax = plt.subplots() + +plt.scatter(lon_land_north, lat_land_north, c="r", s=1) +plt.scatter(lon_land_south, lat_land_south, c="b", s=1) +plt.scatter(lon, lat, c="g", s=1) + +ax.set_ylim(-90, 90) +ax.set_xlim(-180, 180) + +# %% +template_params = pvdeg.geospatial.template_parameters(pvdeg.standards.standoff) +standoff_zero_north = pvdeg.geospatial.zero_template( + lat_land_north, lon_land_north, **template_params +) +standoff_zero_south = pvdeg.geospatial.zero_template( + lat_land_south, lon_land_south, **template_params +) +standoff_zero_asia = pvdeg.geospatial.zero_template( + lat_asia, lon_asia, **template_params +) + +# %% +standoff_aux = xr.open_dataset(os.path.join(work_dir, "standoff_aux.nc")) +standoff_himawari = xr.open_dataset(os.path.join(work_dir, "standoff_himawari.nc")) +standoff_meteosat = xr.open_dataset(os.path.join(work_dir, "standoff_meteosat.nc")) +standoff_north = xr.open_dataset(os.path.join(work_dir, "standoff_pvgis_north.nc")) +standoff_pvgis = xr.open_dataset(os.path.join(work_dir, "standoff_pvgis.nc")) +standoff_goes = xr.open_dataset(os.path.join(work_dir, "standoff_goes.nc")) + +# %% +fig = plt.figure(figsize=(10, 5)) +ax = fig.add_axes([0, 0, 1, 1], projection=ccrs.PlateCarree(), frameon=True) +ax.patch.set_visible(True) +ax.set_extent([-180, 180, -85, 85], ccrs.PlateCarree()) + +shapename = "admin_0_countries" +states_shp = shpreader.natural_earth( + resolution="110m", category="cultural", name=shapename +) + +cmap = "Spectral_r" +size = 0.75 + + +standoff_zero_north.plot.scatter( + x="longitude", + y="latitude", + hue="x", + cmap=cmap, + s=size, + linewidths=0, + vmin=0, + vmax=14, + add_colorbar=False, + ax=ax, +) +standoff_zero_south.plot.scatter( + x="longitude", + y="latitude", + hue="x", + cmap=cmap, + s=size, + linewidths=0, + vmin=0, + vmax=14, + add_colorbar=False, + ax=ax, +) +standoff_zero_asia.plot.scatter( + x="longitude", + y="latitude", + hue="x", + cmap=cmap, + s=size, + linewidths=0, + vmin=0, + vmax=14, + add_colorbar=False, + ax=ax, +) + +cm = standoff_himawari.plot.scatter( + x="longitude", + y="latitude", + hue="x", + cmap=cmap, + s=size, + linewidths=0, + vmin=0, + vmax=14, + add_colorbar=False, + ax=ax, +) +standoff_north.plot.scatter( + x="longitude", + y="latitude", + hue="x", + cmap=cmap, + s=size, + linewidths=0, + vmin=0, + vmax=14, + add_colorbar=False, + ax=ax, +) +standoff_aux.plot.scatter( + x="longitude", + y="latitude", + hue="x", + cmap=cmap, + s=size, + linewidths=0, + vmin=0, + vmax=14, + add_colorbar=False, + ax=ax, +) +standoff_pvgis.plot.scatter( + x="longitude", + y="latitude", + hue="x", + cmap=cmap, + s=size, + linewidths=0, + vmin=0, + vmax=14, + add_colorbar=False, + ax=ax, +) +standoff_meteosat.plot.scatter( + x="longitude", + y="latitude", + hue="x", + cmap=cmap, + s=1, + linewidths=0, + vmin=0, + vmax=14, + add_colorbar=False, + ax=ax, +) +standoff_goes.plot.scatter( + x="longitude", + y="latitude", + hue="x", + cmap=cmap, + s=1, + linewidths=0, + vmin=0, + vmax=14, + add_colorbar=False, + ax=ax, +) + + +ax.add_geometries( + shpreader.Reader(states_shp).geometries(), + ccrs.PlateCarree(), + facecolor="none", + edgecolor="gray", + linewidth=0.5, +) + +cb_title = "Standoff distance [cm]" +cb = plt.colorbar(cm, shrink=0.78, aspect=30, pad=0.02) +cb.set_label(cb_title) +# ax.set_title('title') + +ax.set_xticks(np.arange(-180, 181, 20), crs=ccrs.PlateCarree()) +ax.set_yticks(np.arange(-90, 91, 10), crs=ccrs.PlateCarree()) + +ax.set_xlim(-180, 180) +ax.set_ylim(-85, 85) + +ax.set_xlabel("Longitude") +ax.set_ylabel("Latitude") + +plt.savefig(os.path.join(work_dir, "standoff_map.png"), dpi=1200, bbox_inches="tight") + +# %% diff --git a/tutorials_and_tools/tutorials_and_tools/LETID - Outdoor Geospatial Demo.py b/tutorials/06_nrel_hpc/scripts/02_letid_outdoor_geospatial_demo.py similarity index 94% rename from tutorials_and_tools/tutorials_and_tools/LETID - Outdoor Geospatial Demo.py rename to tutorials/06_nrel_hpc/scripts/02_letid_outdoor_geospatial_demo.py index 75045e8d6..3c2dffc51 100644 --- a/tutorials_and_tools/tutorials_and_tools/LETID - Outdoor Geospatial Demo.py +++ b/tutorials/06_nrel_hpc/scripts/02_letid_outdoor_geospatial_demo.py @@ -1,24 +1,17 @@ -#!/usr/bin/env python -# coding: utf-8 - +# %% [markdown] # # LETID - Outdoor Geospatioal Demo # # ![PVDeg Logo](../PVD_logo.png) # -# In[1]: - - +# %% import matplotlib.pyplot as plt import pandas as pd import pvdeg from pvdeg import DATA_DIR import os - -# In[2]: - - +# %% # This information helps with debugging and getting support :) import sys import platform @@ -28,19 +21,14 @@ print("Pandas version ", pd.__version__) print("pvdeg version ", pvdeg.__version__) - +# %% [markdown] # ## Single location example -# In[2]: - - +# %% weather_file = os.path.join(DATA_DIR, "psm3_demo.csv") WEATHER, META = pvdeg.weather.read(weather_file, "psm") - -# In[3]: - - +# %% kwargs = { "tau_0": 115, # us, carrier lifetime in non-degraded states, e.g. LETID/LID states A or C "tau_deg": 55, # us, carrier lifetime in fully-degraded state, e.g. LETID/LID state B @@ -50,21 +38,16 @@ "na_0": 100, "nb_0": 0, "nc_0": 0, - "mechanism_params": 'D037', + "mechanism_params": "repins", } - -# In[4]: - - +# %% pvdeg.letid.calc_letid_outdoors(weather_df=WEATHER, meta=META, **kwargs) - +# %% [markdown] # ### Start distributed compute cluster - DASK -# In[2]: - - +# %% local = { "manager": "local", "n_workers": 1, @@ -85,10 +68,7 @@ pvdeg.geospatial.start_dask(hpc=kestrel) - -# In[11]: - - +# %% # Get weather data weather_db = "NSRDB" @@ -114,16 +94,13 @@ weather_SW_sub = weather_ds.sel(gid=meta_SW_sub.index) - -# In[12]: - - +# %% weather_SW_sub +# %% +meta_df -# In[13]: - - +# %% # Define desired analysis geo = { "func": pvdeg.letid.calc_letid_outdoors, @@ -137,21 +114,15 @@ "na_0": 100, "nb_0": 0, "nc_0": 0, - "mechanism_params": 'D037', + "mechanism_params": "repins", } letid_res = pvdeg.geospatial.analysis(**geo) - -# In[14]: - - +# %% letid_res - -# In[18]: - - +# %% import datetime ims = [] @@ -177,10 +148,7 @@ # ims = [imageio.imread(f'./images/RH_animation_{n}.png') for n in range(1, 13)] # imageio.mimwrite(f'./images/RH_animation.gif', ims, format='GIF', duration=1000, loop=10) - -# In[34]: - - +# %% import datetime ims = [] @@ -250,13 +218,10 @@ plt.savefig(f"./images/LETID_plot_animation_{n}.png", dpi=600) - -# In[ ]: - - +# %% import imageio -ims = [imageio.imread("./images/LETID_plot_animation_{n}.png") for n in range(1, 13)] +ims = [imageio.imread(f"./images/LETID_plot_animation_{n}.png") for n in range(1, 13)] imageio.mimwrite( "./images/LETID_plot_animation.gif", ims, format="GIF", duration=1000, loop=10 ) diff --git a/tutorials_and_tools/tutorials_and_tools/ASTM Live Demo.ipynb b/tutorials/07_workshop_demos/01_astm_live_demo.ipynb similarity index 99% rename from tutorials_and_tools/tutorials_and_tools/ASTM Live Demo.ipynb rename to tutorials/07_workshop_demos/01_astm_live_demo.ipynb index 00dcc5969..d7f351dac 100644 --- a/tutorials_and_tools/tutorials_and_tools/ASTM Live Demo.ipynb +++ b/tutorials/07_workshop_demos/01_astm_live_demo.ipynb @@ -199,11 +199,11 @@ "source": [ "## Fetching TMYs from the NSRDB\n", "\n", - "The NSRDB, one of many sources of weather data intended for PV modeling, is free and easy to access using pvlib. As an example, we'll fetch a TMY dataset for Phoenix, AZ at coordinates [(33.4484, -112.0740)](https://goo.gl/maps/hGV92QHCm5FHJKbf9). \n", + "The NSRDB, one of many sources of weather data intended for PV modeling, is free and easy to access using pvlib. As an example, we'll fetch a TMY dataset for Phoenix, AZ at coordinates [(33.4484, -112.0740)](https://goo.gl/maps/hGV92QHCm5FHJKbf9).\n", "\n", "This function uses [`pvdeg.weather.get()`](https://pvdegradationtools.readthedocs.io/en/latest/_autosummary/pvdeg.weather.html#pvdeg.weather.get), which returns a Python dictionary of metadata and a Pandas dataframe of the timeseries weather data.\n", "\n", - "This function internally leverages [`pvlib.iotools.get_psm3()`](https://pvlib-python.readthedocs.io/en/stable/reference/generated/pvlib.iotools.get_psm3.html). However, for some of the NSRDB data relative humidity is not a given parameter, and `pvdeg` calculates the values from the downloaded data as an internal processing step. " + "This function internally leverages [`pvlib.iotools.get_psm3()`](https://pvlib-python.readthedocs.io/en/stable/reference/generated/pvlib.iotools.get_psm3.html). However, for some of the NSRDB data relative humidity is not a given parameter, and `pvdeg` calculates the values from the downloaded data as an internal processing step." ] }, { diff --git a/tutorials_and_tools/tutorials_and_tools/nrel-only/HPC Connection Required - DuraMAT Live Demo.ipynb b/tutorials/07_workshop_demos/02_duramat_live_demo.ipynb similarity index 99% rename from tutorials_and_tools/tutorials_and_tools/nrel-only/HPC Connection Required - DuraMAT Live Demo.ipynb rename to tutorials/07_workshop_demos/02_duramat_live_demo.ipynb index 1ce2b0a59..5101049c6 100644 --- a/tutorials_and_tools/tutorials_and_tools/nrel-only/HPC Connection Required - DuraMAT Live Demo.ipynb +++ b/tutorials/07_workshop_demos/02_duramat_live_demo.ipynb @@ -82,7 +82,7 @@ } ], "source": [ - "pvdeg.geospatial.start_dask();" + "pvdeg.geospatial.start_dask()" ] }, { diff --git a/tutorials/07_workshop_demos/README.md b/tutorials/07_workshop_demos/README.md new file mode 100644 index 000000000..55e4c9ffa --- /dev/null +++ b/tutorials/07_workshop_demos/README.md @@ -0,0 +1,42 @@ +# Workshop Demonstrations + +Live demonstration materials from PVDegradationTools workshops and conferences. + +## Tutorials + +1. **01_astm_live_demo.ipynb** - ASTM workshop live demonstration +2. **02_duramat_live_demo.ipynb** - DuraMAT workshop live demonstration âš ï¸ **Requires NREL HPC** + +## Requirements + +### ASTM Live Demo (01) +- No special requirements +- Can run locally or in Google Colab + +### DuraMAT Live Demo (02) +âš ï¸ **NREL HPC Access Required** +- Requires access to NREL's High Performance Computing resources +- NREL network connectivity or VPN required +- Appropriate computing allocations needed + +## About These Demos + +These notebooks were created for live demonstrations at workshops and conferences: +- **ASTM**: American Society for Testing and Materials workshops +- **DuraMAT**: DuraMAT Consortium meetings and workshops + +The demos showcase practical applications of PVDegradationTools and provide hands-on examples for workshop participants. + +## Running the Demos + +### Local Execution +Most demos can be run locally. Follow the standard installation instructions in the main tutorials README. + +### Google Colab +Demos without HPC requirements can be launched in Google Colab using the rocket icon when viewing through the Jupyter Book. + +### HPC Execution +For demos requiring HPC (marked with âš ï¸), you must: +1. Have NREL HPC account and allocations +2. Be on NREL network or connected via VPN +3. Follow NREL HPC documentation for job submission diff --git a/tutorials_and_tools/tutorials_and_tools/ASTM Live Demo.py b/tutorials/07_workshop_demos/scripts/01_astm_live_demo.py similarity index 87% rename from tutorials_and_tools/tutorials_and_tools/ASTM Live Demo.py rename to tutorials/07_workshop_demos/scripts/01_astm_live_demo.py index 909ad301c..3ab5bb509 100644 --- a/tutorials_and_tools/tutorials_and_tools/ASTM Live Demo.py +++ b/tutorials/07_workshop_demos/scripts/01_astm_live_demo.py @@ -1,6 +1,4 @@ -#!/usr/bin/env python -# coding: utf-8 - +# %% [markdown] # # ASTM Demonstration # # ![PVDeg Logo](../PVD_logo.png) @@ -22,26 +20,18 @@ # The following figure showcases this calulation for the entire United States. We used pvlib and data from the National Solar Radiation Database (NSRDB) to calculate the module temperatures for different mounting configuration and applied our model to obtain the standoff distance for roof-mounted PV systems. # -# In[1]: - - +# %% # if running on google colab, uncomment the next line and execute this cell to install the dependencies and prevent "ModuleNotFoundError" in later cells: -#!pip install pvdeg==0.1.0 - - -# In[2]: - +# #!pip install pvdeg==0.1.0 +# %% import os import pvlib import pvdeg import pandas as pd import matplotlib.pyplot as plt - -# In[ ]: - - +# %% # This information helps with debugging and getting support :) import sys import platform @@ -52,7 +42,7 @@ print("pvlib version ", pvlib.__version__) print("pvdeg version ", pvdeg.__version__) - +# %% [markdown] # ## 1. Import Weather Data # # The function has two minimum requirements: @@ -60,6 +50,7 @@ # - Site meta-data containing (at least) Latitude, Longitude, Time Zone # +# %% [markdown] # ### Where to get _Free_ Solar Irradiance Data? # # There are many different sources of solar irradiance data. For your projects, these are some of the most common: @@ -82,10 +73,12 @@ # * [Meteonorm](https://meteonorm.com/en/) # * [DNV Solar Resource Compass](https://src.dnv.com/) +# %% [markdown] # # ![NSRDB Example](images/tutorial_1_NSRDB_example.PNG) # +# %% [markdown] # ### NREL API Key # At the [NREL Developer Network](https://developer.nrel.gov/), there are [APIs](https://en.wikipedia.org/wiki/API) to a lot of valuable [solar resources](https://developer.nrel.gov/docs/solar/) like [weather data from the NSRDB](https://developer.nrel.gov/docs/solar/nsrdb/), [operational data from PVDAQ](https://developer.nrel.gov/docs/solar/pvdaq-v3/), or indicative calculations using [PVWatts](https://developer.nrel.gov/docs/solar/pvwatts/). In order to use these resources from NREL, you need to [register for a free API key](https://developer.nrel.gov/signup/). You can test out the APIs using the `DEMO_KEY` but it has limited bandwidth compared to the [usage limit for registered users](https://developer.nrel.gov/docs/rate-limits/). NREL has some [API usage instructions](https://developer.nrel.gov/docs/api-key/), but pvlib has a few builtin functions, like [`pvlib.iotools.get_psm3()`](https://pvlib-python.readthedocs.io/en/stable/reference/generated/pvlib.iotools.get_psm3.html), that wrap the NREL API, and call them for you to make it much easier to use. Skip ahead to the next section to learn more. But before you do... # @@ -102,9 +95,7 @@ # # **If you have an NREL API key please enter it in the next cell.** -# In[3]: - - +# %% NREL_API_KEY = None # <-- please set your NREL API key here # note you must use "quotes" around your key, for example: @@ -119,7 +110,7 @@ except KeyError: NREL_API_KEY = "DEMO_KEY" # OK for this demo, but better to get your own key - +# %% [markdown] # ## Fetching TMYs from the NSRDB # # The NSRDB, one of many sources of weather data intended for PV modeling, is free and easy to access using pvlib. As an example, we'll fetch a TMY dataset for Phoenix, AZ at coordinates [(33.4484, -112.0740)](https://goo.gl/maps/hGV92QHCm5FHJKbf9). @@ -128,100 +119,77 @@ # # This function internally leverages [`pvlib.iotools.get_psm3()`](https://pvlib-python.readthedocs.io/en/stable/reference/generated/pvlib.iotools.get_psm3.html). However, for some of the NSRDB data relative humidity is not a given parameter, and `pvdeg` calculates the values from the downloaded data as an internal processing step. -# In[4]: - - -# This cell does not run on a Collab instal. WE are troubleshooting it, but the next cell performs the same request directly with PVLib. -# If TMY is requested though, relative_humidity will not be included as NSRDB TMY dataset does not have it. +# %% +# This cell is for documentation only and is not meant to be executed. +# The next cell performs the same request directly with PVLib. """ -weather_db = 'PSM3' +weather_db = 'PSM4' weather_id = (33.4484, -112.0740) weather_arg = {'api_key': NREL_API_KEY, 'email': 'user@mail.com', - 'names': '2021', # tmy is another common option; right now requesting only 2021 data - 'attributes': [], # grabs all. to select, could be 'air_temperature', 'dew_point', 'dhi', - # 'dni', 'ghi', 'surface_albedo', 'surface_pressure', 'wind_direction', 'wind_speed' + 'year': '2021', 'map_variables': True, 'leap_day': False} weather_df, meta = pvdeg.weather.get(weather_db, weather_id, **weather_arg) """ - -# In[5]: - - -weather_df, meta = pvlib.iotools.get_psm3( +# %% +weather_df, meta = pvlib.iotools.get_nsrdb_psm4_tmy( latitude=33.4484, longitude=-112.0740, api_key=NREL_API_KEY, email="silvana.ovaitt@nrel.gov", # <-- any email works here fine - names="2021", + year="tmy", map_variables=True, - attributes=[], leap_day=False, ) - -# In[13]: - - +# %% weather_df - -# In[6]: - - +# %% meta - -# In[7]: - - +# %% weather_df.head() - -# In[8]: - +# %% +# Choose the date you want to plot +date = "2010-01-01" +mask = weather_df.index.date == pd.to_datetime(date).date() +day_df = weather_df.loc[mask] fig, ax1 = plt.subplots(figsize=(9, 6)) -# Instantiate a second axes that shares the same x-axis -ax1.plot( - weather_df.loc["2021-06-28 05:00:00-07:00":"2021-06-28 20:00:00-07:00"][ - "dni_clear" - ], - label="DNI", -) +ax1.plot(day_df.index, day_df["dni"], label="DNI") ax2 = ax1.twinx() -ax2.plot( - weather_df.loc["2021-06-28 05:00:00-07:00":"2021-06-28 20:00:00-07:00"]["temp_air"], - "r", - label="Temperature", -) +ax2.plot(day_df.index, day_df["temp_air"], "r", label="Temperature") ax1.set_ylim([0, 1000]) ax2.set_ylim([0, 50]) ax1.set_ylabel("DNI") ax2.set_ylabel(r"Temperature $\degree$C") +plt.title(f"Weather Data for {date}") +plt.show() +# %% +print(weather_df.columns) +print(weather_df.index.min(), weather_df.index.max()) +print(weather_df.head()) +# %% [markdown] # ## 2. Calculate Installation Standoff - Level 1 # # We use [`pvlib.standards.calc_standoff()`](https://pvdegradationtools.readthedocs.io/en/latest/_autosummary/pvdeg.standards.html#pvdeg.standards.calc_standoff) which takes at minimum the weather data and metadata, and returns the minimum installation distance in centimeters. # # -# In[9]: - - +# %% standoff = pvdeg.standards.standoff(weather_df=weather_df, meta=meta) - -# In[10]: - - +# %% print("Minimum installation distance:", standoff["x"]) - +# %% [markdown] # ## 3. Calculate Installation Standoff - Level 2 # # Let's take a closer look at the function and some optional parameters. @@ -234,27 +202,10 @@ # - x_0 : thermal decay constant [cm] (see documentation) # - wind_speed_factor : Wind speed correction factor to account for different wind speed measurement heights between weather database (e.g. NSRDB) and the tempeature model (e.g. SAPM) -# In[11]: - - -standoff = pvdeg.standards.standoff( - weather_df=weather_df, - meta=meta, - level=2, - tilt=None, - azimuth=180, - sky_model="isotropic", - temp_model="sapm", - module_type="glass_polymer", - x_0=6.1, - wind_speed_factor=1, -) - - -# In[12]: - +# %% +standoff = pvdeg.standards.standoff(weather_df=weather_df, meta=meta, T98=70) +# %% print("Minimum installation distance:", standoff["x"]) - -# In[ ]: +# %% diff --git a/tutorials_and_tools/tutorials_and_tools/DuraMAT Live Demo.py b/tutorials/07_workshop_demos/scripts/02_duramat_live_demo.py similarity index 92% rename from tutorials_and_tools/tutorials_and_tools/DuraMAT Live Demo.py rename to tutorials/07_workshop_demos/scripts/02_duramat_live_demo.py index 3becadbc8..6eae1c065 100644 --- a/tutorials_and_tools/tutorials_and_tools/DuraMAT Live Demo.py +++ b/tutorials/07_workshop_demos/scripts/02_duramat_live_demo.py @@ -1,6 +1,4 @@ -#!/usr/bin/env python -# coding: utf-8 - +# %% [markdown] # # DuraMAT Workshop Live Demo - Geospatial analysis # # ![PVDeg Logo](../PVD_logo.png) @@ -15,16 +13,11 @@ # # ![Xarray](./images/xarray.webp) -# In[2]: - - +# %% import pandas as pd import pvdeg - -# In[ ]: - - +# %% # This information helps with debugging and getting support :) import sys import platform @@ -34,18 +27,13 @@ print("Pandas version ", pd.__version__) print("pvdeg version ", pvdeg.__version__) - +# %% [markdown] # ## 1 Start distributed compute cluster - DASK -# In[3]: - - +# %% pvdeg.geospatial.start_dask() - -# In[4]: - - +# %% # Get weather data weather_db = "NSRDB" @@ -65,35 +53,17 @@ weather_ds, meta_df = pvdeg.weather.get(weather_db, geospatial=True, **weather_arg) - -# In[5]: - - +# %% weather_ds - -# In[6]: - - -meta_df["state"].unique() - - -# In[7]: - - +# %% meta_NM = meta_df[meta_df["state"] == "New Mexico"] - -# In[8]: - - +# %% meta_NM_sub, gids_NM_sub = pvdeg.utilities.gid_downsampling(meta_NM, 4) weather_NM_sub = weather_ds.sel(gid=meta_NM_sub.index) - -# In[9]: - - +# %% geo = { "func": pvdeg.standards.standoff, "weather_ds": weather_NM_sub, @@ -102,16 +72,10 @@ standoff_res = pvdeg.geospatial.analysis(**geo) - -# In[10]: - - +# %% standoff_res - -# In[11]: - - +# %% fig, ax = pvdeg.geospatial.plot_USA( standoff_res["x"], cmap="viridis", @@ -121,12 +85,10 @@ cb_title="Standoff (cm)", ) - +# %% [markdown] # # Relative Humidity Example - Time dimension -# In[12]: - - +# %% # State bar of new mexico: (35.16482, -106.58979) weather_db = "NSRDB" @@ -149,28 +111,16 @@ weather_db, weather_id, geospatial=False, **weather_arg ) - -# In[13]: - - +# %% RH_module = pvdeg.humidity.module(weather_df=weather_df, meta=meta) - -# In[14]: - - +# %% RH_module - -# In[15]: - - +# %% RH_module.plot(ls="--") - -# In[16]: - - +# %% geo = { "func": pvdeg.humidity.module, "weather_ds": weather_NM_sub, @@ -179,16 +129,10 @@ RH_module = pvdeg.geospatial.analysis(**geo) - -# In[17]: - - +# %% RH_module - -# In[18]: - - +# %% # from matplotlib.animation import FuncAnimation # from matplotlib.animation import PillowWriter # import matplotlib.animation as animation @@ -212,7 +156,7 @@ # ims = [imageio.imread(f'./images/RH_animation_{n}.png') for n in range(1, 13)] # imageio.mimwrite(f'./images/RH_animation.gif', ims, format='GIF', duration=1000, loop=10) - +# %% [markdown] # ![PVDeg Logo](./images/RH_animation.gif) -# In[ ]: +# %% diff --git a/tutorials_and_tools/README.md b/tutorials/README.md similarity index 100% rename from tutorials_and_tools/README.md rename to tutorials/README.md diff --git a/tutorials/TUTORIAL_INDEX.md b/tutorials/TUTORIAL_INDEX.md new file mode 100644 index 000000000..c260e707c --- /dev/null +++ b/tutorials/TUTORIAL_INDEX.md @@ -0,0 +1,103 @@ + + +# PV Degradation Tools - Tutorials (pvdeg) + +## Tutorial Organization + +Tutorials are organized by topic into the following folders: + +### 📚 [Basics](basics/) +Introduction to PVDegradationTools - start here if you're new! +- Basic concepts, humidity, and design +- Degradation modeling overview +- Spectral degradation +- Weather database access + +### 🔬 [Degradation](degradation/) +Specialized degradation mechanisms (LID, LETID, Van't Hoff) +- B-O LID and LETID accelerated testing +- Outdoor degradation prediction +- Degradation kinetics + +### 🎲 [Monte Carlo](monte_carlo/) +Uncertainty analysis and probabilistic modeling +- Arrhenius model simulations +- Standoff parameter analysis + +### ðŸ—ºï¸ [Geospatial](geospatial/) +Large-scale spatial analysis and scenarios +- âš ï¸ Most tutorials require **HPC access** +- Local scenario tutorial available without HPC + +### 🚀 [Advanced](advanced/) +Custom functions and API integrations +- âš ï¸ Some tutorials require **API keys** (NSRDB, PVGIS) +- Custom function development +- PySAM integration + +### 🎪 [Workshop Demos](workshop_demo/) +Live demonstration materials from workshops + +--- + +## Running the Tutorials + +### Jupyter Book (Recommended) + +For learning to use PVDeg through our tutorials online, see our [jupyter-book](https://nrel.github.io/PVDegradationTools/intro.html) +Clicking on the rocket-icon on the top allows you to launch the notebooks on [Google Colaboratory](https://colab.research.google.com/) for interactive mode. +Just uncomment the first line `pip install ...` to install the environment on each notebook if you follow this mode. + +### Binder + +To run these tutorials in Binder, you can click here: +[![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/NREL/PVDegradationTools/main) +It takes a minute to load the environment. + +### Locally + +You can also run the tutorials locally in a virtual environment, i.e., `venv` or +[miniconda](https://docs.conda.io/en/latest/miniconda.html). + +1. Create and activate a new environment, e.g., on Mac/Linux terminal with `venv`: + ``` + python -m venv pvdeg + . pvdeg/bin/activate + ``` + or with `conda`: + ``` + conda create -n pvdeg + conda activate pvdeg + ``` + +2. Install `pvdeg` into the new environment with `pip`: + ``` + python -m pip install pvdeg + ``` + +3. Start a Jupyter session: + ``` + jupyter notebook + ``` + +4. Use the file explorer in Jupyter to browse to the tutorial category folder and start with the first tutorial. + +--- + +## Special Requirements + +### 🔑 API Keys Required +Some tutorials in the **Advanced** folder require free API keys: +- **NSRDB API**: Register at https://developer.nrel.gov/signup/ + +### 💻 HPC Access Required +Most tutorials in the **Geospatial** folder require High Performance Computing resources for: +- Large-scale geospatial computations +- Multi-location scenario analyses +- Distributed computing workflows + +--- + +## Documentation + +We also have documentation in [ReadTheDocs](https://PVDegradationTools.readthedocs.io) where you can find more details on the API functions. diff --git a/tutorials_and_tools/_config.yml b/tutorials/_config.yml similarity index 91% rename from tutorials_and_tools/_config.yml rename to tutorials/_config.yml index 0cc6265de..40db680c1 100644 --- a/tutorials_and_tools/_config.yml +++ b/tutorials/_config.yml @@ -25,7 +25,7 @@ bibtex_bibfiles: # Information about where the book exists on the web repository: url: https://github.com/NREL/PVDegradationTools - path_to_book: tutorials_and_tools # Optional path to your book, relative to the repository root + path_to_book: tutorials # Optional path to your book, relative to the repository root branch: main # Add GitHub buttons to your book diff --git a/tutorials/_toc.yml b/tutorials/_toc.yml new file mode 100644 index 000000000..b7b6cb26d --- /dev/null +++ b/tutorials/_toc.yml @@ -0,0 +1,58 @@ +# Table of contents +# Learn more at https://jupyterbook.org/customize/toc.html + +format: jb-book +root: intro +parts: +- caption: 01 - Basics + chapters: + - file: 01_basics/01_basics_humidity_design + - file: 01_basics/02_degradation + - file: 01_basics/03_spectral_degradation + - file: 01_basics/04_weather_database_access +- caption: 02 - Degradation Mechanisms + chapters: + - file: 02_degradation/01_bo_lid_accelerated_test + - file: 02_degradation/02_letid_accelerated_test + - file: 02_degradation/03_letid_outdoor + - file: 02_degradation/04_letid_outdoor_scenario + - file: 02_degradation/05_letid_passivated_wafer + - file: 02_degradation/06_vant_hoff_degradation_model +- caption: 03 - Monte Carlo Simulations + chapters: + - file: 03_monte_carlo/01_arrhenius + - file: 03_monte_carlo/02_standoff +- caption: 04 - Geospatial & Scenarios (HPC Required) + chapters: + - file: 04_geospatial/01_local_scenario + title: Local Scenario (No HPC) + - file: 04_geospatial/02_geospatial_templates + title: Geospatial Templates (HPC) + - file: 04_geospatial/03_scenario_geographical_features + title: Geographical Features (HPC) + - file: 04_geospatial/04_scenario_geospatial + title: Scenario Geospatial (HPC) + - file: 04_geospatial/05_scenario_mountain_downselect + title: Mountain Downselect (HPC) + - file: 04_geospatial/06_scenario_single_location + title: Single Location (HPC) + - file: 04_geospatial/07_scenario_temperature + title: Temperature Scenario (HPC) +- caption: 05 - Advanced Topics + chapters: + - file: 05_advanced/01_custom_functions_nopython + - file: 05_advanced/02_pysam_single_location + - file: 05_advanced/03_pysam_api + title: PySAM with API (API Key Required) + - file: 05_advanced/04_nsrdb_distributed_api + title: NSRDB Distributed (API Key Required) + - file: 05_advanced/05_pvgis_distributed +- caption: 06 - NREL HPC + chapters: + - file: 06_nrel_hpc/01_geospatial_world_map + - file: 06_nrel_hpc/02_letid_outdoor_geospatial_demo +- caption: 07 - Workshop Demos + chapters: + - file: 07_workshop_demos/01_astm_live_demo + - file: 07_workshop_demos/02_duramat_live_demo + title: DuraMAT Live Demo (HPC Required) diff --git a/tutorials_and_tools/tutorials_and_tools/temperature and degradation.json b/tutorials/data/temperature_and_degradation.json similarity index 100% rename from tutorials_and_tools/tutorials_and_tools/temperature and degradation.json rename to tutorials/data/temperature_and_degradation.json diff --git a/tutorials_and_tools/_build/html/_images/tutorial_1_NSRDB_example.PNG b/tutorials/images/tutorial_1_NSRDB_example.PNG similarity index 100% rename from tutorials_and_tools/_build/html/_images/tutorial_1_NSRDB_example.PNG rename to tutorials/images/tutorial_1_NSRDB_example.PNG diff --git a/tutorials_and_tools/tutorials_and_tools/images/xarray.webp b/tutorials/images/xarray.webp similarity index 100% rename from tutorials_and_tools/tutorials_and_tools/images/xarray.webp rename to tutorials/images/xarray.webp diff --git a/tutorials_and_tools/_build/html/_sources/intro.md b/tutorials/intro.md similarity index 50% rename from tutorials_and_tools/_build/html/_sources/intro.md rename to tutorials/intro.md index 7035b3c3f..208fab2ca 100644 --- a/tutorials_and_tools/_build/html/_sources/intro.md +++ b/tutorials/intro.md @@ -1,14 +1,16 @@ -# Welcome to the PVDEG Tutorials and Tools +# Welcome to the PVDEG Tutorials -Here is a collection of Jupyter Journals that include tutorials and tools. -These are ready to read, install and use, or run in your browser through Google Collab. -Clicking on the rocket-icon on the top allows you to launch the journals on +Here is a collection of Jupyter Notebooks that provide tutorials for using PVDegradationTools. +These are ready to read, install and use, or run in your browser through Google Colab. +Clicking on the rocket-icon on the top allows you to launch the notebooks on [Google Colaboratory](https://colab.research.google.com/) for interactive mode. -As per the instructions on each journal, you should uncomment the first line -that reads `pip install ...` to install the environment if you follow this mode. +As per the instructions in each notebook, you should uncomment the first line +that reads `pip install ...` to install the environment if you follow this mode. You can also clone the repository and run them locally, following the instructions on the [PVDegTools Github page](https://github.com/NREL/PVDegradationTools) +For analysis tools, see the separate [Tools](../tools/) section. + ```{tableofcontents} ``` diff --git a/tutorials_and_tools/references.bib b/tutorials/references.bib similarity index 100% rename from tutorials_and_tools/references.bib rename to tutorials/references.bib diff --git a/tutorials_and_tools/requirements.txt b/tutorials/requirements.txt similarity index 100% rename from tutorials_and_tools/requirements.txt rename to tutorials/requirements.txt diff --git a/tutorials_and_tools/_build/.doctrees/README.doctree b/tutorials_and_tools/_build/.doctrees/README.doctree deleted file mode 100644 index dc723b125ad26bc812603c5eec2f7fc2f007acb1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10617 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 diff --git a/tutorials_and_tools/_build/.doctrees/environment.pickle b/tutorials_and_tools/_build/.doctrees/environment.pickle deleted file mode 100644 index bdf66382fc1c4a92297c3f4288060f5a4a2459c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1130779 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
yiLG;c{CZY90}4_-g{4%B_8vUXQgSqHi){#a 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 diff --git a/tutorials_and_tools/_build/.doctrees/tutorials/1 - Basics, Humidity, Design.doctree b/tutorials_and_tools/_build/.doctrees/tutorials/1 - Basics, Humidity, Design.doctree deleted file mode 100644 index 1a33982a8509b1afd1a0405436d1f976cbc59b76..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 107442 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 M8Dc+|h0a<0KS{}G8UO$Q diff --git a/tutorials_and_tools/_build/.doctrees/tutorials/3 - Spectral Degradation.doctree b/tutorials_and_tools/_build/.doctrees/tutorials/3 - Spectral Degradation.doctree deleted file mode 100644 index c93eb3c6e65ac9f9e1605a54f1b3788ab33917f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18090 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 bIn!=h0kRJ*XPfNCtWK+JydXtRU+Mn<8=!!S diff --git a/tutorials_and_tools/_build/.doctrees/tutorials/4 - Standards.doctree b/tutorials_and_tools/_build/.doctrees/tutorials/4 - Standards.doctree deleted file mode 100644 index b9c2bb706929c03b3d33076c23582479a7a4519f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18529 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 diff --git a/tutorials_and_tools/_build/.doctrees/tutorials/5 - Weather Database Access.doctree b/tutorials_and_tools/_build/.doctrees/tutorials/5 - Weather Database Access.doctree deleted file mode 100644 index 063c46f20359f61d95d91710613e095f2039add3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30670 zcmeHQYmD61b(SpcN;`U4b}YNGtz65pXLh?gntksoT{p5Gwk&I{NNZ=^tUz&woFPXX za!hjeQB{GHCV>?YO_5H5q)i_PiZn?dXww8J8Wc^FqCfg0K!P-F{`BFdO;Qv^fc`1a z=XdVqB{|%g*%^CP$B7Jh#UXiL=bU@q_weO`kA8J+2mdcPehHG{pH zQ)<+7+i(6-bNIc@o6TG>KnSt&ZxdxR6U)YDwTB4Yf>|`+P$Q& z({#GO{DG#J?On>CC zXkB|smg;%9iR%Gdt%<9>TB9ESD5|CFu3n~h8o?f4tH@R8S>LdWP2)jhzwwZF#@n!J;}O95QT+cH{?Fq7VXVmbNn;Ev zxfd%jMqBzD0)*9ytJaMqCNmR-iOGCnCOTnqEUA-iR>#j zEKBzl%k<)nFCk1jcZi-Srmxo$%N85kh~atYyzT3*t@}((?BFB8ru#7{ZuAZcn)?G1 z6zkM(EBaYYw(vv?V@;xe)AT>Fc;)h$C)ue>=h=0ABQGyJ29CnYuCC|Vi%x@;RGYaV z8{NY?ZH+laUo~x9$_9*n6`h99rdiFjiMiz2lEW$h%mx@KbJlDcVU(?!*q6-k{knJZ z#0gDb)h(y4yLsEyt$f8i)ZyHP(O$ud}bgQnPwG4_!p#)ve)19h-mhzBV$jDg@- zkBc&n^z>>x{3nycciua}Ag0xD&1O&C6Sw<N?Mt+j!m8z7451$+yVx3?4@q?Lq0^!&oKNqf zD(Y_Y`v3BI&$KH{gYYg%dBc2%S*lynnO9P=OV&cg5^5D!EWJ_O%7U3!9BPZV!Nbj( z>gx;&DDi5u)~GSh2U~Z_WpqxLB`|+%Je9eQQ)V^VTi9rqUSQsa2Z5M}{+h-1(;Rey zEd}O3$=1{j4;z$5DLUAO)V*NcBrz_%@YMM$OwKCWNMC!cO9Iv3hDD***SD;QimH2d z?%2^gA(5azDhWwqekeGk+ptVrU`y+ysC1U?r>_7PAc<$464$XuLv*Z~s^pP|Suq%- zFOXg1SeNW_RItwoPiMF2i!-6EdyB#IaNpp0TL_-&Tf?Tks6tVr`=dr(w4veDDxs_Z zR9r)3Tl+;GT50X zaaFyKCUW$mq_N2UY>`+`!ep+v;GkN2TdP`4K_V%%5{)Iq_a*Pe@O&xNOLy`hHRMqV zPdR~<=t@kicj+ZN-3*K60%o{G(xM7`z*a3NYs72ynq$MdB!Q&jx4sSm#AQgswEQth z7NM^RO;CtFYa=wa=)I6IH_5#`yW-R!;JCIY>=_rL&oxVsWDtWT-Q_k6sg#TmREJ`D z4nnV@+u*pC&^1Syr^lU)j7&f)C2=+~GC49L-sd{0&^);&O4><6Weru+Q8I&AP2He= z!&#A#Z9gVyTMovx z>;aCtM91=}bj>8EG8s)}GST8w+ccF^ubXxflj^pN@n{+2i56ejre*9;5^tjaZZm3+ zI2QDEwN{4`o{)1MH;rJe zl^PaT%o%JfwTmfc>l7PM-3@M(kx4d|Fv)6;*06MR3e(Q^8nB9hQ=gAyu zBM%!N3UUqh8~;Ub!V3&P9?Ujd0|CqyzViF0N6DI7Gfd#LM1cuzB|7x3S#cmH`RrjW z5V1i+vP^#iT?&~^E<)*9rbV4Udzvj>VKbBC6EkehX;>Pw9iMw`gb*(3tOW6IVsu?2 ztCCAcq9QmSof>=hxdyz{I*i!y`MKGvv_>pf$0DGZs`a|-tP5LKU#~khUPagdpe{ko zVik#%jWxOy_kC|XDie(4e^P`BhvaS; z^ev%@L4kS6{N>M>+V|eohk05Zq_>Y=JhmtzBUL#C606I*F`qjWHp;r7sJaILj2wx( zi4-Mj#E%#;Z{0S;1dsJZ?LAL>=dzqLuHp%gZr_9l#I}q3mUJc+w5?^PB+-Z`BN#}V zLn&HL>3Y&#Kf#vS0vlUa3T(x)S1i5k=f=lY%C1_vv7{8nmTulyIip)(MN2nV!2Aq9 z!r5zSDi&otSUm@Ld0nD_!JzG|A=KEsg{wxbsJqR@U}(K&o%HG|1*G@FB8Abis&gas z41xdX#pB`DjMg0+p1Q$EQg^GR@D79UFT7u)_z!ycQ3kwC_*d=y$iP@v0#XRvRP>e3B_MtG3~OyF??L; z5eQBOgJKa0x?4`sUF#m(h1E)O<<~J$T}w6WYEDSj_qb$za#(IrJkSZAz0VVXkLF3& z@jTt_o9B`Cs7(wemnC;vD>U~?8jw?sZ^ZL`|Mt!IWIMR_Mru8;X;){+e{B0!lIxY~ zd!F~u@edvM$u_r zo3zljs=kQ6MAp?E@KF-NYXD!oOTOICF5yObE-h&HNxe=cecdf@1owwNb*LVK%0g>U zZrqN~;|YGfuL)8j)48i5Q&nDIA&}lvN1|NMGI+LeY{Ax#mfaY%NsC!5t5 z(5(6{{Gq_bckwSLlA{-&{3QDP4*hPETohyoM~Z19g`%k@bLE1JT~u_7Cy_OSyZLJ+ zSmsKYaY&>59remb;OTVLf9N#IZff4G|DmY=W;7*DUvFO66=aB{6rTOjys$Gkz~6+^ zpYjS-*76R{c* z+)sWPOCOV5b4+qgRc36;SK!1c&R>8?XQJVV#U<1QTW1dkZV2%6=IafLxzz68}pQksqw^D zIH@rK1Xx6zHqWwnk|hgOg|cHJE0)254RfSyQWV9(?TYU3Y;ipuLg_@0H$4(IU{~u%ts{XlMLik7$gjTsHR1y<9Wsr%1EXgW) zE2gOrruyr;ORDduw~t;lBw5MXa6il+ybf%>`trvCZm^wg!Kla}>j9@R9OOzQT({oZ z5fIw#t>6zAp>vDPgHWH~&EW>~pe$R2vr$GTH#ENE5U^vp4ISn%LN=r}4Z{r!B3z>| zlFX}!4~_6$8FtKLeezJOUytATr;tan&gwcAZC#__au0 z{KgOa*HQ#r{Qz!6dg9?ttCZWJ&6AiKKAq~cr(IE%yFyN>mptyMQA|Z`l;2#N zd)1^uy!;;U@<-WIpdv{uL`2b^*NSknXF1EuMmND)7g%m`K0iA(K0i4=%ErbE)A{k4 z`MLS=;mo5k3&Cr6VRCwQB5I3lSKPgkjfgpWl4YNI?(CK9Xoj`^m*q#7@Ej*~#y3AD zbxA>9IbK+D8~WxKVyee0@6M{Gt0X+<*-@5-(@ImkI+P&#r5PsuQxX4YHvff#4WRv1 zT`?LpQ$xHod-Y}}T8&m7rF0+_OWH&*ISB_1cD1}VwNc~=$zK4*urxyMVB(F(gxJV1 z)xL~<+@qb|)$n`9J-l-V`umfRFQl_x`!oGSZ^HQdIw zFGO2=J9t5+baI6!1<50r@<6D!QbFnij$m>&|^B!!El9CW`0{7(je@FgtB3u3da%bez2>Q;JSo+6z+8BT7d?ZAp) z^P@}wr#BrAZBl)d`fA1W6u-7Xc8KXWG<_j5NW!0vJ({^acnyINiBh2#LVJ^XAJ-vMFH04~`SzlO{oZzv~ z;LXJiY|uy8ihTu&f60I;0L>g|x^XjmERRdhON-HA@X=-_6IvXm>%XdW2cB-936^z{xJ$FRU9no_~^nexI5j|~0 zPwb8PHrYr=BdaNGeC2{c)I6Z*XfTAdcwwnD^_EC!A|5*w#$)|r$AGLf_r4VwXRQvP zU>}cghNE^4(IsQD;mdIVFj^1n%Ge5Q^*dJk4gn6fh5&bU3jro)5WAn^uopiq*2Yf= z`_ISeG2zbl;KGcp4RQfrlZFejyW!#&Y3v9T@WTw;i4QA7SCQK;V_ZcY%8p1#;Mqf9 zi%gXk124~W&ZS{^5)XIOjFIw!@LS3B9UDpcdBg}QSzhEz2k>C zQv_-+ZbXr3oCr~CIBtS4MdIkp+c#&qe-;HGd}CpJu0T=#4TT3( z7qX`3pypHEEWx48-7n#NPp#KBJKDKfk^Un*YziHyUdUFcx|mXTtPK=2K%a09=+*)} z|LaO&0VTACGj$h7%yL*zvaq6CK#4m14V2pBt|Z7) z`A(wR8zl(I?3-Q^gbq%`2|_5DB_&Y$cFY-SeQ^e4Z$9&>4@NSy8bLmx7wxBvX`~qN zVq=_llBZ6jEr~PcErpSy!d@5j4b()ERlS535+2v%i9kGq$A{|`nvN`|1ceA5V=C%} zdtpyv49cpYqzvdm(fNH!L86z0(nXmi*x`tM;i#!uqa^J-6$GPTbITxHvm&jFmkEnT z>AOtWzrIGO@O+~;8(b0^(~T5~8NU)mpl??}vg*&L#_X&e8lUT@7}+zw8B@PpR}Ycw zWV3dgCdh#L8RAW-8YTB^@>aZGKi>1gp!RY}{^@weiJ@JI1DO-vxk}H|v?H!1^!Ww$ z?yJ`*YeSei{9Je4@jMeDm4x@5NwFRp4&rbcrQGeN9upMuJE=vr>ePo)LrVZ{x*tR7 z3#kq}qd#FB{8kJoIU%09Gx=JU8qY=cB@KpHMo3|h%8Pp@F_F)P3rS1Mv`&j^I>~0A zj+&)w3FTr=9X!6okKGY#nSjAph2IV&+SU(fv;2ZH8 z`XJU1@$d{3&Me|p6xI>NQmA$dTe|q-m}OpXRpxP;l8om{#nmf_=|Kcg&LJ03Qi~T^ zLNZB$$s`GJ06dXx!3Bk;udzBRnfZ~H{|jRh1X^>-gbb;m#-o(WF%pNpaT-w}AWhH9c&4Asu;#rUrAJrWA2 zVVFcnyw5r}rDlZ3#P*C?Oy_3F5fe-;7DH_e%B{1x{u(CA#y4Uddm+T7DclP8v`tIS#;<%cayHf@bR`T0gDJEY(x=}eJ-QLg5;j}rswy?p_Rf?0pw4oGb{ z*4C=^=i$4RDyKLVAreQUvjF{^ipWjPI5Z)(*$(O>bnc5UMnfiY zVtYM)Fr4|Z)Ee(#uPj}Tilmx1K_oF!h(3y)zby*UH~y0=L?4MbW-FuZQz7EL35Dpx zQIBodORGY3C01wV=Vqo0g*lv`nk~$- z7(KD{Cnt0N`p5o$^pC_0Vj&&RAQ<2W2okyn=?3y%O6!OPzSKGr9o-+wCZ6C#X-H$? zCyjVqH5VN8_4SFWx~`y(EOMssB{V9mm$$-MFp90A zwEGJvD}~RTMFnvVq0nCF(RO&%J>*{@wF-_dl;GPZlpB19!M={4neb=BweahJ@01ie zrbJIM+yLg~ZZv~?%8uisz=EE5NM%Z>S^|puDeIJKPlZbkQfcx!3YqZIIUc%vP}~WN ztau6q4HWr}HjEfHptK6C0gHEas!O8q#EK@A+KhoS7xL#oa2Tc40V@>BYIyP80ZlJ9 zDrkNX2YRTW58goXT&=lS{U>PRuLKAAc>x6_c^q;ABhj(pm&fMDP#U-yJkK2!E~>k5@+>$g`iXS_2K=g^&6L_u^EU<7!H>`Vc@ei0nPoBg55@sVVVy01ncjCDag* zw}QJ&P}2defkR3W#Q~!HhA5kiui2rSL;MaBMQxAp9^a~adP8#*6nVs3cT+K2Pe<7u zD!43Ka`Gto3J;5O+B`%DCg_+I781^KkK75yXs{oPp`yIp2a8S*gs&<5;0JxR zB6vW45DT|GoF$`DM0v-poM;C3(VKh%c$1&0MMQzuw$$rmj}@i>&x3Bcl`w7FZSr}{xN7t}@G?d7_us3)Z8?B~9`!ZSp&W;j=+zRgY zHc%>SU7;!}7S;W1;`530^}ArdS5vXWUTRP%8GyQ%{}w+LIyQzgH3Zs+O9qa-m4H66 z(Ew!*LbSf#pu(Q?4N3lC$dCct0`)j0_!&S0k|W$hJi==fQ}3bPaRtb5P`Qq#L?3p% zjtWdV3WeezvcG{T7`pCbko!t_>$<|-)d~_#VV)7EcqKR-)@lKH`G=%`XQzSN^w(kNMsQEd+IcLXJ)EjfV7RtZy@Ur1LWnpPhvxhnZ}h=V zT<)Ph#dWUwx1k1?Qa7Wwhgy0ZlB4oQ_q6m6iRk(yg6~WB6+S_w zEAVQv|1LFIs9(Jl2Fk<=1+t?omMMXz> zH?b|kI($(T-|+X5VCqa*PlLQEvgi_hSA@zq74-_7pgg@mWqeS+-DGVdQer!hc59Zz zgVlgYuUnPkfl$xb73>yY%o#X)`SNpEzx?Pdgpl~^EIz184!sYdNBL3J$VC$&7-De% diff --git a/tutorials_and_tools/_build/.doctrees/tutorials/ASTM Live Demo.doctree b/tutorials_and_tools/_build/.doctrees/tutorials/ASTM Live Demo.doctree deleted file mode 100644 index 8ef91a295cd8120fa6c8ab0483261f8229a2898f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 66369 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
  • 9;E+M(5Nt`(0Q?ADe|2EGo>FxEy93ZQP%RN%XEyR#S`r{?YFPVAMiFWL zn4oa(X-mc0U9m*sp2!xZs$|oeFKh0zwvz7ua$vfAMA7A63_zDawM2CJ2PzCQk9^R$ zTO3q+g;JP{98g88N%vimozeR&E{>(d^Lz(v$y{EBV8#T^Y5ai}Ub&3_hV?O}h{tVZe+QP{uvS_LT8(ah58(OR zmr?h_WTXs`hHN?*y*h#@4Cjc+j z@Hm)dm!XLve#(a!w;Tr7J~!9LvOASIJ)51&<)*STvvYHEGgH1{_daSWMdRay;nAxS z=Xkqr_ZN%~xEtk&6XR$A{d5#TIrEbtmt= zzv1qeZ>nb9Xy0)6B5IIKM|RtNjJ9CVz3dE3cXh|8m)h>oExw~$Wp8=phCA#ToUA75 z4D{y`h38v;J?`4 zG#W52=2<0ezwod-QpROD@^QEOn6Y7kR@j5KZ1r|`$tbi|0Po{qU9{7&!lY=zn=(y%p1+7)y$V+pQ##6(3wyzBINlI zam_*i%5H|zcAt!ViGZkl7E-`HDBvm_WbG%yA0n0AN2w1s2vr7&s_0YOJs>Z+0L4pq ze%PqD-N&&fMIM`c$!LH-&L^rrd)Kqmc(uXuFOp?19sMdPAG= zJWUSwgMN^O(Xca!aw}W)jMZG3XuI#Hl8gXK@=eMVh}3rX;(hw*>@?_ku(@1}fTuSK z{7DI(G7b^Tt{TmZX*kQ=2Btj+#G|oc9B#%eD#8B#!d~}D@MJCTPfx!CdAmUza?gF# z-h{zsBVUH00r{886tYj3QnlUvc1_1bd%cBuZG%vc^Rsx&BOY7#Nc*I3trqhQRAv&Q z_G+tvCJq8STxSLP3psEP++!8Z`Z9Px3Wh@@DiBE?DaY}6XiOKgaTiM^@JtPP>@kIr zc*-sthJ!}l5C4_En&-Pg^LnX7_tY`kj}c@Va@=dZEX3M9cc)QbYu{)U+`U4aVE%#? zVT0kT=kgA&bv7WLz&MWqDX^5>_eIQyC4t=Vn zB=2r_=iGEw`bGG+uaEyO=6;+$-q}=eg{yp>6bC3%=*wdYry5_rVYh$sByM`Af0f@s zIcZvOADWRk;FpiVA9lka25=V~TJE6`5%@yZc!E{_Et-qNx$;eXXwk?l%j)hBi6cPJcd) zsDjE5(4P#nx5`K8&oY53a{I&74y7vN0q2(PaVz(@g?kMB9z(vzQ13CsdkpO!L%P>0 zKLuuC1k3vcc4K58V(fm9eld1mBV-x7FA}nh-M0u?#*X4D1$N{lXY4AZTD9B*!FkQZ zIZ(v)ip;4Xn0Q0tTb2_X9ehJFhu=aD)CyMB7Zv>SeUX=b>ERH>Vc9BIIuwGBmAL89 z(*OP_Ebq$>cLa+IPbFGK_aV(S-9L|c0|jFbU($*9Z)50xsQnTIB|Og%xiw60gzAb0 m{WT`^dY}KAXZJp{UaaCuJxG%kn%E;SV_TlacSC4png0v>V*eum diff --git a/tutorials_and_tools/_build/.doctrees/tutorials/B-O LID - Accelerated Test.doctree b/tutorials_and_tools/_build/.doctrees/tutorials/B-O LID - Accelerated Test.doctree deleted file mode 100644 index 22c373d312fb35f37005a7319577145155ba8543..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53725 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
    vr0{QMw@V_RmH#!SO6BO20J6F9|a{b8nP68-C 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 diff --git a/tutorials_and_tools/_build/.doctrees/tutorials/LETID - Accelerated Test.doctree b/tutorials_and_tools/_build/.doctrees/tutorials/LETID - Accelerated Test.doctree deleted file mode 100644 index bf3403c129b69f2b8c54bf9ddf09fa47f10e2361..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 81923 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 diff --git a/tutorials_and_tools/_build/.doctrees/tutorials/LETID - Outdoor LETID.doctree b/tutorials_and_tools/_build/.doctrees/tutorials/LETID - Outdoor LETID.doctree deleted file mode 100644 index 96f27d4a7f5b4b1e682cd0918751c970e951fe48..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 108226 zcmeHw3y@^jS)N|I()3EJmn9oyudh}TGb>N`^lP5kUA!;JlC`7F?n+*=yKdd-zB7Gi zyZg5L-kyhzf}wD*DqX1*ZrgEiAW-B1iOWEWl!Jr87*d1^keGmzR48IYNO%=hRH~o? zq4NFbeII?NduDd^a8F6S_nv#sf6n>OfByeJ|M|~Dj|N8dZZ==87{eHXdwzhJ1 zt=95tj^FRyQ}e3brqc@gpXeX^?*6O&soq4#-t@h0r|R^3w;@Nh?lx*2r`5mS?;WP> zf!pwNqWs;yQw?0NrHa=N)DPD0zTTgzPxKB1ZqRUyPrY}(aPIPRXRWODVmGLHUdKAu z+HgBwi(26KsT_*kb=ldX_Uw@RV}0Jg}Cw&8ME-U2WLDk3>8lXxUBvbWg3@)-Nk|^+v~8r99o<-GRME zpZfLt>qpK%G+BRF&p)$t?Iqvo_}6@U+iuv`&I;uE*PeBQ_jOmUU3mGdvv%3@8vLna z*KEQbrTEv{8#QOG5_AKv73*0I}llah{|>IQYMvt&K*IoA7; z!?(WETK9aXUC-U1*Y~zMP9wMGZ7{N$sz2I$TT+p}Zt8o@rh*P9FxC!83ll+3j{1S# zBZDhJ9Rt4VN}e|>8H|tKK~&!DxR?Y@+ie8iQgXF~xA%em9+7xso#?JOshB=#mXMhK zc10|A74yXspN)_9_>1nqE5mhw8b;N;T{cWsGttWg9lPbbiEJaa*)70(M--lF_LT;> z+y@-1YPYPe?^r?Iv78Te*#z^6$b-7;TMc)mV|TW#z_XfQfsN$(U|YW1>^AJcsU^*g zX=}~ha0sFuSeuSjw>KR8Yop4JWw&aUzwHN3)57ewbJk_5*WvTeYT7p(pS90hMI$ip zt<{d#WUXDbSGo
    swdb8))bCsd^B!{iT^1_L^;PgW_Acj$_wQ5jdTnbG;d-HRA{N zO2e5sW_GS>H>#`yvMp{0+{U#*&8&rJUfb!|LAT>fTbp&aTBnXMym>&OEF9qzoOz%= zu+N;DSpV*=fpvowY@0-0e@@Me18gMZ)DUlaZhW^{Z1Ci+U+LvW8(PL6X`X+pB!AXI z@cc)6-mM;X-QN(Jc4j%M@sby)x!e0`Hc2+!M#IAYT^}qW;8VEm1(5C#h!!Ty(aRuP zk4@lC)7g`!`1B=q5nxhU z?S_rHvFQeN(0`}nVk*0>b*|o6nCA^|6G_Ir5iD{sitR*y;5}F5PMP_%Z)C@c{hO4FE~ zk3dQ9HF1xlVg{%NL>P!lXA7Dkd58pREPw8IK&GUrIkjXyGFAUI+2a`N_yCrp;2NY& zzQWW#=yMxx4O*?#R#)8y^igQTz7ts8wq=_Vjup{DFmSOfb|4w~^rbb`T~vXd_UkW4 z@MuoARNZO)gOQTyBS1Xp2{{6?QpSc}*w=n)3Xzpap0@K$Qti7Wy0+5-m?o1dbU_tL z8Q<(#XBDOmtL0R&n5T7(?=|d>Rdt|9)tn6%8VxOG;Ds0tU`COa6{Gh{KnSIS_#5u3L&VHTMQDV4Q6t&J{sPq){M5)8 zd`e>Q6C+?y6&ebIg^OKU%XYl(THVr*#r})@?Y; zUhs_9ZPm_oI$q}}nU2U3#JQ@!lzGB>yzRCXL}s=Lz7{u)bCAfH5*HQ8|!E!gMgqcY&eW&{)lLXEW1#gmQlg~ zrgye-2#bSWh6b$Sw%XmGZ<`k4UZ%BDaT;t%+3!8TvQ=Ths|YJUQReRwR8|8sBCr3? zLABgP#na$VDENKVq?)tUfB)^h4AEDm3IYk}^*)vp0+wv~Hue+}8X~7i!X!va`eQU( zPLAndOr41C$QoRReeSu()KqFPIP5lz~On@u#h`r!JqWoPF+MCL^*ly-U7$ zzI@^fF$;$Cc1@M6O>*sR;(e?{L$Sa&Z2J^3KX%8^#Jv7jK>hmvqo2RV z4-KV3xy3Fh_Z@(iM7isC;KN{wUB4Tj4blKCPNR(PmrFDM%N`22IedL0n^-OKw&Gxyu*N zy#T{#%X-#pKvqv%XI`APUb=J&yw0bgxVn7l;@Q)BkEG>yYAZRp>4(jbI)MkHb7FZ=4X;MnM{V3rmF3ldJ}~4R6^Q%NI?I^6WAKCwMB)f2-+;$cVuKj6f3zB zZQfPdezRn)LWQL*P`=~PwA+;p8~gs)$n&ie*5yvu$z*)HSs?=r5;~J|2a$;Q8iB}F z{f)_tFyu^Iq=FzL<9^r}WP6Kjvyjy{C1D|BLS4r)PmBuan5409UIZu=<2x~{hSZnS zRg8;Yfr_!M*lBonj;LY)7FRJg6ug~?`AYZB+iuJ5-(Th#P;Y2CWexhf+`+Pe_V28z zrsoG%2PQ4ZT5Lr(AS3+XSmtkEJJoKVCF*|x)2nff_R_8uu3`Cc!|Ak~Mx{8LFXpe6 z3v=b-?A*cv^i`4{$2m(snc+1TE%8vY6S4NaM81y z5Q5h(u$7nir?hwtUKLIj>#rMFnUO;g?7r6oE8r}HqeO9`DdH~V#T4NR#~6;vg}fZC z<5CiAIx9K51D~)BC+Bt6X7D~!%opZ?`T1hLRLIZI$gDuGmdDgGe+EV*yW0q6nALfP ztOXe38R@j;&$Mf+Gn=d6YdJife5E3qQDDtDdh}?94Mw5J-q}_ybhFkJb`Difj!j#W zoylXgN?Bd$t}Y1>CD{`!n^>*HD(#N%aPCN12jHO0N_HH$O0;C*Oq{TntgEmWv^=YL z-CBk@y$g>D#=D^f)vy&>giz>GA zhfu}7G+{kSj(?`?!nt`J6>})PG*k#!8R5Q zeieeT#&wZapaMWVn+b52yo*t#HABVBu7DzabPP5V{j>h4$+$82v;^gre{0MZ=`*%2YCz^I1 zIz&C1c-G#ICcO_fh-lh*w}st_XlkwH#**r>q_ubwS*t3x8>{B5vuRx*b5#`VrrWAj z{I=uNqF>-JjaBQ0Q>k|`>TVG0PTR99YYlJ3ZbXZ+RuH2~{J=GE{RvMUHb6kN7@^~g zG&$ZeR^|W{78e(@`2zm4^7*Awekq^N=I8ON0n*6TPEtmsi4hlRJ0=jAP?1tBC7;{B zr0i@QSRuC%ZN&Uyt`zIcF4_UO0+}gTE$ly53(*eUWUQ8xusR=Y#6mu|P>v?vEUXsy zAFIV^+g}f?&PE%tP|PjH2>51UwY2|OEk!%@dSEryhy^f;*etqPSS{~AR%7$*je^yM zn~K$3E(dZlG>FPzqmsBoxdhA~vq5f{J4;O8~c1(l9)>IJ!y| zYgz)u#yHtcrr4p^RpnUAcEV!9XiCK5U$UvdCNaZ|5_o8zT$rEBTODuHx4!aet1wHR zTHR*LKR(l@d}ODQ=KitahK}8j4L63pX>7RR#vDwjkjfmBfH6M(Mqw~x!wp&EhGVM3 z%EPhYCP4@dOiIS;*l@!*%W#C5kSiIhF>PXOxM4dfd*c8}SRET~1Y%!j>ygxbiT%WP zYQ~0}fowT}r-YJ*LG0LY6GGW=xE>0zW5Z37l`^JfhtNM1V#kJ?n}pc0;b!-U1?BF_ zaHHMCzCpe`N6vHKo|v21`ai~JxQM}-rBV-?jfjib!Bww=qjmk>UF>7nH|&29)(Gq>FaZDY_MImK8ObAz!g zIKEgGxw;^QIk#9A+*$Bb#}8aq03 z9sr9&v=U&2+ZEzd17LC2Z{hq>!6e&+LIY>fkBV!pQt&83zKKjQ}Jcl_H*T`W!T70INlOXJ+qJS7kGaf_uOO}2Df>FqLOe(+Y@k^F+ zBiFy1@ylG*+oW5@E-3;+QylO|$113yZdhEKVgs|Ix*?cCWKa^->@;=5RM{gFED_dN z1%;owm{5@ksqkg0dSew7DsV(vj$A$>A%`j-(kexX@IOWl<8iElGFmrP@WdIh(-L5?3aYKVe;qcQh7adX zaVu|zS$Ppa-fcz9yhfb7i6$yU);9z! z6jtvLvm>t{_95==QQ)MF8z$+m5jGOy_O1UoJ`6sby#9IWlaA1ra2__?#L0x>Gd?rla>wrZZ^wR^7JC53Fud7)c#g6=BD4eF$AR zAVT!5S}nxan>5Q*SeZ!*WFjib32#y!*+L{~mhLhKiW#rN8Z_duEbLR7il(Qe_%%AT(csp(OlmRbs zW{nhAkVE5V%?pDdj(pVrV0dobm3GwMY{8yp*OiYU0^<{~TT^@*#I?qcpnMB^XClfU z<{yp_Z?m~Zb8f}KwLEr%0^DrN&{zn9MIfeR=@ZsRCZB!ZbCXMx*qfR}xR|rc^nxub z_QJkk>xy13>rjBmq2>s_d;q3(>k^%!#s_U@r$QHnrQLd;I7W>e@tK5-7fjyp0pbnF znK1cZr8s!}dJ-NP?3nBtCb*oeS7mQRKSU4AHiw&;*rbHouPcMhct8X`T1;&N04&oW3aUlkcbD=APAdbw1?hbRI1F2ldXhA9$N(!(Mj_-Gmm|;rr=>#lT?%57Rx@1Sk@c@bi<5zgulyQ31jaE(ZqCt_gg76= z1qhMs9^Ng+5#;(w&HAHXVqzegAubYh4m{nAKpt4#0dnZ{$F7rxkFBw=SXh`d4&}Tw33eD(S znKZDeY>z9+H6q%9UGtyBf(BJ{9x&kO|6*xz)+DK6`VscXxS9PJ{-pil{A{T-G)qd_ zL%X^C81`WMVz~erfwl-r9%?*pA#06`h~#tRi-lsjXk;F$AGeUT8l=MK2OP|jj%_b2 z7E1*qv+M`{-NCtcUK$e;4rPxu+naYNd#u@lHbZhSQ9ul%|Bf|VIo*jz#1Eng4gD6f z-?3&ZhaqJ=#+oe`Y5Sx9rcZ&fX1hCXJJxK6p{wF8WUYp>DppKm&6X~UiN_mC)NHjs z!;g|7_{j6pG#qs_;2sU@e*#NyIHtKgu(tkZ_>_2D?T6DLhrAAq18eL5*Ypi|Z2bqL zV3G{hp|ff)9ZWr|#!jH=18LGk8a^JA>WByxO}LV*e3d!oBAwaT)y_obH`=o!^2Qxc=HXVDS zzV$m{lAl^JA%qPg!}KC{;v;0`9R>oOO9{1MGoJ#4N$=`=(nC^4mS$2`bbgqC zq_?a}BV3S0QFcU-R?48V(3z?{9sq(F^CBS922~u&QcwVb+0h~((gu};y(-UJ!Aw{Y z5GjMoEJ$Gx+oVMFaExb5P8Om>fT^pfJ7b*ApQRfk_r?cl;$ zT)o^{^Wk5PqvJmAa;gWo4cT5@#Z83dGbmB;K}Y}}x2 zH>zDqfdlF~ziU31c>>wwUE2gG`95X3HM^C?1!*^|HQG*^X?uTe1A!poO%B*ST%dDvCW)jCdc$Xw^Wn$tK#DVa>wsaE&_ ze7dBUU$rZt!p%77xDKvQ!o`;Ahoyr-nQmMQU)GE)v|9o*Sf1xs$pS&KbSCp2Z{i~CwPM@w+UV7p3#Z#5}*?i^l z3zZjNx_q`$sJwKkGPjtoY*n@^AFj~j%M}2_F%va3gaO>PirX{cRSjZc_Z6oM)744e zZZ{{dU!5e9s1Qlu7AcTKMUVvG%QN3&>K{`-yLA1Vi~5x#@t;8+?#ro?ANf1Xk@!ys z$=A^wi5WERNc_ixAdc+MJrS0#cc;o%qXm1DuQN=(`c7bV+m@6EEpY-1q7JN*Zc@KG zN#T-$Zp{IAYT%l7mF%_FWP0#nmCUZBwk{(KoAtN678P$y5KFRHccn!v;fOA5s)S+QuM`8tj3jd}ZZ zt0F1W35G{5Im3cO3$>&YQeef)$S+Byc92zRpOe7Ji|((CNoPztgSDV!(ovlKTkhH? z&i+%MW1Rg_z)M^?jmFs-G|t%{9t3e@&YlT#_Ipw}yU~JF&c5?Woew=>RdMnUs}&oE z^EzF@)h(v4GMzrttb&0;FBcm96lZ(HCOQ9{wrtPk3NA7pZP&Mbx(xT|F_g>!BL5_h z%}UPDdmU<4g!SJ2BCKEd&y2863?hTk2#Z1Egtep~Car$sXOEI{g*JRIz^tJMamj+L zp%b1<)-psdUaAd*C-rY^^U+$u;?=?G)@k7ruIz64ZO?aUaVWpn?d_Vq;W|Dt_-sj~ zb2vfWt1VeA*fJ}vZnM3OJh*PRN$VFzSWDIo8>`6Hw%2W~6&4p3k)g(xiB4mQ7Hw2O zz55_d*RDwMMc*XBEm@M>DwNjneAb>e*4-VuAuC&TJAP2%t;8+9{F}%dlWa>CExjs~ zj+!W!qgvhaDu_+nu~|iqFIQk=+};G-YBOJj=E9NZ;)MIf?#+B+5?@0#QP?5- zoaulOG4p*#dJ{un(#(9ak1&b7tT;f}sySNN2!%C3)I4RcX1+sVVKtE|tc*TsVWnHp z`y`v5*-aECyq#9|lMskZJ7C5ZK7Ag{p zFAAK&8p*$)k&|fTvFj9gq@F=!?bDxSw(H00_i{z2en=iZtskTqfm8JdWJ2%3OMFEa zUYq$hw(MrR;n4AYVLi2wYFn$_R+Z!rp=QOyqK?d{iD+{OH)QLbQU+RP(1rBrVyOve zO?wLq!zOUO3F9im_%SwCdW>?``FN&qo171I-3_||n=B2`lT*)CKH^tj&ElVC`_*GJ z{Ph|`u653N67)mCM64(AOpRa`UAj6xOc^0cvFsJ!>#R66Yh{~tnD=bbhm34AU<&?# zgYYL1tPS_WfWsP6$okOYbWf(OLO!3jp8UW}^Ml1Fb4+GU)gSHs{F@!)eNB@8EJBj? ziQZj^6kqRuqA!W8_wF4ANXBT{F`usXCnME{8MVpuX-DYul>5l@zo93CY<71A<8hB9 zkd%I{{{&#D9^G-yk&UKD-L9|fXS=$4B-U?y^fS94SEDx)OOoG&k#K;~wZwyX)2R5( z{Y1s>xs+yUi6#Yy$(v7xM?Q%S_SP_)8K+7T8E4N#xgD1rEX=VXPb{`Kq&KUW1mT-A zV&96h08rd5t4|NdpNujbbwb*2>gl49mbBVQSQCX7K)(Ya<2YEM(yEm2;N=t#u4sOl z(SqlMHDzS3Rj*FE6~8)pJsV4Hwh`uOCOP-9r>7iehM4d%b4w`P5*kLf<`8>%*gYbt z95`*Z|5eMKwFCPZ+C7^3NI1lfG4?Q1J}0H-Q)fWoB)fknzJ<(39SS0>?;#dEC-f^Rt;7K>I9eHJd#k(dXD@hS0Q$xi#coTUqFO< zmJ8Jti$27_BGwO@&!A2w1e6h6;L3QYnL+0*J=C11U{!PbfqgO(e&gsJ6jbc51&fL* zw(FzWau_tO^Zw-^h$9;b?+dTH4yCTUj27&PbN0SY+bj)oalrlwc38ldNSB3@DVYsT z@nw4%3!6H*QEYk?SFGLf*1#5g>xFZdpF7K?l^f6!s%hUKUkd~$6TTAA>wUx_Yj~T? z1i4Dap^oMUV3mp+Ue!+qv%8){6u?%u(U>}RU6)JYS<_an5E=3$Y~ja6fCzF#jT}~{v-d`2wUg$FsD-6ceo1=uB4g+%e<@cg zFU-#yv3~ejMVwj6&lSyU!DWkLl~a73ft4?&RbD9OO7jb4vldl*sW6u}PEZc4y_iya zA#_Rv8ADw!%;jcrvLq>PP`+F)7L9-g18b*%N`v}d2puqq)jppq&(0UiMlGuExov+lR`+|DQO`1a;co$ zJ#j!hwR?-X*~0AXyg@$-xA{V0c9@7zsGnjZ#L+A251rdV#!#<|3%NpJaemQ=yQ3OV zE|-T25rzg(@qrBp9p#EO0Q0&~o|~uH5o#F*xHMZR8B~WH$pefA5CR7_U^aDX&*LOr zezs^tx=|Pa;SCj(3k{&+0~;`x)_`(ucD7iWi^aDf3P(gFqg@gK_%|Mb2W?oiI^L#l zedW_uDJ25WSft*(2s~qvYRdDmNX=*S^U!E8VMDyFFczsyH%wvZW09IBP{tzljUiI? zhDD2(zDJ&yi{YqIa1WtBZlpstcMp4}=Sd{=M?DHAX^9@%2>F*-h|@HU|4A`tS;kt? zvefD@!!Fh`ML}q3#{kOp9A4xSF2inZGmC{J2o+NcF3^_@yje0S_ZLVl240bwA#tAtN6@fAqAg`S#r_Bi?MY|T4VwicYqbdkMV-X4Aiv!rs&i!pr|5d~0C=(<~4)m0G%#&oOn3ywCnN*~iL zUuSZZyrJk;OOfx3GU>3V$eukIh2{5qQB71r4U{7h55|}r8SKx{OY>lqk`g;<4)uD^ z7hfsa3y9hf9d6y|2bJ#+?+DzNx+7rpN$&{g7W5tzE`-e7&mHNs_aJ?wb5o&@VXr;I zL2f9&y|c~+9b49?N#*v!gYhq#2)`_bL;BH#Y0#t->9_aLKfs0p-vaoO8cXfB*ZalG z*yVRt;VKRXy&7v2c}ZF=T=7FbapIeg1HSOa7Kejv_{)8$i(j~tV%-*rr~H{cjQqjyi~pBireC6#x}5lSapMKR-)RR z@sXXp8JLTMje_FCalhL>3Bwfqb4)wLxwou0h8NMVM+PP0+{C&qNB01K(p_*3Gyk(^_6NCXeKWU!dI#7rsJ`(x-M2p&x^KOm!t4{`MEK`PUJgIYHhG{H|&A+eKF; zji&M_<}F_QeI<2{D?Axe=b!RMb;$p^13|;(hS9nuYsH2aO3hte?fUM9mIx-}SJJ_2 z2XtJ`T60?Lpa5LV;kg2b7xgT3TzD44b*0sr^UP`gph=6wMO*hG;vpItMGbi*Wepv*KnE* zoO#Ogb8UFb=hksRX6o#z%cm-5pSwtxEx!ChR+#gqA@50N@HItUNiE zvQry$L<2`N22Le8yZA{4z@^wabq|itILq+jg;OsSNm;ZJR!1Cpq3bHyNrq{0zyY(X z>f!``V4XToVfApxfd%NXFkfvt-=D>S4knJQOYZVkw(4P)A~HaG8&0!0)I-+|BSub* ztCzWq#t1s1Ux1#gljyT#1yj{#w&Z6E#}J*M=CoNbfk^JNEP1Niq&%5gg)tw9xp^Vw zW^mSnSVRXcHF#3ax&(LRdJwezrJ0${&COztjulC~;L6%&&hE}g7dfxv&osRiw*hwc zR57oUlT&lH-`--Ee%26~!EMN+J!5JZQv*?hQkK3Ctae|NrPKG_NiyMk1?!I5Ax3nc zWzabH`|d#yM^=^|4l7Idrz%TE3pD@LY`gb%k94Cfm-bm>Ev}dTJWE_bi5=T}-q3lp zW@c3OU|KceqoD!CE6_{%VJr-fo^{r6ppq}EjjjoSJ?OI*cV8S@fJI4gh6h1v> z!H~>n3f$s9MGB{`4x|O+k|q^dInzMHi(~mos-Su{4O$!(l-99ncRB?@F@3Vxi@=z&?oRKs!jw3o^kUGs^!kHA z5J#3?kA$Vy1F6!>Xo05Xw59&z7o8^JHR2$a$x{uPvLq>Gh@4swJPb$g;g+6K5Oi>n zvk(Lih{BlN>acjP5B>|ouOEo8ou)Av3v_9Z?jW=YadC7haIw4x|E^;7V6U-opU4G` z+@~eGVQscGvpw;7)iwqqs;Tz2x@?rc+)O$VnbTdt4e<0_h?I#T(@Y@8mB z$443tI)CZ!FdYBnx#+=t9wtGYwrBX`+ZDiZhohVlIgc`=rx*g9lYB}H$0;!eI_?4$ zyn*coSZoaJvt>b$e)_*u<@ekdg|=V)vJ@srzT;JSU$~u&(JR<;pFw}0Mu&dS};AR1Frm> zsV|nk$<1Y&nv}%Tbhxd-55wXN8!y@NHgTBE*2!072PY|8CYb^jqNFsHrjkp&0k)V4Mu?h>aBHnX!oP`0&kw$>VPBD!G zP38&$uah17Rnds?i6MnezEJIgv5yCv=-@3s*h+Ug1Gcg+y3_ak7}K5JtEBawbSDOl z>rN*IK^$3kdV5%RdN5UYGFqTD5WRfpLHiJ@lF+f)Iyu<{@VLqwl1*B5ScOuUd|6jwHt@aM1Vv zN2Ln}iWUrA@CPqp8SZcuPPPYlM#$`%PljRQb#y(GQzPjmbA${9(vV7;A`Hn5&uh~X z9|mo<@DJ#yGNKPTn^x0pb+JSf@Cl%(0U?0aU>JsONcFK=m=lQ7I^O8b)I;>Kk%ox$ z!%rj)(QZ_YXEV3mMpl0o=mC;UkQWV$eD-t1o#`;l)UhQTNW_&g^h3wfNt)sV2|%lE zV>hBf`x_*$aZa7fT&KozyQ{nk>jXA1I1~ni2mxao@vLDYQ-NmyC^uDuL+P~4S83}$ z1fjLE56@03YI$EI;)iz0M5Fz=w=pA&NNM~CI2o%ir&!>%D34EhXhGVL(4Ug*L zDgaeeL4vAb0C))&jRAV~VNd`n&T7ya*>-SM494X16!rueQC77fG2_b~&xrQ0jO^zL zHmwxrpaF!2f+@g zYH=FAqsOyVIfeGd+n6noCV2{5H8hU&*Q%UO$$2`I^Gr(4GqnA~K}rJIK}V~c)@TQ2 z0sGcak8Wj%3gXBDstiwX0~0#(LlTZrO!lmnD(?DJbnS6PWqP$h_D!kQ9+(8RD?4lzlxN5QNGLAeYA*0Qi*EuT@vYs-~WHHw)(#c23x#`2!F z2#Lq6ETv-BQ0giC(uitAqv&Z_G@8kJ4;2M*QPDFDlB|G@&wDT(PoH5RSE|QYE`#9# z@)-%4eeFL#=k!zc__4q}Ma zcZQb(j%7Jj;S(ksjwn1TQ(~(iuo-y#o1SrGg@Loa{n2ImpZtp-y^a0x4a+NI-Eyp3 zN}X}6TefcI%0#n;v2KY?qOooXeS551sx^J8N;}pql>$1}EorNoF0KZmIT9J_B3nzU-g;$e*+QlTRrN_n!7o7&N|r@`*tZN8UgAmhk?`L#g{GMhmpn z-q^o*gf4Rs+Xz`j*w~zq7cNi+Wi2!_M2=1B?SWx-FLKYo7sRhC8h_ls?qlwBcYG>BK}np`gXGyaS=x*6y04Na?9N) zK#O;{Fqmc=L10)Hvn>TW5{oMxgvB6dz0|_qN6^JdR`N1nXDY-2Cw8)e1e20V`0VQ;Z()MXn_{5 z3GyK^ez6%tsrPe=pLq8WV$rW{)bRffAAnW|=hU@EILunT0oE@$G#m}c(r-Gt z3T|!qj#$sp{>d}XU{lE6;@25*_f>T%P)&a^yw)Tudh_=~5&hwN_KE1f+F(R~2=Mmd z&^Lp|iT)l1F@fX~k`k%#>(ES86zz?N#!K5>&4kpLe%4ha(-@hG1}bOTyZvE zj;9x54U$7a^@woEoVadD^mEa>#oXfJ{CvTPUCcia){Di3gl_XuO2&GbpcP6nXdLSW zGeonjhG9JxG@N6-7{hKpmx}e+=;hHM`qQH{5bM;{cwFdwA)7DYzP+@#&?7{BH?Uqr zJaOGDi4Md{FE7N>XLE)5xy8bQlg%4l;bjU1!g_wLV1yv&Uj)|YV;=;q#|BqmJyv}> z*2@X-8Pbhd=>xHTOQPLttStghYC*$Quah{N92Pi{VKjarf3v8cdP5 z=57W~l;wP`2;wuv0{<{O2Qr?U&&Q~;l$)Q&rRMWVVsE~XD=p0Ci?N9fqQrd(^GQ-{ zZniuh*D1gW%JXxx2}Hb5T39T`7#GAssa#q}P?;dphrSSjIvb)&7BY9A@1!sgUxs!T zWgiUjvvYCD2gEPrp{@-^{A|JCc)S{c_)<)*05?cOd=d*zLwsz+!Ga0##z3VJ{4KeQ z!$ADv9J~G_#BLbkq3XrD!VnJzJrMB=#aW}DA;izdMnoV!HXxkh<61W~jugb32<8xdy$9o~pOn1b4 zIiDaG1m2DQOM*`{NeQ_5zOQNLGGA&E(Yzlz8xN}khr2RVqkap|@z+K!%DFM>H zlmJLOQ3BvD?x_?2nY05yxx*p=?&1bZ36M4tBtUE(5I}WK4KM6(`HXyGL6F1?{QJZc z-1@{5y!m9-XP&_mpT=q)(#8*_sB&SmEWV(}E+|b_?xuzrCmho#jXOoD2^<3@{jww| zcw#9~m{1&4anS@NrmkhW9#N~LvylQduR#GZ0u-o1w@OS}%k-xapqK}Z0)@LmWd{M2 zgDU7&EfB8QbOk8wC89vVFGPbvX6gGe2$VVN0NQ*tp7rD4Cq6|jY#}Kx0RU8v0jyQr z6@ayh?Lo6vvF(0_E4JOqI!G775-7Frtw3R`TY)NJ+~jt)0>yDikdy@hb+m2MA7Ezx7g-&1u(Lov&xxFPoVQ|dtHVKM$ z*fc0Uf`ls#3Qr~|a}vV+)w1xz9A4F=lJ1xw5+&xilmlfmPfgZ3=C20qad{;^l^JDo zS2lcNl1F^PRWN7>`-Jj>D5Yao=#wTIgTPp#AR6h!!Adc=4FbrBKz!oOV2%a+6LCxC z`axVtZhiAlXczm0ty=X7h$MjcM|@(W!}o3RDSS(>-W*id^o~`R1Se3?tfd@3@eD1B zT~>`prVEW#7hr;uxam(6axO#;ViHjDX6He;ghOoR&w}2^stb1x0Vep=HE|ePrXok; z<=d1>EB~?T!n~%1lED0=nTWwDfWlaHkyCW6y3CJNmvTg_c{8gn+LrW8)Kn8b^1A1n z+QsR@GpHtNry6KYirmy5vnJ`#8Zv@LT?EQVy{TQ=%W%T?N$U09Z)!In>cfuV){TBs z`#ZxYeBYLO!q;elKH+Nw(D;>Q4|lgBQg_wsc5p{53xFX4W8hUCzD)=SV&VE?eghf8 zgPC1T#2f#Pm6!h==ysjp^Jje{MpYabp2g5{}U|JiRX|**6L5=P%^u1r@CEj z;F2@9*+wuEi@#;sjUeX-+aOt7h%+^bATxB&D_!xj>aO9q`WBARvpn6EHabp$STpuk z&d0qli1^*EFfdab*wiFqjd&fz*rli}D@!YwMtEV*UWdZq%D1%+BEKUF3j&GBq7B>} z#2UhiXDMfv|K^a9*GetW=k~7};bIZdL&gJ%-$--)dX7)&W7PD9gDYZdQw@6sG0D-p ztCLS60`HSlAs$Z4hci!7IA>fSgDjKXHs(D-39J%kMEAEDgsI81Mr0r3A}imz`qXuu zdrRg<3>j)FVc6a(0yw}0n{I0hm_j*WHHF2e3S8t#btR8CfGO?+K`(eQl zpS)1{$oUJeKFOL?R9G;^Rtw*>I(p02efS0_IL z4653YVkH)y1MZa#_S97PY-i=s$GH1oXI$ zi%3Ygx5-14JcKf=b+JpHXFUNPjuZ^je`MJrZ!~^r;((0%C@W?+8q-xpw*qUr`LcT1?=ba6n$K2UM%xXN zITYsXQ}qXALhl1KG%D`ZE3_J`un<}mk1KcnE7oSmZqp@B4SA~;U6_D`6;K3l0%EYi zxLRwVLJ5iAPdinAw0B>q0%K5fk+G?NO*QJ_gl5PQPW+}(HWz`KI^y-;!piGtUJbWw z5*zN>-St~HMM4{H^k@-iH03>_ABn;vNsxyH%5SIM0UC{aP0I&y*JmbU1W*eTLiAe8 z*p*o_E*{m*FTKPsF4|N!7rHJdu;Z8Jn73 z_mYzm--+{B00Iaa+yfMp>S%y z^T0Tq+BlqAEOy!(GMrj!h$-xhN6+Le+sn};=GGZalZ#R2S_H2>ptq2l&lk(ZqLYnB zHF;~HH|=<8KIGS-$BL7|9?)CLmGk9=aw!SDv-nmj6&IasJc`Dfk9x_$e$eUPeCZ}p zFC4=1^ToN@B=iWpg4sZ!bf&LlU`@+rG>jH?t@;mpQuWJ^*UoO?ZjYlAJm?N9`9$; z>x?}*&>Yul_<76XK4>-jiK+xxw-9?kR6K6i!u(twUPLgvf92DbcFjLN(>|FwK2viy zsz*fa-W*bR-s9h*8pyn}4;V^asFb;3d-l$3_Ov8f}3ssv+98urGfj=f-S zZ0gtx_Qs};VX=o9yem_Oc8l`KRpiL?(s?B6IJ$=bQSEfdroUWTfT(5^Op;4W=*SHn zAcWqM@HbR|C?hr$Knw^E6Gj~D>9Kw145!n93nvX5}LVJWe zf-`si2pp6~T_*e#`eeL_MgbY#dXm^ptyq#;Zg>Hl8eW|;h=Ci;x3@+;5gdtg2F2778;MIV|p3v z1sa>L2xFi()%OA|Jn3ZQ9+j#dTmDR5R*y$?Gc)osPYgbn6hGKAQhStA}|!IkSAcW$v>XJiPp%$ z>CQ;dbihf%9DUXUa{yI>90Qdg(Wnw6CU`>Ts@@vfGIoYk(5A6E5!#!TqZk)DLfILs z6K05^u{sea6vem&EwPEn*zs7M7^@S^&pBBQi)sHtL?}t29#WJDB08SW6eyI+=}`V7 z-pA?$`JfSc@Mq3co}yECjkj+Sbwb-*dQp=`_}tH)4+4vGMX#Zns6A(()g^KeIA(Pj zeAqEHkdm}3;h57p^?L6IfencIm{YiQqaOr58a@b&bCOl3(Wub*I6BFTQ|iXyW}^lA zT%c}2?{ZLgvhwI9i>Q-jNB6Sw3}==d;mqO)XVzQIQf{A)aAw&N&MY0_%-UIggj2!k z+wuT*?|>IoyZx{-5r&TMdmTiKkCz~Mn4~*U@5HmG8T_+Bm2hUJ?U>E@D?!1 z0{`e3J2LQ(0sC7+7|S}X4Y%X9SUdxciK*Vtx`e(!J-p`?rihlsuR zP6o-!S_1o41Xj3J=O3D^vomz{JCkTNG<^>G2$WTI`t@n*((S#&)o!PQ)9@9MzTCT4 zrcijD{&Mdg#B~X9G}rI<9;_igL*O?29HIlY0>s4W_YS_yLSO0F5BD$kCJ-*i>DY+N zfbtV8W4Shv*2hgt0cE9(~s^pILLGrNH=IWQ{de>-b-STn5A+^%wp`#Uu!F8IGacw1s5vX$HNZQ(X?I${6>{Kg ze6zp2{=*2R^zq(dx7F?j6{l78YWUpmO>~3R>;mQsp5Gb%SaCWXuT!Zb+yr7T0m0P9 zYS8c94`K*IIl!Rwd+&;TiGW!Db8xZVVGdWfL6&}J_(P;{?*SSS9~i0wH;5PnqP?$y z$V^>C`~a$Jc)!DG^?MJ~`TkC=Qge7vw5rQce6Z@Z5Elx_nQ&_e0OhQ@TmAaM-eDVY zJ1RP((G z&vzc`*R~pn2(aO8!OsG%y?nP&O&_0Vs1fchcY?W2FfzDx~ zK1xrh1VKy!*K1*f30kfH@!p}1y{TS7n-9`-0?D-2K!FXn=?4At4@~wBx1DwcNO3R; zs|;cHQpySfD^zG!^xjbqg0{ajGlOJ5hsY*%ua)yUYcu`cBb1Xh068lZYN3JfB>mn! zNY6f%F9V;4JFC?QcuLXWzfFQCkpZMuZ#bQt>jbN;4$SwNdeCg3vI&Ie!t|*H_5SAedy*{rB}sX9>c+e9I+^&arITLJi79RZ>m6eOzOyQ|?5>EG)&ZOpI_bupoRAnIZE z&R;7O`bnVnUDdjc_E01jHXDIuhC-CS(QTuO!)P6gA|)8WYoH#l>b6!v1Ck>=L_EUp zu0-;&m@BBv=CkoG#*RQU%@wDHxr^9le%)~bRPsm_xo%XPrtLN=cC7}E*bbqfYRusdrG!oPuV9z>%+S_oc4Fc3qH zqRLG5?%%`|LM+2pkfkR?iks-YJ(?9!@2He!xd(c8&gK_ncmwvV4t~#Ok`I2zt1@Nj zdI`lysGu(o>NYjq79#5S{q-_F%j4L++e@-)JgJJ$4XQW+-hisRy@x`5r+8ok@U&h; zb%{+qiw|8IkX2c{caXRckc&7zcT*yNo?8DZ_~iPp($6Wd?e&xNgBXOjt^a-c`Qicm ze1U#``XGLOihe#vKR-@CAG#YqE&6fkXO(__j(+|v{d^qTd+Q&gpI;{MzeGPjPd`74 zpKfo0S`lowdGA;|USn-|jn)4etNS%p?`y2i*I0e8vASMk^}NRFc#Xk-jlq7cTYnrh z#X3~Km-VKeTJ!4(@6!naCPA@~sDoq)84N20LAm)m+7h$l7~Ne&-EjGG3Z^UzK1K0}if>7M`uG3x*T diff --git a/tutorials_and_tools/_build/.doctrees/tutorials/LETID - Outdoor Scenario Based on Accelerated Test Result.doctree b/tutorials_and_tools/_build/.doctrees/tutorials/LETID - Outdoor Scenario Based on Accelerated Test Result.doctree deleted file mode 100644 index 31ac8b9f07eefa6026ca249c5ae9c76a503e7bbe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 177565 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 diff --git a/tutorials_and_tools/_build/.doctrees/tutorials/LETID - Passivated Wafer.doctree b/tutorials_and_tools/_build/.doctrees/tutorials/LETID - Passivated Wafer.doctree deleted file mode 100644 index 86b3135652249bcb9021af08c3bebecf53f505d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 97887 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 diff --git a/tutorials_and_tools/_build/.doctrees/tutorials_and_tools/2 - Degradation.doctree b/tutorials_and_tools/_build/.doctrees/tutorials_and_tools/2 - Degradation.doctree deleted file mode 100644 index 8d71e0612c99e0897a2176379eeef9ff72d2dffa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36054 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 diff --git a/tutorials_and_tools/_build/.doctrees/tutorials_and_tools/3 - Spectral Degradation.doctree b/tutorials_and_tools/_build/.doctrees/tutorials_and_tools/3 - Spectral Degradation.doctree deleted file mode 100644 index fcace53044ed9d988fa624fe0c2de9cfb947ebbf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20391 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 diff --git a/tutorials_and_tools/_build/.doctrees/tutorials_and_tools/LETID - Accelerated Test.doctree b/tutorials_and_tools/_build/.doctrees/tutorials_and_tools/LETID - Accelerated Test.doctree deleted file mode 100644 index feb81abd888023b04563a550a4620c6ef6f6030a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 84649 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 EkKyIR^DD)6ublN+;?u+Y=;{oKz(jLC? zRQH%`RlH`WQQBSyx>FA+$6c>&1EtGp5EzgPlBYxpAbvQdM9=`G3I*MPag^x45F|W@ zgTKHF!*TG37DV@SH&rw1!Ouh86V|rvm0aL0bzGV0Q1?*PDt9(O@A#J4ZbD+n(YDM+ z@8;%T!}S$E&^>N9TOF@tH7iaPk9*yTj<-IuIOE#*{_*g`k_AwtcBuyB1ppI4%*12G z>vf-ZI$oH{A*Rynz7%;9A+h!2rZ$0Rs?P*F7e| z1|jMyem`wBd)*JU0o~ND;?Q*q>VaZx7V+VV(*(F0gfn4Rp`g~fz1^!F?jAP*W>Hc} z-KTBn)Uj#@;NXGYL86?1Q}eERj0JwAYFRF+HN_nRnp&N z^{9BIhqh}2NP}pVsRHnHB4XoP@+w0wUVX}L?Wwn3~wr&A4s=@+$ zj#A1dc&A>`{kEFtwcO>|StPp|fPB=PX2xl6%=Wq;p`6SBa+V0J3c~=J;|S7cUda|9 z&*Sa&N`yS6DDvMf$)lH=5NhRt)y~+Kx6Wmt*U#3xMjeGs0OJnbr|Q*uZyf2q1f6V@ zf_@oPpyaklL*DJa;O+pKYr9kflp4^vYS7JF*?b8f>#5BqEf9omJUKE%Jp&k}&< zOkcDwRcZi0tPrRP_eMyWMToZ_bXq9lIJjdJFMj}d7uw@g?B+UjK#mA6(iq`(%8`5w zKZ3$c(Ho!P;Rrg@C|gzZT>u2SHOul)$VV#3^`K-mOuJq(t5q6Zne7uqnZ{h#s;`Uj z?A`7`tNE~Zvs3OK5#tE@FI3S6h6*}|SMtpEhJ|qnigN-?LA8MBLNowGD8}sPx6p+u zPN(V3&^N#>PINyS%?jv9dMg-sYlpfA=azC3H-f(hU;=-DzMll%(~T9SPmr6xM@9su zBh=-D;;CUb0WRbAHh&+F1N@4o^0H`r3kv?zeg!Ac>r-^6`(mi>P2genk<;eyqPRp> z{{#;@)FA8f_3mLBg&k_#6?~;!-DwI_)nq*G&Iiru{C{eV1vz%kK7P#zbsPNKkI0tqD_ t4U)O*9<`g5dZ&tU+u5LAo2t?r=T8S@rFBz{9Tx^cy#p)honEJ$`Tr6;zN!EK diff --git a/tutorials_and_tools/_build/.doctrees/tutorials_and_tools/LETID - Outdoor LETID.doctree b/tutorials_and_tools/_build/.doctrees/tutorials_and_tools/LETID - Outdoor LETID.doctree deleted file mode 100644 index 3787cb6eea2f04532a559573f059415feb19dfd2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 109634 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 diff --git a/tutorials_and_tools/_build/.doctrees/tutorials_and_tools/LETID - Passivated Wafer.doctree b/tutorials_and_tools/_build/.doctrees/tutorials_and_tools/LETID - Passivated Wafer.doctree deleted file mode 100644 index db39c108b3bbb797187a421a8a6a941701c7e417..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 100671 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%0DfG_4jCVgm)cI%n^2 zV->yT|J?5$HMUHrfVXklws>g2yT5D{+v|XL_a?8#f+ujOv)(yZ{m7x)Zu?I6ZnM#B zI|ZXrvdSPRYLK^`wZwb^)x0|HTZ1*wMyRoSFA*IKW}}E*v!;XV+#@x;vED`zb&$G@-**^| zj{63bov~VF6#7BQKbSEklacrUf|X!PfH-4j84L=;Vyja*;NGpHo_s-Ga_=y~Q%B0} zdb8m39Vp5!utIqa)Sd^Jd)O7m(KPPzQqwltWvj4NCtkW2Lc_9+g4&X?N69H{m@u&z zZ{AZVo3>u8(TjLk9u)HdbL%d=jExzVGzM&Hv+bJ{wjRrw0 zcfQj-+|oDwpWw}-G^xNcjdgHf&8(YF=h=HF+`F4bvjCzPsDoHy1iOo_(7CPx%?kHH zQDPRCZREyqDpn&&wW~Ys{q!V508bX^2rm_u?zo3=J@IHN2YTM!S}TRX(-jH+?E*Z> zRS>m=ibF}$aMoBKnDsLir(Q#6V~$?L^nr!bIeW-`7(7`o`18_#fr8y64td$V*WN~H z@vTAy_GOK1%#M3!%_7#n3q=eu!(M7*LfatJ8`y9Dvw(tlx<}fFQ7(bXKN>AQ(LiNJ zLUI7Ko9NJqxv@H z?lw@U7>0vR?l0k~s|BO3o3(;oE|YX+XdflWG~_7FxW?t#%kDm-vC%o#F1m-f9Krkr zD ze8F4U@9xXxG9p-)efJH4E13IHhJf4EmAX7uSI~@>BfQH|i4(6|X?LotxGg;G?(Kfp z_~v(9@6~YxydGV*-TMOXPMd>0=v4hybQg(g4L8~}AZwzzdw`@6hd%XI8 zplenCfm5JUZIck5c1V$>EoyA<1_T} z5%R$QAbp%baj@zm^zl^!{ipb7yJOU^v)$zH!+L(1_4;!4!$A0D2K{9Q`DF(6Wd`wO z2JK}A>E(9i5v=nJ;mTbM+iIEc{vpEYQ}m5t_Z2uutB<2BPxTXYgW;-%9GLBG0`h)bYB2ItJX?N!2MxZ-W{kxSZ&zcqGk0k+>2CG74HC51kT=We@Ev6Bq+ulvKWkKLuT-f{lzD6`LKVPP5Z-Uqf~2`NzAO%jE|LRee{+R W((v3^ecOgIQENlPy54CQlm8zX{`#f> diff --git a/tutorials_and_tools/_build/.doctrees/tutorials_and_tools/Tools - Module Standoff for IEC TS 63126.doctree b/tutorials_and_tools/_build/.doctrees/tutorials_and_tools/Tools - Module Standoff for IEC TS 63126.doctree deleted file mode 100644 index a8bb2cfda82aa19a11d6834e2939de6ced2b2e6b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 82636 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 HwG^za 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 diff --git a/tutorials_and_tools/_build/html/.buildinfo b/tutorials_and_tools/_build/html/.buildinfo deleted file mode 100644 index 5b9fd6ca8..000000000 --- a/tutorials_and_tools/_build/html/.buildinfo +++ /dev/null @@ -1,4 +0,0 @@ -# Sphinx build info version 1 -# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. -config: 99ea9d5a0b679785d9fb1ec934454af7 -tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/tutorials_and_tools/_build/html/README.html b/tutorials_and_tools/_build/html/README.html deleted file mode 100644 index 655943549..000000000 --- a/tutorials_and_tools/_build/html/README.html +++ /dev/null @@ -1,542 +0,0 @@ - - - - - - - - - - - - TUTORIALS for PV Degradation Tools (pvdeg) — PVDEG Tutorials - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    -
    -
    -
    - - - -
    -
    - - - -
    - - - -
    - -
    -
    - -
    -
    - -
    - -
    - -
    - - -
    - -
    - -
    - - - - - - - - - - - - - - - - - - - - - - - - -
    - -
    - -
    -
    - - - -
    -

    TUTORIALS for PV Degradation Tools (pvdeg)

    - -
    - -
    -
    - - - - -
    - - -
    -

    TUTORIALS for PV Degradation Tools (pvdeg)#

    -
    -

    Jupyter Book#

    -

    For in depth Tutorials you can run online, see our jupyter-book -Clicking on the rocket-icon on the top allows you to launch the journals on Google Colaboratory for interactive mode. -Just uncomment the first line pip install ... to install the environment on each journal if you follow this mode.

    -
    -
    -

    Binder#

    -

    To run these tutorials in Binder, you can click here: -Binder -It takes a minute to load the environment.

    -
    -
    -

    Locally#

    -

    You can also run the tutorial locally with -miniconda by following thes -steps:

    -
      -
    1. Install miniconda.

    2. -
    3. Clone the repository:

      -
      git clone https://github.com/NREL/PVDegradationTools.git
      -
      -
      -
    4. -
    5. Create the environment and install the requirements. The repository includes -a requirements.txt file that contains a list the packages needed to run -this tutorial. To install them using conda run:

      -
      conda create -n pvdeg jupyter -c pvlib --file requirements.txt
      -conda activate pvdeg
      -
      -
      -

      or you can install it with pip install pvdeg as explained in the installation instructions into the environment.

      -
    6. -
    7. Start a Jupyter session:

      -
      jupyter notebook
      -
      -
      -
    8. -
    9. Use the file explorer in Jupyter lab to browse to tutorials -and start the first Tutorial.

    10. -
    -
    -
    -
    -

    Documentation#

    -

    We also have documentation in ReadTheDocs where you can find more details on the API functions.

    -
    - - - - -
    - - - - -
    - -
    - -
    -
    -
    - -
    - -
    - -
    - - - - - - -
    -
    - - -
    - - -
    -
    -
    - - - - - -
    -
    - - \ No newline at end of file diff --git a/tutorials_and_tools/_build/html/_images/107f7fef49ab36e6af4427e6bb3ede63b6f2c49cc28e8bed9978b78a2fc25f9d.png b/tutorials_and_tools/_build/html/_images/107f7fef49ab36e6af4427e6bb3ede63b6f2c49cc28e8bed9978b78a2fc25f9d.png deleted file mode 100644 index 858d19b46e9ebd7feaf1ec30e6a0e9930839833e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36505 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