pvlib 0.9.5__py3-none-any.whl → 0.10.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- pvlib/__init__.py +3 -2
- pvlib/atmosphere.py +6 -171
- pvlib/bifacial/infinite_sheds.py +30 -267
- pvlib/bifacial/utils.py +225 -5
- pvlib/data/test_psm3_2017.csv +17521 -17521
- pvlib/data/test_read_psm3.csv +17522 -17522
- pvlib/data/test_read_pvgis_horizon.csv +49 -0
- pvlib/data/variables_style_rules.csv +3 -0
- pvlib/iam.py +17 -4
- pvlib/inverter.py +6 -1
- pvlib/iotools/__init__.py +7 -2
- pvlib/iotools/acis.py +516 -0
- pvlib/iotools/midc.py +4 -4
- pvlib/iotools/psm3.py +32 -31
- pvlib/iotools/pvgis.py +84 -28
- pvlib/iotools/sodapro.py +8 -6
- pvlib/iotools/srml.py +121 -18
- pvlib/iotools/surfrad.py +2 -2
- pvlib/iotools/tmy.py +146 -102
- pvlib/irradiance.py +151 -0
- pvlib/ivtools/sde.py +11 -7
- pvlib/ivtools/sdm.py +16 -10
- pvlib/ivtools/utils.py +6 -6
- pvlib/location.py +3 -2
- pvlib/modelchain.py +67 -70
- pvlib/pvsystem.py +160 -532
- pvlib/shading.py +41 -0
- pvlib/singlediode.py +215 -65
- pvlib/soiling.py +3 -3
- pvlib/spa.py +327 -368
- pvlib/spectrum/__init__.py +8 -2
- pvlib/spectrum/mismatch.py +335 -0
- pvlib/temperature.py +1 -8
- pvlib/tests/bifacial/test_infinite_sheds.py +0 -111
- pvlib/tests/bifacial/test_utils.py +101 -4
- pvlib/tests/conftest.py +0 -31
- pvlib/tests/iotools/test_acis.py +213 -0
- pvlib/tests/iotools/test_midc.py +6 -6
- pvlib/tests/iotools/test_psm3.py +3 -3
- pvlib/tests/iotools/test_pvgis.py +21 -14
- pvlib/tests/iotools/test_sodapro.py +1 -1
- pvlib/tests/iotools/test_srml.py +71 -6
- pvlib/tests/iotools/test_tmy.py +43 -8
- pvlib/tests/ivtools/test_sde.py +19 -17
- pvlib/tests/ivtools/test_sdm.py +9 -4
- pvlib/tests/test_atmosphere.py +6 -62
- pvlib/tests/test_iam.py +12 -0
- pvlib/tests/test_irradiance.py +40 -2
- pvlib/tests/test_location.py +1 -1
- pvlib/tests/test_modelchain.py +33 -76
- pvlib/tests/test_pvsystem.py +366 -201
- pvlib/tests/test_shading.py +28 -0
- pvlib/tests/test_singlediode.py +166 -30
- pvlib/tests/test_soiling.py +8 -7
- pvlib/tests/test_spa.py +6 -7
- pvlib/tests/test_spectrum.py +145 -1
- pvlib/tests/test_temperature.py +0 -7
- pvlib/tests/test_tools.py +25 -0
- pvlib/tests/test_tracking.py +0 -149
- pvlib/tools.py +26 -1
- pvlib/tracking.py +1 -269
- {pvlib-0.9.5.dist-info → pvlib-0.10.0.dist-info}/METADATA +1 -9
- {pvlib-0.9.5.dist-info → pvlib-0.10.0.dist-info}/RECORD +67 -68
- pvlib/forecast.py +0 -1211
- pvlib/iotools/ecmwf_macc.py +0 -312
- pvlib/tests/iotools/test_ecmwf_macc.py +0 -162
- pvlib/tests/test_forecast.py +0 -228
- {pvlib-0.9.5.dist-info → pvlib-0.10.0.dist-info}/AUTHORS.md +0 -0
- {pvlib-0.9.5.dist-info → pvlib-0.10.0.dist-info}/LICENSE +0 -0
- {pvlib-0.9.5.dist-info → pvlib-0.10.0.dist-info}/WHEEL +0 -0
- {pvlib-0.9.5.dist-info → pvlib-0.10.0.dist-info}/top_level.txt +0 -0
pvlib/tests/test_tracking.py
CHANGED
|
@@ -290,155 +290,6 @@ def test_low_sun_angles():
|
|
|
290
290
|
assert_allclose(expected[k], v)
|
|
291
291
|
|
|
292
292
|
|
|
293
|
-
def test_SingleAxisTracker_tracking():
|
|
294
|
-
with pytest.warns(pvlibDeprecationWarning):
|
|
295
|
-
system = tracking.SingleAxisTracker(max_angle=90, axis_tilt=30,
|
|
296
|
-
axis_azimuth=180, gcr=2.0/7.0,
|
|
297
|
-
backtrack=True)
|
|
298
|
-
|
|
299
|
-
apparent_zenith = pd.Series([30])
|
|
300
|
-
apparent_azimuth = pd.Series([135])
|
|
301
|
-
|
|
302
|
-
tracker_data = system.singleaxis(apparent_zenith, apparent_azimuth)
|
|
303
|
-
|
|
304
|
-
expect = pd.DataFrame({'aoi': 7.286245, 'surface_azimuth': 142.65730,
|
|
305
|
-
'surface_tilt': 35.98741,
|
|
306
|
-
'tracker_theta': -20.88121},
|
|
307
|
-
index=[0], dtype=np.float64)
|
|
308
|
-
expect = expect[SINGLEAXIS_COL_ORDER]
|
|
309
|
-
|
|
310
|
-
assert_frame_equal(expect, tracker_data)
|
|
311
|
-
|
|
312
|
-
# results calculated using PVsyst
|
|
313
|
-
pvsyst_solar_azimuth = 7.1609
|
|
314
|
-
pvsyst_solar_height = 27.315
|
|
315
|
-
pvsyst_axis_tilt = 20.
|
|
316
|
-
pvsyst_axis_azimuth = 20.
|
|
317
|
-
with pytest.warns(pvlibDeprecationWarning):
|
|
318
|
-
pvsyst_system = tracking.SingleAxisTracker(
|
|
319
|
-
max_angle=60., axis_tilt=pvsyst_axis_tilt,
|
|
320
|
-
axis_azimuth=180+pvsyst_axis_azimuth, backtrack=False)
|
|
321
|
-
# the definition of azimuth is different from PYsyst
|
|
322
|
-
apparent_azimuth = pd.Series([180+pvsyst_solar_azimuth])
|
|
323
|
-
apparent_zenith = pd.Series([90-pvsyst_solar_height])
|
|
324
|
-
tracker_data = pvsyst_system.singleaxis(apparent_zenith, apparent_azimuth)
|
|
325
|
-
expect = pd.DataFrame({'aoi': 41.07852, 'surface_azimuth': 180-18.432,
|
|
326
|
-
'surface_tilt': 24.92122,
|
|
327
|
-
'tracker_theta': -15.18391},
|
|
328
|
-
index=[0], dtype=np.float64)
|
|
329
|
-
expect = expect[SINGLEAXIS_COL_ORDER]
|
|
330
|
-
|
|
331
|
-
assert_frame_equal(expect, tracker_data)
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
# see test_irradiance for more thorough testing
|
|
335
|
-
def test_get_aoi():
|
|
336
|
-
with pytest.warns(pvlibDeprecationWarning):
|
|
337
|
-
system = tracking.SingleAxisTracker(max_angle=90, axis_tilt=30,
|
|
338
|
-
axis_azimuth=180, gcr=2.0/7.0,
|
|
339
|
-
backtrack=True)
|
|
340
|
-
surface_tilt = np.array([30, 0])
|
|
341
|
-
surface_azimuth = np.array([90, 270])
|
|
342
|
-
solar_zenith = np.array([70, 10])
|
|
343
|
-
solar_azimuth = np.array([100, 180])
|
|
344
|
-
out = system.get_aoi(surface_tilt, surface_azimuth,
|
|
345
|
-
solar_zenith, solar_azimuth)
|
|
346
|
-
expected = np.array([40.632115, 10.])
|
|
347
|
-
assert_allclose(out, expected, atol=0.000001)
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
def test_get_irradiance():
|
|
351
|
-
with pytest.warns(pvlibDeprecationWarning):
|
|
352
|
-
system = tracking.SingleAxisTracker(max_angle=90, axis_tilt=30,
|
|
353
|
-
axis_azimuth=180, gcr=2.0/7.0,
|
|
354
|
-
backtrack=True)
|
|
355
|
-
times = pd.date_range(start='20160101 1200-0700',
|
|
356
|
-
end='20160101 1800-0700', freq='6H')
|
|
357
|
-
# latitude=32, longitude=-111
|
|
358
|
-
solar_position = pd.DataFrame(np.array(
|
|
359
|
-
[[55.36421554, 55.38851771, 34.63578446, 34.61148229,
|
|
360
|
-
172.32003763, -3.44516534],
|
|
361
|
-
[96.50000401, 96.50000401, -6.50000401, -6.50000401,
|
|
362
|
-
246.91581654, -3.56292888]]),
|
|
363
|
-
columns=['apparent_zenith', 'zenith', 'apparent_elevation',
|
|
364
|
-
'elevation', 'azimuth', 'equation_of_time'],
|
|
365
|
-
index=times)
|
|
366
|
-
irrads = pd.DataFrame({'dni': [900, 0], 'ghi': [600, 0], 'dhi': [100, 0]},
|
|
367
|
-
index=times)
|
|
368
|
-
solar_zenith = solar_position['apparent_zenith']
|
|
369
|
-
solar_azimuth = solar_position['azimuth']
|
|
370
|
-
|
|
371
|
-
# invalid warnings already generated in horizon test above,
|
|
372
|
-
# no need to clutter test output here
|
|
373
|
-
with np.errstate(invalid='ignore'):
|
|
374
|
-
tracker_data = system.singleaxis(solar_zenith, solar_azimuth)
|
|
375
|
-
|
|
376
|
-
# some invalid values in irradiance.py. not our problem here
|
|
377
|
-
with np.errstate(invalid='ignore'):
|
|
378
|
-
irradiance = system.get_irradiance(tracker_data['surface_tilt'],
|
|
379
|
-
tracker_data['surface_azimuth'],
|
|
380
|
-
solar_zenith,
|
|
381
|
-
solar_azimuth,
|
|
382
|
-
irrads['dni'],
|
|
383
|
-
irrads['ghi'],
|
|
384
|
-
irrads['dhi'])
|
|
385
|
-
|
|
386
|
-
expected = pd.DataFrame(data=np.array(
|
|
387
|
-
[[961.80070, 815.94490, 145.85580, 135.32820, 10.52757492],
|
|
388
|
-
[nan, nan, nan, nan, nan]]),
|
|
389
|
-
columns=['poa_global', 'poa_direct',
|
|
390
|
-
'poa_diffuse', 'poa_sky_diffuse',
|
|
391
|
-
'poa_ground_diffuse'],
|
|
392
|
-
index=times)
|
|
393
|
-
|
|
394
|
-
assert_frame_equal(irradiance, expected, check_less_precise=2)
|
|
395
|
-
|
|
396
|
-
# test with albedo as a Series
|
|
397
|
-
irrads['albedo'] = [0.5, 0.5]
|
|
398
|
-
with np.errstate(invalid='ignore'):
|
|
399
|
-
irradiance = system.get_irradiance(tracker_data['surface_tilt'],
|
|
400
|
-
tracker_data['surface_azimuth'],
|
|
401
|
-
solar_zenith,
|
|
402
|
-
solar_azimuth,
|
|
403
|
-
irrads['dni'],
|
|
404
|
-
irrads['ghi'],
|
|
405
|
-
irrads['dhi'],
|
|
406
|
-
albedo=irrads['albedo'])
|
|
407
|
-
|
|
408
|
-
expected = pd.Series(data=[21.05514984, nan], index=times,
|
|
409
|
-
name='poa_ground_diffuse')
|
|
410
|
-
|
|
411
|
-
assert_series_equal(irradiance['poa_ground_diffuse'], expected,
|
|
412
|
-
check_less_precise=2)
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
def test_SingleAxisTracker___repr__():
|
|
417
|
-
with pytest.warns(pvlibDeprecationWarning):
|
|
418
|
-
system = tracking.SingleAxisTracker(
|
|
419
|
-
max_angle=45, gcr=.25, module='blah', inverter='blarg',
|
|
420
|
-
temperature_model_parameters={'a': -3.56})
|
|
421
|
-
expected = """SingleAxisTracker:
|
|
422
|
-
axis_tilt: 0
|
|
423
|
-
axis_azimuth: 0
|
|
424
|
-
max_angle: 45
|
|
425
|
-
backtrack: True
|
|
426
|
-
gcr: 0.25
|
|
427
|
-
cross_axis_tilt: 0.0
|
|
428
|
-
name: None
|
|
429
|
-
Array:
|
|
430
|
-
name: None
|
|
431
|
-
mount: SingleAxisTrackerMount(axis_tilt=0, axis_azimuth=0, max_angle=45, backtrack=True, gcr=0.25, cross_axis_tilt=0.0, racking_model=None, module_height=None)
|
|
432
|
-
module: blah
|
|
433
|
-
albedo: 0.25
|
|
434
|
-
module_type: None
|
|
435
|
-
temperature_model_parameters: {'a': -3.56}
|
|
436
|
-
strings: 1
|
|
437
|
-
modules_per_string: 1
|
|
438
|
-
inverter: blarg""" # noqa: E501
|
|
439
|
-
assert system.__repr__() == expected
|
|
440
|
-
|
|
441
|
-
|
|
442
293
|
def test_calc_axis_tilt():
|
|
443
294
|
# expected values
|
|
444
295
|
expected_axis_tilt = 2.239 # [degrees]
|
pvlib/tools.py
CHANGED
|
@@ -346,7 +346,7 @@ def _golden_sect_DataFrame(params, lower, upper, func, atol=1e-8):
|
|
|
346
346
|
|
|
347
347
|
phim1 = (np.sqrt(5) - 1) / 2
|
|
348
348
|
|
|
349
|
-
df = params
|
|
349
|
+
df = params.copy() # shallow copy to avoid modifying caller's dict
|
|
350
350
|
df['VH'] = upper
|
|
351
351
|
df['VL'] = lower
|
|
352
352
|
|
|
@@ -377,6 +377,9 @@ def _golden_sect_DataFrame(params, lower, upper, func, atol=1e-8):
|
|
|
377
377
|
df['max'] = 0.5 * (df['V1'] + df['V2'])
|
|
378
378
|
func_result = func(df, 'max')
|
|
379
379
|
x = np.where(np.isnan(func_result), np.nan, df['max'])
|
|
380
|
+
if np.isscalar(df['max']):
|
|
381
|
+
# np.where always returns an ndarray, converting scalars to 0d-arrays
|
|
382
|
+
x = x.item()
|
|
380
383
|
|
|
381
384
|
return func_result, x
|
|
382
385
|
|
|
@@ -469,3 +472,25 @@ def _first_order_centered_difference(f, x0, dx=DX, args=()):
|
|
|
469
472
|
# removal in scipy 1.12.0
|
|
470
473
|
df = f(x0+dx, *args) - f(x0-dx, *args)
|
|
471
474
|
return df / 2 / dx
|
|
475
|
+
|
|
476
|
+
|
|
477
|
+
def get_pandas_index(*args):
|
|
478
|
+
"""
|
|
479
|
+
Get the index of the first pandas DataFrame or Series in a list of
|
|
480
|
+
arguments.
|
|
481
|
+
|
|
482
|
+
Parameters
|
|
483
|
+
----------
|
|
484
|
+
args: positional arguments
|
|
485
|
+
The numeric values to scan for a pandas index.
|
|
486
|
+
|
|
487
|
+
Returns
|
|
488
|
+
-------
|
|
489
|
+
A pandas index or None
|
|
490
|
+
None is returned if there are no pandas DataFrames or Series in the
|
|
491
|
+
args list.
|
|
492
|
+
"""
|
|
493
|
+
return next(
|
|
494
|
+
(a.index for a in args if isinstance(a, (pd.DataFrame, pd.Series))),
|
|
495
|
+
None
|
|
496
|
+
)
|
pvlib/tracking.py
CHANGED
|
@@ -2,275 +2,7 @@ import numpy as np
|
|
|
2
2
|
import pandas as pd
|
|
3
3
|
|
|
4
4
|
from pvlib.tools import cosd, sind, tand, acosd, asind
|
|
5
|
-
from pvlib
|
|
6
|
-
PVSystem, Array, SingleAxisTrackerMount, _unwrap_single_value
|
|
7
|
-
)
|
|
8
|
-
from pvlib import irradiance, atmosphere
|
|
9
|
-
from pvlib._deprecation import deprecated
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
@deprecated('0.9.0', alternative='PVSystem with SingleAxisTrackerMount')
|
|
13
|
-
class SingleAxisTracker(PVSystem):
|
|
14
|
-
"""
|
|
15
|
-
A class for single-axis trackers that inherits the PV modeling methods from
|
|
16
|
-
:py:class:`~pvlib.pvsystem.PVSystem`. For details on calculating tracker
|
|
17
|
-
rotation see :py:func:`pvlib.tracking.singleaxis`.
|
|
18
|
-
|
|
19
|
-
Parameters
|
|
20
|
-
----------
|
|
21
|
-
axis_tilt : float, default 0
|
|
22
|
-
The tilt of the axis of rotation (i.e, the y-axis defined by
|
|
23
|
-
``axis_azimuth``) with respect to horizontal.
|
|
24
|
-
``axis_tilt`` must be >= 0 and <= 90. [degree]
|
|
25
|
-
|
|
26
|
-
axis_azimuth : float, default 0
|
|
27
|
-
A value denoting the compass direction along which the axis of
|
|
28
|
-
rotation lies. Measured in decimal degrees east of north.
|
|
29
|
-
|
|
30
|
-
max_angle : float, default 90
|
|
31
|
-
A value denoting the maximum rotation angle, in decimal degrees,
|
|
32
|
-
of the one-axis tracker from its horizontal position (horizontal
|
|
33
|
-
if axis_tilt = 0). A max_angle of 90 degrees allows the tracker
|
|
34
|
-
to rotate to a vertical position to point the panel towards a
|
|
35
|
-
horizon. max_angle of 180 degrees allows for full rotation.
|
|
36
|
-
|
|
37
|
-
backtrack : bool, default True
|
|
38
|
-
Controls whether the tracker has the capability to "backtrack"
|
|
39
|
-
to avoid row-to-row shading. False denotes no backtrack
|
|
40
|
-
capability. True denotes backtrack capability.
|
|
41
|
-
|
|
42
|
-
gcr : float, default 2.0/7.0
|
|
43
|
-
A value denoting the ground coverage ratio of a tracker system
|
|
44
|
-
which utilizes backtracking; i.e. the ratio between the PV array
|
|
45
|
-
surface area to total ground area. A tracker system with modules
|
|
46
|
-
2 meters wide, centered on the tracking axis, with 6 meters
|
|
47
|
-
between the tracking axes has a gcr of 2/6=0.333. If gcr is not
|
|
48
|
-
provided, a gcr of 2/7 is default. gcr must be <=1.
|
|
49
|
-
|
|
50
|
-
cross_axis_tilt : float, default 0.0
|
|
51
|
-
The angle, relative to horizontal, of the line formed by the
|
|
52
|
-
intersection between the slope containing the tracker axes and a plane
|
|
53
|
-
perpendicular to the tracker axes. Cross-axis tilt should be specified
|
|
54
|
-
using a right-handed convention. For example, trackers with axis
|
|
55
|
-
azimuth of 180 degrees (heading south) will have a negative cross-axis
|
|
56
|
-
tilt if the tracker axes plane slopes down to the east and positive
|
|
57
|
-
cross-axis tilt if the tracker axes plane slopes down to the west. Use
|
|
58
|
-
:func:`~pvlib.tracking.calc_cross_axis_tilt` to calculate
|
|
59
|
-
`cross_axis_tilt`. [degrees]
|
|
60
|
-
|
|
61
|
-
**kwargs
|
|
62
|
-
Passed to :py:class:`~pvlib.pvsystem.PVSystem`. If the `arrays`
|
|
63
|
-
parameter is specified it must have only a single Array. Furthermore
|
|
64
|
-
if a :py:class:`~pvlib.pvsystem.Array` is provided it must have
|
|
65
|
-
``surface_tilt`` and ``surface_azimuth`` equal to None.
|
|
66
|
-
|
|
67
|
-
Raises
|
|
68
|
-
------
|
|
69
|
-
ValueError
|
|
70
|
-
If more than one Array is specified.
|
|
71
|
-
ValueError
|
|
72
|
-
If an Array is provided with a surface tilt or azimuth not None.
|
|
73
|
-
|
|
74
|
-
See also
|
|
75
|
-
--------
|
|
76
|
-
pvlib.tracking.singleaxis
|
|
77
|
-
pvlib.tracking.calc_axis_tilt
|
|
78
|
-
pvlib.tracking.calc_cross_axis_tilt
|
|
79
|
-
"""
|
|
80
|
-
|
|
81
|
-
def __init__(self, axis_tilt=0, axis_azimuth=0, max_angle=90,
|
|
82
|
-
backtrack=True, gcr=2.0/7.0, cross_axis_tilt=0.0, **kwargs):
|
|
83
|
-
|
|
84
|
-
mount_kwargs = {
|
|
85
|
-
k: kwargs.pop(k) for k in ['racking_model', 'module_height']
|
|
86
|
-
if k in kwargs
|
|
87
|
-
}
|
|
88
|
-
mount = SingleAxisTrackerMount(axis_tilt, axis_azimuth, max_angle,
|
|
89
|
-
backtrack, gcr, cross_axis_tilt,
|
|
90
|
-
**mount_kwargs)
|
|
91
|
-
|
|
92
|
-
array_defaults = {
|
|
93
|
-
'albedo': None, 'surface_type': None, 'module': None,
|
|
94
|
-
'module_type': None, 'module_parameters': None,
|
|
95
|
-
'temperature_model_parameters': None,
|
|
96
|
-
'modules_per_string': 1,
|
|
97
|
-
}
|
|
98
|
-
array_kwargs = {
|
|
99
|
-
key: kwargs.get(key, array_defaults[key]) for key in array_defaults
|
|
100
|
-
}
|
|
101
|
-
# strings/strings_per_inverter is a special case
|
|
102
|
-
array_kwargs['strings'] = kwargs.get('strings_per_inverter', 1)
|
|
103
|
-
|
|
104
|
-
array = Array(mount=mount, **array_kwargs)
|
|
105
|
-
pass_through_kwargs = { # other args to pass to PVSystem()
|
|
106
|
-
k: v for k, v in kwargs.items() if k not in array_defaults
|
|
107
|
-
}
|
|
108
|
-
# leave these in case someone is using them
|
|
109
|
-
self.axis_tilt = axis_tilt
|
|
110
|
-
self.axis_azimuth = axis_azimuth
|
|
111
|
-
self.max_angle = max_angle
|
|
112
|
-
self.backtrack = backtrack
|
|
113
|
-
self.gcr = gcr
|
|
114
|
-
self.cross_axis_tilt = cross_axis_tilt
|
|
115
|
-
|
|
116
|
-
pass_through_kwargs['surface_tilt'] = None
|
|
117
|
-
pass_through_kwargs['surface_azimuth'] = None
|
|
118
|
-
|
|
119
|
-
super().__init__(arrays=[array], **pass_through_kwargs)
|
|
120
|
-
|
|
121
|
-
def __repr__(self):
|
|
122
|
-
attrs = ['axis_tilt', 'axis_azimuth', 'max_angle', 'backtrack', 'gcr',
|
|
123
|
-
'cross_axis_tilt']
|
|
124
|
-
sat_repr = ('SingleAxisTracker:\n ' + '\n '.join(
|
|
125
|
-
f'{attr}: {getattr(self, attr)}' for attr in attrs))
|
|
126
|
-
# get the parent PVSystem info
|
|
127
|
-
pvsystem_repr = super().__repr__()
|
|
128
|
-
# remove the first line (contains 'PVSystem: \n')
|
|
129
|
-
pvsystem_repr = '\n'.join(pvsystem_repr.split('\n')[1:])
|
|
130
|
-
return sat_repr + '\n' + pvsystem_repr
|
|
131
|
-
|
|
132
|
-
def singleaxis(self, apparent_zenith, apparent_azimuth):
|
|
133
|
-
"""
|
|
134
|
-
Get tracking data. See :py:func:`pvlib.tracking.singleaxis` more
|
|
135
|
-
detail.
|
|
136
|
-
|
|
137
|
-
Parameters
|
|
138
|
-
----------
|
|
139
|
-
apparent_zenith : float, 1d array, or Series
|
|
140
|
-
Solar apparent zenith angles in decimal degrees.
|
|
141
|
-
|
|
142
|
-
apparent_azimuth : float, 1d array, or Series
|
|
143
|
-
Solar apparent azimuth angles in decimal degrees.
|
|
144
|
-
|
|
145
|
-
Returns
|
|
146
|
-
-------
|
|
147
|
-
tracking data
|
|
148
|
-
"""
|
|
149
|
-
tracking_data = singleaxis(apparent_zenith, apparent_azimuth,
|
|
150
|
-
self.axis_tilt, self.axis_azimuth,
|
|
151
|
-
self.max_angle, self.backtrack,
|
|
152
|
-
self.gcr, self.cross_axis_tilt)
|
|
153
|
-
|
|
154
|
-
return tracking_data
|
|
155
|
-
|
|
156
|
-
def get_aoi(self, surface_tilt, surface_azimuth, solar_zenith,
|
|
157
|
-
solar_azimuth):
|
|
158
|
-
"""Get the angle of incidence on the system.
|
|
159
|
-
|
|
160
|
-
For a given set of solar zenith and azimuth angles, the
|
|
161
|
-
surface tilt and azimuth parameters are typically determined
|
|
162
|
-
by :py:meth:`~SingleAxisTracker.singleaxis`. The
|
|
163
|
-
:py:meth:`~SingleAxisTracker.singleaxis` method also returns
|
|
164
|
-
the angle of incidence, so this method is only needed
|
|
165
|
-
if using a different tracking algorithm.
|
|
166
|
-
|
|
167
|
-
Parameters
|
|
168
|
-
----------
|
|
169
|
-
surface_tilt : numeric
|
|
170
|
-
Panel tilt from horizontal.
|
|
171
|
-
surface_azimuth : numeric
|
|
172
|
-
Panel azimuth from north
|
|
173
|
-
solar_zenith : float or Series.
|
|
174
|
-
Solar zenith angle.
|
|
175
|
-
solar_azimuth : float or Series.
|
|
176
|
-
Solar azimuth angle.
|
|
177
|
-
|
|
178
|
-
Returns
|
|
179
|
-
-------
|
|
180
|
-
aoi : Series
|
|
181
|
-
The angle of incidence in degrees from normal.
|
|
182
|
-
"""
|
|
183
|
-
|
|
184
|
-
aoi = irradiance.aoi(surface_tilt, surface_azimuth,
|
|
185
|
-
solar_zenith, solar_azimuth)
|
|
186
|
-
return aoi
|
|
187
|
-
|
|
188
|
-
@_unwrap_single_value
|
|
189
|
-
def get_irradiance(self, surface_tilt, surface_azimuth,
|
|
190
|
-
solar_zenith, solar_azimuth, dni, ghi, dhi,
|
|
191
|
-
albedo=None, dni_extra=None, airmass=None,
|
|
192
|
-
model='haydavies',
|
|
193
|
-
**kwargs):
|
|
194
|
-
"""
|
|
195
|
-
Uses the :func:`irradiance.get_total_irradiance` function to
|
|
196
|
-
calculate the plane of array irradiance components on a tilted
|
|
197
|
-
surface defined by the input data and ``self.albedo``.
|
|
198
|
-
|
|
199
|
-
For a given set of solar zenith and azimuth angles, the
|
|
200
|
-
surface tilt and azimuth parameters are typically determined
|
|
201
|
-
by :py:meth:`~SingleAxisTracker.singleaxis`.
|
|
202
|
-
|
|
203
|
-
Parameters
|
|
204
|
-
----------
|
|
205
|
-
surface_tilt : numeric
|
|
206
|
-
Panel tilt from horizontal.
|
|
207
|
-
surface_azimuth : numeric
|
|
208
|
-
Panel azimuth from north
|
|
209
|
-
solar_zenith : numeric
|
|
210
|
-
Solar zenith angle.
|
|
211
|
-
solar_azimuth : numeric
|
|
212
|
-
Solar azimuth angle.
|
|
213
|
-
dni : float or Series
|
|
214
|
-
Direct Normal Irradiance
|
|
215
|
-
ghi : float or Series
|
|
216
|
-
Global horizontal irradiance
|
|
217
|
-
dhi : float or Series
|
|
218
|
-
Diffuse horizontal irradiance
|
|
219
|
-
albedo : None, float or Series, default None
|
|
220
|
-
Ground surface albedo. [unitless]
|
|
221
|
-
dni_extra : float or Series, default None
|
|
222
|
-
Extraterrestrial direct normal irradiance
|
|
223
|
-
airmass : float or Series, default None
|
|
224
|
-
Airmass
|
|
225
|
-
model : String, default 'haydavies'
|
|
226
|
-
Irradiance model.
|
|
227
|
-
|
|
228
|
-
**kwargs
|
|
229
|
-
Passed to :func:`irradiance.get_total_irradiance`.
|
|
230
|
-
|
|
231
|
-
Returns
|
|
232
|
-
-------
|
|
233
|
-
poa_irradiance : DataFrame
|
|
234
|
-
Column names are: ``total, beam, sky, ground``.
|
|
235
|
-
"""
|
|
236
|
-
|
|
237
|
-
# not needed for all models, but this is easier
|
|
238
|
-
if dni_extra is None:
|
|
239
|
-
dni_extra = irradiance.get_extra_radiation(solar_zenith.index)
|
|
240
|
-
|
|
241
|
-
if airmass is None:
|
|
242
|
-
airmass = atmosphere.get_relative_airmass(solar_zenith)
|
|
243
|
-
|
|
244
|
-
# SingleAxisTracker only supports a single Array, but we need the
|
|
245
|
-
# validate/iterate machinery so that single length tuple input/output
|
|
246
|
-
# is handled the same as PVSystem.get_irradiance. GH 1159
|
|
247
|
-
dni = self._validate_per_array(dni, system_wide=True)
|
|
248
|
-
ghi = self._validate_per_array(ghi, system_wide=True)
|
|
249
|
-
dhi = self._validate_per_array(dhi, system_wide=True)
|
|
250
|
-
|
|
251
|
-
if albedo is None:
|
|
252
|
-
# assign default albedo here because SingleAxisTracker
|
|
253
|
-
# initializes albedo to None
|
|
254
|
-
albedo = 0.25
|
|
255
|
-
|
|
256
|
-
albedo = self._validate_per_array(albedo, system_wide=True)
|
|
257
|
-
|
|
258
|
-
return tuple(
|
|
259
|
-
irradiance.get_total_irradiance(
|
|
260
|
-
surface_tilt,
|
|
261
|
-
surface_azimuth,
|
|
262
|
-
solar_zenith,
|
|
263
|
-
solar_azimuth,
|
|
264
|
-
dni, ghi, dhi,
|
|
265
|
-
dni_extra=dni_extra,
|
|
266
|
-
airmass=airmass,
|
|
267
|
-
model=model,
|
|
268
|
-
albedo=albedo,
|
|
269
|
-
**kwargs)
|
|
270
|
-
for array, dni, ghi, dhi, albedo in zip(
|
|
271
|
-
self.arrays, dni, ghi, dhi, albedo
|
|
272
|
-
)
|
|
273
|
-
)
|
|
5
|
+
from pvlib import irradiance
|
|
274
6
|
|
|
275
7
|
|
|
276
8
|
def singleaxis(apparent_zenith, apparent_azimuth,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: pvlib
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.10.0
|
|
4
4
|
Summary: A set of functions and classes for simulating the performance of photovoltaic energy systems.
|
|
5
5
|
Home-page: https://github.com/pvlib/pvlib-python
|
|
6
6
|
Author: pvlib python Developers
|
|
@@ -27,13 +27,11 @@ Requires-Dist: scipy (>=1.4.0)
|
|
|
27
27
|
Requires-Dist: h5py
|
|
28
28
|
Requires-Dist: importlib-metadata ; python_version < "3.8"
|
|
29
29
|
Provides-Extra: all
|
|
30
|
-
Requires-Dist: cftime (>=1.1.1) ; extra == 'all'
|
|
31
30
|
Requires-Dist: cython ; extra == 'all'
|
|
32
31
|
Requires-Dist: docutils (==0.15.2) ; extra == 'all'
|
|
33
32
|
Requires-Dist: ephem ; extra == 'all'
|
|
34
33
|
Requires-Dist: ipython ; extra == 'all'
|
|
35
34
|
Requires-Dist: matplotlib ; extra == 'all'
|
|
36
|
-
Requires-Dist: netcdf4 ; extra == 'all'
|
|
37
35
|
Requires-Dist: nrel-pysam ; extra == 'all'
|
|
38
36
|
Requires-Dist: numba ; extra == 'all'
|
|
39
37
|
Requires-Dist: pillow ; extra == 'all'
|
|
@@ -46,7 +44,6 @@ Requires-Dist: pytest-remotedata ; extra == 'all'
|
|
|
46
44
|
Requires-Dist: pytest-rerunfailures ; extra == 'all'
|
|
47
45
|
Requires-Dist: pytest-timeout ; extra == 'all'
|
|
48
46
|
Requires-Dist: requests-mock ; extra == 'all'
|
|
49
|
-
Requires-Dist: siphon ; extra == 'all'
|
|
50
47
|
Requires-Dist: sphinx (==4.5.0) ; extra == 'all'
|
|
51
48
|
Requires-Dist: sphinx-gallery ; extra == 'all'
|
|
52
49
|
Requires-Dist: sphinx-toggleprompt (>=0.0.5) ; extra == 'all'
|
|
@@ -59,20 +56,15 @@ Requires-Dist: pydata-sphinx-theme (==0.8.1) ; extra == 'doc'
|
|
|
59
56
|
Requires-Dist: sphinx-gallery ; extra == 'doc'
|
|
60
57
|
Requires-Dist: docutils (==0.15.2) ; extra == 'doc'
|
|
61
58
|
Requires-Dist: pillow ; extra == 'doc'
|
|
62
|
-
Requires-Dist: netcdf4 ; extra == 'doc'
|
|
63
|
-
Requires-Dist: siphon ; extra == 'doc'
|
|
64
59
|
Requires-Dist: sphinx-toggleprompt (>=0.0.5) ; extra == 'doc'
|
|
65
60
|
Requires-Dist: pvfactors ; extra == 'doc'
|
|
66
61
|
Provides-Extra: optional
|
|
67
62
|
Requires-Dist: cython ; extra == 'optional'
|
|
68
63
|
Requires-Dist: ephem ; extra == 'optional'
|
|
69
|
-
Requires-Dist: netcdf4 ; extra == 'optional'
|
|
70
64
|
Requires-Dist: nrel-pysam ; extra == 'optional'
|
|
71
65
|
Requires-Dist: numba ; extra == 'optional'
|
|
72
66
|
Requires-Dist: pvfactors ; extra == 'optional'
|
|
73
|
-
Requires-Dist: siphon ; extra == 'optional'
|
|
74
67
|
Requires-Dist: statsmodels ; extra == 'optional'
|
|
75
|
-
Requires-Dist: cftime (>=1.1.1) ; extra == 'optional'
|
|
76
68
|
Provides-Extra: test
|
|
77
69
|
Requires-Dist: pytest ; extra == 'test'
|
|
78
70
|
Requires-Dist: pytest-cov ; extra == 'test'
|