From f6846231e1768d41ebfcb244bbe8f18418e02225 Mon Sep 17 00:00:00 2001 From: Mark Mikofski Date: Wed, 15 Feb 2023 01:41:09 -0800 Subject: [PATCH 01/20] correct view factor from row to sky and ground --- pvlib/bifacial/infinite_sheds.py | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/pvlib/bifacial/infinite_sheds.py b/pvlib/bifacial/infinite_sheds.py index 47cf7c2d4d..f94386d85e 100644 --- a/pvlib/bifacial/infinite_sheds.py +++ b/pvlib/bifacial/infinite_sheds.py @@ -127,8 +127,7 @@ def _vf_row_sky_integ(f_x, surface_tilt, gcr, npoints=100): given by .. math :: - \\large{f_{sky} = \frac{1}{2} \\left(\\cos\\left(\\psi_t\\right) + - \\cos \\left(\\beta\\right) \\right) + \\large{f_{sky} = \frac{1 + \\cos\\left(\\psi_t + \\beta\\right)}{2} where :math:`\\psi_t` is the angle from horizontal of the line from point x to the top of the facing row, and :math:`\\beta` is the surface tilt. @@ -139,18 +138,17 @@ def _vf_row_sky_integ(f_x, surface_tilt, gcr, npoints=100): """ # handle Series inputs surface_tilt = np.array(surface_tilt) - cst = cosd(surface_tilt) # shaded portion x = np.linspace(0, f_x, num=npoints) psi_t_shaded = masking_angle(surface_tilt, gcr, x) - y = 0.5 * (cosd(psi_t_shaded) + cst) + y = 0.5 * (cosd(psi_t_shaded + surface_tilt) + 1) # integrate view factors from each point in the discretization. This is an # improvement over the algorithm described in [2] vf_shade_sky_integ = np.trapz(y, x, axis=0) # unshaded portion x = np.linspace(f_x, 1., num=npoints) psi_t_unshaded = masking_angle(surface_tilt, gcr, x) - y = 0.5 * (cosd(psi_t_unshaded) + cst) + y = 0.5 * (cosd(psi_t_unshaded + surface_tilt) + 1) vf_noshade_sky_integ = np.trapz(y, x, axis=0) return vf_shade_sky_integ, vf_noshade_sky_integ @@ -243,12 +241,11 @@ def _vf_row_ground(x, surface_tilt, gcr): View factor from the point at x to the ground. [unitless] """ - cst = cosd(surface_tilt) # angle from horizontal at the point x on the row slant height to the # bottom of the facing row psi_t_shaded = _ground_angle(x, surface_tilt, gcr) # view factor from the point on the row to the ground - return 0.5 * (cosd(psi_t_shaded) - cst) + return 0.5 * (1 - cosd(psi_t_shaded - surface_tilt)) def _vf_row_ground_integ(f_x, surface_tilt, gcr, npoints=100): From ef346dd6f354faa3b204c30f35daddf11b10c4fc Mon Sep 17 00:00:00 2001 From: Mark Mikofski Date: Wed, 15 Feb 2023 01:51:19 -0800 Subject: [PATCH 02/20] update latex math in vf_row_gnd --- 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 f94386d85e..999d863f67 100644 --- a/pvlib/bifacial/infinite_sheds.py +++ b/pvlib/bifacial/infinite_sheds.py @@ -280,8 +280,7 @@ def _vf_row_ground_integ(f_x, surface_tilt, gcr, npoints=100): given by .. math :: - \\large{f_{gr} = \frac{1}{2} \\left(\\cos\\left(\\psi_t\\right) - - \\cos \\left(\\beta\\right) \\right) + \\large{f_{gr} = \frac{1 - \\cos\\left(\\beta - \\psi_t\\right)}{2} where :math:`\\psi_t` is the angle from horizontal of the line from point x to the bottom of the facing row, and :math:`\\beta` is the surface tilt. From 510e8ad6a3eda65cabeb710a3b6a6a95e1f70fcd Mon Sep 17 00:00:00 2001 From: Hansen Date: Wed, 22 Mar 2023 15:43:23 -0600 Subject: [PATCH 03/20] revise vf_row_sky and test --- pvlib/bifacial/infinite_sheds.py | 10 ++++-- pvlib/tests/bifacial/test_infinite_sheds.py | 38 +++++++++++++-------- 2 files changed, 31 insertions(+), 17 deletions(-) diff --git a/pvlib/bifacial/infinite_sheds.py b/pvlib/bifacial/infinite_sheds.py index 999d863f67..28ab67f5cb 100644 --- a/pvlib/bifacial/infinite_sheds.py +++ b/pvlib/bifacial/infinite_sheds.py @@ -144,12 +144,18 @@ def _vf_row_sky_integ(f_x, surface_tilt, gcr, npoints=100): y = 0.5 * (cosd(psi_t_shaded + surface_tilt) + 1) # integrate view factors from each point in the discretization. This is an # improvement over the algorithm described in [2] - vf_shade_sky_integ = np.trapz(y, x, axis=0) + vf_shade_sky_integ = np.where( + f_x<1e-6, + 0.5 * (cosd(masking_angle(surface_tilt, gcr, 0.) + surface_tilt) + 1), + 1 / f_x * np.trapz(y, x, axis=0)) # unshaded portion x = np.linspace(f_x, 1., num=npoints) psi_t_unshaded = masking_angle(surface_tilt, gcr, x) y = 0.5 * (cosd(psi_t_unshaded + surface_tilt) + 1) - vf_noshade_sky_integ = np.trapz(y, x, axis=0) + vf_noshade_sky_integ = np.where( + (1 - f_x)<1e-6, + 0.5 * (cosd(surface_tilt) + 1), + 1 / (1 - f_x) * np.trapz(y, x, axis=0)) return vf_shade_sky_integ, vf_noshade_sky_integ diff --git a/pvlib/tests/bifacial/test_infinite_sheds.py b/pvlib/tests/bifacial/test_infinite_sheds.py index 696d10568c..db994b05e4 100644 --- a/pvlib/tests/bifacial/test_infinite_sheds.py +++ b/pvlib/tests/bifacial/test_infinite_sheds.py @@ -62,28 +62,36 @@ def test__vf_row_sky_integ(test_system): f_x = np.array([0., 0.5, 1.]) shaded = [] noshade = [] + + def analytic(fx0, fx1, gcr, surface_tilt): + ''' + Average of view factor (by integration) between fx0 < fx1 + ''' + def p(x, a, c): + return np.sqrt(a*a - 2*a*c*(1-x) +(1-x)*(1-x)) + eps = 1e-6 + a = 1 / gcr + c = cosd(surface_tilt) + u = fx1 - fx0 + with np.errstate(divide='ignore'): + result = np.where(np.abs(u) Date: Thu, 23 Mar 2023 09:43:57 -0600 Subject: [PATCH 04/20] remake tests for vf_row_ground --- pvlib/tests/bifacial/test_infinite_sheds.py | 33 +++++++++++---------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/pvlib/tests/bifacial/test_infinite_sheds.py b/pvlib/tests/bifacial/test_infinite_sheds.py index db994b05e4..14106ec90c 100644 --- a/pvlib/tests/bifacial/test_infinite_sheds.py +++ b/pvlib/tests/bifacial/test_infinite_sheds.py @@ -125,13 +125,17 @@ def test__ground_angle_zero_gcr(): def test__vf_row_ground(test_system): ts, _, _ = test_system x = np.array([0., 0.5, 1.0]) - sqr3 = np.sqrt(3) vfs = infinite_sheds._vf_row_ground( x, ts['surface_tilt'], ts['gcr']) - expected_vfs = np.array([ - 0.5 * (1. - sqr3 / 2), - 0.5 * ((4 + sqr3 / 2) / np.sqrt(17 + 4 * sqr3) - sqr3 / 2), - 0.5 * ((4 + sqr3) / np.sqrt(20 + 8 * sqr3) - sqr3 / 2)]) + + def analytic(fx, gcr, surface_tilt): + a = 1/gcr + c = cosd(surface_tilt) + def p(fx, a, c): + return np.sqrt(a*a + 2*a*c*fx + fx*fx) + return 0.5*(1 - (a*c - fx)/p(fx, a, c)) + + expected_vfs = analytic(x, ts['gcr'], ts['surface_tilt']) assert np.allclose(vfs, expected_vfs) @@ -143,18 +147,15 @@ def test__vf_row_ground_integ(test_system): shaded, noshade = infinite_sheds._vf_row_ground_integ( f_x, surface_tilt, gcr) - def analytic(x, surface_tilt, gcr): + def analytic(fx0, fx1, gcr, surface_tilt): + a = 1/gcr c = cosd(surface_tilt) - a = 1. / gcr - dx = np.sqrt(a**2 + 2 * a * c * x + x**2) - return c * dx - a * (c**2 - 1) * np.arctanh((a * c + x) / dx) - - expected_shade = 0.5 * (analytic(f_x, surface_tilt, gcr) - - analytic(0., surface_tilt, gcr) - - f_x * cosd(surface_tilt)) - expected_noshade = 0.5 * (analytic(1., surface_tilt, gcr) - - analytic(f_x, surface_tilt, gcr) - - (1. - f_x) * cosd(surface_tilt)) + def p(fx, a, c): + return np.sqrt(a*a + 2*a*c*fx + fx*fx) + return 0.5*(1 - p(fx1, a, c) + p(fx0, a, c)) + + expected_shade = analytic(0, f_x, gcr, surface_tilt) + expected_noshade = analytic(f_x, 1., gcr, surface_tilt) assert np.allclose(shaded, expected_shade) assert np.allclose(noshade, expected_noshade) From 784a977553c1c329444be689943e8feaeed4447c Mon Sep 17 00:00:00 2001 From: Cliff Hansen Date: Thu, 23 Mar 2023 10:06:49 -0600 Subject: [PATCH 05/20] fix my mistakes --- pvlib/tests/bifacial/test_infinite_sheds.py | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/pvlib/tests/bifacial/test_infinite_sheds.py b/pvlib/tests/bifacial/test_infinite_sheds.py index 14106ec90c..292652069e 100644 --- a/pvlib/tests/bifacial/test_infinite_sheds.py +++ b/pvlib/tests/bifacial/test_infinite_sheds.py @@ -133,7 +133,7 @@ def analytic(fx, gcr, surface_tilt): c = cosd(surface_tilt) def p(fx, a, c): return np.sqrt(a*a + 2*a*c*fx + fx*fx) - return 0.5*(1 - (a*c - fx)/p(fx, a, c)) + return 0.5*(1 - (a*c + fx)/p(fx, a, c)) expected_vfs = analytic(x, ts['gcr'], ts['surface_tilt']) assert np.allclose(vfs, expected_vfs) @@ -148,11 +148,18 @@ def test__vf_row_ground_integ(test_system): f_x, surface_tilt, gcr) def analytic(fx0, fx1, gcr, surface_tilt): - a = 1/gcr - c = cosd(surface_tilt) def p(fx, a, c): return np.sqrt(a*a + 2*a*c*fx + fx*fx) - return 0.5*(1 - p(fx1, a, c) + p(fx0, a, c)) + eps = 1e-6 + a = 1 / gcr + c = cosd(surface_tilt) + u = fx1 - fx0 + with np.errstate(divide='ignore'): + result = np.where(np.abs(u) Date: Thu, 23 Mar 2023 10:14:42 -0600 Subject: [PATCH 06/20] fix row_ground_integ --- pvlib/bifacial/infinite_sheds.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/pvlib/bifacial/infinite_sheds.py b/pvlib/bifacial/infinite_sheds.py index 28ab67f5cb..b13eb0bf0c 100644 --- a/pvlib/bifacial/infinite_sheds.py +++ b/pvlib/bifacial/infinite_sheds.py @@ -302,7 +302,10 @@ def _vf_row_ground_integ(f_x, surface_tilt, gcr, npoints=100): y = _vf_row_ground(x, surface_tilt, gcr) # integrate view factors along the shaded portion of the row slant height. # This is an improvement over the algorithm described in [2] - vf_shade_ground_integ = np.trapz(y, x, axis=0) + vf_shade_ground_integ = np.where( + f_x<1e-6, + _vf_row_ground(f_x, surface_tilt, gcr), + 1 / f_x * np.trapz(y, x, axis=0)) # unshaded portion of row slant height x = np.linspace(f_x, 1., num=npoints) @@ -310,7 +313,10 @@ def _vf_row_ground_integ(f_x, surface_tilt, gcr, npoints=100): y = _vf_row_ground(x, surface_tilt, gcr) # integrate view factors along the unshaded portion. # This is an improvement over the algorithm described in [2] - vf_noshade_ground_integ = np.trapz(y, x, axis=0) + vf_noshade_ground_integ = np.where( + (1 - f_x)<1e-6, + _vf_row_ground(1., surface_tilt, gcr), + 1 / (1 - f_x) * np.trapz(y, x, axis=0)) return vf_shade_ground_integ, vf_noshade_ground_integ From 253bb89627d0bb6521c62a7138dafa7342a49e2c Mon Sep 17 00:00:00 2001 From: Cliff Hansen Date: Fri, 24 Mar 2023 09:36:22 -0600 Subject: [PATCH 07/20] new vf functions in utils --- pvlib/bifacial/utils.py | 167 +++++++++++++++++++++++++++++ pvlib/tests/bifacial/test_utils.py | 74 ++++++++++++- 2 files changed, 240 insertions(+), 1 deletion(-) diff --git a/pvlib/bifacial/utils.py b/pvlib/bifacial/utils.py index bac8923536..e67f40a1dc 100644 --- a/pvlib/bifacial/utils.py +++ b/pvlib/bifacial/utils.py @@ -147,3 +147,170 @@ def _vf_ground_sky_2d(x, rotation, gcr, pitch, height, max_rows=10): wedge_vfs = 0.5 * (cosd(phi[1, :, 1:]) - cosd(phi[0, :, :-1])) vf = np.sum(np.where(wedge_vfs > 0, wedge_vfs, 0.), axis=1) return vf, phi + + +def _vf_poly(x, gcr, surface_tilt, delta): + r''' + A term common to many 2D view factor calculations + + Parameters + ---------- + x : numeric + Position on the row's slant length, as a fraction of the slant length. + x=0 corresponds to the bottom of the row. [unitless] + gcr : numeric + Ratio of the row slant length to the row spacing (pitch). [unitless] + surface_tilt : numeric + Surface tilt angle in degrees from horizontal, e.g., surface facing up + = 0, surface facing horizon = 90. [degree] + delta : -1 or +1 + A sign indicator for the linear term of the polynomial + + Returns + ------- + numeric + ''' + a = 1 / gcr + c = cosd(surface_tilt) + return np.sqrt(a*a + 2*delta*a*c*x + x*x) + + +def vf_row_sky_2d(x, gcr, surface_tilt): + r''' + Calculate the view factor to the sky from a point x on a row surface. + + Assumes a PV system of infinitely long rows with uniform pitch on + horizontal ground. The view to the sky is restricted by the row's surface + tilt and the top of the adjacent row. + + Parameters + ---------- + x : numeric + Position on the row's slant length, as a fraction of the slant length. + x=0 corresponds to the bottom of the row. [unitless] + gcr : numeric + Ratio of the row slant length to the row spacing (pitch). [unitless] + surface_tilt : numeric + Surface tilt angle in degrees from horizontal, e.g., surface facing up + = 0, surface facing horizon = 90. [degree] + + Returns + ------- + vf : numeric + Fraction of the sky dome visible from the point x. [unitless] + + ''' + p = _vf_poly(1 - x, gcr, surface_tilt, -1) + return 0.5*(1 + (1/gcr * cosd(surface_tilt) - (1 - x)) / p) + + +def vf_row_sky_2d_integ(x0, x1, gcr, surface_tilt): + r''' + Calculate the average view factor to the sky from a segment of the row + surface between x0 and x1. + + Assumes a PV system of infinitely long rows with uniform pitch on + horizontal ground. The view to the sky is restricted by the row's surface + tilt and the top of the adjacent row. + + Parameters + ---------- + x0 : numeric + Position on the row's slant length, as a fraction of the slant length. + x0=0 corresponds to the bottom of the row. x0 should be less than x1. + [unitless] + x1 : numeric + Position on the row's slant length, as a fraction of the slant length. + x1 should be greater than x0. [unitless] + gcr : numeric + Ratio of the row slant length to the row spacing (pitch). [unitless] + surface_tilt : numeric + Surface tilt angle in degrees from horizontal, e.g., surface facing up + = 0, surface facing horizon = 90. [degree] + + Returns + ------- + vf : numeric + Average fraction of the sky dome visible from points in the segment + from x0 to x1. [unitless] + + ''' + u = np.abs(x1 - x0) + p0 = _vf_poly(1 - x0, gcr, surface_tilt, -1) + p1 = _vf_poly(1 - x1, gcr, surface_tilt, -1) + with np.errstate(divide='ignore'): + result = np.where(u<1e-6, + vf_row_sky_2d(x0, gcr, surface_tilt), + 0.5*(1 + 1/u * (p1 - p0)) + ) + return result + + +def vf_row_ground_2d(x, gcr, surface_tilt): + r''' + Calculate the view factor to the ground from a point x on a row surface. + + Assumes a PV system of infinitely long rows with uniform pitch on + horizontal ground. The view to the ground is restricted by the row's + tilt and the bottom of the facing row. + + Parameters + ---------- + x : numeric + Position on the row's slant length, as a fraction of the slant length. + x=0 corresponds to the bottom of the row. [unitless] + gcr : numeric + Ratio of the row slant length to the row spacing (pitch). [unitless] + surface_tilt : numeric + Surface tilt angle in degrees from horizontal, e.g., surface facing up + = 0, surface facing horizon = 90. [degree] + + Returns + ------- + vf : numeric + Fraction of the sky dome visible from the point x. [unitless] + + ''' + p = _vf_poly(x, gcr, surface_tilt, 1) + return 0.5 * (1 - (1/gcr * cosd(surface_tilt) + x)/p) + + +def vf_row_ground_2d_integ(x0, x1, gcr, surface_tilt): + r''' + Calculate the average view factor to the ground from a segment of the row + surface between x0 and x1. + + Assumes a PV system of infinitely long rows with uniform pitch on + horizontal ground. The view to the ground is restricted by the row's + tilt and the bottom of the facing row. + + Parameters + ---------- + x0 : numeric + Position on the row's slant length, as a fraction of the slant length. + x0=0 corresponds to the bottom of the row. x0 should be less than x1. + [unitless] + x1 : numeric + Position on the row's slant length, as a fraction of the slant length. + x1 should be greater than x0. [unitless] + gcr : numeric + Ratio of the row slant length to the row spacing (pitch). [unitless] + surface_tilt : numeric + Surface tilt angle in degrees from horizontal, e.g., surface facing up + = 0, surface facing horizon = 90. [degree] + + Returns + ------- + vf : numeric + Fraction of the sky dome visible from the point x. [unitless] + + ''' + u = np.abs(x1 - x0) + p0 = _vf_poly(x0, gcr, surface_tilt, 1) + p1 = _vf_poly(x1, gcr, surface_tilt, 1) + with np.errstate(divide='ignore'): + result = np.where(u<1e-6, + vf_row_ground_2d(x0, gcr, surface_tilt), + 0.5*(1 - 1/u * (p1 - p0)) + ) + return result diff --git a/pvlib/tests/bifacial/test_utils.py b/pvlib/tests/bifacial/test_utils.py index 388a222394..be7a15ba12 100644 --- a/pvlib/tests/bifacial/test_utils.py +++ b/pvlib/tests/bifacial/test_utils.py @@ -3,7 +3,9 @@ """ import numpy as np import pytest -from pvlib.bifacial import utils +from pvlib.bifacial import utils, infinite_sheds +from pvlib.shading import masking_angle +from pvlib.tools import cosd @pytest.fixture @@ -86,3 +88,73 @@ def test__vf_ground_sky_2d(test_system_fixed_tilt): vf, _ = utils._vf_ground_sky_2d(pts[0], ts['rotation'], ts['gcr'], ts['pitch'], ts['height'], max_rows=1) assert np.isclose(vf, vfs_gnd_sky[0]) + + +def test_vf_row_sky_2d(test_system_fixed_tilt): + ts, _, _ = test_system_fixed_tilt + # with float input, fx at top of row + vf = utils.vf_row_sky_2d(1., ts['gcr'], ts['surface_tilt']) + expected = 0.5 * (1 + cosd(ts['surface_tilt'])) + assert np.isclose(vf, expected) + # with array input + fx = np.array([0., 0.5, 1.]) + vf = utils.vf_row_sky_2d(fx, ts['gcr'], ts['surface_tilt']) + phi = masking_angle(ts['surface_tilt'], ts['gcr'], fx) + expected = 0.5 * (1 + cosd(ts['surface_tilt'] + phi)) + assert np.allclose(vf, expected) + + +def test_vf_row_sky_2d_integ(test_system_fixed_tilt): + ts, _, _ = test_system_fixed_tilt + # with float input, check end position + vf = utils.vf_row_sky_2d_integ(1., 1., ts['gcr'], ts['surface_tilt']) + expected = utils.vf_row_sky_2d(1., ts['gcr'], ts['surface_tilt']) + assert np.isclose(vf, expected) + # with array input + fx0 = np.array([0., 0.5]) + fx1 = np.array([0., 0.8]) + vf = utils.vf_row_sky_2d_integ(fx0, fx1, ts['gcr'], + ts['surface_tilt']) + phi = masking_angle(ts['surface_tilt'], ts['gcr'], fx0[0]) + y0 = 0.5 * (1 + cosd(ts['surface_tilt'] + phi)) + x = np.arange(fx0[1], fx1[1], 1e-4) + phi_y = masking_angle(ts['surface_tilt'], ts['gcr'], x) + y = 0.5 * (1 + cosd(ts['surface_tilt'] + phi_y)) + y1 = np.trapz(y, x) / (fx1[1] - fx0[1]) + expected = np.array([y0, y1]) + assert np.allclose(vf, expected, rtol=1e-3) + + +def test_vf_row_ground_2d(test_system_fixed_tilt): + ts, _, _ = test_system_fixed_tilt + # with float input, fx at bottom of row + vf = utils.vf_row_ground_2d(0., ts['gcr'], ts['surface_tilt']) + expected = 0.5 * (1. - cosd(ts['surface_tilt'])) + assert np.isclose(vf, expected) + # with array input + fx = np.array([0., 0.5, 1.0]) + vf = utils.vf_row_ground_2d(fx, ts['gcr'], ts['surface_tilt']) + phi = infinite_sheds._ground_angle(fx, ts['surface_tilt'], ts['gcr']) + expected = 0.5 * (1 - cosd(phi - ts['surface_tilt'])) + assert np.allclose(vf, expected) + + +def test_vf_ground_2d_integ(test_system_fixed_tilt): + ts, _, _ = test_system_fixed_tilt + # with float input, check end position + vf = utils.vf_row_ground_2d_integ(0., 0., ts['gcr'], ts['surface_tilt']) + expected = utils.vf_row_ground_2d(0., ts['gcr'], ts['surface_tilt']) + assert np.isclose(vf, expected) + # with array input + fx0 = np.array([0., 0.5]) + fx1 = np.array([0., 0.8]) + vf = utils.vf_row_ground_2d_integ(fx0, fx1, ts['gcr'], + ts['surface_tilt']) + phi = infinite_sheds._ground_angle(fx0[0], ts['surface_tilt'], ts['gcr']) + y0 = 0.5 * (1 - cosd(phi - ts['surface_tilt'])) + x = np.arange(fx0[1], fx1[1], 1e-4) + phi_y = infinite_sheds._ground_angle(x, ts['surface_tilt'], ts['gcr']) + y = 0.5 * (1 - cosd(phi_y - ts['surface_tilt'])) + y1 = np.trapz(y, x) / (fx1[1] - fx0[1]) + expected = np.array([y0, y1]) + assert np.allclose(vf, expected, rtol=1e-2) From 5837fd3a21f2fd857afea84a13eaff56df2646b4 Mon Sep 17 00:00:00 2001 From: Cliff Hansen Date: Fri, 24 Mar 2023 10:37:29 -0600 Subject: [PATCH 08/20] stickler --- pvlib/bifacial/infinite_sheds.py | 8 ++++---- pvlib/bifacial/utils.py | 3 --- pvlib/tests/bifacial/test_infinite_sheds.py | 11 +++++------ pvlib/tests/bifacial/test_utils.py | 4 ++-- 4 files changed, 11 insertions(+), 15 deletions(-) diff --git a/pvlib/bifacial/infinite_sheds.py b/pvlib/bifacial/infinite_sheds.py index 827f616398..06eb6b65b5 100644 --- a/pvlib/bifacial/infinite_sheds.py +++ b/pvlib/bifacial/infinite_sheds.py @@ -144,7 +144,7 @@ def _vf_row_sky_integ(f_x, surface_tilt, gcr, npoints=100): # integrate view factors from each point in the discretization. This is an # improvement over the algorithm described in [2] vf_shade_sky_integ = np.where( - f_x<1e-6, + f_x < 1e-6, 0.5 * (cosd(masking_angle(surface_tilt, gcr, 0.) + surface_tilt) + 1), 1 / f_x * np.trapz(y, x, axis=0)) # unshaded portion @@ -152,7 +152,7 @@ def _vf_row_sky_integ(f_x, surface_tilt, gcr, npoints=100): psi_t_unshaded = masking_angle(surface_tilt, gcr, x) y = 0.5 * (cosd(psi_t_unshaded + surface_tilt) + 1) vf_noshade_sky_integ = np.where( - (1 - f_x)<1e-6, + (1 - f_x) < 1e-6, 0.5 * (cosd(surface_tilt) + 1), 1 / (1 - f_x) * np.trapz(y, x, axis=0)) return vf_shade_sky_integ, vf_noshade_sky_integ @@ -302,7 +302,7 @@ def _vf_row_ground_integ(f_x, surface_tilt, gcr, npoints=100): # integrate view factors along the shaded portion of the row slant height. # This is an improvement over the algorithm described in [2] vf_shade_ground_integ = np.where( - f_x<1e-6, + f_x < 1e-6, _vf_row_ground(f_x, surface_tilt, gcr), 1 / f_x * np.trapz(y, x, axis=0)) @@ -313,7 +313,7 @@ def _vf_row_ground_integ(f_x, surface_tilt, gcr, npoints=100): # integrate view factors along the unshaded portion. # This is an improvement over the algorithm described in [2] vf_noshade_ground_integ = np.where( - (1 - f_x)<1e-6, + (1 - f_x) < 1e-6, _vf_row_ground(1., surface_tilt, gcr), 1 / (1 - f_x) * np.trapz(y, x, axis=0)) diff --git a/pvlib/bifacial/utils.py b/pvlib/bifacial/utils.py index 1d327244b9..dcce37a149 100644 --- a/pvlib/bifacial/utils.py +++ b/pvlib/bifacial/utils.py @@ -336,6 +336,3 @@ def vf_row_ground_2d_integ(x0, x1, gcr, surface_tilt): 0.5*(1 - 1/u * (p1 - p0)) ) return result -======= - ->>>>>>> 7a2ec9b4765124463bf0ddd0a49dcfedc4cbcad7 diff --git a/pvlib/tests/bifacial/test_infinite_sheds.py b/pvlib/tests/bifacial/test_infinite_sheds.py index 4d037cc1a2..5428e8c6e6 100644 --- a/pvlib/tests/bifacial/test_infinite_sheds.py +++ b/pvlib/tests/bifacial/test_infinite_sheds.py @@ -69,14 +69,14 @@ def analytic(fx0, fx1, gcr, surface_tilt): Average of view factor (by integration) between fx0 < fx1 ''' def p(x, a, c): - return np.sqrt(a*a - 2*a*c*(1-x) +(1-x)*(1-x)) + return np.sqrt(a*a - 2*a*c*(1-x) + (1-x)*(1-x)) eps = 1e-6 a = 1 / gcr c = cosd(surface_tilt) u = fx1 - fx0 with np.errstate(divide='ignore'): - result = np.where(np.abs(u) Date: Fri, 24 Mar 2023 11:01:26 -0600 Subject: [PATCH 09/20] use functions from utils --- pvlib/bifacial/infinite_sheds.py | 228 ++++---------------- pvlib/bifacial/utils.py | 4 +- pvlib/tests/bifacial/test_infinite_sheds.py | 94 -------- 3 files changed, 41 insertions(+), 285 deletions(-) diff --git a/pvlib/bifacial/infinite_sheds.py b/pvlib/bifacial/infinite_sheds.py index 06eb6b65b5..22a07910b3 100644 --- a/pvlib/bifacial/infinite_sheds.py +++ b/pvlib/bifacial/infinite_sheds.py @@ -6,9 +6,9 @@ import pandas as pd 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, haydavies + def _vf_ground_sky_integ(surface_tilt, surface_azimuth, gcr, height, pitch, max_rows=10, npoints=100, vectorize=False): """ @@ -94,94 +94,42 @@ def _poa_ground_shadows(poa_ground, f_gnd_beam, df, vf_gnd_sky): return poa_ground * (f_gnd_beam*(1 - df) + df*vf_gnd_sky) -def _vf_row_sky_integ(f_x, surface_tilt, gcr, npoints=100): +def _poa_sky_diffuse_pv(dhi, gcr, surface_tilt): """ - Integrated view factors from the shaded and unshaded parts of - the row slant height to the sky. - - Parameters - ---------- - f_x : numeric - Fraction of row slant height from the bottom that is shaded. [unitless] - surface_tilt : numeric - Surface tilt angle in degrees from horizontal, e.g., surface facing up - = 0, surface facing horizon = 90. [degree] - gcr : float - Ratio of row slant length to row spacing (pitch). [unitless] - npoints : int, default 100 - Number of points for integration. [unitless] + Sky diffuse POA from averaged view factors combined for both shaded and + unshaded parts of the surface. - Returns - ------- - vf_shade_sky_integ : numeric - Integrated view factor from the shaded part of the row to the sky. - [unitless] - vf_noshade_sky_integ : numeric - Integrated view factor from the unshaded part of the row to the sky. - [unitless] + A detailed calculation would be - Notes - ----- - The view factor to the sky at a point x along the row slant height is - given by + dhi * (f_x * vf_shade_sky_integ + (1 - f_x) * vf_noshade_sky_integ) - .. math :: - \\large{f_{sky} = \frac{1 + \\cos\\left(\\psi_t + \\beta\\right)}{2} + where vf_shade_sky_integ is the average view factor between 0 and f_x + (the shaded portion). But the average view factor is - where :math:`\\psi_t` is the angle from horizontal of the line from point - x to the top of the facing row, and :math:`\\beta` is the surface tilt. + 1/(f_x - 0) Integral_0^f_x vf(x) dx - View factors are integrated separately over shaded and unshaded portions - of the row slant height. + so the detailed calculation is equivalent to - """ - # handle Series inputs - surface_tilt = np.array(surface_tilt) - # shaded portion - x = np.linspace(0, f_x, num=npoints) - psi_t_shaded = masking_angle(surface_tilt, gcr, x) - y = 0.5 * (cosd(psi_t_shaded + surface_tilt) + 1) - # integrate view factors from each point in the discretization. This is an - # improvement over the algorithm described in [2] - vf_shade_sky_integ = np.where( - f_x < 1e-6, - 0.5 * (cosd(masking_angle(surface_tilt, gcr, 0.) + surface_tilt) + 1), - 1 / f_x * np.trapz(y, x, axis=0)) - # unshaded portion - x = np.linspace(f_x, 1., num=npoints) - psi_t_unshaded = masking_angle(surface_tilt, gcr, x) - y = 0.5 * (cosd(psi_t_unshaded + surface_tilt) + 1) - vf_noshade_sky_integ = np.where( - (1 - f_x) < 1e-6, - 0.5 * (cosd(surface_tilt) + 1), - 1 / (1 - f_x) * np.trapz(y, x, axis=0)) - return vf_shade_sky_integ, vf_noshade_sky_integ - - -def _poa_sky_diffuse_pv(f_x, dhi, vf_shade_sky_integ, vf_noshade_sky_integ): - """ - Sky diffuse POA from integrated view factors combined for both shaded and - unshaded parts of the surface. + dhi * 1/(1 - 0) Integral_0^1 vf(x) dx Parameters ---------- - f_x : numeric - Fraction of row slant height from the bottom that is shaded. [unitless] dhi : numeric Diffuse horizontal irradiance (DHI). [W/m^2] - vf_shade_sky_integ : numeric - Integrated view factor from the shaded part of the row to the sky. - [unitless] - vf_noshade_sky_integ : numeric - Integrated view factor from the unshaded part of the row to the sky. + gcr : float + ground coverage ratio, ratio of row slant length to row spacing. [unitless] + surface_tilt : numeric + Surface tilt angle in degrees from horizontal, e.g., surface facing up + = 0, surface facing horizon = 90. [degree] Returns ------- poa_sky_diffuse_pv : numeric Total sky diffuse irradiance incident on the PV surface. [W/m^2] """ - return dhi * (f_x * vf_shade_sky_integ + (1 - f_x) * vf_noshade_sky_integ) + vf_integ = utils.vf_row_sky_2d_integ(0., 1., gcr, surface_tilt) + return dhi * vf_integ def _ground_angle(x, surface_tilt, gcr): @@ -225,125 +173,45 @@ def _ground_angle(x, surface_tilt, gcr): return np.rad2deg(psi) -def _vf_row_ground(x, surface_tilt, gcr): - """ - View factor from a point x on the row to the ground. - - Parameters - ---------- - x : numeric - Fraction of row slant height from the bottom. [unitless] - surface_tilt : numeric - Surface tilt angle in degrees from horizontal, e.g., surface facing up - = 0, surface facing horizon = 90. [degree] - gcr : float - Ground coverage ratio, ratio of row slant length to row spacing. - [unitless] - - Returns - ------- - vf : numeric - View factor from the point at x to the ground. [unitless] - - """ - # angle from horizontal at the point x on the row slant height to the - # bottom of the facing row - psi_t_shaded = _ground_angle(x, surface_tilt, gcr) - # view factor from the point on the row to the ground - return 0.5 * (1 - cosd(psi_t_shaded - surface_tilt)) - - -def _vf_row_ground_integ(f_x, surface_tilt, gcr, npoints=100): +def _poa_ground_pv(poa_ground, gcr, surface_tilt): """ - View factors to the ground from shaded and unshaded parts of a row. + Reduce ground-reflected irradiance to account for limited view of the + ground from the row surface. - Parameters - ---------- - f_x : numeric - Fraction of row slant height from the bottom that is shaded. [unitless] - surface_tilt : numeric - Surface tilt angle in degrees from horizontal, e.g., surface facing up - = 0, surface facing horizon = 90. [degree] - gcr : float - Ground coverage ratio, ratio of row slant length to row spacing. - [unitless] - npoints : int, default 100 - Number of points for integration. [unitless] + A detailed calculation would be - Returns - ------- - vf_shade_ground_integ : numeric - View factor from the shaded portion of the row to the ground. - [unitless] - vf_noshade_ground_integ : numeric - View factor from the unshaded portion of the row to the ground. - [unitless] + poa_ground * + (f_x * vf_shade_ground_integ + (1 - f_x) * vf_noshade_ground_integ) - Notes - ----- - The view factor to the ground at a point x along the row slant height is - given by + where vf_shade_ground_integ is the average view factor between 0 and f_x + (the shaded portion). But the average view factor is - .. math :: - \\large{f_{gr} = \frac{1 - \\cos\\left(\\beta - \\psi_t\\right)}{2} + 1/(f_x - 0) Integral_0^f_x vf(x) dx - where :math:`\\psi_t` is the angle from horizontal of the line from point - x to the bottom of the facing row, and :math:`\\beta` is the surface tilt. + so the detailed calculation is equivalent to - Each view factor is integrated over the relevant portion of the row - slant height. - """ - # handle Series inputs - surface_tilt = np.array(surface_tilt) - # shaded portion of row slant height - x = np.linspace(0, f_x, num=npoints) - # view factor from the point on the row to the ground - y = _vf_row_ground(x, surface_tilt, gcr) - # integrate view factors along the shaded portion of the row slant height. - # This is an improvement over the algorithm described in [2] - vf_shade_ground_integ = np.where( - f_x < 1e-6, - _vf_row_ground(f_x, surface_tilt, gcr), - 1 / f_x * np.trapz(y, x, axis=0)) - - # unshaded portion of row slant height - x = np.linspace(f_x, 1., num=npoints) - # view factor from the point on the row to the ground - y = _vf_row_ground(x, surface_tilt, gcr) - # integrate view factors along the unshaded portion. - # This is an improvement over the algorithm described in [2] - vf_noshade_ground_integ = np.where( - (1 - f_x) < 1e-6, - _vf_row_ground(1., surface_tilt, gcr), - 1 / (1 - f_x) * np.trapz(y, x, axis=0)) - - return vf_shade_ground_integ, vf_noshade_ground_integ - - -def _poa_ground_pv(f_x, poa_ground, f_gnd_pv_shade, f_gnd_pv_noshade): - """ - Reduce ground-reflected irradiance to account for limited view of the - ground from the row surface. + poa_ground * 1/(1 - 0) Integral_0^1 vf(x) dx Parameters ---------- - f_x : numeric - Fraction of row slant height from the bottom that is shaded. [unitless] poa_ground : numeric Ground-reflected irradiance that would reach the row surface if the full ground was visible. poa_gnd_sky accounts for limited view of the sky from the ground. [W/m^2] - f_gnd_pv_shade : numeric - fraction of ground visible from shaded part of PV surface. [unitless] - f_gnd_pv_noshade : numeric - fraction of ground visible from unshaded part of PV surface. [unitless] + gcr : float + ground coverage ratio, ratio of row slant length to row spacing. + [unitless] + surface_tilt : numeric + Surface tilt angle in degrees from horizontal, e.g., surface facing up + = 0, surface facing horizon = 90. [degree] Returns ------- numeric Ground diffuse irradiance on the row plane. [W/m^2] """ - return poa_ground * (f_x * f_gnd_pv_shade + (1 - f_x) * f_gnd_pv_noshade) + vf_integ = utils.vf_row_ground_2d_integ(0., 1., gcr, surface_tilt) + return poa_ground * vf_integ def _shaded_fraction(solar_zenith, solar_azimuth, surface_tilt, @@ -556,25 +424,8 @@ def get_irradiance_poa(surface_tilt, surface_azimuth, solar_zenith, f_x = _shaded_fraction(solar_zenith, solar_azimuth, surface_tilt, surface_azimuth, gcr) - # Integrated view factors to the sky from the shaded and unshaded parts of - # the row slant height - # Differs from [1] Eq. 15 and Eq. 16. Here, we integrate over each - # interval (shaded or unshaded) rather than averaging values at each - # interval's end points. - vf_shade_sky, vf_noshade_sky = _vf_row_sky_integ( - f_x, surface_tilt, gcr, npoints) - - # view factors from the ground to shaded and unshaded portions of the row - # slant height - # Differs from [1] Eq. 17 and Eq. 18. Here, we integrate over each - # interval (shaded or unshaded) rather than averaging values at each - # interval's end points. - f_gnd_pv_shade, f_gnd_pv_noshade = _vf_row_ground_integ( - f_x, surface_tilt, gcr, npoints) - # Total sky diffuse received by both shaded and unshaded portions - poa_sky_pv = _poa_sky_diffuse_pv( - f_x, dhi, vf_shade_sky, vf_noshade_sky) + poa_sky_pv = _poa_sky_diffuse_pv(dhi, gcr, surface_tilt) # irradiance reflected from the ground before accounting for shadows # and restricted views @@ -599,8 +450,7 @@ def get_irradiance_poa(surface_tilt, surface_azimuth, solar_zenith, # the usual ground-reflected irradiance includes the single row to ground # view factor (1 - cos(tilt))/2, and Eq. 10, 11 and later multiply # this quantity by a ratio of view factors. - poa_gnd_pv = _poa_ground_pv( - f_x, ground_diffuse, f_gnd_pv_shade, f_gnd_pv_noshade) + poa_gnd_pv = _poa_ground_pv(ground_diffuse, gcr, surface_tilt) # add sky and ground-reflected irradiance on the row by irradiance # component diff --git a/pvlib/bifacial/utils.py b/pvlib/bifacial/utils.py index dcce37a149..226217a917 100644 --- a/pvlib/bifacial/utils.py +++ b/pvlib/bifacial/utils.py @@ -261,7 +261,7 @@ def vf_row_sky_2d_integ(x0, x1, gcr, surface_tilt): p0 = _vf_poly(1 - x0, gcr, surface_tilt, -1) p1 = _vf_poly(1 - x1, gcr, surface_tilt, -1) with np.errstate(divide='ignore'): - result = np.where(u<1e-6, + result = np.where(u < 1e-6, vf_row_sky_2d(x0, gcr, surface_tilt), 0.5*(1 + 1/u * (p1 - p0)) ) @@ -331,7 +331,7 @@ def vf_row_ground_2d_integ(x0, x1, gcr, surface_tilt): p0 = _vf_poly(x0, gcr, surface_tilt, 1) p1 = _vf_poly(x1, gcr, surface_tilt, 1) with np.errstate(divide='ignore'): - result = np.where(u<1e-6, + result = np.where(u < 1e-6, vf_row_ground_2d(x0, gcr, surface_tilt), 0.5*(1 - 1/u * (p1 - p0)) ) diff --git a/pvlib/tests/bifacial/test_infinite_sheds.py b/pvlib/tests/bifacial/test_infinite_sheds.py index 5428e8c6e6..871dfbb377 100644 --- a/pvlib/tests/bifacial/test_infinite_sheds.py +++ b/pvlib/tests/bifacial/test_infinite_sheds.py @@ -56,55 +56,6 @@ def test__vf_ground_sky_integ(test_system, vectorize): assert np.isclose(vf_integ, expected_vf_integ, rtol=0.1) -def test__vf_row_sky_integ(test_system): - ts, _, _ = test_system - gcr = ts['gcr'] - surface_tilt = ts['surface_tilt'] - f_x = np.array([0., 0.5, 1.]) - shaded = [] - noshade = [] - - def analytic(fx0, fx1, gcr, surface_tilt): - ''' - Average of view factor (by integration) between fx0 < fx1 - ''' - def p(x, a, c): - return np.sqrt(a*a - 2*a*c*(1-x) + (1-x)*(1-x)) - eps = 1e-6 - a = 1 / gcr - c = cosd(surface_tilt) - u = fx1 - fx0 - with np.errstate(divide='ignore'): - result = np.where(np.abs(u) < eps, - 0.5*(1 + (a*c - (1 -fx0)) / p(fx0, a, c)), - 0.5*(1 + 1/u*(p(fx1, a, c) - p(fx0, a, c))) - ) - return result - - for x in f_x: - s, ns = infinite_sheds._vf_row_sky_integ( - x, surface_tilt, gcr, npoints=100) - shaded.append(s) - noshade.append(ns) - - expected_noshade = analytic(f_x, 1, gcr, surface_tilt) - assert np.allclose(noshade, expected_noshade) - expected_shade = analytic(0, f_x, gcr, surface_tilt) - assert np.allclose(shaded, expected_shade) - - - -def test__poa_sky_diffuse_pv(): - dhi = np.array([np.nan, 0.0, 500.]) - f_x = np.array([0.2, 0.2, 0.5]) - vf_shade_sky_integ = np.array([1.0, 0.5, 0.2]) - vf_noshade_sky_integ = np.array([0.0, 0.5, 0.8]) - poa = infinite_sheds._poa_sky_diffuse_pv( - f_x, dhi, vf_shade_sky_integ, vf_noshade_sky_integ) - expected_poa = np.array([np.nan, 0.0, 500 * (0.5 * 0.2 + 0.5 * 0.8)]) - assert np.allclose(poa, expected_poa, equal_nan=True) - - def test__ground_angle(test_system): ts, _, _ = test_system x = np.array([0., 0.5, 1.0]) @@ -122,51 +73,6 @@ def test__ground_angle_zero_gcr(): assert np.allclose(angles, expected_angles) -def test__vf_row_ground(test_system): - ts, _, _ = test_system - x = np.array([0., 0.5, 1.0]) - vfs = infinite_sheds._vf_row_ground( - x, ts['surface_tilt'], ts['gcr']) - - def analytic(fx, gcr, surface_tilt): - def p(fx, a, c): - return np.sqrt(a*a + 2*a*c*fx + fx*fx) - a = 1/gcr - c = cosd(surface_tilt) - return 0.5*(1 - (a*c + fx)/p(fx, a, c)) - - expected_vfs = analytic(x, ts['gcr'], ts['surface_tilt']) - assert np.allclose(vfs, expected_vfs) - - -def test__vf_row_ground_integ(test_system): - ts, _, _ = test_system - gcr = ts['gcr'] - surface_tilt = ts['surface_tilt'] - f_x = np.array([0., 0.5, 1.0]) - shaded, noshade = infinite_sheds._vf_row_ground_integ( - f_x, surface_tilt, gcr) - - def analytic(fx0, fx1, gcr, surface_tilt): - def p(fx, a, c): - return np.sqrt(a*a + 2*a*c*fx + fx*fx) - eps = 1e-6 - a = 1 / gcr - c = cosd(surface_tilt) - u = fx1 - fx0 - with np.errstate(divide='ignore'): - result = np.where(np.abs(u) Date: Fri, 24 Mar 2023 11:10:01 -0600 Subject: [PATCH 10/20] documents --- docs/sphinx/source/reference/bifacial.rst | 11 +++++++++++ docs/sphinx/source/whatsnew/v0.9.6.rst | 4 ++++ 2 files changed, 15 insertions(+) diff --git a/docs/sphinx/source/reference/bifacial.rst b/docs/sphinx/source/reference/bifacial.rst index 2f70d0d883..deb030d730 100644 --- a/docs/sphinx/source/reference/bifacial.rst +++ b/docs/sphinx/source/reference/bifacial.rst @@ -11,3 +11,14 @@ Functions for calculating front and back surface irradiance bifacial.pvfactors.pvfactors_timeseries bifacial.infinite_sheds.get_irradiance bifacial.infinite_sheds.get_irradiance_poa + +Utility functions for bifacial modeling + +.. autosummary:: + :toctree: generated/ + + bifacial.utils.vf_row_sky_2d + bifacial.utils.vf_row_sky_2d_integ + bifacial.utils.vf_row_ground_2d + bifacial.utils.vf_row_ground_2d_integ + \ No newline at end of file diff --git a/docs/sphinx/source/whatsnew/v0.9.6.rst b/docs/sphinx/source/whatsnew/v0.9.6.rst index 06e7049a28..0d316fa104 100644 --- a/docs/sphinx/source/whatsnew/v0.9.6.rst +++ b/docs/sphinx/source/whatsnew/v0.9.6.rst @@ -15,6 +15,8 @@ Enhancements Bug fixes ~~~~~~~~~ +* Corrects an error (:issue:`1665`) in view factor calculations which are part of + :py:func:`pvlib.bifacial.infinite_sheds.get_irradiance` Testing @@ -35,4 +37,6 @@ Requirements Contributors ~~~~~~~~~~~~ +* Mark Mikofski (:ghuser:`mikofski`) +* Cliff Hansen (:ghuser:`cwhanse`) From a77dbb0b1889cb8e0e2c741f1ca65a76664a23f3 Mon Sep 17 00:00:00 2001 From: Cliff Hansen Date: Fri, 24 Mar 2023 11:11:14 -0600 Subject: [PATCH 11/20] revise whatsnew --- docs/sphinx/source/whatsnew/v0.9.6.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/sphinx/source/whatsnew/v0.9.6.rst b/docs/sphinx/source/whatsnew/v0.9.6.rst index 0d316fa104..a7ef8b592c 100644 --- a/docs/sphinx/source/whatsnew/v0.9.6.rst +++ b/docs/sphinx/source/whatsnew/v0.9.6.rst @@ -15,8 +15,8 @@ Enhancements Bug fixes ~~~~~~~~~ -* Corrects an error (:issue:`1665`) in view factor calculations which are part of - :py:func:`pvlib.bifacial.infinite_sheds.get_irradiance` +* Corrects an error in view factor calculations which are part of + :py:func:`pvlib.bifacial.infinite_sheds.get_irradiance` (:issue:`1665`, :pull:`1666`) Testing From 09f3f86e96b38bdb85af589fae872bc601fa2207 Mon Sep 17 00:00:00 2001 From: Cliff Hansen Date: Fri, 24 Mar 2023 12:36:01 -0600 Subject: [PATCH 12/20] add technical document --- ...g the average view factor from a module.pdf | Bin 0 -> 172374 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/notes/Determining the average view factor from a module.pdf diff --git a/docs/notes/Determining the average view factor from a module.pdf b/docs/notes/Determining the average view factor from a module.pdf new file mode 100644 index 0000000000000000000000000000000000000000..312afc2d3b1a484005aae7ef6d2988c47eccb0bd GIT binary patch literal 172374 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 +??^ZVX;-X;`m> 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 z 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 Cx(kT_ literal 0 HcmV?d00001 From e7b7d5f69e04d7ea82c01416518237f58ea34fc5 Mon Sep 17 00:00:00 2001 From: Hansen Date: Mon, 3 Apr 2023 15:59:10 -0600 Subject: [PATCH 13/20] doc edits --- ... the average view factor from a module.pdf | Bin 172374 -> 172157 bytes docs/sphinx/source/reference/bifacial.rst | 9 ++++----- docs/sphinx/source/whatsnew/v0.9.6.rst | 5 ++++- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/docs/notes/Determining the average view factor from a module.pdf b/docs/notes/Determining the average view factor from a module.pdf index 312afc2d3b1a484005aae7ef6d2988c47eccb0bd..1c52f32d01c9a0358f54e17e98898ae93d16e48d 100644 GIT binary patch delta 9651 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 DW(eS^ diff --git a/docs/sphinx/source/reference/bifacial.rst b/docs/sphinx/source/reference/bifacial.rst index deb030d730..52d2751433 100644 --- a/docs/sphinx/source/reference/bifacial.rst +++ b/docs/sphinx/source/reference/bifacial.rst @@ -17,8 +17,7 @@ Utility functions for bifacial modeling .. autosummary:: :toctree: generated/ - bifacial.utils.vf_row_sky_2d - bifacial.utils.vf_row_sky_2d_integ - bifacial.utils.vf_row_ground_2d - bifacial.utils.vf_row_ground_2d_integ - \ No newline at end of file + bifacial.utils.vf_row_sky_2d + bifacial.utils.vf_row_sky_2d_integ + bifacial.utils.vf_row_ground_2d + bifacial.utils.vf_row_ground_2d_integ diff --git a/docs/sphinx/source/whatsnew/v0.9.6.rst b/docs/sphinx/source/whatsnew/v0.9.6.rst index a7ef8b592c..44552bc24d 100644 --- a/docs/sphinx/source/whatsnew/v0.9.6.rst +++ b/docs/sphinx/source/whatsnew/v0.9.6.rst @@ -16,7 +16,10 @@ Enhancements Bug fixes ~~~~~~~~~ * Corrects an error in view factor calculations which are part of - :py:func:`pvlib.bifacial.infinite_sheds.get_irradiance` (:issue:`1665`, :pull:`1666`) + :py:func:`pvlib.bifacial.infinite_sheds.get_irradiance`. The error + affects rear surface irradiance by a few W/m2. As part of the correction, + average view factors are now computed by exact formulas rather than by + numerical integration. (:issue:`1665`, :pull:`1666`) Testing From 6a026ad32f1d8f4562ce98c59372562fc79c459e Mon Sep 17 00:00:00 2001 From: Cliff Hansen Date: Mon, 15 May 2023 15:57:34 -0600 Subject: [PATCH 14/20] move fns to utils --- pvlib/bifacial/infinite_sheds.py | 57 +------------------- pvlib/bifacial/utils.py | 59 ++++++++++++++++++++- pvlib/tests/bifacial/test_infinite_sheds.py | 15 ------ pvlib/tests/bifacial/test_utils.py | 22 ++++++-- 4 files changed, 77 insertions(+), 76 deletions(-) diff --git a/pvlib/bifacial/infinite_sheds.py b/pvlib/bifacial/infinite_sheds.py index 044ccc774e..8a04adf280 100644 --- a/pvlib/bifacial/infinite_sheds.py +++ b/pvlib/bifacial/infinite_sheds.py @@ -9,61 +9,6 @@ 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, vectorize=False): - """ - Integrated view factor to the sky from the ground underneath - interior rows of the array. - - Parameters - ---------- - surface_tilt : numeric - Surface tilt angle in degrees from horizontal, e.g., surface facing up - = 0, surface facing horizon = 90. [degree] - surface_azimuth : numeric - Surface azimuth angles in decimal degrees east of north - (e.g. North = 0, South = 180, East = 90, West = 270). - ``surface_azimuth`` must be >=0 and <=360. - gcr : float - Ratio of row slant length to row spacing (pitch). [unitless] - height : float - Height of the center point of the row above the ground; must be in the - same units as ``pitch``. - pitch : float - Distance between two rows. Must be in the same units as ``height``. - max_rows : int, default 10 - Maximum number of rows to consider in front and behind the current row. - npoints : int, default 100 - Number of points used to discretize distance along the ground. - vectorize : bool, default False - If True, vectorize the view factor calculation across ``surface_tilt``. - This increases speed with the cost of increased memory usage. - - Returns - ------- - fgnd_sky : numeric - Integration of view factor over the length between adjacent, interior - rows. Shape matches that of ``surface_tilt``. [unitless] - """ - # Abuse utils._vf_ground_sky_2d by supplying surface_tilt in place - # of a signed rotation. This is OK because - # 1) z span the full distance between 2 rows, and - # 2) max_rows is set to be large upstream, and - # 3) _vf_ground_sky_2d considers [-max_rows, +max_rows] - # The VFs to the sky will thus be symmetric around z=0.5 - z = np.linspace(0, 1, npoints) - rotation = np.atleast_1d(surface_tilt) - if vectorize: - fz_sky = utils._vf_ground_sky_2d(z, rotation, gcr, pitch, height, - max_rows) - else: - fz_sky = np.zeros((npoints, len(rotation))) - for k, r in enumerate(rotation): - vf = utils._vf_ground_sky_2d(z, r, gcr, pitch, height, max_rows) - fz_sky[:, k] = vf[:, 0] # remove spurious rotation dimension - # calculate the integrated view factor for all of the ground between rows - return np.trapz(fz_sky, z, axis=0) - def _poa_ground_shadows(poa_ground, f_gnd_beam, df, vf_gnd_sky): """ @@ -419,7 +364,7 @@ def get_irradiance_poa(surface_tilt, surface_azimuth, solar_zenith, # adjacent rows interior to the array # method differs from [1], Eq. 7 and Eq. 8; height is defined at row # center rather than at row lower edge as in [1]. - vf_gnd_sky = _vf_ground_sky_integ( + vf_gnd_sky = utils.vf_ground_sky_2d_integ( surface_tilt, surface_azimuth, gcr, height, pitch, max_rows, npoints, vectorize) # fraction of row slant height that is shaded from direct irradiance diff --git a/pvlib/bifacial/utils.py b/pvlib/bifacial/utils.py index 226217a917..c4f53f527f 100644 --- a/pvlib/bifacial/utils.py +++ b/pvlib/bifacial/utils.py @@ -5,6 +5,7 @@ import numpy as np from pvlib.tools import sind, cosd, tand + def _solar_projection_tangent(solar_zenith, solar_azimuth, surface_azimuth): """ Tangent of the angle between the zenith vector and the sun vector @@ -89,7 +90,7 @@ def _unshaded_ground_fraction(surface_tilt, surface_azimuth, solar_zenith, return f_gnd_beam # 1 - min(1, abs()) < 1 always -def _vf_ground_sky_2d(x, rotation, gcr, pitch, height, max_rows=10): +def vf_ground_sky_2d(x, rotation, gcr, pitch, height, max_rows=10): r""" Calculate the fraction of the sky dome visible from point x on the ground. @@ -171,6 +172,62 @@ def _vf_ground_sky_2d(x, rotation, gcr, pitch, height, max_rows=10): return vf +def vf_ground_sky_2d_integ(surface_tilt, surface_azimuth, gcr, height, + pitch, max_rows=10, npoints=100, vectorize=False): + """ + Integrated view factor to the sky from the ground underneath + interior rows of the array. + + Parameters + ---------- + surface_tilt : numeric + Surface tilt angle in degrees from horizontal, e.g., surface facing up + = 0, surface facing horizon = 90. [degree] + surface_azimuth : numeric + Surface azimuth angles in decimal degrees east of north + (e.g. North = 0, South = 180, East = 90, West = 270). + ``surface_azimuth`` must be >=0 and <=360. + gcr : float + Ratio of row slant length to row spacing (pitch). [unitless] + height : float + Height of the center point of the row above the ground; must be in the + same units as ``pitch``. + pitch : float + Distance between two rows. Must be in the same units as ``height``. + max_rows : int, default 10 + Maximum number of rows to consider in front and behind the current row. + npoints : int, default 100 + Number of points used to discretize distance along the ground. + vectorize : bool, default False + If True, vectorize the view factor calculation across ``surface_tilt``. + This increases speed with the cost of increased memory usage. + + Returns + ------- + fgnd_sky : numeric + Integration of view factor over the length between adjacent, interior + rows. Shape matches that of ``surface_tilt``. [unitless] + """ + # Abuse utils._vf_ground_sky_2d by supplying surface_tilt in place + # of a signed rotation. This is OK because + # 1) z span the full distance between 2 rows, and + # 2) max_rows is set to be large upstream, and + # 3) _vf_ground_sky_2d considers [-max_rows, +max_rows] + # The VFs to the sky will thus be symmetric around z=0.5 + z = np.linspace(0, 1, npoints) + rotation = np.atleast_1d(surface_tilt) + if vectorize: + fz_sky = vf_ground_sky_2d(z, rotation, gcr, pitch, height, + max_rows) + else: + fz_sky = np.zeros((npoints, len(rotation))) + for k, r in enumerate(rotation): + vf = vf_ground_sky_2d(z, r, gcr, pitch, height, max_rows) + fz_sky[:, k] = vf[:, 0] # remove spurious rotation dimension + # calculate the integrated view factor for all of the ground between rows + return np.trapz(fz_sky, z, axis=0) + + def _vf_poly(x, gcr, surface_tilt, delta): r''' A term common to many 2D view factor calculations diff --git a/pvlib/tests/bifacial/test_infinite_sheds.py b/pvlib/tests/bifacial/test_infinite_sheds.py index 871dfbb377..91915c1af7 100644 --- a/pvlib/tests/bifacial/test_infinite_sheds.py +++ b/pvlib/tests/bifacial/test_infinite_sheds.py @@ -5,7 +5,6 @@ import numpy as np import pandas as pd from pvlib.bifacial import infinite_sheds -from pvlib.tools import cosd from ..conftest import assert_series_equal import pytest @@ -42,20 +41,6 @@ def test_system(): return syst, pts, vfs_ground_sky -@pytest.mark.parametrize("vectorize", [True, False]) -def test__vf_ground_sky_integ(test_system, vectorize): - ts, pts, vfs_gnd_sky = test_system - # pass rotation here since max_rows=1 for the hand-solved case in - # the fixture test_system, which means the ground-to-sky view factor - # isn't summed over enough rows for symmetry to hold. - vf_integ = infinite_sheds._vf_ground_sky_integ( - ts['rotation'], ts['surface_azimuth'], - ts['gcr'], ts['height'], ts['pitch'], - max_rows=1, npoints=3, vectorize=vectorize) - expected_vf_integ = np.trapz(vfs_gnd_sky, pts) - assert np.isclose(vf_integ, expected_vf_integ, rtol=0.1) - - def test__ground_angle(test_system): ts, _, _ = test_system x = np.array([0., 0.5, 1.0]) diff --git a/pvlib/tests/bifacial/test_utils.py b/pvlib/tests/bifacial/test_utils.py index 770ad52887..2a398dddba 100644 --- a/pvlib/tests/bifacial/test_utils.py +++ b/pvlib/tests/bifacial/test_utils.py @@ -81,15 +81,29 @@ def test__unshaded_ground_fraction( def test__vf_ground_sky_2d(test_system_fixed_tilt): # vector input ts, pts, vfs_gnd_sky = test_system_fixed_tilt - vfs = utils._vf_ground_sky_2d(pts, ts['rotation'], ts['gcr'], - ts['pitch'], ts['height'], max_rows=1) + vfs = utils.vf_ground_sky_2d(pts, ts['rotation'], ts['gcr'], + ts['pitch'], ts['height'], max_rows=1) assert np.allclose(vfs, vfs_gnd_sky, rtol=0.1) # middle point vf is off # test with singleton x - vf = utils._vf_ground_sky_2d(pts[0], ts['rotation'], ts['gcr'], - ts['pitch'], ts['height'], max_rows=1) + vf = utils.vf_ground_sky_2d(pts[0], ts['rotation'], ts['gcr'], + ts['pitch'], ts['height'], max_rows=1) assert np.isclose(vf, vfs_gnd_sky[0]) +@pytest.mark.parametrize("vectorize", [True, False]) +def test_vf_ground_sky_2d_integ(test_system_fixed_tilt, vectorize): + ts, pts, vfs_gnd_sky = test_system_fixed_tilt + # pass rotation here since max_rows=1 for the hand-solved case in + # the fixture test_system, which means the ground-to-sky view factor + # isn't summed over enough rows for symmetry to hold. + vf_integ = utils.vf_ground_sky_2d_integ( + ts['rotation'], ts['surface_azimuth'], + ts['gcr'], ts['height'], ts['pitch'], + max_rows=1, npoints=3, vectorize=vectorize) + expected_vf_integ = np.trapz(vfs_gnd_sky, pts, axis=0) + assert np.isclose(vf_integ, expected_vf_integ, rtol=0.1) + + def test_vf_row_sky_2d(test_system_fixed_tilt): ts, _, _ = test_system_fixed_tilt # with float input, fx at top of row From 47bd4def737c9842a4cbcbafbcf10044e73c9e5e Mon Sep 17 00:00:00 2001 From: Cliff Hansen Date: Mon, 15 May 2023 16:06:22 -0600 Subject: [PATCH 15/20] more fcn shuffling --- pvlib/bifacial/infinite_sheds.py | 42 --------------------- pvlib/bifacial/utils.py | 2 +- pvlib/shading.py | 41 ++++++++++++++++++++ pvlib/tests/bifacial/test_infinite_sheds.py | 17 --------- pvlib/tests/bifacial/test_utils.py | 10 ++--- pvlib/tests/test_shading.py | 28 ++++++++++++++ 6 files changed, 75 insertions(+), 65 deletions(-) diff --git a/pvlib/bifacial/infinite_sheds.py b/pvlib/bifacial/infinite_sheds.py index 8a04adf280..3ac03723b4 100644 --- a/pvlib/bifacial/infinite_sheds.py +++ b/pvlib/bifacial/infinite_sheds.py @@ -9,7 +9,6 @@ from pvlib.irradiance import beam_component, aoi, haydavies - def _poa_ground_shadows(poa_ground, f_gnd_beam, df, vf_gnd_sky): """ Reduce ground-reflected irradiance to the tilted plane (poa_ground) to @@ -93,47 +92,6 @@ def _poa_sky_diffuse_pv(dhi, gcr, surface_tilt): return dhi * vf_integ -def _ground_angle(x, surface_tilt, gcr): - """ - Angle from horizontal of the line from a point x on the row slant length - to the bottom of the facing row. - - The angles are clockwise from horizontal, rather than the usual - counterclockwise direction. - - Parameters - ---------- - x : numeric - fraction of row slant length from bottom, ``x = 0`` is at the row - bottom, ``x = 1`` is at the top of the row. - surface_tilt : numeric - Surface tilt angle in degrees from horizontal, e.g., surface facing up - = 0, surface facing horizon = 90. [degree] - gcr : float - ground coverage ratio, ratio of row slant length to row spacing. - [unitless] - - Returns - ------- - psi : numeric - Angle [degree]. - """ - # : \\ \ - # : \\ \ - # : \\ \ - # : \\ \ facing row - # : \\.___________\ - # : \ ^*-. psi \ - # : \ x *-. \ - # : \ v *-.\ - # : \<-----P---->\ - - x1 = gcr * x * sind(surface_tilt) - x2 = gcr * x * cosd(surface_tilt) + 1 - psi = np.arctan2(x1, x2) # do this first because it handles 0 / 0 - return np.rad2deg(psi) - - def _poa_ground_pv(poa_ground, gcr, surface_tilt): """ Reduce ground-reflected irradiance to account for limited view of the diff --git a/pvlib/bifacial/utils.py b/pvlib/bifacial/utils.py index c4f53f527f..716f37a810 100644 --- a/pvlib/bifacial/utils.py +++ b/pvlib/bifacial/utils.py @@ -208,7 +208,7 @@ def vf_ground_sky_2d_integ(surface_tilt, surface_azimuth, gcr, height, Integration of view factor over the length between adjacent, interior rows. Shape matches that of ``surface_tilt``. [unitless] """ - # Abuse utils._vf_ground_sky_2d by supplying surface_tilt in place + # Abuse vf_ground_sky_2d by supplying surface_tilt in place # of a signed rotation. This is OK because # 1) z span the full distance between 2 rows, and # 2) max_rows is set to be large upstream, and diff --git a/pvlib/shading.py b/pvlib/shading.py index 01d725207c..e8d00bca89 100644 --- a/pvlib/shading.py +++ b/pvlib/shading.py @@ -8,6 +8,47 @@ from pvlib.tools import sind, cosd +def ground_angle(x, surface_tilt, gcr): + """ + Angle from horizontal of the line from a point x on the row slant length + to the bottom of the facing row. + + The angles are clockwise from horizontal, rather than the usual + counterclockwise direction. + + Parameters + ---------- + x : numeric + fraction of row slant length from bottom, ``x = 0`` is at the row + bottom, ``x = 1`` is at the top of the row. + surface_tilt : numeric + Surface tilt angle in degrees from horizontal, e.g., surface facing up + = 0, surface facing horizon = 90. [degree] + gcr : float + ground coverage ratio, ratio of row slant length to row spacing. + [unitless] + + Returns + ------- + psi : numeric + Angle [degree]. + """ + # : \\ \ + # : \\ \ + # : \\ \ + # : \\ \ facing row + # : \\.___________\ + # : \ ^*-. psi \ + # : \ x *-. \ + # : \ v *-.\ + # : \<-----P---->\ + + x1 = gcr * x * sind(surface_tilt) + x2 = gcr * x * cosd(surface_tilt) + 1 + psi = np.arctan2(x1, x2) # do this first because it handles 0 / 0 + return np.rad2deg(psi) + + def masking_angle(surface_tilt, gcr, slant_height): """ The elevation angle below which diffuse irradiance is blocked. diff --git a/pvlib/tests/bifacial/test_infinite_sheds.py b/pvlib/tests/bifacial/test_infinite_sheds.py index 91915c1af7..017b15f943 100644 --- a/pvlib/tests/bifacial/test_infinite_sheds.py +++ b/pvlib/tests/bifacial/test_infinite_sheds.py @@ -41,23 +41,6 @@ def test_system(): return syst, pts, vfs_ground_sky -def test__ground_angle(test_system): - ts, _, _ = test_system - x = np.array([0., 0.5, 1.0]) - angles = infinite_sheds._ground_angle( - x, ts['surface_tilt'], ts['gcr']) - expected_angles = np.array([0., 5.866738789543952, 9.896090638982903]) - assert np.allclose(angles, expected_angles) - - -def test__ground_angle_zero_gcr(): - surface_tilt = 30.0 - x = np.array([0.0, 0.5, 1.0]) - angles = infinite_sheds._ground_angle(x, surface_tilt, 0) - expected_angles = np.array([0, 0, 0]) - assert np.allclose(angles, expected_angles) - - def test__poa_ground_shadows(): poa_ground, f_gnd_beam, df, vf_gnd_sky = (300., 0.5, 0.5, 0.2) result = infinite_sheds._poa_ground_shadows( diff --git a/pvlib/tests/bifacial/test_utils.py b/pvlib/tests/bifacial/test_utils.py index 2a398dddba..a1a36787a0 100644 --- a/pvlib/tests/bifacial/test_utils.py +++ b/pvlib/tests/bifacial/test_utils.py @@ -3,8 +3,8 @@ """ import numpy as np import pytest -from pvlib.bifacial import utils, infinite_sheds -from pvlib.shading import masking_angle +from pvlib.bifacial import utils +from pvlib.shading import masking_angle, ground_angle from pvlib.tools import cosd @@ -148,7 +148,7 @@ def test_vf_row_ground_2d(test_system_fixed_tilt): # with array input fx = np.array([0., 0.5, 1.0]) vf = utils.vf_row_ground_2d(fx, ts['gcr'], ts['surface_tilt']) - phi = infinite_sheds._ground_angle(fx, ts['surface_tilt'], ts['gcr']) + phi = ground_angle(fx, ts['surface_tilt'], ts['gcr']) expected = 0.5 * (1 - cosd(phi - ts['surface_tilt'])) assert np.allclose(vf, expected) @@ -164,10 +164,10 @@ def test_vf_ground_2d_integ(test_system_fixed_tilt): fx1 = np.array([0., 0.8]) vf = utils.vf_row_ground_2d_integ(fx0, fx1, ts['gcr'], ts['surface_tilt']) - phi = infinite_sheds._ground_angle(fx0[0], ts['surface_tilt'], ts['gcr']) + phi = ground_angle(fx0[0], ts['surface_tilt'], ts['gcr']) y0 = 0.5 * (1 - cosd(phi - ts['surface_tilt'])) x = np.arange(fx0[1], fx1[1], 1e-4) - phi_y = infinite_sheds._ground_angle(x, ts['surface_tilt'], ts['gcr']) + phi_y = ground_angle(x, ts['surface_tilt'], ts['gcr']) y = 0.5 * (1 - cosd(phi_y - ts['surface_tilt'])) y1 = np.trapz(y, x) / (fx1[1] - fx0[1]) expected = np.array([y0, y1]) diff --git a/pvlib/tests/test_shading.py b/pvlib/tests/test_shading.py index 0558cb76ad..dfbb9c979b 100644 --- a/pvlib/tests/test_shading.py +++ b/pvlib/tests/test_shading.py @@ -7,6 +7,34 @@ from pvlib import shading +@pytest.fixture +def test_system(): + syst = {'height': 1.0, + 'pitch': 2., + 'surface_tilt': 30., + 'surface_azimuth': 180., + 'rotation': -30.} # rotation of right edge relative to horizontal + syst['gcr'] = 1.0 / syst['pitch'] + return syst + + +def test__ground_angle(test_system): + ts = test_system + x = np.array([0., 0.5, 1.0]) + angles = shading.ground_angle( + x, ts['surface_tilt'], ts['gcr']) + expected_angles = np.array([0., 5.866738789543952, 9.896090638982903]) + assert np.allclose(angles, expected_angles) + + +def test__ground_angle_zero_gcr(): + surface_tilt = 30.0 + x = np.array([0.0, 0.5, 1.0]) + angles = shading.ground_angle(x, surface_tilt, 0) + expected_angles = np.array([0, 0, 0]) + assert np.allclose(angles, expected_angles) + + @pytest.fixture def surface_tilt(): idx = pd.date_range('2019-01-01', freq='h', periods=3) From 7e1be578e7fd271ad80ed737b067848cd98f3cf9 Mon Sep 17 00:00:00 2001 From: Cliff Hansen Date: Mon, 15 May 2023 16:12:24 -0600 Subject: [PATCH 16/20] update docs --- docs/sphinx/source/reference/bifacial.rst | 2 ++ .../reference/effects_on_pv_system_output/shading.rst | 1 + docs/sphinx/source/whatsnew/v0.9.6.rst | 9 ++++++++- 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/docs/sphinx/source/reference/bifacial.rst b/docs/sphinx/source/reference/bifacial.rst index 52d2751433..6405fe4afc 100644 --- a/docs/sphinx/source/reference/bifacial.rst +++ b/docs/sphinx/source/reference/bifacial.rst @@ -21,3 +21,5 @@ Utility functions for bifacial modeling bifacial.utils.vf_row_sky_2d_integ bifacial.utils.vf_row_ground_2d bifacial.utils.vf_row_ground_2d_integ + bifacial.utils.vf_ground_sky_2d + bifacial.utils.vf_ground_sky_2d_integ diff --git a/docs/sphinx/source/reference/effects_on_pv_system_output/shading.rst b/docs/sphinx/source/reference/effects_on_pv_system_output/shading.rst index a68dd94b2a..14ac13b4ca 100644 --- a/docs/sphinx/source/reference/effects_on_pv_system_output/shading.rst +++ b/docs/sphinx/source/reference/effects_on_pv_system_output/shading.rst @@ -6,6 +6,7 @@ Shading .. autosummary:: :toctree: ../generated/ + shading.ground_angle shading.masking_angle shading.masking_angle_passias shading.sky_diffuse_passias \ No newline at end of file diff --git a/docs/sphinx/source/whatsnew/v0.9.6.rst b/docs/sphinx/source/whatsnew/v0.9.6.rst index 234d594298..eb42dec59e 100644 --- a/docs/sphinx/source/whatsnew/v0.9.6.rst +++ b/docs/sphinx/source/whatsnew/v0.9.6.rst @@ -11,6 +11,14 @@ Deprecations Enhancements ~~~~~~~~~~~~ +* Exposes several functions useful for bifacial and shading calculations (:pull:`1666`): + * :py:func:`pvlib.bifacial.utils.bifacial.utils.vf_row_sky_2d1 + * :py:func:`pvlib.bifacial.utils.vf_row_sky_2d_integ + * :py:func:`pvlib.bifacial.utils.vf_row_ground_2d + * :py:func:`pvlib.bifacial.utils.vf_row_ground_2d_integ + * :py:func:`pvlib.bifacial.utils.vf_ground_sky_2d + * :py:func:`pvlib.bifacial.utils.vf_ground_sky_2d_integ + * :py:func:`pvlib.shading.ground_angle` Bug fixes @@ -20,7 +28,6 @@ Bug fixes affects rear surface irradiance by a few W/m2. As part of the correction, average view factors are now computed by exact formulas rather than by numerical integration. (:issue:`1665`, :pull:`1666`) - * `data` can no longer be left unspecified in :py:meth:`pvlib.modelchain.ModelChain.run_model_from_effective_irradiance`. (:issue:`1713`, :pull:`1720`) From 02bc783df8339e16c8630da01f00087986232149 Mon Sep 17 00:00:00 2001 From: Cliff Hansen Date: Tue, 16 May 2023 09:49:20 -0600 Subject: [PATCH 17/20] reorder arguments --- docs/sphinx/source/whatsnew/v0.9.6.rst | 1 + pvlib/bifacial/infinite_sheds.py | 6 +- pvlib/bifacial/utils.py | 101 ++++++++++++------------- pvlib/shading.py | 14 ++-- pvlib/tests/bifacial/test_utils.py | 35 ++++----- pvlib/tests/test_shading.py | 4 +- 6 files changed, 77 insertions(+), 84 deletions(-) diff --git a/docs/sphinx/source/whatsnew/v0.9.6.rst b/docs/sphinx/source/whatsnew/v0.9.6.rst index eb42dec59e..1bbf8a7b1a 100644 --- a/docs/sphinx/source/whatsnew/v0.9.6.rst +++ b/docs/sphinx/source/whatsnew/v0.9.6.rst @@ -12,6 +12,7 @@ Deprecations Enhancements ~~~~~~~~~~~~ * Exposes several functions useful for bifacial and shading calculations (:pull:`1666`): + * :py:func:`pvlib.bifacial.utils.bifacial.utils.vf_row_sky_2d1 * :py:func:`pvlib.bifacial.utils.vf_row_sky_2d_integ * :py:func:`pvlib.bifacial.utils.vf_row_ground_2d diff --git a/pvlib/bifacial/infinite_sheds.py b/pvlib/bifacial/infinite_sheds.py index 3ac03723b4..7d84d4c3f4 100644 --- a/pvlib/bifacial/infinite_sheds.py +++ b/pvlib/bifacial/infinite_sheds.py @@ -88,7 +88,7 @@ def _poa_sky_diffuse_pv(dhi, gcr, surface_tilt): poa_sky_diffuse_pv : numeric Total sky diffuse irradiance incident on the PV surface. [W/m^2] """ - vf_integ = utils.vf_row_sky_2d_integ(0., 1., gcr, surface_tilt) + vf_integ = utils.vf_row_sky_2d_integ(surface_tilt, gcr, 0., 1.) return dhi * vf_integ @@ -115,7 +115,7 @@ def _poa_ground_pv(poa_ground, gcr, surface_tilt): numeric Ground diffuse irradiance on the row plane. [W/m^2] """ - vf_integ = utils.vf_row_ground_2d_integ(0., 1., gcr, surface_tilt) + vf_integ = utils.vf_row_ground_2d_integ(surface_tilt, gcr, 0., 1.) return poa_ground * vf_integ @@ -323,7 +323,7 @@ def get_irradiance_poa(surface_tilt, surface_azimuth, solar_zenith, # method differs from [1], Eq. 7 and Eq. 8; height is defined at row # center rather than at row lower edge as in [1]. vf_gnd_sky = utils.vf_ground_sky_2d_integ( - surface_tilt, surface_azimuth, gcr, height, pitch, max_rows, npoints, + surface_tilt, gcr, height, pitch, max_rows, npoints, vectorize) # fraction of row slant height that is shaded from direct irradiance f_x = _shaded_fraction(solar_zenith, solar_azimuth, surface_tilt, diff --git a/pvlib/bifacial/utils.py b/pvlib/bifacial/utils.py index 716f37a810..a57d02cf90 100644 --- a/pvlib/bifacial/utils.py +++ b/pvlib/bifacial/utils.py @@ -90,7 +90,7 @@ def _unshaded_ground_fraction(surface_tilt, surface_azimuth, solar_zenith, return f_gnd_beam # 1 - min(1, abs()) < 1 always -def vf_ground_sky_2d(x, rotation, gcr, pitch, height, max_rows=10): +def vf_ground_sky_2d(rotation, gcr, x, pitch, height, max_rows=10): r""" Calculate the fraction of the sky dome visible from point x on the ground. @@ -100,15 +100,15 @@ def vf_ground_sky_2d(x, rotation, gcr, pitch, height, max_rows=10): Parameters ---------- - x : numeric - Position on the ground between two rows, as a fraction of the pitch. - x = 0 corresponds to the point on the ground directly below the - center point of a row. Positive x is towards the right. [unitless] rotation : numeric Rotation angle of the row's right edge relative to row center. [degree] gcr : float Ratio of the row slant length to the row spacing (pitch). [unitless] + x : numeric + Position on the ground between two rows, as a fraction of the pitch. + x = 0 corresponds to the point on the ground directly below the + center point of a row. Positive x is towards the right. [unitless] height : float Height of the center point of the row above the ground; must be in the same units as ``pitch``. @@ -172,8 +172,8 @@ def vf_ground_sky_2d(x, rotation, gcr, pitch, height, max_rows=10): return vf -def vf_ground_sky_2d_integ(surface_tilt, surface_azimuth, gcr, height, - pitch, max_rows=10, npoints=100, vectorize=False): +def vf_ground_sky_2d_integ(surface_tilt, gcr, height, pitch, max_rows=10, + npoints=100, vectorize=False): """ Integrated view factor to the sky from the ground underneath interior rows of the array. @@ -183,10 +183,6 @@ def vf_ground_sky_2d_integ(surface_tilt, surface_azimuth, gcr, height, surface_tilt : numeric Surface tilt angle in degrees from horizontal, e.g., surface facing up = 0, surface facing horizon = 90. [degree] - surface_azimuth : numeric - Surface azimuth angles in decimal degrees east of north - (e.g. North = 0, South = 180, East = 90, West = 270). - ``surface_azimuth`` must be >=0 and <=360. gcr : float Ratio of row slant length to row spacing (pitch). [unitless] height : float @@ -217,31 +213,30 @@ def vf_ground_sky_2d_integ(surface_tilt, surface_azimuth, gcr, height, z = np.linspace(0, 1, npoints) rotation = np.atleast_1d(surface_tilt) if vectorize: - fz_sky = vf_ground_sky_2d(z, rotation, gcr, pitch, height, - max_rows) + fz_sky = vf_ground_sky_2d(rotation, gcr, z, pitch, height, max_rows) else: fz_sky = np.zeros((npoints, len(rotation))) for k, r in enumerate(rotation): - vf = vf_ground_sky_2d(z, r, gcr, pitch, height, max_rows) + vf = vf_ground_sky_2d(r, gcr, z, pitch, height, max_rows) fz_sky[:, k] = vf[:, 0] # remove spurious rotation dimension # calculate the integrated view factor for all of the ground between rows return np.trapz(fz_sky, z, axis=0) -def _vf_poly(x, gcr, surface_tilt, delta): +def _vf_poly(surface_tilt, gcr, x, delta): r''' A term common to many 2D view factor calculations Parameters ---------- - x : numeric - Position on the row's slant length, as a fraction of the slant length. - x=0 corresponds to the bottom of the row. [unitless] - gcr : numeric - Ratio of the row slant length to the row spacing (pitch). [unitless] surface_tilt : numeric Surface tilt angle in degrees from horizontal, e.g., surface facing up = 0, surface facing horizon = 90. [degree] + gcr : numeric + Ratio of the row slant length to the row spacing (pitch). [unitless] + x : numeric + Position on the row's slant length, as a fraction of the slant length. + x=0 corresponds to the bottom of the row. [unitless] delta : -1 or +1 A sign indicator for the linear term of the polynomial @@ -254,7 +249,7 @@ def _vf_poly(x, gcr, surface_tilt, delta): return np.sqrt(a*a + 2*delta*a*c*x + x*x) -def vf_row_sky_2d(x, gcr, surface_tilt): +def vf_row_sky_2d(surface_tilt, gcr, x): r''' Calculate the view factor to the sky from a point x on a row surface. @@ -264,14 +259,14 @@ def vf_row_sky_2d(x, gcr, surface_tilt): Parameters ---------- - x : numeric - Position on the row's slant length, as a fraction of the slant length. - x=0 corresponds to the bottom of the row. [unitless] - gcr : numeric - Ratio of the row slant length to the row spacing (pitch). [unitless] surface_tilt : numeric Surface tilt angle in degrees from horizontal, e.g., surface facing up = 0, surface facing horizon = 90. [degree] + gcr : numeric + Ratio of the row slant length to the row spacing (pitch). [unitless] + x : numeric + Position on the row's slant length, as a fraction of the slant length. + x=0 corresponds to the bottom of the row. [unitless] Returns ------- @@ -279,11 +274,11 @@ def vf_row_sky_2d(x, gcr, surface_tilt): Fraction of the sky dome visible from the point x. [unitless] ''' - p = _vf_poly(1 - x, gcr, surface_tilt, -1) + p = _vf_poly(surface_tilt, gcr, 1 - x, -1) return 0.5*(1 + (1/gcr * cosd(surface_tilt) - (1 - x)) / p) -def vf_row_sky_2d_integ(x0, x1, gcr, surface_tilt): +def vf_row_sky_2d_integ(surface_tilt, gcr, x0, x1): r''' Calculate the average view factor to the sky from a segment of the row surface between x0 and x1. @@ -294,6 +289,11 @@ def vf_row_sky_2d_integ(x0, x1, gcr, surface_tilt): Parameters ---------- + surface_tilt : numeric + Surface tilt angle in degrees from horizontal, e.g., surface facing up + = 0, surface facing horizon = 90. [degree] + gcr : numeric + Ratio of the row slant length to the row spacing (pitch). [unitless] x0 : numeric Position on the row's slant length, as a fraction of the slant length. x0=0 corresponds to the bottom of the row. x0 should be less than x1. @@ -301,11 +301,6 @@ def vf_row_sky_2d_integ(x0, x1, gcr, surface_tilt): x1 : numeric Position on the row's slant length, as a fraction of the slant length. x1 should be greater than x0. [unitless] - gcr : numeric - Ratio of the row slant length to the row spacing (pitch). [unitless] - surface_tilt : numeric - Surface tilt angle in degrees from horizontal, e.g., surface facing up - = 0, surface facing horizon = 90. [degree] Returns ------- @@ -315,17 +310,17 @@ def vf_row_sky_2d_integ(x0, x1, gcr, surface_tilt): ''' u = np.abs(x1 - x0) - p0 = _vf_poly(1 - x0, gcr, surface_tilt, -1) - p1 = _vf_poly(1 - x1, gcr, surface_tilt, -1) + p0 = _vf_poly(surface_tilt, gcr, 1 - x0, -1) + p1 = _vf_poly(surface_tilt, gcr, 1 - x1, -1) with np.errstate(divide='ignore'): result = np.where(u < 1e-6, - vf_row_sky_2d(x0, gcr, surface_tilt), + vf_row_sky_2d(surface_tilt, gcr, x0), 0.5*(1 + 1/u * (p1 - p0)) ) return result -def vf_row_ground_2d(x, gcr, surface_tilt): +def vf_row_ground_2d(surface_tilt, gcr, x): r''' Calculate the view factor to the ground from a point x on a row surface. @@ -335,26 +330,26 @@ def vf_row_ground_2d(x, gcr, surface_tilt): Parameters ---------- - x : numeric - Position on the row's slant length, as a fraction of the slant length. - x=0 corresponds to the bottom of the row. [unitless] - gcr : numeric - Ratio of the row slant length to the row spacing (pitch). [unitless] surface_tilt : numeric Surface tilt angle in degrees from horizontal, e.g., surface facing up = 0, surface facing horizon = 90. [degree] + gcr : numeric + Ratio of the row slant length to the row spacing (pitch). [unitless] + x : numeric + Position on the row's slant length, as a fraction of the slant length. + x=0 corresponds to the bottom of the row. [unitless] Returns ------- vf : numeric - Fraction of the sky dome visible from the point x. [unitless] + View factor to the visible ground from the point x. [unitless] ''' - p = _vf_poly(x, gcr, surface_tilt, 1) + p = _vf_poly(surface_tilt, gcr, x, 1) return 0.5 * (1 - (1/gcr * cosd(surface_tilt) + x)/p) -def vf_row_ground_2d_integ(x0, x1, gcr, surface_tilt): +def vf_row_ground_2d_integ(surface_tilt, gcr, x0, x1): r''' Calculate the average view factor to the ground from a segment of the row surface between x0 and x1. @@ -365,6 +360,11 @@ def vf_row_ground_2d_integ(x0, x1, gcr, surface_tilt): Parameters ---------- + surface_tilt : numeric + Surface tilt angle in degrees from horizontal, e.g., surface facing up + = 0, surface facing horizon = 90. [degree] + gcr : numeric + Ratio of the row slant length to the row spacing (pitch). [unitless] x0 : numeric Position on the row's slant length, as a fraction of the slant length. x0=0 corresponds to the bottom of the row. x0 should be less than x1. @@ -372,11 +372,6 @@ def vf_row_ground_2d_integ(x0, x1, gcr, surface_tilt): x1 : numeric Position on the row's slant length, as a fraction of the slant length. x1 should be greater than x0. [unitless] - gcr : numeric - Ratio of the row slant length to the row spacing (pitch). [unitless] - surface_tilt : numeric - Surface tilt angle in degrees from horizontal, e.g., surface facing up - = 0, surface facing horizon = 90. [degree] Returns ------- @@ -385,11 +380,11 @@ def vf_row_ground_2d_integ(x0, x1, gcr, surface_tilt): ''' u = np.abs(x1 - x0) - p0 = _vf_poly(x0, gcr, surface_tilt, 1) - p1 = _vf_poly(x1, gcr, surface_tilt, 1) + p0 = _vf_poly(surface_tilt, gcr, x0, 1) + p1 = _vf_poly(surface_tilt, gcr, x1, 1) with np.errstate(divide='ignore'): result = np.where(u < 1e-6, - vf_row_ground_2d(x0, gcr, surface_tilt), + vf_row_ground_2d(surface_tilt, gcr, x0), 0.5*(1 - 1/u * (p1 - p0)) ) return result diff --git a/pvlib/shading.py b/pvlib/shading.py index e8d00bca89..88eb6824a8 100644 --- a/pvlib/shading.py +++ b/pvlib/shading.py @@ -8,7 +8,7 @@ from pvlib.tools import sind, cosd -def ground_angle(x, surface_tilt, gcr): +def ground_angle(surface_tilt, gcr, slant_height): """ Angle from horizontal of the line from a point x on the row slant length to the bottom of the facing row. @@ -18,15 +18,15 @@ def ground_angle(x, surface_tilt, gcr): Parameters ---------- - x : numeric - fraction of row slant length from bottom, ``x = 0`` is at the row - bottom, ``x = 1`` is at the top of the row. surface_tilt : numeric Surface tilt angle in degrees from horizontal, e.g., surface facing up = 0, surface facing horizon = 90. [degree] gcr : float ground coverage ratio, ratio of row slant length to row spacing. [unitless] + slant_height : numeric + The distance up the module's slant height to evaluate the masking + angle, as a fraction [0-1] of the module slant height [unitless]. Returns ------- @@ -43,9 +43,9 @@ def ground_angle(x, surface_tilt, gcr): # : \ v *-.\ # : \<-----P---->\ - x1 = gcr * x * sind(surface_tilt) - x2 = gcr * x * cosd(surface_tilt) + 1 - psi = np.arctan2(x1, x2) # do this first because it handles 0 / 0 + x1 = gcr * slant_height * sind(surface_tilt) + x2 = gcr * slant_height * cosd(surface_tilt) + 1 + psi = np.arctan2(x1, x2) # do this before rad2deg because it handles 0 / 0 return np.rad2deg(psi) diff --git a/pvlib/tests/bifacial/test_utils.py b/pvlib/tests/bifacial/test_utils.py index a1a36787a0..8d067c2b03 100644 --- a/pvlib/tests/bifacial/test_utils.py +++ b/pvlib/tests/bifacial/test_utils.py @@ -81,11 +81,11 @@ def test__unshaded_ground_fraction( def test__vf_ground_sky_2d(test_system_fixed_tilt): # vector input ts, pts, vfs_gnd_sky = test_system_fixed_tilt - vfs = utils.vf_ground_sky_2d(pts, ts['rotation'], ts['gcr'], + vfs = utils.vf_ground_sky_2d(ts['rotation'], ts['gcr'], pts, ts['pitch'], ts['height'], max_rows=1) assert np.allclose(vfs, vfs_gnd_sky, rtol=0.1) # middle point vf is off # test with singleton x - vf = utils.vf_ground_sky_2d(pts[0], ts['rotation'], ts['gcr'], + vf = utils.vf_ground_sky_2d(ts['rotation'], ts['gcr'], pts[0], ts['pitch'], ts['height'], max_rows=1) assert np.isclose(vf, vfs_gnd_sky[0]) @@ -97,8 +97,7 @@ def test_vf_ground_sky_2d_integ(test_system_fixed_tilt, vectorize): # the fixture test_system, which means the ground-to-sky view factor # isn't summed over enough rows for symmetry to hold. vf_integ = utils.vf_ground_sky_2d_integ( - ts['rotation'], ts['surface_azimuth'], - ts['gcr'], ts['height'], ts['pitch'], + ts['rotation'], ts['gcr'], ts['height'], ts['pitch'], max_rows=1, npoints=3, vectorize=vectorize) expected_vf_integ = np.trapz(vfs_gnd_sky, pts, axis=0) assert np.isclose(vf_integ, expected_vf_integ, rtol=0.1) @@ -107,12 +106,12 @@ def test_vf_ground_sky_2d_integ(test_system_fixed_tilt, vectorize): def test_vf_row_sky_2d(test_system_fixed_tilt): ts, _, _ = test_system_fixed_tilt # with float input, fx at top of row - vf = utils.vf_row_sky_2d(1., ts['gcr'], ts['surface_tilt']) + vf = utils.vf_row_sky_2d(ts['surface_tilt'], ts['gcr'], 1.) expected = 0.5 * (1 + cosd(ts['surface_tilt'])) assert np.isclose(vf, expected) # with array input fx = np.array([0., 0.5, 1.]) - vf = utils.vf_row_sky_2d(fx, ts['gcr'], ts['surface_tilt']) + vf = utils.vf_row_sky_2d(ts['surface_tilt'], ts['gcr'], fx) phi = masking_angle(ts['surface_tilt'], ts['gcr'], fx) expected = 0.5 * (1 + cosd(ts['surface_tilt'] + phi)) assert np.allclose(vf, expected) @@ -121,14 +120,13 @@ def test_vf_row_sky_2d(test_system_fixed_tilt): def test_vf_row_sky_2d_integ(test_system_fixed_tilt): ts, _, _ = test_system_fixed_tilt # with float input, check end position - vf = utils.vf_row_sky_2d_integ(1., 1., ts['gcr'], ts['surface_tilt']) - expected = utils.vf_row_sky_2d(1., ts['gcr'], ts['surface_tilt']) + vf = utils.vf_row_sky_2d_integ(ts['surface_tilt'], ts['gcr'], 1., 1.) + expected = utils.vf_row_sky_2d(ts['surface_tilt'], ts['gcr'], 1.) assert np.isclose(vf, expected) # with array input fx0 = np.array([0., 0.5]) fx1 = np.array([0., 0.8]) - vf = utils.vf_row_sky_2d_integ(fx0, fx1, ts['gcr'], - ts['surface_tilt']) + vf = utils.vf_row_sky_2d_integ(ts['surface_tilt'], ts['gcr'], fx0, fx1) phi = masking_angle(ts['surface_tilt'], ts['gcr'], fx0[0]) y0 = 0.5 * (1 + cosd(ts['surface_tilt'] + phi)) x = np.arange(fx0[1], fx1[1], 1e-4) @@ -142,13 +140,13 @@ def test_vf_row_sky_2d_integ(test_system_fixed_tilt): def test_vf_row_ground_2d(test_system_fixed_tilt): ts, _, _ = test_system_fixed_tilt # with float input, fx at bottom of row - vf = utils.vf_row_ground_2d(0., ts['gcr'], ts['surface_tilt']) + vf = utils.vf_row_ground_2d(ts['surface_tilt'], ts['gcr'], 0.) expected = 0.5 * (1. - cosd(ts['surface_tilt'])) assert np.isclose(vf, expected) # with array input fx = np.array([0., 0.5, 1.0]) - vf = utils.vf_row_ground_2d(fx, ts['gcr'], ts['surface_tilt']) - phi = ground_angle(fx, ts['surface_tilt'], ts['gcr']) + vf = utils.vf_row_ground_2d(ts['surface_tilt'], ts['gcr'], fx) + phi = ground_angle(ts['surface_tilt'], ts['gcr'], fx) expected = 0.5 * (1 - cosd(phi - ts['surface_tilt'])) assert np.allclose(vf, expected) @@ -156,18 +154,17 @@ def test_vf_row_ground_2d(test_system_fixed_tilt): def test_vf_ground_2d_integ(test_system_fixed_tilt): ts, _, _ = test_system_fixed_tilt # with float input, check end position - vf = utils.vf_row_ground_2d_integ(0., 0., ts['gcr'], ts['surface_tilt']) - expected = utils.vf_row_ground_2d(0., ts['gcr'], ts['surface_tilt']) + vf = utils.vf_row_ground_2d_integ(ts['surface_tilt'], ts['gcr'], 0., 0.) + expected = utils.vf_row_ground_2d(ts['surface_tilt'], ts['gcr'], 0.) assert np.isclose(vf, expected) # with array input fx0 = np.array([0., 0.5]) fx1 = np.array([0., 0.8]) - vf = utils.vf_row_ground_2d_integ(fx0, fx1, ts['gcr'], - ts['surface_tilt']) - phi = ground_angle(fx0[0], ts['surface_tilt'], ts['gcr']) + vf = utils.vf_row_ground_2d_integ(ts['surface_tilt'], ts['gcr'], fx0, fx1) + phi = ground_angle(ts['surface_tilt'], ts['gcr'], fx0[0]) y0 = 0.5 * (1 - cosd(phi - ts['surface_tilt'])) x = np.arange(fx0[1], fx1[1], 1e-4) - phi_y = ground_angle(x, ts['surface_tilt'], ts['gcr']) + phi_y = ground_angle(ts['surface_tilt'], ts['gcr'], x) y = 0.5 * (1 - cosd(phi_y - ts['surface_tilt'])) y1 = np.trapz(y, x) / (fx1[1] - fx0[1]) expected = np.array([y0, y1]) diff --git a/pvlib/tests/test_shading.py b/pvlib/tests/test_shading.py index dfbb9c979b..b7981cd02d 100644 --- a/pvlib/tests/test_shading.py +++ b/pvlib/tests/test_shading.py @@ -22,7 +22,7 @@ def test__ground_angle(test_system): ts = test_system x = np.array([0., 0.5, 1.0]) angles = shading.ground_angle( - x, ts['surface_tilt'], ts['gcr']) + ts['surface_tilt'], ts['gcr'], x) expected_angles = np.array([0., 5.866738789543952, 9.896090638982903]) assert np.allclose(angles, expected_angles) @@ -30,7 +30,7 @@ def test__ground_angle(test_system): def test__ground_angle_zero_gcr(): surface_tilt = 30.0 x = np.array([0.0, 0.5, 1.0]) - angles = shading.ground_angle(x, surface_tilt, 0) + angles = shading.ground_angle(surface_tilt, 0, x) expected_angles = np.array([0, 0, 0]) assert np.allclose(angles, expected_angles) From fbf3d9373ed0d02ab1d3bbed8a165c18cfe8b6b3 Mon Sep 17 00:00:00 2001 From: Cliff Hansen Date: Tue, 16 May 2023 10:00:05 -0600 Subject: [PATCH 18/20] docstring edits --- pvlib/shading.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pvlib/shading.py b/pvlib/shading.py index 88eb6824a8..1533d2a013 100644 --- a/pvlib/shading.py +++ b/pvlib/shading.py @@ -10,7 +10,7 @@ def ground_angle(surface_tilt, gcr, slant_height): """ - Angle from horizontal of the line from a point x on the row slant length + Angle from horizontal of the line from a point on the row slant length to the bottom of the facing row. The angles are clockwise from horizontal, rather than the usual @@ -25,7 +25,7 @@ def ground_angle(surface_tilt, gcr, slant_height): ground coverage ratio, ratio of row slant length to row spacing. [unitless] slant_height : numeric - The distance up the module's slant height to evaluate the masking + The distance up the module's slant height to evaluate the ground angle, as a fraction [0-1] of the module slant height [unitless]. Returns From bdb80eaf267a98b911411c1f1d99c9fde817cfd7 Mon Sep 17 00:00:00 2001 From: Cliff Hansen Date: Tue, 16 May 2023 12:47:43 -0600 Subject: [PATCH 19/20] add defaults to _integ functions --- pvlib/bifacial/utils.py | 15 ++++++++------- pvlib/tests/bifacial/test_utils.py | 14 ++++++++++++++ 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/pvlib/bifacial/utils.py b/pvlib/bifacial/utils.py index a57d02cf90..8d7f5d5a71 100644 --- a/pvlib/bifacial/utils.py +++ b/pvlib/bifacial/utils.py @@ -278,7 +278,7 @@ def vf_row_sky_2d(surface_tilt, gcr, x): return 0.5*(1 + (1/gcr * cosd(surface_tilt) - (1 - x)) / p) -def vf_row_sky_2d_integ(surface_tilt, gcr, x0, x1): +def vf_row_sky_2d_integ(surface_tilt, gcr, x0=0, x1=1): r''' Calculate the average view factor to the sky from a segment of the row surface between x0 and x1. @@ -294,11 +294,11 @@ def vf_row_sky_2d_integ(surface_tilt, gcr, x0, x1): = 0, surface facing horizon = 90. [degree] gcr : numeric Ratio of the row slant length to the row spacing (pitch). [unitless] - x0 : numeric + x0 : numeric, default 0 Position on the row's slant length, as a fraction of the slant length. x0=0 corresponds to the bottom of the row. x0 should be less than x1. [unitless] - x1 : numeric + x1 : numeric, default 1 Position on the row's slant length, as a fraction of the slant length. x1 should be greater than x0. [unitless] @@ -349,7 +349,7 @@ def vf_row_ground_2d(surface_tilt, gcr, x): return 0.5 * (1 - (1/gcr * cosd(surface_tilt) + x)/p) -def vf_row_ground_2d_integ(surface_tilt, gcr, x0, x1): +def vf_row_ground_2d_integ(surface_tilt, gcr, x0=0, x1=1): r''' Calculate the average view factor to the ground from a segment of the row surface between x0 and x1. @@ -365,18 +365,19 @@ def vf_row_ground_2d_integ(surface_tilt, gcr, x0, x1): = 0, surface facing horizon = 90. [degree] gcr : numeric Ratio of the row slant length to the row spacing (pitch). [unitless] - x0 : numeric + x0 : numeric, default 0. Position on the row's slant length, as a fraction of the slant length. x0=0 corresponds to the bottom of the row. x0 should be less than x1. [unitless] - x1 : numeric + x1 : numeric, default 1. Position on the row's slant length, as a fraction of the slant length. x1 should be greater than x0. [unitless] Returns ------- vf : numeric - Fraction of the sky dome visible from the point x. [unitless] + Integrated view factor to the visible ground on the interval (x0, x1). + [unitless] ''' u = np.abs(x1 - x0) diff --git a/pvlib/tests/bifacial/test_utils.py b/pvlib/tests/bifacial/test_utils.py index 8d067c2b03..cb49c39efa 100644 --- a/pvlib/tests/bifacial/test_utils.py +++ b/pvlib/tests/bifacial/test_utils.py @@ -135,6 +135,13 @@ def test_vf_row_sky_2d_integ(test_system_fixed_tilt): y1 = np.trapz(y, x) / (fx1[1] - fx0[1]) expected = np.array([y0, y1]) assert np.allclose(vf, expected, rtol=1e-3) + # with defaults (0, 1) + vf = utils.vf_row_sky_2d_integ(ts['surface_tilt'], ts['gcr']) + x = np.arange(0, 1, 1e-4) + phi_y = masking_angle(ts['surface_tilt'], ts['gcr'], x) + y = 0.5 * (1 + cosd(ts['surface_tilt'] + phi_y)) + y1 = np.trapz(y, x) / (1 - 0) + assert np.allclose(vf, y1, rtol=1e-3) def test_vf_row_ground_2d(test_system_fixed_tilt): @@ -169,3 +176,10 @@ def test_vf_ground_2d_integ(test_system_fixed_tilt): y1 = np.trapz(y, x) / (fx1[1] - fx0[1]) expected = np.array([y0, y1]) assert np.allclose(vf, expected, rtol=1e-2) + # with defaults (0, 1) + vf = utils.vf_row_ground_2d_integ(ts['surface_tilt'], ts['gcr'], 0, 1) + x = np.arange(0, 1, 1e-4) + phi_y = ground_angle(ts['surface_tilt'], ts['gcr'], x) + y = 0.5 * (1 - cosd(phi_y - ts['surface_tilt'])) + y1 = np.trapz(y, x) / (1 - 0) + assert np.allclose(vf, y1, rtol=1e-2) From b6996e519e28a58ee1b026b19a90fa24e9318972 Mon Sep 17 00:00:00 2001 From: Kevin Anderson Date: Fri, 23 Jun 2023 16:21:56 -0400 Subject: [PATCH 20/20] fix whatsnew formatting issues --- docs/sphinx/source/whatsnew/v0.9.6.rst | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/sphinx/source/whatsnew/v0.9.6.rst b/docs/sphinx/source/whatsnew/v0.9.6.rst index a2065a4136..dc8e8d0701 100644 --- a/docs/sphinx/source/whatsnew/v0.9.6.rst +++ b/docs/sphinx/source/whatsnew/v0.9.6.rst @@ -54,12 +54,12 @@ Enhancements ~~~~~~~~~~~~ * Exposes several functions useful for bifacial and shading calculations (:pull:`1666`): - * :py:func:`pvlib.bifacial.utils.bifacial.utils.vf_row_sky_2d1 - * :py:func:`pvlib.bifacial.utils.vf_row_sky_2d_integ - * :py:func:`pvlib.bifacial.utils.vf_row_ground_2d - * :py:func:`pvlib.bifacial.utils.vf_row_ground_2d_integ - * :py:func:`pvlib.bifacial.utils.vf_ground_sky_2d - * :py:func:`pvlib.bifacial.utils.vf_ground_sky_2d_integ + * :py:func:`pvlib.bifacial.utils.vf_row_sky_2d` + * :py:func:`pvlib.bifacial.utils.vf_row_sky_2d_integ` + * :py:func:`pvlib.bifacial.utils.vf_row_ground_2d` + * :py:func:`pvlib.bifacial.utils.vf_row_ground_2d_integ` + * :py:func:`pvlib.bifacial.utils.vf_ground_sky_2d` + * :py:func:`pvlib.bifacial.utils.vf_ground_sky_2d_integ` * :py:func:`pvlib.shading.ground_angle` * Added a function :py:func:`pvlib.spectrum.spectral_factor_caballero`