-
Notifications
You must be signed in to change notification settings - Fork 1.1k
Implement enhanced Faiman temperature model #1595
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 14 commits
54dcae1
c055913
2608b8d
176f917
04a5827
110299b
a51f840
e9dde82
ef05a73
eafb272
a6e93d0
b470257
91f7086
bd05c35
bae186a
bda2971
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
@@ -9,6 +9,7 @@ | |||||||||||||||||||||||||||||||||||||||||||||||
| from pvlib._deprecation import warn_deprecated | ||||||||||||||||||||||||||||||||||||||||||||||||
| from pvlib.tools import _get_sample_intervals | ||||||||||||||||||||||||||||||||||||||||||||||||
| import scipy | ||||||||||||||||||||||||||||||||||||||||||||||||
| import scipy.constants | ||||||||||||||||||||||||||||||||||||||||||||||||
| import warnings | ||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||
|
|
@@ -318,7 +319,7 @@ def pvsyst_cell(poa_global, temp_air, wind_speed=1.0, u_c=29.0, u_v=0.0, | |||||||||||||||||||||||||||||||||||||||||||||||
| u_v : float, default 0.0 | ||||||||||||||||||||||||||||||||||||||||||||||||
| Combined heat loss factor influenced by wind. Parameter :math:`U_{v}` | ||||||||||||||||||||||||||||||||||||||||||||||||
| in :eq:`pvsyst`. | ||||||||||||||||||||||||||||||||||||||||||||||||
| :math:`\left[ \frac{\text{W}/\text{m}^2}{\text{C}\ \left( \text{m/s} \right)} \right]` # noQA: E501 | ||||||||||||||||||||||||||||||||||||||||||||||||
| :math:`\left[ \frac{\text{W}/\text{m}^2}{\text{C}\ \left( \text{m/s} \right)} \right]` | ||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||
| eta_m : numeric, default None (deprecated, use module_efficiency instead) | ||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||
|
|
@@ -375,7 +376,7 @@ def pvsyst_cell(poa_global, temp_air, wind_speed=1.0, u_c=29.0, u_v=0.0, | |||||||||||||||||||||||||||||||||||||||||||||||
| >>> params = TEMPERATURE_MODEL_PARAMETERS['pvsyst']['freestanding'] | ||||||||||||||||||||||||||||||||||||||||||||||||
| >>> pvsyst_cell(1000, 10, **params) | ||||||||||||||||||||||||||||||||||||||||||||||||
| 37.93103448275862 | ||||||||||||||||||||||||||||||||||||||||||||||||
| """ | ||||||||||||||||||||||||||||||||||||||||||||||||
| """ # noQA: E501 | ||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||
| if eta_m: | ||||||||||||||||||||||||||||||||||||||||||||||||
| warn_deprecated( | ||||||||||||||||||||||||||||||||||||||||||||||||
|
|
@@ -413,12 +414,14 @@ def faiman(poa_global, temp_air, wind_speed=1.0, u0=25.0, u1=6.84): | |||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||
| u0 : numeric, default 25.0 | ||||||||||||||||||||||||||||||||||||||||||||||||
| Combined heat loss factor coefficient. The default value is one | ||||||||||||||||||||||||||||||||||||||||||||||||
| determined by Faiman for 7 silicon modules. | ||||||||||||||||||||||||||||||||||||||||||||||||
| determined by Faiman for 7 silicon modules | ||||||||||||||||||||||||||||||||||||||||||||||||
| in the Negev desert on an open rack at 30.9° tilt. | ||||||||||||||||||||||||||||||||||||||||||||||||
| :math:`\left[\frac{\text{W}/{\text{m}^2}}{\text{C}}\right]` | ||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||
| u1 : numeric, default 6.84 | ||||||||||||||||||||||||||||||||||||||||||||||||
| Combined heat loss factor influenced by wind. The default value is one | ||||||||||||||||||||||||||||||||||||||||||||||||
| determined by Faiman for 7 silicon modules. | ||||||||||||||||||||||||||||||||||||||||||||||||
| determined by Faiman for 7 silicon modules | ||||||||||||||||||||||||||||||||||||||||||||||||
| in the Negev desert on an open rack at 30.9° tilt. | ||||||||||||||||||||||||||||||||||||||||||||||||
| :math:`\left[ \frac{\text{W}/\text{m}^2}{\text{C}\ \left( \text{m/s} \right)} \right]` | ||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||
| Returns | ||||||||||||||||||||||||||||||||||||||||||||||||
|
|
@@ -434,6 +437,7 @@ def faiman(poa_global, temp_air, wind_speed=1.0, u0=25.0, u1=6.84): | |||||||||||||||||||||||||||||||||||||||||||||||
| ---------- | ||||||||||||||||||||||||||||||||||||||||||||||||
| .. [1] Faiman, D. (2008). "Assessing the outdoor operating temperature of | ||||||||||||||||||||||||||||||||||||||||||||||||
| photovoltaic modules." Progress in Photovoltaics 16(4): 307-315. | ||||||||||||||||||||||||||||||||||||||||||||||||
| :doi:`10.1002/pip.813` | ||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||
| .. [2] "IEC 61853-2 Photovoltaic (PV) module performance testing and energy | ||||||||||||||||||||||||||||||||||||||||||||||||
| rating - Part 2: Spectral responsivity, incidence angle and module | ||||||||||||||||||||||||||||||||||||||||||||||||
|
|
@@ -442,7 +446,12 @@ def faiman(poa_global, temp_air, wind_speed=1.0, u0=25.0, u1=6.84): | |||||||||||||||||||||||||||||||||||||||||||||||
| .. [3] "IEC 61853-3 Photovoltaic (PV) module performance testing and energy | ||||||||||||||||||||||||||||||||||||||||||||||||
| rating - Part 3: Energy rating of PV modules". IEC, Geneva, 2018. | ||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||
| ''' | ||||||||||||||||||||||||||||||||||||||||||||||||
| See also | ||||||||||||||||||||||||||||||||||||||||||||||||
| -------- | ||||||||||||||||||||||||||||||||||||||||||||||||
| pvlib.temperature.faiman_rad | ||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||
| ''' # noQA: E501 | ||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||
| # Contributed by Anton Driesse (@adriesse), PV Performance Labs. Dec., 2019 | ||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||
| # The following lines may seem odd since u0 & u1 are probably scalar, | ||||||||||||||||||||||||||||||||||||||||||||||||
|
|
@@ -457,6 +466,119 @@ def faiman(poa_global, temp_air, wind_speed=1.0, u0=25.0, u1=6.84): | |||||||||||||||||||||||||||||||||||||||||||||||
| return temp_air + temp_difference | ||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||
| def faiman_rad(poa_global, temp_air, wind_speed=1.0, ir_down=None, | ||||||||||||||||||||||||||||||||||||||||||||||||
| u0=25.0, u1=6.84, sky_view=1.0, emissivity=0.88): | ||||||||||||||||||||||||||||||||||||||||||||||||
| r''' | ||||||||||||||||||||||||||||||||||||||||||||||||
| Calculate cell or module temperature using the Faiman model augmented | ||||||||||||||||||||||||||||||||||||||||||||||||
| with a radiative loss term. | ||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||
| The Faiman model uses an empirical heat loss factor model [1]_ and is | ||||||||||||||||||||||||||||||||||||||||||||||||
| adopted in the IEC 61853 standards [2]_ and [3]_. The radiative loss | ||||||||||||||||||||||||||||||||||||||||||||||||
| term was proposed and developed by Driesse [4]_. | ||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||
| The model can be used to represent cell or module temperature. | ||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||
| Parameters | ||||||||||||||||||||||||||||||||||||||||||||||||
| ---------- | ||||||||||||||||||||||||||||||||||||||||||||||||
| poa_global : numeric | ||||||||||||||||||||||||||||||||||||||||||||||||
| Total incident irradiance [W/m^2]. | ||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||
| temp_air : numeric | ||||||||||||||||||||||||||||||||||||||||||||||||
| Ambient dry bulb temperature [C]. | ||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||
| wind_speed : numeric, default 1.0 | ||||||||||||||||||||||||||||||||||||||||||||||||
| Wind speed measured at the same height for which the wind loss | ||||||||||||||||||||||||||||||||||||||||||||||||
| factor was determined. The default value 1.0 m/s is the wind | ||||||||||||||||||||||||||||||||||||||||||||||||
| speed at module height used to determine NOCT. [m/s] | ||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||
| ir_down : numeric, default 0.0 | ||||||||||||||||||||||||||||||||||||||||||||||||
| Downwelling infrared radiation from the sky, measured on a horizontal | ||||||||||||||||||||||||||||||||||||||||||||||||
| surface. [W/m^2] | ||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||
| u0 : numeric, default 25.0 | ||||||||||||||||||||||||||||||||||||||||||||||||
| Combined heat loss factor coefficient. The default value is one | ||||||||||||||||||||||||||||||||||||||||||||||||
| determined by Faiman for 7 silicon modules | ||||||||||||||||||||||||||||||||||||||||||||||||
| in the Negev desert on an open rack at 30.9° tilt. | ||||||||||||||||||||||||||||||||||||||||||||||||
| :math:`\left[\frac{\text{W}/{\text{m}^2}}{\text{C}}\right]` | ||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||
| u1 : numeric, default 6.84 | ||||||||||||||||||||||||||||||||||||||||||||||||
| Combined heat loss factor influenced by wind. The default value is one | ||||||||||||||||||||||||||||||||||||||||||||||||
| determined by Faiman for 7 silicon modules | ||||||||||||||||||||||||||||||||||||||||||||||||
| in the Negev desert on an open rack at 30.9° tilt. | ||||||||||||||||||||||||||||||||||||||||||||||||
| :math:`\left[ \frac{\text{W}/\text{m}^2}{\text{C}\ \left( \text{m/s} \right)} \right]` | ||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||
| sky_view : numeric, default 1.0 | ||||||||||||||||||||||||||||||||||||||||||||||||
| Effective view factor limiting the radiative exchange between the | ||||||||||||||||||||||||||||||||||||||||||||||||
| module and the sky. For a tilted array the expressions | ||||||||||||||||||||||||||||||||||||||||||||||||
| (1 + 3*cos(tilt)) / 4 can be used as a first estimate for sky_view | ||||||||||||||||||||||||||||||||||||||||||||||||
| as discussed in [4]_. The default value is for a horizontal module. | ||||||||||||||||||||||||||||||||||||||||||||||||
| [unitless] | ||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||
| emissivity : numeric, default 0.88 | ||||||||||||||||||||||||||||||||||||||||||||||||
| Infrared emissivity of the module surface facing the sky. The default | ||||||||||||||||||||||||||||||||||||||||||||||||
| value represents the middle of a range of values found in the | ||||||||||||||||||||||||||||||||||||||||||||||||
| literature. [unitless] | ||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||
| Returns | ||||||||||||||||||||||||||||||||||||||||||||||||
| ------- | ||||||||||||||||||||||||||||||||||||||||||||||||
| numeric, values in degrees Celsius | ||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||
| Notes | ||||||||||||||||||||||||||||||||||||||||||||||||
| ----- | ||||||||||||||||||||||||||||||||||||||||||||||||
| All arguments may be scalars or vectors. If multiple arguments | ||||||||||||||||||||||||||||||||||||||||||||||||
| are vectors they must be the same length. | ||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||
| When only irradiance, air temperature and wind speed inputs are provided | ||||||||||||||||||||||||||||||||||||||||||||||||
| (`ir_down` is `None`) this function calculates the same device temperature | ||||||||||||||||||||||||||||||||||||||||||||||||
| as the original faiman model. When down-welling long-wave radiation data | ||||||||||||||||||||||||||||||||||||||||||||||||
| are provided as well (`ir_down` is not None) the default u0 and u1 values | ||||||||||||||||||||||||||||||||||||||||||||||||
| from the original model should not be used because a portion of the | ||||||||||||||||||||||||||||||||||||||||||||||||
| radiative losses would be double-counted. | ||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||
adriesse marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||||||||||||||||||||||||||||||||||||||||||
| References | ||||||||||||||||||||||||||||||||||||||||||||||||
| ---------- | ||||||||||||||||||||||||||||||||||||||||||||||||
| .. [1] Faiman, D. (2008). "Assessing the outdoor operating temperature of | ||||||||||||||||||||||||||||||||||||||||||||||||
| photovoltaic modules." Progress in Photovoltaics 16(4): 307-315. | ||||||||||||||||||||||||||||||||||||||||||||||||
adriesse marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||||||||||||||||||||||||||||||||||||||||||
| :doi:`10.1002/pip.813` | ||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||
| .. [2] "IEC 61853-2 Photovoltaic (PV) module performance testing and energy | ||||||||||||||||||||||||||||||||||||||||||||||||
| rating - Part 2: Spectral responsivity, incidence angle and module | ||||||||||||||||||||||||||||||||||||||||||||||||
| operating temperature measurements". IEC, Geneva, 2018. | ||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||
| .. [3] "IEC 61853-3 Photovoltaic (PV) module performance testing and energy | ||||||||||||||||||||||||||||||||||||||||||||||||
| rating - Part 3: Energy rating of PV modules". IEC, Geneva, 2018. | ||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||
| .. [4] Driesse, A. et al (2022) "Improving Common PV Module Temperature | ||||||||||||||||||||||||||||||||||||||||||||||||
| Models by Incorporating Radiative Losses to the Sky". SAND2022-11604. | ||||||||||||||||||||||||||||||||||||||||||||||||
| :doi:`10.2172/1884890` | ||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||
| See also | ||||||||||||||||||||||||||||||||||||||||||||||||
| -------- | ||||||||||||||||||||||||||||||||||||||||||||||||
| pvlib.temperature.faiman | ||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||
| ''' # noQA: E501 | ||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||
| # Contributed by Anton Driesse (@adriesse), PV Performance Labs. Nov., 2022 | ||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||
| u0 = np.asanyarray(u0) | ||||||||||||||||||||||||||||||||||||||||||||||||
| u1 = np.asanyarray(u1) | ||||||||||||||||||||||||||||||||||||||||||||||||
| emissivity = np.asanyarray(emissivity) | ||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||
| abs_zero = np.array(-273.15) | ||||||||||||||||||||||||||||||||||||||||||||||||
| sigma = np.array(scipy.constants.Stefan_Boltzmann) | ||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||
| if ir_down is None: | ||||||||||||||||||||||||||||||||||||||||||||||||
| qrad_sky = np.array(0.0) | ||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||
| u0 = np.asanyarray(u0) | |
| u1 = np.asanyarray(u1) | |
| emissivity = np.asanyarray(emissivity) | |
| abs_zero = np.array(-273.15) | |
| sigma = np.array(scipy.constants.Stefan_Boltzmann) | |
| if ir_down is None: | |
| qrad_sky = np.array(0.0) | |
| poa_global = np.asanyarray(poa_global) | |
| temp_air = np.asanyarray(temp_air) | |
| wind_speed = np.asanyarray(wind_speed) | |
| ir_down = np.asanyarray(ir_down) | |
| u0 = np.asanyarray(u0) | |
| u1 = np.asanyarray(u1) | |
| sky_view = np.asanyarray(sky_view) | |
| emissivity = np.asanyarray(emissivity) | |
| abs_zero = -273.15 | |
| sigma = scipy.constants.Stefan_Boltzmann | |
| if ir_down is None: | |
| qrad_sky = 0.0 |
I see that the usage of np.asanyarray is very carefully chosen such that all inputs can be passed as lists and directly or indirectly be converted to arrays. The indirect conversion to arrays (by multiplying a list something array-like) seems undesirable and unintuitive to the user. Why not instead just convert all the inputs to array-like in the beginning and be straightforward about it?
It's not a blocker for me, but this is the point that I was trying to raise earlier.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
On the whole I believe this function behaves like numpy would. The reason for the indirect and partial approach is to allow pandas and xarray data structures to be propagated from the first four arguments. Try it, you might like it!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What about this function requires any of the np.asanyarray calls? np.asanyarray is not robust.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ah, now I see the hidden conversation about allowing list input. That is not needed and comes at a cost of disallowing arbitrary array-like input that doesn't fully support the asanyarray machinery (e.g. dask, or whatever the pydata library of the month is).
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Could you elaborate on what doesn't work here?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Overall I'm getting more push-back than expected on something which I though was a very simple technique to make the function very flexible. If there is a concrete down-side I'd like to learn about it, especially the risks associated with asanyarray (which could be replaced with asarray in this particular function). I've use this technique before and am likely to use it again unless there really is a problem with it.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The function is already very flexible because you did a good job writing it :). It doesn't need asanyarray! Here's a concrete downside for asanyarray:
In [1]: import numpy as np
In [2]: import dask.array as da
In [3]: da.from_array([0, 1])
Out[3]: dask.array<array, shape=(2,), dtype=int32, chunksize=(2,), chunktype=numpy.ndarray>
In [4]: np.asanyarray(da.from_array([0, 1]))
Out[4]: array([0, 1])
In [5]: np.asarray(da.from_array([0, 1]))
Out[5]: array([0, 1])There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
np.asanyarrayis not robust.
I am curious to learn more about this...
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hi Anton, here's a quote from NEP16
Sometimes people suggest using np.asanyarray for this purpose, but unfortunately its semantics are exactly backwards: it guarantees that the object it returns uses the same memory layout as an ndarray, but tells you nothing at all about its semantics, which makes it essentially impossible to use safely in practice.
The scientific python brain trust has discussed solutions in a variety of venues and I find it very difficult to track, but here's a very incomplete list of links:
- https://numpy.org/neps/nep-0022-ndarray-duck-typing-overview.html
- https://labs.quansight.org/blog/2021/11/pydata-extensibility-vision
- https://discuss.scientific-python.org/t/spec-2-api-dispatch/173
I think we have another issue or two related to this, so probably best to continue discussion there rather than a closed PR :)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks! That was educational!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is "effective" adding something here?
sky_viewlooks to be the fraction of the sky dome "seen" by the module, so that's the usual view factor. I wonder if the formula could be considered part of the model and the input would besurface_tilt, but I'll defer to the model author.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I snuck in the "effective" because the infra-red sky is very non-isotropic and that needs to be taken into account. The formula is really just a starting point for future work, not adequately explored and validated.