From d53f97e984bfdd268aa92f8bf482ced0edda0110 Mon Sep 17 00:00:00 2001 From: Echedey Luis <80125792+echedey-ls@users.noreply.github.com> Date: Fri, 24 May 2024 21:29:24 +0200 Subject: [PATCH] Shaded Fraction on Sloped Terrains - PR1725 partial continuation (#1962) * Update shading.py * Minimal test * Implementation From NREL paper * Fix, fix, fix, fix & format * Format issues * Extend tests (compare with singleaxis) & format with ruff * Format fixes * Upgrade tests * Array -> Axis * type * Whatsnew * xd * bruh * Minor Python optimization a la tracking.singleaxis * Comment and minor optimizations * Surface -> Axis Co-Authored-By: Kevin Anderson <57452607+kandersolar@users.noreply.github.com> * Elevation -> Zenith Co-Authored-By: Kevin Anderson <57452607+kandersolar@users.noreply.github.com> * Elev -> Zenith Co-Authored-By: Kevin Anderson <57452607+kandersolar@users.noreply.github.com> * Update shading.py * Update docstring Co-Authored-By: Anton Driesse <9001027+adriesse@users.noreply.github.com> * Add comments from `tracking.singleaxis` Co-Authored-By: Will Holmgren Co-Authored-By: Mark Mikofski * Singleaxis implementation port & test addition, based on old pvlib.tracking.singleaxis * Update v0.10.4.rst * Linter * Code review Co-Authored-By: Cliff Hansen <5393711+cwhanse@users.noreply.github.com> * Add Fig 5 [1] (still gotta check the built output) * Add caption, change size and describe in alternate text * rST fixes ? * Figures have captions, images do not https://pandemic-overview.readthedocs.io/en/latest/myGuides/reStructuredText-Images-and-Figures-Examples.html#id18 * Flip arguments order * I forgot :skull: * Linter are you happy now? * Remove port test and add edge cases test Co-Authored-By: Kevin Anderson <57452607+kandersolar@users.noreply.github.com> * Update test_shading.py Co-Authored-By: Kevin Anderson <57452607+kandersolar@users.noreply.github.com> * Indentation xd * Update test_shading.py * I forgot how to code * Align data * Docstring suggestion from Kevin Co-Authored-By: Kevin Anderson <57452607+kandersolar@users.noreply.github.com> * Update link to example? * add linear shade loss for thin films * add tests, update docs, what's new * fix what's new gh issue and pr links * fix trailing whitespace * responding to comments - move linear shade loss to shading module - don't use ternary, doesn't work on vectors, instead use np.where() - set cross axis default to zero - test vectors - update docs * update docstring for linear shade loss - applicable to other monolithic thin film like CIGS, not just CdTe - only when shade is perpendicular to scribe lines * update example in linear_shade_loss * add figure and formulas to shaded fraction * shaded fraction consistently * Add alternative text to image * Update implementation based on PSZ PR. See description. Commit highlights :sparkles: : * I think I made all the code a bit more legible; sorry for the big changes @mikofski * Tests a bit more complete (not much, still consider the same test data) * Rename shaded fraction acronym from `fs` to `sf` * Asserts changed to `assert_allclose` for a more legible output in case of failure Co-Authored-By: Mark Mikofski * Whatsnew entries Co-Authored-By: Mark Mikofski * Linter * Clear things, convert Mark's reference to a reference * Linter * Update according to changes at PSZA PR * Another commit, another try * Ahhh, I rebased too fast * whatsnews * Update v0.10.4.rst * Update v0.10.3.rst * Rename to `shaded_fraction1d`, change params to `surface_*` instead of `tracker_*` * Left this tracker refs behind * Change rename in rst entries * Add another testcase * Improve docs references, clarify nomenclature Co-Authored-By: Kevin Anderson <57452607+kandersolar@users.noreply.github.com> * Update test_shading.py * Remove linear_shade_loss * First implementation of the new shaded fraction model (missing figure) * Create Anderson_Jensen_2024_Fig3.png * Update shading.py * Update shading.py * Update shading.py * lintaaargggg * Fill reference * Next release 0.10.5? * Fix tests * Update test_shading.py * Little improvement to table definitions * Change `l` to `\ell` Co-Authored-By: Kevin Anderson <57452607+kandersolar@users.noreply.github.com> * `pvlib.tracking.projected_solar_zenith_angle` to `pvlib.shading.projected_solar_zenith_angle` Co-Authored-By: Kevin Anderson <57452607+kandersolar@users.noreply.github.com> * pitch references to `pitch` Co-Authored-By: Kevin Anderson <57452607+kandersolar@users.noreply.github.com> * `trackers_axis_azimuth` to `axis_azimuth` Co-Authored-By: Kevin Anderson <57452607+kandersolar@users.noreply.github.com> * whatsnews Co-Authored-By: Kevin Anderson <57452607+kandersolar@users.noreply.github.com> * Update v0.10.5.rst Co-Authored-By: Kevin Anderson <57452607+kandersolar@users.noreply.github.com> * Change `tilt`s to `rotation`s and add `axis_tilt` Co-Authored-By: Kevin Anderson <57452607+kandersolar@users.noreply.github.com> * Forgot to update tests :skull: Co-Authored-By: Kevin Anderson <57452607+kandersolar@users.noreply.github.com> * Add examples section * roles assumption messin w/ me docs :astonished: * roles assumption messin w/ me docs :astonished: Co-Authored-By: Kevin Anderson <57452607+kandersolar@users.noreply.github.com> * Update shading.py * Update shading.py * Add gallery example * This was fixed in recent sphinx-gallery releases IIRC * Extra empty line or admonition type unsupported * Fix example link (hopefully :pray: ) * Update shading.py * Fix subsubsections? * Nah, bulleted list didn't work * tilted -> tracker, only affects text * Typos and unreasonable physical values Co-Authored-By: Kevin Anderson <57452607+kandersolar@users.noreply.github.com> * See the Examples section below, not the unlinkable link Co-Authored-By: Kevin Anderson <57452607+kandersolar@users.noreply.github.com> * tracker -> row, param names, code and docs Co-Authored-By: Kevin Anderson <57452607+kandersolar@users.noreply.github.com> * Fix broken example :wrench: Co-Authored-By: Kevin Anderson <57452607+kandersolar@users.noreply.github.com> * Apply suggestions from code review Co-authored-by: Adam R. Jensen <39184289+AdamRJensen@users.noreply.github.com> * "the row axis/axes" instead of ``axis_azimuth`` * Unnecessary math mode Co-Authored-By: Adam R. Jensen <39184289+AdamRJensen@users.noreply.github.com> * Example suggestions and text trimming Co-Authored-By: Adam R. Jensen <39184289+AdamRJensen@users.noreply.github.com> * whatsmes * Add test to fix coverage issue * Apply suggestions from code review (Adam) Co-authored-by: Adam R. Jensen <39184289+AdamRJensen@users.noreply.github.com> * Update docs/examples/shading/plot_shaded_fraction1d_ns_hsat_example.py * Update docs/examples/shading/plot_shaded_fraction1d_ns_hsat_example.py --------- Co-authored-by: Kevin Anderson <57452607+kandersolar@users.noreply.github.com> Co-authored-by: Anton Driesse <9001027+adriesse@users.noreply.github.com> Co-authored-by: Will Holmgren Co-authored-by: Mark Mikofski Co-authored-by: Cliff Hansen <5393711+cwhanse@users.noreply.github.com> Co-authored-by: Adam R. Jensen <39184289+AdamRJensen@users.noreply.github.com> Co-authored-by: Kevin Anderson --- .../plot_shaded_fraction1d_ns_hsat_example.py | 181 +++++++++++++++ .../_images/Anderson_Jensen_2024_Fig3.png | Bin 0 -> 66997 bytes .../effects_on_pv_system_output/shading.rst | 2 + docs/sphinx/source/whatsnew/v0.11.0.rst | 7 +- pvlib/shading.py | 211 ++++++++++++++++++ pvlib/tests/test_shading.py | 106 ++++++++- 6 files changed, 505 insertions(+), 2 deletions(-) create mode 100644 docs/examples/shading/plot_shaded_fraction1d_ns_hsat_example.py create mode 100644 docs/sphinx/source/_images/Anderson_Jensen_2024_Fig3.png diff --git a/docs/examples/shading/plot_shaded_fraction1d_ns_hsat_example.py b/docs/examples/shading/plot_shaded_fraction1d_ns_hsat_example.py new file mode 100644 index 0000000000..7eae2ed7aa --- /dev/null +++ b/docs/examples/shading/plot_shaded_fraction1d_ns_hsat_example.py @@ -0,0 +1,181 @@ +""" +Shaded fraction of a horizontal single-axis tracker +==================================================== + +This example illustrates how to calculate the 1D shaded fraction of three rows +in a North-South horizontal single axis tracker (HSAT) configuration. +""" + +# %% +# :py:func:`pvlib.shading.shaded_fraction1d` exposes a useful method for the +# calculation of the shaded fraction of the width of a solar collector. Here, +# the width is defined as the dimension perpendicular to the axis of rotation. +# This method for calculating the shaded fraction only requires minor +# modifications to be applicable for fixed-tilt systems. +# +# It is highly recommended to read :py:func:`pvlib.shading.shaded_fraction1d` +# documentation to understand the input parameters and the method's +# capabilities. For more in-depth information, please see the journal paper +# `10.1063/5.0202220 `_ describing +# the methodology. +# +# Let's start by obtaining the true-tracking angles for each of the rows and +# limiting the angles to the range of -50 to 50 degrees. This decision is +# done to create an example scenario with significant shading. +# +# Key functions used in this example are: +# +# 1. :py:func:`pvlib.tracking.singleaxis` to calculate the tracking angles. +# 2. :py:func:`pvlib.shading.projected_solar_zenith_angle` to calculate the +# projected solar zenith angle. +# 3. :py:func:`pvlib.shading.shaded_fraction1d` to calculate the shaded +# fractions. +# +# .. sectionauthor:: Echedey Luis + +import pvlib + +import numpy as np +import pandas as pd +import matplotlib.pyplot as plt +from matplotlib.dates import DateFormatter + +# Define the solar system parameters +latitude, longitude = 28.51, -13.89 +altitude = pvlib.location.lookup_altitude(latitude, longitude) + +axis_tilt = 3 # degrees, positive is upwards in the axis_azimuth direction +axis_azimuth = 180 # degrees, N-S tracking axis +collector_width = 3.2 # m +pitch = 4.15 # m +gcr = collector_width / pitch +cross_axis_slope = -5 # degrees +surface_to_axis_offset = 0.07 # m + +# Generate a time range for the simulation +times = pd.date_range( + start="2024-01-01T05", + end="2024-01-01T21", + freq="5min", + tz="Atlantic/Canary", +) + +# Calculate the solar position +solar_position = pvlib.solarposition.get_solarposition( + times, latitude, longitude, altitude +) +solar_azimuth = solar_position["azimuth"] +solar_zenith = solar_position["apparent_zenith"] + +# Calculate the tracking angles +rotation_angle = pvlib.tracking.singleaxis( + solar_zenith, + solar_azimuth, + axis_tilt, + axis_azimuth, + max_angle=(-50, 50), # (min, max) degrees + backtrack=False, + gcr=gcr, + cross_axis_tilt=cross_axis_slope, +)["tracker_theta"] + +# %% +# Once the tracker angles have been obtained, the next step is to calculate +# the shaded fraction. Special care must be taken +# to ensure that the shaded or shading tracker roles are correctly assigned +# depending on the solar position. +# This means we will have a result for each row, ``eastmost_shaded_fraction``, +# ``middle_shaded_fraction``, and ``westmost_shaded_fraction``. +# Switching the parameters will be based on the +# sign of :py:func:`pvlib.shading.projected_solar_zenith_angle`. +# +# The following code is verbose to make it easier to understand the process, +# but with some effort you may be able to simplify it. This verbosity also +# allows to change the premises easily per case, e.g., in case of a tracker +# failure or with a different system configuration. + +psza = pvlib.shading.projected_solar_zenith_angle( + solar_zenith, solar_azimuth, axis_tilt, axis_azimuth +) + +# Calculate the shaded fraction for the eastmost row +eastmost_shaded_fraction = np.where( + psza < 0, + 0, # no shaded fraction in the morning + # shaded fraction in the evening + pvlib.shading.shaded_fraction1d( + solar_zenith, + solar_azimuth, + axis_azimuth, + shaded_row_rotation=rotation_angle, + axis_tilt=axis_tilt, + collector_width=collector_width, + pitch=pitch, + surface_to_axis_offset=surface_to_axis_offset, + cross_axis_slope=cross_axis_slope, + shading_row_rotation=rotation_angle, + ), +) + +# Calculate the shaded fraction for the middle row +middle_shaded_fraction = np.where( + psza < 0, + # shaded fraction in the morning + pvlib.shading.shaded_fraction1d( + solar_zenith, + solar_azimuth, + axis_azimuth, + shaded_row_rotation=rotation_angle, + axis_tilt=axis_tilt, + collector_width=collector_width, + pitch=pitch, + surface_to_axis_offset=surface_to_axis_offset, + cross_axis_slope=cross_axis_slope, + shading_row_rotation=rotation_angle, + ), + # shaded fraction in the evening + pvlib.shading.shaded_fraction1d( + solar_zenith, + solar_azimuth, + axis_azimuth, + shaded_row_rotation=rotation_angle, + axis_tilt=axis_tilt, + collector_width=collector_width, + pitch=pitch, + surface_to_axis_offset=surface_to_axis_offset, + cross_axis_slope=cross_axis_slope, + shading_row_rotation=rotation_angle, + ), +) + +# Calculate the shaded fraction for the westmost row +westmost_shaded_fraction = np.where( + psza < 0, + # shaded fraction in the morning + pvlib.shading.shaded_fraction1d( + solar_zenith, + solar_azimuth, + axis_azimuth, + shaded_row_rotation=rotation_angle, + axis_tilt=axis_tilt, + collector_width=collector_width, + pitch=pitch, + surface_to_axis_offset=surface_to_axis_offset, + cross_axis_slope=cross_axis_slope, + shading_row_rotation=rotation_angle, + ), + 0, # no shaded fraction in the evening +) + +# %% +# Plot the shaded fraction result for each row: +plt.plot(times, eastmost_shaded_fraction, label="East-most", color="blue") +plt.plot(times, middle_shaded_fraction, label="Middle", color="green", + linewidth=3, linestyle="--") # fmt: skip +plt.plot(times, westmost_shaded_fraction, label="West-most", color="red") +plt.title(r"$shaded\_fraction1d$ of each row vs time") +plt.xlabel("Time") +plt.gca().xaxis.set_major_formatter(DateFormatter("%H:%M")) +plt.ylabel("Shaded Fraction") +plt.legend() +plt.show() diff --git a/docs/sphinx/source/_images/Anderson_Jensen_2024_Fig3.png b/docs/sphinx/source/_images/Anderson_Jensen_2024_Fig3.png new file mode 100644 index 0000000000000000000000000000000000000000..d239d9d4f414d9d28a685fa5fee49a7a20db0dd8 GIT binary patch literal 66997 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
?UiY}iqx0umx50i=wL!OVwKSA+#tGearmbdUhJ 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 shaded_fraction1d(solar_zenith=80, solar_azimuth=104.5, + ... axis_azimuth=90, shaded_row_rotation=30, shading_row_rotation=30, + ... collector_width=2, pitch=3, axis_tilt=0, + ... surface_to_axis_offset=0.05, cross_axis_slope=0) + 0.6827437712114521 + + **Fixed-tilt north-facing array on sloped terrain** + + Tilted row with a pitch of 4 m, a collector width of + 2.5 m, and row rotations of 50° for the shaded + row and 30° for the shading row. The rows are on a + 10° slope, where their axis is on the most inclined + direction (zero cross-axis slope). Shaded in the morning. + + >>> shaded_fraction1d(solar_zenith=65, solar_azimuth=75.5, + ... axis_azimuth=270, shaded_row_rotation=50, shading_row_rotation=30, + ... collector_width=2.5, pitch=4, axis_tilt=10, + ... surface_to_axis_offset=0.05, cross_axis_slope=0) + 0.6975923460352351 + + **N-S single-axis tracker on sloped terrain** + + Horizontal trackers with a pitch of 3 m, a collector width of + 1.4 m, and tracker rotations of 30° pointing east, + in the morning. Terrain slope is 7° west-east (east-most + tracker is higher than the west-most tracker). + + >>> shaded_fraction1d(solar_zenith=50, solar_azimuth=90, axis_azimuth=180, + ... shaded_row_rotation=-30, collector_width=1.4, pitch=3, axis_tilt=0, + ... surface_to_axis_offset=0.10, cross_axis_slope=7) + 0.5828961460616938 + + Note the previous example only is valid for the shaded fraction of the + west-most tracker in the morning, and assuming it is the + shaded tracker during all the day is incorrect. + During the afternoon, it is the one casting the shadow onto the + east-most tracker. + + To calculate the shaded fraction for the east-most + tracker, you must input the corresponding ``shaded_row_rotation`` + in the afternoon. + + >>> shaded_fraction1d(solar_zenith=50, solar_azimuth=270, axis_azimuth=180, + ... shaded_row_rotation=30, collector_width=1.4, pitch=3, axis_tilt=0, + ... surface_to_axis_offset=0.10, cross_axis_slope=7) + 0.4399034444363955 + + You must switch the input/output depending on the + sign of the projected solar zenith angle. See + :py:func:`~pvlib.shading.projected_solar_zenith_angle` and the example + :ref:`sphx_glr_gallery_shading_plot_shaded_fraction1d_ns_hsat_example.py` + + See also + -------- + pvlib.shading.projected_solar_zenith_angle + + References + ---------- + .. [1] Kevin S. Anderson, Adam R. Jensen; Shaded fraction and backtracking + in single-axis trackers on rolling terrain. J. Renewable Sustainable + Energy 1 March 2024; 16 (2): 023504. :doi:`10.1063/5.0202220` + """ + # For nomenclature you may refer to [1]. + + # rotation of row casting the shadow defaults to shaded row's one + if shading_row_rotation is None: + shading_row_rotation = shaded_row_rotation + + # projected solar zenith angle + projected_solar_zenith = projected_solar_zenith_angle( + solar_zenith, + solar_azimuth, + axis_tilt, + axis_azimuth, + ) + + # calculate repeated elements + thetas_1_S_diff = shading_row_rotation - projected_solar_zenith + thetas_2_S_diff = shaded_row_rotation - projected_solar_zenith + thetaS_rotation_diff = projected_solar_zenith - cross_axis_slope + + cos_theta_2_S_diff_abs = np.abs(cosd(thetas_2_S_diff)) + + # Eq. (12) of [1] + t_asterisk = ( + 0.5 + + np.abs(cosd(thetas_1_S_diff)) / cos_theta_2_S_diff_abs / 2 + + ( + np.sign(projected_solar_zenith) + * surface_to_axis_offset + / collector_width + / cos_theta_2_S_diff_abs + * (sind(thetas_2_S_diff) - sind(thetas_1_S_diff)) + ) + - ( + pitch + / collector_width + * cosd(thetaS_rotation_diff) + / cos_theta_2_S_diff_abs + / cosd(cross_axis_slope) + ) + ) + + return np.clip(t_asterisk, 0, 1) diff --git a/pvlib/tests/test_shading.py b/pvlib/tests/test_shading.py index 2f1e5b3410..b8bf8929ae 100644 --- a/pvlib/tests/test_shading.py +++ b/pvlib/tests/test_shading.py @@ -2,11 +2,12 @@ import pandas as pd from pandas.testing import assert_series_equal -from numpy.testing import assert_allclose +from numpy.testing import assert_allclose, assert_approx_equal import pytest from datetime import timezone, timedelta from pvlib import shading +from pvlib.tools import atand @pytest.fixture @@ -223,3 +224,106 @@ def test_projected_solar_zenith_angle_datatypes( ) psz = psz_func(sun_apparent_zenith, axis_azimuth, axis_tilt, axis_azimuth) assert isinstance(psz, cast_type) + + +@pytest.fixture +def sf1d_premises_and_expected(): + """Data comprised of solar position, rows parameters and terrain slope + with respective shade fractions (sf). Returns a 2-tuple with the premises + to be used directly in shaded_fraction1d(...) in the first element and + the expected shaded fractions in the second element. + See [1] in shaded_fraction1d() + Test data sourced from http://doi.org/10.5281/zenodo.10513987 + """ + test_data = pd.DataFrame( + columns=["x_L", "z_L", "theta_L", "x_R", "z_R", "theta_R", "z_0", "l", + "theta_s", "f_s"], + data=( + (1, 0.2, 50, 0, 0, 25, 0, 0.5, 80, 1), + (1, 0.1, 50, 0, 0, 25, 0.05, 0.5, 80, 0.937191), + (1, 0, 50, 0, 0.1, 25, 0, 0.5, 80, 0.30605), + (1, 0, 50, 0, 0.2, 25, 0, 0.5, 80, 0), + (1, 0.2, -25, 0, 0, -50, 0, 0.5, -80, 0), + (1, 0.1, -25, 0, 0, -50, 0, 0.5, -80, 0.30605), + (1, 0, -25, 0, 0.1, -50, 0.1, 0.5, -80, 0.881549), + (1, 0, -25, 0, 0.2, -50, 0, 0.5, -80, 1), + (1, 0.2, 5, 0, 0, 25, 0.05, 0.5, 80, 0.832499), + (1, 0.2, -25, 0, 0, 25, 0.05, 0.5, 80, 0.832499), + (1, 0.2, 5, 0, 0, -45, 0.05, 0.5, 80, 0.832499), + (1, 0.2, -25, 0, 0, -45, 0.05, 0.5, 80, 0.832499), + (1, 0, -25, 0, 0.2, 25, 0.05, 0.5, -80, 0.832499), + (1, 0, -25, 0, 0.2, -5, 0.05, 0.5, -80, 0.832499), + (1, 0, 45, 0, 0.2, 25, 0.05, 0.5, -80, 0.832499), + (1, 0, 45, 0, 0.2, -5, 0.05, 0.5, -80, 0.832499), + ), + ) # fmt: skip + + test_data["cross_axis_slope"] = atand( + (test_data["z_R"] - test_data["z_L"]) + / (test_data["x_L"] - test_data["x_R"]) + ) + test_data["pitch"] = test_data["x_L"] - test_data["x_R"] + # switch Left/Right rows if needed to make the right one the shaded + where_switch = test_data["theta_s"] >= 0 + test_data["theta_L"], test_data["theta_R"] = np.where( + where_switch, + (test_data["theta_L"], test_data["theta_R"]), + (test_data["theta_R"], test_data["theta_L"]), + ) + test_data.rename( + columns={ + "theta_L": "shading_row_rotation", + "theta_R": "shaded_row_rotation", + "z_0": "surface_to_axis_offset", + "l": "collector_width", + "theta_s": "solar_zenith", # for the projected solar zenith angle + "f_s": "shaded_fraction", + }, + inplace=True, + ) + test_data.drop(columns=["x_L", "z_L", "x_R", "z_R"], inplace=True) + # for the projected solar zenith angle + # this returns the same psz angle as test_data["solar_zenith"] + test_data["solar_azimuth"], test_data["axis_azimuth"] = 180, 90 + + # return 1st: premises dataframe first and 2nd: shaded fraction series + return ( + test_data.drop(columns=["shaded_fraction"]), + test_data["shaded_fraction"], + ) + + +def test_shaded_fraction1d(sf1d_premises_and_expected): + """Tests shaded_fraction1d""" + # unwrap sf_premises_and_expected values premises and expected results + premises, expected_sf_array = sf1d_premises_and_expected + # test scalar input + expected_result = expected_sf_array.iloc[0] + sf = shading.shaded_fraction1d(**premises.iloc[0]) + assert_approx_equal(sf, expected_result) + assert isinstance(sf, float) + + # test Series inputs + sf_vec = shading.shaded_fraction1d(**premises) + assert_allclose(sf_vec, expected_sf_array, atol=1e-6) + assert isinstance(sf_vec, pd.Series) + + +def test_shaded_fraction1d_unprovided_shading_row_rotation(): + """Tests shaded_fraction1d without providing shading_row_rotation""" + test_data = pd.DataFrame( + columns=[ + "shaded_row_rotation", "surface_to_axis_offset", "collector_width", + "solar_zenith", "cross_axis_slope", "pitch", "solar_azimuth", + "axis_azimuth", "expected_sf", + ], + data=[ + (30, 0, 5.7735, 60, 0, 5, 90, 180, 0), + (30, 0, 5.7735, 79, 0, 5, 90, 180, 0.5), + (30, 0, 5.7735, 90, 0, 5, 90, 180, 1), + ], + ) # fmt: skip + expected_sf = test_data["expected_sf"] + premises = test_data.drop(columns=["expected_sf"]) + sf = shading.shaded_fraction1d(**premises) + assert_allclose(sf, expected_sf, atol=1e-2)