Skip to content

Commit

Permalink
updated first_solar_spectral_correction within atmosphere.py (#208)
Browse files Browse the repository at this point in the history
* updated first_solar_spectral_correction within atmosphere.py to \n
account for changes in model that are reflected in the IEEE PVSC 43 publication

* Updated first_solar_spectral_correction withon atmosphere.py   to incorporate recommendations from wholmgren. I replaced list comprehensions with numpy functions, and replaced print statements with warnings

* removing the debugging lines that were accidently left in atmosphere.py
  • Loading branch information
MLEEFS authored and wholmgren committed Jul 11, 2016
1 parent c58ff7f commit 58d77ea
Showing 1 changed file with 47 additions and 11 deletions.
58 changes: 47 additions & 11 deletions pvlib/atmosphere.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
from __future__ import division

import numpy as np
from warnings import warn

APPARENT_ZENITH_MODELS = ('simple', 'kasten1966', 'kastenyoung1989',
'gueymard1993', 'pickering2002')
Expand Down Expand Up @@ -339,7 +340,7 @@ def first_solar_spectral_correction(pw, airmass_absolute, module_type=None,
.. math::
M = c_1 + c_2*AMa + c_3*Pwat + c_4*AMa^.5
+ c_5*Pwat^.5 + c_6*AMa/Pwat
+ c_5*Pwat^.5 + c_6*AMa/Pwat^.5
Default coefficients are determined for several cell types with
known quantum efficiency curves, by using the Simple Model of the
Expand All @@ -348,7 +349,7 @@ def first_solar_spectral_correction(pw, airmass_absolute, module_type=None,
Pwat where:
* 0.5 cm <= Pwat <= 5 cm
* 0.8 <= AMa <= 4.75 (Pressure of 800 mbar and 1.01 <= AM <= 6)
* 1.0 <= AMa <= 5.0
* Spectral range is limited to that of CMP11 (280 nm to 2800 nm)
* spectrum simulated on a plane normal to the sun
* All other parameters fixed at G173 standard
Expand All @@ -358,14 +359,14 @@ def first_solar_spectral_correction(pw, airmass_absolute, module_type=None,
applied to fit Eq. 1 to determine the coefficients for each module.
Based on the PVLIB Matlab function ``pvl_FSspeccorr`` by Mitchell
Lee and Alex Panchula, at First Solar, 2015.
Lee and Alex Panchula, at First Solar, 2016 [2]_.
Parameters
----------
pw : array-like
atmospheric precipitable water (cm).
airmass_absolute :
airmass_absolute : array-like
absolute (pressure corrected) airmass.
module_type : None or string
Expand All @@ -380,7 +381,7 @@ def first_solar_spectral_correction(pw, airmass_absolute, module_type=None,
The module used to calculate the spectral correction
coefficients corresponds to the Mult-crystalline silicon
Manufacturer 2 Model C from [2]_.
Manufacturer 2 Model C from [3]_.
coefficients : array-like
allows for entry of user defined spectral correction
Expand All @@ -406,20 +407,55 @@ def first_solar_spectral_correction(pw, airmass_absolute, module_type=None,
.. [1] Gueymard, Christian. SMARTS2: a simple model of the atmospheric
radiative transfer of sunshine: algorithms and performance
assessment. Cocoa, FL: Florida Solar Energy Center, 1995.
.. [2] Marion, William F., et al. User's Manual for Data for Validating
.. [2] Lee, Mitchell, and Panchula, Alex. "Spectral Correction for
Photovoltaic Module Performance Based on Air Mass and Precipitable
Water." IEEE Photovoltaic Specialists Conference, Portland, 2016
.. [3] Marion, William F., et al. User's Manual for Data for Validating
Models for PV Module Performance. National Renewable Energy
Laboratory, 2014. http://www.nrel.gov/docs/fy14osti/61610.pdf
"""

# --- Screen Input Data ---

# *** Pwat ***
# Replace Pwat Values below 0.1 cm with 0.1 cm to prevent model from
# diverging"

if np.min(pw) < 0.1:
pw = np.maximum(pw, 0.1)
warn('Exceptionally low Pwat values replaced with 0.1 cm to prevent'+
' model divergence')


# Warn user about Pwat data that is exceptionally high
if np.max(pw) > 8:
warn('Exceptionally high Pwat values. Check input data:' +
' model may diverge in this range')


# *** AMa ***
# Replace Extremely High AM with AM 10 to prevent model divergence
# AM > 10 will only occur very close to sunset
if np.max(airmass_absolute) > 10:
airmass_absolute = np.minimum(airmass_absolute,10)

# Warn user about AMa data that is exceptionally low
if np.min(airmass_absolute) < 0.58:
warn('Exceptionally low air mass: ' +
'model not intended for extra-terrestrial use')
# pvl_absoluteairmass(1,pvl_alt2pres(4340)) = 0.58
# Elevation of Mina Pirquita, Argentian = 4340 m. Highest elevation city
# with population over 50,000.


_coefficients = {}
_coefficients['cdte'] = (
0.87102, -0.040543, -0.00929202, 0.10052, 0.073062, -0.0034187)
0.86273, -0.038948, -0.012506, 0.098871, 0.084658, -0.0042948)
_coefficients['monosi'] = (
0.86588, -0.021637, -0.0030218, 0.12081, 0.017514, -0.0012610)
0.85914, -0.020880, -0.0058853, 0.12029, 0.026814, -0.0017810)
_coefficients['xsi'] = _coefficients['monosi']
_coefficients['polysi'] = (
0.84674, -0.028568, -0.0051832, 0.13669, 0.029234, -0.0014207)
0.84090, -0.027539, -0.0079224, 0.13570, 0.038024, -0.0021218)
_coefficients['multisi'] = _coefficients['polysi']

if module_type is not None and coefficients is None:
Expand All @@ -435,6 +471,6 @@ def first_solar_spectral_correction(pw, airmass_absolute, module_type=None,
AMa = airmass_absolute
modifier = (
coeff[0] + coeff[1]*AMa + coeff[2]*pw + coeff[3]*np.sqrt(AMa) +
+ coeff[4]*np.sqrt(pw) + coeff[5]*AMa/pw)
+ coeff[4]*np.sqrt(pw) + coeff[5]*AMa/np.sqrt(pw))

return modifier

0 comments on commit 58d77ea

Please sign in to comment.