diff --git a/.all-contributorsrc b/.all-contributorsrc new file mode 100644 index 00000000..fd3ce011 --- /dev/null +++ b/.all-contributorsrc @@ -0,0 +1,187 @@ +{ + "projectName": "OpenOA", + "projectOwner": "NREL", + "repoType": "github", + "repoHost": "https://github.com", + "files": [ + "README.md" + ], + "imageSize": 100, + "commit": false, + "commitConvention": "angular", + "contributorsPerLine": 7, + "linkToUsage": true, + "contributors": [ + { + "login": "RHammond2", + "name": "Rob Hammond", + "avatar_url": "https://avatars.githubusercontent.com/u/13874373?v=4", + "profile": "https://www.linkedin.com/in/rob-hammond-33583756/", + "contributions": [ + "code", + "doc", + "review", + "tutorial", + "maintenance", + "ideas", + "fundingFinding" + ] + }, + { + "login": "jordanperr", + "name": "Jordan Perr-Sauer", + "avatar_url": "https://avatars.githubusercontent.com/u/355615?v=4", + "profile": "https://github.com/jordanperr", + "contributions": [ + "doc", + "code", + "review", + "tutorial", + "maintenance", + "ideas", + "fundingFinding" + ] + }, + { + "login": "ejsimley", + "name": "ejsimley", + "avatar_url": "https://avatars.githubusercontent.com/u/40040961?v=4", + "profile": "https://github.com/ejsimley", + "contributions": [ + "projectManagement", + "code", + "data", + "doc", + "review", + "tutorial", + "ideas", + "fundingFinding" + ] + }, + { + "login": "Dynorat", + "name": "Jason Fields", + "avatar_url": "https://avatars.githubusercontent.com/u/4141650?v=4", + "profile": "https://github.com/Dynorat", + "contributions": [ + "projectManagement", + "review", + "business", + "design", + "fundingFinding" + ] + }, + { + "login": "nbodini", + "name": "Nicola Bodini", + "avatar_url": "https://avatars.githubusercontent.com/u/55894604?v=4", + "profile": "https://github.com/nbodini", + "contributions": [ + "code", + "review", + "tutorial", + "ideas" + ] + }, + { + "login": "moptis", + "name": "moptis", + "avatar_url": "https://avatars.githubusercontent.com/u/32751681?v=4", + "profile": "https://github.com/moptis", + "contributions": [ + "code", + "data", + "doc", + "review", + "tutorial", + "ideas" + ] + }, + { + "login": "joejoeyjoseph", + "name": "Joseph Lee", + "avatar_url": "https://avatars.githubusercontent.com/u/22756182?v=4", + "profile": "https://github.com/joejoeyjoseph", + "contributions": [ + "code" + ] + }, + { + "login": "charlie9578", + "name": "Charlie", + "avatar_url": "https://avatars.githubusercontent.com/u/14888896?v=4", + "profile": "https://charlie9578.github.io/", + "contributions": [ + "code", + "data", + "doc", + "tutorial", + "ideas" + ] + }, + { + "login": "zheitkamp1", + "name": "zheitkamp1", + "avatar_url": "https://avatars.githubusercontent.com/u/53791791?v=4", + "profile": "https://github.com/zheitkamp1", + "contributions": [ + "code" + ] + }, + { + "login": "abbey2017", + "name": "Abiodun Timothy Olaoye", + "avatar_url": "https://avatars.githubusercontent.com/u/26353690?v=4", + "profile": "https://github.com/abbey2017", + "contributions": [ + "code" + ] + }, + { + "login": "kthyng", + "name": "Kristen Thyng", + "avatar_url": "https://avatars.githubusercontent.com/u/3487237?v=4", + "profile": "http://kristenthyng.com/", + "contributions": [ + "code" + ] + }, + { + "login": "rafmudaf", + "name": "Rafael M Mudafort", + "avatar_url": "https://avatars.githubusercontent.com/u/13797903?v=4", + "profile": "http://www.rafmudaf.com/", + "contributions": [ + "code" + ] + }, + { + "login": "sebastianpfaffel", + "name": "sebastianpfaffel", + "avatar_url": "https://avatars.githubusercontent.com/u/22168894?v=4", + "profile": "https://github.com/sebastianpfaffel", + "contributions": [ + "code" + ] + }, + { + "login": "nateagarwal", + "name": "nateagarwal", + "avatar_url": "https://avatars.githubusercontent.com/u/51377789?v=4", + "profile": "https://github.com/nateagarwal", + "contributions": [ + "code", + "review" + ] + }, + { + "login": "Var-Char", + "name": "Var-Char", + "avatar_url": "https://avatars.githubusercontent.com/u/16821332?v=4", + "profile": "https://github.com/Var-Char", + "contributions": [ + "code" + ] + } + ] +} diff --git a/.github/workflows/ci-tests.yml b/.github/workflows/ci-tests.yml index 370c3782..996055cc 100644 --- a/.github/workflows/ci-tests.yml +++ b/.github/workflows/ci-tests.yml @@ -2,9 +2,14 @@ name: Run Unit and Regression Tests with Code Coverage on: push: - branches: [ main, develop, develop_v3 ] - pull_request: - branches: [ main, develop, develop_v3 ] + branches: [main, develop] + pull_request: + branches: [main, develop] + paths-ignore: # No need to rerun all the tests if we're only editing documentation and examples + - "examples/**.ipynb" + - "sphinx/**" + - "**.md" + - "**.rst" schedule: - cron: "0 0 * * MON" diff --git a/MANIFEST.in b/MANIFEST.in index d355e5a9..9733e17b 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,3 +1,3 @@ include LICENSE.txt -include readme.md +include README.md diff --git a/README.md b/README.md new file mode 100644 index 00000000..303cbc81 --- /dev/null +++ b/README.md @@ -0,0 +1,343 @@ +OpenOA + +----- + +[![Journal of Open Source Software Badge](https://joss.theoj.org/papers/d635ef3c3784d49f6e81e07a0b35ff6b/status.svg)](https://joss.theoj.org/papers/d635ef3c3784d49f6e81e07a0b35ff6b) +[![PyPI version](https://badge.fury.io/py/openoa.svg)](https://badge.fury.io/py/openoa) +[![License](https://img.shields.io/badge/License-BSD_3--Clause-blue.svg)](https://opensource.org/licenses/BSD-3-Clause) +[![Gitter Badge](https://badges.gitter.im/NREL_OpenOA/community.svg)](https://gitter.im/NREL_OpenOA/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) +[![Binder Badge](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/NREL/OpenOA/main?filepath=examples) + +[![Documentation Badge](https://readthedocs.org/projects/openoa/badge/?version=latest)](https://openoa.readthedocs.io) +[![Code Coverage Badge](https://codecov.io/gh/NREL/OpenOA/branch/develop/graph/badge.svg)](https://codecov.io/gh/NREL/OpenOA) +[![PyPI downloads](https://img.shields.io/pypi/dm/openoa)](https://pypi.org/project/WOMBAT/) + +[![pre-commit](https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit&logoColor=white)](https://github.com/pre-commit/pre-commit) +[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black) +[![Imports: isort](https://img.shields.io/badge/%20imports-isort-%231674b1?style=flat&labelColor=ef8336)](https://pycqa.github.io/isort/) + +[![All Contributors](https://img.shields.io/badge/all_contributors-15-orange.svg?style=flat-square)](#contributors-) + + +----- + +## Software Overview + +- Jump to [installation instructions](#installation-and-usage). +- Demo the code by running the [example notebooks on Binder](https://mybinder.org/v2/gh/NREL/OpenOA/main?filepath=examples). +- Read the [documentation](https://openoa.readthedocs.io/en/latest/). +- Learn how to [contribute](contributing.md). + +OpenOA [^1] is a software framework written in Python for assessing wind plant performance using +operational assessment (OA) methodologies that consume time series data from wind plants. The goal +of the project is to provide an open source implementation of common data structures, analysis +methods, and utility functions relevant to wind plant OA, while providing a platform to collaborate +on new functionality. + +Development of OpenOA was motivated by the Wind Plant Performance Prediction (WP3) Benchmark project +[^2], led by the National Renewable Energy Laboratory (NREL), which focuses on quantifying and +understanding differences between the expected and actual energy production of wind plants. To +support the WP3 Benchmark project, OpenOA was initially developed to provide a baseline +implementation of a long-term operational annual energy production (AEP) estimation method. It has +since grown to incorporate several more OA analysis methods, lower-level utility functions, and a +schema for time-series data from wind power plants. + +> **Warning** +Warning OpenOA is a research software library and is released under a BSD-3 license. Please refer +to the accompanying [license file](LICENSE.txt) for the full terms. We encourage caution, use of +best practices, and engagement with subject matter experts when performing any data analysis. + +### Included Analysis Methods + +| Name | Description | Citations | +| --- | --- | --- | +| `MonteCarloAEP` | This routine estimates the long-term annual energy production (AEP) of a wind power plant (typically over 10-20 years) based on operational data from a shorter period of record (e.g., 1-3 years), along with the uncertainty. | [^3], [^4] | +| `TurbineLongTermGrossEnergy`| This routine estimates the long-term turbine ideal energy (TIE) of a wind plant, defined as the long-term AEP that would be generated by the wind plant if all turbines operated normally (i.e., no downtime, derating, or severe underperformance, but still subject to wake losses and moderate performance losses), along with the uncertainty. | [^5] | +| `ElectricalLosses`| The ElectricalLosses routine estimates the average electrical losses at a wind plant, along with the uncertainty, by comparing the energy produced at the wind turbines to the energy delivered to the grid. | [^5] | +| `EYAGapAnalysis`| This class is used to perform a gap analysis between the estimated AEP from a pre-construction energy yield estimate (EYA) and the actual AEP. The gap analysis compares different wind plant performance categories to help understand the sources of differences between EYA AEP estimates and actual AEP, specifically availability losses, electrical losses, and TIE. | [^5] | +| `WakeLosses`| This routine estimates long-term internal wake losses experienced by a wind plant and for each individual turbine, along with the uncertainty. | [^6]. Based in part on approaches in [^7], [^8], [^9] | +| `StaticYawMisalignment`| The StaticYawMisalignment routine estimates the static yaw misalignment for individual wind turbines as a function of wind speed by comparing the estimated wind vane angle at which power is maximized to the mean wind vane angle at which the turbines operate. The routine includes uncertainty quantification. **Warning: This method has not been validated using data from wind turbines with known static yaw misalignments and the results should be treated with caution.** | Based in part on approaches in [^10], [^11], [^12], [^13], [^14] | + +### PlantData Schema + +OpenOA contains a `PlantData` class, which is based on Pandas data frames and provides a +standardized base schema to combine raw data from wind turbines, meteorological (met) towers, +revenue meters, and reanalysis products, such as MERRA-2 or ERA5. Additionally, the `PlantData` +class can perform some basic validation for the data required to perform the operational analyses. + +### Utility Functions + +Lower-level utility modules are provided in the utils subpackage. +They can also be used individually to support general wind plant data analysis activities. +Some examples of utils modules include: + +- **Quality Assurance**: This module provides quality assurance methods for identifying potential + quality issues with SCADA data prior to importing it into a `PlantData` object. +- **Filters**: This module provides functions for flagging operational data based on a range of + criteria (e.g., outlier detection). +- **Power Curve**: The power curve module contains methods for fitting power curve models to SCADA data. +- **Imputing**: This module provides methods for filling in missing data with imputed values. +- **Met Data Processing**: This module contains methods for processing meteorological data, such as + computing air density and wind shear coefficients. +- **Plotting**: This module contains convenient functions for creating plots, such as power curve + plots and maps showing the wind plant layout. + +For further information about the features and citations, please see the +[OpenOA documentation website](https://openoa.readthedocs.io/en/latest/). + +## How to cite OpenOA + +**To cite analysis methods or individual features:** Please cite the original authors of these +methods, as noted in the [documentation](#included-analysis-methods) and inline comments. + +**To cite the open-source software framework as a whole, or the OpenOA open source development +effort more broadly,** please use citation [^1], which is provided below in BibTeX: + +```bibtex + @article{Perr-Sauer2021, + doi = {10.21105/joss.02171}, + url = {https://doi.org/10.21105/joss.02171}, + year = {2021}, + publisher = {The Open Journal}, + volume = {6}, + number = {58}, + pages = {2171}, + author = {Jordan Perr-Sauer and Mike Optis and Jason M. Fields and Nicola Bodini and Joseph C.Y. Lee and Austin Todd and Eric Simley and Robert Hammond and Caleb Phillips and Monte Lunacek and Travis Kemper and Lindy Williams and Anna Craig and Nathan Agarwal and Shawn Sheng and John Meissner}, + title = {OpenOA: An Open-Source Codebase For Operational Analysis of Wind Farms}, + journal = {Journal of Open Source Software} + } +``` + +## Installation and Usage + +### Requirements + +- Python 3.8-3.11 with pip. + +We strongly recommend using the Anaconda Python distribution and creating a new conda environment +for OpenOA. You can download Anaconda through +[their website.](https://www.anaconda.com/products/individual) + +After installing Anaconda, create and activate a new conda environment with the name "openoa-env": + +```bash +conda create --name openoa-env python=3.10 +conda activate openoa-env +``` + +### Installation + +Clone the repository and install the library and its dependencies using pip: + +```bash +git clone https://github.com/NREL/OpenOA.git +cd OpenOA +pip install . +``` + +You should now be able to import OpenOA from the Python interpreter: + +```bash +python +>>> import openoa +>>> openoa.__version__ +``` + +#### Installation Options + +There are a number of installation options that can be used, depending on the use case, which can be +installed with the following pattern `pip install "openoa[opt1,opt2]"` (`pip install .[opt1,opt2]` +is also allowed). + +- `develop`: for linting, automated formatting, and testing +- `docs`: for building the documentation +- `examples`: for the full Jupyter Lab suite (also contains `reanalysis` and `nrel-wind`) +- `renalysis`: for accessing and processing MERRA2 and ERA5 data +- `nrel-wind`: for accessing the NREL WIND Toolkit +- `all`: for the complete dependency stack + +> **Important** +> If using Python 3.11, install `openoa` only, then reinstall adding the modifiers to reduce +> the amount of time it takes for pip to resolve the dependency stack. + +#### Common Installation Issues + +- In Windows, you may get an error regarding geos_c.dll. To fix this, install Shapely using: + +```bash +conda install Shapely +``` + +- In Windows, an `ImportError` regarding win32api can also occur. This can be resolved by fixing +- the version of pywin32 as follows: + +```bash +pip install --upgrade pywin32==255 +``` + +#### Example Notebooks and Data + +Be sure to install OpenOA using the `examples` modifier from [above](#installation-options). Such +as: `pip install ".[examples]"` + +The example data will be automatically extracted as needed by the tests. To manually extract the +example data for use with the example notebooks, use the following command: + +```bash +unzip examples/data/la_haute_borne.zip -d examples/data/la_haute_borne/ +``` + +The example notebooks are located in the `examples` directory. We suggest installing the Jupyter +notebook server to run the notebooks interactively. The notebooks can also be viewed statically on +[Read The Docs](http://openoa.readthedocs.io/en/latest/examples). + +```bash +jupyter lab # "jupyter notebook" is also ok if that's your preference +``` + +Open the URL printed to your command prompt in your favorite browser. Once Jupyter is open, navigate +to the "examples" directory in the file explorer and open an example notebook. + +### Development + +Please see the developer section of the contributing guide [here](contributing.md), or on the +[documentation site](https://openoa.readthedocs.io/en/latest/getting_started/contributing.html) for +complete details. + +Development dependencies are provided through the "develop" extra flag in setup.py. Here, we install +OpenOA, with development dependencies, in editable mode, and activate the pre-commit workflow (note: +this second step must be done before committing any changes): + +```bash +cd OpenOA +pip install -e ".[develop, docs, examples]" +pre-commit install +``` + +Occasionally, you will need to update the dependencies in the pre-commit workflow, which will +provide an error when this needs to happen. When it does, this can normally be resolved with the +below code, after which you can continue with your normal git workflow: + +```bash +pre-commit autoupdate +git add .pre-commit-config.yaml +``` + +#### Testing +Tests are written in the Python unittest or pytest framework and are run using pytest. There +are two types of tests, unit tests (located in `test/unit`) run quickly and are automatically for +every pull request to the OpenOA repository. Regression tests (located at `test/regression`) provide +a comprehensive suite of scientific tests that may take a long time to run (up to 20 minutes on our +machines). These tests should be run locally before submitting a pull request, and are run weekly on +the develop and main branches. + +To run all unit and regression tests: + +```bash +pytest +``` + +To run unit tests only: + +```bash +pytest --unit +``` + +To run all tests and generate a code coverage report + +```bash +pytest --cov=openoa +``` + +#### Documentation + +Documentation is automatically built by, and visible through +[Read The Docs](http://openoa.readthedocs.io/). + +You can build the documentation with [sphinx](http://www.sphinx-doc.org/en/stable/), but will need +to ensure [Pandoc is installed](https://pandoc.org/installing.html) on your computer first. + +```bash +cd OpenOA +pip install -e ".[docs]" +cd sphinx +make html +``` + +## Contributors โœจ + +Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)): + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Rob Hammond
Rob Hammond

๐Ÿ’ป ๐Ÿ“– ๐Ÿ‘€ โœ… ๐Ÿšง ๐Ÿค” ๐Ÿ”
Jordan Perr-Sauer
Jordan Perr-Sauer

๐Ÿ“– ๐Ÿ’ป ๐Ÿ‘€ โœ… ๐Ÿšง ๐Ÿค” ๐Ÿ”
ejsimley
ejsimley

๐Ÿ“† ๐Ÿ’ป ๐Ÿ”ฃ ๐Ÿ“– ๐Ÿ‘€ โœ… ๐Ÿค” ๐Ÿ”
Jason Fields
Jason Fields

๐Ÿ“† ๐Ÿ‘€ ๐Ÿ’ผ ๐ŸŽจ ๐Ÿ”
Nicola Bodini
Nicola Bodini

๐Ÿ’ป ๐Ÿ‘€ โœ… ๐Ÿค”
moptis
moptis

๐Ÿ’ป ๐Ÿ”ฃ ๐Ÿ“– ๐Ÿ‘€ โœ… ๐Ÿค”
Joseph Lee
Joseph Lee

๐Ÿ’ป
Charlie
Charlie

๐Ÿ’ป ๐Ÿ”ฃ ๐Ÿ“– โœ… ๐Ÿค”
zheitkamp1
zheitkamp1

๐Ÿ’ป
Abiodun Timothy Olaoye
Abiodun Timothy Olaoye

๐Ÿ’ป
Kristen Thyng
Kristen Thyng

๐Ÿ’ป
Rafael M Mudafort
Rafael M Mudafort

๐Ÿ’ป
sebastianpfaffel
sebastianpfaffel

๐Ÿ’ป
nateagarwal
nateagarwal

๐Ÿ’ป ๐Ÿ‘€
Var-Char
Var-Char

๐Ÿ’ป
+ + Add your contributions + +
+ + + + + +This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome! + +## References + +[^1]: Perr-Sauer, J., and Optis, M., Fields, J.M., Bodini, N., Lee, J.C.Y., Todd, A., Simley, E., Hammond, R., Phillips, C., Lunacek, M., Kemper, T., Williams, L., Craig, A., Agarwal, N., Sheng, S., and Meissner, J. OpenOA: An Open-Source Codebase For Operational Analysis of Wind Farms. *Journal of Open Source Software*, 6(58):2171 (2022). https://doi.org/10.21105/joss.02171. + +[^2]: Fields, M. J., Optis, M., Perr-Sauer, J., Todd, A., Lee, J. C. Y., Meissner, J., Simley, E., Bodini, N., Williams, L., Sheng, S., and Hammond, R.. Wind plant performance prediction benchmark phase 1 technical report, NREL/TP-5000-78715. Technical Report, National Renewable Energy Laboratory, Golden, CO (2021). https://doi.org/10.2172/1826665. + +[^3]: Bodini, N. & Optis, M. Operational-based annual energy production uncertainty: are its components actually uncorrelated? *Wind Energy Science* 5(4):1435โ€“1448 (2020). https://doi.org/10.5194/wes-5-1435-2020. + +[^4]: Bodini, N., Optis, M., Perr-Sauer, J., Simley, E., and Fields, M. J. Lowering post-construction yield assessment uncertainty through better wind plant power curves. *Wind Energy*, 25(1):5โ€“22 (2022). https://doi.org/10.1002/we.2645. + +[^5]: Todd, A. C., Optis, M., Bodini, N., Fields, M. J., Lee, J. C. Y., Simley, E., and Hammond, R. An independent analysis of bias sources and variability in wind plant preโ€construction energy yield estimation methods. *Wind Energy*, 25(10):1775-1790 (2022). https://doi.org/10.1002/we.2768. + +[^6]: Simley, E., Fields, M. J., Perr-Sauer, J., Hammond, R., and Bodini, N. A Comparison of Preconstruction and Operational Wake Loss Estimates for Land-Based Wind Plants. Presented at the NAWEA/WindTech 2022 Conference, Newark, DE, September 20-22 (2022). https://www.nrel.gov/docs/fy23osti/83874.pdf. + +[^7]: Barthelmie, R. J. and Jensen, L. E. Evaluation of wind farm efficiency and wind turbine wakes at the Nysted offshore wind farm, *Wind Energy* 13(6):573โ€“586 (2010). https://doi.org/10.1002/we.408. + +[^8]: Nygaard, N. G. Systematic quantification of wake model uncertainty. Proc. EWEA Offshore, Copenhagen, Denmark, March 10-12 (2015). + +[^9]: Walker, K., Adams, N., Gribben, B., Gellatly, B., Nygaard, N. G., Henderson, A., Marchante Jimรฉmez, M., Schmidt, S. R., Rodriguez Ruiz, J., Paredes, D., Harrington, G., Connell, N., Peronne, O., Cordoba, M., Housley, P., Cussons, R., Hรฅkansson, M., Knauer, A., and Maguire, E.: An evaluation of the predictive accuracy of wake effects models for offshore wind farms. *Wind Energy* 19(5):979โ€“996 (2016). https://doi.org/10.1002/we.1871. + +[^10]: Bao, Y., Yang, Q., Fu, L., Chen, Q., Cheng, C., and Sun, Y. Identification of Yaw Error Inherent Misalignment for Wind Turbine Based on SCADA Data: A Data Mining Approach. Proc. 12th Asian Control Conference (ASCC), Kitakyushu, Japan, June 9-12 (2019). 1095-1100. + +[^11]: Xue, J. and Wang, L. Online data-driven approach of yaw error estimation and correction of horizontal axis wind turbine. *IET J. Eng.* 2019(18):4937โ€“4940 (2019). https://doi.org/10.1049/joe.2018.9293. + +[^12]: Astolfi, D., Castellani, F., and Terzi, L. An Operation Data-Based Method for the Diagnosis of Zero-Point Shift of Wind Turbines Yaw Angle. *J. Solar Energy Engineering* 142(2):024501 (2020). https://doi.org/10.1115/1.4045081. + +[^13]: Jing, B., Qian, Z., Pei, Y., Zhang, L., and Yang, T. Improving wind turbine efficiency through detection and calibration of yaw misalignment. *Renewable Energy* 160:1217-1227 (2020). https://doi.org/10.1016/j.renene.2020.07.063. + +[^14]: Gao, L. and Hong, J. Data-driven yaw misalignment correction for utility-scale wind turbines. *J. Renewable Sustainable Energy* 13(6):063302 (2021). https://doi.org/10.1063/5.0056671. diff --git a/openoa/analysis/wake_losses.py b/openoa/analysis/wake_losses.py index 8f2ae436..ac4ca477 100644 --- a/openoa/analysis/wake_losses.py +++ b/openoa/analysis/wake_losses.py @@ -8,10 +8,17 @@ # The general approach for estimating wake losses and quantifying uncertainty using bootstrapping # is based in part on the following publications: -# 1. N. G. Nygaard, "Systematic quantification of wake model uncertainty,"" Proc. EWEA Offshore, -# Copenhagen, Denmark, 2015. -# 2. J. Xue and L. Wang, โ€œOnline data-driven approach of yaw error estimation and correction of -# horizontal axis wind turbine,โ€ IET J. Eng., 2019(18), 4937โ€“4940, 2019. +# 1. Barthelmie, R. J. and Jensen, L. E. Evaluation of wind farm efficiency and wind turbine wakes +# at the Nysted offshore wind farm, *Wind Energy* 13(6):573โ€“586 (2010). +# https://doi.org/10.1002/we.408. +# 2. Nygaard, N. G. Systematic quantification of wake model uncertainty. Proc. EWEA Offshore, +# Copenhagen, Denmark, March 10-12 (2015). +# 3. Walker, K., Adams, N., Gribben, B., Gellatly, B., Nygaard, N. G., Henderson, A., Marchante +# Jimรฉmez, M., Schmidt, S. R., Rodriguez Ruiz, J., Paredes, D., Harrington, G., Connell, N., +# Peronne, O., Cordoba, M., Housley, P., Cussons, R., Hรฅkansson, M., Knauer, A., and Maguire, +# E.: An evaluation of the predictive accuracy of wake effects models for offshore wind farms. +# *Wind Energy* 19(5):979โ€“996 (2016). https://doi.org/10.1002/we.1871. + from __future__ import annotations diff --git a/openoa/analysis/yaw_misalignment.py b/openoa/analysis/yaw_misalignment.py index 4a3f33d5..954b5746 100644 --- a/openoa/analysis/yaw_misalignment.py +++ b/openoa/analysis/yaw_misalignment.py @@ -9,18 +9,22 @@ # averaged over all wind speed bins is calculated. # # Many parts of this method are based on or inspired by the following publications: -# 1. Y. Bao, Q. Yang, L. Fu, Q. Chen, C. Cheng, and Y. Sun, "Identification of Yaw Error Inherent -# Misalignment for Wind Turbine Based on SCADA Data: A Data Mining Approach," Proc. 12th Asian -# Control Conference (ASCC), Kitakyushu, Japan, 1095-1100, 2019. -# 2. J. Xue and L. Wang, โ€œOnline data-driven approach of yaw error estimation and correction of -# horizontal axis wind turbine,โ€ IET J. Eng., 2019(18), 4937โ€“4940, 2019. -# 3. D. Astolfi, F. Castellani, and L. Terzi, โ€œAn Operation Data-Based Method for the Diagnosis of -# Zero-Point Shift of Wind Turbines Yaw Angle,โ€ J. Solar Energy Engineering, 142, 024501, 2020. -# 4. B. Jing, Z. Qian, Y. Pei, L. Zhang, and T. Yang, "Improving wind turbine efficiency through -# detection and calibration of yaw misalignment," Renewable Energy, 160, 1217-1227, 2020. -# 5. L. Gao and J. Hong, โ€œData-driven yaw misalignment correction for utility-scale wind turbines,โ€ -# J. Renewable Sustainable Energy, 13, 063302, 2021. -# + +# 1. Bao, Y., Yang, Q., Fu, L., Chen, Q., Cheng, C., and Sun, Y. Identification of Yaw Error +# Inherent Misalignment for Wind Turbine Based on SCADA Data: A Data Mining Approach. Proc. 12th +# Asian Control Conference (ASCC), Kitakyushu, Japan, June 9-12 (2019). 1095-1100. +# 2. Xue, J. and Wang, L. Online data-driven approach of yaw error estimation and correction of +# horizontal axis wind turbine. *IET J. Eng.* 2019(18):4937โ€“4940 (2019). +# https://doi.org/10.1049/joe.2018.9293. +# 3. Astolfi, D., Castellani, F., and Terzi, L. An Operation Data-Based Method for the Diagnosis of +# Zero-Point Shift of Wind Turbines Yaw Angle. *J. Solar Energy Engineering* 142(2):024501 +# (2020). https://doi.org/10.1115/1.4045081. +# 4. Jing, B., Qian, Z., Pei, Y., Zhang, L., and Yang, T. Improving wind turbine efficiency through +# detection and calibration of yaw misalignment. *Renewable Energy* 160:1217-1227 (2020). +# https://doi.org/10.1016/j.renene.2020.07.063. +# 5. Gao, L. and Hong, J. Data-driven yaw misalignment correction for utility-scale wind turbines. +# *J. Renewable Sustainable Energy* 13(6):063302 (2021). https://doi.org/10.1063/5.0056671. + # WARNING: This is a relatively simple method that has not yet been validated using data from wind # turbines with known static yaw misalignments. Therefore, the results should be treated with # caution. One known issue is that the method currently relies on nacelle wind speed measurements diff --git a/openoa/logging.py b/openoa/logging.py index 242a3dfb..003009c6 100644 --- a/openoa/logging.py +++ b/openoa/logging.py @@ -3,6 +3,7 @@ import logging import logging.config from pathlib import Path +from functools import wraps def setup_logging( @@ -25,6 +26,7 @@ def setup_logging( def logged_method_call(the_method, msg="call"): + @wraps(the_method) def _wrapper(self, *args, **kwargs): logger = logging.getLogger(the_method.__module__) logger.debug(f"{self.__class__.__name__}#{id(self)}.{the_method.__name__}: {msg}") @@ -35,6 +37,7 @@ def _wrapper(self, *args, **kwargs): def logged_function_call(the_function, msg="call"): + @wraps(the_function) def _wrapper(*args, **kwargs): logger = logging.getLogger(the_function.__module__) logger.debug(f"{the_function.__name__}: {msg}") diff --git a/pyproject.toml b/pyproject.toml index b916872c..7ea20c2d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -9,7 +9,7 @@ version = "attr: openoa.__version__" name = "OpenOA" dynamic = ["version"] authors = [{name = "NREL PRUF OA Team", email = "openoa@nrel.gov"}] -readme = {file = "readme.md", content-type = "text/markdown"} +readme = {file = "README.md", content-type = "text/markdown"} description = "A package for collecting and assigning wind turbine metrics" requires-python = ">=3.8, <3.12" license = {file = "LICENSE.txt"} diff --git a/readme.md b/readme.md deleted file mode 100644 index a2876e42..00000000 --- a/readme.md +++ /dev/null @@ -1,195 +0,0 @@ -OpenOA - -[![Binder Badge](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/NREL/OpenOA/develop_v3?filepath=examples) [![Gitter Badge](https://badges.gitter.im/NREL_OpenOA/community.svg)](https://gitter.im/NREL_OpenOA/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) [![Journal of Open Source Software Badge](https://joss.theoj.org/papers/d635ef3c3784d49f6e81e07a0b35ff6b/status.svg)](https://joss.theoj.org/papers/d635ef3c3784d49f6e81e07a0b35ff6b) - -[![Documentation Badge](https://readthedocs.org/projects/openoa/badge/?version=latest)](https://openoa.readthedocs.io) ![Tests Badge](https://github.com/NREL/OpenOA/workflows/Tests/badge.svg?branch=develop) [![Code Coverage Badge](https://codecov.io/gh/NREL/OpenOA/branch/develop/graph/badge.svg)](https://codecov.io/gh/NREL/OpenOA) - -[![pre-commit](https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit&logoColor=white)](https://github.com/pre-commit/pre-commit) [![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black) [![Imports: isort](https://img.shields.io/badge/%20imports-isort-%231674b1?style=flat&labelColor=ef8336)](https://pycqa.github.io/isort/) - ------ - -This library provides a framework for working with large timeseries data from wind plants, such as SCADA. -Its development has been motivated by the WP3 Benchmarking (PRUF) project, -which aims to provide a reference implementation for plant-level performance assessment. - -Analysis routines are grouped by purpose into methods, -and these methods in turn rely on more abstract toolkits. -In addition to the provided analysis methods, -anyone can write their own, which is intended to provide natural -growth of tools within this framework. - -The library is written around Pandas Data Frames, utilizing a flexible backend -so that data loading, processing, and analysis could be performed using other libraries, -such as Dask and Spark, in the future. - -If you would like to try out the code before installation or simply explore the possibilities, please see our examples on [Binder](https://mybinder.org/v2/gh/NREL/OpenOA/develop_v3?filepath=examples). - -If you use this software in your work, please cite our JOSS article with the following BibTex: - -```bibtex -@article{Perr-Sauer2021, - doi = {10.21105/joss.02171}, - url = {https://doi.org/10.21105/joss.02171}, - year = {2021}, - publisher = {The Open Journal}, - volume = {6}, - number = {58}, - pages = {2171}, - author = {Jordan Perr-Sauer and Mike Optis and Jason M. Fields and Nicola Bodini and Joseph C.Y. Lee and Austin Todd and Eric Simley and Robert Hammond and Caleb Phillips and Monte Lunacek and Travis Kemper and Lindy Williams and Anna Craig and Nathan Agarwal and Shawn Sheng and John Meissner}, - title = {OpenOA: An Open-Source Codebase For Operational Analysis of Wind Farms}, - journal = {Journal of Open Source Software} -} -``` - -### Requirements - -- Python 3.8-3.11 with pip. - -We strongly recommend using the Anaconda Python distribution and creating a new conda environment for OpenOA. You can download Anaconda through [their website.](https://www.anaconda.com/products/individual) - -After installing Anaconda, create and activate a new conda environment with the name "openoa-env": - -```bash -conda create --name openoa-env python=3.10 -conda activate openoa-env -``` - -### Installation - -Clone the repository and install the library and its dependencies using pip: - -```bash -git clone https://github.com/NREL/OpenOA.git -cd OpenOA -pip install . -``` - -You should now be able to import openoa from the Python interpreter: - -```bash -python ->>> import openoa ->>> openoa.__version__ -``` - -#### Installation Options - -There are a number of installation options that can be used, depending on the use case, which can be -installed with the following pattern `pip install "openoa[opt1,opt2]"` (`pip install .[opt1,opt2]` is also allowed). - -- `develop`: for linting, automated formatting, and testing -- `docs`: for building the documentation -- `examples`: for the full Jupyter Lab suite (also contains `reanalysis` and `nrel-wind`) -- `renalysis`: for accessing and processing MERRA2 and ERA5 data -- `nrel-wind`: for accessing the NREL WIND Toolkit -- `all`: for the complete dependency stack - -> **Important** -> If using Python 3.11, install `openoa` only, then reinstall adding the modifiers to reduce -> the amount of time it takes for pip to resolve the dependency stack. - -#### Common Installation Issues - -- In Windows you may get an error regarding geos_c.dll. To fix this install Shapely using: - -```bash -conda install Shapely -``` - -- In Windows, an ImportError regarding win32api can also occur. This can be resolved by fixing the version of pywin32 as follows: - -```bash -pip install --upgrade pywin32==255 -``` - -#### Example Notebooks and Data - -Be sure to install OpenOA using the `examples` modifier from [above](#installation-options). Such as: `pip install ".[examples]"` - -The example data will be automaticaly extracted as needed by the tests. To manually extract the example data for use with the example notebooks, use the following command: - -```bash -unzip examples/data/la_haute_borne.zip -d examples/data/la_haute_borne/ -``` - -The example notebooks are located in the `examples` directory. We suggest installing the Jupyter notebook server to run the notebooks interactively. The notebooks can also be viewed statically on [Read The Docs](http://openoa.readthedocs.io/en/latest/examples). - -```bash -jupyter lab # "jupyter notebook" is also ok if that's your preference -``` - -Open the URL printed to your command prompt in your favorite browser. Once jupyter is open, navigate to the "examples" directory in the file explorer and open an example notebook. - -### Development - -Please see the developer section of the contributing guide [here](contributing.md), or on the [documentation site](https://openoa.readthedocs.io/en/latest/getting_started/contributing.html) for complete details. - -Development dependencies are provided through the develop extra flag in setup.py. Here, we install -OpenOA, with development dependencies, in editable mode, and activate the pre-commit workflow (note: -this second step must be done before committing any changes): - -```bash -cd OpenOA -pip install -e ".[develop, docs, examples]" -pre-commit install -``` - -Occasionally, you will need to update the dependencies in the pre-commit workflow, which will provide an error when this needs to happen. When it does, this can normally be resolved with the below code, after which you can continue with your normal git workflow: - -```bash -pre-commit autoupdate -git add .pre-commit-config.yaml -``` - -#### Testing -Tests are written in the Python unittest or pytest framework and are runnable using pytest. There -are two types of tests, unit tests (located in `test/unit`) run quickly and are automatically for -every pull request to the OpenOA repository. Regression tests (located at `test/regression`) provide -a comprehensive suite of scientific tests that may take a long time to run (up to 20 minutes on our -machines). These tests should be run locally before submitting a pull request, and are run weekly on -the develop and main branches. - -To run all unit and regresison tests: - -```bash -pytest -``` - -To run unit tests only: - -```bash -pytest --unit -``` - -To run all tests and generate a code coverage report - -```bash -pytest --cov=openoa -``` - -#### Documentation - -Documentation is automatically built by, and visible through -[Read The Docs](http://openoa.readthedocs.io/). - -You can build the documentation with [sphinx](http://www.sphinx-doc.org/en/stable/), but will need -to ensure [Pandoc is installed](https://pandoc.org/installing.html) on your computer first. - -```bash -cd OpenOA -pip install -e ".[docs]" -cd sphinx -make html -``` - -### Contributors - - - - - - - - - -[![All Contributors](https://img.shields.io/github/all-contributors/NREL/OpenOA?color=ee8449&style=flat-square)](#contributors) diff --git a/sphinx/conf.py b/sphinx/conf.py index e11132ed..148967c7 100644 --- a/sphinx/conf.py +++ b/sphinx/conf.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- # # Operational Analysis documentation build configuration file, created by # sphinx-quickstart on Fri Dec 8 11:30:30 2017. @@ -75,7 +74,7 @@ # # Read the version from the __init__.py file without importing it def read(*names, **kwargs): - with io.open( + with open( os.path.join(os.path.dirname(__file__)[:-7], *names), encoding=kwargs.get("encoding", "utf8"), ) as fp: @@ -131,7 +130,7 @@ def find_version(*file_paths): html_theme_options = { "github_url": "https://github.com/NREL/OpenOA", "navbar_start": ["navbar-logo"], - "show_toc_level": 2, + "show_toc_level": 3, "show_nav_level": 2, "navigation_depth": 2, "collapse_navigation": True, diff --git a/sphinx/index.md b/sphinx/index.md new file mode 100644 index 00000000..11f54cd1 --- /dev/null +++ b/sphinx/index.md @@ -0,0 +1,158 @@ +# OpenOA Documentation + +## Software Overview + +OpenOA [^1] is a software framework written in Python for assessing wind plant performance using +operational assessment (OA) methodologies that consume time series data from wind plants. The goal +of the project is to provide an open source implementation of common data structures, analysis +methods, and utility functions relevant to wind plant OA, while providing a platform to collaborate +on new functionality. + +Development of OpenOA was motivated by the Wind Plant Performance Prediction (WP3) Benchmark project +[^2], led by the National Renewable Energy Laboratory (NREL), which focuses on quantifying and +understanding differences between the expected and actual energy production of wind plants. To +support the WP3 Benchmark project, OpenOA was initially developed to provide a baseline +implementation of a long-term operational annual energy production (AEP) estimation method. It has +since grown to incorporate several more OA analysis methods, lower-level utility functions, and a +schema for time-series data from wind power plants. + +```{warning} +OpenOA is a research software library and is released under a BSD-3 license. Please refer +to the accompanying [license file](https://github.com/NREL/OpenOA/blob/docs/main/LICENSE.txt) for +the full terms. We encourage caution, use of best practices, and engagement with subject matter +experts when performing any data analysis. +``` + +### Analysis Methods + +| Name | Description | Citations | +| --- | --- | --- | +| `MonteCarloAEP` | This routine estimates the long-term annual energy production (AEP) of a wind power plant (typically over 10-20 years) based on operational data from a shorter period of record (e.g., 1-3 years), along with the uncertainty. | [^3], [^4] | +| `TurbineLongTermGrossEnergy`| This routine estimates the long-term turbine ideal energy (TIE) of a wind plant, defined as the long-term AEP that would be generated by the wind plant if all turbines operated normally (i.e., no downtime, derating, or severe underperformance, but still subject to wake losses and moderate performance losses), along with the uncertainty. | [^5] | +| `ElectricalLosses`| The ElectricalLosses routine estimates the average electrical losses at a wind plant, along with the uncertainty, by comparing the energy produced at the wind turbines to the energy delivered to the grid. | [^5] | +| `EYAGapAnalysis`| This class is used to perform a gap analysis between the estimated AEP from a pre-construction energy yield estimate (EYA) and the actual AEP. The gap analysis compares different wind plant performance categories to help understand the sources of differences between EYA AEP estimates and actual AEP, specifically availability losses, electrical losses, and TIE. | [^5] | +| `WakeLosses`| This routine estimates long-term internal wake losses experienced by a wind plant and for each individual turbine, along with the uncertainty. | [^6]. Based in part on approaches in [^7], [^8], [^9] | +| `StaticYawMisalignment`| The StaticYawMisalignment routine estimates the static yaw misalignment for individual wind turbines as a function of wind speed by comparing the estimated wind vane angle at which power is maximized to the mean wind vane angle at which the turbines operate. The routine includes uncertainty quantification. **Warning: This method has not been validated using data from wind turbines with known static yaw misalignments and the results should be treated with caution.** | Based in part on approaches in [^10], [^11], [^12], [^13], [^14] | + +### PlantData Schema + +OpenOA contains a `PlantData` class, which is based on Pandas data frames and provides a +standardized base schema to combine raw data from wind turbines, meteorological (met) towers, +revenue meters, and reanalysis products, such as MERRA-2 or ERA5. Additionally, the `PlantData` +class can perform some basic validation for the data required to perform the operational analyses. + +### Utility Functions + +Lower-level utility modules are provided in the utils subpackage. +They can also be used individually to support general wind plant data analysis activities. +Some examples of utils modules include: + +- **Quality Assurance**: This module provides quality assurance methods for identifying potential + quality issues with SCADA data prior to importing it into a `PlantData` object. +- **Filters**: This module provides functions for flagging operational data based on a range of + criteria (e.g., outlier detection). +- **Power Curve**: The power curve module contains methods for fitting power curve models to SCADA data. +- **Imputing**: This module provides methods for filling in missing data with imputed values. +- **Met Data Processing**: This module contains methods for processing meteorological data, such as + computing air density and wind shear coefficients. +- **Plotting**: This module contains convenient functions for creating plots, such as power curve + plots and maps showing the wind plant layout. + +For further information about the features and citations, please see the +[OpenOA documentation website](https://openoa.readthedocs.io/en/latest/). + +## Installation + +Compatible with Python 3.8 through 3.11 with pip. + +We strongly recommend using the Anaconda Python distribution and creating a new conda environment +for OpenOA. You can download Anaconda through +[their website.](https://www.anaconda.com/products/individual) + +After installing Anaconda, create and activate a new conda environment with the name "openoa-env": + +```bash +conda create --name openoa-env python=3.10 +conda activate openoa-env +``` + +### Source Code + +Clone the repository and install the library and its dependencies using pip: + +```bash +git clone https://github.com/NREL/OpenOA.git +cd OpenOA +pip install . +``` + +### Pip + +```bash +pip install openoa +``` + +## Citing OpenOA + +**To cite analysis methods or individual features:** Please cite the original authors of these +methods, as noted in the [documentation](#analysis-methods) and inline comments. + +**To cite the open-source software framework as a whole, or the OpenOA open source development +effort more broadly,** please use citation [^1], which is provided below in BibTeX: + +```bibtex + @article{Perr-Sauer2021, + doi = {10.21105/joss.02171}, + url = {https://doi.org/10.21105/joss.02171}, + year = {2021}, + publisher = {The Open Journal}, + volume = {6}, + number = {58}, + pages = {2171}, + author = {Jordan Perr-Sauer and Mike Optis and Jason M. Fields and Nicola Bodini and Joseph C.Y. Lee and Austin Todd and Eric Simley and Robert Hammond and Caleb Phillips and Monte Lunacek and Travis Kemper and Lindy Williams and Anna Craig and Nathan Agarwal and Shawn Sheng and John Meissner}, + title = {OpenOA: An Open-Source Codebase For Operational Analysis of Wind Farms}, + journal = {Journal of Open Source Software} + } +``` + +## Documentation Table of Contents + +```{eval-rst} +.. toctree:: + :maxdepth: 2 + + getting_started/index + examples/index + api/index + credit +``` + +## References + +[^1]: Perr-Sauer, J., and Optis, M., Fields, J.M., Bodini, N., Lee, J.C.Y., Todd, A., Simley, E., Hammond, R., Phillips, C., Lunacek, M., Kemper, T., Williams, L., Craig, A., Agarwal, N., Sheng, S., and Meissner, J. OpenOA: An Open-Source Codebase For Operational Analysis of Wind Farms. *Journal of Open Source Software*, 6(58):2171 (2022). https://doi.org/10.21105/joss.02171. + +[^2]: Fields, M. J., Optis, M., Perr-Sauer, J., Todd, A., Lee, J. C. Y., Meissner, J., Simley, E., Bodini, N., Williams, L., Sheng, S., and Hammond, R.. Wind plant performance prediction benchmark phase 1 technical report, NREL/TP-5000-78715. Technical Report, National Renewable Energy Laboratory, Golden, CO (2021). https://doi.org/10.2172/1826665. + +[^3]: Bodini, N. & Optis, M. Operational-based annual energy production uncertainty: are its components actually uncorrelated? *Wind Energy Science* 5(4):1435โ€“1448 (2020). https://doi.org/10.5194/wes-5-1435-2020. + +[^4]: Bodini, N., Optis, M., Perr-Sauer, J., Simley, E., and Fields, M. J. Lowering post-construction yield assessment uncertainty through better wind plant power curves. *Wind Energy*, 25(1):5โ€“22 (2022). https://doi.org/10.1002/we.2645. + +[^5]: Todd, A. C., Optis, M., Bodini, N., Fields, M. J., Lee, J. C. Y., Simley, E., and Hammond, R. An independent analysis of bias sources and variability in wind plant preโ€construction energy yield estimation methods. *Wind Energy*, 25(10):1775-1790 (2022). https://doi.org/10.1002/we.2768. + +[^6]: Simley, E., Fields, M. J., Perr-Sauer, J., Hammond, R., and Bodini, N. A Comparison of Preconstruction and Operational Wake Loss Estimates for Land-Based Wind Plants. Presented at the NAWEA/WindTech 2022 Conference, Newark, DE, September 20-22 (2022). https://www.nrel.gov/docs/fy23osti/83874.pdf. + +[^7]: Barthelmie, R. J. and Jensen, L. E. Evaluation of wind farm efficiency and wind turbine wakes at the Nysted offshore wind farm, *Wind Energy* 13(6):573โ€“586 (2010). https://doi.org/10.1002/we.408. + +[^8]: Nygaard, N. G. Systematic quantification of wake model uncertainty. Proc. EWEA Offshore, Copenhagen, Denmark, March 10-12 (2015). + +[^9]: Walker, K., Adams, N., Gribben, B., Gellatly, B., Nygaard, N. G., Henderson, A., Marchante Jimรฉmez, M., Schmidt, S. R., Rodriguez Ruiz, J., Paredes, D., Harrington, G., Connell, N., Peronne, O., Cordoba, M., Housley, P., Cussons, R., Hรฅkansson, M., Knauer, A., and Maguire, E.: An evaluation of the predictive accuracy of wake effects models for offshore wind farms. *Wind Energy* 19(5):979โ€“996 (2016). https://doi.org/10.1002/we.1871. + +[^10]: Bao, Y., Yang, Q., Fu, L., Chen, Q., Cheng, C., and Sun, Y. Identification of Yaw Error Inherent Misalignment for Wind Turbine Based on SCADA Data: A Data Mining Approach. Proc. 12th Asian Control Conference (ASCC), Kitakyushu, Japan, June 9-12 (2019). 1095-1100. + +[^11]: Xue, J. and Wang, L. Online data-driven approach of yaw error estimation and correction of horizontal axis wind turbine. *IET J. Eng.* 2019(18):4937โ€“4940 (2019). https://doi.org/10.1049/joe.2018.9293. + +[^12]: Astolfi, D., Castellani, F., and Terzi, L. An Operation Data-Based Method for the Diagnosis of Zero-Point Shift of Wind Turbines Yaw Angle. *J. Solar Energy Engineering* 142(2):024501 (2020). https://doi.org/10.1115/1.4045081. + +[^13]: Jing, B., Qian, Z., Pei, Y., Zhang, L., and Yang, T. Improving wind turbine efficiency through detection and calibration of yaw misalignment. *Renewable Energy* 160:1217-1227 (2020). https://doi.org/10.1016/j.renene.2020.07.063. + +[^14]: Gao, L. and Hong, J. Data-driven yaw misalignment correction for utility-scale wind turbines. *J. Renewable Sustainable Energy* 13(6):063302 (2021). https://doi.org/10.1063/5.0056671. diff --git a/sphinx/index.rst b/sphinx/index.rst deleted file mode 100644 index 4f7a5878..00000000 --- a/sphinx/index.rst +++ /dev/null @@ -1,137 +0,0 @@ -.. highlight:: rst - - -OpenOA Operational Analysis Framework -##################################### - -|Binder Badge| |Gitter Badge| |Journal of Open Source Software Badge| |Documentation Badge| |Tests Badge| |Code Coverage Badge| |pre-commit| |Code style: black| |Imports: isort| - -.. :: - - # with overline, for parts - * with overline, for chapters - =, for sections - -, for subsections - ^, for subsubsections - ", for paragraphs - -Overview -******** - -This library provides a framework for working with timeseries data from wind plants. Its development -has been motivated by the Wind Plant Performance Prediction (WP3) Benchmarking (PRUF) project, which -aims to provide a reference implementaiton for plant-level performance assessment. - -The primary entry point for analyzing data is the `PlantData` class, which is based on Pandas data -frames and attrs data classes to efficiently process, store, and validate user data. In conjunction -with the `PlantMetaData` class, standardized routines can be created to bring in raw data from wind -turbines, meteorological (met) towers, revenue meters, and reanalysis products, such as MERRA-2 or -ERA5. Additionally, if defined, the `PlantData` can validate data for what's expected at run time -for any of the OpenOA analysis classes, as defined below. - -Analysis routines are provided in analysis classes, which each use the PlantData objects to ingest -data. For complete documentation please see the `analysis API page `_. OpenOA -includes the following analysis classes: - -* ``MonteCarloAEP``: This routine estimates the long-term annual energy production (AEP) of a wind - power plant (typically over 10-20 years) based on operational data from a shorter period of - record (e.g., 1-3 years), along with the uncertainty. -* ``TurbineLongTermGrossEnergy``: This routine estimates the long-term turbine ideal energy (TIE) of - a wind plant, defined as the long-term AEP that would be generated by the wind plant if all - turbines operated normally (i.e., no downtime, derating, or severe underperformance, but still - subject to wake losses and moderate performance losses), along with the uncertainty. -* ``ElectricalLosses``: The ElectricalLosses routine estimates the average electrical losses at a - wind plant, along with the uncertainty, by comparing the energy produced at the wind turbines to - the energy delivered to the grid. -* ``EYAGapAnalysis``: This class is used to perform a gap analysis between the estimated AEP from a - pre-construction energy yield estimate (EYA) and the actual AEP. The gap analysis compares - different wind plant performance categories to help understand the sources of differences between - EYA AEP estimates and actual AEP, specifically availability losses, electrical losses, and TIE. -* ``WakeLosses``: This routine estimates long-term internal wake losses experienced by a wind plant - and for each individual turbine, along with the uncertainty. -* ``StaticYawMisalignment``: The StaticYawMisalignment routine estimates the static yaw misalignment - for individual wind turbines as a function of wind speed by comparing the estimated wind vane - angle at which power is maximized to the mean wind vane angle at which the turbines operate. - The routine includes uncertainty quantification. **Warning: This method has not been validated - using data from wind turbines with known static yaw misalignments and the results should be - treated with caution.** - -Lower-level "toolkit" modules are provided in the utils subpackage. These methods are used -throughout the analysis classes. They can also be used individually to support general wind plant -data analysis activities. For complete documentation please see the `utils API page `_. -Some examples of utils modules include: - -* **Quality Assurance**: This module provides quality assurance methods for identifying potential - quality issues with SCADA data prior to importing it into a `PlantData` object. -* **Filters**: This module provides functions for flagging operational data based on a range of - criteria (e.g., outlier detection). -* **Power Curve**: The power curve module contains methods for fitting power curve models to SCADA data. -* **Imputing**: This module provides methods for filling in missing data with imputed values. -* **Met Data Processing**: This module contains methods for processing meteorological data, such as - computing air density and wind shear coefficients. -* **Plotting**: This module contains convenient functions for creating plots, such as power curve - plots and maps showing the wind plant layout. - -To interact with how each of these components of OpenOA are used, please visit our examples notebooks on -`Binder `_, or view them statically on the -`examples page `_. - -If you use this software in your work, please cite our JOSS article with the following BibTex:: - - @article{Perr-Sauer2021, - doi = {10.21105/joss.02171}, - url = {https://doi.org/10.21105/joss.02171}, - year = {2021}, - publisher = {The Open Journal}, - volume = {6}, - number = {58}, - pages = {2171}, - author = {Jordan Perr-Sauer and Mike Optis and Jason M. Fields and Nicola Bodini and Joseph C.Y. Lee and Austin Todd and Eric Simley and Robert Hammond and Caleb Phillips and Monte Lunacek and Travis Kemper and Lindy Williams and Anna Craig and Nathan Agarwal and Shawn Sheng and John Meissner}, - title = {OpenOA: An Open-Source Codebase For Operational Analysis of Wind Farms}, - journal = {Journal of Open Source Software} - } - -More information about the analysis methods in OpenOA and their use in the WP3 Benchmarking project can be found in the -following publications. A summary of the OpenOA software is published in :cite:`ind-PerrSauer_JOSS_2021`. An overview -of the WP3 Benchmarking project showing a comparison between pre-construction AEP estimates and operational AEP for 10 -commercial wind plants, estimated using the MonteCarloAEP method in OpenOA, is provided in -:cite:`ind-Fields_NREL_2021`. Benefits of the augmented AEP assessment features in the MonteCarloAEP method (e.g., -machine learning, multivariate regression) are discussed in :cite:`ind-Bodini_WE_2021`. A partial gap analysis between -pre-construction AEP estimates and operational AEP, using the MonteCarloAEP, TurbineLongTermGrossEnergy, and -ElectricalLosses methods in OpenOA, is presented in :cite:`ind-Todd_WE_2022`. - -References: - .. bibliography:: refs.bib - :style: unsrt - :filter: docname in docnames - :keyprefix: ind- - -Table of Contents -***************** - -.. toctree:: - :maxdepth: 2 - - getting_started/index - examples/index - api/index - credit - - -.. |Binder Badge| image:: https://mybinder.org/badge_logo.svg - :target: https://mybinder.org/v2/gh/NREL/OpenOA/develop_v3?filepath=examples -.. |Gitter Badge| image:: https://badges.gitter.im/NREL_OpenOA/community.svg - :target: https://gitter.im/NREL_OpenOA/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge -.. |Journal of Open Source Software Badge| image:: https://joss.theoj.org/papers/d635ef3c3784d49f6e81e07a0b35ff6b/status.svg - :target: https://joss.theoj.org/papers/d635ef3c3784d49f6e81e07a0b35ff6b -.. |Documentation Badge| image:: https://readthedocs.org/projects/openoa/badge/?version=latest - :target: https://openoa.readthedocs.io -.. |Tests Badge| image:: https://github.com/NREL/OpenOA/workflows/Tests/badge.svg?branch=develop -.. |Code Coverage Badge| image:: https://codecov.io/gh/NREL/OpenOA/branch/develop/graph/badge.svg - :target: https://codecov.io/gh/NREL/OpenOA -.. |pre-commit| image:: https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit&logoColor=white - :target: https://github.com/pre-commit/pre-commit -.. |Code style: black| image:: https://img.shields.io/badge/code%20style-black-000000.svg - :target: https://github.com/psf/black -.. |Imports: isort| image:: https://img.shields.io/badge/%20imports-isort-%231674b1?style=flat&labelColor=ef8336 - :target: https://pycqa.github.io/isort/