Repository navigation
Villalva Algorithm Pull Request - #2878
JFrederico2022 wants to merge 62 commits into
Conversation
Hey @JFrederico2022! 🎉Thanks for opening your first pull request! We appreciate your If AI is used for any portion of this PR, you must vet the content Finally, be sure the PR description includes the PR |
|
@JFrederico2022 pvlib should get only the functions, not the notebook. It has been a while since we discussed that: #2754 (comment) "In pvlib, a calcparams_villalva function would go into pvlib.pvsystem. Code for fitting would go into pvlib.ivtools.sdm in a new module villalva.py" If you want, you can convert the notebook to a python script and add to the Example Gallery. Just start the script name with "plot_" and use docstrings where you want text to appear. |
|
Hello, @cwhanse I updated the docs. Please, let me know if they are all right. Best regards, |
Co-authored-by: Cliff Hansen <cwhanse@sandia.gov>
Co-authored-by: Cliff Hansen <cwhanse@sandia.gov>
|
Hi @JFrederico2022, great initiative! In my opinion, I think it would be nice for your PR to have a corresponding issue which includes a description of what you are adding to pvlib (e.g., what do you see is missing that a PR would add and include sources). That way reviewers and curious people can have a quick outlook of what's happening. |
The issue exists (#2754) but, @JFrederico2022, please tag this in the PR template |
|
Remember to list the new functions in https://github.com/pvlib/pvlib-python/blob/main/docs/sphinx/source/reference/pv_modeling/sdm.rst?plain=1 |
There was a problem hiding this comment.
I have suggested a few basic docstring revisions. You can implement changes recommended by reviewers either by committing them individually or, under the Files changed tab, adding the suggestions to a batch and committing them all at once.
Happy to look more in depth at the core implementation in the coming days
Co-authored-by: Echedey Luis <80125792+echedey-ls@users.noreply.github.com>
Co-authored-by: Echedey Luis <80125792+echedey-ls@users.noreply.github.com>
Co-authored-by: Rajiv Daxini <143435106+RDaxini@users.noreply.github.com>
Co-authored-by: Rajiv Daxini <143435106+RDaxini@users.noreply.github.com>
Co-authored-by: Rajiv Daxini <143435106+RDaxini@users.noreply.github.com>
Co-authored-by: Rajiv Daxini <143435106+RDaxini@users.noreply.github.com>
Co-authored-by: Rajiv Daxini <143435106+RDaxini@users.noreply.github.com>
Added test for calcparams_villalva to check operating-condition results and NaN propagation.
|
@JFrederico2022 sorry for the delay here. Tests look OK to me. There's some formatting cleanup (mostly extra whitespace) in the Flake8 report. |
Added equations for operating conditions in Villalva SDM parameters calculation.
Reformatted docstring for better readability.
Fix spacing in filename formatting for consistency.
Refactor print statement for better readability.
Hi @cwhanse, No worries, and thank you for reviewing the PR! I've addressed the formatting issues reported by Flake8 and pushed the changes. Thanks again for your feedback! |
There was a problem hiding this comment.
Thanks for keeping this moving forward @JFrederico2022
It's a big one, so this might still take some time. I have added a few more thoughts as I slowly digest this PR...
Reconciling input/output types (#2878 (comment)) and providing more useful error messages (#2878 (comment)) might be the highest priority, although the latter may require some discussion first.
| r_sh_min = v_mp / (i_sc - i_mp) - (v_oc - v_mp) / i_mp | ||
|
|
||
| if r_sh_min <= 0: | ||
| raise ValueError("Villalva R_sh_min must be positive.") |
There was a problem hiding this comment.
I am unsure whether this is particularly helpful. The users never enters r_sh_min so do we not want to frame this in terms of one of the other user inputs? This value error would occur if, for example, v_mp=0, which is likely a typo from the user. Not saying we override the user making a mistake (garbage in garbage out, as usual) but I think the error message could be improved / framed in terms of user inputs rather than the internally calculated r_sh_min.
There was a problem hiding this comment.
It is a valid point to consider, @RDaxini. I concur with your observation. In practical scenarios, this error may not occur frequently. I will review this message to enhance its quality. Thank you for bringing this to my attention.
There was a problem hiding this comment.
Hi @RDaxini,
I've updated the error message as follows:
if r_sh_min <= 0:
raise ValueError(
"Invalid module specifications: the calculated minimum "
"shunt resistance is non-positive. Check the consistency "
"of v_mp, i_mp, v_oc, and i_sc."
)
I think this makes the error more informative by referring directly to the user inputs.
| resistance_series = R_s | ||
| resistance_shunt = R_sh_ref | ||
|
|
||
| return ( | ||
| photocurrent, | ||
| saturation_current, | ||
| resistance_series, | ||
| resistance_shunt, | ||
| nNsVth, | ||
| ) |
There was a problem hiding this comment.
I think we need to do some work to reconcile input/output types. R_s and R_sh are returned as plain floats, and I_0/nNsVth only follow temp_cell's type, so the outputs don't match the input type.
You could probably recycle the block at the end of calcparams_desoto that converts all outputs to the input type, and then add calcparams_villalva to the parametrized test_calcparams_*_returns_correct_Python_type tests in tests/test_pvsystem.py.
There was a problem hiding this comment.
Hi @RDaxini,
I've updated calcparams_villalva() to follow the same output-type handling approach used in calcparams_desoto(), ensuring consistent output types for scalar, NumPy array, and pandas Series inputs.
I've also added the parametrized test test_calcparams_villalva_returns_correct_Python_type() in tests/test_pvsystem.py.
Thanks for the suggestion!
Co-authored-by: Rajiv Daxini <143435106+RDaxini@users.noreply.github.com>
Co-authored-by: Rajiv Daxini <143435106+RDaxini@users.noreply.github.com>
Added a new test for calcparams_villalva to check Python types.
Hi @markcampanelli, First, apologies for the delayed response, and thank you for your comments and for sharing the PVfit example! The Villalva parameter extraction method can be applied independently at different operating conditions, provided that the corresponding I-V characteristic points are available. Alternatively, the parameters can be fitted once using the datasheet specifications at STC and then extrapolated to different irradiance and temperature conditions. In the current example, I followed the second approach. The reference parameters are extracted only once using As you mentioned, the implementation uses the short-circuit current ( I agree that comparing these extrapolated curves against IEC 61853-1 measurements would provide a more comprehensive validation of the model's predictive performance. The current example demonstrates the extrapolation procedure rather than an independent experimental validation. It might be helpful to clarify this distinction in the example documentation. Beyond this PR, I think this could also be an interesting direction for future research. One possibility would be to investigate an optimization strategy for the Villalva model in which the reference parameters are selected to minimize the overall I-V curve prediction errors across the IEC 61853-1 irradiance-temperature matrix, rather than focusing only on reproducing the maximum power point at STC. Since the Villalva extraction procedure explores different candidate series resistances and their corresponding parameters, it could provide a useful starting point for investigating solutions that improve model accuracy across a wider range of operating conditions. This could potentially lead to a more comprehensive parameter-fitting approach, with improved extrapolation performance compared with conventional STC-based fitting strategies. Thanks again for your valuable feedback! |
|
Needs an entry in the v0.16.2 whatsnew file. |
|
Coverage is fine, I think. The uncovered lines are in the fitting code in |
Removed an unnecessary blank line before the calcparams_desoto function.
Added new Villalva single-diode model parameter extraction method and corresponding calculation function.


docs/sphinx/source/referencefor API changes.docs/sphinx/source/whatsnewfor all changes. Includes link to the GitHub Issue with:issue:`num`or this Pull Request with:pull:`num`. Includes contributor name and/or GitHub username (link with:ghuser:`user`).remote-data) and Milestone are assigned to the Pull Request and linked Issue.