def test_SingleAxisTracker_tracking(): with pytest.warns(pvlibDeprecationWarning): system = tracking.SingleAxisTracker(max_angle=90, axis_tilt=30, axis_azimuth=180, gcr=2.0 / 7.0, backtrack=True) apparent_zenith = pd.Series([30]) apparent_azimuth = pd.Series([135]) tracker_data = system.singleaxis(apparent_zenith, apparent_azimuth) expect = pd.DataFrame( { 'aoi': 7.286245, 'surface_azimuth': 142.65730, 'surface_tilt': 35.98741, 'tracker_theta': -20.88121 }, index=[0], dtype=np.float64) expect = expect[SINGLEAXIS_COL_ORDER] assert_frame_equal(expect, tracker_data) # results calculated using PVsyst pvsyst_solar_azimuth = 7.1609 pvsyst_solar_height = 27.315 pvsyst_axis_tilt = 20. pvsyst_axis_azimuth = 20. with pytest.warns(pvlibDeprecationWarning): pvsyst_system = tracking.SingleAxisTracker(max_angle=60., axis_tilt=pvsyst_axis_tilt, axis_azimuth=180 + pvsyst_axis_azimuth, backtrack=False) # the definition of azimuth is different from PYsyst apparent_azimuth = pd.Series([180 + pvsyst_solar_azimuth]) apparent_zenith = pd.Series([90 - pvsyst_solar_height]) tracker_data = pvsyst_system.singleaxis(apparent_zenith, apparent_azimuth) expect = pd.DataFrame( { 'aoi': 41.07852, 'surface_azimuth': 180 - 18.432, 'surface_tilt': 24.92122, 'tracker_theta': -15.18391 }, index=[0], dtype=np.float64) expect = expect[SINGLEAXIS_COL_ORDER] assert_frame_equal(expect, tracker_data)
def test_SingleAxisTracker___repr__(): system = tracking.SingleAxisTracker(max_angle=45, gcr=.25, module='blah', inverter='blarg') expected = 'SingleAxisTracker: \n axis_tilt: 0\n axis_azimuth: 0\n max_angle: 45\n backtrack: True\n gcr: 0.25\n name: None\n surface_tilt: 0\n surface_azimuth: 180\n module: blah\n inverter: blarg\n albedo: 0.25\n racking_model: open_rack_cell_glassback' assert system.__repr__() == expected
def test_SingleAxisTracker___repr__(): system = tracking.SingleAxisTracker( max_angle=45, gcr=.25, module='blah', inverter='blarg', temperature_model_parameters={'a': -3.56}) expected = """SingleAxisTracker: axis_tilt: 0 axis_azimuth: 0 max_angle: 45 backtrack: True gcr: 0.25 cross_axis_tilt: 0.0 name: None Array: name: None surface_tilt: None surface_azimuth: None module: blah albedo: 0.25 racking_model: None module_type: None temperature_model_parameters: {'a': -3.56} strings: 1 modules_per_string: 1 inverter: blarg""" assert system.__repr__() == expected
def test_get_irradiance(): system = tracking.SingleAxisTracker(max_angle=90, axis_tilt=30, axis_azimuth=180, gcr=2.0/7.0, backtrack=True) times = pd.DatetimeIndex(start='20160101 1200-0700', end='20160101 1800-0700', freq='6H') location = Location(latitude=32, longitude=-111) solar_position = location.get_solarposition(times) irrads = pd.DataFrame({'dni':[900,0], 'ghi':[600,0], 'dhi':[100,0]}, index=times) solar_zenith = solar_position['apparent_zenith'] solar_azimuth = solar_position['azimuth'] tracker_data = system.singleaxis(solar_zenith, solar_azimuth) irradiance = system.get_irradiance(tracker_data['surface_tilt'], tracker_data['surface_azimuth'], solar_zenith, solar_azimuth, irrads['dni'], irrads['ghi'], irrads['dhi']) expected = pd.DataFrame(data=np.array( [[961.80070, 815.94490, 145.85580, 135.32820, 10.52757492], [nan, nan, nan, nan, nan]]), columns=['poa_global', 'poa_direct', 'poa_diffuse', 'poa_sky_diffuse', 'poa_ground_diffuse'], index=times) assert_frame_equal(irradiance, expected, check_less_precise=2)
def test_SingleAxisTracker___repr__(): system = tracking.SingleAxisTracker(max_angle=45, gcr=.25, module='blah', inverter='blarg') assert system.__repr__() == 'SingleAxisTracker with max_angle: 45'
def test_SingleAxisTracker___repr__(): with pytest.warns(pvlibDeprecationWarning): system = tracking.SingleAxisTracker( max_angle=45, gcr=.25, module='blah', inverter='blarg', temperature_model_parameters={'a': -3.56}) expected = """SingleAxisTracker: axis_tilt: 0 axis_azimuth: 0 max_angle: 45 backtrack: True gcr: 0.25 cross_axis_tilt: 0.0 name: None Array: name: None mount: SingleAxisTrackerMount(axis_tilt=0, axis_azimuth=0, max_angle=45, backtrack=True, gcr=0.25, cross_axis_tilt=0.0, racking_model=None, module_height=None) module: blah albedo: 0.25 module_type: None temperature_model_parameters: {'a': -3.56} strings: 1 modules_per_string: 1 inverter: blarg""" # noqa: E501 assert system.__repr__() == expected
def power_tracking(clearsky, albuquerque, system_parameters): """Simulated power for a pvlib SingleAxisTracker PVSystem in Albuquerque""" system = tracking.SingleAxisTracker(**system_parameters) mc = modelchain.ModelChain(system, albuquerque, orientation_strategy='south_at_latitude_tilt') mc.run_model(clearsky) return mc.ac
def test_get_irradiance(): with pytest.warns(pvlibDeprecationWarning): system = tracking.SingleAxisTracker(max_angle=90, axis_tilt=30, axis_azimuth=180, gcr=2.0 / 7.0, backtrack=True) times = pd.date_range(start='20160101 1200-0700', end='20160101 1800-0700', freq='6H') # latitude=32, longitude=-111 solar_position = pd.DataFrame(np.array([[ 55.36421554, 55.38851771, 34.63578446, 34.61148229, 172.32003763, -3.44516534 ], [ 96.50000401, 96.50000401, -6.50000401, -6.50000401, 246.91581654, -3.56292888 ]]), columns=[ 'apparent_zenith', 'zenith', 'apparent_elevation', 'elevation', 'azimuth', 'equation_of_time' ], index=times) irrads = pd.DataFrame({ 'dni': [900, 0], 'ghi': [600, 0], 'dhi': [100, 0] }, index=times) solar_zenith = solar_position['apparent_zenith'] solar_azimuth = solar_position['azimuth'] # invalid warnings already generated in horizon test above, # no need to clutter test output here with np.errstate(invalid='ignore'): tracker_data = system.singleaxis(solar_zenith, solar_azimuth) # some invalid values in irradiance.py. not our problem here with np.errstate(invalid='ignore'): irradiance = system.get_irradiance(tracker_data['surface_tilt'], tracker_data['surface_azimuth'], solar_zenith, solar_azimuth, irrads['dni'], irrads['ghi'], irrads['dhi']) expected = pd.DataFrame(data=np.array( [[961.80070, 815.94490, 145.85580, 135.32820, 10.52757492], [nan, nan, nan, nan, nan]]), columns=[ 'poa_global', 'poa_direct', 'poa_diffuse', 'poa_sky_diffuse', 'poa_ground_diffuse' ], index=times) assert_frame_equal(irradiance, expected, check_less_precise=2)
def setup(self): self.times = pd.date_range(start='20180601', freq='1min', periods=14400) self.lat = 35.1 self.lon = -106.6 self.solar_position = solarposition.get_solarposition(self.times, self.lat, self.lon) self.tracker = tracking.SingleAxisTracker()
def test_SingleAxisTracker_one_array_only(): system = tracking.SingleAxisTracker(arrays=[ pvsystem.Array(module='foo', surface_tilt=None, surface_azimuth=None) ]) assert system.arrays[0].module == 'foo' with pytest.raises(ValueError, match="SingleAxisTracker does not support " r"multiple arrays\."): tracking.SingleAxisTracker(arrays=[ pvsystem.Array(module='foo'), pvsystem.Array(module='bar') ]) with pytest.raises(ValueError, match="Array must not have surface_tilt "): tracking.SingleAxisTracker(arrays=[pvsystem.Array(module='foo')]) with pytest.raises(ValueError, match="Array must not have surface_tilt "): tracking.SingleAxisTracker( arrays=[pvsystem.Array(surface_azimuth=None)]) with pytest.raises(ValueError, match="Array must not have surface_tilt "): tracking.SingleAxisTracker(arrays=[pvsystem.Array(surface_tilt=None)])
def test_SingleAxisTracker_localize_location(): system = tracking.SingleAxisTracker(max_angle=45, gcr=.25, module='blah', inverter='blarg') location = Location(latitude=32, longitude=-111) localized_system = system.localize(location=location) assert localized_system.module == 'blah' assert localized_system.inverter == 'blarg' assert localized_system.latitude == 32 assert localized_system.longitude == -111
def summer_power_tracking_old_pvlib(summer_clearsky, albuquerque, array_parameters, system_parameters): """Simulated power for a TRACKING PVSystem in Albuquerque""" # copy of `summer_power_tracking` but with older pvlib API # TODO: remove when minimum pvlib version is >= 0.9.0 pv_system = tracking.SingleAxisTracker(**array_parameters, **system_parameters) mc = modelchain.ModelChain(pv_system, albuquerque) mc.run_model(summer_clearsky) return mc.ac
def test_SingleAxisTracker_creation(): system = tracking.SingleAxisTracker(max_angle=45, gcr=.25, module='blah', inverter='blarg') assert system.max_angle == 45 assert system.gcr == .25 assert system.module == 'blah' assert system.inverter == 'blarg'
def test_get_aoi(): system = tracking.SingleAxisTracker(max_angle=90, axis_tilt=30, axis_azimuth=180, gcr=2.0/7.0, backtrack=True) surface_tilt = np.array([30, 0]) surface_azimuth = np.array([90, 270]) solar_zenith = np.array([70, 10]) solar_azimuth = np.array([100, 180]) out = system.get_aoi(surface_tilt, surface_azimuth, solar_zenith, solar_azimuth) expected = np.array([40.632115, 10.]) assert_allclose(out, expected, atol=0.000001)
def test_get_irradiance(): system = tracking.SingleAxisTracker(max_angle=90, axis_tilt=30, axis_azimuth=180, gcr=2.0 / 7.0, backtrack=True) times = pd.date_range(start='20160101 1200-0700', end='20160101 1800-0700', freq='6H') location = Location(latitude=32, longitude=-111) solar_position = location.get_solarposition(times) irrads = pd.DataFrame({ 'dni': [900, 0], 'ghi': [600, 0], 'dhi': [100, 0] }, index=times) solar_zenith = solar_position['apparent_zenith'] solar_azimuth = solar_position['azimuth'] # invalid warnings already generated in horizon test above, # no need to clutter test output here with np.errstate(invalid='ignore'): tracker_data = system.singleaxis(solar_zenith, solar_azimuth) # some invalid values in irradiance.py. not our problem here with np.errstate(invalid='ignore'): irradiance = system.get_irradiance(tracker_data['surface_tilt'], tracker_data['surface_azimuth'], solar_zenith, solar_azimuth, irrads['dni'], irrads['ghi'], irrads['dhi']) expected = pd.DataFrame(data=np.array( [[961.80070, 815.94490, 145.85580, 135.32820, 10.52757492], [nan, nan, nan, nan, nan]]), columns=[ 'poa_global', 'poa_direct', 'poa_diffuse', 'poa_sky_diffuse', 'poa_ground_diffuse' ], index=times) assert_frame_equal(irradiance, expected, check_less_precise=2)
def test_get_irradiance(): system = tracking.SingleAxisTracker(max_angle=90, axis_tilt=30, axis_azimuth=180, gcr=2.0 / 7.0, backtrack=True) times = pd.DatetimeIndex(start='20160101 1200-0700', end='20160101 1800-0700', freq='6H') location = Location(latitude=32, longitude=-111) solar_position = location.get_solarposition(times) irrads = pd.DataFrame({ 'dni': [900, 0], 'ghi': [600, 0], 'dhi': [100, 0] }, index=times) solar_zenith = solar_position['apparent_zenith'] solar_azimuth = solar_position['azimuth'] tracker_data = system.singleaxis(solar_zenith, solar_azimuth) irradiance = system.get_irradiance( irrads['dni'], irrads['ghi'], irrads['dhi'], solar_zenith=solar_zenith, solar_azimuth=solar_azimuth, surface_tilt=tracker_data['surface_tilt'], surface_azimuth=tracker_data['surface_azimuth']) expected = pd.DataFrame(data=np.array( [[142.71652464, 87.50125991, 55.21526473, 44.68768982, 10.52757492], [nan, nan, nan, nan, nan]]), columns=[ 'poa_global', 'poa_direct', 'poa_diffuse', 'poa_sky_diffuse', 'poa_ground_diffuse' ], index=times) irradiance = np.round(irradiance, 4) expected = np.round(expected, 4) assert_frame_equal(irradiance, expected)
def test_SingleAxisTracker___repr__(): system = tracking.SingleAxisTracker( max_angle=45, gcr=.25, module='blah', inverter='blarg', temperature_model_parameters={'a': -3.56}) expected = """SingleAxisTracker: axis_tilt: 0 axis_azimuth: 0 max_angle: 45 backtrack: True gcr: 0.25 name: None surface_tilt: None surface_azimuth: None module: blah inverter: blarg albedo: 0.25 racking_model: open_rack module_type: glass_polymer temperature_model_parameters: {'a': -3.56}""" assert system.__repr__() == expected
def test_SingleAxisTracker_tracking(): system = tracking.SingleAxisTracker(max_angle=90, axis_tilt=30, axis_azimuth=180, gcr=2.0 / 7.0, backtrack=True) apparent_zenith = pd.Series([30]) apparent_azimuth = pd.Series([135]) tracker_data = system.singleaxis(apparent_zenith, apparent_azimuth) expect = pd.DataFrame( { 'aoi': 7.286245, 'surface_azimuth': 37.3427, 'surface_tilt': 35.98741, 'tracker_theta': -20.88121 }, index=[0], dtype=np.float64) assert_frame_equal(expect, tracker_data)