Problem 11.10

Problem 11.10#

Fundamentals of Solar Cells and Photovoltaic Systems Engineering

Solutions Manual - Chapter 11

Problem 11.10

The PV panels in an unmoored FPV system are oriented to the south with an inclination of 30°. Use pvlib to estimate the reduction in irradiance at the plane of the array caused by the waves. Assume that, on a windy day, the waves produce a ±15° sine wave tilt variation with a period of 10 seconds. The FPV system is located in Qinghai Lake (Qinghai, China) and we want to evaluate losses on March 21, 2022. The water reflectivity can be assumed to be 10%.

We will use the packages pvlib and matplotlib.pyplot to plot the results.

import pvlib
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

We start by defining the location, date and time. We will implement the calculation for every second on March 21, 2022.

# Qinghai Lake, China
lat, lon = 37, 100.13
tz = 'Asia/Shanghai' # existing timezones can be checked using pytz.all_timezones[::20]

date = '2022-03-21'
# location
location = pvlib.location.Location(lat, lon, tz=tz)

# albedo
albedo = 0.10 # water reflectivity

# datetimes
times = pd.date_range(start=date, freq='s', end=pd.Timestamp(date) + pd.DateOffset(days=1), tz=tz)

# generates clear-sky ghi, dni, dhi irradiances
clearsky = location.get_clearsky(times)

# calculates Sun's coordinates
solar_position = location.get_solarposition(times=times)

# surface angles alpha, beta
orientation = 180 # pvlib sets orientation origin at North -> South=180

tilt_fixed = 30
A = 15 # ±tilt amplitude [°]
T = 10 # wave period [s]
t = np.arange(0, len(times))
tilt_waving =  tilt_fixed + A*np.sin(2*np.pi*t/T)

We calculate the effective irradiance assuming a fixed tilt and a tilt variation caused by the waves.

# calculates POA
poa_fixed_irradiance = pvlib.irradiance.get_total_irradiance(
                        surface_tilt=tilt_fixed,
                        surface_azimuth=orientation,
                        dni=clearsky['dni'],
                        ghi=clearsky['ghi'],
                        dhi=clearsky['dhi'],
                        albedo=albedo,
                        solar_zenith=solar_position['apparent_zenith'],
                        solar_azimuth=solar_position['azimuth'],
                        model='isotropic')

poa_waving_irradiance = pvlib.irradiance.get_total_irradiance(
                        surface_tilt=tilt_waving,
                        surface_azimuth=orientation,
                        dni=clearsky['dni'],
                        ghi=clearsky['ghi'],
                        dhi=clearsky['dhi'],
                        albedo=albedo,
                        solar_zenith=solar_position['apparent_zenith'],
                        solar_azimuth=solar_position['azimuth'],
                        model='isotropic')

The daily irradiation for both fixed and waving cases is calculated

daily_fixed = poa_fixed_irradiance.poa_global.sum()/(60*60)
daily_waving = poa_waving_irradiance.poa_global.sum()/(60*60)
print(f'Fixed = {daily_fixed:.0f} Wh')
print(f'Waving = {daily_waving:.0f} Wh')
Fixed = 9215 Wh
Waving = 9068 Wh
irradiance_reduction = (daily_fixed - daily_waving) / daily_fixed

print(f'Irradiance reduction due to waves = {irradiance_reduction:.1%}')
Irradiance reduction due to waves = 1.6%

The irradiance for the waving case can be plotted, noticing the period of the perturbing wave.

poa_waving_irradiance[date+' 12:00':date+' 12:01'].poa_global.plot()
plt.ylabel('Irradiance [W/m$^2$]')
Text(0, 0.5, 'Irradiance [W/m$^2$]')
../../_images/8011faf796d62326562102dcb3d15be6807032cd3bb750234c5fc57d63f0c4c5.png