-
Notifications
You must be signed in to change notification settings - Fork 1.1k
Add polo-smm #2491
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
base: main
Are you sure you want to change the base?
Add polo-smm #2491
Changes from all commits
3363ace
ceba758
36c9b43
eaa90b4
794ed98
7926a3d
988557c
45e768f
38e5694
c24e013
0a00f1b
2a9d0db
f296c7b
ce862d8
11336ab
e418218
fb0ad0e
450dd37
1eb3293
4892e8d
7513f3e
3e4dd56
b9d21ac
49c8c91
fa3ff32
31fe508
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 | ||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
@@ -710,3 +710,90 @@ def spectral_factor_jrc(airmass, clearsky_index, module_type=None, | |||||||||||||||||
| + coeff[2] * (airmass - 1.5) | ||||||||||||||||||
| ) | ||||||||||||||||||
| return mismatch | ||||||||||||||||||
|
|
||||||||||||||||||
|
|
||||||||||||||||||
| def spectral_factor_polo(precipitable_water, airmass_absolute, aod500, aoi, | ||||||||||||||||||
| altitude, module_type=None, coefficients=None, | ||||||||||||||||||
| albedo=0.2): | ||||||||||||||||||
| """ | ||||||||||||||||||
| Estimate the spectral mismatch for BIPV application in vertical facades. | ||||||||||||||||||
|
|
||||||||||||||||||
| Parameters | ||||||||||||||||||
jesuspolo marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||||||||||||
| ---------- | ||||||||||||||||||
| precipitable_water : numeric | ||||||||||||||||||
| atmospheric precipitable water. [cm] | ||||||||||||||||||
| airmass_absolute : numeric | ||||||||||||||||||
| absolute (pressure-adjusted) airmass. See :term:`airmass_absolute`. | ||||||||||||||||||
| [unitless] | ||||||||||||||||||
| aod500 : numeric | ||||||||||||||||||
| atmospheric aerosol optical depth at 500 nm. [unitless] | ||||||||||||||||||
| aoi : numeric | ||||||||||||||||||
| Angle of incidence on the vertical surface. See :term:`aoi`. | ||||||||||||||||||
|
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. In the paper I read: "...being the angle of incidence corresponding to 90° of tilt angle and the surface azimuth." Does that really mean the same as this comment in the code? |
||||||||||||||||||
| [degrees] | ||||||||||||||||||
| altitude: numeric | ||||||||||||||||||
| altitude over sea level. [m] | ||||||||||||||||||
| module_type : str, optional | ||||||||||||||||||
| One of the following PV technology strings from [1]_: | ||||||||||||||||||
|
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. Are the SR curves used to develop this model open data? |
||||||||||||||||||
|
|
||||||||||||||||||
| * ``'cdte'`` - anonymous CdTe module. | ||||||||||||||||||
| * ``'monosi'`` - anonymous monocrystalline silicon module. | ||||||||||||||||||
| * ``'cigs'`` - anonymous copper indium gallium selenide module. | ||||||||||||||||||
| * ``'asi'`` - anonymous amorphous silicon module. | ||||||||||||||||||
| albedo : float, optional | ||||||||||||||||||
| Ground albedo (default value 0.2). See :term:`albedo`. [unitless] | ||||||||||||||||||
|
|
||||||||||||||||||
| coefficients : array-like, optional | ||||||||||||||||||
| user-defined coefficients, if not using one of the coefficient | ||||||||||||||||||
| sets via the ``module_type`` parameter. | ||||||||||||||||||
jesuspolo marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||||||||||||
|
|
||||||||||||||||||
| Returns | ||||||||||||||||||
| ------- | ||||||||||||||||||
| modifier: numeric | ||||||||||||||||||
| spectral mismatch factor (unitless) which is 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] J. Polo and C. Sanz-Saiz, 'Development of spectral mismatch models | ||||||||||||||||||
| for BIPV applications in building façades', Renewable Energy, vol. 245, | ||||||||||||||||||
| p. 122820, Jun. 2025, :doi:`10.1016/j.renene.2025.122820` | ||||||||||||||||||
| """ | ||||||||||||||||||
| 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') | ||||||||||||||||||
| am_aoi = pvlib.atmosphere.get_relative_airmass(aoi) | ||||||||||||||||||
AdamRJensen marked this conversation as resolved.
Show resolved
Hide resolved
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. This will produce a |
||||||||||||||||||
| pressure = pvlib.atmosphere.alt2pres(altitude) | ||||||||||||||||||
| am90 = pvlib.atmosphere.get_absolute_airmass(am_aoi, pressure) | ||||||||||||||||||
| Ram = am90 / airmass_absolute | ||||||||||||||||||
|
Comment on lines
+768
to
+771
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.
Suggested change
I think it is best to stick as closely as possible to the terminology of the paper. It can be confusing that the airmass mode equation is used to calculate a non-airmass quantity. |
||||||||||||||||||
| f_aoi_rel= pvlib.atmosphere.get_relative_airmass(aoi, model='kastenyoung1989') | ||||||||||||||||||
| pressure = pvlib.atmosphere.alt2pres(altitude) | ||||||||||||||||||
| f_aoi = pvlib.atmosphere.get_absolute_airmass(f_aoi_rel, pressure) | ||||||||||||||||||
| Ram = f_aoi / airmass_absolute | ||||||||||||||||||
| _coefficients = { | ||||||||||||||||||
| 'cdte': (-0.0009, 46.80, 49.20, -0.87, 0.00041, 0.053), | ||||||||||||||||||
| 'monosi': (0.0027, 10.34, 9.48, 0.307, 0.00077, 0.006), | ||||||||||||||||||
| 'cigs': (0.0017, 2.33, 1.30, 0.11, 0.00098, -0.0177), | ||||||||||||||||||
| 'asi': (0.0024, 7.32, 7.09, -0.72, -0.0013, 0.089), | ||||||||||||||||||
| } | ||||||||||||||||||
| c = { | ||||||||||||||||||
| 'asi': (0.0056, -0.020, 1.014), | ||||||||||||||||||
| 'cigs': (-0.0009, -0.0003, 1), | ||||||||||||||||||
| 'cdte': (0.0021, -0.01, 1.01), | ||||||||||||||||||
| 'monosi': (0, -0.003, 1.0), | ||||||||||||||||||
| } | ||||||||||||||||||
| if module_type is not None: | ||||||||||||||||||
| coeff = _coefficients[module_type] | ||||||||||||||||||
| c_albedo = c[module_type] | ||||||||||||||||||
| else: | ||||||||||||||||||
| coeff = coefficients | ||||||||||||||||||
| c_albedo = (0.0, 0.0, 1.0) # 0.2 albedo assumed | ||||||||||||||||||
| smm = coeff[0] * Ram + coeff[1] / (coeff[2] + Ram**coeff[3]) \ | ||||||||||||||||||
| + coeff[4] / aod500 + coeff[5]*np.sqrt(precipitable_water) | ||||||||||||||||||
| # Ground albedo correction | ||||||||||||||||||
| g = c_albedo[0] * (albedo/0.2)**2 \ | ||||||||||||||||||
| + c_albedo[1] * (albedo/0.2) + c_albedo[2] | ||||||||||||||||||
| return g*smm | ||||||||||||||||||
Uh oh!
There was an error while loading. Please reload this page.