From 2be782c64bf26abce12ee056c15aae3b4cdc7242 Mon Sep 17 00:00:00 2001 From: Saurabh Aneja <63314623+spaneja@users.noreply.github.com> Date: Wed, 15 Feb 2023 10:02:05 -0500 Subject: [PATCH 01/11] Updating infinite_sheds irradiance engine Updating the infinite_sheds irradiance engine to use the haydavies sky diffuse model. This will help the sensitivity issue with circumsolar on the backside of bifacial systems. --- pvlib/bifacial/infinite_sheds.py | 39 ++++++++++++++++++++++++++------ 1 file changed, 32 insertions(+), 7 deletions(-) diff --git a/pvlib/bifacial/infinite_sheds.py b/pvlib/bifacial/infinite_sheds.py index 47cf7c2d4d..c68005f9df 100644 --- a/pvlib/bifacial/infinite_sheds.py +++ b/pvlib/bifacial/infinite_sheds.py @@ -7,8 +7,8 @@ from pvlib.tools import cosd, sind, tand from pvlib.bifacial import utils from pvlib.shading import masking_angle -from pvlib.irradiance import beam_component, aoi - +from pvlib.irradiance import beam_component, aoi, aoi_projection, haydavies +from collections import OrderedDict def _vf_ground_sky_integ(surface_tilt, surface_azimuth, gcr, height, pitch, max_rows=10, npoints=100): @@ -401,7 +401,8 @@ def _shaded_fraction(solar_zenith, solar_azimuth, surface_tilt, def get_irradiance_poa(surface_tilt, surface_azimuth, solar_zenith, solar_azimuth, gcr, height, pitch, ghi, dhi, dni, - albedo, iam=1.0, npoints=100): + albedo, dni_extra=None, model='isotropic', iam=1.0, + npoints=100): r""" Calculate plane-of-array (POA) irradiance on one side of a row of modules. @@ -457,6 +458,12 @@ def get_irradiance_poa(surface_tilt, surface_azimuth, solar_zenith, albedo : numeric Surface albedo. [unitless] + dni_extra : numeric + Extraterrestrial direct normal irradiance. [W/m2] + + model : str + Irradiance model - can be one of 'isotropic' or 'haydavies'. + iam : numeric, default 1.0 Incidence angle modifier, the fraction of direct irradiance incident on the surface that is not reflected away. [unitless] @@ -495,6 +502,16 @@ def get_irradiance_poa(surface_tilt, surface_azimuth, solar_zenith, -------- get_irradiance """ + if model=='haydavies': + if dni_extra is None: + raise ValueError(f'must supply dni_extra for {model} model') + # call haydavies function and request components to help adjust dni/dhi + sky_diffuse_components = haydavies(0, 180, dhi, dni, dni_extra, + projection_ratio=1, + return_components=True) + dhi = dhi - sky_diffuse_components['circumsolar'] + dni = (ghi - dhi) / cosd(solar_zenith) + # Calculate some geometric quantities # rows to consider in front and behind current row # ensures that view factors to the sky are computed to within 5 degrees @@ -580,8 +597,8 @@ def get_irradiance_poa(surface_tilt, surface_azimuth, solar_zenith, def get_irradiance(surface_tilt, surface_azimuth, solar_zenith, solar_azimuth, gcr, height, pitch, ghi, dhi, dni, - albedo, iam_front=1.0, iam_back=1.0, - bifaciality=0.8, shade_factor=-0.02, + albedo, dni_extra=None, model='isotropic', iam_front=1.0, + iam_back=1.0, bifaciality=0.8, shade_factor=-0.02, transmission_factor=0, npoints=100): """ Get front and rear irradiance using the infinite sheds model. @@ -642,6 +659,12 @@ def get_irradiance(surface_tilt, surface_azimuth, solar_zenith, solar_azimuth, albedo : numeric Surface albedo. [unitless] + + dni_extra : numeric + Extraterrestrial direct normal irradiance. [W/m2] + + model : str + Irradiance model - can be one of 'isotropic' or 'haydavies'. iam_front : numeric, default 1.0 Incidence angle modifier, the fraction of direct irradiance incident @@ -720,13 +743,15 @@ def get_irradiance(surface_tilt, surface_azimuth, solar_zenith, solar_azimuth, surface_tilt=surface_tilt, surface_azimuth=surface_azimuth, solar_zenith=solar_zenith, solar_azimuth=solar_azimuth, gcr=gcr, height=height, pitch=pitch, ghi=ghi, dhi=dhi, dni=dni, - albedo=albedo, iam=iam_front, npoints=npoints) + albedo=albedo, dni_extra=dni_extra, model=model,iam=iam_front, + npoints=npoints) # back side POA irradiance irrad_back = get_irradiance_poa( surface_tilt=backside_tilt, surface_azimuth=backside_sysaz, solar_zenith=solar_zenith, solar_azimuth=solar_azimuth, gcr=gcr, height=height, pitch=pitch, ghi=ghi, dhi=dhi, dni=dni, - albedo=albedo, iam=iam_back, npoints=npoints) + albedo=albedo, dni_extra=dni_extra, model=model, iam=iam_back, + npoints=npoints) colmap_front = { 'poa_global': 'poa_front', From 2c87a38135f85068a9c89052b14189b4a8cb3cd8 Mon Sep 17 00:00:00 2001 From: Saurabh Aneja <63314623+spaneja@users.noreply.github.com> Date: Wed, 15 Feb 2023 16:24:15 -0500 Subject: [PATCH 02/11] update use solar_zenith and solar_azimuth, instead of projection_ratio, in the haydavies() call. --- pvlib/bifacial/infinite_sheds.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pvlib/bifacial/infinite_sheds.py b/pvlib/bifacial/infinite_sheds.py index c68005f9df..746c59bab3 100644 --- a/pvlib/bifacial/infinite_sheds.py +++ b/pvlib/bifacial/infinite_sheds.py @@ -507,7 +507,7 @@ def get_irradiance_poa(surface_tilt, surface_azimuth, solar_zenith, raise ValueError(f'must supply dni_extra for {model} model') # call haydavies function and request components to help adjust dni/dhi sky_diffuse_components = haydavies(0, 180, dhi, dni, dni_extra, - projection_ratio=1, + solar_zenith, solar_azimuth, return_components=True) dhi = dhi - sky_diffuse_components['circumsolar'] dni = (ghi - dhi) / cosd(solar_zenith) From 595788df9267515a64acd1624276b7fbccbc6e8b Mon Sep 17 00:00:00 2001 From: Saurabh Aneja <63314623+spaneja@users.noreply.github.com> Date: Wed, 15 Feb 2023 18:30:22 -0500 Subject: [PATCH 03/11] update removed unused functions from imports --- pvlib/bifacial/infinite_sheds.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pvlib/bifacial/infinite_sheds.py b/pvlib/bifacial/infinite_sheds.py index 746c59bab3..3e1f6ff1cc 100644 --- a/pvlib/bifacial/infinite_sheds.py +++ b/pvlib/bifacial/infinite_sheds.py @@ -7,8 +7,7 @@ from pvlib.tools import cosd, sind, tand from pvlib.bifacial import utils from pvlib.shading import masking_angle -from pvlib.irradiance import beam_component, aoi, aoi_projection, haydavies -from collections import OrderedDict +from pvlib.irradiance import beam_component, aoi, haydavies def _vf_ground_sky_integ(surface_tilt, surface_azimuth, gcr, height, pitch, max_rows=10, npoints=100): From cdad691dfeabed8f8bf898c3c9bfd9e2cd8f3dfa Mon Sep 17 00:00:00 2001 From: Saurabh Aneja <63314623+spaneja@users.noreply.github.com> Date: Mon, 20 Feb 2023 15:55:47 -0500 Subject: [PATCH 04/11] adding test and updating reference Added test and updating documentation. --- docs/sphinx/source/whatsnew/v0.9.5.rst | 7 +++++ pvlib/tests/bifacial/test_infinite_sheds.py | 33 ++++++++++++++++++++- 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/docs/sphinx/source/whatsnew/v0.9.5.rst b/docs/sphinx/source/whatsnew/v0.9.5.rst index 6c50f32642..5df06ba315 100644 --- a/docs/sphinx/source/whatsnew/v0.9.5.rst +++ b/docs/sphinx/source/whatsnew/v0.9.5.rst @@ -19,6 +19,11 @@ Enhancements * Added the optional `string_factor` parameter to :py:func:`pvlib.snow.loss_townsend` (:issue:`1636`, :pull:`1653`) +* Added `haydavies` sky-diffuse transposition model to + :py:func:`pvlib.bifacial.infinite_sheds.get_irradiance` and + :py:func:`pvlib.bifacial.infinite_sheds.get_irradiance_poa` + (:pull:`1668`) + Bug fixes ~~~~~~~~~ * Added a limit to :py:func:`pvlib.snow.loss_townsend` to guard against @@ -69,3 +74,5 @@ Contributors * Anton Driesse (:ghuser:`adriesse`) * Adam R. Jensen (:ghuser:`AdamRJensen`) * Michael Deceglie (:ghuser:`mdeceglie`) +* Saurabh Aneja (:ghuser:`spaneja`) +* John Moseley (:ghuser:`johnMoseleyArray`) diff --git a/pvlib/tests/bifacial/test_infinite_sheds.py b/pvlib/tests/bifacial/test_infinite_sheds.py index 696d10568c..34b45fb839 100644 --- a/pvlib/tests/bifacial/test_infinite_sheds.py +++ b/pvlib/tests/bifacial/test_infinite_sheds.py @@ -352,4 +352,35 @@ def test_get_irradiance_limiting_gcr(): assert np.isclose(result['poa_front_sky_diffuse'], result['poa_back_sky_diffuse']) assert np.isclose(result['poa_front_ground_diffuse'], - result['poa_back_ground_diffuse']) + result['poa_back_ground_diffuse']) + +def test_get_irradiance_with_haydavies(): + # singleton inputs + solar_zenith = 0. + solar_azimuth = 180. + surface_tilt = 0. + surface_azimuth = 180. + gcr = 0.5 + height = 1. + pitch = 1. + ghi = 1000. + dhi = 300. + dni = 700. + albedo = 0. + dni_extra = 1413. + model = 'haydavies' + iam_front = 1.0 + iam_back = 1.0 + npoints = 100 + result = infinite_sheds.get_irradiance( + surface_tilt, surface_azimuth, solar_zenith, solar_azimuth, + gcr, height, pitch, ghi, dhi, dni, albedo, dni_extra, model, + iam_front, iam_back, bifaciality=0.8, shade_factor=-0.02, + transmission_factor=0, npoints=npoints) + expected_front_diffuse = np.array([151.38]) + expected_front_direct = np.array([848.62]) + expected_front_global = expected_front_diffuse + expected_front_direct + assert np.isclose(result['poa_front'], expected_front_global) + assert np.isclose(result['poa_front_diffuse'], expected_front_diffuse) + assert np.isclose(result['poa_front_direct'], expected_front_direct) + assert np.isclose(result['poa_global'], result['poa_front']) \ No newline at end of file From dd9bcc428bd70397087a9a420ac037e9912cd9a8 Mon Sep 17 00:00:00 2001 From: Saurabh Aneja <63314623+spaneja@users.noreply.github.com> Date: Mon, 20 Feb 2023 16:46:56 -0500 Subject: [PATCH 05/11] updates Corrected white-space errors and added test for when haydavies is selected, but dni_extra is not supplied. --- pvlib/bifacial/infinite_sheds.py | 8 ++++---- pvlib/tests/bifacial/test_infinite_sheds.py | 14 +++++++++++--- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/pvlib/bifacial/infinite_sheds.py b/pvlib/bifacial/infinite_sheds.py index 3e1f6ff1cc..fbd8ded1b3 100644 --- a/pvlib/bifacial/infinite_sheds.py +++ b/pvlib/bifacial/infinite_sheds.py @@ -501,7 +501,7 @@ def get_irradiance_poa(surface_tilt, surface_azimuth, solar_zenith, -------- get_irradiance """ - if model=='haydavies': + if model == 'haydavies': if dni_extra is None: raise ValueError(f'must supply dni_extra for {model} model') # call haydavies function and request components to help adjust dni/dhi @@ -658,10 +658,10 @@ def get_irradiance(surface_tilt, surface_azimuth, solar_zenith, solar_azimuth, albedo : numeric Surface albedo. [unitless] - + dni_extra : numeric Extraterrestrial direct normal irradiance. [W/m2] - + model : str Irradiance model - can be one of 'isotropic' or 'haydavies'. @@ -742,7 +742,7 @@ def get_irradiance(surface_tilt, surface_azimuth, solar_zenith, solar_azimuth, surface_tilt=surface_tilt, surface_azimuth=surface_azimuth, solar_zenith=solar_zenith, solar_azimuth=solar_azimuth, gcr=gcr, height=height, pitch=pitch, ghi=ghi, dhi=dhi, dni=dni, - albedo=albedo, dni_extra=dni_extra, model=model,iam=iam_front, + albedo=albedo, dni_extra=dni_extra, model=model, iam=iam_front, npoints=npoints) # back side POA irradiance irrad_back = get_irradiance_poa( diff --git a/pvlib/tests/bifacial/test_infinite_sheds.py b/pvlib/tests/bifacial/test_infinite_sheds.py index 34b45fb839..650ac8d50a 100644 --- a/pvlib/tests/bifacial/test_infinite_sheds.py +++ b/pvlib/tests/bifacial/test_infinite_sheds.py @@ -352,7 +352,8 @@ def test_get_irradiance_limiting_gcr(): assert np.isclose(result['poa_front_sky_diffuse'], result['poa_back_sky_diffuse']) assert np.isclose(result['poa_front_ground_diffuse'], - result['poa_back_ground_diffuse']) + result['poa_back_ground_diffuse']) + def test_get_irradiance_with_haydavies(): # singleton inputs @@ -374,7 +375,7 @@ def test_get_irradiance_with_haydavies(): npoints = 100 result = infinite_sheds.get_irradiance( surface_tilt, surface_azimuth, solar_zenith, solar_azimuth, - gcr, height, pitch, ghi, dhi, dni, albedo, dni_extra, model, + gcr, height, pitch, ghi, dhi, dni, albedo, dni_extra, model, iam_front, iam_back, bifaciality=0.8, shade_factor=-0.02, transmission_factor=0, npoints=npoints) expected_front_diffuse = np.array([151.38]) @@ -383,4 +384,11 @@ def test_get_irradiance_with_haydavies(): assert np.isclose(result['poa_front'], expected_front_global) assert np.isclose(result['poa_front_diffuse'], expected_front_diffuse) assert np.isclose(result['poa_front_direct'], expected_front_direct) - assert np.isclose(result['poa_global'], result['poa_front']) \ No newline at end of file + assert np.isclose(result['poa_global'], result['poa_front']) + # test for when dni_extra is not supplied + with pytest.raises(ValueError): + result = infinite_sheds.get_irradiance( + surface_tilt, surface_azimuth, solar_zenith, solar_azimuth, + gcr, height, pitch, ghi, dhi, dni, albedo, None, model, + iam_front, iam_back, bifaciality=0.8, shade_factor=-0.02, + transmission_factor=0, npoints=npoints) From 2484931b606c40986750f0546f5e959c00f4e10d Mon Sep 17 00:00:00 2001 From: Saurabh Aneja <63314623+spaneja@users.noreply.github.com> Date: Tue, 21 Feb 2023 14:32:25 -0500 Subject: [PATCH 06/11] updates Updated docstrings and implemented a second call to haydavies to avoid 1/cos(zenith) issues with DNI where zenith nears 90 deg. --- pvlib/bifacial/infinite_sheds.py | 37 ++++++++++++++------- pvlib/tests/bifacial/test_infinite_sheds.py | 2 +- 2 files changed, 26 insertions(+), 13 deletions(-) diff --git a/pvlib/bifacial/infinite_sheds.py b/pvlib/bifacial/infinite_sheds.py index fbd8ded1b3..267a2f6746 100644 --- a/pvlib/bifacial/infinite_sheds.py +++ b/pvlib/bifacial/infinite_sheds.py @@ -457,10 +457,11 @@ def get_irradiance_poa(surface_tilt, surface_azimuth, solar_zenith, albedo : numeric Surface albedo. [unitless] - dni_extra : numeric - Extraterrestrial direct normal irradiance. [W/m2] + dni_extra : numeric, optional + Extraterrestrial direct normal irradiance. Required when + ``model='haydavies'``. [W/m2] - model : str + model : str, default 'isotropic' Irradiance model - can be one of 'isotropic' or 'haydavies'. iam : numeric, default 1.0 @@ -504,12 +505,23 @@ def get_irradiance_poa(surface_tilt, surface_azimuth, solar_zenith, if model == 'haydavies': if dni_extra is None: raise ValueError(f'must supply dni_extra for {model} model') - # call haydavies function and request components to help adjust dni/dhi - sky_diffuse_components = haydavies(0, 180, dhi, dni, dni_extra, - solar_zenith, solar_azimuth, - return_components=True) - dhi = dhi - sky_diffuse_components['circumsolar'] - dni = (ghi - dhi) / cosd(solar_zenith) + # Call haydavies first time within the horizontal plane - to subtract + # circumsolar_horizontal from DHI + sky_diffuse_comps_horizontal = haydavies(0, 180, dhi, dni, dni_extra, + solar_zenith, solar_azimuth, + return_components=True) + circumsolar_horizontal = sky_diffuse_comps_horizontal['circumsolar'] + + # Call haydavies a second time where circumsolar_normal is facing + # directly towards sun, and can be added to DNI + sky_diffuse_comps_normal = haydavies(solar_zenith, solar_azimuth, dhi, + dni, dni_extra, solar_zenith, + solar_azimuth, + return_components=True) + circumsolar_normal = sky_diffuse_comps_normal['circumsolar'] + + dhi = dhi - circumsolar_horizontal + dni = dni + circumsolar_normal # Calculate some geometric quantities # rows to consider in front and behind current row @@ -659,10 +671,11 @@ def get_irradiance(surface_tilt, surface_azimuth, solar_zenith, solar_azimuth, albedo : numeric Surface albedo. [unitless] - dni_extra : numeric - Extraterrestrial direct normal irradiance. [W/m2] + dni_extra : numeric, optional + Extraterrestrial direct normal irradiance. Required when + ``model='haydavies'``. [W/m2] - model : str + model : str, default 'isotropic' Irradiance model - can be one of 'isotropic' or 'haydavies'. iam_front : numeric, default 1.0 diff --git a/pvlib/tests/bifacial/test_infinite_sheds.py b/pvlib/tests/bifacial/test_infinite_sheds.py index 650ac8d50a..1ce61b8866 100644 --- a/pvlib/tests/bifacial/test_infinite_sheds.py +++ b/pvlib/tests/bifacial/test_infinite_sheds.py @@ -386,7 +386,7 @@ def test_get_irradiance_with_haydavies(): assert np.isclose(result['poa_front_direct'], expected_front_direct) assert np.isclose(result['poa_global'], result['poa_front']) # test for when dni_extra is not supplied - with pytest.raises(ValueError): + with pytest.raises(ValueError, match='supply dni_extra for haydavies'): result = infinite_sheds.get_irradiance( surface_tilt, surface_azimuth, solar_zenith, solar_azimuth, gcr, height, pitch, ghi, dhi, dni, albedo, None, model, From 8891c31719d61c53ea8b2e5d25db5e73fc1262ae Mon Sep 17 00:00:00 2001 From: Saurabh Aneja <63314623+spaneja@users.noreply.github.com> Date: Mon, 27 Feb 2023 09:28:13 -0500 Subject: [PATCH 07/11] Update reorganize order of function inputs. --- pvlib/bifacial/infinite_sheds.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/pvlib/bifacial/infinite_sheds.py b/pvlib/bifacial/infinite_sheds.py index 267a2f6746..91b33551bc 100644 --- a/pvlib/bifacial/infinite_sheds.py +++ b/pvlib/bifacial/infinite_sheds.py @@ -400,7 +400,7 @@ def _shaded_fraction(solar_zenith, solar_azimuth, surface_tilt, def get_irradiance_poa(surface_tilt, surface_azimuth, solar_zenith, solar_azimuth, gcr, height, pitch, ghi, dhi, dni, - albedo, dni_extra=None, model='isotropic', iam=1.0, + albedo, model='isotropic', dni_extra=None, iam=1.0, npoints=100): r""" Calculate plane-of-array (POA) irradiance on one side of a row of modules. @@ -457,13 +457,13 @@ def get_irradiance_poa(surface_tilt, surface_azimuth, solar_zenith, albedo : numeric Surface albedo. [unitless] + model : str, default 'isotropic' + Irradiance model - can be one of 'isotropic' or 'haydavies'. + dni_extra : numeric, optional Extraterrestrial direct normal irradiance. Required when ``model='haydavies'``. [W/m2] - model : str, default 'isotropic' - Irradiance model - can be one of 'isotropic' or 'haydavies'. - iam : numeric, default 1.0 Incidence angle modifier, the fraction of direct irradiance incident on the surface that is not reflected away. [unitless] @@ -608,7 +608,7 @@ def get_irradiance_poa(surface_tilt, surface_azimuth, solar_zenith, def get_irradiance(surface_tilt, surface_azimuth, solar_zenith, solar_azimuth, gcr, height, pitch, ghi, dhi, dni, - albedo, dni_extra=None, model='isotropic', iam_front=1.0, + albedo, model='isotropic', dni_extra=None, iam_front=1.0, iam_back=1.0, bifaciality=0.8, shade_factor=-0.02, transmission_factor=0, npoints=100): """ @@ -671,13 +671,13 @@ def get_irradiance(surface_tilt, surface_azimuth, solar_zenith, solar_azimuth, albedo : numeric Surface albedo. [unitless] + model : str, default 'isotropic' + Irradiance model - can be one of 'isotropic' or 'haydavies'. + dni_extra : numeric, optional Extraterrestrial direct normal irradiance. Required when ``model='haydavies'``. [W/m2] - model : str, default 'isotropic' - Irradiance model - can be one of 'isotropic' or 'haydavies'. - iam_front : numeric, default 1.0 Incidence angle modifier, the fraction of direct irradiance incident on the front surface that is not reflected away. [unitless] @@ -755,14 +755,14 @@ def get_irradiance(surface_tilt, surface_azimuth, solar_zenith, solar_azimuth, surface_tilt=surface_tilt, surface_azimuth=surface_azimuth, solar_zenith=solar_zenith, solar_azimuth=solar_azimuth, gcr=gcr, height=height, pitch=pitch, ghi=ghi, dhi=dhi, dni=dni, - albedo=albedo, dni_extra=dni_extra, model=model, iam=iam_front, + albedo=albedo, model=model, dni_extra=dni_extra, iam=iam_front, npoints=npoints) # back side POA irradiance irrad_back = get_irradiance_poa( surface_tilt=backside_tilt, surface_azimuth=backside_sysaz, solar_zenith=solar_zenith, solar_azimuth=solar_azimuth, gcr=gcr, height=height, pitch=pitch, ghi=ghi, dhi=dhi, dni=dni, - albedo=albedo, dni_extra=dni_extra, model=model, iam=iam_back, + albedo=albedo, model=model, dni_extra=dni_extra, iam=iam_back, npoints=npoints) colmap_front = { From d5183620ba0ecf935e4e5fe9c2fbe1140bd2ddd0 Mon Sep 17 00:00:00 2001 From: Saurabh Aneja <63314623+spaneja@users.noreply.github.com> Date: Mon, 27 Feb 2023 09:38:19 -0500 Subject: [PATCH 08/11] Update Updated tests give have correct ordering of inputs. --- pvlib/tests/bifacial/test_infinite_sheds.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pvlib/tests/bifacial/test_infinite_sheds.py b/pvlib/tests/bifacial/test_infinite_sheds.py index 1ce61b8866..97ebf0fa95 100644 --- a/pvlib/tests/bifacial/test_infinite_sheds.py +++ b/pvlib/tests/bifacial/test_infinite_sheds.py @@ -375,7 +375,7 @@ def test_get_irradiance_with_haydavies(): npoints = 100 result = infinite_sheds.get_irradiance( surface_tilt, surface_azimuth, solar_zenith, solar_azimuth, - gcr, height, pitch, ghi, dhi, dni, albedo, dni_extra, model, + gcr, height, pitch, ghi, dhi, dni, albedo, model, dni_extra, iam_front, iam_back, bifaciality=0.8, shade_factor=-0.02, transmission_factor=0, npoints=npoints) expected_front_diffuse = np.array([151.38]) @@ -389,6 +389,6 @@ def test_get_irradiance_with_haydavies(): with pytest.raises(ValueError, match='supply dni_extra for haydavies'): result = infinite_sheds.get_irradiance( surface_tilt, surface_azimuth, solar_zenith, solar_azimuth, - gcr, height, pitch, ghi, dhi, dni, albedo, None, model, + gcr, height, pitch, ghi, dhi, dni, albedo,model, None, iam_front, iam_back, bifaciality=0.8, shade_factor=-0.02, transmission_factor=0, npoints=npoints) From d829ad74b4f2fd3b988505aa9666689b119b208c Mon Sep 17 00:00:00 2001 From: Saurabh Aneja <63314623+spaneja@users.noreply.github.com> Date: Mon, 27 Feb 2023 09:41:55 -0500 Subject: [PATCH 09/11] update Whitespace errors - these will be the end of me! --- pvlib/tests/bifacial/test_infinite_sheds.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pvlib/tests/bifacial/test_infinite_sheds.py b/pvlib/tests/bifacial/test_infinite_sheds.py index 97ebf0fa95..404b0914c1 100644 --- a/pvlib/tests/bifacial/test_infinite_sheds.py +++ b/pvlib/tests/bifacial/test_infinite_sheds.py @@ -389,6 +389,6 @@ def test_get_irradiance_with_haydavies(): with pytest.raises(ValueError, match='supply dni_extra for haydavies'): result = infinite_sheds.get_irradiance( surface_tilt, surface_azimuth, solar_zenith, solar_azimuth, - gcr, height, pitch, ghi, dhi, dni, albedo,model, None, + gcr, height, pitch, ghi, dhi, dni, albedo, model, None, iam_front, iam_back, bifaciality=0.8, shade_factor=-0.02, transmission_factor=0, npoints=npoints) From 41b11899021e769f889abb79acc392c49faceeb8 Mon Sep 17 00:00:00 2001 From: Saurabh Aneja <63314623+spaneja@users.noreply.github.com> Date: Mon, 27 Feb 2023 14:44:36 -0500 Subject: [PATCH 10/11] Update Added detail to docstring in infinite_sheds.py and note on haydavies implementation in bifacial.rst (based on comments from PR). --- docs/sphinx/source/user_guide/bifacial.rst | 9 +++++++++ docs/sphinx/source/whatsnew/v0.9.5.rst | 5 +++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/docs/sphinx/source/user_guide/bifacial.rst b/docs/sphinx/source/user_guide/bifacial.rst index 7e3f229f15..c6184b3638 100644 --- a/docs/sphinx/source/user_guide/bifacial.rst +++ b/docs/sphinx/source/user_guide/bifacial.rst @@ -93,6 +93,15 @@ lower edge. This model is influenced by the 2D model published by Marion, *et al.* in [2]. +Notes +----- +If ``model='isotropic'`` (the default), ``dhi`` is assumed to be isotropically +distributed across the sky dome as in [1]_. This implementation provides an +optional extension to [1]_ to model sky anisotropy: if ``model='haydavies'``, +the input ``dhi`` is decomposed into circumsolar and isotropic components using +:py:func:`~pvlib.irradiance.haydavies`, with the circumsolar component treated +as additional ``dni`` for transposition and shading purposes. + References ---------- .. [1] Mikofski, M., Darawali, R., Hamer, M., Neubert, A., and Newmiller, diff --git a/docs/sphinx/source/whatsnew/v0.9.5.rst b/docs/sphinx/source/whatsnew/v0.9.5.rst index 5df06ba315..6ae650d3c4 100644 --- a/docs/sphinx/source/whatsnew/v0.9.5.rst +++ b/docs/sphinx/source/whatsnew/v0.9.5.rst @@ -19,10 +19,11 @@ Enhancements * Added the optional `string_factor` parameter to :py:func:`pvlib.snow.loss_townsend` (:issue:`1636`, :pull:`1653`) -* Added `haydavies` sky-diffuse transposition model to +* Added an optional ``model`` parameter to :py:func:`pvlib.bifacial.infinite_sheds.get_irradiance` and :py:func:`pvlib.bifacial.infinite_sheds.get_irradiance_poa` - (:pull:`1668`) + to enable use of the hay-davies sky diffuse irradiance model + instead of the default isotropic model. (:pull:`1668`) Bug fixes ~~~~~~~~~ From defba31dedf3b719f336a914e5a4d3f670615b9c Mon Sep 17 00:00:00 2001 From: Saurabh Aneja <63314623+spaneja@users.noreply.github.com> Date: Tue, 28 Feb 2023 08:24:01 -0500 Subject: [PATCH 11/11] Update bifacial.rst Updated bifacial.rst file for formatting and ordering. Had added note detailing to user what occurs when 'haydavies' model is selected. --- docs/sphinx/source/user_guide/bifacial.rst | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/docs/sphinx/source/user_guide/bifacial.rst b/docs/sphinx/source/user_guide/bifacial.rst index c6184b3638..695f8b6d89 100644 --- a/docs/sphinx/source/user_guide/bifacial.rst +++ b/docs/sphinx/source/user_guide/bifacial.rst @@ -91,10 +91,6 @@ considered to be towards the "front" of the array. Array height differs in this code from the description in [1], where array height is described at the row's lower edge. -This model is influenced by the 2D model published by Marion, *et al.* in [2]. - -Notes ------ If ``model='isotropic'`` (the default), ``dhi`` is assumed to be isotropically distributed across the sky dome as in [1]_. This implementation provides an optional extension to [1]_ to model sky anisotropy: if ``model='haydavies'``, @@ -102,6 +98,9 @@ the input ``dhi`` is decomposed into circumsolar and isotropic components using :py:func:`~pvlib.irradiance.haydavies`, with the circumsolar component treated as additional ``dni`` for transposition and shading purposes. +This model is influenced by the 2D model published by Marion, *et al.* in [2]. + + References ---------- .. [1] Mikofski, M., Darawali, R., Hamer, M., Neubert, A., and Newmiller,