From d3c1ae37fc0ed818448b91cf25e149ab424b3d67 Mon Sep 17 00:00:00 2001 From: Cliff Hansen Date: Mon, 27 Aug 2018 14:29:32 -0600 Subject: [PATCH 01/13] add consistency tests to ModelChain.dc_model --- pvlib/modelchain.py | 46 ++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 43 insertions(+), 3 deletions(-) diff --git a/pvlib/modelchain.py b/pvlib/modelchain.py index 0b6f184847..42d5b66b82 100644 --- a/pvlib/modelchain.py +++ b/pvlib/modelchain.py @@ -365,16 +365,56 @@ def dc_model(self, model): elif isinstance(model, str): model = model.lower() if model == 'sapm': - self._dc_model = self.sapm + # validate module parameters + missing_params = self._sapm_param_set() - \ + set(self.system.module.keys()) + if missing_params: # some parameters are not in module.keys() + raise ValueError('SAPM selected for the DC model but ' + \ + 'the module is missing one or more ' + \ + 'required parameters: ' + \ + str(missing_params)) + else: + self._dc_model = self.sapm elif model == 'singlediode': - self._dc_model = self.singlediode + # validate module parameters + missing_params = self._singlediode_param_set() - \ + set(self.system.module.keys()) + if missing_params: # some parameters are not in module.keys() + raise ValueError('singlediode selected for the DC ' + \ + 'model but the module is missing one ' + \ + 'or more required parameters: ' + \ + str(missing_params)) + else: + self._dc_model = self.singlediode elif model == 'pvwatts': - self._dc_model = self.pvwatts_dc + # validate module parameters + missing_params = self._pvwatts_dc_param_set() - \ + set(self.system.module.keys()) + if missing_params: # some parameters are not in module.keys() + raise ValueError('pvwatts_dc selected for the DC ' + \ + 'model but the module is missing one ' + \ + 'or more required parameters: ' + \ + str(missing_params)) + else: + self._dc_model = self.pvwatts_dc else: raise ValueError(model + ' is not a valid DC power model') else: self._dc_model = partial(model, self) + def _sapm_param_set(): + return set(['A0', 'A1', 'A2', 'A3', 'A4', 'B0', 'B1', 'B2', 'B3', 'B4', + 'B5', 'C0', 'C1', 'C2', 'C3', 'C4', 'C5', 'C6', 'C7', 'Isco', + 'Impo', 'Aisc', 'Aimp', 'Bvoco', 'Mbvoc', 'Bvmpo', 'Mbvmp', + 'N', 'Cells_in_Series', 'IX0', 'IXX0', 'FD']) + + def _singlediode_param_set(): + return set(['alpha_sc', 'a_ref', 'I_L_ref', 'I_o_ref', 'R_sh_ref', + 'R_s']) + + def _pvwatts_dc_param_set(): + return set(['pdc0', 'gamma_pdc']) + def infer_dc_model(self): params = set(self.system.module_parameters.keys()) if set(['A0', 'A1', 'C7']) <= params: From 68845551f236f0fab32b753267b3ecde427ed92e Mon Sep 17 00:00:00 2001 From: Cliff Hansen Date: Mon, 27 Aug 2018 15:14:35 -0600 Subject: [PATCH 02/13] Add self argument --- pvlib/modelchain.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pvlib/modelchain.py b/pvlib/modelchain.py index 42d5b66b82..777a41e0b9 100644 --- a/pvlib/modelchain.py +++ b/pvlib/modelchain.py @@ -402,17 +402,17 @@ def dc_model(self, model): else: self._dc_model = partial(model, self) - def _sapm_param_set(): + def _sapm_param_set(self): return set(['A0', 'A1', 'A2', 'A3', 'A4', 'B0', 'B1', 'B2', 'B3', 'B4', 'B5', 'C0', 'C1', 'C2', 'C3', 'C4', 'C5', 'C6', 'C7', 'Isco', 'Impo', 'Aisc', 'Aimp', 'Bvoco', 'Mbvoc', 'Bvmpo', 'Mbvmp', 'N', 'Cells_in_Series', 'IX0', 'IXX0', 'FD']) - def _singlediode_param_set(): + def _singlediode_param_set(self): return set(['alpha_sc', 'a_ref', 'I_L_ref', 'I_o_ref', 'R_sh_ref', 'R_s']) - def _pvwatts_dc_param_set(): + def _pvwatts_dc_param_set(self): return set(['pdc0', 'gamma_pdc']) def infer_dc_model(self): From 1c4ac0444663e8d8b3c54472d1ba5c1ec80da3c5 Mon Sep 17 00:00:00 2001 From: Cliff Hansen Date: Mon, 27 Aug 2018 19:36:21 -0600 Subject: [PATCH 03/13] Move DC_MODEL_PARAMS to pvsystem, streamline validation --- pvlib/modelchain.py | 55 ++++++++++----------------------------------- pvlib/pvsystem.py | 16 +++++++++++++ 2 files changed, 28 insertions(+), 43 deletions(-) diff --git a/pvlib/modelchain.py b/pvlib/modelchain.py index 777a41e0b9..df7802754b 100644 --- a/pvlib/modelchain.py +++ b/pvlib/modelchain.py @@ -13,6 +13,7 @@ from pvlib import (solarposition, pvsystem, clearsky, atmosphere, tools) from pvlib.tracking import SingleAxisTracker import pvlib.irradiance # avoid name conflict with full import +from pvlib.pvsystem import DC_MODEL_PARAMS def basic_chain(times, latitude, longitude, @@ -364,57 +365,25 @@ def dc_model(self, model): self._dc_model = self.infer_dc_model() elif isinstance(model, str): model = model.lower() - if model == 'sapm': - # validate module parameters - missing_params = self._sapm_param_set() - \ - set(self.system.module.keys()) - if missing_params: # some parameters are not in module.keys() - raise ValueError('SAPM selected for the DC model but ' + \ - 'the module is missing one or more ' + \ - 'required parameters: ' + \ + # validate module parameters + missing_params = DC_MODEL_PARAMS() - \ + set(self.system.module_parameters.keys()) + if missing_params: # some parameters are not in module.keys() + raise ValueError(model + ' selected for the DC model but ' + 'the module is missing one or more ' + 'required parameters: ' + str(missing_params)) - else: - self._dc_model = self.sapm + if model == 'sapm': + self._dc_model = self.sapm elif model == 'singlediode': - # validate module parameters - missing_params = self._singlediode_param_set() - \ - set(self.system.module.keys()) - if missing_params: # some parameters are not in module.keys() - raise ValueError('singlediode selected for the DC ' + \ - 'model but the module is missing one ' + \ - 'or more required parameters: ' + \ - str(missing_params)) - else: - self._dc_model = self.singlediode + self._dc_model = self.singlediode elif model == 'pvwatts': - # validate module parameters - missing_params = self._pvwatts_dc_param_set() - \ - set(self.system.module.keys()) - if missing_params: # some parameters are not in module.keys() - raise ValueError('pvwatts_dc selected for the DC ' + \ - 'model but the module is missing one ' + \ - 'or more required parameters: ' + \ - str(missing_params)) - else: - self._dc_model = self.pvwatts_dc + self._dc_model = self.pvwatts_dc else: raise ValueError(model + ' is not a valid DC power model') else: self._dc_model = partial(model, self) - def _sapm_param_set(self): - return set(['A0', 'A1', 'A2', 'A3', 'A4', 'B0', 'B1', 'B2', 'B3', 'B4', - 'B5', 'C0', 'C1', 'C2', 'C3', 'C4', 'C5', 'C6', 'C7', 'Isco', - 'Impo', 'Aisc', 'Aimp', 'Bvoco', 'Mbvoc', 'Bvmpo', 'Mbvmp', - 'N', 'Cells_in_Series', 'IX0', 'IXX0', 'FD']) - - def _singlediode_param_set(self): - return set(['alpha_sc', 'a_ref', 'I_L_ref', 'I_o_ref', 'R_sh_ref', - 'R_s']) - - def _pvwatts_dc_param_set(self): - return set(['pdc0', 'gamma_pdc']) - def infer_dc_model(self): params = set(self.system.module_parameters.keys()) if set(['A0', 'A1', 'C7']) <= params: diff --git a/pvlib/pvsystem.py b/pvlib/pvsystem.py index a7283d1d11..d24d00482d 100644 --- a/pvlib/pvsystem.py +++ b/pvlib/pvsystem.py @@ -23,6 +23,22 @@ import pvlib # use pvlib.singlediode to avoid clash with local method +# a dict of required parameter names for each DC power model + +DC_MODEL_PARAMS = {'sapm' : + set(['A0', 'A1', 'A2', 'A3', 'A4', 'B0', 'B1', 'B2', 'B3', + 'B4', 'B5', 'C0', 'C1', 'C2', 'C3', 'C4', 'C5', 'C6', + 'C7', 'Isco', 'Impo', 'Aisc', 'Aimp', 'Bvoco', + 'Mbvoc', 'Bvmpo', 'Mbvmp', 'N', 'Cells_in_Series', + 'IX0', 'IXX0', 'FD']), + 'singlediode' : + set(['alpha_sc', 'a_ref', 'I_L_ref', 'I_o_ref', + 'R_sh_ref', 'R_s']), + 'pvwatts_dc' : + set(['pdc0', 'gamma_pdc']) + } + + # not sure if this belongs in the pvsystem module. # maybe something more like core.py? It may eventually grow to # import a lot more functionality from other modules. From a04e111a072f9ddf30234a10b48d768fd0955624 Mon Sep 17 00:00:00 2001 From: Cliff Hansen Date: Tue, 28 Aug 2018 08:15:35 -0600 Subject: [PATCH 04/13] Fix key for DC_MODEL_PARAMS --- pvlib/modelchain.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pvlib/modelchain.py b/pvlib/modelchain.py index df7802754b..d23b9c2d49 100644 --- a/pvlib/modelchain.py +++ b/pvlib/modelchain.py @@ -366,7 +366,7 @@ def dc_model(self, model): elif isinstance(model, str): model = model.lower() # validate module parameters - missing_params = DC_MODEL_PARAMS() - \ + missing_params = DC_MODEL_PARAMS[model] - \ set(self.system.module_parameters.keys()) if missing_params: # some parameters are not in module.keys() raise ValueError(model + ' selected for the DC model but ' From 3e1116bb7e9ba19c8326dbbe7b97ba27170c91b4 Mon Sep 17 00:00:00 2001 From: Cliff Hansen Date: Tue, 28 Aug 2018 08:33:03 -0600 Subject: [PATCH 05/13] Fix typo in IXO, IXXO --- pvlib/pvsystem.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pvlib/pvsystem.py b/pvlib/pvsystem.py index d24d00482d..710a2511a9 100644 --- a/pvlib/pvsystem.py +++ b/pvlib/pvsystem.py @@ -30,7 +30,7 @@ 'B4', 'B5', 'C0', 'C1', 'C2', 'C3', 'C4', 'C5', 'C6', 'C7', 'Isco', 'Impo', 'Aisc', 'Aimp', 'Bvoco', 'Mbvoc', 'Bvmpo', 'Mbvmp', 'N', 'Cells_in_Series', - 'IX0', 'IXX0', 'FD']), + 'IXO', 'IXXO', 'FD']), 'singlediode' : set(['alpha_sc', 'a_ref', 'I_L_ref', 'I_o_ref', 'R_sh_ref', 'R_s']), From 1fa1be3d296d45e2a357c624a647bcb9f3c82190 Mon Sep 17 00:00:00 2001 From: Cliff Hansen Date: Tue, 28 Aug 2018 10:11:14 -0600 Subject: [PATCH 06/13] Change logic in dc_model, correct pvwatts keyword --- pvlib/modelchain.py | 20 +++++++++++++------- pvlib/pvsystem.py | 2 +- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/pvlib/modelchain.py b/pvlib/modelchain.py index d23b9c2d49..cc5608c4bd 100644 --- a/pvlib/modelchain.py +++ b/pvlib/modelchain.py @@ -361,17 +361,20 @@ def dc_model(self): @dc_model.setter def dc_model(self, model): + # guess at model if None if model is None: - self._dc_model = self.infer_dc_model() - elif isinstance(model, str): + self._dc_model, model = self.infer_dc_model() + + # Set model and validate parameters + if isinstance(model, str): model = model.lower() # validate module parameters missing_params = DC_MODEL_PARAMS[model] - \ set(self.system.module_parameters.keys()) if missing_params: # some parameters are not in module.keys() raise ValueError(model + ' selected for the DC model but ' - 'the module is missing one or more ' - 'required parameters: ' + + 'one or more required parameters ' + ' are missing : ' + str(missing_params)) if model == 'sapm': self._dc_model = self.sapm @@ -385,13 +388,16 @@ def dc_model(self, model): self._dc_model = partial(model, self) def infer_dc_model(self): + # returns both model function object and model string, could drop + # model function object in the future since the model function object + # will be set in dc_model after validating parameter consistency params = set(self.system.module_parameters.keys()) if set(['A0', 'A1', 'C7']) <= params: - return self.sapm + return self.sapm, 'sapm' elif set(['a_ref', 'I_L_ref', 'I_o_ref', 'R_sh_ref', 'R_s']) <= params: - return self.singlediode + return self.singlediode, 'singlediode' elif set(['pdc0', 'gamma_pdc']) <= params: - return self.pvwatts_dc + return self.pvwatts_dc, 'pvwatts_dc' else: raise ValueError('could not infer DC model from ' 'system.module_parameters') diff --git a/pvlib/pvsystem.py b/pvlib/pvsystem.py index 710a2511a9..2d08052056 100644 --- a/pvlib/pvsystem.py +++ b/pvlib/pvsystem.py @@ -34,7 +34,7 @@ 'singlediode' : set(['alpha_sc', 'a_ref', 'I_L_ref', 'I_o_ref', 'R_sh_ref', 'R_s']), - 'pvwatts_dc' : + 'pvwatts' : set(['pdc0', 'gamma_pdc']) } From 121a8b16bdc1718629348b15a3f69dd06c297b76 Mon Sep 17 00:00:00 2001 From: Cliff Hansen Date: Tue, 28 Aug 2018 13:33:06 -0600 Subject: [PATCH 07/13] More adjustment to pvwatts_dc vs pvwatts keyword --- pvlib/modelchain.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pvlib/modelchain.py b/pvlib/modelchain.py index cc5608c4bd..2e273f4aa9 100644 --- a/pvlib/modelchain.py +++ b/pvlib/modelchain.py @@ -397,7 +397,7 @@ def infer_dc_model(self): elif set(['a_ref', 'I_L_ref', 'I_o_ref', 'R_sh_ref', 'R_s']) <= params: return self.singlediode, 'singlediode' elif set(['pdc0', 'gamma_pdc']) <= params: - return self.pvwatts_dc, 'pvwatts_dc' + return self.pvwatts_dc, 'pvwatts' else: raise ValueError('could not infer DC model from ' 'system.module_parameters') From 10a5f7d4889fd454f65cec41dced4d8215a811cb Mon Sep 17 00:00:00 2001 From: Cliff Hansen Date: Wed, 29 Aug 2018 12:58:18 -0600 Subject: [PATCH 08/13] Add handling of invalid model name string --- pvlib/modelchain.py | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/pvlib/modelchain.py b/pvlib/modelchain.py index 2e273f4aa9..99794f8c45 100644 --- a/pvlib/modelchain.py +++ b/pvlib/modelchain.py @@ -368,20 +368,21 @@ def dc_model(self, model): # Set model and validate parameters if isinstance(model, str): model = model.lower() - # validate module parameters - missing_params = DC_MODEL_PARAMS[model] - \ - set(self.system.module_parameters.keys()) - if missing_params: # some parameters are not in module.keys() - raise ValueError(model + ' selected for the DC model but ' - 'one or more required parameters ' - ' are missing : ' + - str(missing_params)) - if model == 'sapm': - self._dc_model = self.sapm - elif model == 'singlediode': - self._dc_model = self.singlediode - elif model == 'pvwatts': - self._dc_model = self.pvwatts_dc + if model in DC_MODEL_PARAMS.keys(): + # validate module parameters + missing_params = DC_MODEL_PARAMS[model] - \ + set(self.system.module_parameters.keys()) + if missing_params: # some parameters are not in module.keys() + raise ValueError(model + ' selected for the DC model but ' + 'one or more required parameters ' + ' are missing : ' + + str(missing_params)) + if model == 'sapm': + self._dc_model = self.sapm + elif model == 'singlediode': + self._dc_model = self.singlediode + elif model == 'pvwatts': + self._dc_model = self.pvwatts_dc else: raise ValueError(model + ' is not a valid DC power model') else: From c0f58c3f5edc52a401cdba7c218834af7be65c65 Mon Sep 17 00:00:00 2001 From: Cliff Hansen Date: Thu, 30 Aug 2018 08:56:03 -0600 Subject: [PATCH 09/13] Add test for invalid dc model parameters --- pvlib/test/test_modelchain.py | 40 +++++++++++++++++++++++++++++++---- 1 file changed, 36 insertions(+), 4 deletions(-) diff --git a/pvlib/test/test_modelchain.py b/pvlib/test/test_modelchain.py index 0dab068713..c124e8e4e5 100644 --- a/pvlib/test/test_modelchain.py +++ b/pvlib/test/test_modelchain.py @@ -21,14 +21,18 @@ from test_pvsystem import sam_data from conftest import requires_scipy +import copy + @pytest.fixture def system(sam_data): modules = sam_data['sandiamod'] - module_parameters = modules['Canadian_Solar_CS5P_220M___2009_'].copy() + module = 'Canadian_Solar_CS5P_220M___2009_' + module_parameters = modules[module].copy() inverters = sam_data['cecinverter'] inverter = inverters['ABB__MICRO_0_25_I_OUTD_US_208_208V__CEC_2014_'].copy() system = PVSystem(surface_tilt=32.2, surface_azimuth=180, + module=module, module_parameters=module_parameters, inverter_parameters=inverter) return system @@ -37,13 +41,15 @@ def system(sam_data): @pytest.fixture def cec_dc_snl_ac_system(sam_data): modules = sam_data['cecmod'] - module_parameters = modules['Canadian_Solar_CS5P_220M'].copy() + module = 'Canadian_Solar_CS5P_220M' + module_parameters = modules[module].copy() module_parameters['b'] = 0.05 module_parameters['EgRef'] = 1.121 module_parameters['dEgdT'] = -0.0002677 inverters = sam_data['cecinverter'] inverter = inverters['ABB__MICRO_0_25_I_OUTD_US_208_208V__CEC_2014_'].copy() system = PVSystem(surface_tilt=32.2, surface_azimuth=180, + module=module, module_parameters=module_parameters, inverter_parameters=inverter) return system @@ -52,13 +58,15 @@ def cec_dc_snl_ac_system(sam_data): @pytest.fixture def cec_dc_adr_ac_system(sam_data): modules = sam_data['cecmod'] - module_parameters = modules['Canadian_Solar_CS5P_220M'].copy() + module - 'Canadian_Solar_CS5P_220M' + module_parameters = modules[module].copy() module_parameters['b'] = 0.05 module_parameters['EgRef'] = 1.121 module_parameters['dEgdT'] = -0.0002677 inverters = sam_data['adrinverter'] inverter = inverters['Zigor__Sunzet_3_TL_US_240V__CEC_2011_'].copy() system = PVSystem(surface_tilt=32.2, surface_azimuth=180, + module=module, module_parameters=module_parameters, inverter_parameters=inverter) return system @@ -365,6 +373,30 @@ def test_losses_models_no_loss(pvwatts_dc_pvwatts_ac_system, location, weather, assert mc.losses == 1 +def test_invalid_dc_model_params(system, cec_dc_snl_ac_system, + pvwatts_dc_pvwatts_ac_system, location): + kwargs = {'dc_model': 'sapm', 'ac_model': 'snlinverter', + 'aoi_model': 'no_loss', 'spectral_model': 'no_loss', + 'temp_model': 'sapm', 'losses_model': 'no_loss'} + tmp = copy.deepcopy(system) + tmp.module_parameters.pop('A0') # remove a parameter + with pytest.raises(ValueError): + mc = ModelChain(tmp, location, **kwargs) + + kwargs['dc_model'] = 'singlediode' + tmp = copy.deepcopy(cec_dc_snl_ac_system) + tmp.module_parameters.pop('a_ref') # remove a parameter + with pytest.raises(ValueError): + mc = ModelChain(tmp, location, **kwargs) + + kwargs['dc_model'] = 'pvwatts' + kwargs['ac_model'] = 'pvwatts' + tmp = copy.deepcopy(pvwatts_dc_pvwatts_ac_system) + tmp.module_parameters.pop('pdc0') + with pytest.raises(ValueError): + mc = ModelChain(tmp, location, **kwargs) + + @pytest.mark.parametrize('model', [ 'dc_model', 'ac_model', 'aoi_model', 'spectral_model', 'losses_model', 'temp_model', 'losses_model' @@ -376,7 +408,7 @@ def test_invalid_models(model, system, location): kwargs[model] = 'invalid' with pytest.raises(ValueError): mc = ModelChain(system, location, **kwargs) - + def test_bad_get_orientation(): with pytest.raises(ValueError): From ae3d5727ee3c7c86bef029dfe6968c2eac99f511 Mon Sep 17 00:00:00 2001 From: Cliff Hansen Date: Thu, 30 Aug 2018 09:26:42 -0600 Subject: [PATCH 10/13] Fix typo in cec_dc_adr_ac_system --- pvlib/test/test_modelchain.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pvlib/test/test_modelchain.py b/pvlib/test/test_modelchain.py index c124e8e4e5..0bed4a8a2e 100644 --- a/pvlib/test/test_modelchain.py +++ b/pvlib/test/test_modelchain.py @@ -58,7 +58,7 @@ def cec_dc_snl_ac_system(sam_data): @pytest.fixture def cec_dc_adr_ac_system(sam_data): modules = sam_data['cecmod'] - module - 'Canadian_Solar_CS5P_220M' + module = 'Canadian_Solar_CS5P_220M' module_parameters = modules[module].copy() module_parameters['b'] = 0.05 module_parameters['EgRef'] = 1.121 From e11d1c5bb615fb8af9665c2ba27f1e6f8fae4ab1 Mon Sep 17 00:00:00 2001 From: Cliff Hansen Date: Thu, 30 Aug 2018 11:01:31 -0600 Subject: [PATCH 11/13] Add to whatsnew.rst --- docs/sphinx/source/whatsnew/v0.6.0.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/sphinx/source/whatsnew/v0.6.0.rst b/docs/sphinx/source/whatsnew/v0.6.0.rst index 9dc9a13313..06624d7420 100644 --- a/docs/sphinx/source/whatsnew/v0.6.0.rst +++ b/docs/sphinx/source/whatsnew/v0.6.0.rst @@ -101,6 +101,7 @@ Enhancements * Add irradiance.gti_dirint function. (:issue:`396`) * Add irradiance.clearness_index function. (:issue:`396`) * Add irradiance.clearness_index_zenith_independent function. (:issue:`396`) +* Add checking for consistency between module_parameters and dc_model. (:issue:`417`) Bug fixes From 743c621cc947f15a30c0b05b95b62cf4fd82cd00 Mon Sep 17 00:00:00 2001 From: Cliff Hansen Date: Thu, 30 Aug 2018 14:22:39 -0600 Subject: [PATCH 12/13] Cleanup, remove copy from test --- docs/sphinx/source/whatsnew/v0.6.0.rst | 2 ++ pvlib/modelchain.py | 2 +- pvlib/test/test_modelchain.py | 19 +++++++------------ 3 files changed, 10 insertions(+), 13 deletions(-) diff --git a/docs/sphinx/source/whatsnew/v0.6.0.rst b/docs/sphinx/source/whatsnew/v0.6.0.rst index 06624d7420..9a6b514c19 100644 --- a/docs/sphinx/source/whatsnew/v0.6.0.rst +++ b/docs/sphinx/source/whatsnew/v0.6.0.rst @@ -51,6 +51,8 @@ API Changes improved results under other conditions. (:issue:`435`) * Add min_cos_zenith, max_zenith keyword arguments to disc, dirint, and dirindex functions. (:issue:`311`, :issue:`396`) +* Method ModelChain.infer_dc_model now returns a tuple (function handle, model name string) + instead of only the function handle (:issue:`417`) Enhancements diff --git a/pvlib/modelchain.py b/pvlib/modelchain.py index 99794f8c45..615b5ab81e 100644 --- a/pvlib/modelchain.py +++ b/pvlib/modelchain.py @@ -375,7 +375,7 @@ def dc_model(self, model): if missing_params: # some parameters are not in module.keys() raise ValueError(model + ' selected for the DC model but ' 'one or more required parameters ' - ' are missing : ' + + 'are missing : ' + str(missing_params)) if model == 'sapm': self._dc_model = self.sapm diff --git a/pvlib/test/test_modelchain.py b/pvlib/test/test_modelchain.py index 0bed4a8a2e..1083cf97d3 100644 --- a/pvlib/test/test_modelchain.py +++ b/pvlib/test/test_modelchain.py @@ -21,8 +21,6 @@ from test_pvsystem import sam_data from conftest import requires_scipy -import copy - @pytest.fixture def system(sam_data): @@ -378,23 +376,20 @@ def test_invalid_dc_model_params(system, cec_dc_snl_ac_system, kwargs = {'dc_model': 'sapm', 'ac_model': 'snlinverter', 'aoi_model': 'no_loss', 'spectral_model': 'no_loss', 'temp_model': 'sapm', 'losses_model': 'no_loss'} - tmp = copy.deepcopy(system) - tmp.module_parameters.pop('A0') # remove a parameter + system.module_parameters.pop('A0') # remove a parameter with pytest.raises(ValueError): - mc = ModelChain(tmp, location, **kwargs) + mc = ModelChain(system, location, **kwargs) kwargs['dc_model'] = 'singlediode' - tmp = copy.deepcopy(cec_dc_snl_ac_system) - tmp.module_parameters.pop('a_ref') # remove a parameter + cec_dc_snl_ac_system.module_parameters.pop('a_ref') # remove a parameter with pytest.raises(ValueError): - mc = ModelChain(tmp, location, **kwargs) + mc = ModelChain(cec_dc_snl_ac_system, location, **kwargs) kwargs['dc_model'] = 'pvwatts' kwargs['ac_model'] = 'pvwatts' - tmp = copy.deepcopy(pvwatts_dc_pvwatts_ac_system) - tmp.module_parameters.pop('pdc0') + pvwatts_dc_pvwatts_ac_system.module_parameters.pop('pdc0') with pytest.raises(ValueError): - mc = ModelChain(tmp, location, **kwargs) + mc = ModelChain(pvwatts_dc_pvwatts_ac_system, location, **kwargs) @pytest.mark.parametrize('model', [ @@ -408,7 +403,7 @@ def test_invalid_models(model, system, location): kwargs[model] = 'invalid' with pytest.raises(ValueError): mc = ModelChain(system, location, **kwargs) - + def test_bad_get_orientation(): with pytest.raises(ValueError): From 669d4bdb21734d8402842533cf6a0c56e329c420 Mon Sep 17 00:00:00 2001 From: Cliff Hansen Date: Thu, 30 Aug 2018 15:14:23 -0600 Subject: [PATCH 13/13] Delete comment from infer_dc_model --- pvlib/modelchain.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/pvlib/modelchain.py b/pvlib/modelchain.py index 615b5ab81e..dece562297 100644 --- a/pvlib/modelchain.py +++ b/pvlib/modelchain.py @@ -389,9 +389,6 @@ def dc_model(self, model): self._dc_model = partial(model, self) def infer_dc_model(self): - # returns both model function object and model string, could drop - # model function object in the future since the model function object - # will be set in dc_model after validating parameter consistency params = set(self.system.module_parameters.keys()) if set(['A0', 'A1', 'C7']) <= params: return self.sapm, 'sapm'