def cloud_cover_to_irradiance_campbell_norman(self, cloud_cover, **kwargs): """ Estimates irradiance from cloud cover in the following steps: 1. Determine transmittance using a function of cloud cover e.g. :py:meth:`~ForecastModel.cloud_cover_to_transmittance_linear` 2. Calculate GHI, DNI, DHI using the :py:func:`pvlib.irradiance.campbell_norman` model Parameters ---------- cloud_cover : Series Returns ------- irradiance : DataFrame Columns include ghi, dni, dhi """ # in principle, get_solarposition could use the forecast # pressure, temp, etc., but the cloud cover forecast is not # accurate enough to justify using these minor corrections solar_position = self.location.get_solarposition(cloud_cover.index) dni_extra = get_extra_radiation(cloud_cover.index) transmittance = self.cloud_cover_to_transmittance_linear( cloud_cover, **kwargs) irrads = campbell_norman(solar_position['apparent_zenith'], transmittance, dni_extra=dni_extra) irrads = irrads.fillna(0) return irrads
def test_campbell_norman(): expected = pd.DataFrame(np.array( [[863.859736967, 653.123094076, 220.65905025]]), columns=['ghi', 'dni', 'dhi'], index=[0]) out = irradiance.campbell_norman(pd.Series([10]), pd.Series([0.5]), pd.Series([109764.21013135818]), dni_extra=1400) assert_frame_equal(out, expected)
def calculate_overcast_spectrl2(): """ This example will loop over a range of cloud covers and latitudes (at longitude=0) for a specific date and calculate the spectral irradiance with and without accounting for clouds. Clouds are accounted for by applying the cloud opacity factor defined in [1]. Several steps are required: 1. Calculate the atmospheric and solar conditions for the location and time 2. Calculate the spectral irradiance using `pvlib.spectrum.spectrl2` for clear sky conditions 3. Calculate the dni, dhi, and ghi for cloudy conditions using `pvlib.irradiance.campbell_norman` 4. Determine total in-plane irradiance and its beam, sky diffuse and ground reflected components for cloudy conditions - `pvlib.irradiance.get_total_irradiance` 5. Calculate the dni, dhi, and ghi for clear sky conditions using `pvlib.irradiance.campbell_norman` 6. Determine total in-plane irradiance and its beam, sky diffuse and ground reflected components for clear sky conditions - `pvlib.irradiance.get_total_irradiance` 7. Calculate the cloud opacity factor [1] and scale the spectral results from step 4 - func cloud_opacity_factor 8. Plot the results - func plot_spectral_irradiance """ month = 2 hour_of_day = 12 altitude = 0.0 longitude = 0.0 latitudes = [10, 40] # cloud cover in fraction units cloud_covers = [0.2, 0.5] water_vapor_content = 0.5 tau500 = 0.1 ground_albedo = 0.06 ozone = 0.3 surface_tilt = 0.0 ctime, pv_system = setup_pv_system(month, hour_of_day) for cloud_cover in cloud_covers: for latitude in latitudes: sol = get_solarposition(ctime, latitude, longitude) az = sol['apparent_zenith'].to_numpy() airmass_relative = get_relative_airmass(az, model='kastenyoung1989') pressure = pvlib.atmosphere.alt2pres(altitude) az = sol['apparent_zenith'].to_numpy() azimuth = sol['azimuth'].to_numpy() surface_azimuth = pv_system['surface_azimuth'] transmittance = (1.0 - cloud_cover) * 0.75 calc_aoi = aoi(surface_tilt, surface_azimuth, az, azimuth) # day of year is an int64index array so access first item day_of_year = ctime.dayofyear[0] spectra = pvlib.spectrum.spectrl2( apparent_zenith=az, aoi=calc_aoi, surface_tilt=surface_tilt, ground_albedo=ground_albedo, surface_pressure=pressure, relative_airmass=airmass_relative, precipitable_water=water_vapor_content, ozone=ozone, aerosol_turbidity_500nm=tau500, dayofyear=day_of_year) irrads_clouds = campbell_norman(sol['zenith'].to_numpy(), transmittance) # Convert the irradiance to a plane with tilt zero # horizontal to the earth. This is done applying # tilt=0 to POA calculations using the output from # `campbell_norman`. The POA calculations include # calculating sky and ground diffuse light where # specific models can be selected (we use default). poa_irr_clouds = get_total_irradiance( surface_tilt=surface_tilt, surface_azimuth=pv_system['surface_azimuth'], dni=irrads_clouds['dni'], ghi=irrads_clouds['ghi'], dhi=irrads_clouds['dhi'], solar_zenith=sol['apparent_zenith'], solar_azimuth=sol['azimuth']) show_info(latitude, poa_irr_clouds) zen = sol['zenith'].to_numpy() irr_clearsky = campbell_norman(zen, transmittance=0.75) poa_irr_clearsky = get_total_irradiance( surface_tilt=surface_tilt, surface_azimuth=pv_system['surface_azimuth'], dni=irr_clearsky['dni'], ghi=irr_clearsky['ghi'], dhi=irr_clearsky['dhi'], solar_zenith=sol['apparent_zenith'], solar_azimuth=sol['azimuth']) show_info(latitude, poa_irr_clearsky) poa_dr = poa_irr_clouds['poa_direct'].values poa_diff = poa_irr_clouds['poa_diffuse'].values poa_global = poa_irr_clouds['poa_global'].values f_dir, f_diff = cloud_opacity_factor(poa_dr, poa_diff, poa_global, spectra) plot_spectral_irr(spectra, f_dir, f_diff, lat=latitude, doy=day_of_year, year=ctime.year[0], clouds=cloud_cover)