From 6860548ecbe47d66ac4482bb7d8517e0b4d75c67 Mon Sep 17 00:00:00 2001 From: Cliff Hansen Date: Mon, 18 Jan 2021 15:21:42 -0700 Subject: [PATCH 1/9] add pvwatts_multi methods --- pvlib/modelchain.py | 8 ++++++++ pvlib/pvsystem.py | 15 +++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/pvlib/modelchain.py b/pvlib/modelchain.py index 4c67e835f4..9ad66231fe 100644 --- a/pvlib/modelchain.py +++ b/pvlib/modelchain.py @@ -793,6 +793,8 @@ def infer_ac_model(self): def _infer_ac_model_multi(self, inverter_params): if _snl_params(inverter_params): return self.sandia_multi_inverter + elif _pvwatts_params(inverter_params): + return self.pvwatts_multi_inverter raise ValueError('could not infer multi-array AC model from ' 'system.inverter_parameters. Not all ac models ' 'support systems with mutiple Arrays. ' @@ -807,6 +809,12 @@ def sandia_multi_inverter(self): ) return self + def pvwatts_multi_inverter(self): + self.results.ac = self.system.pvwatts_multi( + _tuple_from_dfs(self.results.dc, 'p_mp') + ) + return self + def snlinverter(self): self.results.ac = self.system.snlinverter(self.results.dc['v_mp'], self.results.dc['p_mp']) diff --git a/pvlib/pvsystem.py b/pvlib/pvsystem.py index 819d00c703..651c9eba4b 100644 --- a/pvlib/pvsystem.py +++ b/pvlib/pvsystem.py @@ -1000,6 +1000,21 @@ def pvwatts_ac(self, pdc): return inverter.pvwatts(pdc, self.inverter_parameters['pdc0'], **kwargs) + def pvwatts_multi(self, p_dc): + """Uses :py:func:`pvlib.inverter.pvwatts_multi` to calculate AC power + based on ``self.inverter_parameters`` and the input voltage and power. + + The parameter `p_dc` must be a tuple with length equal to + ``self.num_arrays`` if the system has more than one array. + + See :py:func:`pvlib.inverter.pvwatts_multi` for details. + """ + p_dc = self._validate_per_array(p_dc) + kwargs = _build_kwargs(['eta_inv_nom', 'eta_inv_ref'], + self.inverter_parameters) + return inverter.pvwatts_multi(p_dc, self.inverter_parameters['pdc0'], + **kwargs) + @deprecated('0.8', alternative='PVSystem, Location, and ModelChain', name='PVSystem.localize', removal='0.9') def localize(self, location=None, latitude=None, longitude=None, From 9c0121cd2c26fdf0988718d27d0b14a7d8af3f34 Mon Sep 17 00:00:00 2001 From: Cliff Hansen Date: Mon, 18 Jan 2021 15:33:04 -0700 Subject: [PATCH 2/9] make pvwatts_system fixtures --- pvlib/tests/test_pvsystem.py | 72 +++++++++++++++++++++++------------- 1 file changed, 46 insertions(+), 26 deletions(-) diff --git a/pvlib/tests/test_pvsystem.py b/pvlib/tests/test_pvsystem.py index cf9305f5ce..47d6367778 100644 --- a/pvlib/tests/test_pvsystem.py +++ b/pvlib/tests/test_pvsystem.py @@ -1884,7 +1884,8 @@ def test_pvwatts_losses_series(): assert_series_equal(expected, out) -def make_pvwatts_system_defaults(): +@pytest.fixture +def pvwatts_system_defaults(): module_parameters = {'pdc0': 100, 'gamma_pdc': -0.003} inverter_parameters = {'pdc0': 90} system = pvsystem.PVSystem(module_parameters=module_parameters, @@ -1892,7 +1893,8 @@ def make_pvwatts_system_defaults(): return system -def make_pvwatts_system_kwargs(): +@pytest.fixture +def pvwatts_system_kwargs(): module_parameters = {'pdc0': 100, 'gamma_pdc': -0.003, 'temp_ref': 20} inverter_parameters = {'pdc0': 90, 'eta_inv_nom': 0.95, 'eta_inv_ref': 1.0} system = pvsystem.PVSystem(module_parameters=module_parameters, @@ -1900,27 +1902,25 @@ def make_pvwatts_system_kwargs(): return system -def test_PVSystem_pvwatts_dc(mocker): +def test_PVSystem_pvwatts_dc(pvwatts_system_defaults, mocker): mocker.spy(pvsystem, 'pvwatts_dc') - system = make_pvwatts_system_defaults() irrad = 900 temp_cell = 30 expected = 90 - out = system.pvwatts_dc(irrad, temp_cell) - pvsystem.pvwatts_dc.assert_called_once_with(irrad, temp_cell, - **system.module_parameters) + out = pvwatts_system_defaults.pvwatts_dc(irrad, temp_cell) + pvsystem.pvwatts_dc.assert_called_once_with( + irrad, temp_cell, **pvwatts_system_defaults.module_parameters) assert_allclose(expected, out, atol=10) -def test_PVSystem_pvwatts_dc_kwargs(mocker): +def test_PVSystem_pvwatts_dc_kwargs(pvwatts_system_kwargs, mocker): mocker.spy(pvsystem, 'pvwatts_dc') - system = make_pvwatts_system_kwargs() irrad = 900 temp_cell = 30 expected = 90 - out = system.pvwatts_dc(irrad, temp_cell) - pvsystem.pvwatts_dc.assert_called_once_with(irrad, temp_cell, - **system.module_parameters) + out = pvwatts_system_kwargs.pvwatts_dc(irrad, temp_cell) + pvsystem.pvwatts_dc.assert_called_once_with( + irrad, temp_cell, **pvwatts_system_kwargs.module_parameters) assert_allclose(expected, out, atol=10) @@ -1977,37 +1977,57 @@ def test_PVSystem_multiple_array_pvwatts_dc_value_error(): # ValueError is raised for non-tuple iterable with correct length system.pvwatts_dc((1, 1, 1), pd.Series([1, 2, 3])) -def test_PVSystem_pvwatts_losses(mocker): + +def test_PVSystem_pvwatts_losses(pvwatts_system_defaults, mocker): mocker.spy(pvsystem, 'pvwatts_losses') - system = make_pvwatts_system_defaults() age = 1 - system.losses_parameters = dict(age=age) + pvwatts_system_defaults.losses_parameters = dict(age=age) expected = 15 - out = system.pvwatts_losses() + out = pvwatts_system_defaults.pvwatts_losses() pvsystem.pvwatts_losses.assert_called_once_with(age=age) assert out < expected -def test_PVSystem_pvwatts_ac(mocker): +def test_PVSystem_pvwatts_ac(pvwatts_system_defaults, mocker): mocker.spy(inverter, 'pvwatts') - system = make_pvwatts_system_defaults() pdc = 50 - out = system.pvwatts_ac(pdc) - inverter.pvwatts.assert_called_once_with(pdc, - **system.inverter_parameters) + out = pvwatts_system_defaults.pvwatts_ac(pdc) + inverter.pvwatts.assert_called_once_with( + pdc, **pvwatts_system_defaults.inverter_parameters) assert out < pdc -def test_PVSystem_pvwatts_ac_kwargs(mocker): +def test_PVSystem_pvwatts_ac_kwargs(pvwatts_system_kwargs, mocker): mocker.spy(inverter, 'pvwatts') - system = make_pvwatts_system_kwargs() pdc = 50 - out = system.pvwatts_ac(pdc) - inverter.pvwatts.assert_called_once_with(pdc, - **system.inverter_parameters) + out = pvwatts_system_kwargs.pvwatts_ac(pdc) + inverter.pvwatts.assert_called_once_with( + pdc, **pvwatts_system_kwargs.inverter_parameters) assert out < pdc +def test_PVSystem_pvwatts_multi(cec_inverter_parameters): + system = pvsystem.PVSystem( + arrays=[pvsystem.Array(), pvsystem.Array()], + inverter=cec_inverter_parameters['Name'], + inverter_parameters=cec_inverter_parameters, + ) + vdcs = pd.Series(np.linspace(0, 50, 3)) + idcs = pd.Series(np.linspace(0, 11, 3)) / 2 + pdcs = idcs * vdcs + pacs = system.sandia_multi((vdcs, vdcs), (pdcs, pdcs)) + assert_series_equal(pacs, pd.Series([-0.020000, 132.004308, 250.000000])) + with pytest.raises(ValueError, + match="Length mismatch for per-array parameter"): + system.sandia_multi(vdcs, (pdcs, pdcs)) + with pytest.raises(ValueError, + match="Length mismatch for per-array parameter"): + system.sandia_multi(vdcs, (pdcs,)) + with pytest.raises(ValueError, + match="Length mismatch for per-array parameter"): + system.sandia_multi((vdcs, vdcs), (pdcs, pdcs, pdcs)) + + def test_PVSystem_num_arrays(): system_one = pvsystem.PVSystem() system_two = pvsystem.PVSystem(arrays=[pvsystem.Array(), pvsystem.Array()]) From b2e0d67a438051444e4a1b24e319fb41bfd7712d Mon Sep 17 00:00:00 2001 From: Cliff Hansen Date: Mon, 18 Jan 2021 15:47:38 -0700 Subject: [PATCH 3/9] add tests for pvwatts_multi methods --- pvlib/tests/test_modelchain.py | 9 ++++++--- pvlib/tests/test_pvsystem.py | 22 +++++++++++----------- 2 files changed, 17 insertions(+), 14 deletions(-) diff --git a/pvlib/tests/test_modelchain.py b/pvlib/tests/test_modelchain.py index 2987ae563f..635ebb9ab8 100644 --- a/pvlib/tests/test_modelchain.py +++ b/pvlib/tests/test_modelchain.py @@ -1171,18 +1171,21 @@ def acdc(mc): @pytest.mark.parametrize('ac_model', ['sandia', 'adr', - 'pvwatts', 'sandia_multi']) + 'pvwatts', 'sandia_multi', + 'pvwatts_multi']) def test_ac_models(sapm_dc_snl_ac_system, cec_dc_adr_ac_system, pvwatts_dc_pvwatts_ac_system, location, ac_model, weather, mocker): ac_systems = {'sandia': sapm_dc_snl_ac_system, 'sandia_multi': sapm_dc_snl_ac_system, 'adr': cec_dc_adr_ac_system, - 'pvwatts': pvwatts_dc_pvwatts_ac_system} + 'pvwatts': pvwatts_dc_pvwatts_ac_system, + 'pvwatts_multi': pvwatts_dc_pvwatts_ac_system} ac_method_name = {'sandia': 'snlinverter', 'sandia_multi': 'sandia_multi', 'adr': 'adrinverter', - 'pvwatts': 'pvwatts_ac'} + 'pvwatts': 'pvwatts_ac', + 'pvwatts_multi': 'pvwatts_multi'} system = ac_systems[ac_model] mc = ModelChain(system, location, ac_model=ac_model, diff --git a/pvlib/tests/test_pvsystem.py b/pvlib/tests/test_pvsystem.py index 47d6367778..16e7ecfb07 100644 --- a/pvlib/tests/test_pvsystem.py +++ b/pvlib/tests/test_pvsystem.py @@ -2006,26 +2006,26 @@ def test_PVSystem_pvwatts_ac_kwargs(pvwatts_system_kwargs, mocker): assert out < pdc -def test_PVSystem_pvwatts_multi(cec_inverter_parameters): +@pytest.mark.parametrize( + 'pvwatts_system', [(pvwatts_system_defaults,), (pvwatts_system_kwargs,)] +) +def test_PVSystem_pvwatts_multi(pvwatts_system): system = pvsystem.PVSystem( arrays=[pvsystem.Array(), pvsystem.Array()], - inverter=cec_inverter_parameters['Name'], - inverter_parameters=cec_inverter_parameters, + inverter_parameters=pvwatts_system.inverter_parameters, ) - vdcs = pd.Series(np.linspace(0, 50, 3)) - idcs = pd.Series(np.linspace(0, 11, 3)) / 2 - pdcs = idcs * vdcs - pacs = system.sandia_multi((vdcs, vdcs), (pdcs, pdcs)) - assert_series_equal(pacs, pd.Series([-0.020000, 132.004308, 250.000000])) + pdcs = pd.Series([0., 50., 100.]) + pacs = system.pvwatts_multi((pdcs, pdcs)) + assert_series_equal(pacs, pd.Series([0.0, 48.123524, 86.400000])) with pytest.raises(ValueError, match="Length mismatch for per-array parameter"): - system.sandia_multi(vdcs, (pdcs, pdcs)) + system.sandia_multi((pdcs,)) with pytest.raises(ValueError, match="Length mismatch for per-array parameter"): - system.sandia_multi(vdcs, (pdcs,)) + system.sandia_multi(pdcs) with pytest.raises(ValueError, match="Length mismatch for per-array parameter"): - system.sandia_multi((vdcs, vdcs), (pdcs, pdcs, pdcs)) + system.sandia_multi((pdcs, pdcs, pdcs)) def test_PVSystem_num_arrays(): From 9ba03eb66ae8060ea0628210d9e8ba5d00e31535 Mon Sep 17 00:00:00 2001 From: Cliff Hansen Date: Mon, 18 Jan 2021 16:02:29 -0700 Subject: [PATCH 4/9] fix up pvsystem test --- pvlib/tests/test_pvsystem.py | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/pvlib/tests/test_pvsystem.py b/pvlib/tests/test_pvsystem.py index 16e7ecfb07..dfc62df8db 100644 --- a/pvlib/tests/test_pvsystem.py +++ b/pvlib/tests/test_pvsystem.py @@ -2006,26 +2006,28 @@ def test_PVSystem_pvwatts_ac_kwargs(pvwatts_system_kwargs, mocker): assert out < pdc -@pytest.mark.parametrize( - 'pvwatts_system', [(pvwatts_system_defaults,), (pvwatts_system_kwargs,)] -) -def test_PVSystem_pvwatts_multi(pvwatts_system): - system = pvsystem.PVSystem( - arrays=[pvsystem.Array(), pvsystem.Array()], - inverter_parameters=pvwatts_system.inverter_parameters, - ) - pdcs = pd.Series([0., 50., 100.]) - pacs = system.pvwatts_multi((pdcs, pdcs)) - assert_series_equal(pacs, pd.Series([0.0, 48.123524, 86.400000])) +def test_PVSystem_pvwatts_multi(pvwatts_system_defaults, + pvwatts_system_kwargs): + expected = [pd.Series([0.0, 48.123524, 86.400000]), + pd.Series([0.0, 45.893550, 85.500000])] + systems = [pvwatts_system_defaults, pvwatts_system_kwargs] + for base_sys, exp in zip(systems, expected): + system = pvsystem.PVSystem( + arrays=[pvsystem.Array(), pvsystem.Array()], + inverter_parameters=base_sys.inverter_parameters, + ) + pdcs = pd.Series([0., 25., 50.]) + pacs = system.pvwatts_multi((pdcs, pdcs)) + assert_series_equal(pacs, exp) with pytest.raises(ValueError, match="Length mismatch for per-array parameter"): - system.sandia_multi((pdcs,)) + system.pvwatts_multi((pdcs,)) with pytest.raises(ValueError, match="Length mismatch for per-array parameter"): - system.sandia_multi(pdcs) + system.pvwatts_multi(pdcs) with pytest.raises(ValueError, match="Length mismatch for per-array parameter"): - system.sandia_multi((pdcs, pdcs, pdcs)) + system.pvwatts_multi((pdcs, pdcs, pdcs)) def test_PVSystem_num_arrays(): From 6380ea5b6850ad0b480835c39cbb2b7fdd4271c9 Mon Sep 17 00:00:00 2001 From: Cliff Hansen Date: Tue, 19 Jan 2021 09:56:36 -0700 Subject: [PATCH 5/9] fixes from failed tests --- pvlib/inverter.py | 2 +- pvlib/modelchain.py | 7 ++++--- pvlib/tests/test_modelchain.py | 7 +++---- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/pvlib/inverter.py b/pvlib/inverter.py index 3c2fca9123..a192f5e1c2 100644 --- a/pvlib/inverter.py +++ b/pvlib/inverter.py @@ -414,7 +414,7 @@ def pvwatts_multi(pdc, pdc0, eta_inv_nom=0.96, eta_inv_ref=0.9637): DC power on each MPPT input of the inverter. If type is array, must be 2d with axis 0 being the MPPT inputs. Same unit as ``pdc0``. pdc0: numeric - DC input limit of the inverter. Same unit as ``pdc``. + Total DC power limit of the inverter. Same unit as ``pdc``. eta_inv_nom: numeric, default 0.96 Nominal inverter efficiency. [unitless] eta_inv_ref: numeric, default 0.9637 diff --git a/pvlib/modelchain.py b/pvlib/modelchain.py index 9ad66231fe..88dbb838c6 100644 --- a/pvlib/modelchain.py +++ b/pvlib/modelchain.py @@ -769,6 +769,8 @@ def ac_model(self, model): self._ac_model = self.adrinverter elif model == 'pvwatts': self._ac_model = self.pvwatts_inverter + elif model == 'pvwatts_multi': + self._ac_model = self.pvwatts_multi_inverter else: raise ValueError(model + ' is not a valid AC power model') else: @@ -796,9 +798,8 @@ def _infer_ac_model_multi(self, inverter_params): elif _pvwatts_params(inverter_params): return self.pvwatts_multi_inverter raise ValueError('could not infer multi-array AC model from ' - 'system.inverter_parameters. Not all ac models ' - 'support systems with mutiple Arrays. ' - 'Only sandia_multi supports multiple ' + 'system.inverter_parameters. Only sandia and pvwatts ' + 'inverter models support multiple ' 'Arrays. Check system.inverter_parameters or ' 'explicitly set the model with the ac_model kwarg.') diff --git a/pvlib/tests/test_modelchain.py b/pvlib/tests/test_modelchain.py index 635ebb9ab8..a77858fadf 100644 --- a/pvlib/tests/test_modelchain.py +++ b/pvlib/tests/test_modelchain.py @@ -452,16 +452,15 @@ def test_run_model_from_irradiance_arrays_no_loss_input_type( ) -@pytest.mark.parametrize('inverter', ['adr', 'pvwatts']) +@pytest.mark.parametrize('inverter', ['adr']) def test_ModelChain_invalid_inverter_params_arrays( inverter, sapm_dc_snl_ac_system_same_arrays, location, adr_inverter_parameters): - inverter_params = {'adr': adr_inverter_parameters, - 'pvwatts': {'pdc0': 220, 'eta_inv_nom': 0.95}} + inverter_params = {'adr': adr_inverter_parameters} sapm_dc_snl_ac_system_same_arrays.inverter_parameters = \ inverter_params[inverter] with pytest.raises(ValueError, - match=r'Only sandia_multi supports multiple Arrays\.'): + match=r'Only sandia and pvwatts inverter models\.'): ModelChain(sapm_dc_snl_ac_system_same_arrays, location) From 0fe4c858d3c14254b632a7021a588a55b76925a3 Mon Sep 17 00:00:00 2001 From: Cliff Hansen Date: Tue, 19 Jan 2021 11:07:58 -0700 Subject: [PATCH 6/9] pvwatts_dc produces Series --- pvlib/modelchain.py | 4 +--- pvlib/tests/test_modelchain.py | 22 +++++++++++++++++++++- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/pvlib/modelchain.py b/pvlib/modelchain.py index 88dbb838c6..2e010fa024 100644 --- a/pvlib/modelchain.py +++ b/pvlib/modelchain.py @@ -811,9 +811,7 @@ def sandia_multi_inverter(self): return self def pvwatts_multi_inverter(self): - self.results.ac = self.system.pvwatts_multi( - _tuple_from_dfs(self.results.dc, 'p_mp') - ) + self.results.ac = self.system.pvwatts_multi(self.results.dc) return self def snlinverter(self): diff --git a/pvlib/tests/test_modelchain.py b/pvlib/tests/test_modelchain.py index a77858fadf..51645e461d 100644 --- a/pvlib/tests/test_modelchain.py +++ b/pvlib/tests/test_modelchain.py @@ -166,6 +166,26 @@ def pvwatts_dc_pvwatts_ac_system(sapm_temperature_cs5p_220m): return system +@pytest.fixture(scope="function") +def pvwatts_dc_pvwatts_ac_system_arrays(sapm_temperature_cs5p_220m): + module_parameters = {'pdc0': 220, 'gamma_pdc': -0.003} + temp_model_params = sapm_temperature_cs5p_220m.copy() + inverter_parameters = {'pdc0': 220, 'eta_inv_nom': 0.95} + array_one = pvsystem.Array( + surface_tilt=32.2, surface_azimuth=180, + module_parameters=module_parameters.copy(), + temperature_model_parameters=temp_model_params.copy() + ) + array_two = pvsystem.Array( + surface_tilt=42.2, surface_azimuth=220, + module_parameters=module_parameters.copy(), + temperature_model_parameters=temp_model_params.copy() + ) + system = PVSystem( + arrays=[array_one, array_two], inverter_parameters=inverter_parameters) + return system + + @pytest.fixture(scope="function") def pvwatts_dc_pvwatts_ac_faiman_temp_system(): module_parameters = {'pdc0': 220, 'gamma_pdc': -0.003} @@ -460,7 +480,7 @@ def test_ModelChain_invalid_inverter_params_arrays( sapm_dc_snl_ac_system_same_arrays.inverter_parameters = \ inverter_params[inverter] with pytest.raises(ValueError, - match=r'Only sandia and pvwatts inverter models\.'): + match=r'Only sandia and pvwatts inverter models'): ModelChain(sapm_dc_snl_ac_system_same_arrays, location) From 430f7e5621732c704b53e0ed4fd4ac189ea13bb7 Mon Sep 17 00:00:00 2001 From: Cliff Hansen Date: Tue, 19 Jan 2021 11:34:55 -0700 Subject: [PATCH 7/9] add test to infer pvwatts_multi --- pvlib/tests/test_modelchain.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/pvlib/tests/test_modelchain.py b/pvlib/tests/test_modelchain.py index 51645e461d..851d6d5619 100644 --- a/pvlib/tests/test_modelchain.py +++ b/pvlib/tests/test_modelchain.py @@ -589,10 +589,14 @@ def test_prepare_inputs_missing_irrad_component( mc.prepare_inputs(weather) +@pytest.mark.parametrize('ac_model', ['sandia', 'pvwatts']) @pytest.mark.parametrize("input_type", [tuple, list]) -def test_run_model_arrays_weather(sapm_dc_snl_ac_system_same_arrays, location, - input_type): - mc = ModelChain(sapm_dc_snl_ac_system_same_arrays, location) +def test_run_model_arrays_weather(sapm_dc_snl_ac_system_same_arrays, + pvwatts_dc_pvwatts_ac_system_arrays, + location, ac_model, input_type): + system = {'sandia': sapm_dc_snl_ac_system_same_arrays, + 'pvwatts': pvwatts_dc_pvwatts_ac_system_arrays} + mc = ModelChain(system[ac_model], location) times = pd.date_range('20200101 1200-0700', periods=2, freq='2H') weather_one = pd.DataFrame({'dni': [900, 800], 'ghi': [600, 500], From 6ce299f3c56bee1ce05995b79212b66e6e2a3394 Mon Sep 17 00:00:00 2001 From: Cliff Hansen Date: Tue, 19 Jan 2021 11:39:33 -0700 Subject: [PATCH 8/9] handle aoi_model and spectral_model --- pvlib/tests/test_modelchain.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pvlib/tests/test_modelchain.py b/pvlib/tests/test_modelchain.py index 851d6d5619..10acc469eb 100644 --- a/pvlib/tests/test_modelchain.py +++ b/pvlib/tests/test_modelchain.py @@ -596,7 +596,8 @@ def test_run_model_arrays_weather(sapm_dc_snl_ac_system_same_arrays, location, ac_model, input_type): system = {'sandia': sapm_dc_snl_ac_system_same_arrays, 'pvwatts': pvwatts_dc_pvwatts_ac_system_arrays} - mc = ModelChain(system[ac_model], location) + mc = ModelChain(system[ac_model], location, aoi_model='no_loss', + spectral_model='no_loss') times = pd.date_range('20200101 1200-0700', periods=2, freq='2H') weather_one = pd.DataFrame({'dni': [900, 800], 'ghi': [600, 500], From a7a3e8b1557e4360343b8469194e88ceeaf3c117 Mon Sep 17 00:00:00 2001 From: Cliff Hansen Date: Tue, 19 Jan 2021 12:23:58 -0700 Subject: [PATCH 9/9] update whatsnew --- docs/sphinx/source/whatsnew/v0.9.0.rst | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/docs/sphinx/source/whatsnew/v0.9.0.rst b/docs/sphinx/source/whatsnew/v0.9.0.rst index 1094973bd5..8b323fdad8 100644 --- a/docs/sphinx/source/whatsnew/v0.9.0.rst +++ b/docs/sphinx/source/whatsnew/v0.9.0.rst @@ -42,10 +42,12 @@ Enhancements :py:class:`~pvlib.modelchain.ModelChain`. This includes substantial API enhancements for accepting different weather input for each ``Array`` in the system. (:pull:`1076`, :issue:`1067`) -* Support for :py:func:`~pvlib.inverter.sandia_multi` added to +* Support for :py:func:`~pvlib.inverter.sandia_multi` and + :py:func:`~pvlib.inverter.pvwatts_multi` added to :py:class:`~pvlib.pvsystem.PVSystem` and - :py:class:`~pvlib.modelchain.ModelChain` (as ``ac_model='sandia_multi'``). - (:pull:`1076`, :issue:`1067`) + :py:class:`~pvlib.modelchain.ModelChain` (as ``ac_model='sandia_multi'`` + and ``ac_model='pvwatts_multi'``). + (:pull:`1076`, :issue:`1067`, :pull:`1132`, :issue:`1117`) * :py:class:`~pvlib.modelchain.ModelChain` 'run_model' methods now automatically switch to using ``'effective_irradiance'`` (if available) for cell temperature models, when ``'poa_global'`` is not provided in input