-
Notifications
You must be signed in to change notification settings - Fork 1.1k
Implement Caballero et al. spectral factor model #1296
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
Changes from 106 commits
f634e39
b5d7fec
eb948e0
e27c688
03920a6
be39d2e
c9fefeb
125bc16
6a43156
5b890ab
c602a32
97d0e65
0e2d832
8a473ba
397c3e8
7382e36
ed2d4f6
394c4bc
e89248f
25b43df
d9f466e
cdc64fc
422f49f
48474a7
6e9b9d8
43a188c
710cdd3
46519a8
7bc182f
2c36c00
8124675
094d737
f79b8ab
30a6284
38dd836
7e0d7df
3bbf743
38fea4d
92bfc55
5463533
c6cd809
2d338b9
04339ad
c487317
0744b80
6bc7920
ec20bbc
9ebd10e
43a30e5
39c542b
516c059
acaf38d
f937bba
cab0dfa
fd7ec4a
f08b846
ee614f5
2e02b94
4b4e27f
d71455d
e59f7d6
7bf4e52
dc4af99
c09c462
6334d86
72f6cf1
b37cbdb
ff3f660
b4c9dfb
f4ab78f
55ac6a6
d2e7f70
bc353f2
d93b187
5165060
5b16ce3
eb26a2d
4957436
6e10781
4f23ad6
a7b9309
a4560cc
f6d33d4
834fd91
b7d643e
a07c7b6
f9df15b
e1633bf
fea2314
b3b5ee3
1be7250
6a5bbcb
fc37b2d
231129f
ce47bf9
5acd22c
91e6726
0c61d41
7132f5d
ffdd0ba
af41b57
3ad15bb
c314d3c
b56307b
8fa44af
cda92be
c872a3d
3bb26c4
b6a6a08
5b10b84
440ef38
f229255
4ac3a89
dcf7891
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -698,3 +698,153 @@ def angstrom_alpha(aod1, lambda1, aod2, lambda2): | |
pvlib.atmosphere.angstrom_aod_at_lambda | ||
""" | ||
return - np.log(aod1 / aod2) / np.log(lambda1 / lambda2) | ||
|
||
|
||
def caballero_spectral_correction(airmass_absolute, aod500, pw, | ||
module_type=None, coefficients=None, | ||
aod500_ref=0.084, pw_ref=1.42): | ||
r""" | ||
Spectral mismatch modifier based on absolute (pressure-adjusted) | ||
airmass (AM), aerosol optical depth (AOD) at 500 nm and | ||
precipitable water (PW). | ||
|
||
Estimates a spectral mismatch modifier :math:`M` representing | ||
the effect on module short circuit current of variation in the | ||
spectral irradiance. :math:`M` is estimated from absolute | ||
(pressure-adjusted) AM, :math:`ama`, AOD at 500 nm, :math:`aod500` | ||
and PW, :math:`pw` [1]_. | ||
|
||
The best fit polynomial for each atmospheric parameter (AM, AOD, PW) | ||
and PV technology under study has been obtained from synthetic spectra | ||
generated with SMARTS [2]_, considering the following boundary | ||
conditions: | ||
|
||
* :math:`1.0 <= ama <= 5.0` | ||
* :math:`0.05 <= aod500 <= 0.6` | ||
* :math:`0.25 \textrm{cm} <= pw <= 4 \textrm{cm}` | ||
* Spectral range is limited to that of CMP11 (280 nm to 2800 nm) | ||
* All other parameters fixed at G173 standard | ||
|
||
Elevation (deg), AOD and PW data were recorded in the city of Jaén, | ||
Spain for one year synchronously with both, broadband and | ||
spectroradiometric measurements of 30º tilted global irradiance | ||
south-facing logged in 5-min intervals. AM was estimated through | ||
elevation data. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Does this estimation refer to solar elevation? Airmass calculations are pretty standard. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Hi @adriesse, yes it does. The solar elevation was measured by means of a solar spectral irradiance meter (SolarSIM-D2) from Spectrafy Inc. Then the AM was computed by using the sun’s zenith angle (z). Reference: F. Kasten and A. T. Young, “Revised optical air mass tables and approxi-mation formula,” Appl. Opt., vol. 28, pp. 4735–4738, Nov. 15, 1989. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. My thinking was that your responses might make it into the doc string at some point... |
||
|
||
Finally, the spectral mismatch factor was calculated for each | ||
of the PV technologies and a multivariable regression adjustment | ||
as a function of AM, AOD and PW was performed according to [3] and [1]_. | ||
As such, the polynomial adjustment coefficients included in [1] | ||
were obtained. | ||
|
||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think it is very good to have a couple of paragraphs explaining the basics here, but unfortunately I find them hard to understand. If you recorded AM, AOD, PW and spectra, then where does smarts come in? I guess I should read the paper, but this text should also be consistent and comprehensible on its own. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Hi @adriesse, the reason for using synthetic spectra, generated through SMARTS2, was to ascertain the ideal polynomial type of the experimental equations related to the AM, AOD and PW parameters. |
||
|
||
Parameters | ||
---------- | ||
airmass_absolute : array-like | ||
absolute (pressure-adjusted) airmass. [unitless] | ||
|
||
aod500 : array-like | ||
atmospheric aerosol optical depth at 500 nm. [unitless] | ||
|
||
pw : array-like | ||
atmospheric precipitable water. [cm] | ||
|
||
module_type : None or string, default None | ||
kandersolar marked this conversation as resolved.
Show resolved
Hide resolved
|
||
a string specifying a cell type. Values of 'cdte', 'monosi', 'cigs', | ||
'multisi','asi' and 'perovskite'. If provided, | ||
module_type selects default coefficients for the following modules: | ||
|
||
* 'cdte' - anonymous CdTe module. | ||
* 'monosi', - anonymous sc-si module. | ||
* 'multisi', - anonymous mc-si- module. | ||
* 'cigs' - anonymous copper indium gallium selenide module. | ||
* 'asi' - anonymous amorphous silicon module. | ||
* 'perovskite' - anonymous pervoskite module. | ||
Jacc0027 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
coefficients : None or array-like, optional | ||
the coefficients employed have been obtained with experimental | ||
data in the city of Jaén, Spain. It is pending to verify if such | ||
coefficients vary in places with extreme climates where AOD and | ||
pw values are frequently high. | ||
|
||
aod500_ref : numeric, default 0.084 | ||
atmospheric aerosol optical depth at 500nm value related to the | ||
AM1.5G ASTMG-173-03 reference spectrum. [unitless] | ||
|
||
pw_ref : numeric, default 1.42 | ||
atmospheric precipitable water value related to the AM1.5G ASTMG-173-03 | ||
reference spectrum. [cm] | ||
|
||
Returns | ||
------- | ||
modifier: array-like | ||
spectral mismatch factor (unitless) which is can be multiplied | ||
with broadband irradiance reaching a module's cells to estimate | ||
effective irradiance, i.e., the irradiance that is converted to | ||
electrical current. | ||
|
||
References | ||
---------- | ||
.. [1] Caballero, J.A., Fernández, E., Theristis, M., | ||
Almonacid, F., and Nofuentes, G. "Spectral Corrections Based on | ||
Air Mass, Aerosol Optical Depth and Precipitable Water | ||
for PV Performance Modeling." | ||
IEEE Journal of Photovoltaics 2018, 8(2), 552-558. | ||
https://doi.org/10.1109/jphotov.2017.2787019 | ||
.. [2] Gueymard, Christian. SMARTS2: a simple model of the | ||
atmospheric radiative transfer of sunshine: algorithms | ||
and performance assessment. Cocoa, FL: | ||
Florida Solar Energy Center, 1995. | ||
.. [3] Theristis, M., Fernández, E., Almonacid, F., and | ||
Pérez-Higueras, Pedro. "Spectral Corrections Based | ||
on Air Mass, Aerosol Optical Depth and Precipitable | ||
Water for CPV Performance Modeling." | ||
IEEE Journal of Photovoltaics 2016, 6(6), 1598-1604. | ||
https://doi.org/10.1109/jphotov.2016.2606702 | ||
|
||
""" | ||
|
||
# Experimental coefficients | ||
|
||
_coefficients = {} | ||
_coefficients['cdte'] = ( | ||
1.0044, 0.0095, -0.0037, 0.0002, 0.0000, -0.0046, | ||
-0.0182, 0, 0.0095, 0.0068, 0, 1) | ||
_coefficients['monosi'] = ( | ||
0.9706, 0.0377, -0.0123, 0.0025, -0.0002, 0.0159, | ||
-0.0165, 0, -0.0016, -0.0027, 1, 0) | ||
_coefficients['multisi'] = ( | ||
0.9836, 0.0254, -0.0085, 0.0016, -0.0001, 0.0094, | ||
-0.0132, 0, -0.0002, -0.0011, 1, 0) | ||
_coefficients['cigs'] = ( | ||
0.9801, 0.0283, -0.0092, 0.0019, -0.0001, 0.0117, | ||
-0.0126, 0, -0.0011, -0.0019, 1, 0) | ||
_coefficients['asi'] = ( | ||
1.1060, -0.0848, 0.0302, -0.0076, 0.0006, -0.1283, | ||
0.0986, -0.0254, 0.0156, 0.0146, 1, 0) | ||
_coefficients['perovskite'] = ( | ||
1.0637, -0.0491, 0.0180, -0.0047, 0.0004, -0.0773, | ||
0.0583, -0.0159, 0.01251, 0.0109, 1, 0) | ||
|
||
if module_type is None and coefficients is None: | ||
raise ValueError('Must provide either `module_type` or `coefficients`') | ||
if module_type is not None and coefficients is not None: | ||
raise ValueError('Only one of `module_type` and `coefficients` should ' | ||
'be provided') | ||
if module_type is not None: | ||
coeff = _coefficients[module_type] | ||
else: | ||
coeff = coefficients | ||
|
||
# Evaluate Spectral Shift | ||
Jacc0027 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
ama = airmass_absolute | ||
modifier = ( | ||
coeff[0] + (ama) * coeff[1] + (ama * ama) * coeff[2] | ||
+ (ama * ama * ama) * coeff[3] + (ama * ama * ama * ama) * coeff[4] | ||
+ (aod500 - aod500_ref) * coeff[5] | ||
+ ((aod500 - aod500_ref) * (ama) * coeff[6]) * coeff[10] | ||
+ ((aod500 - aod500_ref) * (np.log(ama)) * coeff[6]) * coeff[11] | ||
+ (aod500 - aod500_ref) * (ama * ama) * coeff[7] | ||
+ (pw - pw_ref) * coeff[8] + (pw - pw_ref) * (np.log(ama)) * coeff[9]) | ||
kandersolar marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
return modifier |
Uh oh!
There was an error while loading. Please reload this page.