Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions docs/sphinx/source/whatsnew/v0.12.1.rst
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@ Enhancements
:py:func:`~pvlib.iotools.get_nsrdb_psm4_full_disc`,
:py:func:`~pvlib.iotools.read_nsrdb_psm4`, and
:py:func:`~pvlib.iotools.parse_nsrdb_psm4`. (:issue:`2326`, :pull:`2378`)
* Add ``'semi_integrated'`` parameters for the PVsyst temperature model.
(:issue:`2330`, :pull:`2415`)

Documentation
~~~~~~~~~~~~~
Expand Down Expand Up @@ -62,3 +64,4 @@ Contributors
* Will Hobbs (:ghuser:`williamhobbs`)
* Kevin Anderson (:ghuser:`kandersolar`)
* Will Holmgren (:ghuser:`wholmgren`)
* Muhammad Rebaal (:ghuser:`Muhammad-Rebaal`)
15 changes: 9 additions & 6 deletions pvlib/pvsystem.py
Original file line number Diff line number Diff line change
Expand Up @@ -1006,13 +1006,13 @@ def _infer_temperature_model_params(self):
return temperature._temperature_model_params('sapm', param_set)
elif 'freestanding' in param_set:
return temperature._temperature_model_params('pvsyst',
'freestanding')
'freestanding')
elif 'insulated' in param_set: # after SAPM to avoid confusing keys
return temperature._temperature_model_params('pvsyst',
'insulated')
elif 'semi_integrated' in param_set: # Add this condition
'insulated')
elif 'semi_integrated' in param_set:
return temperature._temperature_model_params('pvsyst',
'semi_integrated')
'semi_integrated')
else:
return {}

Expand Down Expand Up @@ -1396,10 +1396,13 @@ class FixedMount(AbstractMount):
West=270. [degrees]

racking_model : str, optional
Valid strings are 'open_rack', 'close_mount', 'insulated_back',
'freestanding', 'insulated', and 'semi_integrated'.
Valid strings are ``'open_rack'``, ``'close_mount'``,
``'insulated_back'``, ``'freestanding'``, ``'insulated'`` and
``'semi_integrated'``.
Used to identify a parameter set for the SAPM or PVsyst cell
temperature model.
See :py:func:`~pvlib.temperature.sapm_module` and
:py:func:`~pvlib.temperature.pvsyst_cell` for definitions.

module_height : float, optional
The height above ground of the center of the module [m]. Used for
Expand Down
30 changes: 11 additions & 19 deletions pvlib/temperature.py
Original file line number Diff line number Diff line change
Expand Up @@ -366,16 +366,6 @@ def pvsyst_cell(poa_global, temp_air, wind_speed=1.0, u_c=29.0, u_v=0.0,
alpha_absorption : numeric, default 0.9
Absorption coefficient. Parameter :math:`\alpha` in :eq:`pvsyst`.

freestanding : Uc = 29 W/(m^2*C), Uv = 0 W/(m^2*C*m/s)

insulated : Uc = 15 W/(m^2*C), Uv = 0 W/(m^2*C*m/s)

semi_integrated : Uc = 20 W/(m^2*C), Uv = 0 W/(m^2*C*m/s)
(for roof mounted systems with air flow beneath modules)

PVUSA : Uc = 25 W/(m^2*C), Uv = 1.2 W/(m^2*C*m/s)


Returns
-------
numeric, values in degrees Celsius
Expand All @@ -393,19 +383,21 @@ def pvsyst_cell(poa_global, temp_air, wind_speed=1.0, u_c=29.0, u_v=0.0,
air temperature :math:`T_{a}` (C) and wind speed :math:`WS` (m/s). Model
output is cell temperature :math:`T_{C}`. Model parameters depend both on
the module construction and its mounting. Parameters are provided in
[1]_ for open (freestanding) and close (insulated) mounting configurations,
, and are coded for convenience in
[1]_ for open (freestanding), close (insulated), and intermediate
(semi_integrate) mounting configurations, and are coded for convenience in
:data:`~pvlib.temperature.TEMPERATURE_MODEL_PARAMETERS`. The heat loss
factors provided represent the combined effect of convection, radiation and
conduction, and their values are experimentally determined.

+--------------+---------------+---------------+
| Mounting | :math:`U_{c}` | :math:`U_{v}` |
+==============+===============+===============+
| freestanding | 29.0 | 0.0 |
+--------------+---------------+---------------+
| insulated | 15.0 | 0.0 |
+--------------+---------------+---------------+
+-----------------+---------------+---------------+
| Mounting | :math:`U_{c}` | :math:`U_{v}` |
+=================+===============+===============+
| freestanding | 29.0 | 0.0 |
+-----------------+---------------+---------------+
| insulated | 15.0 | 0.0 |
+-----------------+---------------+---------------+
| semi_integrated | 20.0 | 0.0 |
+-----------------+---------------+---------------+

Mounting cases can be described in terms of air flow across and around the
rear-facing surface of the module:
Expand Down
25 changes: 7 additions & 18 deletions tests/test_pvsystem.py
Original file line number Diff line number Diff line change
Expand Up @@ -710,6 +710,13 @@ def test_Array__infer_temperature_model_params():
expected = temperature.TEMPERATURE_MODEL_PARAMETERS[
'pvsyst']['insulated']
assert expected == array._infer_temperature_model_params()
array = pvsystem.Array(mount=FixedMount(0, 180,
racking_model='semi_integrated'),
module_parameters={},
module_type=None)
expected = temperature.TEMPERATURE_MODEL_PARAMETERS[
'pvsyst']['semi_integrated']
assert expected == array._infer_temperature_model_params()


def test_Array__infer_cell_type():
Expand Down Expand Up @@ -2512,21 +2519,3 @@ def test_Array_temperature_missing_parameters(model, keys):
array.temperature_model_parameters = params
with pytest.raises(KeyError, match=match):
array.get_cell_temperature(irrads, temps, winds, model)

def test_pvsyst_semi_integrated_params():
"""Test that semi_integrated racking model correctly gets PVsyst parameters."""
# Create a mount with semi_integrated racking model
mount = pvsystem.FixedMount(surface_tilt=30, surface_azimuth=180,
racking_model='semi_integrated')

# Create an array with this mount
array = pvsystem.Array(mount=mount, module_type='glass_glass')

# Get the inferred temperature model parameters
params = array._infer_temperature_model_params()

# Check that the correct parameters were returned
assert 'u_c' in params
assert 'u_v' in params
assert params['u_c'] == 20.0
assert params['u_v'] == 0.0