Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
"""
if solar_position is None:
solar_position = self.get_solarposition(times)
if model in atmosphere.APPARENT_ZENITH_MODELS:
zenith = solar_position['apparent_zenith']
elif model in atmosphere.TRUE_ZENITH_MODELS:
zenith = solar_position['zenith']
else:
raise ValueError('{} is not a valid airmass model'.format(model))
airmass_relative = atmosphere.get_relative_airmass(zenith, model)
pressure = atmosphere.alt2pres(self.altitude)
airmass_absolute = atmosphere.get_absolute_airmass(airmass_relative,
pressure)
airmass = pd.DataFrame(index=solar_position.index)
airmass['airmass_relative'] = airmass_relative
airmass['airmass_absolute'] = airmass_absolute
return airmass
Energy Applications", pp. 46-51 CRC Press (2013)
.. [3] `NREL Bird Clear Sky Model `_
.. [4] `SERI/TR-642-761 `_
.. [5] `Error Reports `_
"""
etr = dni_extra # extraradiation
ze_rad = np.deg2rad(zenith) # zenith in radians
airmass = airmass_relative
# Bird clear sky model
am_press = atmosphere.get_absolute_airmass(airmass, pressure)
t_rayleigh = (
np.exp(-0.0903 * am_press ** 0.84 * (
1.0 + am_press - am_press ** 1.01
))
)
am_o3 = ozone*airmass
t_ozone = (
1.0 - 0.1611 * am_o3 * (1.0 + 139.48 * am_o3) ** -0.3034 -
0.002715 * am_o3 / (1.0 + 0.044 * am_o3 + 0.0003 * am_o3 ** 2.0)
)
t_gases = np.exp(-0.0127 * am_press ** 0.26)
am_h2o = airmass * precipitable_water
t_water = (
1.0 - 2.4959 * am_h2o / (
(1.0 + 79.034 * am_h2o) ** 0.6828 + 6.385 * am_h2o
)
times, surface_tilt, surface_azimuth, pressure=101325.,
use_delta_kt_prime=True, temp_dew=None, albedo=.25,
model='perez', model_perez='allsitescomposite1990',
max_iterations=30):
"""
GTI-DIRINT model for AOI < 90 degrees. See Marion 2015 Section 2.1.
See gti_dirint signature for parameter details.
"""
I0 = get_extra_radiation(times, 1370, 'spencer')
cos_zenith = tools.cosd(solar_zenith)
# I0h as in Marion 2015 eqns 1, 3
I0h = I0 * np.maximum(0.065, cos_zenith)
airmass = atmosphere.get_relative_airmass(solar_zenith, model='kasten1966')
airmass = atmosphere.get_absolute_airmass(airmass, pressure)
# these coeffs and diff variables and the loop below
# implement figure 1 of Marion 2015
# make coeffs that is at least 30 elements long so that all
# coeffs can be assigned as specified in Marion 2015.
# slice below will limit iterations if necessary
coeffs = np.empty(max(30, max_iterations))
coeffs[0:3] = 1
coeffs[3:10] = 0.5
coeffs[10:20] = 0.25
coeffs[20:] = 0.125
coeffs = coeffs[:max_iterations] # covers case where max_iterations < 30
# initialize diff
diff = pd.Series(9999, index=times)
wind = pm.cleaned_data[pm.trans['Wind Speed']].squeeze()
temperature = pm.cleaned_data[pm.trans['Ambient Temperature']].squeeze()
poa = pm.cleaned_data[pm.trans['POA']].squeeze()
poa_diffuse = pd.Series(data=0, index=index)
dni = pm.cleaned_data[pm.trans['DNI']].squeeze()
# Compute sun position
solarposition = pvlib.solarposition.get_solarposition(index, location['Latitude'],
location['Longitude'])
# Compute cell temperature
celltemp = pvlib.pvsystem.sapm_celltemp(poa, wind, temperature)
# Compute absolute airmass
airmass_relative = pvlib.atmosphere.get_relative_airmass(solarposition['zenith'])
airmass_absolute = pvlib.atmosphere.get_absolute_airmass(airmass_relative)
# Compute aoi
aoi = pvlib.irradiance.aoi(location['Latitude'], 180, solarposition['zenith'],
solarposition['azimuth'])
# Compute effective irradiance
Ee = pvlib.pvsystem.sapm_effective_irradiance(poa, poa_diffuse, airmass_absolute,
aoi, sapm_parameters)
# Run SAPM
sapm_model = pvlib.pvsystem.sapm(Ee, celltemp['temp_cell'], sapm_parameters)
# Compute the relative error between observed and predicted DC Power.
# Add the composite signal and run a range test
modeled_dcpower = sapm_model['p_mp']*sapm_parameters['Ns']*sapm_parameters['Np']
dc_power_relative_error = np.abs(dcpower - modeled_dcpower)/dcpower
if altitude is None and pressure is None:
altitude = 0.
pressure = 101325.
elif altitude is None:
altitude = atmosphere.pres2alt(pressure)
elif pressure is None:
pressure = atmosphere.alt2pres(altitude)
solar_position = solarposition.get_solarposition(
times, latitude, longitude, altitude=altitude, pressure=pressure,
method=solar_position_method, **kwargs)
# possible error with using apparent zenith with some models
airmass = atmosphere.get_relative_airmass(
solar_position['apparent_zenith'], model=airmass_model)
airmass = atmosphere.get_absolute_airmass(airmass, pressure)
dni_extra = pvlib.irradiance.get_extra_radiation(solar_position.index)
aoi = pvlib.irradiance.aoi(surface_tilt, surface_azimuth,
solar_position['apparent_zenith'],
solar_position['azimuth'])
if irradiance is None:
linke_turbidity = clearsky.lookup_linke_turbidity(
solar_position.index, latitude, longitude)
irradiance = clearsky.ineichen(
solar_position['apparent_zenith'],
airmass,
linke_turbidity,
altitude=altitude,
dni_extra=dni_extra
)
See Also
--------
dirint
"""
# this is the I0 calculation from the reference
# SSC uses solar constant = 1367.0 (checked 2018 08 15)
I0 = get_extra_radiation(datetime_or_doy, 1370., 'spencer')
kt = clearness_index(ghi, solar_zenith, I0, min_cos_zenith=min_cos_zenith,
max_clearness_index=1)
am = atmosphere.get_relative_airmass(solar_zenith, model='kasten1966')
if pressure is not None:
am = atmosphere.get_absolute_airmass(am, pressure)
Kn, am = _disc_kn(kt, am, max_airmass=max_airmass)
dni = Kn * I0
bad_values = (solar_zenith > max_zenith) | (ghi < 0) | (dni < 0)
dni = np.where(bad_values, 0, dni)
output = OrderedDict()
output['dni'] = dni
output['kt'] = kt
output['airmass'] = am
if isinstance(datetime_or_doy, pd.DatetimeIndex):
output = pd.DataFrame(output, index=datetime_or_doy)
return output
Parameters
----------
latitude : float
longitude : float
elevation : float
apparent_zenith : pd.Series
Solar apparent zenith
Returns
-------
cs : pd.DataFrame
Columns are ghi, dni, dhi.
"""
airmass = pvlib.atmosphere.get_relative_airmass(apparent_zenith)
pressure = pvlib.atmosphere.alt2pres(elevation)
am_abs = pvlib.atmosphere.get_absolute_airmass(airmass, pressure)
tl = pvlib.clearsky.lookup_linke_turbidity(apparent_zenith.index,
latitude,
longitude)
dni_extra = pvlib.irradiance.get_extra_radiation(apparent_zenith.index)
cs = pvlib.clearsky.ineichen(apparent_zenith, am_abs, tl,
dni_extra=dni_extra,
altitude=elevation)
return cs
def _gti_dirint_gte_90(poa_global, aoi, solar_zenith, solar_azimuth,
surface_tilt, times, kt_prime,
pressure=101325., temp_dew=None, albedo=.25):
"""
GTI-DIRINT model for AOI >= 90 degrees. See Marion 2015 Section 2.2.
See gti_dirint signature for parameter details.
"""
kt_prime_gte_90 = _gti_dirint_gte_90_kt_prime(aoi, solar_zenith,
solar_azimuth, times,
kt_prime)
I0 = get_extra_radiation(times, 1370, 'spencer')
airmass = atmosphere.get_relative_airmass(solar_zenith, model='kasten1966')
airmass = atmosphere.get_absolute_airmass(airmass, pressure)
kt = kt_prime_gte_90 * _kt_kt_prime_factor(airmass)
disc_dni = np.maximum(_disc_kn(kt, airmass)[0] * I0, 0)
dni_gte_90 = _dirint_from_dni_ktprime(disc_dni, kt_prime, solar_zenith,
False, temp_dew)
dni_gte_90_proj = dni_gte_90 * tools.cosd(solar_zenith)
cos_surface_tilt = tools.cosd(surface_tilt)
# isotropic sky plus ground diffuse
dhi_gte_90 = (
(2 * poa_global - dni_gte_90_proj * albedo * (1 - cos_surface_tilt)) /
(1 + cos_surface_tilt + albedo * (1 - cos_surface_tilt)))
ghi_gte_90 = dni_gte_90_proj + dhi_gte_90