What’s New#
This page contains the release notes for PVDeg, documenting new features, breaking changes, bug fixes, and other improvements in each version.
For information on contributing to future releases, see Contributing.
Release Notes#
v0.7.0 (2025-12-05)#
Breaking Changes#
Update NSRDB weather data retrieval to use PSM v4 instead of PSM v3. Instances of
pvlib.iotools.get_psm3()replaced withpvlib.iotools.get_nsrdb_psm4_tmy(). (issue 286, pull 287)- Enable multi-material handling in the Scenario class:
Allow material parameter in scenario.addModule() to be a nested dictionary of multiple materials from different materials files
Update utilities._add_material() and scenario.add_material() to support this functionality.
Enhancements#
Remove kinetic_parameters.json and merged parameters into ‘DegradationDatabase.json`. (issue 176, pull 248)
Update citation references in documentation homepage (
index.rst) and README with current Zenodo DOI link, JOSS paper (in review), and software record. (issue 283, pull 302)Add CONTRIBUTING.md with comprehensive guidelines for code contributions, pre-commit hooks, and database contributions. Highlights community-driven material property and degradation parameter databases. Includes detailed pre-commit installation and usage documentation, and ipykernel setup instructions for conda environments. (issue 145, issue 293, issue 296, pull 302)
Configure ReadTheDocs to build documentation on every pull request for preview and review. (issue 258, pull 302)
Restructure tutorial notebooks and migrate from
tutorials_and_tools/to newtutorials/directory with improved organization and naming conventions. (issue 232, issue 271, pull 302)Reorganize tutorials into logical themed folders:
01_basics(4 notebooks),02_degradation(6 notebooks),03_monte_carlo(2 notebooks),04_scenario(3 notebooks),05_geospatial(5 notebooks),06_advanced(4 notebooks),10_workshop_demos(2 notebooks), andtools(3 tool notebooks).Add newer notebooks to Jupyter Book build and update table of contents.
Update notebooks to load pre-saved weather data by default to avoid API rate limits:
03_monte_carlo/01_arrhenius.ipynb(Miami),01_basics/04_weather_database_access.ipynb(Golden, CO),03_monte_carlo/02_standoff.ipynb(NYC).Add jupytext configuration and Python script versions for all notebooks with pre-commit hook synchronization for version control.
Update Eagle HPC references to Kestrel (NREL’s current HPC system).
Update all configuration files (
_toc.yml,_config.yml,myst.yml), GitHub Actions workflows (nbval.yaml,testbook.yaml,deploy-books.yml), and CI/CD pipelines for new structure.
Add pysam module to support InSPIRE Agrivoltaics geospatial simulations. Currently our pysam wrapper implementation is largely project specific. We aim to generalize this module in the future to support out of the box geospatial pysam calculations for all users. (pull 252)
Expert options added to pvdeg.geospatial.analysis. Details are as follows:
preserve_gid_dim optional boolean flag. Keeps model outputs in
giddimension rather than converting tolatitude,longitudedomain.compute optional boolean flag. Prevents eager computation inside of anlysis function.
analysis(..., compute=False)will return adask.Delayedobject which can be used to build a task graph.
Add new (public) module
pvdeg.pysamto wrap NREL-PySAM for easy SAM simulations. - Add new (public) functions as follows:pvdeg.pysam.pysam()to run SAM simulations.optimal_gcr_pitch()to calculate optimal gcr and pitch for fixed tilt bifacial systems according to latitude and optimal GCR parameters.inspire_practical_pitch()to calcuate tilt, pitch, and gcr for practically constrained systems according tooptimal_gcr_pitch()inspire_ground_irradiance()to calculate inter-row ground irradiance for the InSPIRE agrivoltaics irradiance dataset.solar_resource_dict()to create solar_resource collections for SAM input from PVDeg weather and metadata.
Deprecations#
Bug Fixes#
Update MD5 checksum references in documentation from old hash to new hash (pull 276)
Dependencies#
Contributors#
Rajiv Daxini (ghuser RDaxini)
Martin Springer (ghuser martin-springer)
Tobin Ford (ghuser tobin-ford)
v0.6.1 (2025-10-04)#
Bug Fixes#
Include 0.6.0 changes in the whatsnew.
Fix formatting in README.md
Update logo in tutorials_and_tools/_config.yml
Contributors#
Martin Springer (ghuser martin-springer)
v0.6.0 (2025-10-04)#
Breaking Changes#
Update dependency requirements: - pvlib-python: was ==0.10.3, now >=0.12.0 - numpy: was ==1.26.4, now >1.19.3 - scipy: was <1.14.0, now >1.6.0 (issue 103, pull 163)
Remove deprecated vertical_poa function from pysam.py and related (incorrect) reference to standards.vertical_poa in geospatial.py. (issue 167, pull 174)
Replaced ambiguous variable name l in :py:func`pvdeg.collection.collection_probability` with diffusion_length to enhance code readability and maintainability. (issue 198, pull 199)
Replace print messages for failure or succesful addition of objects (location, job…) with try/except blocks and warnings in
scenario. (pull 192)Refactored and cleaned up :py:mod:pvdeg.humiditiy by removing unused functions, improving docstrings, and standardizing physical constants. Full details are as follows:
Remove unused helper function _ambient()
Remove _diffusivity_numerator() and _diffusivity_denominator() helper functionsby refactoring them into _diffusivity_weighted_water()
Remove legacy comments and commented out code
Clean and streamlined docstrings, for example removing redundant docstring from helper functions
Improve function docstrings
Introduce a module level constant R_GAS for the universal gas constant and replaced all hardcoded instances of the gas constant (0.00831446261815324) with R_GAS
Add Ead argument to front_encapsulant to enable user to specify custom material fully, previous behaviour enforced the Ead value for EVA material
Improve argument handling in front_encapsulant to include check for presence of Ead. (issue 202, pull 212)
Rename several variable and function names in
pvdeg.humidityto improve code clarity and maintainability. Full details are as follows:Variable psat and function psat() to water_saturation_pressure
Variable avg_psat to avg_water_saturation_pressure
Variable surface_outside to surface_relative
Variable RHfront_series to front_encapsulant
Variable t to backsheet_thickness
Function front_encap() to front_encapsulant
Function Ce() to back_encapsulant_water_concentration
Function back_encap to back_encapsulant
Enhancements#
Change
GeospatialScenario.get_geospatial_data()to a@property, now use
GeospatialScenario.geospatial_data
- Change GeospatialScenario.coords_tonumpy() to a @property, now use
GeospatialScenario.coords
- Refactor META_MAP in pvdeg.weather to module-level constant (pull 182)
- Update pytest workflow to cancel in-progress runs for the same branch in favour of
running on the latest commit. (pull 191)
Add support for pandas dataframes to
pvdeg.weather.map_meta()(pull 193)Add a new GitHub Actions workflow to automatically run flake8 for linting on pull requests (issue 164, pull 165)
Lint codebase for PEP8 compliance (pull 166, pull 175, pull 196)
Change default for
find_metaargument inpvdeg.weather.read()toFalseto avoid unnecessary network calls when reading local files. (pull 223)Add “name”, “units”, and “value” fields to the materials JSON databases AApermeation.json, H2Opermeation.json, and O2permeation.json. (issue 211, pull 224)
Add new (public) function
pvdeg.humidityto calculate relative humidity from air temperature and dew point temperature. (issue 227, pull 228)pvdeg.humidity.back_encapsulant_water_concentration()andpvdeg.humidity.module()now raise ValueError ifback_encap_thicknessorbacksheet_thicknessis None, and no value is available in the specified material from the database. (issue 237, pull 238)Remove “materials.json” and all associated references. Users should now use the “O2_permeation.json” database for oxygen permeation data. (issue 240, pull 243)
Remove private function
pvdeg.utilities_read_materialand replace all usage with the existing public functionpvdeg.utilities.read_material()for improved API clarity and maintainability. (issue 256, pull 257)Refactor material database access: separate functionality into two distinct public functions:
pvdeg.utilities.read_material()returns the full material dictionary, including metadatapvdeg.utilities.read_material_property()returns a flattened dictionary of parameter values for computation.
This change clarifies the distinction between retrieving raw material data and extracting parameter values for use in calculations. (issue 256, pull 257)
Update pre-commit hooks and add github workflow (pull 267)
Deprecations#
Bug Fixes#
v0.5.0incorrectly claimed thatGeospatialScenariowas moved topvdeg/geospatialscenario.py. Completed the move.Code cleanup and standardization in
pvdeg.degradationmodule: - Improve readability of mathematical expressions - Refactor redundant helper functions - Update docstrings - Remove unused functions and variables - Improve code consistency (issue 177, pull 178)Resolves non-deterministic source ambiguity when picking NSRDB TMY files from Kestrel when using
weather.get(..., TMY=True, geospatial=True). - PVDeg will always use the most recent version. - Added newkestrel_nsrdb_fnamesattribute to returned weather dataset for traceability.
Dependencies#
Testing#
Added nbval-based notebook testing workflow to CI for validating tutorial and example notebooks (issue 179, pull 184, pull 268)
Add tests for
pvdeg.weather.get(). (pull:249)
Contributors#
Rajiv Daxini (ghuser RDaxini)
Tobin Ford (ghuser tobin-ford)
Maxx Millstein (ghuser maxx-mill)
Mike Kempe (ghuser MDKempe)
Martin Springer (ghuser martin-springer)
v0.5.0 (2025-2-7)#
Enhancements#
New Logo!🎉🎉🎉
Created utilities for parallelized downloads of
PVGISandNSRDBso users can download geospatial data for at home simulations. This will interface nicely with the soon to be releasedGeoGridStore, allowing users to grow stores of geospatial data overtime as their needs grow for at-home, large-scale analyses.Documenation overhaul. Significant
User Guideimprovements. Added geospatial information with visual aids, added meteorological data page and materials access page.Suite of utility functions to facilitate accessing material parameter json files.
Moved
GeospatialScenarioclass definition togeospatialscenario.pyRemove kdtree as required argument from
GeospatialScenariodownselection methods, kdtree objects are now generated on the fly when required and saved to scenario object for future use.decorators.geospatial_quick_shapearguments modified.numeric_or_timeseries, now takes a string('numeric', 'timeseries')to determine type of outputs rather than aBoolorIntpreviously,
0orFalserepresented a numeric/scalar result, now this is represented by'numeric'previosuly,
1orTruerepresented a timeseries result, now this is represented by'timeseries'
decorators.pynamespace changed to defaultpvdegnamespace. now this can be directly accessed viapvdeg.decorators. This reduces the need for an extra import.geospatial_quick_shapedecorator namespace changed to defualt pvdeg namespace
Previously,
import pvdeg
from pvdeg.decorator import geospatial_quick_shape
@geospatial_quick_shape(0, ...)
def myfunc(...):
....
Now, either of the following options work.
import pvdeg
# now takes string instead of integer or boolean value
@pvdeg.decorators.geospatial_quick_shape('numeric', ...)
def myfunc(...):
....
# this is the style used in the PVDeg package implementations
import pvdeg.decorators
@decorators.geospatial_quick_shape('numeric', ...)
def myfunc(...):
....
Bug Fixes#
fixed an issue where pvdeg.geospatial.elevation_stochastic_downselect would return metadata row indicies which were downselected instead of named gids.
Contributors#
Tobin Ford (ghuser tobin-ford)
v0.4.3 (2024-11-1)#
Enhancements#
pvdeg.geospatial.analysis implements autotemplating. No need to specify a template for common pvdeg functions during analysis. Manually creating and providing templates is still an option. Docstrings updated with examples.
Suite of utility functions to facilitate accessing material parameter json files.
pvdeg.utilities.read_materialcreates a public api to replace the privatepvdeg.untility._read_materialfunction (to be deprecated soon)pvdeg.utilities.search_jsonto search jsons and identify keys for desired materials.pvdeg.utilities.display_jsonto view 2 level jsons in Jupyter Notebooks using HTML.
Contributors#
Tobin Ford (ghuser tobin-ford)
v0.4.2 (2024-09-13)#
Bug Fixes#
Remove duplicate gid’s from
pvdeg.geospatial.elevation_stochastic_downselection
Tests#
Added a test for Xmin in
test_standards.pyand removed dependency on pvgis.
Contributors#
Martin Springer (ghuser martin-springer)
Aidan Wesley (ghuser AidanWesley`)
v0.4.1 (2024-08-30)#
Enhancements#
Diffusion
Created a 1D diffsion tool.
Tools - Edge Seal Oxygen Ingress.ipynbCreated a diffusion module. Only has a 1D diffusion calculation function (
pvdeg.diffusion.esdiffusion)
but 2D calculation combing soon.
Contributors#
Mike Kempe (ghuser MDKempe)
Tobin Ford (ghuser tobin-ford)
v0.4.0 (2024-07-29)#
Enhancements#
Scenarios
- Unified Cell and Module Temperature function. See:
temperature.temperature
- Added support for pvlib temperature models. See pvlib docs:
Overhauled scenario class for pv system analysis. Scenario object for single point analysis and GeospatialScenario object for geospatial analysis. See:
scenario.Scenarioandscenario.GeospatialScenarioCreated Scenario tutorials to showcase new scenario functionality.
- Added a number of geospatial downselection functions. Find coordinates near mountains, rivers, coastlines and lakes from NSRDB data. See:
geospatial.identify_mountains_weightsgeospatial.identify_mountains_radiigeospatial.feature_downselect
- Added geospatial bounding box support. Clip unwanted data with rectangular bounding boxes. See:
geospatial.apply_bounding_box
- Added stochastic non-uniform density downselection function to preferentially select for mountains (higher point density with changes in elevation, lower density when flatter.) See:
geospatial.elevation_stochastic_downselection
- Updated non-uniform downselection with thresholding and non-linear normalization (support for logarithmic and exponential normalization) See:
geospatial.identify_mountains_weights
- Added Scenario and GeospatialScenario methods for quick plotting and downselection. See:
GeospatialScenario.plot_coordsGeospatialScenario.plot_meta_classificationGeospatialScenario.plot_USAScenario.extractScenario.plotGeospatialScenario.classify_mountain_weightsGeospatialScenario.classify_mountain_radiiGeospatialScenario.downselect_elevation_stochastic
Added a convenience method
GepspatialScenario.geospatial_datato quickly pull the geospatial weather and metadata from a scenario. Matches the API forpvdeg.weather.get.
Geospatial Improvements
Autotemplating system for geospatial analysis using
pvdeg.geospatial.autotemplate.New module
pvdeg.decoratorsthat containspvdegspecific decorator functions.Implemented
geospatial_result_typedecorator to update functions and preform runtime introspection to determine if a function is autotemplate-able.Geospatial Templates.ipynbnotebook to showcase new and old templating functionality for users.Implemented testing for geospatial analysis.
Added chunked and unchunked testing.
Symbolic Evaluation
symbolic equation solver for simple models.
notebook tutorial
Custom-Functions-Nopython.ipynb
IEC-63126 Tool
Added
GeospatialScenarioto standoff tool for regional analyses.Increased plotting functionality within tool.
Bug Fixes#
Added type hinting to many
pvdegfunctionsFixed broken keywords in many
pvdeg.standardsfunction callsReplaced deprecated numba
jit(nopython=True)calls withnjitFix incorrect keyword arguments in
pvdeg.standards.T98_estimateFixed
pvdeg.temperature.moduleandpvdeg.temperature.celldocstring return type. Correct return typepd.SeriesFixed broken Geospatial Analysis, when using chunked (dask) xarrays for weather data
Dependencies#
sympypackage required forpvdeg.symbolicfunctions and notebook. Not added to dependency list.Restrict the following dependencies to fix unit testing
numpy==1.26.4pvlib==0.10.3scipy<1.14.0
Contributors#
Tobin Ford (ghuser tobin-ford)
Mike Kempe (ghuser MDKempe)
v0.3.3 (2024-05-06)#
Bug Fixes#
Fix logo path in documenation
Documentation#
Updated Zenodo citation in readme.
Contributors#
Martin Springer (ghuser martin-springer)
v0.3.2 (2024-05-06)#
Enhancements#
Added workflow for automated deployment of jupyter-books
Bug Fixes#
Re-run notebooks and fixed minor bugs
Contributors#
Martin Springer (ghuser martin-springer)
v0.3.1 (2024-05-06)#
Enhancements#
Added new LETID tests
Bug Fixes#
Multiple bug fixes in geospatial analysis
Documentation#
Renamed pvdeg_tutorials folder to tutorials_and_tools, and added more tutorials
to be run easily in google collab. * Jupyter Journals now have information regarding the version of the programs used near the beginning, to simplify debugging and user support.
Contributors#
Martin Springer (ghuser martin-springer)
Mike Kempe (ghuser MDKempe)
Silvana Ovaitt (ghuser shirubana)
Tobin Ford (ghuser tobin-ford)
v0.3.0 (2024-02-12)#
Enhancements#
Initial integration of the Monte-Carlo analysis package
Contributors#
Tobin Ford (ghuser tobin-ford)
Silvana Ovaitt (ghuser shirubana)
Martin Springer (ghuser martin-springer)
Mike Kempe (ghuser MDKempe)
v0.2.3 (2024-02-09)#
Enhancements#
refactor of the standoff calculation
refactor to wind_speed height instead of wind_speed factor
updates to standoff calculation notebooks
updates to documentation
include issue and pull request templates
Contributors#
Mike Kempe (ghuser MDKempe)
Tobin Ford (ghuser tobin-ford)
Martin Springer (ghuser martin-springer)
v0.2.2 (2024-01-30)#
Enhancements#
automatically deploy to pypi
Contributors#
Martin Springer (ghuser martin-springer)
v0.2.1 (2024-01-30)#
Enhancements#
integration of LeTID degradation modelling.
new geospatial demo notebooks
pre-commit hooks for code quality
Requirements#
update repo to use pyproject.toml for package management
requirements for multiple packages updated
Bug Fixes#
minor bug fixes in the documentation
Contributors#
Joe Karas (ghuser jfkaras)
Mark Campanelli (ghuser markcampanelli)
Martin Springer (ghuser martin-springer)
v0.2.0 (2023-12-04)#
Integrated geospatial analysis via dask and xarray.
new geospatial analysis functions
dask for parallel processing
xarray for geospatial data handling
Martin Springer (ghuser martin-springer)
v0.1.3 (2023-09-13)#
Minor bug fixes.
Martin Springer (ghuser martin-springer)
v0.1.2 (2023-07-07)#
ASTM Conference Release.
Tutorial examples for live workshop demo.
Silvana Ovaitt (ghuser shirubana)
v0.1.0 (2023-06-28)#
First official release.
pvdeg populated with various classes, including functions for: - energy calculations of water, vapor pressure, ingress rate, edge seal width, van hoff irradiance degradation, weighted average irradiance, arrhenius acceleration factor, weighted average irradiance - fatigue of soldering bonds - humidity calculations, including relative humidity on outside surface, on front encapsulant, back encapsulant, and backsheet - BoLID and LeTID degradation profile calculations - Standards, such as minimum module stand-off distance calculation - support of internal calculations needed such as spectral, solar position, etc.
Re-structured folders to include Documentation, Versioning and Setup.
Tutorial examples available on the tutorials folder to run through Jupyter, Collab or Binder
Added Sphinx Documentation
Added Versioneer
pytests implemented for most functions
Silvana Ovaitt (ghuser shirubana)
Derek Holsapple (ghuser holsappled)
Matthew Brown (ghuser mcbrown042)
Martin Springer (ghuser martin-springer)
Mike Kempe (ghuser MDKempe)
Joe Karas (ghuser jfkaras)