-
Notifications
You must be signed in to change notification settings - Fork 1.1k
Martinez shading factor #2070
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Martinez shading factor #2070
Changes from 189 commits
Commits
Show all changes
197 commits
Select commit
Hold shift + click to select a range
c87885c
Update shading.py
echedey-ls 4fc6cd8
Minimal test
echedey-ls 2a72f33
Implementation
echedey-ls d6e8067
Fix, fix, fix, fix & format
echedey-ls 13a56d4
Format issues
echedey-ls f012aae
Extend tests (compare with singleaxis) & format with ruff
echedey-ls 6dd9a3b
Format fixes
echedey-ls e8743db
Upgrade tests
echedey-ls 6030774
Array -> Axis
echedey-ls 6276382
type
echedey-ls 509699f
Whatsnew
echedey-ls 5ff8fd8
xd
echedey-ls 04126e0
bruh
echedey-ls 607a246
Minor Python optimization a la tracking.singleaxis
echedey-ls 240b551
Comment and minor optimizations
echedey-ls 997def6
Surface -> Axis
echedey-ls 7912055
Elevation -> Zenith
echedey-ls f068e3e
Elev -> Zenith
echedey-ls a5f4a85
Update shading.py
echedey-ls a854e27
Update docstring
echedey-ls 2d82375
Add comments from `tracking.singleaxis`
echedey-ls 5f24721
Singleaxis implementation port & test addition, based on old pvlib.tr…
echedey-ls 049a8cc
Update v0.10.4.rst
echedey-ls a3185df
Linter
echedey-ls b9f1a76
Code review
echedey-ls f7d1d80
Add Fig 5 [1] (still gotta check the built output)
echedey-ls 1880f6a
Add caption, change size and describe in alternate text
echedey-ls d9f242a
rST fixes ?
echedey-ls 379ca95
Figures have captions, images do not
echedey-ls 62e99ad
Flip arguments order
echedey-ls 4f584ea
I forgot :skull:
echedey-ls 238d123
Linter are you happy now?
echedey-ls 98a254d
Remove port test and add edge cases test
echedey-ls 4616175
Update test_shading.py
echedey-ls 33ffd28
Indentation xd
echedey-ls 8526bc6
Update test_shading.py
echedey-ls bde3656
I forgot how to code
echedey-ls 51e3750
Align data
echedey-ls 35738a4
Docstring suggestion from Kevin
echedey-ls 8d679c3
Update link to example?
echedey-ls 4a907c1
add linear shade loss for thin films
mikofski 234288d
add tests, update docs, what's new
mikofski fb0e5d1
fix what's new gh issue and pr links
mikofski aa4b6e8
fix trailing whitespace
mikofski 18b2187
responding to comments
mikofski 4163a72
update docstring for linear shade loss
mikofski 1ebf8ea
update example in linear_shade_loss
mikofski de2144f
add figure and formulas to shaded fraction
mikofski 6aa43f0
shaded fraction consistently
mikofski c34a2f6
Add alternative text to image
echedey-ls 6b9f478
Update implementation based on PSZ PR. See description.
echedey-ls c3a9569
Whatsnew entries
echedey-ls 4bb02ab
Linter
echedey-ls 78c481e
Clear things, convert Mark's reference to a reference
echedey-ls 0ce0d68
Linter
echedey-ls 74b4215
Update according to changes at PSZA PR
echedey-ls 909cc23
Another commit, another try
echedey-ls e3e73f6
Ahhh, I rebased too fast
echedey-ls cbb0b04
whatsnews
echedey-ls 96b61a8
Update v0.10.4.rst
echedey-ls d2b9291
Update v0.10.3.rst
echedey-ls 7ec4d64
Merge branch 'main' into pr1725-continuation-shaded-fraction-mikofski
echedey-ls bbc6115
Rename to `shaded_fraction1d`, change params to `surface_*` instead o…
echedey-ls 39a3ba9
Left this tracker refs behind
echedey-ls a3ccf3e
Change rename in rst entries
echedey-ls e5fffca
Add another testcase
echedey-ls 457d4b4
Improve docs references, clarify nomenclature
echedey-ls f11858e
Update test_shading.py
echedey-ls f321cc1
Merge branch 'main' into linear-shade-mikofski-pr-1725
echedey-ls 0ab3720
Remove linear_shade_loss
echedey-ls e6da6e8
First implementation of the new shaded fraction model (missing figure)
echedey-ls 4ce1655
Create Anderson_Jensen_2024_Fig3.png
echedey-ls 60b7e2e
Update shading.py
echedey-ls 2d23cb2
Update shading.py
echedey-ls 78a451c
Update shading.py
echedey-ls 28128f6
lintaaargggg
echedey-ls f4acf39
Fill reference
echedey-ls 104d185
Next release 0.10.5?
echedey-ls 894ff9f
Fix tests
echedey-ls f147881
Update test_shading.py
echedey-ls 4d11294
Little improvement to table definitions
echedey-ls 69c76cf
Change `l` to `\ell`
echedey-ls 758f5e7
`pvlib.tracking.projected_solar_zenith_angle` to `pvlib.shading.proje…
echedey-ls 6882dfa
pitch references to `pitch`
echedey-ls 4ef4567
`trackers_axis_azimuth` to `axis_azimuth`
echedey-ls 574a1a2
whatsnews
echedey-ls efac0b3
Update v0.10.5.rst
echedey-ls 3a726b8
Change `tilt`s to `rotation`s and add `axis_tilt`
echedey-ls 300b912
Forgot to update tests :skull:
echedey-ls 497a62e
Merge branch 'main' into terrain-slope-mikofski-pr-1725
echedey-ls 2a34f43
Merge branch 'main' into pr1725-continuation-shaded-fraction-mikofski
echedey-ls c1b3978
Add examples section
echedey-ls db8edd6
roles assumption messin w/ me docs :astonished:
echedey-ls d65e64d
roles assumption messin w/ me docs :astonished:
echedey-ls 51a2dfa
Merge branch 'pr1725-continuation-shaded-fraction-mikofski' of https:…
echedey-ls 9038097
Update shading.py
echedey-ls 5652801
Update shading.py
echedey-ls 31affba
Add gallery example
echedey-ls 80ab494
This was fixed in recent sphinx-gallery releases IIRC
echedey-ls facde21
Extra empty line or admonition type unsupported
echedey-ls 5a807b7
Fix example link (hopefully :pray: )
echedey-ls 25a0f19
Update shading.py
echedey-ls 8bdd469
Fix subsubsections?
echedey-ls a2e8be7
Nah, bulleted list didn't work
echedey-ls 9f1fa97
tilted -> tracker, only affects text
echedey-ls 37ab496
Typos and unreasonable physical values
echedey-ls 6303583
See the Examples section below, not the unlinkable link
echedey-ls e785292
tracker -> row, param names, code and docs
echedey-ls 9b98d9e
Fix broken example :wrench:
echedey-ls 3726e4d
Apply suggestions from code review
echedey-ls 4e7e36f
"the row axis/axes" instead of ``axis_azimuth``
echedey-ls 59465c8
Unnecessary math mode
echedey-ls 9fa2bb4
Example suggestions and text trimming
echedey-ls 1be1d3e
Merge branch 'main' into terrain-slope-mikofski-pr-1725
echedey-ls 0d521ee
whatsmes
echedey-ls f01bd6f
Add test to fix coverage issue
echedey-ls 28f8bb4
Initial work
echedey-ls 6d1755e
Can't test with the paper data, wtf
echedey-ls 60030ca
Little things
echedey-ls 6dcb517
Update plot_martinez_shade_loss.py
echedey-ls 55b89bc
More improvements
echedey-ls fd4eded
Be4 rebase
echedey-ls b640c24
Fix fixture
echedey-ls ba15ab1
Initial work
echedey-ls beee0f1
Fix tests
echedey-ls 56a4f46
docstring
echedey-ls 7a57310
whatsnew :pencil:
echedey-ls adf6dcc
Minor thingies
echedey-ls ec717a9
Add figure, improve docs :100:
echedey-ls a357c11
Fix silently ignoring file path in `pvsystem.retrieve_sam` when `name…
echedey-ls de46cc0
Fix Ixx equation in pvsystem.sapm (#2019)
cwhanse 1d5a9e6
Increase python requirement to >= 3.8 (#2029)
kandersolar cdb50ba
Finalize 0.10.5 (#2035)
kandersolar d697e76
update whatsnews
echedey-ls bc8598e
Update test_shading.py
echedey-ls 6153c46
Merge branch 'main' into martinez-shading-factor
echedey-ls bc79bb8
Example
echedey-ls 74e1e44
Fix whatsmes
echedey-ls 76eb1ca
Update v0.11.0.rst
echedey-ls 6db8f7c
other img
echedey-ls 8db5e55
lintarrrrrr :sob:
echedey-ls b4d255b
docs
echedey-ls 5e0677c
docs refurbishment
echedey-ls 2e52cf9
Update plot_martinez_shade_loss.py
echedey-ls 847ae5c
Fix parameter names
echedey-ls 19734dc
More explicit 2D shaded fraction
echedey-ls da32fd3
Explicitier explicit
echedey-ls cc7ce5d
Update shading.py
echedey-ls 15ec5c4
Only if life was VCS to revert my errors so easily
echedey-ls 610fd97
Nix image in docstring
echedey-ls d6430bb
Clear-up irrdiance loss, not pwr loss - yet again
echedey-ls 161f828
rewording
echedey-ls bccd3da
Remove figure of junction boxes in example
echedey-ls 0f2fb31
Duplicated singleaxis call
echedey-ls 48be1c8
When did I change this?
echedey-ls 6f2ed39
Rename function
echedey-ls 9d5c918
Make times just one statement
echedey-ls c54020a
Fix uncomplete example in docstring
echedey-ls 6116c64
flake is a snowflake :snowflake:
echedey-ls b20b9cc
Delete Centralized_and_split_PV_junction_boxes_cesardd.jpg
echedey-ls 9b84ed5
Remove example description
echedey-ls b20c535
Change example title
echedey-ls 820ffbf
Ints for number of blocks
echedey-ls 46df544
Rephrasing of shaded fraction 2D
echedey-ls d3343a5
Merge branch 'main' into martinez-shading-factor
echedey-ls d7a5cad
typo
echedey-ls 6e030aa
Code review from Ioannis
echedey-ls b0b4e7c
no more noqa e501
echedey-ls dee5d49
Will this work to hide code?
echedey-ls 14fe993
Update plot_martinez_shade_loss.py
echedey-ls 94c2d23
play time with the matplotlib statements
echedey-ls e70090f
This fixes it (I believe :pray: )
echedey-ls 69e6771
Update plot_martinez_shade_loss.py
echedey-ls dc4fbc0
Nah, let's see how this does
echedey-ls b071ba4
Revert attempt to colapse code
echedey-ls 5cd4f9b
Merge branch 'main' into martinez-shading-factor
echedey-ls 192a039
Power losses model
echedey-ls 91862f5
equations rendering
echedey-ls c444639
Merge branch 'main' into martinez-shading-factor
echedey-ls 48a9004
Change `poa_direct_and_circumsolar` to `poa_direct`
echedey-ls e4076f7
Merge branch 'martinez-shading-factor' of https://github.com/echedey-…
echedey-ls 9da4834
Example link
echedey-ls 6ef91b8
`power_loss` -> `loss_fraction`
echedey-ls 37d4ca0
Typo when applying Ioannis suggestion
echedey-ls 329fe23
Re-arrange POA to its own section in example
echedey-ls cf9acec
Mis-redaction in normal/half-cut modules comparison
echedey-ls 8180654
Add edge cases
echedey-ls 874c0a4
Link yet again
echedey-ls 46cedd8
Fix link for sure
echedey-ls 954b05f
Remove critical error from docs build
echedey-ls 00f1eff
Apply suggestions from code review (Cliff)
echedey-ls ec3931f
Linter
echedey-ls 8ed87b6
Apply suggestions from Adam
echedey-ls da0b75d
Merge branch 'main' into martinez-shading-factor
echedey-ls 95769bf
Rewording from code review
echedey-ls 8841020
More unitless
echedey-ls 9483fda
Apply suggestions from Cliff
echedey-ls File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,276 @@ | ||
""" | ||
Modelling shading losses in modules with bypass diodes | ||
====================================================== | ||
""" | ||
|
||
# %% | ||
# This example illustrates how to use the model proposed by Martinez et al. | ||
# [1]_. The model proposes a power output losses factor by adjusting | ||
# the incident direct and circumsolar beam irradiance fraction of a PV module | ||
# based on the number of shaded *blocks*. A *block* is defined as a group of | ||
# cells protected by a bypass diode. More information on *blocks* can be found | ||
# in the original paper [1]_ and in the | ||
# :py:func:`pvlib.shading.direct_martinez` documentation. | ||
# | ||
# The following key functions are used in this example: | ||
# | ||
# 1. :py:func:`pvlib.shading.direct_martinez` to calculate the power output | ||
# losses fraction due to shading. | ||
# 2. :py:func:`pvlib.shading.shaded_fraction1d` to calculate the fraction of | ||
# shaded surface and consequently the number of shaded *blocks* due to | ||
# row-to-row shading. | ||
# 3. :py:func:`pvlib.tracking.singleaxis` to calculate the rotation angle of | ||
# the trackers. | ||
# | ||
# .. sectionauthor:: Echedey Luis <echelual (at) gmail.com> | ||
# | ||
# Problem description | ||
# ------------------- | ||
# Let's consider a PV system with the following characteristics: | ||
# | ||
# - Two north-south single-axis trackers, each one having 6 modules. | ||
# - The rows have the same true-tracking tilt angles. True tracking | ||
# is chosen in this example, so shading is significant. | ||
# - Terrain slope is 7 degrees downward to the east. | ||
# - Rows' axes are horizontal. | ||
echedey-ls marked this conversation as resolved.
Show resolved
Hide resolved
|
||
# - The modules are comprised of multiple cells. We will compare these cases: | ||
# - modules with one bypass diode | ||
# - modules with three bypass diodes | ||
# - half-cut cell modules with three bypass diodes on portrait and landscape | ||
echedey-ls marked this conversation as resolved.
Show resolved
Hide resolved
|
||
# | ||
# Setting up the system | ||
# ---------------------- | ||
# Let's start by defining the system characteristics, location and the time | ||
# range for the analysis. | ||
|
||
import pvlib | ||
import pandas as pd | ||
import numpy as np | ||
import matplotlib.pyplot as plt | ||
from matplotlib.dates import ConciseDateFormatter | ||
|
||
pitch = 4 # meters | ||
width = 1.5 # meters | ||
gcr = width / pitch # ground coverage ratio | ||
N_modules_per_row = 6 | ||
axis_azimuth = 180 # N-S axis | ||
axis_tilt = 0 # flat because the axis is perpendicular to the slope | ||
cross_axis_tilt = -7 # 7 degrees downward to the east | ||
|
||
latitude, longitude = 40.2712, -3.7277 | ||
locus = pvlib.location.Location( | ||
latitude, | ||
longitude, | ||
tz="Europe/Madrid", | ||
altitude=pvlib.location.lookup_altitude(latitude, longitude), | ||
) | ||
|
||
times = pd.date_range("2001-04-11T04", "2001-04-11T20", freq="10min") | ||
|
||
# %% | ||
# True-tracking algorithm and shaded fraction | ||
# ------------------------------------------- | ||
# Since this model is about row-to-row shading, we will use the true-tracking | ||
# algorithm to calculate the trackers rotation. Back-tracking reduces the | ||
# shading between rows, but since this example is about shading, we will not | ||
# use it. | ||
echedey-ls marked this conversation as resolved.
Show resolved
Hide resolved
|
||
# | ||
# Then, the next step is to calculate the fraction of shaded surface. This is | ||
# done using :py:func:`pvlib.shading.shaded_fraction1d`. Using this function is | ||
# straightforward with the variables we already have defined. | ||
# Then, we can calculate the number of shaded blocks by rounding up the shaded | ||
# fraction by the number of blocks along the shaded length. | ||
|
||
# Calculate solar position to get single-axis tracker rotation and irradiance | ||
solar_pos = locus.get_solarposition(times) | ||
solar_apparent_zenith, solar_azimuth = ( | ||
solar_pos["apparent_zenith"], | ||
solar_pos["azimuth"], | ||
) # unpack for better readability | ||
|
||
tracking_result = pvlib.tracking.singleaxis( | ||
apparent_zenith=solar_apparent_zenith, | ||
apparent_azimuth=solar_azimuth, | ||
axis_tilt=axis_tilt, | ||
axis_azimuth=axis_azimuth, | ||
max_angle=(-90 + cross_axis_tilt, 90 + cross_axis_tilt), # (min, max) | ||
backtrack=False, | ||
gcr=gcr, | ||
cross_axis_tilt=cross_axis_tilt, | ||
) | ||
|
||
tracker_theta, aoi, surface_tilt, surface_azimuth = ( | ||
tracking_result["tracker_theta"], | ||
tracking_result["aoi"], | ||
tracking_result["surface_tilt"], | ||
tracking_result["surface_azimuth"], | ||
) # unpack for better readability | ||
|
||
# Calculate the shade fraction | ||
shaded_fraction = pvlib.shading.shaded_fraction1d( | ||
solar_apparent_zenith, | ||
solar_azimuth, | ||
axis_azimuth, | ||
axis_tilt=axis_tilt, | ||
shaded_row_rotation=tracker_theta, | ||
shading_row_rotation=tracker_theta, | ||
collector_width=width, | ||
pitch=pitch, | ||
cross_axis_slope=cross_axis_tilt, | ||
) | ||
|
||
# %% | ||
# Number of shaded blocks | ||
# ----------------------- | ||
# The number of shaded blocks depends on the module configuration and number | ||
# of bypass diodes. For example, | ||
# modules with one bypass diode will behave like one block. | ||
# On the other hand, modules with three bypass diodes will have three blocks, | ||
# except for the half-cut cell modules, which will have six blocks; 2x3 blocks | ||
# where the two rows are along the longest side of the module. | ||
# We can argue that the dimensions of the system change when you switch from | ||
# portrait to landscape, but for this example, we will consider it the same. | ||
# | ||
# The number of shaded blocks is calculated by rounding up the shaded fraction | ||
# by the number of blocks along the shaded length. So let's define the number | ||
# of blocks for each module configuration: | ||
# | ||
# - 1 bypass diode: 1 block | ||
# - 3 bypass diodes: 3 blocks in landscape; 1 in portrait | ||
# - 3 bypass diodes half-cut cells: | ||
# - 2 blocks in portrait | ||
# - 3 blocks in landscape | ||
# | ||
# .. figure:: ../../_images/PV_module_layout_cesardd.jpg | ||
# :align: center | ||
# :width: 75% | ||
# :alt: Normal and half-cut cells module layouts | ||
# | ||
# Left: common module layout. Right: half-cut cells module layout. | ||
# Each module has three bypass diodes. On the left, they connect cell | ||
# columns 1-2, 2-3 & 3-4. On the right, they connect cell columns 1-2, 3-4 & | ||
# 5-6. | ||
# *Source: César Domínguez. CC BY-SA 4.0, Wikimedia Commons* | ||
# | ||
# In the image above, each orange U-shaped string section is a block. | ||
# By symmetry, the yellow inverted-U's of the subcircuit are also blocks. | ||
# For this reason, the half-cut cell modules have 6 blocks in total: two along | ||
# the longest side and three along the shortest side. | ||
|
||
blocks_per_module = { | ||
"1 bypass diode": 1, | ||
"3 bypass diodes": 3, | ||
"3 bypass diodes half-cut, portrait": 2, | ||
"3 bypass diodes half-cut, landscape": 3, | ||
} | ||
|
||
# Calculate the number of shaded blocks during the day | ||
shaded_blocks_per_module = { | ||
k: np.ceil(blocks_N * shaded_fraction) | ||
for k, blocks_N in blocks_per_module.items() | ||
} | ||
|
||
# %% | ||
# Plane of array irradiance example data | ||
# -------------------------------------- | ||
# To calculate the power output losses due to shading, we need the plane of | ||
# array irradiance. For this example, we will use synthetic data: | ||
|
||
clearsky = locus.get_clearsky( | ||
times, solar_position=solar_pos, model="ineichen" | ||
) | ||
dhi, dni = ( | ||
clearsky["dhi"], | ||
clearsky["dni"], | ||
) | ||
dni_extra = pvlib.irradiance.get_extra_radiation(times) | ||
airmass = pvlib.atmosphere.get_relative_airmass(solar_apparent_zenith) | ||
sky_diffuse = pvlib.irradiance.perez_driesse( | ||
surface_tilt, surface_azimuth, dhi, dni, | ||
solar_apparent_zenith, solar_azimuth, dni_extra, airmass, | ||
) # fmt: skip | ||
poa_components = pvlib.irradiance.poa_components( | ||
aoi, dni, sky_diffuse, poa_ground_diffuse=0 | ||
echedey-ls marked this conversation as resolved.
Show resolved
Hide resolved
|
||
) # ignore ground diffuse for brevity | ||
poa_global, poa_direct = ( | ||
poa_components["poa_global"], | ||
poa_components["poa_direct"], | ||
) | ||
|
||
# %% | ||
# Results | ||
# ------- | ||
# Now that we have the number of shaded blocks for each module configuration, | ||
# we can apply the model and estimate the power loss due to shading. | ||
# | ||
# Note that this model is not linear with the shaded blocks ratio, so there is | ||
# a difference between applying it to just a module or a whole row. | ||
|
||
shade_losses_per_module = { | ||
k: pvlib.shading.direct_martinez( | ||
poa_global=poa_global, | ||
poa_direct=poa_direct, | ||
shaded_fraction=shaded_fraction, | ||
shaded_blocks=module_shaded_blocks, | ||
total_blocks=blocks_per_module[k], | ||
) | ||
for k, module_shaded_blocks in shaded_blocks_per_module.items() | ||
} | ||
|
||
shade_losses_per_row = { | ||
k: pvlib.shading.direct_martinez( | ||
poa_global=poa_global, | ||
poa_direct=poa_direct, | ||
shaded_fraction=shaded_fraction, | ||
shaded_blocks=module_shaded_blocks * N_modules_per_row, | ||
total_blocks=blocks_per_module[k] * N_modules_per_row, | ||
) | ||
for k, module_shaded_blocks in shaded_blocks_per_module.items() | ||
} | ||
|
||
# %% | ||
# Plotting the results | ||
# ^^^^^^^^^^^^^^^^^^^^ | ||
|
||
fig, (ax1, ax2) = plt.subplots(2, 1, sharex=True) | ||
fig.suptitle("Martinez power losses due to shading") | ||
for k, shade_losses in shade_losses_per_module.items(): | ||
linestyle = "--" if k == "3 bypass diodes half-cut, landscape" else "-" | ||
ax1.plot(times, shade_losses, label=k, linestyle=linestyle) | ||
ax1.legend(loc="upper center") | ||
ax1.grid() | ||
ax1.set_xlabel("Time") | ||
ax1.xaxis.set_major_formatter( | ||
ConciseDateFormatter("%H:%M", tz="Europe/Madrid") | ||
) | ||
ax1.set_ylabel(r"$P_{out}$ losses") | ||
ax1.set_title("Per module") | ||
|
||
for k, shade_losses in shade_losses_per_row.items(): | ||
linestyle = "--" if k == "3 bypass diodes half-cut, landscape" else "-" | ||
ax2.plot(times, shade_losses, label=k, linestyle=linestyle) | ||
ax2.legend(loc="upper center") | ||
ax2.grid() | ||
ax2.set_xlabel("Time") | ||
ax2.xaxis.set_major_formatter( | ||
ConciseDateFormatter("%H:%M", tz="Europe/Madrid") | ||
) | ||
ax2.set_ylabel(r"$P_{out}$ losses") | ||
ax2.set_title("Per row") | ||
fig.tight_layout() | ||
fig.show() | ||
|
||
# %% | ||
# Note how the half-cut cell module in portrait performs better than the | ||
# normal module with three bypass diodes. This is because the number of shaded | ||
# blocks is less along the shaded length is higher in the half-cut module. | ||
# This is the reason why half-cut cell modules are preferred in portrait | ||
# orientation. | ||
|
||
# %% | ||
# References | ||
# ---------- | ||
# .. [1] F. Martínez-Moreno, J. Muñoz, and E. Lorenzo, 'Experimental model | ||
# to estimate shading losses on PV arrays', Solar Energy Materials and | ||
# Solar Cells, vol. 94, no. 12, pp. 2298-2303, Dec. 2010, | ||
# :doi:`10.1016/j.solmat.2010.07.029`. |
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.