From f3fea22f90372c0bd77f10dbed45d88bfad6f393 Mon Sep 17 00:00:00 2001 From: Will Holmgren Date: Thu, 4 Feb 2021 20:13:41 -0700 Subject: [PATCH 1/3] unwrap_single_value and validate_per_array in SingleAxisTracker.get_irradiance --- pvlib/tracking.py | 33 ++++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/pvlib/tracking.py b/pvlib/tracking.py index 5c3a160aa9..bd95908a99 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,26 @@ 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) + 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, From 9b1f20ac9056bd16a7b8d91a3bbe438514324b8e Mon Sep 17 00:00:00 2001 From: Will Holmgren Date: Thu, 4 Feb 2021 20:21:16 -0700 Subject: [PATCH 2/3] add test --- pvlib/tests/test_modelchain.py | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) 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, From c0f2ddc6026dee4857e93a93b73376b36867bfc1 Mon Sep 17 00:00:00 2001 From: Will Holmgren Date: Thu, 4 Feb 2021 20:24:58 -0700 Subject: [PATCH 3/3] comment --- pvlib/tracking.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pvlib/tracking.py b/pvlib/tracking.py index bd95908a99..8dd9e43461 100644 --- a/pvlib/tracking.py +++ b/pvlib/tracking.py @@ -222,6 +222,9 @@ def get_irradiance(self, surface_tilt, surface_azimuth, if airmass is None: airmass = atmosphere.get_relative_airmass(solar_zenith) + # 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)