def test_RadianceObj_1axis_gendaylit_end_to_end():
    # 1-axis tracking end-to-end test with torque tube and gap generation.
    # Takes 20 seconds for 2-sensor scan
    module_height = 1.95 * 2 + 0.1  # module portrait dimension in meters
    gcr = 0.35  # ground cover ratio,  = module_height / pitch
    albedo = 0.3  # ground albedo
    hub_height = 2  # tracker height at 0 tilt in meters (hub height)

    demo = RadianceObj()  # Create a RadianceObj 'object'
    demo.setGround(
        albedo
    )  # input albedo number or material name like 'concrete'.  To see options, run this without any input.
    metdata = demo.readEPW(
        MET_FILENAME)  # read in the EPW weather data from above
    #metdata = demo.readTMY(MET_FILENAME2) # select a TMY file using graphical picker
    # create metdata files for each condition. keys are timestamps for gendaylit workflow
    trackerdict = demo.set1axis(cumulativesky=False)
    # create the skyfiles needed for 1-axis tracking
    demo.gendaylit1axis(metdata=metdata, enddate='01/01')
    # test modules with gap and rear tube
    demo.makeModule(name='Longi_torquetube',
                    x=0.984,
                    y=1.95,
                    torquetube=True,
                    numpanels=2,
                    panelgap=0.1)
    #demo.makeModule(name='Longi_torquetube',x=0.984,y=1.95)
    # set module type to be used and passed into makeScene1axis
    module_type = 'Longi_torquetube'

    # Create the scene for the 1-axis tracking
    sceneDict = {
        'pitch': module_height / gcr,
        'height': hub_height,
        'orientation': 'portrait'
    }
    key = '01_01_11'
    demo.makeScene1axis(
        {key: trackerdict[key]},
        module_type,
        sceneDict,
        cumulativesky=False,
        nMods=10,
        nRows=3,
        modwanted=3,
        rowwanted=3,
        sensorsy=2
    )  #makeScene creates a .rad file with 20 modules per row, 7 rows.

    demo.makeOct1axis(trackerdict,
                      key)  # just run this for one timestep: Jan 1 11am
    demo.analysis1axis(trackerdict,
                       key)  # just run this for one timestep: Jan 1 11am

    assert (np.mean(demo.Wm2Front) == pytest.approx(214.0, 0.01))
    assert (np.mean(demo.Wm2Back) == pytest.approx(40.0, 0.1))
def test_RadianceObj_high_azimuth_angle_end_to_end():
    # modify example for high azimuth angle to test different parts of makesceneNxR.  Rear irradiance fraction roughly 17.3% for 0.95m landscape panel
    # takes 14 seconds for sensorsy = 9, 11 seconds for sensorsy = 2
    demo = RadianceObj()  # Create a RadianceObj 'object'
    demo.setGround(
        'white_EPDM'
    )  # input albedo number or material name like 'concrete'.  To see options, run this without any input.

    #metdata = demo.readEPW() # read in the EPW weather data from above
    metdata = demo.readTMY(
        MET_FILENAME2)  # select a TMY file using graphical picker
    # Now we either choose a single time point, or use cumulativesky for the entire year.
    fullYear = False
    if fullYear:
        demo.genCumSky(
            demo.epwfile
        )  # entire year.  # Don't know how to test this yet in pytest...
    else:
        demo.gendaylit(metdata, 4020)  # Noon, June 17th
    # create a scene using panels in landscape at 10 deg tilt, 1.5m pitch. 0.2 m ground clearance
    sceneDict = {
        'tilt': 10,
        'pitch': 1.5,
        'height': 0.2,
        'orientation': 'landscape',
        'azimuth': 30
    }
    demo.makeModule(name='simple_panel', x=0.95, y=1.59)
    scene = demo.makeScene(
        'simple_panel', sceneDict, nMods=10, nRows=3
    )  #makeScene creates a .rad file with 20 modules per row, 7 rows.
    octfile = demo.makeOct(
        demo.getfilelist()
    )  # makeOct combines all of the ground, sky and object files into a .oct file.
    analysis = AnalysisObj(
        octfile, demo.name
    )  # return an analysis object including the scan dimensions for back irradiance
    analysis.analysis(octfile, demo.name, scene.frontscan,
                      scene.backscan)  # compare the back vs front irradiance
    #assert np.round(np.mean(analysis.backRatio),2) == 0.20  # bifi ratio was == 0.22 in v0.2.2
    assert np.mean(analysis.Wm2Front) == pytest.approx(912, rel=0.005)
    assert np.mean(analysis.Wm2Back) == pytest.approx(182, rel=0.01)
def test_RadianceObj_fixed_tilt_end_to_end():
    # just run the demo example.  Rear irradiance fraction roughly 11.8% for 0.95m landscape panel
    # takes 12 seconds
    demo = RadianceObj()  # Create a RadianceObj 'object'
    demo.setGround(
        0.62
    )  # input albedo number or material name like 'concrete'.  To see options, run this without any input.

    metdata = demo.readEPW(
        epwfile=MET_FILENAME)  # read in the EPW weather data from above
    #metdata = demo.readTMY() # select a TMY file using graphical picker
    # Now we either choose a single time point, or use cumulativesky for the entire year.
    fullYear = False
    if fullYear:
        demo.genCumSky(demo.epwfile)  # entire year.
    else:
        demo.gendaylit(metdata, 4020)  # Noon, June 17th
    # create a scene using panels in landscape at 10 deg tilt, 1.5m pitch. 0.2 m ground clearance
    sceneDict = {
        'tilt': 10,
        'pitch': 1.5,
        'height': 0.2,
        'orientation': 'landscape'
    }
    demo.makeModule(name='simple_panel', x=0.95, y=1.59)
    scene = demo.makeScene(
        'simple_panel', sceneDict, nMods=10, nRows=3
    )  #makeScene creates a .rad file with 20 modules per row, 7 rows.
    octfile = demo.makeOct(
        demo.getfilelist()
    )  # makeOct combines all of the ground, sky and object files into a .oct file.
    analysis = AnalysisObj(
        octfile, demo.name
    )  # return an analysis object including the scan dimensions for back irradiance
    analysis.analysis(octfile, demo.name, scene.frontscan,
                      scene.backscan)  # compare the back vs front irradiance
    #assert np.round(np.mean(analysis.backRatio),decimals=2) == 0.12  # NOTE: this value is 0.11 when your module size is 1m, 0.12 when module size is 0.95m
    assert np.mean(analysis.backRatio) == pytest.approx(0.12, abs=0.01)
Beispiel #4
0
import numpy as np
import datetime
try:
    from bifacial_radiance import RadianceObj
except ImportError:
    raise RuntimeError('bifacial_radiance is required. download distribution')

print('starting simulation: {}'.format(datetime.datetime.now()))
# Example 1-axis tracking system using Radiance.  This takes 5-10 minutes to complete, depending on computer.

demo = RadianceObj(
    path=testfolder)  # Create a RadianceObj 'object' named 'demo'

demo.setGround(
    albedo
)  # input albedo number or material name like 'concrete'.  To see options, run this without any input.

epwfile = demo.getEPW(
    37.5, -77.6
)  #Pull TMY weather data for any global lat/lon.  In this case, Richmond, VA

metdata = demo.readEPW(epwfile)  # read in the weather data

# create separate metdata files for each 1-axis tracker angle (5 degree resolution).
trackerdict = demo.set1axis(metdata,
                            limit_angle=limit_angle,
                            backtrack=True,
                            gcr=gcr)

# create cumulativesky functions for each tracker angle: demo.genCumSky1axis
from bifacial_radiance import RadianceObj, AnalysisObj

# <a id='step1a'></a>

# ### A. Generating the firt scene object
#
# This is a standard fixed-tilt setup for one hour. Gencumsky could be used too for the whole year.
#
# The key here is that we are setting in sceneDict the variable **appendRadfile** to true.

# In[4]:

demo = RadianceObj("MultipleObj",
                   path=testfolder)  # Create a RadianceObj 'object'
demo.setGround(0.62)
epwfile = demo.getEPW(lat=37.5, lon=-77.6)
metdata = demo.readWeatherFile('EPWs\\USA_VA_Richmond.Intl.AP.724010_TMY.epw')
fullYear = True
demo.gendaylit(metdata,
               4020)  # Noon, June 17th  . # Gencumsky could be used too.
module_type = 'Prism Solar Bi60 landscape'
demo.makeModule(name=module_type, y=1, x=1.7)
sceneDict = {
    'tilt': 10,
    'pitch': 1.5,
    'clearance_height': 0.2,
    'azimuth': 180,
    'nMods': 5,
    'nRows': 2,
    'appendRadfile': True
Beispiel #6
0
def simulate_single(idx=None,
                    wavelength=None,
                    test_folder_fmt=None,
                    best_data_file=None,
                    data_folder=None):

    # Verify test_folder exists before creating radiance obj
    test_folder = test_folder_fmt.format(f'{idx:04}', f'{wavelength:04}')
    if not os.path.exists(test_folder):
        os.makedirs(test_folder)

    ### NEW FOR SPECTRA

    # Create radiance obj
    radiance_name = 'BEST'
    rad_obj = RadianceObj(radiance_name, str(test_folder))

    # Set ground
    rad_obj.readWeatherFile(best_data_file, label='center')

    # Check to see if file exists
    foo = rad_obj.metdata.datetime[idx]

    # If a wavelength was specified, assume this is a spectral simulation and
    # try to load spectra files.
    # Determine file suffix
    suffix = f'_{idx}.txt'

    # Generate/Load albedo
    alb_file = os.path.join(data_folder, "alb" + suffix)
    spectral_alb = spectral_property.load_file(alb_file)

    # Generate/Load dni and dhi
    dni_file = os.path.join(data_folder, "dni" + suffix)
    dhi_file = os.path.join(data_folder, "dhi" + suffix)
    ghi_file = os.path.join(data_folder, "ghi" + suffix)
    spectral_dni = spectral_property.load_file(dni_file)
    spectral_dhi = spectral_property.load_file(dhi_file)
    spectral_ghi = spectral_property.load_file(ghi_file)

    weighted_albedo = False
    if wavelength:
        alb = spectral_alb[wavelength]
        dni = spectral_dni[wavelength]
        dhi = spectral_dhi[wavelength]
    elif weighted_albedo:
        _alb = np.array(spectral_alb[range(300, 2501, 10)])
        _dni = np.array(spectral_dni[range(300, 2501, 10)])
        _dhi = np.array(spectral_dhi[range(300, 2501, 10)])
        _ghi = np.array(spectral_ghi[range(300, 2501, 10)])

        alb_scale = np.sum(_alb * (_ghi)) / np.sum(alb * (_ghi))
        alb *= alb_scale
        print(f'For IDX {idx}, albedo scaled by {alb_scale}')

    res_name = "irr_Hydra_" + str(foo.year) + "_" + str(foo.month) + "_" + str(
        foo.day) + "_" + str(foo.hour) + "_" + str(foo.minute) + '.csv'

    rad_obj.setGround(alb)
    # Set sky
    solpos = rad_obj.metdata.solpos.iloc[idx]
    zen = float(solpos.zenith)
    azm = float(solpos.azimuth) - 180
    rad_obj.gendaylit2manual(dni, dhi, 90 - zen, azm)

    lat = 39.742  # NREL SSRL location
    lon = -105.179  # NREL SSRL location
    elev = 1829
    timezone = -7
    axis_tilt = 0
    axis_azimuth = 180
    limit_angle = 60
    backtrack = True  # Set to false since it's only 1 row, no shading.
    gcr = 0.35
    angledelta = 0  # rounding to ints
    numpanels = 1
    torquetube = False  # We are going to add it separately
    diameter = 0.130175  # 5 1/8 in
    torqueTubeMaterial = 'Metal_Grey'
    tubetype = 'Round'
    axisofrotationTorqueTube = True
    azimuth = 90
    material = 'Metal_Grey'
    hub_height = 1.5  #0.927
    postdiamy = 0.1016  # N-S measurement, 4 "
    postdiamx = 0.1524  # E-W measurement, 6 "
    ttedgeoffset = -1.07  # south edge 42 in. negative because that's how I coded the trnaslation.
    ttedgeoffsetNorth = 0.10795  # North edge $ 4 1/4 inches
    length = 21.64 - ttedgeoffset + ttedgeoffsetNorth  # map goes from beginning of south post, but there is a bit more post to hold the sensor
    decimate = True
    zgap = 0.05 + diameter / 2  # 1 inch of arm, + 1 3/16 of panel width on average ~ 0.055 m
    decimateinterval = '15Min'
    pitch = 5.7  # distance between rows
    ypostlist = [0, 4.199, 10.414, 16.63, 21.64]
    ymods = [
        0.589, 1.596, 2.603, 3.610, 4.788, 5.795, 6.803, 7.810, 8.818, 9.825,
        11.003, 12.011, 13.018, 14.026, 15.034, 16.041, 17.220, 18.230, 19.240,
        20.250
    ]

    numcellsx = 6
    numcellsy = 12
    xcell = 0.142
    ycell = 0.142
    xcellgap = 0.02
    ycellgap = 0.02
    module_type = 'Bi60'

    xgap = 0.046
    ygap = 0
    glass = False

    # Set tracker information
    try:
        tilt = round(
            rad_obj.getSingleTimestampTrackerAngle(rad_obj.metdata,
                                                   idx,
                                                   gcr,
                                                   limit_angle=65), 1)
    except:
        print("Night time !!!!!!!!!")
        print("")
        print("")
        return None

    if math.isnan(tilt):
        return None

    sazm = 90

    cellLevelModuleParams = {
        'numcellsx': numcellsx,
        'numcellsy': numcellsy,
        'xcell': xcell,
        'ycell': ycell,
        'xcellgap': xcellgap,
        'ycellgap': ycellgap
    }

    # Running make module on HPC can cause issues if too many works try to
    # write to the module file at the same time. If something goes wrong,
    # assume the module has already been created.
    '''
    try:
    
        mymodule = rad_obj.makeModule(name=module_type, torquetube=torquetube, diameter=diameter, tubetype=tubetype, material=material, 
                                          xgap=xgap, ygap=ygap, zgap=zgap, numpanels=numpanels,# x=0.952, y=1.924,
                                          cellLevelModuleParams=cellLevelModuleParams, 
                                          axisofrotationTorqueTube=axisofrotationTorqueTube, glass=glass, z=0.0002)
        rad_obj.makeModule(name='sensor', x=0.15, y=0.15, z=0.04)

    except:
        print('Failed to make module.')
    '''
    radname = "Bi60_" + str(foo.year) + "_" + str(foo.month) + "_" + str(
        foo.day) + "_" + str(foo.hour) + "_" + str(foo.minute) + "_"

    sceneDict1 = {
        'tilt': tilt,
        'pitch': pitch,
        'hub_height': hub_height,
        'azimuth': azimuth,
        'nMods': 1,
        'nRows': 1,
        'originx': pitch * 0,
        'originy': ymods[0]
    }
    sceneObj1 = rad_obj.makeScene(moduletype=module_type,
                                  sceneDict=sceneDict1,
                                  radname=radname)

    sceneDict2 = {
        'tilt': tilt,
        'pitch': pitch,
        'hub_height': hub_height,
        'azimuth': azimuth,
        'nMods': 1,
        'nRows': 1,
        'originx': pitch * 1,
        'originy': ymods[0]
    }
    sceneObj2 = rad_obj.makeScene(moduletype=module_type,
                                  sceneDict=sceneDict2,
                                  radname=radname)

    sceneDict3 = {
        'tilt': tilt,
        'pitch': pitch,
        'hub_height': hub_height,
        'azimuth': azimuth,
        'nMods': 1,
        'nRows': 1,
        'originx': pitch * 2,
        'originy': ymods[0]
    }
    sceneObj3 = rad_obj.makeScene(moduletype=module_type,
                                  sceneDict=sceneDict3,
                                  radname=radname)

    sceneDict4 = {
        'tilt': tilt,
        'pitch': pitch,
        'hub_height': hub_height,
        'azimuth': azimuth,
        'nMods': 1,
        'nRows': 1,
        'originx': pitch * 3,
        'originy': ymods[0]
    }
    sceneObj4 = rad_obj.makeScene(moduletype=module_type,
                                  sceneDict=sceneDict4,
                                  radname=radname)

    sceneDict5 = {
        'tilt': tilt,
        'pitch': pitch,
        'hub_height': hub_height,
        'azimuth': azimuth,
        'nMods': 1,
        'nRows': 1,
        'originx': pitch * 4,
        'originy': ymods[0]
    }
    sceneObj5 = rad_obj.makeScene(moduletype=module_type,
                                  sceneDict=sceneDict5,
                                  radname=radname)

    sceneDict6 = {
        'tilt': tilt,
        'pitch': pitch,
        'hub_height': hub_height,
        'azimuth': azimuth,
        'nMods': 1,
        'nRows': 1,
        'originx': pitch * 5,
        'originy': ymods[0]
    }
    sceneObj6 = rad_obj.makeScene(moduletype=module_type,
                                  sceneDict=sceneDict6,
                                  radname=radname)

    sceneDict7 = {
        'tilt': tilt,
        'pitch': pitch,
        'hub_height': hub_height,
        'azimuth': azimuth,
        'nMods': 1,
        'nRows': 1,
        'originx': pitch * 6,
        'originy': ymods[0]
    }
    sceneObj7 = rad_obj.makeScene(moduletype=module_type,
                                  sceneDict=sceneDict7,
                                  radname=radname)

    sceneDict8 = {
        'tilt': tilt,
        'pitch': pitch,
        'hub_height': hub_height,
        'azimuth': azimuth,
        'nMods': 1,
        'nRows': 1,
        'originx': pitch * 7,
        'originy': ymods[0]
    }
    sceneObj8 = rad_obj.makeScene(moduletype=module_type,
                                  sceneDict=sceneDict8,
                                  radname=radname)

    sceneDict9 = {
        'tilt': tilt,
        'pitch': pitch,
        'hub_height': hub_height,
        'azimuth': azimuth,
        'nMods': 1,
        'nRows': 1,
        'originx': pitch * 8,
        'originy': ymods[0]
    }
    sceneObj9 = rad_obj.makeScene(moduletype=module_type,
                                  sceneDict=sceneDict9,
                                  radname=radname)

    sceneDict10 = {
        'tilt': tilt,
        'pitch': pitch,
        'hub_height': hub_height,
        'azimuth': azimuth,
        'nMods': 1,
        'nRows': 1,
        'originx': pitch * 9,
        'originy': ymods[0]
    }
    sceneObj10 = rad_obj.makeScene(moduletype=module_type,
                                   sceneDict=sceneDict10,
                                   radname=radname)

    #sceneObjects[tilt] = {'Obj1': sceneObj1, 'Obj2': sceneObj2, 'Obj3': sceneObj3, 'Obj4': sceneObj4, 'Obj5': sceneObj5, 'Obj6': sceneObj6, 'Obj7': sceneObj7, 'Obj8': sceneObj8, 'Obj9': sceneObj9, 'Obj10': sceneObj10}

    modulesArray = []
    fieldArray = []

    modulesArray.append(sceneObj1)
    modulesArray.append(sceneObj2)
    modulesArray.append(sceneObj3)
    modulesArray.append(sceneObj4)
    modulesArray.append(sceneObj5)
    modulesArray.append(sceneObj6)
    modulesArray.append(sceneObj7)
    modulesArray.append(sceneObj8)
    modulesArray.append(sceneObj9)
    modulesArray.append(sceneObj10)
    fieldArray.append(modulesArray)

    textrow1 = ''
    textrow2 = sceneObj2.text + '\r\n'
    textrow3 = sceneObj3.text + '\r\n'
    textrow4 = sceneObj4.text + '\r\n'
    textrow5 = sceneObj5.text + '\r\n'
    textrow6 = sceneObj6.text + '\r\n'
    textrow7 = sceneObj7.text + '\r\n'
    textrow8 = sceneObj8.text + '\r\n'
    textrow9 = sceneObj9.text + '\r\n'
    textrow10 = sceneObj10.text + '\r\n'

    # Row 1
    for i in range(1, 20):
        modulesArray = []

        sceneDict1 = {
            'tilt': tilt,
            'pitch': pitch,
            'hub_height': hub_height,
            'azimuth': azimuth,
            'nMods': 1,
            'nRows': 1,
            'originx': pitch * 0,
            'originy': ymods[i]
        }
        sceneObj1 = rad_obj.makeScene(moduletype=module_type,
                                      sceneDict=sceneDict1,
                                      radname=radname)

        sceneDict2 = {
            'tilt': tilt,
            'pitch': pitch,
            'hub_height': hub_height,
            'azimuth': azimuth,
            'nMods': 1,
            'nRows': 1,
            'originx': pitch * 1,
            'originy': ymods[i]
        }
        sceneObj2 = rad_obj.makeScene(moduletype=module_type,
                                      sceneDict=sceneDict2,
                                      radname=radname)

        sceneDict3 = {
            'tilt': tilt,
            'pitch': pitch,
            'hub_height': hub_height,
            'azimuth': azimuth,
            'nMods': 1,
            'nRows': 1,
            'originx': pitch * 2,
            'originy': ymods[i]
        }
        sceneObj3 = rad_obj.makeScene(moduletype=module_type,
                                      sceneDict=sceneDict3,
                                      radname=radname)

        sceneDict4 = {
            'tilt': tilt,
            'pitch': pitch,
            'hub_height': hub_height,
            'azimuth': azimuth,
            'nMods': 1,
            'nRows': 1,
            'originx': pitch * 3,
            'originy': ymods[i]
        }
        sceneObj4 = rad_obj.makeScene(moduletype=module_type,
                                      sceneDict=sceneDict4,
                                      radname=radname)

        sceneDict5 = {
            'tilt': tilt,
            'pitch': pitch,
            'hub_height': hub_height,
            'azimuth': azimuth,
            'nMods': 1,
            'nRows': 1,
            'originx': pitch * 4,
            'originy': ymods[i]
        }
        sceneObj5 = rad_obj.makeScene(moduletype=module_type,
                                      sceneDict=sceneDict5,
                                      radname=radname)

        sceneDict6 = {
            'tilt': tilt,
            'pitch': pitch,
            'hub_height': hub_height,
            'azimuth': azimuth,
            'nMods': 1,
            'nRows': 1,
            'originx': pitch * 5,
            'originy': ymods[i]
        }
        sceneObj6 = rad_obj.makeScene(moduletype=module_type,
                                      sceneDict=sceneDict6,
                                      radname=radname)

        sceneDict7 = {
            'tilt': tilt,
            'pitch': pitch,
            'hub_height': hub_height,
            'azimuth': azimuth,
            'nMods': 1,
            'nRows': 1,
            'originx': pitch * 6,
            'originy': ymods[i]
        }
        sceneObj7 = rad_obj.makeScene(moduletype=module_type,
                                      sceneDict=sceneDict7,
                                      radname=radname)

        sceneDict8 = {
            'tilt': tilt,
            'pitch': pitch,
            'hub_height': hub_height,
            'azimuth': azimuth,
            'nMods': 1,
            'nRows': 1,
            'originx': pitch * 7,
            'originy': ymods[i]
        }
        sceneObj8 = rad_obj.makeScene(moduletype=module_type,
                                      sceneDict=sceneDict8,
                                      radname=radname)

        sceneDict9 = {
            'tilt': tilt,
            'pitch': pitch,
            'hub_height': hub_height,
            'azimuth': azimuth,
            'nMods': 1,
            'nRows': 1,
            'originx': pitch * 8,
            'originy': ymods[i]
        }
        sceneObj9 = rad_obj.makeScene(moduletype=module_type,
                                      sceneDict=sceneDict9,
                                      radname=radname)

        sceneDict10 = {
            'tilt': tilt,
            'pitch': pitch,
            'hub_height': hub_height,
            'azimuth': azimuth,
            'nMods': 1,
            'nRows': 1,
            'originx': pitch * 9,
            'originy': ymods[i]
        }
        sceneObj10 = rad_obj.makeScene(moduletype=module_type,
                                       sceneDict=sceneDict10,
                                       radname=radname)

        textrow1 += sceneObj1.text + '\r\n'
        textrow2 += sceneObj2.text + '\r\n'
        textrow3 += sceneObj3.text + '\r\n'
        textrow4 += sceneObj4.text + '\r\n'
        textrow5 += sceneObj5.text + '\r\n'
        textrow6 += sceneObj6.text + '\r\n'
        textrow7 += sceneObj7.text + '\r\n'
        textrow8 += sceneObj8.text + '\r\n'
        textrow9 += sceneObj9.text + '\r\n'
        textrow10 += sceneObj10.text + '\r\n'

        modulesArray.append(sceneObj1)
        modulesArray.append(sceneObj2)
        modulesArray.append(sceneObj3)
        modulesArray.append(sceneObj4)
        modulesArray.append(sceneObj5)
        modulesArray.append(sceneObj6)
        modulesArray.append(sceneObj7)
        modulesArray.append(sceneObj8)
        modulesArray.append(sceneObj9)
        modulesArray.append(sceneObj10)

        fieldArray.append(modulesArray)

    # Redoing the first module to append everything to it.
    sceneDict1 = {
        'tilt': tilt,
        'pitch': pitch,
        'hub_height': hub_height,
        'azimuth': azimuth,
        'nMods': 1,
        'nRows': 1,
        'originx': pitch * 0,
        'originy': ymods[0]
    }
    sceneObj1 = rad_obj.makeScene(moduletype=module_type,
                                  sceneDict=sceneDict1,
                                  radname=radname)

    rad_obj.appendtoScene(sceneObj1.radfiles, '', textrow1)
    rad_obj.appendtoScene(sceneObj1.radfiles, '', textrow2)
    rad_obj.appendtoScene(sceneObj1.radfiles, '', textrow3)
    rad_obj.appendtoScene(sceneObj1.radfiles, '', textrow4)
    rad_obj.appendtoScene(sceneObj1.radfiles, '', textrow5)
    rad_obj.appendtoScene(sceneObj1.radfiles, '', textrow6)
    rad_obj.appendtoScene(sceneObj1.radfiles, '', textrow7)
    rad_obj.appendtoScene(sceneObj1.radfiles, '', textrow8)
    rad_obj.appendtoScene(sceneObj1.radfiles, '', textrow9)
    rad_obj.appendtoScene(sceneObj1.radfiles, '', textrow10)

    # Custom BSA Geometry
    # Bottom posttubes and torquetube:
    for i in range(0, 10):
        xpost = i * pitch

        # adding torquetube
        torquetube = '\n\r! genrev Metal_Grey torquetube{} t*{} {} 32 | xform -rx -90 -t {} {} {}'.format(
            i, length, diameter / 2.0, xpost, ttedgeoffset, hub_height - zgap)
        rad_obj.appendtoScene(sceneObj1.radfiles, '', torquetube)

        for j in range(0, 5):
            ypost = ypostlist[j]

            post1 = '! genbox Metal_Grey pile{} {} {} {} | xform -t {} {} 0 '.format(
                (str(i) + "," + str(j)), postdiamx, postdiamy, hub_height,
                -postdiamx / 2.0 + xpost, -postdiamy + ypost)
            rad_obj.appendtoScene(sceneObj1.radfiles, '', post1)

    ###########################
    # Create sensor objects   #
    ###########################

    # West Sensors
    shhw = 1.5 + (1 - 0.226 / 2) * sin(
        radians(tilt)) + (0.130175 / 2 + 0.05 - 0.02) * cos(radians(tilt))
    sxw = pitch * 2 - (1 - 0.226 / 2) * cos(
        radians(tilt)) + (0.130175 / 2 + 0.05 - 0.02) * sin(radians(tilt))
    syw = ymods[9] + 0.5 + 0.226 / 2
    sensorw_scene = {
        'tilt': tilt,
        'pitch': 1,
        'hub_height': shhw,
        'azimuth': azimuth,
        'nMods': 1,
        'nRows': 1,
        'originx': sxw,
        'originy': syw,
        'appendRadfile': True
    }
    res_name = "SensorW_" + str(foo.year) + "_" + str(foo.month) + "_" + str(
        foo.day) + "_" + str(foo.hour) + "_" + str(foo.minute)
    sensorw_sceneObj = rad_obj.makeScene(moduletype='sensor',
                                         sceneDict=sensorw_scene,
                                         radname=res_name)

    syw = ymods[15] + 0.5 + 0.226 / 2
    sensorIMTw_scene = {
        'tilt': tilt,
        'pitch': 1,
        'hub_height': shhw,
        'azimuth': azimuth,
        'nMods': 1,
        'nRows': 1,
        'originx': sxw,
        'originy': syw,
        'appendRadfile': True
    }
    res_name = "SensorIMTW_" + str(foo.year) + "_" + str(
        foo.month) + "_" + str(foo.day) + "_" + str(foo.hour) + "_" + str(
            foo.minute)
    sensorIMTw_sceneObj = rad_obj.makeScene(moduletype='sensor',
                                            sceneDict=sensorIMTw_scene,
                                            radname=res_name)

    # East Sensors
    shhe = 1.5 - (1 - 0.226 / 2) * sin(
        radians(tilt)) + (0.130175 / 2 + 0.05 - 0.02) * cos(radians(tilt))
    sxe = pitch * 2 + (1 - 0.226 / 2) * cos(
        radians(tilt)) + (0.130175 / 2 + 0.05 - 0.02) * sin(radians(tilt))
    sye = ymods[9] + 0.5 + 0.226 / 2
    sensore_scene = {
        'tilt': tilt,
        'pitch': 1,
        'hub_height': shhe,
        'azimuth': azimuth,
        'nMods': 1,
        'nRows': 1,
        'originx': sxe,
        'originy': sye,
        'appendRadfile': True
    }
    res_name = "SensorE_" + str(foo.year) + "_" + str(foo.month) + "_" + str(
        foo.day) + "_" + str(foo.hour) + "_" + str(foo.minute)
    sensore_sceneObj = rad_obj.makeScene(moduletype='sensor',
                                         sceneDict=sensore_scene,
                                         radname=res_name)

    sye = ymods[15] + 0.5 + 0.226 / 2
    sensorIMTe_scene = {
        'tilt': tilt,
        'pitch': 1,
        'hub_height': shhe,
        'azimuth': azimuth,
        'nMods': 1,
        'nRows': 1,
        'originx': sxe,
        'originy': sye,
        'appendRadfile': True
    }
    res_name = "SensorIMTE_" + str(foo.year) + "_" + str(
        foo.month) + "_" + str(foo.day) + "_" + str(foo.hour) + "_" + str(
            foo.minute)
    sensorIMTe_sceneObj = rad_obj.makeScene(moduletype='sensor',
                                            sceneDict=sensorIMTe_scene,
                                            radname=res_name)

    # Build oct file
    sim_name = "BEST_" + str(foo.year) + "_" + str(foo.month) + "_" + str(
        foo.day) + "_" + str(foo.hour) + "_" + str(foo.minute)
    octfile = rad_obj.makeOct(rad_obj.getfilelist(), octname=sim_name)

    #################
    # Run analysis  #
    #################

    #Row 3 Module 10 sensors
    analysis = AnalysisObj(octfile, rad_obj.basename)

    frontscan, backscan = analysis.moduleAnalysis(
        sensorw_sceneObj,
        sensorsy=1)  #, frontsurfaceoffset=0.021)#, backsurfaceoffset = 0.02)
    res_name = "SensorW_" + str(foo.year) + "_" + str(foo.month) + "_" + str(
        foo.day) + "_" + str(foo.hour) + "_" + str(foo.minute)
    frontdict, backdict = analysis.analysis(octfile, res_name, frontscan,
                                            backscan)

    frontscan, backscan = analysis.moduleAnalysis(
        sensore_sceneObj,
        sensorsy=1)  #, frontsurfaceoffset=0.021)#, backsurfaceoffset = 0.02)
    res_name = "SensorE_" + str(foo.year) + "_" + str(foo.month) + "_" + str(
        foo.day) + "_" + str(foo.hour) + "_" + str(foo.minute)
    frontdict, backdict = analysis.analysis(octfile, res_name, frontscan,
                                            backscan)

    #IMT Sensors Row 3 Module 5
    '''
    frontscan, backscan = analysis.moduleAnalysis(sensorIMTw_sceneObj, sensorsy=1)#, frontsurfaceoffset=0.021)#, backsurfaceoffset = 0.02)
    res_name = "SensorIMTW_"+str(foo.year)+"_"+str(foo.month)+"_"+str(foo.day)+"_"+str(foo.hour)+"_"+str(foo.minute)
    frontdict, backdict = analysis.analysis(octfile, res_name, frontscan, backscan)

    frontscan, backscan = analysis.moduleAnalysis(sensorIMTe_sceneObj, sensorsy=1)#, frontsurfaceoffset=0.021)#, backsurfaceoffset = 0.02)
    res_name = "SensorIMTE_"+str(foo.year)+"_"+str(foo.month)+"_"+str(foo.day)+"_"+str(foo.hour)+"_"+str(foo.minute)
    frontdict, backdict = analysis.analysis(octfile, res_name, frontscan, backscan)
    
    #fieldARray[module][row]

    #HYDRA
    modmod = 16
    rowrow = 1
    frontscan, backscan = analysis.moduleAnalysis(fieldArray[modmod][rowrow], sensorsy=12)#, frontsurfaceoffset=0.021)#, backsurfaceoffset = 0.02)        
    res_name = "Hydra_"+str(foo.year)+"_"+str(foo.month)+"_"+str(foo.day)+"_"+str(foo.hour)+"_"+str(foo.minute)
    frontdict, backdict = analysis.analysis(octfile, res_name, frontscan, backscan)

    '''

    #LOCATION_APOGEES
    modmod = 9
    rowrow = 2
    frontscan, backscan = analysis.moduleAnalysis(
        fieldArray[modmod][rowrow],
        sensorsy=4)  #, frontsurfaceoffset=0.021)#, backsurfaceoffset = 0.02)
    frontscan['ystart'] = frontscan['ystart'] + 0.45
    backscan['ystart'] = backscan['ystart'] + 0.45
    res_name = "Apogee_" + str(foo.year) + "_" + str(foo.month) + "_" + str(
        foo.day) + "_" + str(foo.hour) + "_" + str(foo.minute)
    frontdict, backdict = analysis.analysis(octfile, res_name, frontscan,
                                            backscan)
    '''
    # SCAN FULL ROWS
    for rowrow in range(5, 7):
        for modmod in range(0, 20):
            frontscan, backscan = analysis.moduleAnalysis(fieldArray[modmod][rowrow], sensorsy=12)#, frontsurfaceoffset=0.021)#, backsurfaceoffset = 0.02)        
            res_name = "Row_"+str(rowrow)+"_Mod_"+str(modmod)+"_"+str(foo.year)+"_"+str(foo.month)+"_"+str(foo.day)+"_"+str(foo.hour)+"_"+str(foo.minute)
            frontdict, backdict = analysis.analysis(octfile, res_name, frontscan, backscan)
    '''
    # Read in results
    #results_file = os.path.join('results', f'irr_sensor_{sim_name}.csv')
    #results = load.read1Result(results_file)
    results = 1

    # Format output
    #tracker_theta = tilt
    #front = ','.join([ str(f) for f in results['Wm2Front'] ])
    #back = ','.join([ str(r) for r in results['Wm2Back'] ])
    print("***** Finished simulation for " + str(foo))
    #time_str = metdata.datetime[idx]
    #    print(f"sim_results,{idx},{time_str},{wavelength},{dni},{dhi},{alb}," \
    #          f"{tracker_theta},{front},{back}")
    return results