diff --git a/pvlib/tests/test_tracking.py b/pvlib/tests/test_tracking.py index 9a589e403a..7f1a4da700 100644 --- a/pvlib/tests/test_tracking.py +++ b/pvlib/tests/test_tracking.py @@ -502,3 +502,18 @@ def test_slope_aware_backtracking(): np.testing.assert_allclose( truetracking['tracker_theta'], expected_data['TrueTracking'], rtol=1e-3, atol=1e-3) + + +def test_singleaxis_aoi_gh1221(): + # vertical tracker + loc = pvlib.location.Location(40.1134, -88.3695) + dr = pd.date_range( + start='02-Jun-1998 00:00:00', end='02-Jun-1998 23:55:00', freq='5T', + tz='Etc/GMT+6') + sp = loc.get_solarposition(dr) + tr = pvlib.tracking.singleaxis( + sp['apparent_zenith'], sp['azimuth'], axis_tilt=90, axis_azimuth=180, + max_angle=0.01, backtrack=False) + fixed = pvlib.irradiance.aoi(90, 180, sp['apparent_zenith'], sp['azimuth']) + fixed[fixed>90] = np.nan + assert np.allclose(tr['aoi'], fixed, equal_nan=True) diff --git a/pvlib/tracking.py b/pvlib/tracking.py index 032b35d44a..732108dec2 100644 --- a/pvlib/tracking.py +++ b/pvlib/tracking.py @@ -458,7 +458,9 @@ def singleaxis(apparent_zenith, apparent_azimuth, sun_vec = np.array([xp, yp, zp]) # calculate angle-of-incidence on panel - aoi = np.degrees(np.arccos(np.abs(np.sum(sun_vec*panel_norm, axis=0)))) + # TODO: use irradiance.aoi + projection = np.clip(np.sum(sun_vec*panel_norm, axis=0), -1, 1) + aoi = np.degrees(np.arccos(projection)) # Calculate panel tilt and azimuth in a coordinate system where the panel # tilt is the angle from horizontal, and the panel azimuth is the compass