Problem 10.5

Problem 10.5#

Fundamentals of Solar Cells and Photovoltaic Systems Engineering

Solutions Manual - Chapter 10

Problem 10.5

In this problem, we will reflect on the impact of the DC/AC ratio for fixed mounting structures. To that end, let us assume that the DC generation of the PV power plant is proportional to the irradiance on the PV modules. For the sake of simplicity, we neglect here other effects such as solar cell temperature.

Using the Typical Meteorological Year (TMY), estimate the percentage of energy that would be curtailed for the location described in Problem 10.1 (latitude and longitude 40.371944⁰N, -3.7825⁰W) assuming tilt angle of 30⁰ if the DC/AC ratio is equal to 1, 1.2 and 1.4.

We will use the packages pvlib, pandas and matplotlib.pyplot to plot the results. We will also use the package pytz to determine the time zone of the location (Madrid).

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

We start by defining the location, date, and time.

# Cuatro Vientos, Madrid, Spain
lat, lon =  40.371944, -3.7825
#altitude = 22

tz = pytz.timezone('Europe/Madrid')

# location
location = pvlib.location.Location(lat, lon, tz=tz)

orientation = 180 # pvlib sets orientation origin at North -> South=180
tilt=30

We retrieve typical meteorological year (TMY) data from PVGIS.

tmy, _, _, _ = pvlib.iotools.get_pvgis_tmy(latitude=lat, longitude=lon, map_variables=True)

tmy.index = tmy.index.tz_convert(tz) # use local time

We calculate the Sun’s coordinates

# calculate Sun's coordinates
solar_position = location.get_solarposition(times=tmy.index)

We calculate the annual radiation (or reference yield) on the PV modules.

# calculate irradiante at the plane of the array (poa)
poa_irradiance = pvlib.irradiance.get_total_irradiance(surface_tilt=tilt,
                                                        surface_azimuth=orientation,
                                                        dni=tmy['dni'],
                                                        ghi=tmy['ghi'],
                                                        dhi=tmy['dhi'],
                                                        solar_zenith=solar_position['apparent_zenith'],
                                                        solar_azimuth=solar_position['azimuth'])    

We calculate the percentage of energy lost for different DC/AC ratio.

for DC_AC in [1, 1.2, 1.4]:
    available_G = poa_irradiance['poa_global']
    used_G = available_G.copy()
    used_G[used_G>1000/DC_AC]=1000/DC_AC
    ratio = (available_G.sum()-used_G.sum())/available_G.sum()
    print("For DC/AC ratio = " + str(DC_AC) + ', curtailed energy represents ' + str(round(ratio*100,2)) + '% of available energy')
For DC/AC ratio = 1, curtailed energy represents 0.28% of available energy
For DC/AC ratio = 1.2, curtailed energy represents 4.43% of available energy
For DC/AC ratio = 1.4, curtailed energy represents 10.64% of available energy

We can make a plot with the curtailed energy as a function of the DC/AC ratio.

ratio = pd.Series( dtype=float)
for DC_AC in np.arange(1,2,0.1):
    available_G = poa_irradiance['poa_global']
    used_G = available_G.copy()
    used_G[used_G>1000/DC_AC]=1000/DC_AC
    ratio[DC_AC] = 100*(available_G.sum()-used_G.sum())/available_G.sum()

ratio.plot(color='dodgerblue')
plt.ylabel('Curtailment (%)')
plt.xlabel('DC/AC ratio')
plt.grid()
../../_images/f2ddb7bf0d3ff8f72405e4c6847d03192ca06976d4a7efea7e0ddc1c91cfc9b2.png