diff --git a/pvlib/tests/test_modelchain.py b/pvlib/tests/test_modelchain.py index c71b3a4cd8..3b48ddf803 100644 --- a/pvlib/tests/test_modelchain.py +++ b/pvlib/tests/test_modelchain.py @@ -726,6 +726,29 @@ def test_run_model_tracker(sapm_dc_snl_ac_system, location, weather, mocker): 'surface_tilt']).all() assert mc.results.ac[0] > 0 assert np.isnan(mc.results.ac[1]) + assert isinstance(mc.results.dc, pd.DataFrame) + + +def test_run_model_tracker_list( + sapm_dc_snl_ac_system, location, weather, mocker): + system = SingleAxisTracker( + module_parameters=sapm_dc_snl_ac_system.module_parameters, + temperature_model_parameters=( + sapm_dc_snl_ac_system.temperature_model_parameters + ), + inverter_parameters=sapm_dc_snl_ac_system.inverter_parameters) + mocker.spy(system, 'singleaxis') + mc = ModelChain(system, location) + mc.run_model([weather]) + assert system.singleaxis.call_count == 1 + assert (mc.results.tracking.columns == ['tracker_theta', + 'aoi', + 'surface_azimuth', + 'surface_tilt']).all() + assert mc.results.ac[0] > 0 + assert np.isnan(mc.results.ac[1]) + assert isinstance(mc.results.dc, tuple) + assert len(mc.results.dc) == 1 def test__assign_total_irrad(sapm_dc_snl_ac_system, location, weather, diff --git a/pvlib/tracking.py b/pvlib/tracking.py index 5c3a160aa9..8dd9e43461 100644 --- a/pvlib/tracking.py +++ b/pvlib/tracking.py @@ -2,7 +2,7 @@ import pandas as pd from pvlib.tools import cosd, sind, tand -from pvlib.pvsystem import PVSystem +from pvlib.pvsystem import PVSystem, _unwrap_single_value from pvlib import irradiance, atmosphere @@ -169,6 +169,7 @@ def get_aoi(self, surface_tilt, surface_azimuth, solar_zenith, solar_zenith, solar_azimuth) return aoi + @_unwrap_single_value def get_irradiance(self, surface_tilt, surface_azimuth, solar_zenith, solar_azimuth, dni, ghi, dhi, dni_extra=None, airmass=None, model='haydavies', @@ -221,16 +222,29 @@ def get_irradiance(self, surface_tilt, surface_azimuth, if airmass is None: airmass = atmosphere.get_relative_airmass(solar_zenith) - return irradiance.get_total_irradiance(surface_tilt, - surface_azimuth, - solar_zenith, - solar_azimuth, - dni, ghi, dhi, - dni_extra=dni_extra, - airmass=airmass, - model=model, - albedo=self.albedo, - **kwargs) + # SingleAxisTracker only supports a single Array, but we need the + # validate/iterate machinery so that single length tuple input/output + # is handled the same as PVSystem.get_irradiance. GH 1159 + dni = self._validate_per_array(dni, system_wide=True) + ghi = self._validate_per_array(ghi, system_wide=True) + dhi = self._validate_per_array(dhi, system_wide=True) + + return tuple( + irradiance.get_total_irradiance( + surface_tilt, + surface_azimuth, + solar_zenith, + solar_azimuth, + dni, ghi, dhi, + dni_extra=dni_extra, + airmass=airmass, + model=model, + albedo=self.albedo, + **kwargs) + for array, dni, ghi, dhi in zip( + self.arrays, dni, ghi, dhi + ) + ) def singleaxis(apparent_zenith, apparent_azimuth,