pvlib 0.10.5__tar.gz → 0.11.0__tar.gz
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-0.10.5/pvlib.egg-info → pvlib-0.11.0}/PKG-INFO +1 -1
- pvlib-0.11.0/docs/examples/agrivoltaics/README.rst +2 -0
- pvlib-0.11.0/docs/examples/agrivoltaics/plot_diffuse_PAR_Spitters_relationship.py +161 -0
- pvlib-0.11.0/docs/examples/shading/plot_martinez_shade_loss.py +272 -0
- pvlib-0.11.0/docs/examples/shading/plot_shaded_fraction1d_ns_hsat_example.py +181 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/examples/solar-position/plot_sunpath_diagrams.py +31 -10
- pvlib-0.11.0/docs/examples/spectrum/plot_standard_ASTM_G173-03.py +31 -0
- pvlib-0.11.0/docs/sphinx/source/_images/Anderson_Jensen_2024_Fig3.png +0 -0
- pvlib-0.11.0/docs/sphinx/source/_images/PV_module_layout_cesardd.jpg +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/conf.py +3 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/reference/effects_on_pv_system_output/shading.rst +2 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/reference/effects_on_pv_system_output/spectrum.rst +5 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/reference/index.rst +1 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/reference/iotools.rst +0 -1
- pvlib-0.11.0/docs/sphinx/source/reference/irradiance/albedo.rst +9 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/reference/irradiance/components.rst +1 -1
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/reference/irradiance/index.rst +1 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/reference/modelchain.rst +0 -1
- pvlib-0.11.0/docs/sphinx/source/reference/transformer.rst +11 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/whatsnew/v0.10.0.rst +4 -4
- pvlib-0.11.0/docs/sphinx/source/whatsnew/v0.11.0.rst +96 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/whatsnew/v0.6.1.rst +1 -1
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/whatsnew/v0.9.0.rst +1 -1
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/whatsnew/v0.9.1.rst +1 -1
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/whatsnew.rst +1 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/tutorials/irradiance.ipynb +1 -32
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/__init__.py +1 -0
- pvlib-0.11.0/pvlib/albedo.py +168 -0
- pvlib-0.11.0/pvlib/data/ASTMG173.csv +2004 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/iam.py +28 -28
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/iotools/__init__.py +0 -1
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/iotools/midc.py +15 -10
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/iotools/psm3.py +10 -25
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/iotools/srml.py +0 -61
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/irradiance.py +133 -95
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/location.py +13 -5
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/modelchain.py +2 -165
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/pvsystem.py +23 -63
- pvlib-0.11.0/pvlib/shading.py +694 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/spectrum/__init__.py +5 -0
- pvlib-0.11.0/pvlib/spectrum/mismatch.py +1102 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/spectrum/spectrl2.py +8 -8
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/iotools/test_psm3.py +0 -18
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/iotools/test_srml.py +1 -43
- pvlib-0.11.0/pvlib/tests/test_albedo.py +84 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/test_inverter.py +2 -2
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/test_irradiance.py +35 -2
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/test_location.py +26 -18
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/test_modelchain.py +0 -57
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/test_pvsystem.py +11 -39
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/test_shading.py +167 -1
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/test_singlediode.py +0 -19
- pvlib-0.11.0/pvlib/tests/test_spectrum.py +578 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/test_temperature.py +7 -7
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/test_tools.py +24 -0
- pvlib-0.11.0/pvlib/tests/test_transformer.py +60 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tools.py +27 -0
- pvlib-0.11.0/pvlib/transformer.py +117 -0
- {pvlib-0.10.5 → pvlib-0.11.0/pvlib.egg-info}/PKG-INFO +1 -1
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib.egg-info/SOURCES.txt +14 -1
- pvlib-0.10.5/docs/sphinx/source/whatsnew/v0.11.0.rst +0 -37
- pvlib-0.10.5/pvlib/data/astm_g173_am15g.csv +0 -2003
- pvlib-0.10.5/pvlib/shading.py +0 -344
- pvlib-0.10.5/pvlib/spectrum/mismatch.py +0 -573
- pvlib-0.10.5/pvlib/tests/test_spectrum.py +0 -317
- {pvlib-0.10.5 → pvlib-0.11.0}/AUTHORS.md +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/LICENSE +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/MANIFEST.in +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/README.md +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/examples/README.rst +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/examples/adr-pvarray/README.rst +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/examples/adr-pvarray/plot_fit_to_matrix.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/examples/adr-pvarray/plot_simulate_fast.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/examples/adr-pvarray/plot_simulate_system.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/examples/bifacial/README.rst +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/examples/bifacial/plot_bifi_model_mc.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/examples/bifacial/plot_bifi_model_pvwatts.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/examples/bifacial/plot_pvfactors_fixed_tilt.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/examples/irradiance-decomposition/README.rst +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/examples/irradiance-decomposition/plot_diffuse_fraction.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/examples/irradiance-transposition/README.rst +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/examples/irradiance-transposition/plot_ghi_transposition.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/examples/irradiance-transposition/plot_interval_transposition_error.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/examples/irradiance-transposition/plot_mixed_orientation.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/examples/irradiance-transposition/plot_rtranpose_limitations.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/examples/irradiance-transposition/plot_rtranpose_year.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/examples/irradiance-transposition/plot_seasonal_tilt.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/examples/irradiance-transposition/plot_transposition_gain.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/examples/iv-modeling/README.rst +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/examples/iv-modeling/plot_singlediode.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/examples/reflections/README.rst +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/examples/reflections/plot_convert_iam_models.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/examples/reflections/plot_diffuse_aoi_correction.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/examples/reflections/plot_fit_iam_models.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/examples/shading/README.rst +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/examples/shading/plot_partial_module_shading_simple.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/examples/shading/plot_passias_diffuse_shading.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/examples/shading/plot_simple_irradiance_adjustment_for_horizon_shading.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/examples/soiling/README.rst +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/examples/soiling/plot_fig3A_hsu_soiling_example.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/examples/soiling/plot_greensboro_kimber_soiling.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/examples/solar-position/README.rst +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/examples/solar-tracking/README.rst +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/examples/solar-tracking/plot_discontinuous_tracking.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/examples/solar-tracking/plot_dual_axis_tracking.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/examples/solar-tracking/plot_single_axis_tracking.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/examples/solar-tracking/plot_single_axis_tracking_on_sloped_terrain.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/examples/spectrum/README.rst +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/examples/spectrum/plot_spectrl2_fig51A.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/examples/system-models/README.rst +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/examples/system-models/plot_oedi_9068.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/notes/Determining the average view factor from a module.pdf +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/Makefile +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/make.bat +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/_images/Anderson_Mikofski_2020_Fig5.jpg +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/_images/Coello_Boyle_2019_Fig3.png +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/_images/OEDI_9068_daily_timeseries.png +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/_images/OEDI_9068_inverter1_comparison.png +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/_images/OEDI_9068_inverter2_comparison.png +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/_images/clonebutton.png +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/_images/ground_slope_angle_convention.png +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/_images/pvlib_logo_horiz.png +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/_images/pvlib_logo_vert.png +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/_images/pvlib_powered_logo_horiz.png +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/_images/pvlib_powered_logo_vert.png +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/_images/tracker_azimuth_angle_convention.png +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/_images/tracker_rotation_angle_convention.png +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/_static/favicon-16x16.png +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/_static/favicon-32x32.png +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/_static/no_scrollbars.css +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/_static/reference_format.css +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/_static/version-alert.js +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/_templates/autosummary/class.rst +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/_templates/autosummary/function.rst +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/_templates/autosummary/method.rst +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/_templates/edit-this-page.html +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/contributing.rst +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/index.rst +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/reference/airmass_atmospheric.rst +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/reference/bifacial.rst +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/reference/classes.rst +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/reference/clearsky.rst +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/reference/effects_on_pv_system_output/index.rst +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/reference/effects_on_pv_system_output/loss-models.rst +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/reference/effects_on_pv_system_output/snow.rst +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/reference/effects_on_pv_system_output/soiling.rst +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/reference/irradiance/class-methods.rst +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/reference/irradiance/clearness-index.rst +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/reference/irradiance/decomposition.rst +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/reference/irradiance/transposition.rst +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/reference/location.rst +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/reference/pv_modeling/iam.rst +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/reference/pv_modeling/index.rst +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/reference/pv_modeling/inverter.rst +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/reference/pv_modeling/other.rst +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/reference/pv_modeling/parameters.rst +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/reference/pv_modeling/sdm.rst +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/reference/pv_modeling/system_models.rst +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/reference/pv_modeling/temperature.rst +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/reference/scaling.rst +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/reference/solarposition.rst +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/reference/tracking.rst +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/user_guide/bifacial.rst +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/user_guide/clearsky.rst +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/user_guide/faq.rst +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/user_guide/index.rst +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/user_guide/installation.rst +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/user_guide/introtutorial.rst +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/user_guide/modelchain.rst +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/user_guide/package_overview.rst +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/user_guide/pvsystem.rst +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/user_guide/singlediode.rst +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/user_guide/timetimezones.rst +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/user_guide/variables_style_rules.rst +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/user_guide/weather_data.rst +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/whatsnew/v0.1.0.txt +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/whatsnew/v0.10.1.rst +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/whatsnew/v0.10.2.rst +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/whatsnew/v0.10.3.rst +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/whatsnew/v0.10.4.rst +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/whatsnew/v0.10.5.rst +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/whatsnew/v0.2.0.txt +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/whatsnew/v0.2.1.txt +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/whatsnew/v0.2.2.txt +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/whatsnew/v0.3.0.txt +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/whatsnew/v0.3.1.txt +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/whatsnew/v0.3.2.txt +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/whatsnew/v0.3.3.txt +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/whatsnew/v0.4.0.txt +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/whatsnew/v0.4.1.txt +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/whatsnew/v0.4.2.txt +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/whatsnew/v0.4.3.txt +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/whatsnew/v0.4.4.txt +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/whatsnew/v0.4.5.txt +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/whatsnew/v0.5.0.rst +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/whatsnew/v0.5.1.rst +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/whatsnew/v0.5.2.rst +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/whatsnew/v0.6.0.rst +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/whatsnew/v0.6.2.rst +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/whatsnew/v0.6.3.rst +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/whatsnew/v0.7.0.rst +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/whatsnew/v0.7.1.rst +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/whatsnew/v0.7.2.rst +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/whatsnew/v0.8.0.rst +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/whatsnew/v0.8.1.rst +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/whatsnew/v0.9.2.rst +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/whatsnew/v0.9.3.rst +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/whatsnew/v0.9.4.rst +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/whatsnew/v0.9.5.rst +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/tutorials/atmosphere.ipynb +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/tutorials/pvsystem.ipynb +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/tutorials/solarposition.ipynb +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/tutorials/tmy.ipynb +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/tutorials/tmy_and_diffuse_irrad_models.ipynb +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/tutorials/tmy_to_power.ipynb +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/docs/tutorials/tracking.ipynb +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/_deprecation.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/atmosphere.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/bifacial/__init__.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/bifacial/infinite_sheds.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/bifacial/pvfactors.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/bifacial/utils.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/clearsky.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/12839.tm2 +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/703165TY.csv +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/723170TYA.CSV +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/Altitude.h5 +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/BIRD_08_16_2012.csv +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/BIRD_08_16_2012_patm.csv +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/Burlington, United States SolarAnywhere Time Series 2021 Lat_44_465 Lon_-73_205 TMY3 format.csv +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/Burlington, United States SolarAnywhere Time Series 20210101 to 20210103 Lat_44_4675 Lon_-73_2075 SA format.csv +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/Burlington, United States SolarAnywhere Typical GHI Year Lat_44_465 Lon_-73_205 SA format.csv +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/CPS SCH275KTL-DO-US-800-250kW_275kVA_1.OND +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/CRNS0101-05-2019-AZ_Tucson_11_W.txt +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/CRN_with_problems.txt +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/ET-M772BH550GL.PAN +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/LinkeTurbidities.h5 +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/NLD_Amsterdam062400_IWEC.epw +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/PVsyst_demo.csv +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/PVsyst_demo_model.csv +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/SRML-day-EUPO1801.txt +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/abq19056.dat +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/adr-library-cec-inverters-2019-03-05.csv +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/aod550_tcwv_20121101_test.nc +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/bishop88_numerical_precision.csv +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/bsrn-lr0100-pay0616.dat +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/bsrn-pay0616.dat.gz +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/cams_mcclear_1min_verbose.csv +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/cams_mcclear_monthly.csv +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/cams_radiation_1min_verbose.csv +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/cams_radiation_monthly.csv +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/detect_clearsky_data.csv +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/detect_clearsky_threshold_data.csv +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/greensboro_kimber_soil_manwash.dat +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/greensboro_kimber_soil_nowash.dat +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/inverter_fit_snl_meas.csv +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/inverter_fit_snl_sim.csv +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/ivtools_numdiff.csv +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/midc_20181014.txt +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/midc_raw_20181018.txt +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/midc_raw_short_header_20191115.txt +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/msn19056.dat +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/precise_iv_curves1.json +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/precise_iv_curves2.json +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/precise_iv_curves_parameter_sets1.csv +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/precise_iv_curves_parameter_sets2.csv +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/pvgis_hourly_Timeseries_45.000_8.000_SA2_10kWp_CIS_5_2a_2013_2014.json +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/pvgis_hourly_Timeseries_45.000_8.000_SA_30deg_0deg_2016_2016.csv +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/pvgis_tmy_meta.json +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/pvgis_tmy_test.dat +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/pvwatts_8760_rackmount.csv +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/pvwatts_8760_roofmount.csv +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/sam-library-cec-inverters-2019-03-05.csv +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/sam-library-cec-modules-2019-03-05.csv +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/sam-library-sandia-modules-2015-6-30.csv +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/singleaxis_tracker_wslope.csv +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/soiling_hsu_example_inputs.csv +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/spectrl2_example_spectra.csv +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/surfrad-slv16001.dat +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/test_psm3_2017.csv +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/test_psm3_2019_5min.csv +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/test_psm3_tmy-2017.csv +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/test_read_psm3.csv +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/test_read_pvgis_horizon.csv +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/tmy_45.000_8.000_2005_2016.csv +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/tmy_45.000_8.000_2005_2016.epw +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/tmy_45.000_8.000_2005_2016.json +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/tmy_45.000_8.000_2005_2016.txt +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/tmy_45.000_8.000_userhorizon.json +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/variables_style_rules.csv +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/inverter.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/iotools/acis.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/iotools/bsrn.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/iotools/crn.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/iotools/epw.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/iotools/panond.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/iotools/pvgis.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/iotools/sodapro.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/iotools/solaranywhere.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/iotools/solargis.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/iotools/solcast.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/iotools/solrad.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/iotools/surfrad.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/iotools/tmy.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/ivtools/__init__.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/ivtools/sde.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/ivtools/sdm.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/ivtools/utils.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/pvarray.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/scaling.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/singlediode.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/snow.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/soiling.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/solarposition.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/spa.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/spa_c_files/README.md +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/spa_c_files/__init__.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/spa_c_files/cspa_py.pxd +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/spa_c_files/setup.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/spa_c_files/spa_py.pyx +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/spa_c_files/spa_py_example.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/temperature.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/__init__.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/bifacial/__init__.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/bifacial/test_infinite_sheds.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/bifacial/test_pvfactors.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/bifacial/test_utils.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/conftest.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/iotools/__init__.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/iotools/test_acis.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/iotools/test_bsrn.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/iotools/test_crn.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/iotools/test_epw.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/iotools/test_midc.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/iotools/test_panond.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/iotools/test_pvgis.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/iotools/test_sodapro.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/iotools/test_solaranywhere.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/iotools/test_solargis.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/iotools/test_solcast.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/iotools/test_solrad.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/iotools/test_surfrad.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/iotools/test_tmy.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/ivtools/__init__.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/ivtools/test_sde.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/ivtools/test_sdm.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/ivtools/test_utils.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/test_atmosphere.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/test_clearsky.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/test_conftest.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/test_iam.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/test_numerical_precision.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/test_pvarray.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/test_scaling.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/test_snow.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/test_soiling.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/test_solarposition.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/test_spa.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/test_tracking.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tracking.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/version.py +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib.egg-info/dependency_links.txt +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib.egg-info/requires.txt +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pvlib.egg-info/top_level.txt +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/pyproject.toml +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/setup.cfg +0 -0
- {pvlib-0.10.5 → pvlib-0.11.0}/setup.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: pvlib
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.11.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-email: pvlib python Developers <pvlib-admin@googlegroups.com>
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Calculating daily diffuse PAR using Spitter's relationship
|
|
3
|
+
==========================================================
|
|
4
|
+
|
|
5
|
+
This example demonstrates how to calculate the diffuse photosynthetically
|
|
6
|
+
active radiation (PAR) from diffuse fraction of broadband insolation.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
# %%
|
|
10
|
+
# The photosynthetically active radiation (PAR) is a key metric in quantifying
|
|
11
|
+
# the photosynthesis process of plants. As with broadband irradiance, PAR can
|
|
12
|
+
# be divided into direct and diffuse components. The diffuse fraction of PAR
|
|
13
|
+
# with respect to the total PAR is important in agrivoltaic systems, where
|
|
14
|
+
# crops are grown under solar panels. The diffuse fraction of PAR can be
|
|
15
|
+
# calculated using the Spitter's relationship [1]_ implemented in
|
|
16
|
+
# :py:func:`~pvlib.irradiance.diffuse_par_spitters`.
|
|
17
|
+
# This model requires the average daily solar zenith angle and the
|
|
18
|
+
# daily fraction of the broadband insolation that is diffuse as inputs.
|
|
19
|
+
#
|
|
20
|
+
# .. note::
|
|
21
|
+
# Understanding the distinction between the broadband insolation and the PAR
|
|
22
|
+
# is a key concept. Broadband insolation is the total amount of solar
|
|
23
|
+
# energy that gets to a surface, often used in PV applications, while PAR
|
|
24
|
+
# is a measurement of a narrower spectrum of wavelengths that are involved
|
|
25
|
+
# in photosynthesis. See section on *Photosynthetically Active insolation*
|
|
26
|
+
# in pp. 222-223 of [1]_.
|
|
27
|
+
#
|
|
28
|
+
# References
|
|
29
|
+
# ----------
|
|
30
|
+
# .. [1] C. J. T. Spitters, H. A. J. M. Toussaint, and J. Goudriaan,
|
|
31
|
+
# 'Separating the diffuse and direct component of global radiation and its
|
|
32
|
+
# implications for modeling canopy photosynthesis Part I. Components of
|
|
33
|
+
# incoming radiation', Agricultural and Forest Meteorology, vol. 38,
|
|
34
|
+
# no. 1, pp. 217-229, Oct. 1986, :doi:`10.1016/0168-1923(86)90060-2`.
|
|
35
|
+
#
|
|
36
|
+
# Read some example data
|
|
37
|
+
# ^^^^^^^^^^^^^^^^^^^^^^
|
|
38
|
+
# Let's read some weather data from a TMY3 file and calculate the solar
|
|
39
|
+
# position.
|
|
40
|
+
|
|
41
|
+
import pvlib
|
|
42
|
+
import pandas as pd
|
|
43
|
+
import matplotlib.pyplot as plt
|
|
44
|
+
from matplotlib.dates import AutoDateLocator, ConciseDateFormatter
|
|
45
|
+
from pathlib import Path
|
|
46
|
+
|
|
47
|
+
# Datafile found in the pvlib distribution
|
|
48
|
+
DATA_FILE = Path(pvlib.__path__[0]).joinpath("data", "723170TYA.CSV")
|
|
49
|
+
|
|
50
|
+
tmy, metadata = pvlib.iotools.read_tmy3(
|
|
51
|
+
DATA_FILE, coerce_year=2002, map_variables=True
|
|
52
|
+
)
|
|
53
|
+
tmy = tmy.filter(
|
|
54
|
+
["ghi", "dhi", "dni", "pressure", "temp_air"]
|
|
55
|
+
) # remaining columns are not needed
|
|
56
|
+
tmy = tmy["2002-09-06":"2002-09-21"] # select some days
|
|
57
|
+
|
|
58
|
+
solar_position = pvlib.solarposition.get_solarposition(
|
|
59
|
+
# TMY timestamp is at end of hour, so shift to center of interval
|
|
60
|
+
tmy.index.shift(freq="-30T"),
|
|
61
|
+
latitude=metadata["latitude"],
|
|
62
|
+
longitude=metadata["longitude"],
|
|
63
|
+
altitude=metadata["altitude"],
|
|
64
|
+
pressure=tmy["pressure"] * 100, # convert from millibar to Pa
|
|
65
|
+
temperature=tmy["temp_air"],
|
|
66
|
+
)
|
|
67
|
+
solar_position.index = tmy.index # reset index to end of the hour
|
|
68
|
+
|
|
69
|
+
# %%
|
|
70
|
+
# Calculate daily values
|
|
71
|
+
# ^^^^^^^^^^^^^^^^^^^^^^
|
|
72
|
+
# The daily average solar zenith angle and the daily diffuse fraction of
|
|
73
|
+
# broadband insolation are calculated as follows:
|
|
74
|
+
|
|
75
|
+
daily_solar_zenith = solar_position["zenith"].resample("D").mean()
|
|
76
|
+
# integration over the day with a time step of 1 hour
|
|
77
|
+
daily_tmy = tmy[["ghi", "dhi"]].resample("D").sum() * 1
|
|
78
|
+
daily_tmy["diffuse_fraction"] = daily_tmy["dhi"] / daily_tmy["ghi"]
|
|
79
|
+
|
|
80
|
+
# %%
|
|
81
|
+
# Calculate Photosynthetically Active Radiation
|
|
82
|
+
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
83
|
+
# The total PAR can be approximated as 0.50 times the broadband horizontal
|
|
84
|
+
# insolation (integral of GHI) for an average solar elevation higher that 10°.
|
|
85
|
+
# See section on *Photosynthetically Active Radiation* in pp. 222-223 of [1]_.
|
|
86
|
+
|
|
87
|
+
par = pd.DataFrame({"total": 0.50 * daily_tmy["ghi"]}, index=daily_tmy.index)
|
|
88
|
+
if daily_solar_zenith.min() < 10:
|
|
89
|
+
raise ValueError(
|
|
90
|
+
"The total PAR can't be assumed to be half the broadband insolation "
|
|
91
|
+
+ "for average zenith angles lower than 10°."
|
|
92
|
+
)
|
|
93
|
+
|
|
94
|
+
# Calculate broadband insolation diffuse fraction, input of the Spitter's model
|
|
95
|
+
daily_tmy["diffuse_fraction"] = daily_tmy["dhi"] / daily_tmy["ghi"]
|
|
96
|
+
|
|
97
|
+
# Calculate diffuse PAR fraction using Spitter's relationship
|
|
98
|
+
par["diffuse_fraction"] = pvlib.irradiance.diffuse_par_spitters(
|
|
99
|
+
solar_position["zenith"], daily_tmy["diffuse_fraction"]
|
|
100
|
+
)
|
|
101
|
+
|
|
102
|
+
# Finally, calculate the diffuse PAR
|
|
103
|
+
par["diffuse"] = par["total"] * par["diffuse_fraction"]
|
|
104
|
+
|
|
105
|
+
# %%
|
|
106
|
+
# Plot the results
|
|
107
|
+
# ^^^^^^^^^^^^^^^^
|
|
108
|
+
# Insolation on left axis, diffuse fraction on right axis
|
|
109
|
+
|
|
110
|
+
fig, ax_l = plt.subplots(figsize=(12, 6))
|
|
111
|
+
ax_l.set(
|
|
112
|
+
xlabel="Time",
|
|
113
|
+
ylabel="Daily insolation $[Wh/m^2/day]$",
|
|
114
|
+
title="Diffuse PAR using Spitter's relationship",
|
|
115
|
+
)
|
|
116
|
+
ax_l.xaxis.set_major_formatter(
|
|
117
|
+
ConciseDateFormatter(AutoDateLocator(), tz=daily_tmy.index.tz)
|
|
118
|
+
)
|
|
119
|
+
ax_l.plot(
|
|
120
|
+
daily_tmy.index,
|
|
121
|
+
daily_tmy["ghi"],
|
|
122
|
+
label="Broadband: total",
|
|
123
|
+
color="deepskyblue",
|
|
124
|
+
)
|
|
125
|
+
ax_l.plot(
|
|
126
|
+
daily_tmy.index,
|
|
127
|
+
daily_tmy["dhi"],
|
|
128
|
+
label="Broadband: diffuse",
|
|
129
|
+
color="skyblue",
|
|
130
|
+
linestyle="-.",
|
|
131
|
+
)
|
|
132
|
+
ax_l.plot(daily_tmy.index, par["total"], label="PAR: total", color="orangered")
|
|
133
|
+
ax_l.plot(
|
|
134
|
+
daily_tmy.index,
|
|
135
|
+
par["diffuse"],
|
|
136
|
+
label="PAR: diffuse",
|
|
137
|
+
color="coral",
|
|
138
|
+
linestyle="-.",
|
|
139
|
+
)
|
|
140
|
+
ax_l.grid()
|
|
141
|
+
ax_l.legend(loc="upper left")
|
|
142
|
+
|
|
143
|
+
ax_r = ax_l.twinx()
|
|
144
|
+
ax_r.set(ylabel="Diffuse fraction")
|
|
145
|
+
ax_r.plot(
|
|
146
|
+
daily_tmy.index,
|
|
147
|
+
daily_tmy["diffuse_fraction"],
|
|
148
|
+
label="Broadband diffuse fraction",
|
|
149
|
+
color="plum",
|
|
150
|
+
linestyle=":",
|
|
151
|
+
)
|
|
152
|
+
ax_r.plot(
|
|
153
|
+
daily_tmy.index,
|
|
154
|
+
par["diffuse_fraction"],
|
|
155
|
+
label="PAR diffuse fraction",
|
|
156
|
+
color="chocolate",
|
|
157
|
+
linestyle=":",
|
|
158
|
+
)
|
|
159
|
+
ax_r.legend(loc="upper right")
|
|
160
|
+
|
|
161
|
+
plt.show()
|
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Modelling shading losses in modules with bypass diodes
|
|
3
|
+
======================================================
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
# %%
|
|
7
|
+
# This example illustrates how to use the loss model proposed by Martinez et
|
|
8
|
+
# al. [1]_. The model proposes a power output losses factor by adjusting
|
|
9
|
+
# the incident direct and circumsolar beam irradiance fraction of a PV module
|
|
10
|
+
# based on the number of shaded *blocks*. A *block* is defined as a group of
|
|
11
|
+
# cells protected by a bypass diode. More information on *blocks* can be found
|
|
12
|
+
# in the original paper [1]_ and in the
|
|
13
|
+
# :py:func:`pvlib.shading.direct_martinez` documentation.
|
|
14
|
+
#
|
|
15
|
+
# The following key functions are used in this example:
|
|
16
|
+
#
|
|
17
|
+
# 1. :py:func:`pvlib.shading.direct_martinez` to calculate the power output
|
|
18
|
+
# losses fraction due to shading.
|
|
19
|
+
# 2. :py:func:`pvlib.shading.shaded_fraction1d` to calculate the fraction of
|
|
20
|
+
# shaded surface and consequently the number of shaded *blocks* due to
|
|
21
|
+
# row-to-row shading.
|
|
22
|
+
# 3. :py:func:`pvlib.tracking.singleaxis` to calculate the rotation angle of
|
|
23
|
+
# the trackers.
|
|
24
|
+
#
|
|
25
|
+
# .. sectionauthor:: Echedey Luis <echelual (at) gmail.com>
|
|
26
|
+
#
|
|
27
|
+
# Problem description
|
|
28
|
+
# -------------------
|
|
29
|
+
# Let's consider a PV system with the following characteristics:
|
|
30
|
+
#
|
|
31
|
+
# - Two north-south single-axis trackers, each one having 6 modules.
|
|
32
|
+
# - The rows have the same true-tracking tilt angles. True tracking
|
|
33
|
+
# is chosen in this example, so shading is significant.
|
|
34
|
+
# - Terrain slope is 7 degrees downward to the east.
|
|
35
|
+
# - Row axes are horizontal.
|
|
36
|
+
# - The modules are comprised of multiple cells. We will compare these cases:
|
|
37
|
+
# - modules with one bypass diode
|
|
38
|
+
# - modules with three bypass diodes
|
|
39
|
+
# - half-cut cell modules with three bypass diodes in portrait and landscape
|
|
40
|
+
#
|
|
41
|
+
# Setting up the system
|
|
42
|
+
# ----------------------
|
|
43
|
+
# Let's start by defining the system characteristics, location and the time
|
|
44
|
+
# range for the analysis.
|
|
45
|
+
|
|
46
|
+
import pvlib
|
|
47
|
+
import pandas as pd
|
|
48
|
+
import numpy as np
|
|
49
|
+
import matplotlib.pyplot as plt
|
|
50
|
+
from matplotlib.dates import ConciseDateFormatter
|
|
51
|
+
|
|
52
|
+
pitch = 4 # meters
|
|
53
|
+
width = 1.5 # meters
|
|
54
|
+
gcr = width / pitch # ground coverage ratio
|
|
55
|
+
N_modules_per_row = 6
|
|
56
|
+
axis_azimuth = 180 # N-S axis
|
|
57
|
+
axis_tilt = 0 # flat because the axis is perpendicular to the slope
|
|
58
|
+
cross_axis_tilt = -7 # 7 degrees downward to the east
|
|
59
|
+
|
|
60
|
+
latitude, longitude = 40.2712, -3.7277
|
|
61
|
+
locus = pvlib.location.Location(
|
|
62
|
+
latitude,
|
|
63
|
+
longitude,
|
|
64
|
+
tz="Europe/Madrid",
|
|
65
|
+
altitude=pvlib.location.lookup_altitude(latitude, longitude),
|
|
66
|
+
)
|
|
67
|
+
|
|
68
|
+
times = pd.date_range("2001-04-11T04", "2001-04-11T20", freq="10min")
|
|
69
|
+
|
|
70
|
+
# %%
|
|
71
|
+
# True-tracking algorithm and shaded fraction
|
|
72
|
+
# -------------------------------------------
|
|
73
|
+
# Since this model is about row-to-row shading, we will use the true-tracking
|
|
74
|
+
# algorithm to calculate the trackers rotation. Back-tracking eliminates
|
|
75
|
+
# shading between rows, and since this example is about shading, we will not
|
|
76
|
+
# use it.
|
|
77
|
+
#
|
|
78
|
+
# Then, the next step is to calculate the fraction of shaded surface. This is
|
|
79
|
+
# done using :py:func:`pvlib.shading.shaded_fraction1d`. Using this function is
|
|
80
|
+
# straightforward with the variables we already have defined.
|
|
81
|
+
# Then, we can calculate the number of shaded blocks by rounding up the shaded
|
|
82
|
+
# fraction by the number of blocks along the shaded length.
|
|
83
|
+
|
|
84
|
+
# Calculate solar position to get single-axis tracker rotation and irradiance
|
|
85
|
+
solar_pos = locus.get_solarposition(times)
|
|
86
|
+
solar_apparent_zenith, solar_azimuth = (
|
|
87
|
+
solar_pos["apparent_zenith"],
|
|
88
|
+
solar_pos["azimuth"],
|
|
89
|
+
) # unpack for better readability
|
|
90
|
+
|
|
91
|
+
tracking_result = pvlib.tracking.singleaxis(
|
|
92
|
+
apparent_zenith=solar_apparent_zenith,
|
|
93
|
+
apparent_azimuth=solar_azimuth,
|
|
94
|
+
axis_tilt=axis_tilt,
|
|
95
|
+
axis_azimuth=axis_azimuth,
|
|
96
|
+
max_angle=(-90 + cross_axis_tilt, 90 + cross_axis_tilt), # (min, max)
|
|
97
|
+
backtrack=False,
|
|
98
|
+
gcr=gcr,
|
|
99
|
+
cross_axis_tilt=cross_axis_tilt,
|
|
100
|
+
)
|
|
101
|
+
|
|
102
|
+
tracker_theta, aoi, surface_tilt, surface_azimuth = (
|
|
103
|
+
tracking_result["tracker_theta"],
|
|
104
|
+
tracking_result["aoi"],
|
|
105
|
+
tracking_result["surface_tilt"],
|
|
106
|
+
tracking_result["surface_azimuth"],
|
|
107
|
+
) # unpack for better readability
|
|
108
|
+
|
|
109
|
+
# Calculate the shade fraction
|
|
110
|
+
shaded_fraction = pvlib.shading.shaded_fraction1d(
|
|
111
|
+
solar_apparent_zenith,
|
|
112
|
+
solar_azimuth,
|
|
113
|
+
axis_azimuth,
|
|
114
|
+
axis_tilt=axis_tilt,
|
|
115
|
+
shaded_row_rotation=tracker_theta,
|
|
116
|
+
shading_row_rotation=tracker_theta,
|
|
117
|
+
collector_width=width,
|
|
118
|
+
pitch=pitch,
|
|
119
|
+
cross_axis_slope=cross_axis_tilt,
|
|
120
|
+
)
|
|
121
|
+
|
|
122
|
+
# %%
|
|
123
|
+
# Number of shaded blocks
|
|
124
|
+
# -----------------------
|
|
125
|
+
# The number of shaded blocks depends on the module configuration and number
|
|
126
|
+
# of bypass diodes. For example,
|
|
127
|
+
# modules with one bypass diode will behave like one block.
|
|
128
|
+
# On the other hand, modules with three bypass diodes will have three blocks,
|
|
129
|
+
# except for the half-cut cell modules, which will have six blocks; 2x3 blocks
|
|
130
|
+
# where the two rows are along the longest side of the module.
|
|
131
|
+
# We can argue that the dimensions of the system change when you switch from
|
|
132
|
+
# portrait to landscape, but for this example, we will consider it the same.
|
|
133
|
+
#
|
|
134
|
+
# The number of shaded blocks is calculated by rounding up the shaded fraction
|
|
135
|
+
# by the number of blocks along the shaded length. So let's define the number
|
|
136
|
+
# of blocks for each module configuration:
|
|
137
|
+
#
|
|
138
|
+
# - 1 bypass diode: 1 block
|
|
139
|
+
# - 3 bypass diodes: 3 blocks in landscape; 1 in portrait
|
|
140
|
+
# - 3 bypass diodes half-cut cells:
|
|
141
|
+
# - 2 blocks in portrait
|
|
142
|
+
# - 3 blocks in landscape
|
|
143
|
+
#
|
|
144
|
+
# .. figure:: ../../_images/PV_module_layout_cesardd.jpg
|
|
145
|
+
# :align: center
|
|
146
|
+
# :width: 75%
|
|
147
|
+
# :alt: Normal and half-cut cells module layouts
|
|
148
|
+
#
|
|
149
|
+
# Left: common module layout. Right: half-cut cells module layout.
|
|
150
|
+
# Each module has three bypass diodes. On the left, they connect cell
|
|
151
|
+
# columns 1-2, 2-3 & 3-4. On the right, they connect cell columns 1-2, 3-4 &
|
|
152
|
+
# 5-6.
|
|
153
|
+
# *Source: César Domínguez. CC BY-SA 4.0, Wikimedia Commons*
|
|
154
|
+
#
|
|
155
|
+
# In the image above, each orange U-shaped string section is a block.
|
|
156
|
+
# By symmetry, the yellow inverted-U's of the subcircuit are also blocks.
|
|
157
|
+
# For this reason, the half-cut cell modules have 6 blocks in total: two along
|
|
158
|
+
# the longest side and three along the shortest side.
|
|
159
|
+
|
|
160
|
+
blocks_per_module = {
|
|
161
|
+
"1 bypass diode": 1,
|
|
162
|
+
"3 bypass diodes": 3,
|
|
163
|
+
"3 bypass diodes half-cut, portrait": 2,
|
|
164
|
+
"3 bypass diodes half-cut, landscape": 3,
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
# Calculate the number of shaded blocks during the day
|
|
168
|
+
shaded_blocks_per_module = {
|
|
169
|
+
k: np.ceil(blocks_N * shaded_fraction)
|
|
170
|
+
for k, blocks_N in blocks_per_module.items()
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
# %%
|
|
174
|
+
# Plane of array irradiance example data
|
|
175
|
+
# --------------------------------------
|
|
176
|
+
# To calculate the power output losses due to shading, we need the plane of
|
|
177
|
+
# array irradiance. For this example, we will use synthetic data:
|
|
178
|
+
|
|
179
|
+
clearsky = locus.get_clearsky(
|
|
180
|
+
times, solar_position=solar_pos, model="ineichen"
|
|
181
|
+
)
|
|
182
|
+
dni_extra = pvlib.irradiance.get_extra_radiation(times)
|
|
183
|
+
airmass = pvlib.atmosphere.get_relative_airmass(solar_apparent_zenith)
|
|
184
|
+
sky_diffuse = pvlib.irradiance.perez_driesse(
|
|
185
|
+
surface_tilt, surface_azimuth, clearsky["dhi"], clearsky["dni"],
|
|
186
|
+
solar_apparent_zenith, solar_azimuth, dni_extra, airmass,
|
|
187
|
+
) # fmt: skip
|
|
188
|
+
poa_components = pvlib.irradiance.poa_components(
|
|
189
|
+
aoi, clearsky["dni"], sky_diffuse, poa_ground_diffuse=0
|
|
190
|
+
) # ignore ground diffuse for brevity
|
|
191
|
+
poa_global, poa_direct = (
|
|
192
|
+
poa_components["poa_global"],
|
|
193
|
+
poa_components["poa_direct"],
|
|
194
|
+
)
|
|
195
|
+
|
|
196
|
+
# %%
|
|
197
|
+
# Results
|
|
198
|
+
# -------
|
|
199
|
+
# Now that we have the number of shaded blocks for each module configuration,
|
|
200
|
+
# we can apply the model and estimate the power loss due to shading.
|
|
201
|
+
#
|
|
202
|
+
# Note that this model is not linear with the shaded blocks ratio, so there is
|
|
203
|
+
# a difference between applying it to just a module or a whole row.
|
|
204
|
+
|
|
205
|
+
shade_losses_per_module = {
|
|
206
|
+
k: pvlib.shading.direct_martinez(
|
|
207
|
+
poa_global=poa_global,
|
|
208
|
+
poa_direct=poa_direct,
|
|
209
|
+
shaded_fraction=shaded_fraction,
|
|
210
|
+
shaded_blocks=module_shaded_blocks,
|
|
211
|
+
total_blocks=blocks_per_module[k],
|
|
212
|
+
)
|
|
213
|
+
for k, module_shaded_blocks in shaded_blocks_per_module.items()
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
shade_losses_per_row = {
|
|
217
|
+
k: pvlib.shading.direct_martinez(
|
|
218
|
+
poa_global=poa_global,
|
|
219
|
+
poa_direct=poa_direct,
|
|
220
|
+
shaded_fraction=shaded_fraction,
|
|
221
|
+
shaded_blocks=module_shaded_blocks * N_modules_per_row,
|
|
222
|
+
total_blocks=blocks_per_module[k] * N_modules_per_row,
|
|
223
|
+
)
|
|
224
|
+
for k, module_shaded_blocks in shaded_blocks_per_module.items()
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
# %%
|
|
228
|
+
# Plotting the results
|
|
229
|
+
# ^^^^^^^^^^^^^^^^^^^^
|
|
230
|
+
|
|
231
|
+
fig, (ax1, ax2) = plt.subplots(2, 1, sharex=True)
|
|
232
|
+
fig.suptitle("Martinez power losses due to shading")
|
|
233
|
+
for k, shade_losses in shade_losses_per_module.items():
|
|
234
|
+
linestyle = "--" if k == "3 bypass diodes half-cut, landscape" else "-"
|
|
235
|
+
ax1.plot(times, shade_losses, label=k, linestyle=linestyle)
|
|
236
|
+
ax1.legend(loc="upper center")
|
|
237
|
+
ax1.grid()
|
|
238
|
+
ax1.set_xlabel("Time")
|
|
239
|
+
ax1.xaxis.set_major_formatter(
|
|
240
|
+
ConciseDateFormatter("%H:%M", tz="Europe/Madrid")
|
|
241
|
+
)
|
|
242
|
+
ax1.set_ylabel(r"$P_{out}$ losses")
|
|
243
|
+
ax1.set_title("Per module")
|
|
244
|
+
|
|
245
|
+
for k, shade_losses in shade_losses_per_row.items():
|
|
246
|
+
linestyle = "--" if k == "3 bypass diodes half-cut, landscape" else "-"
|
|
247
|
+
ax2.plot(times, shade_losses, label=k, linestyle=linestyle)
|
|
248
|
+
ax2.legend(loc="upper center")
|
|
249
|
+
ax2.grid()
|
|
250
|
+
ax2.set_xlabel("Time")
|
|
251
|
+
ax2.xaxis.set_major_formatter(
|
|
252
|
+
ConciseDateFormatter("%H:%M", tz="Europe/Madrid")
|
|
253
|
+
)
|
|
254
|
+
ax2.set_ylabel(r"$P_{out}$ losses")
|
|
255
|
+
ax2.set_title("Per row")
|
|
256
|
+
fig.tight_layout()
|
|
257
|
+
fig.show()
|
|
258
|
+
|
|
259
|
+
# %%
|
|
260
|
+
# Note how the half-cut cell module in portrait performs better than the
|
|
261
|
+
# normal module with three bypass diodes. This is because the number of shaded
|
|
262
|
+
# blocks is less along the shaded length is higher in the half-cut module.
|
|
263
|
+
# This is the reason why half-cut cell modules are preferred in portrait
|
|
264
|
+
# orientation.
|
|
265
|
+
|
|
266
|
+
# %%
|
|
267
|
+
# References
|
|
268
|
+
# ----------
|
|
269
|
+
# .. [1] F. Martínez-Moreno, J. Muñoz, and E. Lorenzo, 'Experimental model
|
|
270
|
+
# to estimate shading losses on PV arrays', Solar Energy Materials and
|
|
271
|
+
# Solar Cells, vol. 94, no. 12, pp. 2298-2303, Dec. 2010,
|
|
272
|
+
# :doi:`10.1016/j.solmat.2010.07.029`.
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Shaded fraction of a horizontal single-axis tracker
|
|
3
|
+
====================================================
|
|
4
|
+
|
|
5
|
+
This example illustrates how to calculate the 1D shaded fraction of three rows
|
|
6
|
+
in a North-South horizontal single axis tracker (HSAT) configuration.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
# %%
|
|
10
|
+
# :py:func:`pvlib.shading.shaded_fraction1d` exposes a useful method for the
|
|
11
|
+
# calculation of the shaded fraction of the width of a solar collector. Here,
|
|
12
|
+
# the width is defined as the dimension perpendicular to the axis of rotation.
|
|
13
|
+
# This method for calculating the shaded fraction only requires minor
|
|
14
|
+
# modifications to be applicable for fixed-tilt systems.
|
|
15
|
+
#
|
|
16
|
+
# It is highly recommended to read :py:func:`pvlib.shading.shaded_fraction1d`
|
|
17
|
+
# documentation to understand the input parameters and the method's
|
|
18
|
+
# capabilities. For more in-depth information, please see the journal paper
|
|
19
|
+
# `10.1063/5.0202220 <https://doi.org/10.1063/5.0202220>`_ describing
|
|
20
|
+
# the methodology.
|
|
21
|
+
#
|
|
22
|
+
# Let's start by obtaining the true-tracking angles for each of the rows and
|
|
23
|
+
# limiting the angles to the range of -50 to 50 degrees. This decision is
|
|
24
|
+
# done to create an example scenario with significant shading.
|
|
25
|
+
#
|
|
26
|
+
# Key functions used in this example are:
|
|
27
|
+
#
|
|
28
|
+
# 1. :py:func:`pvlib.tracking.singleaxis` to calculate the tracking angles.
|
|
29
|
+
# 2. :py:func:`pvlib.shading.projected_solar_zenith_angle` to calculate the
|
|
30
|
+
# projected solar zenith angle.
|
|
31
|
+
# 3. :py:func:`pvlib.shading.shaded_fraction1d` to calculate the shaded
|
|
32
|
+
# fractions.
|
|
33
|
+
#
|
|
34
|
+
# .. sectionauthor:: Echedey Luis <echelual (at) gmail.com>
|
|
35
|
+
|
|
36
|
+
import pvlib
|
|
37
|
+
|
|
38
|
+
import numpy as np
|
|
39
|
+
import pandas as pd
|
|
40
|
+
import matplotlib.pyplot as plt
|
|
41
|
+
from matplotlib.dates import DateFormatter
|
|
42
|
+
|
|
43
|
+
# Define the solar system parameters
|
|
44
|
+
latitude, longitude = 28.51, -13.89
|
|
45
|
+
altitude = pvlib.location.lookup_altitude(latitude, longitude)
|
|
46
|
+
|
|
47
|
+
axis_tilt = 3 # degrees, positive is upwards in the axis_azimuth direction
|
|
48
|
+
axis_azimuth = 180 # degrees, N-S tracking axis
|
|
49
|
+
collector_width = 3.2 # m
|
|
50
|
+
pitch = 4.15 # m
|
|
51
|
+
gcr = collector_width / pitch
|
|
52
|
+
cross_axis_slope = -5 # degrees
|
|
53
|
+
surface_to_axis_offset = 0.07 # m
|
|
54
|
+
|
|
55
|
+
# Generate a time range for the simulation
|
|
56
|
+
times = pd.date_range(
|
|
57
|
+
start="2024-01-01T05",
|
|
58
|
+
end="2024-01-01T21",
|
|
59
|
+
freq="5min",
|
|
60
|
+
tz="Atlantic/Canary",
|
|
61
|
+
)
|
|
62
|
+
|
|
63
|
+
# Calculate the solar position
|
|
64
|
+
solar_position = pvlib.solarposition.get_solarposition(
|
|
65
|
+
times, latitude, longitude, altitude
|
|
66
|
+
)
|
|
67
|
+
solar_azimuth = solar_position["azimuth"]
|
|
68
|
+
solar_zenith = solar_position["apparent_zenith"]
|
|
69
|
+
|
|
70
|
+
# Calculate the tracking angles
|
|
71
|
+
rotation_angle = pvlib.tracking.singleaxis(
|
|
72
|
+
solar_zenith,
|
|
73
|
+
solar_azimuth,
|
|
74
|
+
axis_tilt,
|
|
75
|
+
axis_azimuth,
|
|
76
|
+
max_angle=(-50, 50), # (min, max) degrees
|
|
77
|
+
backtrack=False,
|
|
78
|
+
gcr=gcr,
|
|
79
|
+
cross_axis_tilt=cross_axis_slope,
|
|
80
|
+
)["tracker_theta"]
|
|
81
|
+
|
|
82
|
+
# %%
|
|
83
|
+
# Once the tracker angles have been obtained, the next step is to calculate
|
|
84
|
+
# the shaded fraction. Special care must be taken
|
|
85
|
+
# to ensure that the shaded or shading tracker roles are correctly assigned
|
|
86
|
+
# depending on the solar position.
|
|
87
|
+
# This means we will have a result for each row, ``eastmost_shaded_fraction``,
|
|
88
|
+
# ``middle_shaded_fraction``, and ``westmost_shaded_fraction``.
|
|
89
|
+
# Switching the parameters will be based on the
|
|
90
|
+
# sign of :py:func:`pvlib.shading.projected_solar_zenith_angle`.
|
|
91
|
+
#
|
|
92
|
+
# The following code is verbose to make it easier to understand the process,
|
|
93
|
+
# but with some effort you may be able to simplify it. This verbosity also
|
|
94
|
+
# allows to change the premises easily per case, e.g., in case of a tracker
|
|
95
|
+
# failure or with a different system configuration.
|
|
96
|
+
|
|
97
|
+
psza = pvlib.shading.projected_solar_zenith_angle(
|
|
98
|
+
solar_zenith, solar_azimuth, axis_tilt, axis_azimuth
|
|
99
|
+
)
|
|
100
|
+
|
|
101
|
+
# Calculate the shaded fraction for the eastmost row
|
|
102
|
+
eastmost_shaded_fraction = np.where(
|
|
103
|
+
psza < 0,
|
|
104
|
+
0, # no shaded fraction in the morning
|
|
105
|
+
# shaded fraction in the evening
|
|
106
|
+
pvlib.shading.shaded_fraction1d(
|
|
107
|
+
solar_zenith,
|
|
108
|
+
solar_azimuth,
|
|
109
|
+
axis_azimuth,
|
|
110
|
+
shaded_row_rotation=rotation_angle,
|
|
111
|
+
axis_tilt=axis_tilt,
|
|
112
|
+
collector_width=collector_width,
|
|
113
|
+
pitch=pitch,
|
|
114
|
+
surface_to_axis_offset=surface_to_axis_offset,
|
|
115
|
+
cross_axis_slope=cross_axis_slope,
|
|
116
|
+
shading_row_rotation=rotation_angle,
|
|
117
|
+
),
|
|
118
|
+
)
|
|
119
|
+
|
|
120
|
+
# Calculate the shaded fraction for the middle row
|
|
121
|
+
middle_shaded_fraction = np.where(
|
|
122
|
+
psza < 0,
|
|
123
|
+
# shaded fraction in the morning
|
|
124
|
+
pvlib.shading.shaded_fraction1d(
|
|
125
|
+
solar_zenith,
|
|
126
|
+
solar_azimuth,
|
|
127
|
+
axis_azimuth,
|
|
128
|
+
shaded_row_rotation=rotation_angle,
|
|
129
|
+
axis_tilt=axis_tilt,
|
|
130
|
+
collector_width=collector_width,
|
|
131
|
+
pitch=pitch,
|
|
132
|
+
surface_to_axis_offset=surface_to_axis_offset,
|
|
133
|
+
cross_axis_slope=cross_axis_slope,
|
|
134
|
+
shading_row_rotation=rotation_angle,
|
|
135
|
+
),
|
|
136
|
+
# shaded fraction in the evening
|
|
137
|
+
pvlib.shading.shaded_fraction1d(
|
|
138
|
+
solar_zenith,
|
|
139
|
+
solar_azimuth,
|
|
140
|
+
axis_azimuth,
|
|
141
|
+
shaded_row_rotation=rotation_angle,
|
|
142
|
+
axis_tilt=axis_tilt,
|
|
143
|
+
collector_width=collector_width,
|
|
144
|
+
pitch=pitch,
|
|
145
|
+
surface_to_axis_offset=surface_to_axis_offset,
|
|
146
|
+
cross_axis_slope=cross_axis_slope,
|
|
147
|
+
shading_row_rotation=rotation_angle,
|
|
148
|
+
),
|
|
149
|
+
)
|
|
150
|
+
|
|
151
|
+
# Calculate the shaded fraction for the westmost row
|
|
152
|
+
westmost_shaded_fraction = np.where(
|
|
153
|
+
psza < 0,
|
|
154
|
+
# shaded fraction in the morning
|
|
155
|
+
pvlib.shading.shaded_fraction1d(
|
|
156
|
+
solar_zenith,
|
|
157
|
+
solar_azimuth,
|
|
158
|
+
axis_azimuth,
|
|
159
|
+
shaded_row_rotation=rotation_angle,
|
|
160
|
+
axis_tilt=axis_tilt,
|
|
161
|
+
collector_width=collector_width,
|
|
162
|
+
pitch=pitch,
|
|
163
|
+
surface_to_axis_offset=surface_to_axis_offset,
|
|
164
|
+
cross_axis_slope=cross_axis_slope,
|
|
165
|
+
shading_row_rotation=rotation_angle,
|
|
166
|
+
),
|
|
167
|
+
0, # no shaded fraction in the evening
|
|
168
|
+
)
|
|
169
|
+
|
|
170
|
+
# %%
|
|
171
|
+
# Plot the shaded fraction result for each row:
|
|
172
|
+
plt.plot(times, eastmost_shaded_fraction, label="East-most", color="blue")
|
|
173
|
+
plt.plot(times, middle_shaded_fraction, label="Middle", color="green",
|
|
174
|
+
linewidth=3, linestyle="--") # fmt: skip
|
|
175
|
+
plt.plot(times, westmost_shaded_fraction, label="West-most", color="red")
|
|
176
|
+
plt.title(r"$shaded\_fraction1d$ of each row vs time")
|
|
177
|
+
plt.xlabel("Time")
|
|
178
|
+
plt.gca().xaxis.set_major_formatter(DateFormatter("%H:%M"))
|
|
179
|
+
plt.ylabel("Shaded Fraction")
|
|
180
|
+
plt.legend()
|
|
181
|
+
plt.show()
|