From 9c686050522b06744272b8eefaae0c071ab32b6f Mon Sep 17 00:00:00 2001 From: echedey-ls <80125792+echedey-ls@users.noreply.github.com> Date: Fri, 26 Apr 2024 11:11:52 +0200 Subject: [PATCH 01/82] Preliminar implementation, tests, docs and gallery example I expect to extend the gallery example for a day's RMAD profiling. --- .../plot_irradiance_nonuniformity_loss.py | 120 ++++++++++++++++++ .../loss-models.rst | 1 + pvlib/pvsystem.py | 47 +++++++ pvlib/tests/test_pvsystem.py | 12 ++ 4 files changed, 180 insertions(+) create mode 100644 docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py diff --git a/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py b/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py new file mode 100644 index 0000000000..33243fbcf0 --- /dev/null +++ b/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py @@ -0,0 +1,120 @@ +""" +Plot Irradiance Non-uniformity Loss +=================================== + +Calculate the incident irradiance lost to non-uniformity in a bifacial PV array +""" + +# %% +# The incident irradiance on the backside of a bifacial PV module is +# not uniform due to neighboring rows, the ground albedo and site conditions. +# Cells with different irradiance levels produce less power that the sum of +# the power produced by each cell individually. This is known as irradiance +# non-uniformity loss. +# +# This example demonstrates how to model the irradiance non-uniformity loss +# due to different global irradiance levels on a bifacial PV module. +# +# The function :py:func:`pvlib.pvsystem.nonuniform_irradiance_loss` will be +# used to transform the Relative Mean Absolute Deviation (RMAD) of the +# irradiance into a power loss percentage. +# +# References +# ---------- +# .. [1] Ayala Pelaez, S., Deline, C., MacAlpine, S., & Olalla, C. (2019). +# Bifacial PV System Mismatch Loss Estimation. +# https://www.nrel.gov/docs/fy19osti/74831.pdf +# +# .. sectionauthor:: Echedey Luis + +import numpy as np +import matplotlib.pyplot as plt +from matplotlib.cm import ScalarMappable +from matplotlib.colors import Normalize + +from pvlib.pvsystem import nonuniform_irradiance_loss + + +# Define the Relative Mean Absolute Deviation (RMAD) function, (Eq. 4) in [1]_. +# https://stackoverflow.com/a/19472336/19371110 +def rmad(data, axis=None): + mad = np.mean(np.absolute(data - np.mean(data, axis)), axis) + return mad / np.mean(data, axis) + + +# %% +# Theoretical and straightforward problem +# ======================================= +# Let's set a fixed irradiance to each cell row of the PV array with the values +# described in Figure 1 (a), [1]_. We will cover this case for educational +# purposes. +# Here we set and plot the global irradiance levels of each cell. + +x = np.arange(6, 0, -1) +y = np.arange(6, 0, -1) +cells_irrad = np.repeat([1059, 976, 967, 986, 1034, 1128], 6).reshape(6, 6) + +color_map = "gray" +color_norm = Normalize(930, 1150) + +fig, ax = plt.subplots() +fig.suptitle("Global Irradiance Levels of Each Cell") +fig.colorbar( + ScalarMappable(cmap=color_map, norm=color_norm), + ax=ax, + orientation="vertical", + label="$[W/m^2]$", +) +ax.set_aspect("equal") +ax.pcolormesh( + x, + y, + cells_irrad, + shading="nearest", + edgecolors="black", + cmap=color_map, + norm=color_norm, +) + +# %% +# Relative Mean Absolute Deviation +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +# Calculate the Relative Mean Absolute Deviation (RMAD) of the cells' +# irradiance with the help of the function defined on the top of this example. + +rmad_cells = rmad(cells_irrad) + +# this is the same as a column's RMAD! +assert rmad_cells == rmad(cells_irrad[:, 0]) + +# %% +# Mismatch Loss +# ^^^^^^^^^^^^^ +# Calculate the power loss percentage due to the irradiance non-uniformity +# with the function :py:func:`pvlib.pvsystem.nonuniform_irradiance_loss`. + +mismatch_loss = nonuniform_irradiance_loss(rmad_cells) + +# %% +# Total power incident on the module cells +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +# It is the sum of the irradiance of each cell + +total_irrad = np.sum(cells_irrad) + +# %% +# Mismatch-corrected irradiance +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +# The power incident on the module cells is multiplied by the mismatch loss +# as follows: + +mismatch_corrected_irrad = total_irrad * (1 - mismatch_loss) + +# %% +# Results +# ^^^^^^^ + +print(f"Total power incident on the module cells: {total_irrad}") +print(f"RMAD of the cells' irradiance: {rmad_cells}") +print(f"Power loss % due to the irradiance non-uniformity: {mismatch_loss}") +print(f"Effective power after mismatch correction: {mismatch_corrected_irrad}") diff --git a/docs/sphinx/source/reference/effects_on_pv_system_output/loss-models.rst b/docs/sphinx/source/reference/effects_on_pv_system_output/loss-models.rst index 6897f12283..235a4db7f9 100644 --- a/docs/sphinx/source/reference/effects_on_pv_system_output/loss-models.rst +++ b/docs/sphinx/source/reference/effects_on_pv_system_output/loss-models.rst @@ -8,3 +8,4 @@ Loss models pvsystem.combine_loss_factors pvsystem.dc_ohms_from_percent + pvsystem.nonuniform_irradiance_loss diff --git a/pvlib/pvsystem.py b/pvlib/pvsystem.py index 7b2f662b13..d6c39f2882 100644 --- a/pvlib/pvsystem.py +++ b/pvlib/pvsystem.py @@ -3021,3 +3021,50 @@ def combine_loss_factors(index, *losses, fill_method='ffill'): combined_factor *= (1 - loss) return 1 - combined_factor + + +def nonuniform_irradiance_loss(rmad): + """ + Calculate the incident irradiance loss due to irradiance non-uniformity. + + This model is described for bifacial modules in [1]_, where the backside + irradiance is less uniform due to mounting and site conditions. + + .. versionadded:: 0.10.5 + + Parameters + ---------- + rmad : numeric + The Relative Mean Absolute Difference of the irradiance. + See the definition in [2]_ and the example :ref:`sphx_glr_gallery_TODO`. + + Returns + ------- + loss : numeric + The irradiance loss. + + Notes + ----- + TODO + + Examples + -------- + >>> from pvlib import pvsystem + >>> pvsystem.nonuniform_irradiance_loss(0.05) + 0.025 + + See Also + -------- + TODO + + References + ---------- + .. [1] Ayala Pelaez, S., Deline, C., MacAlpine, S., & Olalla, C. (2019). + Bifacial PV System Mismatch Loss Estimation. + https://www.nrel.gov/docs/fy19osti/74831.pdf + .. [2] “Mean absolute difference,” Wikipedia, Sep. 05, 2023. + https://en.wikipedia.org/wiki/Mean_absolute_difference#Relative_mean_absolute_difference + (accessed 2024-04-14). + """ # noqa: E501 + # Eq. (7) of [1] + return rmad * (0.12 + 2.77 * rmad) diff --git a/pvlib/tests/test_pvsystem.py b/pvlib/tests/test_pvsystem.py index 52de0fcc5b..46d546f15f 100644 --- a/pvlib/tests/test_pvsystem.py +++ b/pvlib/tests/test_pvsystem.py @@ -2548,3 +2548,15 @@ def test_Array_temperature_missing_parameters(model, keys): array.temperature_model_parameters = params with pytest.raises(KeyError, match=match): array.get_cell_temperature(irrads, temps, winds, model) + + +def test_nonuniform_irradiance_loss(): + """tests pvsystem.nonuniform_irradiance_loss""" + premise_rmads = np.array([0.0, 0.05, 0.1, 0.15, 0.2, 0.25]) + expected_mms = np.array([0, 0.012925, 0.0397, 0.080325, 0.1348, 0.203125]) + result_mms = pvsystem.nonuniform_irradiance_loss(premise_rmads) + assert_allclose(result_mms, expected_mms, atol=1e-5) + + # test datatypes Series IO + result_mms = pvsystem.nonuniform_irradiance_loss(pd.Series(premise_rmads)) + assert isinstance(result_mms, pd.Series) From 23320dbef2f2c11691364f8aa6877cb147f12fa0 Mon Sep 17 00:00:00 2001 From: echedey-ls <80125792+echedey-ls@users.noreply.github.com> Date: Fri, 10 May 2024 12:08:43 +0200 Subject: [PATCH 02/82] Update versionadded --- pvlib/pvsystem.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pvlib/pvsystem.py b/pvlib/pvsystem.py index 2def6a6219..15433c4d3b 100644 --- a/pvlib/pvsystem.py +++ b/pvlib/pvsystem.py @@ -3039,7 +3039,7 @@ def nonuniform_irradiance_loss(rmad): This model is described for bifacial modules in [1]_, where the backside irradiance is less uniform due to mounting and site conditions. - .. versionadded:: 0.10.5 + .. versionadded:: 0.11.0 Parameters ---------- From 47fa80daf614e6173b7e082ba147f1729cc39840 Mon Sep 17 00:00:00 2001 From: echedey-ls <80125792+echedey-ls@users.noreply.github.com> Date: Fri, 10 May 2024 18:54:45 +0200 Subject: [PATCH 03/82] Add example --- .../plot_irradiance_nonuniformity_loss.py | 134 +++++++++++++++++- .../_images/Dominguez_et_al_PVSC2023.png | Bin 0 -> 155401 bytes pvlib/pvsystem.py | 3 +- 3 files changed, 129 insertions(+), 8 deletions(-) create mode 100644 docs/sphinx/source/_images/Dominguez_et_al_PVSC2023.png diff --git a/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py b/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py index 33243fbcf0..836abe7d82 100644 --- a/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py +++ b/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py @@ -13,21 +13,40 @@ # non-uniformity loss. # # This example demonstrates how to model the irradiance non-uniformity loss -# due to different global irradiance levels on a bifacial PV module. +# due to different global irradiance levels on a bifacial PV module through +# two different approaches: +# +# - Given the irradiance levels of each cell in an instant, +# in :ref:`theoretical_approach`. +# - Modelling the irradiance non-uniformity RMAD through the day thanks to a +# mock-up horizontal axis tracker system, in :ref:`practical_approach`. +# See [2]_ and [3]_ for more information. # # The function :py:func:`pvlib.pvsystem.nonuniform_irradiance_loss` will be # used to transform the Relative Mean Absolute Deviation (RMAD) of the -# irradiance into a power loss percentage. +# irradiance into a power loss percentage. Down below you will find a +# numpy-based implementation of the RMAD function. # # References # ---------- -# .. [1] Ayala Pelaez, S., Deline, C., MacAlpine, S., & Olalla, C. (2019). -# Bifacial PV System Mismatch Loss Estimation. -# https://www.nrel.gov/docs/fy19osti/74831.pdf +# .. [1] Deline, C., Pelaez, S.A., MacAlpine, S.M., & Olalla, C. (2019). +# Bifacial PV System Mismatch Loss Estimation and Parameterization: +# Preprint. https://www.nrel.gov/docs/fy19osti/74831.pdf +# .. [2] C. Domínguez, J. Marcos, S. Ures, S. Askins, and I. Antón, 'A +# Horizontal Single-Axis Tracker Mock-Up to Quickly Assess the Influence +# of Geometrical Factors on Bifacial Energy Gain', in 2023 IEEE 50th +# Photovoltaic Specialists Conference (PVSC), Jun. 2023, pp. 1–3. +# :doi:`10.1109/PVSC48320.2023.10359580`. +# .. [3] C. Domínguez, J. Marcos, S. Ures, S. Askins, I. Antón, A Horizontal +# Single-Axis Tracker Mock-Up to Quickly Assess the Influence of Geometrical +# Factors on Bifacial Energy Gain. Zenodo, 2023. +# :doi:`10.5281/zenodo.11125039`. # # .. sectionauthor:: Echedey Luis import numpy as np +import pandas as pd +import scipy.stats import matplotlib.pyplot as plt from matplotlib.cm import ScalarMappable from matplotlib.colors import Normalize @@ -36,15 +55,20 @@ # Define the Relative Mean Absolute Deviation (RMAD) function, (Eq. 4) in [1]_. -# https://stackoverflow.com/a/19472336/19371110 def rmad(data, axis=None): + """ + Relative Mean Absolute Deviation + https://stackoverflow.com/a/19472336/19371110 + """ mad = np.mean(np.absolute(data - np.mean(data, axis)), axis) return mad / np.mean(data, axis) # %% +# .. _theoretical_approach:: +# # Theoretical and straightforward problem -# ======================================= +# --------------------------------------- # Let's set a fixed irradiance to each cell row of the PV array with the values # described in Figure 1 (a), [1]_. We will cover this case for educational # purposes. @@ -118,3 +142,99 @@ def rmad(data, axis=None): print(f"RMAD of the cells' irradiance: {rmad_cells}") print(f"Power loss % due to the irradiance non-uniformity: {mismatch_loss}") print(f"Effective power after mismatch correction: {mismatch_corrected_irrad}") + +# %% +# .. _practical_approach:: +# +# A practical approach +# -------------------- +# In practice, simulating each cell irradiance is computationally expensive, +# and measuring each of the cells irradiance of a real system can also be +# challenging. Nevertheless, a mock-up system can be used to estimate the +# non-uniformity through the day. +# +# Here we will base our calculations on the work of Domínguez et al. [2]_. +# The following image shows the backside irradiance non-uniformity of a +# HSAT mock-up system: +# +# .. figure:: ../../_images/Dominguez_et_al_PVSC2023.png +# :alt: Plot of backside reference cells of an HSAT mock-up and their RMAD. +# :align: center +# +# Blue dots represent the backside irradiance non-uniformity. +# *BE* stands for *backside east*. + + +def hsat_backside_rmad_model_through_day(hour): + """Model of the blue dots in the image above.""" + # For demonstration purposes only. Model roughly fit to show an example of + # the RMAD variation through the day without including all the data. + # fmt: off + morning_polynom = [6.71787833e-02, -4.50442998e+00, 1.18114757e+02, + -1.51725679e+03, 9.56439547e+03, -2.36835920e+04] + afternoon_polynom = [7.14947943e-01, -6.02541075e+01, 2.02789031e+03, + -3.40677727e+04, 2.85671091e+05, -9.56469320e+05] + # fmt: on + day_rmad = np.where( + hour < 14.75, + np.polyval(morning_polynom, hour), + np.polyval(afternoon_polynom, hour), + ) + return day_rmad / 100 # RMAD is a percentage + + +# %% +# .. note:: +# The global irradiance RMAD is different from the backside irradiance RMAD. +# +# The global irradiance is the sum of the front irradiance and the backside +# irradiance by the bifaciality factor, see equation (2) in [1]_. +# Here we will model front and backside irradiances with normal distributions +# for simplicity, then calculate the global RMAD and plot the results. +# +# The backside irradiance is the one that presents the most significant +# non-uniformity. The front irradiance is way more uniform, so it will be +# neglected in this example. +# +# Let's calculate the **global RMAD** through the day - it's **different** from +# the backside RMAD since :math:`RMAD(k \cdot X + c) = k \cdot RMAD(X) \cdot +# \frac{\bar{X}}{\bar{X} + c}`, where :math:`X` is a random variable and +# :math:`k>0` and :math:`c \neq \bar{X}` are constants (:ref:`source +# `). + +times = pd.date_range("2023-06-06T09:30", "2023-06-06T18:30", freq="30min") +hours = times.hour + times.minute / 60 +bifaciality = 0.65 +front_irrad = scipy.stats.norm.pdf(hours, loc=12.5, scale=1600) +backside_irrad = scipy.stats.norm.pdf(hours, loc=12.5, scale=180) + +global_irrad = front_irrad + bifaciality * backside_irrad +# See RMAD properties above +# Here we calculate RMAD(global_irrad) +backside_rmad = hsat_backside_rmad_model_through_day(hours) +global_rmad = bifaciality * backside_rmad / (1 + front_irrad / backside_irrad) + +# Get the mismatch loss +mismatch_loss = nonuniform_irradiance_loss(global_rmad) + +# Plot results +fig, ax1 = plt.subplots() +fig.suptitle("Irradiance RMAD and Mismatch Losses") + +ax1.plot(hours, global_rmad, label="RMAD: global", color="k") +ax1.plot( + hours, backside_rmad, label="RMAD: backside", color="b", linestyle="--" +) +ax1.set_xlabel("Hour of the day") +ax1.set_ylabel("RMAD") +ax1.legend(loc="upper left") + +ax2 = ax1.twinx() +ax2.plot( + hours, mismatch_loss, label="Mismatch loss", color="red", linestyle=":" +) +ax2.grid() +ax2.legend(loc="upper right") +ax2.set_ylabel("Mismatch loss") + +fig.show() diff --git a/docs/sphinx/source/_images/Dominguez_et_al_PVSC2023.png b/docs/sphinx/source/_images/Dominguez_et_al_PVSC2023.png new file mode 100644 index 0000000000000000000000000000000000000000..c826bd008f174a8d1318f2643a9b87017cf4f2ee GIT binary patch literal 155401 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

vBeoTsH1HZzonO?wpY%FB?4` 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 F{{b(;)Gz=5 literal 0 HcmV?d00001 diff --git a/pvlib/pvsystem.py b/pvlib/pvsystem.py index 15433c4d3b..297fce0d8b 100644 --- a/pvlib/pvsystem.py +++ b/pvlib/pvsystem.py @@ -3045,7 +3045,8 @@ def nonuniform_irradiance_loss(rmad): ---------- rmad : numeric The Relative Mean Absolute Difference of the irradiance. - See the definition in [2]_ and the example :ref:`sphx_glr_gallery_TODO`. + See the definition in [2]_ and the example + :ref:`sphx_glr_gallery_bifacial_plot_irradiance_nonuniformity_loss.py`. Returns ------- From 84346d25109e94bb85019ef11c3c34a9987999a4 Mon Sep 17 00:00:00 2001 From: echedey-ls <80125792+echedey-ls@users.noreply.github.com> Date: Fri, 10 May 2024 23:08:17 +0200 Subject: [PATCH 04/82] docstring update --- pvlib/pvsystem.py | 34 ++++++++++++++++++++++++++-------- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/pvlib/pvsystem.py b/pvlib/pvsystem.py index 297fce0d8b..6d7fd0d481 100644 --- a/pvlib/pvsystem.py +++ b/pvlib/pvsystem.py @@ -3033,7 +3033,7 @@ def combine_loss_factors(index, *losses, fill_method='ffill'): def nonuniform_irradiance_loss(rmad): - """ + r""" Calculate the incident irradiance loss due to irradiance non-uniformity. This model is described for bifacial modules in [1]_, where the backside @@ -3055,17 +3055,35 @@ def nonuniform_irradiance_loss(rmad): Notes ----- - TODO + The function this model implements is equation (7) of [1]_: - Examples - -------- - >>> from pvlib import pvsystem - >>> pvsystem.nonuniform_irradiance_loss(0.05) - 0.025 + .. math:: + + M[%] = 0.12 \DELTA[%] + 2.77 \DELTA[%]^2 + + where :math:`\DELTA[%]` is the Relative Mean Absolute Difference of the + global irradiance, Eq. (4) of [1]_ and [2]_: + + .. math:: + + \DELTA[%] = \frac{1}{n^2\bar{G_{total}}} \sum_{i=1}^{n} \sum_{j=1}^{n} + |G_{total,i} - G_{total,j}| + + and the total irradiance is calculated as: + + .. math:: + + G_{total,i} = G_{front,i} + \PHI_{Bifi} G_{rear,i} + + where :math:`\PHI_{Bifi}` is the bifaciality factor. + + It is recommended to see the example + :ref:`sphx_glr_gallery_bifacial_plot_irradiance_nonuniformity_loss.py` + for a complete use case and the RMAD function implementation. See Also -------- - TODO + pvlib.pvsystem.combine_loss_factors References ---------- From bdb99556b130525edba9177238c703bf627c07cc Mon Sep 17 00:00:00 2001 From: echedey-ls <80125792+echedey-ls@users.noreply.github.com> Date: Fri, 10 May 2024 23:11:59 +0200 Subject: [PATCH 05/82] Update v0.11.0.rst --- docs/sphinx/source/whatsnew/v0.11.0.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/sphinx/source/whatsnew/v0.11.0.rst b/docs/sphinx/source/whatsnew/v0.11.0.rst index 7ea847a6d9..4d1de9a236 100644 --- a/docs/sphinx/source/whatsnew/v0.11.0.rst +++ b/docs/sphinx/source/whatsnew/v0.11.0.rst @@ -15,6 +15,9 @@ Deprecations Enhancements ~~~~~~~~~~~~ +* Add new losses function that accounts for non-uniform irradiance of bifacial + modules, :py:func:`pvlib.pvsystem.nonuniform_irradiance_loss`. + (:issue:`2045`, :pr:`2046`) Bug fixes From 914d0091a396bdcc49bdc3deab7e4db73cc2e506 Mon Sep 17 00:00:00 2001 From: echedey-ls <80125792+echedey-ls@users.noreply.github.com> Date: Fri, 10 May 2024 23:18:19 +0200 Subject: [PATCH 06/82] who would have guessed it's always the linter? --- pvlib/pvsystem.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pvlib/pvsystem.py b/pvlib/pvsystem.py index 6d7fd0d481..3f63747075 100644 --- a/pvlib/pvsystem.py +++ b/pvlib/pvsystem.py @@ -3045,7 +3045,7 @@ def nonuniform_irradiance_loss(rmad): ---------- rmad : numeric The Relative Mean Absolute Difference of the irradiance. - See the definition in [2]_ and the example + See the definition in [2]_ and the example :ref:`sphx_glr_gallery_bifacial_plot_irradiance_nonuniformity_loss.py`. Returns @@ -3058,7 +3058,7 @@ def nonuniform_irradiance_loss(rmad): The function this model implements is equation (7) of [1]_: .. math:: - + M[%] = 0.12 \DELTA[%] + 2.77 \DELTA[%]^2 where :math:`\DELTA[%]` is the Relative Mean Absolute Difference of the @@ -3074,7 +3074,7 @@ def nonuniform_irradiance_loss(rmad): .. math:: G_{total,i} = G_{front,i} + \PHI_{Bifi} G_{rear,i} - + where :math:`\PHI_{Bifi}` is the bifaciality factor. It is recommended to see the example From 29f4c6608c03d6a5ec2c26bd1e67cf7a3f39f77c Mon Sep 17 00:00:00 2001 From: echedey-ls <80125792+echedey-ls@users.noreply.github.com> Date: Fri, 10 May 2024 23:42:01 +0200 Subject: [PATCH 07/82] Update plot_irradiance_nonuniformity_loss.py --- docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py b/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py index 836abe7d82..33182cd27b 100644 --- a/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py +++ b/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py @@ -154,7 +154,7 @@ def rmad(data, axis=None): # non-uniformity through the day. # # Here we will base our calculations on the work of Domínguez et al. [2]_. -# The following image shows the backside irradiance non-uniformity of a +# The following image in [3]_ shows the backside irradiance non-uniformity of a # HSAT mock-up system: # # .. figure:: ../../_images/Dominguez_et_al_PVSC2023.png From 03011d33df8948158df3e762051e7f506e863008 Mon Sep 17 00:00:00 2001 From: echedey-ls <80125792+echedey-ls@users.noreply.github.com> Date: Fri, 10 May 2024 23:47:30 +0200 Subject: [PATCH 08/82] equation fixes --- pvlib/pvsystem.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pvlib/pvsystem.py b/pvlib/pvsystem.py index 3f63747075..a5c50635d1 100644 --- a/pvlib/pvsystem.py +++ b/pvlib/pvsystem.py @@ -3059,21 +3059,21 @@ def nonuniform_irradiance_loss(rmad): .. math:: - M[%] = 0.12 \DELTA[%] + 2.77 \DELTA[%]^2 + M[%] = 0.12 \Delta[%] + 2.77 \Delta[%]^2 - where :math:`\DELTA[%]` is the Relative Mean Absolute Difference of the + where :math:`\Delta[%]` is the Relative Mean Absolute Difference of the global irradiance, Eq. (4) of [1]_ and [2]_: .. math:: - \DELTA[%] = \frac{1}{n^2\bar{G_{total}}} \sum_{i=1}^{n} \sum_{j=1}^{n} + \Delta[%] = \frac{1}{n^2\bar{G_{total}}} \sum_{i=1}^{n} \sum_{j=1}^{n} |G_{total,i} - G_{total,j}| and the total irradiance is calculated as: .. math:: - G_{total,i} = G_{front,i} + \PHI_{Bifi} G_{rear,i} + G_{total,i} = G_{front,i} + \phi_{Bifi} G_{rear,i} where :math:`\PHI_{Bifi}` is the bifaciality factor. From de1744a0609bec7f3fc77f46107f52085eef80ba Mon Sep 17 00:00:00 2001 From: echedey-ls <80125792+echedey-ls@users.noreply.github.com> Date: Sat, 11 May 2024 00:23:22 +0200 Subject: [PATCH 09/82] RMAD properties application typo --- .../bifacial/plot_irradiance_nonuniformity_loss.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py b/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py index 33182cd27b..838411d2de 100644 --- a/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py +++ b/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py @@ -198,8 +198,8 @@ def hsat_backside_rmad_model_through_day(hour): # # Let's calculate the **global RMAD** through the day - it's **different** from # the backside RMAD since :math:`RMAD(k \cdot X + c) = k \cdot RMAD(X) \cdot -# \frac{\bar{X}}{\bar{X} + c}`, where :math:`X` is a random variable and -# :math:`k>0` and :math:`c \neq \bar{X}` are constants (:ref:`source +# \frac{k \bar{X}}{k \bar{X} + c}`, where :math:`X` is a random variable and +# :math:`k>0, c \neq \bar{X}` are constants (:ref:`source # `). times = pd.date_range("2023-06-06T09:30", "2023-06-06T18:30", freq="30min") @@ -211,8 +211,13 @@ def hsat_backside_rmad_model_through_day(hour): global_irrad = front_irrad + bifaciality * backside_irrad # See RMAD properties above # Here we calculate RMAD(global_irrad) +# backside_irrad := X, bifaciality := k, front_irrad := c backside_rmad = hsat_backside_rmad_model_through_day(hours) -global_rmad = bifaciality * backside_rmad / (1 + front_irrad / backside_irrad) +global_rmad = ( + bifaciality + * backside_rmad + / (1 + front_irrad / backside_irrad / bifaciality) +) # Get the mismatch loss mismatch_loss = nonuniform_irradiance_loss(global_rmad) @@ -238,3 +243,5 @@ def hsat_backside_rmad_model_through_day(hour): ax2.set_ylabel("Mismatch loss") fig.show() + +# %% From 7f27c9f86db007117586b91233976496c4b2e332 Mon Sep 17 00:00:00 2001 From: echedey-ls <80125792+echedey-ls@users.noreply.github.com> Date: Sat, 11 May 2024 00:47:30 +0200 Subject: [PATCH 10/82] does this fix the link? --- docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py b/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py index 838411d2de..1ad1b33760 100644 --- a/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py +++ b/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py @@ -144,10 +144,11 @@ def rmad(data, axis=None): print(f"Effective power after mismatch correction: {mismatch_corrected_irrad}") # %% -# .. _practical_approach:: -# # A practical approach # -------------------- +# +# .. _practical_approach:: +# # In practice, simulating each cell irradiance is computationally expensive, # and measuring each of the cells irradiance of a real system can also be # challenging. Nevertheless, a mock-up system can be used to estimate the From 2cdc95fc7c8ffce7e990328b218e2015b6c92b82 Mon Sep 17 00:00:00 2001 From: echedey-ls <80125792+echedey-ls@users.noreply.github.com> Date: Sat, 11 May 2024 00:48:12 +0200 Subject: [PATCH 11/82] yet another link --- docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py b/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py index 1ad1b33760..11b4f3c502 100644 --- a/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py +++ b/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py @@ -200,8 +200,8 @@ def hsat_backside_rmad_model_through_day(hour): # Let's calculate the **global RMAD** through the day - it's **different** from # the backside RMAD since :math:`RMAD(k \cdot X + c) = k \cdot RMAD(X) \cdot # \frac{k \bar{X}}{k \bar{X} + c}`, where :math:`X` is a random variable and -# :math:`k>0, c \neq \bar{X}` are constants (:ref:`source -# `). +# :math:`k>0, c \neq \bar{X}` are constants (`source +# `_). times = pd.date_range("2023-06-06T09:30", "2023-06-06T18:30", freq="30min") hours = times.hour + times.minute / 60 From 069883988f3b195317e3074d41a5c9ca234e4f94 Mon Sep 17 00:00:00 2001 From: echedey-ls <80125792+echedey-ls@users.noreply.github.com> Date: Sat, 11 May 2024 01:05:15 +0200 Subject: [PATCH 12/82] These links will never work, I suppose --- .../bifacial/plot_irradiance_nonuniformity_loss.py | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py b/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py index 11b4f3c502..6313dccdad 100644 --- a/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py +++ b/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py @@ -17,9 +17,9 @@ # two different approaches: # # - Given the irradiance levels of each cell in an instant, -# in :ref:`theoretical_approach`. +# in the first section. # - Modelling the irradiance non-uniformity RMAD through the day thanks to a -# mock-up horizontal axis tracker system, in :ref:`practical_approach`. +# mock-up horizontal axis tracker system, in the second section. # See [2]_ and [3]_ for more information. # # The function :py:func:`pvlib.pvsystem.nonuniform_irradiance_loss` will be @@ -65,8 +65,6 @@ def rmad(data, axis=None): # %% -# .. _theoretical_approach:: -# # Theoretical and straightforward problem # --------------------------------------- # Let's set a fixed irradiance to each cell row of the PV array with the values @@ -146,9 +144,6 @@ def rmad(data, axis=None): # %% # A practical approach # -------------------- -# -# .. _practical_approach:: -# # In practice, simulating each cell irradiance is computationally expensive, # and measuring each of the cells irradiance of a real system can also be # challenging. Nevertheless, a mock-up system can be used to estimate the From 7f27f1cd21fbdaa31e170ce37666a47ab582f831 Mon Sep 17 00:00:00 2001 From: echedey-ls <80125792+echedey-ls@users.noreply.github.com> Date: Sat, 11 May 2024 14:29:40 +0200 Subject: [PATCH 13/82] Move some "Notes" equations to example and rearrange things there --- .../plot_irradiance_nonuniformity_loss.py | 40 +++++++++++++------ pvlib/pvsystem.py | 13 ++---- 2 files changed, 30 insertions(+), 23 deletions(-) diff --git a/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py b/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py index 6313dccdad..3fad1a8e50 100644 --- a/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py +++ b/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py @@ -53,17 +53,6 @@ from pvlib.pvsystem import nonuniform_irradiance_loss - -# Define the Relative Mean Absolute Deviation (RMAD) function, (Eq. 4) in [1]_. -def rmad(data, axis=None): - """ - Relative Mean Absolute Deviation - https://stackoverflow.com/a/19472336/19371110 - """ - mad = np.mean(np.absolute(data - np.mean(data, axis)), axis) - return mad / np.mean(data, axis) - - # %% # Theoretical and straightforward problem # --------------------------------------- @@ -102,12 +91,27 @@ def rmad(data, axis=None): # Relative Mean Absolute Deviation # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ # Calculate the Relative Mean Absolute Deviation (RMAD) of the cells' -# irradiance with the help of the function defined on the top of this example. +# irradiance with the following function, Eq. (4) of [1]_: +# +# .. math:: +# +# \Delta[%] = \frac{1}{n^2\bar{G_{total}}} \sum_{i=1}^{n} \sum_{j=1}^{n} +# |G_{total,i} - G_{total,j}| + + +def rmad(data, axis=None): + """ + Relative Mean Absolute Deviation. + https://stackoverflow.com/a/19472336/19371110 + """ + mad = np.mean(np.absolute(data - np.mean(data, axis)), axis) + return mad / np.mean(data, axis) + rmad_cells = rmad(cells_irrad) # this is the same as a column's RMAD! -assert rmad_cells == rmad(cells_irrad[:, 0]) +print(rmad_cells == rmad(cells_irrad[:, 0])) # %% # Mismatch Loss @@ -180,11 +184,21 @@ def hsat_backside_rmad_model_through_day(hour): # %% +# Calculating Global RMAD from Backside RMAD +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +# # .. note:: # The global irradiance RMAD is different from the backside irradiance RMAD. # # The global irradiance is the sum of the front irradiance and the backside # irradiance by the bifaciality factor, see equation (2) in [1]_. +# +# .. math:: +# +# G_{total,i} = G_{front,i} + \phi_{Bifi} G_{rear,i} +# +# where :math:`\PHI_{Bifi}` is the bifaciality factor. +# # Here we will model front and backside irradiances with normal distributions # for simplicity, then calculate the global RMAD and plot the results. # diff --git a/pvlib/pvsystem.py b/pvlib/pvsystem.py index a5c50635d1..0ec1432acf 100644 --- a/pvlib/pvsystem.py +++ b/pvlib/pvsystem.py @@ -3062,20 +3062,13 @@ def nonuniform_irradiance_loss(rmad): M[%] = 0.12 \Delta[%] + 2.77 \Delta[%]^2 where :math:`\Delta[%]` is the Relative Mean Absolute Difference of the - global irradiance, Eq. (4) of [1]_ and [2]_: + global irradiance, Eq. (4) of [1]_ and [2]_. - .. math:: - - \Delta[%] = \frac{1}{n^2\bar{G_{total}}} \sum_{i=1}^{n} \sum_{j=1}^{n} - |G_{total,i} - G_{total,j}| - - and the total irradiance is calculated as: + The losses definition is done in Eq. (1) of [1]_: .. math:: - G_{total,i} = G_{front,i} + \phi_{Bifi} G_{rear,i} - - where :math:`\PHI_{Bifi}` is the bifaciality factor. + M[%] = 1 - \frac{P_{Array}}{\sum P_{Cells}} It is recommended to see the example :ref:`sphx_glr_gallery_bifacial_plot_irradiance_nonuniformity_loss.py` From 58c05bd06a83537963b6fa0844e67892f45f1605 Mon Sep 17 00:00:00 2001 From: echedey-ls <80125792+echedey-ls@users.noreply.github.com> Date: Sat, 11 May 2024 14:34:12 +0200 Subject: [PATCH 14/82] give this equation it's space --- .../bifacial/plot_irradiance_nonuniformity_loss.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py b/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py index 3fad1a8e50..b4790c701e 100644 --- a/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py +++ b/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py @@ -207,10 +207,16 @@ def hsat_backside_rmad_model_through_day(hour): # neglected in this example. # # Let's calculate the **global RMAD** through the day - it's **different** from -# the backside RMAD since :math:`RMAD(k \cdot X + c) = k \cdot RMAD(X) \cdot -# \frac{k \bar{X}}{k \bar{X} + c}`, where :math:`X` is a random variable and -# :math:`k>0, c \neq \bar{X}` are constants (`source -# `_). +# the backside RMAD since +# +# .. math:: +# +# RMAD(k \cdot X + c) = RMAD(X) \cdot k \frac{k \bar{X}}{k \bar{X} + c} +# = RMAD(X) \cdot k \frac{1}{1 + \frac{c}{k \bar{X}}} +# +# where :math:`X` is a random variable and :math:`k>0, c \neq \bar{X}` are +# constants (`source +# `_). times = pd.date_range("2023-06-06T09:30", "2023-06-06T18:30", freq="30min") hours = times.hour + times.minute / 60 From b973959f6c2a2e478e80b8f548fa53bfa498407a Mon Sep 17 00:00:00 2001 From: echedey-ls <80125792+echedey-ls@users.noreply.github.com> Date: Sat, 11 May 2024 14:46:48 +0200 Subject: [PATCH 15/82] eq rendering fixes? --- .../bifacial/plot_irradiance_nonuniformity_loss.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py b/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py index b4790c701e..c2d4b82b09 100644 --- a/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py +++ b/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py @@ -95,8 +95,8 @@ # # .. math:: # -# \Delta[%] = \frac{1}{n^2\bar{G_{total}}} \sum_{i=1}^{n} \sum_{j=1}^{n} -# |G_{total,i} - G_{total,j}| +# \Delta[%] = \frac{1}{n^2 \bar{G}_{total}} \sum_{i=1}^{n} \sum_{j=1}^{n} +# |G_{total,i} - G_{total,j}| def rmad(data, axis=None): @@ -197,7 +197,7 @@ def hsat_backside_rmad_model_through_day(hour): # # G_{total,i} = G_{front,i} + \phi_{Bifi} G_{rear,i} # -# where :math:`\PHI_{Bifi}` is the bifaciality factor. +# where :math:`\phi_{Bifi}` is the bifaciality factor. # # Here we will model front and backside irradiances with normal distributions # for simplicity, then calculate the global RMAD and plot the results. @@ -230,8 +230,8 @@ def hsat_backside_rmad_model_through_day(hour): # backside_irrad := X, bifaciality := k, front_irrad := c backside_rmad = hsat_backside_rmad_model_through_day(hours) global_rmad = ( - bifaciality - * backside_rmad + backside_rmad + * bifaciality / (1 + front_irrad / backside_irrad / bifaciality) ) From 448b647918b65d4e6c8ab96434a25b8719a32df2 Mon Sep 17 00:00:00 2001 From: echedey-ls <80125792+echedey-ls@users.noreply.github.com> Date: Sat, 11 May 2024 15:14:44 +0200 Subject: [PATCH 16/82] maths are not mathing today --- docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py b/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py index c2d4b82b09..2154eea550 100644 --- a/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py +++ b/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py @@ -96,7 +96,7 @@ # .. math:: # # \Delta[%] = \frac{1}{n^2 \bar{G}_{total}} \sum_{i=1}^{n} \sum_{j=1}^{n} -# |G_{total,i} - G_{total,j}| +# \lvert G_{total,i} - G_{total,j} \rvert def rmad(data, axis=None): From 57684737842bdfc66c308a393a7a056352bf2419 Mon Sep 17 00:00:00 2001 From: echedey-ls <80125792+echedey-ls@users.noreply.github.com> Date: Sat, 11 May 2024 15:21:38 +0200 Subject: [PATCH 17/82] ??? --- docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py b/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py index 2154eea550..9b72047ec2 100644 --- a/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py +++ b/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py @@ -97,7 +97,7 @@ # # \Delta[%] = \frac{1}{n^2 \bar{G}_{total}} \sum_{i=1}^{n} \sum_{j=1}^{n} # \lvert G_{total,i} - G_{total,j} \rvert - +# def rmad(data, axis=None): """ From b1a7e4a8e6fc676cdf3b413917119c08f988dab3 Mon Sep 17 00:00:00 2001 From: echedey-ls <80125792+echedey-ls@users.noreply.github.com> Date: Sat, 11 May 2024 15:22:38 +0200 Subject: [PATCH 18/82] ??? x2 --- docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py b/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py index 9b72047ec2..79e8de9ed5 100644 --- a/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py +++ b/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py @@ -99,6 +99,7 @@ # \lvert G_{total,i} - G_{total,j} \rvert # + def rmad(data, axis=None): """ Relative Mean Absolute Deviation. From d1b476ddeb19f2961934bed86644864f266e7813 Mon Sep 17 00:00:00 2001 From: echedey-ls <80125792+echedey-ls@users.noreply.github.com> Date: Sat, 11 May 2024 16:00:56 +0200 Subject: [PATCH 19/82] ??? x3 --- docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py b/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py index 79e8de9ed5..e5428e9cb9 100644 --- a/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py +++ b/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py @@ -95,8 +95,8 @@ # # .. math:: # -# \Delta[%] = \frac{1}{n^2 \bar{G}_{total}} \sum_{i=1}^{n} \sum_{j=1}^{n} -# \lvert G_{total,i} - G_{total,j} \rvert +# \Delta \left[ % \right] = \frac{1}{n^2 \bar{G}_{total}} +# \sum_{i=1}^{n} \sum_{j=1}^{n} \lvert G_{total,i} - G_{total,j} \rvert # From d0373148b70fb0c9a503438b826387c184431aec Mon Sep 17 00:00:00 2001 From: echedey-ls <80125792+echedey-ls@users.noreply.github.com> Date: Sat, 11 May 2024 16:23:47 +0200 Subject: [PATCH 20/82] i feel stupid for this --- docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py b/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py index e5428e9cb9..f4f303ede8 100644 --- a/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py +++ b/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py @@ -95,7 +95,7 @@ # # .. math:: # -# \Delta \left[ % \right] = \frac{1}{n^2 \bar{G}_{total}} +# \Delta \left[ \% \right] = \frac{1}{n^2 \bar{G}_{total}} # \sum_{i=1}^{n} \sum_{j=1}^{n} \lvert G_{total,i} - G_{total,j} \rvert # From 4ec952b2f3c3175761ddcabe38c6a0468ebcdef7 Mon Sep 17 00:00:00 2001 From: echedey-ls <80125792+echedey-ls@users.noreply.github.com> Date: Wed, 15 May 2024 01:16:56 +0200 Subject: [PATCH 21/82] Change preprint ref to published one Co-Authored-By: Kevin Anderson <57452607+kandersolar@users.noreply.github.com> --- .../bifacial/plot_irradiance_nonuniformity_loss.py | 7 ++++--- pvlib/pvsystem.py | 7 ++++--- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py b/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py index f4f303ede8..8c7e425ed2 100644 --- a/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py +++ b/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py @@ -29,9 +29,10 @@ # # References # ---------- -# .. [1] Deline, C., Pelaez, S.A., MacAlpine, S.M., & Olalla, C. (2019). -# Bifacial PV System Mismatch Loss Estimation and Parameterization: -# Preprint. https://www.nrel.gov/docs/fy19osti/74831.pdf +# .. [1] C. Deline, S. Ayala Pelaez, S. MacAlpine, and C. Olalla, 'Estimating +# and parameterizing mismatch power loss in bifacial photovoltaic +# systems', Progress in Photovoltaics: Research and Applications, vol. 28, +# no. 7, pp. 691-703, 2020, :doi:`10.1002/pip.3259`. # .. [2] C. Domínguez, J. Marcos, S. Ures, S. Askins, and I. Antón, 'A # Horizontal Single-Axis Tracker Mock-Up to Quickly Assess the Influence # of Geometrical Factors on Bifacial Energy Gain', in 2023 IEEE 50th diff --git a/pvlib/pvsystem.py b/pvlib/pvsystem.py index 0ec1432acf..ff596953aa 100644 --- a/pvlib/pvsystem.py +++ b/pvlib/pvsystem.py @@ -3080,9 +3080,10 @@ def nonuniform_irradiance_loss(rmad): References ---------- - .. [1] Ayala Pelaez, S., Deline, C., MacAlpine, S., & Olalla, C. (2019). - Bifacial PV System Mismatch Loss Estimation. - https://www.nrel.gov/docs/fy19osti/74831.pdf + .. [1] C. Deline, S. Ayala Pelaez, S. MacAlpine, and C. Olalla, 'Estimating + and parameterizing mismatch power loss in bifacial photovoltaic + systems', Progress in Photovoltaics: Research and Applications, vol. 28, + no. 7, pp. 691-703, 2020, :doi:`10.1002/pip.3259`. .. [2] “Mean absolute difference,” Wikipedia, Sep. 05, 2023. https://en.wikipedia.org/wiki/Mean_absolute_difference#Relative_mean_absolute_difference (accessed 2024-04-14). From b0cadb55f646292b8a4094224b0ad2db4acc59e2 Mon Sep 17 00:00:00 2001 From: echedey-ls <80125792+echedey-ls@users.noreply.github.com> Date: Sat, 18 May 2024 17:45:31 +0200 Subject: [PATCH 22/82] Published paper coeffs Co-Authored-By: Kevin Anderson <57452607+kandersolar@users.noreply.github.com> --- pvlib/pvsystem.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pvlib/pvsystem.py b/pvlib/pvsystem.py index ff596953aa..ce22dcb933 100644 --- a/pvlib/pvsystem.py +++ b/pvlib/pvsystem.py @@ -3032,7 +3032,7 @@ def combine_loss_factors(index, *losses, fill_method='ffill'): return 1 - combined_factor -def nonuniform_irradiance_loss(rmad): +def nonuniform_irradiance_loss(rmad, c1=0.054, c2=0.068): r""" Calculate the incident irradiance loss due to irradiance non-uniformity. @@ -3089,4 +3089,4 @@ def nonuniform_irradiance_loss(rmad): (accessed 2024-04-14). """ # noqa: E501 # Eq. (7) of [1] - return rmad * (0.12 + 2.77 * rmad) + return rmad * (c1 + c2 * rmad) From 9f51b68ad40a7f772c3e44979433345f1d0969e3 Mon Sep 17 00:00:00 2001 From: echedey-ls <80125792+echedey-ls@users.noreply.github.com> Date: Sun, 19 May 2024 23:19:17 +0200 Subject: [PATCH 23/82] Lots of improvements MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Pending second section of example, and checking docs Co-Authored-By: César Domínguez <48208196+cesardd@users.noreply.github.com> Co-Authored-By: Kevin Anderson <57452607+kandersolar@users.noreply.github.com> --- .../plot_irradiance_nonuniformity_loss.py | 85 +++++++++---------- .../loss-models.rst | 2 +- docs/sphinx/source/whatsnew/v0.11.0.rst | 2 +- pvlib/pvsystem.py | 67 ++++++++++++--- pvlib/tests/test_pvsystem.py | 42 +++++++-- 5 files changed, 131 insertions(+), 67 deletions(-) diff --git a/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py b/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py index 8c7e425ed2..3cbe479bbb 100644 --- a/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py +++ b/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py @@ -8,9 +8,18 @@ # %% # The incident irradiance on the backside of a bifacial PV module is # not uniform due to neighboring rows, the ground albedo and site conditions. -# Cells with different irradiance levels produce less power that the sum of -# the power produced by each cell individually. This is known as irradiance -# non-uniformity loss. +# When each cell works at different irradiance levels, the power produced by +# the module is less than the sum of the power produced by each cell since the +# maximum power point of each cell is different, but cells connected in series +# will operate at the same current. This is known as irradiance non-uniformity +# loss. +# +# Calculating the IV curve of each cell and then matching the working point of +# the whole module is computationally expensive, so a model to account for this +# loss is of interest. Deline et al. [1]_ proposed a model based on the +# Relative Mean Absolute Difference (RMAD) of the irradiance of each cell. +# They did also use the standard deviation of the cells' irradiances, but they +# found that the RMAD was a better predictor of the mismatch loss. # # This example demonstrates how to model the irradiance non-uniformity loss # due to different global irradiance levels on a bifacial PV module through @@ -22,8 +31,9 @@ # mock-up horizontal axis tracker system, in the second section. # See [2]_ and [3]_ for more information. # -# The function :py:func:`pvlib.pvsystem.nonuniform_irradiance_loss` will be -# used to transform the Relative Mean Absolute Deviation (RMAD) of the +# The function +# :py:func:`pvlib.pvsystem.nonuniform_irradiance_deline_power_loss` is +# used to transform the Relative Mean Absolute Difference (RMAD) of the # irradiance into a power loss percentage. Down below you will find a # numpy-based implementation of the RMAD function. # @@ -52,19 +62,22 @@ from matplotlib.cm import ScalarMappable from matplotlib.colors import Normalize -from pvlib.pvsystem import nonuniform_irradiance_loss +from pvlib.pvsystem import nonuniform_irradiance_deline_power_loss # %% # Theoretical and straightforward problem # --------------------------------------- # Let's set a fixed irradiance to each cell row of the PV array with the values -# described in Figure 1 (a), [1]_. We will cover this case for educational -# purposes. -# Here we set and plot the global irradiance levels of each cell. +# described in Figure 1 (A), [1]_. We will cover this case for educational +# purposes, although it can be achieved with the packages +# :ref:`solarfactors ` and +# :ref:`bifacial_radiance `. +# +# Here we set and plot the global irradiance level of each cell. -x = np.arange(6, 0, -1) +x = np.arange(12, 0, -1) y = np.arange(6, 0, -1) -cells_irrad = np.repeat([1059, 976, 967, 986, 1034, 1128], 6).reshape(6, 6) +cells_irrad = np.repeat([1059, 976, 967, 986, 1034, 1128], len(x)).reshape(len(y), len(x)) color_map = "gray" color_norm = Normalize(930, 1150) @@ -89,9 +102,9 @@ ) # %% -# Relative Mean Absolute Deviation -# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -# Calculate the Relative Mean Absolute Deviation (RMAD) of the cells' +# Relative Mean Absolute Difference +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +# Calculate the Relative Mean Absolute Difference (RMAD) of the cells' # irradiance with the following function, Eq. (4) of [1]_: # # .. math:: @@ -103,7 +116,7 @@ def rmad(data, axis=None): """ - Relative Mean Absolute Deviation. + Relative Mean Absolute Difference. https://stackoverflow.com/a/19472336/19371110 """ mad = np.mean(np.absolute(data - np.mean(data, axis)), axis) @@ -119,43 +132,23 @@ def rmad(data, axis=None): # Mismatch Loss # ^^^^^^^^^^^^^ # Calculate the power loss percentage due to the irradiance non-uniformity -# with the function :py:func:`pvlib.pvsystem.nonuniform_irradiance_loss`. - -mismatch_loss = nonuniform_irradiance_loss(rmad_cells) - -# %% -# Total power incident on the module cells -# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -# It is the sum of the irradiance of each cell - -total_irrad = np.sum(cells_irrad) +# with the function :py:func:`pvlib.pvsystem.nonuniform_irradiance_deline_power_loss`. -# %% -# Mismatch-corrected irradiance -# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -# The power incident on the module cells is multiplied by the mismatch loss -# as follows: - -mismatch_corrected_irrad = total_irrad * (1 - mismatch_loss) - -# %% -# Results -# ^^^^^^^ +mismatch_loss = nonuniform_irradiance_deline_power_loss(rmad_cells) -print(f"Total power incident on the module cells: {total_irrad}") print(f"RMAD of the cells' irradiance: {rmad_cells}") print(f"Power loss % due to the irradiance non-uniformity: {mismatch_loss}") -print(f"Effective power after mismatch correction: {mismatch_corrected_irrad}") # %% # A practical approach # -------------------- -# In practice, simulating each cell irradiance is computationally expensive, -# and measuring each of the cells irradiance of a real system can also be -# challenging. Nevertheless, a mock-up system can be used to estimate the -# non-uniformity through the day. +# Instead of simulating or measuring the irradiance of each cell, RMAD trend +# through the day can be modelled. The remaining section of this example will +# cover the modelling of the global RMAD if the backside irradiance RMAD is +# known. Note these two RMADs are inherently different but are related. # -# Here we will base our calculations on the work of Domínguez et al. [2]_. +# Here we will base our calculations on a horizontal single-axis tracking +# mockup developed by Domínguez et al. [2]_. # The following image in [3]_ shows the backside irradiance non-uniformity of a # HSAT mock-up system: # @@ -167,7 +160,7 @@ def rmad(data, axis=None): # *BE* stands for *backside east*. -def hsat_backside_rmad_model_through_day(hour): +def hsat_backside_rmad_model_through_day(hour): # TODO: REMOVE THIS """Model of the blue dots in the image above.""" # For demonstration purposes only. Model roughly fit to show an example of # the RMAD variation through the day without including all the data. @@ -238,7 +231,7 @@ def hsat_backside_rmad_model_through_day(hour): ) # Get the mismatch loss -mismatch_loss = nonuniform_irradiance_loss(global_rmad) +mismatch_loss = nonuniform_irradiance_deline_power_loss(global_rmad) # Plot results fig, ax1 = plt.subplots() @@ -261,5 +254,3 @@ def hsat_backside_rmad_model_through_day(hour): ax2.set_ylabel("Mismatch loss") fig.show() - -# %% diff --git a/docs/sphinx/source/reference/effects_on_pv_system_output/loss-models.rst b/docs/sphinx/source/reference/effects_on_pv_system_output/loss-models.rst index 235a4db7f9..035407d847 100644 --- a/docs/sphinx/source/reference/effects_on_pv_system_output/loss-models.rst +++ b/docs/sphinx/source/reference/effects_on_pv_system_output/loss-models.rst @@ -8,4 +8,4 @@ Loss models pvsystem.combine_loss_factors pvsystem.dc_ohms_from_percent - pvsystem.nonuniform_irradiance_loss + pvsystem.nonuniform_irradiance_deline_power_loss diff --git a/docs/sphinx/source/whatsnew/v0.11.0.rst b/docs/sphinx/source/whatsnew/v0.11.0.rst index 4d1de9a236..1db6be5e53 100644 --- a/docs/sphinx/source/whatsnew/v0.11.0.rst +++ b/docs/sphinx/source/whatsnew/v0.11.0.rst @@ -16,7 +16,7 @@ Deprecations Enhancements ~~~~~~~~~~~~ * Add new losses function that accounts for non-uniform irradiance of bifacial - modules, :py:func:`pvlib.pvsystem.nonuniform_irradiance_loss`. + modules, :py:func:`pvlib.pvsystem.nonuniform_irradiance_deline_power_loss`. (:issue:`2045`, :pr:`2046`) diff --git a/pvlib/pvsystem.py b/pvlib/pvsystem.py index ce22dcb933..eaa9d36e5c 100644 --- a/pvlib/pvsystem.py +++ b/pvlib/pvsystem.py @@ -15,7 +15,7 @@ import pandas as pd from dataclasses import dataclass from abc import ABC, abstractmethod -from typing import Optional, Union +from typing import Optional, Union, Literal from pvlib._deprecation import deprecated, warn_deprecated @@ -3032,13 +3032,21 @@ def combine_loss_factors(index, *losses, fill_method='ffill'): return 1 - combined_factor -def nonuniform_irradiance_loss(rmad, c1=0.054, c2=0.068): +def nonuniform_irradiance_deline_power_loss( + rmad, + model: Literal[ + "fixed-tilt", "single-axis-tracking" + ] = "single-axis-tracking", +): r""" - Calculate the incident irradiance loss due to irradiance non-uniformity. + Estimate the power loss due to irradiance non-uniformity. This model is described for bifacial modules in [1]_, where the backside irradiance is less uniform due to mounting and site conditions. + Depending on the mounting type, the power loss is estimated with either + equation (11) or (12) of [1]_. + .. versionadded:: 0.11.0 Parameters @@ -3048,35 +3056,57 @@ def nonuniform_irradiance_loss(rmad, c1=0.054, c2=0.068): See the definition in [2]_ and the example :ref:`sphx_glr_gallery_bifacial_plot_irradiance_nonuniformity_loss.py`. + model : str, numpy.polynomial.Polynom or list, default ``"single-axis-tracking"`` + The model coefficients to use. + If a string, it must be one of the following: + + * ``"fixed-tilt"``: Eq. (11) of [1]_. + * ``"single-axis-tracking"``: Eq. (12) of [1]_. + + If a :py:`numpy.polynomial.Polynomial`, it is evaluated as is. + + If neither a string nor a polynomial, it must be the coefficients of + polynomial model, with the first element being the constant term and + the last element the highest order term. + Returns ------- loss : numeric - The irradiance loss. + The power loss. Notes ----- - The function this model implements is equation (7) of [1]_: + The models implemented are equations (11) and (12) of [1]_: .. math:: - M[%] = 0.12 \Delta[%] + 2.77 \Delta[%]^2 + \text{model="fixed-tilt"} & \Rightarrow M[\%] = + 0.142 \Delta[\%] + 0.032 \Delta[\%]^2 \qquad & \text{(11)} + \text{model="single-axis-tracking"} & \Rightarrow M[\%] = + 0.054 \Delta[\%] + 0.068 \Delta[\%]^2 \qquad & \text{(12)} \\ - where :math:`\Delta[%]` is the Relative Mean Absolute Difference of the + where :math:`\Delta[\%]` is the Relative Mean Absolute Difference of the global irradiance, Eq. (4) of [1]_ and [2]_. - The losses definition is done in Eq. (1) of [1]_: + The losses definition is Eq. (1) of [1]_, and it's defined as a loss of the + output power: .. math:: - M[%] = 1 - \frac{P_{Array}}{\sum P_{Cells}} + M[\%] = 1 - \frac{P_{Array}}{\sum P_{Cells}} It is recommended to see the example :ref:`sphx_glr_gallery_bifacial_plot_irradiance_nonuniformity_loss.py` for a complete use case and the RMAD function implementation. + In the section *See Also*, you will find two packages that can be used to + calculate the irradiance at different points of the module. + See Also -------- pvlib.pvsystem.combine_loss_factors + :ref:`solarfactors ` + :ref:`bifacial_radiance `. References ---------- @@ -3088,5 +3118,20 @@ def nonuniform_irradiance_loss(rmad, c1=0.054, c2=0.068): https://en.wikipedia.org/wiki/Mean_absolute_difference#Relative_mean_absolute_difference (accessed 2024-04-14). """ # noqa: E501 - # Eq. (7) of [1] - return rmad * (c1 + c2 * rmad) + if isinstance(model, str): + _MODEL_POLYNOMS = { + "fixed-tilt": [0, 0.142, 0.032], # Eq. (11), [1] + "single-axis-tracking": [0, 0.054, 0.068], # Eq. (12), [1] + } + try: + model_polynom = np.polynomial.Polynomial(_MODEL_POLYNOMS[model]) + except KeyError: + raise ValueError( + f"Invalid model '{model}'. Available models are " + f"{list(_MODEL_POLYNOMS.keys())}." + ) + elif isinstance(model, np.polynomial.Polynomial): + model_polynom = model + else: + model_polynom = np.polynomial.Polynomial(coef=model) + return model_polynom(rmad) diff --git a/pvlib/tests/test_pvsystem.py b/pvlib/tests/test_pvsystem.py index fe5b830ae4..c467de6a92 100644 --- a/pvlib/tests/test_pvsystem.py +++ b/pvlib/tests/test_pvsystem.py @@ -2523,13 +2523,41 @@ def test_Array_temperature_missing_parameters(model, keys): array.get_cell_temperature(irrads, temps, winds, model) -def test_nonuniform_irradiance_loss(): - """tests pvsystem.nonuniform_irradiance_loss""" +def test_nonuniform_irradiance_deline_power_loss(): + """tests pvsystem.nonuniform_irradiance_deline_power_loss""" # TODO: improve premise_rmads = np.array([0.0, 0.05, 0.1, 0.15, 0.2, 0.25]) - expected_mms = np.array([0, 0.012925, 0.0397, 0.080325, 0.1348, 0.203125]) - result_mms = pvsystem.nonuniform_irradiance_loss(premise_rmads) - assert_allclose(result_mms, expected_mms, atol=1e-5) + # default model result values + expected_sat_mms = np.array( + [0.0, 0.00287, 0.00608, 0.00963, 0.01352, 0.01775] + ) + result_def_mms = pvsystem.nonuniform_irradiance_deline_power_loss( + premise_rmads + ) + assert_allclose(result_def_mms, expected_sat_mms, atol=1e-5) + assert np.all(np.diff(result_def_mms) > 0) # higher RMADs => higher losses + # default model matches single-axis tracker + result_sat_mms = pvsystem.nonuniform_irradiance_deline_power_loss( + premise_rmads, model="single-axis-tracking" + ) + assert_allclose(result_sat_mms, expected_sat_mms) + # fixed-tilt model result values + expected_ft_mms = np.array( + [0.0, 0.00718, 0.01452, 0.02202, 0.02968, 0.0375] + ) + result_ft_mms = pvsystem.nonuniform_irradiance_deline_power_loss( + premise_rmads, model="fixed-tilt" + ) + assert_allclose(result_ft_mms, expected_ft_mms) + assert np.all(np.diff(result_ft_mms) > 0) # higher RMADs => higher losses + # giving custom coefficients (1+1*RMAD) model + polynomial = np.polynomial.Polynomial([1, 1, 0]) + result_custom_mms = pvsystem.nonuniform_irradiance_deline_power_loss( + premise_rmads, model=polynomial + ) + assert_allclose(result_custom_mms, 1+premise_rmads) - # test datatypes Series IO - result_mms = pvsystem.nonuniform_irradiance_loss(pd.Series(premise_rmads)) + # test datatypes IO with Series + result_mms = pvsystem.nonuniform_irradiance_deline_power_loss( + pd.Series(premise_rmads) + ) assert isinstance(result_mms, pd.Series) From 67d3737c62737202c9033493cf8fbba32cd6e3d9 Mon Sep 17 00:00:00 2001 From: echedey-ls <80125792+echedey-ls@users.noreply.github.com> Date: Sun, 19 May 2024 23:21:38 +0200 Subject: [PATCH 24/82] Linter - also missing Eq (7) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: César Domínguez <48208196+cesardd@users.noreply.github.com> Co-Authored-By: Kevin Anderson <57452607+kandersolar@users.noreply.github.com> --- .../bifacial/plot_irradiance_nonuniformity_loss.py | 7 +++++-- pvlib/tests/test_pvsystem.py | 3 ++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py b/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py index 3cbe479bbb..c37cdb1d6b 100644 --- a/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py +++ b/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py @@ -77,7 +77,9 @@ x = np.arange(12, 0, -1) y = np.arange(6, 0, -1) -cells_irrad = np.repeat([1059, 976, 967, 986, 1034, 1128], len(x)).reshape(len(y), len(x)) +cells_irrad = np.repeat([1059, 976, 967, 986, 1034, 1128], len(x)).reshape( + len(y), len(x) +) color_map = "gray" color_norm = Normalize(930, 1150) @@ -132,7 +134,8 @@ def rmad(data, axis=None): # Mismatch Loss # ^^^^^^^^^^^^^ # Calculate the power loss percentage due to the irradiance non-uniformity -# with the function :py:func:`pvlib.pvsystem.nonuniform_irradiance_deline_power_loss`. +# with the function +# :py:func:`pvlib.pvsystem.nonuniform_irradiance_deline_power_loss`. mismatch_loss = nonuniform_irradiance_deline_power_loss(rmad_cells) diff --git a/pvlib/tests/test_pvsystem.py b/pvlib/tests/test_pvsystem.py index c467de6a92..0aaaad84aa 100644 --- a/pvlib/tests/test_pvsystem.py +++ b/pvlib/tests/test_pvsystem.py @@ -2524,7 +2524,8 @@ def test_Array_temperature_missing_parameters(model, keys): def test_nonuniform_irradiance_deline_power_loss(): - """tests pvsystem.nonuniform_irradiance_deline_power_loss""" # TODO: improve + """tests pvsystem.nonuniform_irradiance_deline_power_loss""" + # TODO: improve premise_rmads = np.array([0.0, 0.05, 0.1, 0.15, 0.2, 0.25]) # default model result values expected_sat_mms = np.array( From 10ac204e584376776e7d30dbc45dd1f3a258c2a0 Mon Sep 17 00:00:00 2001 From: echedey-ls <80125792+echedey-ls@users.noreply.github.com> Date: Sun, 19 May 2024 23:47:38 +0200 Subject: [PATCH 25/82] Test polynomial input MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: César Domínguez <48208196+cesardd@users.noreply.github.com> --- pvlib/pvsystem.py | 2 +- pvlib/tests/test_pvsystem.py | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/pvlib/pvsystem.py b/pvlib/pvsystem.py index eaa9d36e5c..673ca7243d 100644 --- a/pvlib/pvsystem.py +++ b/pvlib/pvsystem.py @@ -3045,7 +3045,7 @@ def nonuniform_irradiance_deline_power_loss( irradiance is less uniform due to mounting and site conditions. Depending on the mounting type, the power loss is estimated with either - equation (11) or (12) of [1]_. + equation (11) or (12) of [1]_. Passing the polynomial is also valid. .. versionadded:: 0.11.0 diff --git a/pvlib/tests/test_pvsystem.py b/pvlib/tests/test_pvsystem.py index 0aaaad84aa..a0d3bf6fb0 100644 --- a/pvlib/tests/test_pvsystem.py +++ b/pvlib/tests/test_pvsystem.py @@ -2550,12 +2550,18 @@ def test_nonuniform_irradiance_deline_power_loss(): ) assert_allclose(result_ft_mms, expected_ft_mms) assert np.all(np.diff(result_ft_mms) > 0) # higher RMADs => higher losses - # giving custom coefficients (1+1*RMAD) model + # test custom coefficients, set model to 1+1*RMAD + # as Polynomial class polynomial = np.polynomial.Polynomial([1, 1, 0]) result_custom_mms = pvsystem.nonuniform_irradiance_deline_power_loss( premise_rmads, model=polynomial ) assert_allclose(result_custom_mms, 1+premise_rmads) + # as list + result_custom_mms = pvsystem.nonuniform_irradiance_deline_power_loss( + premise_rmads, model=[1, 1, 0] + ) + assert_allclose(result_custom_mms, 1+premise_rmads) # test datatypes IO with Series result_mms = pvsystem.nonuniform_irradiance_deline_power_loss( From 9290f41c5476e25b8fac71aa9c8612958fed4e2d Mon Sep 17 00:00:00 2001 From: echedey-ls <80125792+echedey-ls@users.noreply.github.com> Date: Mon, 20 May 2024 08:43:58 +0200 Subject: [PATCH 26/82] Math --- pvlib/pvsystem.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pvlib/pvsystem.py b/pvlib/pvsystem.py index 673ca7243d..48531d7086 100644 --- a/pvlib/pvsystem.py +++ b/pvlib/pvsystem.py @@ -3082,8 +3082,9 @@ def nonuniform_irradiance_deline_power_loss( \text{model="fixed-tilt"} & \Rightarrow M[\%] = 0.142 \Delta[\%] + 0.032 \Delta[\%]^2 \qquad & \text{(11)} + \text{model="single-axis-tracking"} & \Rightarrow M[\%] = - 0.054 \Delta[\%] + 0.068 \Delta[\%]^2 \qquad & \text{(12)} \\ + 0.054 \Delta[\%] + 0.068 \Delta[\%]^2 \qquad & \text{(12)} where :math:`\Delta[\%]` is the Relative Mean Absolute Difference of the global irradiance, Eq. (4) of [1]_ and [2]_. From c7b94a086e97d4b5e73f619d726eaa26bf37f3d1 Mon Sep 17 00:00:00 2001 From: echedey-ls <80125792+echedey-ls@users.noreply.github.com> Date: Mon, 20 May 2024 08:44:09 +0200 Subject: [PATCH 27/82] Test exception --- pvlib/tests/test_pvsystem.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/pvlib/tests/test_pvsystem.py b/pvlib/tests/test_pvsystem.py index a0d3bf6fb0..86d7987ab6 100644 --- a/pvlib/tests/test_pvsystem.py +++ b/pvlib/tests/test_pvsystem.py @@ -2568,3 +2568,9 @@ def test_nonuniform_irradiance_deline_power_loss(): pd.Series(premise_rmads) ) assert isinstance(result_mms, pd.Series) + + # test raises error on inexistent model + with pytest.raises(ValueError, match="Invalid model 'foo'"): + pvsystem.nonuniform_irradiance_deline_power_loss( + premise_rmads, model="foo" + ) From 3599991799b494c22e2c4329079bb8ef9665f4de Mon Sep 17 00:00:00 2001 From: echedey-ls <80125792+echedey-ls@users.noreply.github.com> Date: Mon, 20 May 2024 09:23:22 +0200 Subject: [PATCH 28/82] Update pvsystem.py --- pvlib/pvsystem.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/pvlib/pvsystem.py b/pvlib/pvsystem.py index 48531d7086..37526744e7 100644 --- a/pvlib/pvsystem.py +++ b/pvlib/pvsystem.py @@ -3105,9 +3105,11 @@ def nonuniform_irradiance_deline_power_loss( See Also -------- + `solarfactors `_ + Calculate the irradiance at different points of the module. + `bifacial_radiance `_ + Calculate the irradiance at different points of the module. pvlib.pvsystem.combine_loss_factors - :ref:`solarfactors ` - :ref:`bifacial_radiance `. References ---------- From c9652256497c789f75b011810713ff3897e212c7 Mon Sep 17 00:00:00 2001 From: echedey-ls <80125792+echedey-ls@users.noreply.github.com> Date: Mon, 20 May 2024 12:01:21 +0200 Subject: [PATCH 29/82] Update plot_irradiance_nonuniformity_loss.py --- docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py b/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py index c37cdb1d6b..f60c59a1d3 100644 --- a/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py +++ b/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py @@ -139,8 +139,8 @@ def rmad(data, axis=None): mismatch_loss = nonuniform_irradiance_deline_power_loss(rmad_cells) -print(f"RMAD of the cells' irradiance: {rmad_cells}") -print(f"Power loss % due to the irradiance non-uniformity: {mismatch_loss}") +print(f"RMAD of the cells' irradiance: {rmad_cells:.3} [unitless]") +print(f"Power loss due to the irradiance non-uniformity: {mismatch_loss:.3%}") # %% # A practical approach From 0c1544343ccfaaf238229cd751e233d12ffc0b88 Mon Sep 17 00:00:00 2001 From: echedey-ls <80125792+echedey-ls@users.noreply.github.com> Date: Mon, 20 May 2024 19:41:00 +0200 Subject: [PATCH 30/82] Add fill factor ratio Co-Authored-By: Kevin Anderson <57452607+kandersolar@users.noreply.github.com> --- pvlib/pvsystem.py | 35 ++++++++++++++++++++++++++++------- pvlib/tests/test_pvsystem.py | 13 ++++++++++++- 2 files changed, 40 insertions(+), 8 deletions(-) diff --git a/pvlib/pvsystem.py b/pvlib/pvsystem.py index 37526744e7..3e8d478818 100644 --- a/pvlib/pvsystem.py +++ b/pvlib/pvsystem.py @@ -3037,6 +3037,7 @@ def nonuniform_irradiance_deline_power_loss( model: Literal[ "fixed-tilt", "single-axis-tracking" ] = "single-axis-tracking", + fillfactor_ratio: float = None, ): r""" Estimate the power loss due to irradiance non-uniformity. @@ -3045,7 +3046,13 @@ def nonuniform_irradiance_deline_power_loss( irradiance is less uniform due to mounting and site conditions. Depending on the mounting type, the power loss is estimated with either - equation (11) or (12) of [1]_. Passing the polynomial is also valid. + equation (11) or (12) of [1]_. Passing a custom polynomial is also valid. + + Use ``fillfactor_ratio`` to account for different fill factors between the + trained model and the module of interest. The fill factor used for + developing the models ``"single-axis-tracking" and "fixed-tilt"`` is + :math:`0.79`. For example, if the fill factor of the module of interest is + :math:`0.65`, then set ``fillfactor_ratio = 0.65 / 0.79``. .. versionadded:: 0.11.0 @@ -3063,11 +3070,18 @@ def nonuniform_irradiance_deline_power_loss( * ``"fixed-tilt"``: Eq. (11) of [1]_. * ``"single-axis-tracking"``: Eq. (12) of [1]_. - If a :py:`numpy.polynomial.Polynomial`, it is evaluated as is. + If a :py:`numpy:numpy.polynomial.Polynomial`, it is evaluated as is. + + If neither a string nor a ``Polynomial``, it must be a collection of + the coefficients of the model, where the first element is the constant + term and the last element is the highest order term. A + :py:`numpy:numpy.polynomial.Polynomial` will be created internally. - If neither a string nor a polynomial, it must be the coefficients of - polynomial model, with the first element being the constant term and - the last element the highest order term. + fillfactor_ratio : float, optional + The ratio of the fill factor of the module of interest to the fill + factor used for developing the models. Fill factor used for models + ``"single-axis-tracking"`` and ``"fixed-tilt"`` is 0.79. For a module + with fill factor 0.65, set ``fillfactor_ratio = 0.65 / 0.79``. Returns ------- @@ -3093,8 +3107,9 @@ def nonuniform_irradiance_deline_power_loss( output power: .. math:: + :eq: 1 - M[\%] = 1 - \frac{P_{Array}}{\sum P_{Cells}} + M[\%] = 1 - \frac{P_{Array}}{\sum P_{Cells}} It is recommended to see the example :ref:`sphx_glr_gallery_bifacial_plot_irradiance_nonuniformity_loss.py` @@ -3109,6 +3124,7 @@ def nonuniform_irradiance_deline_power_loss( Calculate the irradiance at different points of the module. `bifacial_radiance `_ Calculate the irradiance at different points of the module. + pvlib.pvsystem.combine_loss_factors References @@ -3135,6 +3151,11 @@ def nonuniform_irradiance_deline_power_loss( ) elif isinstance(model, np.polynomial.Polynomial): model_polynom = model - else: + else: # expect an iterable model_polynom = np.polynomial.Polynomial(coef=model) + + if fillfactor_ratio: # General fill factor ratio, so it's always used + # Eq. (9), [1] + model_polynom = model_polynom * fillfactor_ratio + return model_polynom(rmad) diff --git a/pvlib/tests/test_pvsystem.py b/pvlib/tests/test_pvsystem.py index 86d7987ab6..9feab511e5 100644 --- a/pvlib/tests/test_pvsystem.py +++ b/pvlib/tests/test_pvsystem.py @@ -2525,7 +2525,6 @@ def test_Array_temperature_missing_parameters(model, keys): def test_nonuniform_irradiance_deline_power_loss(): """tests pvsystem.nonuniform_irradiance_deline_power_loss""" - # TODO: improve premise_rmads = np.array([0.0, 0.05, 0.1, 0.15, 0.2, 0.25]) # default model result values expected_sat_mms = np.array( @@ -2569,6 +2568,18 @@ def test_nonuniform_irradiance_deline_power_loss(): ) assert isinstance(result_mms, pd.Series) + # test fillfactor_ratio + # straightforward + result_mms = pvsystem.nonuniform_irradiance_deline_power_loss( + premise_rmads, fillfactor_ratio=0.65/0.79 + ) + assert_allclose(result_mms, expected_sat_mms*0.65/0.79, atol=1e-5) + # with custom model + result_mms = pvsystem.nonuniform_irradiance_deline_power_loss( + premise_rmads, model=polynomial, fillfactor_ratio=0.24 + ) + assert_allclose(result_mms, (1+premise_rmads)*0.24, atol=1e-5) + # test raises error on inexistent model with pytest.raises(ValueError, match="Invalid model 'foo'"): pvsystem.nonuniform_irradiance_deline_power_loss( From d14118972d836b80ad3b69f34bdb09a7a6579824 Mon Sep 17 00:00:00 2001 From: echedey-ls <80125792+echedey-ls@users.noreply.github.com> Date: Mon, 20 May 2024 19:42:10 +0200 Subject: [PATCH 31/82] =?UTF-8?q?=C2=AA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pvlib/pvsystem.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pvlib/pvsystem.py b/pvlib/pvsystem.py index 3e8d478818..a06cbb9e1e 100644 --- a/pvlib/pvsystem.py +++ b/pvlib/pvsystem.py @@ -3153,7 +3153,7 @@ def nonuniform_irradiance_deline_power_loss( model_polynom = model else: # expect an iterable model_polynom = np.polynomial.Polynomial(coef=model) - + if fillfactor_ratio: # General fill factor ratio, so it's always used # Eq. (9), [1] model_polynom = model_polynom * fillfactor_ratio From 8a19a4dca42d15e95aeff445ea9d48292feeaaa3 Mon Sep 17 00:00:00 2001 From: echedey-ls <80125792+echedey-ls@users.noreply.github.com> Date: Wed, 22 May 2024 00:25:35 +0200 Subject: [PATCH 32/82] Trying new things --- pvlib/pvsystem.py | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/pvlib/pvsystem.py b/pvlib/pvsystem.py index a06cbb9e1e..0f3c006588 100644 --- a/pvlib/pvsystem.py +++ b/pvlib/pvsystem.py @@ -3046,7 +3046,8 @@ def nonuniform_irradiance_deline_power_loss( irradiance is less uniform due to mounting and site conditions. Depending on the mounting type, the power loss is estimated with either - equation (11) or (12) of [1]_. Passing a custom polynomial is also valid. + equation :eq:`11` or :eq:`12` of [1]_. Passing a custom polynomial is also + possible. Use ``fillfactor_ratio`` to account for different fill factors between the trained model and the module of interest. The fill factor used for @@ -3067,8 +3068,8 @@ def nonuniform_irradiance_deline_power_loss( The model coefficients to use. If a string, it must be one of the following: - * ``"fixed-tilt"``: Eq. (11) of [1]_. - * ``"single-axis-tracking"``: Eq. (12) of [1]_. + * ``"fixed-tilt"``: Eq. :eq:`11` of [1]_. + * ``"single-axis-tracking"``: Eq. :eq:`12` of [1]_. If a :py:`numpy:numpy.polynomial.Polynomial`, it is evaluated as is. @@ -3090,20 +3091,24 @@ def nonuniform_irradiance_deline_power_loss( Notes ----- - The models implemented are equations (11) and (12) of [1]_: + The models implemented are equations :eq:`11` and :eq:`12` of [1]_: .. math:: + :eq: 11 \text{model="fixed-tilt"} & \Rightarrow M[\%] = - 0.142 \Delta[\%] + 0.032 \Delta[\%]^2 \qquad & \text{(11)} + 0.142 \Delta[\%] + 0.032 \Delta[\%]^2 + + .. math:: + :eq: 12 \text{model="single-axis-tracking"} & \Rightarrow M[\%] = - 0.054 \Delta[\%] + 0.068 \Delta[\%]^2 \qquad & \text{(12)} + 0.054 \Delta[\%] + 0.068 \Delta[\%]^2 where :math:`\Delta[\%]` is the Relative Mean Absolute Difference of the global irradiance, Eq. (4) of [1]_ and [2]_. - The losses definition is Eq. (1) of [1]_, and it's defined as a loss of the + The losses definition is Eq. :eq:`1` of [1]_, and it's defined as a loss of the output power: .. math:: @@ -3120,13 +3125,12 @@ def nonuniform_irradiance_deline_power_loss( See Also -------- + pvlib.pvsystem.combine_loss_factors `solarfactors `_ Calculate the irradiance at different points of the module. `bifacial_radiance `_ Calculate the irradiance at different points of the module. - pvlib.pvsystem.combine_loss_factors - References ---------- .. [1] C. Deline, S. Ayala Pelaez, S. MacAlpine, and C. Olalla, 'Estimating From c32f78a5aad2d634d91703f75c6a579f11e53e10 Mon Sep 17 00:00:00 2001 From: echedey-ls <80125792+echedey-ls@users.noreply.github.com> Date: Wed, 22 May 2024 00:52:26 +0200 Subject: [PATCH 33/82] Revert "Trying new things" This reverts commit 8a19a4dca42d15e95aeff445ea9d48292feeaaa3. --- pvlib/pvsystem.py | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/pvlib/pvsystem.py b/pvlib/pvsystem.py index 0f3c006588..a06cbb9e1e 100644 --- a/pvlib/pvsystem.py +++ b/pvlib/pvsystem.py @@ -3046,8 +3046,7 @@ def nonuniform_irradiance_deline_power_loss( irradiance is less uniform due to mounting and site conditions. Depending on the mounting type, the power loss is estimated with either - equation :eq:`11` or :eq:`12` of [1]_. Passing a custom polynomial is also - possible. + equation (11) or (12) of [1]_. Passing a custom polynomial is also valid. Use ``fillfactor_ratio`` to account for different fill factors between the trained model and the module of interest. The fill factor used for @@ -3068,8 +3067,8 @@ def nonuniform_irradiance_deline_power_loss( The model coefficients to use. If a string, it must be one of the following: - * ``"fixed-tilt"``: Eq. :eq:`11` of [1]_. - * ``"single-axis-tracking"``: Eq. :eq:`12` of [1]_. + * ``"fixed-tilt"``: Eq. (11) of [1]_. + * ``"single-axis-tracking"``: Eq. (12) of [1]_. If a :py:`numpy:numpy.polynomial.Polynomial`, it is evaluated as is. @@ -3091,24 +3090,20 @@ def nonuniform_irradiance_deline_power_loss( Notes ----- - The models implemented are equations :eq:`11` and :eq:`12` of [1]_: + The models implemented are equations (11) and (12) of [1]_: .. math:: - :eq: 11 \text{model="fixed-tilt"} & \Rightarrow M[\%] = - 0.142 \Delta[\%] + 0.032 \Delta[\%]^2 - - .. math:: - :eq: 12 + 0.142 \Delta[\%] + 0.032 \Delta[\%]^2 \qquad & \text{(11)} \text{model="single-axis-tracking"} & \Rightarrow M[\%] = - 0.054 \Delta[\%] + 0.068 \Delta[\%]^2 + 0.054 \Delta[\%] + 0.068 \Delta[\%]^2 \qquad & \text{(12)} where :math:`\Delta[\%]` is the Relative Mean Absolute Difference of the global irradiance, Eq. (4) of [1]_ and [2]_. - The losses definition is Eq. :eq:`1` of [1]_, and it's defined as a loss of the + The losses definition is Eq. (1) of [1]_, and it's defined as a loss of the output power: .. math:: @@ -3125,12 +3120,13 @@ def nonuniform_irradiance_deline_power_loss( See Also -------- - pvlib.pvsystem.combine_loss_factors `solarfactors `_ Calculate the irradiance at different points of the module. `bifacial_radiance `_ Calculate the irradiance at different points of the module. + pvlib.pvsystem.combine_loss_factors + References ---------- .. [1] C. Deline, S. Ayala Pelaez, S. MacAlpine, and C. Olalla, 'Estimating From 5f69b6dea56a8f6ba296d57100d82986e222f5db Mon Sep 17 00:00:00 2001 From: echedey-ls <80125792+echedey-ls@users.noreply.github.com> Date: Wed, 22 May 2024 00:53:02 +0200 Subject: [PATCH 34/82] Update pvsystem.py --- pvlib/pvsystem.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pvlib/pvsystem.py b/pvlib/pvsystem.py index a06cbb9e1e..922aded932 100644 --- a/pvlib/pvsystem.py +++ b/pvlib/pvsystem.py @@ -3120,13 +3120,14 @@ def nonuniform_irradiance_deline_power_loss( See Also -------- + pvlib.pvsystem.combine_loss_factors + `solarfactors `_ Calculate the irradiance at different points of the module. + `bifacial_radiance `_ Calculate the irradiance at different points of the module. - pvlib.pvsystem.combine_loss_factors - References ---------- .. [1] C. Deline, S. Ayala Pelaez, S. MacAlpine, and C. Olalla, 'Estimating From 4c354ea2e95c6a4062c41a146ac5dfe73b5d2e03 Mon Sep 17 00:00:00 2001 From: echedey-ls <80125792+echedey-ls@users.noreply.github.com> Date: Wed, 22 May 2024 01:06:29 +0200 Subject: [PATCH 35/82] :( --- pvlib/pvsystem.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pvlib/pvsystem.py b/pvlib/pvsystem.py index 922aded932..2285ca2017 100644 --- a/pvlib/pvsystem.py +++ b/pvlib/pvsystem.py @@ -3120,7 +3120,7 @@ def nonuniform_irradiance_deline_power_loss( See Also -------- - pvlib.pvsystem.combine_loss_factors + :py:func:`pvlib.pvsystem.combine_loss_factors` `solarfactors `_ Calculate the irradiance at different points of the module. From a2de16650b5e488653b4f61ad9db101e3e130b31 Mon Sep 17 00:00:00 2001 From: echedey-ls <80125792+echedey-ls@users.noreply.github.com> Date: Wed, 22 May 2024 01:11:42 +0200 Subject: [PATCH 36/82] :(( --- pvlib/pvsystem.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pvlib/pvsystem.py b/pvlib/pvsystem.py index 2285ca2017..9ba98239cd 100644 --- a/pvlib/pvsystem.py +++ b/pvlib/pvsystem.py @@ -3120,7 +3120,8 @@ def nonuniform_irradiance_deline_power_loss( See Also -------- - :py:func:`pvlib.pvsystem.combine_loss_factors` + pvlib.pvsystem.combine_loss_factors + Take into other losses. `solarfactors `_ Calculate the irradiance at different points of the module. From b572f455d4e6ca2ed06ad3c719355bf628a5da75 Mon Sep 17 00:00:00 2001 From: echedey-ls <80125792+echedey-ls@users.noreply.github.com> Date: Wed, 22 May 2024 02:07:36 +0200 Subject: [PATCH 37/82] I hope we dont miss that reference --- pvlib/pvsystem.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/pvlib/pvsystem.py b/pvlib/pvsystem.py index 9ba98239cd..b3dd1e4ced 100644 --- a/pvlib/pvsystem.py +++ b/pvlib/pvsystem.py @@ -3120,12 +3120,8 @@ def nonuniform_irradiance_deline_power_loss( See Also -------- - pvlib.pvsystem.combine_loss_factors - Take into other losses. - `solarfactors `_ Calculate the irradiance at different points of the module. - `bifacial_radiance `_ Calculate the irradiance at different points of the module. From 1b0565bd1f1a33441f031c88fff6fe1e530e926c Mon Sep 17 00:00:00 2001 From: echedey-ls <80125792+echedey-ls@users.noreply.github.com> Date: Wed, 22 May 2024 02:08:15 +0200 Subject: [PATCH 38/82] Update pvsystem.py --- pvlib/pvsystem.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pvlib/pvsystem.py b/pvlib/pvsystem.py index b3dd1e4ced..ee73fa0ef4 100644 --- a/pvlib/pvsystem.py +++ b/pvlib/pvsystem.py @@ -3107,9 +3107,8 @@ def nonuniform_irradiance_deline_power_loss( output power: .. math:: - :eq: 1 - M[\%] = 1 - \frac{P_{Array}}{\sum P_{Cells}} + M[\%] = 1 - \frac{P_{Array}}{\sum P_{Cells}} \qquad & \text{(1)} It is recommended to see the example :ref:`sphx_glr_gallery_bifacial_plot_irradiance_nonuniformity_loss.py` From 87f46f0a0fade0a1a4e0d3d0725f6ba559101c95 Mon Sep 17 00:00:00 2001 From: echedey-ls <80125792+echedey-ls@users.noreply.github.com> Date: Mon, 27 May 2024 18:42:10 +0200 Subject: [PATCH 39/82] Remove second section of the example --- .../plot_irradiance_nonuniformity_loss.py | 140 +----------------- pvlib/pvsystem.py | 23 ++- 2 files changed, 22 insertions(+), 141 deletions(-) diff --git a/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py b/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py index f60c59a1d3..b1b14891a8 100644 --- a/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py +++ b/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py @@ -22,14 +22,7 @@ # found that the RMAD was a better predictor of the mismatch loss. # # This example demonstrates how to model the irradiance non-uniformity loss -# due to different global irradiance levels on a bifacial PV module through -# two different approaches: -# -# - Given the irradiance levels of each cell in an instant, -# in the first section. -# - Modelling the irradiance non-uniformity RMAD through the day thanks to a -# mock-up horizontal axis tracker system, in the second section. -# See [2]_ and [3]_ for more information. +# from the irradiance levels of each cell in a PV module. # # The function # :py:func:`pvlib.pvsystem.nonuniform_irradiance_deline_power_loss` is @@ -43,21 +36,10 @@ # and parameterizing mismatch power loss in bifacial photovoltaic # systems', Progress in Photovoltaics: Research and Applications, vol. 28, # no. 7, pp. 691-703, 2020, :doi:`10.1002/pip.3259`. -# .. [2] C. Domínguez, J. Marcos, S. Ures, S. Askins, and I. Antón, 'A -# Horizontal Single-Axis Tracker Mock-Up to Quickly Assess the Influence -# of Geometrical Factors on Bifacial Energy Gain', in 2023 IEEE 50th -# Photovoltaic Specialists Conference (PVSC), Jun. 2023, pp. 1–3. -# :doi:`10.1109/PVSC48320.2023.10359580`. -# .. [3] C. Domínguez, J. Marcos, S. Ures, S. Askins, I. Antón, A Horizontal -# Single-Axis Tracker Mock-Up to Quickly Assess the Influence of Geometrical -# Factors on Bifacial Energy Gain. Zenodo, 2023. -# :doi:`10.5281/zenodo.11125039`. # # .. sectionauthor:: Echedey Luis import numpy as np -import pandas as pd -import scipy.stats import matplotlib.pyplot as plt from matplotlib.cm import ScalarMappable from matplotlib.colors import Normalize @@ -65,8 +47,8 @@ from pvlib.pvsystem import nonuniform_irradiance_deline_power_loss # %% -# Theoretical and straightforward problem -# --------------------------------------- +# Problem description +# ------------------- # Let's set a fixed irradiance to each cell row of the PV array with the values # described in Figure 1 (A), [1]_. We will cover this case for educational # purposes, although it can be achieved with the packages @@ -141,119 +123,3 @@ def rmad(data, axis=None): print(f"RMAD of the cells' irradiance: {rmad_cells:.3} [unitless]") print(f"Power loss due to the irradiance non-uniformity: {mismatch_loss:.3%}") - -# %% -# A practical approach -# -------------------- -# Instead of simulating or measuring the irradiance of each cell, RMAD trend -# through the day can be modelled. The remaining section of this example will -# cover the modelling of the global RMAD if the backside irradiance RMAD is -# known. Note these two RMADs are inherently different but are related. -# -# Here we will base our calculations on a horizontal single-axis tracking -# mockup developed by Domínguez et al. [2]_. -# The following image in [3]_ shows the backside irradiance non-uniformity of a -# HSAT mock-up system: -# -# .. figure:: ../../_images/Dominguez_et_al_PVSC2023.png -# :alt: Plot of backside reference cells of an HSAT mock-up and their RMAD. -# :align: center -# -# Blue dots represent the backside irradiance non-uniformity. -# *BE* stands for *backside east*. - - -def hsat_backside_rmad_model_through_day(hour): # TODO: REMOVE THIS - """Model of the blue dots in the image above.""" - # For demonstration purposes only. Model roughly fit to show an example of - # the RMAD variation through the day without including all the data. - # fmt: off - morning_polynom = [6.71787833e-02, -4.50442998e+00, 1.18114757e+02, - -1.51725679e+03, 9.56439547e+03, -2.36835920e+04] - afternoon_polynom = [7.14947943e-01, -6.02541075e+01, 2.02789031e+03, - -3.40677727e+04, 2.85671091e+05, -9.56469320e+05] - # fmt: on - day_rmad = np.where( - hour < 14.75, - np.polyval(morning_polynom, hour), - np.polyval(afternoon_polynom, hour), - ) - return day_rmad / 100 # RMAD is a percentage - - -# %% -# Calculating Global RMAD from Backside RMAD -# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -# -# .. note:: -# The global irradiance RMAD is different from the backside irradiance RMAD. -# -# The global irradiance is the sum of the front irradiance and the backside -# irradiance by the bifaciality factor, see equation (2) in [1]_. -# -# .. math:: -# -# G_{total,i} = G_{front,i} + \phi_{Bifi} G_{rear,i} -# -# where :math:`\phi_{Bifi}` is the bifaciality factor. -# -# Here we will model front and backside irradiances with normal distributions -# for simplicity, then calculate the global RMAD and plot the results. -# -# The backside irradiance is the one that presents the most significant -# non-uniformity. The front irradiance is way more uniform, so it will be -# neglected in this example. -# -# Let's calculate the **global RMAD** through the day - it's **different** from -# the backside RMAD since -# -# .. math:: -# -# RMAD(k \cdot X + c) = RMAD(X) \cdot k \frac{k \bar{X}}{k \bar{X} + c} -# = RMAD(X) \cdot k \frac{1}{1 + \frac{c}{k \bar{X}}} -# -# where :math:`X` is a random variable and :math:`k>0, c \neq \bar{X}` are -# constants (`source -# `_). - -times = pd.date_range("2023-06-06T09:30", "2023-06-06T18:30", freq="30min") -hours = times.hour + times.minute / 60 -bifaciality = 0.65 -front_irrad = scipy.stats.norm.pdf(hours, loc=12.5, scale=1600) -backside_irrad = scipy.stats.norm.pdf(hours, loc=12.5, scale=180) - -global_irrad = front_irrad + bifaciality * backside_irrad -# See RMAD properties above -# Here we calculate RMAD(global_irrad) -# backside_irrad := X, bifaciality := k, front_irrad := c -backside_rmad = hsat_backside_rmad_model_through_day(hours) -global_rmad = ( - backside_rmad - * bifaciality - / (1 + front_irrad / backside_irrad / bifaciality) -) - -# Get the mismatch loss -mismatch_loss = nonuniform_irradiance_deline_power_loss(global_rmad) - -# Plot results -fig, ax1 = plt.subplots() -fig.suptitle("Irradiance RMAD and Mismatch Losses") - -ax1.plot(hours, global_rmad, label="RMAD: global", color="k") -ax1.plot( - hours, backside_rmad, label="RMAD: backside", color="b", linestyle="--" -) -ax1.set_xlabel("Hour of the day") -ax1.set_ylabel("RMAD") -ax1.legend(loc="upper left") - -ax2 = ax1.twinx() -ax2.plot( - hours, mismatch_loss, label="Mismatch loss", color="red", linestyle=":" -) -ax2.grid() -ax2.legend(loc="upper right") -ax2.set_ylabel("Mismatch loss") - -fig.show() diff --git a/pvlib/pvsystem.py b/pvlib/pvsystem.py index ee73fa0ef4..b82f624f71 100644 --- a/pvlib/pvsystem.py +++ b/pvlib/pvsystem.py @@ -3110,13 +3110,28 @@ def nonuniform_irradiance_deline_power_loss( M[\%] = 1 - \frac{P_{Array}}{\sum P_{Cells}} \qquad & \text{(1)} - It is recommended to see the example - :ref:`sphx_glr_gallery_bifacial_plot_irradiance_nonuniformity_loss.py` - for a complete use case and the RMAD function implementation. - In the section *See Also*, you will find two packages that can be used to calculate the irradiance at different points of the module. + .. note:: + The global irradiance RMAD is different from the backside irradiance + RMAD. + + In case the RMAD of the backside irradiance is known, the global RMAD can + be calculated as follows, assuming the front irradiance RMAD is + negligible [2]_: + + .. math:: + + RMAD(k \cdot X + c) = RMAD(X) \cdot k \frac{k \bar{X}}{k \bar{X} + c} + = RMAD(X) \cdot k \frac{1}{1 + \frac{c}{k \bar{X}}} + + by similarity with equation (2) of [1]_: + + .. math:: + + G_{total\,i} = G_{front\i} + \phi_{Bifi} G_{rear,i} + See Also -------- `solarfactors `_ From ae775eca3dacd822bcc4fdd06bd7c6c09b273c57 Mon Sep 17 00:00:00 2001 From: echedey-ls <80125792+echedey-ls@users.noreply.github.com> Date: Mon, 27 May 2024 22:20:20 +0200 Subject: [PATCH 40/82] Minor text upgrade --- docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py b/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py index b1b14891a8..104e66e9bb 100644 --- a/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py +++ b/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py @@ -11,8 +11,9 @@ # When each cell works at different irradiance levels, the power produced by # the module is less than the sum of the power produced by each cell since the # maximum power point of each cell is different, but cells connected in series -# will operate at the same current. This is known as irradiance non-uniformity -# loss. +# will operate at the same current. In that case, a deviation is found +# between the MPP and the working point of the cells. +# This is known as irradiance non-uniformity loss. # # Calculating the IV curve of each cell and then matching the working point of # the whole module is computationally expensive, so a model to account for this From 1906e208514c275ae3245d50dc4416df5d091736 Mon Sep 17 00:00:00 2001 From: echedey-ls <80125792+echedey-ls@users.noreply.github.com> Date: Mon, 27 May 2024 22:59:13 +0200 Subject: [PATCH 41/82] Update pvsystem.py --- pvlib/pvsystem.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pvlib/pvsystem.py b/pvlib/pvsystem.py index 01748b1bdc..e63c85c79f 100644 --- a/pvlib/pvsystem.py +++ b/pvlib/pvsystem.py @@ -3131,7 +3131,7 @@ def nonuniform_irradiance_deline_power_loss( .. math:: - G_{total\,i} = G_{front\i} + \phi_{Bifi} G_{rear,i} + G_{total\,i} = G_{front\,i} + \phi_{Bifi} G_{rear\,i} See Also -------- From f5863cee07786eb3c63c7d44f99250843942ba5c Mon Sep 17 00:00:00 2001 From: echedey-ls <80125792+echedey-ls@users.noreply.github.com> Date: Tue, 28 May 2024 23:03:16 +0200 Subject: [PATCH 42/82] Port to namespace `pvlib.bifacial` Co-Authored-By: Cliff Hansen <5393711+cwhanse@users.noreply.github.com> --- .../plot_irradiance_nonuniformity_loss.py | 6 +- .../loss-models.rst | 2 +- docs/sphinx/source/whatsnew/v0.11.0.rst | 2 +- pvlib/bifacial/__init__.py | 1 + pvlib/bifacial/losses_models.py | 144 ++++++++++++++++++ pvlib/pvsystem.py | 141 ----------------- pvlib/tests/bifacial/test_losses_models.py | 70 +++++++++ pvlib/tests/test_pvsystem.py | 64 -------- 8 files changed, 220 insertions(+), 210 deletions(-) create mode 100644 pvlib/bifacial/losses_models.py create mode 100644 pvlib/tests/bifacial/test_losses_models.py diff --git a/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py b/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py index 104e66e9bb..a61507c354 100644 --- a/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py +++ b/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py @@ -26,7 +26,7 @@ # from the irradiance levels of each cell in a PV module. # # The function -# :py:func:`pvlib.pvsystem.nonuniform_irradiance_deline_power_loss` is +# :py:func:`pvlib.bifacial.nonuniform_irradiance_deline_power_loss` is # used to transform the Relative Mean Absolute Difference (RMAD) of the # irradiance into a power loss percentage. Down below you will find a # numpy-based implementation of the RMAD function. @@ -45,7 +45,7 @@ from matplotlib.cm import ScalarMappable from matplotlib.colors import Normalize -from pvlib.pvsystem import nonuniform_irradiance_deline_power_loss +from pvlib.bifacial import nonuniform_irradiance_deline_power_loss # %% # Problem description @@ -118,7 +118,7 @@ def rmad(data, axis=None): # ^^^^^^^^^^^^^ # Calculate the power loss percentage due to the irradiance non-uniformity # with the function -# :py:func:`pvlib.pvsystem.nonuniform_irradiance_deline_power_loss`. +# :py:func:`pvlib.bifacial.nonuniform_irradiance_deline_power_loss`. mismatch_loss = nonuniform_irradiance_deline_power_loss(rmad_cells) diff --git a/docs/sphinx/source/reference/effects_on_pv_system_output/loss-models.rst b/docs/sphinx/source/reference/effects_on_pv_system_output/loss-models.rst index 035407d847..20d7157e6b 100644 --- a/docs/sphinx/source/reference/effects_on_pv_system_output/loss-models.rst +++ b/docs/sphinx/source/reference/effects_on_pv_system_output/loss-models.rst @@ -8,4 +8,4 @@ Loss models pvsystem.combine_loss_factors pvsystem.dc_ohms_from_percent - pvsystem.nonuniform_irradiance_deline_power_loss + bifacial.nonuniform_irradiance_deline_power_loss diff --git a/docs/sphinx/source/whatsnew/v0.11.0.rst b/docs/sphinx/source/whatsnew/v0.11.0.rst index a65acdb4de..1afde21e6a 100644 --- a/docs/sphinx/source/whatsnew/v0.11.0.rst +++ b/docs/sphinx/source/whatsnew/v0.11.0.rst @@ -22,7 +22,7 @@ Enhancements fixed-tilt and one-axis tracking systems. (:issue:`1689`, :pull:`1725`, :pull:`1962`) * Add new losses function that accounts for non-uniform irradiance of bifacial - modules, :py:func:`pvlib.pvsystem.nonuniform_irradiance_deline_power_loss`. + modules, :py:func:`pvlib.bifacial.nonuniform_irradiance_deline_power_loss`. (:issue:`2045`, :pr:`2046`) diff --git a/pvlib/bifacial/__init__.py b/pvlib/bifacial/__init__.py index 0a6b98d4f5..a882c0c862 100644 --- a/pvlib/bifacial/__init__.py +++ b/pvlib/bifacial/__init__.py @@ -5,6 +5,7 @@ """ from pvlib._deprecation import deprecated from pvlib.bifacial import pvfactors, infinite_sheds, utils # noqa: F401 +from .losses_models import nonuniform_irradiance_deline_power_loss # noqa: F401 pvfactors_timeseries = deprecated( since='0.9.1', diff --git a/pvlib/bifacial/losses_models.py b/pvlib/bifacial/losses_models.py new file mode 100644 index 0000000000..54c26eced0 --- /dev/null +++ b/pvlib/bifacial/losses_models.py @@ -0,0 +1,144 @@ +import numpy as np + +from typing import Literal + + +def nonuniform_irradiance_deline_power_loss( + rmad, + model: Literal[ + "fixed-tilt", "single-axis-tracking" + ] = "single-axis-tracking", + fillfactor_ratio: float = None, +): + r""" + Estimate the power loss due to irradiance non-uniformity. + + This model is described for bifacial modules in [1]_, where the backside + irradiance is less uniform due to mounting and site conditions. + + Depending on the mounting type, the power loss is estimated with either + equation (11) or (12) of [1]_. Passing a custom polynomial is also valid. + + Use ``fillfactor_ratio`` to account for different fill factors between the + trained model and the module of interest. The fill factor used for + developing the models ``"single-axis-tracking" and "fixed-tilt"`` is + :math:`0.79`. For example, if the fill factor of the module of interest is + :math:`0.65`, then set ``fillfactor_ratio = 0.65 / 0.79``. + + .. versionadded:: 0.11.0 + + Parameters + ---------- + rmad : numeric + The Relative Mean Absolute Difference of the irradiance. + See the definition in [2]_ and the example + :ref:`sphx_glr_gallery_bifacial_plot_irradiance_nonuniformity_loss.py`. + + model : str, numpy.polynomial.Polynom or list, default ``"single-axis-tracking"`` + The model coefficients to use. + If a string, it must be one of the following: + + * ``"fixed-tilt"``: Eq. (11) of [1]_. + * ``"single-axis-tracking"``: Eq. (12) of [1]_. + + If a :py:`numpy:numpy.polynomial.Polynomial`, it is evaluated as is. + + If neither a string nor a ``Polynomial``, it must be a collection of + the coefficients of the model, where the first element is the constant + term and the last element is the highest order term. A + :py:`numpy:numpy.polynomial.Polynomial` will be created internally. + + fillfactor_ratio : float, optional + The ratio of the fill factor of the module of interest to the fill + factor used for developing the models. Fill factor used for models + ``"single-axis-tracking"`` and ``"fixed-tilt"`` is 0.79. For a module + with fill factor 0.65, set ``fillfactor_ratio = 0.65 / 0.79``. + + Returns + ------- + loss : numeric + The power loss. + + Notes + ----- + The models implemented are equations (11) and (12) of [1]_: + + .. math:: + + \text{model="fixed-tilt"} & \Rightarrow M[\%] = + 0.142 \Delta[\%] + 0.032 \Delta[\%]^2 \qquad & \text{(11)} + + \text{model="single-axis-tracking"} & \Rightarrow M[\%] = + 0.054 \Delta[\%] + 0.068 \Delta[\%]^2 \qquad & \text{(12)} + + where :math:`\Delta[\%]` is the Relative Mean Absolute Difference of the + global irradiance, Eq. (4) of [1]_ and [2]_. + + The losses definition is Eq. (1) of [1]_, and it's defined as a loss of the + output power: + + .. math:: + + M[\%] = 1 - \frac{P_{Array}}{\sum P_{Cells}} \qquad & \text{(1)} + + In the section *See Also*, you will find two packages that can be used to + calculate the irradiance at different points of the module. + + .. note:: + The global irradiance RMAD is different from the backside irradiance + RMAD. + + In case the RMAD of the backside irradiance is known, the global RMAD can + be calculated as follows, assuming the front irradiance RMAD is + negligible [2]_: + + .. math:: + + RMAD(k \cdot X + c) = RMAD(X) \cdot k \frac{k \bar{X}}{k \bar{X} + c} + = RMAD(X) \cdot k \frac{1}{1 + \frac{c}{k \bar{X}}} + + by similarity with equation (2) of [1]_: + + .. math:: + + G_{total\,i} = G_{front\,i} + \phi_{Bifi} G_{rear\,i} + + See Also + -------- + `solarfactors `_ + Calculate the irradiance at different points of the module. + `bifacial_radiance `_ + Calculate the irradiance at different points of the module. + + References + ---------- + .. [1] C. Deline, S. Ayala Pelaez, S. MacAlpine, and C. Olalla, 'Estimating + and parameterizing mismatch power loss in bifacial photovoltaic + systems', Progress in Photovoltaics: Research and Applications, vol. 28, + no. 7, pp. 691-703, 2020, :doi:`10.1002/pip.3259`. + .. [2] “Mean absolute difference,” Wikipedia, Sep. 05, 2023. + https://en.wikipedia.org/wiki/Mean_absolute_difference#Relative_mean_absolute_difference + (accessed 2024-04-14). + """ # noqa: E501 + if isinstance(model, str): + _MODEL_POLYNOMS = { + "fixed-tilt": [0, 0.142, 0.032], # Eq. (11), [1] + "single-axis-tracking": [0, 0.054, 0.068], # Eq. (12), [1] + } + try: + model_polynom = np.polynomial.Polynomial(_MODEL_POLYNOMS[model]) + except KeyError: + raise ValueError( + f"Invalid model '{model}'. Available models are " + f"{list(_MODEL_POLYNOMS.keys())}." + ) + elif isinstance(model, np.polynomial.Polynomial): + model_polynom = model + else: # expect an iterable + model_polynom = np.polynomial.Polynomial(coef=model) + + if fillfactor_ratio: # General fill factor ratio, so it's always used + # Eq. (9), [1] + model_polynom = model_polynom * fillfactor_ratio + + return model_polynom(rmad) diff --git a/pvlib/pvsystem.py b/pvlib/pvsystem.py index e63c85c79f..ebb5aa7f88 100644 --- a/pvlib/pvsystem.py +++ b/pvlib/pvsystem.py @@ -3031,144 +3031,3 @@ def combine_loss_factors(index, *losses, fill_method='ffill'): combined_factor *= (1 - loss) return 1 - combined_factor - - -def nonuniform_irradiance_deline_power_loss( - rmad, - model: Literal[ - "fixed-tilt", "single-axis-tracking" - ] = "single-axis-tracking", - fillfactor_ratio: float = None, -): - r""" - Estimate the power loss due to irradiance non-uniformity. - - This model is described for bifacial modules in [1]_, where the backside - irradiance is less uniform due to mounting and site conditions. - - Depending on the mounting type, the power loss is estimated with either - equation (11) or (12) of [1]_. Passing a custom polynomial is also valid. - - Use ``fillfactor_ratio`` to account for different fill factors between the - trained model and the module of interest. The fill factor used for - developing the models ``"single-axis-tracking" and "fixed-tilt"`` is - :math:`0.79`. For example, if the fill factor of the module of interest is - :math:`0.65`, then set ``fillfactor_ratio = 0.65 / 0.79``. - - .. versionadded:: 0.11.0 - - Parameters - ---------- - rmad : numeric - The Relative Mean Absolute Difference of the irradiance. - See the definition in [2]_ and the example - :ref:`sphx_glr_gallery_bifacial_plot_irradiance_nonuniformity_loss.py`. - - model : str, numpy.polynomial.Polynom or list, default ``"single-axis-tracking"`` - The model coefficients to use. - If a string, it must be one of the following: - - * ``"fixed-tilt"``: Eq. (11) of [1]_. - * ``"single-axis-tracking"``: Eq. (12) of [1]_. - - If a :py:`numpy:numpy.polynomial.Polynomial`, it is evaluated as is. - - If neither a string nor a ``Polynomial``, it must be a collection of - the coefficients of the model, where the first element is the constant - term and the last element is the highest order term. A - :py:`numpy:numpy.polynomial.Polynomial` will be created internally. - - fillfactor_ratio : float, optional - The ratio of the fill factor of the module of interest to the fill - factor used for developing the models. Fill factor used for models - ``"single-axis-tracking"`` and ``"fixed-tilt"`` is 0.79. For a module - with fill factor 0.65, set ``fillfactor_ratio = 0.65 / 0.79``. - - Returns - ------- - loss : numeric - The power loss. - - Notes - ----- - The models implemented are equations (11) and (12) of [1]_: - - .. math:: - - \text{model="fixed-tilt"} & \Rightarrow M[\%] = - 0.142 \Delta[\%] + 0.032 \Delta[\%]^2 \qquad & \text{(11)} - - \text{model="single-axis-tracking"} & \Rightarrow M[\%] = - 0.054 \Delta[\%] + 0.068 \Delta[\%]^2 \qquad & \text{(12)} - - where :math:`\Delta[\%]` is the Relative Mean Absolute Difference of the - global irradiance, Eq. (4) of [1]_ and [2]_. - - The losses definition is Eq. (1) of [1]_, and it's defined as a loss of the - output power: - - .. math:: - - M[\%] = 1 - \frac{P_{Array}}{\sum P_{Cells}} \qquad & \text{(1)} - - In the section *See Also*, you will find two packages that can be used to - calculate the irradiance at different points of the module. - - .. note:: - The global irradiance RMAD is different from the backside irradiance - RMAD. - - In case the RMAD of the backside irradiance is known, the global RMAD can - be calculated as follows, assuming the front irradiance RMAD is - negligible [2]_: - - .. math:: - - RMAD(k \cdot X + c) = RMAD(X) \cdot k \frac{k \bar{X}}{k \bar{X} + c} - = RMAD(X) \cdot k \frac{1}{1 + \frac{c}{k \bar{X}}} - - by similarity with equation (2) of [1]_: - - .. math:: - - G_{total\,i} = G_{front\,i} + \phi_{Bifi} G_{rear\,i} - - See Also - -------- - `solarfactors `_ - Calculate the irradiance at different points of the module. - `bifacial_radiance `_ - Calculate the irradiance at different points of the module. - - References - ---------- - .. [1] C. Deline, S. Ayala Pelaez, S. MacAlpine, and C. Olalla, 'Estimating - and parameterizing mismatch power loss in bifacial photovoltaic - systems', Progress in Photovoltaics: Research and Applications, vol. 28, - no. 7, pp. 691-703, 2020, :doi:`10.1002/pip.3259`. - .. [2] “Mean absolute difference,” Wikipedia, Sep. 05, 2023. - https://en.wikipedia.org/wiki/Mean_absolute_difference#Relative_mean_absolute_difference - (accessed 2024-04-14). - """ # noqa: E501 - if isinstance(model, str): - _MODEL_POLYNOMS = { - "fixed-tilt": [0, 0.142, 0.032], # Eq. (11), [1] - "single-axis-tracking": [0, 0.054, 0.068], # Eq. (12), [1] - } - try: - model_polynom = np.polynomial.Polynomial(_MODEL_POLYNOMS[model]) - except KeyError: - raise ValueError( - f"Invalid model '{model}'. Available models are " - f"{list(_MODEL_POLYNOMS.keys())}." - ) - elif isinstance(model, np.polynomial.Polynomial): - model_polynom = model - else: # expect an iterable - model_polynom = np.polynomial.Polynomial(coef=model) - - if fillfactor_ratio: # General fill factor ratio, so it's always used - # Eq. (9), [1] - model_polynom = model_polynom * fillfactor_ratio - - return model_polynom(rmad) diff --git a/pvlib/tests/bifacial/test_losses_models.py b/pvlib/tests/bifacial/test_losses_models.py new file mode 100644 index 0000000000..7b5a0a1ca1 --- /dev/null +++ b/pvlib/tests/bifacial/test_losses_models.py @@ -0,0 +1,70 @@ +from pvlib import bifacial + +import pandas as pd +import numpy as np +from numpy.testing import assert_allclose + +import pytest + +def test_nonuniform_irradiance_deline_power_loss(): + """tests bifacial.nonuniform_irradiance_deline_power_loss""" + premise_rmads = np.array([0.0, 0.05, 0.1, 0.15, 0.2, 0.25]) + # default model result values + expected_sat_mms = np.array( + [0.0, 0.00287, 0.00608, 0.00963, 0.01352, 0.01775] + ) + result_def_mms = bifacial.nonuniform_irradiance_deline_power_loss( + premise_rmads + ) + assert_allclose(result_def_mms, expected_sat_mms, atol=1e-5) + assert np.all(np.diff(result_def_mms) > 0) # higher RMADs => higher losses + # default model matches single-axis tracker + result_sat_mms = bifacial.nonuniform_irradiance_deline_power_loss( + premise_rmads, model="single-axis-tracking" + ) + assert_allclose(result_sat_mms, expected_sat_mms) + # fixed-tilt model result values + expected_ft_mms = np.array( + [0.0, 0.00718, 0.01452, 0.02202, 0.02968, 0.0375] + ) + result_ft_mms = bifacial.nonuniform_irradiance_deline_power_loss( + premise_rmads, model="fixed-tilt" + ) + assert_allclose(result_ft_mms, expected_ft_mms) + assert np.all(np.diff(result_ft_mms) > 0) # higher RMADs => higher losses + # test custom coefficients, set model to 1+1*RMAD + # as Polynomial class + polynomial = np.polynomial.Polynomial([1, 1, 0]) + result_custom_mms = bifacial.nonuniform_irradiance_deline_power_loss( + premise_rmads, model=polynomial + ) + assert_allclose(result_custom_mms, 1+premise_rmads) + # as list + result_custom_mms = bifacial.nonuniform_irradiance_deline_power_loss( + premise_rmads, model=[1, 1, 0] + ) + assert_allclose(result_custom_mms, 1+premise_rmads) + + # test datatypes IO with Series + result_mms = bifacial.nonuniform_irradiance_deline_power_loss( + pd.Series(premise_rmads) + ) + assert isinstance(result_mms, pd.Series) + + # test fillfactor_ratio + # straightforward + result_mms = bifacial.nonuniform_irradiance_deline_power_loss( + premise_rmads, fillfactor_ratio=0.65/0.79 + ) + assert_allclose(result_mms, expected_sat_mms*0.65/0.79, atol=1e-5) + # with custom model + result_mms = bifacial.nonuniform_irradiance_deline_power_loss( + premise_rmads, model=polynomial, fillfactor_ratio=0.24 + ) + assert_allclose(result_mms, (1+premise_rmads)*0.24, atol=1e-5) + + # test raises error on inexistent model + with pytest.raises(ValueError, match="Invalid model 'foo'"): + bifacial.nonuniform_irradiance_deline_power_loss( + premise_rmads, model="foo" + ) diff --git a/pvlib/tests/test_pvsystem.py b/pvlib/tests/test_pvsystem.py index 9feab511e5..f193a16e95 100644 --- a/pvlib/tests/test_pvsystem.py +++ b/pvlib/tests/test_pvsystem.py @@ -2521,67 +2521,3 @@ def test_Array_temperature_missing_parameters(model, keys): array.temperature_model_parameters = params with pytest.raises(KeyError, match=match): array.get_cell_temperature(irrads, temps, winds, model) - - -def test_nonuniform_irradiance_deline_power_loss(): - """tests pvsystem.nonuniform_irradiance_deline_power_loss""" - premise_rmads = np.array([0.0, 0.05, 0.1, 0.15, 0.2, 0.25]) - # default model result values - expected_sat_mms = np.array( - [0.0, 0.00287, 0.00608, 0.00963, 0.01352, 0.01775] - ) - result_def_mms = pvsystem.nonuniform_irradiance_deline_power_loss( - premise_rmads - ) - assert_allclose(result_def_mms, expected_sat_mms, atol=1e-5) - assert np.all(np.diff(result_def_mms) > 0) # higher RMADs => higher losses - # default model matches single-axis tracker - result_sat_mms = pvsystem.nonuniform_irradiance_deline_power_loss( - premise_rmads, model="single-axis-tracking" - ) - assert_allclose(result_sat_mms, expected_sat_mms) - # fixed-tilt model result values - expected_ft_mms = np.array( - [0.0, 0.00718, 0.01452, 0.02202, 0.02968, 0.0375] - ) - result_ft_mms = pvsystem.nonuniform_irradiance_deline_power_loss( - premise_rmads, model="fixed-tilt" - ) - assert_allclose(result_ft_mms, expected_ft_mms) - assert np.all(np.diff(result_ft_mms) > 0) # higher RMADs => higher losses - # test custom coefficients, set model to 1+1*RMAD - # as Polynomial class - polynomial = np.polynomial.Polynomial([1, 1, 0]) - result_custom_mms = pvsystem.nonuniform_irradiance_deline_power_loss( - premise_rmads, model=polynomial - ) - assert_allclose(result_custom_mms, 1+premise_rmads) - # as list - result_custom_mms = pvsystem.nonuniform_irradiance_deline_power_loss( - premise_rmads, model=[1, 1, 0] - ) - assert_allclose(result_custom_mms, 1+premise_rmads) - - # test datatypes IO with Series - result_mms = pvsystem.nonuniform_irradiance_deline_power_loss( - pd.Series(premise_rmads) - ) - assert isinstance(result_mms, pd.Series) - - # test fillfactor_ratio - # straightforward - result_mms = pvsystem.nonuniform_irradiance_deline_power_loss( - premise_rmads, fillfactor_ratio=0.65/0.79 - ) - assert_allclose(result_mms, expected_sat_mms*0.65/0.79, atol=1e-5) - # with custom model - result_mms = pvsystem.nonuniform_irradiance_deline_power_loss( - premise_rmads, model=polynomial, fillfactor_ratio=0.24 - ) - assert_allclose(result_mms, (1+premise_rmads)*0.24, atol=1e-5) - - # test raises error on inexistent model - with pytest.raises(ValueError, match="Invalid model 'foo'"): - pvsystem.nonuniform_irradiance_deline_power_loss( - premise_rmads, model="foo" - ) From a7d3f7e2918bd35b647431c1941efb417f8d9fb1 Mon Sep 17 00:00:00 2001 From: echedey-ls <80125792+echedey-ls@users.noreply.github.com> Date: Tue, 28 May 2024 23:07:12 +0200 Subject: [PATCH 43/82] Rename to ``power_mismatch_deline``, document in ``bifacial.rst`` Co-Authored-By: Cliff Hansen <5393711+cwhanse@users.noreply.github.com> --- .../plot_irradiance_nonuniformity_loss.py | 8 ++-- docs/sphinx/source/reference/bifacial.rst | 7 ++++ .../loss-models.rst | 1 - docs/sphinx/source/whatsnew/v0.11.0.rst | 2 +- pvlib/bifacial/__init__.py | 15 ++++--- pvlib/bifacial/losses_models.py | 2 +- pvlib/tests/bifacial/test_losses_models.py | 39 ++++++++----------- 7 files changed, 37 insertions(+), 37 deletions(-) diff --git a/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py b/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py index a61507c354..e8063d95f4 100644 --- a/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py +++ b/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py @@ -26,7 +26,7 @@ # from the irradiance levels of each cell in a PV module. # # The function -# :py:func:`pvlib.bifacial.nonuniform_irradiance_deline_power_loss` is +# :py:func:`pvlib.bifacial.power_mismatch_deline ` is # used to transform the Relative Mean Absolute Difference (RMAD) of the # irradiance into a power loss percentage. Down below you will find a # numpy-based implementation of the RMAD function. @@ -45,7 +45,7 @@ from matplotlib.cm import ScalarMappable from matplotlib.colors import Normalize -from pvlib.bifacial import nonuniform_irradiance_deline_power_loss +from pvlib.bifacial import power_mismatch_deline # %% # Problem description @@ -118,9 +118,9 @@ def rmad(data, axis=None): # ^^^^^^^^^^^^^ # Calculate the power loss percentage due to the irradiance non-uniformity # with the function -# :py:func:`pvlib.bifacial.nonuniform_irradiance_deline_power_loss`. +# :py:func:`pvlib.bifacial.power_mismatch_deline `. -mismatch_loss = nonuniform_irradiance_deline_power_loss(rmad_cells) +mismatch_loss = power_mismatch_deline(rmad_cells) print(f"RMAD of the cells' irradiance: {rmad_cells:.3} [unitless]") print(f"Power loss due to the irradiance non-uniformity: {mismatch_loss:.3%}") diff --git a/docs/sphinx/source/reference/bifacial.rst b/docs/sphinx/source/reference/bifacial.rst index 6405fe4afc..49f7967e33 100644 --- a/docs/sphinx/source/reference/bifacial.rst +++ b/docs/sphinx/source/reference/bifacial.rst @@ -12,6 +12,13 @@ Functions for calculating front and back surface irradiance bifacial.infinite_sheds.get_irradiance bifacial.infinite_sheds.get_irradiance_poa +Losses models that are specific to bifacial PV systems + +.. autosummary:: + :toctree: generated/ + + bifacial.power_mismatch_deline + Utility functions for bifacial modeling .. autosummary:: diff --git a/docs/sphinx/source/reference/effects_on_pv_system_output/loss-models.rst b/docs/sphinx/source/reference/effects_on_pv_system_output/loss-models.rst index 20d7157e6b..6897f12283 100644 --- a/docs/sphinx/source/reference/effects_on_pv_system_output/loss-models.rst +++ b/docs/sphinx/source/reference/effects_on_pv_system_output/loss-models.rst @@ -8,4 +8,3 @@ Loss models pvsystem.combine_loss_factors pvsystem.dc_ohms_from_percent - bifacial.nonuniform_irradiance_deline_power_loss diff --git a/docs/sphinx/source/whatsnew/v0.11.0.rst b/docs/sphinx/source/whatsnew/v0.11.0.rst index 1afde21e6a..21a78eecf5 100644 --- a/docs/sphinx/source/whatsnew/v0.11.0.rst +++ b/docs/sphinx/source/whatsnew/v0.11.0.rst @@ -22,7 +22,7 @@ Enhancements fixed-tilt and one-axis tracking systems. (:issue:`1689`, :pull:`1725`, :pull:`1962`) * Add new losses function that accounts for non-uniform irradiance of bifacial - modules, :py:func:`pvlib.bifacial.nonuniform_irradiance_deline_power_loss`. + modules, :py:func:`pvlib.bifacial.power_mismatch_deline `. (:issue:`2045`, :pr:`2046`) diff --git a/pvlib/bifacial/__init__.py b/pvlib/bifacial/__init__.py index a882c0c862..56c16f5c27 100644 --- a/pvlib/bifacial/__init__.py +++ b/pvlib/bifacial/__init__.py @@ -1,14 +1,13 @@ """ -The ``bifacial`` module contains functions to model irradiance for bifacial -modules. - +The ``bifacial`` submodule contains functions to model bifacial modules. """ + from pvlib._deprecation import deprecated -from pvlib.bifacial import pvfactors, infinite_sheds, utils # noqa: F401 -from .losses_models import nonuniform_irradiance_deline_power_loss # noqa: F401 +from pvlib.bifacial import pvfactors, infinite_sheds, utils # noqa: F401 +from .losses_models import power_mismatch_deline # noqa: F401 pvfactors_timeseries = deprecated( - since='0.9.1', - name='pvlib.bifacial.pvfactors_timeseries', - alternative='pvlib.bifacial.pvfactors.pvfactors_timeseries' + since="0.9.1", + name="pvlib.bifacial.pvfactors_timeseries", + alternative="pvlib.bifacial.pvfactors.pvfactors_timeseries", )(pvfactors.pvfactors_timeseries) diff --git a/pvlib/bifacial/losses_models.py b/pvlib/bifacial/losses_models.py index 54c26eced0..cb38c08f8f 100644 --- a/pvlib/bifacial/losses_models.py +++ b/pvlib/bifacial/losses_models.py @@ -3,7 +3,7 @@ from typing import Literal -def nonuniform_irradiance_deline_power_loss( +def power_mismatch_deline ( rmad, model: Literal[ "fixed-tilt", "single-axis-tracking" diff --git a/pvlib/tests/bifacial/test_losses_models.py b/pvlib/tests/bifacial/test_losses_models.py index 7b5a0a1ca1..64d4a137ad 100644 --- a/pvlib/tests/bifacial/test_losses_models.py +++ b/pvlib/tests/bifacial/test_losses_models.py @@ -6,20 +6,19 @@ import pytest -def test_nonuniform_irradiance_deline_power_loss(): - """tests bifacial.nonuniform_irradiance_deline_power_loss""" + +def test_power_mismatch_deline(): + """tests bifacial.power_mismatch_deline""" premise_rmads = np.array([0.0, 0.05, 0.1, 0.15, 0.2, 0.25]) # default model result values expected_sat_mms = np.array( [0.0, 0.00287, 0.00608, 0.00963, 0.01352, 0.01775] ) - result_def_mms = bifacial.nonuniform_irradiance_deline_power_loss( - premise_rmads - ) + result_def_mms = bifacial.power_mismatch_deline(premise_rmads) assert_allclose(result_def_mms, expected_sat_mms, atol=1e-5) assert np.all(np.diff(result_def_mms) > 0) # higher RMADs => higher losses # default model matches single-axis tracker - result_sat_mms = bifacial.nonuniform_irradiance_deline_power_loss( + result_sat_mms = bifacial.power_mismatch_deline( premise_rmads, model="single-axis-tracking" ) assert_allclose(result_sat_mms, expected_sat_mms) @@ -27,7 +26,7 @@ def test_nonuniform_irradiance_deline_power_loss(): expected_ft_mms = np.array( [0.0, 0.00718, 0.01452, 0.02202, 0.02968, 0.0375] ) - result_ft_mms = bifacial.nonuniform_irradiance_deline_power_loss( + result_ft_mms = bifacial.power_mismatch_deline( premise_rmads, model="fixed-tilt" ) assert_allclose(result_ft_mms, expected_ft_mms) @@ -35,36 +34,32 @@ def test_nonuniform_irradiance_deline_power_loss(): # test custom coefficients, set model to 1+1*RMAD # as Polynomial class polynomial = np.polynomial.Polynomial([1, 1, 0]) - result_custom_mms = bifacial.nonuniform_irradiance_deline_power_loss( + result_custom_mms = bifacial.power_mismatch_deline( premise_rmads, model=polynomial ) - assert_allclose(result_custom_mms, 1+premise_rmads) + assert_allclose(result_custom_mms, 1 + premise_rmads) # as list - result_custom_mms = bifacial.nonuniform_irradiance_deline_power_loss( + result_custom_mms = bifacial.power_mismatch_deline( premise_rmads, model=[1, 1, 0] ) - assert_allclose(result_custom_mms, 1+premise_rmads) + assert_allclose(result_custom_mms, 1 + premise_rmads) # test datatypes IO with Series - result_mms = bifacial.nonuniform_irradiance_deline_power_loss( - pd.Series(premise_rmads) - ) + result_mms = bifacial.power_mismatch_deline(pd.Series(premise_rmads)) assert isinstance(result_mms, pd.Series) # test fillfactor_ratio # straightforward - result_mms = bifacial.nonuniform_irradiance_deline_power_loss( - premise_rmads, fillfactor_ratio=0.65/0.79 + result_mms = bifacial.power_mismatch_deline( + premise_rmads, fillfactor_ratio=0.65 / 0.79 ) - assert_allclose(result_mms, expected_sat_mms*0.65/0.79, atol=1e-5) + assert_allclose(result_mms, expected_sat_mms * 0.65 / 0.79, atol=1e-5) # with custom model - result_mms = bifacial.nonuniform_irradiance_deline_power_loss( + result_mms = bifacial.power_mismatch_deline( premise_rmads, model=polynomial, fillfactor_ratio=0.24 ) - assert_allclose(result_mms, (1+premise_rmads)*0.24, atol=1e-5) + assert_allclose(result_mms, (1 + premise_rmads) * 0.24, atol=1e-5) # test raises error on inexistent model with pytest.raises(ValueError, match="Invalid model 'foo'"): - bifacial.nonuniform_irradiance_deline_power_loss( - premise_rmads, model="foo" - ) + bifacial.power_mismatch_deline(premise_rmads, model="foo") From 84f702fa1a1c0938ac755f98ecb669a3de8dc9df Mon Sep 17 00:00:00 2001 From: echedey-ls <80125792+echedey-ls@users.noreply.github.com> Date: Tue, 28 May 2024 23:27:46 +0200 Subject: [PATCH 44/82] fillfactor only for predefined models Co-Authored-By: Cliff Hansen <5393711+cwhanse@users.noreply.github.com> --- pvlib/bifacial/losses_models.py | 53 ++++++++++++++-------- pvlib/tests/bifacial/test_losses_models.py | 16 +++---- 2 files changed, 41 insertions(+), 28 deletions(-) diff --git a/pvlib/bifacial/losses_models.py b/pvlib/bifacial/losses_models.py index cb38c08f8f..d93a1c236d 100644 --- a/pvlib/bifacial/losses_models.py +++ b/pvlib/bifacial/losses_models.py @@ -3,12 +3,12 @@ from typing import Literal -def power_mismatch_deline ( +def power_mismatch_deline( rmad, model: Literal[ "fixed-tilt", "single-axis-tracking" ] = "single-axis-tracking", - fillfactor_ratio: float = None, + fillfactor: float = None, ): r""" Estimate the power loss due to irradiance non-uniformity. @@ -19,11 +19,10 @@ def power_mismatch_deline ( Depending on the mounting type, the power loss is estimated with either equation (11) or (12) of [1]_. Passing a custom polynomial is also valid. - Use ``fillfactor_ratio`` to account for different fill factors between the - trained model and the module of interest. The fill factor used for - developing the models ``"single-axis-tracking" and "fixed-tilt"`` is - :math:`0.79`. For example, if the fill factor of the module of interest is - :math:`0.65`, then set ``fillfactor_ratio = 0.65 / 0.79``. + Use ``fillfactor`` to account for different fill factors between the + trained model and the module of interest. + For example, if the fill factor of the module of interest is + :math:`0.65`, then set ``fillfactor=0.65``. .. versionadded:: 0.11.0 @@ -48,11 +47,17 @@ def power_mismatch_deline ( term and the last element is the highest order term. A :py:`numpy:numpy.polynomial.Polynomial` will be created internally. - fillfactor_ratio : float, optional - The ratio of the fill factor of the module of interest to the fill - factor used for developing the models. Fill factor used for models - ``"single-axis-tracking"`` and ``"fixed-tilt"`` is 0.79. For a module - with fill factor 0.65, set ``fillfactor_ratio = 0.65 / 0.79``. + fillfactor : float, optional + Fill factor at standard test condition (STC) of the module. + Accounts for different fill factors between the trained model and the + module of interest, whose ``fillfactor`` is 0.79. Only affects the + model if it is any of the provided. + Raises a ``ValueError`` if the model is a custom polynomial. + Internally, this argument is with equation (7) of [1]_: + + .. math:: + + M[\%]_{FF_1} = M[\%]_{FF_0} \frac{FF_1}{FF_0} Returns ------- @@ -132,13 +137,21 @@ def power_mismatch_deline ( f"Invalid model '{model}'. Available models are " f"{list(_MODEL_POLYNOMS.keys())}." ) - elif isinstance(model, np.polynomial.Polynomial): - model_polynom = model - else: # expect an iterable - model_polynom = np.polynomial.Polynomial(coef=model) - - if fillfactor_ratio: # General fill factor ratio, so it's always used - # Eq. (9), [1] - model_polynom = model_polynom * fillfactor_ratio + else: + if fillfactor: + # Use fillfactor to modify output of a known trained model + # Eq. (7), [1] + model_polynom = model_polynom * fillfactor / 0.79 + else: + if fillfactor: + raise ValueError( + "Fill factor can only be used with predefined models. " + "Modify polynomial or multiply output by " + "'module_fillfactor / training_fillfactor'." + ) + if isinstance(model, np.polynomial.Polynomial): + model_polynom = model + else: # expect an iterable + model_polynom = np.polynomial.Polynomial(coef=model) return model_polynom(rmad) diff --git a/pvlib/tests/bifacial/test_losses_models.py b/pvlib/tests/bifacial/test_losses_models.py index 64d4a137ad..86481a3105 100644 --- a/pvlib/tests/bifacial/test_losses_models.py +++ b/pvlib/tests/bifacial/test_losses_models.py @@ -48,17 +48,17 @@ def test_power_mismatch_deline(): result_mms = bifacial.power_mismatch_deline(pd.Series(premise_rmads)) assert isinstance(result_mms, pd.Series) - # test fillfactor_ratio - # straightforward + # test fillfactor + # with an internal model result_mms = bifacial.power_mismatch_deline( - premise_rmads, fillfactor_ratio=0.65 / 0.79 + premise_rmads, fillfactor=0.65 ) assert_allclose(result_mms, expected_sat_mms * 0.65 / 0.79, atol=1e-5) - # with custom model - result_mms = bifacial.power_mismatch_deline( - premise_rmads, model=polynomial, fillfactor_ratio=0.24 - ) - assert_allclose(result_mms, (1 + premise_rmads) * 0.24, atol=1e-5) + # fails for a custom polynomial + with pytest.raises(ValueError, match="Fill factor can only be used"): + bifacial.power_mismatch_deline( + premise_rmads, model=polynomial, fillfactor=0.24 + ) # test raises error on inexistent model with pytest.raises(ValueError, match="Invalid model 'foo'"): From 3ad18a6d1c8699a7b1c6f2ddb18822a13b1d8c27 Mon Sep 17 00:00:00 2001 From: echedey-ls <80125792+echedey-ls@users.noreply.github.com> Date: Tue, 28 May 2024 23:29:07 +0200 Subject: [PATCH 45/82] Docstring rewording Co-Authored-By: Cliff Hansen <5393711+cwhanse@users.noreply.github.com> --- pvlib/bifacial/losses_models.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pvlib/bifacial/losses_models.py b/pvlib/bifacial/losses_models.py index d93a1c236d..507d6af788 100644 --- a/pvlib/bifacial/losses_models.py +++ b/pvlib/bifacial/losses_models.py @@ -42,8 +42,8 @@ def power_mismatch_deline( If a :py:`numpy:numpy.polynomial.Polynomial`, it is evaluated as is. - If neither a string nor a ``Polynomial``, it must be a collection of - the coefficients of the model, where the first element is the constant + If neither a string nor a ``Polynomial``, it must be the coefficients + of a polynomial in ``rmad``, where the first element is the constant term and the last element is the highest order term. A :py:`numpy:numpy.polynomial.Polynomial` will be created internally. From b6c6fb28117bb6ad2589d385f83793ce8046ff92 Mon Sep 17 00:00:00 2001 From: echedey-ls <80125792+echedey-ls@users.noreply.github.com> Date: Tue, 28 May 2024 23:35:56 +0200 Subject: [PATCH 46/82] Linter --- pvlib/bifacial/losses_models.py | 8 ++++---- pvlib/pvsystem.py | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pvlib/bifacial/losses_models.py b/pvlib/bifacial/losses_models.py index 507d6af788..cde66ae91c 100644 --- a/pvlib/bifacial/losses_models.py +++ b/pvlib/bifacial/losses_models.py @@ -145,10 +145,10 @@ def power_mismatch_deline( else: if fillfactor: raise ValueError( - "Fill factor can only be used with predefined models. " - "Modify polynomial or multiply output by " - "'module_fillfactor / training_fillfactor'." - ) + "Fill factor can only be used with predefined models. " + "Modify polynomial or multiply output by " + "'module_fillfactor / training_fillfactor'." + ) if isinstance(model, np.polynomial.Polynomial): model_polynom = model else: # expect an iterable diff --git a/pvlib/pvsystem.py b/pvlib/pvsystem.py index ebb5aa7f88..0f0a41c87a 100644 --- a/pvlib/pvsystem.py +++ b/pvlib/pvsystem.py @@ -15,7 +15,7 @@ import pandas as pd from dataclasses import dataclass from abc import ABC, abstractmethod -from typing import Optional, Union, Literal +from typing import Optional, Union from pvlib._deprecation import deprecated, warn_deprecated From 18a397f3117f2b429cc76d58859d7dc590a01afc Mon Sep 17 00:00:00 2001 From: echedey-ls <80125792+echedey-ls@users.noreply.github.com> Date: Tue, 28 May 2024 23:36:17 +0200 Subject: [PATCH 47/82] More docs rewording Co-Authored-By: Cliff Hansen <5393711+cwhanse@users.noreply.github.com> --- pvlib/bifacial/losses_models.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/pvlib/bifacial/losses_models.py b/pvlib/bifacial/losses_models.py index cde66ae91c..2bdd1dd026 100644 --- a/pvlib/bifacial/losses_models.py +++ b/pvlib/bifacial/losses_models.py @@ -29,9 +29,10 @@ def power_mismatch_deline( Parameters ---------- rmad : numeric - The Relative Mean Absolute Difference of the irradiance. - See the definition in [2]_ and the example - :ref:`sphx_glr_gallery_bifacial_plot_irradiance_nonuniformity_loss.py`. + The Relative Mean Absolute Difference of the cell-by-cell total + irradiance. [Unitless] + Check out the *Notes* section for the equation to calculate it from the + bifaciality and the front and back irradiances. model : str, numpy.polynomial.Polynom or list, default ``"single-axis-tracking"`` The model coefficients to use. From 8bae370977d435b6e92413a1624048fe3e5e5198 Mon Sep 17 00:00:00 2001 From: Echedey Luis <80125792+echedey-ls@users.noreply.github.com> Date: Wed, 12 Jun 2024 06:27:34 +0200 Subject: [PATCH 48/82] Apply suggestions from Dax Co-authored-by: RDaxini <143435106+RDaxini@users.noreply.github.com> --- docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py | 4 ++-- docs/sphinx/source/reference/bifacial.rst | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py b/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py index e8063d95f4..53069fa387 100644 --- a/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py +++ b/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py @@ -10,7 +10,7 @@ # not uniform due to neighboring rows, the ground albedo and site conditions. # When each cell works at different irradiance levels, the power produced by # the module is less than the sum of the power produced by each cell since the -# maximum power point of each cell is different, but cells connected in series +# maximum power point (MPP) of each cell is different, but cells connected in series # will operate at the same current. In that case, a deviation is found # between the MPP and the working point of the cells. # This is known as irradiance non-uniformity loss. @@ -90,7 +90,7 @@ # Relative Mean Absolute Difference # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ # Calculate the Relative Mean Absolute Difference (RMAD) of the cells' -# irradiance with the following function, Eq. (4) of [1]_: +# irradiances with the following function, Eq. (4) of [1]_: # # .. math:: # diff --git a/docs/sphinx/source/reference/bifacial.rst b/docs/sphinx/source/reference/bifacial.rst index 49f7967e33..a107062fd2 100644 --- a/docs/sphinx/source/reference/bifacial.rst +++ b/docs/sphinx/source/reference/bifacial.rst @@ -12,7 +12,7 @@ Functions for calculating front and back surface irradiance bifacial.infinite_sheds.get_irradiance bifacial.infinite_sheds.get_irradiance_poa -Losses models that are specific to bifacial PV systems +Loss models that are specific to bifacial PV systems .. autosummary:: :toctree: generated/ From 75ae58b6dc159762cbfc050cc39193490373a6b8 Mon Sep 17 00:00:00 2001 From: echedey-ls <80125792+echedey-ls@users.noreply.github.com> Date: Wed, 12 Jun 2024 06:30:00 +0200 Subject: [PATCH 49/82] Unneded image Dominguez_et_al_PVSC2023.png --- .../_images/Dominguez_et_al_PVSC2023.png | Bin 155401 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 docs/sphinx/source/_images/Dominguez_et_al_PVSC2023.png diff --git a/docs/sphinx/source/_images/Dominguez_et_al_PVSC2023.png b/docs/sphinx/source/_images/Dominguez_et_al_PVSC2023.png deleted file mode 100644 index c826bd008f174a8d1318f2643a9b87017cf4f2ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 155401 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

vBeoTsH1HZzonO?wpY%FB?4` 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 F{{b(;)Gz=5 From b106ff83dfbb16a99ec670a29615b239efe4abb3 Mon Sep 17 00:00:00 2001 From: echedey-ls <80125792+echedey-ls@users.noreply.github.com> Date: Wed, 12 Jun 2024 06:35:21 +0200 Subject: [PATCH 50/82] Rename file --- pvlib/bifacial/{losses_models.py => loss_models.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename pvlib/bifacial/{losses_models.py => loss_models.py} (100%) diff --git a/pvlib/bifacial/losses_models.py b/pvlib/bifacial/loss_models.py similarity index 100% rename from pvlib/bifacial/losses_models.py rename to pvlib/bifacial/loss_models.py From 4c789871aaf8746cb6345a2d0896f7993d825bc0 Mon Sep 17 00:00:00 2001 From: echedey-ls <80125792+echedey-ls@users.noreply.github.com> Date: Wed, 12 Jun 2024 06:35:33 +0200 Subject: [PATCH 51/82] Fix equations --- pvlib/bifacial/loss_models.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pvlib/bifacial/loss_models.py b/pvlib/bifacial/loss_models.py index 2bdd1dd026..e89304324e 100644 --- a/pvlib/bifacial/loss_models.py +++ b/pvlib/bifacial/loss_models.py @@ -85,7 +85,7 @@ def power_mismatch_deline( .. math:: - M[\%] = 1 - \frac{P_{Array}}{\sum P_{Cells}} \qquad & \text{(1)} + M[\%] = 1 - \frac{P_{Array}}{\sum P_{Cells}} \qquad \text{(1)} In the section *See Also*, you will find two packages that can be used to calculate the irradiance at different points of the module. @@ -107,7 +107,7 @@ def power_mismatch_deline( .. math:: - G_{total\,i} = G_{front\,i} + \phi_{Bifi} G_{rear\,i} + G_{total\,i} = G_{front\,i} + \phi_{Bifi} G_{rear\,i} \qquad \text{(2)} See Also -------- From 56c7d2eb53d4945ed13ed6b925c5d655d8ab24a8 Mon Sep 17 00:00:00 2001 From: echedey-ls <80125792+echedey-ls@users.noreply.github.com> Date: Wed, 12 Jun 2024 06:38:15 +0200 Subject: [PATCH 52/82] yup it didnt save --- pvlib/bifacial/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pvlib/bifacial/__init__.py b/pvlib/bifacial/__init__.py index 56c16f5c27..cf76993bdb 100644 --- a/pvlib/bifacial/__init__.py +++ b/pvlib/bifacial/__init__.py @@ -4,7 +4,7 @@ from pvlib._deprecation import deprecated from pvlib.bifacial import pvfactors, infinite_sheds, utils # noqa: F401 -from .losses_models import power_mismatch_deline # noqa: F401 +from .loss_models import power_mismatch_deline # noqa: F401 pvfactors_timeseries = deprecated( since="0.9.1", From d225a6d9d7dafa658c79056fbba89bafa20fabbf Mon Sep 17 00:00:00 2001 From: echedey-ls <80125792+echedey-ls@users.noreply.github.com> Date: Wed, 12 Jun 2024 06:39:02 +0200 Subject: [PATCH 53/82] lintaaaaaaarrrr --- docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py b/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py index 53069fa387..3c2704b2c9 100644 --- a/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py +++ b/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py @@ -10,8 +10,8 @@ # not uniform due to neighboring rows, the ground albedo and site conditions. # When each cell works at different irradiance levels, the power produced by # the module is less than the sum of the power produced by each cell since the -# maximum power point (MPP) of each cell is different, but cells connected in series -# will operate at the same current. In that case, a deviation is found +# maximum power point (MPP) of each cell is different, but cells connected in +# series will operate at the same current. In that case, a deviation is found # between the MPP and the working point of the cells. # This is known as irradiance non-uniformity loss. # From 36f3be0fa362986a8f036ac25c752ee4d4c0aa15 Mon Sep 17 00:00:00 2001 From: echedey-ls <80125792+echedey-ls@users.noreply.github.com> Date: Wed, 12 Jun 2024 06:39:53 +0200 Subject: [PATCH 54/82] Eq 7 numbering --- pvlib/bifacial/loss_models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pvlib/bifacial/loss_models.py b/pvlib/bifacial/loss_models.py index e89304324e..5f6264ac59 100644 --- a/pvlib/bifacial/loss_models.py +++ b/pvlib/bifacial/loss_models.py @@ -58,7 +58,7 @@ def power_mismatch_deline( .. math:: - M[\%]_{FF_1} = M[\%]_{FF_0} \frac{FF_1}{FF_0} + M[\%]_{FF_1} = M[\%]_{FF_0} \frac{FF_1}{FF_0} \qquad \text{(7)} Returns ------- From 0c992692bfc04e166b7190d1a494a714ab5ba4dd Mon Sep 17 00:00:00 2001 From: echedey-ls <80125792+echedey-ls@users.noreply.github.com> Date: Wed, 12 Jun 2024 06:52:15 +0200 Subject: [PATCH 55/82] Revert unintended changes --- pvlib/bifacial/__init__.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pvlib/bifacial/__init__.py b/pvlib/bifacial/__init__.py index cf76993bdb..e166c55108 100644 --- a/pvlib/bifacial/__init__.py +++ b/pvlib/bifacial/__init__.py @@ -7,7 +7,7 @@ from .loss_models import power_mismatch_deline # noqa: F401 pvfactors_timeseries = deprecated( - since="0.9.1", - name="pvlib.bifacial.pvfactors_timeseries", - alternative="pvlib.bifacial.pvfactors.pvfactors_timeseries", + since='0.9.1', + name='pvlib.bifacial.pvfactors_timeseries', + alternative='pvlib.bifacial.pvfactors.pvfactors_timeseries' )(pvfactors.pvfactors_timeseries) From a46245a86da1fdf2fece5e10a2713b12af4f18db Mon Sep 17 00:00:00 2001 From: echedey-ls <80125792+echedey-ls@users.noreply.github.com> Date: Wed, 12 Jun 2024 07:08:17 +0200 Subject: [PATCH 56/82] Adam code review Co-Authored-By: Adam R. Jensen <39184289+AdamRJensen@users.noreply.github.com> --- .../plot_irradiance_nonuniformity_loss.py | 11 ++++---- pvlib/bifacial/loss_models.py | 25 +++++++++++-------- 2 files changed, 20 insertions(+), 16 deletions(-) diff --git a/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py b/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py index 3c2704b2c9..115b0a305c 100644 --- a/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py +++ b/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py @@ -2,7 +2,7 @@ Plot Irradiance Non-uniformity Loss =================================== -Calculate the incident irradiance lost to non-uniformity in a bifacial PV array +Calculate the DC power lost to non-uniformity in a bifacial PV array """ # %% @@ -11,14 +11,13 @@ # When each cell works at different irradiance levels, the power produced by # the module is less than the sum of the power produced by each cell since the # maximum power point (MPP) of each cell is different, but cells connected in -# series will operate at the same current. In that case, a deviation is found -# between the MPP and the working point of the cells. +# series will operate at the same current. # This is known as irradiance non-uniformity loss. # # Calculating the IV curve of each cell and then matching the working point of -# the whole module is computationally expensive, so a model to account for this -# loss is of interest. Deline et al. [1]_ proposed a model based on the -# Relative Mean Absolute Difference (RMAD) of the irradiance of each cell. +# the whole module is computationally expensive, so a simple model to account +# for this loss is of interest. Deline et al. [1]_ proposed a model based on +# the Relative Mean Absolute Difference (RMAD) of the irradiance of each cell. # They did also use the standard deviation of the cells' irradiances, but they # found that the RMAD was a better predictor of the mismatch loss. # diff --git a/pvlib/bifacial/loss_models.py b/pvlib/bifacial/loss_models.py index 5f6264ac59..c4b5040494 100644 --- a/pvlib/bifacial/loss_models.py +++ b/pvlib/bifacial/loss_models.py @@ -11,7 +11,7 @@ def power_mismatch_deline( fillfactor: float = None, ): r""" - Estimate the power loss due to irradiance non-uniformity. + Estimate DC power loss due to irradiance non-uniformity. This model is described for bifacial modules in [1]_, where the backside irradiance is less uniform due to mounting and site conditions. @@ -41,24 +41,21 @@ def power_mismatch_deline( * ``"fixed-tilt"``: Eq. (11) of [1]_. * ``"single-axis-tracking"``: Eq. (12) of [1]_. - If a :py:`numpy:numpy.polynomial.Polynomial`, it is evaluated as is. + If a :py:`numpy.polynomial.Polynomial`, it is evaluated as is. If neither a string nor a ``Polynomial``, it must be the coefficients of a polynomial in ``rmad``, where the first element is the constant term and the last element is the highest order term. A - :py:`numpy:numpy.polynomial.Polynomial` will be created internally. + :py:`numpy.polynomial.Polynomial` will be created internally. fillfactor : float, optional Fill factor at standard test condition (STC) of the module. Accounts for different fill factors between the trained model and the - module of interest, whose ``fillfactor`` is 0.79. Only affects the - model if it is any of the provided. + module under non-uniform irradiance. + Models from [1]_ were calculated for a ``fillfactor`` of 0.79. + This parameter will only be used if ``model`` is a string. Raises a ``ValueError`` if the model is a custom polynomial. - Internally, this argument is with equation (7) of [1]_: - - .. math:: - - M[\%]_{FF_1} = M[\%]_{FF_0} \frac{FF_1}{FF_0} \qquad \text{(7)} + Internally, this argument applies :eq:`equation (7) `. Returns ------- @@ -87,6 +84,14 @@ def power_mismatch_deline( M[\%] = 1 - \frac{P_{Array}}{\sum P_{Cells}} \qquad \text{(1)} + To account for a module with a fill factor distinct from the one used to + train the model (0.79), the output of the model can be modified by Eq. (7): + + .. math:: + :label: fillfactor + + M[\%]_{FF_1} = M[\%]_{FF_0} \frac{FF_1}{FF_0} \qquad \text{(7)} + In the section *See Also*, you will find two packages that can be used to calculate the irradiance at different points of the module. From a4a32e0e7dbf98b3f8afff6b0dcd22c9bd45abbd Mon Sep 17 00:00:00 2001 From: echedey-ls <80125792+echedey-ls@users.noreply.github.com> Date: Wed, 12 Jun 2024 07:29:43 +0200 Subject: [PATCH 57/82] Links? Co-Authored-By: Adam R. Jensen <39184289+AdamRJensen@users.noreply.github.com> --- pvlib/bifacial/loss_models.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/pvlib/bifacial/loss_models.py b/pvlib/bifacial/loss_models.py index c4b5040494..d1b32de643 100644 --- a/pvlib/bifacial/loss_models.py +++ b/pvlib/bifacial/loss_models.py @@ -41,12 +41,14 @@ def power_mismatch_deline( * ``"fixed-tilt"``: Eq. (11) of [1]_. * ``"single-axis-tracking"``: Eq. (12) of [1]_. - If a :py:`numpy.polynomial.Polynomial`, it is evaluated as is. + If a :external:class:`numpy.polynomial.Polynomial`, it is evaluated as + is. If neither a string nor a ``Polynomial``, it must be the coefficients of a polynomial in ``rmad``, where the first element is the constant term and the last element is the highest order term. A - :py:`numpy.polynomial.Polynomial` will be created internally. + :external:class:`numpy.polynomial.Polynomial` will be created + internally. fillfactor : float, optional Fill factor at standard test condition (STC) of the module. From 88273bad38d52ce104af6b6ad8639e0703c13eb5 Mon Sep 17 00:00:00 2001 From: echedey-ls <80125792+echedey-ls@users.noreply.github.com> Date: Wed, 12 Jun 2024 07:33:57 +0200 Subject: [PATCH 58/82] Referencing equations manually Co-Authored-By: Adam R. Jensen <39184289+AdamRJensen@users.noreply.github.com> --- pvlib/bifacial/loss_models.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pvlib/bifacial/loss_models.py b/pvlib/bifacial/loss_models.py index d1b32de643..8c23425864 100644 --- a/pvlib/bifacial/loss_models.py +++ b/pvlib/bifacial/loss_models.py @@ -57,7 +57,7 @@ def power_mismatch_deline( Models from [1]_ were calculated for a ``fillfactor`` of 0.79. This parameter will only be used if ``model`` is a string. Raises a ``ValueError`` if the model is a custom polynomial. - Internally, this argument applies :eq:`equation (7) `. + Internally, this argument applies :ref:`Equation (7) `. Returns ------- @@ -89,8 +89,9 @@ def power_mismatch_deline( To account for a module with a fill factor distinct from the one used to train the model (0.79), the output of the model can be modified by Eq. (7): + .. _fillfactor_eq: + .. math:: - :label: fillfactor M[\%]_{FF_1} = M[\%]_{FF_0} \frac{FF_1}{FF_0} \qquad \text{(7)} From f096a0a4b3c8e255df53031f8efaa8fab0786f99 Mon Sep 17 00:00:00 2001 From: echedey-ls <80125792+echedey-ls@users.noreply.github.com> Date: Wed, 12 Jun 2024 07:48:21 +0200 Subject: [PATCH 59/82] Polynomial links Co-Authored-By: Adam R. Jensen <39184289+AdamRJensen@users.noreply.github.com> --- pvlib/bifacial/loss_models.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/pvlib/bifacial/loss_models.py b/pvlib/bifacial/loss_models.py index 8c23425864..cffa114adc 100644 --- a/pvlib/bifacial/loss_models.py +++ b/pvlib/bifacial/loss_models.py @@ -34,21 +34,21 @@ def power_mismatch_deline( Check out the *Notes* section for the equation to calculate it from the bifaciality and the front and back irradiances. - model : str, numpy.polynomial.Polynom or list, default ``"single-axis-tracking"`` + model : str, numpy.polynomial.polynomial.Polynomial or list, default ``"single-axis-tracking"`` The model coefficients to use. If a string, it must be one of the following: * ``"fixed-tilt"``: Eq. (11) of [1]_. * ``"single-axis-tracking"``: Eq. (12) of [1]_. - If a :external:class:`numpy.polynomial.Polynomial`, it is evaluated as - is. + If a :external:class:`numpy.polynomial.polynomial.Polynomial`, + it is evaluated as is. If neither a string nor a ``Polynomial``, it must be the coefficients of a polynomial in ``rmad``, where the first element is the constant term and the last element is the highest order term. A - :external:class:`numpy.polynomial.Polynomial` will be created - internally. + :external:class:`numpy.polynomial.polynomial.Polynomial` + will be created internally. fillfactor : float, optional Fill factor at standard test condition (STC) of the module. From 5945b7463c5db080a9b9409231471fa4f202b79a Mon Sep 17 00:00:00 2001 From: echedey-ls <80125792+echedey-ls@users.noreply.github.com> Date: Wed, 12 Jun 2024 09:07:10 +0200 Subject: [PATCH 60/82] Dont abuse math mode --- pvlib/bifacial/loss_models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pvlib/bifacial/loss_models.py b/pvlib/bifacial/loss_models.py index cffa114adc..5849bb635e 100644 --- a/pvlib/bifacial/loss_models.py +++ b/pvlib/bifacial/loss_models.py @@ -22,7 +22,7 @@ def power_mismatch_deline( Use ``fillfactor`` to account for different fill factors between the trained model and the module of interest. For example, if the fill factor of the module of interest is - :math:`0.65`, then set ``fillfactor=0.65``. + 0.65, then set ``fillfactor=0.65``. .. versionadded:: 0.11.0 From adbcbeb9aeb429fd487d344aee36f4de9fa9a1fb Mon Sep 17 00:00:00 2001 From: echedey-ls <80125792+echedey-ls@users.noreply.github.com> Date: Wed, 12 Jun 2024 09:08:56 +0200 Subject: [PATCH 61/82] Update loss_models.py --- pvlib/bifacial/loss_models.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/pvlib/bifacial/loss_models.py b/pvlib/bifacial/loss_models.py index 5849bb635e..fd335f98a9 100644 --- a/pvlib/bifacial/loss_models.py +++ b/pvlib/bifacial/loss_models.py @@ -47,7 +47,7 @@ def power_mismatch_deline( If neither a string nor a ``Polynomial``, it must be the coefficients of a polynomial in ``rmad``, where the first element is the constant term and the last element is the highest order term. A - :external:class:`numpy.polynomial.polynomial.Polynomial` + :external:class:`~numpy.polynomial.polynomial.Polynomial` will be created internally. fillfactor : float, optional @@ -64,6 +64,11 @@ def power_mismatch_deline( loss : numeric The power loss. + Raises + ------ + ValueError + If the model is not a string and ``fillfactor`` is not ``None``. + Notes ----- The models implemented are equations (11) and (12) of [1]_: From 6f5c69fb5d7e81193796405aec04e45a6076bbe3 Mon Sep 17 00:00:00 2001 From: echedey-ls <80125792+echedey-ls@users.noreply.github.com> Date: Wed, 12 Jun 2024 23:02:53 +0200 Subject: [PATCH 62/82] I forgot --- docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py b/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py index 115b0a305c..e3e650e785 100644 --- a/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py +++ b/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py @@ -7,7 +7,7 @@ # %% # The incident irradiance on the backside of a bifacial PV module is -# not uniform due to neighboring rows, the ground albedo and site conditions. +# not uniform due to neighboring rows, the ground albedo, and site conditions. # When each cell works at different irradiance levels, the power produced by # the module is less than the sum of the power produced by each cell since the # maximum power point (MPP) of each cell is different, but cells connected in From 770b4a5ffb0e33c16adfed580014146e562264ab Mon Sep 17 00:00:00 2001 From: echedey-ls <80125792+echedey-ls@users.noreply.github.com> Date: Wed, 12 Jun 2024 23:03:41 +0200 Subject: [PATCH 63/82] Adam Code Review Co-Authored-By: Adam R. Jensen <39184289+AdamRJensen@users.noreply.github.com> --- docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py | 4 ++-- docs/sphinx/source/whatsnew/v0.11.0.rst | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py b/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py index e3e650e785..432adebde2 100644 --- a/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py +++ b/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py @@ -25,7 +25,7 @@ # from the irradiance levels of each cell in a PV module. # # The function -# :py:func:`pvlib.bifacial.power_mismatch_deline ` is +# :py:func:`pvlib.bifacial.power_mismatch_deline` is # used to transform the Relative Mean Absolute Difference (RMAD) of the # irradiance into a power loss percentage. Down below you will find a # numpy-based implementation of the RMAD function. @@ -117,7 +117,7 @@ def rmad(data, axis=None): # ^^^^^^^^^^^^^ # Calculate the power loss percentage due to the irradiance non-uniformity # with the function -# :py:func:`pvlib.bifacial.power_mismatch_deline `. +# :py:func:`pvlib.bifacial.power_mismatch_deline`. mismatch_loss = power_mismatch_deline(rmad_cells) diff --git a/docs/sphinx/source/whatsnew/v0.11.0.rst b/docs/sphinx/source/whatsnew/v0.11.0.rst index e3f043467c..44b4f9ca1f 100644 --- a/docs/sphinx/source/whatsnew/v0.11.0.rst +++ b/docs/sphinx/source/whatsnew/v0.11.0.rst @@ -33,7 +33,7 @@ Enhancements :py:func:`pvlib.spectrum.sr_to_qe` and :py:func:`pvlib.spectrum.qe_to_sr` respectively. (:issue:`2040`, :pull:`2041`) * Add new losses function that accounts for non-uniform irradiance of bifacial - modules, :py:func:`pvlib.bifacial.power_mismatch_deline `. + modules, :py:func:`pvlib.bifacial.power_mismatch_deline`. (:issue:`2045`, :pr:`2046`) From a9d507f5e4c0c3448c455b52659636b39f779b89 Mon Sep 17 00:00:00 2001 From: echedey-ls <80125792+echedey-ls@users.noreply.github.com> Date: Sat, 22 Jun 2024 01:16:26 +0200 Subject: [PATCH 64/82] whatsnews --- docs/sphinx/source/whatsnew/v0.11.0.rst | 3 --- docs/sphinx/source/whatsnew/v0.11.1.rst | 3 +++ 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/sphinx/source/whatsnew/v0.11.0.rst b/docs/sphinx/source/whatsnew/v0.11.0.rst index e5a1f26c9c..3978480854 100644 --- a/docs/sphinx/source/whatsnew/v0.11.0.rst +++ b/docs/sphinx/source/whatsnew/v0.11.0.rst @@ -67,9 +67,6 @@ Enhancements diffuse fraction of Photosynthetically Active Radiation (PAR) from the global diffuse fraction and the solar zenith. (:issue:`2047`, :pull:`2048`) -* Add new losses function that accounts for non-uniform irradiance of bifacial - modules, :py:func:`pvlib.bifacial.power_mismatch_deline`. - (:issue:`2045`, :pr:`2046`) Bug fixes diff --git a/docs/sphinx/source/whatsnew/v0.11.1.rst b/docs/sphinx/source/whatsnew/v0.11.1.rst index aa2205bb43..e4dbe1f010 100644 --- a/docs/sphinx/source/whatsnew/v0.11.1.rst +++ b/docs/sphinx/source/whatsnew/v0.11.1.rst @@ -10,6 +10,9 @@ Deprecations Enhancements ~~~~~~~~~~~~ +* Add new losses function that accounts for non-uniform irradiance of bifacial + modules, :py:func:`pvlib.bifacial.power_mismatch_deline`. + (:issue:`2045`, :pr:`2046`) Bug fixes From 243de31b349758e626919237afffd77d51e8a7a6 Mon Sep 17 00:00:00 2001 From: echedey-ls <80125792+echedey-ls@users.noreply.github.com> Date: Sat, 22 Jun 2024 01:17:03 +0200 Subject: [PATCH 65/82] Update v0.11.0.rst --- docs/sphinx/source/whatsnew/v0.11.0.rst | 8 -------- 1 file changed, 8 deletions(-) diff --git a/docs/sphinx/source/whatsnew/v0.11.0.rst b/docs/sphinx/source/whatsnew/v0.11.0.rst index 3978480854..067094a014 100644 --- a/docs/sphinx/source/whatsnew/v0.11.0.rst +++ b/docs/sphinx/source/whatsnew/v0.11.0.rst @@ -67,14 +67,6 @@ Enhancements diffuse fraction of Photosynthetically Active Radiation (PAR) from the global diffuse fraction and the solar zenith. (:issue:`2047`, :pull:`2048`) - - -Bug fixes -~~~~~~~~~ - - -Testing -~~~~~~~ * Default altitude in :py:class:`pvlib.location.Location` now comes from :py:func:`~pvlib.location.lookup_altitude` (:issue:`1516`, :pull:`1850`) From 204f8b796a98b7c9d1e5031f0f077e94894a88b7 Mon Sep 17 00:00:00 2001 From: echedey-ls <80125792+echedey-ls@users.noreply.github.com> Date: Sat, 22 Jun 2024 01:32:26 +0200 Subject: [PATCH 66/82] Weird that some tests pass and others dont --- pvlib/bifacial/loss_models.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/pvlib/bifacial/loss_models.py b/pvlib/bifacial/loss_models.py index fd335f98a9..cf7172c030 100644 --- a/pvlib/bifacial/loss_models.py +++ b/pvlib/bifacial/loss_models.py @@ -1,4 +1,5 @@ import numpy as np +import pandas as pd from typing import Literal @@ -168,4 +169,6 @@ def power_mismatch_deline( else: # expect an iterable model_polynom = np.polynomial.Polynomial(coef=model) - return model_polynom(rmad) + mismatch = model_polynom(rmad) + if isinstance(rmad, pd.Series): + mismatch = pd.Series(mismatch, index=rmad.index) From a88cb4c954209d959f811aa2d528b2f31fac38ce Mon Sep 17 00:00:00 2001 From: echedey-ls <80125792+echedey-ls@users.noreply.github.com> Date: Sat, 22 Jun 2024 01:33:15 +0200 Subject: [PATCH 67/82] Update loss_models.py --- pvlib/bifacial/loss_models.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pvlib/bifacial/loss_models.py b/pvlib/bifacial/loss_models.py index cf7172c030..dbd9a7a5ed 100644 --- a/pvlib/bifacial/loss_models.py +++ b/pvlib/bifacial/loss_models.py @@ -170,5 +170,4 @@ def power_mismatch_deline( model_polynom = np.polynomial.Polynomial(coef=model) mismatch = model_polynom(rmad) - if isinstance(rmad, pd.Series): - mismatch = pd.Series(mismatch, index=rmad.index) + return type(rmad)(mismatch) From 0136b3a9c6887d7ca2e77d845d6f7460a5f8c3a8 Mon Sep 17 00:00:00 2001 From: echedey-ls <80125792+echedey-ls@users.noreply.github.com> Date: Sat, 22 Jun 2024 01:33:50 +0200 Subject: [PATCH 68/82] document --- pvlib/bifacial/loss_models.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pvlib/bifacial/loss_models.py b/pvlib/bifacial/loss_models.py index dbd9a7a5ed..fb4ead730a 100644 --- a/pvlib/bifacial/loss_models.py +++ b/pvlib/bifacial/loss_models.py @@ -62,7 +62,7 @@ def power_mismatch_deline( Returns ------- - loss : numeric + loss : numeric, same type as ``rmad`` The power loss. Raises @@ -170,4 +170,4 @@ def power_mismatch_deline( model_polynom = np.polynomial.Polynomial(coef=model) mismatch = model_polynom(rmad) - return type(rmad)(mismatch) + return type(rmad)(mismatch) # return same type as input From c6ca308604c6910a6088413705561ba737aedb11 Mon Sep 17 00:00:00 2001 From: echedey-ls <80125792+echedey-ls@users.noreply.github.com> Date: Sat, 22 Jun 2024 01:49:03 +0200 Subject: [PATCH 69/82] Update loss_models.py --- pvlib/bifacial/loss_models.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/pvlib/bifacial/loss_models.py b/pvlib/bifacial/loss_models.py index fb4ead730a..ad38e438ba 100644 --- a/pvlib/bifacial/loss_models.py +++ b/pvlib/bifacial/loss_models.py @@ -62,7 +62,7 @@ def power_mismatch_deline( Returns ------- - loss : numeric, same type as ``rmad`` + loss : numeric, pd.Series if ``rmad`` is a pd.Series The power loss. Raises @@ -170,4 +170,6 @@ def power_mismatch_deline( model_polynom = np.polynomial.Polynomial(coef=model) mismatch = model_polynom(rmad) - return type(rmad)(mismatch) # return same type as input + if isinstance(rmad, pd.Series): + mismatch = pd.Series(mismatch, index=rmad.index) + return mismatch From adad0c1362279aee246204c839c54799003bd6df Mon Sep 17 00:00:00 2001 From: echedey-ls <80125792+echedey-ls@users.noreply.github.com> Date: Thu, 27 Jun 2024 23:58:49 +0200 Subject: [PATCH 70/82] Kevin's review (I) Co-Authored-By: Kevin Anderson <57452607+kandersolar@users.noreply.github.com> --- docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py | 4 ++-- pvlib/bifacial/loss_models.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py b/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py index 432adebde2..4ed5f8c2ab 100644 --- a/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py +++ b/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py @@ -100,11 +100,11 @@ def rmad(data, axis=None): """ - Relative Mean Absolute Difference. + Relative Mean Absolute Difference. Output in percentage. https://stackoverflow.com/a/19472336/19371110 """ mad = np.mean(np.absolute(data - np.mean(data, axis)), axis) - return mad / np.mean(data, axis) + return mad / np.mean(data, axis) * 100 rmad_cells = rmad(cells_irrad) diff --git a/pvlib/bifacial/loss_models.py b/pvlib/bifacial/loss_models.py index ad38e438ba..02623bd4d3 100644 --- a/pvlib/bifacial/loss_models.py +++ b/pvlib/bifacial/loss_models.py @@ -25,7 +25,7 @@ def power_mismatch_deline( For example, if the fill factor of the module of interest is 0.65, then set ``fillfactor=0.65``. - .. versionadded:: 0.11.0 + .. versionadded:: 0.11.1 Parameters ---------- @@ -63,7 +63,7 @@ def power_mismatch_deline( Returns ------- loss : numeric, pd.Series if ``rmad`` is a pd.Series - The power loss. + The fractional power loss. [Unitless] Raises ------ From 6fafcb4586612e57b0d92585e14a504a266ad743 Mon Sep 17 00:00:00 2001 From: echedey-ls <80125792+echedey-ls@users.noreply.github.com> Date: Fri, 28 Jun 2024 00:33:47 +0200 Subject: [PATCH 71/82] Kevin's review (II) Co-Authored-By: Kevin Anderson <57452607+kandersolar@users.noreply.github.com> --- pvlib/bifacial/loss_models.py | 105 +++++++-------------- pvlib/tests/bifacial/test_losses_models.py | 48 +++------- 2 files changed, 50 insertions(+), 103 deletions(-) diff --git a/pvlib/bifacial/loss_models.py b/pvlib/bifacial/loss_models.py index 02623bd4d3..419b688bd4 100644 --- a/pvlib/bifacial/loss_models.py +++ b/pvlib/bifacial/loss_models.py @@ -1,15 +1,12 @@ import numpy as np import pandas as pd -from typing import Literal - def power_mismatch_deline( rmad, - model: Literal[ - "fixed-tilt", "single-axis-tracking" - ] = "single-axis-tracking", - fillfactor: float = None, + model=(0, 0.142, 0.032), + fill_factor: float = None, + fill_factor_reference: float = 0.79, ): r""" Estimate DC power loss due to irradiance non-uniformity. @@ -17,13 +14,12 @@ def power_mismatch_deline( This model is described for bifacial modules in [1]_, where the backside irradiance is less uniform due to mounting and site conditions. - Depending on the mounting type, the power loss is estimated with either - equation (11) or (12) of [1]_. Passing a custom polynomial is also valid. + The power loss is estimated by a polynomial model of the Relative Mean + Absolute Difference (RMAD) of the cell-by-cell total irradiance. - Use ``fillfactor`` to account for different fill factors between the - trained model and the module of interest. - For example, if the fill factor of the module of interest is - 0.65, then set ``fillfactor=0.65``. + Use ``fill_factor`` to account for different fill factors between the + trained model and the module of interest. Specify model's fill factor with + ``fill_factor_reference``. .. versionadded:: 0.11.1 @@ -35,52 +31,40 @@ def power_mismatch_deline( Check out the *Notes* section for the equation to calculate it from the bifaciality and the front and back irradiances. - model : str, numpy.polynomial.polynomial.Polynomial or list, default ``"single-axis-tracking"`` + model : float collection or numpy.polynomial.polynomial.Polynomial, default ``(0, 0.142, 0.032)`` The model coefficients to use. - If a string, it must be one of the following: - - * ``"fixed-tilt"``: Eq. (11) of [1]_. - * ``"single-axis-tracking"``: Eq. (12) of [1]_. If a :external:class:`numpy.polynomial.polynomial.Polynomial`, - it is evaluated as is. - - If neither a string nor a ``Polynomial``, it must be the coefficients - of a polynomial in ``rmad``, where the first element is the constant - term and the last element is the highest order term. A + it is evaluated as is. If not a ``Polynomial``, it must be the + coefficients of a polynomial in ``rmad``, where the first element is + the constant term and the last element is the highest order term. A :external:class:`~numpy.polynomial.polynomial.Polynomial` will be created internally. - fillfactor : float, optional + fill_factor : float, optional Fill factor at standard test condition (STC) of the module. Accounts for different fill factors between the trained model and the module under non-uniform irradiance. - Models from [1]_ were calculated for a ``fillfactor`` of 0.79. - This parameter will only be used if ``model`` is a string. - Raises a ``ValueError`` if the model is a custom polynomial. - Internally, this argument applies :ref:`Equation (7) `. + If not provided, the model is used as is. + + fill_factor_reference : float, default 0.79 + Fill factor at STC of the module used to train the model. + If ``fill_factor`` is provided, this value is used to scale the output + of the model. Returns ------- - loss : numeric, pd.Series if ``rmad`` is a pd.Series + loss : numeric The fractional power loss. [Unitless] - - Raises - ------ - ValueError - If the model is not a string and ``fillfactor`` is not ``None``. + Output will be a ``pandas.Series`` if ``rmad`` is a ``pandas.Series``. Notes ----- - The models implemented are equations (11) and (12) of [1]_: + The default model implemented is equation (11) [1]_: .. math:: - \text{model="fixed-tilt"} & \Rightarrow M[\%] = - 0.142 \Delta[\%] + 0.032 \Delta[\%]^2 \qquad & \text{(11)} - - \text{model="single-axis-tracking"} & \Rightarrow M[\%] = - 0.054 \Delta[\%] + 0.068 \Delta[\%]^2 \qquad & \text{(12)} + M[\%] = 0.142 \Delta[\%] + 0.032 \Delta[\%]^2 \qquad & \text{(11)} where :math:`\Delta[\%]` is the Relative Mean Absolute Difference of the global irradiance, Eq. (4) of [1]_ and [2]_. @@ -93,14 +77,15 @@ def power_mismatch_deline( M[\%] = 1 - \frac{P_{Array}}{\sum P_{Cells}} \qquad \text{(1)} To account for a module with a fill factor distinct from the one used to - train the model (0.79), the output of the model can be modified by Eq. (7): - - .. _fillfactor_eq: + train the model (``0.79`` by default), the output of the model can be + modified with Eq. (7): .. math:: M[\%]_{FF_1} = M[\%]_{FF_0} \frac{FF_1}{FF_0} \qquad \text{(7)} + where parameter ``fill_factor`` is :math:`FF_1` and + ``fill_factor_reference`` is :math:`FF_0`. In the section *See Also*, you will find two packages that can be used to calculate the irradiance at different points of the module. @@ -140,34 +125,14 @@ def power_mismatch_deline( https://en.wikipedia.org/wiki/Mean_absolute_difference#Relative_mean_absolute_difference (accessed 2024-04-14). """ # noqa: E501 - if isinstance(model, str): - _MODEL_POLYNOMS = { - "fixed-tilt": [0, 0.142, 0.032], # Eq. (11), [1] - "single-axis-tracking": [0, 0.054, 0.068], # Eq. (12), [1] - } - try: - model_polynom = np.polynomial.Polynomial(_MODEL_POLYNOMS[model]) - except KeyError: - raise ValueError( - f"Invalid model '{model}'. Available models are " - f"{list(_MODEL_POLYNOMS.keys())}." - ) - else: - if fillfactor: - # Use fillfactor to modify output of a known trained model - # Eq. (7), [1] - model_polynom = model_polynom * fillfactor / 0.79 - else: - if fillfactor: - raise ValueError( - "Fill factor can only be used with predefined models. " - "Modify polynomial or multiply output by " - "'module_fillfactor / training_fillfactor'." - ) - if isinstance(model, np.polynomial.Polynomial): - model_polynom = model - else: # expect an iterable - model_polynom = np.polynomial.Polynomial(coef=model) + if isinstance(model, np.polynomial.Polynomial): + model_polynom = model + else: # expect an iterable + model_polynom = np.polynomial.Polynomial(coef=model) + + if fill_factor: # Eq. (7), [1] + # Modify output of a trained model with different fill factor + model_polynom = model_polynom * fill_factor / fill_factor_reference mismatch = model_polynom(rmad) if isinstance(rmad, pd.Series): diff --git a/pvlib/tests/bifacial/test_losses_models.py b/pvlib/tests/bifacial/test_losses_models.py index 86481a3105..b8e86a4dc9 100644 --- a/pvlib/tests/bifacial/test_losses_models.py +++ b/pvlib/tests/bifacial/test_losses_models.py @@ -4,33 +4,18 @@ import numpy as np from numpy.testing import assert_allclose -import pytest - def test_power_mismatch_deline(): """tests bifacial.power_mismatch_deline""" premise_rmads = np.array([0.0, 0.05, 0.1, 0.15, 0.2, 0.25]) - # default model result values - expected_sat_mms = np.array( - [0.0, 0.00287, 0.00608, 0.00963, 0.01352, 0.01775] - ) - result_def_mms = bifacial.power_mismatch_deline(premise_rmads) - assert_allclose(result_def_mms, expected_sat_mms, atol=1e-5) - assert np.all(np.diff(result_def_mms) > 0) # higher RMADs => higher losses - # default model matches single-axis tracker - result_sat_mms = bifacial.power_mismatch_deline( - premise_rmads, model="single-axis-tracking" - ) - assert_allclose(result_sat_mms, expected_sat_mms) - # fixed-tilt model result values + # test default model is for fixed tilt expected_ft_mms = np.array( [0.0, 0.00718, 0.01452, 0.02202, 0.02968, 0.0375] ) - result_ft_mms = bifacial.power_mismatch_deline( - premise_rmads, model="fixed-tilt" - ) - assert_allclose(result_ft_mms, expected_ft_mms) - assert np.all(np.diff(result_ft_mms) > 0) # higher RMADs => higher losses + result_def_mms = bifacial.power_mismatch_deline(premise_rmads) + assert_allclose(result_def_mms, expected_ft_mms, atol=1e-5) + assert np.all(np.diff(result_def_mms) > 0) # higher RMADs => higher losses + # test custom coefficients, set model to 1+1*RMAD # as Polynomial class polynomial = np.polynomial.Polynomial([1, 1, 0]) @@ -48,18 +33,15 @@ def test_power_mismatch_deline(): result_mms = bifacial.power_mismatch_deline(pd.Series(premise_rmads)) assert isinstance(result_mms, pd.Series) - # test fillfactor - # with an internal model + # test fill_factor, fill_factor_reference + # default model + default fill_factor_reference result_mms = bifacial.power_mismatch_deline( - premise_rmads, fillfactor=0.65 + premise_rmads, fill_factor=0.65 ) - assert_allclose(result_mms, expected_sat_mms * 0.65 / 0.79, atol=1e-5) - # fails for a custom polynomial - with pytest.raises(ValueError, match="Fill factor can only be used"): - bifacial.power_mismatch_deline( - premise_rmads, model=polynomial, fillfactor=0.24 - ) - - # test raises error on inexistent model - with pytest.raises(ValueError, match="Invalid model 'foo'"): - bifacial.power_mismatch_deline(premise_rmads, model="foo") + assert_allclose(result_mms, expected_ft_mms * 0.65 / 0.79, atol=1e-5) + # default model + custom fill_factor_reference + ff_ref = 0.75 + result_mms = bifacial.power_mismatch_deline( + premise_rmads, fill_factor=0.65, fill_factor_reference=ff_ref + ) + assert_allclose(result_mms, expected_ft_mms * 0.65 / ff_ref, atol=1e-5) From 436b0e21572fa59e10d43804c9885279d6c72d59 Mon Sep 17 00:00:00 2001 From: echedey-ls <80125792+echedey-ls@users.noreply.github.com> Date: Fri, 28 Jun 2024 18:36:27 +0200 Subject: [PATCH 72/82] Kevin's review (III) Co-Authored-By: Kevin Anderson <57452607+kandersolar@users.noreply.github.com> --- .../plot_irradiance_nonuniformity_loss.py | 13 +++++---- docs/sphinx/source/whatsnew/v0.11.1.rst | 1 - pvlib/bifacial/loss_models.py | 27 ++++++++++++------- 3 files changed, 25 insertions(+), 16 deletions(-) diff --git a/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py b/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py index 4ed5f8c2ab..d0532bb318 100644 --- a/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py +++ b/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py @@ -27,7 +27,7 @@ # The function # :py:func:`pvlib.bifacial.power_mismatch_deline` is # used to transform the Relative Mean Absolute Difference (RMAD) of the -# irradiance into a power loss percentage. Down below you will find a +# irradiance into a power loss mismatch. Down below you will find a # numpy-based implementation of the RMAD function. # # References @@ -100,11 +100,11 @@ def rmad(data, axis=None): """ - Relative Mean Absolute Difference. Output in percentage. + Relative Mean Absolute Difference. Output is [Unitless]. https://stackoverflow.com/a/19472336/19371110 """ mad = np.mean(np.absolute(data - np.mean(data, axis)), axis) - return mad / np.mean(data, axis) * 100 + return mad / np.mean(data, axis) rmad_cells = rmad(cells_irrad) @@ -115,11 +115,14 @@ def rmad(data, axis=None): # %% # Mismatch Loss # ^^^^^^^^^^^^^ -# Calculate the power loss percentage due to the irradiance non-uniformity +# Calculate the power loss ratio due to the irradiance non-uniformity # with the function # :py:func:`pvlib.bifacial.power_mismatch_deline`. mismatch_loss = power_mismatch_deline(rmad_cells) print(f"RMAD of the cells' irradiance: {rmad_cells:.3} [unitless]") -print(f"Power loss due to the irradiance non-uniformity: {mismatch_loss:.3%}") +print( + "Power loss due to the irradiance non-uniformity: " + + f"{mismatch_loss:.3} [unitless]" +) diff --git a/docs/sphinx/source/whatsnew/v0.11.1.rst b/docs/sphinx/source/whatsnew/v0.11.1.rst index e4dbe1f010..133a8635c9 100644 --- a/docs/sphinx/source/whatsnew/v0.11.1.rst +++ b/docs/sphinx/source/whatsnew/v0.11.1.rst @@ -12,7 +12,6 @@ Enhancements ~~~~~~~~~~~~ * Add new losses function that accounts for non-uniform irradiance of bifacial modules, :py:func:`pvlib.bifacial.power_mismatch_deline`. - (:issue:`2045`, :pr:`2046`) Bug fixes diff --git a/pvlib/bifacial/loss_models.py b/pvlib/bifacial/loss_models.py index 419b688bd4..eabd17598c 100644 --- a/pvlib/bifacial/loss_models.py +++ b/pvlib/bifacial/loss_models.py @@ -4,7 +4,7 @@ def power_mismatch_deline( rmad, - model=(0, 0.142, 0.032), + coefficients=(0, 0.142, 0.032), fill_factor: float = None, fill_factor_reference: float = 0.79, ): @@ -31,8 +31,8 @@ def power_mismatch_deline( Check out the *Notes* section for the equation to calculate it from the bifaciality and the front and back irradiances. - model : float collection or numpy.polynomial.polynomial.Polynomial, default ``(0, 0.142, 0.032)`` - The model coefficients to use. + coefficients : float collection or numpy.polynomial.polynomial.Polynomial, default ``(0, 0.142, 0.032)`` + The polynomial coefficients to use. If a :external:class:`numpy.polynomial.polynomial.Polynomial`, it is evaluated as is. If not a ``Polynomial``, it must be the @@ -64,9 +64,9 @@ def power_mismatch_deline( .. math:: - M[\%] = 0.142 \Delta[\%] + 0.032 \Delta[\%]^2 \qquad & \text{(11)} + M = 0.142 \Delta + 0.032 \Delta^2 \qquad \text{(11)} - where :math:`\Delta[\%]` is the Relative Mean Absolute Difference of the + where :math:`\Delta` is the Relative Mean Absolute Difference of the global irradiance, Eq. (4) of [1]_ and [2]_. The losses definition is Eq. (1) of [1]_, and it's defined as a loss of the @@ -74,7 +74,7 @@ def power_mismatch_deline( .. math:: - M[\%] = 1 - \frac{P_{Array}}{\sum P_{Cells}} \qquad \text{(1)} + M = 1 - \frac{P_{Array}}{\sum P_{Cells}} \qquad \text{(1)} To account for a module with a fill factor distinct from the one used to train the model (``0.79`` by default), the output of the model can be @@ -82,7 +82,7 @@ def power_mismatch_deline( .. math:: - M[\%]_{FF_1} = M[\%]_{FF_0} \frac{FF_1}{FF_0} \qquad \text{(7)} + M_{FF_1} = M_{FF_0} \frac{FF_1}{FF_0} \qquad \text{(7)} where parameter ``fill_factor`` is :math:`FF_1` and ``fill_factor_reference`` is :math:`FF_0`. @@ -108,6 +108,13 @@ def power_mismatch_deline( G_{total\,i} = G_{front\,i} + \phi_{Bifi} G_{rear\,i} \qquad \text{(2)} + which yields: + + .. math:: + + RMAD_{total} = RMAD_{rear} \frac{\phi_{Bifi}} + {1 + \frac{G_{front}}{\phi_{Bifi} \bar{G}_{rear}}} + See Also -------- `solarfactors `_ @@ -125,10 +132,10 @@ def power_mismatch_deline( https://en.wikipedia.org/wiki/Mean_absolute_difference#Relative_mean_absolute_difference (accessed 2024-04-14). """ # noqa: E501 - if isinstance(model, np.polynomial.Polynomial): - model_polynom = model + if isinstance(coefficients, np.polynomial.Polynomial): + model_polynom = coefficients else: # expect an iterable - model_polynom = np.polynomial.Polynomial(coef=model) + model_polynom = np.polynomial.Polynomial(coef=coefficients) if fill_factor: # Eq. (7), [1] # Modify output of a trained model with different fill factor From 7d91db6645470159becd48779bbe0b8c28dde213 Mon Sep 17 00:00:00 2001 From: echedey-ls <80125792+echedey-ls@users.noreply.github.com> Date: Fri, 28 Jun 2024 18:39:05 +0200 Subject: [PATCH 73/82] Update v0.11.1.rst Co-Authored-By: Kevin Anderson <57452607+kandersolar@users.noreply.github.com> --- docs/sphinx/source/whatsnew/v0.11.1.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/sphinx/source/whatsnew/v0.11.1.rst b/docs/sphinx/source/whatsnew/v0.11.1.rst index 133a8635c9..d4ef2618ba 100644 --- a/docs/sphinx/source/whatsnew/v0.11.1.rst +++ b/docs/sphinx/source/whatsnew/v0.11.1.rst @@ -12,6 +12,7 @@ Enhancements ~~~~~~~~~~~~ * Add new losses function that accounts for non-uniform irradiance of bifacial modules, :py:func:`pvlib.bifacial.power_mismatch_deline`. + (:issue:`2045`, :pull:`2046`) Bug fixes From b1b51bdbd7e66d2fb9fbfb2a4af2f80ec7bf5a17 Mon Sep 17 00:00:00 2001 From: echedey-ls <80125792+echedey-ls@users.noreply.github.com> Date: Fri, 28 Jun 2024 18:39:15 +0200 Subject: [PATCH 74/82] minor changes --- docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py | 5 +++-- docs/sphinx/source/whatsnew/v0.11.1.rst | 2 +- pvlib/bifacial/loss_models.py | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py b/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py index d0532bb318..6e241b33ee 100644 --- a/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py +++ b/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py @@ -103,8 +103,9 @@ def rmad(data, axis=None): Relative Mean Absolute Difference. Output is [Unitless]. https://stackoverflow.com/a/19472336/19371110 """ - mad = np.mean(np.absolute(data - np.mean(data, axis)), axis) - return mad / np.mean(data, axis) + mean = np.mean(data, axis) + mad = np.mean(np.absolute(data - mean), axis) + return mad / mean rmad_cells = rmad(cells_irrad) diff --git a/docs/sphinx/source/whatsnew/v0.11.1.rst b/docs/sphinx/source/whatsnew/v0.11.1.rst index d4ef2618ba..d659f50f3f 100644 --- a/docs/sphinx/source/whatsnew/v0.11.1.rst +++ b/docs/sphinx/source/whatsnew/v0.11.1.rst @@ -33,4 +33,4 @@ Requirements Contributors ~~~~~~~~~~~~ - +* Echedey Luis (:ghuser:`echedey-ls`) diff --git a/pvlib/bifacial/loss_models.py b/pvlib/bifacial/loss_models.py index eabd17598c..2992b0f68b 100644 --- a/pvlib/bifacial/loss_models.py +++ b/pvlib/bifacial/loss_models.py @@ -100,7 +100,7 @@ def power_mismatch_deline( .. math:: RMAD(k \cdot X + c) = RMAD(X) \cdot k \frac{k \bar{X}}{k \bar{X} + c} - = RMAD(X) \cdot k \frac{1}{1 + \frac{c}{k \bar{X}}} + = RMAD(X) \cdot \frac{k}{1 + \frac{c}{k \bar{X}}} by similarity with equation (2) of [1]_: From 399180078996f60a7ea7e9d4638ab8d47824c21e Mon Sep 17 00:00:00 2001 From: echedey-ls <80125792+echedey-ls@users.noreply.github.com> Date: Fri, 28 Jun 2024 18:40:17 +0200 Subject: [PATCH 75/82] Forgot to update tests Co-Authored-By: Kevin Anderson <57452607+kandersolar@users.noreply.github.com> --- pvlib/tests/bifacial/test_losses_models.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pvlib/tests/bifacial/test_losses_models.py b/pvlib/tests/bifacial/test_losses_models.py index b8e86a4dc9..695aa695e8 100644 --- a/pvlib/tests/bifacial/test_losses_models.py +++ b/pvlib/tests/bifacial/test_losses_models.py @@ -20,12 +20,12 @@ def test_power_mismatch_deline(): # as Polynomial class polynomial = np.polynomial.Polynomial([1, 1, 0]) result_custom_mms = bifacial.power_mismatch_deline( - premise_rmads, model=polynomial + premise_rmads, coefficients=polynomial ) assert_allclose(result_custom_mms, 1 + premise_rmads) # as list result_custom_mms = bifacial.power_mismatch_deline( - premise_rmads, model=[1, 1, 0] + premise_rmads, coefficients=[1, 1, 0] ) assert_allclose(result_custom_mms, 1 + premise_rmads) From aeaabb44fc2c19fd53d3a935d1c44ff4fc91e81d Mon Sep 17 00:00:00 2001 From: echedey-ls <80125792+echedey-ls@users.noreply.github.com> Date: Sat, 29 Jun 2024 00:41:18 +0200 Subject: [PATCH 76/82] Accordingly modify model, IO, docs to unitless model Co-Authored-By: Kevin Anderson <57452607+kandersolar@users.noreply.github.com> --- .../plot_irradiance_nonuniformity_loss.py | 5 ++--- pvlib/bifacial/loss_models.py | 17 +++++++++------ pvlib/tests/bifacial/test_losses_models.py | 21 ++++++++++++------- 3 files changed, 27 insertions(+), 16 deletions(-) diff --git a/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py b/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py index 6e241b33ee..4b2ba8d939 100644 --- a/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py +++ b/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py @@ -93,7 +93,7 @@ # # .. math:: # -# \Delta \left[ \% \right] = \frac{1}{n^2 \bar{G}_{total}} +# \Delta \left[ unitless \right] = \frac{1}{n^2 \bar{G}_{total}} # \sum_{i=1}^{n} \sum_{j=1}^{n} \lvert G_{total,i} - G_{total,j} \rvert # @@ -117,8 +117,7 @@ def rmad(data, axis=None): # Mismatch Loss # ^^^^^^^^^^^^^ # Calculate the power loss ratio due to the irradiance non-uniformity -# with the function -# :py:func:`pvlib.bifacial.power_mismatch_deline`. +# with :py:func:`pvlib.bifacial.power_mismatch_deline`. mismatch_loss = power_mismatch_deline(rmad_cells) diff --git a/pvlib/bifacial/loss_models.py b/pvlib/bifacial/loss_models.py index 2992b0f68b..f35751badb 100644 --- a/pvlib/bifacial/loss_models.py +++ b/pvlib/bifacial/loss_models.py @@ -4,7 +4,7 @@ def power_mismatch_deline( rmad, - coefficients=(0, 0.142, 0.032), + coefficients=(0, 0.142, 0.032 * 100), fill_factor: float = None, fill_factor_reference: float = 0.79, ): @@ -28,10 +28,11 @@ def power_mismatch_deline( rmad : numeric The Relative Mean Absolute Difference of the cell-by-cell total irradiance. [Unitless] + Check out the *Notes* section for the equation to calculate it from the bifaciality and the front and back irradiances. - coefficients : float collection or numpy.polynomial.polynomial.Polynomial, default ``(0, 0.142, 0.032)`` + coefficients : float collection or numpy.polynomial.polynomial.Polynomial, default ``(0, 0.142, 0.032 * 100)`` The polynomial coefficients to use. If a :external:class:`numpy.polynomial.polynomial.Polynomial`, @@ -64,10 +65,14 @@ def power_mismatch_deline( .. math:: - M = 0.142 \Delta + 0.032 \Delta^2 \qquad \text{(11)} + M[\%] &= 0.142 \Delta[\%] + 0.032 \Delta^2[\%] \qquad \text{(11)} + M[-] &= 0.142 \Delta[-] + 0.032 \times 100 \Delta^2[-] - where :math:`\Delta` is the Relative Mean Absolute Difference of the - global irradiance, Eq. (4) of [1]_ and [2]_. + where the upper equation is in percentage (same as paper) and the lower + one is unitless. The implementation uses the unitless version, where + :math:`M[-]` is the mismatch power loss [unitless] and + :math:`\Delta[-]` is the Relative Mean Absolute Difference [unitless] + of the global irradiance, Eq. (4) of [1]_ and [2]_. The losses definition is Eq. (1) of [1]_, and it's defined as a loss of the output power: @@ -138,7 +143,7 @@ def power_mismatch_deline( model_polynom = np.polynomial.Polynomial(coef=coefficients) if fill_factor: # Eq. (7), [1] - # Modify output of a trained model with different fill factor + # Scale output of trained model to account for different fill factors model_polynom = model_polynom * fill_factor / fill_factor_reference mismatch = model_polynom(rmad) diff --git a/pvlib/tests/bifacial/test_losses_models.py b/pvlib/tests/bifacial/test_losses_models.py index 695aa695e8..72dd050928 100644 --- a/pvlib/tests/bifacial/test_losses_models.py +++ b/pvlib/tests/bifacial/test_losses_models.py @@ -9,9 +9,7 @@ def test_power_mismatch_deline(): """tests bifacial.power_mismatch_deline""" premise_rmads = np.array([0.0, 0.05, 0.1, 0.15, 0.2, 0.25]) # test default model is for fixed tilt - expected_ft_mms = np.array( - [0.0, 0.00718, 0.01452, 0.02202, 0.02968, 0.0375] - ) + expected_ft_mms = np.array([0.0, 0.0151, 0.0462, 0.0933, 0.1564, 0.2355]) result_def_mms = bifacial.power_mismatch_deline(premise_rmads) assert_allclose(result_def_mms, expected_ft_mms, atol=1e-5) assert np.all(np.diff(result_def_mms) > 0) # higher RMADs => higher losses @@ -35,13 +33,22 @@ def test_power_mismatch_deline(): # test fill_factor, fill_factor_reference # default model + default fill_factor_reference + ff_ref_default = 0.79 + ff_of_interest = 0.65 result_mms = bifacial.power_mismatch_deline( - premise_rmads, fill_factor=0.65 + premise_rmads, fill_factor=ff_of_interest + ) + assert_allclose( + result_mms, + expected_ft_mms * ff_of_interest / ff_ref_default, + atol=1e-5, ) - assert_allclose(result_mms, expected_ft_mms * 0.65 / 0.79, atol=1e-5) # default model + custom fill_factor_reference + ff_of_interest = 0.65 ff_ref = 0.75 result_mms = bifacial.power_mismatch_deline( - premise_rmads, fill_factor=0.65, fill_factor_reference=ff_ref + premise_rmads, fill_factor=ff_of_interest, fill_factor_reference=ff_ref + ) + assert_allclose( + result_mms, expected_ft_mms * ff_of_interest / ff_ref, atol=1e-5 ) - assert_allclose(result_mms, expected_ft_mms * 0.65 / ff_ref, atol=1e-5) From 9289412a39dd15dd0cb7bfc53668e6ec8cfcb225 Mon Sep 17 00:00:00 2001 From: echedey-ls <80125792+echedey-ls@users.noreply.github.com> Date: Sat, 29 Jun 2024 00:42:06 +0200 Subject: [PATCH 77/82] Update loss_models.py --- pvlib/bifacial/loss_models.py | 1 + 1 file changed, 1 insertion(+) diff --git a/pvlib/bifacial/loss_models.py b/pvlib/bifacial/loss_models.py index f35751badb..a41cdab338 100644 --- a/pvlib/bifacial/loss_models.py +++ b/pvlib/bifacial/loss_models.py @@ -57,6 +57,7 @@ def power_mismatch_deline( ------- loss : numeric The fractional power loss. [Unitless] + Output will be a ``pandas.Series`` if ``rmad`` is a ``pandas.Series``. Notes From f025133b4a5ef72c987612f20d44ac06365ac976 Mon Sep 17 00:00:00 2001 From: echedey-ls <80125792+echedey-ls@users.noreply.github.com> Date: Sat, 29 Jun 2024 00:49:33 +0200 Subject: [PATCH 78/82] Update loss_models.py Co-Authored-By: Kevin Anderson <57452607+kandersolar@users.noreply.github.com> --- pvlib/bifacial/loss_models.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pvlib/bifacial/loss_models.py b/pvlib/bifacial/loss_models.py index a41cdab338..0901e4f229 100644 --- a/pvlib/bifacial/loss_models.py +++ b/pvlib/bifacial/loss_models.py @@ -74,6 +74,8 @@ def power_mismatch_deline( :math:`M[-]` is the mismatch power loss [unitless] and :math:`\Delta[-]` is the Relative Mean Absolute Difference [unitless] of the global irradiance, Eq. (4) of [1]_ and [2]_. + Note that the n-th power coefficient is multiplied by :math:`100^(n-1)` to + convert the percentage to unitless. The losses definition is Eq. (1) of [1]_, and it's defined as a loss of the output power: From 69a5acfd44bf88518d958bc9ce1632d3db09dc8f Mon Sep 17 00:00:00 2001 From: Echedey Luis <80125792+echedey-ls@users.noreply.github.com> Date: Sun, 30 Jun 2024 18:53:46 +0200 Subject: [PATCH 79/82] Apply suggestions from code review Co-authored-by: Cliff Hansen --- .../examples/bifacial/plot_irradiance_nonuniformity_loss.py | 4 ++-- docs/sphinx/source/whatsnew/v0.11.1.rst | 2 +- pvlib/bifacial/loss_models.py | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py b/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py index 4b2ba8d939..ed183856a3 100644 --- a/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py +++ b/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py @@ -2,7 +2,7 @@ Plot Irradiance Non-uniformity Loss =================================== -Calculate the DC power lost to non-uniformity in a bifacial PV array +Calculate the DC power lost to irradiance non-uniformity in a bifacial PV array. """ # %% @@ -18,7 +18,7 @@ # the whole module is computationally expensive, so a simple model to account # for this loss is of interest. Deline et al. [1]_ proposed a model based on # the Relative Mean Absolute Difference (RMAD) of the irradiance of each cell. -# They did also use the standard deviation of the cells' irradiances, but they +# They considered the standard deviation of the cells' irradiances, but they # found that the RMAD was a better predictor of the mismatch loss. # # This example demonstrates how to model the irradiance non-uniformity loss diff --git a/docs/sphinx/source/whatsnew/v0.11.1.rst b/docs/sphinx/source/whatsnew/v0.11.1.rst index d659f50f3f..1e839c596c 100644 --- a/docs/sphinx/source/whatsnew/v0.11.1.rst +++ b/docs/sphinx/source/whatsnew/v0.11.1.rst @@ -10,7 +10,7 @@ Deprecations Enhancements ~~~~~~~~~~~~ -* Add new losses function that accounts for non-uniform irradiance of bifacial +* Add new losses function that accounts for non-uniform irradiance on bifacial modules, :py:func:`pvlib.bifacial.power_mismatch_deline`. (:issue:`2045`, :pull:`2046`) diff --git a/pvlib/bifacial/loss_models.py b/pvlib/bifacial/loss_models.py index 0901e4f229..2f75851493 100644 --- a/pvlib/bifacial/loss_models.py +++ b/pvlib/bifacial/loss_models.py @@ -18,7 +18,7 @@ def power_mismatch_deline( Absolute Difference (RMAD) of the cell-by-cell total irradiance. Use ``fill_factor`` to account for different fill factors between the - trained model and the module of interest. Specify model's fill factor with + data used to fit the model and the module of interest. Specify the model's fill factor with ``fill_factor_reference``. .. versionadded:: 0.11.1 @@ -29,7 +29,7 @@ def power_mismatch_deline( The Relative Mean Absolute Difference of the cell-by-cell total irradiance. [Unitless] - Check out the *Notes* section for the equation to calculate it from the + See the *Notes* section for the equation to calculate `rmad` from the bifaciality and the front and back irradiances. coefficients : float collection or numpy.polynomial.polynomial.Polynomial, default ``(0, 0.142, 0.032 * 100)`` @@ -46,7 +46,7 @@ def power_mismatch_deline( Fill factor at standard test condition (STC) of the module. Accounts for different fill factors between the trained model and the module under non-uniform irradiance. - If not provided, the model is used as is. + If not provided, the default `fill_factor_reference` of 0.79 is used. fill_factor_reference : float, default 0.79 Fill factor at STC of the module used to train the model. From 945d61a2c551f4d8d263d041f3b6d398dd51d537 Mon Sep 17 00:00:00 2001 From: echedey-ls <80125792+echedey-ls@users.noreply.github.com> Date: Sun, 30 Jun 2024 18:56:56 +0200 Subject: [PATCH 80/82] Code review from Cliff Co-Authored-By: Cliff Hansen <5393711+cwhanse@users.noreply.github.com> --- .../examples/bifacial/plot_irradiance_nonuniformity_loss.py | 3 ++- pvlib/bifacial/loss_models.py | 6 ++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py b/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py index ed183856a3..8b19ebeb79 100644 --- a/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py +++ b/docs/examples/bifacial/plot_irradiance_nonuniformity_loss.py @@ -2,7 +2,8 @@ Plot Irradiance Non-uniformity Loss =================================== -Calculate the DC power lost to irradiance non-uniformity in a bifacial PV array. +Calculate the DC power lost to irradiance non-uniformity in a bifacial PV +array. """ # %% diff --git a/pvlib/bifacial/loss_models.py b/pvlib/bifacial/loss_models.py index 2f75851493..1b0a141ff2 100644 --- a/pvlib/bifacial/loss_models.py +++ b/pvlib/bifacial/loss_models.py @@ -29,7 +29,7 @@ def power_mismatch_deline( The Relative Mean Absolute Difference of the cell-by-cell total irradiance. [Unitless] - See the *Notes* section for the equation to calculate `rmad` from the + See the *Notes* section for the equation to calculate ``rmad`` from the bifaciality and the front and back irradiances. coefficients : float collection or numpy.polynomial.polynomial.Polynomial, default ``(0, 0.142, 0.032 * 100)`` @@ -46,12 +46,10 @@ def power_mismatch_deline( Fill factor at standard test condition (STC) of the module. Accounts for different fill factors between the trained model and the module under non-uniform irradiance. - If not provided, the default `fill_factor_reference` of 0.79 is used. + If not provided, the default ``fill_factor_reference`` of 0.79 is used. fill_factor_reference : float, default 0.79 Fill factor at STC of the module used to train the model. - If ``fill_factor`` is provided, this value is used to scale the output - of the model. Returns ------- From cecc337190555dadb4e187cae9c6bbc8268c8291 Mon Sep 17 00:00:00 2001 From: echedey-ls <80125792+echedey-ls@users.noreply.github.com> Date: Mon, 1 Jul 2024 19:06:25 +0200 Subject: [PATCH 81/82] Rendering issues, code review from Kevin Co-Authored-By: Kevin Anderson <57452607+kandersolar@users.noreply.github.com> --- pvlib/bifacial/loss_models.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pvlib/bifacial/loss_models.py b/pvlib/bifacial/loss_models.py index 1b0a141ff2..250925b88d 100644 --- a/pvlib/bifacial/loss_models.py +++ b/pvlib/bifacial/loss_models.py @@ -65,6 +65,7 @@ def power_mismatch_deline( .. math:: M[\%] &= 0.142 \Delta[\%] + 0.032 \Delta^2[\%] \qquad \text{(11)} + M[-] &= 0.142 \Delta[-] + 0.032 \times 100 \Delta^2[-] where the upper equation is in percentage (same as paper) and the lower @@ -72,8 +73,8 @@ def power_mismatch_deline( :math:`M[-]` is the mismatch power loss [unitless] and :math:`\Delta[-]` is the Relative Mean Absolute Difference [unitless] of the global irradiance, Eq. (4) of [1]_ and [2]_. - Note that the n-th power coefficient is multiplied by :math:`100^(n-1)` to - convert the percentage to unitless. + Note that the n-th power coefficient is multiplied by :math:`100^{n-1}` + to convert the percentage to unitless. The losses definition is Eq. (1) of [1]_, and it's defined as a loss of the output power: From 289dbeb0ead088f009664af7c129bd66dfe50647 Mon Sep 17 00:00:00 2001 From: echedey-ls <80125792+echedey-ls@users.noreply.github.com> Date: Mon, 1 Jul 2024 19:18:32 +0200 Subject: [PATCH 82/82] Little missing newline --- pvlib/bifacial/loss_models.py | 1 + 1 file changed, 1 insertion(+) diff --git a/pvlib/bifacial/loss_models.py b/pvlib/bifacial/loss_models.py index 250925b88d..cbcb2ba4d1 100644 --- a/pvlib/bifacial/loss_models.py +++ b/pvlib/bifacial/loss_models.py @@ -93,6 +93,7 @@ def power_mismatch_deline( where parameter ``fill_factor`` is :math:`FF_1` and ``fill_factor_reference`` is :math:`FF_0`. + In the section *See Also*, you will find two packages that can be used to calculate the irradiance at different points of the module.