The tendency of bifacial SingleAxisTracker and albedo is not reasonable

91 views
Skip to first unread message

yan gang

unread,
Feb 23, 2021, 2:41:59 AM2/23/21
to pvlib-python
Hi all,

Is any friend meet the following issue?

When use pvlib to simulate bifacial tracker system, I found that the dc_energy will increase as albedo decrease. However, if I use bifacial fixed rack system to simulate, the trendency is right (dc_energy will increase as albedo increase). I try to fix the bug for longtime, but there is no clue, it is pity that I am not familiar with pvfacotor. What is the possible reason for that tendency? Hope you can give some bright suggestions. Thanks a lot.

pvfactor_report = run_timeseries_engine(pvfactor_build_report,
                                                  pvarray_parameters, weather.index,
                                                  weather.dni, weather.dhi,
                                                   self.solar_position.zenith,
                                                   self.solar_position.azimuth,
                                                   surface_tilt, surface_azimuth,
                                                   weather.surface_albedo)

Note: 
1. pvfactor version is V1.4.1, PVlib version is V0.8.0;
2. The tracker_theta result of pvlib is very closed as PVsyst result;
3. The total_inc_front of higher albedo is lower than that of lower albedo;
4. There is some negative value for total_inc_back, it is unreasonable.
total_inc_back - negative value.png

Gang

yan gang

unread,
Feb 24, 2021, 1:46:02 AM2/24/21
to pvlib-python
Hi all,

I splited pvfacoter module from my code,  and simulated only one day, then found that the problem is still there. The code is here and as attachment. The front and rear irradiance is as following graph.

As previous mail description, the tendency of fixed-rack system is reasonable, but it is unreasonable for tracker system. Hope you can point out what is wrong for my code. Thanks you.

pvfactor results comparison for tracker and fixed_rack.png

# The code is the same as attachment
import pvlib
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from pvlib.bifacial import pvfactors_timeseries
from pvfactors.run import run_timeseries_engine
from datetime import datetime
from pandas import DataFrame

# Create input data
df_inputs = pd.DataFrame(
                                                {'solar_zenith': [11, 19, 25, 29, 29, 26, 21, 13, 4],
                                                  'solar_azimuth': [130, 141, 155, 170, 186, 201, 215, 227, 237],
                                                  # 'surface_tilt': [11.5, 43.1, 51.6, 28.8, 0.182, 28.5, 51.4, 44.1, 11.9],   # if tracker system, use the group data
                                                  # 'surface_azimuth': [90, 90, 90, 90, 90, 270, 270, 270, 270],             # if tracker system, use the group data
                                                  'surface_tilt': [40, 40, 40, 40, 40, 40, 40, 40, 40],
                                                  'surface_azimuth': [180, 180, 180, 180, 180, 180, 180, 180, 180],
                                                  'dni': [531, 723, 677, 584, 103, 4.2, 0, 0, 0],
                                                  'dhi': [88, 91, 112, 158, 199, 126, 18, 5, 0]},
                                                  index=[datetime(1990, 1, 3, 9), datetime(1990, 1, 3, 10), datetime(1990, 1, 3, 11),
                                                  datetime(1990, 1, 3, 12), datetime(1990, 1, 3, 13), datetime(1990, 1, 3, 14),
                                                  datetime(1990, 1, 3, 15), datetime(1990, 1, 3, 16), datetime(1990, 1, 3, 17)]
                                                  )

def pvfactor_build_report(pvarray):
        return {
                'total_inc_back': pvarray.ts_pvrows[1].back.get_param_weighted('qinc').tolist(),
                'total_inc_front': pvarray.ts_pvrows[1].front.get_param_weighted('qinc').tolist()
                 }

pvarray_parameters = {
                                          'n_pvrows': 3,
                                            'index_observed_pvrow': 1,
                                            'axis_azimuth': 0,
                                            'pvrow_height': 1.5,
                                            'pvrow_width': 4.6,
                                            'gcr': 0.4,
                                            'rho_front_pvrow': 0.01,
                                            'rho_back_pvrow': 0.03,
                                            'horizon_band_angle': 15
                                            }

pvfactor = run_timeseries_engine(pvfactor_build_report,
                                                            pvarray_parameters,
                                                              df_inputs.index,
                                                              df_inputs.dni,
                                                              df_inputs.dhi,
                                                              df_inputs.solar_zenith,
                                                              df_inputs.solar_azimuth,
                                                              df_inputs.surface_tilt,
                                                              df_inputs.surface_azimuth,
                                                              0.2                                                        # you can change the number
                                                              )


print(pvfactor)

df_1=DataFrame(pvfactor['total_inc_back'],columns=['total_inc_back'])
df_2=DataFrame(pvfactor['total_inc_front'],columns=['total_inc_front'])
df=df_2.join(df_1)

bifacial_tracker_trial_code.py

Kevin Anderson

unread,
Feb 27, 2021, 6:41:17 PM2/27/21
to yan gang, pvlib-python
Hi Gang,

I haven't really used pvfactors before, but I think I found a few problems in your code:

1) The solar zenith values you have are strange -- are you sure they aren't solar elevation?  Zenith angle should start at 90 at sunrise, get smaller until solar noon, and then increase back to 90 until sunset. 
2) I think your modules are going underground -- you have pvrow_height=1.5, which isn't high enough to accommodate pvrow_width=4.6 when the modules are tilted steeply.
3) You use axis_azimuth=0 always, even for the "fixed tilt" simulation.  For fixed tilt (with surface_azimuth=180) I suspect you should use axis_azimuth = 90 (or maybe 270).

I attached a script that addresses the above three points, but it uses simulated clear-sky data instead of the values you provided.  I'm not familiar enough with bifacial modeling to say that these results are totally reasonable, but at least the albedo trend goes the right way now:

image.png

I hope that helps.
Kevin


--
You received this message because you are subscribed to the Google Groups "pvlib-python" group.
To unsubscribe from this group and stop receiving emails from it, send an email to pvlib-python...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/pvlib-python/3046a0d7-a083-42db-947b-e775e091e96bn%40googlegroups.com.
ksa_pvfactors_example.py

yan gang

unread,
Mar 1, 2021, 3:15:42 AM3/1/21
to pvlib-python
Hi Kevin,

Your suggestions are very helpful for me and the issue has been solved.

The key fault of my code is pvrow_height defination. The pvrow_height should be > 1.88 when pvrow_width=4.6. I did the verification for the three points you reminded.

1) Use the new series solar_zenith data [84, 75, 69, 64, 63, 64, 69, 75, 84], and keep the others input parameters are the same as previous.
    Although the negative value disappeared and the tendency became reasonable for one day simulation result (as below left graph), the issue was still there (as 23 Feb 2021 description for this topic in pvlib group) when I simulate a whole year data (8760 data points, as below right graph).
Solar_zenith.pngSolar_zenith-year.png

2) Use pvrow_height=2.5, and keep the others input parameters are the same as previous. The issue disappeared for one day simulation result (as below left graph) and the whole year simulation result was reasonable (as below right graph, besides, the tendency between albedo and dc_energy become reasonable). 
pvrow_height.pngtotal_inc_back.png

3) Use axis_azimuth=90, and keep the others input parameters are the same as previous.  The issue was still there.
axis_azimuth.png

In summary, if I changed the pvrow_height value (make sure the value defination is reasonable), all the issues were solved.

Thank you very much for your guidance,  Kevin. It is so appreciate.

Gang 

Reply all
Reply to author
Forward
0 new messages