Skip to content

Commit 35599e7

Browse files
echedey-lskandersolaradriessewholmgrenmikofski
authored
Martinez shading factor (#2070)
* Update shading.py * Minimal test * Implementation From NREL paper * Fix, fix, fix, fix & format * Format issues * Extend tests (compare with singleaxis) & format with ruff * Format fixes * Upgrade tests * Array -> Axis * type * Whatsnew * xd * bruh * Minor Python optimization a la tracking.singleaxis * Comment and minor optimizations * Surface -> Axis Co-Authored-By: Kevin Anderson <[email protected]> * Elevation -> Zenith Co-Authored-By: Kevin Anderson <[email protected]> * Elev -> Zenith Co-Authored-By: Kevin Anderson <[email protected]> * Update shading.py * Update docstring Co-Authored-By: Anton Driesse <[email protected]> * Add comments from `tracking.singleaxis` Co-Authored-By: Will Holmgren <[email protected]> Co-Authored-By: Mark Mikofski <[email protected]> * Singleaxis implementation port & test addition, based on old pvlib.tracking.singleaxis * Update v0.10.4.rst * Linter * Code review Co-Authored-By: Cliff Hansen <[email protected]> * Add Fig 5 [1] (still gotta check the built output) * Add caption, change size and describe in alternate text * rST fixes ? * Figures have captions, images do not https://pandemic-overview.readthedocs.io/en/latest/myGuides/reStructuredText-Images-and-Figures-Examples.html#id18 * Flip arguments order * I forgot 💀 * Linter are you happy now? * Remove port test and add edge cases test Co-Authored-By: Kevin Anderson <[email protected]> * Update test_shading.py Co-Authored-By: Kevin Anderson <[email protected]> * Indentation xd * Update test_shading.py * I forgot how to code * Align data * Docstring suggestion from Kevin Co-Authored-By: Kevin Anderson <[email protected]> * Update link to example? * add linear shade loss for thin films * add tests, update docs, what's new * fix what's new gh issue and pr links * fix trailing whitespace * responding to comments - move linear shade loss to shading module - don't use ternary, doesn't work on vectors, instead use np.where() - set cross axis default to zero - test vectors - update docs * update docstring for linear shade loss - applicable to other monolithic thin film like CIGS, not just CdTe - only when shade is perpendicular to scribe lines * update example in linear_shade_loss * add figure and formulas to shaded fraction * shaded fraction consistently * Add alternative text to image * Update implementation based on PSZ PR. See description. Commit highlights ✨ : * I think I made all the code a bit more legible; sorry for the big changes @mikofski * Tests a bit more complete (not much, still consider the same test data) * Rename shaded fraction acronym from `fs` to `sf` * Asserts changed to `assert_allclose` for a more legible output in case of failure Co-Authored-By: Mark Mikofski <[email protected]> * Whatsnew entries Co-Authored-By: Mark Mikofski <[email protected]> * Linter * Clear things, convert Mark's reference to a reference * Linter * Update according to changes at PSZA PR * Another commit, another try * Ahhh, I rebased too fast * whatsnews * Update v0.10.4.rst * Update v0.10.3.rst * Rename to `shaded_fraction1d`, change params to `surface_*` instead of `tracker_*` * Left this tracker refs behind * Change rename in rst entries * Add another testcase * Improve docs references, clarify nomenclature Co-Authored-By: Kevin Anderson <[email protected]> * Update test_shading.py * Remove linear_shade_loss * First implementation of the new shaded fraction model (missing figure) * Create Anderson_Jensen_2024_Fig3.png * Update shading.py * Update shading.py * Update shading.py * lintaaargggg * Fill reference * Next release 0.10.5? * Fix tests * Update test_shading.py * Little improvement to table definitions * Change `l` to `\ell` Co-Authored-By: Kevin Anderson <[email protected]> * `pvlib.tracking.projected_solar_zenith_angle` to `pvlib.shading.projected_solar_zenith_angle` Co-Authored-By: Kevin Anderson <[email protected]> * pitch references to `pitch` Co-Authored-By: Kevin Anderson <[email protected]> * `trackers_axis_azimuth` to `axis_azimuth` Co-Authored-By: Kevin Anderson <[email protected]> * whatsnews Co-Authored-By: Kevin Anderson <[email protected]> * Update v0.10.5.rst Co-Authored-By: Kevin Anderson <[email protected]> * Change `tilt`s to `rotation`s and add `axis_tilt` Co-Authored-By: Kevin Anderson <[email protected]> * Forgot to update tests 💀 Co-Authored-By: Kevin Anderson <[email protected]> * Add examples section * roles assumption messin w/ me docs 😲 * roles assumption messin w/ me docs 😲 Co-Authored-By: Kevin Anderson <[email protected]> * Update shading.py * Update shading.py * Add gallery example * This was fixed in recent sphinx-gallery releases IIRC * Extra empty line or admonition type unsupported * Fix example link (hopefully 🙏 ) * Update shading.py * Fix subsubsections? * Nah, bulleted list didn't work * tilted -> tracker, only affects text * Typos and unreasonable physical values Co-Authored-By: Kevin Anderson <[email protected]> * See the Examples section below, not the unlinkable link Co-Authored-By: Kevin Anderson <[email protected]> * tracker -> row, param names, code and docs Co-Authored-By: Kevin Anderson <[email protected]> * Fix broken example 🔧 Co-Authored-By: Kevin Anderson <[email protected]> * Apply suggestions from code review Co-authored-by: Adam R. Jensen <[email protected]> * "the row axis/axes" instead of ``axis_azimuth`` * Unnecessary math mode Co-Authored-By: Adam R. Jensen <[email protected]> * Example suggestions and text trimming Co-Authored-By: Adam R. Jensen <[email protected]> * whatsmes * Add test to fix coverage issue * Initial work * Can't test with the paper data, wtf * Little things * Update plot_martinez_shade_loss.py * More improvements * Be4 rebase * Fix fixture * Initial work * Fix tests * docstring * whatsnew 📝 * Minor thingies * Add figure, improve docs 💯 * Fix silently ignoring file path in `pvsystem.retrieve_sam` when `name` is provided (#2020) * My approach to the issue * Deprecate previous parameters * No reason to over-engineer, right? * Update v0.10.5.rst * Update pvsystem.py * Improve error handling * Add ppl involved * kevin's suggestions * Fix Ixx equation in pvsystem.sapm (#2019) * fix Ixx equation, use Aimp * Update docs/sphinx/source/whatsnew/v0.10.5.rst * lint * lint * get the spacing right * more spacing --------- Co-authored-by: Kevin Anderson <[email protected]> * Increase python requirement to >= 3.8 (#2029) * require python >=3.8 * update CI configurations * whatsnew * remove pre-3.8 cruft * fix h5py/numpy versioning issue for py3.8-min * update gallery examples for newer pandas * update asv config for python 3.8 * fix asv config syntax error * one more asv config edit * Finalize 0.10.5 (#2035) * whatsnew cleanup * add v0.11.0 file * forgot to include myself in the contributors * update release date * Comments from review * update whatsnews * Update test_shading.py * Example * Fix whatsmes * Update v0.11.0.rst * other img * lintarrrrrr 😭 * docs * docs refurbishment * Update plot_martinez_shade_loss.py * Fix parameter names * More explicit 2D shaded fraction Co-Authored-By: Kevin Anderson <[email protected]> * Explicitier explicit Co-Authored-By: Kevin Anderson <[email protected]> * Update shading.py Co-Authored-By: Kevin Anderson <[email protected]> * Only if life was VCS to revert my errors so easily Co-Authored-By: Kevin Anderson <[email protected]> * Nix image in docstring Co-Authored-By: Kevin Anderson <[email protected]> * Clear-up irrdiance loss, not pwr loss - yet again Co-Authored-By: Kevin Anderson <[email protected]> * rewording Co-Authored-By: Kevin Anderson <[email protected]> * Remove figure of junction boxes in example Co-Authored-By: Kevin Anderson <[email protected]> * Duplicated singleaxis call Co-Authored-By: Kevin Anderson <[email protected]> * When did I change this? Co-Authored-By: Kevin Anderson <[email protected]> * Rename function Co-Authored-By: Kevin Anderson <[email protected]> * Make times just one statement Co-Authored-By: Kevin Anderson <[email protected]> * Fix uncomplete example in docstring Co-Authored-By: Kevin Anderson <[email protected]> * flake is a snowflake ❄️ Co-Authored-By: Kevin Anderson <[email protected]> * Delete Centralized_and_split_PV_junction_boxes_cesardd.jpg Co-Authored-By: Kevin Anderson <[email protected]> * Remove example description Co-Authored-By: Cliff Hansen <[email protected]> * Change example title Co-Authored-By: Cliff Hansen <[email protected]> * Ints for number of blocks Co-Authored-By: Cliff Hansen <[email protected]> * Rephrasing of shaded fraction 2D Co-Authored-By: Cliff Hansen <[email protected]> * typo * Code review from Ioannis Co-Authored-By: Ioannis Sifnaios <[email protected]> * no more noqa e501 * Will this work to hide code? * Update plot_martinez_shade_loss.py Co-Authored-By: Ioannis Sifnaios <[email protected]> * play time with the matplotlib statements Co-Authored-By: Ioannis Sifnaios <[email protected]> * This fixes it (I believe 🙏 ) CC @IoannisSifnaios Co-Authored-By: Ioannis Sifnaios <[email protected]> * Update plot_martinez_shade_loss.py Co-Authored-By: Ioannis Sifnaios <[email protected]> * Nah, let's see how this does Co-Authored-By: Ioannis Sifnaios <[email protected]> * Revert attempt to colapse code It doesn't work because sphinx-gallery closes the figure at the end of the cell sphinx-gallery/sphinx-gallery#240 CC @IoannisSifnaios Co-Authored-By: Ioannis Sifnaios <[email protected]> * Power losses model Co-Authored-By: Kevin Anderson <[email protected]> Co-Authored-By: Cliff Hansen <[email protected]> Co-Authored-By: Ioannis Sifnaios <[email protected]> * equations rendering * Change `poa_direct_and_circumsolar` to `poa_direct` Co-Authored-By: Kevin Anderson <[email protected]> * Example link Co-Authored-By: Kevin Anderson <[email protected]> * `power_loss` -> `loss_fraction` Co-Authored-By: Kevin Anderson <[email protected]> * Typo when applying Ioannis suggestion Co-Authored-By: Kevin Anderson <[email protected]> Co-Authored-By: Ioannis Sifnaios <[email protected]> * Re-arrange POA to its own section in example Co-Authored-By: Kevin Anderson <[email protected]> * Mis-redaction in normal/half-cut modules comparison Co-Authored-By: Kevin Anderson <[email protected]> * Add edge cases Co-Authored-By: Kevin Anderson <[email protected]> * Link yet again Co-Authored-By: Kevin Anderson <[email protected]> * Fix link for sure Co-Authored-By: Kevin Anderson <[email protected]> * Remove critical error from docs build * Apply suggestions from code review (Cliff) Co-authored-by: Cliff Hansen <[email protected]> * Linter * Apply suggestions from Adam Co-authored-by: Adam R. Jensen <[email protected]> * Rewording from code review Co-Authored-By: Adam R. Jensen <[email protected]> * More unitless Co-Authored-By: Adam R. Jensen <[email protected]> * Apply suggestions from Cliff Co-authored-by: Cliff Hansen <[email protected]> --------- Co-authored-by: Kevin Anderson <[email protected]> Co-authored-by: Anton Driesse <[email protected]> Co-authored-by: Will Holmgren <[email protected]> Co-authored-by: Mark Mikofski <[email protected]> Co-authored-by: Cliff Hansen <[email protected]> Co-authored-by: Adam R. Jensen <[email protected]> Co-authored-by: Cliff Hansen <[email protected]> Co-authored-by: Kevin Anderson <[email protected]> Co-authored-by: Ioannis Sifnaios <[email protected]>
1 parent 3f2daab commit 35599e7

File tree

6 files changed

+477
-1
lines changed

6 files changed

+477
-1
lines changed
Lines changed: 272 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,272 @@
1+
"""
2+
Modelling shading losses in modules with bypass diodes
3+
======================================================
4+
"""
5+
6+
# %%
7+
# This example illustrates how to use the loss model proposed by Martinez et
8+
# al. [1]_. The model proposes a power output losses factor by adjusting
9+
# the incident direct and circumsolar beam irradiance fraction of a PV module
10+
# based on the number of shaded *blocks*. A *block* is defined as a group of
11+
# cells protected by a bypass diode. More information on *blocks* can be found
12+
# in the original paper [1]_ and in the
13+
# :py:func:`pvlib.shading.direct_martinez` documentation.
14+
#
15+
# The following key functions are used in this example:
16+
#
17+
# 1. :py:func:`pvlib.shading.direct_martinez` to calculate the power output
18+
# losses fraction due to shading.
19+
# 2. :py:func:`pvlib.shading.shaded_fraction1d` to calculate the fraction of
20+
# shaded surface and consequently the number of shaded *blocks* due to
21+
# row-to-row shading.
22+
# 3. :py:func:`pvlib.tracking.singleaxis` to calculate the rotation angle of
23+
# the trackers.
24+
#
25+
# .. sectionauthor:: Echedey Luis <echelual (at) gmail.com>
26+
#
27+
# Problem description
28+
# -------------------
29+
# Let's consider a PV system with the following characteristics:
30+
#
31+
# - Two north-south single-axis trackers, each one having 6 modules.
32+
# - The rows have the same true-tracking tilt angles. True tracking
33+
# is chosen in this example, so shading is significant.
34+
# - Terrain slope is 7 degrees downward to the east.
35+
# - Row axes are horizontal.
36+
# - The modules are comprised of multiple cells. We will compare these cases:
37+
# - modules with one bypass diode
38+
# - modules with three bypass diodes
39+
# - half-cut cell modules with three bypass diodes in portrait and landscape
40+
#
41+
# Setting up the system
42+
# ----------------------
43+
# Let's start by defining the system characteristics, location and the time
44+
# range for the analysis.
45+
46+
import pvlib
47+
import pandas as pd
48+
import numpy as np
49+
import matplotlib.pyplot as plt
50+
from matplotlib.dates import ConciseDateFormatter
51+
52+
pitch = 4 # meters
53+
width = 1.5 # meters
54+
gcr = width / pitch # ground coverage ratio
55+
N_modules_per_row = 6
56+
axis_azimuth = 180 # N-S axis
57+
axis_tilt = 0 # flat because the axis is perpendicular to the slope
58+
cross_axis_tilt = -7 # 7 degrees downward to the east
59+
60+
latitude, longitude = 40.2712, -3.7277
61+
locus = pvlib.location.Location(
62+
latitude,
63+
longitude,
64+
tz="Europe/Madrid",
65+
altitude=pvlib.location.lookup_altitude(latitude, longitude),
66+
)
67+
68+
times = pd.date_range("2001-04-11T04", "2001-04-11T20", freq="10min")
69+
70+
# %%
71+
# True-tracking algorithm and shaded fraction
72+
# -------------------------------------------
73+
# Since this model is about row-to-row shading, we will use the true-tracking
74+
# algorithm to calculate the trackers rotation. Back-tracking eliminates
75+
# shading between rows, and since this example is about shading, we will not
76+
# use it.
77+
#
78+
# Then, the next step is to calculate the fraction of shaded surface. This is
79+
# done using :py:func:`pvlib.shading.shaded_fraction1d`. Using this function is
80+
# straightforward with the variables we already have defined.
81+
# Then, we can calculate the number of shaded blocks by rounding up the shaded
82+
# fraction by the number of blocks along the shaded length.
83+
84+
# Calculate solar position to get single-axis tracker rotation and irradiance
85+
solar_pos = locus.get_solarposition(times)
86+
solar_apparent_zenith, solar_azimuth = (
87+
solar_pos["apparent_zenith"],
88+
solar_pos["azimuth"],
89+
) # unpack for better readability
90+
91+
tracking_result = pvlib.tracking.singleaxis(
92+
apparent_zenith=solar_apparent_zenith,
93+
apparent_azimuth=solar_azimuth,
94+
axis_tilt=axis_tilt,
95+
axis_azimuth=axis_azimuth,
96+
max_angle=(-90 + cross_axis_tilt, 90 + cross_axis_tilt), # (min, max)
97+
backtrack=False,
98+
gcr=gcr,
99+
cross_axis_tilt=cross_axis_tilt,
100+
)
101+
102+
tracker_theta, aoi, surface_tilt, surface_azimuth = (
103+
tracking_result["tracker_theta"],
104+
tracking_result["aoi"],
105+
tracking_result["surface_tilt"],
106+
tracking_result["surface_azimuth"],
107+
) # unpack for better readability
108+
109+
# Calculate the shade fraction
110+
shaded_fraction = pvlib.shading.shaded_fraction1d(
111+
solar_apparent_zenith,
112+
solar_azimuth,
113+
axis_azimuth,
114+
axis_tilt=axis_tilt,
115+
shaded_row_rotation=tracker_theta,
116+
shading_row_rotation=tracker_theta,
117+
collector_width=width,
118+
pitch=pitch,
119+
cross_axis_slope=cross_axis_tilt,
120+
)
121+
122+
# %%
123+
# Number of shaded blocks
124+
# -----------------------
125+
# The number of shaded blocks depends on the module configuration and number
126+
# of bypass diodes. For example,
127+
# modules with one bypass diode will behave like one block.
128+
# On the other hand, modules with three bypass diodes will have three blocks,
129+
# except for the half-cut cell modules, which will have six blocks; 2x3 blocks
130+
# where the two rows are along the longest side of the module.
131+
# We can argue that the dimensions of the system change when you switch from
132+
# portrait to landscape, but for this example, we will consider it the same.
133+
#
134+
# The number of shaded blocks is calculated by rounding up the shaded fraction
135+
# by the number of blocks along the shaded length. So let's define the number
136+
# of blocks for each module configuration:
137+
#
138+
# - 1 bypass diode: 1 block
139+
# - 3 bypass diodes: 3 blocks in landscape; 1 in portrait
140+
# - 3 bypass diodes half-cut cells:
141+
# - 2 blocks in portrait
142+
# - 3 blocks in landscape
143+
#
144+
# .. figure:: ../../_images/PV_module_layout_cesardd.jpg
145+
# :align: center
146+
# :width: 75%
147+
# :alt: Normal and half-cut cells module layouts
148+
#
149+
# Left: common module layout. Right: half-cut cells module layout.
150+
# Each module has three bypass diodes. On the left, they connect cell
151+
# columns 1-2, 2-3 & 3-4. On the right, they connect cell columns 1-2, 3-4 &
152+
# 5-6.
153+
# *Source: César Domínguez. CC BY-SA 4.0, Wikimedia Commons*
154+
#
155+
# In the image above, each orange U-shaped string section is a block.
156+
# By symmetry, the yellow inverted-U's of the subcircuit are also blocks.
157+
# For this reason, the half-cut cell modules have 6 blocks in total: two along
158+
# the longest side and three along the shortest side.
159+
160+
blocks_per_module = {
161+
"1 bypass diode": 1,
162+
"3 bypass diodes": 3,
163+
"3 bypass diodes half-cut, portrait": 2,
164+
"3 bypass diodes half-cut, landscape": 3,
165+
}
166+
167+
# Calculate the number of shaded blocks during the day
168+
shaded_blocks_per_module = {
169+
k: np.ceil(blocks_N * shaded_fraction)
170+
for k, blocks_N in blocks_per_module.items()
171+
}
172+
173+
# %%
174+
# Plane of array irradiance example data
175+
# --------------------------------------
176+
# To calculate the power output losses due to shading, we need the plane of
177+
# array irradiance. For this example, we will use synthetic data:
178+
179+
clearsky = locus.get_clearsky(
180+
times, solar_position=solar_pos, model="ineichen"
181+
)
182+
dni_extra = pvlib.irradiance.get_extra_radiation(times)
183+
airmass = pvlib.atmosphere.get_relative_airmass(solar_apparent_zenith)
184+
sky_diffuse = pvlib.irradiance.perez_driesse(
185+
surface_tilt, surface_azimuth, clearsky["dhi"], clearsky["dni"],
186+
solar_apparent_zenith, solar_azimuth, dni_extra, airmass,
187+
) # fmt: skip
188+
poa_components = pvlib.irradiance.poa_components(
189+
aoi, clearsky["dni"], sky_diffuse, poa_ground_diffuse=0
190+
) # ignore ground diffuse for brevity
191+
poa_global, poa_direct = (
192+
poa_components["poa_global"],
193+
poa_components["poa_direct"],
194+
)
195+
196+
# %%
197+
# Results
198+
# -------
199+
# Now that we have the number of shaded blocks for each module configuration,
200+
# we can apply the model and estimate the power loss due to shading.
201+
#
202+
# Note that this model is not linear with the shaded blocks ratio, so there is
203+
# a difference between applying it to just a module or a whole row.
204+
205+
shade_losses_per_module = {
206+
k: pvlib.shading.direct_martinez(
207+
poa_global=poa_global,
208+
poa_direct=poa_direct,
209+
shaded_fraction=shaded_fraction,
210+
shaded_blocks=module_shaded_blocks,
211+
total_blocks=blocks_per_module[k],
212+
)
213+
for k, module_shaded_blocks in shaded_blocks_per_module.items()
214+
}
215+
216+
shade_losses_per_row = {
217+
k: pvlib.shading.direct_martinez(
218+
poa_global=poa_global,
219+
poa_direct=poa_direct,
220+
shaded_fraction=shaded_fraction,
221+
shaded_blocks=module_shaded_blocks * N_modules_per_row,
222+
total_blocks=blocks_per_module[k] * N_modules_per_row,
223+
)
224+
for k, module_shaded_blocks in shaded_blocks_per_module.items()
225+
}
226+
227+
# %%
228+
# Plotting the results
229+
# ^^^^^^^^^^^^^^^^^^^^
230+
231+
fig, (ax1, ax2) = plt.subplots(2, 1, sharex=True)
232+
fig.suptitle("Martinez power losses due to shading")
233+
for k, shade_losses in shade_losses_per_module.items():
234+
linestyle = "--" if k == "3 bypass diodes half-cut, landscape" else "-"
235+
ax1.plot(times, shade_losses, label=k, linestyle=linestyle)
236+
ax1.legend(loc="upper center")
237+
ax1.grid()
238+
ax1.set_xlabel("Time")
239+
ax1.xaxis.set_major_formatter(
240+
ConciseDateFormatter("%H:%M", tz="Europe/Madrid")
241+
)
242+
ax1.set_ylabel(r"$P_{out}$ losses")
243+
ax1.set_title("Per module")
244+
245+
for k, shade_losses in shade_losses_per_row.items():
246+
linestyle = "--" if k == "3 bypass diodes half-cut, landscape" else "-"
247+
ax2.plot(times, shade_losses, label=k, linestyle=linestyle)
248+
ax2.legend(loc="upper center")
249+
ax2.grid()
250+
ax2.set_xlabel("Time")
251+
ax2.xaxis.set_major_formatter(
252+
ConciseDateFormatter("%H:%M", tz="Europe/Madrid")
253+
)
254+
ax2.set_ylabel(r"$P_{out}$ losses")
255+
ax2.set_title("Per row")
256+
fig.tight_layout()
257+
fig.show()
258+
259+
# %%
260+
# Note how the half-cut cell module in portrait performs better than the
261+
# normal module with three bypass diodes. This is because the number of shaded
262+
# blocks is less along the shaded length is higher in the half-cut module.
263+
# This is the reason why half-cut cell modules are preferred in portrait
264+
# orientation.
265+
266+
# %%
267+
# References
268+
# ----------
269+
# .. [1] F. Martínez-Moreno, J. Muñoz, and E. Lorenzo, 'Experimental model
270+
# to estimate shading losses on PV arrays', Solar Energy Materials and
271+
# Solar Cells, vol. 94, no. 12, pp. 2298-2303, Dec. 2010,
272+
# :doi:`10.1016/j.solmat.2010.07.029`.
Loading

docs/sphinx/source/reference/effects_on_pv_system_output/shading.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,4 @@ Shading
1212
shading.sky_diffuse_passias
1313
shading.projected_solar_zenith_angle
1414
shading.shaded_fraction1d
15-
15+
shading.direct_martinez

docs/sphinx/source/whatsnew/v0.11.0.rst

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,9 @@ Enhancements
5757
* Added extraterrestrial and direct spectra of the ASTM G173-03 standard with
5858
the new function :py:func:`pvlib.spectrum.get_reference_spectra`.
5959
(:issue:`1963`, :pull:`2039`)
60+
* Added function :py:func:`pvlib.shading.direct_martinez` to calculate
61+
shading losses by taking into account the amount of bypass diodes of a module.
62+
(:issue:`2063`, :pull:`2070`)
6063
* Add function :py:func:`pvlib.irradiance.diffuse_par_spitters` to calculate the
6164
diffuse fraction of Photosynthetically Active Radiation (PAR) from the
6265
global diffuse fraction and the solar zenith.

0 commit comments

Comments
 (0)