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.
Files changed (367) hide show
  1. {pvlib-0.10.5/pvlib.egg-info → pvlib-0.11.0}/PKG-INFO +1 -1
  2. pvlib-0.11.0/docs/examples/agrivoltaics/README.rst +2 -0
  3. pvlib-0.11.0/docs/examples/agrivoltaics/plot_diffuse_PAR_Spitters_relationship.py +161 -0
  4. pvlib-0.11.0/docs/examples/shading/plot_martinez_shade_loss.py +272 -0
  5. pvlib-0.11.0/docs/examples/shading/plot_shaded_fraction1d_ns_hsat_example.py +181 -0
  6. {pvlib-0.10.5 → pvlib-0.11.0}/docs/examples/solar-position/plot_sunpath_diagrams.py +31 -10
  7. pvlib-0.11.0/docs/examples/spectrum/plot_standard_ASTM_G173-03.py +31 -0
  8. pvlib-0.11.0/docs/sphinx/source/_images/Anderson_Jensen_2024_Fig3.png +0 -0
  9. pvlib-0.11.0/docs/sphinx/source/_images/PV_module_layout_cesardd.jpg +0 -0
  10. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/conf.py +3 -0
  11. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/reference/effects_on_pv_system_output/shading.rst +2 -0
  12. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/reference/effects_on_pv_system_output/spectrum.rst +5 -0
  13. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/reference/index.rst +1 -0
  14. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/reference/iotools.rst +0 -1
  15. pvlib-0.11.0/docs/sphinx/source/reference/irradiance/albedo.rst +9 -0
  16. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/reference/irradiance/components.rst +1 -1
  17. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/reference/irradiance/index.rst +1 -0
  18. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/reference/modelchain.rst +0 -1
  19. pvlib-0.11.0/docs/sphinx/source/reference/transformer.rst +11 -0
  20. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/whatsnew/v0.10.0.rst +4 -4
  21. pvlib-0.11.0/docs/sphinx/source/whatsnew/v0.11.0.rst +96 -0
  22. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/whatsnew/v0.6.1.rst +1 -1
  23. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/whatsnew/v0.9.0.rst +1 -1
  24. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/whatsnew/v0.9.1.rst +1 -1
  25. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/whatsnew.rst +1 -0
  26. {pvlib-0.10.5 → pvlib-0.11.0}/docs/tutorials/irradiance.ipynb +1 -32
  27. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/__init__.py +1 -0
  28. pvlib-0.11.0/pvlib/albedo.py +168 -0
  29. pvlib-0.11.0/pvlib/data/ASTMG173.csv +2004 -0
  30. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/iam.py +28 -28
  31. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/iotools/__init__.py +0 -1
  32. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/iotools/midc.py +15 -10
  33. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/iotools/psm3.py +10 -25
  34. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/iotools/srml.py +0 -61
  35. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/irradiance.py +133 -95
  36. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/location.py +13 -5
  37. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/modelchain.py +2 -165
  38. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/pvsystem.py +23 -63
  39. pvlib-0.11.0/pvlib/shading.py +694 -0
  40. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/spectrum/__init__.py +5 -0
  41. pvlib-0.11.0/pvlib/spectrum/mismatch.py +1102 -0
  42. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/spectrum/spectrl2.py +8 -8
  43. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/iotools/test_psm3.py +0 -18
  44. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/iotools/test_srml.py +1 -43
  45. pvlib-0.11.0/pvlib/tests/test_albedo.py +84 -0
  46. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/test_inverter.py +2 -2
  47. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/test_irradiance.py +35 -2
  48. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/test_location.py +26 -18
  49. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/test_modelchain.py +0 -57
  50. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/test_pvsystem.py +11 -39
  51. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/test_shading.py +167 -1
  52. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/test_singlediode.py +0 -19
  53. pvlib-0.11.0/pvlib/tests/test_spectrum.py +578 -0
  54. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/test_temperature.py +7 -7
  55. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/test_tools.py +24 -0
  56. pvlib-0.11.0/pvlib/tests/test_transformer.py +60 -0
  57. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tools.py +27 -0
  58. pvlib-0.11.0/pvlib/transformer.py +117 -0
  59. {pvlib-0.10.5 → pvlib-0.11.0/pvlib.egg-info}/PKG-INFO +1 -1
  60. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib.egg-info/SOURCES.txt +14 -1
  61. pvlib-0.10.5/docs/sphinx/source/whatsnew/v0.11.0.rst +0 -37
  62. pvlib-0.10.5/pvlib/data/astm_g173_am15g.csv +0 -2003
  63. pvlib-0.10.5/pvlib/shading.py +0 -344
  64. pvlib-0.10.5/pvlib/spectrum/mismatch.py +0 -573
  65. pvlib-0.10.5/pvlib/tests/test_spectrum.py +0 -317
  66. {pvlib-0.10.5 → pvlib-0.11.0}/AUTHORS.md +0 -0
  67. {pvlib-0.10.5 → pvlib-0.11.0}/LICENSE +0 -0
  68. {pvlib-0.10.5 → pvlib-0.11.0}/MANIFEST.in +0 -0
  69. {pvlib-0.10.5 → pvlib-0.11.0}/README.md +0 -0
  70. {pvlib-0.10.5 → pvlib-0.11.0}/docs/examples/README.rst +0 -0
  71. {pvlib-0.10.5 → pvlib-0.11.0}/docs/examples/adr-pvarray/README.rst +0 -0
  72. {pvlib-0.10.5 → pvlib-0.11.0}/docs/examples/adr-pvarray/plot_fit_to_matrix.py +0 -0
  73. {pvlib-0.10.5 → pvlib-0.11.0}/docs/examples/adr-pvarray/plot_simulate_fast.py +0 -0
  74. {pvlib-0.10.5 → pvlib-0.11.0}/docs/examples/adr-pvarray/plot_simulate_system.py +0 -0
  75. {pvlib-0.10.5 → pvlib-0.11.0}/docs/examples/bifacial/README.rst +0 -0
  76. {pvlib-0.10.5 → pvlib-0.11.0}/docs/examples/bifacial/plot_bifi_model_mc.py +0 -0
  77. {pvlib-0.10.5 → pvlib-0.11.0}/docs/examples/bifacial/plot_bifi_model_pvwatts.py +0 -0
  78. {pvlib-0.10.5 → pvlib-0.11.0}/docs/examples/bifacial/plot_pvfactors_fixed_tilt.py +0 -0
  79. {pvlib-0.10.5 → pvlib-0.11.0}/docs/examples/irradiance-decomposition/README.rst +0 -0
  80. {pvlib-0.10.5 → pvlib-0.11.0}/docs/examples/irradiance-decomposition/plot_diffuse_fraction.py +0 -0
  81. {pvlib-0.10.5 → pvlib-0.11.0}/docs/examples/irradiance-transposition/README.rst +0 -0
  82. {pvlib-0.10.5 → pvlib-0.11.0}/docs/examples/irradiance-transposition/plot_ghi_transposition.py +0 -0
  83. {pvlib-0.10.5 → pvlib-0.11.0}/docs/examples/irradiance-transposition/plot_interval_transposition_error.py +0 -0
  84. {pvlib-0.10.5 → pvlib-0.11.0}/docs/examples/irradiance-transposition/plot_mixed_orientation.py +0 -0
  85. {pvlib-0.10.5 → pvlib-0.11.0}/docs/examples/irradiance-transposition/plot_rtranpose_limitations.py +0 -0
  86. {pvlib-0.10.5 → pvlib-0.11.0}/docs/examples/irradiance-transposition/plot_rtranpose_year.py +0 -0
  87. {pvlib-0.10.5 → pvlib-0.11.0}/docs/examples/irradiance-transposition/plot_seasonal_tilt.py +0 -0
  88. {pvlib-0.10.5 → pvlib-0.11.0}/docs/examples/irradiance-transposition/plot_transposition_gain.py +0 -0
  89. {pvlib-0.10.5 → pvlib-0.11.0}/docs/examples/iv-modeling/README.rst +0 -0
  90. {pvlib-0.10.5 → pvlib-0.11.0}/docs/examples/iv-modeling/plot_singlediode.py +0 -0
  91. {pvlib-0.10.5 → pvlib-0.11.0}/docs/examples/reflections/README.rst +0 -0
  92. {pvlib-0.10.5 → pvlib-0.11.0}/docs/examples/reflections/plot_convert_iam_models.py +0 -0
  93. {pvlib-0.10.5 → pvlib-0.11.0}/docs/examples/reflections/plot_diffuse_aoi_correction.py +0 -0
  94. {pvlib-0.10.5 → pvlib-0.11.0}/docs/examples/reflections/plot_fit_iam_models.py +0 -0
  95. {pvlib-0.10.5 → pvlib-0.11.0}/docs/examples/shading/README.rst +0 -0
  96. {pvlib-0.10.5 → pvlib-0.11.0}/docs/examples/shading/plot_partial_module_shading_simple.py +0 -0
  97. {pvlib-0.10.5 → pvlib-0.11.0}/docs/examples/shading/plot_passias_diffuse_shading.py +0 -0
  98. {pvlib-0.10.5 → pvlib-0.11.0}/docs/examples/shading/plot_simple_irradiance_adjustment_for_horizon_shading.py +0 -0
  99. {pvlib-0.10.5 → pvlib-0.11.0}/docs/examples/soiling/README.rst +0 -0
  100. {pvlib-0.10.5 → pvlib-0.11.0}/docs/examples/soiling/plot_fig3A_hsu_soiling_example.py +0 -0
  101. {pvlib-0.10.5 → pvlib-0.11.0}/docs/examples/soiling/plot_greensboro_kimber_soiling.py +0 -0
  102. {pvlib-0.10.5 → pvlib-0.11.0}/docs/examples/solar-position/README.rst +0 -0
  103. {pvlib-0.10.5 → pvlib-0.11.0}/docs/examples/solar-tracking/README.rst +0 -0
  104. {pvlib-0.10.5 → pvlib-0.11.0}/docs/examples/solar-tracking/plot_discontinuous_tracking.py +0 -0
  105. {pvlib-0.10.5 → pvlib-0.11.0}/docs/examples/solar-tracking/plot_dual_axis_tracking.py +0 -0
  106. {pvlib-0.10.5 → pvlib-0.11.0}/docs/examples/solar-tracking/plot_single_axis_tracking.py +0 -0
  107. {pvlib-0.10.5 → pvlib-0.11.0}/docs/examples/solar-tracking/plot_single_axis_tracking_on_sloped_terrain.py +0 -0
  108. {pvlib-0.10.5 → pvlib-0.11.0}/docs/examples/spectrum/README.rst +0 -0
  109. {pvlib-0.10.5 → pvlib-0.11.0}/docs/examples/spectrum/plot_spectrl2_fig51A.py +0 -0
  110. {pvlib-0.10.5 → pvlib-0.11.0}/docs/examples/system-models/README.rst +0 -0
  111. {pvlib-0.10.5 → pvlib-0.11.0}/docs/examples/system-models/plot_oedi_9068.py +0 -0
  112. {pvlib-0.10.5 → pvlib-0.11.0}/docs/notes/Determining the average view factor from a module.pdf +0 -0
  113. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/Makefile +0 -0
  114. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/make.bat +0 -0
  115. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/_images/Anderson_Mikofski_2020_Fig5.jpg +0 -0
  116. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/_images/Coello_Boyle_2019_Fig3.png +0 -0
  117. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/_images/OEDI_9068_daily_timeseries.png +0 -0
  118. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/_images/OEDI_9068_inverter1_comparison.png +0 -0
  119. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/_images/OEDI_9068_inverter2_comparison.png +0 -0
  120. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/_images/clonebutton.png +0 -0
  121. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/_images/ground_slope_angle_convention.png +0 -0
  122. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/_images/pvlib_logo_horiz.png +0 -0
  123. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/_images/pvlib_logo_vert.png +0 -0
  124. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/_images/pvlib_powered_logo_horiz.png +0 -0
  125. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/_images/pvlib_powered_logo_vert.png +0 -0
  126. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/_images/tracker_azimuth_angle_convention.png +0 -0
  127. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/_images/tracker_rotation_angle_convention.png +0 -0
  128. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/_static/favicon-16x16.png +0 -0
  129. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/_static/favicon-32x32.png +0 -0
  130. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/_static/no_scrollbars.css +0 -0
  131. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/_static/reference_format.css +0 -0
  132. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/_static/version-alert.js +0 -0
  133. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/_templates/autosummary/class.rst +0 -0
  134. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/_templates/autosummary/function.rst +0 -0
  135. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/_templates/autosummary/method.rst +0 -0
  136. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/_templates/edit-this-page.html +0 -0
  137. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/contributing.rst +0 -0
  138. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/index.rst +0 -0
  139. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/reference/airmass_atmospheric.rst +0 -0
  140. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/reference/bifacial.rst +0 -0
  141. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/reference/classes.rst +0 -0
  142. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/reference/clearsky.rst +0 -0
  143. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/reference/effects_on_pv_system_output/index.rst +0 -0
  144. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/reference/effects_on_pv_system_output/loss-models.rst +0 -0
  145. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/reference/effects_on_pv_system_output/snow.rst +0 -0
  146. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/reference/effects_on_pv_system_output/soiling.rst +0 -0
  147. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/reference/irradiance/class-methods.rst +0 -0
  148. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/reference/irradiance/clearness-index.rst +0 -0
  149. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/reference/irradiance/decomposition.rst +0 -0
  150. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/reference/irradiance/transposition.rst +0 -0
  151. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/reference/location.rst +0 -0
  152. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/reference/pv_modeling/iam.rst +0 -0
  153. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/reference/pv_modeling/index.rst +0 -0
  154. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/reference/pv_modeling/inverter.rst +0 -0
  155. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/reference/pv_modeling/other.rst +0 -0
  156. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/reference/pv_modeling/parameters.rst +0 -0
  157. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/reference/pv_modeling/sdm.rst +0 -0
  158. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/reference/pv_modeling/system_models.rst +0 -0
  159. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/reference/pv_modeling/temperature.rst +0 -0
  160. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/reference/scaling.rst +0 -0
  161. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/reference/solarposition.rst +0 -0
  162. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/reference/tracking.rst +0 -0
  163. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/user_guide/bifacial.rst +0 -0
  164. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/user_guide/clearsky.rst +0 -0
  165. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/user_guide/faq.rst +0 -0
  166. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/user_guide/index.rst +0 -0
  167. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/user_guide/installation.rst +0 -0
  168. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/user_guide/introtutorial.rst +0 -0
  169. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/user_guide/modelchain.rst +0 -0
  170. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/user_guide/package_overview.rst +0 -0
  171. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/user_guide/pvsystem.rst +0 -0
  172. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/user_guide/singlediode.rst +0 -0
  173. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/user_guide/timetimezones.rst +0 -0
  174. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/user_guide/variables_style_rules.rst +0 -0
  175. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/user_guide/weather_data.rst +0 -0
  176. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/whatsnew/v0.1.0.txt +0 -0
  177. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/whatsnew/v0.10.1.rst +0 -0
  178. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/whatsnew/v0.10.2.rst +0 -0
  179. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/whatsnew/v0.10.3.rst +0 -0
  180. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/whatsnew/v0.10.4.rst +0 -0
  181. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/whatsnew/v0.10.5.rst +0 -0
  182. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/whatsnew/v0.2.0.txt +0 -0
  183. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/whatsnew/v0.2.1.txt +0 -0
  184. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/whatsnew/v0.2.2.txt +0 -0
  185. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/whatsnew/v0.3.0.txt +0 -0
  186. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/whatsnew/v0.3.1.txt +0 -0
  187. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/whatsnew/v0.3.2.txt +0 -0
  188. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/whatsnew/v0.3.3.txt +0 -0
  189. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/whatsnew/v0.4.0.txt +0 -0
  190. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/whatsnew/v0.4.1.txt +0 -0
  191. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/whatsnew/v0.4.2.txt +0 -0
  192. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/whatsnew/v0.4.3.txt +0 -0
  193. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/whatsnew/v0.4.4.txt +0 -0
  194. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/whatsnew/v0.4.5.txt +0 -0
  195. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/whatsnew/v0.5.0.rst +0 -0
  196. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/whatsnew/v0.5.1.rst +0 -0
  197. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/whatsnew/v0.5.2.rst +0 -0
  198. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/whatsnew/v0.6.0.rst +0 -0
  199. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/whatsnew/v0.6.2.rst +0 -0
  200. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/whatsnew/v0.6.3.rst +0 -0
  201. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/whatsnew/v0.7.0.rst +0 -0
  202. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/whatsnew/v0.7.1.rst +0 -0
  203. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/whatsnew/v0.7.2.rst +0 -0
  204. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/whatsnew/v0.8.0.rst +0 -0
  205. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/whatsnew/v0.8.1.rst +0 -0
  206. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/whatsnew/v0.9.2.rst +0 -0
  207. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/whatsnew/v0.9.3.rst +0 -0
  208. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/whatsnew/v0.9.4.rst +0 -0
  209. {pvlib-0.10.5 → pvlib-0.11.0}/docs/sphinx/source/whatsnew/v0.9.5.rst +0 -0
  210. {pvlib-0.10.5 → pvlib-0.11.0}/docs/tutorials/atmosphere.ipynb +0 -0
  211. {pvlib-0.10.5 → pvlib-0.11.0}/docs/tutorials/pvsystem.ipynb +0 -0
  212. {pvlib-0.10.5 → pvlib-0.11.0}/docs/tutorials/solarposition.ipynb +0 -0
  213. {pvlib-0.10.5 → pvlib-0.11.0}/docs/tutorials/tmy.ipynb +0 -0
  214. {pvlib-0.10.5 → pvlib-0.11.0}/docs/tutorials/tmy_and_diffuse_irrad_models.ipynb +0 -0
  215. {pvlib-0.10.5 → pvlib-0.11.0}/docs/tutorials/tmy_to_power.ipynb +0 -0
  216. {pvlib-0.10.5 → pvlib-0.11.0}/docs/tutorials/tracking.ipynb +0 -0
  217. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/_deprecation.py +0 -0
  218. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/atmosphere.py +0 -0
  219. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/bifacial/__init__.py +0 -0
  220. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/bifacial/infinite_sheds.py +0 -0
  221. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/bifacial/pvfactors.py +0 -0
  222. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/bifacial/utils.py +0 -0
  223. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/clearsky.py +0 -0
  224. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/12839.tm2 +0 -0
  225. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/703165TY.csv +0 -0
  226. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/723170TYA.CSV +0 -0
  227. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/Altitude.h5 +0 -0
  228. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/BIRD_08_16_2012.csv +0 -0
  229. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/BIRD_08_16_2012_patm.csv +0 -0
  230. {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
  231. {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
  232. {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
  233. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/CPS SCH275KTL-DO-US-800-250kW_275kVA_1.OND +0 -0
  234. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/CRNS0101-05-2019-AZ_Tucson_11_W.txt +0 -0
  235. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/CRN_with_problems.txt +0 -0
  236. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/ET-M772BH550GL.PAN +0 -0
  237. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/LinkeTurbidities.h5 +0 -0
  238. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/NLD_Amsterdam062400_IWEC.epw +0 -0
  239. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/PVsyst_demo.csv +0 -0
  240. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/PVsyst_demo_model.csv +0 -0
  241. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/SRML-day-EUPO1801.txt +0 -0
  242. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/abq19056.dat +0 -0
  243. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/adr-library-cec-inverters-2019-03-05.csv +0 -0
  244. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/aod550_tcwv_20121101_test.nc +0 -0
  245. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/bishop88_numerical_precision.csv +0 -0
  246. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/bsrn-lr0100-pay0616.dat +0 -0
  247. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/bsrn-pay0616.dat.gz +0 -0
  248. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/cams_mcclear_1min_verbose.csv +0 -0
  249. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/cams_mcclear_monthly.csv +0 -0
  250. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/cams_radiation_1min_verbose.csv +0 -0
  251. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/cams_radiation_monthly.csv +0 -0
  252. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/detect_clearsky_data.csv +0 -0
  253. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/detect_clearsky_threshold_data.csv +0 -0
  254. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/greensboro_kimber_soil_manwash.dat +0 -0
  255. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/greensboro_kimber_soil_nowash.dat +0 -0
  256. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/inverter_fit_snl_meas.csv +0 -0
  257. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/inverter_fit_snl_sim.csv +0 -0
  258. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/ivtools_numdiff.csv +0 -0
  259. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/midc_20181014.txt +0 -0
  260. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/midc_raw_20181018.txt +0 -0
  261. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/midc_raw_short_header_20191115.txt +0 -0
  262. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/msn19056.dat +0 -0
  263. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/precise_iv_curves1.json +0 -0
  264. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/precise_iv_curves2.json +0 -0
  265. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/precise_iv_curves_parameter_sets1.csv +0 -0
  266. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/precise_iv_curves_parameter_sets2.csv +0 -0
  267. {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
  268. {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
  269. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/pvgis_tmy_meta.json +0 -0
  270. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/pvgis_tmy_test.dat +0 -0
  271. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/pvwatts_8760_rackmount.csv +0 -0
  272. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/pvwatts_8760_roofmount.csv +0 -0
  273. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/sam-library-cec-inverters-2019-03-05.csv +0 -0
  274. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/sam-library-cec-modules-2019-03-05.csv +0 -0
  275. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/sam-library-sandia-modules-2015-6-30.csv +0 -0
  276. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/singleaxis_tracker_wslope.csv +0 -0
  277. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/soiling_hsu_example_inputs.csv +0 -0
  278. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/spectrl2_example_spectra.csv +0 -0
  279. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/surfrad-slv16001.dat +0 -0
  280. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/test_psm3_2017.csv +0 -0
  281. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/test_psm3_2019_5min.csv +0 -0
  282. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/test_psm3_tmy-2017.csv +0 -0
  283. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/test_read_psm3.csv +0 -0
  284. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/test_read_pvgis_horizon.csv +0 -0
  285. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/tmy_45.000_8.000_2005_2016.csv +0 -0
  286. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/tmy_45.000_8.000_2005_2016.epw +0 -0
  287. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/tmy_45.000_8.000_2005_2016.json +0 -0
  288. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/tmy_45.000_8.000_2005_2016.txt +0 -0
  289. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/tmy_45.000_8.000_userhorizon.json +0 -0
  290. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/data/variables_style_rules.csv +0 -0
  291. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/inverter.py +0 -0
  292. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/iotools/acis.py +0 -0
  293. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/iotools/bsrn.py +0 -0
  294. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/iotools/crn.py +0 -0
  295. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/iotools/epw.py +0 -0
  296. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/iotools/panond.py +0 -0
  297. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/iotools/pvgis.py +0 -0
  298. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/iotools/sodapro.py +0 -0
  299. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/iotools/solaranywhere.py +0 -0
  300. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/iotools/solargis.py +0 -0
  301. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/iotools/solcast.py +0 -0
  302. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/iotools/solrad.py +0 -0
  303. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/iotools/surfrad.py +0 -0
  304. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/iotools/tmy.py +0 -0
  305. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/ivtools/__init__.py +0 -0
  306. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/ivtools/sde.py +0 -0
  307. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/ivtools/sdm.py +0 -0
  308. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/ivtools/utils.py +0 -0
  309. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/pvarray.py +0 -0
  310. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/scaling.py +0 -0
  311. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/singlediode.py +0 -0
  312. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/snow.py +0 -0
  313. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/soiling.py +0 -0
  314. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/solarposition.py +0 -0
  315. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/spa.py +0 -0
  316. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/spa_c_files/README.md +0 -0
  317. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/spa_c_files/__init__.py +0 -0
  318. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/spa_c_files/cspa_py.pxd +0 -0
  319. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/spa_c_files/setup.py +0 -0
  320. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/spa_c_files/spa_py.pyx +0 -0
  321. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/spa_c_files/spa_py_example.py +0 -0
  322. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/temperature.py +0 -0
  323. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/__init__.py +0 -0
  324. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/bifacial/__init__.py +0 -0
  325. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/bifacial/test_infinite_sheds.py +0 -0
  326. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/bifacial/test_pvfactors.py +0 -0
  327. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/bifacial/test_utils.py +0 -0
  328. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/conftest.py +0 -0
  329. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/iotools/__init__.py +0 -0
  330. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/iotools/test_acis.py +0 -0
  331. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/iotools/test_bsrn.py +0 -0
  332. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/iotools/test_crn.py +0 -0
  333. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/iotools/test_epw.py +0 -0
  334. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/iotools/test_midc.py +0 -0
  335. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/iotools/test_panond.py +0 -0
  336. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/iotools/test_pvgis.py +0 -0
  337. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/iotools/test_sodapro.py +0 -0
  338. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/iotools/test_solaranywhere.py +0 -0
  339. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/iotools/test_solargis.py +0 -0
  340. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/iotools/test_solcast.py +0 -0
  341. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/iotools/test_solrad.py +0 -0
  342. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/iotools/test_surfrad.py +0 -0
  343. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/iotools/test_tmy.py +0 -0
  344. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/ivtools/__init__.py +0 -0
  345. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/ivtools/test_sde.py +0 -0
  346. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/ivtools/test_sdm.py +0 -0
  347. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/ivtools/test_utils.py +0 -0
  348. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/test_atmosphere.py +0 -0
  349. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/test_clearsky.py +0 -0
  350. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/test_conftest.py +0 -0
  351. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/test_iam.py +0 -0
  352. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/test_numerical_precision.py +0 -0
  353. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/test_pvarray.py +0 -0
  354. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/test_scaling.py +0 -0
  355. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/test_snow.py +0 -0
  356. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/test_soiling.py +0 -0
  357. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/test_solarposition.py +0 -0
  358. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/test_spa.py +0 -0
  359. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tests/test_tracking.py +0 -0
  360. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/tracking.py +0 -0
  361. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib/version.py +0 -0
  362. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib.egg-info/dependency_links.txt +0 -0
  363. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib.egg-info/requires.txt +0 -0
  364. {pvlib-0.10.5 → pvlib-0.11.0}/pvlib.egg-info/top_level.txt +0 -0
  365. {pvlib-0.10.5 → pvlib-0.11.0}/pyproject.toml +0 -0
  366. {pvlib-0.10.5 → pvlib-0.11.0}/setup.cfg +0 -0
  367. {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.10.5
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,2 @@
1
+ Agrivoltaic Systems Modelling
2
+ -----------------------------
@@ -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()