Skip to content

Commit 72fca53

Browse files
committed
add SingleAxisTracker support to ModelChain
1 parent 6600dd6 commit 72fca53

File tree

2 files changed

+43
-3
lines changed

2 files changed

+43
-3
lines changed

pvlib/modelchain.py

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,12 @@
66
the time to read the source code for the module.
77
"""
88

9+
from functools import partial
10+
911
import pandas as pd
1012

1113
from pvlib import solarposition, pvsystem, clearsky, atmosphere
14+
from pvlib.tracking import SingleAxisTracker
1215
import pvlib.irradiance # avoid name conflict with full import
1316

1417

@@ -317,9 +320,32 @@ def run_model(self, times, irradiance=None, weather=None):
317320
airmass_data=self.airmass['airmass_absolute'])
318321
self.irradiance = irradiance
319322

320-
self.total_irrad = self.system.get_irradiance(
321-
self.solar_position['apparent_zenith'],
322-
self.solar_position['azimuth'],
323+
# PVSystem.get_irradiance and SingleAxisTracker.get_irradiance
324+
# have different method signatures, so use partial to handle
325+
# the differences.
326+
if isinstance(self.system, SingleAxisTracker):
327+
self.tracking = self.system.singleaxis(
328+
self.solar_position['apparent_zenith'],
329+
self.solar_position['azimuth'])
330+
self.tracking['surface_tilt'] = (
331+
self.tracking['surface_tilt']
332+
.fillna(self.system.axis_tilt))
333+
self.tracking['surface_azimuth'] = (
334+
self.tracking['surface_azimuth']
335+
.fillna(self.system.axis_azimuth))
336+
get_irradiance = partial(
337+
self.system.get_irradiance,
338+
surface_tilt=self.tracking['surface_tilt'],
339+
surface_azimuth=self.tracking['surface_azimuth'],
340+
solar_zenith=self.solar_position['apparent_zenith'],
341+
solar_azimuth=self.solar_position['azimuth'])
342+
else:
343+
get_irradiance = partial(
344+
self.system.get_irradiance,
345+
self.solar_position['apparent_zenith'],
346+
self.solar_position['azimuth'])
347+
348+
self.total_irrad = get_irradiance(
323349
self.irradiance['dni'],
324350
self.irradiance['ghi'],
325351
self.irradiance['dhi'],

pvlib/test/test_modelchain.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from pvlib import modelchain, pvsystem
55
from pvlib.modelchain import ModelChain
66
from pvlib.pvsystem import PVSystem
7+
from pvlib.tracking import SingleAxisTracker
78
from pvlib.location import Location
89

910
from pandas.util.testing import assert_series_equal, assert_frame_equal
@@ -100,6 +101,19 @@ def test_run_model_with_weather():
100101
assert_series_equal(ac, expected)
101102

102103

104+
def test_run_model_tracker():
105+
system, location = mc_setup()
106+
system = SingleAxisTracker(module_parameters=system.module_parameters,
107+
inverter_parameters=system.inverter_parameters)
108+
mc = ModelChain(system, location)
109+
times = pd.date_range('20160101 1200-0700', periods=2, freq='6H')
110+
ac = mc.run_model(times).ac
111+
112+
expected = pd.Series(np.array([ 121.421719, -2.00000000e-02]),
113+
index=times)
114+
assert_series_equal(ac, expected)
115+
116+
103117
@raises(ValueError)
104118
def test_bad_get_orientation():
105119
modelchain.get_orientation('bad value')

0 commit comments

Comments
 (0)