无法协调 PVLIB 输出与 NREL SAM
Can't reconcile PVLIB output with NREL SAM
背景
传统上我使用 NREL SAM 工具来估算太阳能输出。我一直在试验 PVLIB,由于其开放性和灵活性,它非常棒,但是我似乎无法调和 PVLIB 和 NREL SAM 之间的太阳能发电量估计。
我做了什么
我正在昆士兰州 Gympie 附近模拟一个假设的太阳能农场。我已经访问 climate.onebuiling 网站,并下载了“AUS_QLD_Gympie.AP.945660_TMYx.2003-2017”的 zip 文件夹/epw 文件。然后,我使用 PVwatts 在 NREL 的 SAM 工具中使用了该天气文件,具有以下规格;
- 200,000 千瓦直流
- 模块类型 = 标准
- 1.2 直流交流比
- 96% 逆变器效率
- 1轴回溯
- 倾斜 = 26 度
- 方位角 = 0 度
- GCR = 0.4
- 损失、阴影和削减 = 默认值
在 NREL SAM 中,我的年发电量 (AC GWh) 为 415.96 GWh p.a。
然后我使用相同的 epw 文件并将其转换为 csv,只保留 ghi、dni、dhi、temp_air 和 wind_speed (Google Drive link to CSV file) 的列。我已将此文件用作 PVLIB 的导入。我指定了一个 PVLIB 系统,其规格与上面相同,另外还增加了反照率 = 0.2 和最大角度 = 90 度(代码如下)。
我在 PVLIB 中得到的结果是 395.61 GWh。
问题
我得到的结果很不一样。 PVLIB = ~395 GWh p.a。对比 SAM = ~415 GWH p.a。我预计会有 1-2% 的差异,但不是 5%。
当我与使用 clearsky.ineichen(用 linke_turbidity 调整)的 PVLIB 系统相比时,数字甚至更糟,它产生 ~475 GWh p.a。
请求帮助
有人知道为什么我的结果如此不同吗?我能做些什么来缩小差距吗?
PVLIB 代码
# **********************************************************
# IMPORT LIBRARIES
# **********************************************************
import pandas as pd
from pvlib.pvsystem import PVSystem
from pvlib import clearsky, atmosphere, solarposition, irradiance
from pvlib.location import Location
from pvlib.tracking import SingleAxisTracker
from pvlib.modelchain import ModelChain
from pvlib.temperature import TEMPERATURE_MODEL_PARAMETERS
# **********************************************************
# LOCATION & SOLAR SIZE INPUTS
# **********************************************************
# Lat and Long desired
lat = -26.18
lon = 152.63
# Set Location
tz, altitude, name = 'Australia/Queensland', 10, 'Gympie/QLD'
# Set location details for model
latitude, longitude, = lat, lon
location = Location(latitude, longitude, tz, altitude, name)
# load some module and inverter specifications
module_parameters = {'pdc0': 200000000, 'gamma_pdc': -0.004}
inverter_parameters = {'pdc': 166666666, 'pdc0': 166666666, 'eta_inv_nom': 0.96}
temperature_model_parameters = TEMPERATURE_MODEL_PARAMETERS['sapm']['open_rack_glass_glass']
# **********************************************************
# ONEBUILDING DATA
# **********************************************************
df = pd.read_csv('weather import.csv')
df['time'] = df['time'].astype('datetime64[ns]')
df.set_index(['time'], inplace=True)
df.index = df.index.tz_localize(tz=tz)
df = df.asfreq(freq='1h')
onebuilding = df
# **********************************************************
# INEICHEN CLEAR SKIES ADJUSTED FOR TURBIDITY
# **********************************************************
# Create PVLib inputs
times = df.index
solpos = solarposition.get_solarposition(times, latitude, longitude)
apparent_zenith = solpos['zenith']
rel_airmass = atmosphere.get_relative_airmass(apparent_zenith)
pressure = atmosphere.alt2pres(altitude)
abs_airmass = atmosphere.get_absolute_airmass(rel_airmass, pressure)
linke_turbidity = clearsky.lookup_linke_turbidity(times, latitude, longitude)
dni_extra = irradiance.get_extra_radiation(times)
ineichen = clearsky.ineichen(apparent_zenith, abs_airmass, linke_turbidity, altitude, dni_extra)
ineichen.to_csv('ineichen.csv')
# **********************************************************
# SELECT WHICH WEATHER DATA TO USE (ineichen v onebuilding)
# **********************************************************
# Select which version we wish to use (onebuilding, ineichen)
selected_irrad = onebuilding
print(selected_irrad)
# Create Weather File
weather = pd.DataFrame(data={'ghi': selected_irrad.ghi, 'dni': selected_irrad.dni,
'dhi': selected_irrad.dhi, 'temp_air': df['temp_air'],
'wind_speed': df['wind_speed']})
# **********************************************************
# CREATE PV SYSTEM AND PV MODEL CHAIN
# **********************************************************
# Define the specs for the PV System (fixed system)
f_system = PVSystem(
surface_tilt=abs(lat),
surface_azimuth=0,
albedo=0.2,
module='pvwatts_dc',
inverter='pvwatts_ac',
module_parameters=module_parameters,
inverter_parameters=inverter_parameters,
racking_model='open_rack_glass_glass',
name='fixed',
temperature_model_parameters=temperature_model_parameters
)
# Define the specs for the PV System (1 axis tracking system)
t_system = SingleAxisTracker(
axis_tilt=0,
axis_azimuth=0,
max_angle=90,
backtrack=True,
module='pvwatts_dc',
inverter='pvwatts_ac',
module_parameters=module_parameters,
inverter_parameters=inverter_parameters,
name='tracking',
gcr=.40,
)
# build model chain
mc = ModelChain(
system=t_system,
location=location,
name='pvwatts',
dc_model='pvwatts',
ac_model='pvwatts',
losses_model='pvwatts',
aoi_model='physical',
spectral_model='no_loss',
temperature_model='sapm')
# run model chain
mc.run_model(weather=weather)
print(mc.ac.sum())
如果不对中间结果进行详细比较,很难确切地说出年度能量为何不同。一个影响因素似乎是转置模型(GHI、DHI 和 DNI 到阵列平面):pvlib ModelChain defaults to the Hay/Davies model, and I believe SAM defaults to the Perez 1990 model. The two models will differ by a few percent in annual plane-of-array irradiance, which varies with the relative levels of diffuse and direct irradiance; see Lave et al. Figure 6.
您可以通过将 transposition_model = 'perez',
添加到 mc
实例来 select pvlib 中的 Perez 1990 模型。我希望这会缩小 pvlib 和 SAM 结果之间的差异,我对你的发现很感兴趣。
使用 TMY 天气文件的计算结果与使用晴空模型的辐照度计算得出的结果不同,因为 TMY 是根据历史天气记录收集的,因此包括多云期。
背景
传统上我使用 NREL SAM 工具来估算太阳能输出。我一直在试验 PVLIB,由于其开放性和灵活性,它非常棒,但是我似乎无法调和 PVLIB 和 NREL SAM 之间的太阳能发电量估计。
我做了什么
我正在昆士兰州 Gympie 附近模拟一个假设的太阳能农场。我已经访问 climate.onebuiling 网站,并下载了“AUS_QLD_Gympie.AP.945660_TMYx.2003-2017”的 zip 文件夹/epw 文件。然后,我使用 PVwatts 在 NREL 的 SAM 工具中使用了该天气文件,具有以下规格;
- 200,000 千瓦直流
- 模块类型 = 标准
- 1.2 直流交流比
- 96% 逆变器效率
- 1轴回溯
- 倾斜 = 26 度
- 方位角 = 0 度
- GCR = 0.4
- 损失、阴影和削减 = 默认值
在 NREL SAM 中,我的年发电量 (AC GWh) 为 415.96 GWh p.a。
然后我使用相同的 epw 文件并将其转换为 csv,只保留 ghi、dni、dhi、temp_air 和 wind_speed (Google Drive link to CSV file) 的列。我已将此文件用作 PVLIB 的导入。我指定了一个 PVLIB 系统,其规格与上面相同,另外还增加了反照率 = 0.2 和最大角度 = 90 度(代码如下)。
我在 PVLIB 中得到的结果是 395.61 GWh。
问题
我得到的结果很不一样。 PVLIB = ~395 GWh p.a。对比 SAM = ~415 GWH p.a。我预计会有 1-2% 的差异,但不是 5%。
当我与使用 clearsky.ineichen(用 linke_turbidity 调整)的 PVLIB 系统相比时,数字甚至更糟,它产生 ~475 GWh p.a。
请求帮助
有人知道为什么我的结果如此不同吗?我能做些什么来缩小差距吗?
PVLIB 代码
# **********************************************************
# IMPORT LIBRARIES
# **********************************************************
import pandas as pd
from pvlib.pvsystem import PVSystem
from pvlib import clearsky, atmosphere, solarposition, irradiance
from pvlib.location import Location
from pvlib.tracking import SingleAxisTracker
from pvlib.modelchain import ModelChain
from pvlib.temperature import TEMPERATURE_MODEL_PARAMETERS
# **********************************************************
# LOCATION & SOLAR SIZE INPUTS
# **********************************************************
# Lat and Long desired
lat = -26.18
lon = 152.63
# Set Location
tz, altitude, name = 'Australia/Queensland', 10, 'Gympie/QLD'
# Set location details for model
latitude, longitude, = lat, lon
location = Location(latitude, longitude, tz, altitude, name)
# load some module and inverter specifications
module_parameters = {'pdc0': 200000000, 'gamma_pdc': -0.004}
inverter_parameters = {'pdc': 166666666, 'pdc0': 166666666, 'eta_inv_nom': 0.96}
temperature_model_parameters = TEMPERATURE_MODEL_PARAMETERS['sapm']['open_rack_glass_glass']
# **********************************************************
# ONEBUILDING DATA
# **********************************************************
df = pd.read_csv('weather import.csv')
df['time'] = df['time'].astype('datetime64[ns]')
df.set_index(['time'], inplace=True)
df.index = df.index.tz_localize(tz=tz)
df = df.asfreq(freq='1h')
onebuilding = df
# **********************************************************
# INEICHEN CLEAR SKIES ADJUSTED FOR TURBIDITY
# **********************************************************
# Create PVLib inputs
times = df.index
solpos = solarposition.get_solarposition(times, latitude, longitude)
apparent_zenith = solpos['zenith']
rel_airmass = atmosphere.get_relative_airmass(apparent_zenith)
pressure = atmosphere.alt2pres(altitude)
abs_airmass = atmosphere.get_absolute_airmass(rel_airmass, pressure)
linke_turbidity = clearsky.lookup_linke_turbidity(times, latitude, longitude)
dni_extra = irradiance.get_extra_radiation(times)
ineichen = clearsky.ineichen(apparent_zenith, abs_airmass, linke_turbidity, altitude, dni_extra)
ineichen.to_csv('ineichen.csv')
# **********************************************************
# SELECT WHICH WEATHER DATA TO USE (ineichen v onebuilding)
# **********************************************************
# Select which version we wish to use (onebuilding, ineichen)
selected_irrad = onebuilding
print(selected_irrad)
# Create Weather File
weather = pd.DataFrame(data={'ghi': selected_irrad.ghi, 'dni': selected_irrad.dni,
'dhi': selected_irrad.dhi, 'temp_air': df['temp_air'],
'wind_speed': df['wind_speed']})
# **********************************************************
# CREATE PV SYSTEM AND PV MODEL CHAIN
# **********************************************************
# Define the specs for the PV System (fixed system)
f_system = PVSystem(
surface_tilt=abs(lat),
surface_azimuth=0,
albedo=0.2,
module='pvwatts_dc',
inverter='pvwatts_ac',
module_parameters=module_parameters,
inverter_parameters=inverter_parameters,
racking_model='open_rack_glass_glass',
name='fixed',
temperature_model_parameters=temperature_model_parameters
)
# Define the specs for the PV System (1 axis tracking system)
t_system = SingleAxisTracker(
axis_tilt=0,
axis_azimuth=0,
max_angle=90,
backtrack=True,
module='pvwatts_dc',
inverter='pvwatts_ac',
module_parameters=module_parameters,
inverter_parameters=inverter_parameters,
name='tracking',
gcr=.40,
)
# build model chain
mc = ModelChain(
system=t_system,
location=location,
name='pvwatts',
dc_model='pvwatts',
ac_model='pvwatts',
losses_model='pvwatts',
aoi_model='physical',
spectral_model='no_loss',
temperature_model='sapm')
# run model chain
mc.run_model(weather=weather)
print(mc.ac.sum())
如果不对中间结果进行详细比较,很难确切地说出年度能量为何不同。一个影响因素似乎是转置模型(GHI、DHI 和 DNI 到阵列平面):pvlib ModelChain defaults to the Hay/Davies model, and I believe SAM defaults to the Perez 1990 model. The two models will differ by a few percent in annual plane-of-array irradiance, which varies with the relative levels of diffuse and direct irradiance; see Lave et al. Figure 6.
您可以通过将 transposition_model = 'perez',
添加到 mc
实例来 select pvlib 中的 Perez 1990 模型。我希望这会缩小 pvlib 和 SAM 结果之间的差异,我对你的发现很感兴趣。
使用 TMY 天气文件的计算结果与使用晴空模型的辐照度计算得出的结果不同,因为 TMY 是根据历史天气记录收集的,因此包括多云期。