2 - Single Axis Tracking Yearly Simulation#

Method Gencumsky has been modified to divide the yearly-cumulative sky into various skies, each one representing the cumulative irradiance for the hours at which the tracker is at a certain angle. For faster running, for a tracker that moves between 45 and -45 degrees limit angle, if only positions every 5 degrees are considered (45, 40, 35 …. -4-, -45), then only 18 skies (and 18 simulations) will be run for the whole year.

Example of the hemisphere cumulative sky

This procedure was presented in:

Ayala Pelaez S, Deline C, Greenberg P, Stein JS, Kostuk RK. Model and validation of single-axis tracking with bifacial PV. IEEE J Photovoltaics. 2019;9(3):715–21. https://ieeexplore.ieee.org/document/8644027 and https://www.nrel.gov/docs/fy19osti/72039.pdf (pre-print, conference version)

Steps: 1. Create a folder for your simulation, and load bifacial_radiance 2. Create a Radiance Object, set Albedo and Download Weather Files
4. Set Tracking Angles 5. Generate the Sky 6. Define a Module type 7. Create the scene 8. Combine Ground, Sky and Scene Objects 9. Analyze and get results 10. Clean Results

And finally: Condensed instructions

1. Create a folder for your simulation, and load bifacial_radiance#

First let’s set the folder where the simulation will be saved. By default, this is the TEMP folder in the bifacial_radiance distribution.

The lines below find the location of the folder relative to this Jupyter Journal. You can alternatively point to an empty directory (it will open a load GUI Visual Interface) or specify any other directory in your computer, for example:

testfolder = r’C::nbsphinx-math:`Users`:nbsphinx-math:`sayala`:nbsphinx-math:`Documents`:nbsphinx-math:`RadianceScenes`:nbsphinx-math:`Tutorials`:nbsphinx-math:`Journal`2’

[1]:
import os
from pathlib import Path

testfolder = Path().resolve().parent.parent / 'bifacial_radiance' / 'TEMP' / 'Tutorial_02'

# Another option using relative address; for some operative systems you might need '/' instead of '\'
# testfolder = os.path.abspath(r'..\..\bifacial_radiance\TEMP')

print ("Your simulation will be stored in %s" % testfolder)

if not os.path.exists(testfolder):
    os.makedirs(testfolder)
Your simulation will be stored in C:\Users\sayala\Documents\GitHub\bifacial_radiance\bifacial_radiance\TEMP\Tutorial_02

This will load bifacial_radiance and other libraries from python that will be useful for this Jupyter Journal:

[2]:
from bifacial_radiance import *
import numpy as np

2. Create a Radiance Object, Set Albedo, and Download and Load Weather File#

These are all repeated steps from Tutorial 1, so condensing:

[3]:
# Create a RadianceObj 'object' named bifacial_example. no whitespace allowed
demo = RadianceObj('tutorial_2', path = str(testfolder))

albedo = 0.25
demo.setGround(albedo)

# Pull in meteorological data using pyEPW for any global lat/lon
epwfile = demo.getEPW(lat = 37.5, lon = -77.6)  # This location corresponds to Richmond, VA.
# Read in the weather data pulled in above.
metdata = demo.readWeatherFile(weatherFile = epwfile)
path = C:\Users\sayala\Documents\GitHub\bifacial_radiance\bifacial_radiance\TEMP\Tutorial_02
Making path: images
Making path: objects
Making path: results
Making path: skies
Making path: EPWs
Making path: materials
Loading albedo, 1 value(s), 0.250 avg
1 nonzero albedo values.
Getting weather file: USA_VA_Richmond.724010_TMY2.epw
 ... OK!
8760 line in WeatherFile. Assuming this is a standard hourly WeatherFile for the year for purposes of saving Gencumulativesky temporary weather files in EPW folder.
Coercing year to 2021
Saving file EPWs\metdata_temp.csv, # points: 8760
Calculating Sun position for Metdata that is right-labeled  with a delta of -30 mins. i.e. 12 is 11:30 sunpos

TRACKING Workflow#

Until now, all the steps looked the same from Tutorial 1. The following section follows similar steps, but the functions are specific for working with single axis tracking.

3. Set Tracking Angles#

This function will read the weather file, and based on the sun position it will calculate the angle the tracker should be at for each hour. It will create metdata files for each of the tracker angles considered.

[4]:
limit_angle = 5 # tracker rotation limit angle. Setting it ridiculously small so this runs faster.
angledelta = 5 # sampling between the limit angles.
backtrack = True
gcr = 0.33
cumulativesky = True # This is important for this example!
trackerdict = demo.set1axis(metdata = metdata, limit_angle = limit_angle, backtrack = backtrack,
                            gcr = gcr, cumulativesky = cumulativesky)
Saving file EPWs\1axis_-5.0.csv, # points: 2214
Saving file EPWs\1axis_0.0.csv, # points: 57
Saving file EPWs\1axis_5.0.csv, # points: 2096

Setting backtrack to True is important in this step, so the trackers correct for self-shading when following the sun at high zenith angles.

4. Generate the Sky#

This will create the skies for each sub-metdata file created by set1axis.

[5]:
trackerdict = demo.genCumSky1axis()
message: There were 2174 sun up hours in this climate file
Total Ibh/Lbh: 0.000000
Created skyfile skies\1axis_-5.0.rad
message: There were 50 sun up hours in this climate file
Total Ibh/Lbh: 0.000000
Created skyfile skies\1axis_0.0.rad
message: There were 2065 sun up hours in this climate file
Total Ibh/Lbh: 0.000000
Created skyfile skies\1axis_5.0.rad

This is how one of the cumulative sky .cal files associated with each .rad file generated look like:

Example of the gencumsky1axis

Each of the values corresponds to the cumulative rradiance of one of those patches, for when the tracker is at that specific angle through the year.

5. Define the Module type#

Let’s make a more interesting module in this example. Let’s do 2-up configuration in portrait, with the modules rotating around a 10 centimeter round torque tube. Let’s add a gap between the two modules in 2-UP of 10 centimeters, as well as gap between the torque tube and the modules of 5 centimeters. Along the row, the modules are separated only 2 centimeters for this example. The torquetube is painted Metal_Grey in this example (it’s one of the materials available in Ground.rad, and it is 40% reflective).

Note that starting with bifacial_radiance version 0.4.0, the module object has a new geometry generation function addTorquetube. The old way of passing a properly formatted dictionary as a keyword argument will still work too.

[6]:
x = 0.984  # meters
y = 1.7    # meters
moduletype = 'test-module'
numpanels = 2
zgap = 0.05
ygap = 0.10
xgap = 0.02

module = demo.makeModule(name=moduletype, x=x, y=y,xgap=xgap, ygap=ygap, zgap=zgap,
                numpanels=numpanels)

module.addTorquetube(diameter=0.1, material='Metal_Grey', tubetype='round') # New torquetube generation function
print()
print(module)
print()
print(module.torquetube)

Module Name: test-module
Module test-module updated in module.json
Module test-module updated in module.json
Pre-existing .rad file objects\test-module.rad will be overwritten


{'x': 0.984, 'y': 1.7, 'z': 0.02, 'modulematerial': 'black', 'scenex': 1.004, 'sceney': 3.5, 'scenez': 0.1, 'numpanels': 2, 'bifi': 1, 'text': '! genbox black test-module 0.984 1.7 0.02 | xform -t -0.492 -1.75 0.1 -a 2 -t 0 1.8 0\r\n! genrev Metal_Grey tube1 t*1.004 0.05 32 | xform -ry 90 -t -0.502 0 0', 'modulefile': 'objects\\test-module.rad', 'glass': False, 'offsetfromaxis': 0.1, 'xgap': 0.02, 'ygap': 0.1, 'zgap': 0.05}

{'diameter': 0.1, 'tubetype': 'round', 'material': 'Metal_Grey', 'visible': True}

6. Make the Scene#

The scene Dictionary specifies the information of the scene. For tracking, different input parameters are expected in the dictionary, such as number of rows, number of modules per row, row azimuth, hub_height (distance between the axis of rotation of the modules and the ground).

[7]:
hub_height = 2.3
sceneDict = {'gcr': gcr,'hub_height':hub_height, 'nMods': 20, 'nRows': 7}

To make the scene we have to create a Scene Object through the method makeScene1axis. This method will create a .rad file in the objects folder, with the parameters specified in sceneDict and the module created above.

[8]:
trackerdict = demo.makeScene1axis(trackerdict = trackerdict, module = module, sceneDict = sceneDict)

Making .rad files for cumulativesky 1-axis workflow
3 Radfiles created in /objects/

7. Combine Ground, Sky and Scene Objects#

makeOct1axis joins the sky.rad file, ground.rad file, and the geometry.rad files created in makeScene.

[9]:
trackerdict = demo.makeOct1axis(trackerdict = trackerdict)

Making 3 octfiles in root directory.
Created 1axis_-5.0.oct
Created 1axis_0.0.oct
Created 1axis_5.0.oct

8. Analyze and get results#

We can choose to analyze any module in the Scene we have created. The default, if no modWanted or rowWanted is passed, is to sample the center module of the center row.

For this example we will sample row 2, module 9.

[10]:
modWanted = 9
rowWanted = 2
customname = '_Row_2_Module_09' # This is useful if we want to do various analysis.
trackerdict = demo.analysis1axis(trackerdict, modWanted=9, rowWanted = 2, customname=customname)
Linescan in process: 1axis_-5.0_Row_2_Module_09_Front
Linescan in process: 1axis_-5.0_Row_2_Module_09_Back
Saved: results\irr_1axis_-5.0_Row_2_Module_09.csv
Index: -5.0. Wm2Front: 754267.5185185184. Wm2Back: 104589.73592592594
Linescan in process: 1axis_0.0_Row_2_Module_09_Front
Linescan in process: 1axis_0.0_Row_2_Module_09_Back
Saved: results\irr_1axis_0.0_Row_2_Module_09.csv
Index: 0.0. Wm2Front: 1204.7218888888888. Wm2Back: 170.25936296296294
Linescan in process: 1axis_5.0_Row_2_Module_09_Front
Linescan in process: 1axis_5.0_Row_2_Module_09_Back
Saved: results\irr_1axis_5.0_Row_2_Module_09.csv
Index: 5.0. Wm2Front: 840359.3999999999. Wm2Back: 116222.5111111111
Saving a cumulative-results file in the main simulation folder.This adds up by sensor location the irradiance over all hours or configurations considered.
Warning: This file saving routine does not clean results, so if your setup has ygaps, or 2+modules or torque tubes, doing a deeper cleaning and working with the individual results files in the results folder is highly suggested.

Saving Cumulative results
Saved: cumulative_results__Row_2_Module_09.csv

Let’s look at the results with more detail. The analysis1axis routine created individual result .csv files for each angle, as well as one cumulative result .csv where the irradiance is added by sensor.

[11]:
results = load.read1Result('cumulative_results__Row_2_Module_09.csv')
results
[11]:
x y z rearZ mattype rearMat Wm2Front Wm2Back Back/FrontRatio
0 22.61734 -1.004 2.298522 2.276605 a8.1.a0.test-module.6457 a8.1.a0.test-module.2310 1.592952e+06 231445.315867 0.145293
1 22.26867 -1.004 2.329026 2.307110 a8.1.a0.test-module.6457 a8.1.a0.test-module.2310 1.592998e+06 225728.468267 0.141700
2 21.92000 -1.004 2.359531 2.337614 a8.1.a0.test-module.6457 a8.1.a0.test-module.2310 1.592993e+06 219336.440267 0.137688
3 21.57134 -1.004 2.390035 2.368119 a8.1.a0.test-module.6457 a8.1.a0.test-module.2310 1.592988e+06 213224.725067 0.133852
4 21.22267 -1.004 2.420540 2.398623 a8.1.tube1.16 sky 1.592575e+06 196471.474700 0.123367
5 20.87400 -1.004 2.451044 2.429128 a8.1.a1.test-module.6457 a8.1.a1.test-module.2310 1.599510e+06 214677.671867 0.134215
6 20.52533 -1.004 2.481549 2.459632 a8.1.a1.test-module.6457 a8.1.a1.test-module.2310 1.599511e+06 222697.557000 0.139229
7 20.17666 -1.004 2.512053 2.490137 a8.1.a1.test-module.6457 a8.1.a1.test-module.2310 1.599490e+06 229091.227367 0.143228
8 19.82799 -1.004 2.542558 2.520641 a8.1.a1.test-module.6457 a8.1.a1.test-module.2310 1.599468e+06 236169.677200 0.147655

There are various things to notice:

  1. The materials column has a specific format that will tell you if you are sampling the correct module:

a{ModWanted}.{rowWanted}.a{numPanel}.{moduletype}.material_key
  • Since for this journal numPanels = 2, numPanel can either be 0 or 1, for the East-most and West-most module in the collector width.

  • numPanel, ModWanted and RowWanted are indexed starting at 0 in the results.

  • material_key is from the surface generated inside radiance. Usually it is 6457 for top surface of hte module and .2310 for the bottom one.

  1. Sensors sample always in the same direction. For this N-S aligned tracker, that is East-most to West. For this 2-up portrait tracker which is 3.5 meters, 20x7 rows and we are sampling module 9 on row 2, the East to West sampling goes from 22.6 m to 19.81 m = 2.79m. It is not exatly 3.5 because the sensors are spaced evenly through the collector width (CW):

Sensors spaced along collector width

  1. When there is a ygap in the collector width (2-UP or more configuration), some of the sensors might end up sampling the torque tube, or the sky. You can ses that in the materials columns. This also happens if the number of sensors is quite high, the edges of the module might be sampled instead of the sensors. For this reason, before calculating bifacial gain these results must be cleaned. For more advanced simulations, make sure you clean each result csv file individually. We provide some options on load.py but some are very use-specific, so you might have to develop your own cleaning tool (or let us know on issues!)

Important: If you have torquetubes and y-gap values, make sure you clean your results.

9. Clean Results#

We have two options for cleaning results. The simples on is load.cleanResults, but there is also a deepClean for specific purposes.

cleanResults will find materials that should not have values and set them to NaN.

[12]:
results_clean = load.cleanResult(results)
results_clean

[12]:
x y z rearZ mattype rearMat Wm2Front Wm2Back Back/FrontRatio
0 22.61734 -1.004 2.298522 2.276605 a8.1.a0.test-module.6457 a8.1.a0.test-module.2310 1.592952e+06 231445.315867 0.145293
1 22.26867 -1.004 2.329026 2.307110 a8.1.a0.test-module.6457 a8.1.a0.test-module.2310 1.592998e+06 225728.468267 0.141700
2 21.92000 -1.004 2.359531 2.337614 a8.1.a0.test-module.6457 a8.1.a0.test-module.2310 1.592993e+06 219336.440267 0.137688
3 21.57134 -1.004 2.390035 2.368119 a8.1.a0.test-module.6457 a8.1.a0.test-module.2310 1.592988e+06 213224.725067 0.133852
4 21.22267 -1.004 2.420540 2.398623 a8.1.tube1.16 sky NaN NaN 0.123367
5 20.87400 -1.004 2.451044 2.429128 a8.1.a1.test-module.6457 a8.1.a1.test-module.2310 1.599510e+06 214677.671867 0.134215
6 20.52533 -1.004 2.481549 2.459632 a8.1.a1.test-module.6457 a8.1.a1.test-module.2310 1.599511e+06 222697.557000 0.139229
7 20.17666 -1.004 2.512053 2.490137 a8.1.a1.test-module.6457 a8.1.a1.test-module.2310 1.599490e+06 229091.227367 0.143228
8 19.82799 -1.004 2.542558 2.520641 a8.1.a1.test-module.6457 a8.1.a1.test-module.2310 1.599468e+06 236169.677200 0.147655

These are the total irradiance values over all the hours of the year that the module at each sampling point will receive. Dividing the back irradiance average by the front irradiance average will give us the bifacial gain for the year:

Bifacial Gain in Irradiance Formula

Assuming that our module from Prism Solar has a bifaciality factor (rear to front performance) of 90%, our bifacial gain is of:

[13]:
bifacialityfactor = 0.9
print('Annual bifacial ratio: %0.3f ' %( np.nanmean(results_clean.Wm2Back) * bifacialityfactor / np.nanmean(results_clean.Wm2Front)) )
Annual bifacial ratio: 0.126

CONDENSED VERSION#

Everything we’ve done so far in super short condensed version:

[14]:
albedo = 0.25
lat = 37.5
lon = -77.6
nMods = 20
nRows = 7
hub_height = 2.3
gcr = 0.33
moduletype = 'test-module'  # this must already exist since we are not calling makeModule in this CONDENSED example.
#testfolder = r'C:\Users\sayala\Documents\RadianceScenes\Tutorials\Journal2'
limit_angle = 5
angeldelta = 5
backtrack = True
gcr = gcr
modWanted = 9
rowWanted = 2
cumulativesky = True

import bifacial_radiance
demo = RadianceObj('test')
demo.setGround(albedo)
epwfile = demo.getEPW(lat, lon)
metdata = demo.readWeatherFile(epwfile)
demo.set1axis(limit_angle=limit_angle, backtrack=backtrack, gcr=gcr, cumulativesky=cumulativesky)
demo.genCumSky1axis()
sceneDict = {'gcr': gcr,'hub_height':hub_height, 'nMods': nMods, 'nRows': nRows}  # orientation deprecated on v.0.2.4.
demo.makeScene1axis(module=moduletype, sceneDict=sceneDict)
demo.makeOct1axis()
demo.analysis1axis(modWanted=modWanted, rowWanted=rowWanted);

path = C:\Users\sayala\Documents\GitHub\bifacial_radiance\bifacial_radiance\TEMP\Tutorial_02
Loading albedo, 1 value(s), 0.250 avg
1 nonzero albedo values.
Getting weather file: USA_VA_Richmond.724010_TMY2.epw
 ... OK!
8760 line in WeatherFile. Assuming this is a standard hourly WeatherFile for the year for purposes of saving Gencumulativesky temporary weather files in EPW folder.
Coercing year to 2021
Saving file EPWs\metdata_temp.csv, # points: 8760
Calculating Sun position for Metdata that is right-labeled  with a delta of -30 mins. i.e. 12 is 11:30 sunpos
Saving file EPWs\1axis_-5.0.csv, # points: 2214
Saving file EPWs\1axis_0.0.csv, # points: 57
Saving file EPWs\1axis_5.0.csv, # points: 2096
message: There were 2174 sun up hours in this climate file
Total Ibh/Lbh: 0.000000
Created skyfile skies\1axis_-5.0.rad
message: There were 50 sun up hours in this climate file
Total Ibh/Lbh: 0.000000
Created skyfile skies\1axis_0.0.rad
message: There were 2065 sun up hours in this climate file
Total Ibh/Lbh: 0.000000
Created skyfile skies\1axis_5.0.rad

Making .rad files for cumulativesky 1-axis workflow
3 Radfiles created in /objects/

Making 3 octfiles in root directory.
Created 1axis_-5.0.oct
Created 1axis_0.0.oct
Created 1axis_5.0.oct
Linescan in process: 1axis_-5.0_Front
Linescan in process: 1axis_-5.0_Back
Saved: results\irr_1axis_-5.0.csv
Index: -5.0. Wm2Front: 723757.5777777777. Wm2Back: 104764.75222222222
Linescan in process: 1axis_0.0_Front
Linescan in process: 1axis_0.0_Back
Saved: results\irr_1axis_0.0.csv
Index: 0.0. Wm2Front: 1180.487. Wm2Back: 167.55038148148145
Linescan in process: 1axis_5.0_Front
Linescan in process: 1axis_5.0_Back
Saved: results\irr_1axis_5.0.csv
Index: 5.0. Wm2Front: 845301.237037037. Wm2Back: 116417.85555555555
Saving a cumulative-results file in the main simulation folder.This adds up by sensor location the irradiance over all hours or configurations considered.
Warning: This file saving routine does not clean results, so if your setup has ygaps, or 2+modules or torque tubes, doing a deeper cleaning and working with the individual results files in the results folder is highly suggested.

Saving Cumulative results
Saved: cumulative_results_.csv
[14]:
{-5.0: {'csvfile': 'EPWs\\1axis_-5.0.csv',
  'surf_azm': 90.0,
  'surf_tilt': 5.0,
  'datetime': Index(['2021-01-01 08:00:00', '2021-01-01 09:00:00', '2021-01-01 10:00:00',
         '2021-01-01 11:00:00', '2021-01-01 12:00:00', '2021-01-02 08:00:00',
         '2021-01-02 09:00:00', '2021-01-02 10:00:00', '2021-01-02 11:00:00',
         '2021-01-02 12:00:00',
         ...
         '2021-12-30 08:00:00', '2021-12-30 09:00:00', '2021-12-30 10:00:00',
         '2021-12-30 11:00:00', '2021-12-30 12:00:00', '2021-12-31 08:00:00',
         '2021-12-31 09:00:00', '2021-12-31 10:00:00', '2021-12-31 11:00:00',
         '2021-12-31 12:00:00'],
        dtype='object', length=2214),
  'count': 2214,
  'skyfile': 'skies\\1axis_-5.0.rad',
  'clearance_height': 2.156193024466364,
  'radfile': 'objects\\1axis-5.0__C_2.15619_rtr_10.60600_tilt_5.00000_20modsx7rows_origin0,0.rad',
  'scene': {'module': {'x': 0.984, 'y': 1.7, 'z': 0.02, 'modulematerial': 'black', 'scenex': 1.004, 'sceney': 3.5, 'scenez': 0.1, 'numpanels': 2, 'bifi': 1, 'text': '! genbox black test-module 0.984 1.7 0.02 | xform -t -0.492 -1.75 0.1 -a 2 -t 0 1.8 0\r\n! genrev Metal_Grey tube1 t*1.004 0.05 32 | xform -ry 90 -t -0.502 0 0', 'modulefile': 'objects\\test-module.rad', 'glass': False, 'offsetfromaxis': 0.1, 'xgap': 0.02, 'ygap': 0.1, 'zgap': 0.05}, 'modulefile': 'objects\\test-module.rad', 'gcr': 0.3300018857250613, 'text': '!xform -rx 5.0 -t 0 0 2.3 -a 20 -t 1.004 0 0 -a 7 -t 0 10.606 0 -i 1 -t -9.036 -31.817999999999998 0 -rz 90.0 -t 0 0 0 objects\\test-module.rad', 'radfiles': 'objects\\1axis-5.0__C_2.15619_rtr_10.60600_tilt_5.00000_20modsx7rows_origin0,0.rad', 'sceneDict': {'tilt': 5.0, 'gcr': 0.33, 'clearance_height': 2.156193024466364, 'azimuth': 90.0, 'nMods': 20, 'nRows': 7, 'modulez': 0.02, 'axis_tilt': 0, 'originx': 0, 'originy': 0}},
  'octfile': '1axis_-5.0.oct',
  'AnalysisObj': {'octfile': '1axis_-5.0.oct', 'name': '1axis_-5.0', 'x': [22.61734, 22.26867, 21.92, 21.57134, 21.22267, 20.874, 20.52533, 20.17666, 19.82799], 'y': [-1.004, -1.004, -1.004, -1.004, -1.004, -1.004, -1.004, -1.004, -1.004], 'z': [2.298522, 2.329026, 2.359531, 2.390035, 2.42054, 2.451044, 2.481549, 2.512053, 2.542558], 'rearZ': [2.276605, 2.30711, 2.337614, 2.368119, 2.398623, 2.429128, 2.459632, 2.490137, 2.520641], 'mattype': ['a8.1.a0.test-module.6457', 'a8.1.a0.test-module.6457', 'a8.1.a0.test-module.6457', 'a8.1.a0.test-module.6457', 'a8.1.tube1.16', 'a8.1.a1.test-module.6457', 'a8.1.a1.test-module.6457', 'a8.1.a1.test-module.6457', 'a8.1.a1.test-module.6457'], 'rearMat': ['a8.1.a0.test-module.2310', 'a8.1.a0.test-module.2310', 'a8.1.a0.test-module.2310', 'a8.1.a0.test-module.2310', 'sky', 'a8.1.a1.test-module.2310', 'a8.1.a1.test-module.2310', 'a8.1.a1.test-module.2310', 'a8.1.a1.test-module.2310'], 'Wm2Front': [759067.4, 759053.1, 759017.5666666668, 758981.9666666667, 467843.0, 752599.8000000002, 752519.8333333334, 752418.4333333332, 752317.1], 'Wm2Back': [121806.59999999999, 116581.09999999999, 109869.73333333334, 104100.16666666667, 96092.40999999999, 96893.88666666666, 98651.47333333333, 98558.60000000002, 100328.8], 'Back/FrontRatio': [0.16046875394666038, 0.15358754196038782, 0.14475255648046367, 0.13715762837778758, 0.20539456568679113, 0.12874556509039872, 0.1310948480457394, 0.13098908200903675, 0.13335972273744712], 'backRatio': [0.16046875394666038, 0.15358754196038782, 0.14475255648046367, 0.13715762837778758, 0.20539456568679113, 0.12874556509039872, 0.1310948480457394, 0.13098908200903675, 0.13335972273744712], 'rearX': [22.61542, 22.26675, 21.91809, 21.56942, 21.22075, 20.87208, 20.52341, 20.17475, 19.82608], 'rearY': [-1.004, -1.004, -1.004, -1.004, -1.004, -1.004, -1.004, -1.004, -1.004]},
  'Wm2Front': [759067.4,
   759053.1,
   759017.5666666668,
   758981.9666666667,
   467843.0,
   752599.8000000002,
   752519.8333333334,
   752418.4333333332,
   752317.1],
  'Wm2Back': [121806.59999999999,
   116581.09999999999,
   109869.73333333334,
   104100.16666666667,
   96092.40999999999,
   96893.88666666666,
   98651.47333333333,
   98558.60000000002,
   100328.8],
  'backRatio': [0.16046875394666038,
   0.15358754196038782,
   0.14475255648046367,
   0.13715762837778758,
   0.20539456568679113,
   0.12874556509039872,
   0.1310948480457394,
   0.13098908200903675,
   0.13335972273744712]},
 5.0: {'csvfile': 'EPWs\\1axis_5.0.csv',
  'surf_azm': 90.0,
  'surf_tilt': -5.0,
  'datetime': Index(['2021-01-01 13:00:00', '2021-01-01 14:00:00', '2021-01-01 15:00:00',
         '2021-01-01 16:00:00', '2021-01-01 17:00:00', '2021-01-02 13:00:00',
         '2021-01-02 14:00:00', '2021-01-02 15:00:00', '2021-01-02 16:00:00',
         '2021-01-02 17:00:00',
         ...
         '2021-12-30 13:00:00', '2021-12-30 14:00:00', '2021-12-30 15:00:00',
         '2021-12-30 16:00:00', '2021-12-30 17:00:00', '2021-12-31 13:00:00',
         '2021-12-31 14:00:00', '2021-12-31 15:00:00', '2021-12-31 16:00:00',
         '2021-12-31 17:00:00'],
        dtype='object', length=2096),
  'count': 2096,
  'skyfile': 'skies\\1axis_5.0.rad',
  'clearance_height': 2.156193024466364,
  'radfile': 'objects\\1axis5.0__C_2.15619_rtr_10.60600_tilt_-5.00000_20modsx7rows_origin0,0.rad',
  'scene': {'module': {'x': 0.984, 'y': 1.7, 'z': 0.02, 'modulematerial': 'black', 'scenex': 1.004, 'sceney': 3.5, 'scenez': 0.1, 'numpanels': 2, 'bifi': 1, 'text': '! genbox black test-module 0.984 1.7 0.02 | xform -t -0.492 -1.75 0.1 -a 2 -t 0 1.8 0\r\n! genrev Metal_Grey tube1 t*1.004 0.05 32 | xform -ry 90 -t -0.502 0 0', 'modulefile': 'objects\\test-module.rad', 'glass': False, 'offsetfromaxis': 0.1, 'xgap': 0.02, 'ygap': 0.1, 'zgap': 0.05}, 'modulefile': 'objects\\test-module.rad', 'gcr': 0.3300018857250613, 'text': '!xform -rx -5.0 -t 0 0 2.3 -a 20 -t 1.004 0 0 -a 7 -t 0 10.606 0 -i 1 -t -9.036 -31.817999999999998 0 -rz 90.0 -t 0 0 0 objects\\test-module.rad', 'radfiles': 'objects\\1axis5.0__C_2.15619_rtr_10.60600_tilt_-5.00000_20modsx7rows_origin0,0.rad', 'sceneDict': {'tilt': -5.0, 'gcr': 0.33, 'clearance_height': 2.156193024466364, 'azimuth': 90.0, 'nMods': 20, 'nRows': 7, 'modulez': 0.02, 'axis_tilt': 0, 'originx': 0, 'originy': 0}},
  'octfile': '1axis_5.0.oct',
  'AnalysisObj': {'octfile': '1axis_5.0.oct', 'name': '1axis_5.0', 'x': [22.59625, 22.24758, 21.89891, 21.55024, 21.20158, 20.85291, 20.50424, 20.15557, 19.8069], 'y': [-1.004, -1.004, -1.004, -1.004, -1.004, -1.004, -1.004, -1.004, -1.004], 'z': [2.542558, 2.512053, 2.481549, 2.451044, 2.42054, 2.390035, 2.359531, 2.329026, 2.298522], 'rearZ': [2.520641, 2.490137, 2.459632, 2.429128, 2.398623, 2.368119, 2.337614, 2.30711, 2.276605], 'mattype': ['a8.1.a0.test-module.6457', 'a8.1.a0.test-module.6457', 'a8.1.a0.test-module.6457', 'a8.1.a0.test-module.6457', 'a8.1.tube1.16', 'a8.1.a1.test-module.6457', 'a8.1.a1.test-module.6457', 'a8.1.a1.test-module.6457', 'a8.1.a1.test-module.6457'], 'rearMat': ['a8.1.a0.test-module.2310', 'a8.1.a0.test-module.2310', 'a8.1.a0.test-module.2310', 'a8.1.a0.test-module.2310', 'sky', 'a8.1.a1.test-module.2310', 'a8.1.a1.test-module.2310', 'a8.1.a1.test-module.2310', 'a8.1.a1.test-module.2310'], 'Wm2Front': [849427.5, 849453.8000000002, 849452.0, 849450.4, 848071.3000000002, 840212.8000000002, 840393.7333333334, 840547.8000000002, 840701.8000000002], 'Wm2Back': [109670.16666666667, 110017.06666666667, 109952.66666666667, 110019.7, 100248.5, 116695.56666666667, 124545.43333333333, 129950.33333333333, 136661.26666666663], 'Back/FrontRatio': [0.1291106851821444, 0.12951506784377392, 0.12943952870465564, 0.12951868628289692, 0.11820763169534489, 0.13888810849796449, 0.14819890754198994, 0.15460195503305266, 0.16255617212204188], 'backRatio': [0.1291106851821444, 0.12951506784377392, 0.12943952870465564, 0.12951868628289692, 0.11820763169534489, 0.13888810849796449, 0.14819890754198994, 0.15460195503305266, 0.16255617212204188], 'rearX': [22.59817, 22.2495, 21.90083, 21.55216, 21.20349, 20.85482, 20.50616, 20.15749, 19.80882], 'rearY': [-1.004, -1.004, -1.004, -1.004, -1.004, -1.004, -1.004, -1.004, -1.004]},
  'Wm2Front': [849427.5,
   849453.8000000002,
   849452.0,
   849450.4,
   848071.3000000002,
   840212.8000000002,
   840393.7333333334,
   840547.8000000002,
   840701.8000000002],
  'Wm2Back': [109670.16666666667,
   110017.06666666667,
   109952.66666666667,
   110019.7,
   100248.5,
   116695.56666666667,
   124545.43333333333,
   129950.33333333333,
   136661.26666666663],
  'backRatio': [0.1291106851821444,
   0.12951506784377392,
   0.12943952870465564,
   0.12951868628289692,
   0.11820763169534489,
   0.13888810849796449,
   0.14819890754198994,
   0.15460195503305266,
   0.16255617212204188]},
 0.0: {'csvfile': 'EPWs\\1axis_0.0.csv',
  'surf_azm': 90.0,
  'surf_tilt': 0.0,
  'datetime': Index(['2021-02-13 13:00:00', '2021-02-14 13:00:00', '2021-02-23 07:00:00',
         '2021-02-24 07:00:00', '2021-02-25 07:00:00', '2021-02-26 07:00:00',
         '2021-02-27 07:00:00', '2021-02-28 07:00:00', '2021-03-01 07:00:00',
         '2021-03-02 07:00:00', '2021-04-04 06:00:00', '2021-04-06 06:00:00',
         '2021-04-07 06:00:00', '2021-04-08 06:00:00', '2021-04-09 06:00:00',
         '2021-04-10 06:00:00', '2021-04-11 06:00:00', '2021-06-02 05:00:00',
         '2021-06-03 05:00:00', '2021-06-04 05:00:00', '2021-06-07 05:00:00',
         '2021-06-08 05:00:00', '2021-06-10 05:00:00', '2021-06-11 05:00:00',
         '2021-06-12 05:00:00', '2021-06-13 05:00:00', '2021-06-14 05:00:00',
         '2021-06-16 05:00:00', '2021-06-17 05:00:00', '2021-06-21 05:00:00',
         '2021-06-23 05:00:00', '2021-06-24 05:00:00', '2021-06-25 05:00:00',
         '2021-06-26 05:00:00', '2021-09-01 06:00:00', '2021-09-02 06:00:00',
         '2021-09-03 06:00:00', '2021-09-04 06:00:00', '2021-09-05 06:00:00',
         '2021-09-06 06:00:00', '2021-09-07 06:00:00', '2021-09-08 06:00:00',
         '2021-09-09 06:00:00', '2021-09-10 06:00:00', '2021-09-11 06:00:00',
         '2021-09-12 06:00:00', '2021-09-13 06:00:00', '2021-11-05 07:00:00',
         '2021-11-06 07:00:00', '2021-11-07 07:00:00', '2021-11-08 07:00:00',
         '2021-11-09 07:00:00', '2021-11-10 07:00:00', '2021-11-11 07:00:00',
         '2021-11-12 07:00:00', '2021-11-13 07:00:00', '2021-11-17 07:00:00'],
        dtype='object'),
  'count': 57,
  'skyfile': 'skies\\1axis_0.0.rad',
  'clearance_height': 2.3,
  'radfile': 'objects\\1axis0.0__C_2.30000_rtr_10.60600_tilt_0.00000_20modsx7rows_origin0,0.rad',
  'scene': {'module': {'x': 0.984, 'y': 1.7, 'z': 0.02, 'modulematerial': 'black', 'scenex': 1.004, 'sceney': 3.5, 'scenez': 0.1, 'numpanels': 2, 'bifi': 1, 'text': '! genbox black test-module 0.984 1.7 0.02 | xform -t -0.492 -1.75 0.1 -a 2 -t 0 1.8 0\r\n! genrev Metal_Grey tube1 t*1.004 0.05 32 | xform -ry 90 -t -0.502 0 0', 'modulefile': 'objects\\test-module.rad', 'glass': False, 'offsetfromaxis': 0.1, 'xgap': 0.02, 'ygap': 0.1, 'zgap': 0.05}, 'modulefile': 'objects\\test-module.rad', 'gcr': 0.3300018857250613, 'text': '!xform -rx 0.0 -t 0 0 2.3 -a 20 -t 1.004 0 0 -a 7 -t 0 10.606 0 -i 1 -t -9.036 -31.817999999999998 0 -rz 90.0 -t 0 0 0 objects\\test-module.rad', 'radfiles': 'objects\\1axis0.0__C_2.30000_rtr_10.60600_tilt_0.00000_20modsx7rows_origin0,0.rad', 'sceneDict': {'tilt': 0.0, 'gcr': 0.33, 'clearance_height': 2.3, 'azimuth': 90.0, 'nMods': 20, 'nRows': 7, 'modulez': 0.02, 'axis_tilt': 0, 'originx': 0, 'originy': 0}},
  'octfile': '1axis_0.0.oct',
  'AnalysisObj': {'octfile': '1axis_0.0.oct', 'name': '1axis_0.0', 'x': [22.61212, 22.26212, 21.91212, 21.56212, 21.21212, 20.86212, 20.51212, 20.16212, 19.81212], 'y': [-1.004, -1.004, -1.004, -1.004, -1.004, -1.004, -1.004, -1.004, -1.004], 'z': [2.421, 2.421, 2.421, 2.421, 2.421, 2.421, 2.421, 2.421, 2.421], 'rearZ': [2.399, 2.399, 2.399, 2.399, 2.399, 2.399, 2.399, 2.399, 2.399], 'mattype': ['a8.1.a0.test-module.6457', 'a8.1.a0.test-module.6457', 'a8.1.a0.test-module.6457', 'a8.1.a0.test-module.6457', 'a8.1.tube1.16', 'a8.1.a1.test-module.6457', 'a8.1.a1.test-module.6457', 'a8.1.a1.test-module.6457', 'a8.1.a1.test-module.6457'], 'rearMat': ['a8.1.a0.test-module.2310', 'a8.1.a0.test-module.2310', 'a8.1.a0.test-module.2310', 'a8.1.a0.test-module.2310', 'sky', 'a8.1.a1.test-module.2310', 'a8.1.a1.test-module.2310', 'a8.1.a1.test-module.2310', 'a8.1.a1.test-module.2310'], 'Wm2Front': [1180.271, 1180.321, 1180.348, 1180.375, 1181.19, 1180.429, 1180.456, 1180.483, 1180.51], 'Wm2Back': [167.7771, 162.71396666666666, 158.69793333333334, 156.27776666666668, 130.5647, 165.0594, 178.02259999999998, 187.86603333333335, 200.97393333333332], 'Back/FrontRatio': [0.14215121599089023, 0.1378555738744738, 0.13445000871211257, 0.13239659792021075, 0.11053648393866868, 0.13982989249680203, 0.1508082039413549, 0.15914322712830783, 0.17024316870688483], 'backRatio': [0.14215121599089023, 0.1378555738744738, 0.13445000871211257, 0.13239659792021075, 0.11053648393866868, 0.13982989249680203, 0.1508082039413549, 0.15914322712830783, 0.17024316870688483], 'rearX': [22.61212, 22.26212, 21.91212, 21.56212, 21.21212, 20.86212, 20.51212, 20.16212, 19.81212], 'rearY': [-1.004, -1.004, -1.004, -1.004, -1.004, -1.004, -1.004, -1.004, -1.004]},
  'Wm2Front': [1180.271,
   1180.321,
   1180.348,
   1180.375,
   1181.19,
   1180.429,
   1180.456,
   1180.483,
   1180.51],
  'Wm2Back': [167.7771,
   162.71396666666666,
   158.69793333333334,
   156.27776666666668,
   130.5647,
   165.0594,
   178.02259999999998,
   187.86603333333335,
   200.97393333333332],
  'backRatio': [0.14215121599089023,
   0.1378555738744738,
   0.13445000871211257,
   0.13239659792021075,
   0.11053648393866868,
   0.13982989249680203,
   0.1508082039413549,
   0.15914322712830783,
   0.17024316870688483]}}