Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
## infer the data frequency in minutes
dataInterval = (myTMY3.index[1]-myTMY3.index[0]).total_seconds()/60
if not (('azimuth' in myTMY3) and ('zenith' in myTMY3) and ('elevation' in myTMY3)):
solpos, sunup = sunrisecorrectedsunposition(myTMY3, meta, deltastyle = deltastyle)
myTMY3['zenith'] = np.radians(solpos['zenith'])
myTMY3['azimuth'] = np.radians(solpos['azimuth'])
myTMY3['elevation']=np.radians(solpos['elevation'])
if tracking == True:
if not (('trackingdata_surface_tilt' in myTMY3) and ('trackingdata_surface_azimuth' in myTMY3)):
gcr=1/pitch
trackingdata = pvlib.tracking.singleaxis(np.degrees(myTMY3['zenith']),
np.degrees(myTMY3['azimuth']),
axis_tilt, axis_azimuth,
limit_angle, backtrack, gcr)
trackingdata.surface_tilt.fillna(stowingangle, inplace=True)
myTMY3['trackingdata_surface_tilt'] = trackingdata['surface_tilt']
myTMY3['trackingdata_surface_azimuth'] = trackingdata['surface_azimuth']
[myTMY3['C'], myTMY3['D']] = trackingBFvaluescalculator(myTMY3['trackingdata_surface_tilt'], hub_height, pitch)
#myTMY3['C'] = C
#myTMY3['D'] = D
# Check what Albedo to se:
if albedo == None:
if 'Alb' in myTMY3:
print("Using albedo from TMY3 file.")
def get_tracker_position(pvobj, solar_zenith, solar_azimuth):
"""
Calculates angle of incidence aoi, panel tilt and panel azimuth for
a single axis tracking system
"""
return pvlib.tracking.singleaxis(solar_zenith, solar_azimuth,
pvobj.axis_tilt, pvobj.axis_azimuth,
pvobj.max_angle, pvobj.backtrack,
pvobj.gcr)
#int[] rearGroundSH = new int[100], frontGroundSH = new int[100]; # Front and rear row-to-row spacing divided into 100 segments, (later becomes 1 if direct beam is shaded, 0 if not shaded)
#double pvFrontSH = 0.0, pvBackSH = 0.0, maxShadow; # Initialize fraction of PV module front and back surfaces that are shaded to zero (not shaded), and maximum shadow projected from front of row.
# TRACKING ROUTINE CALULATING GETSKYCONFIGURATION FACTORS
if tracking == True:
#solpos = pvlib.solarposition.get_solarposition(myTimestamp, lat, lng)
#aazi= solpos['azimuth']
#azen= solpos['zenith']
aazi = pd.Series([azm*180.0/math.pi], index =[myTimestamp])
azen = pd.Series([zen*180.0/math.pi], index =[myTimestamp])
gcr=1/rtr
trackingdata = pvlib.tracking.singleaxis(azen, aazi, axis_tilt, axis_azimuth, max_angle, backtrack, gcr)
## Sky configuration factors are not the same for all times, since the geometry is changing with the tracking.
beta=trackingdata['surface_tilt'][0] # Trackingdata tracker_theta
sazm = trackingdata['surface_azimuth'][0]
if math.isnan(beta):
beta=90
# Rotate system if past sun's zenith ~ #123 Check if system breaks withot doing this.
if beta<0:
#sazm = sazm+180 # Rotate detectors
beta = -beta;
[C, D] = trackingBFvaluescalculator(beta, hub_height, rtr)
[rearSkyConfigFactors, frontSkyConfigFactors, ffConfigFactors] = getSkyConfigurationFactors(rowType, beta, C, D); ## Sky configuration factors are the same for all times, only based on geometry and row type
#int[] rearGroundSH = new int[100], frontGroundSH = new int[100]; # Front and rear row-to-row spacing divided into 100 segments, (later becomes 1 if direct beam is shaded, 0 if not shaded)
#double pvFrontSH = 0.0, pvBackSH = 0.0, maxShadow; # Initialize fraction of PV module front and back surfaces that are shaded to zero (not shaded), and maximum shadow projected from front of row.
# TRACKING ROUTINE CALULATING GETSKYCONFIGURATION FACTORS
if tracking == True:
#solpos = pvlib.solarposition.get_solarposition(myTimestamp, lat, lng)
#aazi= solpos['azimuth']
#azen= solpos['zenith']
aazi = pd.Series([azm*180.0/math.pi], index =[myTimestamp])
azen = pd.Series([zen*180.0/math.pi], index =[myTimestamp])
gcr=1.0/rtr
trackingdata = pvlib.tracking.singleaxis(azen, aazi, axis_tilt, axis_azimuth, max_angle, backtrack, gcr)
## Sky configuration factors are not the same for all times, since the geometry is changing with the tracking.
beta=trackingdata['surface_tilt'][0] # Trackingdata tracker_theta
sazm = trackingdata['surface_azimuth'][0]
if math.isnan(beta):
beta=90
# Rotate system if past sun's zenith ~ #123 Check if system breaks withot doing this.
if beta<0:
#sazm = sazm+180 # Rotate detectors
beta = -beta;
[C, D] = trackingBFvaluescalculator(beta, hub_height, rtr)
[rearSkyConfigFactors, frontSkyConfigFactors, ffConfigFactors] = getSkyConfigurationFactors(rowType, beta, C, D); ## Sky configuration factors are the same for all times, only based on geometry and row type
datetime = pd.to_datetime(self.datetime)
tz = self.timezone
try: # make sure the data is tz-localized.
datetimetz = datetime.tz_localize(pytz.FixedOffset(tz*60)) # either use pytz.FixedOffset (in minutes) or 'Etc/GMT+5'
except: # data is tz-localized already. Just put it in local time.
datetimetz = datetime.tz_convert(pytz.FixedOffset(tz*60))
# get solar position zenith and azimuth based on site metadata
#solpos = pvlib.irradiance.solarposition.get_solarposition(datetimetz,lat,lon,elev)
solpos = pvlib.irradiance.solarposition.get_solarposition(datetimetz-pd.Timedelta(minutes = 30),lat,lon,elev)
# get solar position zenith and azimuth based on site metadata
#solpos = pvlib.irradiance.solarposition.get_solarposition(datetimetz,lat,lon,elev)
self.solpos = solpos # save solar position for each timestamp
'''
solpos = self.solpos
# get 1-axis tracker tracker_theta, surface_tilt and surface_azimuth
trackingdata = pvlib.tracking.singleaxis(solpos['zenith'], solpos['azimuth'], axis_tilt, axis_azimuth, limit_angle, backtrack, gcr)
# save tracker tilt information to metdata.tracker_theta, metdata.surface_tilt and metdata.surface_azimuth
self.tracker_theta = trackingdata['tracker_theta'].tolist()
self.surface_tilt = trackingdata['surface_tilt'].tolist()
self.surface_azimuth = trackingdata['surface_azimuth'].tolist()
# undo the timestamp offset put in by solpos. It may not be exactly 30 minutes any more...
#trackingdata.index = trackingdata.index + pd.Timedelta(minutes = 30)
trackingdata.index = self.sunrisesetdata.index #this has the original time data in it
# round tracker_theta to increments of angledelta
def _roundArbitrary(x, base = angledelta):
# round to nearest 'base' value.
# mask NaN's to avoid rounding error message
return base * (x.dropna()/float(base)).round()
trackingdata['theta_round'] = _roundArbitrary(trackingdata['tracker_theta'])
return trackingdata
----------
axis_tilt : float
axis_azimuth : float
max_rotation_angle : float
backtrack : bool
ground_coverage_ratio : float
apparent_zenith : pd.Series
Solar apparent zenith
azimuth : pd.Series
Solar azimuth
Returns
-------
surface_tilt : pd.Series, surface_azimuth : pd.Series, aoi : pd.Series
"""
tracking = pvlib.tracking.singleaxis(
apparent_zenith,
azimuth,
axis_tilt=axis_tilt,
axis_azimuth=axis_azimuth,
max_angle=max_rotation_angle,
backtrack=backtrack,
gcr=ground_coverage_ratio
)
surface_tilt = tracking['surface_tilt']
surface_azimuth = tracking['surface_azimuth']
aoi = tracking['aoi']
return surface_tilt, surface_azimuth, aoi