Skip to content

Commit 5a5d4aa

Browse files
authored
unwrap_single_value, validate_per_array in SingleAxisTracker.get_irradiance (#1160)
* unwrap_single_value and validate_per_array in SingleAxisTracker.get_irradiance * add test * comment
1 parent dd78d6e commit 5a5d4aa

File tree

2 files changed

+48
-11
lines changed

2 files changed

+48
-11
lines changed

pvlib/tests/test_modelchain.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -726,6 +726,29 @@ def test_run_model_tracker(sapm_dc_snl_ac_system, location, weather, mocker):
726726
'surface_tilt']).all()
727727
assert mc.results.ac[0] > 0
728728
assert np.isnan(mc.results.ac[1])
729+
assert isinstance(mc.results.dc, pd.DataFrame)
730+
731+
732+
def test_run_model_tracker_list(
733+
sapm_dc_snl_ac_system, location, weather, mocker):
734+
system = SingleAxisTracker(
735+
module_parameters=sapm_dc_snl_ac_system.module_parameters,
736+
temperature_model_parameters=(
737+
sapm_dc_snl_ac_system.temperature_model_parameters
738+
),
739+
inverter_parameters=sapm_dc_snl_ac_system.inverter_parameters)
740+
mocker.spy(system, 'singleaxis')
741+
mc = ModelChain(system, location)
742+
mc.run_model([weather])
743+
assert system.singleaxis.call_count == 1
744+
assert (mc.results.tracking.columns == ['tracker_theta',
745+
'aoi',
746+
'surface_azimuth',
747+
'surface_tilt']).all()
748+
assert mc.results.ac[0] > 0
749+
assert np.isnan(mc.results.ac[1])
750+
assert isinstance(mc.results.dc, tuple)
751+
assert len(mc.results.dc) == 1
729752

730753

731754
def test__assign_total_irrad(sapm_dc_snl_ac_system, location, weather,

pvlib/tracking.py

Lines changed: 25 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
import pandas as pd
33

44
from pvlib.tools import cosd, sind, tand
5-
from pvlib.pvsystem import PVSystem
5+
from pvlib.pvsystem import PVSystem, _unwrap_single_value
66
from pvlib import irradiance, atmosphere
77

88

@@ -169,6 +169,7 @@ def get_aoi(self, surface_tilt, surface_azimuth, solar_zenith,
169169
solar_zenith, solar_azimuth)
170170
return aoi
171171

172+
@_unwrap_single_value
172173
def get_irradiance(self, surface_tilt, surface_azimuth,
173174
solar_zenith, solar_azimuth, dni, ghi, dhi,
174175
dni_extra=None, airmass=None, model='haydavies',
@@ -221,16 +222,29 @@ def get_irradiance(self, surface_tilt, surface_azimuth,
221222
if airmass is None:
222223
airmass = atmosphere.get_relative_airmass(solar_zenith)
223224

224-
return irradiance.get_total_irradiance(surface_tilt,
225-
surface_azimuth,
226-
solar_zenith,
227-
solar_azimuth,
228-
dni, ghi, dhi,
229-
dni_extra=dni_extra,
230-
airmass=airmass,
231-
model=model,
232-
albedo=self.albedo,
233-
**kwargs)
225+
# SingleAxisTracker only supports a single Array, but we need the
226+
# validate/iterate machinery so that single length tuple input/output
227+
# is handled the same as PVSystem.get_irradiance. GH 1159
228+
dni = self._validate_per_array(dni, system_wide=True)
229+
ghi = self._validate_per_array(ghi, system_wide=True)
230+
dhi = self._validate_per_array(dhi, system_wide=True)
231+
232+
return tuple(
233+
irradiance.get_total_irradiance(
234+
surface_tilt,
235+
surface_azimuth,
236+
solar_zenith,
237+
solar_azimuth,
238+
dni, ghi, dhi,
239+
dni_extra=dni_extra,
240+
airmass=airmass,
241+
model=model,
242+
albedo=self.albedo,
243+
**kwargs)
244+
for array, dni, ghi, dhi in zip(
245+
self.arrays, dni, ghi, dhi
246+
)
247+
)
234248

235249

236250
def singleaxis(apparent_zenith, apparent_azimuth,

0 commit comments

Comments
 (0)