What’s New#

These are new features and improvements of note in each release.

v0.4.2 (03 / 10 / 2023)#

Documentation, bug fix and enhancement update

Bug fixes#

  • Return functionality that existed previous to 0.4.0: ModuleObj. text can be manually passed in, over-riding the module object definition. This was mistakenly removed during the moduleObj refactor in v0.4.0. (GH 413)(GH 390)

  • Fix some Sphinx formatting errors in example notebooks (GH 434)


  • Adds new functions ModuleObj. saveImage and SceneObj. saveImage to automatically save .hdr images of a module or scene to the /images/ directory. (GH 421)

  • New saveImage functions are run by default in the modelchain if simulationParamsDict[‘saveImage’] = True. The gui will set saveImage = True by default. (GH 421)

  • If modelchain is running a 1-axis simulation with simulationParamsDict[‘saveImage’] = True, SceneObj. saveImage will render a scene using the tracker angle closest to 20 degree tilt (GH 421)


  • Python 3.7 support is now deprecated. It should still work, but will not be tested by CI, and requirements.txt is incompatible.

  • RadianceObj. nMods and nRows internal attributes have been removed. These are now defined per SceneObj. sceneDict (GH 455)

  • trackerdict[index]['clearance_height'] attribute has been removed. These are available inside the trackerdict[index]['scene'] SceneObj. sceneDict (GH 455)


  • readthedocs now has an example notebook gallery (GH 440)

  • readthedocs switching to pydata-sphinx-theme to match pvlib (GH 432)

  • on building sphinx docs, tutorial directory is copied into sphinx/source (GH 437)

  • Update Radiance version to 5.3 on instructions and github CI (GH 417)(GH 452)

API Changes#

  • GroundObj has new argument silent to suppress print statements. Default: False

  • SceneObj has new argument name to identify it in upcoming multi-scene simulations. Default: Scene0 (GH 455)


v0.4.1 (03 / 09 / 2022)#

Minor bug fix update

API Changes#

  • Input parameters changed in calculatePerformance: temp_air and wind_speed.


  • Docker files automatically generated on each new commit. (GH 402)(GH 401)(GH 400)

  • Include module bifaciality in calculation of bifacial ratio in trackerdict BifiRatio

  • Explicit support from Py3.7 through Py3.10


  • Drop Python 3.6 support (it should still work though)

Bug fixes#



v0.4.0 (02 / 03 / 2022)#

Release of new version including new spectral property class, object-oriented ModuleObj class and other improvements for more seamless use with dask and paralellization.

Major usage changes include a ModuleObj output from makeModule, allowing updating geometry and adding module features (adding a torque tube, frame members, etc). This release also changes start and end time format to ‘YYYY-MM-DD_HHMM’ enabling multi-year and sub-hourly met file support.

API Changes#

  • The output of makeModule is now a new module class ModuleObj which stores module details and allows geometry modification and addition (GH 338)

  • Object-oriented torque-tube generation function in ModuleObj. addTorquetube. Uses same input parameters previously passed into tubeParams. (GH 360)

  • Object-oriented cell-level module generation function in ModuleObj. addCellModule. Uses same input parameters previously passed in the cellParams dict. (GH 360)

  • Object-oriented module frame generation function in ModuleObj. addFrame. Uses same input parameters previously stored in the frameParams dict. (GH 360)

  • Object-oriented module omega (tube mounting bracket) generation function in ModuleObj. addOmega. (GH 360)

  • set1axis has a new boolean input useMeasuredTrackerAngle. When set to True, it looks for manual tracker angle values in the weather file input with column name ‘Tracker Angle (degrees)’

  • makeModule now returns a ModuleObj instead of a dict. (GH 338)

  • showModule is moved out of SceneObj and is now in ModuleObj. showModule (GH 338)

  • Due to now allowing multiple years and subhourly files, timestamped files (octfiles, skyfiles, objects, results files) now are of YYYY-MM-DD_HHMM format.

  • readWeatherFile has new arguments source, and coerce_year, but daydate option is removed. (GH 311)

  • readWeatherFile arguments starttime and endtime accept datetime and pd.TimeIndex inputs, as well as strings in either ‘MM_DD_HH’ or ‘MM_DD’ or ‘YYYY-MM-DD_HHMM’ format.

  • Removed the standalone RadianceObj.readEPW function. Use readWeatherFile instead.

  • genCumSky new kwargument gencumsky_metfile pointing to the auto-generated met data csv file.

  • set1axis has new argument fixed_tilt_azimuth.

  • makeOct1axis input argument singleindex must now take the format of ‘YYYY-MM-DD_HHMM’.

  • moduleAnalysis input arguments added: sensorsx, modscanfront, modscanback, relative.

  • analysis function has boolean input RGB to enable spectral simulations

  • RadianceObj and AnalysisObj objects now have an input argument for hpc as boolean. hpc is true makes so that file reading waits longer to account for parallelization timing, and to not update to the central .json Module file while on parallelization.


  • New spectral_utils module includes classes and functions to interact with irradiance spectra from SMARTS.

  • Cell-specific module analysis. When a cell-level module is created, if sensorsy matches the number of cellsy the sensors will be positioned at the center of each solar cell.

  • sensorsy can now be passed a list or tuple of 2 values. The first value is the number of front sensors, the second one is the number of rear sensors. This affects moduleAnalysis and analysis1axis and gui (GH 340)

  • New radname input for makeScene, so scenes do not overwrite with parallel processing.

  • The software now considers Year in variuos of the routines, like metdata reading, sky creation and saving of results. (GH 250)

  • Sub-hourly weather files are now accepted in readWeatherFile

  • The module scans dictionaries modscanfront and modscanback are now inputs on in analysis1axis so the scanning position can be be modified on the tracking routines (GH 263)

  • Routine created to add materials to ground.scan. addMaterial (GH 278)(GH 74)

  • makeModule fuction has additional input to specify the modulematerial.

  • makeModule fuction can create framed modules using the argument frameParams. Dictionary inputs include frame_material, frame_thickness, frame_z, frame_z and nsides_frame.

  • makeModule fuction generates Omegas (frame offset elements) using the argument omegaParams. Dictionary inputs include omega_material, x_omega1, mod_overlap, y_omega, omega_thickness, x_omega3 and inverted.

  • makeModule input argument cellModule has a new field option centerJB to reflect the distance betwen both sides of cell arrays in a center-junction box half-cell module. (still under development)

  • makeScene has optional input parameter radname to give a custom name to the scene radfile.

  • New analyzeRow function in AnalysisObj to analyze every module in the row.

  • readWeatherFile allows ‘source=solargis’ input option to read commercial weather files obtained from SolarGIS.com

  • For all weather files, night-time data (GHI <= 0) is removed when the MetObj is created. This has always been the case for tracked simulations, but is also now true for fixed-tilt simulations as well.

  • deepcleanResult is refactored to accept results files whether they have front, back or both irradiance data. (GH 346)


Bug fixes#

  • For data in TMY3 format but has a interval smaller than 1 HR, now the readWeatherFile, function (which uses pvlib I/O function) fixes the timestamps from the already imported TMY3 data, with the column labeld ‘Time (HH:MM)’ (GH 278)

  • runtimeWarnings are ignored in set1axis. Fixes pvlib tracker #260

  • Fixed bug on input file load that would rewrite zgap parameter as ygap. (GH 283)

  • Image folder was not correctly loading on install (GH 275)(GH 282)

  • Weather data with zero length after filtering returns a more informative error (GH 332)

  • Errors while generating octfiles in makeOct are now printed instead of being muted.


  • HPC example scripts are now posted in \bifacial_radiance\HPCScripts. Knock yourself out.

  • JOSS Journal was published and is now referenced in documentation and READ.ME for citation, along with Zenodo DOIs.

  • Journal showing rear irradiance performance with and without white-pavers for ballasting the single axis trackers

  • AgriPV Journal improvements, and new Journal studying two crops with PV-module co-location

  • Example of running Spectral simulations with the use of dask.

  • Cleanup of journals and documentations throughout of coding comments.


v0.3.4 (05 / 26 / 2020)#

Release of new version including time-series albedo options, selecting if weather data is right, left or center labeled (averaged), and an updated module.json.

Starting this version, releases will have a Zenodo D.O.I for identification!

Deprecated support for Python 2.7. Stops support on this release. PVLib >= 0.7.0 is required for metdata file IO


  • Enable module.json to be human readable and sorted. (GH 230)

  • Albedo:
    • Albedo: TIME-Varying ALBEDO: now albedo can be given for every timepoint being modeled.

    • Albedo: Functions readWeatherFile(), readEPW(), and readTMY() return MetObj.albedo from TMY or EPW file if available (GH 246) (GH 68)

    • Albedo: setGround pulls albedo if readWeatherfile has already been run and no explicit albedo is provided.

    • Albedo: setGround accepts lists and 3xN RGB arrays

    • Albedo: Unrealistic albedo values are constrained to [0:1] (GH 227)

  • readWeatherFile(), readEPW(), and readTMY() now have an input label, to mark if data is right-averaged, left-averaged, or center-averaged. Default is label=Right, like TMY3 files: TMY3 data is right-labeled, so 11 AM data represents data from 10 to 11, and sun position is calculated at 10:30 AM. Sun position and tracker positions gets calculated according to the label chosen.

API Changes#

  • Input changed to gendaylit, now making metdata an optional input.

Bug fixes#



  • All notebooks and tests updated for new albedo in GroundObj functionality

  • Notebooks updated for gendaylit metdata optional input

  • Cleaned up journal explaining how to use glass on modules.


v0.3.3.2 (04 / 16 / 2020)#

Release of new version including fix to sensor orientation, increased py-testing, and glass in modules.


  • Glass in modules now supported. New Glass material included in ground.rad. Example of use in Glass Tutorials.

  • Source code for gencumulativesky is now included along with makefile instructions in /data/gencumsky/

  • New Torquetube options added on makeModule

  • Added variables frontsurfaceoffset and backsurfaceoffset to moduleAnalysis, to offer the ability of controling the offset in local z of the sensor locations from the module’s front and rear surface.

API Changes#

  • readTMY now saves the temporal TMY files generated for daydate simulations with different titles to avoid overwriting in parallel simulations.

  • Input for daydate added to analysis1axis, allowing to save cumulative files for daydate.

  • Sorted trackerdict keys on simulations that use trackerdict routines

  • Removed deprecation warning and inputs nMods and nRows on makeScene1axis

  • Modified quickExample() to include testfolder as an input, and returned analysis results. Call to interactive directory selection called from main.py instead than being redefined inside the function. (GH 201)

  • Removed HPCExample() function from main.py (added as a Tutorial Notebook)

  • Fix GUI load issue when None values passed

  • Set GUI default modWanted and rowWanted to Null

  • readconfigurationinputfile.ini input files now use the key timeIndexSimulation instead of timestampRangeSimulation

Bug fixes#

  • Fixed sensor’s orientation error in scanning function calculation, mainly affecting high-tilt angle simulations (GH 226)

  • Fix GUI to allow reading null values for modWanted and rowWanted

  • Exception handling for daily simulations in gendaylit1axis, due to a for loop going out of range for endindex+1 (GH 225)




v0.3.3.1 (10 / 16 / 2019)#

This is a minor release, a patch to fix a GUI error preventing the simulation from running.

v0.3.3 (10 / 14 / 2019)#

This is a major release that adds many power mismatch analysis features, GUI updates as well as documentation.

Deprecated support for Python 2.7. Will stop support on next release

API Changes#

  • readWeatherFile set as main function to read TMY and EPW files.

  • Added startdate and enddate inputs to readWeatherFile(), in str format MM_DD_HH.

  • Deprecated gencumsky startdate and enddate options.

  • Fixed tilt simulations can now use the tracking workflow by passing a fixed_tilt_angle variable into set1axis. This has been implemented as the default for hourly simulations in the ModelChain and GUI.

  • Renamed many functions with a dash, to differentiate from functions called by user and helper-functions that are subfunctions or called by the main functions. (GH 155)

  • Update internal paths to TESTDIR rather than os.cwd

  • gendaylit: update to use the sunposition automatically stored with metdata

  • Corrected print statements for full year hourly simulations to reflect the exact number of datapoints considered in that ratio average.

  • Changed functionality of ModelChain for tracking: if simulationParamsDict[dayDateSimulation] is False, default to full-year simulation even if timeParamsDict is passed.

  • Added print statement for fixed tilt and tracking modelchain results.

  • Raise error if tracking modelchain is used with timestampRangeSimulation

  • Updated modelchain daydate functionality: when starthour = endhour gives that hour of analysis.

  • Add filenotfound error checking for loading .ini file

  • Added analysis.py to modules loaded by bifacial_radiance as default.

  • Trackerdict now keeps track of hub_height (GH 168)

  • Updated requirements for PVLib > 0.6.1 to avoid deprecation warnings (GH 158)


  • Improved cross-platform support with linux (GH 128), (GH 130), (GH 127), (GH 126).

  • Trackerdict functions now analyze/do their stuff in an ordered manner. (makeOct1axis, set1axis, makeScene1axis).

  • Power Mismatch calculation function as well as irradiance statistics in module mismatch.py.

Bug fixes#

  • Fix accuracy setting for analysis1axis() on (GH 150)

  • GUI: GCR or Pitch independently read based on selection, so no need for values to match (GH 143)

  • Fixed tracking daydate hourly (GH 125)

  • Fix to avoid divide-by-zero errors in gendaylit

  • Fix GUI tracking hourly by day, which was still reading enddate (GH 136)

  • GUI: fixing automatically downloading getEPW when readEPW was selected.


  • Increase in pytesting, particularly for secondary modules in bifacial_radiance (other than main.py)

  • Tracking pytesting with coveralls

  • Rename test .ini files to avoid name confusion with test.py files

  • Add test for bad RadianceObj path


  • readtheDocs now connected. Moved all documentation to sphinx format.

  • Revamping of journals, with more explanations, images, and sorted by level of difficulty.


v0.3.0 (05 / 14 / 2019)#

This is a major release that includes the release of a new Visual Interface (GUI). We recommend all users to upgrade to this release as many internal geometry handling has been updated and made more accurate.

API Changes#

  • Dictionaries implemented as inputs to most functions.

  • Height deprecated as input, now functions expect clerance_height or hub_height.


  • New GUI.

  • Modelchains implemented.

  • New internal Geometry handling.

  • Modules get centered on X and Y.

  • Geometry of scenes gets constructed around (X,Y) (0,0), placing the center of the center module of the center row in that position

  • New/improved sensor locations.

  • Multiple Scene object capability for fixed scenes.

  • HPC friendly code.

  • More module creation options

  • cell Level model capability with dictionary input.

  • Axis of rotation around torque tube possible with axisofrotation parameter.


v0.2.4 (02 / 27 / 2019)#

Various improvements across the bifacial_radiance software.

API Changes#

  • Module orientation deprecated. Now module is defined by x (dimension along rack) and y (dimensio nin slant direction).

  • Module gap variables renamed to xgap, ygap, and zgap.

  • scenex and sceney variables introduced which include torquetube and gap dimensions.

  • Py36 and cross-platform code compliance implemented

  • Modified gendaylit() to be based on sun positions by default

  • gendaylit() now uses PVLib for calculating sun position angles instea dof using Radiance internal sun positoin calculations.

  • Updated bifacial_radiance.AnalysisObj.makeFalseColor() routine for visualizing in falsecolor the octfile.

  • Moved existing and new load routines into load


  • More torquetube options added (round, square, hexagonal and octagonal profiles)

  • custom spacing between modules in a row added,

  • Added accuracy input option for 1-axis scans

  • Update to sensor position on 1axistracking.


  • Module-select and module scan bug fixed


  • Updates to pytests.


v0.2.3 (11 / 14 / 2018)#

This release introduces the option to module torque tubes now added as part of makeModule.



v0.2.2 (08 / 29 / 2018)#

Negative 1 hour offset to TMY file inputs

v0.2.1 (05 / 21 / 2018)#

  • Allow TMY3 input files

  • Using a different EPW file reader.

v0.2.0 (03 / 21 / 2018)#

Critical 1-axis tracking update to fix geometry issues that were over-predicting 1-axis results

v0.1.1 (03 / 08 / 2018)#

Allow southern latitudes.

v0.1.0 (12 / 18 / 2017)#

1-axis bug fix and validation vs PVSyst and ViewFactor model.

v0.0.5 (12 / 13 / 2017)#

  • 1-axis tracking draft.

  • gencumsky() now allows -G filetype optoin for support of 1-axis tracking.

v0.0.4 (12 / 13 / 2017)#

Include configuration file module.json and custom module configuration.

v0.0.3 (12 / 13 / 2017)#

Arbitrary NxR number of modules and rows for SceneObj

v0.0.2 (06 / 29/ 2017)#

Adjustable azimuth angle other than 180.

v0.0.1 (05 / 24 / 2017)#

Initial stable release.