diff --git a/docs/sphinx/source/whatsnew/v0.16.2.rst b/docs/sphinx/source/whatsnew/v0.16.2.rst index f704525a12..1466710b5f 100644 --- a/docs/sphinx/source/whatsnew/v0.16.2.rst +++ b/docs/sphinx/source/whatsnew/v0.16.2.rst @@ -14,7 +14,8 @@ Deprecations Bug fixes ~~~~~~~~~ - +* :py:func:`pvlib.tracking.calc_surface_orientation` returns scalar when input + is scalar (:issue:`2881`, :pull:`2882`) Enhancements ~~~~~~~~~~~~ @@ -42,4 +43,4 @@ Maintenance Contributors ~~~~~~~~~~~~ - +* Cliff Hansen (:ghuser:`cwhanse`) diff --git a/pvlib/tracking.py b/pvlib/tracking.py index e234887cd0..a591c9da36 100644 --- a/pvlib/tracking.py +++ b/pvlib/tracking.py @@ -299,6 +299,11 @@ def calc_surface_orientation(tracker_theta, axis_tilt=0, axis_azimuth=0): surface_azimuth = np.degrees( np.arctan2(unit_normal[..., 0], unit_normal[..., 1])) + # above always returns a np.array + # return scalar if `tracker_theta` is a scalar + if np.isscalar(tracker_theta): + surface_azimuth = surface_azimuth.item() + surface_azimuth = np.where(surface_tilt == 0., axis_azimuth - 90., surface_azimuth) # constrain angles to [0, 360) diff --git a/tests/test_tracking.py b/tests/test_tracking.py index 903cf11d1d..5e9b09f25f 100644 --- a/tests/test_tracking.py +++ b/tests/test_tracking.py @@ -511,6 +511,9 @@ def test_calc_surface_orientation_types(): out = tracking.calc_surface_orientation(rotation) assert out['surface_tilt'] == pytest.approx(expected_tilt) assert out['surface_azimuth'] == pytest.approx(expected_azimuth) + # confirm scalar output when input is scalar + assert np.isscalar(out['surface_tilt']) + assert np.isscalar(out['surface_azimuth']) def test_calc_surface_orientation_kwargs():