diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 4bbfa50b1..531f96f98 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -17,6 +17,10 @@ This form is written in GitHub's Markdown format. For a reference on this type of syntax, see GitHub's documentation: https://docs.github.com/en/get-started/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax +This template contains guidance for your submission within the < ! - -, - - > blocks. +These are comments in HTML syntax and will not appear in the submission. +Be sure to use the "Preview" feature on GitHub to ensure your submission is formatted as intended. + When including code snippets, please paste the text itself and wrap the code block with ticks (see the other character on the tilde ~ key in a US keyboard) to format it as code. For example, Python code should be wrapped in ticks like this: diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index c4d7fe27c..221ab53c5 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -16,6 +16,10 @@ This form is written in GitHub's Markdown format. For a reference on this type of syntax, see GitHub's documentation: https://docs.github.com/en/get-started/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax +This template contains guidance for your submission within the < ! - -, - - > blocks. +These are comments in HTML syntax and will not appear in the submission. +Be sure to use the "Preview" feature on GitHub to ensure your submission is formatted as intended. + When including code snippets, please paste the text itself and wrap the code block with ticks (see the other character on the tilde ~ key in a US keyboard) to format it as code. For example, Python code should be wrapped in ticks like this: diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 7fff63847..1d4a4b35e 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -14,6 +14,10 @@ This form is written in GitHub's Markdown format. For a reference on this type of syntax, see GitHub's documentation: https://docs.github.com/en/get-started/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax +This template contains guidance for your submission within the < ! - -, - - > blocks. +These are comments in HTML syntax and will not appear in the submission. +Be sure to use the "Preview" feature on GitHub to ensure your submission is formatted as intended. + When including code snippets, please paste the text itself and wrap the code block with ticks (see the other character on the tilde ~ key in a US keyboard) to format it as code. For example, Python code should be wrapped in ticks like this: diff --git a/.github/workflows/check-working-examples.yaml b/.github/workflows/check-working-examples.yaml index 974d80b24..2c19a341e 100644 --- a/.github/workflows/check-working-examples.yaml +++ b/.github/workflows/check-working-examples.yaml @@ -8,7 +8,7 @@ jobs: runs-on: ${{ matrix.os }} strategy: matrix: - python-version: [3.9] + python-version: ["3.10"] os: [ubuntu-latest] #, macos-latest, windows-latest] fail-fast: False @@ -21,7 +21,6 @@ jobs: - name: Install project run: | python -m pip install --upgrade pip - pip install -r requirements.txt pip install -e . pip install nbconvert # For converting Jupyter notebook to python script in the next step - name: Run examples diff --git a/.github/workflows/continuous-integration-workflow.yaml b/.github/workflows/continuous-integration-workflow.yaml index d84d7e9e3..6da584b19 100644 --- a/.github/workflows/continuous-integration-workflow.yaml +++ b/.github/workflows/continuous-integration-workflow.yaml @@ -8,9 +8,11 @@ jobs: runs-on: ${{ matrix.os }} strategy: matrix: - python-version: [3.9] + python-version: ["3.8", "3.9", "3.10"] os: [ubuntu-latest] #, macos-latest, windows-latest] fail-fast: False + env: + CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} steps: - uses: actions/checkout@v3 @@ -38,8 +40,9 @@ jobs: pip install pytest-cov pytest --cov=./ --cov-report=xml tests/ --ignore tests/reg_tests --ignore tests/timing.py --ignore tests/profiling.py - name: Upload coverage to Codecov + if: ${{ env.CODECOV_TOKEN }} # Don't attempt to upload if the codecov token is not configured uses: codecov/codecov-action@v3 with: - token: ${{ secrets.CODECOV_TOKEN }} + token: ${{ env.CODECOV_TOKEN }} files: ./coverage.xml fail_ci_if_error: true diff --git a/.github/workflows/deploy-pages.yaml b/.github/workflows/deploy-pages.yaml index e9c063d64..077487294 100644 --- a/.github/workflows/deploy-pages.yaml +++ b/.github/workflows/deploy-pages.yaml @@ -15,15 +15,14 @@ jobs: - uses: actions/checkout@v2 # Install dependencies - - name: Set up Python 3.8 - uses: actions/setup-python@v2 + - name: Set up Python + uses: actions/setup-python@v4 with: - python-version: 3.8 + python-version: "3.10" - name: Install dependencies run: | - pip install -r docs/requirements.txt - pip install -e . + pip install -e ".[docs]" # Build the book - name: Build the book diff --git a/.github/workflows/quality-metrics-workflow.yaml b/.github/workflows/quality-metrics-workflow.yaml index c6625e2ac..3e8365ff0 100644 --- a/.github/workflows/quality-metrics-workflow.yaml +++ b/.github/workflows/quality-metrics-workflow.yaml @@ -8,7 +8,7 @@ jobs: runs-on: ${{ matrix.os }} strategy: matrix: - python-version: [3.9] + python-version: ["3.10"] os: [ubuntu-latest] fail-fast: False diff --git a/.gitignore b/.gitignore index 5693c7c46..840e5ab71 100644 --- a/.gitignore +++ b/.gitignore @@ -3,11 +3,13 @@ __pycache__/ .cache *.ipynb +*.ipynb_checkpoints *.pyc *.egg-info dist build .pytest_cache +.ruff_cache # pip meta data pip-wheel-metadata diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 8abe840e8..72c92a9df 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -7,13 +7,11 @@ repos: - id: trailing-whitespace - id: end-of-file-fixer - id: check-executables-have-shebangs - - id: check-json - id: check-yaml + args: [--unsafe] - id: check-merge-conflict - id: check-symlinks - id: mixed-line-ending - # - id: pretty-format-json - # args: [--autofix, --no-sort-keys] - repo: https://github.com/charliermarsh/ruff-pre-commit rev: v0.0.241 diff --git a/docs/_config.yml b/docs/_config.yml index 7ea8ddc13..9819e86fd 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -4,8 +4,8 @@ title: FLORIS author: National Renewable Energy Laboratory logo: gch.gif -copyright: '2022' -only_build_toc_files: true +copyright: '2023' +only_build_toc_files: false # Force re-execution of notebooks on each build. # See https://jupyterbook.org/content/execute.html @@ -23,7 +23,7 @@ bibtex_bibfiles: # Information about where the book exists on the web repository: - url: https://github.com/nrel/floris + url: https://github.com/NREL/floris path_to_book: docs branch: main @@ -45,6 +45,7 @@ sphinx: - 'sphinx_autodoc_typehints' - 'sphinxcontrib.autoyaml' - 'sphinx.ext.napoleon' # Formats google and numpy docstring styles + - 'sphinxcontrib.mermaid' config: html_theme: sphinx_book_theme templates_path: diff --git a/docs/_toc.yml b/docs/_toc.yml index a1bb6e4ee..c354c1b84 100644 --- a/docs/_toc.yml +++ b/docs/_toc.yml @@ -12,15 +12,20 @@ parts: - caption: User Reference chapters: - file: floris_101 - - file: input_reference + - file: floating_wind_turbine + - file: turbine_interaction + - file: input_reference_main + - file: input_reference_turbine - file: examples - caption: Theory and Background chapters: - - file: reference + - file: wake_models + - file: bibliography - caption: Developer Reference chapters: - file: dev_guide + - file: architecture - file: code_quality - file: api_docs diff --git a/docs/api_docs.rst b/docs/api_docs.rst index 604e5a4f7..add2940c1 100644 --- a/docs/api_docs.rst +++ b/docs/api_docs.rst @@ -17,4 +17,5 @@ more users will interface with the software. floris.simulation floris.tools floris.type_dec + floris.turbine_library floris.utilities diff --git a/docs/architecture.md b/docs/architecture.md new file mode 100644 index 000000000..88da05b0e --- /dev/null +++ b/docs/architecture.md @@ -0,0 +1,119 @@ + +# Architecture and Design + +Two fundamental ideas define the design of the FLORIS software: + +- Modularity in wake model formulation + - Mathematical formulation should be straightforward to include + - Requisite solver and grid data structures should not conflict with other existing + wake models +- Management of abstraction + - Low level code is opaque but well tested and exercised; it should be very computationally + efficient with low algorithmic complexity + - High level code should be expressive and clear even if it results in verbose or less + efficient code + +The FLORIS software consists of two primary high-level packages and a few other low level +packages. The internal structure and hierarchy is described below. + +```{mermaid} +classDiagram + + class tools { + +FlorisInterface + } + + class simulation { + +Floris + } + + class logging_manager + class type_dec + class utilities + + tools <-- logging_manager + simulation <-- logging_manager + tools <-- type_dec + simulation <-- type_dec + tools <-- utilities + simulation <-- utilities + tools <-- simulation +``` + +## floris.tools + +This is the user interface. Most operations at the user level will happen through `floris.tools`. +This package contains a wide variety of functionality including but not limited to: + +- Initializing and driving a simulation with `tools.floris_interface` +- Wake field visualization through `tools.visualization` +- Yaw and layout optimization in `tools.optimization` +- Parallelizing work load with `tools.parallel_computing_interface` + +## floris.simulation + +This is the core simulation package. This should primarily be used within `floris.simulation` and +`floris.tools`, and user scripts generally won't interact directly with this package. + +```{mermaid} +classDiagram + + class Floris + + class Farm + + class FlowField { + array u + array v + array w + } + + class Grid { + <> + } + class TurbineGrid + class FlowFieldPlanarGrid + + class WakeModelManager { + <> + } + class WakeCombination { + dict parameters + function() + } + class WakeDeflection { + dict parameters + function() + } + class WakeTurbulence { + dict parameters + function() + } + class WakeVelocity { + dict parameters + function() + } + + class Solver { + <> + dict parameters + } + + Floris o-- Farm + Floris o-- FlowField + Floris o-- Grid + Floris o-- WakeModelManager + Floris *-- Solver + WakeModelManager o-- WakeCombination + WakeModelManager o-- WakeDeflection + WakeModelManager o-- WakeTurbulence + WakeModelManager o-- WakeVelocity + + Grid <|-- TurbineGrid + Grid <|-- FlowFieldPlanarGrid + + Solver --> Farm + Solver --> FlowField + Solver --> Grid + Solver --> WakeModelManager +``` diff --git a/docs/bibliography.md b/docs/bibliography.md new file mode 100644 index 000000000..dab6bd897 --- /dev/null +++ b/docs/bibliography.md @@ -0,0 +1,6 @@ + +# Bibliography + +```{bibliography} +:style: unsrt +``` diff --git a/docs/code_quality.ipynb b/docs/code_quality.ipynb index afe3491a8..24c5353a1 100644 --- a/docs/code_quality.ipynb +++ b/docs/code_quality.ipynb @@ -60,19 +60,49 @@ "\n", "columns = [\"commit_hash\", \"commit_hash_8char\", \"date\", \"jensen\", \"gauss\", \"gch\", \"cc\", \"code_coverage\", \"tooltip_label\"]\n", "data = [\n", - " (\"df25a9cfacd3d652361d2bd37f568af00acb2631\", \"df25a9cf\", datetime(2021,12, 29), 1.2691, 1.2584, 1.6432, None, 0.4344, \"df25a9cf\"),\n", - " (\"b797390a43298a815f3ff57955cfdc71ecf3e866\", \"b797390a\", datetime(2022, 1, 3), 0.6867, 1.2354, 1.8026, None, 0.2993, \"b797390a\"),\n", - " (\"01a02d5f91b2f4a863eebe88a618974b0749d1c4\", \"01a02d5f\", datetime(2022, 1, 4), 0.4227, 0.9118, 1.4492, None, 0.3022, \"01a02d5f\"),\n", - " (\"dd847210082035d43b0273ae63a76a53cb8d2e12\", \"dd847210\", datetime(2022, 1, 6), 0.4081, 0.9049, 1.5270, None, 0.3627, \"dd847210\"),\n", - " (\"33779269e98cc882a5f066c462d8ec1eadf37a1a\", \"33779269\", datetime(2022, 1, 10), 0.4147, 0.9126, 1.5391, None, 0.3690, \"33779269\"),\n", - " (\"12890e029a7155b074b9b325d320d1798338e287\", \"12890e02\", datetime(2022, 1, 11), 0.4152, 0.9070, 1.5128, None, 0.3682, \"12890e02\"),\n", - " (\"66dafc08bd620d96deda7d526b0e4bfc3b086650\", \"66dafc08\", datetime(2022, 1, 12), 0.4204, 0.9005, 1.5031, None, 0.3709, \"66dafc08\"),\n", - " (\"a325819b3b03b84bd76ad455e3f9b4600744ba14\", \"a325819b\", datetime(2022, 1, 13), 0.4250, 0.9043, 1.5006, None, 0.3709, \"a325819b\"),\n", - " (\"8a2c1a610295c007f0222ce737723c341189811d\", \"8a2c1a61\", datetime(2022, 1, 14), 0.4258, 0.9197, 1.5082, None, 0.3708, \"8a2c1a61\"),\n", - " (\"c6bc79b0cfbc8ce5d6da0d33b68028157d2e93c0\", \"c6bc79b0\", datetime(2022, 1, 14), 0.4270, 0.8828, 1.4818, None, 0.3701, \"c6bc79b0\"),\n", - " (\"03e1f461c152e4f221fe92c834f2787680cf5772\", \"03e1f461\", datetime(2022, 1, 18), 0.4621, 0.9151, 1.5274, 2.0719, 0.3673, \"PR #56\"),\n", - " (\"9e96d6c412b64fe76a57e7de8af3b00c21d18348\", \"9e96d6c4\", datetime(2022, 1, 19), 0.4659, 0.9056, 1.5061, 2.0561, 0.3825, \"v3.0rc1\"),\n", - " (\"2a98428f9c6fb9bb4302ae09809441bf3e7162b0\", \"2a98428f\", datetime(2022, 2, 11), 0.2996, 0.9091, 1.5168, 2.0349, 0.3824, \"PR #317\"),\n", + " (\"df25a9cfacd3d652361d2bd37f568af00acb2631\", \"df25a9cf\", datetime(2021, 12, 29), 1.2691, 1.2584, 1.6432, None, 0.4344, \"df25a9cf\"),\n", + " (\"b797390a43298a815f3ff57955cfdc71ecf3e866\", \"b797390a\", datetime(2022, 1, 3), 0.6867, 1.2354, 1.8026, None, 0.2993, \"b797390a\"),\n", + " (\"01a02d5f91b2f4a863eebe88a618974b0749d1c4\", \"01a02d5f\", datetime(2022, 1, 4), 0.4048, 0.8909, 1.4921, None, 0.3022, \"01a02d5f\"),\n", + " (\"dd847210082035d43b0273ae63a76a53cb8d2e12\", \"dd847210\", datetime(2022, 1, 6), 0.4004, 0.8622, 1.4506, None, 0.3627, \"dd847210\"),\n", + " (\"33779269e98cc882a5f066c462d8ec1eadf37a1a\", \"33779269\", datetime(2022, 1, 10), 0.4025, 0.8954, 1.5164, None, 0.3690, \"33779269\"),\n", + " (\"12890e029a7155b074b9b325d320d1798338e287\", \"12890e02\", datetime(2022, 1, 11), 0.3979, 0.9134, 1.5469, None, 0.3682, \"12890e02\"),\n", + " (\"66dafc08bd620d96deda7d526b0e4bfc3b086650\", \"66dafc08\", datetime(2022, 1, 12), 0.4175, 0.8834, 1.5187, None, 0.3709, \"66dafc08\"),\n", + " (\"a325819b3b03b84bd76ad455e3f9b4600744ba14\", \"a325819b\", datetime(2022, 1, 13), 0.4207, 0.8781, 1.5001, None, 0.3709, \"a325819b\"),\n", + " (\"8a2c1a610295c007f0222ce737723c341189811d\", \"8a2c1a61\", datetime(2022, 1, 14), 0.4108, 0.8914, 1.5599, None, 0.3708, \"8a2c1a61\"),\n", + " (\"c6bc79b0cfbc8ce5d6da0d33b68028157d2e93c0\", \"c6bc79b0\", datetime(2022, 1, 14), 0.4172, 0.8813, 1.4888, None, 0.3701, \"c6bc79b0\"),\n", + " (\"03e1f461c152e4f221fe92c834f2787680cf5772\", \"03e1f461\", datetime(2022, 1, 18), 0.4294, 0.8760, 1.5124, 1.8728, 0.3673, \"PR #56\"),\n", + " (\"9e96d6c412b64fe76a57e7de8af3b00c21d18348\", \"9e96d6c4\", datetime(2022, 1, 19), 0.4389, 0.8505, 1.4700, 1.8529, 0.3825, \"v3.0rc1\"),\n", + " (\"2a98428f9c6fb9bb4302ae09809441bf3e7162b0\", \"2a98428f\", datetime(2022, 2, 15), 0.2548, 0.8753, 1.5254, 1.8375, 0.3824, \"PR #317\"),\n", + " (\"9b4e85cf1b41ba7001aaba1a830b93e176f3dd43\", \"9b4e85cf\", datetime(2022, 3, 1), 0.2687, 0.9676, 1.5895, 1.8790, 0.1572, \"v3.0\"),\n", + " (\"d18f4d263ecabf502242592f9d60815a07c7b89c\", \"d18f4d26\", datetime(2022, 3, 4), 0.2742, 0.9402, 1.5835, 1.8870, 0.1572, \"v3.0.1\"),\n", + " (\"a23241bb9e45078e36a4662d48c9d3fe0c3316e4\", \"a23241bb\", datetime(2022, 4, 6), 0.2609, 0.9793, 1.6281, 1.8673, 0.1682, \"v3.1\"),\n", + " (\"c2006b0011a5df036c306c15e75763ec492dafda\", \"c2006b00\", datetime(2022, 6, 22), 0.2733, 0.9668, 1.6002, 1.8838, 0.1681, \"v3.1.1\"),\n", + " (\"0c2adf3e702b6427da946a6ba9dbedbea22738be\", \"0c2adf3e\", datetime(2022, 9, 16), 0.2727, 0.9613, 1.5977, 1.8369, 0.1502, \"v3.2\"),\n", + " (\"39c466000b1874e06a6f58da9c30bb877fc8d4d2\", \"39c46600\", datetime(2022, 11, 20), 0.2729, 0.9561, 1.5817, 1.8541, 0.1899, \"v3.2.1\"),\n", + " (\"8436fd78b002e5792f5d0dd1409332d171036d49\", \"8436fd78\", datetime(2023, 2, 8), 0.2753, 0.9718, 1.5985, 1.8721, 0.1905, \"v3.2.2\"),\n", + " (\"07a45b66c5facfea06c40bd82e34040c97560640\", \"07a45b66\", datetime(2023, 2, 8), 0.2763, 0.9837, 1.5750, 1.8805, 0.1972, \"07a45b66\"),\n", + " (\"1d84538c334a502c6ad7df48b8cc2309d6a6436d\", \"1d84538c\", datetime(2023, 2, 22), 0.2747, 0.9457, 1.5743, 1.8628, 0.0000, \"1d84538c\"),\n", + " (\"4d528a3d6456621a382d409b5145a877b5414b88\", \"4d528a3d\", datetime(2023, 2, 23), 0.2669, 0.9502, 1.5503, 1.8683, 0.0000, \"4d528a3d\"),\n", + " (\"8c637b36b66069b216cb94ae87d4c0a91e9b211e\", \"8c637b36\", datetime(2023, 2, 27), 0.2918, 0.9974, 1.5609, 1.8825, 0.0000, \"8c637b36\"),\n", + " (\"4d23fa6dd78d0497deb4fd62783f0b3ee4204579\", \"4d23fa6d\", datetime(2023, 2, 27), 0.2962, 0.9924, 1.5983, 1.8535, 0.0000, \"4d23fa6d\"),\n", + " (\"015f6874c320efee2c0d1ae76eea4a5b043d69d6\", \"015f6874\", datetime(2023, 3, 1), 0.2990, 1.0068, 1.5856, 1.8722, 0.0000, \"015f6874\"),\n", + " (\"26f06d449da208ce64724b1463b07ad20746cbdc\", \"26f06d44\", datetime(2023, 3, 6), 0.2701, 0.9652, 1.5992, 1.8506, 0.0000, \"26f06d44\"),\n", + " (\"6b9d6bb8bec6e3ea548f5858e2a8ea5986264fc8\", \"6b9d6bb8\", datetime(2023, 3, 6), 0.2964, 0.9775, 1.6261, 1.8816, 0.0000, \"6b9d6bb8\"),\n", + " (\"b796bd0fd92ba6b91d590f6cb60bb7ab3bca9932\", \"b796bd0f\", datetime(2023, 3, 6), 0.2692, 0.9455, 1.5827, 1.8598, 0.0000, \"b796bd0f\"),\n", + " (\"780aef7c7b4b9cafea3e323d536a34a4af5818b4\", \"780aef7c\", datetime(2023, 3, 7), 0.2980, 0.9909, 1.5796, 1.8696, 0.0000, \"780aef7c\"),\n", + " (\"9f93ad9bf85e4a0e6baf5b62ea4b3ef143729861\", \"9f93ad9b\", datetime(2023, 3, 7), 0.2985, 0.9925, 1.5896, 1.8813, 0.0000, \"9f93ad9b\"),\n", + " (\"16628a0ba45a675df762245694e0a7666a3478f8\", \"16628a0b\", datetime(2023, 3, 7), 0.3013, 0.9700, 1.5791, 1.8950, 0.1972, \"v3.3\"),\n", + " (\"01684c8559604344bd09791268131819a09770a8\", \"01684c85\", datetime(2023, 3, 17), 0.3016, 0.9931, 1.5986, 1.8960, 0.0000, \"01684c85\"),\n", + " (\"e9231fb893c765b723fa4c1e087a58761b6aa471\", \"e9231fb8\", datetime(2023, 3, 20), 0.2974, 0.9963, 1.5817, 1.8798, 0.0000, \"e9231fb8\"),\n", + " (\"219889e243ffc69c71b6f7747f5af751d5694de1\", \"219889e2\", datetime(2023, 3, 23), 0.2897, 1.0008, 1.5651, 1.8983, 0.0000, \"219889e2\"),\n", + " (\"6124d2a82a7a823722210bc2e8516d355ba19eb3\", \"6124d2a8\", datetime(2023, 4, 5), 0.2971, 0.9918, 1.5904, 1.9332, 0.0000, \"6124d2a8\"),\n", + " (\"f6e4287f712cc866893e71b1ea7a7546e4567bf9\", \"f6e4287f\", datetime(2023, 4, 25), 0.3045, 0.9905, 1.6114, 1.8999, 0.0000, \"f6e4287f\"),\n", + " (\"f2797fef396f2f19b02abb1f9555b678dac614f1\", \"f2797fef\", datetime(2023, 4, 25), 0.3071, 1.0112, 1.5760, 1.8921, 0.0000, \"f2797fef\"),\n", + " (\"b4e538f530048fec58eaca5170be82c67dbdcceb\", \"b4e538f5\", datetime(2023, 4, 25), 0.2924, 0.9751, 1.6105, 1.9043, 0.0000, \"b4e538f5\"),\n", + " (\"68820b715ed6b2c981aa11d29c0102e879280d79\", \"68820b71\", datetime(2023, 4, 25), 0.3013, 0.9936, 1.6038, 1.9069, 0.0000, \"68820b71\"),\n", + " (\"03deffeda91fa8d8ab188d57b9fa302a7be008e0\", \"03deffed\", datetime(2023, 4, 25), 0.2930, 0.9882, 1.6013, 1.9015, 0.0000, \"03deffed\"),\n", + " (\"0d2bfecc271d561f67050659684b4797af8ee740\", \"0d2bfecc\", datetime(2023, 4, 25), 0.3041, 1.0009, 1.5853, 1.8890, 0.0000, \"0d2bfecc\"),\n", + " (\"1d03a465593f56c99a64a576d185d4ed17b659f2\", \"1d03a465\", datetime(2023, 4, 25), 0.3058, 0.9970, 1.5849, 1.8224, 0.0000, \"1d03a465\"),\n", "]\n", "\n", "df = pd.DataFrame(data=data, columns=columns)\n", @@ -92,7 +122,7 @@ "data": { "text/html": [ "\n", - "
\n" + "
\n" ] }, "metadata": {}, @@ -100,7 +130,7 @@ }, { "data": { - "application/javascript": "(function(root) {\n function embed_document(root) {\n const docs_json = {\"a5ebcb57-ca23-495f-bcbf-8f77d9804a82\":{\"defs\":[],\"roots\":{\"references\":[{\"attributes\":{\"below\":[{\"id\":\"1016\"}],\"center\":[{\"id\":\"1019\"},{\"id\":\"1023\"},{\"id\":\"1068\"}],\"height\":450,\"left\":[{\"id\":\"1020\"}],\"renderers\":[{\"id\":\"1044\"},{\"id\":\"1074\"},{\"id\":\"1102\"},{\"id\":\"1131\"},{\"id\":\"1159\"},{\"id\":\"1188\"},{\"id\":\"1216\"},{\"id\":\"1245\"}],\"title\":{\"id\":\"1006\"},\"toolbar\":{\"id\":\"1032\"},\"x_range\":{\"id\":\"1008\"},\"x_scale\":{\"id\":\"1012\"},\"y_range\":{\"id\":\"1010\"},\"y_scale\":{\"id\":\"1014\"}},\"id\":\"1005\",\"subtype\":\"Figure\",\"type\":\"Plot\"},{\"attributes\":{\"callback\":null,\"tooltips\":[[\"git ref\",\"@tooltip_label\"]]},\"id\":\"1031\",\"type\":\"HoverTool\"},{\"attributes\":{},\"id\":\"1024\",\"type\":\"PanTool\"},{\"attributes\":{},\"id\":\"1025\",\"type\":\"WheelZoomTool\"},{\"attributes\":{\"months\":[0,4,8]},\"id\":\"1065\",\"type\":\"MonthsTicker\"},{\"attributes\":{},\"id\":\"1012\",\"type\":\"LinearScale\"},{\"attributes\":{},\"id\":\"1052\",\"type\":\"AllLabels\"},{\"attributes\":{\"bottom_units\":\"screen\",\"coordinates\":null,\"fill_alpha\":0.5,\"fill_color\":\"lightgrey\",\"group\":null,\"left_units\":\"screen\",\"level\":\"overlay\",\"line_alpha\":1.0,\"line_color\":\"black\",\"line_dash\":[4,4],\"line_width\":2,\"right_units\":\"screen\",\"syncable\":false,\"top_units\":\"screen\"},\"id\":\"1030\",\"type\":\"BoxAnnotation\"},{\"attributes\":{},\"id\":\"1051\",\"type\":\"DatetimeTickFormatter\"},{\"attributes\":{\"months\":[0,1,2,3,4,5,6,7,8,9,10,11]},\"id\":\"1063\",\"type\":\"MonthsTicker\"},{\"attributes\":{\"coordinates\":null,\"data_source\":{\"id\":\"1003\"},\"glyph\":{\"id\":\"1071\"},\"group\":null,\"hover_glyph\":null,\"muted_glyph\":{\"id\":\"1073\"},\"nonselection_glyph\":{\"id\":\"1072\"},\"view\":{\"id\":\"1075\"}},\"id\":\"1074\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"months\":[0,2,4,6,8,10]},\"id\":\"1064\",\"type\":\"MonthsTicker\"},{\"attributes\":{\"days\":[1,15]},\"id\":\"1062\",\"type\":\"DaysTicker\"},{\"attributes\":{},\"id\":\"1049\",\"type\":\"AllLabels\"},{\"attributes\":{\"months\":[0,6]},\"id\":\"1066\",\"type\":\"MonthsTicker\"},{\"attributes\":{\"days\":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31]},\"id\":\"1059\",\"type\":\"DaysTicker\"},{\"attributes\":{},\"id\":\"1010\",\"type\":\"DataRange1d\"},{\"attributes\":{},\"id\":\"1048\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{\"days\":[1,4,7,10,13,16,19,22,25,28]},\"id\":\"1060\",\"type\":\"DaysTicker\"},{\"attributes\":{\"line_alpha\":0.2,\"line_color\":\"blue\",\"x\":{\"field\":\"date\"},\"y\":{\"field\":\"jensen\"}},\"id\":\"1043\",\"type\":\"Line\"},{\"attributes\":{\"coordinates\":null,\"data_source\":{\"id\":\"1003\"},\"glyph\":{\"id\":\"1185\"},\"group\":null,\"hover_glyph\":null,\"muted_glyph\":{\"id\":\"1187\"},\"nonselection_glyph\":{\"id\":\"1186\"},\"view\":{\"id\":\"1189\"}},\"id\":\"1188\",\"type\":\"GlyphRenderer\"},{\"attributes\":{},\"id\":\"1067\",\"type\":\"YearsTicker\"},{\"attributes\":{\"days\":[1,8,15,22]},\"id\":\"1061\",\"type\":\"DaysTicker\"},{\"attributes\":{\"border_line_color\":\"black\",\"click_policy\":\"mute\",\"coordinates\":null,\"group\":null,\"items\":[{\"id\":\"1069\"},{\"id\":\"1126\"},{\"id\":\"1183\"},{\"id\":\"1240\"}],\"location\":\"bottom_left\"},\"id\":\"1068\",\"type\":\"Legend\"},{\"attributes\":{\"base\":60,\"mantissas\":[1,2,5,10,15,20,30],\"max_interval\":1800000.0,\"min_interval\":1000.0,\"num_minor_ticks\":0},\"id\":\"1057\",\"type\":\"AdaptiveTicker\"},{\"attributes\":{\"source\":{\"id\":\"1003\"}},\"id\":\"1189\",\"type\":\"CDSView\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.1},\"fill_color\":{\"value\":\"red\"},\"hatch_alpha\":{\"value\":0.1},\"line_alpha\":{\"value\":0.1},\"line_color\":{\"value\":\"red\"},\"size\":{\"value\":6},\"x\":{\"field\":\"date\"},\"y\":{\"field\":\"gch\"}},\"id\":\"1186\",\"type\":\"Circle\"},{\"attributes\":{\"line_color\":\"cyan\",\"x\":{\"field\":\"date\"},\"y\":{\"field\":\"cc\"}},\"id\":\"1213\",\"type\":\"Line\"},{\"attributes\":{\"mantissas\":[1,2,5],\"max_interval\":500.0,\"num_minor_ticks\":0},\"id\":\"1056\",\"type\":\"AdaptiveTicker\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.2},\"fill_color\":{\"value\":\"red\"},\"hatch_alpha\":{\"value\":0.2},\"line_alpha\":{\"value\":0.2},\"line_color\":{\"value\":\"red\"},\"size\":{\"value\":6},\"x\":{\"field\":\"date\"},\"y\":{\"field\":\"gch\"}},\"id\":\"1187\",\"type\":\"Circle\"},{\"attributes\":{\"fill_color\":{\"value\":\"blue\"},\"line_color\":{\"value\":\"blue\"},\"size\":{\"value\":6},\"x\":{\"field\":\"date\"},\"y\":{\"field\":\"jensen\"}},\"id\":\"1071\",\"type\":\"Circle\"},{\"attributes\":{\"coordinates\":null,\"data_source\":{\"id\":\"1003\"},\"glyph\":{\"id\":\"1156\"},\"group\":null,\"hover_glyph\":null,\"muted_glyph\":{\"id\":\"1158\"},\"nonselection_glyph\":{\"id\":\"1157\"},\"view\":{\"id\":\"1160\"}},\"id\":\"1159\",\"type\":\"GlyphRenderer\"},{\"attributes\":{},\"id\":\"1029\",\"type\":\"HelpTool\"},{\"attributes\":{\"coordinates\":null,\"data_source\":{\"id\":\"1003\"},\"glyph\":{\"id\":\"1242\"},\"group\":null,\"hover_glyph\":null,\"muted_glyph\":{\"id\":\"1244\"},\"nonselection_glyph\":{\"id\":\"1243\"},\"view\":{\"id\":\"1246\"}},\"id\":\"1245\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"line_alpha\":0.1,\"line_color\":\"blue\",\"x\":{\"field\":\"date\"},\"y\":{\"field\":\"jensen\"}},\"id\":\"1042\",\"type\":\"Line\"},{\"attributes\":{\"line_alpha\":0.2,\"line_color\":\"cyan\",\"x\":{\"field\":\"date\"},\"y\":{\"field\":\"cc\"}},\"id\":\"1215\",\"type\":\"Line\"},{\"attributes\":{\"label\":{\"value\":\"cc\"},\"renderers\":[{\"id\":\"1216\"},{\"id\":\"1245\"}]},\"id\":\"1240\",\"type\":\"LegendItem\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.1},\"fill_color\":{\"value\":\"cyan\"},\"hatch_alpha\":{\"value\":0.1},\"line_alpha\":{\"value\":0.1},\"line_color\":{\"value\":\"cyan\"},\"size\":{\"value\":6},\"x\":{\"field\":\"date\"},\"y\":{\"field\":\"cc\"}},\"id\":\"1243\",\"type\":\"Circle\"},{\"attributes\":{\"line_alpha\":0.1,\"line_color\":\"cyan\",\"x\":{\"field\":\"date\"},\"y\":{\"field\":\"cc\"}},\"id\":\"1214\",\"type\":\"Line\"},{\"attributes\":{\"source\":{\"id\":\"1003\"}},\"id\":\"1217\",\"type\":\"CDSView\"},{\"attributes\":{},\"id\":\"1027\",\"type\":\"SaveTool\"},{\"attributes\":{\"source\":{\"id\":\"1003\"}},\"id\":\"1246\",\"type\":\"CDSView\"},{\"attributes\":{},\"id\":\"1021\",\"type\":\"BasicTicker\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.2},\"fill_color\":{\"value\":\"cyan\"},\"hatch_alpha\":{\"value\":0.2},\"line_alpha\":{\"value\":0.2},\"line_color\":{\"value\":\"cyan\"},\"size\":{\"value\":6},\"x\":{\"field\":\"date\"},\"y\":{\"field\":\"cc\"}},\"id\":\"1244\",\"type\":\"Circle\"},{\"attributes\":{\"source\":{\"id\":\"1003\"}},\"id\":\"1075\",\"type\":\"CDSView\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.1},\"fill_color\":{\"value\":\"blue\"},\"hatch_alpha\":{\"value\":0.1},\"line_alpha\":{\"value\":0.1},\"line_color\":{\"value\":\"blue\"},\"size\":{\"value\":6},\"x\":{\"field\":\"date\"},\"y\":{\"field\":\"jensen\"}},\"id\":\"1072\",\"type\":\"Circle\"},{\"attributes\":{\"coordinates\":null,\"data_source\":{\"id\":\"1003\"},\"glyph\":{\"id\":\"1099\"},\"group\":null,\"hover_glyph\":null,\"muted_glyph\":{\"id\":\"1101\"},\"nonselection_glyph\":{\"id\":\"1100\"},\"view\":{\"id\":\"1103\"}},\"id\":\"1102\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"num_minor_ticks\":5,\"tickers\":[{\"id\":\"1056\"},{\"id\":\"1057\"},{\"id\":\"1058\"},{\"id\":\"1059\"},{\"id\":\"1060\"},{\"id\":\"1061\"},{\"id\":\"1062\"},{\"id\":\"1063\"},{\"id\":\"1064\"},{\"id\":\"1065\"},{\"id\":\"1066\"},{\"id\":\"1067\"}]},\"id\":\"1017\",\"type\":\"DatetimeTicker\"},{\"attributes\":{\"fill_color\":{\"value\":\"green\"},\"line_color\":{\"value\":\"green\"},\"size\":{\"value\":6},\"x\":{\"field\":\"date\"},\"y\":{\"field\":\"gauss\"}},\"id\":\"1128\",\"type\":\"Circle\"},{\"attributes\":{\"line_color\":\"green\",\"x\":{\"field\":\"date\"},\"y\":{\"field\":\"gauss\"}},\"id\":\"1099\",\"type\":\"Line\"},{\"attributes\":{\"source\":{\"id\":\"1003\"}},\"id\":\"1160\",\"type\":\"CDSView\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.2},\"fill_color\":{\"value\":\"blue\"},\"hatch_alpha\":{\"value\":0.2},\"line_alpha\":{\"value\":0.2},\"line_color\":{\"value\":\"blue\"},\"size\":{\"value\":6},\"x\":{\"field\":\"date\"},\"y\":{\"field\":\"jensen\"}},\"id\":\"1073\",\"type\":\"Circle\"},{\"attributes\":{\"axis_label\":\"Commit date\",\"coordinates\":null,\"formatter\":{\"id\":\"1051\"},\"group\":null,\"major_label_policy\":{\"id\":\"1052\"},\"ticker\":{\"id\":\"1017\"}},\"id\":\"1016\",\"type\":\"DatetimeAxis\"},{\"attributes\":{\"label\":{\"value\":\"gch\"},\"renderers\":[{\"id\":\"1159\"},{\"id\":\"1188\"}]},\"id\":\"1183\",\"type\":\"LegendItem\"},{\"attributes\":{\"axis\":{\"id\":\"1016\"},\"coordinates\":null,\"group\":null,\"ticker\":null},\"id\":\"1019\",\"type\":\"Grid\"},{\"attributes\":{\"line_alpha\":0.1,\"line_color\":\"red\",\"x\":{\"field\":\"date\"},\"y\":{\"field\":\"gch\"}},\"id\":\"1157\",\"type\":\"Line\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.1},\"fill_color\":{\"value\":\"green\"},\"hatch_alpha\":{\"value\":0.1},\"line_alpha\":{\"value\":0.1},\"line_color\":{\"value\":\"green\"},\"size\":{\"value\":6},\"x\":{\"field\":\"date\"},\"y\":{\"field\":\"gauss\"}},\"id\":\"1129\",\"type\":\"Circle\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.2},\"fill_color\":{\"value\":\"green\"},\"hatch_alpha\":{\"value\":0.2},\"line_alpha\":{\"value\":0.2},\"line_color\":{\"value\":\"green\"},\"size\":{\"value\":6},\"x\":{\"field\":\"date\"},\"y\":{\"field\":\"gauss\"}},\"id\":\"1130\",\"type\":\"Circle\"},{\"attributes\":{\"fill_color\":{\"value\":\"cyan\"},\"line_color\":{\"value\":\"cyan\"},\"size\":{\"value\":6},\"x\":{\"field\":\"date\"},\"y\":{\"field\":\"cc\"}},\"id\":\"1242\",\"type\":\"Circle\"},{\"attributes\":{\"axis_label\":\"Time to solution (s)\",\"coordinates\":null,\"formatter\":{\"id\":\"1048\"},\"group\":null,\"major_label_policy\":{\"id\":\"1049\"},\"ticker\":{\"id\":\"1021\"}},\"id\":\"1020\",\"type\":\"LinearAxis\"},{\"attributes\":{\"overlay\":{\"id\":\"1030\"}},\"id\":\"1026\",\"type\":\"BoxZoomTool\"},{\"attributes\":{\"source\":{\"id\":\"1003\"}},\"id\":\"1045\",\"type\":\"CDSView\"},{\"attributes\":{\"data\":{\"cc\":{\"__ndarray__\":\"AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H/BqKROQJMAQN5xio7kcgBADwu1pnlHAEA=\",\"dtype\":\"float64\",\"order\":\"little\",\"shape\":[13]},\"code_coverage\":{\"__ndarray__\":\"PnlYqDXN2z/WVuwvuyfTPxB6Nqs+V9M/vJaQD3o21z8EVg4tsp3XP+PHmLuWkNc/lIeFWtO81z+Uh4Va07zXP9DVVuwvu9c/cvkP6bev1z/9h/Tb14HXP3sUrkfhetg/t2J/2T152D8=\",\"dtype\":\"float64\",\"order\":\"little\",\"shape\":[13]},\"commit_hash\":[\"df25a9cfacd3d652361d2bd37f568af00acb2631\",\"b797390a43298a815f3ff57955cfdc71ecf3e866\",\"01a02d5f91b2f4a863eebe88a618974b0749d1c4\",\"dd847210082035d43b0273ae63a76a53cb8d2e12\",\"33779269e98cc882a5f066c462d8ec1eadf37a1a\",\"12890e029a7155b074b9b325d320d1798338e287\",\"66dafc08bd620d96deda7d526b0e4bfc3b086650\",\"a325819b3b03b84bd76ad455e3f9b4600744ba14\",\"8a2c1a610295c007f0222ce737723c341189811d\",\"c6bc79b0cfbc8ce5d6da0d33b68028157d2e93c0\",\"03e1f461c152e4f221fe92c834f2787680cf5772\",\"9e96d6c412b64fe76a57e7de8af3b00c21d18348\",\"2a98428f9c6fb9bb4302ae09809441bf3e7162b0\"],\"commit_hash_8char\":[\"df25a9cf\",\"b797390a\",\"01a02d5f\",\"dd847210\",\"33779269\",\"12890e02\",\"66dafc08\",\"a325819b\",\"8a2c1a61\",\"c6bc79b0\",\"03e1f461\",\"9e96d6c4\",\"2a98428f\"],\"date\":{\"__ndarray__\":\"AACAyDfgd0IAAEDF0+F3QgAAACsm4ndCAACA9srid0IAAICNFOR3QgAAQPNm5HdCAAAAWbnkd0IAAMC+C+V3QgAAgCRe5XdCAACAJF7ld0IAAIC7p+Z3QgAAQCH65ndCAACARWHud0I=\",\"dtype\":\"float64\",\"order\":\"little\",\"shape\":[13]},\"gauss\":{\"__ndarray__\":\"GJXUCWgi9D+Hp1fKMsTzPwXFjzF3Le0/FNBE2PD07D8VjErqBDTtP6AaL90kBu0/N4lBYOXQ7D/HuriNBvDsP8oyxLEubu0/5BQdyeU/7D8qOpLLf0jtP0I+6Nms+uw/LGUZ4lgX7T8=\",\"dtype\":\"float64\",\"order\":\"little\",\"shape\":[13]},\"gch\":{\"__ndarray__\":\"X5hMFYxK+j9IUPwYc9f8P6vP1VbsL/c/O99PjZdu+D+qYFRSJ6D4P4Y41sVtNPg/seHplbIM+D+mCkYldQL4PzY8vVKWIfg/oWez6nO19z8AkX77OnD4P/AWSFD8GPg/MCqpE9BE+D8=\",\"dtype\":\"float64\",\"order\":\"little\",\"shape\":[13]},\"index\":[0,1,2,3,4,5,6,7,8,9,10,11,12],\"jensen\":{\"__ndarray__\":\"WKg1zTtO9D/vOEVHcvnlP5M6AU2EDds/rthfdk8e2j9DrWnecYraPxgmUwWjkto/8kHPZtXn2j8zMzMzMzPbP1XBqKROQNs/hxbZzvdT2z+J0t7gC5PdP6g1zTtO0d0/Imx4eqUs0z8=\",\"dtype\":\"float64\",\"order\":\"little\",\"shape\":[13]},\"tooltip_label\":[\"df25a9cf\",\"b797390a\",\"01a02d5f\",\"dd847210\",\"33779269\",\"12890e02\",\"66dafc08\",\"a325819b\",\"8a2c1a61\",\"c6bc79b0\",\"PR #56\",\"v3.0rc1\",\"PR #317\"]},\"selected\":{\"id\":\"1054\"},\"selection_policy\":{\"id\":\"1053\"}},\"id\":\"1003\",\"type\":\"ColumnDataSource\"},{\"attributes\":{\"tools\":[{\"id\":\"1024\"},{\"id\":\"1025\"},{\"id\":\"1026\"},{\"id\":\"1027\"},{\"id\":\"1028\"},{\"id\":\"1029\"},{\"id\":\"1031\"}]},\"id\":\"1032\",\"type\":\"Toolbar\"},{\"attributes\":{\"label\":{\"value\":\"gauss\"},\"renderers\":[{\"id\":\"1102\"},{\"id\":\"1131\"}]},\"id\":\"1126\",\"type\":\"LegendItem\"},{\"attributes\":{\"source\":{\"id\":\"1003\"}},\"id\":\"1132\",\"type\":\"CDSView\"},{\"attributes\":{},\"id\":\"1053\",\"type\":\"UnionRenderers\"},{\"attributes\":{\"label\":{\"value\":\"jensen\"},\"renderers\":[{\"id\":\"1044\"},{\"id\":\"1074\"}]},\"id\":\"1069\",\"type\":\"LegendItem\"},{\"attributes\":{},\"id\":\"1028\",\"type\":\"ResetTool\"},{\"attributes\":{},\"id\":\"1054\",\"type\":\"Selection\"},{\"attributes\":{\"line_color\":\"blue\",\"x\":{\"field\":\"date\"},\"y\":{\"field\":\"jensen\"}},\"id\":\"1041\",\"type\":\"Line\"},{\"attributes\":{\"line_color\":\"red\",\"x\":{\"field\":\"date\"},\"y\":{\"field\":\"gch\"}},\"id\":\"1156\",\"type\":\"Line\"},{\"attributes\":{},\"id\":\"1008\",\"type\":\"DataRange1d\"},{\"attributes\":{\"line_alpha\":0.2,\"line_color\":\"green\",\"x\":{\"field\":\"date\"},\"y\":{\"field\":\"gauss\"}},\"id\":\"1101\",\"type\":\"Line\"},{\"attributes\":{\"fill_color\":{\"value\":\"red\"},\"line_color\":{\"value\":\"red\"},\"size\":{\"value\":6},\"x\":{\"field\":\"date\"},\"y\":{\"field\":\"gch\"}},\"id\":\"1185\",\"type\":\"Circle\"},{\"attributes\":{\"coordinates\":null,\"group\":null,\"text\":\"5x5 Wind Farm Timing Test\"},\"id\":\"1006\",\"type\":\"Title\"},{\"attributes\":{\"coordinates\":null,\"data_source\":{\"id\":\"1003\"},\"glyph\":{\"id\":\"1041\"},\"group\":null,\"hover_glyph\":null,\"muted_glyph\":{\"id\":\"1043\"},\"nonselection_glyph\":{\"id\":\"1042\"},\"view\":{\"id\":\"1045\"}},\"id\":\"1044\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"coordinates\":null,\"data_source\":{\"id\":\"1003\"},\"glyph\":{\"id\":\"1128\"},\"group\":null,\"hover_glyph\":null,\"muted_glyph\":{\"id\":\"1130\"},\"nonselection_glyph\":{\"id\":\"1129\"},\"view\":{\"id\":\"1132\"}},\"id\":\"1131\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"base\":24,\"mantissas\":[1,2,4,6,8,12],\"max_interval\":43200000.0,\"min_interval\":3600000.0,\"num_minor_ticks\":0},\"id\":\"1058\",\"type\":\"AdaptiveTicker\"},{\"attributes\":{\"axis\":{\"id\":\"1020\"},\"coordinates\":null,\"dimension\":1,\"group\":null,\"ticker\":null},\"id\":\"1023\",\"type\":\"Grid\"},{\"attributes\":{\"line_alpha\":0.2,\"line_color\":\"red\",\"x\":{\"field\":\"date\"},\"y\":{\"field\":\"gch\"}},\"id\":\"1158\",\"type\":\"Line\"},{\"attributes\":{\"coordinates\":null,\"data_source\":{\"id\":\"1003\"},\"glyph\":{\"id\":\"1213\"},\"group\":null,\"hover_glyph\":null,\"muted_glyph\":{\"id\":\"1215\"},\"nonselection_glyph\":{\"id\":\"1214\"},\"view\":{\"id\":\"1217\"}},\"id\":\"1216\",\"type\":\"GlyphRenderer\"},{\"attributes\":{},\"id\":\"1014\",\"type\":\"LinearScale\"},{\"attributes\":{\"source\":{\"id\":\"1003\"}},\"id\":\"1103\",\"type\":\"CDSView\"},{\"attributes\":{\"line_alpha\":0.1,\"line_color\":\"green\",\"x\":{\"field\":\"date\"},\"y\":{\"field\":\"gauss\"}},\"id\":\"1100\",\"type\":\"Line\"}],\"root_ids\":[\"1005\"]},\"title\":\"Bokeh Application\",\"version\":\"2.4.3\"}};\n const render_items = [{\"docid\":\"a5ebcb57-ca23-495f-bcbf-8f77d9804a82\",\"root_ids\":[\"1005\"],\"roots\":{\"1005\":\"429c3bdb-607d-4642-8df9-f49a4e8ebc89\"}}];\n root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n }\n if (root.Bokeh !== undefined) {\n embed_document(root);\n } else {\n let attempts = 0;\n const timer = setInterval(function(root) {\n if (root.Bokeh !== undefined) {\n clearInterval(timer);\n embed_document(root);\n } else {\n attempts++;\n if (attempts > 100) {\n clearInterval(timer);\n console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n }\n }\n }, 10, root)\n }\n})(window);", + "application/javascript": "(function(root) {\n function embed_document(root) {\n const docs_json = {\"14a00e77-c0d8-428a-ada5-8c30bc2ee6af\":{\"defs\":[],\"roots\":{\"references\":[{\"attributes\":{\"below\":[{\"id\":\"1016\"}],\"center\":[{\"id\":\"1019\"},{\"id\":\"1023\"},{\"id\":\"1068\"}],\"height\":450,\"left\":[{\"id\":\"1020\"}],\"renderers\":[{\"id\":\"1044\"},{\"id\":\"1074\"},{\"id\":\"1102\"},{\"id\":\"1131\"},{\"id\":\"1159\"},{\"id\":\"1188\"},{\"id\":\"1216\"},{\"id\":\"1245\"}],\"title\":{\"id\":\"1006\"},\"toolbar\":{\"id\":\"1032\"},\"x_range\":{\"id\":\"1008\"},\"x_scale\":{\"id\":\"1012\"},\"y_range\":{\"id\":\"1010\"},\"y_scale\":{\"id\":\"1014\"}},\"id\":\"1005\",\"subtype\":\"Figure\",\"type\":\"Plot\"},{\"attributes\":{\"data\":{\"cc\":{\"__ndarray__\":\"AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H9JLv8h/fb9P2gibHh6pf0/ZmZmZmZm/T+q8dJNYhD+P/7UeOkmMf4//yH99nXg/T/cRgN4CyT+P8BbIEHxY/0/tTf4wmSq/T8ydy0hH/T9P0oMAiuHFv4/INJvXwfO/T9q3nGKjuT9Px+F61G4Hv4/Di2yne+n/T+jI7n8h/T9P0Ck374OnP0/JXUCmggb/j/gnBGlvcH9PyegibDh6f0/0m9fB84Z/j9SuB6F61H+P7x0kxgEVv4/MlUwKqkT/j/l8h/Sb1/+PwMJih9j7v4/9bnaiv1l/j+DL0ymCkb+P2Rd3EYDeP4/3+ALk6mC/j8GgZVDi2z+P9NNYhBYOf4/uK8D54wo/T8=\",\"dtype\":\"float64\",\"order\":\"little\",\"shape\":[43]},\"code_coverage\":{\"__ndarray__\":\"PnlYqDXN2z/WVuwvuyfTPxB6Nqs+V9M/vJaQD3o21z8EVg4tsp3XP+PHmLuWkNc/lIeFWtO81z+Uh4Va07zXP9DVVuwvu9c/cvkP6bev1z/9h/Tb14HXP3sUrkfhetg/t2J/2T152D+QMXctIR/EP5Axdy0hH8Q/K/aX3ZOHxT+jkjoBTYTFP0T67evAOcM/ylTBqKROyD/8qfHSTWLIP662Yn/ZPck/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACutmJ/2T3JPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=\",\"dtype\":\"float64\",\"order\":\"little\",\"shape\":[43]},\"commit_hash\":[\"df25a9cfacd3d652361d2bd37f568af00acb2631\",\"b797390a43298a815f3ff57955cfdc71ecf3e866\",\"01a02d5f91b2f4a863eebe88a618974b0749d1c4\",\"dd847210082035d43b0273ae63a76a53cb8d2e12\",\"33779269e98cc882a5f066c462d8ec1eadf37a1a\",\"12890e029a7155b074b9b325d320d1798338e287\",\"66dafc08bd620d96deda7d526b0e4bfc3b086650\",\"a325819b3b03b84bd76ad455e3f9b4600744ba14\",\"8a2c1a610295c007f0222ce737723c341189811d\",\"c6bc79b0cfbc8ce5d6da0d33b68028157d2e93c0\",\"03e1f461c152e4f221fe92c834f2787680cf5772\",\"9e96d6c412b64fe76a57e7de8af3b00c21d18348\",\"2a98428f9c6fb9bb4302ae09809441bf3e7162b0\",\"9b4e85cf1b41ba7001aaba1a830b93e176f3dd43\",\"d18f4d263ecabf502242592f9d60815a07c7b89c\",\"a23241bb9e45078e36a4662d48c9d3fe0c3316e4\",\"c2006b0011a5df036c306c15e75763ec492dafda\",\"0c2adf3e702b6427da946a6ba9dbedbea22738be\",\"39c466000b1874e06a6f58da9c30bb877fc8d4d2\",\"8436fd78b002e5792f5d0dd1409332d171036d49\",\"07a45b66c5facfea06c40bd82e34040c97560640\",\"1d84538c334a502c6ad7df48b8cc2309d6a6436d\",\"4d528a3d6456621a382d409b5145a877b5414b88\",\"8c637b36b66069b216cb94ae87d4c0a91e9b211e\",\"4d23fa6dd78d0497deb4fd62783f0b3ee4204579\",\"015f6874c320efee2c0d1ae76eea4a5b043d69d6\",\"26f06d449da208ce64724b1463b07ad20746cbdc\",\"6b9d6bb8bec6e3ea548f5858e2a8ea5986264fc8\",\"b796bd0fd92ba6b91d590f6cb60bb7ab3bca9932\",\"780aef7c7b4b9cafea3e323d536a34a4af5818b4\",\"9f93ad9bf85e4a0e6baf5b62ea4b3ef143729861\",\"16628a0ba45a675df762245694e0a7666a3478f8\",\"01684c8559604344bd09791268131819a09770a8\",\"e9231fb893c765b723fa4c1e087a58761b6aa471\",\"219889e243ffc69c71b6f7747f5af751d5694de1\",\"6124d2a82a7a823722210bc2e8516d355ba19eb3\",\"f6e4287f712cc866893e71b1ea7a7546e4567bf9\",\"f2797fef396f2f19b02abb1f9555b678dac614f1\",\"b4e538f530048fec58eaca5170be82c67dbdcceb\",\"68820b715ed6b2c981aa11d29c0102e879280d79\",\"03deffeda91fa8d8ab188d57b9fa302a7be008e0\",\"0d2bfecc271d561f67050659684b4797af8ee740\",\"1d03a465593f56c99a64a576d185d4ed17b659f2\"],\"commit_hash_8char\":[\"df25a9cf\",\"b797390a\",\"01a02d5f\",\"dd847210\",\"33779269\",\"12890e02\",\"66dafc08\",\"a325819b\",\"8a2c1a61\",\"c6bc79b0\",\"03e1f461\",\"9e96d6c4\",\"2a98428f\",\"9b4e85cf\",\"d18f4d26\",\"a23241bb\",\"c2006b00\",\"0c2adf3e\",\"39c46600\",\"8436fd78\",\"07a45b66\",\"1d84538c\",\"4d528a3d\",\"8c637b36\",\"4d23fa6d\",\"015f6874\",\"26f06d44\",\"6b9d6bb8\",\"b796bd0f\",\"780aef7c\",\"9f93ad9b\",\"16628a0b\",\"01684c85\",\"e9231fb8\",\"219889e2\",\"6124d2a8\",\"f6e4287f\",\"f2797fef\",\"b4e538f5\",\"68820b71\",\"03deffed\",\"0d2bfecc\",\"1d03a465\"],\"date\":{\"__ndarray__\":\"AACAyDfgd0IAAEDF0+F3QgAAACsm4ndCAACA9srid0IAAICNFOR3QgAAQPNm5HdCAAAAWbnkd0IAAMC+C+V3QgAAgCRe5XdCAACAJF7ld0IAAIC7p+Z3QgAAQCH65ndCAACA3Krvd0IAAABtLPR3QgAAQJ4j9XdCAAAAvML/d0IAAMBWixh4QgAAQIU5NHhCAAAAWyVJeEIAAAAn5WJ4QgAAACflYnhCAACAt2ZneEIAAEAduWd4QgAAQLQCaXhCAABAtAJpeEIAAMB/p2l4QgAAgHxDa3hCAACAfENreEIAAIB8Q2t4QgAAQOKVa3hCAABA4pVreEIAAEDilWt4QgAAwNvNbnhCAAAADcVveEIAAEA+vHB4QgAAAGnrdHhCAAAAXFt7eEIAAABcW3t4QgAAAFxbe3hCAAAAXFt7eEIAAABcW3t4QgAAAFxbe3hCAAAAXFt7eEI=\",\"dtype\":\"float64\",\"order\":\"little\",\"shape\":[43]},\"gauss\":{\"__ndarray__\":\"GJXUCWgi9D+Hp1fKMsTzP240gLdAguw/845TdCSX6z8s1JrmHafsPyZTBaOSOu0/MCqpE9BE7D9hw9MrZRnsP9jw9EpZhuw/pN++Dpwz7D/VeOkmMQjsP57vp8ZLN+s/pgpGJXUC7D/YgXNGlPbuP9lfdk8eFu4/LSEf9GxW7z/HuriNBvDuPzSitDf4wu4/RpT2Bl+Y7j/wFkhQ/BjvPwpoImx4eu8/bHh6pSxD7j8rGJXUCWjuPwn5oGez6u8/4JwRpb3B7z8HzhlR2hvwP6UsQxzr4u4/SOF6FK5H7z+oxks3iUHuP6Fns+pzte8/w/UoXI/C7z8K16NwPQrvPw8LtaZ5x+8/UiegibDh7z+IY13cRgPwP5SHhVrTvO8/GQRWDi2y7z92cRsN4C3wPxWMSuoENO8/escpOpLL7z/IBz2bVZ/vP/kP6bevA/A/gZVDi2zn7z8=\",\"dtype\":\"float64\",\"order\":\"little\",\"shape\":[43]},\"gch\":{\"__ndarray__\":\"X5hMFYxK+j9IUPwYc9f8Px3J5T+k3/c/2T15WKg19z9seHqlLEP4Pxzr4jYawPg/lPYGX5hM+D9xrIvbaAD4P4V80LNZ9fg/io7k8h/S9z/ChqdXyjL4P4XrUbgehfc/KxiV1Alo+D8730+Nl275P7x0kxgEVvk/seHplbIM+j988rBQa5r5P3EbDeAtkPk/ylTBqKRO+T/6fmq8dJP5PzMzMzMzM/k/HHxhMlUw+T8g0m9fB874P+84RUdy+fg/GCZTBaOS+T8Cmggbnl75PxE2PL1Slvk/3GgAb4EE+j80ETY8vVL5P4MvTKYKRvk/rIvbaABv+T9O0ZFc/kP5P2sr9pfdk/k/ylTBqKRO+T97gy9Mpgr5PzXvOEVHcvk/8WPMXUvI+T+e76fGSzf5P/hT46WbxPk/YTJVMCqp+T9XW7G/7J75P6+UZYhjXfk/6+I2GsBb+T8=\",\"dtype\":\"float64\",\"order\":\"little\",\"shape\":[43]},\"index\":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42],\"jensen\":{\"__ndarray__\":\"WKg1zTtO9D/vOEVHcvnlP2PuWkI+6Nk/qmBUUieg2T/D9Shcj8LZP4EExY8xd9k/uB6F61G42j8/V1uxv+zaP1+YTBWMSto/bAn5oGez2j/swDkjSnvbP7u4jQbwFtw/ylTBqKRO0D9R2ht8YTLRP3gLJCh+jNE/irDh6ZWy0D+Sy39Iv33RP/mgZ7Pqc9E/gQTFjzF30T/mriXkg57RP5Cg+DHmrtE/TYQNT6+U0T+GWtO84xTRP1tCPujZrNI/FNBE2PD00j+JQWDl0CLTPwyTqYJRSdE/nDOitDf40j8mUwWjkjrRP99PjZduEtM/tMh2vp8a0z8qOpLLf0jTP3ZPHhZqTdM/RiV1ApoI0z9DrWnecYrSP/kP6bevA9M/sHJoke180z+dgCbChqfTP/RsVn2uttI/KjqSy39I0z+Nl24Sg8DSP5+rrdhfdtM/p3nHKTqS0z8=\",\"dtype\":\"float64\",\"order\":\"little\",\"shape\":[43]},\"tooltip_label\":[\"df25a9cf\",\"b797390a\",\"01a02d5f\",\"dd847210\",\"33779269\",\"12890e02\",\"66dafc08\",\"a325819b\",\"8a2c1a61\",\"c6bc79b0\",\"PR #56\",\"v3.0rc1\",\"PR #317\",\"v3.0\",\"v3.0.1\",\"v3.1\",\"v3.1.1\",\"v3.2\",\"v3.2.1\",\"v3.2.2\",\"07a45b66\",\"1d84538c\",\"4d528a3d\",\"8c637b36\",\"4d23fa6d\",\"015f6874\",\"26f06d44\",\"6b9d6bb8\",\"b796bd0f\",\"780aef7c\",\"9f93ad9b\",\"v3.3\",\"01684c85\",\"e9231fb8\",\"219889e2\",\"6124d2a8\",\"f6e4287f\",\"f2797fef\",\"b4e538f5\",\"68820b71\",\"03deffed\",\"0d2bfecc\",\"1d03a465\"]},\"selected\":{\"id\":\"1054\"},\"selection_policy\":{\"id\":\"1053\"}},\"id\":\"1003\",\"type\":\"ColumnDataSource\"},{\"attributes\":{\"tools\":[{\"id\":\"1024\"},{\"id\":\"1025\"},{\"id\":\"1026\"},{\"id\":\"1027\"},{\"id\":\"1028\"},{\"id\":\"1029\"},{\"id\":\"1031\"}]},\"id\":\"1032\",\"type\":\"Toolbar\"},{\"attributes\":{\"fill_color\":{\"value\":\"blue\"},\"line_color\":{\"value\":\"blue\"},\"size\":{\"value\":6},\"x\":{\"field\":\"date\"},\"y\":{\"field\":\"jensen\"}},\"id\":\"1071\",\"type\":\"Circle\"},{\"attributes\":{\"bottom_units\":\"screen\",\"coordinates\":null,\"fill_alpha\":0.5,\"fill_color\":\"lightgrey\",\"group\":null,\"left_units\":\"screen\",\"level\":\"overlay\",\"line_alpha\":1.0,\"line_color\":\"black\",\"line_dash\":[4,4],\"line_width\":2,\"right_units\":\"screen\",\"syncable\":false,\"top_units\":\"screen\"},\"id\":\"1030\",\"type\":\"BoxAnnotation\"},{\"attributes\":{},\"id\":\"1028\",\"type\":\"ResetTool\"},{\"attributes\":{},\"id\":\"1027\",\"type\":\"SaveTool\"},{\"attributes\":{\"overlay\":{\"id\":\"1030\"}},\"id\":\"1026\",\"type\":\"BoxZoomTool\"},{\"attributes\":{\"coordinates\":null,\"data_source\":{\"id\":\"1003\"},\"glyph\":{\"id\":\"1242\"},\"group\":null,\"hover_glyph\":null,\"muted_glyph\":{\"id\":\"1244\"},\"nonselection_glyph\":{\"id\":\"1243\"},\"view\":{\"id\":\"1246\"}},\"id\":\"1245\",\"type\":\"GlyphRenderer\"},{\"attributes\":{},\"id\":\"1024\",\"type\":\"PanTool\"},{\"attributes\":{},\"id\":\"1025\",\"type\":\"WheelZoomTool\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.2},\"fill_color\":{\"value\":\"cyan\"},\"hatch_alpha\":{\"value\":0.2},\"line_alpha\":{\"value\":0.2},\"line_color\":{\"value\":\"cyan\"},\"size\":{\"value\":6},\"x\":{\"field\":\"date\"},\"y\":{\"field\":\"cc\"}},\"id\":\"1244\",\"type\":\"Circle\"},{\"attributes\":{\"callback\":null,\"tooltips\":[[\"git ref\",\"@tooltip_label\"]]},\"id\":\"1031\",\"type\":\"HoverTool\"},{\"attributes\":{},\"id\":\"1021\",\"type\":\"BasicTicker\"},{\"attributes\":{\"axis\":{\"id\":\"1020\"},\"coordinates\":null,\"dimension\":1,\"group\":null,\"ticker\":null},\"id\":\"1023\",\"type\":\"Grid\"},{\"attributes\":{\"source\":{\"id\":\"1003\"}},\"id\":\"1246\",\"type\":\"CDSView\"},{\"attributes\":{\"axis_label\":\"Time to solution (s)\",\"coordinates\":null,\"formatter\":{\"id\":\"1048\"},\"group\":null,\"major_label_policy\":{\"id\":\"1049\"},\"ticker\":{\"id\":\"1021\"}},\"id\":\"1020\",\"type\":\"LinearAxis\"},{\"attributes\":{},\"id\":\"1029\",\"type\":\"HelpTool\"},{\"attributes\":{},\"id\":\"1014\",\"type\":\"LinearScale\"},{\"attributes\":{\"axis\":{\"id\":\"1016\"},\"coordinates\":null,\"group\":null,\"ticker\":null},\"id\":\"1019\",\"type\":\"Grid\"},{\"attributes\":{\"fill_color\":{\"value\":\"red\"},\"line_color\":{\"value\":\"red\"},\"size\":{\"value\":6},\"x\":{\"field\":\"date\"},\"y\":{\"field\":\"gch\"}},\"id\":\"1185\",\"type\":\"Circle\"},{\"attributes\":{\"num_minor_ticks\":5,\"tickers\":[{\"id\":\"1056\"},{\"id\":\"1057\"},{\"id\":\"1058\"},{\"id\":\"1059\"},{\"id\":\"1060\"},{\"id\":\"1061\"},{\"id\":\"1062\"},{\"id\":\"1063\"},{\"id\":\"1064\"},{\"id\":\"1065\"},{\"id\":\"1066\"},{\"id\":\"1067\"}]},\"id\":\"1017\",\"type\":\"DatetimeTicker\"},{\"attributes\":{},\"id\":\"1054\",\"type\":\"Selection\"},{\"attributes\":{},\"id\":\"1053\",\"type\":\"UnionRenderers\"},{\"attributes\":{\"line_alpha\":0.1,\"line_color\":\"cyan\",\"x\":{\"field\":\"date\"},\"y\":{\"field\":\"cc\"}},\"id\":\"1214\",\"type\":\"Line\"},{\"attributes\":{\"label\":{\"value\":\"cc\"},\"renderers\":[{\"id\":\"1216\"},{\"id\":\"1245\"}]},\"id\":\"1240\",\"type\":\"LegendItem\"},{\"attributes\":{\"line_alpha\":0.2,\"line_color\":\"cyan\",\"x\":{\"field\":\"date\"},\"y\":{\"field\":\"cc\"}},\"id\":\"1215\",\"type\":\"Line\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.1},\"fill_color\":{\"value\":\"cyan\"},\"hatch_alpha\":{\"value\":0.1},\"line_alpha\":{\"value\":0.1},\"line_color\":{\"value\":\"cyan\"},\"size\":{\"value\":6},\"x\":{\"field\":\"date\"},\"y\":{\"field\":\"cc\"}},\"id\":\"1243\",\"type\":\"Circle\"},{\"attributes\":{\"source\":{\"id\":\"1003\"}},\"id\":\"1217\",\"type\":\"CDSView\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.2},\"fill_color\":{\"value\":\"red\"},\"hatch_alpha\":{\"value\":0.2},\"line_alpha\":{\"value\":0.2},\"line_color\":{\"value\":\"red\"},\"size\":{\"value\":6},\"x\":{\"field\":\"date\"},\"y\":{\"field\":\"gch\"}},\"id\":\"1187\",\"type\":\"Circle\"},{\"attributes\":{\"line_color\":\"cyan\",\"x\":{\"field\":\"date\"},\"y\":{\"field\":\"cc\"}},\"id\":\"1213\",\"type\":\"Line\"},{\"attributes\":{\"fill_color\":{\"value\":\"cyan\"},\"line_color\":{\"value\":\"cyan\"},\"size\":{\"value\":6},\"x\":{\"field\":\"date\"},\"y\":{\"field\":\"cc\"}},\"id\":\"1242\",\"type\":\"Circle\"},{\"attributes\":{\"line_color\":\"blue\",\"x\":{\"field\":\"date\"},\"y\":{\"field\":\"jensen\"}},\"id\":\"1041\",\"type\":\"Line\"},{\"attributes\":{},\"id\":\"1048\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{\"coordinates\":null,\"data_source\":{\"id\":\"1003\"},\"glyph\":{\"id\":\"1213\"},\"group\":null,\"hover_glyph\":null,\"muted_glyph\":{\"id\":\"1215\"},\"nonselection_glyph\":{\"id\":\"1214\"},\"view\":{\"id\":\"1217\"}},\"id\":\"1216\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"line_alpha\":0.2,\"line_color\":\"red\",\"x\":{\"field\":\"date\"},\"y\":{\"field\":\"gch\"}},\"id\":\"1158\",\"type\":\"Line\"},{\"attributes\":{\"line_alpha\":0.2,\"line_color\":\"blue\",\"x\":{\"field\":\"date\"},\"y\":{\"field\":\"jensen\"}},\"id\":\"1043\",\"type\":\"Line\"},{\"attributes\":{\"border_line_color\":\"black\",\"click_policy\":\"mute\",\"coordinates\":null,\"group\":null,\"items\":[{\"id\":\"1069\"},{\"id\":\"1126\"},{\"id\":\"1183\"},{\"id\":\"1240\"}],\"location\":\"bottom_left\"},\"id\":\"1068\",\"type\":\"Legend\"},{\"attributes\":{\"label\":{\"value\":\"gch\"},\"renderers\":[{\"id\":\"1159\"},{\"id\":\"1188\"}]},\"id\":\"1183\",\"type\":\"LegendItem\"},{\"attributes\":{\"label\":{\"value\":\"jensen\"},\"renderers\":[{\"id\":\"1044\"},{\"id\":\"1074\"}]},\"id\":\"1069\",\"type\":\"LegendItem\"},{\"attributes\":{\"line_alpha\":0.1,\"line_color\":\"blue\",\"x\":{\"field\":\"date\"},\"y\":{\"field\":\"jensen\"}},\"id\":\"1042\",\"type\":\"Line\"},{\"attributes\":{\"source\":{\"id\":\"1003\"}},\"id\":\"1045\",\"type\":\"CDSView\"},{\"attributes\":{\"source\":{\"id\":\"1003\"}},\"id\":\"1132\",\"type\":\"CDSView\"},{\"attributes\":{\"source\":{\"id\":\"1003\"}},\"id\":\"1189\",\"type\":\"CDSView\"},{\"attributes\":{\"coordinates\":null,\"data_source\":{\"id\":\"1003\"},\"glyph\":{\"id\":\"1041\"},\"group\":null,\"hover_glyph\":null,\"muted_glyph\":{\"id\":\"1043\"},\"nonselection_glyph\":{\"id\":\"1042\"},\"view\":{\"id\":\"1045\"}},\"id\":\"1044\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.2},\"fill_color\":{\"value\":\"green\"},\"hatch_alpha\":{\"value\":0.2},\"line_alpha\":{\"value\":0.2},\"line_color\":{\"value\":\"green\"},\"size\":{\"value\":6},\"x\":{\"field\":\"date\"},\"y\":{\"field\":\"gauss\"}},\"id\":\"1130\",\"type\":\"Circle\"},{\"attributes\":{},\"id\":\"1010\",\"type\":\"DataRange1d\"},{\"attributes\":{\"line_alpha\":0.1,\"line_color\":\"red\",\"x\":{\"field\":\"date\"},\"y\":{\"field\":\"gch\"}},\"id\":\"1157\",\"type\":\"Line\"},{\"attributes\":{\"coordinates\":null,\"data_source\":{\"id\":\"1003\"},\"glyph\":{\"id\":\"1128\"},\"group\":null,\"hover_glyph\":null,\"muted_glyph\":{\"id\":\"1130\"},\"nonselection_glyph\":{\"id\":\"1129\"},\"view\":{\"id\":\"1132\"}},\"id\":\"1131\",\"type\":\"GlyphRenderer\"},{\"attributes\":{},\"id\":\"1008\",\"type\":\"DataRange1d\"},{\"attributes\":{\"line_color\":\"red\",\"x\":{\"field\":\"date\"},\"y\":{\"field\":\"gch\"}},\"id\":\"1156\",\"type\":\"Line\"},{\"attributes\":{\"coordinates\":null,\"data_source\":{\"id\":\"1003\"},\"glyph\":{\"id\":\"1185\"},\"group\":null,\"hover_glyph\":null,\"muted_glyph\":{\"id\":\"1187\"},\"nonselection_glyph\":{\"id\":\"1186\"},\"view\":{\"id\":\"1189\"}},\"id\":\"1188\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.1},\"fill_color\":{\"value\":\"red\"},\"hatch_alpha\":{\"value\":0.1},\"line_alpha\":{\"value\":0.1},\"line_color\":{\"value\":\"red\"},\"size\":{\"value\":6},\"x\":{\"field\":\"date\"},\"y\":{\"field\":\"gch\"}},\"id\":\"1186\",\"type\":\"Circle\"},{\"attributes\":{},\"id\":\"1012\",\"type\":\"LinearScale\"},{\"attributes\":{\"coordinates\":null,\"group\":null,\"text\":\"5x5 Wind Farm Timing Test\"},\"id\":\"1006\",\"type\":\"Title\"},{\"attributes\":{\"axis_label\":\"Commit date\",\"coordinates\":null,\"formatter\":{\"id\":\"1051\"},\"group\":null,\"major_label_policy\":{\"id\":\"1052\"},\"ticker\":{\"id\":\"1017\"}},\"id\":\"1016\",\"type\":\"DatetimeAxis\"},{\"attributes\":{},\"id\":\"1051\",\"type\":\"DatetimeTickFormatter\"},{\"attributes\":{},\"id\":\"1049\",\"type\":\"AllLabels\"},{\"attributes\":{\"coordinates\":null,\"data_source\":{\"id\":\"1003\"},\"glyph\":{\"id\":\"1156\"},\"group\":null,\"hover_glyph\":null,\"muted_glyph\":{\"id\":\"1158\"},\"nonselection_glyph\":{\"id\":\"1157\"},\"view\":{\"id\":\"1160\"}},\"id\":\"1159\",\"type\":\"GlyphRenderer\"},{\"attributes\":{},\"id\":\"1052\",\"type\":\"AllLabels\"},{\"attributes\":{\"mantissas\":[1,2,5],\"max_interval\":500.0,\"num_minor_ticks\":0},\"id\":\"1056\",\"type\":\"AdaptiveTicker\"},{\"attributes\":{\"label\":{\"value\":\"gauss\"},\"renderers\":[{\"id\":\"1102\"},{\"id\":\"1131\"}]},\"id\":\"1126\",\"type\":\"LegendItem\"},{\"attributes\":{\"line_alpha\":0.2,\"line_color\":\"green\",\"x\":{\"field\":\"date\"},\"y\":{\"field\":\"gauss\"}},\"id\":\"1101\",\"type\":\"Line\"},{\"attributes\":{\"days\":[1,8,15,22]},\"id\":\"1061\",\"type\":\"DaysTicker\"},{\"attributes\":{\"base\":60,\"mantissas\":[1,2,5,10,15,20,30],\"max_interval\":1800000.0,\"min_interval\":1000.0,\"num_minor_ticks\":0},\"id\":\"1057\",\"type\":\"AdaptiveTicker\"},{\"attributes\":{\"line_alpha\":0.1,\"line_color\":\"green\",\"x\":{\"field\":\"date\"},\"y\":{\"field\":\"gauss\"}},\"id\":\"1100\",\"type\":\"Line\"},{\"attributes\":{\"base\":24,\"mantissas\":[1,2,4,6,8,12],\"max_interval\":43200000.0,\"min_interval\":3600000.0,\"num_minor_ticks\":0},\"id\":\"1058\",\"type\":\"AdaptiveTicker\"},{\"attributes\":{},\"id\":\"1067\",\"type\":\"YearsTicker\"},{\"attributes\":{\"source\":{\"id\":\"1003\"}},\"id\":\"1160\",\"type\":\"CDSView\"},{\"attributes\":{\"days\":[1,4,7,10,13,16,19,22,25,28]},\"id\":\"1060\",\"type\":\"DaysTicker\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.1},\"fill_color\":{\"value\":\"green\"},\"hatch_alpha\":{\"value\":0.1},\"line_alpha\":{\"value\":0.1},\"line_color\":{\"value\":\"green\"},\"size\":{\"value\":6},\"x\":{\"field\":\"date\"},\"y\":{\"field\":\"gauss\"}},\"id\":\"1129\",\"type\":\"Circle\"},{\"attributes\":{\"days\":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31]},\"id\":\"1059\",\"type\":\"DaysTicker\"},{\"attributes\":{\"months\":[0,6]},\"id\":\"1066\",\"type\":\"MonthsTicker\"},{\"attributes\":{\"days\":[1,15]},\"id\":\"1062\",\"type\":\"DaysTicker\"},{\"attributes\":{\"months\":[0,1,2,3,4,5,6,7,8,9,10,11]},\"id\":\"1063\",\"type\":\"MonthsTicker\"},{\"attributes\":{\"months\":[0,2,4,6,8,10]},\"id\":\"1064\",\"type\":\"MonthsTicker\"},{\"attributes\":{\"months\":[0,4,8]},\"id\":\"1065\",\"type\":\"MonthsTicker\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.2},\"fill_color\":{\"value\":\"blue\"},\"hatch_alpha\":{\"value\":0.2},\"line_alpha\":{\"value\":0.2},\"line_color\":{\"value\":\"blue\"},\"size\":{\"value\":6},\"x\":{\"field\":\"date\"},\"y\":{\"field\":\"jensen\"}},\"id\":\"1073\",\"type\":\"Circle\"},{\"attributes\":{\"fill_color\":{\"value\":\"green\"},\"line_color\":{\"value\":\"green\"},\"size\":{\"value\":6},\"x\":{\"field\":\"date\"},\"y\":{\"field\":\"gauss\"}},\"id\":\"1128\",\"type\":\"Circle\"},{\"attributes\":{\"source\":{\"id\":\"1003\"}},\"id\":\"1075\",\"type\":\"CDSView\"},{\"attributes\":{\"source\":{\"id\":\"1003\"}},\"id\":\"1103\",\"type\":\"CDSView\"},{\"attributes\":{\"line_color\":\"green\",\"x\":{\"field\":\"date\"},\"y\":{\"field\":\"gauss\"}},\"id\":\"1099\",\"type\":\"Line\"},{\"attributes\":{\"coordinates\":null,\"data_source\":{\"id\":\"1003\"},\"glyph\":{\"id\":\"1071\"},\"group\":null,\"hover_glyph\":null,\"muted_glyph\":{\"id\":\"1073\"},\"nonselection_glyph\":{\"id\":\"1072\"},\"view\":{\"id\":\"1075\"}},\"id\":\"1074\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"coordinates\":null,\"data_source\":{\"id\":\"1003\"},\"glyph\":{\"id\":\"1099\"},\"group\":null,\"hover_glyph\":null,\"muted_glyph\":{\"id\":\"1101\"},\"nonselection_glyph\":{\"id\":\"1100\"},\"view\":{\"id\":\"1103\"}},\"id\":\"1102\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.1},\"fill_color\":{\"value\":\"blue\"},\"hatch_alpha\":{\"value\":0.1},\"line_alpha\":{\"value\":0.1},\"line_color\":{\"value\":\"blue\"},\"size\":{\"value\":6},\"x\":{\"field\":\"date\"},\"y\":{\"field\":\"jensen\"}},\"id\":\"1072\",\"type\":\"Circle\"}],\"root_ids\":[\"1005\"]},\"title\":\"Bokeh Application\",\"version\":\"2.4.3\"}};\n const render_items = [{\"docid\":\"14a00e77-c0d8-428a-ada5-8c30bc2ee6af\",\"root_ids\":[\"1005\"],\"roots\":{\"1005\":\"b266d0f6-784c-4b82-810c-b68dc9aba108\"}}];\n root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n }\n if (root.Bokeh !== undefined) {\n embed_document(root);\n } else {\n let attempts = 0;\n const timer = setInterval(function(root) {\n if (root.Bokeh !== undefined) {\n clearInterval(timer);\n embed_document(root);\n } else {\n attempts++;\n if (attempts > 100) {\n clearInterval(timer);\n console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n }\n }\n }, 10, root)\n }\n})(window);", "application/vnd.bokehjs_exec.v0+json": "" }, "metadata": { @@ -167,7 +197,7 @@ "data": { "text/html": [ "\n", - "
\n" + "
\n" ] }, "metadata": {}, @@ -175,7 +205,7 @@ }, { "data": { - "application/javascript": "(function(root) {\n function embed_document(root) {\n const docs_json = {\"a3ad1ac9-909e-4221-a4f9-bb91110ed496\":{\"defs\":[],\"roots\":{\"references\":[{\"attributes\":{\"below\":[{\"id\":\"1412\"}],\"center\":[{\"id\":\"1415\"},{\"id\":\"1419\"}],\"height\":450,\"left\":[{\"id\":\"1416\"}],\"renderers\":[{\"id\":\"1440\"},{\"id\":\"1446\"}],\"title\":{\"id\":\"1402\"},\"toolbar\":{\"id\":\"1428\"},\"x_range\":{\"id\":\"1404\"},\"x_scale\":{\"id\":\"1408\"},\"y_range\":{\"id\":\"1448\"},\"y_scale\":{\"id\":\"1410\"}},\"id\":\"1401\",\"subtype\":\"Figure\",\"type\":\"Plot\"},{\"attributes\":{\"line_alpha\":0.2,\"line_color\":\"blue\",\"x\":{\"field\":\"date\"},\"y\":{\"field\":\"code_coverage\"}},\"id\":\"1439\",\"type\":\"Line\"},{\"attributes\":{},\"id\":\"1408\",\"type\":\"LinearScale\"},{\"attributes\":{},\"id\":\"1474\",\"type\":\"AllLabels\"},{\"attributes\":{\"num_minor_ticks\":5,\"tickers\":[{\"id\":\"1481\"},{\"id\":\"1482\"},{\"id\":\"1483\"},{\"id\":\"1484\"},{\"id\":\"1485\"},{\"id\":\"1486\"},{\"id\":\"1487\"},{\"id\":\"1488\"},{\"id\":\"1489\"},{\"id\":\"1490\"},{\"id\":\"1491\"},{\"id\":\"1492\"}]},\"id\":\"1413\",\"type\":\"DatetimeTicker\"},{\"attributes\":{\"bottom_units\":\"screen\",\"coordinates\":null,\"fill_alpha\":0.5,\"fill_color\":\"lightgrey\",\"group\":null,\"left_units\":\"screen\",\"level\":\"overlay\",\"line_alpha\":1.0,\"line_color\":\"black\",\"line_dash\":[4,4],\"line_width\":2,\"right_units\":\"screen\",\"syncable\":false,\"top_units\":\"screen\"},\"id\":\"1426\",\"type\":\"BoxAnnotation\"},{\"attributes\":{\"coordinates\":null,\"data_source\":{\"id\":\"1003\"},\"glyph\":{\"id\":\"1443\"},\"group\":null,\"hover_glyph\":null,\"muted_glyph\":{\"id\":\"1445\"},\"nonselection_glyph\":{\"id\":\"1444\"},\"view\":{\"id\":\"1447\"}},\"id\":\"1446\",\"type\":\"GlyphRenderer\"},{\"attributes\":{},\"id\":\"1053\",\"type\":\"UnionRenderers\"},{\"attributes\":{},\"id\":\"1473\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{\"mantissas\":[1,2,5],\"max_interval\":500.0,\"num_minor_ticks\":0},\"id\":\"1481\",\"type\":\"AdaptiveTicker\"},{\"attributes\":{},\"id\":\"1425\",\"type\":\"HelpTool\"},{\"attributes\":{\"coordinates\":null,\"group\":null,\"text\":\"Code Coverage\"},\"id\":\"1402\",\"type\":\"Title\"},{\"attributes\":{},\"id\":\"1476\",\"type\":\"DatetimeTickFormatter\"},{\"attributes\":{},\"id\":\"1054\",\"type\":\"Selection\"},{\"attributes\":{\"line_color\":\"blue\",\"x\":{\"field\":\"date\"},\"y\":{\"field\":\"code_coverage\"}},\"id\":\"1437\",\"type\":\"Line\"},{\"attributes\":{\"base\":60,\"mantissas\":[1,2,5,10,15,20,30],\"max_interval\":1800000.0,\"min_interval\":1000.0,\"num_minor_ticks\":0},\"id\":\"1482\",\"type\":\"AdaptiveTicker\"},{\"attributes\":{\"coordinates\":null,\"data_source\":{\"id\":\"1003\"},\"glyph\":{\"id\":\"1437\"},\"group\":null,\"hover_glyph\":null,\"muted_glyph\":{\"id\":\"1439\"},\"nonselection_glyph\":{\"id\":\"1438\"},\"view\":{\"id\":\"1441\"}},\"id\":\"1440\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"base\":24,\"mantissas\":[1,2,4,6,8,12],\"max_interval\":43200000.0,\"min_interval\":3600000.0,\"num_minor_ticks\":0},\"id\":\"1483\",\"type\":\"AdaptiveTicker\"},{\"attributes\":{\"axis_label\":\"Commit date\",\"coordinates\":null,\"formatter\":{\"id\":\"1476\"},\"group\":null,\"major_label_policy\":{\"id\":\"1477\"},\"ticker\":{\"id\":\"1413\"}},\"id\":\"1412\",\"type\":\"DatetimeAxis\"},{\"attributes\":{\"days\":[1,15]},\"id\":\"1487\",\"type\":\"DaysTicker\"},{\"attributes\":{},\"id\":\"1477\",\"type\":\"AllLabels\"},{\"attributes\":{},\"id\":\"1417\",\"type\":\"BasicTicker\"},{\"attributes\":{\"months\":[0,1,2,3,4,5,6,7,8,9,10,11]},\"id\":\"1488\",\"type\":\"MonthsTicker\"},{\"attributes\":{\"callback\":null,\"tooltips\":[[\"git ref\",\"@tooltip_label\"]]},\"id\":\"1427\",\"type\":\"HoverTool\"},{\"attributes\":{\"months\":[0,6]},\"id\":\"1491\",\"type\":\"MonthsTicker\"},{\"attributes\":{\"days\":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31]},\"id\":\"1484\",\"type\":\"DaysTicker\"},{\"attributes\":{\"axis_label\":\"Test coverage as a percentage of Python code\",\"coordinates\":null,\"formatter\":{\"id\":\"1473\"},\"group\":null,\"major_label_policy\":{\"id\":\"1474\"},\"ticker\":{\"id\":\"1417\"}},\"id\":\"1416\",\"type\":\"LinearAxis\"},{\"attributes\":{\"axis\":{\"id\":\"1416\"},\"coordinates\":null,\"dimension\":1,\"group\":null,\"ticker\":null},\"id\":\"1419\",\"type\":\"Grid\"},{\"attributes\":{},\"id\":\"1492\",\"type\":\"YearsTicker\"},{\"attributes\":{\"days\":[1,8,15,22]},\"id\":\"1486\",\"type\":\"DaysTicker\"},{\"attributes\":{\"months\":[0,2,4,6,8,10]},\"id\":\"1489\",\"type\":\"MonthsTicker\"},{\"attributes\":{\"days\":[1,4,7,10,13,16,19,22,25,28]},\"id\":\"1485\",\"type\":\"DaysTicker\"},{\"attributes\":{},\"id\":\"1404\",\"type\":\"DataRange1d\"},{\"attributes\":{\"line_alpha\":0.1,\"line_color\":\"blue\",\"x\":{\"field\":\"date\"},\"y\":{\"field\":\"code_coverage\"}},\"id\":\"1438\",\"type\":\"Line\"},{\"attributes\":{\"months\":[0,4,8]},\"id\":\"1490\",\"type\":\"MonthsTicker\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.2},\"fill_color\":{\"value\":\"blue\"},\"hatch_alpha\":{\"value\":0.2},\"line_alpha\":{\"value\":0.2},\"line_color\":{\"value\":\"blue\"},\"size\":{\"value\":6},\"x\":{\"field\":\"date\"},\"y\":{\"field\":\"code_coverage\"}},\"id\":\"1445\",\"type\":\"Circle\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.1},\"fill_color\":{\"value\":\"blue\"},\"hatch_alpha\":{\"value\":0.1},\"line_alpha\":{\"value\":0.1},\"line_color\":{\"value\":\"blue\"},\"size\":{\"value\":6},\"x\":{\"field\":\"date\"},\"y\":{\"field\":\"code_coverage\"}},\"id\":\"1444\",\"type\":\"Circle\"},{\"attributes\":{\"overlay\":{\"id\":\"1426\"}},\"id\":\"1422\",\"type\":\"BoxZoomTool\"},{\"attributes\":{\"source\":{\"id\":\"1003\"}},\"id\":\"1441\",\"type\":\"CDSView\"},{\"attributes\":{},\"id\":\"1410\",\"type\":\"LinearScale\"},{\"attributes\":{\"axis\":{\"id\":\"1412\"},\"coordinates\":null,\"group\":null,\"ticker\":null},\"id\":\"1415\",\"type\":\"Grid\"},{\"attributes\":{\"source\":{\"id\":\"1003\"}},\"id\":\"1447\",\"type\":\"CDSView\"},{\"attributes\":{},\"id\":\"1420\",\"type\":\"PanTool\"},{\"attributes\":{},\"id\":\"1421\",\"type\":\"WheelZoomTool\"},{\"attributes\":{\"data\":{\"cc\":{\"__ndarray__\":\"AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H/BqKROQJMAQN5xio7kcgBADwu1pnlHAEA=\",\"dtype\":\"float64\",\"order\":\"little\",\"shape\":[13]},\"code_coverage\":{\"__ndarray__\":\"PnlYqDXN2z/WVuwvuyfTPxB6Nqs+V9M/vJaQD3o21z8EVg4tsp3XP+PHmLuWkNc/lIeFWtO81z+Uh4Va07zXP9DVVuwvu9c/cvkP6bev1z/9h/Tb14HXP3sUrkfhetg/t2J/2T152D8=\",\"dtype\":\"float64\",\"order\":\"little\",\"shape\":[13]},\"commit_hash\":[\"df25a9cfacd3d652361d2bd37f568af00acb2631\",\"b797390a43298a815f3ff57955cfdc71ecf3e866\",\"01a02d5f91b2f4a863eebe88a618974b0749d1c4\",\"dd847210082035d43b0273ae63a76a53cb8d2e12\",\"33779269e98cc882a5f066c462d8ec1eadf37a1a\",\"12890e029a7155b074b9b325d320d1798338e287\",\"66dafc08bd620d96deda7d526b0e4bfc3b086650\",\"a325819b3b03b84bd76ad455e3f9b4600744ba14\",\"8a2c1a610295c007f0222ce737723c341189811d\",\"c6bc79b0cfbc8ce5d6da0d33b68028157d2e93c0\",\"03e1f461c152e4f221fe92c834f2787680cf5772\",\"9e96d6c412b64fe76a57e7de8af3b00c21d18348\",\"2a98428f9c6fb9bb4302ae09809441bf3e7162b0\"],\"commit_hash_8char\":[\"df25a9cf\",\"b797390a\",\"01a02d5f\",\"dd847210\",\"33779269\",\"12890e02\",\"66dafc08\",\"a325819b\",\"8a2c1a61\",\"c6bc79b0\",\"03e1f461\",\"9e96d6c4\",\"2a98428f\"],\"date\":{\"__ndarray__\":\"AACAyDfgd0IAAEDF0+F3QgAAACsm4ndCAACA9srid0IAAICNFOR3QgAAQPNm5HdCAAAAWbnkd0IAAMC+C+V3QgAAgCRe5XdCAACAJF7ld0IAAIC7p+Z3QgAAQCH65ndCAACARWHud0I=\",\"dtype\":\"float64\",\"order\":\"little\",\"shape\":[13]},\"gauss\":{\"__ndarray__\":\"GJXUCWgi9D+Hp1fKMsTzPwXFjzF3Le0/FNBE2PD07D8VjErqBDTtP6AaL90kBu0/N4lBYOXQ7D/HuriNBvDsP8oyxLEubu0/5BQdyeU/7D8qOpLLf0jtP0I+6Nms+uw/LGUZ4lgX7T8=\",\"dtype\":\"float64\",\"order\":\"little\",\"shape\":[13]},\"gch\":{\"__ndarray__\":\"X5hMFYxK+j9IUPwYc9f8P6vP1VbsL/c/O99PjZdu+D+qYFRSJ6D4P4Y41sVtNPg/seHplbIM+D+mCkYldQL4PzY8vVKWIfg/oWez6nO19z8AkX77OnD4P/AWSFD8GPg/MCqpE9BE+D8=\",\"dtype\":\"float64\",\"order\":\"little\",\"shape\":[13]},\"index\":[0,1,2,3,4,5,6,7,8,9,10,11,12],\"jensen\":{\"__ndarray__\":\"WKg1zTtO9D/vOEVHcvnlP5M6AU2EDds/rthfdk8e2j9DrWnecYraPxgmUwWjkto/8kHPZtXn2j8zMzMzMzPbP1XBqKROQNs/hxbZzvdT2z+J0t7gC5PdP6g1zTtO0d0/Imx4eqUs0z8=\",\"dtype\":\"float64\",\"order\":\"little\",\"shape\":[13]},\"tooltip_label\":[\"df25a9cf\",\"b797390a\",\"01a02d5f\",\"dd847210\",\"33779269\",\"12890e02\",\"66dafc08\",\"a325819b\",\"8a2c1a61\",\"c6bc79b0\",\"PR #56\",\"v3.0rc1\",\"PR #317\"]},\"selected\":{\"id\":\"1054\"},\"selection_policy\":{\"id\":\"1053\"}},\"id\":\"1003\",\"type\":\"ColumnDataSource\"},{\"attributes\":{},\"id\":\"1424\",\"type\":\"ResetTool\"},{\"attributes\":{},\"id\":\"1448\",\"type\":\"Range1d\"},{\"attributes\":{\"fill_color\":{\"value\":\"blue\"},\"line_color\":{\"value\":\"blue\"},\"size\":{\"value\":6},\"x\":{\"field\":\"date\"},\"y\":{\"field\":\"code_coverage\"}},\"id\":\"1443\",\"type\":\"Circle\"},{\"attributes\":{},\"id\":\"1423\",\"type\":\"SaveTool\"},{\"attributes\":{\"tools\":[{\"id\":\"1420\"},{\"id\":\"1421\"},{\"id\":\"1422\"},{\"id\":\"1423\"},{\"id\":\"1424\"},{\"id\":\"1425\"},{\"id\":\"1427\"}]},\"id\":\"1428\",\"type\":\"Toolbar\"}],\"root_ids\":[\"1401\"]},\"title\":\"Bokeh Application\",\"version\":\"2.4.3\"}};\n const render_items = [{\"docid\":\"a3ad1ac9-909e-4221-a4f9-bb91110ed496\",\"root_ids\":[\"1401\"],\"roots\":{\"1401\":\"d55f5948-693b-4c15-84a6-da35cf41220b\"}}];\n root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n }\n if (root.Bokeh !== undefined) {\n embed_document(root);\n } else {\n let attempts = 0;\n const timer = setInterval(function(root) {\n if (root.Bokeh !== undefined) {\n clearInterval(timer);\n embed_document(root);\n } else {\n attempts++;\n if (attempts > 100) {\n clearInterval(timer);\n console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n }\n }\n }, 10, root)\n }\n})(window);", + "application/javascript": "(function(root) {\n function embed_document(root) {\n const docs_json = {\"77c55f8b-56eb-4d43-b824-70ae6cecde50\":{\"defs\":[],\"roots\":{\"references\":[{\"attributes\":{\"below\":[{\"id\":\"1412\"}],\"center\":[{\"id\":\"1415\"},{\"id\":\"1419\"}],\"height\":450,\"left\":[{\"id\":\"1416\"}],\"renderers\":[{\"id\":\"1440\"},{\"id\":\"1446\"}],\"title\":{\"id\":\"1402\"},\"toolbar\":{\"id\":\"1428\"},\"x_range\":{\"id\":\"1404\"},\"x_scale\":{\"id\":\"1408\"},\"y_range\":{\"id\":\"1448\"},\"y_scale\":{\"id\":\"1410\"}},\"id\":\"1401\",\"subtype\":\"Figure\",\"type\":\"Plot\"},{\"attributes\":{},\"id\":\"1492\",\"type\":\"YearsTicker\"},{\"attributes\":{\"data\":{\"cc\":{\"__ndarray__\":\"AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H8AAAAAAAD4fwAAAAAAAPh/AAAAAAAA+H9JLv8h/fb9P2gibHh6pf0/ZmZmZmZm/T+q8dJNYhD+P/7UeOkmMf4//yH99nXg/T/cRgN4CyT+P8BbIEHxY/0/tTf4wmSq/T8ydy0hH/T9P0oMAiuHFv4/INJvXwfO/T9q3nGKjuT9Px+F61G4Hv4/Di2yne+n/T+jI7n8h/T9P0Ck374OnP0/JXUCmggb/j/gnBGlvcH9PyegibDh6f0/0m9fB84Z/j9SuB6F61H+P7x0kxgEVv4/MlUwKqkT/j/l8h/Sb1/+PwMJih9j7v4/9bnaiv1l/j+DL0ymCkb+P2Rd3EYDeP4/3+ALk6mC/j8GgZVDi2z+P9NNYhBYOf4/uK8D54wo/T8=\",\"dtype\":\"float64\",\"order\":\"little\",\"shape\":[43]},\"code_coverage\":{\"__ndarray__\":\"PnlYqDXN2z/WVuwvuyfTPxB6Nqs+V9M/vJaQD3o21z8EVg4tsp3XP+PHmLuWkNc/lIeFWtO81z+Uh4Va07zXP9DVVuwvu9c/cvkP6bev1z/9h/Tb14HXP3sUrkfhetg/t2J/2T152D+QMXctIR/EP5Axdy0hH8Q/K/aX3ZOHxT+jkjoBTYTFP0T67evAOcM/ylTBqKROyD/8qfHSTWLIP662Yn/ZPck/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACutmJ/2T3JPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=\",\"dtype\":\"float64\",\"order\":\"little\",\"shape\":[43]},\"commit_hash\":[\"df25a9cfacd3d652361d2bd37f568af00acb2631\",\"b797390a43298a815f3ff57955cfdc71ecf3e866\",\"01a02d5f91b2f4a863eebe88a618974b0749d1c4\",\"dd847210082035d43b0273ae63a76a53cb8d2e12\",\"33779269e98cc882a5f066c462d8ec1eadf37a1a\",\"12890e029a7155b074b9b325d320d1798338e287\",\"66dafc08bd620d96deda7d526b0e4bfc3b086650\",\"a325819b3b03b84bd76ad455e3f9b4600744ba14\",\"8a2c1a610295c007f0222ce737723c341189811d\",\"c6bc79b0cfbc8ce5d6da0d33b68028157d2e93c0\",\"03e1f461c152e4f221fe92c834f2787680cf5772\",\"9e96d6c412b64fe76a57e7de8af3b00c21d18348\",\"2a98428f9c6fb9bb4302ae09809441bf3e7162b0\",\"9b4e85cf1b41ba7001aaba1a830b93e176f3dd43\",\"d18f4d263ecabf502242592f9d60815a07c7b89c\",\"a23241bb9e45078e36a4662d48c9d3fe0c3316e4\",\"c2006b0011a5df036c306c15e75763ec492dafda\",\"0c2adf3e702b6427da946a6ba9dbedbea22738be\",\"39c466000b1874e06a6f58da9c30bb877fc8d4d2\",\"8436fd78b002e5792f5d0dd1409332d171036d49\",\"07a45b66c5facfea06c40bd82e34040c97560640\",\"1d84538c334a502c6ad7df48b8cc2309d6a6436d\",\"4d528a3d6456621a382d409b5145a877b5414b88\",\"8c637b36b66069b216cb94ae87d4c0a91e9b211e\",\"4d23fa6dd78d0497deb4fd62783f0b3ee4204579\",\"015f6874c320efee2c0d1ae76eea4a5b043d69d6\",\"26f06d449da208ce64724b1463b07ad20746cbdc\",\"6b9d6bb8bec6e3ea548f5858e2a8ea5986264fc8\",\"b796bd0fd92ba6b91d590f6cb60bb7ab3bca9932\",\"780aef7c7b4b9cafea3e323d536a34a4af5818b4\",\"9f93ad9bf85e4a0e6baf5b62ea4b3ef143729861\",\"16628a0ba45a675df762245694e0a7666a3478f8\",\"01684c8559604344bd09791268131819a09770a8\",\"e9231fb893c765b723fa4c1e087a58761b6aa471\",\"219889e243ffc69c71b6f7747f5af751d5694de1\",\"6124d2a82a7a823722210bc2e8516d355ba19eb3\",\"f6e4287f712cc866893e71b1ea7a7546e4567bf9\",\"f2797fef396f2f19b02abb1f9555b678dac614f1\",\"b4e538f530048fec58eaca5170be82c67dbdcceb\",\"68820b715ed6b2c981aa11d29c0102e879280d79\",\"03deffeda91fa8d8ab188d57b9fa302a7be008e0\",\"0d2bfecc271d561f67050659684b4797af8ee740\",\"1d03a465593f56c99a64a576d185d4ed17b659f2\"],\"commit_hash_8char\":[\"df25a9cf\",\"b797390a\",\"01a02d5f\",\"dd847210\",\"33779269\",\"12890e02\",\"66dafc08\",\"a325819b\",\"8a2c1a61\",\"c6bc79b0\",\"03e1f461\",\"9e96d6c4\",\"2a98428f\",\"9b4e85cf\",\"d18f4d26\",\"a23241bb\",\"c2006b00\",\"0c2adf3e\",\"39c46600\",\"8436fd78\",\"07a45b66\",\"1d84538c\",\"4d528a3d\",\"8c637b36\",\"4d23fa6d\",\"015f6874\",\"26f06d44\",\"6b9d6bb8\",\"b796bd0f\",\"780aef7c\",\"9f93ad9b\",\"16628a0b\",\"01684c85\",\"e9231fb8\",\"219889e2\",\"6124d2a8\",\"f6e4287f\",\"f2797fef\",\"b4e538f5\",\"68820b71\",\"03deffed\",\"0d2bfecc\",\"1d03a465\"],\"date\":{\"__ndarray__\":\"AACAyDfgd0IAAEDF0+F3QgAAACsm4ndCAACA9srid0IAAICNFOR3QgAAQPNm5HdCAAAAWbnkd0IAAMC+C+V3QgAAgCRe5XdCAACAJF7ld0IAAIC7p+Z3QgAAQCH65ndCAACA3Krvd0IAAABtLPR3QgAAQJ4j9XdCAAAAvML/d0IAAMBWixh4QgAAQIU5NHhCAAAAWyVJeEIAAAAn5WJ4QgAAACflYnhCAACAt2ZneEIAAEAduWd4QgAAQLQCaXhCAABAtAJpeEIAAMB/p2l4QgAAgHxDa3hCAACAfENreEIAAIB8Q2t4QgAAQOKVa3hCAABA4pVreEIAAEDilWt4QgAAwNvNbnhCAAAADcVveEIAAEA+vHB4QgAAAGnrdHhCAAAAXFt7eEIAAABcW3t4QgAAAFxbe3hCAAAAXFt7eEIAAABcW3t4QgAAAFxbe3hCAAAAXFt7eEI=\",\"dtype\":\"float64\",\"order\":\"little\",\"shape\":[43]},\"gauss\":{\"__ndarray__\":\"GJXUCWgi9D+Hp1fKMsTzP240gLdAguw/845TdCSX6z8s1JrmHafsPyZTBaOSOu0/MCqpE9BE7D9hw9MrZRnsP9jw9EpZhuw/pN++Dpwz7D/VeOkmMQjsP57vp8ZLN+s/pgpGJXUC7D/YgXNGlPbuP9lfdk8eFu4/LSEf9GxW7z/HuriNBvDuPzSitDf4wu4/RpT2Bl+Y7j/wFkhQ/BjvPwpoImx4eu8/bHh6pSxD7j8rGJXUCWjuPwn5oGez6u8/4JwRpb3B7z8HzhlR2hvwP6UsQxzr4u4/SOF6FK5H7z+oxks3iUHuP6Fns+pzte8/w/UoXI/C7z8K16NwPQrvPw8LtaZ5x+8/UiegibDh7z+IY13cRgPwP5SHhVrTvO8/GQRWDi2y7z92cRsN4C3wPxWMSuoENO8/escpOpLL7z/IBz2bVZ/vP/kP6bevA/A/gZVDi2zn7z8=\",\"dtype\":\"float64\",\"order\":\"little\",\"shape\":[43]},\"gch\":{\"__ndarray__\":\"X5hMFYxK+j9IUPwYc9f8Px3J5T+k3/c/2T15WKg19z9seHqlLEP4Pxzr4jYawPg/lPYGX5hM+D9xrIvbaAD4P4V80LNZ9fg/io7k8h/S9z/ChqdXyjL4P4XrUbgehfc/KxiV1Alo+D8730+Nl275P7x0kxgEVvk/seHplbIM+j988rBQa5r5P3EbDeAtkPk/ylTBqKRO+T/6fmq8dJP5PzMzMzMzM/k/HHxhMlUw+T8g0m9fB874P+84RUdy+fg/GCZTBaOS+T8Cmggbnl75PxE2PL1Slvk/3GgAb4EE+j80ETY8vVL5P4MvTKYKRvk/rIvbaABv+T9O0ZFc/kP5P2sr9pfdk/k/ylTBqKRO+T97gy9Mpgr5PzXvOEVHcvk/8WPMXUvI+T+e76fGSzf5P/hT46WbxPk/YTJVMCqp+T9XW7G/7J75P6+UZYhjXfk/6+I2GsBb+T8=\",\"dtype\":\"float64\",\"order\":\"little\",\"shape\":[43]},\"index\":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42],\"jensen\":{\"__ndarray__\":\"WKg1zTtO9D/vOEVHcvnlP2PuWkI+6Nk/qmBUUieg2T/D9Shcj8LZP4EExY8xd9k/uB6F61G42j8/V1uxv+zaP1+YTBWMSto/bAn5oGez2j/swDkjSnvbP7u4jQbwFtw/ylTBqKRO0D9R2ht8YTLRP3gLJCh+jNE/irDh6ZWy0D+Sy39Iv33RP/mgZ7Pqc9E/gQTFjzF30T/mriXkg57RP5Cg+DHmrtE/TYQNT6+U0T+GWtO84xTRP1tCPujZrNI/FNBE2PD00j+JQWDl0CLTPwyTqYJRSdE/nDOitDf40j8mUwWjkjrRP99PjZduEtM/tMh2vp8a0z8qOpLLf0jTP3ZPHhZqTdM/RiV1ApoI0z9DrWnecYrSP/kP6bevA9M/sHJoke180z+dgCbChqfTP/RsVn2uttI/KjqSy39I0z+Nl24Sg8DSP5+rrdhfdtM/p3nHKTqS0z8=\",\"dtype\":\"float64\",\"order\":\"little\",\"shape\":[43]},\"tooltip_label\":[\"df25a9cf\",\"b797390a\",\"01a02d5f\",\"dd847210\",\"33779269\",\"12890e02\",\"66dafc08\",\"a325819b\",\"8a2c1a61\",\"c6bc79b0\",\"PR #56\",\"v3.0rc1\",\"PR #317\",\"v3.0\",\"v3.0.1\",\"v3.1\",\"v3.1.1\",\"v3.2\",\"v3.2.1\",\"v3.2.2\",\"07a45b66\",\"1d84538c\",\"4d528a3d\",\"8c637b36\",\"4d23fa6d\",\"015f6874\",\"26f06d44\",\"6b9d6bb8\",\"b796bd0f\",\"780aef7c\",\"9f93ad9b\",\"v3.3\",\"01684c85\",\"e9231fb8\",\"219889e2\",\"6124d2a8\",\"f6e4287f\",\"f2797fef\",\"b4e538f5\",\"68820b71\",\"03deffed\",\"0d2bfecc\",\"1d03a465\"]},\"selected\":{\"id\":\"1054\"},\"selection_policy\":{\"id\":\"1053\"}},\"id\":\"1003\",\"type\":\"ColumnDataSource\"},{\"attributes\":{},\"id\":\"1421\",\"type\":\"WheelZoomTool\"},{\"attributes\":{\"base\":60,\"mantissas\":[1,2,5,10,15,20,30],\"max_interval\":1800000.0,\"min_interval\":1000.0,\"num_minor_ticks\":0},\"id\":\"1482\",\"type\":\"AdaptiveTicker\"},{\"attributes\":{\"coordinates\":null,\"group\":null,\"text\":\"Code Coverage\"},\"id\":\"1402\",\"type\":\"Title\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.2},\"fill_color\":{\"value\":\"blue\"},\"hatch_alpha\":{\"value\":0.2},\"line_alpha\":{\"value\":0.2},\"line_color\":{\"value\":\"blue\"},\"size\":{\"value\":6},\"x\":{\"field\":\"date\"},\"y\":{\"field\":\"code_coverage\"}},\"id\":\"1445\",\"type\":\"Circle\"},{\"attributes\":{\"days\":[1,8,15,22]},\"id\":\"1486\",\"type\":\"DaysTicker\"},{\"attributes\":{\"callback\":null,\"tooltips\":[[\"git ref\",\"@tooltip_label\"]]},\"id\":\"1427\",\"type\":\"HoverTool\"},{\"attributes\":{\"tools\":[{\"id\":\"1420\"},{\"id\":\"1421\"},{\"id\":\"1422\"},{\"id\":\"1423\"},{\"id\":\"1424\"},{\"id\":\"1425\"},{\"id\":\"1427\"}]},\"id\":\"1428\",\"type\":\"Toolbar\"},{\"attributes\":{\"coordinates\":null,\"data_source\":{\"id\":\"1003\"},\"glyph\":{\"id\":\"1443\"},\"group\":null,\"hover_glyph\":null,\"muted_glyph\":{\"id\":\"1445\"},\"nonselection_glyph\":{\"id\":\"1444\"},\"view\":{\"id\":\"1447\"}},\"id\":\"1446\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"overlay\":{\"id\":\"1426\"}},\"id\":\"1422\",\"type\":\"BoxZoomTool\"},{\"attributes\":{\"months\":[0,2,4,6,8,10]},\"id\":\"1489\",\"type\":\"MonthsTicker\"},{\"attributes\":{\"bottom_units\":\"screen\",\"coordinates\":null,\"fill_alpha\":0.5,\"fill_color\":\"lightgrey\",\"group\":null,\"left_units\":\"screen\",\"level\":\"overlay\",\"line_alpha\":1.0,\"line_color\":\"black\",\"line_dash\":[4,4],\"line_width\":2,\"right_units\":\"screen\",\"syncable\":false,\"top_units\":\"screen\"},\"id\":\"1426\",\"type\":\"BoxAnnotation\"},{\"attributes\":{\"axis_label\":\"Test coverage as a percentage of Python code\",\"coordinates\":null,\"formatter\":{\"id\":\"1473\"},\"group\":null,\"major_label_policy\":{\"id\":\"1474\"},\"ticker\":{\"id\":\"1417\"}},\"id\":\"1416\",\"type\":\"LinearAxis\"},{\"attributes\":{\"source\":{\"id\":\"1003\"}},\"id\":\"1441\",\"type\":\"CDSView\"},{\"attributes\":{\"axis\":{\"id\":\"1416\"},\"coordinates\":null,\"dimension\":1,\"group\":null,\"ticker\":null},\"id\":\"1419\",\"type\":\"Grid\"},{\"attributes\":{\"months\":[0,6]},\"id\":\"1491\",\"type\":\"MonthsTicker\"},{\"attributes\":{},\"id\":\"1425\",\"type\":\"HelpTool\"},{\"attributes\":{},\"id\":\"1476\",\"type\":\"DatetimeTickFormatter\"},{\"attributes\":{\"days\":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31]},\"id\":\"1484\",\"type\":\"DaysTicker\"},{\"attributes\":{\"line_alpha\":0.1,\"line_color\":\"blue\",\"x\":{\"field\":\"date\"},\"y\":{\"field\":\"code_coverage\"}},\"id\":\"1438\",\"type\":\"Line\"},{\"attributes\":{\"line_color\":\"blue\",\"x\":{\"field\":\"date\"},\"y\":{\"field\":\"code_coverage\"}},\"id\":\"1437\",\"type\":\"Line\"},{\"attributes\":{\"months\":[0,4,8]},\"id\":\"1490\",\"type\":\"MonthsTicker\"},{\"attributes\":{\"months\":[0,1,2,3,4,5,6,7,8,9,10,11]},\"id\":\"1488\",\"type\":\"MonthsTicker\"},{\"attributes\":{},\"id\":\"1417\",\"type\":\"BasicTicker\"},{\"attributes\":{},\"id\":\"1448\",\"type\":\"Range1d\"},{\"attributes\":{\"mantissas\":[1,2,5],\"max_interval\":500.0,\"num_minor_ticks\":0},\"id\":\"1481\",\"type\":\"AdaptiveTicker\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.1},\"fill_color\":{\"value\":\"blue\"},\"hatch_alpha\":{\"value\":0.1},\"line_alpha\":{\"value\":0.1},\"line_color\":{\"value\":\"blue\"},\"size\":{\"value\":6},\"x\":{\"field\":\"date\"},\"y\":{\"field\":\"code_coverage\"}},\"id\":\"1444\",\"type\":\"Circle\"},{\"attributes\":{\"base\":24,\"mantissas\":[1,2,4,6,8,12],\"max_interval\":43200000.0,\"min_interval\":3600000.0,\"num_minor_ticks\":0},\"id\":\"1483\",\"type\":\"AdaptiveTicker\"},{\"attributes\":{\"days\":[1,4,7,10,13,16,19,22,25,28]},\"id\":\"1485\",\"type\":\"DaysTicker\"},{\"attributes\":{\"source\":{\"id\":\"1003\"}},\"id\":\"1447\",\"type\":\"CDSView\"},{\"attributes\":{\"days\":[1,15]},\"id\":\"1487\",\"type\":\"DaysTicker\"},{\"attributes\":{\"num_minor_ticks\":5,\"tickers\":[{\"id\":\"1481\"},{\"id\":\"1482\"},{\"id\":\"1483\"},{\"id\":\"1484\"},{\"id\":\"1485\"},{\"id\":\"1486\"},{\"id\":\"1487\"},{\"id\":\"1488\"},{\"id\":\"1489\"},{\"id\":\"1490\"},{\"id\":\"1491\"},{\"id\":\"1492\"}]},\"id\":\"1413\",\"type\":\"DatetimeTicker\"},{\"attributes\":{\"axis_label\":\"Commit date\",\"coordinates\":null,\"formatter\":{\"id\":\"1476\"},\"group\":null,\"major_label_policy\":{\"id\":\"1477\"},\"ticker\":{\"id\":\"1413\"}},\"id\":\"1412\",\"type\":\"DatetimeAxis\"},{\"attributes\":{},\"id\":\"1424\",\"type\":\"ResetTool\"},{\"attributes\":{\"line_alpha\":0.2,\"line_color\":\"blue\",\"x\":{\"field\":\"date\"},\"y\":{\"field\":\"code_coverage\"}},\"id\":\"1439\",\"type\":\"Line\"},{\"attributes\":{},\"id\":\"1410\",\"type\":\"LinearScale\"},{\"attributes\":{},\"id\":\"1420\",\"type\":\"PanTool\"},{\"attributes\":{},\"id\":\"1054\",\"type\":\"Selection\"},{\"attributes\":{},\"id\":\"1404\",\"type\":\"DataRange1d\"},{\"attributes\":{},\"id\":\"1473\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{},\"id\":\"1053\",\"type\":\"UnionRenderers\"},{\"attributes\":{\"coordinates\":null,\"data_source\":{\"id\":\"1003\"},\"glyph\":{\"id\":\"1437\"},\"group\":null,\"hover_glyph\":null,\"muted_glyph\":{\"id\":\"1439\"},\"nonselection_glyph\":{\"id\":\"1438\"},\"view\":{\"id\":\"1441\"}},\"id\":\"1440\",\"type\":\"GlyphRenderer\"},{\"attributes\":{},\"id\":\"1408\",\"type\":\"LinearScale\"},{\"attributes\":{\"fill_color\":{\"value\":\"blue\"},\"line_color\":{\"value\":\"blue\"},\"size\":{\"value\":6},\"x\":{\"field\":\"date\"},\"y\":{\"field\":\"code_coverage\"}},\"id\":\"1443\",\"type\":\"Circle\"},{\"attributes\":{},\"id\":\"1474\",\"type\":\"AllLabels\"},{\"attributes\":{},\"id\":\"1477\",\"type\":\"AllLabels\"},{\"attributes\":{\"axis\":{\"id\":\"1412\"},\"coordinates\":null,\"group\":null,\"ticker\":null},\"id\":\"1415\",\"type\":\"Grid\"},{\"attributes\":{},\"id\":\"1423\",\"type\":\"SaveTool\"}],\"root_ids\":[\"1401\"]},\"title\":\"Bokeh Application\",\"version\":\"2.4.3\"}};\n const render_items = [{\"docid\":\"77c55f8b-56eb-4d43-b824-70ae6cecde50\",\"root_ids\":[\"1401\"],\"roots\":{\"1401\":\"2899bfad-82e0-488a-8429-7b02da60aab4\"}}];\n root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n }\n if (root.Bokeh !== undefined) {\n embed_document(root);\n } else {\n let attempts = 0;\n const timer = setInterval(function(root) {\n if (root.Bokeh !== undefined) {\n clearInterval(timer);\n embed_document(root);\n } else {\n attempts++;\n if (attempts > 100) {\n clearInterval(timer);\n console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n }\n }\n }, 10, root)\n }\n})(window);", "application/vnd.bokehjs_exec.v0+json": "" }, "metadata": { @@ -224,7 +254,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.2" + "version": "3.10.4" }, "orig_nbformat": 4, "vscode": { diff --git a/docs/dev_guide.md b/docs/dev_guide.md index a326c889f..290325531 100644 --- a/docs/dev_guide.md +++ b/docs/dev_guide.md @@ -210,13 +210,13 @@ is located at `floris/.github/workflows/continuous-integration-workflow.yaml`. The online documentation is built with Jupyter Book which uses Sphinx as a framework. It is automatically built and hosted by GitHub, but it can also be compiled locally. Additional dependencies are required -for the documentation, and they are listed in ``docs/requirements.txt``. +for the documentation, and they are listed in the `EXTRAS` of `setup.py`. The commands to build the docs are given below. After successfully compiling, a file should be located at ``docs/_build/html/index.html``. This file can be opened in any browser. ```bash -pip install -r docs/requirements.txt +pip install -e .["docs"] jupyter-book build docs/ # Lots of output to the terminal here... @@ -224,7 +224,6 @@ jupyter-book build docs/ open docs/_build/html/index.html ``` - ## Deploying to pip Generally, only NREL developers will have appropriate permissions to deploy diff --git a/docs/empirical_gauss_model.md b/docs/empirical_gauss_model.md new file mode 100644 index 000000000..12078dcf2 --- /dev/null +++ b/docs/empirical_gauss_model.md @@ -0,0 +1,160 @@ + +(empirical_gauss_model)= +# Empirical Gaussian model + +FLORIS's "empirical" model has the same Gaussian wake shape as other popular +FLORIS models. However, the models that describe the wake width and deflection +have been reorganized to provide simpler tuning and data fitting. + +## Wake shape + +The velocity deficit at a point $(x, y, z)$ in the wake follows a Gaussian +curve, i.e., +$$ \frac{u}{U_\infty} = 1 - Ce^{-\frac{(y-\delta_y)^2}{2\sigma_y^2} -\frac{(z-z_h-\delta_z)^2}{2\sigma_z^2}} $$ +where the $(x, y, z)$ origin is at the turbine location (at ground level). +The terms $C$, $\sigma_y$, $\sigma_z$, $\delta_y$, and $\delta_z$ all depend +on the downstream location $x$. + +$C$ is the scaling factor for the Gaussian curve, defined as + +$$C = \frac{1}{8\sigma_{0_D}^2}\left(1 - \sqrt{1 - \frac{\sigma_{y0} \sigma_{z0} C_T}{\sigma_y \sigma_z}}\right)$$ + +Here, $C_T$ is the turbine thrust coefficient, which includes any reduction +in thrust due to yaw or tilt of the turbine rotor. $\sigma_{y0}$ and +$\sigma_{z0}$ define the wake width at the turbine location $x=0$, which are +based on the user-specified rotor-diameter normalized initial width +$\sigma_{0_D}$. Note that +this contrasts with FLORIS's +other Gaussian models, where $\sigma_{y0}$ and $\sigma_{z0}$ are defined at +the end of the near wake/beginning of the far wake, at some $x_0 > 0$. The +normalization term $8\sigma_{0_D}^2$ provides consistency with actuator +disc theory. + +## Wake expansion +The wake lateral and vertical widths, $\sigma_y$ and $\sigma_z$, respectively, +are a function of downstream distance $x$. The expansion of the wake is +described by a user-tunable, piecewise linear function. This is simplest to +express as an integral of a piecewise constant wake expansion rate $k$, i.e., + +$$ \sigma_{y}(x) = \int_{0}^x \sum_{i=0}^n k_i \mathbf{1}_{[b_{i}, b_{i+1})} (x') dx' + \sigma_{y0} $$ + +Here, $\mathbf{1}_{[a, b)}(x)$ is the indicator function, which takes value +1 when $a \leq x < b$, and 0 otherwise. +The above function ensures that expansion rate $k_i$ applies only between +breakpoints $b_{i-1}$ and $b_i$, allowing $n+1$ varying rates of linear +expansion at different downstream ranges, determined by the $b_i$. Note that +$b_0 = 0$ and $b_{n+1} = \infty$ by design. + +A slight modification is made to the above so that the wake width varies +smoothly. As stated above, the wake expansion rate contains jump +discontinuities that create "sharp" changes in the wake width. To avoid this, +the indicator function $\mathbf{1}_{[a, b)}(x)$ is replaced with a pair of +"smoothstep" functions that vary smoothly with width parameter $d$. In the +limit as $d\rightarrow 0$, the approximation becomes exact. + +While the form of this wake expansion model seems complex, it is very simple +to tune to fit data: the user provides the $n+1$ expansion rates +$k_i, i=0,\dots,n+1$ +(defined as a list in the `wake_expansion_rates` field of the input yaml) +and +the $n$ 'break points' $b_i, i=1,\dots,n$ where those expansion rates should go +into effect (specified in terms of rotor diameters downstream as a list in the +`breakpoints_D` field of the input yaml. + +As well as these, the initial width $\sigma_{0_D}$ should be +provided by setting `sigma_0_D` and the +logistic function width $d$ as `smoothing_length_D` (both specified in +terms of rotor diameters). + +We expect that the default values for $\sigma_{0_D}$ and $d$ should be +satisfactory for most users. Further, we anticipate that most users will not +need more than $n+1=3$ expansion rates (along with $n=2$ break points) to +describe the wake expansion. + +## Wake deflection + +The deflection of the wake centerline $\delta_y$ and $\delta_z$ due to +yawing and tilting, respectively, follow a simple model + +$$ \delta = k_\text{def} C_T \alpha \operatorname{ln}\left(\frac{x/D - c}{x/D + c} + 2\right)$$ + +Here, $k_\text{def}$ is a user-tunable deflection gain and $\alpha$ is the +misalignment. When computing the lateral wake deflection $\delta_y$ due to +yaw misalignment, $\alpha$ should be the yaw misalignment _specified in +radians, clockwise positive from the wind direction_. When +computing the vertical wake deflection $\delta_z$ due to rotor tilt, +$\alpha$ should be the tilt angle _specified in radians, clockwise positive +when the rotor is tilted back_. + +Finally, $c$ in the above deflection model is a 'deflection rate'. This +specifies how quickly the wake will reach it's maximum deflection +$k_\text{def} C_T \alpha \operatorname{ln}(3)$ for a given +yaw/tilt angle. + +User-tunable parameters of the model are as follows: +- A separately tunable deflection gain $k_\text{def}$ for each of +lateral deflections (due to yaw misalignments) and vertical deflections +(due to nonzero tilt), specified using `horizontal_deflection_gain_D` and +`vertical_deflection_gain_D` (specified in terms of rotor diameters) +- The deflection rate $c$, specified using `deflection_rate`. + +We anticipate that most users will be able to use the default value for $c$, +and set `vertical_deflection_gain_D` to the same value as +`horizontal_deflection_gain_D` (which can also be achieved by providing +`vertical_deflection_gain_D = -1`). + +## Wake-induced mixing + +Finally, turbines contribute to mixing in the flow. In other models, this +extra mixing is accounted for by adding to the turbulence intensity value. In +the empirical model, explicit dependencies on turbulence intensity are removed +completely to aid in tuning. Instead, a non-physical "wake-induced mixing +factor" is specified for turbine $j$ as + +$$ \text{WIM}_j = \sum_{i \in T^{\text{up}}(j)} \frac{A_{ij} a_i} {(x_j - x_i)/D_i} $$ + +where $T_T^{\text{up}}(j)$ is the set of turbines upstream from the turbine +$j$. Here, $A_{ij}$ is the area of overlap of the wake of turbine $i$ +onto turbine $j$; $a_i$ is the axial induction factor of the +turbine $i$; +and $(x_j - x_i)/D_i$ is the downstream distance of turbine $j$ from +the turbine $i$, normalized by turbine $i$'s rotor diameter. + +Wake-induced mixing can affect both the velocity deficit and wake deflection. +To account for wake-induced mixing, the wake width of turbine $j$ is adjusted +to + +$$ \sigma_{y}(x) = \int_{0}^x \sum_{i=0}^n k_i \ell_{[b_{i}, b_{i+1})}(x') + w_v \text{WIM}_j dx' + \sigma_{y0} $$ + +Here, $w_v$ is the velocity deficit wake-induced mixing gain, which the +user can vary by setting `wim_gain_velocity` to represent different levels of +mixing caused by the turbines. + +The wake deflection model is similarly adjusted to + +$$ \delta = \frac{k_\text{def} C_T \alpha}{1 + w_d \text{WIM}_j}\operatorname{ln}\left(\frac{x/D - c}{x/D + c} + 2\right)$$ + +where $w_d$ is the wake-induced mixing gain for deflection, provided by the +user by setting `wim_gain_deflection`. + +## Yaw added mixing + +Yaw misalignment can also add turbulence to the wake. In the empirical Gaussian +model, this effect, referred to as "yaw-added wake recovery" in other models, +is activated by setting +`enable_yaw_added_recovery` to `true`. Yaw-added mixing is represented +by updating the wake-induced mixing term as follows: + +$$ \text{WIM}_j = \sum_{i \in T^{\text{up}}(j)} \frac{A_{ij} a_i (1 + g_\text{YAM} (1-\cos(\gamma_i)))}{(x_j - x_i)/D_i} + a_j g_\text{YAM} (1-\cos(\gamma_j))$$ + +Note that the second term means that, unlike when `enable_yaw_added_recovery` +is `false`, a turbine may affect the recovery of its own wake by yawing. + + +## Mirror wakes + +Mirror wakes are also enabled by default in the empirical model to model the +ground effect. Essentially, turbines are placed below the ground so that +the vertical expansion of their (mirror) wakes appears in the above-ground +flow some distance downstream, to model the reflection of the true turbine +wakes as they bounce off of the ground/sea surface. diff --git a/docs/examples.md b/docs/examples.md index 16be26ad5..cc38c4c2e 100644 --- a/docs/examples.md +++ b/docs/examples.md @@ -1,7 +1,8 @@ (examples)= # Examples Index -The FLORIS software repository includes a set of [examples/](https://github.com/NREL/floris/tree/main/examples) +The FLORIS software repository includes a set of +[examples/](https://github.com/NREL/floris/tree/main/examples) intended to describe most features as well as provide a starting point for various analysis methods. These are generally ordered from simplest to most complex. The examples and their content are described below. @@ -24,7 +25,8 @@ a simulation with a single wind condition, and then creating another simulation with multiple wind conditions. ### 02_visualizations.py -Create visualizations for x, y, and z planes in the whole farm as well as plots of the grid points on each turbine rotor. +Create visualizations for x, y, and z planes in the whole farm as well as plots of the grid points +on each turbine rotor. ### 03_making_adjustments.py Make various changes to an initial configuration and plot results on a single figure. @@ -47,7 +49,7 @@ Evaluate the individual turbine powers. - Broadcasted mathematical operations ### 06_sweep_wind_conditions.py -Simulate a wind farm with multiple wind speeds and wind directions +Simulate a wind farm with multiple wind speeds and wind directions. - Setting up a problem considering the vectorization of the calculations - Data structures - Broadcasted mathematical operations @@ -60,7 +62,7 @@ a wind farm. - Create the frequency information from the wind condition data ### 08_calc_aep_from_rose_use_class.py -Do the above but use the included WindRose class +Do the above but use the included WindRose class. ### 09_compare_farm_power_with_neighbor.py Consider the affects of one wind farm on another wind farm's AEP. @@ -83,7 +85,7 @@ speedups at locations throughout the farm. Show plots of the impact on wind turbine wakes. ### 16b_heterogenaity_multiple_ws_wd.py -Illustrate usage of heterogenaity with multiple wind speeds and directions +Illustrate usage of heterogenaity with multiple wind speeds and directions. ### 17_multiple_turbine_types.py Load an input file that describes a wind farm with two turbines @@ -91,8 +93,39 @@ of different types and plot the wake profiles. ### 23_visualize_layout.py Use the visualize_layout function to provide diagram visualization -of a turbine layout within FLORIS +of a turbine layout within FLORIS. +### 24_floating_turbine_models.py +Demonstrates the definition of a floating turbine and how to enable the effects of tilt +on Cp and Ct. + +### 25_tilt_driven_vertical_wake_deflection.py + +This example demonstrates vertical wake deflections due to the tilt angle when running +with the Empirical Gauss model. Note that only the Empirical Gauss model implements +vertical deflections at this time. Also be aware that this example uses a potentially +unrealistic tilt angle, 15 degrees, to highlight the wake deflection. Moreover, the magnitude +of vertical deflections due to tilt has not been validated. + +### 26_empirical_gauss_velocity_deficit_parameters.py + +This example illustrates the main parameters of the Empirical Gaussian +velocity deficit model and their effects on the wind turbine wake. + +### 27_empirical_gauss_deflection_parameters.py +This example illustrates the main parameters of the Empirical Gaussian +deflection model and their effects on the wind turbine wake. + +### 28_extract_wind_speed_at_points.py +This example demonstrates the use of the `FlorisInterface.sample_flow_at_points` method +to extract the wind speed information at user-specified locations in the flow. + +Specifically, this example gets the wind speed at a single x, y location and four different +heights over a sweep of wind directions. This mimics the wind speed measurements of a met +mast across all wind directions (at a fixed free stream wind speed). + +Try different values for met_mast_option to vary the location of the met mast within +the two-turbine farm. ## Optimization diff --git a/docs/floating_wind_turbine.md b/docs/floating_wind_turbine.md new file mode 100644 index 000000000..e8def2df9 --- /dev/null +++ b/docs/floating_wind_turbine.md @@ -0,0 +1,25 @@ + +# Floating Wind Turbine Modeling + +The FLORIS wind turbine description includes a definition of the performance curves +(Cp and Ct) as a function of wind speed, and this lookup table is used directly in +the calculation of power production for a steady-state atmospheric condition +(wind speed and wind direction). The power curve definition typically assumes a +fixed-bottom wind turbine with no active or controllable tilt. However, floating +wind turbines have additional rotational degrees of freedom including pitch which +adds a tilt angle to the rotor. As the turbine tilts, its performance is affected +similar to a yawed condition. The turbine is no longer operating on its defined +performance curve, and corrections must be included to accurately predict the power +production. + +Support for modeling this impact on a floating wind turbine were added in +[PR#518](https://github.com/NREL/floris/pull/518/files) and allow for correcting the +user-supplied performance curve for the average tilt. This is accomplished by including +an additional input, `floating_tilt_table`, in the turbine definition which sets the +steady tilt angle of the turbine based on wind speed. An interpolation is created and +the tilt angle is computed for each turbine based on effective velocity. Taking into +account the turbine rotor's built-in tilt, the absolute tilt change can then be used +to correct Cp and Ct. This tilt angle is then used directly in the selected wake models. + +**NOTE** No wake models currently use the tilt for vertical wake deflection, +but it will be available with the inclusion of an upcoming wake model. diff --git a/docs/input_reference.md b/docs/input_reference.md deleted file mode 100644 index 7dd9b7b89..000000000 --- a/docs/input_reference.md +++ /dev/null @@ -1,11 +0,0 @@ -# Input File Reference - -In additional to reinitializing {py:class}`FlorisInterface`, users can also set up a -single input YAML file. The below defintions guide a user to the top, mid, and lower -level parameterizations. In the -[examples](https://github.com/NREL/floris/tree/main/examples/inputs) folder, there exists a few -samples that can be viewed alongside this guide. - -```{eval-rst} -.. autoyaml:: docs/gch.yaml -``` diff --git a/docs/input_reference_main.md b/docs/input_reference_main.md new file mode 100644 index 000000000..9054ec8bf --- /dev/null +++ b/docs/input_reference_main.md @@ -0,0 +1,11 @@ +# Main Input File Reference + +In additional to reinitializing {py:class}`FlorisInterface`, users can configure FLORIS +with an input file. The file must be YAML format with either "yaml" or "yml" extension. +The below definitions guide a user to the top, mid, and lower level parameterizations. A few +reference input files are available in the +[floris/examples](https://github.com/NREL/floris/tree/main/examples/inputs) folder. + +```{eval-rst} +.. autoyaml:: docs/gch.yaml +``` diff --git a/docs/input_reference_turbine.md b/docs/input_reference_turbine.md new file mode 100644 index 000000000..b7e9ddfb9 --- /dev/null +++ b/docs/input_reference_turbine.md @@ -0,0 +1,9 @@ +# Turbine Input File Reference + +The turbine input file is an optional input used to define a custom turbine type. +The file must be YAML format with either "yaml" or "yml" extension. See +for more information on inspecting and creating the turbine definition. + +```{eval-rst} +.. autoyaml:: docs/nrel_5MW.yaml +``` diff --git a/docs/nrel_5MW.yaml b/docs/nrel_5MW.yaml new file mode 120000 index 000000000..edb41a33d --- /dev/null +++ b/docs/nrel_5MW.yaml @@ -0,0 +1 @@ +../floris/turbine_library/nrel_5MW.yaml \ No newline at end of file diff --git a/docs/requirements.txt b/docs/requirements.txt deleted file mode 100644 index f4b3b4d4b..000000000 --- a/docs/requirements.txt +++ /dev/null @@ -1,5 +0,0 @@ -jupyter-book>0.13 -sphinx-book-theme>0.3 -sphinx-autodoc-typehints -sphinxcontrib-autoyaml --r ../requirements.txt diff --git a/docs/turbine_interaction.ipynb b/docs/turbine_interaction.ipynb new file mode 100644 index 000000000..fbeb62f5a --- /dev/null +++ b/docs/turbine_interaction.ipynb @@ -0,0 +1,358 @@ +{ + "cells": [ + { + "attachments": {}, + "cell_type": "markdown", + "id": "ac224ce9-bd4f-4f5c-88b7-f0e9e49ee498", + "metadata": {}, + "source": [ + "# Turbine Library Interface\n", + "\n", + "FLORIS allows users to select from a set of pre-defined turbines as well as load an external\n", + "library of turbines. This reference demonstrates how to load, compare, and interact with the\n", + "basic turbine properties prior to wake modeling.\n", + "\n", + "## Setup" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "cf882c57-7d16-4f65-a6bb-cbc7e9603ac0", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "import numpy as np\n", + "from floris.turbine_library import TurbineInterface, TurbineLibrary" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "71788b47-6641-4080-bb3f-eb799d969e0b", + "metadata": {}, + "source": [ + "## Interacting With A Single Turbine\n", + "\n", + "There are a few different ways that a ``TurbineInterface`` object can be created as demonstrated\n", + "below. For convenience, we'll only consider the object created from the internal library\n", + "(option 3).\n", + "\n", + "- Option 1: Load from a `Turbine` object:\n", + " `ti = TurbineInterface(turbine_obj)`\n", + "- Option 2: Load from a turbine configuration dictionary:\n", + " `ti = TurbineInterface.from_turbine_dict(turbine_dict)`\n", + "- Option 3: Load a file from the internal turbine library:\n", + " `ti = TurbineInterface.from_internal_library(\"iea_15MW.yaml\")`\n", + "- Option 4: Load a file from anywhere:\n", + " `ti = TurbineInterface.from_yaml(\"path/to/turbine.yaml\")`" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "2275840e-48a3-41d2-ace9-fad05da0dc02", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "ti = TurbineInterface.from_internal_library(\"iea_15MW.yaml\")" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "f2576e8a-47ee-48b5-8707-aca0dc76929c", + "metadata": {}, + "source": [ + "### Plot the core attributes\n", + "\n", + "For `TurbineInterface`, the core functionality is the power and thrust computation and plotting." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "b9a5f00a-0ead-4759-b911-3a1161e55791", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAyYAAAI5CAYAAABUwC7IAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAB7CAAAewgFu0HU+AAB/L0lEQVR4nO3deZxcVZn/8e/Te/aQjZAEyMIaiIAsYQ0giiIg6AjuEARxG0Yd11FH0RmdUX+u6Lhr2ERRRJBFo7IEwh5kTUIgJIQEsu/pvfv5/XFvd1fdrq696lZ1f96vV73qLqfuOd25qa6nznnOMXcXAAAAAMSpJu4GAAAAAACBCQAAAIDYEZgAAAAAiB2BCQAAAIDYEZgAAAAAiB2BCQAAAIDYEZgAAAAAiB2BCQAAAIDYEZgAAAAAiB2BCQAAAIDYEZgAAAAAiB2BCQAAAIDYEZgAAAAAiB2BCQAAAIDYEZgAAAAAiB2BCQAAAIDYEZgAAAAAiF1d3A1A9TCzRklzwt1NkrpibA4AAAByVytpYrj9tLu3xdmYRAQmyMUcSY/G3QgAAAAUxbGSHou7ET0YygUAAAAgdvSYIBebejYWLVqkGTNmxNkWDAEtLS1atGiRJGnevHkaNmxYzC3CYMc9h3LjnkO5rVq1SvPmzevZ3ZSubLkRmCAXvTklkydP1rRp0+JsC4aAlpYWTZgwQZI0bdo0/mCj5LjnUG7ccyi3lpaWxN2KyhdmKBcAAACA2BGYAAAAAIgdgQkAAACA2BGYAAAAAIgdgQkAAACA2BGYAAAAAIgdgQkAAACA2BGYAAAAAIgdgQkAAACA2BGYAAAAAIgdgQkAAACA2BGYAAAAAIgdgQkAAACA2BGYAAAAAIgdgQkAAACA2A3ZwMTMJpnZOWb2VTO708w2m5mHjwVZXmN+wmsyPeYXqd0TwjY/ZWY7w8dT4bHxxagDAAAAKLe6uBsQow1xNyBXZjZX0p8kTY6cmhM+LjOz8939kXK3DQAAACjEUA5MEq2RtFzSmQVc442SXklzfm0B15aZ7Svpz5ImSuqU9B1Jt4Wnz5H075L2kfRnMzva3QuqDxgMnn1lhx5bvU1d3R53U1AlOjo6tPxVkyStf+hl1dfXx9yi6jJ6WL1OP3iixo9sjLspAKrQUA5MvirpUUmPuvsGM5suaVUB11vh7quL0bABfE1BUCJJ73b33yecu8/Mlkj6naRJkv5b0vwStgWoeH9bukEfvPYxEZMgd7XB0+rn421GlZq21zDdfsUpGjOcoA5AboZsjom7f9ndb3P3ih/SZWaTJb0n3P1rJCiRJLn7jZL+Gu6+L3wNMGRd8+BqghIgBmu3tWjxys1xNwNAFRqygUmVeYv6/q1+nabcgvC5JnwNMCS5u55auyPuZgBD1o6WjribAKAKDeWhXNXk5ITte9OUSzx3kqSflaY5QGVbu62l3wejuTPGqa7WYmrRwEz5t8lFl1CxdXV1a+vWLZKkcePGq7aW7++y8fTaHdrZ2tm739nVHWNrAFQrApPi+bWZHSxpgqSdkl6Q9HdJP3b3dQVee3b4vMPd1w9UyN1fNbOdkkZLOrTAOoGq9cy65N6SvYbX67eXHy+zygtMUFlaWlq0cOFCSdKZZx6lYcOGxdyi6vDunz+kB1Zu6d3v6CJoBpA7ApPiOS1he3z4mCvpk2b2cXf/aQHXnhY+ZzPT1suSDpO0b66VmNm0DEV681ba2trU0tKSaxVATlpbW1NuZ/LES1uS9g+dPDKn12PoyveeG+pqIr13LW3t/I3IEvccyq2trS3uJgyIwKRwL0r6o6QHFQQFkjRT0r9IerukJkk/MTN393yHVo0Kn3dnUXZP+Dwyj3pezlwk8PDDD2vlypV5VAHkZ9GiRdmXXVajxBS6Ya1ber8FB7KVyz031G3dkvx/btlzz2nh7uXxNahKcc+hHDZvrtzJKQhMCnOzpKvdPdpn/aik35nZOQqClnpJ3zWzW9MNxUqjKXxuz6JsTxjM+AMMSe7Sy7uTh2ztO4JhJUApRdO3mBEPQD4ITArg7mmn/XH328zsq5L+S9JwSZcqWI8kV63h6xuyKNuzqlU+feiZhn9NVhB0ae7cuZo1a1YeVQDZa21t7f0Gcd68eWpqasrwCmnDzjbtfmhx0rF3vukk7T9ueEnaiMEln3sO0p07ntHT2zb27u8/Y5bOPH1mjC2qHtxzKLdKHvFCYFJ6P1OwmKNJOlX5BSa7FAQm2QzPGhE+ZzPsK0mm1eITE4cbGxtJCkVZNTU1ZXXPvbBqZ9L+qMY6HbTPONXUkPiO3GR7z0FqbIh8nKip5XeXB+45lENjY2PmQjFhHsQSc/eNknoycafmeZmegCFTcrrU1+uRdb4IMJg880pyR+ZhU0cTlAAlVleT/HGii7FcAPJAYFIehb5DLw2fx6Rb0d3M9lEwVbAkLSuwTqAqPbMuucfk8CljYmoJMHTURYL/DtYxAZAHApMSM7OJCtY2kaRX8rzM/Qnbp6Ypl3hu8YClgEEsuobJ4VMJTIBSiy5e2sk6JgDyQGBSepdLvUs7p1u1PZ1bJfV8/XRJmnLzw+fu8DXAkLJpV5vW70xeB+DwqaMHKA2gWOprkz9OdHbTYwIgdwQmeTKz6WZ2VIYy50j6UrjbIunXA5S7x8w8fEyPng+nGL4+3H2jmb09xTUukPTGcPfaPKclBqras5H8kmH1tZoxIZ8lfQDkov9QLnpMAORuyM7KZWYnSzog4dCEhO0DzGx+Ynl3XxC5xHRJd5vZg5L+LOlJST1zJc5UsLji29XXW/Ipd19XQJO/IOlNkiZKusHMjpF0W3juHEmfDLc3SfpiAfUAVevZV5LzS2ZPGa1aEt+BkquNDOUi+R1APoZsYCLpMkkXD3DupPCRaMEAZU8IHwNplvSJAlZ9lyS5+8tmdq6kPylYT+Sz4SPReknnZ5r2Fxis+uWXTGEYF1AO9ZFZuUh+B5CPoRyYFGqJpPcqCEqOkbSPgl6XOknbJD0r6R+SfhFOGVwwd3/YzOZI+pik8xX02kjSKkm3SPqeu29J/Wpg8Os/VTCJ70A5kPwOoBiGbGDi7vPVlyyez+t3Kcj7uD5T2SyudVoOZTdL+s/wASC0o7lDL29tSTo2h8AEKAuS3wEUA8nvAAaFaG9JQ12NDphE4jtQDiS/AygGAhMAg0I0v+TQyaP6fYsLoDSik0yQ/A4gH/zVBjAoPBOZkYv8EqB8ol8CkPwOIB8EJgAGhWf7zchFYAKUS7/kd3pMAOSBwARA1dvV2qEXN+9JOsaK70D5RKcL7qTHBEAeCEwAVL1lr+5K2q+rMR2096iYWgMMPdEeE5LfAeSDwARA1Ysmvh+49yg11dfG1Bpg6CH5HUAxEJgAqHrRqYJZ8R0or37J76xjAiAPBCYAql60x2TONBLfgXKKrmPCyu8A8kFgAqCqtbR36YWNu5OOHcaMXEBZ9Vv5neR3AHkgMAFQ1Zat36nE4ew1Jh26D4nvQDkxXTCAYiAwAVDVouuXzJo4UsMb6mJqDTA0RZPfCUwA5IPABEBVe2Zd8orvh7PiO1B2rPwOoBgITABUteiMXIcxIxdQdiS/AygGAhMAVauts0srNiQvrkiPCVB+/ZLfmS4YQB4ITABUrRXrd/dbYXo2PSZA2ZFjAqAYCEwAVK3oMK4ZE0ZodFN9TK0Bhq76yKxc7qz+DiB3BCYAqlZ0YUXyS4B41NX0/zhBAjyAXBGYAKhaz7zCjFxAJYiuYyIxnAtA7ghMAFSljq5uLXs1Epiw4jsQi2jyu8Tq7wByR2ACoCqt3LRb7Z3JH3wYygXEI5r8LtFjAiB3BCYAqlJ0YcWpY4dprxENMbUGGNrqU+SYsJYJgFwRmACoSs9GZuQ6fCq9JUBcUuWYkPwOIFcEJgCq0spNe5L2D5lMYALEheR3AMVAYAKgKr24aXfS/qxJI2NqCYDUQ7noMQGQGwITAFWntaNL67a3JB2bOWFETK0BUFNjskinCT0mAHJFYAKg6qzavEce+cwzcyKBCRCnaK8Jye8AckVgAqDqrIwM45oypknDG+piag0AqX+eSUc3Q7kA5IbABEDVeTGS+D5zIvklQNzqImuZ0GMCIFcEJgCqTrTHZBbDuIDYRVd/76THBECOCEwAVB16TIDKE139nR4TALkiMAFQVdy9/1TBBCZA7OgxAVAoAhMAVWXDzjbtae9KOsaMXED8+iW/02MCIEcEJgCqSrS3ZFh9rSaPboqpNQB6kPwOoFAEJgCqSjTxfebEEaqJfCACUH4M5QJQKAITAFVlJYnvQEUi+R1AoQhMAFQVpgoGKlMdPSYACkRgAqCqMFUwUJnqa0h+B1AYAhMAVaOlvUuv7GhJOkaPCVAZorNydXbRYwIgNwQmAKrGqs175JEvYWdMIDABKkFdTXQoFz0mAHJDYAKgary4OTm/ZMqYJg1vqIupNQAS9esxITABkCMCEwBVY+XG5PySWZPILwEqRb8eE4ZyAcgRgQmAqhHtMZnJMC6gYtSz8juAAhGYAKga/aYKpscEqBhMFwygUAQmAKqCu2tVdKrgCQQmQKWoiy6wSI4JgBwRmACoCht3tWtPe1fSsZlMFQxUjH6BCUO5AOSIwARAVXhxc3JvyfCGWk0e3RRTawBE9RvKRfI7gBwN2cDEzCaZ2Tlm9lUzu9PMNpuZh48FWV5juJm9zcx+bGaPmtk2M+swsy1m9qCZXWlmk4vU3tUJ7Uv3WF2M+oBKs2pLc9L+jAkjVBP5hhZAfPolvzOUC0COhvICABsKebGZvUbSYkmpBrmPk3R8+PiEmV3u7r8rpD5gqFu1OTkwmTWR/BKgkkSnC+5iKBeAHA3lwCTRGknLJZ2Zw2tGqy8oWSzpNkmPSdoiaaKkt0n6QFjuejPb6e53FqGtt0j6Yprz7UWoA6g40R4T8kuAyhJdYLGDWbkA5GgoByZflfSopEfdfYOZTZe0KofXd0u6UdJX3H1pivMLzexOSTdLqpV0lZkd6O6FfoW03d2fKfAaQNWJ5pjQYwJUFpLfARRqyAYm7v7lAl//gKQHMpS5xcz+KOlfJM2SdJSkxwupFxiK2rukV3e0JR2jxwSoLKxjAqBQQzb5vYzuTtieFVsrgCq2qbX/sRms+g5UlPoaVn4HUBgCk9JrTNjuGrAUgAFtaEn+wDN17DANbxiyHb5ARYr2mHQxKxeAHBGYlN6pCdvLinC9eWb2hJntMrNmM1tlZr8zs/PNjLlTMShtbEneZxgXUHmiOSYdrGMCIEd85VhCZnaEpLPD3afdvRiByYzI/vTwcaGkxWb2Dndfl8+FzWxahiK9a7K0tbWppaUlXVmgYK2twRiuaI/J/ns1cf+hJHruueg2MvPuzqT99o5O/p9mgXsO5dbW1pa5UEwITErEzBol/ULBjFyS9IUCL9ku6VZJCyU9I2mHpLGSTpD0YUn7SjpJ0t/M7AR335FHHS9nW/Dhhx/WypUr86gCyN3G1uTApHXTS1q4cHU8jcGQsWjRoribUFWeX2/q+5MnbdqyTQsXLoyvQVWIew7lsHnz5ribMCACk9L5oaRjwu2r3f3PBV7vOHffnuL4PWb2Q0l/ULAOy6GSvizp3wusD6gI7v2Hck0aFk9bAAwssoyJyH0HkCsCkxIws/+QdFm4+6ikjxZ6zQGCkp5zu8zsQkkvKlh1/nIz+5y757rY4r4Zzk9W8PNo7ty5mjWLScZQWq2trbr1b4vU3p38ieeCN56iyaObYmoVBrPW1tbeb63nzZunpibus2zteeJV/fbFvhHLI0eN1plnHhtji6oD9xzKrZJHvBCYFJmZfVDS18Pd5ZLe7O570rykKNx9h5n9VtJHJI1Q0FuTdp2VFNdYm+58Ym59Y2Ojhg3ja2uU3obIMK7hDbWaPmmsmOsBpdbU1MT7XA6GNzUm7Xe5+P3liHsO5dDY2Ji5UEyYlauIzOxdkv4v3H1J0hvcvZwD+RJXoJ9axnqBkkk1IxdBCVB56iJjuTqZLhhAjghMisTM3iLpGgW/01clnZGpB6IE+CuAQWdjZEaumRNGxtQSAOnU1URWfme6YAA5IjApAjM7Q9KNCobGbVHQUxLHAL7ZCduvxFA/UHQbIj0msyYSmACVqL6Wld8BFIbApEBmdqKkWxSs8L5D0hvd/dkY2jFG0jvD3WZJj5W7DUAp9OsxYXFFoCLVRhZYZOV3ALkiMCmAmR0p6XYFyeZ7JJ3t7kvyuM49ZubhY3qK828yswGz4cxspIIem/HhoV+6e+WungNkqaWjS9vakz/s0GMCVKb62shQrm6GcgHIzZCdlcvMTpZ0QMKhCQnbB5jZ/MTy7r4g8vpZkv6qYJFDSfqipB1mdniaaje6+8Y8mvs5Sdeb2R8l3S9ppaTdksZIOlHShyTtF5Z9TtKVedQBVJzVW5r7HZsxgR4ToBLV1TCUC0BhhmxgomCdkYsHOHdS+Ei0ILJ/iqRJCfvfzaLOryj/oGGcgjZflqbMvZLe4+5b86wDqCirNicHJlPHDtOwhtoBSgOIU120x4TkdwA5GsqBSTX5lKQzJJ0g6WAFvTtjFeSSvCLpYUk3SFro7nxFhUEjGpiQXwJUrn7J7+SYAMjRkA1M3H2+pPkFvH6B+vei5Hut0zKcf0wks2MIWhUZykV+CVC5SH4HUCiS3wFUrBc370nan0WPCVCxosnvXd0uOvEB5ILABEBFcne9tCV5EZOZ9JgAFSua/C6RAA8gNwQmACrS+p2tau7oSjpGjglQuaI9JhJTBgPIDYEJgIq0cmPyMK7h9bWaPLopptYAyKSutn+PSSd5JgByQGACoCKt3LQ7aX/6hOEy6//BB0BliCa/S1InQ7kA5IDABEBFWrFhV9L+rAnDY2oJgGzU16QYysVaJgByQGACoCJFA5MDJ5FfAlSyVEO5WMsEQC4ITABUHHfXig3JQ7kOmMSMXEAlS5n8To8JgBwQmACoOBt3tWlHS0fSsQOZkQuoaKmmCyb5HUAuCEwAVJzoMK6GGteUsczIBVQykt8BFIrABEDFeW59cmAyeZhUw4xcQEUzs369Jh0M5QKQAwITABUn2mOyz3C+dQWqQTQBnqFcAHJBYAKg4kQT3wlMgOoQnTKY5HcAuSAwAVBR3F3PR3pMJrOECVAVaukxAVAAAhMAFWXd9hbtae9KOrbPMD7cANWgrl+PCf93AWSPwARARYnmlwyrdY1piKkxAHJSH+kx6ehmKBeA7BGYAKgoz61Pzi+ZPFxiQi6gOvRLfqfHBEAOCEwAVJRofgmJ70D1IPkdQCEITABUlOeigQn5JUDViC6ySPI7gFwQmACoGF3drhc2RqcKjqkxAHJWVxvpMSHHBEAOCEwAVIw1W5vV1pn8QWYyQ7mAqtEv+Z0cEwA5IDABUDGeW588jGvc8HqNqo+pMQByVhcdykVgAiAHBCYAKkY08f3ASSNiagmAfESHcnUxlAtADghMAFSMaOL7ARNHxtQSAPmI9pgwlAtALghMAFSM5zckJ77TYwJUF5LfARSCwARARWjv7NbKTcmByQEEJkBVqafHBEABCEwAVITVW/b0W/PggIkEJkA1YeV3AIUgMAFQEVZE8ksmj27SmGFMyQVUE5LfARSCwARARVgRmSr4wL1JfAeqTb/kd1Z+B5ADAhMAFWFFJPH94L1HxdQSAPmqq4kkv3fRYwIgewQmACpCdCjXQQQmQNVh5XcAhSAwARC71o4urd6yJ+nYQZMJTIBq0y/5nRwTADmoK3eFZjZR0kxJkyWNkNQhabukNZJecPeucrcJQLxWbtqt6FD0AyeNlLo74mkQgLxEh3J1kWMCIAclD0zMbISk8ySdJelUSVPTFG8zs39KWijpZnd/qtTtAxC/6DCuaXsN04jGOrW0EJgA1YSV3wEUomSBiZkdJekKSRdIGt5zOMPLmiSdIOl4SV8ys2cl/UjSte7eXKq2AogXie/A4NBv5XeS3wHkoOiBSRiQ/JeCHhKpLxhZL+kRSUskbZS0VdI2ScMkjZO0l6SDJB0r6TWS6iUdLun/JP2XmX1T0lXu3lbsNgOIV/+pgglMgGrUL/mdoVwAclDUwMTMfi3pfepLqn9c0vWSbnL3NTlcp0HSPEnvkfRWSRMkfUPSR8zsIne/v5jtBhCv5yJDuQ6ezBomQDViumAAhSj2rFwXS+qU9HNJh7j7Me7+3VyCEkly93Z3/7u7XyJpb0kXSXpO0nRJrytymwHEaE9bp9Zua0k6xlTBQHWKzspF8juAXBR7KNf/SfqGu79crAuGQ7euM7PrFeSr1Bbr2gDi9/zG5PySGpNmTaTHBKhGJL8DKERRAxN3/9diXi9ybZd0Y6muDyAe0Rm5po8foaZ6vn8AqlG/5HfWMQGQAxZYBBCr/onv9JYA1YqV3wEUgsAEQKxWbGSqYGCwYIFFAIUoxXTBr0haJOk+SYvc/eli1wFg8Ij2mBw0mcAEqFbRHBNm5QKQi1IssDhZQZL6BZJkZtsl3a8gWFkkaYm7804FQDtaOrR+Z2vSMWbkAqpXdFYuhnIByEUpApOXJO2fsL+XpHPChyTtMbMH1der8pC7t5egHQAq3PORxPf6WtP08SNiag2AQpH8DqAQRQ9M3H2GmU2VdErC4zD1rQA/UtLrw4cktZvZo+rrUVns7nuK3S4AlSe6sOKMCSPUUEfqG1Ct6vsN5aLHBED2StFjIndfJ+m34UNmtpekk9QXqBwtqT4s3hieO0nSf0jqMrMn1Beo3Ofu20rRTgDxen5DcuI7w7iA6ta/x4TABED2yvLVpLtvc/fb3P2z7n6ipDEKVnD/sqS/S2pW0KNiCoKlYyR9QtLNkjaWok1mNsnMzjGzr5rZnWa22cw8fCzI43pnmdnNZrbWzNrC55vN7Kwit3u4mX3GzB41s61mtsfMlpvZt81s/8xXACrHc5HEd2bkAqobye8AClGSHpNM3L1V0j3hQ2ZWK+m16utROVnS+LB4qYKnDcW4iJnVSPqZpEsjp6aGj/PN7BeSPlho0r+ZHSDpDkkHRk4dHD4uM7P3uPtthdQDlEt0ccUDCUyAqtYv+Z0eEwA5qJTB3DUKhnbVS2pQEDCV891sjaSFeb72a+oLSv4p6V2Sjguf/xkev0zSfxfSQDMbJel29QUlP5d0hqQTJX1B0m5JoyX9zsyOLKQuoBw2727Tlj3J814czFTBQFWLrmNCjwmAXMTSY2JmIxR8oO7pITlOUlPP6YSiyxXM3FUKX5X0qKRH3X2DmU2XtCqXC5jZQZI+Fe4+Jmmeu7eE+4+a2a2S7lUwNO3TZvYrd38hz/Z+WtJB4fZn3P1bCeceNLN7wrqGS/qepNPyrAcoi+j6JY11Ndpv3PCYWgOgGKIrv5P8DiAXZQlMzGy8kmfpOlJSbc/p8Lld0uMK1jy5X8HsXFtK1SZ3/3IRLvNx9f0Or0gISnrqaDazKyQ9GJb7hKSP5lqJmdVL+rdwd5mkb0fLuPsDZvZLSR+UdKqZHevuj+ZaF1AuS1/dmbR/4N4jVRsZnw6gupD8DqAQJQlMzGxfBQHIvPD5kMTT4fNOSQ+oLxB5JMw9qQpmZpLOC3eXu/tDqcq5+0Nm9pyCHJDzzOxf3T3Xd+rTFUwYIElXp8lVWaAgMJGktyroEQIqUjQwmb3P6JhaAqBY+iW/s44JgBwUPTAxs9WS9u3ZTTi1Tn1ByP2SnsrjA3olmSFpSrh9b4ay9yoITKZKmq4ch4wpmAwg8VoDeUzBDGfDFUy/DFSspa8kByaHTRkzQEkA1SLVyu/uruC7PABIrxQ9JvuFz52S/iDpNgXDsl4qQV1xmp2wvTxD2cTzhyr3wCSruty908xekPSasB6gIrV1dumFjclrmMyeQo8JUO2iye+S1NXt/QIWAEilVDkmriCH5EIFq77fZ2b3KQhQ1paoznKblrCd6Wd6OWF73wFLZa5rj7tvz6Ku10iaaGaN7t6WbSVmNi1Dkck9G21tbWppaUlXFhjQ0ld39Rt7Pn1sfb97qrW1NeU2UCrcc4Xp6uj/J2fXnmY11demKA2Jew7l19aW9UfDsitFYPIJBUOPTpa0t6Q5kg6X9GFJMrM16hvOdZ+7Ly1BG8ohcV7T3QOWCuxJ2B5ZQF2Z6klVVy5338uZiwQefvhhrVy5ModLA30e2mjqm/9CmtDoeuDeu9K+ZtGiRSVuFZCMey53W9uk6EeLhX//h5qIS7LCPYdy2Lx5c9xNGFDRAxN3/76k70u90+n2zMQ1T0F+xf7h491hmW0KkuDvUxCsPObuHcVuVwk0JWy3D1gqkBgcDCugrkz1FKMuoOTW7Uke1jF1RDWnmwHokWrEVle3Er+HAIABlXS6YHdfIWmFpF9KkplNVXKgMlvSOEnnSDo7fFmbmT2ivl6VB9x9pypPYn9rQ4ayjQnb+Yx/6qkrUz2F1pVpmNlkhTN9zZ07V7Nmzcrx8kDgml8vkbSjd//UI2bpzHkz+pVrbW3t/QZx3rx5ampq6lcGKCbuucJs3dOuLy25P+nYKaeepgkjs/nzNTRxz6HcKnnES1kXWHT3dZJ+Gz5kZnspGPI1L3wcpaB3oGeaYUnqUnYfyMstcXW4TMOzRiRsZzMca6C6shkGlnddmfJ/EmdVaWxs1LBhdMggd93druc27Ek6dsR+4zPeT01NTdxzKCvuudyNTPGxoq6hgd9jlrjnUA6NjY2ZC8Wk//QZZeTu29z9z+7+aXefK2mspA9JelHBVMPJA9ErS+KH+ExJ44k9EVnncaSoa4SZjc2yrk25JL4D5bJ2W4t2t3UmHWNGLmBwiK78LrH6O4DslbXHJBUzO0x9PSSnqG9tEFfyOiiVJjFp/5ABS/U/vyzPuv4l4VopF3M0szpJPeOr8qkHKLmlr+5I2h83okGTRzN0ARgMamtSBCas/g4gS2UNTMysVtLR6ssxOUnSXolFIi9ZI6lSp6hYJekVBYHUqRnKzguf10lanUddiQN2T9UAgYmkY9Q3lGtxHvUAJRddWHH2PqNZfA0YJOpTrGPS2cXq7wCyU9LAxMyaJJ2gvkBkroJVyXuLRF7ynIJAZJGCqYTXlLJ9hXB3N7NbFEyDfIiZHe/u/QIGMztefT0mt+S52v09CjKFx0i62My+OcB15ids35xHPUDJLX01EpgwjAsYNGpqTDUmJXaSdDCUC0CWih6YmNk56huW9VpJ9YmnE7a7JT2p5EBkU7HbU2Lfk3S5gjyYq8xsnrv3zoRlZsMkXRXudobl+zGzBZIuDndPd/d7Es+7e7uZ/UDSfypY0f1Tkr4VucYJki4Nd+9190fz/aGAUkrVYwJg8KirrVF7Z18vSWc3PSYAslOKHpNbFeSHSMmBSLukxxSsV7JIwSrwsU0DbGYnSzog4dCEhO0DzGx+Ynl3XxC9hruvMLNvSfqcgmFUi83sG5JWKsj1+KyCmcYk6Vvu/nwBTf6WpHdIOkjSN83sAAWzm7VIOl3S5xX8e7ZI+ngB9QAls21Pu17ZkbyyMT0mwOBSX2NJi26RYwIgW6UaymWSmiU9qL5A5CF3b037qvK6TH29FFEnhY9ECwYo+wVJkyS9X0EQ8tsUZX4p6Yu5N7GPu+8ys7Ml3SHpQAU9NZdHiu2U9B53f6KQuoBSiQ7jaqir0cwJIwYoDaAaRRPgmZULQLZKEZh8RkEwssTdOzMVrnbu3i3pUjO7SUGgcKyC3pfNChYj/Km731mkul4ws6MkfVTSBQp6fBoUTEF8h6Tvu/tLxagLKIXoMK5DJo9SXW2ss5YDKLL6yP9pkt8BZKvogYm7/79iX7MU3H2+kpPFC73eHQqCg5K2xd33SPpm+ACqSrTH5DCGcQGDTl1kLZMOhnIByBJfVQIoGxLfgcGvroYeEwD5ITABUBatHV16YdPupGMkvgODT3T1d5LfAWSrFNMF31XkS7q7n1HkawIos+c37FZXwgcUM+ngyQQmwGBD8juAfJUi+f00JU8XXMg7UqGvB1Ahlr66I2l/+vgRGtlY0jVeAcSgX/I765gAyFIpPxW0StpYwusDqCLPkl8CDAn9kt/pMQGQpVIGJk2SXpV0jaTfufu2EtYFoML1S3wnvwQYlEh+B5CvUiS//6ekFQqGYR0v6UeSXjWzm8zsfDOrL0GdACpYd7dr2asEJsBQUBfNMSH5HUCWih6YuPvX3P1QScdJ+qGChQYbJL1V0k0KgpQfmdkJxa4bQGVas7VZe9q7ko4dxlAuYFCKDuWixwRAtko2XbC7P+bu/yZpiqS3SPqDpDZJ4yR9SNL9ZrbCzP7TzGaUqh0A4hddWHHCyAZNHNUYU2sAlFL/5Hd6TABkp+TrmLh7l7vf5u4XSpos6QOS7gtPHyDpSkkvmNl9ZvYBMxtb6jYBKK9ofsmh+4yWmQ1QGkA1iw7lIvkdQLbKusCiu+9091+6+2mSZkj6kqQXFOSjnCjpJ5JWlbNNAEov2mNCfgkweNVFeky6mC4YQJZiW/nd3de4+3+7+8GSrlAwzMskMb4DGGT6zchFfgkwaNFjAiBfsa1uZmb7SnqvpPdJOjjhVHs8LQJQClt2t2n9ztakY4fRYwIMWtEeExZYBJCtsgYmZjZa0gUKApJTFPSQ9Hy18qCkayX9rpxtAlBa0WFcTfU1mjFhZEytAVBq9dHpgukxAZClkgcmZlYr6SwFPSPnKhiq1fOu9aKk6yRd6+4rS90WAOUXHcZ1yOTRqq0h8R0YrFj5HUC+ShaYmNmxCoKRd0ia0HNY0nZJNyoIRhaXqn4AlYHEd2BoIfkdQL6KHpiY2RclvUfSQT2HJHVIulPBUK0/uzt5JMAQQeI7MLT0S35nHRMAWSpFj8lXJbmCgORhSddI+p27by1BXQAqWGtHl1Zu2p10jB4TYHCrq4kkv7PyO4AslTLHpEXS3pI+LenTBSym5u4+q2itAlA2z63fpcQvS82kQyaPiq9BAEquvpbkdwD5KWVgMkzS9CJch3c0oEo9GxnGNWPCCA1viG2WcgBl0C/5naFcALJUik8Ii0QwAUDS0ld3JO2TXwIMftGhXCS/A8hW0QMTdz+t2NcEUJ2iie+HTRkTU0sAlAsrvwPIV03mIgCQu65u1/L1u5KOkfgODH79Vn4n+R1AlghMAJTEqs171NzelXSMoVzA4Ncv+Z0cEwBZIjABUBJPrd2etL/36EZNHNUYT2MAlE3/oVz0mADITlEDEzPbp5jXG6COyaWuA0Dhnnx5e9L+EdPGxtIOAOXVf+V3ekwAZKfYPSYrzewHZja1yNeVmV1oZk9JurzY1wZQfE+sTZ6R64h9x8bTEABlRfI7gHwVOzCpk/RRSS+Y2dVmdqaZ5V2Hme1rZp8xs2WSbpB0uKT2IrUVQIm0dXZpWWRGriMJTIAhoV/yO9MFA8hSsacLPlzSdyWdJem94WOjmd0i6SFJj0pa6u4pvz4xswmSjpV0nKQzJJ0oycLHOklflrSgyG0GUGTLX92l9si48jnTmCoYGApY+R1AvooamLj7Cklnm9mJkr4o6Y2S9pb0gfAhSe1mtkXStvAxTNI4SXtJSvzk0vPOtlbSVZKucvfWYrYXQGk8GUl8nzVxhEY31cfTGABlFV1gkeR3ANkqxcrvcvcHJL3ZzA6S9H5JF0iaEZ5ulDQlfLj6ApBEbZL+Kunnku50d97VgCryRDTxnWFcwJBRG8kxIfkdQLZKEpj0CHtQPifpc2a2n6RTFAzPmiZpooKeklZJm8LH05Luk/SIu5NLAlSp6Ixc5JcAQ0d0KBfJ7wCyVdLAJJG7r5F0ffgAMEjtbO3Qyk17ko4xVTAwdJD8DiBfLLAIoKieiUwT3FBbo0P2GRVTawCUW30Nye8A8kNgAqConogkvh86ZbQa62rjaQyAsuvfY0JgAiA7BCYAiqr/iu9MEwwMJdHk905m5QKQJQITAEX15MuRFd/JLwGGlH7J7/SYAMgSgQmAolm/o1XrdyYvN8RUwcDQEl3HhB4TANkiMAFQNNGFFUc11mnmhBHxNAZALKI9Jt0uddNrAiALBCYAiiaaX/KafceopibVGqoABqto8rtEAjyA7BCYACiaaI8J+SXA0FOX4ssI1jIBkA0CEwBF0d3teiqa+E5+CTDk1NX2D0xY/R1ANghMABTFi5v3aFdbZ9KxIwlMgCEnmvwukQAPIDtlCUzM7K7wcUk56gNQftH8ksmjm7T36KZ4GgMgNtHkd4kcEwDZKVePySmSTpW0ukz1ASizp6L5JfuysCIwFJH8DiBf5QpMNobP28tUH4Aye2It+SUABkh+ZygXgCyUKzB5Mnw+qEz1ASijts4uLXtlZ9IxZuQChqZUgQnJ7wCyUa7A5BeSTNKHylRfWZjZPWbmOT5Oy6OeK0t5faBQy1/dpfbIN6JzpjGUCxiKapkuGECeyhKYuPsfJV0n6VQz+5WZDdWloLslPR93I4Bii65fMmviCI1uqo+nMQBiZWb9EuA76TEBkIW6clRiZhdJ+oek10i6WNJ5ZvZnSU9J2iapK93r3f2akjcyP5dIyhRkzZb0u3D7H+6+rsA652Q4v6rA6wM5eyIyIxf5JcDQVltjScO3SH4HkI2yBCaSFkhKfFfaS9L7snytS6rIwMTdMwYBZpb4cxb8c7j7M4VeAyi26FTBrF8CDG31NTVqVd/wLZLfAWSjXIGJFOSYpNsfdMysRtJ7wt3dkv4YY3OAktjZ2qGVm/YkHSPxHRjaoqu/k/wOIBvlCkxmlKmeSnOGpKnh9h/cvTnOxgCl8HRkmuCG2hodss+omFoDoBJE1zIh+R1ANsoSmLj7S+WopwJdlLBdkcPRgEJF80sOnTJajXW18TQGQEWoj8zMRY4JgGyUa7rgIcfMRkp6a7j7kqR7inTdhWa20czaw+d7zOxzZrZXMa4P5Cq64vuRTBMMDHm1zMoFIA/lzDEZav5FfTN2XefuxXpXfkPC9kRJp4aPz5rZfHe/Jd8Lm9m0DEUm92y0tbWppaUl36owiDyxZnvS/qF7Dy/avdHa2ppyGygV7rniqLXkwKS5pZW/GQPgnkO5tbW1xd2EAZU9MDGzAxUMcTpBwQfdYZLe6O4vJJQ5XNJ+kva4+73lbmORFHsY19OS/iTpEUmvSKqXdLCC5PozJY2VdJOZnevud+ZZx8vZFnz44Ye1cuXKPKvBYLG9TdqwK/ltZOfqp7Vww9NFr2vRokVFvyaQDvdc/lqba5U4x83jTzwpraXXJBPuOZTD5s2b427CgMoWmIQzVH1T0scUDCHrecdySQ2R4vtJuk1Sp5nNKMLaH2UV9jycFu4+5O4rCrzk99z9yhTHH5Z0jZl9UNJPJNVK+oWZzXJ3vnZBya3Zk/ytaFOta2JTTI0BUDEiI7nESC4A2Shnj8lPJb1fQUCyTtKDkt6eqqC732FmqyRND8t8v0xtLJb3qi9/5+pCL+bu2zOc/6mZHSvpUklTFAwjuz6PqvbNcH6ypEclae7cuZo1a1YeVWAwefYfK6Xn+ua2OHK/cXrTG48q2vVbW1t7v0GcN2+empqIelBa3HPF8YuXHtW65l29+4fOPkxnHjUlxhZVLu45lFslj3gp18rvZyj40OySvi7py+7eZWbp5g/8vaTPSHqdqi8w6VlUsU19q76X2k8V/I6lIOck58DE3demO28JY4YbGxs1bNiwXKvAIPPs+t1J+6/df1zJ7oumpibuOZQV91z+6iMz81ltPb/LLHDPoRwaGxvjbsKAytVjcnn4fIe7fzHL1zwSPh9WgvaUjJkdI2l2uHubu28rU9VLE7anDlgKKJKubtdTLyevYXIEK74DEOuYAMhPuaYLPkFBb8kvc3hNz7f3k9OWqjyJSe8FD+PKASN4UVYrNuzSrrbOpGNHEpgAkFTPyu8A8lCuwGRS+Lw6h9d0hM9VM6WxmdVLeme4u0lSvrNj5WN2wvYrZawXQ9Rjq7cm7e83brj2Hs3YaABSXU2kx6SLHhMAmZUrMNkTPk/M4TU9a2psTVuqspylvp/xN+7ema5wkX0wYbtap1hGFXl0dfIoxWOms8YngEC0x4SV3wFko1yByYvh8+y0pZKdFT4/W+S2lFLOa5eY2Xwz8/BxZYrzc8zsgAzXuFzSZeHuekk3Z9leIG/RHpNjp4+LqSUAKk1tDSu/A8hduYZJLZR0tKSPmtlV7p62T9fMZkuaryBv4o7SN69wZraXpHPC3Wfc/fEiXfpoBWuT3K1gaNjTkrYo+Lc7RH0LLEpSl6TL3X1PqgsBxbJ2W7Ne2ZG8VM6x9JgACJH8DiAf5QpMfiDp3yTNkvQTM/vIQMOczOwNkn4tqUnBB/Cfl6mNhXqHpJ7514qx0nuiWkmvDx8D2SLpUnf/c5HrBvp5LDKMa6/h9Zo1cWRMrQFQaeprSH4HkLuyBCbuvsHMPqTgA/ulkt5oZrcnFPmYBYtknKSgF8AkdUua7+67+12wMvWsXdKl/BY3HMgdCn5nJ0g6StLeksYr+B1tlfSkpL9IWuDuO4tYLzCgRyPDuI7ef1zSOjcAhrZ+PSYkvwPIQtlmvHL3682sQ8FCgPsqSNbu+QqlJz+i55PNbkkXu/vtqhLuflKer1sgaUGa8xsl/Sp8ABUh2mPCMC4AiUh+B5CPciW/S5Lc/UZJB0j6sqQlCnoXLOHxrKT/kXSAu5PADVSgHc0dem7DrqRjx84g8R1An37J7+SYAMhC2dcIcfctkv5L0n+ZWY2kcQpyKLa6e0faFwOI3ZI1ycO4GutqdPiUMTG1BkAl6r+OCT0mADKLdfHCcHauzXG2AUBuouuXHLnvWDXUlbXzFUCFY+V3APkoy6cJMxtejnoAlN6jq1i/BEB60eT3LoZyAchCuXpMtpnZY5IWSbpH0v2stQFUn9aOLj21dkfSMVZ8BxBVF50umOR3AFkoV2BSL+n48PEZSV1m9rike9UXqOwa+OUAKsHT63aoPWHaTzPptfsTmABI1j/HhB4TAJmVKzD5vKR5CtYpGRXWe5ykYyV9SkGg8oT6ApX7WJMDqDzR9UsOmTxao5vqY2oNgEpVF50umBwTAFko1wKL/yvpf82sVtJrJZ0m6VRJJ0saHbbjGElHS/p3Sd1m9qTCQIXVzIHKEF2/5DiGcQFIoV/yO0O5AGShrLNyuXuXpEfDx7fC6YKPUhCknKYgUBmrYPrgo8LHx8rdTgD9dXe7Hov0mBxD4juAFKJDuUh+B5CNWOf4dPdud1/i7t9x97dIOlDBGic92bU9Cy8CiNnzG3drZ2tn0jES3wGkEh3KxXTBALIRa0+EmY1VkHtyWvh4jfoHIy+Vu10A+nsk0lsyba9h2mfMsJhaA6CSkfwOIB9lDUzSBCJKeF6tviT4e9ydwASoANFhXKxfAmAg/ZLfyTEBkIWyBCZm9h0N3COySsmByJpytAlAbqKJ7wzjAjAQVn4HkI9y9Zh8XJIrCEhWKQxCFAQiL5epDQDytG57i9Ztb0k6Ro8JgIGQ/A4gH+VOfndJexIezWWuH0AeosO4xgyr1wETR8bUGgCVLrryO+uYAMhGuXpMrlGQWzJd0uGSDpP0UUluZkvV14Nyr7tvKVObAGQpOozr2Ol7qaaGCfMApFZXm/y9Zwc9JgCyUK4FFudLkpntp741S06VNFMEKkDFi674zvolANJh5XcA+Sj3AotrJF0bPmRm0xQEKKdKOl3SLPUPVJ519yPK2U4AfXa0dOi5DbuSjh1L4juANOojOSYkvwPIRtwLLK519+vd/XJ3P1DSNAULLO5UkChfoyBQARCTx1/aJk/4TNFQV6PDp46Jr0EAKl60x4TkdwDZiHWBRUkys4PUt67JqZImh6d6ZvECEKPoMK4jp41VY11tTK0BUA1IfgeQj7IHJmkCESk5EHlBYZ5JmZoGIAXWLwGQK5LfAeSjXAssXq7MgcgK9QUi97j7q+VoG4CBtXV26Ym125OOsX4JgEzoMQGQj3L1mPxE/YdmLVdyILKhTG0BkKVn1u1Qe2ffN51m0mv3p8cEQHr1kR6Tzm6Xu8uMEdoABlbOoVzL1BeI3OvuG8tYN4A8PBoZxnXw3qM0Zlh9TK0BUC1qU6xz1NXt/ZLiASBRuQKTSe6+uUx1ASiSR1clJ74zjAtANupTBCCd3S7mzQCQTlmmCyYoAapPZ1e3Hum3sCLDuABkFk1+l6SOLhLgAaQX63TBZlYnqeeTzjZ374yzPQD6PL1uh3a1Jv+XPGHm+JhaA6Ca1KcYykUCPIBMyr7AopkdamZXmdkySa2S1oePVjNbZmY/MLPZ5W4XgGSLX0ju6Dxw0khNGt0UU2sAVJNUPSad3QQmANIra2BiZv8j6SlJH5F0cFi/qW+V94MlfVTSk2b29XK2DUCy+yOByUkHTIipJQCqTark907WMgGQQdmGcpnZVQoCkp53q2WSHlbQWyIF65scJ2m2pFpJnzWzEe7+sXK1EUCgub1Tj7+0PenYyQQmALKUMvmdoVwAMijXAosnKegJcUlLJV3u7g8MUPYEBeuezJH0r2b2u4HKAiiNR1dvU3tComptjWnuTGbkApCduhqS3wHkrlxDuT4YPq+SdFK6QMPdH5Q0T9KL4aEPlbhtACKi+SVH7jtWo5pYvwRAdgaaLhgA0ilXYHKKgt6S/3X3HZkKh2W+oWDY1yklbhuAiPufJ78EQP7MrF+eCUO5AGRSrsBkcvj8zxxe83j4vHeR2wIgjS2727T01Z1Jx8gvAZCrfoEJye8AMihXYNIaPo/I4TU9ZduK3BYAaTywckvS/vCGWh2579h4GgOgakXXMumgxwRABuUKTFaFz+fm8Jqesi+mLQWgqKL5JXNnjFNDXdmXPAJQ5aJrmXSS/A4gg3J92rhDQb7IFWZ2RqbCZna6pCsU5KXcUeK2AQi5u+4jvwRAEUQT4El+B5BJuQKT70naKale0p1m9kMze62Z9dZvZjXhsR9K+oukhvA13ytTG4Ehb83WZq3b3pJ07OQDCUwA5C46ZTCBCYBMyrKOibtvNrMLJd2qIOD4cPhoN7OtCnpGxofnpKB3pV3SBe6+JcUlAZRAdLX3CSMbdPDeo2JqDYBq1n9WLoZyAUivbAPH3X2hpOMlPaYg8DBJjZL2kTQl3O45/pikue7+93K1D0D//JKTDpggs/7rEQBAJtGhXCS/A8ikLD0mPdz9CUnHmdmxkl4v6XBJPctJb5X0jKS/u/uj5WwXAKmr2/vNyEV+CYB89Ut+Z7pgABmUNTDpEQYeBB9ABVn6yk5tb+5IOkZgAiBfdZGhXF3kmADIoKSBiZmdLelNkvaXVCvpFUn3SLrR3TvSvBRAmS1emTyMa8aEEZo6dlhMrQFQ7eojPSYM5QKQSUkCEzPbW9KfJB2X4vT7JX3VzM5396dLUT+A3PXPLxkfU0sADAYkvwPIVdGT382sVsHsW3PVl8wefcyQ9FczY5wIUAFaO7r0yKqtScdOZhgXgAL0S35nKBeADEoxK9eFko5VMAXwC5IulTRH0iGSLpD0UFhub0mfLEH9AHL0+Evb1NbZ922mmXTCTAITAPnrt44JPSYAMijFUK4Lw+fVko5z9+0J51aY2Z8k/V3SqQoClf8oQRsA5CC6fslrpo7RmOH1MbUGwGBQV0vyO4DclKLH5CgFvSXfjgQlkiR375L05XB3hplV9eptZuZZPu4pUn3vMrOFZrbezFrN7CUzu87MTijG9TE0pVq/BAAKEZ2Vi+R3AJmUIjCZGD4/lqZM4jk+AWXBzIaZ2e2SfiPpDQqGwjVK2k/SeyTdb2ZfTnMJIKUdzR16at2OpGPklwAoVL91TBjKBSCDUgzlGqagx2T3QAXcvTlhNemmErQhDj+W9H9pzu8p8Pq/kvTmcPtuSd9XMP3yHEmflzRL0pVm9qq7/6zAujCEPPjiZnnCF5mNdTV67f57xdcgAIMCye8AchXLAosRlrlIVdjo7s+U4sJm9jpJ7wx3/yzpreGQOEl61MxulbREQe/JN8zs9+6+rRRtweATzS85bsY4NdXXxtQaAIMFye8AclWKoVwovk+Fz52SPpIQlEiS3H2zpM+Gu2MlXVa+pqHaLX5hS9I++SUAioHkdwC5KmWPyUfMbGMxyrn7V4vUpqoTTg5wRrj7d3dfO0DRP0raKWm0pLdK+lYZmocqt3Zbs1ZtTh5lSH4JgGIg+R1ArkoZmHw4w/med6hM5SRpyAYmCtaEaQi37x2okLu3m9lDks6UdKyZ1bt7RzkaiOr1QKS3ZOzwes3eZ3RMrQEwmPRLfu9mKBeA9Eo1lGugFd/zeVSLC8xsqZk1m9kuM3vezK42s9MLvO7shO3lGcr2nK+TdGCB9WIIWPT8pqT9E2eNV01NNf23A1Cp6ukxAZCjUvSYFPpBvFrNjuwfED4uCheVnO/uO/q9KrNpCdsDDePq8XLC9r6SluZSkZlNy1Bkcs9GW1ubWlpacrk8KkxHV7fufS45MDluvzEV9e/a2tqachsoFe65IvLkHpK29o6Ken+pFNxzKLe2tra4mzCgogcm7j7gcKNBqlnSrZL+oaDHYreCtVxOlfQhSeMlnS/pFjN7Qx7DqxIXoBxwCuZQYrLAyBzrkZIDm7QefvhhrVy5Mo8qUCme32Ha1ZY8+5a9+qwWLnw2phalt2jRoribgCGGe64wa9fUKHFgxstr12nhwqz/zAxJ3HMoh82bN2cuFJNKmC642k1NtcK9pL+Z2VWS7pR0lIJA5cOSfpDj9RPXeWnPUDYxBB6WYz0YYp7eljzMYtoI19jGmBoDYNCJjgplJBeATAhMCjRAUNJzboOZvV1BT0q9pCuUe2CS2K/bMGCpQOLHynz6y/fNcH6ypEclae7cuZo1a1YeVaASuLu+fdVDSrxNzjtmhs48bWZ8jUqhtbW19xvEefPmqalpsKzHikrFPVc8K+55UX9bt7p3f8KkvXXmmXPia1CF4p5DuVXyiBcCkxJz9xfN7G8KVm0/wMymuPsrOVxiV8J2puFZIxK2Mw376ifNVMSSJLO+r78aGxs1bBidMtXqhY27tGZbcux61mumVfS/aVNTU0W3D4MP91xhhjUmf5fWrRp+nxlwz6EcGhsrd3gECyyWR2IS+tQcX5sYLGRKTk/s8WAgLwb092XJSwdNHt2kw6YwTTCA4olOF9zFdMEAMiAwKY9CRtYmBjWHZCjbc75T0vMF1IlB7u9LNyTtv+7QSUk9YgBQqOgCi52s/A4gAwKT8kicSjiXYVxSkNPRk/R+6kCFzKxB0vE9r2FxRQxk6552Pb5mW9Kx1x86KabWABis+q/8To8JgPQITErMzGZIekO4u9Ld1+XyenffpWAqYkl6fZq1Rt4mqWcszs05NxRDxt3LNyrxi8th9bU6cdaE+BoEYFDqt/I703IByIDApABmdq6ZDTiBgJntLekm9c2m9X8pysw3Mw8fVw5wqf8XPtdJ+pGZJS0+YWYTJH0j3N0u6RdZ/xAYcv6+LHkY18kHTlBTfe0ApQEgP/W1kR4ThnIByIBZuQpzlaR6M7tJ0oOSViuYf3WCpNMkfTDclqT7Jf0on0rc/S4z+62kd0p6i4I1Ur6nYFjYHElfkLRfWPyz7r4t5YUw5LV1dmnRiuTV3hnGBaAU6mpIfgeQGwKTwk1RsD7JFWnK3CTpMndvS1Mmk/crGKr1Zkmnh49E3ZL+y91/VkAdGOQefnGr9rR39e6bSa87ZO8YWwRgsKqL9JgwlAtAJgQmhblYQUL6CZJmKugdGa1gDZGXJT0g6Wp3f7DQity9RdLZZvZuSfMlHSFprKQNku6T9MNi1IPB7R+RYVxHTBuriaMqdz5zANUr2mNC8juATAhMCuDu90q6t8BrLJC0IIfyv5H0m0LqxNDk7v3WL2EYF4BS6ddjQo4JgAxIfgeGiOXrd2nd9uTV3s84lGFcAEojmvzOUC4AmRCYAENEdBjX1LHDdMjkUTG1BsBgFx3K1UnyO4AMCEyAISLVMC5WewdQKv1WfqfHBEAGBCbAELBxV6ueeHl70jGGcQEopegCiyS/A8iEwAQYAu5entxbMqKhVnNnjoupNQCGApLfAeSKwAQYAqLDuE49eKIa61jtHUDp1EdzTBjKBSADAhNgkGvt6NJ9zyev9n4GiyoCKLH+PSYM5QKQHoEJMMg9sHKzWjv6PhDUmHT6IaxfAqC0osnv3S51M5wLQBoEJsAgFx3GdfT+e2nciIaYWgNgqIgmv0tSB70mANIgMAEGMXfvt34Js3EBKIdoj4lEngmA9AhMgEHsmXU7tWFnW9Kx1x/KMC4ApVefoseEwARAOgQmwCD2t0hvyf7jh2vWxJExtQbAUBJNfpdIgAeQHoEJMEi5u+54+tWkY68/dG9WewdQFimHcpH8DiANAhNgkFqxYbde2Lg76dib50yOqTUAhpqUye+s/g4gDQITYJC6/alXkvb3GdOko/bdK6bWABhqSH4HkCsCE2AQcnfdFhnG9eY5+6gmxQcFACiFlMnvDOUCkAaBCTAILV+/Sy9u2pN07OzX7BNTawAMRbU1pmhKG8nvANIhMAEGoWjS+9Sxw3TUvmPjaQyAISs6nIuhXADSITABBhl31+1PJQcmZx0+mdm4AJRdXU3yxwyS3wGkQ2ACDDLLXt2lFzczjAtA/KJrmZBjAiAdAhNgkLn96eTZuKaOHaYjGcYFIAbRBHiGcgFIh8AEGESCRRXXJx07+zX7MIwLQCxqozkmJL8DSIPABBhElr66U6uiw7jmMIwLQDzqSX4HkAMCE2AQiSa9T9trmF4zbUxMrQEw1EVXfyf5HUA6BCbAIOHuuj0yTfDZcxjGBSA+JL8DyAWBCTBIPPvKTr20pTnpGLNxAYhTfWS6YAITAOkQmACDRLS3ZN9xwzRnKsO4AMSnX/I7Q7kApEFgAgwCqRZVfDPDuADErD46lIvkdwBpEJgAg8Az63ZqzdbkYVznzJkSU2sAINAv+Z3pggGkQWACDAK3RRZV3G/ccB0+dXRMrQGAQB3TBQPIAYEJUOWCRRUjs3GxqCKACtBv5XeS3wGkQWACVLmn1+3Qy1tbko6xqCKASkDyO4BcEJgAVS6a9L7/+OE6bArDuADEr1/yOz0mANIgMAGqmLvrtqdYVBFAZaqrYeV3ANkjMAGq2JNrd2jd9sgwLhZVBFAhoiu/d9FjAiANAhOgit20ZG3S/owJIzR7H4ZxAagM0eT3DmblApAGgQlQpVo7uvSnJ9YlHTv3iCkM4wJQMUh+B5ALAhOgSv312fXa1drZu28mXXD0tBhbBADJSH4HkAsCE6BK/e7Rl5P2T5o1QfuOGx5TawCgP5LfAeSCwASoQmu2NOuBlVuSjl1wDL0lACoLye8AckFgAlShPyxJ7i0ZM6xebzxsckytAYDU6iI5JiS/A0iHwASoMl3drt9HZuM6/8gpaqqvjalFAJBaXWRWrs5uhnIBGBiBCVBl7n9hs17d0Zp07IJj9o2pNQAwsPp+s3LRYwJgYAQmQJW5MZL0ftiU0Tp86piYWgMAA4v2mJD8DiAdAhOgimzd066FS9cnHXvHsfSWAKhMJL8DyAWBCVBF/vTPdUnJow11NTrviKkxtggABtYv+Z3ABEAaBCZAlXB33fhY8jCuNx02WWOG18fUIgBIL7qOCSu/A0iHwKRAZnaMmX3JzBaa2VozazOz3Wa2wsx+bWYnF6meK83Ms3ycVow6UVmeWrtDy9fvSjp2IUnvACpYv5XfSX4HkEZd3A2oZma2SNIpKU41SDowfMw3s2skfcDd28vZPgwu0d6SaXsN04mzxsfUGgDIrF/yO9MFA0iDwKQwU8LnVyT9XtJ9ktZIqpV0gqRPSpoq6SJJ9ZLeXaR652Q4v6pI9aBCtLR36dYnXkk6dsHR+6omMn4bACpJNMeE5HcA6RCYFGa5pM9LusnduyLnHjKzayUtlnSQpHeZ2U/cfVGhlbr7M4VeA9Xlzmde1a62zt59M+ntx0yLsUUAkFl0Vi5WfgeQDjkmBXD3c9z9xhRBSc/5zQp6TXq8vTwtw2ATHcZ18gETNHXssJhaAwDZIfkdQC4ITErv7oTtWbG1AlXrpS179NCLW5OOsXYJgGrQL/mdoVwA0iAwKb3GhO2UPStAOr9/bG3S/tjh9XrD7L1jag0AZK9fjwnJ7wDSIDApvVMTtpcV44Lh1MQbzaw9fL7HzD5nZnsV4/qoHF3drj8sSQ5Mzj9yqhrramNqEQBkL5pjwnTBANIh+b2EzKxG0ucSDt1YpEu/IWF7ooLg51RJnzWz+e5+Sz4XNbNM2dSTezba2trU0tKSTzXIwd+Xb9L6na1Jx86bM3HI/O5bW1tTbgOlwj1XXF2dHUn7HZ3dQ+b9K1vccyi3tra2uJswIAKT0vqEpOPC7T+6+5ICr/e0pD9JekTBFMX1kg6W9B5JZ0oaK+kmMzvX3e/M4/ovZy4SePjhh7Vy5co8qkAufvBMraS+bxz3HeFa89SDWvNUfG2Ky6JFBU9oB+SEe65wL+yQEj9qNLe1aeHChbG1p9Jxz6EcNm/eHHcTBkRgUiJmdqqk/w13N0r6cIGX/J67X5ni+MOSrjGzD0r6iYI1VH5hZrPcna9eqtia3dLKXcnDIE7dh/HZAKpHZH1FMZILQDoEJiVgZodJulnB77dV0gXuvrGQa7r79gznf2pmx0q6VMHCj/8i6focq8k01dNkSY9K0ty5czVrFpOMldKn//ispA29+xNHNujT7zxRDdG/9INYa2tr7zeI8+bNU1NTU8wtwmDHPVdcT6/bqe8981jvvlmtzjzzjBhbVHm451BulTzihcCkyMxshqSFkvZSMAvXO4uxqGKWfqogMJGCnJOcAhN3X5vuvFnft/eNjY0aNox1NErl1R0t+suzybHs/JNmaMzIETG1KH5NTU3ccygr7rnCjRjenrTf2e38TtPgnkM5NDY2Zi4UEwKTIjKzKZL+rqDHwiW9P99E9DwtTdieWsZ6UWRXP/BS0nz/TfU1es/c/WJsEYDBrLW1Vdu3b1dzc7O6uoo3s31HW6e+cHLyhJHPP/980a4/GHR3d2v8+PGSpDVr1qimZuj0iiN3tbW1amho0OjRozVy5MhBd78QmBSJmU2Q9DdJM8NDV7j7NWVuBqN3B4E9bZ36zcMvJR17+9HTNHZ4Q0wtAjBYubteffVV7dixoyTXr1G3po9LHprU0dGR1AM/1Ln39SJ1dXWpm7VekEZnZ6fa2tq0a9cumZmmTp2qUaNGxd2soiEwKQIzGyPpr5Jmh4c+5+4/iqEpsxO2X4mhfhTBTY+v1c7WzqRj7z9pRkytATCYbdmypV9QUldXvI8GNbWu8aOSv9Gtr+ejR1RPoFbM3z0Gp66uLrkH30O7u9atWzeoghP+BxTIzIZLul3Sa8NDX3P3b8TUnA8mbN8bUxtQgO5u16/uX5V07IxDJmnmxJExtQjAYNXe3q5Nmzb17k+aNEljx45VbW3xFnBt7+zW8vU7k47NnDJatYNs+Ekhuru7tXNn8DsaPXr0oBuag+JydzU3N2vr1q3avXt3b3By0EEHDYp7p/p/ghiZWYOC2bdOCg99392/mMd15puZh48rU5yfY2YHZLjG5ZIuC3fXh+1ClfnH8o1avaU56dilp9BbAqD4du/e3bs9fvx4jR8/vqhBiSSlGrHlDDoG8mZmGjFihKZNm6aRI4MvLd096f9zNaPHpDA3KFjYUJLukvRLMzs8Tfl2d1+RRz1HK1ib5G5JdypYaHGLgn+/Q9S3wKIUzAR2ubvvyaMexOwX972YtD97n9E6Yeb4mFoDYDDbs6fvz8To0aNLUkeqTBLiEqBwZqZx48b1BiQ7d+4s2f/jciIwKczbErZfJynTetwvSZqeZ121kl4fPgayRdKl7v7nPOtAjJ5Zt0MPr9qadOzSk2eQJAqgJNrbg6l8zaxk04fSYwKUzvDhw2Vmcvfe/8/VjsCkOtyhYH2SEyQdJWlvSeMVfBm1VdKTkv4iaYG77xzoIqhsv4zklkwa1ahzj5gSU2sADHY9sz/V1taW7AsQS9Fn4vSZAEVhZqqtrVVnZ2dRp/mOE4FJAdy9KO/k7r5A0oI05zdK+lX4wCC0fker/vxk8kRqF52wvxrqSAMDUMUYywUgB3zqASrANQ+u7reg4rvn7h9jiwCgcMQlAHJBYALErLm9U9c/vCbp2L+8dprGjWBBRQDVzcz6DedykkwADIDABIjZTY+v046WjqRj7z+ZKYIBDA7R9BXCEgADITABYtSVYkHF1x0ySbNYUBHAIBEdzjVUO0wWLFgQ9CCZafXq1XE3B6hIBCZAjG55Yp1WbU5ecuYyeksADCb0mAx63d3dWrp0qRYsWKCPfOQjOvbYY9XY2NgbiN1zzz1ZXee0007rfU2mx0ASA0Az06xZs7Kq++WXX+6doS5VALlx48be429729sGvpCk7du3J13rrrvuSlv+K1/5Sm/ZO++8M6v2DlbMygXEpL2zW9/9e/J6m4dNGa0TZrGgIoDBI8gxSQhHhmqXySB27bXXav78+XE3I6UXX3xRDzzwgE488cS05a6//vreKbRTmTRpkg4++GA999xzuv/++9Ne6/7770+61n333afXve51A5a/7777JAVTd5900klprz3YEZgAMbnxsZf18taWpGOfPPMgFlQEMKiQYxKYP39+xX54L1TihAb19fWaM2eOOjo69PTTT+d1vWOOOUa//vWvC25XU1OTWltbde2112YMTK699tqk16Qyb948Pffcc9q0aZOWL1+uQw45JGW5xECjq6urdz+Vzs5OPfTQQ5KkI444YlCs3l4IhnIBMWjt6NJVdz2fdOy1+43V6QdPiqlFAFAa5JgMfrNnz9YPfvADPfjgg9q5c6eWLFmScbhTOiNGjNDhhx+e9pGNt7zlLZKkG2+8Me3K6I8//riWLl0qSTrvvPMGLDdv3rze7UWLFg1YrufcBRdcIEl66KGH1NHRkbLs448/rj179vS7/lBFYALE4NoHX9KGnW1Jxz79xkPoLQEw6ETf14hLBp/jjjtOV1xxhY4//ng1NTXF3Zxe73jHO9TQ0KCtW7fq9ttvH7BcT2/JscceO2AviCSdcsopvdsD9YK0tLRoyZIlkqSPfexjGjZsmPbs2aPHH388ZfnE6xCYEJgAZbe7rVM/vndl0rGTD5hAbgmAQal/j8nQDE2ymZWrq6tLV199tc455xxNmTJFjY2NGj9+vE4++WR95zvfUUtLS8rXSUEC+l133aVPfepTOumkkzRhwgTV19dr7NixOvLII/WpT31Ka9asGfD1g9G4ceN09tlnS+oLPqI6Ozt1ww03SJLe9773pb3e/vvvr/3220/SwIFJT+/IqFGjdOyxx+q4445LW77nuJklBT5DFYEJUGa/un+Vtu5J7lL+1BsPjqk1AFBi5Jhk5eWXX9axxx6r+fPn6/bbb9err76q9vZ2bd26VYsXL9YnP/lJveY1r9GKFStSvv6rX/2qzjjjDH3729/WAw88oC1btqizs1M7duzQk08+qW9/+9s69NBDdfPNN5f5J4tXT7Bx++23a+vWrf3OL1y4UBs2bFBdXZ3e+c53ZrxeT6/GSy+9pJdffrnf+Z5hXMcff7xqa2t18sknJx1P5O69ifSHHnqoJkyYkOVPNXgRmABltL25XT9f9GLSsTfM3ltH7js2ngYBQImRY5LZ1q1bddZZZ+nJJ59UY2Oj/vVf/1W///3v9eijj+ruu+/Wf/zHf2j48OF64YUXdNZZZ2nHjh39rtHZ2al99tlHH/nIR3Tttddq8eLFWrJkif70pz/pM5/5jEaOHKnm5ma9+93v1rJly2L4KbO3fPlyzZ07V2PHjlVTU5OmTZum8847T9dcc82AuRoDOfvsszVu3Di1t7frxhtv7He+pyflTW96kyZOnJjxepnyTHp6QHoCkp7nxYsX9+stXLZsmbZs2dLvukMZgQlQRj+590Xtauvs3TcLZuICgMGqf44JkUnUZz/7Wa1bt07777+/li1bpquuukpvf/vbdcwxx+i0007T17/+dd1///0aMWKEXnzxRX3zm9/sd43LLrtML730kn70ox/pve99r0488US99rWv1XnnnadvfOMbWrZsmaZOnarW1lZ9/etfj+GnzN6GDRv0yCOPaMeOHWpra9O6det066236uKLL9aRRx6ZU2DV0NCgd7zjHZL6D+fatWuXbrnlFknSRRddlNX10uWZJM6w1VPuxBNPVE1NjbZu3apnn302qTz5Jf0xXTBQJht3tWrBA8mrvJ/7mik6ZPLQnhoQQOXq7nZtax54NqNs7GhuV3NHV+/+8Praih3PtdfwBtXUlHcSktWrV/cOr/rBD36gGTNSL7J71FFH6aMf/ai++c1vasGCBfra176WdH769Olp65k2bZo+/elP6+Mf/7huvfVWuXvFTbhSU1OjM844Q29+85t1xBFHaPz48dq1a5cef/xx/fSnP9WyZcu0dOlSnX766XrkkUd68z0yed/73qcf//jHeuCBB/Tiiy9q5syZkqQ//OEPamlp0ZgxY3Tuuedmda1DDjlEkyZN0saNG/sFJj0zbNXX12vu3LmSpNGjR2vOnDl68skndd999yXNKEZg0h+BCVAmP7rrBbV29C24VFtj+sQb6C0BULm2Nbfr6P/+e9zNKJslX3y9xo9sLGudd9xxh7q6ujR8+HCdddZZacvOmzdP3/zmN/XKK69ozZo1aT+Y79y5U1u2bFFzc3PvEKLhw4f3nlu1alXvB/RK8cc//lFjx47td/yUU07RRz7yEX3gAx/Q1VdfrQ0bNujjH/+4/vjHP2Z13RNOOEEHHHCAXnjhBV133XX60pe+JKmvB+WCCy7IaTaxU045RTfddJOWLVumzZs39+aG9AztOuqoo3p/11IwnOvJJ5/UokWL9OEPf7j3eE9gMnPmTE2dOjXr+gczhnIBZbB2W7N+80jybCgXHD1NMyaMiKlFAIBK8Nhjj0mSmpub1dDQ0DtzV6rHOeec0/u69evX97vWSy+9pCuuuELTp0/XmDFjNHPmTB1++OGaM2eO5syZo8svv7y37ObNm0v/w+UoVVDSo76+Xr/4xS908MHBZDE333yz1q1bl/W1e5Lgr7vuOknBZAP33HOPpOyHcfXoGaaVmLwu9QUa0dm1evYTe0jWrFnTO0sas3H1ITAByuAH/3heHV19Yxcaamt0xRkHxtgiAEAl2LhxY16va25uTtq/8847NXv2bP3whz/USy+9lPH16aYerlR1dXW69NJLe/fvvfferF/73ve+V5L0/PPP66GHHtJ1110nd9f06dN7E9SzlTjsqifYSAxSotfr2V+3bp1WrVqV9Lro9YY6hnIBJbZy0279YcnapGPvnrufpo4dFlOLAACVoqsryL8ZP3687rrrLtXUZPedcWIuyubNm/Xud79bzc3NGjlypD71qU/pjW98o2bNmqUxY8aooaFBknTXXXfpjDPOkFS968nMnj27dzuXHpOZM2fqpJNO0uLFi3Xttdfq7rvvlhQELLnm2hxxxBEaM2aMduzY0Tt869lnn+2djjgamEydOlXTp0/X6tWrtWjRIs2YMYPAZAAEJkCJfWfhCnUnvP8Pq6/VR08/IL4GAUCW9hreoCVffH1B11i7rVk7W/tmI5wwslGTRpU3jyNbew1vKHud48cHi+vu3r1bhx56qOrr63O+xh/+8Adt375dUjDE6fWvT/1vlmodj2pTSML+RRddpMWLF+tXv/qVWltbJWVeVDGVmpoanXTSSbrjjjv0z3/+U7t37+4NNA455JCU65GcfPLJWr16te677z5dfPHFvQHNlClTdMABfCboQWAClNA9z23U7U+/mnTskpOma2KF/lEGgEQ1NVZwMvietq6kD5N7Da8ve4J5JTvqqKN0ww03qK2tTY899phOOOGEnK/RMw3tuHHjBgxKpL58lmq2dOnS3u0pU6bk9NoLL7xQ//Zv/9YblMydO1cHHZTfJDSnnHJK78QFDz74YL/1S6JOPvlkXXfddbrvvvu0efNmLV++vPc66EOOCVAize2d+uKfnkk6NrqpTh+cNyumFgFA+UW/4K7OAUSlc8455/QG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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "ti.plot_power_curve()" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "4667fd39-4a28-4b20-87eb-d0e0fc94cdb5", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAwwAAAJECAYAAAC7A6POAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAB7CAAAewgFu0HU+AACOJElEQVR4nOzdd5xU5dn/8c+1vbHALk3pRUAQK4ICIsYWe4o1RUWNMSY+Gk19kicxzST6M0aTaIwxdo2aRGOPsYKIiIgovSMdlqVsr/fvjzm7OzM7s3Xaznzfr9e85pz73Oeca+GwzDV3M+ccIiIiIiIioaTFOwAREREREUlcShhERERERCQsJQwiIiIiIhKWEgYREREREQlLCYOIiIiIiISlhEFERERERMJSwiAiIiIiImEpYRARERERkbCUMIiIiIiISFhKGEREREREJCwlDCIiIiIiEpYSBhERERERCUsJg4iIiIiIhKWEQUREREREwlLCICIiIiIiYSlhEBERERGRsJQwiIiIiIhIWEoYREREREQkLCUMIiIiIiISlhIGEREREREJSwkDYGbDzex2M1tpZhVmVmpmC83su2aW181rX25mroOvyyP0I4mIiIiIRERGvAOINzM7B3gUKPQrzgMme6+rzOws59zaeMQnIiIiIhJPKZ0wmNlRwJNALlAO/Bp409u/GPgaMBZ40cwmO+fKunnL04FtbRzf0s3ri4iIiIhEVEonDMCd+JKDeuA059x8v2NvmNka4FZ8ScNNwM3dvN9q59zGbl5DRERERCRmUnYMg5lNAU7wdu8PShaa3A6s8LavN7PMmAQnIiIiIpIgUjZhAD7nt/1AqArOuUbgYW+3D3BSdEMSEREREUksqZwwzPDeK4BFbdR72297evTCERERERFJPKmcMBzqva91ztW3UW9liHO66gEz22ZmtWZWYmbvmdkvzWxwN68rIiIiIhIVKTno2cxygH7ebpszEznn9ppZBZAPDO3mrWf5bRd7r6nATWZ2g3Pu3q5c1MyGtFMlCxgP7AJ2Aw1duY+IiIiIREU60N/b/sQ5VxPPYIKlZMIA9PLbLu9A/aaEoaCL91sP/AuYD2z2ykYBXwTOB3KAP5uZc879pQvX39x+FRERERHpAY4FPoh3EP5SNWHI8duu7UD9piwvtwv3egZ4yDnngsoXAk+a2dn4kolM4A4ze845t6ML9xERERERibhUTRiq/bazOlA/23uv6uyNnHP72zn+gpn9HPgFvhWmrwR+1cnbtNdVajDwHsB///tfhg8f3snLi3RMTU0NCxYsAGDq1KlkZ2e3c4ZI1+hZk1jQcyaxsmnTJk499dSm3d3xjCWUVE0Y/Fds7kg3o3zvvSPdl7riL8DPAQNOpJMJg3OuzXEYZta8PXz4cA455JAuhCjSvqqqKtatWwfA6NGjyc3tSqOcSPv0rEks6DmTOEm4saYpOUuSc64a2OPttjlg2Mz60pIwRGWsgHNul188mjFJRERERBJGSiYMnuXe+xgza6ulZbzf9oqwtboveIyDiIiIiEjcpXLC8I73ng8c00a9E/2250UjEDPrT8s0r9uicQ8RERERka5I5YThWb/t2aEqmFkacKm3uw94M0qxXI1v/AIEriwtIiIiIhJXKZswOOfeB+Z6u1ea2fEhqt1Ey+rOdzrn6vwPmtksM3Pe68Hgk81shJkd1VYc3rSqP/F2q4AHOvFjiIiIiIhEVarOktTkenzdjHKBV83sFnytCLnAxfi++QdYDdzeheuPAN40s/nA88ASfKstg2/htvO9V1Prwnecc1u7cB8RERERkahI6YTBObfYzC4CHgUKgVtCVFsNnOWcKwtxrKOO917hVALf7uIqzyIiIiIiUZPSCQOAc+55MzscX2vDWfimWa0F1gJPA390zlV28fKLgK/gSxYmAwfhG9ycAewFlgGvA3/1plYVEREREUkoKZ8wADjnNgE3eq/OnPcWLd2JQh0vAx7zXiIiIiIiPU7KDnoWEREREZH2qYVBREQkAdXW1lJeXk5FRQW1tbU0NjbGO6SU09jYSHFxMQCffvopaWn6nlVCS09PJycnh8LCQvLz8zEL2wGlR1LCICIikkCcc5SUlFBSUhLvUFKec47c3FwAGhoalLRJWPX19dTU1LB//35yc3MZNmxYUiWYShhEREQSyPbt29m/f39AmZmRnp4ep4hSW9M3xRkZ+sgk4TU0NOCcA6CqqopPP/2U4cOHJ01Lg55+ERGRBFFdXR2QLBQXF1NYWEh2dnbSfPDoSRobGzlw4AAAhYWFSfWNsURWY2Mj5eXl7Nixg4aGBqqqqqioqKCgoCDeoUWEnnwREZEEsW/fvubtAQMGMGDAAHJycpQsiCS4tLQ0CgsLGTRoUHNZWVl3lvBKLEoYREREEkRlZcuyP3369IlfICLSJQUFBc0JflVVVZyjiRwlDCIiIgmioaEB8PWX15gFkZ4nLS2t+d9u07/nZKCEQUREREREwlLCICIiIiIiYSlhEBERERGRsJQwiIiIiIhIWEoYREREREQkLCUMIiIikrIefPBBzAwzY+PGjfEORyQhKWEQERERSUKNjY0sX76cBx98kGuvvZZjjz22edVwM+Ott97q0HVmzZrVfE57r3D8EzMzY/To0R269+bNm0lPTw841z+x27VrV3P5F77whTavtW/fvoBrvfHGG23W/9nPftZc9+WXX+5QvMkqI94BiIiIiEjkPfLII1x++eXxDiOk9evX8+677zJt2rQ26z322GM0NjaGPT5gwADGjRvHqlWreOedd9q81jvvvBNwrblz5/KZz3wmbP25c+cCkJ6ezvTp09u8drJTwiAiIiIp6/LLL0/YD9Xd5Zxr3s7MzGTSpEnU1dXxySefdOl6kydP5oEHHuh2XDk5OVRXV/PII4+0mzA88sgjAeeEMnPmTFatWsXu3btZuXIl48ePD1nPPwFoaGho3g+lvr6e9957D4AjjjiCwsLCdn+uZKYuSSIiIiJJaMKECdx1113Mnz+fAwcOsGjRona77bQlPz+fww47rM1XR5x77rkAPPXUU9TW1oat9+GHH7J8+XIAzjvvvLD1Zs6c2bw9Z86csPWajl1wwQUAvPfee9TV1YW9d0VFRavrpyolDCIiIiJJaMqUKVx33XUcd9xx5OTkxDucZhdddBFZWVmUlpby4osvhq3X1Lpw7LHHhm01ADjhhBOat8O1GlRVVbFo0SIArr/+enJzc6moqODDDz8MWd//OkoYlDCIiIhICuvILEkNDQ089NBDnH322Rx88MFkZ2dTXFzMjBkz+N3vfkdVVVXY6zc2NvLGG2/wne98h+nTp9OvXz8yMzPp06cPRx55JN/5znf49NNPo/TTJaaioiLOOussoCUpCFZfX88TTzwBwFe/+tU2rzd8+HCGDRsGhE8YmloTevXqxbHHHsuUKVParN9UbmYBCUmqUsIgIiIiEsbmzZuZNWsWV1xxBS+++CLbt2+ntraW0tJS5s2bx0033cThhx/O6tWrQ57/85//nJNPPpnbb7+dd999lz179lBfX8/+/ftZsmQJt99+O4ceeijPPPNMjH+y+GpKAl588UVKS0tb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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "ti.plot_Cp_curve()" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "722be425-9231-451a-bd84-7824db6a5098", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAwwAAAJECAYAAAC7A6POAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAB7CAAAewgFu0HU+AACKI0lEQVR4nO3dd3gc5bn38e+t3iy5F7nb4Aam92JMICR0UoBUSiA9HBIgySHJOSGNnJCXJIQkhDRqOoQWCAFCMcU003EDXLAtyV2yJKtY0vP+MbPS7mh31bZp9/e5rr2mPTPzSIzF3PuU25xziIiIiIiIRJOX7gqIiIiIiEjmUsAgIiIiIiIxKWAQEREREZGYFDCIiIiIiEhMChhERERERCQmBQwiIiIiIhKTAgYREREREYlJAYOIiIiIiMSkgEFERERERGJSwCAiIiIiIjEpYBARERERkZgUMIiIiIiISEwKGEREREREJCYFDCIiIiIiEpMCBhERERERiUkBg4iIiIiIxKSAQUREREREYipIdwUk+cysGFjob24FOtNYHRERERGJlA+M89dfd861pbMyQQoYcsNC4IV0V0JERERE+nQo8GK6KxFOXZJERERERCQmtTDkhq2hlSVLljBz5sx01kWyWEtLC0uWLAFg0aJFlJaWprlGkq30rEkq6DmTVFm7di2LFi0KbW6NVzYdFDDkhu4xCxMnTmTKlCnprItksZaWFsaOHQvAlClT9D9XSRo9a5IKes4kVVpaWsI3M26sqbokiYiIiIhITAoYREREREQkJgUMIiIiIiISkwIGERERERGJSQGDiIiIiIjEpIBBRERERERiUsAgIiIiIiIxKWAQEREREZGYFDCIiIiIiEhMChhERERERCSmgnRXQERERHprb2+nqamJ5uZm2tvb6erqSneVck5XVxdjxowB4N133yUvT9+zSnT5+fmUlJRQWVlJeXk5ZpbuKiWUAgYREZEM4pxj27ZtbNu2Ld1VyXnOOUpLSwHo7OxU0CYxdXR00NbWRkNDA6WlpUybNi2rAkwFDCIiIhmktraWhoaGiH1mRn5+fppqlNtC3xQXFOiVSWLr7OzEOQdAS0sL7777LtOnT8+algY9/SIiIhmitbU1IlgYM2YMlZWVFBcXZ82Lx3DS1dXFrl27AKisrMyqb4wlsbq6umhqaqKuro7Ozk5aWlpobm6moqIi3VVLCD35IiIiGaK+vr57ffz48YwfP56SkhIFCyIZLi8vj8rKSiZOnNi9r7GxMY01SiwFDCIiIhli9+7d3esjR45MX0VEZFAqKiq6A/yWlpY01yZxFDCIiIhkiM7OTsDrL68xCyLDT15eXve/3dC/52yggEFERERERGJSwCAiIiIiIjEpYBARERERkZgUMIiIiIiISEwKGEREREREJCYFDCIiIpKzbr75ZswMM2PdunXpro5IRlLAICIiIpKFurq6WL58OTfffDNf+MIXOPTQQ7uzhpsZjz/+eL+us3jx4u5z+vrEEh6YmRmzZ8/u1703bNhAfn5+xLnhgd2WLVu693/wgx+Me636+vqIaz366KNxy3/nO9/pLvuvf/2rX/XNVgXproCIiIiIJN5tt93GBRdckO5qRLVmzRqeeeYZjjrqqLjl/vjHP9LV1RXz+Pjx45k7dy6rVq3iqaeeinutp556KuJaTz75JO95z3tiln/yyScByM/P5+ijj4577WyngEFERERy1gUXXJCxL9VD5ZzrXi8sLGThwoXs2bOH119/fVDXO+SQQ7jpppuGXK+SkhJaW1u57bbb+gwYbrvttohzolm0aBGrVq1i69atrFy5knnz5kUtFx4AdHZ2dm9H09HRwbPPPgvA/vvvT2VlZZ8/VzZTlyQRERGRLLRgwQJ+/vOfs3TpUnbt2sWyZcv67LYTT3l5Ofvuu2/cT3+cccYZAPztb3+jvb09ZrmXXnqJ5cuXA3DmmWfGLLdo0aLu9SVLlsQsFzp29tlnA/Dss8+yZ8+emPdubm7udf1cpYBBREREJAsddthhXHLJJRxxxBGUlJSkuzrdzj33XIqKitixYwf3339/zHKh1oVDDz00ZqsBwLHHHtu9HqvVoKWlhWXLlgFw6aWXUlpaSnNzMy+99FLU8uHXUcCggEFERERyWH9mSers7OSWW27htNNOo7q6muLiYsaMGcMxxxzDT37yE1paWmJev6uri0cffZQrrriCo48+mrFjx1JYWMjIkSM54IADuOKKK3j33XeT9NNlptGjR3PqqacCPUFBUEdHB3/+858B+OQnPxn3etOnT2fatGlA7IAh1JowYsQIDj30UA477LC45UP7zSwiIMlVChhEREREYtiwYQOLFy/mU5/6FPfffz+1tbW0t7ezY8cOnn76aS6//HL2228/Vq9eHfX87373u5xwwglce+21PPPMM2zfvp2Ojg4aGhp49dVXufbaa5k/fz533XVXin+y9AoFAffffz87duzodfyhhx5i8+bNFBQU8JGPfKTP64VaAdavX8+GDRt6HQ91RzriiCPIz8/nmGOOidgfzjnXPYB6/vz5jB07tp8/VfZSwCAiIiISxfbt2zn55JN54403KC4u5ktf+hJ///vfeeGFF3jssce48sorKSsr4+233+bkk0+moaGh1zU6OjqYNGkSX/jCF7jtttt4+umnWbZsGXfffTdf+9rXqKioYPfu3XzsYx9jxYoVafgp+2/lypUcfvjhjBw5kpKSEqZMmcKZZ57JrbfeGnMsQCynnnoqo0ePpr29nb/97W+9jodaHt7//vczbty4Pq/X1ziGUItBKFAILZ9++umIweEAK1asYPv27b2um8s0S5KIiMgw0tXl2Lk79kDRbDSqrIi8vNhz/CfLpZdeyqZNm5g6dSqPPfZYr9wBixcv5uyzz+bYY49lzZo1XHPNNfzgBz+IKHPxxRfz7W9/m8LCwoj9Bx10EGeeeWb3GINNmzZx9dVXx+yikwk2b97M5s2bu7c3bdrEpk2buPfee/nRj37EHXfcwfz58/t1raKiIs4991xuuOEGbrvtNj73uc91H2tsbOSee+4B4LzzzuvX9YLjGD7+8Y93b4fPeBQqd9RRR5GXl8eOHTt48803IwZsa/xCbwoYREREhpGdu9s5+PuPpLsaKbXsWycypqI4pfdct25d9zff11xzDTNnzoxa7sADD+SLX/wi11xzDTfffHOvgGHGjBlx7zNlyhS++tWv8uUvf5l7770X51zcBGjpkJeXxwknnMApp5zC/vvvz5gxY2hsbOSll17ixhtvZMWKFSxfvpzjjz+e559/vns8QV8++clPcsMNN/DMM8+wZs0aZs2aBcAdd9xBS0sLVVVVnH766f261rx58xg/fjxbtmzpNS4hNONRYWEhhx9+OACVlZUsXLiQV199lSeffFIBQx/UJUlEREQk4P7776ezs5OysjLe+973xi0beqmsqanpcwDzrl27WLt2LW+++SZvvPEGb7zxBmVlZRHHMs0//vEPHnnkES677DJOOOEEDjjgAI499lguvfRSXn31Vc4//3zAa4H48pe/3O/rHnnkkey1114A3H777d37Q60sZ5999oBmdwq1HqxY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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "ti.plot_Ct_curve()" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "edf8e153-b756-4b0d-aba8-e82a39f18c89", + "metadata": {}, + "source": [ + "## Compare multiple turbines\n", + "\n", + "The other class provided by the turbine library is the `TurbineLibrary` object, which allows users\n", + "to simultaneously load internal and external turbine library configurations and compare them.\n", + "\n", + "Note that turbine names can overlap between the internal and external turbine libraries in this\n", + "interface, so a little more care is required. This is distinct from how turbine inputs are\n", + "treated through `FlorisInterface` via `floris.simulation.farm` where duplicate turbine names\n", + "will raise an error.\n", + "\n", + "### Loading the libraries\n", + "\n", + "Loading a turbine library is either a 2 or more step process depending on how many turbine libraries\n", + "are going to be compared." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "52c74e32-c93c-449e-90f2-4ed5b2bf0f72", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "iea_15MW\n", + "iea_10MW\n", + "nrel_5MW\n" + ] + } + ], + "source": [ + "# Initialize the turbine library (no definitions required!)\n", + "tl = TurbineLibrary()\n", + "\n", + "# Load the internal library, except the 20 MW turbine\n", + "tl.load_internal_library(exclude=[\"x_20MW.yaml\"])\n", + "for turbine in tl.turbine_map:\n", + " print(turbine)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "533c277e-c181-42a1-b5dd-d76dc5d3bb5e", + "metadata": {}, + "source": [ + "In addition to the `load_internal_library` method, there is a `load_external_library` method with\n", + "the same parameterizations, but with an argument for a new library file path.\n", + "\n", + "We can also override previously ignored or loaded files by rerunning the load method again. Notice\n", + "how we use `which=[\"x_20MW.yaml\"]` to now include the file. This makes it so we only load the one\n", + "turbine configuration, however, the same could be achieved by specifying none of the keyword\n", + "arguments." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "47026e36-ee3a-4b40-8c8f-e787463be596", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "iea_15MW\n", + "iea_10MW\n", + "nrel_5MW\n", + "x_20MW\n" + ] + } + ], + "source": [ + "tl.load_internal_library(which=[\"x_20MW.yaml\"])\n", + "for turbine in tl.turbine_map:\n", + " print(turbine)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "bac88742-33af-44f3-a35b-e178e60a49d3", + "metadata": {}, + "source": [ + "Notice that the \"x_20MW\" turbine is now loaded.\n", + "\n", + "### Comparing turbines\n", + "\n", + "There are a number of methods that will plot the varying properties for each turbine against each\n", + "other, but here the primary output will be displayed." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "14008ddc-35be-4ac7-8371-f17cbf2f9ac3", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABWQAAASbCAYAAAARPrbJAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAB7CAAAewgFu0HU+AAEAAElEQVR4nOzdd5xU5dn/8c+1fWkuVXqRIooFUEGXIjZQjImxSzBqgkl+lqgxlhgb0cdYEh9bYow+ir0bTayAoghYUMSGRqRIF5bOsn2u3x9ndrawy/Y5W77v12tec8597nPONcPZZfaa+1y3uTsiIiIiIiIiIiIi0vASwg5AREREREREREREpKVQQlZEREREREREREQkTpSQFREREREREREREYkTJWRFRERERERERERE4kQJWREREREREREREZE4UUJWREREREREREREJE6UkBURERERERERERGJEyVkRUREREREREREROJECVkRERERERERERGROFFCVkRERERERERERCROlJAVERERERERERERiRMlZEVERERERERERETiRAlZERERERERERERkThRQlZEREREREREREQkTpSQFREREREREREREYkTJWRFRERERERERERE4kQJWREREREREREREZE4UUJWREREREREREREJE6UkBURERERERERERGJEyVkRUREREREREREROKkRSVkzayHmV1iZtPNbIWZ5ZvZOjN7wcxGVtD/BjPz3Tz6hvAyRERERKSZMbM0M7vDzGab2Rozy41+Tp1rZueaWXIF+7SL7vO9meWZ2XIzu93M2lRyjgQzu8jMvjCzHDPbYGZPmdleDf8KRURERKSYuXvYMcSNmd0CXAksAd4BNgADgRMBAya5+zOl+t8AXA88Aiyv4JB3uvuWBgxZRERERFoAM+sErAQ+Ar4l+JzaHjgO6ANMB45z90i0f2tgDjA0uu1TYBgwHpgPjHX33HLneACYAnwFvAp0B04DdgCHuvviBn2RIiIiIgJAUtgBxNlHwDh3f7d0o5mNAd4C7jOzl9w9r9x+09z9nTjFKCIiIiItzyZgD3fPL91oZknADIJE63EEiVSAKwiSsbe6+1Wl+hcPQLgU+HOp9iMIkrGzgWOKz2NmTwKvAfcCExrihYmIiIhIWS2qZIG7v1g+GRttfw+YRTAKYf+4ByYiIiIiLZq7R8onY6PthcC/oqsDAMzMCJKrO4Aby+1yY7R9Srn286LP15Y+j7u/TnDn2Hgz613HlyEiIiIi1dDSRsjuTkH0ubCCbWOjNWYjwGJgprvvqM1JzKxnFV1SgMHAeoJb1Ypqcx4RERGRECUCnaPLX1Rw95FUk5klAMdGV7+MPg8kKDfwprtnl+7v7tlmNheYYGa93H1ldNM4IBuYW8Fp3oxuPxx4rAax6XOtiIiINHcN8rlWCVkgOhrgaGAt8EUFXaaWW99iZhe7+6O1ON3KqruIiIiINBuHAB+HHURTYWYpwNUE8xt0BI4iSGo+7O5vRbsNjD5XVvN1MUH5gYHAymi92W7Al+5eUVK0+DgDK9i2O/pcKyIiIi1JvX2ubfEJ2eiMtY8BqcCV5T6kfgb8guA2rrVAV+BHwJ+AaWa2xd3/Hd+IRURERKQZSyGYVLaYA38B/lCqbY/o89ZKjrGtXL+a9hcRERGRBtSiE7LRW8CmAWOBB9y9zC1a7v6vcrssB+41s68JJle4CahpQrZXFdt7AB8AzJgxgz59+tTw8FIbeXl5fPjhhwCMHDmS1NTUkCNqGfS+h0Pvezj0vodD73s4vv/+e4455pji1Q1hxtLURMtiWfRzanfgBOBm4DAzm+ju23Z7gPiq9ufa2bNn07Vr14aPSERERKQerVu3jrFjxxav1tvn2habkI1+yH0ImAQ8Dvymuvu6+1tmtgTY38za1eSDsbuvqiKu2HKfPn0YOLCmd45JbeTk5LBkyRIA+vfvT3p6esgRtQx638Oh9z0cet/Dofe9UVDd0Fpw9wiwCrjPzLKAZ4E/AldSMtK1shGt7aLPW8s9V7d/dWOs9ufafv360bNnVSVnRURERBqXcn8/1Nvn2oT6OlBTEk3GPgycDTwFnBP90FsTWdHnVvUZm4iIiIhIOdOjz+Oiz1XVfC1TYzY68ddaoJ+ZJVbVX0REREQaVotLyJZKxv4ceAY4q5LJDXZ3jNbAEIKZarOq6C4iIiIiUhfdo88F0efFwBpgVPRzaUx0fRSwzN1LT7r1LlC8rbwJ0efZ9RaxiIiIiFSqRSVkS5Up+DnwHDC5smSsmbU1s0EVtKcDDwBtgWfdvbABQxYRERGRFsDM9jWzXe68irbdEV19DcDdHXgQaANcW26Xa6PtD5Rr/2f0+UYzSyl1/OMIRt5Od/fv6/gyRERERKQaWloN2esIyhTsAL4Frild2yrqJXdfCHQEvjGz+cDXwDpgT+BooCfwBXB5fMIWERERkWbuNOB3ZjaHYCLZbQSTYh1H8Ln0PeB/S/W/DfgJcKWZDQMWAMOB8cB84M7SB3f3WWb2IDAFWGBmrwLdgNOBTcBFDfXCRERERKSslpaQ7Rt9bkMwKUJFlgMLCT6Y/h0YAUwE2gM5BMnZu4F73T2n4ULdPXcnKyuL7OxsCgoKqt5BdisSidCxY0cAVqxYQUJC8x08npycTOvWrenUqRMVfCEhIiIi4XiFoDRBJnAYwefVrcDnwNPAQ6XvzHL3bDM7HLgBOBk4gqBO7F+BqZV8Tv01waCCXwEXEwxS+BfwR3df0jAvS0RERETKa1EJWXc/Bzinmn23ARc2ZDy15e788MMPbN68OexQmg13j82cV1RURCRS0znemo7CwkJycnIoKipizz33VFJWRESkEXD3j4GPa7jPVuDS6KM6/SMEAwvurnGAIiIiIlJvWlRCtrnIysoqk4xNTExUUq0eFL+HSUnN98fC3SkqCsomb968mcTERDp37hxyVCIiIiIiIiIiLUfzzTw1Y9nZ2bHlbt26kZGREV4wzUQkEmHbtm0AtGvXrlmXLNiyZQtr164FgmtJCVkRERERERERkfhpvlmnZqy4ZmxiYqKSsVJjGRkZJCYmAkH5AhERERERERERiR8lZJswlSmQ2iq+dtw95EhERERERERERFoWJWRFRERERERERERE4kQJWREREREREREREZE4UUJWREREREREREREJE6UkJVGZ9q0aZgZy5cvDzsUERERERERERGReqWErEgFnnnmGSZPnszAgQMxM8aNG1dhv3feeQczq/DxwQcflOnbt29fzIyjjz66wmM98MADsX0//vhjAG677TbMjE8//bRMX3enffv2mBnLli0rsy03N5fU1FQmTZpUy1cvIiIiIiIiIiINJSnsAETKO+usszjjjDNITU0NLYb77ruPTz75hEMOOYSNGzdW2f+3v/0thxxySJm2AQMG7NIvLS2NWbNmsW7dOrp27Vpm2xNPPEFaWhq5ubmxttGjRwMwZ84chg0bFmv/6quv2LJlC0lJScydO5d+/frFts2fP5/8/PzYviIiIiIiIiIi0nhohKw0OomJiaSlpWFmocXw2GOPsXXrVt5++226d+9eZf8xY8YwefLkMo9OnTrt0m/UqFG0adOGZ555pkz7qlWreO+99zj++OPLtB988MGkpaUxZ86cMu1z586lY8eOHHXUUbtsK15XQlZEREREREREpPFRQlYanYpqyL7++uuMGTOG1q1b07ZtW44//ni++uqrMvt9/vnnnHPOOey1116kpaXRtWtXfvGLX1RrhGt5vXr1IiGhZj8e27dvp7CwcLd90tLSOOmkk3jyySfLtD/11FO0b9+eCRMmlGlPSUnhkEMOYe7cuWXa586dy2GHHcaoUaMq3JaRkcF+++1Xo/hFRERERERERKThKSErjd5jjz3G8ccfT5s2bbj11lu59tprWbRoEaNHjy6TtJ0xYwZLly7l3HPP5Z577uGMM87g6aefZuLEibh7g8Z47rnn0q5dO9LS0jjiiCNiNWArMmnSJD766COWLFkSa3vyySc55ZRTSE5O3qX/6NGjWb16dZnXOnfuXDIzM8nMzIyVL4Cgtuy8efM47LDDapxQFhERERERERGRhqcass3MCffMYcP2vLDDAKBz21T+c1HdbpvfsWMHv/3tb5kyZQr//Oc/Y+1nn302e++9NzfffHOs/fzzz+eyyy4rs/+hhx7KmWeeyZw5cxgzZkydYqlISkoKJ598MhMnTqRTp04sWrSIv/zlL4wZM4Z58+aVqfta7Mgjj6Rr16489dRTXHPNNXz99dcsXLiQu+66i6VLl+7Sv3Qd2b59+7Ju3TqWLl3KqFGjGD58OAkJCcybN4+JEyeyaNEiNm/erHIFIiIiIiIiIiKNlBKyzcyG7Xms25ZbdccmYsaMGWzZsoUzzzyTrKysWHtiYiIjR45k1qxZsbb09PTYcm5uLjt27ODQQw8FYMGCBQ2SkC0epVrsxz/+MaeccgoHHHAAf/jDH3jjjTd22ScxMZHTTjstlpB94okn6NWrF2PGjKkwIZuZmUlCQgJz5sxh8uTJzJ07l+TkZA455BDS09M54IADmDt3LhMnToyVL1BCVkRERERERESkcVJCtpnp3DY17BBi6iOWxYsXA8Go0oq0a9cutrxp0yamTp3K008/zfr168v027p1a51jqa4BAwbwk5/8hBdffJGioiISExN36TNp0iTuvvtuPvvsM5588knOOOOMSicxy8jIYMiQIbFk69y5cxk2bFgsAZ2ZmVlmW0pKCiNGjGigVyciIiIiIiIiInWhhGwzU9cSAY1NJBIBgjqyXbt23WV7UlLJJXzaaacxb948Lr/8coYOHUqbNm2IRCIce+yxsePES69evcjPzyc7O7tM0rjYyJEj6d+/P5dccgnLli1j0qRJuz3e6NGj+cc//sGWLVti9WOLZWZm8tBDD1FQUMCcOXM46KCDSEtLq/fXJCIiIiIiIiIidaeErDRq/fv3B6BLly4cffTRlfbbvHkzb731FlOnTuW6666LtRePsI23pUuXkpaWRps2bSrtc+aZZ3LTTTexzz77MHTo0N0eb/To0dx3333MnDmTTz/9lMsvvzy2LTMzk5ycHF599VWWLl3KySefXF8vQ0RERERERERE6pkSstKoTZgwgXbt2nHzzTdzxBFHkJycXGb7hg0b6Ny5c6wsgLuX2X7nnXc2aHzF5y/ts88+49///jfHHXccCQkJle47ZcqUWC3cqhTXhL3jjjsoKCgoM0K2b9++dOvWjdtuu61MXxERERERERERaXyUkJVGrV27dtx3332cddZZDB8+nDPOOIPOnTuzYsUKXn31VUaNGsW9995Lu3btGDt2LLfddhsFBQX06NGD6dOns2zZslqdd/bs2cyePRsIkq7Z2dncdNNNAIwdO5axY8cCcPrpp5Oenk5mZiZdunRh0aJF/POf/6RVq1bccsstuz1Hnz59uOGGG6oVT+/evenVqxfvv/8+ffv2pXv37mW2Z2Zm8sILL2BmjBo1qoavVkRERERERERE4kUJWWn0Jk2aRPfu3bnlllu4/fbbycvLo0ePHowZM4Zzzz031u/JJ5/koosu4m9/+xvuzvjx43n99dd3SV5Wx9tvv83UqVPLtF177bUAXH/99bGE7IknnsgTTzzBHXfcwbZt2+jcuTMnnXQS119/PQMGDKjDq97V6NGjeeqpp8qMji02atQoXnjhBQYPHkzHjh3r9bwiIiIiIiIiIlJ/rPwt3hIuM+sJrAT49ttvGThw4C59Fi9eTGFhIUlJSRVul5qLRCJs27YNCEbl7q7UQHPQWK6hnJwcpk+fDsD48eNJT08PLZaWRO97OPS+h0PvezgWL17MoEGDild7ufuqMOORcJT+XLty5Up69uwZckQiIiIiNbNq1Sp69epVvFpvn2ubd9ZJREREREREREREpBFRyQJpMYqKitiwYUOF2yKRCNu3b6d169a0a9cuzpGJiIiIiIiIiEhLoYSstBgr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20455RQuvPBCXnrpJSZPnsz06dPJysrizDPP3KVGLQQJ2aeeeor58+czevRoFixYQG5uLqNGjSI7O5tNmzbx9ddfs++++8aSs0rI1k5WThYfrfsIgJ5tejKk45CQIxKReEiwBA7ocgBzV89lU+4mVm1fRa92vcIOS0REREREZBdKyDYzWTlZrN+5Puww6uyGG27glVde4eyzz2bHjh0cfvjh/Pa3v6318Xbu3Mmpp55Keno6t9xyS5ltOTk5pKam7rJP8eRcpUsnFGvfvj3HHnssTz31FJMnT+bJJ58kMzOTPn36VHj+0nVkR48ezdy5c+nRowe9e/fG3enQoQNz585l33331YRedTTj+xlEPAIEk3mZWcgRiUi8DO08lLmrg9+hCzcsVEJWREREREQaJSVkm5lO6Z2q7hQndYklJSWFhx56iEMOOYS0tDQefvjhWifWioqKOOOMM1i0aBGvv/463bt3L7M9PT19lzqxALm5ubHtFZk0aRJnnXUWK1as4KWXXuK2226rNIb99tuPjIyMWLK1uH4sgJlx2GGHMXfuXM477zzmzp1Lr1696N27d61eb0v3xrI3YsvH9j02xEhEJN5KT+D36fpPOaH/CbvpLSIiIiIiEg4lZJuZ2pQIaKzefPNNIEiMLl68mH79+tXqOOeddx6vvPIKTzzxBEceeeQu27t168batWt3aS9uK5/ALfbjH/+Y1NRUzj77bPLy8jjttNMqjSEhIYHDDjssVo5g7ty5XH311bHtmZmZPPTQQ7HasieeeGINX6UArMtex4L1CwDYa4+9GNS+9iUuRKTp2b/T/iRYAhGPaGIvERERERFptEKZ1MvMMszsdDP7p5l9bGYrzWxH9PljM7s/uj0jjPgkfJ9//jl/+tOfOPfccxk2bBhTpkxh69atNT7O5ZdfzsMPP8z//u//cuaZZ1bYZ+jQoXz66adEIpEy7R9++CGtWrWqtG5teno6J554Iu+88w7HHHMMnTrtfkTw6NGj2bRpE//+979Zv359bIQsBAnZJUuW8Nprr5GTk6NyBbX05vI3Y8sqVyDS8rRKbsXe7fcG4LvN37E9f3vIEYmIiIiIiOwqrglZM9vfzB4EVgNPAlOA4UAPoFX0eThwXnT7ajN7wMwOiGecEq6CggLOOeccunfvzl133cW0adP44YcfuPTSS2t0nNtvv52//OUv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k6ulXIk3gvYioDOwBm8yqn+WEe/jZjYP+IMf64l4tV9X4iUZ/7s3/YGL8Uo5XIxXc3U1cDfeSOKoE7LOOWdmjwK3m9lA59zn0a5bBYfjjXh9rYxlXwC349UgPh5ohpeU/QC40zn3aan+I/D2/ZVxiFNERERERETqIXPOJToGERGpAjN7Cjgf6OqcW57YaGLPzFrgjZJ90Tl3cRy2fztwNdDeObd2L7f1P+A4oLtzbmsMwhMREREREZF6TjVkRUSkVnHObcYb5Xu+me0bh5c4GfgsBsnYnsB44BYlY0VERERERCRaKlkgIiK10b14dWg7AytiuWHnXK8YbaojcDPwYIy2JyIiIiIiIg2AShaIiNQx9b1kgYiIiIiIiEh9poSsiIiIiIiIiIiISA1RDVkRERERERERERGRGqKErIiIiIiIiIiIiEgNUUJWREREREREREREpIYoISsiIiIiIiIiIiJSQ5SQFREREREREREREakhSsiKiIiIiIiIiIiI1BAlZEVERERERERERERqiBKyIiIiIiIiIiIiIjVECVkRERERERERERGRGqKErIiIiIiIiIiIiEgNUUJWREREREREREREpIYoISsiIiIiIiIiIiJSQ5SQFREREREREREREakhSsiKiIiIiIiIiIiI1BAlZEVERERERERERERqiBKyIiIiIiIiIiIiIjVECVkRERERERERERGRGqKErIiIiIiIiIiIiEgNUUJWREREREREREREpIYoISsiIiIiIiIiIiJSQ5SQFREREREREREREakhSsiKiIiIiIiIiIiI1BAlZEVERERERERERERqiBKyIiIiIiIiIiIiIjVECVkRERERERERERGRGqKErIiIiIiIiIiIiEgNUUJWREREREREREREpIYoISsiIiIiIiIiIiJSQ5SQFREREREREREREakhSsiKiIiIiIiIiIiI1JB6m5A1swFm9o6ZbTWzHDP71MzGVWH9C8zMVXAbGb/oRURERKQhMbMOZnalmU0xs5VmVmBma83sZTMbVM46TczsbjNbYWb5ZrbczO40s6xy+gfM7HIz+8bMcs1sg5k9Z2bd4vvuRERERCRScqIDiAczOxJ4H8gDJgM7gNOB582sk3Purips7nVgXhnty/cyTBERERGRkMuBa4AlwBRgA9ADOAU4xcwmOOeeD3U2s0bAx0Bfv/9zwKHA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c84hOzublJQUBgwYQEZGBgcffDDZ2dmMHTs2XL5ACVkRERERkfhRQlZERETCWjdOS3QIYbGI5ccffwS8RGdZmjRpEn68efNmbr75ZiZPnsz69etL9Nu2bdtexxKt/fbbj5NPPplXXnmF4uJikpKS9ugzYcIE7rvvPubPn8+kSZMYP358uZOYNWvWjN69e4eTrdnZ2Rx66KHhBPSQIUNKLEtNTWXgwIFxenciIiIiIqKErIiIiITtbYmA2iYYDALwyCOP0LVr1z3qoiYn7z4VGjduHLNnz+bqq6+mb9++ZGVlEQwGGTNmTHg7NaVTp04UFBSQk5NTImkcMmjQILp3786VV17JsmXLmDBhQoXbGzZsGI888ghbt24N148NGTJkCBMnTqSwsJBZs2bRr18/0tPTY/6eRERERETEo4SsiIiI1FvdunUDoHXr1hxzzDHlTlS1ZcsWPvzwQ26++WZuuOGGcPvixYtrJM7Sli5dSnp6OllZWeX2Ofvss7nllls44IAD6Nu3b4XbGzZsGA8//DAffPABX331FVdffXV42ZAhQ8jNzeXtt99m6dKlnH766bF6GyIiIiIiUgYlZEVERKTeGj16NI0bN+buu+/m+OOPJy2tZBmEDRs20Lp163BZAOdcieX33HNPXOMLvX6k+fPn88Ybb3DccceVm0AGuOiii8K1cCsTqgl79913U1hYWGKEbJcuXWjXrh133HFHib4iIiIiIhIfSsiKiIhIvdWkSRPuuusuLrnkEvr378/48eNp3bo1K1eu5O2332bo0KE88MADNGnShBEjRnDHHXdQWFhIhw4dmDJlCsuWLavW686YMYMZM2YAXtI1JyeHW265BYARI0YwYsQIAM466ywyMjIYMmQI++yzDwsXLuSxxx4jMzOT2267rcLX2Hfffbnpppuiiqdz58506tSJTz75hC5dutC+ffsSy4cMGcLLL7+MmTF06NAqvlsREREREakKJWRFRESkXjvzzDNp164d999/P3feeSf5+fl06NCB4cOHc+GFF4b7TZo0icsvv5wHH3wQ5xyjRo3i3Xff3SN5GY2PPvqIm2++uUTbX//6VwBuvPHGcEL2lFNO4dlnn+Xuu+9m+/bttG7dmtNOO40bb7yR/fbbby/e9Z6GDRvGc889V2J0bMjQoUN5+eWX6dWrFy1btozp64qIiIiISElW+tI8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d7bfzEo/Xbar8hIfZa77Sl33qqHrnhy67smh654cuu7JUea65ycrDkmsSv57mp/wQGoYvS9JrNRmJFZqMxIrtZldivukp7V1yILiX/4r+pW/CRX3DoiljtLlRERERESqq3h8PhYRERGROKitCdkKx3cNJy1oRMVjwxabD0TLq6NM3VU7pZ+IiIiISOzi8flYREREROKgtiZkR4ePx5az77gyZcrl7jnABKCHmXUsvc+Cvtw/AbYCmjVYRERERKq7Pf58LCIiIiLxUVsTsp8S9HA938z6Fm80s0zgVoKxzJ4vtb2tmfUM95f2dPh4n+04oMZVQGfgxTBxKyIiIiJSncX0+VhEREREEqdWTurl7oVmdgXwITDGzF4BNgNnAB2BG919YalD7gMuBi4Fniu1/V/AOcB5wD5mNhroCvwMWAD8IbGvRERERERkz+3G52MRERERSZDa2kMWd/8cGASMJUiqDgNWAee6+/2VrCMKnArcCbQCfg0MBJ4FDnP3NfGPXEREREQk/uLx+VhERERE9lyt7CFbzN0nACdUotwlwCUV7MsD7goXEREREZEaq7Kfj0VEREQkcczdkx2DiIiIiIiIiIiISJ1Qa4csEBEREREREREREalulJAVERERERERERERqSJKyIqIiIiIiIiIiIhUESVkRURERERERERERKqIErIiIiIiIiIiIiIiVUQJWREREREREREREZEqooSsiIiIiIiIiIiISBVRQlZERERERERERESkiighKyIiIiIiIiIiIlJFlJAVERERERERERERqSJKyIqIiIiIiOwGM+tkZm5mzyU7Ftk1/b0kVmozUhOYWZqZnWFm/zKzH8xsi5ltNrOvzWyYmaXs5NgLzGyCmW01s/Vm9o6ZHVROueJ/C25mK80stYL69i1VbmGp7beE226p4LjJ4f4nK9j/33D/0bu8IDWEErLViJn1N7P3zGxD+I9hvJmdney4ajMzW1jqzaLsMirZ8dVkZvZzM3vKzL4xs7zwml6yk/JNzOwBM1sUll9oZv9nZo2qMOwaL5brbmZ37qT9u5l1qtroay4za2dmN5jZR2a22Mzyww8qb5jZgAqOUZvfQ7Fed7X5+DCz+mHbHWNmy80sN7zuY83sUjNLK+cYtXeRcsT6vmRmQ0rt+2Yn9Z5Q3mdaM3sy3HZuOcdEzGxdJb8wd9n9Vy3lMbPB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ErIiIiIiIiIiIiIiMaKErIiIiIiIiIiIiEiMKCErIiIircrMmTMxxrBp06Z4hyIiIiIiIrIfJWRFREREouyll17ikksuYeDAgRhjOOGEE+rs98knn2CMqXP74osvavXt27cvxhhOPvnkOs/173//OzL2q6++AuDuu+/GGENWVlatvtZa2rdvjzGGjRs31jrm9/vxeDzMmDHjIO9eREREREQakhDvAERERESi6dJLL2X69Ol4PB6stXGJ4R//+AdLly5lzJgx7Nq1q9H+V199NWPGjKm177DDDtuvn9frZd68eWzbto1u3brVOvbCCy/g9Xrx+/2RfRMnTgRgwYIFjBo1KrJ/5cqVFBQUkJCQwMKFC+nXr1/k2JIlSygvL4+MFRERERGR6NIMWREREWlV3G43Xq8XY0zcYnjuuecoLCxk7ty59OjRo9H+xx13HJdcckmtrVOnTvv1mzBhAqmpqbz00ku19m/evJnPPvuMqVOn1tp/9NFH4/V6WbBgQa39CxcupGPHjpx00kn7Hat6r4SsiIiIiIgzlJAVERGRVqWuGrJz5szh+OOPJyUlhbS0NKZOncrKlStrjVuxYgWXX345/fv3x+v10q1bN3760582aYbrvjIzM3G5DuyvWUVFRVRWVjbYx+v1ct555zFr1qxa+1988UXat2/PaaedVmt/UlISY8aMYeHChbX2L1y4kGOPPZYJEybUeSwjI4Phw4cfUPwiIiIiItI0SsiKiIhIqzZ79mwuuugiUlJSuOuuu7jppptYtWoVEydO3C9pu2HDBq644goeeeQRpk+fzuzZs5kyZYrjpQ+uuOIK2rVrh9frZfLkyZEasHWZMWMGixcvZv369ZF9s2bNYtq0aSQmJu7Xf+LEiWzZsqXWvS5cuJDx48czfvz4SPkCCNWWXbRoEccee+wBJ5RFRERERKRpVENWREREIs58ZAE7i8riHQYAndM8vP2bQ/vafHFxMX/605/4yU9+wlNPPRVJMl522WUMHjyYO+64g3/9618AXHXVVVx77bW1xh9zzDFcfPHFLFiwgOOOO+6QYqlLUlIS559/PlOmTKFTp06sWrWKe++9l+OOO45FixbVqvta5cQTT6Rbt268+OKL/OUvf2H16tUsX76chx56iA0bNuzXv2Yd2b59+7Jt2zY2bNjAhAkTGD16NC6Xi0WLFjFlyhRWrVpF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feq8fs06shMnTmThwoX07NmT3r17Y62lQ4cOLFy4kMMPP1wLeomIiIiINHNOJ2QfAy4DrgSOMsa8Ft4/wBjze+ACYCywHJjpcCzikKoFvdwuwxG96l+syx/Ox3saWt5N5FB0HQYb5gEwJLyw14lDujY6bFD7QXyU/REQKlughKy0ZZ18nRrvFCOHEktSUhJPPfUUY8aMwev18thjj9VbUqcxgUCA6dOns2rVKt5//3169Ki9DqnP59uvTiyA3++PHK/LjBkzuPTSS8nOzuaNN97g7rvvrjeG4cOHk5GREUm2VtWPBTDGcOyxx7Jw4UJ+/vOfs3DhQjIzM+ndu/dB3a+IiIiIiDjL0YSstdZvjDkNeBkYD4wKH5oY3gywBDjHWltR91mkOSsuq2TN9tDCJkO6pZGcVP9HqhQLGHxKyIpTaizsNcRks7KpC3t1qP4K8/f533Nq31OjHppIS3EwJQKaq//+979AKDG6fv36/coGNNXPf/5z3nnnHV544QVOPPHE/Y53796drVu37re/at++CdwqZ511Fh6Ph8suu4yysjIuvPDCemNwuVwce+yxkXIECxcu5MYbb4wcHz9+PE899VSktuw555xzgHcpIiIiIiKx4vSiXlhrt1prJwJnEJox+x7wX+AJ4DzgGGvt/v+KkRZhxeYCguEE66jeGQ329YcnJnk5uBlKIo2qmZB15WhhL5E2bMWKFfz1r3/l8ssv58gjj+Tqq6+msPDA1w+9/vrrefrpp3nggQe4+OKL6+wzcuRIli1bRjBYuzLTl19+SXJycr11a30+H+eccw6ffPIJp5xyCp06NTwjeOLEiezevZu33nqLHTt2RGbIQighu379et577z1KS0tVrkBEREREpBlzumRBhLX2v4QSsdKK1K4fW/+CXgD+8KvXOP57AGmrOg0G4wYbYIjJZktBKfkl5bRPabhmcc/UnqQkplBSUcKa3UrIirR0FRUVXH755fTo0YMHH3yQb775hpNOOonf//73dS6YVZ977rmHe++9lxtvvJHf/va39fabNm0ar7zyCq+99hrTpk0DIC8vj5dffpkzzzyzzvqyVa677joGDBjAaaed1mg8VUnWu+66i+TkZEaOHBk5NnbsWBISEiJlD5SQFRERERFpvmKWkJXWqVZCtoEZssFAJWWu0MxYL1rBXhyS6IVOA2HndxxmtpBAJStz9zBxYMOzzlzGxcCMgSzfuZzcklyKyotIS0qLUdAiEm233347y5cv5+OPPyYtLY3hw4dz/fXX83//939ccMEFTJkypdFzvP766/zhD39g4MCBDB06lOeff77W8VNOOYWuXUM1qqdNm8YxxxzDFVdcwapVq+jUqRN///vfCQQC3HbbbQ1eZ8SIEYwYMaJJ9zV27FiSkpL4/PPPOeGEE0hIqP5rXHJyMiNGjODzzz8nIyOD4cOHN+mcIiIiIiISe0rIykGz1rI8J7SgV7ovkX6dUurtW1ZW/dVxn0sJWXFQ12Gw8zs8ppJ+ZhsrcwsbTcgCDO4wmOU7lwOhsgVHdT3K4UBFxAnLli3jjjvu4Ne//jWTJ0+OlBH43e9+x4cffsjPf/5zVq5cSUZGRoPn+frrrwFYu3Ytl1566X7H582bF0nIut1u3nvvPa6//noefvhhSktLGTNmDDNnzmTw4MFRuzev18tRRx3F559/zvjx4/c7PmHCBJYuXcqxxx6Ly6Vvo4iIiIiINFdRTcgaYzYAFjjZWrsx/L6prLV2QDTjEWdtzi8lr7gcCM2ObWj1ar8/P9L2Gv0eQBzU5XDgVQCGmmy+zT24OrJKyIq0TKNHj6aiYv91Qt1uN1988UWTE5W33nort956a5Ov2759e5544gmeeOKJBvtZ2/jKlg1de9GiRfWOe+ihh3jooYcaPb+IiIiIiMRXtDNjfQklZBNrvG+qxv+FIs3KsuzqJGuj9WP9BZG215VYf0eRQ9W1+mu6g13ZvLqlaYv41EzIfr/7+6iHJSIiIiIiIiIC0U/I9gu/btnnvbRCTa0fC1BaVp0U87oaXmBJ5JB0HRZpDjE5bNxVQnFZJamehn/cDWw/MNJek6+FvURaq/Lycnbv3t1gn/T0dHw+X4wiEhERERGRtiaqCVlr7Q8NvZfWJSunINIekZnRYF9/jRqyXrcSsuKg9F7gSYeyQoa4srEWVm/dw5i+HRoclpKYQmZaJjlFOawrWEcgGMCtescirc6iRYuYPHlyg32efvppLr/88tgEJCIiIiIibY6KecpB8VcEWJUbmvV6WJdU0n0NlyGomZD1uT2OxiZtnDGhWbLZi+hpdtGOYr7dUthoQhZCZQtyinIorSwlpyiHvul9nY9XRGJqxIgRzJkzp8E+w4YNa/C4iIiIiIjIoXA0IWuMyQQmA19aa+ssymiMGQKMBeZaazc7GY9Ez8rcPVQEQmV/RzYyOxbAX14UaXuUkBWnhROyECpb8O2WIU0aNrj9YD7O/hgIlS1QQlak9Wnfvj0nn3xyvMMQEREREZE2rGlLDR+83wBPA6aBPgaYCVwVzQsbY8YYY94zxhQYY0qMMV8YYy48iPN0McY8YIxZa4zxG2N2GWM+N8b8v2jG29Jk1VzQq5H6sQClFcWRtjfB60RIItW6Hh5pDnFlszK3iQt7daixsFe+FvaS1s9aracpB0efHRERERGRg+d0QvZUYLW19rv6OlhrVwOrgNOjdVFjzGRgITAR+A/wONANeMkYc+0BnGck8C3wa2Al8AAwCygBzoxWvC1RzfqxozLbN9rfX14SafsStFCKOKzr8EhziMlh7Y5i/BWBRocNal+dkNXCXtKaJSSEviATCASUWJMDFgwGCQRCP1OrPksiIiIiItJ0Tv8tOhP4rAn91gETonFBY0wC8G8gCEyy1i4P7/8rsBi4wxjzSmMLjhlj2gFvht8eZa1dUcd12qzl2QUAJCe5GdQ1tdH+/orqhKw3IdmpsERCugyNNIe4sglUWr7fVtTo4nM9U3uSkphCSUUJa3YrISutV1JSEn6/H4C8vDw6d+4c54ikJdm1a1eknZSkhTpFRERERA6U00nFZKC0Cf1KgbQoXfNEYADwdFUyFsBaW2iMuYNQeYTLgL82cp6rgN7Az/ZNxobPV3kwwRljejXSpVtVo6ysjNLSpjy+2NpRVMaWglBcw3ukUVFeRkUjY4rLqksWJLg8ze6+qhIT+7bFWc499wQ8GX1wFfzAYJODIUjWpjwGdWq8fvGAdgNYsWsFuSW57CzcSWpS479waGn0eY+P5vTcU1JSKCgowBjDzp072b17Ny6X01+aiQ9rbWQ2544dOzCmoSpK0pias2OttaSkpNT5//SysrJYhyYiIiIi0mI4nZDdCoxsQr8RwI4oXfOE8OuHdRz7b/j1+Cac5yLAAq8aYwYTKr/gA74DPrDWlh9kfDlN7fjll1+yfv36g7yMc77eZQA3AO3Kd/Phh3U96tq25OVEPm1bN+9o0ph4mT9/frxDaJOi/dzH2k505wdSTBmZZicffgXtd69sdJx3b3WN41kfzaJvQt+oxtXc6PMeH83huaelpeHz+XC73bjd7niHIy1IIBAgEAhQWlrKunXr6uyTl5cX46hERERERFoOpxOynwGXGGPOt9a+WlcHY8x5wBBCtVmjYWD4de2+B6y124wxxTX61MkYkwQcAewktDDZbdSut7vBGHOOtfab6ITcsvxQXD27qG9a02oPVtjqObQJRot6ifMKfZl0L1wKwFCTzeriLk0a180dmaTOtsC2Vp+QlbarqKiIiooKfD5fq50dK84IBoOUlpbGfaa3iIiIiEhL5XRC9iHgx8Cz4a/qP2WtLQIwxqQBPwX+j1C914ejdM308Gt9y6rvqdGnPh0ITQHtCNwM/AF4DkgE/gf4C/C2MWaItfZA/zWS2cjxbsASgHHjxjFgwIADPL3znpu5DCgA4Cc/mkTn1Ma/Bv79209FilccMWwURx5+qnMBHgS/3x+ZsTZp0iS8XiWNY8HJ5+76rgzefAOAISabef5xTD5pMonuhhNP3fK68dbct0Ln6Obi1DHN67MaDfq8x4eee3zoucdHc/yGj4iIiIhIc+FoQtZau8wYcwNwF3A/cK8xZmv4cHdCs04NcKO1drGTsRygqoyNG3jUWntfjWM3h0sYXAhMA54/kBNbazc3dLxmbTuPx4PP5zuQ0zuuMhDk29w9APRq76N354wmjSuvMUM2LaVjs7uvmrxeb7OOr7WK+nPPHB1pDnblUF4RJLc4wJBuKQ0OO7L7kSSYBCptJd/u/rbVfxb0eY8PPff40HOPHY+n8V/WioiIiIi0VY5/R9Faew9wDrCCUIKzV3hzh/edZ629M4qXrJoZW98s2HbUP3t233MAvFXH8ap9Rx9AXK3Cd9uK8FcEARjVu32Tx/kD1SV3vZ52UY9LZD8d+kFCKPEyxGQD8O2WPY0O8yX4OLzj4QBsKNxAvj/fuRhFREREREREpM2JSdE4a+1b1tpRhGbFjgtv3a21o6y1b0T5clW1Y/erE2uM6QakUkd92ZqstSXAlvDbgjq6VO1rc9NssnIKIu1RmRlNHucPVidkfZ7GKkaIRIHLDV2GAtDXbMeHn2+3NPa7mJDRXatn1y7bscyR8ERERERERESkbYrpKh7W2u3W2iXhbbtDl/k0/FpX4cfT9unTkLnh18PrOFa1b1PTw2odsrKrZwuO6p3R5HH+YHXJAo9XCVmJka7DAHAZyyCzmZW5TUvIjuoyKtJetl0JWRERERERERGJnta4rPLHwAZghjFmZNVOY0w6cCNQDjxbY393Y8yQ8PGaHg+//skYk1Gjfzfgt4QWInvViRtozpZnFwCQ5HZxeI+mlx7w28pI2+vNiHJUIvXoOjzSHOLKYVXuHoJB2+iw0V1qzJBVQlZEREREREREoiiqi3oZY34Sbr5urS2q8b5JrLXPNt6r0XNUGmOuBP4LzDfGzAaKgPOBPsB11tpNNYb8DbgMuAKYWeM8i4wx9wO/B1YYY94GEoGzgS6EFiJbc6jxtiT5JeVsyCsBYFjPdngS3E0eWxoMRNL/Xk+GA9GJ1KFr9QT3ISabl8oDbNpVQv/OqQ0Oy/BmMCB9AOsL17N692r2VuwlOTHZ6WhFREREREREpA2IakKWUELTAl8QSoJWvW+qQ07IAlhr5xljJgK3ARcRSqR+A/zRWvvSAZznWmPMN8CvgMsJ3UsW8Etr7evRiLUlWb65INIeldn0Bb0A/AQA8AQtLne0P3Yi9egyLNIcYnIA+DZ3T6MJWQjVkV1fuJ6ADbAibwXHdD/GsTBFREREREREpO2IdmbsWUJJy8J93sectXYxcEYT+l1OKNla3/GZ1Jg525ZlhcsVwIHVjwXw2yAA3ijGI9KolI6Q1h2KtjLElQ1YVuYWctaIHo0OHdVlFC+veRkIlS1QQlZEREREREREoiGqCdlwcrPe99KyHeyCXgB+LGDwxiU9L21a12FQtJX2ppiu5LNyy54mDTuq61GRturIioiIiIiIiEi0RHVRL2PMU8aYn9Z439sY0yGa15D4CAYty3MKAOic5qFnhu+AxvtN6NWHiXJkIo3oWl22YKgrm29zC7G28d8M9EjtQbeUbgCsyFtBRbDCsRBFREREREREpO2IakKW0Ff/J9Z4vxG4J8rXkDjYkFdMkb8SgFGZGRhzYInVqoSs10T7IyfSiK7DI80hJpuCvRVsKSht0tDRXUYDUFpZyne7vnMkPBERERERERFpW6KdHQsQWkCriglv0sIt+6Eg0h7V+8AW9ApUllMeTuB6jTuaYYk0rsvhkWaojiyszD2IsgU7VLZARERERERERA5dtBOyO4CR5kCnT0qzl5Vz8PVjy/wFkbbXRHsdOZFGdBoErtDnbrDJAWDllsKGRkSM6jIq0l66fWn0YxMRERERERGRNifa2bG5wI+BDcaYjeF9pxtj5jZhrLXWnhTleCRKsrILAHAZOLJX+gGNLVVCVuIpIQk6DYYdKznM5JJIJd82cYbsgIwBtEtqx57yPWTtyCJog7hUdkNEREREREREDkG0s2N/BAYBY4A+4X3dwltjGl9lR+KiuKyS77cXATCkWzuSkw7sY+MvK4i0vS4lZCUOug6DHStJNAEGmFxW5qY0aZjLuBjdZTSfbP6EgrICNhZuZEDGAIeDFREREREREZHWLKrZMWttLjDOGNOHUEL2E+AD4K5oXkdia0VOAVWL0o88wHIFAH5/9dfDva6kKEUlcgC6DoNvQs0hJps39vRmR5GfLmneRoeO7hpKyEKojqwSsiIiIiIiIiJyKByZrmit/QH4IVxKdpu19lMnriOxkZVTEGmPPsAFvQD85dVfD/e6lZCVOOg6PNIc4sqGICxcl8e5o3o1OrRmHdll25dxwaALHAlRRERERERERNqGqBZDNMbMNcb8ocauK4AnonkNib2s7INf0AugtKwo0va5PdEISeTAdD080hwSXtjrna+3NmnosI7D8LpDM2mXbV8W/dhEREREREREpE2J9uo0JwBDarx/CvhZlK8hMWStjSzole5LpF/HptXerMlfXp2QrUpsicRUWnfwhWZ3H+4OJWTnr91J4d6KRocmuhM5ovMRAOSW5LKtZJtzcYqIiIiIiIhIqxfthGwFUDPjZsKbtFA5u0vZVVIOwMjMDFyuA//jLKsoibS9Cb6oxSbSZMZEyhZ0YTft2UNFwPLfVU1Lro7uMjrS1ixZERERERERETkU0U7IbiW0qNeBT6OUZikr59DKFQCU1kzIJiohK3HSdVikOcQVmiX77oqmlS0Y3bVGQnaHErIiIiIiIiIicvCivajXu8D/A3YYY7aH900zxpzQhLHWWqvly5uZqnIFAKMOYkEvAH+NhKwvIflQQxI5ODUSsuOSt/J58TAWrssjv6Sc9ikNLzY3ovMIXMZF0AZZun2p05GKiIiIiIiISCsW7RmyNwKvAIlAX8ACqeF2UzZpZmou6DWyV8ZBncNfuTfS9iZq8rTESY2E7OSMnQBUBi0frGy8bEFKYgpDOoTKY68rWEdhWaEzMYqIiIiIiIhIqxfVhKy1ttBaeyGQTCjBagglaPs1YesfzVjk0PkrAqzaugeAAZ1TSE9OPMjzlEba3qTUqMQmcsA6D6WqpPVAkx3Z/c6K3CYNr1lHNmtHVlRDExEREREREZG2I9ozZAGw1lZaa6syHsXW2h+asjkRixy8lbmhhY/g4MsVAJQG/JG2J1ElCyROkpKhQ+j3Pr78NfRt7wHg8/W72FlU1ujwo7oeFWmrjqyIiIiIiIiIHCxHErJVrLUua+1PnbyGOKdmuYKDXdALwF9ZnZD1JbU7lJBEDk24bIGpLOWSQRUABC188G3ji3uN7DIy0l62XQlZERERERERETk4jiZkazLGpBtjTjbGXGyMGR+r68rBy8opiLRHZR78DFl/oHr2odeTdighiRyantWzXM9Kqk6qvr2i8YRsJ18n+rbrC8DKXStr/aJBRERERERERKSpHE/IGmPSjDFPADuA/wLPA1fWOH6lMSbXGDPO6VjkwCzPLgAgOcnNoK4HX/vVHyyPtL2e9EMNS+TgDT8v0uy84XX6dwqV0FiyaTfb9zSeYB3dNVRHtjJYyTd53zgTo4iIiIiIiIi0ao4mZI0xPuAT4KdAPvA+VavqVHsH6Aqc42QscmC27/GzpSC0GNeRvdJJcB/8R6U0UBFp+5SQlXjK6A19jwPA7FrLlf0LALAW3vum8VmyNRf2Wrp9qSMhioiIiIiIiEjr5vQM2d8Do4AXgQHW2h/t28Fauw1YDUx2OBY5AFnh2bFwaAt6AfhtdULW6804pHOJHLIR0yPNKcF5kfY7TShbUDVDFiBrR1Z04xIRERERERGRNsHphOxFwDbgZ9bakgb6rQF6ORyLHICsnBoLemVmHNK5yoKVkbYSshJ3Q8+CBB8AGevf4vAuHgCW/pBPbnhWeH16pfais68zAMt3LKeyxmdbRERERERERKQpnE7IDgAWW2sbK864F+jkcCxyAGrOkB3ZO+OQzuW3gUjbo5IFEm/edjA0PFm/NJ+rem6MHHq3kVmyxpjILNm9lXv5Pv97x8IUERERERERkdbJ6YRsAEhsQr9eQEMzaCWGKgNBVmwuAKBXex9d0ryHdL5SggD4ghbjcnwdOZHGHVldtmBy2ceR9jsrchsdWrOO7LLty6Ibl4iIiIiIiIi0ek5nx9YDI4wxCfV1MMakAkcSqiMrzcB324rwV4SSqIdaPxbAb0PnOrS0rkgU9T8BUrsCkLLpI8aFmny9uZDsXXsbHHpU16MibdWRFREREREREZED5XRC9i2gO/CXBvr8BUgHXnc4FmmirJyCSPtQ68cC+LEAeO0hn0okOtwJcMQFoXawgqs6fx059O43DZctOCzjMFITUwFYun0p1uqDLSIiIiIiIiJN53RC9gFgC3CTMeYNY8yM8P6uxpjzjDGzgeuBTcDjDsciTZSVXWNBr0OsHwvgN6FXj+MfN5EDMOLiSPOYojmRdmNlC9wuNyO7jARgt383P+z5wZHwRERERERERKR1cjRDZq0tAE4HNgJnAc8BNrzvZeBCIBs401qrGrLNxPLwgl5JbheH92h3yOcrDSdkfUYJWWlGug2HrkcA4Nm+jDO6FQGwMncPG/Ma/nFUs2zBsh2qIysiIiIiIiIiTed4hsxauwoYDlwFvEuoVuz3wEfA74Fh4T7SDOSXlLMhnIwa1rMdngT3IZ2vomIvlSaUkfWaQzuXSNSNqF7c6+fpiyPtd75ueJZszYW9lm5fGv24RERERERERKTVismURWut31r7uLX2LGvtcGvt4dba06y1D1prG15BR2Jq+eaCSHtU5qEv6FXmL4y0lZCVZueICyA8c/vI3R9gCC1A986KhuvIDu80nCRXEgDLtmuGrIiIiIiIiIg0nb5DLrVkhcsVQJTqx/qrz+c1iYd8PpGoSusKA04CIKFoC5d02wzA99uLWLu9qN5hSe4khncaDsDm4s2szFvpfKwiIiIiIiIi0irELCFrjDnGGHODMebR8HaDMeaYWF1fmibaC3qV1kzIuhIO+XwiUVejbMGlvs8j7bcbmSV75oAzI+3nVz8f/bhEREREREREpFVyPCFrjOltjPkMWAjcTqiW7FXh9kJjzHxjTG+n45DGBYOW5TkFAHRO89Azw3fI5ywrr55l6HMnHfL5RKJuyFTwhBavOyzvI3ymDIB3V+Rira132NT+U0n3pAPwwaYP2Ll3p/OxioiIiIiIiEiL52hC1hiTAcwDJgBlwFvA/eHtzfC+icDHxph0J2ORxm3IK6bIXwnAqMwMTHgxrkPhL6tRQ9btOeTziURdog8OPxsAV0UJv+zyHQDrd5bw3bb6yxb4EnxMGzgNgMpgJf9Z8x/nYxURERERERGRFs/pGbLXAv2A94DDrLXnWmuvC2/nAf2Bd8Ov1zocizRiWa36sYe+oBdAaY0ZskrISrM14uJIc1rCZ5H2m8tzGxw2fch03OHF6v7z/X8oD5Q7E5+IiIiIiIiItBpOJ2TPBXYCF1pr98tsWGu3ARcBecB5DscijYj2gl4A/vLiSNvr9kblnCJR1/tYyAhVTumx+wt6uEK1lF9cnE1JWWW9w7qldOPkPicDsNu/m/c3vu98rCIiIiIiIiLSojmdkO0HfGqt3Vtfh/CxT8N9JY6qFvRyGTiyV3QqSNRMyPoSDr0mrYgjXC44MrS4l7FBbuj1LQCFpRXMXpLT4NBLhl4Sab+w+oUG686KiIiIiIiIiDidkA0AiU3olwAEHY5FGlBcVsma7aHyAkO6tSM5KSEq5/VXlETangTNkJVmbMT0SPPUyrlAKLH65GcbqAjU/+NpROcRDOs4DIDVu1ezbMcyR8MUERERERERkZbN6YTsWuCE8OJedTLGdAAmA2scjkUasGJzAcHwxL5olSsAKK2RkPUmJkftvCJR13EA9BoLgGf391zWL/QLitxCP29/XX8tWWMMPx7648j751c972ycIiIiIiIiItKiOZ2QfRlIB941xgzb96Ax5gjgHaAd8JLDsUgDshxY0AvAX1ldrcKXmBK184o4osYs2f/Xfkmk/c9PNzRYiuD0vqfTydcJgLk5c9lSvMW5GEVERERERESkRXM6IfsQ8DVwLPC1MWaJMeY/4e0rIAs4JtznYYdjkQY4saAXgL+yNNL2JqVG7bwijhh2LriTAOj6w1sclZkGwPfbi/jk+531Dkt0J3Lh4AsBCNogs7+b7XysIiIiIiIiItIiOZqQtdaWAicC/wnvOgqYFt5Gh/e9BJxsrfU7GYvUz1rL8pzQgl7pvkT6dYzeTFZ/ZfUfqzdRCVlp5pI7wKDTATAlO7lx8NbIocc/Xd/g0AsGXUCiK1Qy+9W1r7K3ot61DEVERERERESkDXN6hizW2nxr7XSgH3Ap8KfwdinQz1p7sbV2t9NxSP0255eSV1wOwMjMDFwuE7VzlwbKIm2vJy1q5xVxzIiLI83R216hf+fQLyi+3LibrOz8eod18nXijH5nAFBUXsTb6992Nk4RERERERERaZEcT8hWsdbmWGtfsNbeHd5esNbmxOr6Ur9lNZJM0SxXAFAWKI+0fUntonpuEUcMPAXSMwEw6z7khiOrZ7r+89MNDQ69ZOglkfYL371A0AadiVFEREREREREWqyoJ2SNMV5jTDtjjKcJfT1N7SvOcWpBLwB/jYSs15Me1XOLOMKdCMf9PvL2xO1P0zkt9CPqv6u2sWFncb1Dh3YcyuguoWosGws38nnu587GKiIiIiIiIiItTlQTssaYRGA1sB0Y3oQhw8J9vzHGuKMZizRdVk5BpD2yV0ZUz+0P1kjIepWQlRZi5CXQrhcA7nUf8scjQrNkrYV/f9bwLNlLD7800n5+9fPOxSgiIiIiIiIiLVK0Z8heAPQB7rPWLm2ss7V2GXAvMAA4L8qxSBP4KwKsyi0EYEDnFNKTE6N6/tJgZaTt9WZE9dwijklIgknXRt6eXfgMqZ4EAF5duoUdRfWvQTg5czI9UnoAsGDLAjYWbnQ2VhERERERERFpUaKdkD0XqAQeOIAx9wNBYFo0AzHGjDHGvGeMKTDGlBhjvjDGXHgI52tvjNlijLHGmA+iGWs8rczdQ0XAAtEvVwDgt9UJWZ83+ucXcUyNWbKJ6z/iumFFAJQHgsxcuKneYW6Xm4uHVC8MNmv1LEfDFBEREREREZGWJdoJ2dHAMmvtrqYOsNbmA18BR0UrCGPMZGAhMBH4D/A40A14yRhzbUNjG/Ao0Oq+c5/l4IJeAH4bAMBYS2JiStTPL+KYfWbJXlz6IoluA8BzX/xAkb+i3qHnDjwXX4IPgDfXv8me8j3OxioiIiIiIiIiLUa0E7LdgE0HMe4HoHs0AjDGJAD/JjTrdpK19hfW2muBEcAa4A5jTJ8DPOf5wAzgj9GIsTmpVT82MyPq569KyHotGFfU15ATcdbISyA9EwDPxo+4enCovEeRv5LZi3PqHZbuSeesAWcBUFpZyutrX3c+VhERERERERFpERKifD7DwSV5XeGx0XAioZq0T1trl1fttNYWGmPuAGYClwF/bcrJjDGdgX8AzwHvEpope9CMMb0a6dKtqlFWVkZpaemhXK5Ry37YDUByopve6QlRv14poXIIXnD8Xg6F3++vsy3OagnP3X3M1ST993oALi+fzX38AoAnPtvAhaO7kuSu+0fe+f3O56XvXwLghdUvcH7f83G7msfahS3hubdGeu7xoeceH2VlZfEOQURERESk2Yp2QnYnoWTogeoP5EUphhPCrx/Wcey/4dfjD+B8jwMB4LdEp2RB/dPq9vHll1+yfv36KFyyboXlsLUw9BHo4atg7kcfRf0apQQBF96g5cMP6/ojaX7mz58f7xDapOb63E2wIycndiS5Yhdpmz/hvPTJvFY4kO1FZdz14seM62LrHTswYSBrK9eytWQrD733EMOThscw8qZprs+9tdNzjw8999jJy4vWX+tERERERFqfaH+HPAsYYYzp3dQBxpi+wChgWZRiGBh+XbvvAWvtNqC4Rp/GYrsEOA/4ZbjWbauyqah6UnLfVGeuURa+hMdGawK0SGxZVwJrup0Vef8b92uR9txcF8H687GM94yPtOf451BZY5E7EREREREREWmboj1D9k3gLOBh4JwmjnmoxthoqJrFWljP8T00YaarMaYHoft40VobrdgAMhs53g1YAjBu3DgGDDiYCcdNs2LOOliTDcA5x43gpCGdo36NW176MwDJ7gROPfXUqJ8/Wvx+f2Tm1KRJk/B6vXGOqG1oMc89cALBf32Ia88W+u39mou6b+Olrd3YVmrw9B3N5MGd6hx2ij2Fbz/5lqU7l7IruIvCfoVcPOjiGAe/vxbz3FsZPff40HOPDye/4SMiIiIi0tJFOyH7HHATcKYx5hXgKmvtjro61qjNeiahhcCei3Ish+oJoAK4OpontdZubui4MdUzST0eDz6fL5qXr+WbrcWR9tjDuuDzRfcfqRUVewmE78dr3I7eSzR5vd4WE2tr0ryfuw8mXQ/vXAPA9d43eYn/AeDJz3M4Y0SvWv/t1vSHcX9g+jvTsVieXPUk5w85n3RPNKqfREfzfu6tl557fOi5x47H44l3CCIiIiIizVZUSxZYayuBaUApcC7wgzHmDWPMn40xPw9vfzbGvAFkh/v4gQvCY6OhamZsfRmPdtQ/exYAY8xlwBnAr6y1rbIIWmUgyIrNBQD0au+jS1r0Zwz5S6urPPhMtHP/IjE28seQHprg3mnrp/yoYy4AS3/I578rt9c77PCOh3PmgDMB2FO+h8e/ftz5WEVERERERESk2Yp2DVmstcuASYRmvXoIlTD4K6HFsR4Pt88KH/sBmGStXRrFEKpqx+5XJ9YY0w1IpY76svsYFX592RhjqzZgY3j/aeF9y6MRcDx8t60If0UQgFG92ztyDb+/INL2upSQlRYuIQmOuzby9pa0tyLt299dhb8iUO/Qq0ddjdcd+qXH7O9m88OeH5yLU0RERERERESatagnZCGSlB0MXA68DmwGysLbZuAN4ApgkLX2qyhf/tPwa10FS0/bp099PgeerGN7KXx8c/j9a3WObgGycgoi7VGZGY5cw19WfQ2vK8mRa4jE1MgfQ3pozcLO2+ZzWeZOADbnl/Kv+RvqHdY1pSuXD78cgEpbyQNLH3A8VBERERERERFpnhxJyEKofIG19llr7fnW2j7W2uTw1sdae5619pkolimo6WNgAzDDGDOyaqcxJh24ESgHnq2xv7sxZkj4eFXsL1lrr9x3A/4U7rIyvO+vDsQfE1nZ1eUERvXOcOQapWV7Im2vK9GRa4jEVEISTKqeJfsH3xu4XaHasX//ZB1bCkrrHXrFsCvo5Ast/vVx9scs2bbE2VhFREREREREpFlyLCEbL+Ek75WE7m2+MeZfxpj7gK+BQcCN1tpNNYb8DVhNqJ5tm7E8uwCAJLeLw3u0c+Qa/poJWbcW95BWYsSMyCzZlOx53HBkaHE8f0WQO95bXe+w5MRkrh5VvUbgvV/dS9AGnY1VRERERERERJqdVpeQBbDWzgMmAguBi4D/B2wHpltr74tnbM1Bfkk5G/JKABjWsx2eBLcj1/GXF0XaSshKq7HPLNnLymbTISVUkuPdFVv5YsOueoeeNeAsBrUfBMCqXat4d8O7zsYqIiIiIiIiIs1Oq0zIAlhrF1trz7DWpodLJYyz1r5UR7/LrbXGWjuzCefcFO57uiNBx8jyzQWR9qhMZxb0gn0Ssglex64jEnM1ZskmbvyYh0ZuiRy69a2VVAbqnvnqdrm57ujrIu8fWvYQpZX1lzkQERERERERkdan1SZkpX5Z4XIF4Fz9WIDS8uJI25fgc+w6IjGXkAQn3xJ5O3HNXYztHqqT/N22Il5cnF3v0GN7HMukXpMA2L53O8+ufLbeviIiIiIiIiLS+igh2wbFYkEvAH9FSaTtVUJWWpvh58NhJwNginJ5tOubkUP3friG/JLyeodee9S1uE2oVMiT3z5JXmmes7GKiIiIiIiISLOhhGwbEwxalucUANA5zUPPDOcSpf6KvZG2NzHZseuIxIUxMPV+CH+2u3z3Ar8fHPplR2FpBffN+b7eof0z+jNt0DQASitLeTTrUefjFREREREREZFmQQnZNmZDXjFF/koARmVmYIxx7Fr+Sn+k7U1Mcew6InHTvg+c+JfwG8tVxQ+TkRSqHzvry2xW5hbWO/SqkVeRmpgKwOvrXuf73fUncEVERERERESk9XA0IWuM6W2M6dCEfu2NMb2djEVCltWqH+vcgl4A/hqLFfmSUh29lkjcjPsl9BgFQMKu7/l3/wUABC3c9tYqrLV1Duvg7cDPj/x5uG+Q+766r96+IiIiIiIiItJ6OD1DdiNwTxP63Q1scDgWIXYLekHthKw3Kc3Ra4nEjcsNZz0C4ZqwR+c8xfEddgOweNNu3l6xtd6hPx76Y3qm9gTg862fs2DLAufjFREREREREZG4cjoha8JbU/uKw6oW9HIZOLJXuqPX8gfKIm0lZKVV63YEjP8NACZQzkPJMzGEShfc8e5q9pZX1jnM4/ZwzehrIu/vXHwne2vUXhYRERERERGR1qe51JBNA+pfklyioriskjXbiwAY0q0dyUkJjl6vtEZC1qOSBdLanfAnaN8PgIy8r7i151cAbNvj5+/z1tc77LS+pzGqS6jkQXZRNvd+da/zsYqIiIiIiIhI3MQ1IWuMcRljjgBOBLLjGUtbsGJzAcFwiUqnyxUA+IMVkbbP4+xsXJG4S/TBmQ9F3l5a9CQ93aEZ6f+av4FNeSV1DjPG8L8T/hdfgg+Al9e8zPzN852PV0RERERERETiIuoJWWNMoGoL77qs5r59jlcAy4GOwGvRjkVqy4rhgl4A/mD1pGevJ8Px64nEXf/jYeQlALjKi3iyy8sAlAeC/O4/y6kIBOsc1qddH647+rrI+5sX3sxu/27n4xURERERERGRmHNihqypsdl93u+7VQKbgPuAWxyIRWqI5YJeAP5gdd1Mr1czZKWNOPV/IaUzAEPyP+HH6SuA0H9/j3y8tt5hFwy6gEm9JgGwy7+L2xbdhrXW+XhFREREREREJKainpC11rqqNkJJ15k19+2zeay1A6y1f7DWqoasg6y1LM8JfX063ZdIv44pjl+z1FYnZH3eDo5fT6RZSO4Ap98ZeXuL+2kyXKUAPDpvHYs31j3z1RjDbeNvo70nNHt9bs5c3lj3huPhioiIiIiIiEhsOV1D9jbgDYevIU2wOb+UvOJQzntkZgYul3H8mn4bqlrhtpaERJ/j1xNpNoafDwNPBSBp73ae6/s+AEELv3tpOYWlFXUO6+TrxC3HVn9Z4M7Fd7K5aLPz8YqIiIiIiIhIzDiakLXW3matfcvJa0jTLMvOj7RjUa4AwG9D9TK9FowrruvHicSWMTD1fkgMzUQ/IvcVftojB4AtBaXc+Po39ZYjOKnPSZxz2DkA7K3cy58X/JlAMFBnXxERERERERFpeRzNkhlj3MaYdsaYhH32+4wxtxhjXjfGPGCM6eFkHBL7Bb0AygglnLwqgyltUUYmnHRT5O2f/fdwmHcPAO+u2MorS+uf+fqnsX+iZ2pPAJbtWMbTK592NlYRERERERERiRmnpy3eDOQDx1btMMYY4JPwsbOBq4HPjTGxyRK2UVk5BZH2yF4ZMblmqQknZHG+PIJIszT2F9B/MgDuvXn8p+M/SSRUW/mWt1ayKa+kzmEpiSncMfEOTPi/nceWP8bqXatjE7OIiIiIiIiIOMrphOxJwDZr7Wc19p0JjAHWAtcAHwK9gJ87HEub5a8IsCq3EIABnVNIT06MzXXDrz4lZKWtcrnh/CchPROADruymNnjTQD2lgf47ewsKgLBOoeO7jqanw7/KQCVwUpu+OwGygJlsYlbRERERERERBzjdEK2H/DdPvvOBizwY2vtw4QStDuBaQ7H0matzN1DRSA0WzVW5QpsMIg/nIf1GndMrinSLKV0hAufAXcSABN2v8qV6V8B8PXmQh6Ys6beob8a+SuGdBgCwPrC9Ty49EHHwxURERERERERZzmdkO0IbNtn3wRgi7V2KYC1thL4AujtcCxtVlYcFvSqqCghaEIZWY8SstLW9TwKptwTeXtj4B8c7g4t8vWPT9ezaH1encMS3Yn8beLfSHKFkrnPr36eL7Z+4Xy8IiIiIiIiIuIYpxOylUBK1ZtwndiBwMJ9+hUB6Q7H0mbVrB87KjM2M2RL/dVJYM2QFQFGXwajLgHAVVnKi+0eJY29WAu/f+lrCvaW1znssPaHcc1R10Te/2XBX9jt3x2LiEVERERERETEAU4nZDcAxxhjqq7zI8AAC/bp14VQ2QJxwPLsAgCSk9wM6poak2v6/QWRts8Vm5q1Is2aMTDlXug+AoD00hyezngSQ5Bte/z86dVvsNbWOfTHQ3/MuO7jANi+dzvXzLuG8kDdCVwRERERERERad6cTsi+RSjZ+qYx5rfAXUAAeLuqgzHGAKOAjQ7H0iZt3+NnS0EpAEf2SifB7fQfeYjfXxhpe5WQFQlJ9MGFz4EvNFP9aP/nXON7D4APVm7jxcU5dQ5zGRd3TLyDLr4uAGTtyOLWRbfWm8AVERERERERkebL6ezc3cBKYCrwANANuMdam12jz0SgE/vPmpUoyArPjoXYLegF4C+rkZANL2YkIkD7PnDeE4S+LABX29lMcH0DwM1vfsv8NXV/WaBLchcePulhvG4vAG9veJsnvnkiJiGLiIiIiIiISPQ4mpC11u4BxgKXAX8AJltrb9ynW0fgIeAlJ2Npq7Jyqmu5jo5hQra0fE+k7XV7YnZdkRZh4Mlwwg0AGIL8K/kfdGcXlUHL/3t+Kd9uKaxz2LCOw/jbcX+LvH8462Hm/DAnJiGLiIiIiIiISHQ4/v11a22ptfY5a+291tpP6zj+hrX2d9baFU7H0hbVnCE7MjMjZtf1lxVF2j4lZEX2N+l6GHgqACmVBcxKf4wkKigpD3D504vJ3rW3zmEn9zmZ347+beT9jZ/dyMq8lTEJWUREREREREQOXWwKikpcVAaCrNhcAEBmBx+d02KXGC2rKIm0vQnemF1XpMVwueC8f0H7vgD0K/uOxzOeByx5xeX85Kkv2VVcVufQnw3/GWcNOAsAf8DPb+b+hm0l22IUuIiIiIiIiIgcCkcTssaYSQeyORlLW/TdtiL8FUEARmXGrlwBQGl5caTtTfDF9NoiLYavfWiRr/AvLU70z+Hudi8Dlk279vLTmUsoKavcb5gxhluOvYXRXUYDsLN0J1fPvZq9FXXPqhURERERERGR5sPpGbKfAPOauM11OJY2JyunINIe1Tsjptf215ohmxzTa4u0KN2PhHMfBxP6cXxh+RvckPIOAF9vLuRXs5ZREQjuNyzJncSDkx+kV2ovAFbvXs0Nn91A0O7fV0RERERERESaD6cTsvPr2RYAOTX6fQ585nAsbU5WdvWCXqNiuKAXgL/GTD1fYkpMry3S4gw7F858KPL2fwIv8j/e0GJdn3y/kxte+wZr7X7D2nvb89hJj5GWmAbA3Jy5PLTsof36iYiIiIiIiEjz4WhC1lp7grV2ch3b8dbavsAo4GugBDjZyVjaouXhBb2SElwc3r1dTK/tryyNtD0qWSDSuNE/gVP/L/L2Bp7mooTQ76leWbqZ+z5cU+ew/hn9uff4e3EbNwBPffsUr6993fl4RUREREREROSgxHVRL2vtCuA8YCJwfTxjaW0K9pazIS9UNmBYj3YkJcT2j7q0RkLWm5QW02uLtFjjfw2T/hB5e2fCPzndvRiAR+et47kvfqh7WM/x/GnsnyLv//rFX/ly65fOxioiIiIiIiIiByWuCVkAa+0mYAnwkziH0qrUrB87OsblCiC08nsVX1JqzK8v0mJNvhHG/g8AhiCPJT3GRNc3ANz85rd88O3WOodNHzKdGUNmAFAZrOTXH/9aSVkRERERERGRZijuCdmwnUDfeAfRmmSFyxVA7Bf0AvAHyiJtb1JsyyWItGjGwOl3wohQctVtK3jK+wCjzRqshatnL+ejVdvrHHr9mOs5IfMEIPRLkV9//Gu+2PpFrCIXERERERERkSaIe0LWGJMEjAH2NtZXmi6eC3rBPglZj0oWiBwQlwvOegSG/AiApKCfF3z3MtT8QHllkF8+v5Q3l2/Zb1iCK4H7jr9vv6Ts57mfxzJ6EREREREREWlA3BKyxpgUY8zRwKtAJjAvXrG0NsGgZXm4ZEGXNA890r0xj6E0UB5pez3pMb++SIvnToBpT0H/yQD4gsX8J/lu+pmtVAYt17y0nFlfZu83LMmdxP3H38/kzNC4skAZv5n7GxblLopp+CIiIiIiIiJSN0cTssaYQH0bsAf4EpgKFAJ/cTKWtmRDXjFF/kogVK7AGBPzGPzBykjb582I+fVFWoUED0x/AXqNBSAtkM/rqXfR3+RiLdz4+jf8a/76/YYluhO57/j7ODHzRCCclP34NyzaoqSsiIiIiIiISLw5PUPWNLBVAj8ATwCjrbXfOxxLm7GsVv3Y2JcrACizFZG2VwlZkYOXlAI//g90HQ5ARsUO3kn5X0aadQDc8d533Pfh91hraw1LdCdy7wn3clLvkwAoD5bzm7m/YeGWhbGNX0RERERERERqcTQha611NbB5rLX9rbW/sNZucjKOtqbWgl6ZGXGJwW8DkbbHq5IFIofE1x4ufR26HgFAcmUhL/vu4ARXFgCPzF3HbW+vIhjcJynrSuSe4+/hlD6nAKGk7NVzr2bRVs2UFREREREREYmXuC/qJdFXtaCX22U4old8kqGl4YRsgrUkJibHJQaRViW1C1zxLvQ9DoDEoJ+nPPdzvms+ADMXbeIPr66gMhCsNSzRlchdk+6qlZS9fuH1fF+hLyWIiIiIiIiIxIPTNWSDxphlTl5Daisuq2TN9iIAhnRLIzkpIS5x+G0oKeSzjXQUkabzpsMlr8Lh5wDgsgHuS3qc/5fwFmB5Zelmrp6dRXll3UnZU/ucCkBFsIJZJbP4ruK7GN+AiIiIiIiIiDg9Q7YEWOXwNaSGFZsLqPrW8qjeGXGLw08oIeRRQlYkuhI8MO0pGPuLyK4/Jszm1sTnMAR575tt/PzZrygtD9QaVpWUPa3vaQAECDCrZBavrHslpuGLiIiIiIiItHVOJ2TXAl0cvobUULt+bHwW9ALwm9CrFxO3GERaLZcbzrgbTrwpsuty9wc8mvR3kqjg0zU7ueCfi8gtKK01LMGVwJ3H3cmpmaGZskGC3L3sbu748g4qg5UxvQURERERERGRtsrphOzzwHHGmAEOX0fCaiVk4zpDNsRrVKZYxBHGwKTr4KxHwbgBmOpaxLOee0llL99u2cNZjy7kq027aw1LcCVw27jbmOiZGNn34ncv8quPf8We8j0xvQURERERERGRtsjpbNmDwH+BucaYGcYYr8PXa9OstSzPCS3ole5LpF+nlPjEEQxS6grNjPVp3TgRZ42+FKbPggQfAMeYb3jNdwedySevuIyL//0FLy3JrjXE7XJzuu90zvWdS4IrVGd6Ue4iLnnvErL3ZO93CRERERERERGJHqezZeuAEUAm8BxQYozZaozZUMe23uFYWr3N+aXkFZcDodmxxsSnXEBZWWGk7Q3P3BMRBw0+HS57C7wZAAyyG/gw+SbGmO+oCFj++Oo33PrWSioDtRf7OspzFI8e/ygZntC4jYUbmfHeDJZsWxLjGxARERERERFpO5xOyPYF+oTbJrx1De+va5NDsCw7P9KOa/1Yf0Gk7Q3PvhMRh2WOhZ99CO16AdA+uJuXPP/Hz9zvApaZizbxk6cWk19SXmvY6M6jmTV1FgPSQ5VlCssK+cWcX/Da2tdifQciIiIiIiIibYLTCdl+B7D1dziWVq9m/diR8awfWzMhaxLjFodIm9N5MPziE+g3CQAXAW5KfIHHkx4ilb0sWr+Lsx9byJodxbWGZaZl8tyU55jQcwIAlcFKbll0C/cuuZdAMBDruxARERERERFp1RxNyFprfziQzclY2oKsnIJIe2SvjLjF4S+rXhjI51ZCViSmUjvDpW/AcddGdp3uWsw73psZaDaTvXsvFz+5lG921y5pkpaUxqMnPsolQy+J7Htm1TNcPe9qCmuUIRERERERERGRQ9NqV1wyxowxxrxnjCkwxpQYY74wxlzYxLHGGHOGMeYfxpgVxphCY8xeY8zXxpgbm+PiZP6KAKtyQ0mTAZ1TSE+OXyLUX7OGrCspbnGItFkuN5x0M1w8GzzpAPQll7c9N3GWaxF7ywM88b2b93MMgaCNDEtwJfDHsX/kpmNuIsGEyo3M3zyf8986ny+3fhmXWxERERERERFpbVplQtYYMxlYCEwE/gM8DnQDXjLGXNvQ2DAP8B5wBZAL/At4EvAB/wfMN8YkOxD6QVuZu4eKQCixMqp3/OrHAvjLiyJtr9sTx0hE2rjBZ8D/fALdjgDASxkPJz3KrQkzSaSSDza7ueyZZWwpKK017MLBF/L4KY+THk7mbt+7nSs/vJJ7ltxDWaAs1nchIiIiIiIi0qo4npA1xvQOzzRdG55lGqhnq4zS9RKAfwNBYJK19hfW2muBEcAa4A5jTJ+GzgEEgL8A3a21p1trr7fW/gYYBrwNjAF+FY14oyWr5oJecawfC1BaMyGb0OwmE4u0LR36w8/mwMjqUgSXJ3zIS0l/pTu7WJpdyOkPzuftr3NrDRvXfRyvnvkqx3Q/JrLv2VXPcvG7F/P97u9jFr6IiIiIiIhIa5Pg5MmNMUMIzVTNAEzDvRs93lQnAgOAp621y6t2WmsLjTF3ADOBy4C/1ncCa20FoZmw++03xvwNOBM4HrjnQIMzxvRqpEu3qkZZWRmlpaUN9Y34atOuSPvwLr4mj3NC0d7q5HCiSYxrLE3l9/vrbIuz9Nxj6NR7cHcbReKcGzGBMka71vGB50/cXHEZb/on8JsXs/h41Vb+csYgUjyh/zW0c7XjwYkP8tLal3hsxWOUB8tZm7+Wi9+9mKuOuIqLB12My7TKL1o4Qp/3+NBzj4+yMs2mFxERERGpj7HWNt7rYE9uzKvAucB/gVuA1dbaooZHHfI17wBuAC621s7e51g3YCsw11p70kGe/2hgCfCmtfacgxjf5Af+xBNP0KlTpyb1vXWpm/xyQ5LLcufYAO5opbcPwub8V3ncZAFwaWU/Bnf6WfyCEZFa0vduZMzGR0gpz4vs+2/gaP5c8TPySKeTx3LpwAB902qP2x7YzsslL7MtuC2yr19CP85PPp8MV0aMoheRliIvL48rr7yy6m2mtXZzPOMREREREWlOnJ7adDyQDZxtrV3sdDI2bGD4de2+B6y124DiGn0Oxk/Drx8ewjmiqrAc8stDGdjeqTauyViACls9KybBqIasSHNSmNyPTwf/lZz2x0b2neb+ijme6znTtYi8MnjoWzcfbjbUWO+Lru6u/DLtl0z0TMSEv9CwsXIjjxY9ytflX8f6NkRERERERERaLEdLFgDJhGajljt8nZrSw6+F9RzfU6PPATHGnAH8D7Ca0CJfByOzkePdCM3AZdy4cQwYMKDRE85ZvROWfgPA5CP6cerJjY9x0itz34fw5Lv+vQdw6oRT4xpPU/j9fubPnw/ApEmT8HpV+zYW9NzjI/TcU9macTRHb5uFq3QX7U0xjyQ9yhmBxdxUcQXv5qSzzaRz93nD6JFe/ecyhSl8teMrblt8G9v3bsdv/by892V2ddjF70b+jq7JXeN4Z82bPu/xoeceH+vXr493CCIiIiIizZbTCdkNQIrD14gJY8wY4CVCid4LrLUHVRytsa/sGVM9vdXj8eDz+Ro958rtJZH2mP6dmjTGSRXB6vx7qjc97vEcKK/X2+Jibg303GNva8YYyn70P/jm3gQrXwdginsx41yruaniCt7LPoZzHl/MtacM4pJj+pDgDn2p4rg+x/Fa99f4vy/+j/c2vgfA3M1z+WLbF1w18ip+PPTHJLic/t9Ly6bPe3zouceOx6NvyIiIiIiI1MfpkgXPAZOMMZ0dvk5NVTNj65sF2476Z8/WKVw39kMgCJxmrV158OFFX1Z2QaQ9sndG3OKo4q+sXsTLm5Qax0hEpFHJneCCmaEtuSMAHU0Rf096mEcSHybBv5tb317Fjx5ZwOfrqxcPbJfUjrsm3cXdk+6mg7cDAHsr93LvV/dy0TsXsXzH8tjfi4iIiIiIiEgL4HRC9j7gc+B9Y8xwh69Vpap27H51YsOLeqVSR33Z+oSTsXMIPavTrLVLohFktFQGgqzYXABAr/Y+uqTF/6uY/kD1KtbepLQGeopIszHsXLjqSxh6ZmTXme4vmOP5Axe657FmWyEX//sLfjVrGbkF1b90OaPfGbx1zltcOOjCSG3ZNflruPT9S7ll0S0U+AtifSciIiIiIiIizVpUE7LGmLk1N0KzSn3AaGC5MWaDMeaTffuFt4+jFMan4de6Cpeetk+fBtVIxrqB0621Xx56eNH13bYi/BVBAEb1bh/naEL8geqSBT6PErIiLUZqZ7jwOTj/SfCFfp50Mnu4O/HfvJX0F8aa1by7Yisn3fcpj85di78iAEC6J52bjr2J56c8z9AOQyOne23ta5z5xpm8vvZ1gjYYl1sSERERERERaW6iPUP2hDq2CTWu1ReYVE+/E6IUw8eEatfOMMaMrNppjEkHbgTKgWdr7O9ujBkSPk6N/UcRSsYmAGdYaz+PUnxRlZVTEGmPysyIWxw1+YPV5XW9Se3iGImIHDBj4Ihpodmyh58T2T3ctYn/eP6XxxIfpGPlVu79cA2nPjCfOau2Y60F4MjORzJr6iz+NPZPpCSGyocXlBVw86KbufyDy/l+9/fxuCMRERERERGRZiXaq65MjvL5Dpi1ttIYcyXwX2C+MWY2UAScD/QBrrPWbqox5G/AZcAVwEwAY0wHQsnYDOAD4BRjzCn7XKrAWvugYzfSRFnZ+ZH2qGZQPxbAH6iItL3e+kr5ikizltYVLnwGNi2A9/8E278BYKp7MSe7sngicAZ/3302P3/2K44f1Jm/TB3KwK5pJLgS+PHQH3Nqn1O5Z8k9vL/pfQCydmRx4TsXcvaAs7lq5FV0S+kWz7sTERERERERiZuoJmSttU0qBeA0a+08Y8xE4DbgIiAR+Ab4o7X2pSacoh1Q9f3/08Pbvn4AHjz0aA/N8vCCXkluF4f3aB6zUUuD1QlZj6d5xCQiB6nvRPifTyHreZj7v1CyE4+p4FcJb3GBez53V17Eq2uO47S1Ozl3VC+uOXkgmR2S6ZzcmbuPv5tzBp7DHV/ewQ97fiBog7y+7nXe2/geM4bM4GdH/Ix0j35pIyIiIiIiIm2LEzVk/xDNcx4sa+1ia+0Z1tp0a22ytXZcXclYa+3l1lpjrZ1ZY9+m8L6Gtr6xvJ+65JeUsyGvBIBhPdvhSXDHOaIQv62MtH3ejPgFIiLR4XLDUZfBb5bB+KvBlQhAF1PAvYn/5M2kmzjGfMury3I48b5PuOmNb9mxJ7S43/ge43ntrNe4ZvQ1pCWGakqXBcp4euXTnPHaGTz17VP4K/31XlpERERERESktXGihuyQKJ9T6rF8c0GkPSqzeSzoBbUTsh5PRvwCEZHo8raDU/8XfvUlDPlRZPeRro3MSrqDV5NuZbxdznNfbGLSPfP423uryS8pJ8mdxM+O+Bnvn/8+lw+7nCRXEgBF5UU8sPQBpr4+ldfWvkZlsLK+K4uIiIiIiIi0GtFOyEoMZYXLFUDzqR8L4LehldcTrSUh0RvnaEQk6joOgOkvwE/egi7DIruPcq3lmaS7eDPpJiYElvDP+euZdPc8HvpoLUX+CtI96Vx79LW8c+47nHPYObhM6H9BO/bu4JZFt3D+W+czN3tuZJEwERERERERkdZICdkWrDku6AXgt0EAvMqpiLRu/Y+HX34G5z8Jnau/HDHCtYEnk+7j3aQbmVCxiAc/+o5Jd8/jn5+up7isku6p3fnfCf/LK2e+wgm9ToiM21C4gd/O+y0XvXMR/930XwLBQBxuSkRERERERMRZSsi2UMGgZXlOAQCd0zz0zPDFN6AaSgllYn1KyIq0fi43HDEN/t/ncMEz0PWIyKFhrh94POlBPkj6ExP9n3LX+6uYcOdc7v/we3YVlzGw/UAeOekRZp4+kxGdR0TGrd69mus+vY5z3jyH19e+TkWgoq4ri4iIiIiIiLRISsi2UBvyiinyh+otjsrMwBgT54iq+cOheGk+MYmIw1wuGHZOaMbs9Behx6jIocGuzTyS9CgfJV3HWeXv8sTcb5lw11xufWslm/P3clTXo3jujOd4aPJDHN7x8Mi4TXs2cfOim5ny+hReWP0CpZWlcbgxERERERERkehyIiF7mTEmcBCbVnM5AMtq1Y9tPgt6AVStl+41yveLtDnGwJAp8PN58ONXoNfYyKH+rm38b+JMPvf8mmvs83y46CtOuOcTfv+f5azdUcyJvU9k9tTZ/POUfzKm25jIuG0l27hz8Z2c9spp/HvFv9lTvicedyYiIiIiIiISFU5kzMwhbNJEzXVBr2CgkjJX6I/SizvO0YhI3BgDA0+Bn30IP3kT+k2KHEo3e/llwjvM91zDQ+4H+CFrLqc+8ClXPvMVy7ILGN9jPE+d9hTPnfFcrRqz+WX5PJz1MKe9chr3LLmHjYUb43BjIiIiIiIiIocmwYFzfgDc5cB5pYaqBb1cBo7slR7naKqVlVXPXPO5lJAVafOMgf4nhLZt38KX/4AVL0OgjAQTZKp7MVPdi/k62J+nvj+d6auPYXDPDswY24ezRg7nkZMeYU3+Gp785kk+2PQBQRukuKKYZ1c9y7OrnmVMtzFMGziNk/ucTJI7Kd53KyIiIiIiItIoJxKy26y1nzpwXgkrLqtkzfYiAIZ0a0dykhN/jAfH78+PtL2m+cQlIs1At+Fw9mNw0q3w1VOw5Ako2QHACNcGHkr6OzfaWby0/QT+/sYJ3P5ud84e2YMZY/tw16S7+PXIX/P0yqd5c92blAfLAViybQlLti0hY3EGZw84m2mDptE3vW/87lFERERERESkESry2QKtyCkgaEPt5lSuAMDvL4i0PS4lZEWkDqmd4YQ/wu++hXMeh25HRg51NQVcnfAG85N+x+P2dvZ89TLnPzqPHz3yGfNXB/n96Bv5+IKPue7o6+jbrm9kXEFZAc+seoYz3ziTn/73p7y34T3KA+VxuDkRERERERGRhilj1gJl5RRE2iMzM+IWR11Kywojba9LXx8WkQYkeGDkxTBiOvywCL74O3z/PtgALmOZ5P6GSe5v2GXTeG37cTz1xmT+793enD2yBxccfRaXnn0pS3cs5ZU1rzDnhzlU/P/27jy+rrrO//jrk9xsXdIVGuhCoVB2oUKRfXEBXGF+zrj9HMXfoKP+Zh7jOPMbUWcBh9Fx/KnjLDouM8LoqDgo7v5Ai6xCC1g2BVoKTdd0T9ukSZrl+/vjnKS3IWkbSe/N8no+Hnmce8/5nnM/9+TQkHe+93N6OoF9s2anLJvClfOv5HXHvY4zjjiDCFuVS5IkSZLKz0B2FOrtHwvw0mOmlbGSF2rfr4esgaykQxAB8y/IvnZthEf/C5Z/DXasBmBG7ObdhZ/w7sJPeKhnIbc8chlvX/YyjpgxnavOOJr3LPorrjvnOn6w6gfcuuJWVu/K9tvZsZNbnrmFW565hbmT5/K6417Ha497LcfUH1O+9ypJkiRJGvcMZEeZlBLL1zQDMKWuimNnTCxvQf0UB7K1lTVlrETSqFR/FFz853DhB2H1vfCrm+GpH0LefmBxxQoWV6zgbwtfZcmuRfz4rnN57Z1ncsLsI7nqzIv4ysvfxJq2J7l1xa0sWbOEju4OANbuXssXHvsCX3jsC7xk5kt47XGv5cpjr2R67fRyvltJkiRJ0jg0rIFsSsmetIfZ2u1tbGvNgokz506lomJkfQS3fe/uvse1hdoyViJpVKuogOMuyb72bIfHvpWFs1ueBqAu9vK6yqW8rnIpe1INSzYv4kc/PY9P/+QMzlpwNFed+Ud84KrrWLbpHn743A9ZtnEZiaz59uNbH+fxrY/zqYc+xfmzz+fK+Vdy6dxLmVw9uZzvWJIkSZI0TjhDdpRZvnZfu4KRdkMvgLbOlr7HBrKShsWE6XDe++Hc98G6h+HRr8NvfgBt27PN0cHrKx/k9ZUP0pJq+XnjS/nxc+dyQ8WZnHvC0bz6tOu57qzgvo0/40fP/YhndjwDQFfq4p5193DPunsoVBQ496hzufyYy7ls7mVMrZ1axjcsSZIkSRrLDGRHmd52BQAvnTey+scCtO9t7XtcV6grYyWSxpwImLs4+3rNp2H1PfDr27KWBm3ZH6smRTtXV/6Sqyt/SUuq5Z5nX8KSZ17KJ1nEycefwu+e9nIWnL2b+zbewY+f+zGb9mwCoKuni/vW38d96++jMio5u+FsLj/mcl4+7+XMrJtZznctSZIkSRpjDGRHmeIbep0xd2r5ChlEe+e+QLa2MKGMlUga0yoLsODl2ddrPwPP3Q2/vo309A+J9p1AFs6+pnIZr6lcRk8Klq8+niWrXsrNnMW0Y87lHadfzdENTTyy5R5+1vizvnC2O3WzdONSlm5cyo0P3siiIxfxinmv4KI5FzG/fj4RI6tVjCRJkiRpdDGQHUXaO7v59YbsplnHHzmJKXVVZa7ohdq72voe11aNrBuOSRqjKqvghFfCCa8kuj4Lz92VhbMr/h+RtzWoiMRZsZKzKlbyF9zC2nVHsGTNIv6z56XsOeplXLnwDcw9cRtrO5ayZM3PWdeyDoBE4lebf8WvNv+KTz38KWZPms2Fsy/kotkXsbhhMROq/MOTJEmSJGloDGRHkV9v2ElXT3ZTmkUjcHYs9Atkqw1kJZVYoRoWXg4LLyd6umHdQ/DMT7NwNr8hGMDcii1cU3EH13AHbVurWbr5ZO7tOZ1HqhYx79iP8ar5LbRVLefBTb9g9a7Vffutb1nPLc/cwi3P3EJVRRVnzzqbC2dfyIVzLuTY+mOdPStJkiRJOigD2VGkuH/sohHYPxagvau973Fd1aQyViJp3KuohHnnwrxziVfdANufhxW3k1b8lLT6fip6OgGoi71cWvkYl1Y+Bnydpuemce/K07m35yVUTvsDXnV8HROmrmBd+3Ie27qcrp4uADp7Onlg4wM8sPGBvtmz5zScw+KGxSxuWEzDxIYyvnlJkiRJ0khlIDuK7B/ITi1bHQfS3r0vkK2pNpCVNIJMPxbOfS9x7nuJ9l2w6k5Y+TO6n11CZcvGvmENsYPfK9zD73EPtMITy+dzf8/pbEwnsbDhKmbO3UV37VOs2v0QTXua+vZb37Ke2569jduevQ2AuZPnck7DOZzdcDaLZy2mvqK+5G9ZkiRJkjTyGMiOIr039JpQXcnCWZPLXM3A2ro7+h7X1ozMGiWJ2no49Wo49WoqU4Itz8CqO0mr7iQ9fy8VRX9cOr1iNadXrOa9/JCercHTW+axtOckKtN5zJw9n9qGbbRUPMlzu59kb8/evv3W7l7L2t1r+c7K7wAwd9JcZu2dxfzCfE5tOZUFtQtscSBJkiRJ45CB7CjRtLOdDTuzgOCMOVOprBiZv8S3d+8LI+pqppSxEkk6RBFw5Elw5EnEee8nujpgzYOw6s5s9uymJ/qGVkTilGjklIpG3sXtsBlWNR3Fsp6TeDhewaajZtJ9xB7aKleypvUpOvO2CABrW9aylrU8vPdhbv3JrRxZdyRnHnkmi45cxKJZizhx2okUKvyxLEmSJEljnb/5jRKPrt3R93iktisAaC+aHVZrICtpNCrUwHGXwHGXUPmqG6B1KzT+Ehp/Sefz91HY/CRB6hu+oGIjCyo28lZ+AZuhedNEHutZwEOczorpR7DzyEpaqhvZ0PYMXamrb7/NbZu5o/EO7mi8A4C6Qh0vmfmSvpD2tJmnMcV/RyVJkiRpzDGQHSVGww29ANqLZoPV1k4tXyGSNFwmzoRT3gCnvIEqgLZmWLsMGu9n73P3UWh6lIqioHVqtHJJ5eNcwuOwE9gJz/fMYhnH8UDdTBonVdA2o5NtPc/R3r2nb7+2rjaWNi1ladPSvnVzJ8/ltBmncdrM7Ouk6ScxoWpCyd66JEmSJGn4GciOEsWB7Jlzp5atjoNpLwolDGQljUl1U2Hh5bDwcqoB9u6BdQ/B2mV0NC6D9Q9T07F9v12OrdjEsWzizR1AB3RtreCZNJs7C0fzWP0UmuphW/UWWrq37bdfbx/an67+KQAVUcHxU4/ntJmnceqMUzl5+skcP+146gp1JXnrkiRJkqQXz0B2FOjs7uHx9c0AzJ1exxGTa8pb0AG09XRDRfa4tmZqWWuRpJKontDX4qAGICVoboR1D9O55iHaVi9lwtZfU0j7WroUoodTYy2n9qyFZqAZulPwYMVsflZ7JE9PqGPzxC62V26lm32fPOhJPazYsYIVO1bw3ZXfBbKQdt7keSyctpATp5/IidNO5MTpJzJrwixvGiZJkiRJI5CB7CjwTNNu2jt7AFg0d+S2KwBopxuAmp5ERaWXl6RxKAKmzYdp86k6/XezNgdde2lf8whPL/kGdS3PM6tnE/W7V1GR/5sJUBmJC9I6LmhbB23ANugEHqqazt3VR/BEXR0b6rrZXthNoqdvv57Uw+pdq1m9a3VfP1qA+up6Fk5byMJpCzl+2vEcP/V4FkxdQH11fanOhCRJkiRpACZmo8DyNaPjhl4AHSkLCWrLXIckjSiFatJRZ9J45GY4EuZdfjkVBWDTb+jZsJzdzz9M2rCcybtWUpn2hbRVwPmd2zm/czu0ZuvaIvh1VQ331szgiepJrKkNtla10x09+73krr27eHjTwzy86eH91s+aMIvjp+4LaE+YdgLHTTnO3rSSJEmSVCIGsqPAaLmhF0AbCQhq00GHStL4VlUHc86iYs5ZTDnn2mxdZzts/jU9G5+kZe1jdG54ggk7nqGua2ffbnUpcfbeds7eu75vXRfQWFXgmepqHqmu58nqCaytgd2VXfS3ac8mNu3ZxP0b7t9vfcPEBubXz8++pszn2PpjmT9lPg0TG6iIisNyCiRJkiRpPDKQHQWWr20GoLpQwSlHjeyPmrbn7QrrsG+hJA1ZVS3MPouK2WdRf3a+LiVo2QSbnqR17eO0rHmcyi1PMaV1FVUp6y9bABZ0drGgs4vXtO7pO9z2igqera7i2aoqnq6u5amqCTRWB22VL/yrWVNrE02tTTy48cH91tdW1jKvfh7z6+dzTP0xzKufx9zJc5k3eR4z62bap1aSJEmShshAdoTb0bqX57dmn1M97eh6qgsje5ZSbyBb42wqSRoeETC5ASY3MPH4VzKxd31PNzQ30r35GZrX/Jq2Db+hcvtK6lueZ2LPbgCm9/RwTnsH57R3AC0AJGBLZWVfUPtsdRUrqmpZXVWgtfKFL9/e3d53I7H+6gp1zJk8h3mT5zFv8rzscf08Zk+aTcPEBqoqqg7LKZEkSZKk0cxAdoR7NJ8dCyO/XUF311725jOlahngt3pJ0vCpqITpx1E5/ThmnPTqfetTgtatdG1+mh2NT9C64Rli+7NM2N3ItL0bKNDNkd3dHNnWzflt7ft2A3ZUVLC6qorVVQVWV1XxfFWB56qqWV9VSfcAM2HbutpYuWMlK3esfMG2yqikYWIDsyfNZs7kOdly0hxmT57N7EmzmVE7w9m1kiRJksYlA9kRblTd0Ku9ue9xbYWBrCSVRQRMOoLCpCM44riLOKJ4W3cnNK+hZcNT7Fj7FHs3raByx3PU71nD1K4tTO/pYXpHBy/t6NjvkJ3AuqoCawsF1lYVWFOoYm3+fF1Vga4BgtXu1M36lvWsb1nPsqZlL9heU1lDw8QGGiY00DCxgaMmHUXDhAaOmngUDZOy9d5oTJIkSdJYZCA7wi0vmiH70hE+Q7atKJCtCz+mKkkjTmUVzFjApBkLmHT66/bf1tVBal7DjnUraN6wgr2bV1Gxs5EJrWuZuXcDx3Z2cGxnF7Ttv1s30FSoZG2hwJqqKtblIe26QoH1hUp2VQ78B7qO7g4adzXSuKtx0HKn1kztm1VbvJwzaQ4Nk2yJIEmSJGl0MpAdwRLw6JpmAGbV13DUlNqy1nMw7R3NfY9rK7y0JGlUKdQQM09g+swTmH7ma/fflhKpZTPNG1fRvGEVbVtW09O8hsLudUxs28D0zk3M7mrj3PaOFxx2V0WwvtAb0O4LazcVKtlQKLCnYvCe480dzTR3NPPktidfsK0iKmiY0MDc+rmcPP1kTp1xKqfOPJU5k+bYCkGSJEnSiGZqNoI1btvD7o4uABbNnTbif8Fsb9/Z97i2orqMlUiShlUEMXkW0ybPYtrC81+4PSVSWzPNG1exs+k59mxppGvHOip2r6dmTxMz9jZxwt5tFPpNr03A7oqgqbJAU6GSjYV9y415YLupspI0wM+/ntTDhtYNbGjdwNKNS/vWT6qo48T6BbzkiNM54+jFLJh8AimlEf8zVJIkSdL4YSA7gv1m4+6+xyO9fyxA+95dfY9rKw1kJWnciCAmTGPagrOZtuDsgcf0dNO+YwPbNz7PzqbVdOzYQPeuDVS0NFHTtoVj9m7lzLZt1LNzv932AhvzmbW9M22zx5WsKxRe0BKhpaeNR5qf5JHmJ2HlNwGY2g3ntc3hVT2vPBzvXpIkSZKGxEB2BNs/kB3Z/WMB2jr21VtXWVPGSiRJI05FJbUz5nL0jLkcfdrFgw7b29bKtk1r2LlpDa3bN9DZ3ERPyyYKrZtZ2L6VM/dsY0r3dqanHVRFN1srKvhNTTW/rqnmyZoanqypZnu/kLa5En46aR3H3nED7/udfzjc71SSJEmSDshAdgT7TVMLMIHKiuD02VPKXc5BdXS29D2urRzZ/W4lSSNTdd1EjiGMyQkAABj9SURBVJp/MkfNP/mA4zq7umja2sTOTeuYtGMjZ+5o4tTdm3lT6yZ2tzexIW1mXWE3z1d38mhdFtB+Y8ePuWrL+zj6iGNL8VYkSZIkaUAGsiPY6q17qKyfwMlHTaaueuC7VI8k7XuLAtlCXRkrkSSNdVWFAg0Nc2homHPAcXtaW3nvzRezfOJemisruPH77+Lz195VmiIlSZIkaQCD39pYZZfy5aK5I79dAUBbZ2vf49oqA1lJUvlFRQUXTnonE3t6ALi3ahu33fX5MlclSZIkaTwzkB0FRsMNvQDaiwNZZ8hKkkaIWVOO4ZLWhX3P/+3Zz9Oyp7l8BUmSJEka1wxkR4HRcEMvgPauPX2Pa6smlrESSZL2t/iot3NiRwCwoSr4u29fU96CJEmSJI1bBrIj3NQJVcyfMaHcZRyS9s62vscGspKkkaSqUOAPTvkIhZQ1BPopz3Lfoz8sc1WSJEmSxiMD2RFu0dypRES5yzgkbd3tfY9rqyeVsRJJkl7o0rOu4vKu+QB0R/DZZX9Jd3dneYuSJEmSNO4YyI5wo6VdAUB7175Atq66voyVSJI0sOvedBOzO7NZsitqevj0t99X5ookSZIkjTcGsiPcaLmhF0B7d0ff49qayWWsRJKkgU2rn8k1c9/d9/y77Q/w1POPlLEiSZIkSePNmA5kI2JxRPwkIpojojUiHoyINw3xGDUR8dcRsTIi2iNiQ0R8KSKOPFx19702cMbcqYf7ZYZNe8/evse1NVPKWIkkSYN7yxV/woXtUwForajgH372/vIWJEmSJGlcGbOBbERcBtwPXAh8G/g3oAG4JSL+7BCPUQF8H7gB2Ar8I/AAcC3wQEQcMfyV7zNvxgTqa6sO50sMq7aiPnx1BrKSpBHsQ6/7CtO6ewB4uGYP//6DvylzRZIkSZLGizEZyEZEAfgy0ANcnFJ6T0rpz4AzgBXAxyPimEM41DuBK4BvAuenlK5LKb0ReD9wHHDjYXkDuVMaRteNsTpSV9/j2tqp5StEkqSDmD/7RN5Uf2Xf869tuZWmrWvLWJEkSZKk8aJQ7gIOk5cDC4CvppQe7V2ZUtoZER8HbiILWz92kOP0Npn7cEopFa3/IvB/gP8ZER9IKbUdamERMecgQ2b3PjiyooWVK1ce6qHLbuvWVjojmyW7bv12tmztOsgeI0dHRwdbt24FYNWqVdTU1JS5ovHB814envfy8LyXx4HO++Wnv4c7b7uD39R00gR85N/fzIf/x81lqnRsaWxsLH5aWa46JEmSpJEo9s8Zx4Y8dP0w8NaU0rf6bWsANgJ3ppRecYBj1AKtwMqU0kkDbP834A/JZuDeO4Taxt4JlyRJGtzilNLD5S5CkiRJGinGZMsC4IR8+YLppSmlJqClaMxgFpCdn8GmqPauP9hxJEmSxrPDfiNUSZIkaTQZqy0Leu8otXOQ7buKxryYYxSPO1RzD7J9HtnNyADOBdYP8fj67TQAD+WPFwNNZaxlPPG8l4fnvTw87+XheS+P2cCD+eOny1mIJEmSNNKM1UB2xEoprTvQ9ogofrr+YOM1PPqd9ybPe2l43svD814envfy8LyXR7/zvrdcdUiSJEkj0VhtWdA7q3Ww2av1DD7zdSjHKB4nSZIkSZIkSQc0VgPZQfu75jf1msTgvWF7PQf0DHSMfsc+2HEkSZIkSZIkCRi7gezd+fLyAbZd0W/MgFJKbcAy4MSIOKZ4W2Sfw3sV0Ap412BJkiRJkiRJh2SsBrJLyGa4vi0izuxdGRFTgI+Q9TL7z6L1R0XESfn2Yl/Kl5+I/Zuh/SFwHPBfeXArSZIkSZIkSQc1JgPZlFIXcC3Z+7snIr4UEZ8GHgMWAh9JKa0u2uUTwFPA7/Q71M3A7cBbgV9GxN9HxK3A54Hngb88rG9EkiRJkiRJ0pgyJgNZgJTSL4ALgfuBNwPvAzYBb0kpffoQj9EDXAVcDxwB/ClwAfDvwHkppS3DX7kkSZIkSZKksapQ7gIOp5TSMuDVhzDuGuCaQbZ1ADfkX5IkSZIkSZL0W4uUUrlrkCRJkiRJkqRxYcy2LJAkSZIkSZKkkcZAVpIkSZIkSZJKxEBWkiRJkiRJkkrEQFaSJEmSJEmSSsRAVpIkSZIkSZJKxEBWkiRJkiRJkkrEQFaSJEmSJEmSSsRAVpIkSZIkSZJKxEBWkiRJkiRJkkrEQFaSJEmSJEmSSsRAVpIkSZIkSZJKxEB2BImIxRHxk4hojojWiHgwIt5U7rrGsohYHRFpkK+7yl3faBYRb4+IL0bEwxHRkZ/Taw4wvj4iPhMRjfn41RHxqYiYVMKyR72hnPeIuP4A13+KiPmlrX70iojZEfGBiLgjItZExN6IaIqI70TEywbZx2v+RRrqefeaHx4RUZtfu/dExIaIaM/P+/0R8a6IqBpgH693SZIkKVcodwHKRMRlwO1AO/AtYDfwRuCWiJibUvp0Oesb43YC/zjA+tWlLWPMuRE4BtgKbMwfDygiJgJ3A2cCdwDfBBYBfw5cEhEXp5TaD3fBY8Qhn/ciNzPw9d48bFWNfX8MfAhYRXYNbwFOAK4Gro6It6WUbukd7DU/bIZ03ot4zb84k4D3AcuAH5Od92nAq4H/AN4SEa9OKfWA17skSZLUn4HsCBARBeDLQA9wcUrp0Xz9x8h+2fl4RNyaUmosX5VjWnNK6fpyFzEGXQusTCk1RsR1wCcOMPYvyH5R/2RK6brelRHx92Rhy58eZH/tM5Tz3uumlNJdh7esMW8ZcGlK6e7ilRFxEbAE+EJEfC+l1JFv8pofHkM977285l+c7cCUlNLe4pX5/8/8DLicLJz9cb7J612SJEkqYsuCkeHlwALgG71hLEBKaSfwcaAaeGd5SpN+Oymlnx/KHxEiIshCxBbgb/tt/tt8/bXDX+HYdKjnXcMrpfTd/qFgvv5e4BdkswdPB6/54TSU867hk1Lq6R/G5uu7gNvyp8eD17skSZI0EGfIjgyX5ss7Bth2e768pDSljEs1eY/No4FdwEMppaXlLWlcOYHs3N+eUmot3pBSao2I+4Er8tYda8tS4dh3cd5vswdYCfw8pdRS5prGks582ZUvveZLo/95L+Y1fxhERAVwZf70yXzp9S5JkiT1YyA7MpyQL1f235BSaoqIlqIxGn4NwFeLV0TEQ8BbU0qrylPSuDLo9V+0/op8nL+sHx439HveHBF/klL6z7JUM4ZExDzglWT9fJ/IV3vNH2aDnPdiXvPDICKqgY8AAcwAXgGcBHw1pbQkH+b1LkmSJPVjy4KRYUq+3DnI9l1FYzS8vkr2C+QsYCLZTUa+BiwGlkTE5DLWNl4cyvVfPE7D5zHgfwHHAXXAsWQ3SUrATRHxhjLWNurld5r/GlADfCil1J1v8po/jA5w3sFrfrhVA38D/DXwv4ETgf8LvKdojNe7JEmS1I8zZDWupZT6z5J6FHhH1vKO3wfeDXymxGVJJZFSuq3fqtXAv0TEU2Q35rkR+EGp6xoL8o9u3wRcDHw5pfS18lY0PhzsvHvND6+8zUPk5/1o4PVkve/Pi4jXpJR2HfAAkiRJ0jjlDNmRoXfWyGCzQ+oZfGaJDo8v5ssLylrF+HAo13/xOB1m+UeNVwGnR0T9wcZrf3k49R/A24CvA+/tN8Rr/jA4hPM+KK/5Fye/yde6lNIXyGbHXgB8NN/s9S5JkiT1YyA7MvT2VXtBn9iIaAAmMXjvNR0eW/PlxLJWMT4Mev33W+9/A6XV+9/AhLJWMcrkoeBXgXcC3wSuSSn19BvmNT/MDvG8H4zX/PDovUHppfnS612SJEnqx0B2ZLg7X14+wLYr+o1RabwsX64uZxHjxEpgA3BBROwXgOfPLwCe9+7bpZOf91OBVvaFVDqIolDwHcAtwO/361/ay2t+GA3hvB/oGF7zw+fofNmZL73eJUmSpH4MZEeGJcBzwNsi4szelRExhezuxXsB7/w8zCLipIh4wUyoiDgJ+GT+9BulrWr8SSkl4CtkM8H/qt/mv8rXf7nUdY11ETE5IhYOsL6O7HxPBr6dUuoqeXGjUNHH5d8B/Dfw9sFCQa/54TOU8+41P3wi4pRBfn5OYF/f9Z+A17skSZI0kMj+P1nlFhGXAbcD7cC3gN3AG4FjgD9PKX26jOWNSRFxPfBB4B6gkWxm1ELgNUAV8ImU0kfKVuAoFxHXAhfmT08HXgrcDzybr7svpfSVfOzEfNsZZB93/VU+/nLgIeCSlFJb6aofvQ71vEfEfLI/BD0EPAU0AbOAVwJzgCeAy1JK20pX/eiV/3vyN0AL8DlgoFDveymlR/PxXvPDYCjn3Wt++BT9/LyP7JMku4DZwKuBGcC9wBW917DXuyRJkrQ/A9kRJCLOAW4AzicLBJ8APpNSuqWshY1REXEJ8H5gEdkv5RPIPqq6FPh8SumOA+yug4iIm8j6OQ7m5pTSNUXjpwDXk/0hogHYSDbj7YaU0u7DVugYc6jnPb9x0ceBc4D5wDSgjSyouhX4FwOSQ3cI5x3gXSmlm4r28Zp/kYZy3r3mh09EnE12867zyYLYSWQ35Xqc7I/K/9F/prHXuyRJkrSPgawkSZIkSZIklYg9ZCVJkiRJkiSpRAxkJUmSJEmSJKlEDGQlSZIkSZIkqUQMZCVJkiRJkiSpRAxkJUmSJEmSJKlEDGQlSZIkSZIkqUQMZCVJkiRJkiSpRAxkJUmSJEmSJKlEDGQlSZIkSZIkqUQMZCVJkiRJkiSpRAxkJUmSJEmSJKlEDGQlSZIkSZIkqUQMZCVJkiRJkiSpRAxkJUmSJEmSJKlEDGQljSsRcWlEpIi4/jC+xvX5a1x6uF5jtIiI+fm5uGmI+y2KiO6IeNthKu1Fi4hr8xpPL3ctkiRJkqTRw0BW0ogWEefmgd7/G2T7P+bbnx5k+wfy7X97eCv97UXm7RFxZ0Rsi4i9EbEpIpZHxOcj4pJy11gGnwGeBr51uF8oIs7Or5E/GuKuNwONwKcOQ1mSJEmSpDGqUO4CJOkgHgZagAsiopBS6uq3/TIgASdGRENKqWmA7QB35stlwMnA1sNV8G/hP4BrgB3Aj4D1QB1wBvAHQD1wd7mKK7WIeDlwKfAHKaWeErzkVfny+0PZKaXUGRGfBf4pIi5IKd0//KVJkiRJksYaZ8hKGtHyAPZeYBKwuHhbRMwATgduy1dd1m97BXAR0AE8kB9vT0rp6ZTSiAhkI+IisjD2UWB+SukdKaUPp5Q+kFK6DJgFfL6MJZbD+4A24NYSvd5VwK9SSmt/i32/BXQB7x3ekiRJkiRJY5WBrKTR4Bf58tJ+6y8BAvgnYDv9AlmyGabTgAdSSu0weA/ZiFidf02KiM9FxIaI6IiIxyPidwcqKiLmRsQ3I2J7RLRExN0RcfEQ39t5+fLmlNKu/htTSs0ppV/2e92b8vdwXET8RUSsjIj2iHg+Iv46IqoGqffiiPhhRGzN39vKiLgxIia82PERURkRH4qIZ/Nano2IDzPEnzMRMY0sIL29//ko7kcbESdHxI8iojkiduTfh5n5uPMiYklE7Mq3fSUiJg7yeseShfrfL1o3JSI+FhG/yb+vu/L3c3NEHFO8f0ppC3AX8LsRMWko71WSJEmSND4ZyEoaDXoD2f6B62VkMykfJJtFO9D24v0Ppgq4A7gc+A7wdWAB8O2IuLx4YEQcRTbr9i1kbRB6Q+GfAece4usBbMuXC4ewT69/BD4E/Bz4Z7KZwDcA3+w/MCLeRxYcXgD8OK93HfBR4GcRUf1ixgNfAv6e7OfKvwK3Ax8EPjfE93Qx2ffhwQOMORb4JVADfAV4jOz78L2IuBBYQtbm4kvAKrK2D/88yLGuzpffh6yfb177X5F9P7+Ufy0H3gCcMMAxHgBqgfMP4f1JkiRJksY5e8hKGg2WAzuB8yOiKqXUma+/FHgwpdQREXcDV0XEnJTSuqLtcOiB7NHAQ8ClKaW9ABHxDbLA84NkYW2vTwCzgb9MKf1d78qIeA/wxSG8t9uBXcB7I2IKWfuFh1JKjYew77nAGb3vNyI+ShYIvzEi3phS+k6+/hSyQPVx4BUppd4QmIi4Ln8vfwx8+rccfynwv8iC0QtSSq35+o+TtWIYigvy5SMHGHMx8IGU0ufy1wmy3ruvAX4IvDWl1BuwVpH1If79iPhwSmlTv2NdBaxOKT2WPz8NeBnwvZTS7xQPjIgasrC4v4eLar9jgO2SJEmSJPVxhqykES+l1A3cA0wEzgGIiCOAU8lmccK+m15dlm/v7R/bBiwdwsv9aW8Ym7/2EqCRov61+ezQNwObyUPJIl8BVh7qi+Vh6huBtcDbgP8GVkfE5oi4Jb/B1WA+VxQ+k9f90fzpNUXj/pDsD3B/XByu5v4B2AK89UWMf0e+/FhvGJvXs56hz5Cdky/7B6fFVpEFxr2vk8h6uQIs7w1j822dZL1oC8ApxQfJexBfyMA382rrvyKl1JFSahlgbG+tcwbYJkmSJEnSfpwhK2m0uAt4PVngej/Z7NdgXyD7KNks2suArwFnAlOBnxcHrAfRnFJ6foD169jX6xXgRLKPqN/Z25u2V0qpJyLuZ+CPtg8opfTziFhA9p4uBs4iCwrfBLwpIj6RUvrIALveO8C6B8huMrWoaF1vC4UrIuIVA+zTCZz0IsafcYB6Blp3IDPyZfMBxjyeh7DFNubLRwcY37vt6H7rXwtUsn8g+xTZzOC3RsQc4Htk19ijKaWeQerZni9nHqBmSZIkSZIAA1lJo0fxjb1uzJft5LNf8yD0Pvb1je1d3jmE19g5yPou9v9EwZR8uXmQ8Qea3TmglFIXWWuEnwNERIFslusXgA9HxK0ppV8d7HVSSt0Rsa2oRoDp+fKj/ccPYqjjpwA9wNYBtg31XPTOTK09wJgX3PyM7Ht0sG392w1cTRam9oXGKaWufFby9WQzl3tnQG+JiH8B/i6fsV2sLl/uOUDNkiRJkiQBtiyQNHo8Buwg6yNbTRa4PphS6igacxcwPyLmM/T+sUPRG9weOcj2WS/2BVJKXSmlrwDfyFf1v2HZgK8TEZVks0yLw+XekLI+pRSDfb2I8TvJfp4MNEN0qOdiS76cfsBRL1JE1JLdvO3HeRjeJ6W0LaX0x2Q9gk8B/ogsuL0B+IsBDtdb65YBtkmSJEmStB8DWUmjQv5x8bvJZiO+ATiZfe0KevX2kX0lWf/YFvbdcGk4rSCbnXt2Huz1yXvXnj+MrzVQz9JeFw2w7jyyTz8sL1rX20P33BcOH9BQx/feEGugegZadyBP5MsTh7jfUL2SrCfxQP1jgaw3bUrpqZTSvwKvyle/YYChvbU+McA2SZIkSZL2YyAraTTpne36N/nyrn7bfwXsBv6E7GP09/af/Tgc8lm53yabIftn/TZfCyw81GNFxJURcVXeoqD/tuOB38uf3jfA7n+S9zntHV8N/F3+9KaicZ8n+9j+P0fEvAFeZ2pELHoR47+WL/86IiYWjZtN9r0Yit5Q/WVD3G+orgI6gNuLV0ZE7wzr/npn+rYPsK231rsH2CZJkiRJ0n7sIStpNOkNZE8jC8YeLN6Y90+9H7iy3/jD4TrgFcCNEXEh2YzUk4HXAHeQfRz+UJwEfBbYGhH3AKvIblZ2fH6sauALKaWlA+z7IPBYRNwCtJLd9OxE4Lsppe/0DkopPRkR7yfrR/tMRPwkf53JwHHAJWQB7nt/y/G/iIivAu8CnoiI24Aa4M15ja87xHMB2Q21nmPfjNRhl89ifj2wJKXUfwbymcB3I2IZ8Bugiax1wdVkfXI/2+9YQXYdPJVSWnG4apYkSZIkjR0GspJGkyfJbhw1kxf2j+11NyUIZFNKGyPifOAfgCuAi4FHyILEl3Pogex/kbUluAI4Pd+/lux93gHcVByu9vMBshm01wLzgI1kN6P6xAD1fjkiHgU+mNf6erLer2vIQsabX8x44N1krRzeTdZzdR3wGbKZxIccyKaUUkR8EfhkRJyTUlp2qPsOwblkM16/N8C2h4FPkvUgfi0wlSyU/TnwqZTSg/3GX0x27j9wGOqUJEmSJI1BkVIqdw2SpCGIiJuAdwLHppRWl7ea4RcR08lmyf53Sundh+H4nwT+D3B0SqnpRR7r68CrgQUppeZhKE+SJEmSNMbZQ1aSNKKklLaTzfJ9Z0Qccxhe4ipg6TCEsQuBtwA3GsZKkiRJkg6VLQskSSPR58j60M4DGofzwCmlk4bpUHOAG4B/HabjSZIkSZLGAVsWSNIoM9ZbFkiSJEmSNJYZyEqSJEmSJElSidhDVpIkSZIkSZJKxEBWkiRJkiRJkkrEQFaSJEmSJEmSSsRAVpIkSZIkSZJKxEBWkiRJkiRJkkrEQFaSJEmSJEmSSsRAVpIkSZIkSZJKxEBWkiRJkiRJkkrEQFaSJEmSJEmSSsRAVpIkSZIkSZJKxEBWkiRJkiRJkkrEQFaSJEmSJEmSSsRAVpIkSZIkSZJKxEBWkiRJkiRJkkrEQFaSJEmSJEmSSsRAVpIkSZIkSZJKxEBWkiRJkiRJkkrEQFaSJEmSJEmSSuT/A4tIxBhqG7jhAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "tl.plot_comparison(\n", + " exclude=[\"nrel_5MW\"], # Remove a turbine just for demonstration\n", + " wind_speeds=np.linspace(0, 30, 61), # 0 -> 30 m/s, every 0.5 m/s\n", + " fig_kwargs={\"figsize\": (7, 6)}, # Size the figure appropriately for the docs page\n", + " plot_kwargs={\"linewidth\": 1}, # Ensure the line plots look nice\n", + ")" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "38f654ff-82f5-4019-8c43-e31c1b783cc1", + "metadata": { + "tags": [] + }, + "source": [ + "Alternatively, these can all be ploted individually with:\n", + "\n", + "- `plot_power_curves()`\n", + "- `plot_Cp_curves()`\n", + "- `plot_Ct_curves()`\n", + "- `plot_rotor_diameters()`\n", + "- `plot_hub_heights()`\n", + "\n", + "For a text based approach, we can access the attributes like the following:" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "5168be89-64be-482a-8a8a-c6889e64de88", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " Turbine | Rotor Diameter (m) | Hub Height (m) | Air Density (ρ)\n", + "-----------------------------------------------------------------------\n", + " iea_15MW | 242.24 | 150.0 | 1.225\n", + " iea_10MW | 198.00 | 119.0 | 1.225\n", + " nrel_5MW | 126.00 | 90.0 | 1.225\n", + " x_20MW | 252.00 | 165.0 | 1.225\n" + ] + } + ], + "source": [ + "header = f\"{'Turbine':>15} | Rotor Diameter (m) | Hub Height (m) | Air Density (ρ)\"\n", + "print(header)\n", + "print(\"-\" * len(header))\n", + "for name, t in tl.turbine_map.items():\n", + " print(f\"{name:>15}\", end=\" | \")\n", + " print(f\"{t.turbine.rotor_diameter:>18,.2f}\", end=\" | \")\n", + " print(f\"{t.turbine.hub_height:>14,.1f}\", end=\" | \")\n", + " print(f\"{t.turbine.ref_density_cp_ct:>15,.3f}\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.11" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/docs/wake_models.ipynb b/docs/wake_models.ipynb new file mode 100644 index 000000000..c3ad37473 --- /dev/null +++ b/docs/wake_models.ipynb @@ -0,0 +1,494 @@ +{ + "cells": [ + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Wake Models\n", + "\n", + "A wake model in FLORIS is made up of four components that together constitute a wake.\n", + "At minimum, the velocity deficit profile behind a wind turbine is required. For most models,\n", + "an additional wake deflection model is included to model the effect of yaw misalignment.\n", + "Turbulence models are also available to couple with the deficit and deflection components.\n", + "Finally, methods for combining wakes with the rest of the flow field are available.\n", + "\n", + "Computationally, the solver algorithm and grid-type supported by each wake model can also\n", + "be considered as part of the model itself. As shown in the diagram below, the mathematical\n", + "formulations can be considered as the main components of the model. These are typically\n", + "associated directly to each other and in some cases they are bundled together into\n", + "a single mathematical formulation. The solver algorithm and grid type are associated\n", + "to the math formulation, but they are typically more generic.\n", + "\n", + "```{mermaid}\n", + "flowchart LR\n", + " A[\"Deficit\"]\n", + " B[\"Deflection\"]\n", + " C[\"Turbulence\"]\n", + " D[\"Velocity\"]\n", + " E[\"Solver\"]\n", + " F[\"Grid\"]\n", + "\n", + " subgraph H[FLORIS Wake Model]\n", + " direction LR\n", + " subgraph G[Math Model]\n", + " direction LR\n", + " A---B\n", + " B---C\n", + " C---D\n", + " end\n", + " G---E\n", + " E---F\n", + " end\n", + "```\n", + "\n", + "The models in FLORIS are typically developed as a combination of velocity deficit and wake\n", + "deflection models, and some also have custom turbulence and combination models. The descriptions\n", + "below use the typical combinations except where indicated. The specific settings can be seen\n", + "in the corresponding input files found in the source code dropdowns." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "from floris.tools import FlorisInterface\n", + "import floris.tools.visualization as wakeviz\n", + "\n", + "NREL5MW_D = 126.0\n", + "\n", + "def model_plot(inputfile):\n", + " fig, axes = plt.subplots(1, 1, figsize=(10, 10))\n", + " fi = FlorisInterface(inputfile)\n", + " fi.reinitialize(layout_x=np.array([0.0, 2*NREL5MW_D]), layout_y=np.array([0.0, 2*NREL5MW_D]))\n", + " yaw_angles = np.zeros((1, 1, 2))\n", + " yaw_angles[:,:,0] = 20.0\n", + " horizontal_plane = fi.calculate_horizontal_plane(\n", + " height=90.0,\n", + " yaw_angles=yaw_angles\n", + " )\n", + " wakeviz.visualize_cut_plane(horizontal_plane, ax=axes)\n", + " wakeviz.plot_turbines_with_fi(fi, ax=axes, yaw_angles=yaw_angles)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Jensen and Jimenez\n", + "\n", + "The Jensen model computes the wake velocity deficit based on the classic Jensen/Park model\n", + "{cite:t}`jensen1983note`. It is often refered to as a \"top-hat\" model because the spanwise\n", + "velocity profile is constant across the wake and abruptly jumps to freestream outside of the\n", + "wake boundary line. The slope of the wake boundary line, or wake expansion, is a user parameter.\n", + "\n", + "The Jiménez wake deflection model is derived from {cite:t}`jimenez2010application`." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAl4AAAEQCAYAAABhm3oHAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAAsTAAALEwEAmpwYAABFMElEQVR4nO3dd5hk2V3m+e/v3nDpXaWrzPJVXaa71VatltSApAY5GFqDERoYIYRm+2FAC4zYATHszu4OwzwIdvAaQCsxKzFiJGGEekADyCJA6lb7Vld3ua6qLm+yTHoTEfe3f8TNzBuZkZlVnSbSvJ/nycob55o4NyMj461zzj3X3B0RERERWX5BtSsgIiIislEoeImIiIisEAUvERERkRWi4CUiIiKyQhS8RERERFaIgpeIiIjIClmS4GVmJ83sW2b2jJk9EZe1mtkXzOxo/L0lLjcz+x0zO2Zmz5nZ3UtRBxEREZHVbilbvN7o7ne6+73x4w8CX3L3PcCX4scAbwP2xF8PA7+/hHUQERERWbVSy3jsh4A3xMsfB74K/EJc/gkvzdz6qJk1m1m3u5+f60BNFnoH6WWsqoiIiMjSOMZ4n7u3V1q3VMHLgb8zMwf+0N0/AnQmwtQFoDNe7gFOJ/Y9E5fNGbw6SPNbqW1LVFURERGR5fM9hSMvz7VuqYLXA+5+1sw6gC+Y2aHkSnf3OJTdMDN7mFJXJO3L2jAnIiIisjKWZIyXu5+Nv18CPgvcB1w0s26A+PulePOzwJbE7r1x2cxjfsTd73X3e5sIl6KaIiIiIlW16OBlZnVm1jC5DLwZeB54BHhPvNl7gM/Fy48APxpf3Xg/0D/f+C4RERGR9WIp+vA6gc+a2eTx/sTd/8bMHgc+Y2bvA14G3hlv/3ng7cAxYAR47xLUQURERGTVW3TwcvfjwB0Vyq8AD1Yod+CnFvu8IiIiImuNZq4XERERWSEKXiIiIiIrRMFLREREZIUoeImIiIisEAUvERERkRWi4CUiIiKyQhS8RERERFaIgpeIiIjIClHwEhEREVkhCl4iIiIiK0TBS0RERGSFKHiJiIiIrBAFLxEREZEVouAlIiIiskIUvERERERWiIKXiIiIyApR8BIRERFZIQpeIiIiIitEwUtERERkhSh4iYiIiKwQBS8RERGRFaLgJSIiIrJCFLxEREREVsiSBS8zC83saTP7q/jxDjN7zMyOmdmnzSwTl2fjx8fi9duXqg4iIiIiq9lStnj9DPBi4vGHgN90993ANeB9cfn7gGtx+W/G24mIiIise0sSvMysF/hu4KPxYwPeBPxZvMnHgXfEyw/Fj4nXPxhvLyIiIrKuLVWL128BPw9E8eM24Lq7F+LHZ4CeeLkHOA0Qr++Pty9jZg+b2RNm9kQ/xSWqpoiIiEj1LDp4mdn3AJfc/cklqM8Ud/+Iu9/r7vc2ES7loUVERESqIrUEx3g98L1m9nYgBzQCvw00m1kqbtXqBc7G258FtgBnzCwFNAFXlqAeIiIiIqvaolu83P0X3b3X3bcD7wK+7O4/AnwF+IF4s/cAn4uXH4kfE6//srv7YushIiIistot5zxevwB8wMyOURrD9bG4/GNAW1z+AeCDy1gHERERkVVjKboap7j7V4GvxsvHgfsqbDMG/OBSPq+IiIjIWrCkwUtERERkrch7mit0Et1EB6Ax/+ioTs7Mu17BS0RERFa1gqcYpgFn9rSfCwWhSiIC+ryL9p94FzkgsAii0nFmzSzqgFV+DgPco7Kyb7v9CPzkL8/53ApeIiIi8oq5Q57Mgtu9koCUJ8N57+Uc27Gp2DX3cSo9h2Ozyh0jRZ43bbnI1k3XyaQiiEoBaublfjNy1YzjgEflG4TB/Oep4CUiIiI3reApLnk3J7mFAplEuJm7dejmOE5Aijw//GsH6GoeJjDHowrH9wj32c/gUTS7NnGyashNYHZ1dj1nHMYWCFJ+k4FSwUtERGQdK3qpW+1lbpmnZermwoPh5EljwPd96B66WkYwL1YMP/gc0STRtDS1mAhVjpEKIjY1jGB2bXq/OYJXxaeIKpRXeQYrBS8REZEq6vcWTvtOJshNlZV3jVUKCjfeqtRPK7f+m7fzlp7rtDSMVwwu7pQHkni5bMt4v8lwlUkX2dw6RCroi9fP0Sc3V9CpFJYqhap5DrEWKXiJiIjcgEFvos87WbjTbK6UMLPcOMc2On7yR6gLIrY2jbOja7B8j6neu+mQUjHfJAtntDC1NoyzZdNx0qlongMwI3jdeCh6BUO3NjQFLxERWfMmPMMALUtwpNkpouBpTrCP5vf/KwwnFXrF7jOLR/sYzGiiiSDRBWfmUxfJbcsU2bflKnu39PP88Rbu3D17zFGpWnEQmqvppyx4rb7uNZmm4CUiIssqcmOM2mU5dp4ML/se0h/4BSbyVhoYHYeMIBmNklMCeGIAdSKkTJaZe2K9E7nRnctzYMdVdvcOEQZeNoXAZNebJccsRcn1M66o8+ltm+ryZMLCKzt5WZMUvEREZFmMe5YzvoMjfjuj1CU66BZufQkob7UptSTN3q9IihR5vmf7MLdsHyIIKLVGOVgyHCUOZySmDZgcy1TWQFXe5RYYdLSOkQ7nb1WyubrqFtp2nukKZP1R8BIR2eDynuaMb+eI3874HC1TlQd7xxNOzrHtBFmKhDz4W9/N3h2jmE2HIS+WD+SezCFG6fJ/98RxPSKKZjyLl75SqYgtXWPUZK+UHQ/Kg1cyWdlNhaLktrM2FblpCl4iIqtY5Eafd3LEX8UYNVPlC01GWWn9XGVXaafzZ3+Uu3aO09FemNEKFM3MWXFrUpHERtN8uiutpqbI7u1jNNROTwUwGXrmah1KhqKp+s4xVUD5MSpuIrLqKHiJiCwBd7jqmzjDTpwwuWbWtjc2g3epc+1UtJPiv/pZsrki9XXTx3MvDdKeFFBqNarJRfRsLsTPE023JHliOd7f48O1txa4de8V6uqiWfUrC0JlrUbF2evn2E+hSGSagpeIbAgjUS2X6eaVTwUwbWZwypPhxeguht77b0mlIAyd0OLuM5s+ZjDn8acHc08d20qbNtRF3HPPMPv358nlfGrsU6krLhHC4qDz9NM5XnPfaOn5JlulmC8gVeiWE5Flo+AlIqvKhGeW9Aq4cc9yMLqHl9/9IYpFCEJKtx2BsrAzdTGcQTCZzWbeOgSHKG5pSuzrbrS0Rrzx1RPcsrdIGHjpprsAPn2fuPJw42XHnXwUJFqpcKiri6bnX2IyvM2u3hz38BWRVUbBS0RuWORGVNaNtniToWTAm3g+ejUvcDfjZIHykFFSGlFt8Vc4dTmYz9l9VySkjkFe/bqIPQecIJy+qm2qVYpSCJtcngxN7tN1cJ8uT4amwCLMoLklnt8pFk6PDJ+qW3J6g2Q3YbLuAZXLRWR9UPASkQWNRVkO+x086d+24ABvqxgcysssUTq5zQj1OND90z9I77ZENxrTYSQ5lnp40Lj1zmjqQEEcZALzqQvRQnNSaejsdtKZZFiaXJ+od3K8VNnYKWaVz7WtiMhCFLxE1riiB5yKdvKkfzvDNMwIPpPia++ZDjRl3VQL3OKkjy76vv2H6OiFTZ0QmE23FAXT0x6l4pQSxS1FThxyJg9vPrU82c3nUSm8NLTA/jthU3upPEhUMEykn8n9nn/K6d02e5uy/RSKRGSVUfASWSGRG2eibbzg91borpsORjPZHN1ok/niOPt48bZ/QToDmVriCSTj1iSzqe2CcHrHdBrqGiAIbDoIJRJLENh0mDJoaoXX3wst7aXgkwxCQWI5nZpdntx2rv3C2X2KIiLrkoKXyDwiN05Fu7jGpnm2mjswTRr3Gp7kAZ7Y9v2EaS+1yiSCThgvWzKYhIlQlFgxFZC8FIKytc6ddxXZstvJ5CCVDqbHKiWeI5WaHjF+9jhs2wupRP4L51ie3CZc2qFdIiIbkoKXSAWRG89H9/DLdTUUJlJk6/4Tgdn0lWw22ZFW3lI0GZCSgScIjSCEmvoJ9u0doK0nTxA6qdT02y+VLqWaMJGEUvGyA6nUdPAKU+FUIAtCI5WBbKY8FU1drVephWmh2RRERGTZKHiJVDBGLUe4g2LhL7DQ2X37SwTpELw0timdSTGZYCwRlsIwVbqNSTpNRKnFqpDP0NY1TrYmIpUISGHi3Te5nEpPl5UtpyqXB2qFEhFZUxYdvMwsB3wNyMbH+zN3/z/NbAfwKaANeBJ4t7tPmFkW+ARwD3AF+CF3P7nYeogstZDC1JxONfWjpLPTb5d0NjO9XSbZclWasHLyCroogsGrKXK1mpxSREQqTZNz88aBN7n7HcCdwFvN7H7gQ8Bvuvtu4Brwvnj79wHX4vLfjLcTERERWfcWHby8ZCh+mI6/HHgT8Gdx+ceBd8TLD8WPidc/aGYadSIisgRSaWd8fIKBwUEGh4YoFArVrpKIJCzJGC8zCyl1J+4GPgy8BFx398l3/BmgJ17uAU4DuHvBzPopdUf2zTjmw8DDAO0aiiYisqDBwSHwJ3niyXHGx8dprK8ln8/T3NTEvj27yi7oEJHqWJJ3obsXgTvNrBn4LLBvCY75EeAjAHssp1kQRUQW8OKhQ9x+635qa2sZGBzk7KmXufXAfs6dP88Lhw7zqtturXYVRTa8JZ220N2vA18BXgs0m9lksOsFzsbLZ4EtAPH6JkqD7EVEZBHcndra0g3GGxsaGBoeBmBzdzfDwyPVrJqIxBYdvMysPW7pwsxqgO8CXqQUwH4g3uw9wOfi5Ufix8Trv+zuatESEVmkmpocx0+c4Pr16xw5epTGhgagFMhEZHVYihavbuArZvYc8DjwBXf/K+AXgA+Y2TFKY7g+Fm//MaAtLv8A8MElqIOIyIZ3YP9+omLEyZdPEYYht+zZDUCxWOTA/r1Vrp2IwBKM8XL354C7KpQfB+6rUD4G/OBin1dkJY0OvYzTSibbUu2qiMzpwsWL7N69a+px4KV55VKpFE2NjdWqltygbKbI+ESesXwew6jNZUjpXl3rji5xEVlAEBbJj18iTBvjIxepa9wBZBbcT2SlaWaetWtgeJRC8Rt8/eAEYxN5GutqyBeKtDTUcev2HlKBXtv1QsFL5EaYUde4k0J+mKH+o0RRBzX1vdWulUiZns2bmeum7bK6PXf8NHft3kZdLkP/8AgnL/Rxx66tnL50leeOn+bu3VurXUVZIgpeIvNwz+NeBHfy4/0A1NRtoZC/yrVLT9HScXeVayhSru/KFS5f7mN8fJzAi2SzWdrbN9Heqm7yVc2duposuNNUV8vgyCgAWzpaOXH+UpUrJ0tJwUtkHu7jRFER9yKjw2enunJS6RRhmK1y7UTKHT5yhLHRUbq7OsnlcpgXGRsb58yZs1zp62PfLXuqXUWZQ00uw9EzF2hrqOPC1X6a6krTguiK1PVHwUtkHkFQTxgWSGdbaWw9MFWevEm2yGpx5coVXv/a+6ceB16EJujq7ODrX/9GFWsmC7lj11aOnb3IS+cu0VRXw94t3QAUo4hX7VI343qi4CUyD49GgTT1TWopkNUvCEKeeHKUe++pKSvvHxggTOnquNXsbN819m3dDDNauFJhSHN9LXhUpZrJUlPwEpmP6S0ia8eBA/v5y798iYn8ELlsjoCI8fFxwjDk1v2LvpObLCNdkbpx6FNFZB5maaCw4HZriRn07ILLZw/R0NRGfVNHtaskS6SxoYF9e1/NnXf0Mz4xPbg+m8lgajFZ1bZ2tFW7CrJCFLxE5hFFg7jPHs+VH79OIT+0JqeUMINUCgaunsUo0n/lNB29txLW1Cy8s6wJ2WyGbDYzNYGqrA1Do2NcvHJ9agLVuposPZtaNInqOrOkN8kWWXd8gqg4RH7iellxKtPI2PDF6tRpqZjRtfU22rr2cP7kM1y5eLzaNRLZsI6fu8TBk2eJ3OkfHsVxxifyfP35o1wZGKp29WQJKXiJzGuCIKxjZOAEo8PnuHbpidLXxScYuHao2pV7RUYGrzAyeAX3iJHBK0TFPJu69zA23M/xF75W7eqJbEhnLl/lvn072dPbxf37dzE4MsYtW7q5b/8uXnz5bLWrJ0tIXY0iC0pT33wboyPHGB+9TGvXa8HGGRk8Ve2KvSLXLpVatqJigSsXX8IoDeoNQiOdUXejSDWYwfMnGrl9xwCFYkShWBqTl8ukiSLN5bWeKHiJLCCKwIIM9c37GB+5yOjQaTK5ujU5vgugZ9erATh/8mm27JqeeT8MdVWVSLVsaW/jrx99CY9GuTY4zK6eTgAm8gUyaX1Uryd6NUXmEYRNeDTE6NBpIu+nse12crVdpLMZrl16utrVe0X6zh1m0+a9dG+/q9pVEZHY9u52bultpL35ZXb1dFKXK90ZI5NOcf+B3ZrHax1R8BKZRxDkcA+xIKSubifpTOPUupaOtRlccnXN1a6CiFRQk62hu6252tWQZabgJTIPj8axIEuudjPpzPp4u9Q3dVa7CiIiG9b6+CQRkRs2PjbE5TMvkJ8Ypa1jK42tPfSdP0JgsKl7D+msBtiLiCwXTSchMg8LstWuwpK78PKzNLRspnf3awA4dfRR0placnVNnDv5THUrJyKyzil4idyA/r4nGbx2iKg4Xu2qLFqxGFEs9JLO5Gjt3ElUyNPWtYuW9m0Ui/lqV09EZF1T8BK5QTV1PQxdP8ro8LlqV2XRrl4qzYQ9OnSNKCoyOnSN8VHNji0istw0xktkPg7x/KKkMg00tt3G2MgF+vueo7ZxB+lMQ1Wr90q09+znW19/jCAISIUBW2+5n4unnicqjtO17fZqV09EZF1T8BKZR6E4SmBOFOUZun6kVGhGEIb09z3Lps0PVLeCr0BdwyZ6dj5Iz64JctnSGLZt+16vCVRFRFaAgpfIPMzSmDlmIelc69TtdVKZNLnatT0tQyqVqXYVREQ2nEWP8TKzLWb2FTN7wcwOmtnPxOWtZvYFMzsaf2+Jy83MfsfMjpnZc2Z29/zPIFI9ZhnMMtQ27iKb20Qm10Ym10a2ZhPZmk3Vrp6IiKwxSzG4vgD8nLsfAO4HfsrMDgAfBL7k7nuAL8WPAd4G7Im/HgZ+fwnqILKsMtnWaldBRETWgUUHL3c/7+5PxcuDwItAD/AQ8PF4s48D74iXHwI+4SWPAs1m1r3YeoiIiIisdks6nYSZbQfuAh4DOt39fLzqAjA5IKYHOJ3Y7UxcNvNYD5vZE2b2RD/FpaymiIiISFUsWfAys3rgz4GfdfeB5Dp3d0oX5t8wd/+Iu9/r7vc2ES5VNUVERESqZkmCl5mlKYWuT7r7X8TFFye7EOPvl+Lys8CWxO69cZnIqpFmgixjRIWA/ESKl1/cylB/Dr+p/z5sHNf6znL+1IsMXLvExPhotasjIrJqLXo6CTMz4GPAi+7+G4lVjwDvAX41/v65RPn7zexTwGuA/kSXpMiqkLY8bws+zZH8MGfZTu7ESY5cv5Nc7RiZXIEgCPB4agmbmv/KCIMAHCwMwOOpJ9LQd740dUMQTP9fx2x6OQgDGluL9O4pshbvUZ3N1TE2MsDAtYu8fORJ6ps20bvzVrK52mpXTURkVVmKebxeD7wb+JaZPROX/TtKgeszZvY+4GXgnfG6zwNvB44BI8B7l6AOIkvODH42VQdcZij6OZ689gBPXHsDE0zOfzXd/GU4QYXedCOqUDbJscQ+AzTzD/teS8fWPI2tEUFYCmbuTE9uGkEQhlPPXvp/DwRWCnxOadvJljkzI1MD2/Y6TS2v7OdwI2rrm6mtbyadgrHRQRpbOstCVxRFXDr3EsP9lwjDFO3dO2hua1++ComIrFKLDl7u/o8kP0vKPVhhewd+arHPK7KS6oMhviP4G77d/4boBnro7eaGNALQF3XyjUMPcvDQPYzM8dYsvdGSxy6FN8PjFjgv29aACdJcJE/ND72Fnl1OEMDoEPRfhTCY3iUMSiHP4+XJZ5pcDhLv8sBIhDtIp6GlA65dPgsYzZs2l9X78vkT5MfH6Nl+gPzEGJfOHae2voFMNnfTPycRkbVMM9eL3AQzCCu0Yi2FjvACD/FJ3hz9OXmy08+5QIizBe70cz1q5nF/A4c/7RwmjeGEFDlPgcnUVX4Ij/+Nu1Lj8zUgyyhBhaAXkaKWPnL/66vZd+d2xkdT5MdLRwsMJsbSjI4Y7s2k0nDp/BO0dweMj01vM/nUQRwALT63hkYINcm+iKwTCl4iq0xNMEYNY0t2vPpwgF4+wUDUyBU6b6o1bmama+EyKSsk1peONeY1fC3ay1PP3MO5k91g8b5WCk+FfCuD109ifJkgrCWd2ceRb2VmPY87FAvT+wI0NsNdr4E9ByCdCGC60EFE1iIFL5ENojEYoJGBhTd8BQoMcnt4jvv+6RtADx6nosBgzAtcY5wsAfWkucQojaRpstmtepEbZ9k+VV4kxRG/na/0/SRf/4qRyThm4BGEaThxOO589ekuUTPDo8njTkdHS3SPBnEzoZnjDj29cMe9BVp0g4Jldeb8RUZGRmhurKextpbaGnU1y8aj4CUii3aGCRoJ6bCI0M6UrTvrE2zC2UyG0IzQJ5jA6UwEr6QuzpU9vsf/kXN/89e86HeRJzMV0ma2xs3ucS0usL7UjRoR8JRv4+l/+R62bHMamxx8+sKGyRF9TvnFElPhzpxocrwb06PsgnjbUrep07054lWvmqCxceM21TXU1TI6OsKV6/0898IR2ltb2LdrOzXZNFC6CIOoSBhq7kZZvxS8RGTR2kjRQoowbkm65gWKOG2kqCXgGgUiIASGiWi8iUmRQ4vYYifZwsllqTvAuGc5/skv8oLfQx/puLQ84JUCX/mVrDNNhUIrL3OMZ72Nbz78Q+zaXaC9feY4QZ86tBHhHh/JPVE2GQTjMXjxOLja2oh9+yZobV6esYdLqamxgeaGOgAGBoboam+jJpedSrH9g0OcOHWG0fFxarJZbtneS2N9XTWrLLLkFLxEZNE6LF32uIGQPI6Z0UKKq17gMKOEbqQwWlbZ3SiyNs7+8Dn289yyPUd/1Mzh//ebHPRbKUz96Z0Od7Nb5EpBr9KFD5MMZ5wcARGv+fV/zq4deYaHjcHBUjtd2RQnUfl+U1eluuNumCeeKTGAztxIpZyG+qUJdu7OuUuXCYOAjrbyOU4ymTR37NtT2uZyH2cuXGLvjq2EQaX2SpG1ScFLRJZcykoBa9Iuy1FwZ4yILAHphS7FXIeaguvcx9e4y79BgfTCO9ygEa/liL+KJ/9tnkfJEFLgqzY+7z6W+He6bGYLnpcttXOOd/7Ne9ncWcDMIYqP4pVfS/Pp+eQmD+UO42N5Tpy+zLbuzeQLacJwOtDV1dRgcetXT0c7X3v8Kfbv2s7MwCmylil4iciKSJlRv8pauqohbXnS5JfseDU2wmv5Mnf5NxiiYcHtX0nkHfE6Dvur+Oxft5HLFglD8Cgqdal6efdqS2Oe1pZCojzRjWpw6fIA1wcamBjfyeHjRk1NkW3dI2zuGGdyaFcURZy/fIXG+rrSJMG6hFXWEQUvEZF1IGej5Fie+2S2GfT6Cfp/72v00Z1YMzsQFSlyLTHlSNKQT3CdMRrIcNlyFN24Rgcjv/WzHD5eRyp0oijPpb5zDI7k2dp1J199rHZW8Lo6kGZoJMSS5e4V8lkEbnRtGufOW67T2Ta+4Lx3IstNwUtERBZkBs12jWauveJjvMAoWwnpIl26EMNgm7/EtX9zjD66yHvEBQYIMNqo56xV/oga85ob7q514EXfzOGfehftLWPU5IrlgW1q8JuV7zS1Oko8Lg969bUFbt91nc7WMYKFb2ghAih4iYjICmknRfOMq18LOO12mZxf5Chj3GppumyBUHWTrVZ5T3PhvzzBcfbgN3DLrxs17PX8NTW87pfeQEfLeFnLnM9ojSvPbFa23oul5aIbVwcyZZdUZNNF6msqtyDK2qTgJSIiK6J9RqBqjK9+BRigQGhwmTzXvUAaYzvZqZC2GGnLs8WOs4Xjiz5W0oRnOO9bOfgrV3mG9Iy7pU5erVp5fJpVuPVYQMQ3rHz7IiHNXOHdf/ydbGoam/s6g8jwyQsdkiFvaqH8CldPXBQRBk46tfqnI1kvFLxERKQqQjPCuHWnyzJ0kcHdGSViFF+S0LWcMjbBNjvGFn+J4jJ9nI5Twynfye+9+6mpSXlnqhTufGrdXJJXrQZ0coYf+cR30VI//xWxsngKXiIismqYGbWE1Fa7IjchMCdYwitVk9LkOWDPsNtfYJTlmUx2giynfDd/88Q2sukigTlUCnnRAleXRlFZw5pj9LYNsqf7qgJdgoKXiIjIKpexCTJMLNvx2+0CQ7/7LIM0V1w/V5fpfIqEfNm3c+L930t9boJsqjRWbWoMmyduwTXVTTrjeabmgPPEfuV3kOhpHWRH+1Vqs2tjLJyCl4iIiFBvg9QzuKTH7LGX6f/wc5z1TqIFLmyYK9wFNnfoK3rAN+lh/0+8ka6WIeqy5eHUK00z4jNH4sWi+P6qcVltZoKtbf3UZpY28Cp4iYiIyLJpsms02SufhmReBjv9EFf+8Hke821zTjMy371VK3NGqcMJePPP30Zbw0iptMKdGtyjsvLdHVfmrbKCl4iIiKxZoUV0cJ4OO7+kxy14ij66+NqvjZAnc8P73cvfz7tewUtERERkhpQV6OIMXXbm5neeZ3YOzbUrIiIiskIUvERERERWiIKXiIiIyApZkuBlZn9kZpfM7PlEWauZfcHMjsbfW+JyM7PfMbNjZvacmd29FHUQERERWe2WqsXr/wPeOqPsg8CX3H0P8KX4McDbgD3x18PA7y9RHURERERWtSUJXu7+NeDqjOKHgI/Hyx8H3pEo/4SXPAo0m1n3UtRDREREZDVbzjFene4+OanGBaAzXu4BTie2OxOXlTGzh83sCTN7op/iMlZTREREZGWsyOB6d3e4uRs9uftH3P1ed7+3iXCZaiYiIiKycpYzeF2c7EKMv1+Ky88CWxLb9cZlIiIiIuvacgavR4D3xMvvAT6XKP/R+OrG+4H+RJekiIiIyLq1JLcMMrP/DrwB2GRmZ4D/E/hV4DNm9j7gZeCd8eafB94OHANGgPcuRR1EREREVrslCV7u/i/mWPVghW0d+KmleF4RERGRtUQz14uIiIisEAUvERERkRWi4CUiIiKyQhS8RERERFbIkgyuFxERkfVtzCOOMTb1eNydHsvQZempsqI7LzHOBBGRw2ZLsymxXhS8Ngx3uOxdjFF70/sGRHRwlkyQX4aaiYjIWpCzgNsSnyFP+zAtM+4sc5E8NRi3WC15nG/5CK2kCMxWurqrloLXOnHSx/lSNMCPBZsIE7/gkRvHogP8o7+Vl9mNld25yZnvrVDa1nEC6hngruifuCv4OlkbX5ZzyDFCYDd1ZykREamCfi+StYCszR6xNHl3ZccJMYWuGRS81okzPsFn/Rr3eC13Wt1U+SDNPMf9HHngXeRqnc6tecJU6Y3iDmEqnLqLZhgERJPLocXfAwoFOHko5B++0MA3ojeTYjwObDODW2nnIA5syZBns27VOXOd00Ifr7a/Z0/wAmlT65qIyGp1hQJtFSJEJ2mOMMbT0TBFYLdlF/1c/d7CBXoZ8Xqg0udJubnWG44Rsdw5cD9Pz7tewWuduM/qqCPgSz7AnUwHL8fIMEGuFuoaItq6C6TS003DqUTXeyrlifIw/l4q27q3wNB3PMDZo6UgZoFNZafASlErCMAjKOSN3t1TFSCw6bdBGBjupdAXBKX1YQiFArx8GP7Hn26lvjhALUMVz3My8E1/Jcvj+kyVV3rzlQc+A0IK7LNn2WvPUhOMVnxeEZHVquApLtNNn3fiC14zV/k/xMnlXRykJhhjLu7OdS+wxWYPXRmgSC0B+4MaxjzisI/RQFjWEzPpRb+LiGDeIJX3NHkyHPiRO2iqHZ217eR//92jGZWc3SwwOpGitXaY27rOVH6yKKpcXoFH84W/18IvvzjnWgWvdSJjAa+3er7mg4x5RK5C8+9imEFLO7S0l34xU6np408GtslWspOHnN23Tf/Sh4khAKnEb1wYlJfd/hq4+uZ/xuFnYWIsDnLx7/bU6fh0yEq+j5NvxiBwiEr7Jn8Mk9vM3G9sFL56FR575I/pjU6QmtHaNvONbnMEvplsVjica7+5g2KlP0g2xzqjyBY7Tq+dJGWFeWomsraMe5aL3jM1RnX+Fo8Z74t53qQLtZzcjKU8VsmNHa/oKa7Qwf4fv59X1YySCYtT6xyrGCYcm/rb6u5Ty1PsdfOGkGsjA9QNXCXTuX3GgSMuX3yZzU2bsFwdNUD2wknGWzqpy9bEm0w/2d6K/zeeXbi5qZ/ehsNkUsUKO0zutnBo6h/Jcep624LbLTcFr3XkTUEjf1cc4Bs+xButsdrVuWlBAJ29pS+oHNImt5tZllxOhbO3BYhz4axjFfJw4ii8sOvdjEcwEUy3miX/BJQFJ5teaUSJ8rmD0qxjMP23bXJsmyfWh4lHZtP1CfBExabDZKEAjw8GPPZfP8It9i1qbGRWXWbWYb6ymzFf0/7CKtWn8h/RhXoIXsl5zLfPXPUomf+1nu95Zv0uLamVGye51GGjUmtGv7fS8ZM/THMY0VhbaoXxqdaMGdvP/D+MR4ltk9tFMx7PXEiYt2Vj5nErhJg5jjtnUFgwP0SU/aY5vKa5n60tx2isqTD+doFWHK9Y4fn3e+bMJe7oydHb/NKMg0U01/SRS/Wxq72ZiUKRfPEcr9sxQSb+wzx/SxH4XM97E6/DaqfgtY4coIZOUnzZB3gjay94VUsqDXsOQCpwerZBTS2EQRxoZrakxcJEwAosmlVuC6yfdex4m6mA5RDGf4Hdy49nyT/YPlnPCI/g1KmQx7f9OKfOhwQGlI1ncGxWNIgSJfEYPYOW5kKiZW1ydfIP4nTTo7njbpiV1y1IfoL4ZMAov7iDxAeezfosTQTasvGEPn08nz7GZEiaCqtlj2b80U7uH29skSd3TPRmJ1+zyddkOvBa8oOrbDl5rJkfGj5j1VxjIitcAONOTbZIc91E+XlV/FxKro/mDxhznccch0u+PlObl3043vwH+tR+iV07snn2bz5LT+vQ1Pty+nkX+JCeY/2cH+4Vg9eNb3szoWHBus9lznNamWBSjCKuDI9ya+d0y9Hpa4MAbGmuY3d7C8+dvcz5l84CsKe9ZSp0SYmC1zoSmPEGa+RP/SpXvUCr6eVdq8zKu1STrSLJTuTJ4iBe2L2nyO7dw/T3B0TFUviZDiJRHOKmPzOCxIexxcsnTma49+4R0unJbYpT66ef1xP7eeJ4ia6A+EMouX46uFjZB5d5sp7xUnH2sUrbEh+D8g+hyedLthv6dJBNBqSpD8g4NCbrltgt3jZZT596Xk+UTW1bLA8vye6cWaJkfWYEpLLnS0ROL7Vsnr9Sy2v2X55Z0dnPkVyfDAU3s+1c21Q6RrTA+rmOfTPHlaoKg4AH924r+53d0tJQWvCIbCrk1du6qlS7tUGfzOvMm4JGPl28yld9gO+z1mpXR6rADJqbSx9eQVmrUXmrGpSC19T6ePncuRv7kJsMg5ZYTjZITK1Plk0t+YzgNbu1x8I51s/xIT1Zf2Ou9RXKZ4S/iiptM9dxy8LN/GFirvOY89ixifFS8BKRtUm3DFpneizDLeT4SjRY7aqIiIjIDApe69AbgwZOMM4Jnx5omUo5UXGcibEBJsYGiYq66k1ERGSlqatxHfp2a+SjXOYr0QDfF3Qz4WNExa/Tf2WcdG6IXF0TUTFPtqaZ9p7bCEL9GoiIiKwEtXitQ00Wcq/V8VUfIHLnCheob7mVlo7voGPLfaQzdWze+W1ka1u5cuH5aldXRERkw1DwWqfeaI1cpchB+gFIpUuz2WdyjeTHS7PC1zf1TC2LiIjI8lPwWqcmbyH0T95HijTDA8fIT1zj+qXDZHKlOb7mnDhPREREloWC1zqVsYAHrIHH/SqNtOIeMTp0HAtCmjv2AeBRkbbu26tcUxERkY1DwWsde2PQwDgRh3mK+qZbaGy9h6ZNuwmC0izCQZgiW9NU5VqKiIhsHApe69gBamgnywleqHZV1oT8xAjF4tw3YRUREVmsqs0jYGZvBX4bCIGPuvuvVqsu61VgxuttE5/z04yNnMfoqXaVVrVC4Ulqal8HwMTEOAef/qeyWdDvee0bq1U1ERFZJ6rS4mVmIfBh4G3AAeBfmNmBatRlvXvANuE4Z458nKH+g/SdfZrLZ57i6oWDjA5drnb1Vp0wLHXDZjJZUukMt939ALff/W2EmutMRESWQLW6Gu8Djrn7cXefAD4FPFSluqxrXVZDK52cP/nnpDOtNLTuoLFtJ7naNoaun+bqhRerXcVVxKe6GvP5CQDS6QypdLr8LtUiIiKvULWCVw9wOvH4TFw2xcweNrMnzOyJfjTuZjG62cHo4AksuMzY8GWiYp7axi7ae+9mdFitXpPa2jdz6FuPceblIxx67jE6u7dOrTMFLxERWQKrdnC9u3/E3e9193ubCKtdnTWth51Air5zn2Z44Dxjw330nXuWkcGLBIG60CZt3rqb3m17CMMU23bfSkcieN1+9wNVrJmIiKwX1frUPQtsSTzujctkGWxmB/XNr+bkC5+iadNmcrUNjI1co+/sM3TvuK/a1Vs1Lp57mc7N22hqaScMNLmsiIgsvWq1eD0O7DGzHWaWAd4FPFKluqx7Gcuxqedfkh+7xsToVXJ17bR13872W/8Z7hHnT3y92lVcFdSdKCIiy60qLV7uXjCz9wN/S2k6iT9y94PVqMtGka3dTZiu49Lpb7Jt/1umBouHYUCYylW5dqtDsmtRRERkOVRtgI+7fx74fLWef6NpaLmfrXu/j1OHPkNz+y2ks/UApNIaPzfTM499mcamJrbtOkA2m612dUREZB1ZtYPrZWmNDR9l6/53UiyM8/KLyrsL6e7dybFDz3D+7IlqV0VERNYRBa8NIkw10db9aupbtnHsmc9UuzqrXn1jMwfuuJ/AAl549lGGBq5Xu0oiIrIOKHhtEOlsB2bGztu+n3Mn/oHhgfPVrtKq8/g/Psuhbz1DvjDBS4ee5aVDzzI02E8QhBx85hvVrp6IiKwDmsRpgygWhrh64TkaWneAO8ee+TRb9r6ZMAxo2rSTVLqm2lWsujDspLEZRoYu09xWCqqT92rs6N4y/84iIiI3QMFrgxgZfJ6u7V1s3rmPFx/7Qw4/+d/YcdtDpDNZrpx7ns5tr652FauusbmLljaoqTXa2jsAym6SDZrbS0REFkddjRuFF8nVbiZM5dh7779k6Nop8hPDNLRsIYry1a7dqtLS1lntKoiIyDql4LWBXD49DkDP7jdiQciRJ/4b+fGhKtdKRERk41BX4waRq9/HwJUnOH+iSCqdomf3G3npW3/B9lvfxqbNt1e7eiIiIhuCgtcGkc60Udf2Bjq2DpLN1TA+eo0zR74IQE19e5VrJyIisjGoq3GDCcMMAFtu+S4yNc0cffrTVa6RiIjIxqHgtUGFqSw7bv1eTh78vMZ5iYiIrBAFrw1s953vpJAf4cTBv6p2VURERDYEBa8NrGPLq2ls3cHRp3ULIZG1Igyc3vZhxify9A+PMDA8SqFYrHa1ROQGaXD9OpdhnAIhVy6E9J0PuHIuhYWGBdC9I88D7/hdmjb1VLuaInKDhsdGOHXxCEdO5xkbn6CxroZ8oUhLfQ23bu8hFYbVrqKIzEPBa52rtWG+N/hv7H/uKR7lQUaox4Axslz6Wjv9tz9I57YCYQostKnJ2QMzWjqdLXsgnanqKYhIwnPHT3PX7m3U1WTpHxrm5IU+7ti1ldOX+nju+Gnu3rO92lUUkXkoeG0AKSuwP/Uc+3luqqzoAaeiXfzTt97CmW/toJS4pm+JE2Gcop5D97yerfsj6psjAjPCNHRtcVKNK38eIgK4U1eTBaCprpbBkVEAtrS3cuLcpWrWTERugILXBhVaxI7wKDs4ypjnAJu1zeloB9948kVOPbmLgbisSMhZRsm96y1s3+cEKZjs2QjiQxTys48lIkujJpfh6JkLtDXWc+HKdZrqagFw171ERdYCBS8hZ2MVy/eEL7DbX+CatzFODQCjXssT/u08euRtvHwIzJjKbIEBDnVNTiZt9O6BTHb6eO6lL1MuE3nF7ti1lWNnL/LSuUs01ebYu6UbgGIU8apdW6tcOxFZiIKXzMsMWu1KWdlOjvBdz3yW076LKNFSFuBEGC/6XXxz7Kd56h8gk4uD1uTYsbAUxvbdBTv2lQczEVnY2b5r7Nu6ufQg0cqVCkOa62urVCsRuVEKXvKKtARXaOFKxXV38hhvfuzP+VZ0L6PUAWD4VES7TCcHP7uTp7/ze2jrLrWUTX58BAZBADv2w+4DCmYiM5majEXWNAUvWRZtwWXeEPzPiuvcoc+7ePKL3+AyPUzGLosH+E+Q42k6efLtD7F9L6Sz0+PHJrsq2zphj4KZbEBbO9qqXQURWQQFL1lxZtBuF3hr8OcV17vDRd/Mk59/kpc/f8uMtREAR2jkm9/7DvbeAa3tECaCWRBANgdbd0GuZhlPRKRKhkbHuHi1n7GJCQyjriZLT1uT5vASWQMWFbzM7AeB/wvYD9zn7k8k1v0i8D6gCPy0u/9tXP5W4LeBEPiou//qYuog648ZdNk5vjv4NHlPJzopp12Kunj6kWc59sh+PL4BgyWmwyiQoo4Bdv/yu9m5t3TMgFIwC+P7NWzqhBoNiZE15vi5S1zuH6S1oY7+4VGa6moYn8jz9eePcuuOXtoa66tdRRGZx2JbvJ4Hvg/4w2ShmR0A3gXcCmwGvmhmk00XHwa+CzgDPG5mj7j7C4ush6xTactXLO8NT9HLnzAU1U9dcZk06I0846/n2Ufh2W+ABdPdlZNytXDgTrjtrlKXZWkaDF2SL6vb6UtXee2t+8ikYVd3O988dJz7D+xma0crTxw+wQO3z2wlFpHVZFHBy91fhIqDPR8CPuXu48AJMzsG3BevO+bux+P9PhVvq+Alr0h9MEQ9Q7PK27jMdl7i2v/8ay6zmZmBqughL/jdPDP2v/H0Y5BJl2bFaGyxUuuYGY3Nzt33OT3bpucqE6m2YhTwxJFWXnfrVQrFiEKx1P2ey6SJoqjKtRORhSzXGK8e4NHE4zNxGcDpGeWvqXQAM3sYeBigXUPR5BWa7+rLff4sV/7HX3PUb6XAzPsiORd9C3/5Ax+guc3Z1OmYW8X2sACjrgFuvzuiu8s1T5ksq972Nr7yzAvU5ya4NjDErp5OACbyBTLpdJVrJyILWTDRmNkXga4Kq37J3T+39FUqcfePAB8B2GM59f/IkjODTXaJTVS+zYo7XPqLz/N89GoGaC7tQ1S2/2TGOufNPEUj2//tO9m+qzTebGqKDDeCEHbujujqVjCTxdne1c4tW2ppbz7Drs0d1OVKl/Zm0inuP7CryrUTkYUsGLzc/TtfwXHPAlsSj3vjMuYpF1lVzKDTztMZPLLgtgVPcTrawbO/fprHaZm1PiLky2TZ9cF3csfdRdJpyia/NCanyiiVdW12NrUu1ZnIelObraG7rbnsd0hE1obl6sN7BPgTM/sNSoPr9wDfpPT5ssfMdlAKXO8CfniZ6iCyYlJWYEd4lO1+lGKFt1WRkNPRDp771Qt8jo74Cszy8TiTDWEer73zV97JXffmqaubDmRRVLo6s6bWaWzUh66IyFqz2Okk/jnwu0A78Ndm9oy7v8XdD5rZZygNmi8AP+XuxXif9wN/S2k6iT9y94OLOgORVcQMUhRmlacosDs8xE4/zDCNRPEUGJW4wwm/hXMX38Vn/iRHmDLMfKpxIwxK0WznzgL33DdBW5sTJKfcSOSxACOVhpx660VEVoXFXtX4WeCzc6z7FeBXKpR/Hvj8Yp5XZK0KzGmgf/6NDO7iMW7/8P1c9M3kEwP/S2PMjD7v4qC/iiPv/XFqasvHnpGY+SywUmvZ3r157rprjI6O0nZTPVQ+vWzxcqSMJiKybHS5oMgqlbICPXaq4rptvMSr/Juc/vhX6Cc5GGx2aur3Vv7Bd/Hc//LDtLbGAS3uurSycWZOKuVs25onmLtBTkREFkHBS2SNSluenXbohrYd8TqOfPRRLtEbt4bNDGilx+PkOE4Lff/xhziwb5wg5QQelQb+e1TejRk4W7fkaaovLsXpiIhsCApeIhtArQ1zZ/hNSte4zM0drno7L/7vx/hLespuw2QzLgYokqJAhtf9xvdx522jpDNO4NNNZeYR9XVFGusUzEREJil4icgUM2izyzzAF4h8/gnHIkIueC8vfuAi36CdIA5mXrZNwHf854e4544RGuqL5XfdLBtfZmSzEdmMBpiJyPqm4CUiFQU2fwgKKNBrJ+nxk4xSV+FKTeOKt9M/+P386SOtpEIHfGrof3KSWcNJhxH7do9y563DNDcW8EQD22RVSl2e8U3PNQ5NRNYgBS8RWRQzqGW44rp6G8D/w1u55m3kyc65P8AV7+CLfoBnf/o91NcWSSav8i5PJx06t+4dZv/OodK2IiILyKUm2Nx4reK64Yk8damVuSmvgpeILCszaLXK98tM6rBz7PHnufC7X2cwvkXTXK55I59iBzt+5gfo3DQRh7dSUCvrzow8Mbm7k8tEvGrvAFu7RnTjc5ENJgzytM7xH7Vnz/Xxuq2dK1IPBS8RWTVSVuq+vBGv8sc59TtPcoLuCmudSrc0H/JGvkQLd3/wbfR0jpa2nBxnltg+ioxsusj+nUN0to7p/poi68DXjp+jtTZHd2Mt7XU1WJXe2ApeIrIm5WyUW+x5buH5G94ncuOKd3DsV09yrEKr2mT4MpwJsvwlOV7379/Mnm3DBMZU96cn75EYOWEQsa17lJb68cWckogso2/bsZlLQyOcvj7EwQtXaa+voauhlk11NStaDwUvEdkwAnPa7SLtXFxw27ynueBbePE/XOEJGuNQlpjyP8EJKBLypl9+I7ftGihdSBCHM3emlxP7mDuBOZ2tY2TT5VN1iMjSS4UBm5vq2dxUz0ShyIXBEY5fGeD5C1coruAtOxS8REQqSFueLXacXj/OGLWJGzFNm2whK5LirG/l6sBb+fw/dREGwFTrWXkL2WTvhjkUI6jNFdi3rZ9dPYOlKzV9+rZOyTsLeDy9R6GgKTdEFiuTCtna0sDWlgZG8wUuDY2s2HMreImIzMMMalj4j/Jee57Cf/4x+mmtMLqssoKnOclext//Xp452kJg5WPTguTVnOb0dgzT2zbM1o6hmz0NkQ3v9PVBtjQ3zCqvSafY1tII0cq0PCt4iYgskZQVaOPSje9g0MVZhj78BH3egRNQ6X6bUJqw9lF2sOfnvo8d3YNcvJYrm4Q2Of3GVOtc3J3Zs2mETQ0jukhANjSr0GpdDQpeIiJVVm8D1NvAgtvt8MNc/Y0necy3UyA9VT7zdk4lpURWIMMgzbzm330n+7dcI5OOwJPTbExuXipobRyjMaeLBGT96W2ur3YVAAUvEZE1IzBnE5fYZDfRqgaMeQ3n/tNhnmZb2Vi1mVNuOAF50rzx3z/A/q3XyaULiXVGMq15VN4N2lw3TmqBux2IVNPBC1fY2dZETbo8+lwfHWc0X6C7fmWublTwEhFZ53I2yk47zE4OL7jtgDdz8D+c4+/pJiA52eTMUGVTwW0yzH3/r93Ljq4BsqliqRt0RteOOxAlgp9BNq07D8jKuDg0wpWRMe7a3E5DLjNVXp9Jc/DiVQUvERFZeY12ndvsSQqeqnD/zcoiAq54B5/7+Tx5MhjRPKNpEq1mGLUM88O/+2p6Wgd1/01ZVpkwze62dp4+d4Hbutporc0BpWkmVpKCl4iIzJKywsIbJfTYKTb7KQZoueHA5gRc8B6+fmgz6dBJhRFUGq8WlY9Jc4wtbQPs6rpKU63Go8mNGctn6BvZxr29zlNnL9HTVE9vUz39Y+OkgpUbeK/gJSIiS8IMmqh8E+K5tNplxv/Li1yl4yZa2EIO+nZ2/+u30FQ7TiY1IyQmrvScnP8MSmPktrX309N8nXRKk9ZuOPGvQm0mxWu2dnHk8jW+fvI82VTIrV2tK1YNBS8REamqrI3Tzemb2qeX41z/g+c44V1xYJs9sH9mG0aeDH/PJm77iW9j26b4Cs+Ye/nFA9MrIgJzupsHaasfvak6yupy35YeTl0vLafDgFu72so30DxeIiIilZlBC320WN9N7TfhGS78wVG+RA+zo1l58JpcWyBNgTSv/Zl72NF+nSDwiiHNo/IWtjCI6GoaJBveXLetrG8KXiIismFkbIKtdpytHL/hfdzhOm28+Nt9PErrHBcPTAYxS5QYjvG2X9hPT0s/gSVvAeUV58r1qBTYWus04e16peAlIiIyj1Lr2hVa7ApFD5jdUgaVUlSBNJfZzBc+lCcimDVv2lycgDQTvOP/2Et388BUYCvdcL3CHQoozauWbITLpIqkQ41jW40WFbzM7NeBfwZMAC8B73X36/G6XwTeBxSBn3b3v43L3wr8NhACH3X3X11MHURERFZKaDceZkLG6eUEmznJMI03vF+BNOd9CwfPdXHoQkdZSxke4VToJI03mbpxe2T0tvSzvbWPppqxG35uWX6LbfH6AvCL7l4wsw8Bvwj8gpkdAN4F3ApsBr5oZrfE+3wY+C7gDPC4mT3i7i8ssh4iIiKrUmBOA/03tU+L9TH2R4fim67PbmFbqPVslDpe8M3s/7HXkEnNPUmtzxirlkkV2NZ6ld6mq2oxWyaLCl7u/neJh48CPxAvPwR8yt3HgRNmdgy4L153zN2PA5jZp+JtFbxEREQScjZKjrOveP9ejtP38WP0UXfD+wx7I49Tz+0/dhf12bnnSKt0AehkN2hTzRjbWq/QmFNLWyVLOcbrx4FPx8s9lILYpDNxGVB2zfAZ4DWVDmZmDwMPA7RrKJqIiMhNSVmBLs7c3E4GQ97IhY9fYJTaV/CsxojXceBH76axZoTadL5sXfIen1A+Tq21dpjNDVfiiXTXrwUTjZl9EeiqsOqX3P1z8Ta/BBSATy5Vxdz9I8BHAPZYTndeFRERWQH1NkA9A694/wkyXPzj0xydmmOtZO7u0dKotYiAA+++k+7GfrKJwFa6x2f51rOOEM+31tnQT8M8LXWrwYLBy92/c771ZvZjwPcAD/p0Z/FZYEtis964jHnKRUREZI3L2ARbOM4Wu/kpO079cT8v0ETIQnOfVZhHjYAI4zU/vpfNTddK860lDI5mibz6c3Qs9qrGtwI/D3yHu48kVj0C/ImZ/QalwfV7gG9SuhBjj5ntoBS43gX88GLqICIiImtbcsqOCc9QIF15u3kuKigScpnNDE7cwbErHQSAJedOi6AhO8KJq+1l+wUW0VnfTy6cWJJzWchiB0/9HpAFvmClmd4edfefcPeDZvYZSoPmC8BPuXsRwMzeD/wtpekk/sjdDy6yDiIiIrJOZGyCDK8sBNVzmMInX4qvBp2tH2aNeiuSpo8u7n3fProbrhPcwJQhM8eqZVMFGrI3djGBzbyUdDXaYzn/rdS2aldDRERE1qkhb+Qam17RvmPUkifDW9+/mc6Gfjr/48eedPd7K22rywVFRERkw1v0RQWe4eu/d41uXp53OwUvERERkUXK2AS9nFhwu2DBLURERERkSSh4iYiIiKwQBS8RERGRFaLgJSIiIrJCFLxEREREVoiCl4iIiMgKUfASERERWSEKXiIiIiIrRMFLREREZIWsiXs1mtllWGAO/huzCehbguOsRTr3jUnnvjHp3Dcmnfvqsc3d2yutWBPBa6mY2RNz3bRyvdO569w3Gp27zn2j0bmvjXNXV6OIiIjIClHwEhEREVkhGy14faTaFaginfvGpHPfmHTuG5POfQ3YUGO8RERERKppo7V4iYiIiFTNug1eZvbrZnbIzJ4zs8+aWXNi3S+a2TEzO2xmb0mUvzUuO2ZmH6xKxZfBej0vADPbYmZfMbMXzOygmf1MXN5qZl8ws6Px95a43Mzsd+KfxXNmdnd1z2DxzCw0s6fN7K/ixzvM7LH4HD9tZpm4PBs/Phav317Vii+SmTWb2Z/F7/MXzey1G+V1N7N/E/++P29m/93Mcuv1dTezPzKzS2b2fKLspl9nM3tPvP1RM3tPNc7lZs1x7hvis63SuSfW/ZyZuZltih+vrdfd3dflF/BmIBUvfwj4ULx8AHgWyAI7gJeAMP56CdgJZOJtDlT7PJbg57Auzytxft3A3fFyA3Akfo1/DfhgXP7BxOv/duB/AgbcDzxW7XNYgp/BB4A/Af4qfvwZ4F3x8h8A/zpe/kngD+LldwGfrnbdF3neHwf+VbycAZo3wusO9AAngJrE6/1j6/V1B74duBt4PlF2U68z0Aocj7+3xMst1T63V3juG+KzrdK5x+VbgL+lNLfnprX4uq/bFi93/zt3L8QPHwV64+WHgE+5+7i7nwCOAffFX8fc/bi7TwCfirdd69breQHg7ufd/al4eRB4kdIH00OUPpiJv78jXn4I+ISXPAo0m1n3ytZ66ZhZL/DdwEfjxwa8CfizeJOZ5z75M/kz4MF4+zXHzJoo/WH+GIC7T7j7dTbI6w6kgBozSwG1wHnW6evu7l8Drs4ovtnX+S3AF9z9qrtfA74AvHXZK79Ilc59o3y2zfG6A/wm8PNAcoD6mnrd123wmuHHKaVhKH0on06sOxOXzVW+1q3X85ol7kK5C3gM6HT38/GqC0BnvLzefh6/RemPUBQ/bgOuJ/4wJ89v6tzj9f3x9mvRDuAy8F/jbtaPmlkdG+B1d/ezwP8DnKIUuPqBJ9kYr/ukm32d183rP8OG+mwzs4eAs+7+7IxVa+rc13TwMrMvxmMcZn49lNjml4AC8Mnq1VSWm5nVA38O/Ky7DyTXeanNed1dvmtm3wNccvcnq12XKkhR6ob4fXe/Cxim1OU0ZR2/7i2U/oe/A9gM1LEK/hdfLev1dV7IRvtsM7Na4N8B/77adVmsVLUrsBju/p3zrTezHwO+B3gwfnMCnKXURzypNy5jnvK1bL7zXRfMLE0pdH3S3f8iLr5oZt3ufj5ucr4Ul6+nn8frge81s7cDOaAR+G1KzeypuHUjeX6T534m7qJqAq6sfLWXxBngjLs/Fj/+M0rBayO87t8JnHD3ywBm9heUfhc2wus+6WZf57PAG2aUf3UF6rksNuhn2y5K/9l4Nu4p7wWeMrP7WGOv+5pu8ZqPmb2VUhfM97r7SGLVI8C74it9dgB7gG8CjwN74iuDMpQGoT6y0vVeBuv1vICpMU0fA150999IrHoEmLyC5T3A5xLlPxpfBXM/0J/oslhT3P0X3b3X3bdTel2/7O4/AnwF+IF4s5nnPvkz+YF4+zXZUuDuF4DTZrY3LnoQeIEN8LpT6mK838xq49//yXNf9697ws2+zn8LvNnMWuIWwzfHZWvORv1sc/dvuXuHu2+P/+adoXRh1QXW2utejRH9K/FFaWDhaeCZ+OsPEut+idJVHoeBtyXK307pqriXgF+q9jks4c9iXZ5XfG4PUOpmeC7xWr+d0hiWLwFHgS8CrfH2Bnw4/ll8C7i32uewRD+HNzB9VeNOSn9wjwF/CmTj8lz8+Fi8fme1673Ic74TeCJ+7f+S0lVLG+J1B/5v4BDwPPDHlK5kW5evO/DfKY1ly1P6sH3fK3mdKY2HOhZ/vbfa57WIc98Qn22Vzn3G+pNMX9W4pl53zVwvIiIiskLWbVejiIiIyGqj4CUiIiKyQhS8RERERFaIgpeIiIjIClHwEhEREVkhCl4iIiIiK0TBS0RERGSFKHiJiIiIrJD/H+uEAHx4LZenAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "model_plot(\"../examples/inputs/jensen.yaml\")" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Gauss and GCH\n", + "\n", + "The Gaussian velocity model is implemented based on {cite:t}`bastankhah2016experimental` and\n", + "{cite:t}`niayifar2016analytical`. This model represents the velocity deficity as a gaussian\n", + "distribution in the spanwise direction, and the gaussian profile is controlled by user parameters.\n", + "There is a near wake zone and a far wake zone. Both maintain the gaussian profile in the spanwise\n", + "direction, but they have different models for wake recovery.\n", + "\n", + "The Gauss deflection model is a blend of the models described in\n", + "{cite:t}`bastankhah2016experimental` and {cite:t}`King2019Controls` for calculating\n", + "the deflection field in turbine wakes." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "model_plot(\"../examples/inputs/gch.yaml\")" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Empirical Gaussian\n", + "\n", + "FLORIS's \"empirical\" model has the same Gaussian wake shape as other popular FLORIS models.\n", + "However, the models that describe the wake width and deflection have been reorganized to provide\n", + "simpler tuning and data fitting.\n", + "\n", + "For more information, see {ref}`empirical_gauss_model`" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "model_plot(\"../examples/inputs/emgauss.yaml\")" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Cumulative Curl\n", + "The cumulative curl model is an implementation of the model described in {cite:t}`bay_2022`,\n", + "which itself is based on the cumulative model of {cite:t}`bastankhah_2021`" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "model_plot(\"../examples/inputs/cc.yaml\")" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## TurbOPark\n", + "\n", + "TurbOPark is a velocity deficit model. For model details see the following references:\n", + "\n", + "- https://github.com/OrstedRD/TurbOPark\n", + "- https://github.com/OrstedRD/TurbOPark/blob/main/TurbOPark%20description.pdf\n", + "- Nygaard, Nicolai Gayle, et al. \"Modelling cluster wakes and wind farm blockage.\" 2020" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Turbulence Models\n", + "\n", + "### Crespo-Hernandez\n", + "\n", + "CrespoHernandez is a wake-turbulence model that is used to compute additional variability introduced\n", + "to the flow field by operation of a wind turbine. Implementation of the model follows the original\n", + "formulation and limitations outlined in {cite:t}`crespo1996turbulence`." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Wake Combination Models\n", + "\n", + "The wakes throughout the flow field need to be combined in a careful manner in order to\n", + "accurately capture their coupled effects. A simple model is to simple add them,\n", + "but this can result in negative velocities a few turbines into the farm. More careful\n", + "methods are available within FLORIS and shown here.\n", + "\n", + "Each model is described below and its effects are plotted with two turbines in a line.\n", + "These descriptions use the Jensen and Jimenez models since they highlight the differences\n", + "in the combination models themselves.\n", + "The upper plots show the turbine wakes individually to give a reference for the uncombined wake.\n", + "The lower plots show both turbines along with their wakes combined with the chosen model." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "def combination_plot(method: str):\n", + " X_UPSTREAM = 0.0\n", + " X_DOWNSTREAM = 5 * 126.0\n", + " X0_BOUND = -200\n", + " X1_BOUND = 1500\n", + "\n", + " # Set the combination method\n", + " fi = FlorisInterface(\"../examples/inputs/jensen.yaml\")\n", + " settings = fi.floris.as_dict()\n", + " settings[\"wake\"][\"model_strings\"][\"combination_model\"] = method\n", + " fi = FlorisInterface(settings)\n", + "\n", + " # Plot two turbines individually\n", + " fig, axes = plt.subplots(1, 2, figsize=(10, 10))\n", + " fi.reinitialize(layout_x=np.array([X_UPSTREAM]), layout_y=np.zeros(1))\n", + " horizontal_plane = fi.calculate_horizontal_plane(\n", + " height=90.0,\n", + " x_bounds=(X0_BOUND, X1_BOUND),\n", + " yaw_angles=np.array([[[20.0]]])\n", + " )\n", + " wakeviz.visualize_cut_plane(horizontal_plane, ax=axes[0])\n", + " wakeviz.plot_turbines_with_fi(fi, ax=axes[0])\n", + " wakeviz.plot_turbines_with_fi(fi, ax=axes[1])\n", + "\n", + " fi.reinitialize(layout_x=np.array([X_DOWNSTREAM]), layout_y=np.zeros(1))\n", + " horizontal_plane = fi.calculate_horizontal_plane(\n", + " height=90.0,\n", + " x_bounds=(X0_BOUND, X1_BOUND),\n", + " yaw_angles=np.array([[[0.0]]])\n", + " )\n", + " wakeviz.visualize_cut_plane(horizontal_plane, ax=axes[1])\n", + " wakeviz.plot_turbines_with_fi(fi, ax=axes[0])\n", + " wakeviz.plot_turbines_with_fi(fi, ax=axes[1])\n", + "\n", + " # Plot the combination of turbines\n", + " fig, axes = plt.subplots(1, 1, figsize=(10, 10))\n", + " fi.reinitialize(layout_x=np.array([X_UPSTREAM, X_DOWNSTREAM]), layout_y=np.zeros(2))\n", + " horizontal_plane = fi.calculate_horizontal_plane(\n", + " height=90.0,\n", + " x_bounds=(X0_BOUND, X1_BOUND),\n", + " yaw_angles=np.array([[[20.0, 0.0]]])\n", + " )\n", + " wakeviz.visualize_cut_plane(horizontal_plane, ax=axes)\n", + " wakeviz.plot_turbines_with_fi(fi, ax=axes)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Freestream Linear Superposition (FLS)\n", + "\n", + "FLS uses freestream linear superposition to apply the wake velocity deficits to the freestream\n", + "flow field." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "combination_plot(\"fls\")" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Max\n", + "\n", + "The MAX model incorporates the velocity deficits into the base flow field by selecting the\n", + "maximum of the two for each point. For more information, refer to {cite:t}`gunn2016limitations`." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "combination_plot(\"max\")" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Sum of Squares Freestream Superposition (SOSFS)\n", + "\n", + "This model combines the wakes via a sum of squares of the new wake to add and the existing\n", + "flow field." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "combination_plot(\"sosfs\")" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.4" + }, + "orig_nbformat": 4 + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/examples/02_visualizations.py b/examples/02_visualizations.py index c812bd95d..669e91fa0 100644 --- a/examples/02_visualizations.py +++ b/examples/02_visualizations.py @@ -65,7 +65,7 @@ y_plane = fi.calculate_y_plane( x_resolution=200, z_resolution=100, - crossstream_dist=630.0, + crossstream_dist=0.0, yaw_angles=np.array([[[25.,0.,0.]]]), ) cross_plane = fi.calculate_cross_plane( diff --git a/examples/03_making_adjustments.py b/examples/03_making_adjustments.py index 2144262f9..750288d5a 100644 --- a/examples/03_making_adjustments.py +++ b/examples/03_making_adjustments.py @@ -76,7 +76,7 @@ 5.0 * fi.floris.farm.rotor_diameters[0][0][0] * np.arange(0, N, 1), 5.0 * fi.floris.farm.rotor_diameters[0][0][0] * np.arange(0, N, 1), ) -fi.reinitialize(layout_x=X.flatten(), layout_y=Y.flatten(), wind_directions=[360.0]) +fi.reinitialize(layout_x=X.flatten(), layout_y=Y.flatten(), wind_directions=[270.0]) horizontal_plane = fi.calculate_horizontal_plane(height=90.0) wakeviz.visualize_cut_plane( horizontal_plane, diff --git a/examples/16_heterogeneous_inflow.py b/examples/16_heterogeneous_inflow.py index e0745902c..3f04d5bc4 100644 --- a/examples/16_heterogeneous_inflow.py +++ b/examples/16_heterogeneous_inflow.py @@ -16,7 +16,6 @@ import matplotlib.pyplot as plt from floris.tools import FlorisInterface -from floris.tools.floris_interface import generate_heterogeneous_wind_map from floris.tools.visualization import visualize_cut_plane @@ -37,19 +36,19 @@ """ -# Define the speed ups of the heterogeneous inflow, and their locations. -# For the 2-dimensional case, this requires x and y locations. -# The speed ups are multipliers of the ambient wind speed. -speed_ups = [[2.0, 2.0, 1.0, 1.0]] -x_locs = [-300.0, -300.0, 2600.0, 2600.0] -y_locs = [ -300.0, 300.0, -300.0, 300.0] +# Initialize FLORIS with the given input file via FlorisInterface. +# Note that the heterogeneous flow is defined in the input file. The heterogenous_inflow_config +# dictionary is defined as below. The speed ups are multipliers of the ambient wind speed, +# and the x and y are the locations of the speed ups. +# +# heterogenous_inflow_config = { +# 'speed_multipliers': [[2.0, 1.0, 2.0, 1.0]], +# 'x': [-300.0, -300.0, 2600.0, 2600.0], +# 'y': [ -300.0, 300.0, -300.0, 300.0], +# } -# Generate the linear interpolation to be used for the heterogeneous inflow. -het_map_2d = generate_heterogeneous_wind_map(speed_ups, x_locs, y_locs) -# Initialize FLORIS with the given input file via FlorisInterface. -# Also, pass the heterogeneous map into the FlorisInterface. -fi_2d = FlorisInterface("inputs/gch.yaml", het_map=het_map_2d) +fi_2d = FlorisInterface("inputs/gch_heterogeneous_inflow.yaml") # Set shear to 0.0 to highlight the heterogeneous inflow fi_2d.reinitialize(wind_shear=0.0) @@ -72,32 +71,42 @@ fig, ax_list = plt.subplots(3, 1, figsize=(10, 8)) ax_list = ax_list.flatten() visualize_cut_plane(horizontal_plane_2d, ax=ax_list[0], title="Horizontal", color_bar=True) -ax_list[0].set_xlabel('x'); ax_list[0].set_ylabel('y') +ax_list[0].set_xlabel('x') +ax_list[0].set_ylabel('y') visualize_cut_plane(y_plane_2d, ax=ax_list[1], title="Streamwise profile", color_bar=True) -ax_list[1].set_xlabel('x'); ax_list[1].set_ylabel('z') +ax_list[1].set_xlabel('x') +ax_list[1].set_ylabel('z') visualize_cut_plane( cross_plane_2d, ax=ax_list[2], title="Spanwise profile at 500m downstream", color_bar=True ) -ax_list[2].set_xlabel('y'); ax_list[2].set_ylabel('z') +ax_list[2].set_xlabel('y') +ax_list[2].set_ylabel('z') # Define the speed ups of the heterogeneous inflow, and their locations. # For the 3-dimensional case, this requires x, y, and z locations. # The speed ups are multipliers of the ambient wind speed. -speed_ups = [[1.0, 1.0, 2.0, 2.0, 1.0, 1.0, 2.0, 2.0]] +speed_multipliers = [[1.0, 1.0, 2.0, 2.0, 1.0, 1.0, 2.0, 2.0]] x_locs = [-300.0, -300.0, -300.0, -300.0, 2600.0, 2600.0, 2600.0, 2600.0] y_locs = [-300.0, 300.0, -300.0, 300.0, -300.0, 300.0, -300.0, 300.0] z_locs = [540.0, 540.0, 0.0, 0.0, 540.0, 540.0, 0.0, 0.0] -# Generate the linear interpolation to be used for the heterogeneous inflow. -het_map_3d = generate_heterogeneous_wind_map(speed_ups, x_locs, y_locs, z_locs) +# Create the configuration dictionary to be used for the heterogeneous inflow. +heterogenous_inflow_config = { + 'speed_multipliers': speed_multipliers, + 'x': x_locs, + 'y': y_locs, + 'z': z_locs, +} # Initialize FLORIS with the given input file via FlorisInterface. -# Also, pass the heterogeneous map into the FlorisInterface. -fi_3d = FlorisInterface("inputs/gch.yaml", het_map=het_map_3d) +# Note that we initialize FLORIS with a homogenous flow input file, but +# then configure the heterogeneous inflow via the reinitialize method. +fi_3d = FlorisInterface("inputs/gch.yaml") +fi_3d.reinitialize(heterogenous_inflow_config=heterogenous_inflow_config) # Set shear to 0.0 to highlight the heterogeneous inflow fi_3d.reinitialize(wind_shear=0.0) @@ -129,20 +138,23 @@ title="Horizontal", color_bar=True ) -ax_list[0].set_xlabel('x'); ax_list[0].set_ylabel('y') +ax_list[0].set_xlabel('x') +ax_list[0].set_ylabel('y') visualize_cut_plane( y_plane_3d, ax=ax_list[1], title="Streamwise profile", color_bar=True ) -ax_list[1].set_xlabel('x'); ax_list[1].set_ylabel('z') +ax_list[1].set_xlabel('x') +ax_list[1].set_ylabel('z') visualize_cut_plane( cross_plane_3d, ax=ax_list[2], title="Spanwise profile at 500m downstream", color_bar=True ) -ax_list[2].set_xlabel('y'); ax_list[2].set_ylabel('z') +ax_list[2].set_xlabel('y') +ax_list[2].set_ylabel('z') plt.show() diff --git a/examples/16b_heterogenaity_multiple_ws_wd.py b/examples/16b_heterogenaity_multiple_ws_wd.py index d456d9f7f..43ac6f7eb 100644 --- a/examples/16b_heterogenaity_multiple_ws_wd.py +++ b/examples/16b_heterogenaity_multiple_ws_wd.py @@ -17,7 +17,6 @@ import numpy as np from floris.tools import FlorisInterface -from floris.tools.floris_interface import generate_heterogeneous_wind_map from floris.tools.visualization import visualize_cut_plane @@ -34,27 +33,24 @@ x_locs = [-300.0, -300.0, 2600.0, 2600.0] y_locs = [ -300.0, 300.0, -300.0, 300.0] -# Generate the linear interpolation to be used for the heterogeneous inflow. -het_map_2d = generate_heterogeneous_wind_map(speed_ups, x_locs, y_locs) - # Initialize FLORIS with the given input file via FlorisInterface. -# Also, pass the heterogeneous map into the FlorisInterface. -fi = FlorisInterface("inputs/gch.yaml", het_map=het_map_2d) +# Note the heterogeneous inflow is defined in the input file. +fi = FlorisInterface("inputs/gch_heterogeneous_inflow.yaml") # Set shear to 0.0 to highlight the heterogeneous inflow fi.reinitialize( wind_shear=0.0, wind_speeds=[8.0], wind_directions=[270.], - layout_x=[0,0], - layout_y=[-300, 300], + layout_x=[0, 0], + layout_y=[-299., 299.], ) fi.calculate_wake() turbine_powers = fi.get_turbine_powers().flatten() / 1000. # Show the initial results print('------------------------------------------') -print('Given the speedsups and turbine locations, ') +print('Given the speedups and turbine locations, ') print(' the first turbine has an inflow wind speed') print(' twice that of the second') print(' Wind Speed = 8., Wind Direction = 270.') @@ -74,9 +70,17 @@ # To change the number of wind directions however it is necessary to make a matching # change to the dimensions of the het map -speed_ups = [[2.0, 1.0, 2.0, 1.0], [2.0, 1.0, 2.0, 1.0] ] # Expand to two wind directions -het_map_2d = generate_heterogeneous_wind_map(speed_ups, x_locs, y_locs) -fi.reinitialize(wind_directions=[270., 275.], wind_speeds=[8.], het_map=het_map_2d) +speed_multipliers = [[2.0, 1.0, 2.0, 1.0], [2.0, 1.0, 2.0, 1.0]] # Expand to two wind directions +heterogenous_inflow_config = { + 'speed_multipliers': speed_multipliers, + 'x': x_locs, + 'y': y_locs, +} +fi.reinitialize( + wind_directions=[270.0, 275.0], + wind_speeds=[8.0], + heterogenous_inflow_config=heterogenous_inflow_config +) fi.calculate_wake() turbine_powers = np.round(fi.get_turbine_powers() / 1000.) print('With wind directions now set to 270 and 275 deg') diff --git a/examples/24_floating_turbine_models.py b/examples/24_floating_turbine_models.py new file mode 100644 index 000000000..ceefaa547 --- /dev/null +++ b/examples/24_floating_turbine_models.py @@ -0,0 +1,133 @@ +# Copyright 2021 NREL + +# Licensed under the Apache License, Version 2.0 (the "License"); you may not +# use this file except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. + +# See https://floris.readthedocs.io for documentation + +import matplotlib.pyplot as plt +import numpy as np + +from floris.tools import FlorisInterface +from floris.tools.layout_functions import visualize_layout + + +""" +This example demonstrates the impact of floating on turbine power and thurst (not wake behavior). +A floating turbine in FLORIS is defined by including a `floating_tilt_table` in the turbine +input yaml which sets the steady tilt angle of the turbine based on wind speed. This tilt angle +is computed for each turbine based on effective velocity. This tilt angle is then passed on +to the respective wake model. + +The value of the parameter ref_tilt_cp_ct is the value of tilt at which the ct/cp curves +have been defined. + +If floating_correct_cp_ct_for_tilt is True, then the difference between the current tilt as +interpolated from the floating tilt table is used to scale the turbine power and thrust. + +If floating_correct_cp_ct_for_tilt is False, then it is assumed that the Cp/Ct tables provided +already account for the variation in tilt with wind speed (for example they were computed from +a turbine simulator with tilt degree-of-freedom enabled and the floating platform simulated), +and no correction is made. + +In the example below, three single-turbine simulations are run to show the different behaviors. + +fi_fixed: Fixed bottom turbine (no tilt variation with wind speed) +fi_floating: Floating turbine (tilt varies with wind speed) +fi_floating_defined_floating: Floating turbine (tilt varies with wind speed, but + tilt does not scale cp/ct) +""" + +# Declare the Floris Interfaces +fi_fixed = FlorisInterface("inputs_floating/gch_fixed.yaml") +fi_floating = FlorisInterface("inputs_floating/gch_floating.yaml") +fi_floating_defined_floating = FlorisInterface("inputs_floating/gch_floating_defined_floating.yaml") + +# Calculate across wind speeds +ws_array = np.arange(3., 25., 1.) +fi_fixed.reinitialize(wind_speeds=ws_array) +fi_floating.reinitialize(wind_speeds=ws_array) +fi_floating_defined_floating.reinitialize(wind_speeds=ws_array) + +fi_fixed.calculate_wake() +fi_floating.calculate_wake() +fi_floating_defined_floating.calculate_wake() + +# Grab power +power_fixed = fi_fixed.get_turbine_powers().flatten()/1000. +power_floating = fi_floating.get_turbine_powers().flatten()/1000. +power_floating_defined_floating = fi_floating_defined_floating.get_turbine_powers().flatten()/1000. + +# Grab Ct +ct_fixed = fi_fixed.get_turbine_Cts().flatten() +ct_floating = fi_floating.get_turbine_Cts().flatten() +ct_floating_defined_floating = fi_floating_defined_floating.get_turbine_Cts().flatten() + +# Grab turbine tilt angles +eff_vels = fi_fixed.turbine_average_velocities +tilt_angles_fixed = np.squeeze( + fi_fixed.floris.farm.calculate_tilt_for_eff_velocities(eff_vels) + ) + +eff_vels = fi_floating.turbine_average_velocities +tilt_angles_floating = np.squeeze( + fi_floating.floris.farm.calculate_tilt_for_eff_velocities(eff_vels) + ) + +eff_vels = fi_floating_defined_floating.turbine_average_velocities +tilt_angles_floating_defined_floating = np.squeeze( + fi_floating_defined_floating.floris.farm.calculate_tilt_for_eff_velocities(eff_vels) + ) + +# Plot results + +fig, axarr = plt.subplots(4,1, figsize=(8,10), sharex=True) + +ax = axarr[0] +ax.plot(ws_array, tilt_angles_fixed, color='k',lw=2,label='Fixed Bottom') +ax.plot(ws_array, tilt_angles_floating, color='b',label='Floating') +ax.plot(ws_array, tilt_angles_floating_defined_floating, color='m',ls='--', + label='Floating (cp/ct not scaled by tilt)') +ax.grid(True) +ax.legend() +ax.set_title('Tilt angle (deg)') +ax.set_ylabel('Tlit (deg)') + +ax = axarr[1] +ax.plot(ws_array, power_fixed, color='k',lw=2,label='Fixed Bottom') +ax.plot(ws_array, power_floating, color='b',label='Floating') +ax.plot(ws_array, power_floating_defined_floating, color='m',ls='--', + label='Floating (cp/ct not scaled by tilt)') +ax.grid(True) +ax.legend() +ax.set_title('Power') +ax.set_ylabel('Power (kW)') + +ax = axarr[2] +# ax.plot(ws_array, power_fixed, color='k',label='Fixed Bottom') +ax.plot(ws_array, power_floating - power_fixed, color='b',label='Floating') +ax.plot(ws_array, power_floating_defined_floating - power_fixed, color='m',ls='--', + label='Floating (cp/ct not scaled by tilt)') +ax.grid(True) +ax.legend() +ax.set_title('Difference from fixed bottom power') +ax.set_ylabel('Power (kW)') + +ax = axarr[3] +ax.plot(ws_array, ct_fixed, color='k',lw=2,label='Fixed Bottom') +ax.plot(ws_array, ct_floating, color='b',label='Floating') +ax.plot(ws_array, ct_floating_defined_floating, color='m',ls='--', + label='Floating (cp/ct not scaled by tilt)') +ax.grid(True) +ax.legend() +ax.set_title('Coefficient of thrust') +ax.set_ylabel('Ct (-)') + +plt.show() diff --git a/examples/25_tilt_driven_vertical_wake_deflection.py b/examples/25_tilt_driven_vertical_wake_deflection.py new file mode 100644 index 000000000..f7897fe53 --- /dev/null +++ b/examples/25_tilt_driven_vertical_wake_deflection.py @@ -0,0 +1,105 @@ +# Copyright 2021 NREL + +# Licensed under the Apache License, Version 2.0 (the "License"); you may not +# use this file except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. + +# See https://floris.readthedocs.io for documentation + + +import matplotlib.pyplot as plt +import numpy as np + +from floris.tools import FlorisInterface +from floris.tools.visualization import visualize_cut_plane + + +""" +This example demonstrates vertical wake deflections due to the tilt angle when running +with the Empirical Gauss model. Note that only the Empirical Gauss model implements +vertical deflections at this time. Also be aware that this example uses a potentially +unrealistic tilt angle, 15 degrees, to highlight the wake deflection. Moreover, the magnitude +of vertical deflections due to tilt has not been validated. +""" + +# Initialize two FLORIS objects: one with 5 degrees of tilt (fixed across all +# wind speeds) and one with 15 degrees of tilt (fixed across all wind speeds). + +fi_5 = FlorisInterface("inputs_floating/emgauss_floating_fixedtilt5.yaml") +fi_15 = FlorisInterface("inputs_floating/emgauss_floating_fixedtilt15.yaml") + +D = fi_5.floris.farm.rotor_diameters[0] + +num_in_row = 5 + +# Figure settings +x_bounds = [-500, 3000] +y_bounds = [-250, 250] +z_bounds = [0, 500] + +cross_plane_locations = [10, 1200, 2500] +horizontal_plane_location=90.0 +streamwise_plane_location=0.0 + +# Create the plots +# Cutplane settings +cp_ls = "solid" # line style +cp_lw = 0.5 # line width +cp_clr = "black" # line color +min_ws = 4 +max_ws = 10 +fig = plt.figure() +fig.set_size_inches(12, 6) + +powers = np.zeros((2, num_in_row)) + +# Calculate wakes, powers, plot +for i, (fi, tilt) in enumerate(zip([fi_5, fi_15], [5, 15])): + + # Farm layout and wind conditions + fi.reinitialize( + layout_x=[x * 5.0 * D for x in range(num_in_row)], + layout_y=[0.0]*num_in_row, + wind_speeds=[8.0], + wind_directions=[270.0] + ) + + # Flow solve and power computation + fi.calculate_wake() + powers[i,:] = fi.get_turbine_powers().flatten() + + # Compute flow slices + y_plane = fi.calculate_y_plane( + x_resolution=200, + z_resolution=100, + crossstream_dist=streamwise_plane_location, + x_bounds=x_bounds, + z_bounds=z_bounds + ) + + # Horizontal profile + ax = fig.add_subplot(2, 1, i+1) + visualize_cut_plane(y_plane, ax=ax, min_speed=min_ws, max_speed=max_ws) + ax.plot(x_bounds, [horizontal_plane_location]*2, color=cp_clr, linewidth=cp_lw, linestyle=cp_ls) + ax.set_title("Tilt angle: {0} degrees".format(tilt)) + +fig = plt.figure() +fig.set_size_inches(6, 4) +ax = fig.add_subplot(1, 1, 1) +x_locs = np.arange(num_in_row) +width = 0.25 +ax.bar(x_locs-width/2, powers[0,:]/1000, width=width, label="5 degree tilt") +ax.bar(x_locs+width/2, powers[1,:]/1000, width=width, label="15 degree tilt") +ax.set_xticks(x_locs) +ax.set_xticklabels(["T{0}".format(i) for i in range(num_in_row)]) +ax.set_xlabel("Turbine number in row") +ax.set_ylabel("Power [kW]") +ax.legend() + +plt.show() diff --git a/examples/26_empirical_gauss_velocity_deficit_parameters.py b/examples/26_empirical_gauss_velocity_deficit_parameters.py new file mode 100644 index 000000000..a34d4cc61 --- /dev/null +++ b/examples/26_empirical_gauss_velocity_deficit_parameters.py @@ -0,0 +1,228 @@ +# Copyright 2021 NREL + +# Licensed under the Apache License, Version 2.0 (the "License"); you may not +# use this file except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. + +# See https://nrel.github.io/floris/intro.html for documentation + + +import copy + +import matplotlib.pyplot as plt +import numpy as np + +from floris.tools import FlorisInterface +from floris.tools.visualization import plot_rotor_values, visualize_cut_plane + + +""" +This example illustrates the main parameters of the Empirical Gaussian +velocity deficit model and their effects on the wind turbine wake. +""" + +# Initialize FLORIS with the given input file via FlorisInterface. +# For basic usage, FlorisInterface provides a simplified and expressive +# entry point to the simulation routines. + +# Options +show_flow_cuts = True +num_in_row = 5 + +yaw_angles = np.zeros((1, 1, num_in_row)) + +# Define function for visualizing wakes +def generate_wake_visualization(fi: FlorisInterface, title=None): + # Using the FlorisInterface functions, get 2D slices. + x_bounds = [-500, 3000] + y_bounds = [-250, 250] + z_bounds = [0, 500] + cross_plane_locations = [10, 1200, 2500] + horizontal_plane_location = 90.0 + streamwise_plane_location = 0.0 + # Contour plot colors + min_ws = 4 + max_ws = 10 + + horizontal_plane = fi.calculate_horizontal_plane( + x_resolution=200, + y_resolution=100, + height=horizontal_plane_location, + x_bounds=x_bounds, + y_bounds=y_bounds, + yaw_angles=yaw_angles + ) + y_plane = fi.calculate_y_plane( + x_resolution=200, + z_resolution=100, + crossstream_dist=streamwise_plane_location, + x_bounds=x_bounds, + z_bounds=z_bounds, + yaw_angles=yaw_angles + ) + cross_planes = [] + for cpl in cross_plane_locations: + cross_planes.append( + fi.calculate_cross_plane( + y_resolution=100, + z_resolution=100, + downstream_dist=cpl + ) + ) + + # Create the plots + # Cutplane settings + cp_ls = "solid" # line style + cp_lw = 0.5 # line width + cp_clr = "black" # line color + fig = plt.figure() + fig.set_size_inches(12, 12) + # Horizontal profile + ax = fig.add_subplot(311) + visualize_cut_plane(horizontal_plane, ax=ax, title="Top-down profile", + min_speed=min_ws, max_speed=max_ws) + ax.plot(x_bounds, [streamwise_plane_location]*2, color=cp_clr, + linewidth=cp_lw, linestyle=cp_ls) + for cpl in cross_plane_locations: + ax.plot([cpl]*2, y_bounds, color=cp_clr, linewidth=cp_lw, + linestyle=cp_ls) + + ax = fig.add_subplot(312) + visualize_cut_plane(y_plane, ax=ax, title="Streamwise profile", + min_speed=min_ws, max_speed=max_ws) + ax.plot(x_bounds, [horizontal_plane_location]*2, color=cp_clr, + linewidth=cp_lw, linestyle=cp_ls) + for cpl in cross_plane_locations: + ax.plot([cpl, cpl], z_bounds, color=cp_clr, linewidth=cp_lw, + linestyle=cp_ls) + + # Spanwise profiles + for i, (cp, cpl) in enumerate(zip(cross_planes, cross_plane_locations)): + visualize_cut_plane(cp, ax=fig.add_subplot(3, len(cross_planes), i+7), + title="Loc: {:.0f}m".format(cpl), min_speed=min_ws, + max_speed=max_ws) + + # Add overall figure title + if title is not None: + fig.suptitle(title, fontsize=16) + +## Main script + +# Load input yaml and define farm layout +fi = FlorisInterface("inputs/emgauss.yaml") +D = fi.floris.farm.rotor_diameters[0] +fi.reinitialize( + layout_x=[x*5.0*D for x in range(num_in_row)], + layout_y=[0.0]*num_in_row, + wind_speeds=[8.0], + wind_directions=[270.0] +) + +# Save dictionary to modify later +fi_dict = fi.floris.as_dict() + +# Run wake calculation +fi.calculate_wake() + +# Look at the powers of each turbine +turbine_powers = fi.get_turbine_powers().flatten()/1e6 + +fig0, ax0 = plt.subplots(1,1) +width = 0.1 +nw = -2 +x = np.array(range(num_in_row))+width*nw +nw += 1 + +title = "Original" +ax0.bar(x, turbine_powers, width=width, label=title) +ax0.legend() + +# Visualize wakes +if show_flow_cuts: + generate_wake_visualization(fi, title) + +# Increase the base recovery rate +fi_dict_mod = copy.deepcopy(fi_dict) +fi_dict_mod['wake']['wake_velocity_parameters']['empirical_gauss']\ + ['wake_expansion_rates'] = [0.02, 0.01] +fi = FlorisInterface(fi_dict_mod) +fi.reinitialize( + wind_speeds=[8.0], + wind_directions=[270.0] +) + +fi.calculate_wake() +turbine_powers = fi.get_turbine_powers().flatten()/1e6 + +x = np.array(range(num_in_row))+width*nw +nw += 1 + +title = "Increase base recovery" +ax0.bar(x, turbine_powers, width=width, label=title) + +if show_flow_cuts: + generate_wake_visualization(fi, title) + +# Add new expansion rate +fi_dict_mod = copy.deepcopy(fi_dict) +fi_dict_mod['wake']['wake_velocity_parameters']['empirical_gauss']\ + ['wake_expansion_rates'] = \ + fi_dict['wake']['wake_velocity_parameters']['empirical_gauss']\ + ['wake_expansion_rates'] + [0.0] +fi_dict_mod['wake']['wake_velocity_parameters']['empirical_gauss']\ + ['breakpoints_D'] = [5, 10] + +fi = FlorisInterface(fi_dict_mod) +fi.reinitialize( + wind_speeds=[8.0], + wind_directions=[270.0] +) + +fi.calculate_wake() +turbine_powers = fi.get_turbine_powers().flatten()/1e6 + +x = np.array(range(num_in_row))+width*nw +nw += 1 + +title = "Add rate, change breakpoints" +ax0.bar(x, turbine_powers, width=width, label=title) + +if show_flow_cuts: + generate_wake_visualization(fi, title) + +# Increase the wake-induced mixing gain +fi_dict_mod = copy.deepcopy(fi_dict) +fi_dict_mod['wake']['wake_velocity_parameters']['empirical_gauss']\ + ['mixing_gain_velocity'] = 3.0 +fi = FlorisInterface(fi_dict_mod) +fi.reinitialize( + wind_speeds=[8.0], + wind_directions=[270.0] +) + +fi.calculate_wake() +turbine_powers = fi.get_turbine_powers().flatten()/1e6 + +x = np.array(range(num_in_row))+width*nw +nw += 1 + +title = "Increase mixing gain" +ax0.bar(x, turbine_powers, width=width, label=title) + +if show_flow_cuts: + generate_wake_visualization(fi, title) + +# Power plot aesthetics +ax0.set_xticks(range(num_in_row)) +ax0.set_xticklabels(["T{0}".format(t) for t in range(num_in_row)]) +ax0.legend() +ax0.set_xlabel("Turbine") +ax0.set_ylabel("Power [MW]") + +plt.show() diff --git a/examples/27_empirical_gauss_deflection_parameters.py b/examples/27_empirical_gauss_deflection_parameters.py new file mode 100644 index 000000000..2ddb8a647 --- /dev/null +++ b/examples/27_empirical_gauss_deflection_parameters.py @@ -0,0 +1,235 @@ +# Copyright 2021 NREL + +# Licensed under the Apache License, Version 2.0 (the "License"); you may not +# use this file except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. + +# See https://nrel.github.io/floris/intro.html for documentation + + +import copy + +import matplotlib.pyplot as plt +import numpy as np + +from floris.tools import FlorisInterface +from floris.tools.visualization import plot_rotor_values, visualize_cut_plane + + +""" +This example illustrates the main parameters of the Empirical Gaussian +deflection model and their effects on the wind turbine wake. +""" + +# Initialize FLORIS with the given input file via FlorisInterface. +# For basic usage, FlorisInterface provides a simplified and expressive +# entry point to the simulation routines. + +# Options +show_flow_cuts = True +num_in_row = 5 # Should be at least 3 +first_three_yaw_angles = [20., 20., 10.] + +yaw_angles = np.array(first_three_yaw_angles + [0.]*(num_in_row-3))\ + [None, None, :] + +# Define function for visualizing wakes +def generate_wake_visualization(fi, title=None): + # Using the FlorisInterface functions, get 2D slices. + x_bounds = [-500, 3000] + y_bounds = [-250, 250] + z_bounds = [0, 500] + cross_plane_locations = [10, 1200, 2500] + horizontal_plane_location = 90.0 + streamwise_plane_location = 0.0 + # Contour plot colors + min_ws = 4 + max_ws = 10 + + horizontal_plane = fi.calculate_horizontal_plane( + x_resolution=200, + y_resolution=100, + height=horizontal_plane_location, + x_bounds=x_bounds, + y_bounds=y_bounds, + yaw_angles=yaw_angles + ) + y_plane = fi.calculate_y_plane( + x_resolution=200, + z_resolution=100, + crossstream_dist=streamwise_plane_location, + x_bounds=x_bounds, + z_bounds=z_bounds, + yaw_angles=yaw_angles + ) + cross_planes = [] + for cpl in cross_plane_locations: + cross_planes.append( + fi.calculate_cross_plane( + y_resolution=100, + z_resolution=100, + downstream_dist=cpl + ) + ) + + # Create the plots + # Cutplane settings + cp_ls = "solid" # line style + cp_lw = 0.5 # line width + cp_clr = "black" # line color + fig = plt.figure() + fig.set_size_inches(12, 12) + # Horizontal profile + ax = fig.add_subplot(311) + visualize_cut_plane(horizontal_plane, ax=ax, title="Top-down profile", + min_speed=min_ws, max_speed=max_ws) + ax.plot(x_bounds, [streamwise_plane_location]*2, color=cp_clr, + linewidth=cp_lw, linestyle=cp_ls) + for cpl in cross_plane_locations: + ax.plot([cpl]*2, y_bounds, color=cp_clr, linewidth=cp_lw, + linestyle=cp_ls) + + ax = fig.add_subplot(312) + visualize_cut_plane(y_plane, ax=ax, title="Streamwise profile", + min_speed=min_ws, max_speed=max_ws) + ax.plot(x_bounds, [horizontal_plane_location]*2, color=cp_clr, + linewidth=cp_lw, linestyle=cp_ls) + for cpl in cross_plane_locations: + ax.plot([cpl, cpl], z_bounds, color=cp_clr, linewidth=cp_lw, + linestyle=cp_ls) + + # Spanwise profiles + for i, (cp, cpl) in enumerate(zip(cross_planes, cross_plane_locations)): + visualize_cut_plane(cp, ax=fig.add_subplot(3, len(cross_planes), i+7), + title="Loc: {:.0f}m".format(cpl), min_speed=min_ws, + max_speed=max_ws) + + # Add overall figure title + if title is not None: + fig.suptitle(title, fontsize=16) + + +## Main script + +# Load input yaml and define farm layout +fi = FlorisInterface("inputs/emgauss.yaml") +D = fi.floris.farm.rotor_diameters[0] +fi.reinitialize( + layout_x=[x*5.0*D for x in range(num_in_row)], + layout_y=[0.0]*num_in_row, + wind_speeds=[8.0], + wind_directions=[270.0] +) + +# Save dictionary to modify later +fi_dict = fi.floris.as_dict() + +# Run wake calculation +fi.calculate_wake(yaw_angles=yaw_angles) + +# Look at the powers of each turbine +turbine_powers = fi.get_turbine_powers().flatten()/1e6 + +fig0, ax0 = plt.subplots(1,1) +width = 0.1 +nw = -2 +x = np.array(range(num_in_row))+width*nw +nw += 1 + +title = "Original" +ax0.bar(x, turbine_powers, width=width, label=title) +ax0.legend() + +# Visualize wakes +if show_flow_cuts: + generate_wake_visualization(fi, title) + +# Increase the maximum deflection attained +fi_dict_mod = copy.deepcopy(fi_dict) + +print(fi_dict_mod['wake']['wake_deflection_parameters']['empirical_gauss']) + +fi_dict_mod['wake']['wake_deflection_parameters']['empirical_gauss']\ + ['horizontal_deflection_gain_D'] = 5.0 + +fi = FlorisInterface(fi_dict_mod) +fi.reinitialize( + wind_speeds=[8.0], + wind_directions=[270.0] +) + +fi.calculate_wake(yaw_angles=yaw_angles) +turbine_powers = fi.get_turbine_powers().flatten()/1e6 + +x = np.array(range(num_in_row))+width*nw +nw += 1 + +title = "Increase max deflection" +ax0.bar(x, turbine_powers, width=width, label=title) + +if show_flow_cuts: + generate_wake_visualization(fi, title) + +# Add (increase) influence of wake added mixing +fi_dict_mod = copy.deepcopy(fi_dict) +fi_dict_mod['wake']['wake_deflection_parameters']['empirical_gauss']\ + ['mixing_gain_deflection'] = 100.0 + +fi = FlorisInterface(fi_dict_mod) +fi.reinitialize( + wind_speeds=[8.0], + wind_directions=[270.0] +) + +fi.calculate_wake(yaw_angles=yaw_angles) +turbine_powers = fi.get_turbine_powers().flatten()/1e6 + +x = np.array(range(num_in_row))+width*nw +nw += 1 + +title = "Increase mixing gain" +ax0.bar(x, turbine_powers, width=width, label=title) + +if show_flow_cuts: + generate_wake_visualization(fi, title) + +# Add (increase) the yaw-added mixing contribution +fi_dict_mod = copy.deepcopy(fi_dict) +# Include a WIM gain so that YAM is reflected in deflection as well +# as deficit +fi_dict_mod['wake']['wake_deflection_parameters']['empirical_gauss']\ + ['mixing_gain_deflection'] = 100.0 +fi_dict_mod['wake']['wake_deflection_parameters']['empirical_gauss']\ + ['yaw_added_mixing_gain'] = 1.0 +fi = FlorisInterface(fi_dict_mod) +fi.reinitialize( + wind_speeds=[8.0], + wind_directions=[270.0] +) + +fi.calculate_wake(yaw_angles=yaw_angles) +turbine_powers = fi.get_turbine_powers().flatten()/1e6 + +x = np.array(range(num_in_row))+width*nw +nw += 1 + +title = "Increase yaw-added mixing" +ax0.bar(x, turbine_powers, width=width, label=title) + +if show_flow_cuts: + generate_wake_visualization(fi, title) + +# Power plot aesthetics +ax0.set_xticks(range(num_in_row)) +ax0.set_xticklabels(["T{0}".format(t) for t in range(num_in_row)]) +ax0.legend() +ax0.set_xlabel("Turbine") +ax0.set_ylabel("Power [MW]") + +plt.show() diff --git a/examples/28_extract_wind_speed_at_points.py b/examples/28_extract_wind_speed_at_points.py new file mode 100644 index 000000000..9ef59b5b1 --- /dev/null +++ b/examples/28_extract_wind_speed_at_points.py @@ -0,0 +1,90 @@ +# Copyright 2023 NREL + +# Licensed under the Apache License, Version 2.0 (the "License"); you may not +# use this file except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. + +# See https://floris.readthedocs.io for documentation + + +import matplotlib.pyplot as plt +import numpy as np + +from floris.tools import FlorisInterface + + +""" +This example demonstrates the use of the sample_flow_at_points method of +FlorisInterface. sample_flow_at_points extracts the wind speed +information at user-specified locations in the flow. + +Specifically, this example returns the wind speed at a single x, y +location and four different heights over a sweep of wind directions. +This mimics the wind speed measurements of a met mast across all +wind directions (at a fixed free stream wind speed). + +Try different values for met_mast_option to vary the location of the +met mast within the two-turbine farm. +""" + +# User options +# FLORIS model to use (limited to Gauss/GCH, Jensen, and empirical Gauss) +floris_model = "gch" # Try "gch", "jensen", "emgauss" +# Option to try different met mast locations +met_mast_option = 0 # Try 0, 1, 2, 3 + +# Instantiate FLORIS model +fi = FlorisInterface("inputs/"+floris_model+".yaml") + +# Set up a two-turbine farm +D = 126 +fi.reinitialize(layout_x=[0, 3 * D], layout_y=[0, 3 * D]) + +fig, ax = plt.subplots(1,2) +fig.set_size_inches(10,4) +ax[0].scatter(fi.layout_x, fi.layout_y, color="black", label="Turbine") + +# Set the wind direction to run 360 degrees +wd_array = np.arange(0, 360, 1) +fi.reinitialize(wind_directions=wd_array) + +# Simulate a met mast in between the turbines +if met_mast_option == 0: + points_x = 4 * [3*D] + points_y = 4 * [0] +elif met_mast_option == 1: + points_x = 4 * [200.0] + points_y = 4 * [200.0] +elif met_mast_option == 2: + points_x = 4 * [20.0] + points_y = 4 * [20.0] +elif met_mast_option == 3: + points_x = 4 * [305.0] + points_y = 4 * [158.0] + +points_z = [30, 90, 150, 250] + +# Collect the points +u_at_points = fi.sample_flow_at_points(points_x, points_y, points_z) + +ax[0].scatter(points_x, points_y, color="red", marker="x", label="Met mast") +ax[0].grid() +ax[0].set_xlabel("x [m]") +ax[0].set_ylabel("y [m]") +ax[0].legend() + +# Plot the velocities +for z_idx, z in enumerate(points_z): + ax[1].plot(wd_array, u_at_points[:, :, z_idx].flatten(), label=f'Speed at z={z} m') +ax[1].grid() +ax[1].legend() +ax[1].set_xlabel('Wind Direction (deg)') +ax[1].set_ylabel('Wind Speed (m/s)') + +plt.show() diff --git a/examples/inputs/emgauss.yaml b/examples/inputs/emgauss.yaml new file mode 100644 index 000000000..dab5c7940 --- /dev/null +++ b/examples/inputs/emgauss.yaml @@ -0,0 +1,105 @@ + +name: Emperical Gaussian +description: Three turbines using emperical Gaussian model +floris_version: v3.x + +logging: + console: + enable: true + level: WARNING + file: + enable: false + level: WARNING + +solver: + type: turbine_grid + turbine_grid_points: 3 + +farm: + layout_x: + - 0.0 + - 630.0 + - 1260.0 + layout_y: + - 0.0 + - 0.0 + - 0.0 + turbine_type: + - nrel_5MW + +flow_field: + air_density: 1.225 + reference_wind_height: -1 # -1 is code for use the hub height + turbulence_intensity: 0.06 + wind_directions: + - 270.0 + wind_shear: 0.12 + wind_speeds: + - 8.0 + wind_veer: 0.0 + +wake: + model_strings: + combination_model: sosfs + deflection_model: empirical_gauss + turbulence_model: wake_induced_mixing + velocity_model: empirical_gauss + + enable_secondary_steering: false + enable_yaw_added_recovery: true + enable_transverse_velocities: false + + wake_deflection_parameters: + gauss: + ad: 0.0 + alpha: 0.58 + bd: 0.0 + beta: 0.077 + dm: 1.0 + ka: 0.38 + kb: 0.004 + jimenez: + ad: 0.0 + bd: 0.0 + kd: 0.05 + empirical_gauss: + horizontal_deflection_gain_D: 3.0 + vertical_deflection_gain_D: -1 + deflection_rate: 15 + mixing_gain_deflection: 0.0 + yaw_added_mixing_gain: 0.0 + + wake_velocity_parameters: + cc: + a_s: 0.179367259 + b_s: 0.0118889215 + c_s1: 0.0563691592 + c_s2: 0.13290157 + a_f: 3.11 + b_f: -0.68 + c_f: 2.41 + alpha_mod: 1.0 + gauss: + alpha: 0.58 + beta: 0.077 + ka: 0.38 + kb: 0.004 + jensen: + we: 0.05 + empirical_gauss: + wake_expansion_rates: + - 0.01 + - 0.005 + breakpoints_D: + - 10 + sigma_0_D: 0.28 + smoothing_length_D: 2.0 + mixing_gain_velocity: 2.0 + wake_turbulence_parameters: + crespo_hernandez: + initial: 0.1 + constant: 0.5 + ai: 0.8 + downstream: -0.32 + wake_induced_mixing: + atmospheric_ti_gain: 0.0 diff --git a/examples/inputs/gch_heterogeneous_inflow.yaml b/examples/inputs/gch_heterogeneous_inflow.yaml new file mode 100644 index 000000000..d7cffa0d5 --- /dev/null +++ b/examples/inputs/gch_heterogeneous_inflow.yaml @@ -0,0 +1,102 @@ +name: GCH +description: Three turbines using Gauss Curl Hybrid model +floris_version: v3.0.0 + +logging: + console: + enable: true + level: WARNING + file: + enable: false + level: WARNING + +solver: + type: turbine_grid + turbine_grid_points: 1 +farm: + layout_x: + - 0.0 + - 630.0 + - 1260.0 + layout_y: + - 0.0 + - 0.0 + - 0.0 + turbine_type: + - nrel_5MW + +flow_field: + air_density: 1.225 + heterogenous_inflow_config: + speed_multipliers: + - - 2.0 + - 1.0 + - 2.0 + - 1.0 + x: + - -300. + - -300. + - 2600. + - 2600. + y: + - -300. + - 300. + - -300. + - 300. + reference_wind_height: -1 + turbulence_intensity: 0.06 + wind_directions: + - 270.0 + wind_shear: 0.12 + wind_speeds: + - 8.0 + wind_veer: 0.0 + +wake: + model_strings: + combination_model: sosfs + deflection_model: gauss + turbulence_model: crespo_hernandez + velocity_model: gauss + enable_secondary_steering: true + enable_yaw_added_recovery: true + enable_transverse_velocities: true + + wake_deflection_parameters: + gauss: + ad: 0.0 + alpha: 0.58 + bd: 0.0 + beta: 0.077 + dm: 1.0 + ka: 0.38 + kb: 0.004 + jimenez: + ad: 0.0 + bd: 0.0 + kd: 0.05 + + wake_velocity_parameters: + cc: + a_s: 0.179367259 + b_s: 0.0118889215 + c_s1: 0.0563691592 + c_s2: 0.13290157 + a_f: 3.11 + b_f: -0.68 + c_f: 2.41 + alpha_mod: 1.0 + gauss: + alpha: 0.58 + beta: 0.077 + ka: 0.38 + kb: 0.004 + jensen: + we: 0.05 + + wake_turbulence_parameters: + crespo_hernandez: + initial: 0.1 + constant: 0.5 + ai: 0.8 + downstream: -0.32 diff --git a/examples/inputs/jensen.yaml b/examples/inputs/jensen.yaml index 8e87a265d..abb889e0a 100644 --- a/examples/inputs/jensen.yaml +++ b/examples/inputs/jensen.yaml @@ -45,9 +45,9 @@ wake: turbulence_model: crespo_hernandez velocity_model: jensen - enable_secondary_steering: true - enable_yaw_added_recovery: true - enable_transverse_velocities: true + enable_secondary_steering: false + enable_yaw_added_recovery: false + enable_transverse_velocities: false wake_deflection_parameters: gauss: diff --git a/examples/inputs_floating/emgauss_floating_fixedtilt15.yaml b/examples/inputs_floating/emgauss_floating_fixedtilt15.yaml new file mode 100644 index 000000000..1bfae562d --- /dev/null +++ b/examples/inputs_floating/emgauss_floating_fixedtilt15.yaml @@ -0,0 +1,101 @@ + +name: Emperical Gaussian floating +description: Single turbine using emperical Gaussian model for floating +floris_version: v3.x + +logging: + console: + enable: true + level: WARNING + file: + enable: false + level: WARNING + +solver: + type: turbine_grid + turbine_grid_points: 3 + +farm: + layout_x: + - 0.0 + layout_y: + - 0.0 + turbine_type: + - !include turbine_files/nrel_5MW_floating_fixedtilt15.yaml + +flow_field: + air_density: 1.225 + reference_wind_height: -1 # -1 is code for use the hub height + turbulence_intensity: 0.06 + wind_directions: + - 270.0 + wind_shear: 0.12 + wind_speeds: + - 8.0 + wind_veer: 0.0 + +wake: + model_strings: + combination_model: sosfs + deflection_model: empirical_gauss + turbulence_model: wake_induced_mixing + velocity_model: empirical_gauss + + enable_secondary_steering: false + enable_yaw_added_recovery: true + enable_transverse_velocities: false + + wake_deflection_parameters: + gauss: + ad: 0.0 + alpha: 0.58 + bd: 0.0 + beta: 0.077 + dm: 1.0 + ka: 0.38 + kb: 0.004 + jimenez: + ad: 0.0 + bd: 0.0 + kd: 0.05 + empirical_gauss: + horizontal_deflection_gain_D: 3.0 + vertical_deflection_gain_D: -1 + deflection_rate: 15 + mixing_gain_deflection: 0.0 + yaw_added_mixing_gain: 0.0 + + wake_velocity_parameters: + cc: + a_s: 0.179367259 + b_s: 0.0118889215 + c_s1: 0.0563691592 + c_s2: 0.13290157 + a_f: 3.11 + b_f: -0.68 + c_f: 2.41 + alpha_mod: 1.0 + gauss: + alpha: 0.58 + beta: 0.077 + ka: 0.38 + kb: 0.004 + jensen: + we: 0.05 + empirical_gauss: + wake_expansion_rates: + - 0.01 + - 0.005 + breakpoints_D: + - 10 + sigma_0_D: 0.28 + smoothing_length_D: 2.0 + mixing_gain_velocity: 2.0 + wake_turbulence_parameters: + crespo_hernandez: + initial: 0.1 + constant: 0.5 + ai: 0.8 + downstream: -0.32 + wake_induced_mixing: + atmospheric_ti_gain: 0.0 diff --git a/examples/inputs_floating/emgauss_floating_fixedtilt5.yaml b/examples/inputs_floating/emgauss_floating_fixedtilt5.yaml new file mode 100644 index 000000000..04cf30518 --- /dev/null +++ b/examples/inputs_floating/emgauss_floating_fixedtilt5.yaml @@ -0,0 +1,101 @@ + +name: Emperical Gaussian floating +description: Single turbine using emperical Gaussian model for floating +floris_version: v3.x + +logging: + console: + enable: true + level: WARNING + file: + enable: false + level: WARNING + +solver: + type: turbine_grid + turbine_grid_points: 3 + +farm: + layout_x: + - 0.0 + layout_y: + - 0.0 + turbine_type: + - !include turbine_files/nrel_5MW_floating_fixedtilt5.yaml + +flow_field: + air_density: 1.225 + reference_wind_height: -1 # -1 is code for use the hub height + turbulence_intensity: 0.06 + wind_directions: + - 270.0 + wind_shear: 0.12 + wind_speeds: + - 8.0 + wind_veer: 0.0 + +wake: + model_strings: + combination_model: sosfs + deflection_model: empirical_gauss + turbulence_model: wake_induced_mixing + velocity_model: empirical_gauss + + enable_secondary_steering: false + enable_yaw_added_recovery: true + enable_transverse_velocities: false + + wake_deflection_parameters: + gauss: + ad: 0.0 + alpha: 0.58 + bd: 0.0 + beta: 0.077 + dm: 1.0 + ka: 0.38 + kb: 0.004 + jimenez: + ad: 0.0 + bd: 0.0 + kd: 0.05 + empirical_gauss: + horizontal_deflection_gain_D: 3.0 + vertical_deflection_gain_D: -1 + deflection_rate: 15 + mixing_gain_deflection: 0.0 + yaw_added_mixing_gain: 0.0 + + wake_velocity_parameters: + cc: + a_s: 0.179367259 + b_s: 0.0118889215 + c_s1: 0.0563691592 + c_s2: 0.13290157 + a_f: 3.11 + b_f: -0.68 + c_f: 2.41 + alpha_mod: 1.0 + gauss: + alpha: 0.58 + beta: 0.077 + ka: 0.38 + kb: 0.004 + jensen: + we: 0.05 + empirical_gauss: + wake_expansion_rates: + - 0.01 + - 0.005 + breakpoints_D: + - 10 + sigma_0_D: 0.28 + smoothing_length_D: 2.0 + mixing_gain_velocity: 2.0 + wake_turbulence_parameters: + crespo_hernandez: + initial: 0.1 + constant: 0.5 + ai: 0.8 + downstream: -0.32 + wake_induced_mixing: + atmospheric_ti_gain: 0.0 diff --git a/examples/inputs_floating/gch_fixed.yaml b/examples/inputs_floating/gch_fixed.yaml new file mode 100644 index 000000000..497cecc95 --- /dev/null +++ b/examples/inputs_floating/gch_fixed.yaml @@ -0,0 +1,85 @@ + +name: GCH +description: Example of single fixed-bottom turbine +floris_version: v3.0.0 + +logging: + console: + enable: true + level: WARNING + file: + enable: false + level: WARNING + +solver: + type: turbine_grid + turbine_grid_points: 3 + +farm: + layout_x: + - 0.0 + layout_y: + - 0.0 + turbine_type: + - !include turbine_files/nrel_5MW_fixed.yaml + +flow_field: + air_density: 1.225 + reference_wind_height: -1 + turbulence_intensity: 0.06 + wind_directions: + - 270.0 + wind_shear: 0.12 + wind_speeds: + - 8.0 + wind_veer: 0.0 + +wake: + model_strings: + combination_model: sosfs + deflection_model: gauss + turbulence_model: crespo_hernandez + velocity_model: gauss + + enable_secondary_steering: true + enable_yaw_added_recovery: true + enable_transverse_velocities: true + + wake_deflection_parameters: + gauss: + ad: 0.0 + alpha: 0.58 + bd: 0.0 + beta: 0.077 + dm: 1.0 + ka: 0.38 + kb: 0.004 + jimenez: + ad: 0.0 + bd: 0.0 + kd: 0.05 + + wake_velocity_parameters: + cc: + a_s: 0.179367259 + b_s: 0.0118889215 + c_s1: 0.0563691592 + c_s2: 0.13290157 + a_f: 3.11 + b_f: -0.68 + c_f: 2.41 + alpha_mod: 1.0 + gauss: + alpha: 0.58 + beta: 0.077 + ka: 0.38 + kb: 0.004 + jensen: + we: 0.05 + + wake_turbulence_parameters: + crespo_hernandez: + initial: 0.1 + constant: 0.5 + ai: 0.8 + downstream: -0.32 diff --git a/examples/inputs_floating/gch_floating.yaml b/examples/inputs_floating/gch_floating.yaml new file mode 100644 index 000000000..31ff7c606 --- /dev/null +++ b/examples/inputs_floating/gch_floating.yaml @@ -0,0 +1,86 @@ + + +name: GCH +description: Example of single floating turbine +floris_version: v3.0.0 + +logging: + console: + enable: true + level: WARNING + file: + enable: false + level: WARNING + +solver: + type: turbine_grid + turbine_grid_points: 3 + +farm: + layout_x: + - 0.0 + layout_y: + - 0.0 + turbine_type: + - !include turbine_files/nrel_5MW_floating.yaml + +flow_field: + air_density: 1.225 + reference_wind_height: -1 + turbulence_intensity: 0.06 + wind_directions: + - 270.0 + wind_shear: 0.12 + wind_speeds: + - 8.0 + wind_veer: 0.0 + +wake: + model_strings: + combination_model: sosfs + deflection_model: gauss + turbulence_model: crespo_hernandez + velocity_model: gauss + + enable_secondary_steering: true + enable_yaw_added_recovery: true + enable_transverse_velocities: true + + wake_deflection_parameters: + gauss: + ad: 0.0 + alpha: 0.58 + bd: 0.0 + beta: 0.077 + dm: 1.0 + ka: 0.38 + kb: 0.004 + jimenez: + ad: 0.0 + bd: 0.0 + kd: 0.05 + + wake_velocity_parameters: + cc: + a_s: 0.179367259 + b_s: 0.0118889215 + c_s1: 0.0563691592 + c_s2: 0.13290157 + a_f: 3.11 + b_f: -0.68 + c_f: 2.41 + alpha_mod: 1.0 + gauss: + alpha: 0.58 + beta: 0.077 + ka: 0.38 + kb: 0.004 + jensen: + we: 0.05 + + wake_turbulence_parameters: + crespo_hernandez: + initial: 0.1 + constant: 0.5 + ai: 0.8 + downstream: -0.32 diff --git a/examples/inputs_floating/gch_floating_defined_floating.yaml b/examples/inputs_floating/gch_floating_defined_floating.yaml new file mode 100644 index 000000000..3096e4c2a --- /dev/null +++ b/examples/inputs_floating/gch_floating_defined_floating.yaml @@ -0,0 +1,85 @@ + +name: GCH +description: Example of single floating turbine where the cp/ct is calculated with floating tilt included +floris_version: v3.0.0 + +logging: + console: + enable: true + level: WARNING + file: + enable: false + level: WARNING + +solver: + type: turbine_grid + turbine_grid_points: 3 + +farm: + layout_x: + - 0.0 + layout_y: + - 0.0 + turbine_type: + - !include turbine_files/nrel_5MW_floating_defined_floating.yaml + +flow_field: + air_density: 1.225 + reference_wind_height: -1 + turbulence_intensity: 0.06 + wind_directions: + - 270.0 + wind_shear: 0.12 + wind_speeds: + - 8.0 + wind_veer: 0.0 + +wake: + model_strings: + combination_model: sosfs + deflection_model: gauss + turbulence_model: crespo_hernandez + velocity_model: gauss + + enable_secondary_steering: true + enable_yaw_added_recovery: true + enable_transverse_velocities: true + + wake_deflection_parameters: + gauss: + ad: 0.0 + alpha: 0.58 + bd: 0.0 + beta: 0.077 + dm: 1.0 + ka: 0.38 + kb: 0.004 + jimenez: + ad: 0.0 + bd: 0.0 + kd: 0.05 + + wake_velocity_parameters: + cc: + a_s: 0.179367259 + b_s: 0.0118889215 + c_s1: 0.0563691592 + c_s2: 0.13290157 + a_f: 3.11 + b_f: -0.68 + c_f: 2.41 + alpha_mod: 1.0 + gauss: + alpha: 0.58 + beta: 0.077 + ka: 0.38 + kb: 0.004 + jensen: + we: 0.05 + + wake_turbulence_parameters: + crespo_hernandez: + initial: 0.1 + constant: 0.5 + ai: 0.8 + downstream: -0.32 diff --git a/examples/inputs_floating/turbine_files/nrel_5MW_fixed.yaml b/examples/inputs_floating/turbine_files/nrel_5MW_fixed.yaml new file mode 100644 index 000000000..f9321cb17 --- /dev/null +++ b/examples/inputs_floating/turbine_files/nrel_5MW_fixed.yaml @@ -0,0 +1,167 @@ +turbine_type: 'nrel_5MW_floating' +generator_efficiency: 1.0 +hub_height: 90.0 +pP: 1.88 +pT: 1.88 +rotor_diameter: 126.0 +TSR: 8.0 +ref_density_cp_ct: 1.225 +ref_tilt_cp_ct: 5.0 +floating_correct_cp_ct_for_tilt: True # Apply tilt correction to cp/ct +power_thrust_table: + power: + - 0.0 + - 0.000000 + - 0.000000 + - 0.178085 + - 0.289075 + - 0.349022 + - 0.384728 + - 0.406059 + - 0.420228 + - 0.428823 + - 0.433873 + - 0.436223 + - 0.436845 + - 0.436575 + - 0.436511 + - 0.436561 + - 0.436517 + - 0.435903 + - 0.434673 + - 0.433230 + - 0.430466 + - 0.378869 + - 0.335199 + - 0.297991 + - 0.266092 + - 0.238588 + - 0.214748 + - 0.193981 + - 0.175808 + - 0.159835 + - 0.145741 + - 0.133256 + - 0.122157 + - 0.112257 + - 0.103399 + - 0.095449 + - 0.088294 + - 0.081836 + - 0.075993 + - 0.070692 + - 0.065875 + - 0.061484 + - 0.057476 + - 0.053809 + - 0.050447 + - 0.047358 + - 0.044518 + - 0.041900 + - 0.039483 + - 0.0 + - 0.0 + thrust: + - 0.0 + - 0.0 + - 0.0 + - 0.99 + - 0.99 + - 0.97373036 + - 0.92826162 + - 0.89210543 + - 0.86100905 + - 0.835423 + - 0.81237673 + - 0.79225789 + - 0.77584769 + - 0.7629228 + - 0.76156073 + - 0.76261984 + - 0.76169723 + - 0.75232027 + - 0.74026851 + - 0.72987175 + - 0.70701647 + - 0.54054532 + - 0.45509459 + - 0.39343381 + - 0.34250785 + - 0.30487242 + - 0.27164979 + - 0.24361964 + - 0.21973831 + - 0.19918151 + - 0.18131868 + - 0.16537679 + - 0.15103727 + - 0.13998636 + - 0.1289037 + - 0.11970413 + - 0.11087113 + - 0.10339901 + - 0.09617888 + - 0.09009926 + - 0.08395078 + - 0.0791188 + - 0.07448356 + - 0.07050731 + - 0.06684119 + - 0.06345518 + - 0.06032267 + - 0.05741999 + - 0.05472609 + - 0.0 + - 0.0 + wind_speed: + - 0.0 + - 2.0 + - 2.5 + - 3.0 + - 3.5 + - 4.0 + - 4.5 + - 5.0 + - 5.5 + - 6.0 + - 6.5 + - 7.0 + - 7.5 + - 8.0 + - 8.5 + - 9.0 + - 9.5 + - 10.0 + - 10.5 + - 11.0 + - 11.5 + - 12.0 + - 12.5 + - 13.0 + - 13.5 + - 14.0 + - 14.5 + - 15.0 + - 15.5 + - 16.0 + - 16.5 + - 17.0 + - 17.5 + - 18.0 + - 18.5 + - 19.0 + - 19.5 + - 20.0 + - 20.5 + - 21.0 + - 21.5 + - 22.0 + - 22.5 + - 23.0 + - 23.5 + - 24.0 + - 24.5 + - 25.0 + - 25.01 + - 25.02 + - 50.0 diff --git a/examples/inputs_floating/turbine_files/nrel_5MW_floating.yaml b/examples/inputs_floating/turbine_files/nrel_5MW_floating.yaml new file mode 100644 index 000000000..834b0f85b --- /dev/null +++ b/examples/inputs_floating/turbine_files/nrel_5MW_floating.yaml @@ -0,0 +1,180 @@ +turbine_type: 'nrel_5MW_floating' +generator_efficiency: 1.0 +hub_height: 90.0 +pP: 1.88 +pT: 1.88 +rotor_diameter: 126.0 +TSR: 8.0 +ref_density_cp_ct: 1.225 +ref_tilt_cp_ct: 5.0 +floating_correct_cp_ct_for_tilt: True # Apply tilt correction to cp/ct +power_thrust_table: + power: + - 0.0 + - 0.000000 + - 0.000000 + - 0.178085 + - 0.289075 + - 0.349022 + - 0.384728 + - 0.406059 + - 0.420228 + - 0.428823 + - 0.433873 + - 0.436223 + - 0.436845 + - 0.436575 + - 0.436511 + - 0.436561 + - 0.436517 + - 0.435903 + - 0.434673 + - 0.433230 + - 0.430466 + - 0.378869 + - 0.335199 + - 0.297991 + - 0.266092 + - 0.238588 + - 0.214748 + - 0.193981 + - 0.175808 + - 0.159835 + - 0.145741 + - 0.133256 + - 0.122157 + - 0.112257 + - 0.103399 + - 0.095449 + - 0.088294 + - 0.081836 + - 0.075993 + - 0.070692 + - 0.065875 + - 0.061484 + - 0.057476 + - 0.053809 + - 0.050447 + - 0.047358 + - 0.044518 + - 0.041900 + - 0.039483 + - 0.0 + - 0.0 + thrust: + - 0.0 + - 0.0 + - 0.0 + - 0.99 + - 0.99 + - 0.97373036 + - 0.92826162 + - 0.89210543 + - 0.86100905 + - 0.835423 + - 0.81237673 + - 0.79225789 + - 0.77584769 + - 0.7629228 + - 0.76156073 + - 0.76261984 + - 0.76169723 + - 0.75232027 + - 0.74026851 + - 0.72987175 + - 0.70701647 + - 0.54054532 + - 0.45509459 + - 0.39343381 + - 0.34250785 + - 0.30487242 + - 0.27164979 + - 0.24361964 + - 0.21973831 + - 0.19918151 + - 0.18131868 + - 0.16537679 + - 0.15103727 + - 0.13998636 + - 0.1289037 + - 0.11970413 + - 0.11087113 + - 0.10339901 + - 0.09617888 + - 0.09009926 + - 0.08395078 + - 0.0791188 + - 0.07448356 + - 0.07050731 + - 0.06684119 + - 0.06345518 + - 0.06032267 + - 0.05741999 + - 0.05472609 + - 0.0 + - 0.0 + wind_speed: + - 0.0 + - 2.0 + - 2.5 + - 3.0 + - 3.5 + - 4.0 + - 4.5 + - 5.0 + - 5.5 + - 6.0 + - 6.5 + - 7.0 + - 7.5 + - 8.0 + - 8.5 + - 9.0 + - 9.5 + - 10.0 + - 10.5 + - 11.0 + - 11.5 + - 12.0 + - 12.5 + - 13.0 + - 13.5 + - 14.0 + - 14.5 + - 15.0 + - 15.5 + - 16.0 + - 16.5 + - 17.0 + - 17.5 + - 18.0 + - 18.5 + - 19.0 + - 19.5 + - 20.0 + - 20.5 + - 21.0 + - 21.5 + - 22.0 + - 22.5 + - 23.0 + - 23.5 + - 24.0 + - 24.5 + - 25.0 + - 25.01 + - 25.02 + - 50.0 +floating_tilt_table: + tilt: + - 5.0 + - 5.0 + - 9.0 + - 5.0 + - 5.0 + wind_speeds: + - 0.0 + - 4.0 + - 11.0 + - 25.0 + - 50.0 diff --git a/examples/inputs_floating/turbine_files/nrel_5MW_floating_defined_floating.yaml b/examples/inputs_floating/turbine_files/nrel_5MW_floating_defined_floating.yaml new file mode 100644 index 000000000..0c7ae770e --- /dev/null +++ b/examples/inputs_floating/turbine_files/nrel_5MW_floating_defined_floating.yaml @@ -0,0 +1,180 @@ +turbine_type: 'nrel_5MW_floating' +generator_efficiency: 1.0 +hub_height: 90.0 +pP: 1.88 +pT: 1.88 +rotor_diameter: 126.0 +TSR: 8.0 +ref_density_cp_ct: 1.225 +ref_tilt_cp_ct: 5.0 +floating_correct_cp_ct_for_tilt: False # Do not apply tilt correction to cp/ct +power_thrust_table: + power: + - 0.0 + - 0.000000 + - 0.000000 + - 0.178085 + - 0.289075 + - 0.349022 + - 0.384728 + - 0.406059 + - 0.420228 + - 0.428823 + - 0.433873 + - 0.436223 + - 0.436845 + - 0.436575 + - 0.436511 + - 0.436561 + - 0.436517 + - 0.435903 + - 0.434673 + - 0.433230 + - 0.430466 + - 0.378869 + - 0.335199 + - 0.297991 + - 0.266092 + - 0.238588 + - 0.214748 + - 0.193981 + - 0.175808 + - 0.159835 + - 0.145741 + - 0.133256 + - 0.122157 + - 0.112257 + - 0.103399 + - 0.095449 + - 0.088294 + - 0.081836 + - 0.075993 + - 0.070692 + - 0.065875 + - 0.061484 + - 0.057476 + - 0.053809 + - 0.050447 + - 0.047358 + - 0.044518 + - 0.041900 + - 0.039483 + - 0.0 + - 0.0 + thrust: + - 0.0 + - 0.0 + - 0.0 + - 0.99 + - 0.99 + - 0.97373036 + - 0.92826162 + - 0.89210543 + - 0.86100905 + - 0.835423 + - 0.81237673 + - 0.79225789 + - 0.77584769 + - 0.7629228 + - 0.76156073 + - 0.76261984 + - 0.76169723 + - 0.75232027 + - 0.74026851 + - 0.72987175 + - 0.70701647 + - 0.54054532 + - 0.45509459 + - 0.39343381 + - 0.34250785 + - 0.30487242 + - 0.27164979 + - 0.24361964 + - 0.21973831 + - 0.19918151 + - 0.18131868 + - 0.16537679 + - 0.15103727 + - 0.13998636 + - 0.1289037 + - 0.11970413 + - 0.11087113 + - 0.10339901 + - 0.09617888 + - 0.09009926 + - 0.08395078 + - 0.0791188 + - 0.07448356 + - 0.07050731 + - 0.06684119 + - 0.06345518 + - 0.06032267 + - 0.05741999 + - 0.05472609 + - 0.0 + - 0.0 + wind_speed: + - 0.0 + - 2.0 + - 2.5 + - 3.0 + - 3.5 + - 4.0 + - 4.5 + - 5.0 + - 5.5 + - 6.0 + - 6.5 + - 7.0 + - 7.5 + - 8.0 + - 8.5 + - 9.0 + - 9.5 + - 10.0 + - 10.5 + - 11.0 + - 11.5 + - 12.0 + - 12.5 + - 13.0 + - 13.5 + - 14.0 + - 14.5 + - 15.0 + - 15.5 + - 16.0 + - 16.5 + - 17.0 + - 17.5 + - 18.0 + - 18.5 + - 19.0 + - 19.5 + - 20.0 + - 20.5 + - 21.0 + - 21.5 + - 22.0 + - 22.5 + - 23.0 + - 23.5 + - 24.0 + - 24.5 + - 25.0 + - 25.01 + - 25.02 + - 50.0 +floating_tilt_table: + tilt: + - 5.0 + - 5.0 + - 9.0 + - 5.0 + - 5.0 + wind_speeds: + - 0.0 + - 4.0 + - 11.0 + - 25.0 + - 50.0 diff --git a/examples/inputs_floating/turbine_files/nrel_5MW_floating_fixedtilt15.yaml b/examples/inputs_floating/turbine_files/nrel_5MW_floating_fixedtilt15.yaml new file mode 100644 index 000000000..234807512 --- /dev/null +++ b/examples/inputs_floating/turbine_files/nrel_5MW_floating_fixedtilt15.yaml @@ -0,0 +1,180 @@ +turbine_type: 'nrel_5MW_floating' +generator_efficiency: 1.0 +hub_height: 90.0 +pP: 1.88 +pT: 1.88 +rotor_diameter: 126.0 +TSR: 8.0 +ref_density_cp_ct: 1.225 +ref_tilt_cp_ct: 5.0 +floating_correct_cp_ct_for_tilt: True # Apply tilt correction to cp/ct +power_thrust_table: + power: + - 0.0 + - 0.000000 + - 0.000000 + - 0.178085 + - 0.289075 + - 0.349022 + - 0.384728 + - 0.406059 + - 0.420228 + - 0.428823 + - 0.433873 + - 0.436223 + - 0.436845 + - 0.436575 + - 0.436511 + - 0.436561 + - 0.436517 + - 0.435903 + - 0.434673 + - 0.433230 + - 0.430466 + - 0.378869 + - 0.335199 + - 0.297991 + - 0.266092 + - 0.238588 + - 0.214748 + - 0.193981 + - 0.175808 + - 0.159835 + - 0.145741 + - 0.133256 + - 0.122157 + - 0.112257 + - 0.103399 + - 0.095449 + - 0.088294 + - 0.081836 + - 0.075993 + - 0.070692 + - 0.065875 + - 0.061484 + - 0.057476 + - 0.053809 + - 0.050447 + - 0.047358 + - 0.044518 + - 0.041900 + - 0.039483 + - 0.0 + - 0.0 + thrust: + - 0.0 + - 0.0 + - 0.0 + - 0.99 + - 0.99 + - 0.97373036 + - 0.92826162 + - 0.89210543 + - 0.86100905 + - 0.835423 + - 0.81237673 + - 0.79225789 + - 0.77584769 + - 0.7629228 + - 0.76156073 + - 0.76261984 + - 0.76169723 + - 0.75232027 + - 0.74026851 + - 0.72987175 + - 0.70701647 + - 0.54054532 + - 0.45509459 + - 0.39343381 + - 0.34250785 + - 0.30487242 + - 0.27164979 + - 0.24361964 + - 0.21973831 + - 0.19918151 + - 0.18131868 + - 0.16537679 + - 0.15103727 + - 0.13998636 + - 0.1289037 + - 0.11970413 + - 0.11087113 + - 0.10339901 + - 0.09617888 + - 0.09009926 + - 0.08395078 + - 0.0791188 + - 0.07448356 + - 0.07050731 + - 0.06684119 + - 0.06345518 + - 0.06032267 + - 0.05741999 + - 0.05472609 + - 0.0 + - 0.0 + wind_speed: + - 0.0 + - 2.0 + - 2.5 + - 3.0 + - 3.5 + - 4.0 + - 4.5 + - 5.0 + - 5.5 + - 6.0 + - 6.5 + - 7.0 + - 7.5 + - 8.0 + - 8.5 + - 9.0 + - 9.5 + - 10.0 + - 10.5 + - 11.0 + - 11.5 + - 12.0 + - 12.5 + - 13.0 + - 13.5 + - 14.0 + - 14.5 + - 15.0 + - 15.5 + - 16.0 + - 16.5 + - 17.0 + - 17.5 + - 18.0 + - 18.5 + - 19.0 + - 19.5 + - 20.0 + - 20.5 + - 21.0 + - 21.5 + - 22.0 + - 22.5 + - 23.0 + - 23.5 + - 24.0 + - 24.5 + - 25.0 + - 25.01 + - 25.02 + - 50.0 +floating_tilt_table: + tilt: + - 15.0 + - 15.0 + - 15.0 + - 15.0 + - 15.0 + wind_speeds: + - 0.0 + - 4.0 + - 11.0 + - 25.0 + - 50.0 diff --git a/examples/inputs_floating/turbine_files/nrel_5MW_floating_fixedtilt5.yaml b/examples/inputs_floating/turbine_files/nrel_5MW_floating_fixedtilt5.yaml new file mode 100644 index 000000000..9eac120ec --- /dev/null +++ b/examples/inputs_floating/turbine_files/nrel_5MW_floating_fixedtilt5.yaml @@ -0,0 +1,180 @@ +turbine_type: 'nrel_5MW_floating' +generator_efficiency: 1.0 +hub_height: 90.0 +pP: 1.88 +pT: 1.88 +rotor_diameter: 126.0 +TSR: 8.0 +ref_density_cp_ct: 1.225 +ref_tilt_cp_ct: 5.0 +floating_correct_cp_ct_for_tilt: True # Apply tilt correction to cp/ct +power_thrust_table: + power: + - 0.0 + - 0.000000 + - 0.000000 + - 0.178085 + - 0.289075 + - 0.349022 + - 0.384728 + - 0.406059 + - 0.420228 + - 0.428823 + - 0.433873 + - 0.436223 + - 0.436845 + - 0.436575 + - 0.436511 + - 0.436561 + - 0.436517 + - 0.435903 + - 0.434673 + - 0.433230 + - 0.430466 + - 0.378869 + - 0.335199 + - 0.297991 + - 0.266092 + - 0.238588 + - 0.214748 + - 0.193981 + - 0.175808 + - 0.159835 + - 0.145741 + - 0.133256 + - 0.122157 + - 0.112257 + - 0.103399 + - 0.095449 + - 0.088294 + - 0.081836 + - 0.075993 + - 0.070692 + - 0.065875 + - 0.061484 + - 0.057476 + - 0.053809 + - 0.050447 + - 0.047358 + - 0.044518 + - 0.041900 + - 0.039483 + - 0.0 + - 0.0 + thrust: + - 0.0 + - 0.0 + - 0.0 + - 0.99 + - 0.99 + - 0.97373036 + - 0.92826162 + - 0.89210543 + - 0.86100905 + - 0.835423 + - 0.81237673 + - 0.79225789 + - 0.77584769 + - 0.7629228 + - 0.76156073 + - 0.76261984 + - 0.76169723 + - 0.75232027 + - 0.74026851 + - 0.72987175 + - 0.70701647 + - 0.54054532 + - 0.45509459 + - 0.39343381 + - 0.34250785 + - 0.30487242 + - 0.27164979 + - 0.24361964 + - 0.21973831 + - 0.19918151 + - 0.18131868 + - 0.16537679 + - 0.15103727 + - 0.13998636 + - 0.1289037 + - 0.11970413 + - 0.11087113 + - 0.10339901 + - 0.09617888 + - 0.09009926 + - 0.08395078 + - 0.0791188 + - 0.07448356 + - 0.07050731 + - 0.06684119 + - 0.06345518 + - 0.06032267 + - 0.05741999 + - 0.05472609 + - 0.0 + - 0.0 + wind_speed: + - 0.0 + - 2.0 + - 2.5 + - 3.0 + - 3.5 + - 4.0 + - 4.5 + - 5.0 + - 5.5 + - 6.0 + - 6.5 + - 7.0 + - 7.5 + - 8.0 + - 8.5 + - 9.0 + - 9.5 + - 10.0 + - 10.5 + - 11.0 + - 11.5 + - 12.0 + - 12.5 + - 13.0 + - 13.5 + - 14.0 + - 14.5 + - 15.0 + - 15.5 + - 16.0 + - 16.5 + - 17.0 + - 17.5 + - 18.0 + - 18.5 + - 19.0 + - 19.5 + - 20.0 + - 20.5 + - 21.0 + - 21.5 + - 22.0 + - 22.5 + - 23.0 + - 23.5 + - 24.0 + - 24.5 + - 25.0 + - 25.01 + - 25.02 + - 50.0 +floating_tilt_table: + tilt: + - 5.0 + - 5.0 + - 5.0 + - 5.0 + - 5.0 + wind_speeds: + - 0.0 + - 4.0 + - 11.0 + - 25.0 + - 50.0 diff --git a/floris/simulation/__init__.py b/floris/simulation/__init__.py index 8d28fd287..12d30aab8 100644 --- a/floris/simulation/__init__.py +++ b/floris/simulation/__init__.py @@ -37,14 +37,23 @@ import floris.logging_manager from .base import BaseClass, BaseModel, State -from .turbine import average_velocity, axial_induction, Ct, power, Turbine +from .turbine import average_velocity, axial_induction, Ct, power, rotor_effective_velocity, Turbine from .farm import Farm -from .grid import FlowFieldGrid, FlowFieldPlanarGrid, Grid, TurbineGrid +from .grid import ( + FlowFieldGrid, + FlowFieldPlanarGrid, + Grid, + PointsGrid, + TurbineGrid, + TurbineCubatureGrid +) from .flow_field import FlowField from .wake import WakeModelManager from .solver import ( cc_solver, + empirical_gauss_solver, full_flow_cc_solver, + full_flow_empirical_gauss_solver, full_flow_sequential_solver, full_flow_turbopark_solver, sequential_solver, diff --git a/floris/simulation/farm.py b/floris/simulation/farm.py index 6d37c3ef4..9aba71fa6 100644 --- a/floris/simulation/farm.py +++ b/floris/simulation/farm.py @@ -18,7 +18,6 @@ import attrs import numpy as np -import yaml from attrs import define, field from floris.simulation import ( @@ -26,9 +25,11 @@ State, Turbine, ) +from floris.simulation.turbine import compute_tilt_angles_for_floating_turbines from floris.type_dec import ( convert_to_path, floris_array_converter, + iter_validator, NDArrayFloat, NDArrayObject, ) @@ -41,7 +42,7 @@ @define class Farm(BaseClass): """Farm is where wind power plants should be instantiated from a YAML configuration - file. The Farm will create a heterogenous set of turbines that compose a windfarm, + file. The Farm will create a heterogenous set of turbines that compose a wind farm, validate the inputs, and then create a vectorized representation of the the turbine data. @@ -54,14 +55,17 @@ class Farm(BaseClass): layout_x: NDArrayFloat = field(converter=floris_array_converter) layout_y: NDArrayFloat = field(converter=floris_array_converter) - turbine_type: List = field() + # TODO: turbine_type should be immutable + turbine_type: List = field(validator=iter_validator(list, (dict, str))) turbine_library_path: Path = field( default=default_turbine_library_path, converter=convert_to_path ) - turbine_definitions: dict = field(init=False) + turbine_definitions: list = field(init=False, validator=iter_validator(list, dict)) yaw_angles: NDArrayFloat = field(init=False) yaw_angles_sorted: NDArrayFloat = field(init=False) + tilt_angles: NDArrayFloat = field(init=False) + tilt_angles_sorted: NDArrayFloat = field(init=False) coordinates: List[Vec3] = field(init=False) hub_heights: NDArrayFloat = field(init=False) hub_heights_sorted: NDArrayFloat = field(init=False, default=[]) @@ -69,10 +73,94 @@ class Farm(BaseClass): turbine_type_map_sorted: NDArrayObject = field(init=False, default=[]) rotor_diameters_sorted: NDArrayFloat = field(init=False, default=[]) TSRs_sorted: NDArrayFloat = field(init=False, default=[]) + pPs: NDArrayFloat = field(init=False, default=[]) pPs_sorted: NDArrayFloat = field(init=False, default=[]) + pTs: NDArrayFloat = field(init=False, default=[]) + pTs_sorted: NDArrayFloat = field(init=False, default=[]) + ref_tilt_cp_cts: NDArrayFloat = field(init=False, default=[]) + ref_tilt_cp_cts_sorted: NDArrayFloat = field(init=False, default=[]) + correct_cp_ct_for_tilt: NDArrayFloat = field(init=False, default=[]) + correct_cp_ct_for_tilt_sorted: NDArrayFloat = field(init=False, default=[]) + turbine_fTilts: list = field(init=False, default=[]) def __attrs_post_init__(self) -> None: - self.check_turbine_type() + # Turbine definitions can be supplied in three ways: + # - A string selecting a turbine in the floris turbine library + # - A Python dict representation of a turbine definition + # - There's an option to use the yaml keyword "!include" which results in the yaml + # library preprocessing the inputs and loading the specified file directly into + # the main input file. The result is that floris sees the turbine definition as a dict. + # - A string selecting an turbine that exists in an external turbine library + # specified in `turbine_library_path` + + # Load all the turbine types into a cache to be mapped to specific turbine indices later. + # This allows to read the yaml input files once rather than every time they're given. + # In other words, if the turbine type is already in the cache, skip that iteration of + # the for-loop. + turbine_definition_cache = {} + for t in self.turbine_type: + # If a turbine type is a dict, then it was either preprocessed by the yaml + # library to resolve the "!include" or it was set in a script as a dict. In either case, + # add an entry to the cache + if isinstance(t, dict): + if t["turbine_type"] in turbine_definition_cache: + continue + turbine_definition_cache[t["turbine_type"]] = t + + # If a turbine type is a string, then it is expected in the internal or external + # turbine library + if isinstance(t, str): + if t in turbine_definition_cache: + continue + + # Check if the file exists in the internal and/or external library + internal_fn = (default_turbine_library_path / t).with_suffix(".yaml") + external_fn = (self.turbine_library_path / t).with_suffix(".yaml") + in_internal = internal_fn.exists() + in_external = external_fn.exists() + + # If an external library is used and there's a duplicate of an internal + # definition, then raise an error + is_unique_path = self.turbine_library_path != default_turbine_library_path + if is_unique_path and in_external and in_internal: + raise ValueError( + f"The turbine type: {t} exists in both the internal and external" + " turbine library." + ) + + if in_internal: + full_path = internal_fn + elif in_external: + full_path = external_fn + else: + raise FileNotFoundError( + f"The turbine type: {t} does not exist in either the internal or" + " external turbine library." + ) + turbine_definition_cache[t] = load_yaml(full_path) + + # Convert any dict entries in the turbine_type list to the type string. Since the + # definition is saved above, we can make the whole list consistent now to use it + # for mapping turbines later. + # We use a private variable here instead of self.turbine_type because self.turbine_type + # should always retain the input data. When this class is exported as_dict, the input + # types must be used. If we modify that directly and change its shape, recreating this + # class with a different layout but not a new self.turbine_type could cause the data + # to be out of sync. + _turbine_types = [ + copy.deepcopy(t["turbine_type"]) if isinstance(t, dict) else t + for t in self.turbine_type + ] + + # If 1 turbine definition is given, expand to N turbines; this covers a 1-turbine + # farm and 1 definition for multiple turbines + if len(_turbine_types) == 1: + _turbine_types *= self.n_turbines + + # Map each turbine definition to its index in this list + self.turbine_definitions = [ + copy.deepcopy(turbine_definition_cache[t]) for t in _turbine_types + ] @layout_x.validator def check_x(self, attribute: attrs.Attribute, value: Any) -> None: @@ -84,82 +172,21 @@ def check_y(self, attribute: attrs.Attribute, value: Any) -> None: if len(value) != len(self.layout_x): raise ValueError("layout_x and layout_y must have the same number of entries.") + @turbine_type.validator + def check_turbine_type(self, attribute: attrs.Attribute, value: Any) -> None: + # Check that the list of turbines is either of length 1 or N turbines + if len(value) != 1 and len(value) != self.n_turbines: + raise ValueError( + "turbine_type must have the same number of entries as layout_x/layout_y or have " + "a single turbine_type value." + ) + @turbine_library_path.validator def check_library_path(self, attribute: attrs.Attribute, value: Path) -> None: """Ensures that the input to `library_path` exists and is a directory.""" if not value.is_dir(): raise FileExistsError(f"The input file path: {str(value)} is not a valid directory.") - def check_turbine_type(self) -> None: - if len(self.turbine_type) != len(self.layout_x): - if len(self.turbine_type) == 1: - self.turbine_type *= len(self.layout_x) - elif np.unique(self.turbine_type).size == 1: - self.turbine_type = [self.turbine_type[0]] * len(self.layout_x) - else: - raise ValueError( - "turbine_type must have the same number of entries as layout_x/layout_y or have" - " a single turbine_type value." - ) - - # If the user specified the default location, do not check against duplicated definitions - turbine_map = {} - unique_turbines = [ - yaml.safe_load(el_j) - for el_j in {yaml.dump(el_i, default_flow_style=False) - for el_i in self.turbine_type} - ] - for turbine in unique_turbines: - - # If the passed data are already turbine dictionaries, skip the file loading - if isinstance(turbine, str): - # Check if the file exists in the internal and/or external libary - internal_fn = (default_turbine_library_path / turbine).with_suffix(".yaml") - external_fn = (self.turbine_library_path / turbine).with_suffix(".yaml") - in_internal = internal_fn.exists() - in_external = external_fn.exists() - - # If an external library is used, and the file is a duplicate with what already - # exists, then raise an error - is_separate_path = self.turbine_library_path != default_turbine_library_path - if is_separate_path and in_external and in_internal: - raise ValueError( - f"The turbine type: {turbine} exists in both the internal and external" - " turbine library." - ) - if in_internal: - full_path = internal_fn - elif in_external: - full_path = external_fn - else: - raise ValueError( - f"The turbine type: {turbine} exists in both the internal and external" - " turbine library." - ) - turbine_map[turbine] = turbine = load_yaml(full_path) - elif isinstance(turbine, dict): - turbine_map[turbine["turbine_type"]] = turbine - full_path = turbine["turbine_type"] - - # Log a warning if the reference air density doesn't exist - if "ref_density_cp_ct" not in turbine: - self.logger.warning( - f"The value ref_density_cp_ct is not defined in the file {full_path}." - "This value is not the simulated air density but is the density " - "at which the cp/ct curves are defined. In previous versions, this " - "was assumed to be 1.225. Future versions of FLORIS will give an error " - "if this value is not explicitly defined. Currently, this value is " - "being set to the prior default value of 1.225." - ) - turbine['ref_density_cp_ct'] = 1.225 - turbine_map[turbine["turbine_type"]] = turbine - - self.turbine_definitions = [ - copy.deepcopy(turbine_map[el]) if isinstance(el, str) - else copy.deepcopy(turbine_map[el["turbine_type"]]) - for el in self.turbine_type - ] - def initialize(self, sorted_indices): # Sort yaw angles from most upstream to most downstream wind turbine self.yaw_angles_sorted = np.take_along_axis( @@ -167,6 +194,11 @@ def initialize(self, sorted_indices): sorted_indices[:, :, :, 0, 0], axis=2, ) + self.tilt_angles_sorted = np.take_along_axis( + self.tilt_angles, + sorted_indices[:, :, :, 0, 0], + axis=2, + ) self.state = State.INITIALIZED def construct_hub_heights(self): @@ -180,27 +212,42 @@ def construct_rotor_diameters(self): def construct_turbine_TSRs(self): self.TSRs = np.array([turb['TSR'] for turb in self.turbine_definitions]) - def construc_turbine_pPs(self): + def construct_turbine_pPs(self): self.pPs = np.array([turb['pP'] for turb in self.turbine_definitions]) - def construc_turbine_ref_density_cp_cts(self): + def construct_turbine_pTs(self): + self.pTs = np.array([turb['pT'] for turb in self.turbine_definitions]) + + def construct_turbine_ref_density_cp_cts(self): self.ref_density_cp_cts = np.array([ turb['ref_density_cp_ct'] for turb in self.turbine_definitions ]) + def construct_turbine_ref_tilt_cp_cts(self): + self.ref_tilt_cp_cts = np.array( + [turb['ref_tilt_cp_ct'] for turb in self.turbine_definitions] + ) + + def construct_turbine_correct_cp_ct_for_tilt(self): + self.correct_cp_ct_for_tilt = np.array( + [turb.correct_cp_ct_for_tilt for turb in self.turbine_map] + ) + def construct_turbine_map(self): self.turbine_map = [Turbine.from_dict(turb) for turb in self.turbine_definitions] def construct_turbine_fCts(self): - self.turbine_fCts = [(turb.turbine_type, turb.fCt_interp) for turb in self.turbine_map] + self.turbine_fCts = { + turb.turbine_type: turb.fCt_interp for turb in self.turbine_map + } - def construct_turbine_fCps(self): - self.turbine_fCps = [(turb.turbine_type, turb.fCp_interp) for turb in self.turbine_map] + def construct_turbine_fTilts(self): + self.turbine_fTilts = [(turb.turbine_type, turb.fTilt_interp) for turb in self.turbine_map] def construct_turbine_power_interps(self): - self.turbine_power_interps = [ - (turb.turbine_type, turb.power_interp) for turb in self.turbine_map - ] + self.turbine_power_interps = { + turb.turbine_type: turb.power_interp for turb in self.turbine_map + } def construct_coordinates(self): self.coordinates = np.array([ @@ -229,11 +276,36 @@ def expand_farm_properties( sorted_coord_indices, axis=2 ) + self.ref_density_cp_cts_sorted = np.take_along_axis( + self.ref_density_cp_cts * template_shape, + sorted_coord_indices, + axis=2 + ) + self.ref_tilt_cp_cts_sorted = np.take_along_axis( + self.ref_tilt_cp_cts * template_shape, + sorted_coord_indices, + axis=2 + ) + self.correct_cp_ct_for_tilt_sorted = np.take_along_axis( + self.correct_cp_ct_for_tilt * template_shape, + sorted_coord_indices, + axis=2 + ) self.pPs_sorted = np.take_along_axis( self.pPs * template_shape, sorted_coord_indices, axis=2 ) + self.pTs_sorted = np.take_along_axis( + self.pTs * template_shape, + sorted_coord_indices, + axis=2 + ) + self.tilt_angles_sorted = np.take_along_axis( + self.tilt_angles * template_shape, + sorted_coord_indices, + axis=2 + ) self.turbine_type_names_sorted = [turb["turbine_type"] for turb in self.turbine_definitions] self.turbine_type_map_sorted = np.take_along_axis( np.reshape( @@ -249,12 +321,36 @@ def set_yaw_angles(self, n_wind_directions: int, n_wind_speeds: int): self.yaw_angles = np.zeros((n_wind_directions, n_wind_speeds, self.n_turbines)) self.yaw_angles_sorted = np.zeros((n_wind_directions, n_wind_speeds, self.n_turbines)) + def set_tilt_to_ref_tilt(self, n_wind_directions: int, n_wind_speeds: int): + self.tilt_angles = ( + np.ones((n_wind_directions, n_wind_speeds, self.n_turbines)) + * self.ref_tilt_cp_cts + ) + self.tilt_angles_sorted = ( + np.ones((n_wind_directions, n_wind_speeds, self.n_turbines)) + * self.ref_tilt_cp_cts + ) + + def calculate_tilt_for_eff_velocities(self, rotor_effective_velocities): + tilt_angles = compute_tilt_angles_for_floating_turbines( + self.turbine_type_map_sorted, + self.tilt_angles_sorted, + self.turbine_fTilts, + rotor_effective_velocities, + ) + return tilt_angles + def finalize(self, unsorted_indices): self.yaw_angles = np.take_along_axis( self.yaw_angles_sorted, unsorted_indices[:,:,:,0,0], axis=2 ) + self.tilt_angles = np.take_along_axis( + self.tilt_angles_sorted, + unsorted_indices[:,:,:,0,0], + axis=2 + ) self.hub_heights = np.take_along_axis( self.hub_heights_sorted, unsorted_indices[:,:,:,0,0], @@ -275,6 +371,11 @@ def finalize(self, unsorted_indices): unsorted_indices[:,:,:,0,0], axis=2 ) + self.pTs = np.take_along_axis( + self.pTs_sorted, + unsorted_indices[:,:,:,0,0], + axis=2 + ) self.turbine_type_map = np.take_along_axis( self.turbine_type_map_sorted, unsorted_indices[:,:,:,0,0], diff --git a/floris/simulation/floris.py b/floris/simulation/floris.py index 7dd7635aa..8ca8854e7 100644 --- a/floris/simulation/floris.py +++ b/floris/simulation/floris.py @@ -14,26 +14,29 @@ from __future__ import annotations -import json from pathlib import Path import yaml from attrs import define, field -import floris.logging_manager as logging_manager +from floris import logging_manager from floris.simulation import ( BaseClass, cc_solver, + empirical_gauss_solver, Farm, FlowField, FlowFieldGrid, FlowFieldPlanarGrid, full_flow_cc_solver, + full_flow_empirical_gauss_solver, full_flow_sequential_solver, full_flow_turbopark_solver, Grid, + PointsGrid, sequential_solver, State, + TurbineCubatureGrid, TurbineGrid, turbopark_solver, WakeModelManager, @@ -65,18 +68,27 @@ class Floris(BaseClass): def __attrs_post_init__(self) -> None: + self.check_deprecated_inputs() + # Initialize farm quanitities that depend on other objects self.farm.construct_turbine_map() self.farm.construct_turbine_fCts() - self.farm.construct_turbine_fCps() self.farm.construct_turbine_power_interps() self.farm.construct_hub_heights() self.farm.construct_rotor_diameters() self.farm.construct_turbine_TSRs() - self.farm.construc_turbine_pPs() - self.farm.construc_turbine_ref_density_cp_cts() + self.farm.construct_turbine_pPs() + self.farm.construct_turbine_pTs() + self.farm.construct_turbine_ref_density_cp_cts() + self.farm.construct_turbine_ref_tilt_cp_cts() + self.farm.construct_turbine_fTilts() + self.farm.construct_turbine_correct_cp_ct_for_tilt() self.farm.construct_coordinates() self.farm.set_yaw_angles(self.flow_field.n_wind_directions, self.flow_field.n_wind_speeds) + self.farm.set_tilt_to_ref_tilt( + self.flow_field.n_wind_directions, + self.flow_field.n_wind_speeds, + ) if self.solver["type"] == "turbine_grid": self.grid = TurbineGrid( @@ -87,6 +99,15 @@ def __attrs_post_init__(self) -> None: grid_resolution=self.solver["turbine_grid_points"], time_series=self.flow_field.time_series, ) + elif self.solver["type"] == "turbine_cubature_grid": + self.grid = TurbineCubatureGrid( + turbine_coordinates=self.farm.coordinates, + reference_turbine_diameter=self.farm.rotor_diameters, + wind_directions=self.flow_field.wind_directions, + wind_speeds=self.flow_field.wind_speeds, + time_series=self.flow_field.time_series, + grid_resolution=self.solver["turbine_grid_points"], + ) elif self.solver["type"] == "flow_field_grid": self.grid = FlowFieldGrid( turbine_coordinates=self.farm.coordinates, @@ -105,17 +126,18 @@ def __attrs_post_init__(self) -> None: normal_vector=self.solver["normal_vector"], planar_coordinate=self.solver["planar_coordinate"], grid_resolution=self.solver["flow_field_grid_points"], + time_series=self.flow_field.time_series, x1_bounds=self.solver["flow_field_bounds"][0], x2_bounds=self.solver["flow_field_bounds"][1], - time_series=self.flow_field.time_series, ) else: raise ValueError( - f"Supported solver types are [turbine_grid, flow_field_grid]," - f" but type given was {self.solver['type']}" + "Supported solver types are " + "[turbine_grid, turbine_cubature_grid, flow_field_grid, flow_field_planar_grid], " + f"but type given was {self.solver['type']}" ) - if type(self.grid) == TurbineGrid: + if isinstance(self.grid, (TurbineGrid, TurbineCubatureGrid)): self.farm.expand_farm_properties( self.flow_field.n_wind_directions, self.flow_field.n_wind_speeds, @@ -132,6 +154,43 @@ def __attrs_post_init__(self) -> None: self.logging["file"]["level"], ) + def check_deprecated_inputs(self): + """ + This function should used when the FLORIS input file changes in order to provide + an informative error and suggest a fix. + """ + + error_messages = [] + # Check for missing values add in version 3.2 and 3.4 + for turbine in self.farm.turbine_definitions: + + if "ref_density_cp_ct" not in turbine.keys(): + error_messages.append( + "From FLORIS v3.2, the turbine definition must include 'ref_density_cp_ct'. " + "This value represents the air density at which the provided Cp and Ct " + "curves are defined. Previously, this was assumed to be 1.225 kg/m^3, " + "and other air density values applied were assumed to be a deviation " + "from the defined level. FLORIS now requires the user to explicitly " + "define the reference density. Add 'ref_density_cp_ct' to your " + "turbine definition and try again. For a description of the turbine inputs, " + "see https://nrel.github.io/floris/input_reference_turbine.html." + ) + + if "ref_tilt_cp_ct" not in turbine.keys(): + error_messages.append( + "From FLORIS v3.4, the turbine definition must include 'ref_tilt_cp_ct'. " + "This value represents the tilt angle at which the provided Cp and Ct " + "curves are defined. Add 'ref_tilt_cp_ct' to your turbine definition and " + "try again. For a description of the turbine inputs, " + "see https://nrel.github.io/floris/input_reference_turbine.html." + ) + + if len(error_messages) > 0: + raise ValueError( + f"{turbine['turbine_type']} turbine model\n" + + "\n\n".join(error_messages) + ) + # @profile def initialize_domain(self): """Initialize solution space prior to wake calculations""" @@ -155,22 +214,37 @@ def steady_state_atmospheric_condition(self): # <> # start = time.time() + if vel_model in ["gauss", "cc", "turbopark", "jensen"] and \ + self.farm.correct_cp_ct_for_tilt.any(): + self.logger.warn( + "The current model does not account for vertical wake deflection due to " + + "tilt. Corrections to Cp and Ct can be included, but no vertical wake " + + "deflection will occur." + ) + if vel_model=="cc": - elapsed_time = cc_solver( + cc_solver( self.farm, self.flow_field, self.grid, self.wake ) elif vel_model=="turbopark": - elapsed_time = turbopark_solver( + turbopark_solver( + self.farm, + self.flow_field, + self.grid, + self.wake + ) + elif vel_model=="empirical_gauss": + empirical_gauss_solver( self.farm, self.flow_field, self.grid, self.wake ) else: - elapsed_time = sequential_solver( + sequential_solver( self.farm, self.flow_field, self.grid, @@ -180,7 +254,7 @@ def steady_state_atmospheric_condition(self): # elapsed_time = end - start self.finalize() - return elapsed_time + # return elapsed_time def solve_for_viz(self): # Do the calculation with the TurbineGrid for a single wind speed @@ -197,9 +271,49 @@ def solve_for_viz(self): full_flow_cc_solver(self.farm, self.flow_field, self.grid, self.wake) elif vel_model=="turbopark": full_flow_turbopark_solver(self.farm, self.flow_field, self.grid, self.wake) + elif vel_model=="empirical_gauss": + full_flow_empirical_gauss_solver(self.farm, self.flow_field, self.grid, self.wake) else: full_flow_sequential_solver(self.farm, self.flow_field, self.grid, self.wake) + def solve_for_points(self, x, y, z): + # Do the calculation with the TurbineGrid for a single wind speed + # and wind direction and a 3x3 rotor grid. Then, use the result + # to construct the full flow field grid. + # This function call should be for a single wind direction and wind speed + # since the memory consumption is very large. + + # Instantiate the flow_grid + field_grid = PointsGrid( + points_x=x, + points_y=y, + points_z=z, + turbine_coordinates=self.farm.coordinates, + reference_turbine_diameter=self.farm.rotor_diameters, + wind_directions=self.flow_field.wind_directions, + wind_speeds=self.flow_field.wind_speeds, + grid_resolution=1, + time_series=self.flow_field.time_series, + x_center_of_rotation=self.grid.x_center_of_rotation, + y_center_of_rotation=self.grid.y_center_of_rotation + ) + + self.flow_field.initialize_velocity_field(field_grid) + + vel_model = self.wake.model_strings["velocity_model"] + + if vel_model == "cc" or vel_model == "turbopark": + raise NotImplementedError( + "solve_for_points is currently only available with the "+\ + "gauss, jensen, and empirical_guass models." + ) + elif vel_model == "empirical_gauss": + full_flow_empirical_gauss_solver(self.farm, self.flow_field, field_grid, self.wake) + else: + full_flow_sequential_solver(self.farm, self.flow_field, field_grid, self.wake) + + return self.flow_field.u_sorted[:,:,:,0,0] # Remove turbine grid dimensions + def finalize(self): # Once the wake calculation is finished, unsort the values to match # the user-supplied order of things. @@ -210,48 +324,29 @@ def finalize(self): ## I/O @classmethod - def from_file(cls, input_file_path: str | Path, filetype: str = None) -> Floris: - """Creates a `Floris` instance from an input file. Must be filetype - JSON or YAML. + def from_file(cls, input_file_path: str | Path) -> Floris: + """Creates a `Floris` instance from an input file. Must be filetype YAML. Args: input_file_path (str): The relative or absolute file path and name to the input file. - filetype (str): The type to export: [YAML | JSON] Returns: Floris: The class object instance. """ - input_file_path = Path(input_file_path).resolve() - if filetype is None: - filetype = input_file_path.suffix.strip(".") - - with open(input_file_path) as input_file: - if filetype.lower() in ("yml", "yaml"): - input_dict = load_yaml(input_file_path) - elif filetype.lower() == "json": - input_dict = json.load(input_file) - - # TODO: This is a temporary hack to put the turbine definition into the farm. - # Long term, we need a strategy for handling this. The YAML file format supports - # pointers to other data, for example. - # input_dict["farm"]["turbine"] = input_dict["turbine"] - # input_dict.pop("turbine") - else: - raise ValueError("Supported import filetypes are JSON and YAML") + input_dict = load_yaml(Path(input_file_path).resolve()) return Floris.from_dict(input_dict) - def to_file(self, output_file_path: str, filetype: str="YAML") -> None: - """Converts the `Floris` object to an input-ready JSON or YAML file at `output_file_path`. + def to_file(self, output_file_path: str) -> None: + """Converts the `Floris` object to an input-ready YAML file at `output_file_path`. Args: output_file_path (str): The full path and filename for where to save the file. - filetype (str): The type to export: [YAML | JSON] """ with open(output_file_path, "w+") as f: - if filetype.lower() == "yaml": - yaml.dump(self.as_dict(), f, default_flow_style=False) - elif filetype.lower() == "json": - json.dump(self.as_dict(), f, indent=2, sort_keys=False) - else: - raise ValueError("Supported export filetypes are JSON and YAML") + yaml.dump( + self.as_dict(), + f, + sort_keys=False, + default_flow_style=False + ) diff --git a/floris/simulation/flow_field.py b/floris/simulation/flow_field.py index aae7e028d..a8dbf7393 100644 --- a/floris/simulation/flow_field.py +++ b/floris/simulation/flow_field.py @@ -15,19 +15,25 @@ from __future__ import annotations import attrs +import matplotlib.path as mpltPath import numpy as np from attrs import define, field +from scipy.interpolate import LinearNDInterpolator +from scipy.spatial import ConvexHull +from shapely.geometry import Polygon -from floris.simulation import Grid +from floris.simulation import ( + BaseClass, + Grid, +) from floris.type_dec import ( floris_array_converter, - FromDictMixin, NDArrayFloat, ) @define -class FlowField(FromDictMixin): +class FlowField(BaseClass): wind_speeds: NDArrayFloat = field(converter=floris_array_converter) wind_directions: NDArrayFloat = field(converter=floris_array_converter) wind_veer: float = field(converter=float) @@ -36,6 +42,7 @@ class FlowField(FromDictMixin): turbulence_intensity: float = field(converter=float) reference_wind_height: float = field(converter=float) time_series : bool = field(default=False) + heterogenous_inflow_config: dict = field(default=None) n_wind_speeds: int = field(init=False) n_wind_directions: int = field(init=False) @@ -69,6 +76,44 @@ def wind_directions_validator(self, instance: attrs.Attribute, value: NDArrayFlo """Using the validator method to keep the `n_wind_directions` attribute up to date.""" self.n_wind_directions = value.size + @heterogenous_inflow_config.validator + def heterogenous_config_validator(self, instance: attrs.Attribute, value: dict | None) -> None: + """Using the validator method to check that the heterogenous_inflow_config dictionary has + the correct key-value pairs. + """ + if value is None: + return + + # Check that the correct keys are supplied for the heterogenous_inflow_config dict + for k in ["speed_multipliers", "x", "y"]: + if k not in value.keys(): + raise ValueError( + "heterogenous_inflow_config must contain entries for 'speed_multipliers'," + f"'x', and 'y', with 'z' optional. Missing '{k}'." + ) + if "z" not in value: + # If only a 2D case, add "None" for the z locations + value["z"] = None + + @het_map.validator + def het_map_validator(self, instance: attrs.Attribute, value: list | None) -> None: + """Using this validator to make sure that the het_map has an interpolant defined for + each wind direction. + """ + if value is None: + return + + if self.n_wind_directions!= np.array(value).shape[0]: + raise ValueError( + "The het_map's wind direction dimension not equal to number of wind directions." + ) + + + def __attrs_post_init__(self) -> None: + if self.heterogenous_inflow_config is not None: + self.generate_heterogeneous_wind_map() + + def initialize_velocity_field(self, grid: Grid) -> None: # Create an initial wind profile as a function of height. The values here will @@ -95,17 +140,40 @@ def initialize_velocity_field(self, grid: Grid) -> None: # If heterogeneous flow data is given, the speed ups at the defined # grid locations are determined in either 2 or 3 dimensions. else: - if len(self.het_map[0][0].points[0]) == 2: + bounds = np.array(list(zip( + self.heterogenous_inflow_config['x'], + self.heterogenous_inflow_config['y'] + ))) + hull = ConvexHull(bounds) + polygon = Polygon(bounds[hull.vertices]) + path = mpltPath.Path(polygon.boundary.coords) + points = np.column_stack( + ( + grid.x_sorted_inertial_frame.flatten(), + grid.y_sorted_inertial_frame.flatten(), + ) + ) + inside = path.contains_points(points) + if not np.all(inside): + self.logger.warning( + "The calculated flow field contains points outside of the the user-defined " + "heterogeneous inflow bounds. For these points, the interpolated value has " + "been filled with the freestream wind speed. If this is not the desired " + "behavior, the user will need to expand the heterogeneous inflow bounds to " + "fully cover the calculated flow field area." + ) + + if len(self.het_map[0].points[0]) == 2: speed_ups = self.calculate_speed_ups( self.het_map, - grid.x_sorted, - grid.y_sorted + grid.x_sorted_inertial_frame, + grid.y_sorted_inertial_frame ) - elif len(self.het_map[0][0].points[0]) == 3: + elif len(self.het_map[0].points[0]) == 3: speed_ups = self.calculate_speed_ups( self.het_map, - grid.x_sorted, - grid.y_sorted, + grid.x_sorted_inertial_frame, + grid.y_sorted_inertial_frame, grid.z_sorted ) @@ -172,61 +240,61 @@ def finalize(self, unsorted_indices): ) def calculate_speed_ups(self, het_map, x, y, z=None): - - # Check that the het maps wd dimension matches - if self.n_wind_directions!= np.array(het_map).shape[1]: - raise ValueError( - "het_map's wind direction dimension not equal to number of wind directions" - ) - if z is not None: - # Calculate the 3-dimensional speed ups; reshape is needed as the generator + # Calculate the 3-dimensional speed ups; squeeze is needed as the generator # adds an extra dimension - speed_ups = np.reshape( - [ - het_map[0][i](x[i:i+1,:,:,:,:], y[i:i+1,:,:,:,:], z[i:i+1,:,:,:,:]) - for i in range(len(het_map[0])) - ], - np.shape(x) + speed_ups = np.squeeze( + [het_map[i](x[i:i+1], y[i:i+1], z[i:i+1]) for i in range( len(het_map))], + axis=1, ) - # If there are any points requested outside the user-defined area, use the - # nearest-neighbor interplonat to determine those speed up values - if np.isnan(speed_ups).any(): - idx_nan = np.where(np.isnan(speed_ups)) - speed_ups_out_of_region = np.reshape( - [ - het_map[1][i](x[i:i+1,:,:,:,:], y[i:i+1,:,:,:,:], z[i:i+1,:,:,:,:]) - for i in range(len(het_map[1])) - ], - np.shape(x) - ) - - speed_ups[idx_nan] = speed_ups_out_of_region[idx_nan] - else: - # Calculate the 2-dimensional speed ups; reshape is needed as the generator + # Calculate the 2-dimensional speed ups; squeeze is needed as the generator # adds an extra dimension - speed_ups = np.reshape( - [ - het_map[0][i](x[i:i+1,:,:,:,:], y[i:i+1,:,:,:,:]) - for i in range(len(het_map[0])) - ], - np.shape(x) + speed_ups = np.squeeze( + [het_map[i](x[i:i+1], y[i:i+1]) for i in range(len(het_map))], + axis=1, ) - # If there are any points requested outside the user-defined area, use the - # nearest-neighbor interplonat to determine those speed up values - if np.isnan(speed_ups).any(): - idx_nan = np.where(np.isnan(speed_ups)) - speed_ups_out_of_region = np.reshape( - [ - het_map[1][i](x[i:i+1,:,:,:,:], y[i:i+1,:,:,:,:]) - for i in range(len(het_map[1])) - ], - np.shape(x) - ) + return speed_ups - speed_ups[idx_nan] = speed_ups_out_of_region[idx_nan] + def generate_heterogeneous_wind_map(self): + """This function creates the heterogeneous interpolant used to calculate heterogeneous + inflows. The interpolant is for computing wind speed based on an x and y location in the + flow field. This is computed using SciPy's LinearNDInterpolator and uses a fill value + equal to the freestream for interpolated values outside of the user-defined heterogeneous + map bounds. - return speed_ups + Args: + heterogenous_inflow_config (dict): The heterogeneous inflow configuration dictionary. + The configuration should have the following inputs specified. + - **speed_multipliers** (list): A list of speed up factors that will multiply + the specified freestream wind speed. This 2-dimensional array should have an + array of multiplicative factors defined for each wind direction. + - **x** (list): A list of x locations at which the speed up factors are defined. + - **y**: A list of y locations at which the speed up factors are defined. + - **z** (optional): A list of z locations at which the speed up factors are defined. + """ + speed_multipliers = self.heterogenous_inflow_config['speed_multipliers'] + x = self.heterogenous_inflow_config['x'] + y = self.heterogenous_inflow_config['y'] + z = self.heterogenous_inflow_config['z'] + + if z is not None: + # Compute the 3-dimensional interpolants for each wind direction + # Linear interpolation is used for points within the user-defined area of values, + # while the freestream wind speed is used for points outside that region + in_region = [ + LinearNDInterpolator(list(zip(x, y, z)), multiplier, fill_value=1.0) + for multiplier in speed_multipliers + ] + else: + # Compute the 2-dimensional interpolants for each wind direction + # Linear interpolation is used for points within the user-defined area of values, + # while the freestream wind speed is used for points outside that region + in_region = [ + LinearNDInterpolator(list(zip(x, y)), multiplier, fill_value=1.0) + for multiplier in speed_multipliers + ] + + self.het_map = in_region diff --git a/floris/simulation/grid.py b/floris/simulation/grid.py index 9f8fdc3ed..8e2325252 100644 --- a/floris/simulation/grid.py +++ b/floris/simulation/grid.py @@ -28,7 +28,11 @@ NDArrayFloat, NDArrayInt, ) -from floris.utilities import rotate_coordinates_rel_west, Vec3 +from floris.utilities import ( + reverse_rotate_coordinates_rel_west, + rotate_coordinates_rel_west, + Vec3, +) @define @@ -53,14 +57,14 @@ class Grid(ABC): all of these arrays are the same size Args: - turbine_coordinates (`list[Vec3]`): The collection of turbine coordinate (`Vec3`) objects. - reference_turbine_diameter (:py:obj:`float`): The reference turbine's rotor diameter. - grid_resolution (:py:obj:`int` | :py:obj:`Iterable(int,)`): Grid resolution specific - to each grid type. + turbine_coordinates (`list[Vec3]`): The series of turbine coordinate (`Vec3`) objects. + reference_turbine_diameter (:py:obj:`float`): A reference turbine's rotor diameter. + grid_resolution (:py:obj:`int` | :py:obj:`Iterable(int,)`): Grid resolution with values + specific to each grid type. wind_directions (:py:obj:`NDArrayFloat`): Wind directions supplied by the user. wind_speeds (:py:obj:`NDArrayFloat`): Wind speeds supplied by the user. - time_series (:py:obj:`bool`): True/false flag to indicate whether the supplied wind - data is a time series. + time_series (:py:obj:`bool`): Flag to indicate whether the supplied wind data is a time + series. """ turbine_coordinates: list[Vec3] = field() reference_turbine_diameter: float @@ -73,12 +77,13 @@ class Grid(ABC): n_wind_speeds: int = field(init=False) n_wind_directions: int = field(init=False) turbine_coordinates_array: NDArrayFloat = field(init=False) - x: NDArrayFloat = field(init=False, default=[]) - y: NDArrayFloat = field(init=False, default=[]) - z: NDArrayFloat = field(init=False, default=[]) x_sorted: NDArrayFloat = field(init=False) y_sorted: NDArrayFloat = field(init=False) z_sorted: NDArrayFloat = field(init=False) + x_sorted_inertial_frame: NDArrayFloat = field(init=False) + y_sorted_inertial_frame: NDArrayFloat = field(init=False) + z_sorted_inertial_frame: NDArrayFloat = field(init=False) + cubature_weights: NDArrayFloat = field(init=False, default=None) def __attrs_post_init__(self) -> None: self.turbine_coordinates_array = np.array([c.elements for c in self.turbine_coordinates]) @@ -112,12 +117,13 @@ def wind_directions_validator(self, instance: attrs.Attribute, value: NDArrayFlo def grid_resolution_validator(self, instance: attrs.Attribute, value: int | Iterable) -> None: # TODO move this to the grid types and off of the base class """Check that grid resolution is given as int or Vec3 with int components.""" - if isinstance(value, int) and type(self) is TurbineGrid: + if isinstance(value, int) and \ + isinstance(self, (TurbineGrid, TurbineCubatureGrid, PointsGrid)): return - elif isinstance(value, Iterable) and type(self) is FlowFieldPlanarGrid: + elif isinstance(value, Iterable) and isinstance(self, FlowFieldPlanarGrid): assert type(value[0]) is int assert type(value[1]) is int - elif isinstance(value, Iterable) and type(self) is FlowFieldGrid: + elif isinstance(value, Iterable) and isinstance(self, FlowFieldGrid): assert type(value[0]) is int assert type(value[1]) is int assert type(value[2]) is int @@ -133,16 +139,23 @@ class TurbineGrid(Grid): """See `Grid` for more details. Args: - turbine_coordinates (`list[Vec3]`): The collection of turbine coordinate (`Vec3`) objects. - reference_turbine_diameter (:py:obj:`float`): The reference turbine's rotor diameter. - wind_directions (`list[float]`): The input wind directions - wind_speeds (`list[float]`): The input wind speeds - grid_resolution (:py:obj:`int`): The number of points on each turbine + turbine_coordinates (`list[Vec3]`): The series of turbine coordinate (`Vec3`) objects. + reference_turbine_diameter (:py:obj:`float`): A reference turbine's rotor diameter. + grid_resolution (:py:obj:`int` | :py:obj:`Iterable(int,)`): The number of points in each + direction of the square grid on the rotor plane. For example, grid_resolution=3 + creates a 3x3 grid within the rotor swept area. + wind_directions (:py:obj:`NDArrayFloat`): Wind directions supplied by the user. + wind_speeds (:py:obj:`NDArrayFloat`): Wind speeds supplied by the user. + time_series (:py:obj:`bool`): Flag to indicate whether the supplied wind data is a time + series. """ # TODO: describe these and the differences between `sorted_indices` and `sorted_coord_indices` sorted_indices: NDArrayInt = field(init=False) sorted_coord_indices: NDArrayInt = field(init=False) unsorted_indices: NDArrayInt = field(init=False) + x_center_of_rotation: NDArrayFloat = field(init=False) + y_center_of_rotation: NDArrayFloat = field(init=False) + average_method = "cubic-mean" def __attrs_post_init__(self) -> None: super().__attrs_post_init__() @@ -202,7 +215,10 @@ def set_grid(self) -> None: # the foot of the turbine where the tower meets the ground. # These are the rotated coordinates of the wind turbines based on the wind direction - x, y, z = rotate_coordinates_rel_west(self.wind_directions, self.turbine_coordinates_array) + x, y, z, self.x_center_of_rotation, self.y_center_of_rotation = rotate_coordinates_rel_west( + self.wind_directions, + self.turbine_coordinates_array, + ) # - **rloc** (*float, optional): A value, from 0 to 1, that determines # the width/height of the grid of points on the rotor as a ratio of @@ -256,7 +272,108 @@ def set_grid(self) -> None: self.sorted_coord_indices = x.argsort(axis=2) self.unsorted_indices = self.sorted_indices.argsort(axis=2) - # Put the turbines into the final arrays in their sorted order + # Put the turbine coordinates into the final arrays in their sorted order + # These are the coordinates that should be used within the internal calculations + # such as the wake models and the solvers. + self.x_sorted = np.take_along_axis(_x, self.sorted_indices, axis=2) + self.y_sorted = np.take_along_axis(_y, self.sorted_indices, axis=2) + self.z_sorted = np.take_along_axis(_z, self.sorted_indices, axis=2) + + # Now calculate grid coordinates in original frame (from 270 deg perspective) + self.x_sorted_inertial_frame, self.y_sorted_inertial_frame, self.z_sorted_inertial_frame = \ + reverse_rotate_coordinates_rel_west( + wind_directions=self.wind_directions, + grid_x=self.x_sorted, + grid_y=self.y_sorted, + grid_z=self.z_sorted, + x_center_of_rotation=self.x_center_of_rotation, + y_center_of_rotation=self.y_center_of_rotation, + ) + +@define +class TurbineCubatureGrid(Grid): + """ + This grid type arranges points throughout the swept area of the rotor based on the cubature + of a unit circle. The number of points is set by the user, and then the location of the + points and their weighting in integration is automatically set. This type of grid + enables a better approximation of the total incoming velocities on the rotor and therefore + a more accurate average velocity, thrust coefficient, and axial induction. + + Args: + turbine_coordinates (`list[Vec3]`): The list of turbine coordinates as `Vec3` objects. + reference_turbine_diameter (:py:obj:`float`): The reference turbine's rotor diameter. + wind_directions (:py:obj:`NDArrayFloat`): Wind directions supplied by the user. + wind_speeds (:py:obj:`NDArrayFloat`): Wind speeds supplied by the user. + grid_resolution (:py:obj:`int` | :py:obj:`Iterable(int,)`): The number of points to + include in the cubature method. This value must be in the range [1, 10], and the + corresponding cubature weights are set automatically. + time_series (:py:obj:`bool`): Flag to indicate whether the supplied wind data is a time + series. + """ + sorted_indices: NDArrayInt = field(init=False) + sorted_coord_indices: NDArrayInt = field(init=False) + unsorted_indices: NDArrayInt = field(init=False) + x_center_of_rotation: NDArrayFloat = field(init=False) + y_center_of_rotation: NDArrayFloat = field(init=False) + average_method = "simple-cubature" + + def __attrs_post_init__(self) -> None: + super().__attrs_post_init__() + self.set_grid() + + def set_grid(self) -> None: + """ + """ + # These are the rotated coordinates of the wind turbines based on the wind direction + x, y, z, self.x_center_of_rotation, self.y_center_of_rotation = rotate_coordinates_rel_west( + self.wind_directions, + self.turbine_coordinates_array + ) + + # Coefficients + cubature_coefficients = TurbineCubatureGrid.get_cubature_coefficients(self.grid_resolution) + + # Generate grid points + yv = np.kron(cubature_coefficients["r"], cubature_coefficients["q"]) + zv = np.kron(cubature_coefficients["r"], cubature_coefficients["t"]) + + # Calculate weighting terms for the grid points + self.cubature_weights = ( + np.kron(cubature_coefficients["A"], np.ones((1, self.grid_resolution))) + * cubature_coefficients["B"] / np.pi + ) + + # Here, the coordinates are already rotated to the correct orientation for each + # wind direction + template_grid = np.ones( + ( + self.n_wind_directions, + self.n_wind_speeds, + self.n_turbines, + len(yv), # Number of coordinates + 1, + ), + dtype=floris_float_type + ) + _x = x[:, :, :, None, None] * template_grid + _y = y[:, :, :, None, None] * template_grid + _z = z[:, :, :, None, None] * template_grid + for ti in range(self.n_turbines): + _y[:, :, ti, :, :] += yv[None, None, :, None]*self.reference_turbine_diameter[ti] / 2.0 + _z[:, :, ti, :, :] += zv[None, None, :, None]*self.reference_turbine_diameter[ti] / 2.0 + + # Sort the turbines at each wind direction + + # Get the sorted indices for the x coordinates. These are the indices + # to sort the turbines from upstream to downstream for all wind directions. + # Also, store the indices to sort them back for when the calculation finishes. + self.sorted_indices = _x.argsort(axis=2) + self.sorted_coord_indices = x.argsort(axis=2) + self.unsorted_indices = self.sorted_indices.argsort(axis=2) + + # Put the turbine coordinates into the final arrays in their sorted order + # These are the coordinates that should be used within the internal calculations + # such as the wake models and the solvers. self.x_sorted = np.take_along_axis(_x, self.sorted_indices, axis=2) self.y_sorted = np.take_along_axis(_y, self.sorted_indices, axis=2) self.z_sorted = np.take_along_axis(_z, self.sorted_indices, axis=2) @@ -265,6 +382,85 @@ def set_grid(self) -> None: self.y = np.take_along_axis(self.y_sorted, self.unsorted_indices, axis=2) self.z = np.take_along_axis(self.z_sorted, self.unsorted_indices, axis=2) + @classmethod + def get_cubature_coefficients(cls, N: int): + """ + Retrieve cubature integration coefficients. This is a class-method, and therefore + the coefficients can be accessed without creating an instance of the class. + + Args: + N (int): Order of the cubature integration. The total + number of rotor points will be N^2. Must be an integer in the range [1, 10]. + + Returns: + cubature_coefficients (dict): A dictionary containing the cubature + integration coefficients, "r", "t", "q", "A" and "B". + """ + + if N < 1 and N < 10: + raise ValueError( + f"Order of cubature integration must be between '1' and '10', given {N}." + ) + + elif N == 1: + r = [0.0000000000000000000000000] + t = [0.0000000000000000000000000] + q = [1.0000000000000000000000000] + A = [1.0000000000000000000000000] + elif N == 2: + r = [-0.7071067811865475244008444, 0.7071067811865475244008444] + t = [-0.7071067811865475244008444, 0.7071067811865475244008444] + q = [ 0.7071067811865475244008444, 0.7071067811865475244008444] + A = [ 0.5000000000000000000000000, 0.5000000000000000000000000] + elif N == 3: + r = [-0.8164965809277260327324280, 0.0000000000000000000000000, 0.8164965809277260327324280] # noqa: E501 + t = [-0.8660254037844386467637232, 0.0000000000000000000000000, 0.8660254037844386467637232] # noqa: E501 + q = [ 0.5000000000000000000000000, 1.0000000000000000000000000, 0.5000000000000000000000000] # noqa: E501 + A = [ 0.3750000000000000000000000, 0.2500000000000000000000000, 0.3750000000000000000000000] # noqa: E501 + elif N == 4: + r = [-0.8880738339771152621607646,-0.4597008433809830609776340, 0.4597008433809830609776340, 0.8880738339771152621607646] # noqa: E501 + t = [-0.9238795325112867561281832,-0.3826834323650897717284600, 0.3826834323650897717284600, 0.9238795325112867561281832] # noqa: E501 + q = [ 0.3826834323650897717284600, 0.9238795325112867561281832, 0.9238795325112867561281832, 0.3826834323650897717284600] # noqa: E501 + A = [ 0.2500000000000000000000000, 0.2500000000000000000000000, 0.2500000000000000000000000, 0.2500000000000000000000000] # noqa: E501 + elif N == 5: + r = [-0.9192110607898045793726291,-0.5958615826865180525340234, 0.0000000000000000000000000, 0.5958615826865180525340234, 0.9192110607898045793726291] # noqa: E501 + t = [-0.9510565162951535721164393,-0.5877852522924731291687060, 0.0000000000000000000000000, 0.5877852522924731291687060, 0.9510565162951535721164393] # noqa: E501 + q = [ 0.3090169943749474241022934, 0.8090169943749474241022934, 1.0000000000000000000000000, 0.8090169943749474241022934, 0.3090169943749474241022934] # noqa: E501 + A = [ 0.1882015313502336375250377, 0.2562429130942108069194067, 0.1111111111111111111111111, 0.2562429130942108069194067, 0.1882015313502336375250377] # noqa: E501 + elif N == 6: + r = [-0.9419651451198933233901941,-0.7071067811865475244008444,-0.3357106870197288066698994, 0.3357106870197288066698994, 0.7071067811865475244008444, 0.9419651451198933233901941] # noqa: E501 + t = [-0.9659258262890682867497432,-0.7071067811865475244008444,-0.2588190451025207623488988, 0.2588190451025207623488988, 0.7071067811865475244008444, 0.9659258262890682867497432] # noqa: E501 + q = [ 0.2588190451025207623488988, 0.7071067811865475244008444, 0.9659258262890682867497432, 0.9659258262890682867497432, 0.7071067811865475244008444, 0.2588190451025207623488988] # noqa: E501 + A = [ 0.1388888888888888888888889, 0.2222222222222222222222222, 0.1388888888888888888888889, 0.1388888888888888888888889, 0.2222222222222222222222222, 0.1388888888888888888888889] # noqa: E501 + elif N == 7: + r = [-0.9546790248493448767148503,-0.7684615381131740734708478,-0.4608042298407784190147371, 0.0000000000000000000000000, 0.4608042298407784190147371, 0.7684615381131740734708478, 0.9546790248493448767148503] # noqa: E501 + t = [-0.9749279121818236070181317,-0.7818314824680298087084445,-0.4338837391175581204757683, 0.0000000000000000000000000, 0.4338837391175581204757683, 0.7818314824680298087084445, 0.9749279121818236070181317] # noqa: E501 + q = [ 0.2225209339563144042889026, 0.6234898018587335305250049, 0.9009688679024191262361023, 1.0000000000000000000000000, 0.9009688679024191262361023, 0.6234898018587335305250049, 0.2225209339563144042889026] # noqa: E501 + A = [ 0.1102311055883841876377392, 0.1940967344215859403901162, 0.1644221599900298719721446, 0.0625000000000000000000000, 0.1644221599900298719721446, 0.1940967344215859403901162, 0.1102311055883841876377392] # noqa: E501 + elif N == 8: + r = [-0.9646596061808674528345806,-0.8185294874300058668603761,-0.5744645143153507855310459,-0.2634992299855422962484895, 0.2634992299855422962484895, 0.5744645143153507855310459, 0.8185294874300058668603761, 0.9646596061808674528345806] # noqa: E501 + t = [-0.9807852804032304491261822,-0.8314696123025452370787884,-0.5555702330196022247428308,-0.1950903220161282678482849, 0.1950903220161282678482849, 0.5555702330196022247428308, 0.8314696123025452370787884, 0.9807852804032304491261822] # noqa: E501 + q = [ 0.1950903220161282678482849, 0.5555702330196022247428308, 0.8314696123025452370787884, 0.9807852804032304491261822, 0.9807852804032304491261822, 0.8314696123025452370787884, 0.5555702330196022247428308, 0.1950903220161282678482849] # noqa: E501 + A = [ 0.0869637112843634643432660, 0.1630362887156365356567340, 0.1630362887156365356567340, 0.0869637112843634643432660, 0.0869637112843634643432660, 0.1630362887156365356567340, 0.1630362887156365356567340, 0.0869637112843634643432660] # noqa: E501 + elif N == 9: + r = [-0.9710282199223060261836893,-0.8503863747508400503582112,-0.6452980455813291706201889,-0.3738447061866471744516959, 0.0000000000000000000000000, 0.3738447061866471744516959, 0.6452980455813291706201889, 0.8503863747508400503582112, 0.9710282199223060261836893] # noqa: E501 + t = [-0.9848077530122080593667430,-0.8660254037844386467637232,-0.6427876096865393263226434,-0.3420201433256687330440996, 0.0000000000000000000000000, 0.3420201433256687330440996, 0.6427876096865393263226434, 0.8660254037844386467637232, 0.9848077530122080593667430] # noqa: E501 + q = [ 0.1736481776669303488517166, 0.5000000000000000000000000, 0.7660444431189780352023927, 0.9396926207859083840541093, 1.0000000000000000000000000, 0.9396926207859083840541093, 0.7660444431189780352023927, 0.5000000000000000000000000, 0.1736481776669303488517166] # noqa: E501 + A = [ 0.0718567803956129706617061, 0.1406780075747310300960863, 0.1559132614878706270409275, 0.1115519505417853722012801, 0.0400000000000000000000000, 0.1115519505417853722012801, 0.1559132614878706270409275, 0.1406780075747310300960863, 0.0718567803956129706617061] # noqa: E501 + elif N == 10: + r = [-0.9762632447087885713212574,-0.8770602345636481685478274,-0.7071067811865475244008444,-0.4803804169063914437972190,-0.2165873427295972057980989, 0.2165873427295972057980989, 0.4803804169063914437972190, 0.7071067811865475244008444, 0.8770602345636481685478274, 0.9762632447087885713212574] # noqa: E501 + t = [-0.9876883405951377261900402,-0.8910065241883678623597096,-0.7071067811865475244008444,-0.4539904997395467915604084,-0.1564344650402308690101053, 0.1564344650402308690101053, 0.4539904997395467915604084, 0.7071067811865475244008444, 0.8910065241883678623597096, 0.9876883405951377261900402] # noqa: E501 + q = [ 0.1564344650402308690101053, 0.4539904997395467915604084, 0.7071067811865475244008444, 0.8910065241883678623597096, 0.9876883405951377261900402, 0.9876883405951377261900402, 0.8910065241883678623597096, 0.7071067811865475244008444, 0.4539904997395467915604084, 0.1564344650402308690101053] # noqa: E501 + A = [ 0.0592317212640472718785660, 0.1196571676248416170103229, 0.1422222222222222222222222, 0.1196571676248416170103229, 0.0592317212640472718785660, 0.0592317212640472718785660, 0.1196571676248416170103229, 0.1422222222222222222222222, 0.1196571676248416170103229, 0.0592317212640472718785660] # noqa: E501 + + return { + "r": np.array(r, dtype=float), + "t": np.array(t, dtype=float), + "q": np.array(q, dtype=float), + "A": np.array(A, dtype=float), + "B": np.pi/N, + } + @define class FlowFieldGrid(Grid): """ @@ -274,6 +470,8 @@ class FlowFieldGrid(Grid): reference_turbine_diameter (:py:obj:`float`): The reference turbine's rotor diameter. grid_resolution (:py:obj:`int`): The number of points on each turbine """ + x_center_of_rotation: NDArrayFloat = field(init=False) + y_center_of_rotation: NDArrayFloat = field(init=False) def __attrs_post_init__(self) -> None: super().__attrs_post_init__() @@ -296,7 +494,10 @@ def set_grid(self) -> None: """ # These are the rotated coordinates of the wind turbines based on the wind direction - x, y, z = rotate_coordinates_rel_west(self.wind_directions, self.turbine_coordinates_array) + x, y, z, self.x_center_of_rotation, self.y_center_of_rotation = rotate_coordinates_rel_west( + self.wind_directions, + self.turbine_coordinates_array + ) # Construct the arrays storing the grid points eps = 0.01 @@ -318,6 +519,17 @@ def set_grid(self) -> None: self.y_sorted = y_points[None, None, :, :, :] self.z_sorted = z_points[None, None, :, :, :] + # Now calculate grid coordinates in original frame (from 270 deg perspective) + self.x_sorted_inertial_frame, self.y_sorted_inertial_frame, self.z_sorted_inertial_frame = \ + reverse_rotate_coordinates_rel_west( + wind_directions=self.wind_directions, + grid_x=self.x_sorted, + grid_y=self.y_sorted, + grid_z=self.z_sorted, + x_center_of_rotation=self.x_center_of_rotation, + y_center_of_rotation=self.y_center_of_rotation, + ) + @define class FlowFieldPlanarGrid(Grid): """ @@ -331,7 +543,8 @@ class FlowFieldPlanarGrid(Grid): planar_coordinate: float = field() x1_bounds: tuple = field(default=None) x2_bounds: tuple = field(default=None) - + x_center_of_rotation: NDArrayFloat = field(init=False) + y_center_of_rotation: NDArrayFloat = field(init=False) sorted_indices: NDArrayInt = field(init=False) unsorted_indices: NDArrayInt = field(init=False) @@ -355,8 +568,10 @@ def set_grid(self) -> None: Then, create the grid based on this wind-from-left orientation """ # These are the rotated coordinates of the wind turbines based on the wind direction - x, y, z = rotate_coordinates_rel_west(self.wind_directions, self.turbine_coordinates_array) - + x, y, z, self.x_center_of_rotation, self.y_center_of_rotation = rotate_coordinates_rel_west( + self.wind_directions, + self.turbine_coordinates_array + ) max_diameter = np.max(self.reference_turbine_diameter) if self.normal_vector == "z": # Rules of thumb for horizontal plane @@ -418,6 +633,17 @@ def set_grid(self) -> None: self.y_sorted = y_points[None, None, :, :, :] self.z_sorted = z_points[None, None, :, :, :] + # Now calculate grid coordinates in original frame (from 270 deg perspective) + self.x_sorted_inertial_frame, self.y_sorted_inertial_frame, self.z_sorted_inertial_frame = \ + reverse_rotate_coordinates_rel_west( + wind_directions=self.wind_directions, + grid_x=self.x_sorted, + grid_y=self.y_sorted, + grid_z=self.z_sorted, + x_center_of_rotation=self.x_center_of_rotation, + y_center_of_rotation=self.y_center_of_rotation, + ) + # self.sorted_indices = self.x.argsort(axis=2) # self.unsorted_indices = self.sorted_indices.argsort(axis=2) @@ -467,3 +693,54 @@ def set_grid(self) -> None: # xoffset * sind(angle) + yoffset * cosd(angle) + center_of_rotation[1] # ) # return rotated_x, rotated_y, self.z + +@define +class PointsGrid(Grid): + """ + Args: + turbine_coordinates (`list[Vec3]`): The list of turbine coordinates as `Vec3` objects. + reference_turbine_diameter (:py:obj:`float`): The reference turbine's rotor diameter. + wind_directions (:py:obj:`NDArrayFloat`): Wind directions supplied by the user. + wind_speeds (:py:obj:`NDArrayFloat`): Wind speeds supplied by the user. + grid_resolution (:py:obj:`int` | :py:obj:`Iterable(int,)`): Not used for PointsGrid, but + required for the `Grid` super-class. + time_series (:py:obj:`bool`): Flag to indicate whether the supplied wind data is a time + series. + points_x (:py:obj:`NDArrayFloat`): Array of x-components for the points in the grid. + points_y (:py:obj:`NDArrayFloat`): Array of y-components for the points in the grid. + points_z (:py:obj:`NDArrayFloat`): Array of z-components for the points in the grid. + x_center_of_rotation (:py:obj:`float`, optional): Component of the centroid of the + farm or area of interest. The PointsGrid will be rotated around this center + of rotation to account for wind direction changes. If not supplied, the center + of rotation will be the centroid of the points in the PointsGrid. + y_center_of_rotation (:py:obj:`float`, optional): Component of the centroid of the + farm or area of interest. The PointsGrid will be rotated around this center + of rotation to account for wind direction changes. If not supplied, the center + of rotation will be the centroid of the points in the PointsGrid. + """ + points_x: NDArrayFloat = field(converter=floris_array_converter) + points_y: NDArrayFloat = field(converter=floris_array_converter) + points_z: NDArrayFloat = field(converter=floris_array_converter) + x_center_of_rotation: float | None = field(default=None) + y_center_of_rotation: float | None = field(default=None) + + def __attrs_post_init__(self) -> None: + super().__attrs_post_init__() + self.set_grid() + + def set_grid(self) -> None: + """ + Set points for calculation based on a series of user-supplied coordinates. + """ + point_coordinates = np.array(list(zip(self.points_x, self.points_y, self.points_z))) + + # These are the rotated coordinates of the wind turbines based on the wind direction + x, y, z, _, _ = rotate_coordinates_rel_west( + self.wind_directions, + point_coordinates, + x_center_of_rotation=self.x_center_of_rotation, + y_center_of_rotation=self.y_center_of_rotation + ) + self.x_sorted = x[:,:,:,None,None] + self.y_sorted = y[:,:,:,None,None] + self.z_sorted = z[:,:,:,None,None] diff --git a/floris/simulation/solver.py b/floris/simulation/solver.py index c6fef5d27..5f1767699 100644 --- a/floris/simulation/solver.py +++ b/floris/simulation/solver.py @@ -10,9 +10,9 @@ # License for the specific language governing permissions and limitations under # the License. +from __future__ import annotations + import copy -import sys -import time import numpy as np @@ -22,15 +22,20 @@ Farm, FlowField, FlowFieldGrid, + FlowFieldPlanarGrid, + PointsGrid, TurbineGrid, ) from floris.simulation.turbine import average_velocity from floris.simulation.wake import WakeModelManager +from floris.simulation.wake_deflection.empirical_gauss import yaw_added_wake_mixing from floris.simulation.wake_deflection.gauss import ( calculate_transverse_velocity, wake_added_yaw, yaw_added_turbulence_mixing, ) +from floris.type_dec import NDArrayFloat +from floris.utilities import cosd def calculate_area_overlap(wake_velocities, freestream_velocities, y_ngrid, z_ngrid): @@ -94,9 +99,15 @@ def sequential_solver( ct_i = Ct( velocities=flow_field.u_sorted, yaw_angle=farm.yaw_angles_sorted, + tilt_angle=farm.tilt_angles_sorted, + ref_tilt_cp_ct=farm.ref_tilt_cp_cts_sorted, fCt=farm.turbine_fCts, + tilt_interp=farm.turbine_fTilts, + correct_cp_ct_for_tilt=farm.correct_cp_ct_for_tilt_sorted, turbine_type_map=farm.turbine_type_map_sorted, ix_filter=[i], + average_method=grid.average_method, + cubature_weights=grid.cubature_weights ) # Since we are filtering for the i'th turbine in the Ct function, # get the first index here (0:1) @@ -104,9 +115,15 @@ def sequential_solver( axial_induction_i = axial_induction( velocities=flow_field.u_sorted, yaw_angle=farm.yaw_angles_sorted, + tilt_angle=farm.tilt_angles_sorted, + ref_tilt_cp_ct=farm.ref_tilt_cp_cts_sorted, fCt=farm.turbine_fCts, + tilt_interp=farm.turbine_fTilts, + correct_cp_ct_for_tilt=farm.correct_cp_ct_for_tilt_sorted, turbine_type_map=farm.turbine_type_map_sorted, ix_filter=[i], + average_method=grid.average_method, + cubature_weights=grid.cubature_weights ) # Since we are filtering for the i'th turbine in the axial induction function, # get the first index here (0:1) @@ -240,7 +257,7 @@ def sequential_solver( def full_flow_sequential_solver( farm: Farm, flow_field: FlowField, - flow_field_grid: FlowFieldGrid, + flow_field_grid: FlowFieldGrid | FlowFieldPlanarGrid | PointsGrid, model_manager: WakeModelManager ) -> None: @@ -250,15 +267,18 @@ def full_flow_sequential_solver( turbine_grid_farm.construct_turbine_map() turbine_grid_farm.construct_turbine_fCts() - turbine_grid_farm.construct_turbine_fCps() turbine_grid_farm.construct_turbine_power_interps() turbine_grid_farm.construct_hub_heights() turbine_grid_farm.construct_rotor_diameters() turbine_grid_farm.construct_turbine_TSRs() - turbine_grid_farm.construc_turbine_pPs() - turbine_grid_farm.construc_turbine_ref_density_cp_cts() + turbine_grid_farm.construct_turbine_pPs() + turbine_grid_farm.construct_turbine_pTs() + turbine_grid_farm.construct_turbine_ref_density_cp_cts() + turbine_grid_farm.construct_turbine_ref_tilt_cp_cts() + turbine_grid_farm.construct_turbine_fTilts() + turbine_grid_farm.construct_turbine_correct_cp_ct_for_tilt() turbine_grid_farm.construct_coordinates() - + turbine_grid_farm.set_tilt_to_ref_tilt(flow_field.n_wind_directions, flow_field.n_wind_speeds) turbine_grid = TurbineGrid( turbine_coordinates=turbine_grid_farm.coordinates, @@ -310,7 +330,11 @@ def full_flow_sequential_solver( ct_i = Ct( velocities=turbine_grid_flow_field.u_sorted, yaw_angle=turbine_grid_farm.yaw_angles_sorted, + tilt_angle=turbine_grid_farm.tilt_angles_sorted, + ref_tilt_cp_ct=turbine_grid_farm.ref_tilt_cp_cts_sorted, fCt=turbine_grid_farm.turbine_fCts, + tilt_interp=turbine_grid_farm.turbine_fTilts, + correct_cp_ct_for_tilt=turbine_grid_farm.correct_cp_ct_for_tilt_sorted, turbine_type_map=turbine_grid_farm.turbine_type_map_sorted, ix_filter=[i], ) @@ -320,7 +344,11 @@ def full_flow_sequential_solver( axial_induction_i = axial_induction( velocities=turbine_grid_flow_field.u_sorted, yaw_angle=turbine_grid_farm.yaw_angles_sorted, + tilt_angle=turbine_grid_farm.tilt_angles_sorted, + ref_tilt_cp_ct=turbine_grid_farm.ref_tilt_cp_cts_sorted, fCt=turbine_grid_farm.turbine_fCts, + tilt_interp=turbine_grid_farm.turbine_fTilts, + correct_cp_ct_for_tilt=turbine_grid_farm.correct_cp_ct_for_tilt_sorted, turbine_type_map=turbine_grid_farm.turbine_type_map_sorted, ix_filter=[i], ) @@ -445,24 +473,14 @@ def cc_solver( z_i = np.mean(grid.z_sorted[:, :, i:i+1], axis=(3, 4)) z_i = z_i[:, :, :, None, None] + rotor_diameter_i = farm.rotor_diameters_sorted[: ,:, i:i+1, None, None] + mask2 = ( np.array(grid.x_sorted < x_i + 0.01) * np.array(grid.x_sorted > x_i - 0.01) - * np.array(grid.y_sorted < y_i + 0.51*126.0) - * np.array(grid.y_sorted > y_i - 0.51*126.0) + * np.array(grid.y_sorted < y_i + 0.51 * rotor_diameter_i) + * np.array(grid.y_sorted > y_i - 0.51 * rotor_diameter_i) ) - # mask2 = ( - # np.logical_and( - # np.logical_and( - # np.logical_and( - # grid.x_sorted < x_i + 0.01, - # grid.x_sorted > x_i - 0.01 - # ), - # grid.y_sorted < y_i + 0.51*126.0 - # ), - # grid.y_sorted > y_i - 0.51*126.0 - # ) - # ) turb_inflow_field = ( turb_inflow_field * ~mask2 + (flow_field.u_initial_sorted - turb_u_wake) * mask2 @@ -472,16 +490,28 @@ def cc_solver( turb_Cts = Ct( turb_avg_vels, farm.yaw_angles_sorted, + farm.tilt_angles_sorted, + farm.ref_tilt_cp_cts_sorted, farm.turbine_fCts, + tilt_interp=farm.turbine_fTilts, + correct_cp_ct_for_tilt=farm.correct_cp_ct_for_tilt_sorted, turbine_type_map=farm.turbine_type_map_sorted, + average_method=grid.average_method, + cubature_weights=grid.cubature_weights ) turb_Cts = turb_Cts[:, :, :, None, None] turb_aIs = axial_induction( turb_avg_vels, farm.yaw_angles_sorted, + farm.tilt_angles_sorted, + farm.ref_tilt_cp_cts_sorted, farm.turbine_fCts, + tilt_interp=farm.turbine_fTilts, + correct_cp_ct_for_tilt=farm.correct_cp_ct_for_tilt_sorted, turbine_type_map=farm.turbine_type_map_sorted, ix_filter=[i], + average_method=grid.average_method, + cubature_weights=grid.cubature_weights ) turb_aIs = turb_aIs[:, :, :, None, None] @@ -491,9 +521,15 @@ def cc_solver( axial_induction_i = axial_induction( velocities=flow_field.u_sorted, yaw_angle=farm.yaw_angles_sorted, + tilt_angle=farm.tilt_angles_sorted, + ref_tilt_cp_ct=farm.ref_tilt_cp_cts_sorted, fCt=farm.turbine_fCts, + tilt_interp=farm.turbine_fTilts, + correct_cp_ct_for_tilt=farm.correct_cp_ct_for_tilt_sorted, turbine_type_map=farm.turbine_type_map_sorted, ix_filter=[i], + average_method=grid.average_method, + cubature_weights=grid.cubature_weights ) axial_induction_i = axial_induction_i[:, :, :, None, None] @@ -501,7 +537,6 @@ def cc_solver( turbulence_intensity_i = turbine_turbulence_intensity[:, :, i:i+1] yaw_angle_i = farm.yaw_angles_sorted[:, :, i:i+1, None, None] hub_height_i = farm.hub_heights_sorted[: ,:, i:i+1, None, None] - rotor_diameter_i = farm.rotor_diameters_sorted[: ,:, i:i+1, None, None] TSR_i = farm.TSRs_sorted[: ,:, i:i+1, None, None] effective_yaw_i = np.zeros_like(yaw_angle_i) @@ -633,14 +668,18 @@ def full_flow_cc_solver( turbine_grid_farm.construct_turbine_map() turbine_grid_farm.construct_turbine_fCts() - turbine_grid_farm.construct_turbine_fCps() turbine_grid_farm.construct_turbine_power_interps() turbine_grid_farm.construct_hub_heights() turbine_grid_farm.construct_rotor_diameters() turbine_grid_farm.construct_turbine_TSRs() - turbine_grid_farm.construc_turbine_pPs() - turbine_grid_farm.construc_turbine_ref_density_cp_cts() + turbine_grid_farm.construct_turbine_pPs() + turbine_grid_farm.construct_turbine_pTs() + turbine_grid_farm.construct_turbine_ref_density_cp_cts() + turbine_grid_farm.construct_turbine_ref_tilt_cp_cts() + turbine_grid_farm.construct_turbine_fTilts() + turbine_grid_farm.construct_turbine_correct_cp_ct_for_tilt() turbine_grid_farm.construct_coordinates() + turbine_grid_farm.set_tilt_to_ref_tilt(flow_field.n_wind_directions, flow_field.n_wind_speeds) turbine_grid = TurbineGrid( turbine_coordinates=turbine_grid_farm.coordinates, @@ -696,17 +735,29 @@ def full_flow_cc_solver( turb_Cts = Ct( velocities=turb_avg_vels, yaw_angle=turbine_grid_farm.yaw_angles_sorted, + tilt_angle=turbine_grid_farm.tilt_angles_sorted, + ref_tilt_cp_ct=turbine_grid_farm.ref_tilt_cp_cts_sorted, fCt=turbine_grid_farm.turbine_fCts, + tilt_interp=turbine_grid_farm.turbine_fTilts, + correct_cp_ct_for_tilt=turbine_grid_farm.correct_cp_ct_for_tilt_sorted, turbine_type_map=turbine_grid_farm.turbine_type_map_sorted, + average_method=turbine_grid.average_method, + cubature_weights=turbine_grid.cubature_weights ) turb_Cts = turb_Cts[:, :, :, None, None] axial_induction_i = axial_induction( velocities=turbine_grid_flow_field.u_sorted, yaw_angle=turbine_grid_farm.yaw_angles_sorted, + tilt_angle=turbine_grid_farm.tilt_angles_sorted, + ref_tilt_cp_ct=turbine_grid_farm.ref_tilt_cp_cts_sorted, fCt=turbine_grid_farm.turbine_fCts, + tilt_interp=turbine_grid_farm.turbine_fTilts, + correct_cp_ct_for_tilt=turbine_grid_farm.correct_cp_ct_for_tilt_sorted, turbine_type_map=turbine_grid_farm.turbine_type_map_sorted, ix_filter=[i], + average_method=turbine_grid.average_method, + cubature_weights=turbine_grid.cubature_weights ) axial_induction_i = axial_induction_i[:, :, :, None, None] @@ -786,6 +837,7 @@ def full_flow_cc_solver( flow_field.w_sorted += w_wake flow_field.u_sorted = flow_field.u_initial_sorted - turb_u_wake + def turbopark_solver( farm: Farm, flow_field: FlowField, @@ -832,16 +884,28 @@ def turbopark_solver( Cts = Ct( velocities=flow_field.u_sorted, yaw_angle=farm.yaw_angles_sorted, + tilt_angle=farm.tilt_angles_sorted, + ref_tilt_cp_ct=farm.ref_tilt_cp_cts_sorted, fCt=farm.turbine_fCts, + tilt_interp=farm.turbine_fTilts, + correct_cp_ct_for_tilt=farm.correct_cp_ct_for_tilt_sorted, turbine_type_map=farm.turbine_type_map_sorted, + average_method=grid.average_method, + cubature_weights=grid.cubature_weights ) ct_i = Ct( velocities=flow_field.u_sorted, yaw_angle=farm.yaw_angles_sorted, + tilt_angle=farm.tilt_angles_sorted, + ref_tilt_cp_ct=farm.ref_tilt_cp_cts_sorted, fCt=farm.turbine_fCts, + tilt_interp=farm.turbine_fTilts, + correct_cp_ct_for_tilt=farm.correct_cp_ct_for_tilt_sorted, turbine_type_map=farm.turbine_type_map_sorted, ix_filter=[i], + average_method=grid.average_method, + cubature_weights=grid.cubature_weights ) # Since we are filtering for the i'th turbine in the Ct function, # get the first index here (0:1) @@ -849,9 +913,15 @@ def turbopark_solver( axial_induction_i = axial_induction( velocities=flow_field.u_sorted, yaw_angle=farm.yaw_angles_sorted, + tilt_angle=farm.tilt_angles_sorted, + ref_tilt_cp_ct=farm.ref_tilt_cp_cts_sorted, fCt=farm.turbine_fCts, + tilt_interp=farm.turbine_fTilts, + correct_cp_ct_for_tilt=farm.correct_cp_ct_for_tilt_sorted, turbine_type_map=farm.turbine_type_map_sorted, ix_filter=[i], + average_method=grid.average_method, + cubature_weights=grid.cubature_weights ) # Since we are filtering for the i'th turbine in the axial induction function, # get the first index here (0:1) @@ -899,9 +969,15 @@ def turbopark_solver( ct_ii = Ct( velocities=flow_field.u_sorted, yaw_angle=farm.yaw_angles_sorted, + tilt_angle=farm.tilt_angles_sorted, + ref_tilt_cp_ct=farm.ref_tilt_cp_cts_sorted, fCt=farm.turbine_fCts, + tilt_interp=farm.turbine_fTilts, + correct_cp_ct_for_tilt=farm.correct_cp_ct_for_tilt_sorted, turbine_type_map=farm.turbine_type_map_sorted, - ix_filter=[ii] + ix_filter=[ii], + average_method=grid.average_method, + cubature_weights=grid.cubature_weights ) ct_ii = ct_ii[:, :, 0:1, None, None] rotor_diameter_ii = farm.rotor_diameters_sorted[: ,:, ii:ii+1, None, None] @@ -1028,7 +1104,6 @@ def full_flow_turbopark_solver( # turbine_grid_farm.construct_turbine_map() # turbine_grid_farm.construct_turbine_fCts() - # turbine_grid_farm.construct_turbine_fCps() # turbine_grid_farm.construct_turbine_power_interps() # turbine_grid_farm.construct_hub_heights() # turbine_grid_farm.construct_rotor_diameters() @@ -1062,3 +1137,360 @@ def full_flow_turbopark_solver( # flow_field_grid.x = copy.deepcopy(turbine_grid.x) # flow_field_grid.y = copy.deepcopy(turbine_grid.y) # flow_field_grid.z = copy.deepcopy(turbine_grid.z) + + +def empirical_gauss_solver( + farm: Farm, + flow_field: FlowField, + grid: TurbineGrid, + model_manager: WakeModelManager +) -> NDArrayFloat: + """ + Algorithm: + For each turbine, calculate its effect on every downstream turbine. + For the current turbine, we are calculating the deficit that it adds to downstream turbines. + Integrate this into the main data structure. + Move on to the next turbine. + + Args: + farm (Farm) + flow_field (FlowField) + grid (TurbineGrid) + model_manager (WakeModelManager) + + Raises: + NotImplementedError: Raised if secondary steering is enabled with the EmGauss model. + NotImplementedError: Raised if transverse velocities is enabled with the EmGauss model. + + Returns: + NDArrayFloat: wake induced mixing field primarily for use in the full-flow EmGauss solver + """ + + + # <> + deflection_model_args = model_manager.deflection_model.prepare_function(grid, flow_field) + deficit_model_args = model_manager.velocity_model.prepare_function(grid, flow_field) + + # This is u_wake + wake_field = np.zeros_like(flow_field.u_initial_sorted) + v_wake = np.zeros_like(flow_field.v_initial_sorted) + w_wake = np.zeros_like(flow_field.w_initial_sorted) + + x_locs = np.mean(grid.x_sorted, axis=(3, 4))[:,:,:,None] + downstream_distance_D = x_locs - np.transpose(x_locs, axes=(0,1,3,2)) + downstream_distance_D = downstream_distance_D / \ + np.repeat(farm.rotor_diameters_sorted[:,:,:,None], grid.n_turbines, axis=-1) + downstream_distance_D = np.maximum(downstream_distance_D, 0.1) # For ease + mixing_factor = np.zeros_like(downstream_distance_D) + mixing_factor[:,:,:,:] = model_manager.turbulence_model.atmospheric_ti_gain*\ + flow_field.turbulence_intensity*np.eye(grid.n_turbines) + + # Calculate the velocity deficit sequentially from upstream to downstream turbines + for i in range(grid.n_turbines): + + # Get the current turbine quantities + x_i = np.mean(grid.x_sorted[:, :, i:i+1], axis=(3, 4)) + x_i = x_i[:, :, :, None, None] + y_i = np.mean(grid.y_sorted[:, :, i:i+1], axis=(3, 4)) + y_i = y_i[:, :, :, None, None] + z_i = np.mean(grid.z_sorted[:, :, i:i+1], axis=(3, 4)) + z_i = z_i[:, :, :, None, None] + + flow_field.u_sorted[:, :, i:i+1] + flow_field.v_sorted[:, :, i:i+1] + + ct_i = Ct( + velocities=flow_field.u_sorted, + yaw_angle=farm.yaw_angles_sorted, + tilt_angle=farm.tilt_angles_sorted, + ref_tilt_cp_ct=farm.ref_tilt_cp_cts_sorted, + fCt=farm.turbine_fCts, + tilt_interp=farm.turbine_fTilts, + correct_cp_ct_for_tilt=farm.correct_cp_ct_for_tilt_sorted, + turbine_type_map=farm.turbine_type_map_sorted, + ix_filter=[i], + average_method=grid.average_method, + cubature_weights=grid.cubature_weights + ) + # Since we are filtering for the i'th turbine in the Ct function, + # get the first index here (0:1) + ct_i = ct_i[:, :, 0:1, None, None] + axial_induction_i = axial_induction( + velocities=flow_field.u_sorted, + yaw_angle=farm.yaw_angles_sorted, + tilt_angle=farm.tilt_angles_sorted, + ref_tilt_cp_ct=farm.ref_tilt_cp_cts_sorted, + fCt=farm.turbine_fCts, + tilt_interp=farm.turbine_fTilts, + correct_cp_ct_for_tilt=farm.correct_cp_ct_for_tilt_sorted, + turbine_type_map=farm.turbine_type_map_sorted, + ix_filter=[i], + average_method=grid.average_method, + cubature_weights=grid.cubature_weights + ) + # Since we are filtering for the i'th turbine in the axial induction function, + # get the first index here (0:1) + axial_induction_i = axial_induction_i[:, :, 0:1, None, None] + yaw_angle_i = farm.yaw_angles_sorted[:, :, i:i+1, None, None] + hub_height_i = farm.hub_heights_sorted[: ,:, i:i+1, None, None] + rotor_diameter_i = farm.rotor_diameters_sorted[: ,:, i:i+1, None, None] + + effective_yaw_i = np.zeros_like(yaw_angle_i) + effective_yaw_i += yaw_angle_i + + average_velocities = average_velocity( + flow_field.u_sorted, + method=grid.average_method, + cubature_weights=grid.cubature_weights + ) + tilt_angle_i = farm.calculate_tilt_for_eff_velocities(average_velocities) + tilt_angle_i = tilt_angle_i[:, :, i:i+1, None, None] + + if model_manager.enable_secondary_steering: + raise NotImplementedError( + "Secondary steering not available for this model.") + + if model_manager.enable_transverse_velocities: + raise NotImplementedError( + "Transverse velocities not used in this model.") + + if model_manager.enable_yaw_added_recovery: + # Influence of yawing on turbine's own wake + mixing_factor[:, :, i:i+1, i] += \ + yaw_added_wake_mixing( + axial_induction_i, + yaw_angle_i, + 1, + model_manager.deflection_model.yaw_added_mixing_gain + ) + + # Extract total wake induced mixing for turbine i + mixing_i = np.linalg.norm( + mixing_factor[:, :, i:i+1, :, None], + ord=2, axis=3, keepdims=True + ) + + # Model calculations + # NOTE: exponential + deflection_field_y, deflection_field_z = model_manager.deflection_model.function( + x_i, + y_i, + effective_yaw_i, + tilt_angle_i, + mixing_i, + ct_i, + rotor_diameter_i, + **deflection_model_args + ) + + # NOTE: exponential + velocity_deficit = model_manager.velocity_model.function( + x_i, + y_i, + z_i, + axial_induction_i, + deflection_field_y, + deflection_field_z, + yaw_angle_i, + tilt_angle_i, + mixing_i, + ct_i, + hub_height_i, + rotor_diameter_i, + **deficit_model_args + ) + + wake_field = model_manager.combination_model.function( + wake_field, + velocity_deficit * flow_field.u_initial_sorted + ) + + # Calculate wake overlap for wake-added turbulence (WAT) + area_overlap = np.sum(velocity_deficit * flow_field.u_initial_sorted > 0.05, axis=(3, 4))\ + / (grid.grid_resolution * grid.grid_resolution) + + # Compute wake induced mixing factor + mixing_factor[:,:,:,i] += \ + area_overlap * model_manager.turbulence_model.function( + axial_induction_i, downstream_distance_D[:,:,:,i] + ) + if model_manager.enable_yaw_added_recovery: + mixing_factor[:,:,:,i] += \ + area_overlap * yaw_added_wake_mixing( + axial_induction_i, + yaw_angle_i, + downstream_distance_D[:,:,:,i], + model_manager.deflection_model.yaw_added_mixing_gain + ) + + flow_field.u_sorted = flow_field.u_initial_sorted - wake_field + flow_field.v_sorted += v_wake + flow_field.w_sorted += w_wake + + return mixing_factor + + +def full_flow_empirical_gauss_solver( + farm: Farm, + flow_field: FlowField, + flow_field_grid: FlowFieldGrid, + model_manager: WakeModelManager +) -> None: + + # Get the flow quantities and turbine performance + turbine_grid_farm = copy.deepcopy(farm) + turbine_grid_flow_field = copy.deepcopy(flow_field) + + turbine_grid_farm.construct_turbine_map() + turbine_grid_farm.construct_turbine_fCts() + turbine_grid_farm.construct_turbine_power_interps() + turbine_grid_farm.construct_hub_heights() + turbine_grid_farm.construct_rotor_diameters() + turbine_grid_farm.construct_turbine_TSRs() + turbine_grid_farm.construct_turbine_pPs() + turbine_grid_farm.construct_turbine_pTs() + turbine_grid_farm.construct_turbine_ref_density_cp_cts() + turbine_grid_farm.construct_turbine_ref_tilt_cp_cts() + turbine_grid_farm.construct_turbine_fTilts() + turbine_grid_farm.construct_turbine_correct_cp_ct_for_tilt() + turbine_grid_farm.construct_coordinates() + turbine_grid_farm.set_tilt_to_ref_tilt(flow_field.n_wind_directions, flow_field.n_wind_speeds) + + turbine_grid = TurbineGrid( + turbine_coordinates=turbine_grid_farm.coordinates, + reference_turbine_diameter=turbine_grid_farm.rotor_diameters, + wind_directions=turbine_grid_flow_field.wind_directions, + wind_speeds=turbine_grid_flow_field.wind_speeds, + grid_resolution=3, + time_series=turbine_grid_flow_field.time_series, + ) + turbine_grid_farm.expand_farm_properties( + turbine_grid_flow_field.n_wind_directions, + turbine_grid_flow_field.n_wind_speeds, + turbine_grid.sorted_coord_indices + ) + turbine_grid_flow_field.initialize_velocity_field(turbine_grid) + turbine_grid_farm.initialize(turbine_grid.sorted_indices) + wim_field = empirical_gauss_solver( + turbine_grid_farm, + turbine_grid_flow_field, + turbine_grid, + model_manager + ) + + ### Referring to the quantities from above, calculate the wake in the full grid + + # Use full flow_field here to use the full grid in the wake models + deflection_model_args = model_manager.deflection_model.prepare_function( + flow_field_grid, flow_field + ) + deficit_model_args = model_manager.velocity_model.prepare_function(flow_field_grid, flow_field) + + wake_field = np.zeros_like(flow_field.u_initial_sorted) + v_wake = np.zeros_like(flow_field.v_initial_sorted) + w_wake = np.zeros_like(flow_field.w_initial_sorted) + + # Calculate the velocity deficit sequentially from upstream to downstream turbines + for i in range(flow_field_grid.n_turbines): + + # Get the current turbine quantities + x_i = np.mean(turbine_grid.x_sorted[:, :, i:i+1], axis=(3, 4)) + x_i = x_i[:, :, :, None, None] + y_i = np.mean(turbine_grid.y_sorted[:, :, i:i+1], axis=(3, 4)) + y_i = y_i[:, :, :, None, None] + z_i = np.mean(turbine_grid.z_sorted[:, :, i:i+1], axis=(3, 4)) + z_i = z_i[:, :, :, None, None] + + turbine_grid_flow_field.u_sorted[:, :, i:i+1] + turbine_grid_flow_field.v_sorted[:, :, i:i+1] + + ct_i = Ct( + velocities=turbine_grid_flow_field.u_sorted, + yaw_angle=turbine_grid_farm.yaw_angles_sorted, + tilt_angle=turbine_grid_farm.tilt_angles_sorted, + ref_tilt_cp_ct=turbine_grid_farm.ref_tilt_cp_cts_sorted, + fCt=turbine_grid_farm.turbine_fCts, + tilt_interp=turbine_grid_farm.turbine_fTilts, + correct_cp_ct_for_tilt=turbine_grid_farm.correct_cp_ct_for_tilt_sorted, + turbine_type_map=turbine_grid_farm.turbine_type_map_sorted, + ix_filter=[i], + ) + # Since we are filtering for the i'th turbine in the Ct function, + # get the first index here (0:1) + ct_i = ct_i[:, :, 0:1, None, None] + axial_induction_i = axial_induction( + velocities=turbine_grid_flow_field.u_sorted, + yaw_angle=turbine_grid_farm.yaw_angles_sorted, + tilt_angle=turbine_grid_farm.tilt_angles_sorted, + ref_tilt_cp_ct=turbine_grid_farm.ref_tilt_cp_cts_sorted, + fCt=turbine_grid_farm.turbine_fCts, + tilt_interp=turbine_grid_farm.turbine_fTilts, + correct_cp_ct_for_tilt=turbine_grid_farm.correct_cp_ct_for_tilt_sorted, + turbine_type_map=turbine_grid_farm.turbine_type_map_sorted, + ix_filter=[i], + ) + # Since we are filtering for the i'th turbine in the axial induction function, + # get the first index here (0:1) + axial_induction_i = axial_induction_i[:, :, 0:1, None, None] + yaw_angle_i = turbine_grid_farm.yaw_angles_sorted[:, :, i:i+1, None, None] + hub_height_i = turbine_grid_farm.hub_heights_sorted[: ,:, i:i+1, None, None] + rotor_diameter_i = turbine_grid_farm.rotor_diameters_sorted[: ,:, i:i+1, None, None] + wake_induced_mixing_i = wim_field[:, :, i:i+1, :, None].sum(axis=3, keepdims=1) + + effective_yaw_i = np.zeros_like(yaw_angle_i) + effective_yaw_i += yaw_angle_i + + average_velocities = average_velocity( + turbine_grid_flow_field.u_sorted, + method=turbine_grid.average_method, + cubature_weights=turbine_grid.cubature_weights + ) + tilt_angle_i = turbine_grid_farm.calculate_tilt_for_eff_velocities(average_velocities) + tilt_angle_i = tilt_angle_i[:, :, i:i+1, None, None] + + if model_manager.enable_secondary_steering: + raise NotImplementedError( + "Secondary steering not available for this model.") + + if model_manager.enable_transverse_velocities: + raise NotImplementedError( + "Transverse velocities not used in this model.") + + # Model calculations + # NOTE: exponential + deflection_field_y, deflection_field_z = model_manager.deflection_model.function( + x_i, + y_i, + effective_yaw_i, + tilt_angle_i, + wake_induced_mixing_i, + ct_i, + rotor_diameter_i, + **deflection_model_args + ) + + # NOTE: exponential + velocity_deficit = model_manager.velocity_model.function( + x_i, + y_i, + z_i, + axial_induction_i, + deflection_field_y, + deflection_field_z, + yaw_angle_i, + tilt_angle_i, + wake_induced_mixing_i, + ct_i, + hub_height_i, + rotor_diameter_i, + **deficit_model_args + ) + + wake_field = model_manager.combination_model.function( + wake_field, + velocity_deficit * flow_field.u_initial_sorted + ) + + flow_field.u_sorted = flow_field.u_initial_sorted - wake_field + flow_field.v_sorted += v_wake + flow_field.w_sorted += w_wake diff --git a/floris/simulation/turbine.py b/floris/simulation/turbine.py index 5da33331a..cdf457878 100644 --- a/floris/simulation/turbine.py +++ b/floris/simulation/turbine.py @@ -14,7 +14,9 @@ from __future__ import annotations +import copy from collections.abc import Iterable +from typing import Any import attrs import numpy as np @@ -25,6 +27,7 @@ from floris.type_dec import ( floris_array_converter, FromDictMixin, + NDArrayBool, NDArrayFilter, NDArrayFloat, NDArrayInt, @@ -78,12 +81,144 @@ def _filter_convert( return np.array(ix_filter) -def power( +def _rotor_velocity_yaw_correction( + pP: float, + yaw_angle: NDArrayFloat, + rotor_effective_velocities: NDArrayFloat, +) -> NDArrayFloat: + # Compute the rotor effective velocity adjusting for yaw settings + pW = pP / 3.0 # Convert from pP to w + rotor_effective_velocities = rotor_effective_velocities * cosd(yaw_angle) ** pW + + return rotor_effective_velocities + + +def _rotor_velocity_tilt_correction( + turbine_type_map: NDArrayObject, + tilt_angle: NDArrayFloat, + ref_tilt_cp_ct: NDArrayFloat, + pT: float, + tilt_interp: NDArrayObject, + correct_cp_ct_for_tilt: NDArrayBool, + rotor_effective_velocities: NDArrayFloat, +) -> NDArrayFloat: + # Compute the tilt, if using floating turbines + old_tilt_angle = copy.deepcopy(tilt_angle) + tilt_angle = compute_tilt_angles_for_floating_turbines( + turbine_type_map, + tilt_angle, + tilt_interp, + rotor_effective_velocities, + ) + # Only update tilt angle if requested (if the tilt isn't accounted for in the Cp curve) + tilt_angle = np.where(correct_cp_ct_for_tilt, tilt_angle, old_tilt_angle) + + # Compute the rotor effective velocity adjusting for tilt + rotor_effective_velocities = ( + rotor_effective_velocities + * cosd(tilt_angle - ref_tilt_cp_ct) ** (pT / 3.0) + ) + return rotor_effective_velocities + + +def compute_tilt_angles_for_floating_turbines( + turbine_type_map: NDArrayObject, + tilt_angle: NDArrayFloat, + tilt_interp: NDArrayObject, + rotor_effective_velocities: NDArrayFloat, +) -> NDArrayFloat: + # Loop over each turbine type given to get tilt angles for all turbines + tilt_angles = np.zeros(np.shape(rotor_effective_velocities)) + tilt_interp = dict(tilt_interp) + turb_types = np.unique(turbine_type_map) + for turb_type in turb_types: + # If no tilt interpolation is specified, assume no modification to tilt + if tilt_interp[turb_type] is None: + # TODO should this be break? Should it be continue? Do we want to support mixed + # fixed-bottom and floating? Or non-tilting floating? + pass + # Using a masked array, apply the tilt angle for all turbines of the current + # type to the main tilt angle array + else: + tilt_angles += ( + tilt_interp[turb_type](rotor_effective_velocities) + * np.array(turbine_type_map == turb_type) + ) + + # TODO: Not sure if this is the best way to do this? Basically replaces the initialized + # tilt_angles if there are non-zero tilt angles calculated above (meaning that the turbine + # definition contained a wind_speed/tilt table definition) + if not tilt_angles.all() == 0.: + tilt_angle = tilt_angles + + return tilt_angle + + +def rotor_effective_velocity( air_density: float, ref_density_cp_ct: float, velocities: NDArrayFloat, yaw_angle: NDArrayFloat, + tilt_angle: NDArrayFloat, + ref_tilt_cp_ct: NDArrayFloat, pP: float, + pT: float, + tilt_interp: NDArrayObject, + correct_cp_ct_for_tilt: NDArrayBool, + turbine_type_map: NDArrayObject, + ix_filter: NDArrayInt | Iterable[int] | None = None, + average_method: str = "cubic-mean", + cubature_weights: NDArrayFloat | None = None +) -> NDArrayFloat: + + if isinstance(yaw_angle, list): + yaw_angle = np.array(yaw_angle) + if isinstance(tilt_angle, list): + tilt_angle = np.array(tilt_angle) + + # Down-select inputs if ix_filter is given + if ix_filter is not None: + ix_filter = _filter_convert(ix_filter, yaw_angle) + velocities = velocities[:, :, ix_filter] + yaw_angle = yaw_angle[:, :, ix_filter] + tilt_angle = tilt_angle[:, :, ix_filter] + ref_tilt_cp_ct = ref_tilt_cp_ct[:, :, ix_filter] + pP = pP[:, :, ix_filter] + pT = pT[:, :, ix_filter] + turbine_type_map = turbine_type_map[:, :, ix_filter] + + # Compute the rotor effective velocity adjusting for air density + # TODO: This correction is currently split across two functions: this one and `power`, where in + # `power` the returned power is multiplied by the reference air density + average_velocities = average_velocity( + velocities, + method=average_method, + cubature_weights=cubature_weights + ) + rotor_effective_velocities = (air_density/ref_density_cp_ct)**(1/3) * average_velocities + + # Compute the rotor effective velocity adjusting for yaw settings + rotor_effective_velocities = _rotor_velocity_yaw_correction( + pP, yaw_angle, rotor_effective_velocities + ) + + # Compute the tilt, if using floating turbines + rotor_effective_velocities = _rotor_velocity_tilt_correction( + turbine_type_map, + tilt_angle, + ref_tilt_cp_ct, + pT, + tilt_interp, + correct_cp_ct_for_tilt, + rotor_effective_velocities, + ) + + return rotor_effective_velocities + + +def power( + ref_density_cp_ct: float, + rotor_effective_velocities: NDArrayFloat, power_interp: NDArrayObject, turbine_type_map: NDArrayObject, ix_filter: NDArrayInt | Iterable[int] | None = None, @@ -92,11 +227,9 @@ def power( given in Watts. Args: - air_density (NDArrayFloat[wd, ws, turbines]): The air density value(s) at each turbine. ref_density_cp_cts (NDArrayFloat[wd, ws, turbines]): The reference density for each turbine - velocities (NDArrayFloat[wd, ws, turbines, grid1, grid2]): The velocity field at a turbine. - pP (NDArrayFloat[wd, ws, turbines]): The pP value(s) of the cosine exponent relating - the yaw misalignment angle to power for each turbine. + rotor_effective_velocities (NDArrayFloat[wd, ws, turbines, grid1, grid2]): The rotor + effective velocities at a turbine. power_interp (NDArrayObject[wd, ws, turbines]): The power interpolation function for each turbine. turbine_type_map: (NDArrayObject[wd, ws, turbines]): The Turbine type definition for @@ -120,39 +253,20 @@ def power( # TODO: check this - where is it? # P = 1/2 rho A V^3 Cp - # NOTE: The below has a trivial performance hit for floats being passed (3.4% longer - # on a meaningless test), but is actually faster when an array is passed through - # That said, it adds overhead to convert the floats to 1-D arrays, so I don't - # recommend just converting all values to arrays - - if isinstance(yaw_angle, list): - yaw_angle = np.array(yaw_angle) - # Down-select inputs if ix_filter is given if ix_filter is not None: - ix_filter = _filter_convert(ix_filter, yaw_angle) - velocities = velocities[:, :, ix_filter] - yaw_angle = yaw_angle[:, :, ix_filter] - pP = pP[:, :, ix_filter] + ix_filter = _filter_convert(ix_filter, rotor_effective_velocities) + rotor_effective_velocities = rotor_effective_velocities[:, :, ix_filter] turbine_type_map = turbine_type_map[:, :, ix_filter] - # Compute the yaw effective velocity - pW = pP / 3.0 # Convert from pP to w - yaw_effective_velocity = ( - (air_density/ref_density_cp_ct)**(1/3) - * average_velocity(velocities) - * cosd(yaw_angle) ** pW - ) - - # Loop over each turbine type given to get thrust coefficient for all turbines - p = np.zeros(np.shape(yaw_effective_velocity)) - power_interp = dict(power_interp) + # Loop over each turbine type given to get power for all turbines + p = np.zeros(np.shape(rotor_effective_velocities)) turb_types = np.unique(turbine_type_map) for turb_type in turb_types: # Using a masked array, apply the thrust coefficient for all turbines of the current # type to the main thrust coefficient array p += ( - power_interp[turb_type](yaw_effective_velocity) + power_interp[turb_type](rotor_effective_velocities) * np.array(turbine_type_map == turb_type) ) @@ -162,9 +276,15 @@ def power( def Ct( velocities: NDArrayFloat, yaw_angle: NDArrayFloat, - fCt: NDArrayObject, + tilt_angle: NDArrayFloat, + ref_tilt_cp_ct: NDArrayFloat, + fCt: dict, + tilt_interp: NDArrayObject, + correct_cp_ct_for_tilt: NDArrayBool, turbine_type_map: NDArrayObject, ix_filter: NDArrayFilter | Iterable[int] | None = None, + average_method: str = "cubic-mean", + cubature_weights: NDArrayFloat | None = None ) -> NDArrayFloat: """Thrust coefficient of a turbine incorporating the yaw angle. @@ -175,7 +295,15 @@ def Ct( velocities (NDArrayFloat[wd, ws, turbines, grid1, grid2]): The velocity field at a turbine. yaw_angle (NDArrayFloat[wd, ws, turbines]): The yaw angle for each turbine. - fCt (NDArrayObject[wd, ws, turbines]): The thrust coefficient for each turbine. + tilt_angle (NDArrayFloat[wd, ws, turbines]): The tilt angle for each turbine. + ref_tilt_cp_ct (NDArrayFloat[wd, ws, turbines]): The reference tilt angle for each turbine + that the Cp/Ct tables are defined at. + fCt (dict): The thrust coefficient interpolation functions for each turbine. Keys are + the turbine type string and values are the interpolation functions. + tilt_interp (Iterable[tuple]): The tilt interpolation functions for each + turbine. + correct_cp_ct_for_tilt (NDArrayBool[wd, ws, turbines]): Boolean for determining if the + turbines Cp and Ct should be corrected for tilt. turbine_type_map: (NDArrayObject[wd, ws, turbines]): The Turbine type definition for each turbine. ix_filter (NDArrayFilter | Iterable[int] | None, optional): The boolean array, or @@ -189,18 +317,38 @@ def Ct( if isinstance(yaw_angle, list): yaw_angle = np.array(yaw_angle) + if isinstance(tilt_angle, list): + tilt_angle = np.array(tilt_angle) + # Down-select inputs if ix_filter is given if ix_filter is not None: ix_filter = _filter_convert(ix_filter, yaw_angle) velocities = velocities[:, :, ix_filter] yaw_angle = yaw_angle[:, :, ix_filter] + tilt_angle = tilt_angle[:, :, ix_filter] + ref_tilt_cp_ct = ref_tilt_cp_ct[:, :, ix_filter] turbine_type_map = turbine_type_map[:, :, ix_filter] + correct_cp_ct_for_tilt = correct_cp_ct_for_tilt[:, :, ix_filter] + + average_velocities = average_velocity( + velocities, + method=average_method, + cubature_weights=cubature_weights + ) - average_velocities = average_velocity(velocities) + # Compute the tilt, if using floating turbines + old_tilt_angle = copy.deepcopy(tilt_angle) + tilt_angle = compute_tilt_angles_for_floating_turbines( + turbine_type_map, + tilt_angle, + tilt_interp, + average_velocities, + ) + # Only update tilt angle if requested (if the tilt isn't accounted for in the Ct curve) + tilt_angle = np.where(correct_cp_ct_for_tilt, tilt_angle, old_tilt_angle) # Loop over each turbine type given to get thrust coefficient for all turbines thrust_coefficient = np.zeros(np.shape(average_velocities)) - fCt = dict(fCt) turb_types = np.unique(turbine_type_map) for turb_type in turb_types: # Using a masked array, apply the thrust coefficient for all turbines of the current @@ -210,16 +358,22 @@ def Ct( * np.array(turbine_type_map == turb_type) ) thrust_coefficient = np.clip(thrust_coefficient, 0.0001, 0.9999) - effective_thrust = thrust_coefficient * cosd(yaw_angle) + effective_thrust = thrust_coefficient * cosd(yaw_angle) * cosd(tilt_angle - ref_tilt_cp_ct) return effective_thrust def axial_induction( velocities: NDArrayFloat, # (wind directions, wind speeds, turbines, grid, grid) yaw_angle: NDArrayFloat, # (wind directions, wind speeds, turbines) - fCt: NDArrayObject, # (turbines) + tilt_angle: NDArrayFloat, # (wind directions, wind speeds, turbines) + ref_tilt_cp_ct: NDArrayFloat, + fCt: dict, # (turbines) + tilt_interp: NDArrayObject, # (turbines) + correct_cp_ct_for_tilt: NDArrayBool, # (wind directions, wind speeds, turbines) turbine_type_map: NDArrayObject, # (wind directions, 1, turbines) ix_filter: NDArrayFilter | Iterable[int] | None = None, + average_method: str = "cubic-mean", + cubature_weights: NDArrayFloat | None = None ) -> NDArrayFloat: """Axial induction factor of the turbine incorporating the thrust coefficient and yaw angle. @@ -227,8 +381,16 @@ def axial_induction( Args: velocities (NDArrayFloat): The velocity field at each turbine; should be shape: (number of turbines, ngrid, ngrid), or (ngrid, ngrid) for a single turbine. - fCt (np.array): The thrust coefficient function for each + yaw_angle (NDArrayFloat[wd, ws, turbines]): The yaw angle for each turbine. + tilt_angle (NDArrayFloat[wd, ws, turbines]): The tilt angle for each turbine. + ref_tilt_cp_ct (NDArrayFloat[wd, ws, turbines]): The reference tilt angle for each turbine + that the Cp/Ct tables are defined at. + fCt (dict): The thrust coefficient interpolation functions for each turbine. Keys are + the turbine type string and values are the interpolation functions. + tilt_interp (Iterable[tuple]): The tilt interpolation functions for each turbine. + correct_cp_ct_for_tilt (NDArrayBool[wd, ws, turbines]): Boolean for determining if the + turbines Cp and Ct should be corrected for tilt. turbine_type_map: (NDArrayObject[wd, ws, turbines]): The Turbine type definition for each turbine. ix_filter (NDArrayFilter | Iterable[int] | None, optional): The boolean array, or @@ -242,20 +404,67 @@ def axial_induction( if isinstance(yaw_angle, list): yaw_angle = np.array(yaw_angle) + # TODO: Should the tilt_angle used for the return calculation be modified the same as the + # tilt_angle in Ct, if the user has supplied a tilt/wind_speed table? + if isinstance(tilt_angle, list): + tilt_angle = np.array(tilt_angle) + # Get Ct first before modifying any data - thrust_coefficient = Ct(velocities, yaw_angle, fCt, turbine_type_map, ix_filter) + thrust_coefficient = Ct( + velocities, + yaw_angle, + tilt_angle, + ref_tilt_cp_ct, + fCt, + tilt_interp, + correct_cp_ct_for_tilt, + turbine_type_map, + ix_filter, + average_method, + cubature_weights + ) # Then, process the input arguments as needed for this function ix_filter = _filter_convert(ix_filter, yaw_angle) if ix_filter is not None: yaw_angle = yaw_angle[:, :, ix_filter] + tilt_angle = tilt_angle[:, :, ix_filter] + ref_tilt_cp_ct = ref_tilt_cp_ct[:, :, ix_filter] + + return ( + 0.5 + / (cosd(yaw_angle) + * cosd(tilt_angle - ref_tilt_cp_ct)) + * ( + 1 - np.sqrt( + 1 - thrust_coefficient * cosd(yaw_angle) * cosd(tilt_angle - ref_tilt_cp_ct) + ) + ) + ) + + +def simple_mean(array, axis=0): + return np.mean(array, axis=axis) + +def cubic_mean(array, axis=0): + return np.cbrt(np.mean(array ** 3.0, axis=axis)) - return 0.5 / cosd(yaw_angle) * (1 - np.sqrt(1 - thrust_coefficient * cosd(yaw_angle))) +def simple_cubature(array, cubature_weights, axis=0): + weights = cubature_weights.flatten() + weights = weights * len(weights) / np.sum(weights) + product = (array * weights[None, None, None, :, None]) + return simple_mean(product, axis) +def cubic_cubature(array, cubature_weights, axis=0): + weights = cubature_weights.flatten() + weights = weights * len(weights) / np.sum(weights) + return np.cbrt(np.mean((array**3.0 * weights[None, None, None, :, None]), axis=axis)) def average_velocity( velocities: NDArrayFloat, - ix_filter: NDArrayFilter | Iterable[int] | None = None + ix_filter: NDArrayFilter | Iterable[int] | None = None, + method: str = "cubic-mean", + cubature_weights: NDArrayFloat | None = None ) -> NDArrayFloat: """This property calculates and returns the cube root of the mean cubed velocity in the turbine's rotor swept area (m/s). @@ -272,26 +481,41 @@ def average_velocity( Returns: NDArrayFloat: The average velocity across the rotor(s). """ - # Remove all invalid numbers from interpolation - # data = np.array(self.velocities)[~np.isnan(self.velocities)] # The input velocities are expected to be a 5 dimensional array with shape: # (# wind directions, # wind speeds, # turbines, grid resolution, grid resolution) if ix_filter is not None: velocities = velocities[:, :, ix_filter] + axis = tuple([3 + i for i in range(velocities.ndim - 3)]) - return np.cbrt(np.mean(velocities ** 3, axis=axis)) + if method == "simple-mean": + return simple_mean(velocities, axis) + + elif method == "cubic-mean": + return cubic_mean(velocities, axis) + elif method == "simple-cubature": + if cubature_weights is None: + raise ValueError("cubature_weights is required for 'simple-cubature' method.") + return simple_cubature(velocities, cubature_weights, axis) + + elif method == "cubic-cubature": + if cubature_weights is None: + raise ValueError("cubature_weights is required for 'cubic-cubature' method.") + return cubic_cubature(velocities, cubature_weights, axis) + + else: + raise ValueError("Incorrect method given.") @define class PowerThrustTable(FromDictMixin): """Helper class to convert the dictionary and list-based inputs to a object of arrays. Args: - power (NDArrayFloat): The power produced at a given windspeed. - thrust (NDArrayFloat): The thrust at a given windspeed. - wind_speed (NDArrayFloat): Windspeed values, m/s. + power (NDArrayFloat): The power produced at a given wind speed. + thrust (NDArrayFloat): The thrust at a given wind speed. + wind_speed (NDArrayFloat): Wind speed values, m/s. Raises: ValueError: Raised if the power, thrust, and wind_speed are not all 1-d array-like shapes. @@ -314,9 +538,41 @@ def __attrs_post_init__(self) -> None: # Remove any duplicate wind speed entries _, duplicate_filter = np.unique(self.wind_speed, return_index=True) - object.__setattr__(self, "power", self.power[duplicate_filter]) - object.__setattr__(self, "thrust", self.thrust[duplicate_filter]) - object.__setattr__(self, "wind_speed", self.wind_speed[duplicate_filter]) + self.power = self.power[duplicate_filter] + self.thrust = self.thrust[duplicate_filter] + self.wind_speed = self.wind_speed[duplicate_filter] + + +@define +class TiltTable(FromDictMixin): + """Helper class to convert the dictionary and list-based inputs to a object of arrays. + + Args: + tilt (NDArrayFloat): The tilt angle at a given wind speed. + wind_speeds (NDArrayFloat): Wind speed values, m/s. + + Raises: + ValueError: Raised if tilt and wind_speeds are not all 1-d array-like shapes. + ValueError: Raised if tilt and wind_speeds don't have the same number of values. + """ + tilt: NDArrayFloat = field(converter=floris_array_converter) + wind_speeds: NDArrayFloat = field(converter=floris_array_converter) + + def __attrs_post_init__(self) -> None: + # Validate the power, thrust, and wind speed inputs. + + inputs = (self.tilt, self.wind_speeds) + + if any(el.ndim > 1 for el in inputs): + raise ValueError("tilt and wind_speed inputs must be 1-D.") + + if len({self.tilt.size, self.wind_speeds.size}) > 1: + raise ValueError("tilt and wind_speed tables must be the same size.") + + # Remove any duplicate wind speed entries + _, duplicate_filter = np.unique(self.wind_speeds, return_index=True) + self.tilt = self.tilt[duplicate_filter] + self.wind_speeds = self.wind_speeds[duplicate_filter] @define @@ -359,17 +615,18 @@ class Turbine(BaseClass): Defaults to 0.5. """ - turbine_type: str + turbine_type: str = field() rotor_diameter: float = field() - hub_height: float - pP: float - pT: float - TSR: float - generator_efficiency: float - ref_density_cp_ct: float + hub_height: float = field() + pP: float = field() + pT: float = field() + TSR: float = field() + generator_efficiency: float = field() + ref_density_cp_ct: float = field() + ref_tilt_cp_ct: float = field() power_thrust_table: PowerThrustTable = field(converter=PowerThrustTable.from_dict) - - + floating_tilt_table = field(default=None) + floating_correct_cp_ct_for_tilt = field(default=None) # rloc: float = float_attrib() # TODO: goes here or on the Grid? # use_points_on_perimeter: bool = bool_attrib() @@ -380,6 +637,7 @@ class Turbine(BaseClass): fCp_interp: interp1d = field(init=False) fCt_interp: interp1d = field(init=False) power_interp: interp1d = field(init=False) + tilt_interp: interp1d = field(init=False) # For the following parameters, use default values if not user-specified @@ -427,6 +685,24 @@ def __attrs_post_init__(self) -> None: bounds_error=False, ) + # If defined, create a tilt interpolation function for floating turbines. + # fill_value currently set to apply the min or max tilt angles if outside + # of the interpolation range. + if self.floating_tilt_table is not None: + self.floating_tilt_table = TiltTable.from_dict(self.floating_tilt_table) + self.fTilt_interp = interp1d( + self.floating_tilt_table.wind_speeds, + self.floating_tilt_table.tilt, + fill_value=(0.0, self.floating_tilt_table.tilt[-1]), + bounds_error=False, + ) + self.tilt_interp = self.fTilt_interp + self.correct_cp_ct_for_tilt = self.floating_correct_cp_ct_for_tilt + else: + self.fTilt_interp = None + self.tilt_interp = None + self.correct_cp_ct_for_tilt = False + @rotor_diameter.validator def reset_rotor_diameter_dependencies(self, instance: attrs.Attribute, value: float) -> None: """Resets the `rotor_radius` and `rotor_area` attributes.""" @@ -451,3 +727,35 @@ def reset_rotor_area(self, instance: attrs.Attribute, value: float) -> None: `rotor_diameter`, `rotor_radius` and `rotor_area`. """ self.rotor_radius = (value / np.pi) ** 0.5 + + @floating_tilt_table.validator + def check_floating_tilt_table(self, instance: attrs.Attribute, value: Any) -> None: + """ + Check that if the tile/wind_speed table is defined, that the tilt and + wind_speed arrays are the same length so that the interpolation will work. + """ + if self.floating_tilt_table is not None: + if ( + len(self.floating_tilt_table["tilt"]) + != len(self.floating_tilt_table["wind_speeds"]) + ): + raise ValueError( + "tilt and wind_speeds must be the same length for the interpolation to work." + ) + + @floating_correct_cp_ct_for_tilt.validator + def check_for_cp_ct_correct_flag_if_floating( + self, + instance: attrs.Attribute, + value: Any + ) -> None: + """ + Check that the boolean flag exists for correcting Cp/Ct for tilt + if a tile/wind_speed table is also defined. + """ + if self.floating_tilt_table is not None: + if self.floating_correct_cp_ct_for_tilt is None: + raise ValueError( + "If a floating tilt/wind_speed table is defined, the boolean flag" + "floating_correct_cp_ct_for_tilt must also be defined." + ) diff --git a/floris/simulation/wake.py b/floris/simulation/wake.py index becdb201a..a141c94be 100644 --- a/floris/simulation/wake.py +++ b/floris/simulation/wake.py @@ -22,13 +22,19 @@ SOSFS, ) from floris.simulation.wake_deflection import ( + EmpiricalGaussVelocityDeflection, GaussVelocityDeflection, JimenezVelocityDeflection, NoneVelocityDeflection, ) -from floris.simulation.wake_turbulence import CrespoHernandez, NoneWakeTurbulence +from floris.simulation.wake_turbulence import ( + CrespoHernandez, + NoneWakeTurbulence, + WakeInducedMixing, +) from floris.simulation.wake_velocity import ( CumulativeGaussCurlVelocityDeficit, + EmpiricalGaussVelocityDeficit, GaussVelocityDeficit, JensenVelocityDeficit, NoneVelocityDeficit, @@ -45,18 +51,21 @@ "deflection_model": { "jimenez": JimenezVelocityDeflection, "gauss": GaussVelocityDeflection, - "none": NoneVelocityDeflection + "none": NoneVelocityDeflection, + "empirical_gauss": EmpiricalGaussVelocityDeflection }, "turbulence_model": { "none": NoneWakeTurbulence, - "crespo_hernandez": CrespoHernandez + "crespo_hernandez": CrespoHernandez, + "wake_induced_mixing": WakeInducedMixing }, "velocity_model": { "none": NoneVelocityDeficit, "cc": CumulativeGaussCurlVelocityDeficit, "gauss": GaussVelocityDeficit, "jensen": JensenVelocityDeficit, - "turbopark": TurbOParkVelocityDeficit + "turbopark": TurbOParkVelocityDeficit, + "empirical_gauss": EmpiricalGaussVelocityDeficit }, } diff --git a/floris/simulation/wake_deflection/__init__.py b/floris/simulation/wake_deflection/__init__.py index 4fd07f268..62fba9ca5 100644 --- a/floris/simulation/wake_deflection/__init__.py +++ b/floris/simulation/wake_deflection/__init__.py @@ -13,6 +13,7 @@ # See https://floris.readthedocs.io for documentation +from floris.simulation.wake_deflection.empirical_gauss import EmpiricalGaussVelocityDeflection from floris.simulation.wake_deflection.gauss import GaussVelocityDeflection from floris.simulation.wake_deflection.jimenez import JimenezVelocityDeflection from floris.simulation.wake_deflection.none import NoneVelocityDeflection diff --git a/floris/simulation/wake_deflection/empirical_gauss.py b/floris/simulation/wake_deflection/empirical_gauss.py new file mode 100644 index 000000000..d4019efd6 --- /dev/null +++ b/floris/simulation/wake_deflection/empirical_gauss.py @@ -0,0 +1,152 @@ +# Copyright 2021 NREL + +# Licensed under the Apache License, Version 2.0 (the "License"); you may not +# use this file except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. + +from typing import Any, Dict + +import numpy as np +from attrs import define, field + +from floris.simulation import ( + BaseModel, + Farm, + FlowField, + Grid, + Turbine, +) +from floris.utilities import cosd, sind + + +@define +class EmpiricalGaussVelocityDeflection(BaseModel): + """ + The Empirical Gauss deflection model is based on the form of previous the + Guass deflection model (see :cite:`bastankhah2016experimental` and + :cite:`King2019Controls`) but simplifies the formulation for simpler + tuning and more independence from the velocity deficit model. + + parameter_dictionary (dict): Model-specific parameters. + Default values are used when a parameter is not included + in `parameter_dictionary`. Possible key-value pairs include: + + - **horizontal_deflection_gain_D** (*float*): Gain for the + maximum (y-direction) deflection acheived far downstream + of a yawed turbine. + - **vertical_deflection_gain_D** (*float*): Gain for the + maximum vertical (z-direction) deflection acheived at a + far downstream location due to rotor tilt. Specifying as + -1 will mean that vertical deflections due to tilt match + horizontal deflections due to yaw. + - **deflection_rate** (*float*): Rate at which the + deflected wake center approaches its maximum deflection. + - **mixing_gain_deflection** (*float*): Gain to set the + reduction in deflection due to wake-induced mixing. + - **yaw_added_mixing_gain** (*float*): Sets the + contribution of turbine yaw misalignment to the mixing + in that turbine's wake (similar to yaw-added recovery). + + References: + .. bibliography:: /references.bib + :style: unsrt + :filter: docname in docnames + """ + horizontal_deflection_gain_D: float = field(default=3.0) + vertical_deflection_gain_D: float = field(default=-1) + deflection_rate: float = field(default=15) + mixing_gain_deflection: float = field(default=0.0) + yaw_added_mixing_gain: float = field(default=0.0) + + def prepare_function( + self, + grid: Grid, + flow_field: FlowField, + ) -> Dict[str, Any]: + + kwargs = { + "x": grid.x_sorted, + } + return kwargs + + # @profile + def function( + self, + x_i: np.ndarray, + y_i: np.ndarray, + yaw_i: np.ndarray, + tilt_i: np.ndarray, + mixing_i: np.ndarray, + ct_i: np.ndarray, + rotor_diameter_i: float, + *, + x: np.ndarray, + ): + """ + Calculates the deflection field of the wake. + + Args: + x_i (np.array): Streamwise direction grid coordinates of + the ith turbine (m). + y_i (np.array): Cross stream direction grid coordinates of + the ith turbine (m) [not used]. + yaw_i (np.array): Yaw angle of the ith turbine (deg). + tilt_i (np.array): Tilt angle of the ith turbine (deg). + mixing_i (np.array): The wake-induced mixing term for the + ith turbine. + ct_i (np.array): Thrust coefficient for the ith turbine (-). + rotor_diameter_i (np.array): Rotor diamter for the ith + turbine (m). + + x (np.array): Streamwise direction grid coordinates of the + flow field domain (m). + + Returns: + np.array: Deflection field for the wake. + """ + # ============================================================== + + deflection_gain_y = self.horizontal_deflection_gain_D * rotor_diameter_i + if self.vertical_deflection_gain_D == -1: + deflection_gain_z = deflection_gain_y + else: + deflection_gain_z = self.vertical_deflection_gain_D * rotor_diameter_i + + # Convert to radians, CW yaw for consistency with other models + yaw_r = np.pi/180 * -yaw_i + tilt_r = np.pi/180 * tilt_i + + A_y = (deflection_gain_y * ct_i * yaw_r) / (1 + self.mixing_gain_deflection * mixing_i) + A_z = (deflection_gain_z * ct_i * tilt_r) / (1 + self.mixing_gain_deflection * mixing_i) + + # Apply downstream mask in the process + x_normalized = (x - x_i) * np.array(x > x_i + 0.1) / rotor_diameter_i + + log_term = np.log( + (x_normalized - self.deflection_rate) / (x_normalized + self.deflection_rate) + + 2 + ) + + deflection_y = A_y * log_term + deflection_z = A_z * log_term + + return deflection_y, deflection_z + +def yaw_added_wake_mixing( + axial_induction_i, + yaw_angle_i, + downstream_distance_D_i, + yaw_added_mixing_gain +): + return ( + axial_induction_i[:,:,:,0,0] + * yaw_added_mixing_gain + * (1 - cosd(yaw_angle_i[:,:,:,0,0])) + / downstream_distance_D_i**2 + ) diff --git a/floris/simulation/wake_deflection/gauss.py b/floris/simulation/wake_deflection/gauss.py index 6611ee8b1..e9f6ae0b8 100644 --- a/floris/simulation/wake_deflection/gauss.py +++ b/floris/simulation/wake_deflection/gauss.py @@ -218,7 +218,6 @@ def function( return deflection - ## GCH components def gamma( @@ -514,7 +513,6 @@ def yaw_added_turbulence_mixing( return I_mixing[:,:,None,None,None] - # def yaw_added_recovery_correction( # self, U_local, U, W, x_locations, y_locations, turbine, turbine_coord # ): diff --git a/floris/simulation/wake_turbulence/__init__.py b/floris/simulation/wake_turbulence/__init__.py index bde68bf6b..346bc15cb 100644 --- a/floris/simulation/wake_turbulence/__init__.py +++ b/floris/simulation/wake_turbulence/__init__.py @@ -15,3 +15,4 @@ from floris.simulation.wake_turbulence.crespo_hernandez import CrespoHernandez from floris.simulation.wake_turbulence.none import NoneWakeTurbulence +from floris.simulation.wake_turbulence.wake_induced_mixing import WakeInducedMixing diff --git a/floris/simulation/wake_turbulence/wake_induced_mixing.py b/floris/simulation/wake_turbulence/wake_induced_mixing.py new file mode 100644 index 000000000..9d57ee5aa --- /dev/null +++ b/floris/simulation/wake_turbulence/wake_induced_mixing.py @@ -0,0 +1,87 @@ +# Copyright 2021 NREL + +# Licensed under the Apache License, Version 2.0 (the "License"); you may not +# use this file except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. + +from typing import Any, Dict + +import numpy as np +from attrs import define, field + +from floris.simulation import ( + BaseModel, + Farm, + FlowField, + Grid, + Turbine, +) +from floris.utilities import cosd, sind + + +@define +class WakeInducedMixing(BaseModel): + """ + WakeInducedMixing is a model used to generalize wake-added turbulence + in the Empirical Gaussian wake model. It computes the contribution of each + turbine to a "wake-induced mixing" term that in turn is used in the + velocity deficit and deflection models. + + Args: + parameter_dictionary (dict): Model-specific parameters. + Default values are used when a parameter is not included + in `parameter_dictionary`. Possible key-value pairs include: + + - **atmospheric_ti_gain** (*float*): The contribution of ambient + turbulent intensity to the wake-induced mixing term. Currently + throws a warning if nonzero. + + References: + .. bibliography:: /references.bib + :style: unsrt + :filter: docname in docnames + """ + atmospheric_ti_gain: float = field(converter=float, default=0.0) + + def __attrs_post_init__(self) -> None: + if self.atmospheric_ti_gain != 0.0: + nonzero_err_msg = \ + "Running wake_induced_mixing model with mixing contributions"+\ + " from the atmospheric turbulence intensity has not been"+\ + " vetted. To avoid this warning, set atmospheric_ti_gain=0."+\ + " in the FLORIS input yaml." + self.logger.warning(nonzero_err_msg, stack_info=True) + + def prepare_function(self) -> dict: + pass + + def function( + self, + axial_induction_i: np.ndarray, + downstream_distance_D_i: np.ndarray, + ) -> None: + """ + Calculates the contribution of turbine i to all other turbines' + mixing terms. + + Args: + axial_induction_i (np.array): Axial induction factor of + the ith turbine (-). + downstream_distance_D_i (np.array): The distance downstream + from turbine i to all other turbines (specified in terms + of multiples of turbine i's rotor diameter) (D). + + Returns: + np.array: Components of the wake-induced mixing term due to + the ith turbine. + """ + + wake_induced_mixing = axial_induction_i[:,:,:,0,0] / downstream_distance_D_i**2 + + return wake_induced_mixing diff --git a/floris/simulation/wake_velocity/__init__.py b/floris/simulation/wake_velocity/__init__.py index 1f32cb195..f551f5be8 100644 --- a/floris/simulation/wake_velocity/__init__.py +++ b/floris/simulation/wake_velocity/__init__.py @@ -14,6 +14,7 @@ from floris.simulation.wake_velocity.cumulative_gauss_curl import CumulativeGaussCurlVelocityDeficit +from floris.simulation.wake_velocity.empirical_gauss import EmpiricalGaussVelocityDeficit from floris.simulation.wake_velocity.gauss import GaussVelocityDeficit from floris.simulation.wake_velocity.jensen import JensenVelocityDeficit from floris.simulation.wake_velocity.none import NoneVelocityDeficit diff --git a/floris/simulation/wake_velocity/empirical_gauss.py b/floris/simulation/wake_velocity/empirical_gauss.py new file mode 100644 index 000000000..7a4d344a8 --- /dev/null +++ b/floris/simulation/wake_velocity/empirical_gauss.py @@ -0,0 +1,294 @@ +# Copyright 2021 NREL + +# Licensed under the Apache License, Version 2.0 (the "License"); you may not +# use this file except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. + +from typing import Any, Dict + +import numexpr as ne +import numpy as np +from attrs import define, field + +from floris.simulation import ( + BaseModel, + Farm, + FlowField, + Grid, + Turbine, +) +from floris.simulation.wake_velocity.gauss import gaussian_function +from floris.utilities import ( + cosd, + sind, + tand, +) + + +@define +class EmpiricalGaussVelocityDeficit(BaseModel): + """ + The Empirical Gauss velocity model has a Gaussian profile + (see :cite:`bastankhah2016experimental` and + :cite:`King2019Controls`) throughout and expands in a (smoothed) + piecewise linear fashion. + + parameter_dictionary (dict): Model-specific parameters. + Default values are used when a parameter is not included + in `parameter_dictionary`. Possible key-value pairs include: + + - **wake_expansion_rates** (*list*): List of expansion + rates for the Gaussian wake width. Must be of length 1 + or greater. + - **breakpoints_D** (*list*): List of downstream + locations, specified in terms of rotor diameters, where + the expansion rates go into effect. Must be one element + shorter than wake_expansion_rates. May be empty. + - **sigma_0_D** (*float*): Initial width of the Gaussian + wake at the turbine location, specified as a multiplier + of the rotor diameter. + - **smoothing_length_D** (*float*): Distance over which + the corners in the piece-wise linear wake expansion rate + are smoothed (specified as a multiplier of the rotor + diameter). + - **mixing_gain_deflection** (*float*): Gain to set the + increase in wake expansion due to wake-induced mixing. + + References: + .. bibliography:: /references.bib + :style: unsrt + :filter: docname in docnames + """ + wake_expansion_rates: list = field(default=[0.01, 0.005]) + breakpoints_D: list = field(default=[10]) + sigma_0_D: float = field(default=0.28) + smoothing_length_D: float = field(default=2.0) + mixing_gain_velocity: float = field(default=2.0) + + def prepare_function( + self, + grid: Grid, + flow_field: FlowField, + ) -> Dict[str, Any]: + + kwargs = { + "x": grid.x_sorted, + "y": grid.y_sorted, + "z": grid.z_sorted, + "wind_veer": flow_field.wind_veer + } + return kwargs + + def function( + self, + x_i: np.ndarray, + y_i: np.ndarray, + z_i: np.ndarray, + axial_induction_i: np.ndarray, + deflection_field_y_i: np.ndarray, + deflection_field_z_i: np.ndarray, + yaw_angle_i: np.ndarray, + tilt_angle_i: np.ndarray, + mixing_i: np.ndarray, + ct_i: np.ndarray, + hub_height_i: float, + rotor_diameter_i: np.ndarray, + # enforces the use of the below as keyword arguments and adherence to the + # unpacking of the results from prepare_function() + *, + x: np.ndarray, + y: np.ndarray, + z: np.ndarray, + wind_veer: float + ) -> None: + """ + Calculates the velocity deficits in the wake. + + Args: + x_i (np.array): Streamwise direction grid coordinates of + the ith turbine (m). + y_i (np.array): Cross stream direction grid coordinates of + the ith turbine (m). + z_i (np.array): Vertical direction grid coordinates of + the ith turbine (m) [not used]. + axial_induction_i (np.array): Axial induction factor of the + ith turbine (-) [not used]. + deflection_field_y_i (np.array): Horizontal wake deflections + due to the ith turbine's yaw misalignment (m). + deflection_field_z_i (np.array): Vertical wake deflections + due to the ith turbine's tilt angle (m). + yaw_angle_i (np.array): Yaw angle of the ith turbine (deg). + tilt_angle_i (np.array): Tilt angle of the ith turbine + (deg). + mixing_i (np.array): The wake-induced mixing term for the + ith turbine. + ct_i (np.array): Thrust coefficient for the ith turbine (-). + hub_height_i (float): Hub height for the ith turbine (m). + rotor_diameter_i (np.array): Rotor diameter for the ith + turbine (m). + + x (np.array): Streamwise direction grid coordinates of the + flow field domain (m). + y (np.array): Cross stream direction grid coordinates of the + flow field domain (m). + z (np.array): Vertical direction grid coordinates of the + flow field domain (m). + wind_veer (np.array): Wind veer (deg). + + Returns: + np.array: Velocity deficits (-). + """ + + include_mirror_wake = True # Could add this as a user preference. + + # Only symmetric terms using yaw, but keep for consistency + yaw_angle = -1 * yaw_angle_i + + # Initial wake widths + sigma_y0 = self.sigma_0_D * rotor_diameter_i * cosd(yaw_angle) + sigma_z0 = self.sigma_0_D * rotor_diameter_i * cosd(tilt_angle_i) + + # No specific near, far wakes in this model + downstream_mask = np.array(x > x_i + 0.1) + upstream_mask = np.array(x < x_i - 0.1) + + # Wake expansion in the lateral (y) and the vertical (z) + # TODO: could compute shared components in sigma_z, sigma_y + # with one function call. + sigma_y = empirical_gauss_model_wake_width( + x - x_i, + self.wake_expansion_rates, + [b * rotor_diameter_i for b in self.breakpoints_D], # .flatten()[0] + sigma_y0, + self.smoothing_length_D * rotor_diameter_i, + self.mixing_gain_velocity * mixing_i, + ) + sigma_y[upstream_mask] = \ + np.tile(sigma_y0, np.shape(sigma_y)[2:])[upstream_mask] + + sigma_z = empirical_gauss_model_wake_width( + x - x_i, + self.wake_expansion_rates, + [b * rotor_diameter_i for b in self.breakpoints_D], # .flatten()[0] + sigma_z0, + self.smoothing_length_D * rotor_diameter_i, + self.mixing_gain_velocity * mixing_i, + ) + sigma_z[upstream_mask] = \ + np.tile(sigma_z0, np.shape(sigma_z)[2:])[upstream_mask] + + # 'Standard' wake component + r, C = rCalt( + wind_veer, + sigma_y, + sigma_z, + y, + y_i, + deflection_field_y_i, + deflection_field_z_i, + z, + hub_height_i, + ct_i, + yaw_angle, + tilt_angle_i, + rotor_diameter_i, + sigma_y0, + sigma_z0 + ) + # Normalize to match end of actuator disk model tube + C = C / (8 * self.sigma_0_D**2 ) + + wake_deficit = gaussian_function(C, r, 1, np.sqrt(0.5)) + + if include_mirror_wake: + # TODO: speed up this option by calculating various elements in + # rCalt only once. + # Mirror component + r_mirr, C_mirr = rCalt( + wind_veer, # TODO: Is veer OK with mirror wakes? + sigma_y, + sigma_z, + y, + y_i, + deflection_field_y_i, + deflection_field_z_i, + z, + -hub_height_i, # Turbine at negative hub height location + ct_i, + yaw_angle, + tilt_angle_i, + rotor_diameter_i, + sigma_y0, + sigma_z0 + ) + # Normalize to match end of acuator disk model tube + C_mirr = C_mirr / (8 * self.sigma_0_D**2) + + # ASSUME sum-of-squares superposition for the real and mirror wakes + wake_deficit = np.sqrt( + wake_deficit**2 + + gaussian_function(C_mirr, r_mirr, 1, np.sqrt(0.5))**2 + ) + + velocity_deficit = wake_deficit * downstream_mask + + return velocity_deficit + +def rCalt(wind_veer, sigma_y, sigma_z, y, y_i, delta_y, delta_z, z, HH, Ct, + yaw, tilt, D, sigma_y0, sigma_z0): + + ## Numexpr + wind_veer = np.deg2rad(wind_veer) + a = ne.evaluate( + "cos(wind_veer) ** 2 / (2 * sigma_y ** 2) + sin(wind_veer) ** 2 / (2 * sigma_z ** 2)" + ) + b = ne.evaluate( + "-sin(2 * wind_veer) / (4 * sigma_y ** 2) + sin(2 * wind_veer) / (4 * sigma_z ** 2)" + ) + c = ne.evaluate( + "sin(wind_veer) ** 2 / (2 * sigma_y ** 2) + cos(wind_veer) ** 2 / (2 * sigma_z ** 2)" + ) + r = ne.evaluate( + "a * ( (y - y_i - delta_y) ** 2) - "+\ + "2 * b * (y - y_i - delta_y) * (z - HH - delta_z) + "+\ + "c * ((z - HH - delta_z) ** 2)" + ) + d = 1 - Ct * (sigma_y0 * sigma_z0)/(sigma_y * sigma_z) * cosd(yaw) * cosd(tilt) + C = ne.evaluate("1 - sqrt(d)") + return r, C + +def sigmoid_integral(x, center=0, width=1): + y = np.zeros_like(x) + #TODO: Can this be made faster? + above_smoothing_zone = (x-center) > width/2 + y[above_smoothing_zone] = (x-center)[above_smoothing_zone] + in_smoothing_zone = ((x-center) >= -width/2) & ((x-center) <= width/2) + z = ((x-center)/width + 0.5)[in_smoothing_zone] + if width.shape[0] > 1: # multiple turbine sizes + width = np.broadcast_to(width, x.shape)[in_smoothing_zone] + y[in_smoothing_zone] = (width*(z**6 - 3*z**5 + 5/2*z**4)).flatten() + return y + +def empirical_gauss_model_wake_width( + x, + wake_expansion_rates, + breakpoints, + sigma_0, + smoothing_length, + mixing_final, + ): + assert len(wake_expansion_rates) == len(breakpoints) + 1, \ + "Invalid combination of wake_expansion_rates and breakpoints." + + sigma = (wake_expansion_rates[0] + mixing_final) * x + sigma_0 + for ib, b in enumerate(breakpoints): + sigma += (wake_expansion_rates[ib+1] - wake_expansion_rates[ib]) * \ + sigmoid_integral(x, center=b, width=smoothing_length) + + return sigma diff --git a/floris/tools/floris_interface.py b/floris/tools/floris_interface.py index 6f1e84099..4e4cc352e 100644 --- a/floris/tools/floris_interface.py +++ b/floris/tools/floris_interface.py @@ -27,6 +27,7 @@ axial_induction, Ct, power, + rotor_effective_velocity, ) from floris.tools.cut_plane import CutPlane from floris.type_dec import NDArrayFloat @@ -40,8 +41,8 @@ class FlorisInterface(LoggerBase): methods on objects within FLORIS. Args: - configuration (:py:obj:`dict`): The Floris configuration dictarionary, JSON file, - or YAML file. The configuration should have the following inputs specified. + configuration (:py:obj:`dict`): The Floris configuration dictarionary or YAML file. + The configuration should have the following inputs specified. - **flow_field**: See `floris.simulation.flow_field.FlowField` for more details. - **farm**: See `floris.simulation.farm.Farm` for more details. - **turbine**: See `floris.simulation.turbine.Turbine` for more details. @@ -49,7 +50,7 @@ class FlorisInterface(LoggerBase): - **logging**: See `floris.simulation.floris.Floris` for more details. """ - def __init__(self, configuration: dict | str | Path, het_map=None): + def __init__(self, configuration: dict | str | Path): self.configuration = configuration if isinstance(self.configuration, (str, Path)): @@ -61,12 +62,6 @@ def __init__(self, configuration: dict | str | Path, het_map=None): else: raise TypeError("The Floris `configuration` must be of type 'dict', 'str', or 'Path'.") - # Store the heterogeneous map for use after reinitailization - self.het_map = het_map - # Assign the heterogeneous map to the flow field - # Needed for a direct call to fi.calculate_wake without fi.reinitialize - self.floris.flow_field.het_map = het_map - # If ref height is -1, assign the hub height if np.abs(self.floris.flow_field.reference_wind_height + 1.0) < 1.0e-6: self.assign_hub_height_to_ref_height() @@ -110,13 +105,12 @@ def assign_hub_height_to_ref_height(self): def copy(self): """Create an independent copy of the current FlorisInterface object""" - return FlorisInterface(self.floris.as_dict(), het_map=self.het_map) + return FlorisInterface(self.floris.as_dict()) def calculate_wake( self, yaw_angles: NDArrayFloat | list[float] | None = None, - # points: NDArrayFloat | list[float] | None = None, - # track_n_upstream_wakes: bool = False, + # tilt_angles: NDArrayFloat | list[float] | None = None, ) -> None: """ Wrapper to the :py:meth:`~.Farm.set_yaw_angles` and @@ -125,11 +119,6 @@ def calculate_wake( Args: yaw_angles (NDArrayFloat | list[float] | None, optional): Turbine yaw angles. Defaults to None. - points: (NDArrayFloat | list[float] | None, optional): The x, y, and z - coordinates at which the flow field velocity is to be recorded. Defaults - to None. - track_n_upstream_wakes (bool, optional): When *True*, will keep track of the - number of upstream wakes a turbine is experiencing. Defaults to *False*. """ if yaw_angles is None: @@ -142,6 +131,15 @@ def calculate_wake( ) self.floris.farm.yaw_angles = yaw_angles + # # TODO is this required? + # if tilt_angles is not None: + # self.floris.farm.tilt_angles = tilt_angles + # else: + # self.floris.farm.set_tilt_to_ref_tilt( + # self.floris.flow_field.n_wind_directions, + # self.floris.flow_field.n_wind_speeds + # ) + # Initialize solution space self.floris.initialize_domain() @@ -184,7 +182,6 @@ def reinitialize( self, wind_speeds: list[float] | NDArrayFloat | None = None, wind_directions: list[float] | NDArrayFloat | None = None, - # wind_layout: list[float] | NDArrayFloat | None = None, wind_shear: float | None = None, wind_veer: float | None = None, reference_wind_height: float | None = None, @@ -196,13 +193,9 @@ def reinitialize( layout_y: list[float] | NDArrayFloat | None = None, turbine_type: list | None = None, turbine_library_path: str | Path | None = None, - # turbine_id: list[str] | None = None, - # wtg_id: list[str] | None = None, - # with_resolution: float | None = None, solver_settings: dict | None = None, - time_series: bool | None = False, - layout: tuple[list[float], list[float]] | tuple[NDArrayFloat, NDArrayFloat] | None = None, - het_map=None, + time_series: bool = False, + heterogenous_inflow_config=None, ): # Export the floris object recursively as a dictionary floris_dict = self.floris.as_dict() @@ -226,17 +219,10 @@ def reinitialize( flow_field_dict["turbulence_intensity"] = turbulence_intensity if air_density is not None: flow_field_dict["air_density"] = air_density - if het_map is not None: - self.het_map = het_map + if heterogenous_inflow_config is not None: + flow_field_dict["heterogenous_inflow_config"] = heterogenous_inflow_config ## Farm - if layout is not None: - self.logger.warning( - "Use the `layout_x` and `layout_y` parameters in place of `layout` " - "because the `layout` parameter will be deprecated in 3.3." - ) - layout_x = layout[0] - layout_y = layout[1] if layout_x is not None: farm_dict["layout_x"] = layout_x if layout_y is not None: @@ -246,18 +232,14 @@ def reinitialize( if turbine_library_path is not None: farm_dict["turbine_library_path"] = turbine_library_path - if time_series: - flow_field_dict["time_series"] = True - else: - flow_field_dict["time_series"] = False + flow_field_dict["time_series"] = time_series ## Wake # if wake is not None: # self.floris.wake = wake - # if turbulence_intensity is not None: - # pass # TODO: this should be in the code, but maybe got skipped? # if turbulence_kinetic_energy is not None: # pass # TODO: not needed until GCH + if solver_settings is not None: floris_dict["solver"] = solver_settings @@ -266,8 +248,6 @@ def reinitialize( # Create a new instance of floris and attach to self self.floris = Floris.from_dict(floris_dict) - # Re-assign the hetergeneous inflow map to flow field - self.floris.flow_field.het_map = self.het_map def get_plane_of_points( self, @@ -276,7 +256,7 @@ def get_plane_of_points( ): """ Calculates velocity values through the - :py:meth:`~.FlowField.calculate_wake` method at points in plane + :py:meth:`FlorisInterface.calculate_wake` method at points in plane specified by inputs. Args: @@ -285,14 +265,18 @@ def get_plane_of_points( planar_coordinate (float, optional): Value of normal vector to slice through. Defaults to None. - Returns: - :py:class:`pandas.DataFrame`: containing values of x1, x2, u, v, w + :py:class:`pandas.DataFrame`: containing values of x1, x2, x3, u, v, w """ # Get results vectors - x_flat = self.floris.grid.x_sorted[0, 0].flatten() - y_flat = self.floris.grid.y_sorted[0, 0].flatten() - z_flat = self.floris.grid.z_sorted[0, 0].flatten() + if (normal_vector == "z"): + x_flat = self.floris.grid.x_sorted_inertial_frame[0, 0].flatten() + y_flat = self.floris.grid.y_sorted_inertial_frame[0, 0].flatten() + z_flat = self.floris.grid.z_sorted_inertial_frame[0, 0].flatten() + else: + x_flat = self.floris.grid.x_sorted[0, 0].flatten() + y_flat = self.floris.grid.y_sorted[0, 0].flatten() + z_flat = self.floris.grid.z_sorted[0, 0].flatten() u_flat = self.floris.flow_field.u_sorted[0, 0].flatten() v_flat = self.floris.flow_field.v_sorted[0, 0].flatten() w_flat = self.floris.flow_field.w_sorted[0, 0].flatten() @@ -423,7 +407,6 @@ def calculate_horizontal_plane( # Reset the fi object back to the turbine grid configuration self.floris = Floris.from_dict(floris_dict) - self.floris.flow_field.het_map = self.het_map # Run the simulation again for futher postprocessing (i.e. now we can get farm power) self.calculate_wake(yaw_angles=current_yaw_angles) @@ -502,7 +485,6 @@ def calculate_cross_plane( # Reset the fi object back to the turbine grid configuration self.floris = Floris.from_dict(floris_dict) - self.floris.flow_field.het_map = self.het_map # Run the simulation again for futher postprocessing (i.e. now we can get farm power) self.calculate_wake(yaw_angles=current_yaw_angles) @@ -581,7 +563,6 @@ def calculate_y_plane( # Reset the fi object back to the turbine grid configuration self.floris = Floris.from_dict(floris_dict) - self.floris.flow_field.het_map = self.het_map # Run the simulation again for futher postprocessing (i.e. now we can get farm power) self.calculate_wake(yaw_angles=current_yaw_angles) @@ -616,11 +597,8 @@ def get_turbine_powers(self) -> NDArrayFloat: ) turbine_powers = power( - air_density=self.floris.flow_field.air_density, ref_density_cp_ct=self.floris.farm.ref_density_cp_cts, - velocities=self.floris.flow_field.u, - yaw_angle=self.floris.farm.yaw_angles, - pP=self.floris.farm.pPs, + rotor_effective_velocities=self.turbine_effective_velocities, power_interp=self.floris.farm.turbine_power_interps, turbine_type_map=self.floris.farm.turbine_type_map, ) @@ -630,8 +608,14 @@ def get_turbine_Cts(self) -> NDArrayFloat: turbine_Cts = Ct( velocities=self.floris.flow_field.u, yaw_angle=self.floris.farm.yaw_angles, + tilt_angle=self.floris.farm.tilt_angles, + ref_tilt_cp_ct=self.floris.farm.ref_tilt_cp_cts, fCt=self.floris.farm.turbine_fCts, + tilt_interp=self.floris.farm.turbine_fTilts, + correct_cp_ct_for_tilt=self.floris.farm.correct_cp_ct_for_tilt, turbine_type_map=self.floris.farm.turbine_type_map, + average_method=self.floris.grid.average_method, + cubature_weights=self.floris.grid.cubature_weights, ) return turbine_Cts @@ -639,14 +623,43 @@ def get_turbine_ais(self) -> NDArrayFloat: turbine_ais = axial_induction( velocities=self.floris.flow_field.u, yaw_angle=self.floris.farm.yaw_angles, + tilt_angle=self.floris.farm.tilt_angles, + ref_tilt_cp_ct=self.floris.farm.ref_tilt_cp_cts, fCt=self.floris.farm.turbine_fCts, + tilt_interp=self.floris.farm.turbine_fTilts, + correct_cp_ct_for_tilt=self.floris.farm.correct_cp_ct_for_tilt, turbine_type_map=self.floris.farm.turbine_type_map, + average_method=self.floris.grid.average_method, + cubature_weights=self.floris.grid.cubature_weights, ) return turbine_ais @property def turbine_average_velocities(self) -> NDArrayFloat: - return average_velocity(velocities=self.floris.flow_field.u) + return average_velocity( + velocities=self.floris.flow_field.u, + method=self.floris.grid.average_method, + cubature_weights=self.floris.grid.cubature_weights + ) + + @property + def turbine_effective_velocities(self) -> NDArrayFloat: + rotor_effective_velocities = rotor_effective_velocity( + air_density=self.floris.flow_field.air_density, + ref_density_cp_ct=self.floris.farm.ref_density_cp_cts, + velocities=self.floris.flow_field.u, + yaw_angle=self.floris.farm.yaw_angles, + tilt_angle=self.floris.farm.tilt_angles, + ref_tilt_cp_ct=self.floris.farm.ref_tilt_cp_cts, + pP=self.floris.farm.pPs, + pT=self.floris.farm.pTs, + tilt_interp=self.floris.farm.turbine_fTilts, + correct_cp_ct_for_tilt=self.floris.farm.correct_cp_ct_for_tilt, + turbine_type_map=self.floris.farm.turbine_type_map, + average_method=self.floris.grid.average_method, + cubature_weights=self.floris.grid.cubature_weights + ) + return rotor_effective_velocities def get_turbine_TIs(self) -> NDArrayFloat: return self.floris.flow_field.turbulence_intensity_field @@ -915,10 +928,27 @@ def get_farm_AEP_wind_rose_class( wind_directions=wind_directions ) - return aep + def sample_flow_at_points(self, x: NDArrayFloat, y: NDArrayFloat, z: NDArrayFloat): + """ + Extract the wind speed at points in the flow. + + Args: + x (1DArrayFloat | list): x-locations of points where flow is desired. + y (1DArrayFloat | list): y-locations of points where flow is desired. + z (1DArrayFloat | list): z-locations of points where flow is desired. + + Returns: + 3DArrayFloat containing wind speed with dimensions + (# of wind directions, # of wind speeds, # of sample points) + """ + # Check that x, y, z are all the same length + if not len(x) == len(y) == len(z): + raise ValueError("x, y, and z must be the same size") + + return self.floris.solve_for_points(x, y, z) @property def layout_x(self): @@ -959,34 +989,6 @@ def get_turbine_layout(self, z=False): return xcoords, ycoords -def generate_heterogeneous_wind_map(speed_ups, x, y, z=None): - if z is not None: - # Compute the 3-dimensional interpolants for each wind diretion - # Linear interpolation is used for points within the user-defined area of values, - # while a nearest-neighbor interpolant is used for points outside that region - in_region = [ - LinearNDInterpolator(list(zip(x, y, z)), speed_up, fill_value=np.nan) - for speed_up in speed_ups - ] - out_region = [ - NearestNDInterpolator(list(zip(x, y, z)), speed_up) - for speed_up in speed_ups - ] - else: - # Compute the 2-dimensional interpolants for each wind diretion - # Linear interpolation is used for points within the user-defined area of values, - # while a nearest-neighbor interpolant is used for points outside that region - in_region = [ - LinearNDInterpolator(list(zip(x, y)), speed_up, fill_value=np.nan) - for speed_up in speed_ups - ] - out_region = [ - NearestNDInterpolator(list(zip(x, y)), speed_up) - for speed_up in speed_ups - ] - - return [in_region, out_region] - ## Functionality removed in v3 def set_rotor_diameter(self, rotor_diameter): diff --git a/floris/tools/optimization/legacy/scipy/cluster_turbines.py b/floris/tools/optimization/legacy/scipy/cluster_turbines.py index 2159d7f21..b402cd3b8 100644 --- a/floris/tools/optimization/legacy/scipy/cluster_turbines.py +++ b/floris/tools/optimization/legacy/scipy/cluster_turbines.py @@ -115,10 +115,7 @@ def determine_if_in_wake(xt, yt): # Get most downstream turbine is_downstream[ii] = not any( - [ - determine_if_in_wake(x_rot_srt[iii], y_rot_srt[iii]) - for iii in range(n_turbs) - ] + determine_if_in_wake(x_rot_srt[iii], y_rot_srt[iii]) for iii in range(n_turbs) ) # Determine which turbines are affected by this turbine ('ii') affecting_following_turbs = [ @@ -165,7 +162,7 @@ def determine_if_in_wake(xt, yt): cj = ci + 1 merged_column = False while cj < len(clusters): - if any([y in clusters[ci] for y in clusters[cj]]): + if any(y in clusters[ci] for y in clusters[cj]): # Merge clusters[ci] = np.hstack([clusters[ci], clusters[cj]]) clusters[ci] = np.array(np.unique(clusters[ci]), dtype=int) diff --git a/floris/tools/optimization/legacy/scipy/derive_downstream_turbines.py b/floris/tools/optimization/legacy/scipy/derive_downstream_turbines.py index b41b78b4a..e5e42da70 100644 --- a/floris/tools/optimization/legacy/scipy/derive_downstream_turbines.py +++ b/floris/tools/optimization/legacy/scipy/derive_downstream_turbines.py @@ -107,10 +107,7 @@ def determine_if_in_wake(xt, yt): return (yt < wake_profile_ub_turbii(xt)) & (yt > wake_profile_lb_turbii(xt)) is_downstream[ii] = not any( - [ - determine_if_in_wake(x_rot_srt[iii], y_rot_srt[iii]) - for iii in range(n_turbs) - ] + determine_if_in_wake(x_rot_srt[iii], y_rot_srt[iii]) for iii in range(n_turbs) ) if plot_lines: diff --git a/floris/tools/optimization/yaw_optimization/yaw_optimization_tools.py b/floris/tools/optimization/yaw_optimization/yaw_optimization_tools.py index 1d04977df..325637a81 100644 --- a/floris/tools/optimization/yaw_optimization/yaw_optimization_tools.py +++ b/floris/tools/optimization/yaw_optimization/yaw_optimization_tools.py @@ -108,10 +108,7 @@ def determine_if_in_wake(xt, yt): return (yt < wake_profile_ub_turbii(xt)) & (yt > wake_profile_lb_turbii(xt)) is_downstream[ii] = not any( - [ - determine_if_in_wake(x_rot_srt[iii], y_rot_srt[iii]) - for iii in range(n_turbs) - ] + determine_if_in_wake(x_rot_srt[iii], y_rot_srt[iii]) for iii in range(n_turbs) ) if plot_lines: diff --git a/floris/tools/optimization/yaw_optimization/yaw_optimizer_sr.py b/floris/tools/optimization/yaw_optimization/yaw_optimizer_sr.py index c84c10392..801c59312 100644 --- a/floris/tools/optimization/yaw_optimization/yaw_optimizer_sr.py +++ b/floris/tools/optimization/yaw_optimization/yaw_optimizer_sr.py @@ -14,16 +14,19 @@ import copy +import warnings from time import perf_counter as timerpc import numpy as np import pandas as pd +from floris.logging_manager import LoggerBase + # from .yaw_optimizer_scipy import YawOptimizationScipy from .yaw_optimization_base import YawOptimization -class YawOptimizationSR(YawOptimization): +class YawOptimizationSR(YawOptimization, LoggerBase): def __init__( self, fi, @@ -127,7 +130,11 @@ def _calc_powers_with_memory(self, yaw_angles_subset, use_memory=True): if use_memory: idx = (np.abs(yaw_angles_opt_subset - yaw_angles_subset) < 0.01).all(axis=2).all(axis=1) farm_powers[idx, :] = farm_power_opt_subset[idx, :] - print(f"Skipping {np.sum(idx)}/{len(idx)} calculations: already in memory.") + if self.print_progress: + self.logger.info( + "Skipping {:d}/{:d} calculations: already in memory.".format( + np.sum(idx), len(idx)) + ) else: idx = np.zeros(yaw_angles_subset.shape[0], dtype=bool) @@ -218,6 +225,8 @@ def optimize(self, print_progress=True): Find the yaw angles that maximize the power production for every wind direction, wind speed and turbulence intensity. """ + self.print_progress = print_progress + # For each pass, from front to back ii = 0 for Nii in range(len(self.Ny_passes)): @@ -225,7 +234,7 @@ def optimize(self, print_progress=True): for turbine_depth in range(self.nturbs): p = 100.0 * ii / (len(self.Ny_passes) * self.nturbs) ii += 1 - if print_progress: + if self.print_progress: print( f"[Serial Refine] Processing pass={Nii}, " f"turbine_depth={turbine_depth} ({p:.1f}%)" @@ -240,8 +249,17 @@ def optimize(self, print_progress=True): # Evaluate grid of yaw angles, get farm powers and find optimal solutions farm_powers = self._process_evaluation_grid() + # If farm powers contains any nans, then issue a warning + if np.any(np.isnan(farm_powers)): + err_msg = ( + "NaNs found in farm powers during SerialRefine " + "optimization routine. Proceeding to maximize over yaw " + "settings that produce valid powers." + ) + self.logger.warning(err_msg, stack_info=True) + # Find optimal solutions in new evaluation grid - args_opt = np.expand_dims(np.argmax(farm_powers, axis=0), axis=0) + args_opt = np.expand_dims(np.nanargmax(farm_powers, axis=0), axis=0) farm_powers_opt_new = np.squeeze( np.take_along_axis(farm_powers, args_opt, axis=0), axis=0, diff --git a/floris/tools/parallel_computing_interface.py b/floris/tools/parallel_computing_interface.py index ffbfaade9..600228a87 100644 --- a/floris/tools/parallel_computing_interface.py +++ b/floris/tools/parallel_computing_interface.py @@ -12,17 +12,15 @@ def _load_local_floris_object( fi_dict, - het_map=None, unc_pmfs=None, fix_yaw_in_relative_frame=False ): # Load local FLORIS object if unc_pmfs is None: - fi = FlorisInterface(fi_dict, het_map=het_map) + fi = FlorisInterface(fi_dict) else: fi = UncertaintyInterface( fi_dict, - het_map=het_map, unc_pmfs=unc_pmfs, fix_yaw_in_relative_frame=fix_yaw_in_relative_frame, ) @@ -217,7 +215,7 @@ def _preprocessing(self, yaw_angles=None): # Prepare lightweight data to pass along if isinstance(self.fi, FlorisInterface): - fi_information = (fi_dict_split, self.fi.het_map, None, None) + fi_information = (fi_dict_split, None, None) else: fi_information = ( fi_dict_split, diff --git a/floris/tools/plotting.py b/floris/tools/plotting.py deleted file mode 100644 index c41adda63..000000000 --- a/floris/tools/plotting.py +++ /dev/null @@ -1,362 +0,0 @@ -# Copyright 2021 NREL - -# Licensed under the Apache License, Version 2.0 (the "License"); you may not -# use this file except in compliance with the License. You may obtain a copy of -# the License at http://www.apache.org/licenses/LICENSE-2.0 - -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations under -# the License. - -# See https://floris.readthedocs.io for documentation - - -import matplotlib.pyplot as plt -import numpy as np -import pandas as pd -import seaborn as sns - - -class PlotDefaults: - """ - This class sets journal-ready styles for plots. - """ - - def __init__(self): - - sns.set_style("ticks") - sns.set_context("paper", font_scale=1.5) - - # color palette from colorbrewer (up to 4 colors, good for print and black&white printing) - # color_brewer_palette = ['#e66101', '#5e3c99', '#fdb863', '#b2abd2'] - - # most journals: 300dpi - plt.rcParams["savefig.dpi"] = 300 - - # most journals: 9 cm (or 3.5 inch) for single column width and - # 18.5 cm (or 7.3 inch) for double column width. - plt.rcParams["figure.autolayout"] = False - plt.rcParams["figure.figsize"] = 7.3, 4 - plt.rcParams["axes.labelsize"] = 16 - plt.rcParams["axes.titlesize"] = 16 - plt.rcParams["xtick.labelsize"] = 16 - plt.rcParams["ytick.labelsize"] = 16 - plt.rcParams["font.size"] = 32 - plt.rcParams["lines.linewidth"] = 2.0 - plt.rcParams["lines.markersize"] = 8 - plt.rcParams["legend.fontsize"] = 14 - - -def data_plot( - x, - y, - color="b", - label="_nolegend_", - x_bins=None, - x_radius=None, - ax=None, - show_scatter=True, - show_bin_points=True, - show_confidence=True, - min_vals=1, - seaborn=False, - show_80=False, -): - """ - Plot data to a single axis (no subfigrures). Method includes flags - to provide additional statistical context in plot (e.g. scatter, - confidnece, etc.) - - Args: - x (np.array): abscissa data. - y (np.array): ordinate data. - color (str, optional): line color. - Defaults to 'b'. - label (str, optional): line label used in legend. - Defaults to '_nolegend_'. - x_bins (np.array, optional): bin limits for abscissa data. - Defaults to None. - x_radius (float, optional): bin width. - Defaults to None. - ax (:py:class:`matplotlib.pyplot.axes`, optional): - axes handle for plotting. Defaults to None. - show_scatter (bool, optional): flag to control scatter plot. - Defaults to True. - show_bin_points (bool, optional): flag to control plot of bins. - Defaults to True. - show_confidence (bool, optional): flag to control plot of - confidence interval. Defaults to True. - min_vals (int, optional): minimum number of values required to - merit plotting. Defaults to 1. - seaborn (bool, optional): flag to control plotting library. - Defaults to False. - show_80 (bool, optional): flag to control plot of points above - the 80th percentile. Defaults to False. - #TODO generalize to show_percentile? - - Returns: - Only returns values if `show_confidence` flag is active (True), - otherwise returns (np.nan). - - x_bins (np.array): bin limits - median_vals (np.array): median values of data in bins - lower (np.array): lower limit of data in bins - upper (np.array): upper limit of data in bins - """ - if (not ax) and (not seaborn): - fig, ax = plt.subplots() - - if seaborn: - show_bin_points = False - show_scatter = False - - df = pd.DataFrame({"x": x, "y": y}) - - if df.shape[0] > 0: - - # If bins not provided, just use ints - if x_bins is None: - x_bins = np.arange(df["x"].astype(int).min(), df["x"].astype(int).max(), 1) - - # if no radius provided, use bins to determine - if x_radius is None: - x_radius = (x_bins[1] - x_bins[0]) / 2.0 - - # now loop over bins and determine stats - median_vals = np.zeros_like(x_bins) * np.nan - # median_vals = np.zeros_like(x_bins) * np.nan - count_vals = np.zeros_like(x_bins) * np.nan - lower = np.zeros_like(x_bins) * np.nan - upper = np.zeros_like(x_bins) * np.nan - vals_80_up = np.zeros_like(x_bins) * np.nan - vals_80_down = np.zeros_like(x_bins) * np.nan - # p_down_vals = np.zeros_like(x_bins) * np.nan - - for x_idx, x_cent in enumerate(x_bins): - - df_sub = df[(df.x >= x_cent - x_radius) & (df.x <= x_cent + x_radius)] - - # TODO this conditional statement contains a lot of stuff to be cleaned up. - # Why all the commented content? - if df_sub.shape[0] > min_vals: - - # Get statistics via bootstrapping - n_bs = 40 - boot_frac = 1.0 - med_array = np.zeros(n_bs) - for i_bs in range(n_bs): - # Random subset the df - df_rand = df_sub.sample(frac=boot_frac, replace=True) - # med_array[i_bs] = np.median(df_rand.y) - med_array[i_bs] = np.mean(df_rand.y) - - # median_vals[x_idx] = np.nanmedian(df_sub.y) - median_vals[x_idx] = np.mean(df_sub.y) - vals_80_down[x_idx], vals_80_up[x_idx] = np.percentile( - df_sub.y, [50 + 0.5 * 80.0, 50 - 0.5 * 80.0] - ) - # mean_vals[x_idx] = np.median(ratio_array) - count_vals[x_idx] = df_sub.shape[0] - # ci_vals[x_idx] = ( - # scipy.stats.sem(ratio_array, ddof=1) * 1.96 - # # df_sub.y.apply(lambda x: scipy.stats.sem(x, ddof=1) * 1.96) - # ) - # p_up_vals[x_idx] = p_up_func(ratio_array)# df_sub.y.apply(p_up_func) - # p_down_vals[x_idx] = p_down_func(ratio_array)#df_sub.y.apply(p_down_func) - # Get the confidence bounds - confidence = 95 - conf_bounds = [50 + 0.5 * confidence, 50 - 0.5 * confidence] - # lower[x_idx], upper[x_idx] = ( - # 2 - # * med_vals[x_idx] - # - np.percentile(med_array, conf_bounds) - # ) - lower[x_idx], upper[x_idx] = np.percentile(med_array, conf_bounds) - - # # Plot the underlying points - if show_scatter: - ax.scatter( - df["x"], - df["y"], - color=color, - label="_nolegend_", - alpha=1.0, - s=35, - marker=".", - ) - if show_bin_points: - ax.scatter( - x_bins, - median_vals, - color=color, - s=count_vals, - label="_nolegend_", - alpha=0.6, - marker="s", - ) - if show_80: - ax.plot(x_bins, vals_80_down, "--", color=color, label="_nolegend_") - ax.plot(x_bins, vals_80_up, "--", color=color, label="_nolegend_") - - # Plot the main trend - if not seaborn: - ax.plot(x_bins, median_vals, label=label, color=color) - else: - plt.plot(x_bins, median_vals, label=label, color=color) - - if show_confidence: - if not seaborn: - ax.fill_between( - x_bins, lower, upper, alpha=0.2, color=color, label="_nolegend_" - ) - else: - plt.fill_between( - x_bins, lower, upper, alpha=0.2, color=color, label="_nolegend_" - ) - - return x_bins, median_vals, lower, upper - - else: - ax.plot(0, 0, label=label, color=color) - - return np.nan, np.nan, np.nan, np.nan - - -def stacked_plot(x, groups, x_bins, ax, color_array=None): - """ - Plot stacked histograms of data according to specified groups. - - Args: - x (np.array): abscissa data. - groups (list): groups of data provided by pd.Groupby() - #TODO right? - x_bins (np.array, optional): bin limits for abscissa data. - Defaults to None. - ax (:py:class:`matplotlib.pyplot.axes`, optional): - axes handle for plotting. Defaults to None. - color_array (list, optional): list of color specifiers. - Defaults to None. - """ - - x_radius = (x_bins[1] - x_bins[0]) / 2.0 - - # ind = np.arange(len(x_bins)) - - group_vals = np.unique(groups) - num_groups = len(group_vals) - - p_array = np.zeros((num_groups, len(x_bins))) - - for x_idx, x_cent in enumerate(x_bins): - - x_mask = (x >= x_cent - x_radius) & (x < x_cent + x_radius) - - # y_bin = y[x_mask] - g_bin = groups[x_mask] - num_points = len(g_bin) - - if num_points > 0: - for g_idx, g in enumerate(group_vals): - p_array[g_idx, x_idx] = np.sum(g_bin == g) # / float(num_points) - p = [] - - if color_array is not None: - p.append( - ax.bar(x_bins, p_array[0, :], width=x_radius * 1.5, color=color_array[0]) - ) - else: - p.append(ax.bar(x_bins, p_array[0, :], width=x_radius * 1.5)) - - for g_idx in range(1, num_groups): - if color_array is not None: - p.append( - ax.bar( - x_bins, - p_array[g_idx, :], - bottom=p_array[g_idx - 1, :], - width=x_radius * 1.5, - color=color_array[g_idx], - ) - ) - else: - p.append( - ax.bar( - x_bins, - p_array[g_idx, :], - bottom=p_array[g_idx - 1, :], - width=x_radius * 1.5, - ) - ) - # ax.set_xticks(ind,x_bins) - ax.legend(group_vals) - # return group_vals,p_array - - -def stacked_percent_plot(x, groups, x_bins, ax, color_array=None): - """ - Plot stacked percentage plot (normalized stacked histogram) - according to specified groups. - - Args: - x (np.array): abscissa data. - groups (list): groups of data provided by pd.Groupby() - #TODO right? - x_bins (np.array, optional): bin limits for abscissa data. - Defaults to None. - ax (:py:class:`matplotlib.pyplot.axes`, optional): - axes handle for plotting. Defaults to None. - color_array (list, optional): list of color specifiers. - Defaults to None. - """ - x_radius = (x_bins[1] - x_bins[0]) / 2.0 - # ind = np.arange(len(x_bins)) - - group_vals = np.unique(groups) - num_groups = len(group_vals) - - p_array = np.zeros((num_groups, len(x_bins))) - - for x_idx, x_cent in enumerate(x_bins): - - x_mask = (x >= x_cent - x_radius) & (x < x_cent + x_radius) - - # y_bin = y[x_mask] - g_bin = groups[x_mask] - num_points = len(g_bin) - - if num_points > 0: - for g_idx, g in enumerate(group_vals): - p_array[g_idx, x_idx] = np.sum(g_bin == g) / float(num_points) - p = [] - - if color_array is not None: - p.append( - ax.bar(x_bins, p_array[0, :], width=x_radius * 1.5, color=color_array[0]) - ) - else: - p.append(ax.bar(x_bins, p_array[0, :], width=x_radius * 1.5)) - for g_idx in range(1, num_groups): - if color_array is not None: - p.append( - ax.bar( - x_bins, - p_array[g_idx, :], - bottom=p_array[g_idx - 1, :], - width=x_radius * 1.5, - color=color_array[g_idx], - ) - ) - else: - p.append( - ax.bar( - x_bins, - p_array[g_idx, :], - bottom=p_array[g_idx - 1, :], - width=x_radius * 1.5, - ) - ) - # ax.set_xticks(ind,x_bins) - ax.legend(group_vals, bbox_to_anchor=(1.0, 1.0)) - # return group_vals,p_array diff --git a/floris/tools/uncertainty_interface.py b/floris/tools/uncertainty_interface.py index 82db14d0e..b57685ac0 100644 --- a/floris/tools/uncertainty_interface.py +++ b/floris/tools/uncertainty_interface.py @@ -26,7 +26,6 @@ class UncertaintyInterface(LoggerBase): def __init__( self, configuration, - het_map=None, unc_options=None, unc_pmfs=None, fix_yaw_in_relative_frame=False, @@ -39,7 +38,7 @@ def __init__( Args: configuration (:py:obj:`dict` or FlorisInterface object): The Floris - object, configuration dictarionary, JSON file, or YAML file. The + object, configuration dictarionary, or YAML file. The configuration should have the following inputs specified. - **flow_field**: See `floris.simulation.flow_field.FlowField` for more details. - **farm**: See `floris.simulation.farm.Farm` for more details. @@ -110,7 +109,7 @@ def __init__( if isinstance(configuration, FlorisInterface): self.fi = configuration else: - self.fi = FlorisInterface(configuration, het_map=het_map) + self.fi = FlorisInterface(configuration) self.reinitialize_uncertainty( unc_options=unc_options, @@ -335,7 +334,6 @@ def reinitialize( reference_wind_height=None, turbulence_intensity=None, air_density=None, - layout=None, layout_x=None, layout_y=None, turbine_type=None, @@ -345,14 +343,6 @@ def reinitialize( to directly replace a FlorisInterface object with this UncertaintyInterface object, this function is required.""" - if layout is not None: - self.logger.warning( - "Use the `layout_x` and `layout_y` parameters in place of `layout` " - "because the `layout` parameter will be deprecated in 3.3." - ) - layout_x = layout[0] - layout_y = layout[1] - # Just passes arguments to the floris object self.fi.reinitialize( wind_speeds=wind_speeds, diff --git a/floris/tools/visualization.py b/floris/tools/visualization.py index 178ad17e5..529e9f8da 100644 --- a/floris/tools/visualization.py +++ b/floris/tools/visualization.py @@ -22,11 +22,12 @@ import numpy as np import pandas as pd from matplotlib import rcParams +from scipy.spatial import ConvexHull from floris.simulation import Floris from floris.tools.cut_plane import CutPlane from floris.tools.floris_interface import FlorisInterface -from floris.utilities import rotate_coordinates_rel_west +from floris.utilities import rotate_coordinates_rel_west, wind_delta def show_plots(): @@ -39,7 +40,7 @@ def plot_turbines( yaw_angles, rotor_diameters, color: str | None = None, - wind_direction: float = 270.0 + wind_direction: float = 270.0, ): """ Plot wind plant layout from turbine locations. @@ -56,8 +57,9 @@ def plot_turbines( if color is None: color = "k" + # Rotate layout to inertial frame for plotting turbines relative to wind direction coordinates_array = np.array([[x, y, 0.0] for x, y in list(zip(layout_x, layout_y))]) - layout_x, layout_y, _ = rotate_coordinates_rel_west( + layout_x, layout_y, _, _, _ = rotate_coordinates_rel_west( np.array([wind_direction]), coordinates_array ) @@ -71,27 +73,40 @@ def plot_turbines( ax.plot([x_0, x_1], [y_0, y_1], color=color) -def plot_turbines_with_fi(fi: FlorisInterface, ax=None, color=None, yaw_angles=None): +def plot_turbines_with_fi( + fi: FlorisInterface, + ax=None, + color=None, + wd=None, + yaw_angles=None, +): """ Wrapper function to plot turbines which extracts the data from a FLORIS interface object Args: - fi (:py:class:`floris.tools.flow_data.FlowData`): - FlowData object. - ax (:py:class:`matplotlib.pyplot.axes`): figure axes. - color (str, optional): Color to plot turbines + fi (:py:class:`floris.tools.floris_interface.FlorisInterface`): FlorisInterface object. + ax (:py:class:`matplotlib.pyplot.axes`): Figure axes. Defaults to None. + color (str, optional): Color to plot turbines. Defaults to None. + wd (list, optional): The wind direction to plot the turbines relative to. Defaults to None. + yaw_angles (NDArray, optional): The yaw angles for the turbines. Defaults to None. """ if not ax: fig, ax = plt.subplots() if yaw_angles is None: yaw_angles = fi.floris.farm.yaw_angles + if wd is None: + wd = fi.floris.flow_field.wind_directions[0] + + # Rotate yaw angles to inertial frame for plotting turbines relative to wind direction + yaw_angles = yaw_angles - wind_delta(np.array(wd)) + plot_turbines( ax, fi.layout_x, fi.layout_y, - yaw_angles[0, 0], - fi.floris.farm.rotor_diameters[0, 0], + yaw_angles.flatten(), + fi.floris.farm.rotor_diameters.flatten(), color=color, wind_direction=fi.floris.flow_field.wind_directions[0], ) @@ -109,12 +124,14 @@ def add_turbine_id_labels(fi: FlorisInterface, ax: plt.Axes, **kwargs): fi (FlorisInterface): Simulation object to get the layout and index information. ax (plt.Axes): Axes object to add the labels. """ + + # Rotate layout to inertial frame for plotting turbines relative to wind direction coordinates_array = np.array([ [x, y, 0.0] for x, y in list(zip(fi.layout_x, fi.layout_y)) ]) wind_direction = fi.floris.flow_field.wind_directions[0] - layout_x, layout_y, _ = rotate_coordinates_rel_west( + layout_x, layout_y, _, _, _ = rotate_coordinates_rel_west( np.array([wind_direction]), coordinates_array ) @@ -148,15 +165,18 @@ def line_contour_cut_plane(cut_plane, ax=None, levels=None, colors=None, **kwarg if not ax: fig, ax = plt.subplots() - # Reshape UMesh internally - x1_mesh = cut_plane.df.x1.values.reshape(cut_plane.resolution[1], cut_plane.resolution[0]) - x2_mesh = cut_plane.df.x2.values.reshape(cut_plane.resolution[1], cut_plane.resolution[0]) - u_mesh = cut_plane.df.u.values.reshape(cut_plane.resolution[1], cut_plane.resolution[0]) - Zm = np.ma.masked_where(np.isnan(u_mesh), u_mesh) rcParams["contour.negative_linestyle"] = "solid" # Plot the cut-through - contours = ax.contour(x1_mesh, x2_mesh, Zm, levels=levels, colors=colors, **kwargs) + contours = ax.tricontour( + cut_plane.df.x1, + cut_plane.df.x2, + cut_plane.df.u, + levels=levels, + colors=colors, + extend="both", + **kwargs, + ) ax.clabel(contours, contours.levels, inline=True, fontsize=10, colors="black") @@ -172,6 +192,7 @@ def visualize_cut_plane( max_speed=None, cmap="coolwarm", levels=None, + clevels=None, color_bar=False, title="", **kwargs @@ -182,14 +203,24 @@ def visualize_cut_plane( Args: cut_plane (:py:class:`~.tools.cut_plane.CutPlane`): 2D plane through wind plant. - ax (:py:class:`matplotlib.pyplot.axes`): Figure axes. Defaults + ax (:py:class:`matplotlib.pyplot.axes`, optional): Figure axes. Defaults to None. + vel_component (str, optional): The velocity component that the cut plane is + perpendicular to. min_speed (float, optional): Minimum value of wind speed for contours. Defaults to None. max_speed (float, optional): Maximum value of wind speed for contours. Defaults to None. cmap (str, optional): Colormap specifier. Defaults to 'coolwarm'. + levels (np.array, optional): Contour levels for line contour plot. + Defaults to None. + clevels (np.array, optional): Contour levels for tricontourf plot. + Defaults to None. + color_bar (Boolean, optional): Flag to include a color bar on the plot. + Defaults to False. + title (str, optional): User-supplied title for the plot. Defaults to "". + **kwargs: Additional parameters to pass to line contour plot. Returns: im (:py:class:`matplotlib.plt.pcolormesh`): Image handle. @@ -197,39 +228,151 @@ def visualize_cut_plane( if not ax: fig, ax = plt.subplots() + if vel_component=='u': - vel_mesh = cut_plane.df.u.values.reshape(cut_plane.resolution[1], cut_plane.resolution[0]) + # vel_mesh = cut_plane.df.u.values.reshape(cut_plane.resolution[1], cut_plane.resolution[0]) if min_speed is None: min_speed = cut_plane.df.u.min() if max_speed is None: max_speed = cut_plane.df.u.max() elif vel_component=='v': - vel_mesh = cut_plane.df.v.values.reshape(cut_plane.resolution[1], cut_plane.resolution[0]) + # vel_mesh = cut_plane.df.v.values.reshape(cut_plane.resolution[1], cut_plane.resolution[0]) if min_speed is None: min_speed = cut_plane.df.v.min() if max_speed is None: max_speed = cut_plane.df.v.max() elif vel_component=='w': - vel_mesh = cut_plane.df.w.values.reshape(cut_plane.resolution[1], cut_plane.resolution[0]) + # vel_mesh = cut_plane.df.w.values.reshape(cut_plane.resolution[1], cut_plane.resolution[0]) if min_speed is None: min_speed = cut_plane.df.w.min() if max_speed is None: max_speed = cut_plane.df.w.max() - # Reshape to 2d for plotting - x1_mesh = cut_plane.df.x1.values.reshape(cut_plane.resolution[1], cut_plane.resolution[0]) - x2_mesh = cut_plane.df.x2.values.reshape(cut_plane.resolution[1], cut_plane.resolution[0]) - Zm = np.ma.masked_where(np.isnan(vel_mesh), vel_mesh) + # Allow separate number of levels for tricontourf and for line_contour + if clevels is None: + clevels = levels # Plot the cut-through - im = ax.pcolormesh( - x1_mesh, - x2_mesh, - Zm, + im = ax.tricontourf( + cut_plane.df.x1, + cut_plane.df.x2, + cut_plane.df.u, + vmin=min_speed, + vmax=max_speed, + levels=clevels, cmap=cmap, + extend="both", + ) + + # Add line contour + line_contour_cut_plane( + cut_plane, + ax=ax, + levels=levels, + colors="b", + linewidths=0.8, + alpha=0.3, + **kwargs + ) + + if cut_plane.normal_vector == "x": + ax.invert_xaxis() + + if color_bar: + cbar = plt.colorbar(im, ax=ax) + cbar.set_label('m/s') + + # Set the title + ax.set_title(title) + + # Make equal axis + ax.set_aspect("equal") + + return im + + +def visualize_heterogeneous_cut_plane( + cut_plane, + fi, + ax=None, + vel_component='u', + min_speed=None, + max_speed=None, + cmap="coolwarm", + levels=None, + clevels=None, + color_bar=False, + title="", + plot_het_bounds=True, + **kwargs +): + """ + Generate pseudocolor mesh plot of the heterogeneous cut_plane. + + Args: + cut_plane (:py:class:`~.tools.cut_plane.CutPlane`): 2D + plane through wind plant. + fi (:py:class:`~.tools.floris_interface.FlorisInterface`): FlorisInterface object. + ax (:py:class:`matplotlib.pyplot.axes`): Figure axes. Defaults + to None. + vel_component (str, optional): The velocity component that the cut plane is + perpendicular to. + min_speed (float, optional): Minimum value of wind speed for + contours. Defaults to None. + max_speed (float, optional): Maximum value of wind speed for + contours. Defaults to None. + cmap (str, optional): Colormap specifier. Defaults to + 'coolwarm'. + levels (np.array, optional): Contour levels for line contour plot. + Defaults to None. + clevels (np.array, optional): Contour levels for tricontourf plot. + Defaults to None. + color_bar (Boolean, optional): Flag to include a color bar on the plot. + Defaults to False. + title (str, optional): User-supplied title for the plot. Defaults to "". + plot_het_bonds (boolean, optional): Flag to include the user-defined bounds of the + heterogeneous wind speed area. Defaults to True. + **kwargs: Additional parameters to pass to line contour plot. + + Returns: + im (:py:class:`matplotlib.plt.pcolormesh`): Image handle. + """ + + if not ax: + fig, ax = plt.subplots() + if vel_component=='u': + # vel_mesh = cut_plane.df.u.values.reshape(cut_plane.resolution[1], cut_plane.resolution[0]) + if min_speed is None: + min_speed = cut_plane.df.u.min() + if max_speed is None: + max_speed = cut_plane.df.u.max() + elif vel_component=='v': + # vel_mesh = cut_plane.df.v.values.reshape(cut_plane.resolution[1], cut_plane.resolution[0]) + if min_speed is None: + min_speed = cut_plane.df.v.min() + if max_speed is None: + max_speed = cut_plane.df.v.max() + elif vel_component=='w': + # vel_mesh = cut_plane.df.w.values.reshape(cut_plane.resolution[1], cut_plane.resolution[0]) + if min_speed is None: + min_speed = cut_plane.df.w.min() + if max_speed is None: + max_speed = cut_plane.df.w.max() + + # Allow separate number of levels for tricontourf and for line_contour + if clevels is None: + clevels = levels + + # Plot the cut-through + im = ax.tricontourf( + cut_plane.df.x1, + cut_plane.df.x2, + cut_plane.df.u, vmin=min_speed, vmax=max_speed, - shading="nearest" + levels=clevels, + cmap=cmap, + extend="both", ) # Add line contour @@ -243,6 +386,26 @@ def visualize_cut_plane( **kwargs ) + # Plot the user-defined heterogeneous flow area + if plot_het_bounds: + points = np.array( + list( + zip( + fi.floris.flow_field.heterogenous_inflow_config['x'], + fi.floris.flow_field.heterogenous_inflow_config['y'], + ) + ) + ) + hull = ConvexHull(points) + h = ax.plot( + points[np.append(hull.vertices, hull.vertices[0]),0], + points[np.append(hull.vertices, hull.vertices[0]), 1], + 'k--', + lw=2, + ) + ax.plot(points[hull.vertices,0], points[hull.vertices,1], 'ko') + ax.legend(h, ["defined heterogeneous bounds"], loc=1) + if cut_plane.normal_vector == "x": ax.invert_xaxis() @@ -327,18 +490,28 @@ def plot_rotor_values( save_path: Union[str, None] = None, show: bool = False ) -> Union[None, tuple[plt.figure, plt.axes, plt.axis, plt.colorbar]]: - """Plots the gridded turbine rotor values. This is intended to be used for + """ + Plots the gridded turbine rotor values. This is intended to be used for understanding the differences between two sets of values, so each subplot can be used for inspection of what values are differing, and under what conditions. Parameters: values (np.ndarray): The 5-dimensional array of values to plot. Should be: N wind directions x N wind speeds x N turbines X N rotor points X N rotor points. - cmap (str): The matplotlib colormap to be used, default "coolwarm". - return_fig_objects (bool): Indicator to return the primary figure objects for + wd_index (int): The index for the wind direction to plot. + ws_index (int): The index of the wind speed to plot. + n_rows (int): The number of rows to include for subplots. With ncols, this should + generally add up to the number of turbines in the farm. + n_cols (int): The number of columns to include for subplots. With ncols, this should + generally add up to the number of turbines in the farm. + t_range (range | None): Optional. The turbine count used to create the title for each + subplot. If not provided, the size of the 2-th dimension of `values` is used. + cmap (str): Optional. The matplotlib colormap to be used, default "coolwarm". + return_fig_objects (bool): Optional. Flag to return the primary figure objects for further editing, default False. - save_path (str | None): Where to save the figure, if a value is provided. - t_range is turbine range; i.e. the turbine index to loop over + save_path (str | None): Optional. Where to save the figure, if a value is provided. + show (bool): Optional. Flag to run `plt.show()` to present all the plots + currently created with matplotlib. Returns: None | tuple[plt.figure, plt.axes, plt.axis, plt.colorbar]: If @@ -347,9 +520,9 @@ def plot_rotor_values( Example: from floris.tools.visualization import plot_rotor_values - plot_rotor_values(floris.flow_field.u, wd_index=0, ws_index=0) - plot_rotor_values(floris.flow_field.v, wd_index=0, ws_index=0) - plot_rotor_values(floris.flow_field.w, wd_index=0, ws_index=0, show=True) + plot_rotor_values(floris.flow_field.u, wd_index=0, ws_index=0, n_rows=1, ncols=4) + plot_rotor_values(floris.flow_field.v, wd_index=0, ws_index=0, n_rows=1, ncols=4) + plot_rotor_values(floris.flow_field.w, wd_index=0, ws_index=0, n_rows=1, ncols=4, show=True) """ cmap = plt.cm.get_cmap(name=cmap) @@ -360,6 +533,11 @@ def plot_rotor_values( fig = plt.figure() axes = fig.subplots(n_rows, n_cols) + # For 1x1, fig.subplots returns an Axes object, but for more than 1x1 it returns a np.array. + # In this case, convert to an array so that the rest of this function can be simplified. + if n_rows == 1 and n_cols == 1: + axes = np.array([axes]) + titles = np.array([f"T{i}" for i in t_range]) for ax, t, i in zip(axes.flatten(), titles, t_range): diff --git a/floris/tools/wind_rose.py b/floris/tools/wind_rose.py index aa0d6a8f0..94951e381 100644 --- a/floris/tools/wind_rose.py +++ b/floris/tools/wind_rose.py @@ -1478,6 +1478,7 @@ def plot_wind_rose( ax.set_theta_direction(-1) ax.set_theta_offset(np.pi / 2.0) ax.set_theta_zero_location("N") + ax.set_xticks(np.arange(0, 2*np.pi, np.pi/4)) ax.set_xticklabels(["N", "NE", "E", "SE", "S", "SW", "W", "NW"]) return ax @@ -1552,6 +1553,7 @@ def plot_wind_rose_ti( ax.set_theta_direction(-1) ax.set_theta_offset(np.pi / 2.0) ax.set_theta_zero_location("N") + ax.set_xticks(np.arange(0, 2*np.pi, np.pi/4)) ax.set_xticklabels(["N", "NE", "E", "SE", "S", "SW", "W", "NW"]) return ax diff --git a/floris/turbine_library/__init__.py b/floris/turbine_library/__init__.py new file mode 100644 index 000000000..828c50eb2 --- /dev/null +++ b/floris/turbine_library/__init__.py @@ -0,0 +1 @@ +from floris.turbine_library.turbine_previewer import TurbineInterface, TurbineLibrary diff --git a/floris/turbine_library/iea_10MW.yaml b/floris/turbine_library/iea_10MW.yaml index bc40bb0fb..eaa04d81b 100644 --- a/floris/turbine_library/iea_10MW.yaml +++ b/floris/turbine_library/iea_10MW.yaml @@ -6,6 +6,7 @@ pT: 1.88 rotor_diameter: 198.0 TSR: 8.0 ref_density_cp_ct: 1.225 +ref_tilt_cp_ct: 6.0 power_thrust_table: power: - 0.000000 diff --git a/floris/turbine_library/iea_15MW.yaml b/floris/turbine_library/iea_15MW.yaml index 8f86b7a14..0350cd9c4 100644 --- a/floris/turbine_library/iea_15MW.yaml +++ b/floris/turbine_library/iea_15MW.yaml @@ -6,6 +6,7 @@ pT: 1.88 rotor_diameter: 242.24 TSR: 8.0 ref_density_cp_ct: 1.225 +ref_tilt_cp_ct: 6.0 power_thrust_table: power: - 0.000000 diff --git a/floris/turbine_library/nrel_5MW.yaml b/floris/turbine_library/nrel_5MW.yaml index b4ac8c1c7..70c34a9f4 100644 --- a/floris/turbine_library/nrel_5MW.yaml +++ b/floris/turbine_library/nrel_5MW.yaml @@ -1,11 +1,45 @@ + +### +# An ID for this type of turbine definition. +# This is not currently used, but it will be enabled in the future. This should typically +# match the root name of the file. turbine_type: 'nrel_5MW' + +### +# Setting for generator losses to power. generator_efficiency: 1.0 + +### +# Hub height. hub_height: 90.0 + +### +# Cosine exponent for power loss due to yaw misalignment. pP: 1.88 + +### +# Cosine exponent for power loss due to tilt. pT: 1.88 + +### +# Rotor diameter. rotor_diameter: 126.0 + +### +# Tip speed ratio defined as linear blade tip speed normalized by the incoming wind speed. TSR: 8.0 + +### +# The air density at which the Cp and Ct curves are defined. ref_density_cp_ct: 1.225 + +### +# The tilt angle at which the Cp and Ct curves are defined. This is used to capture +# the effects of a floating platform on a turbine's power and wake. +ref_tilt_cp_ct: 5.0 + +### +# Cp and Ct as a function of wind speed for the turbine's full range of operating conditions. power_thrust_table: power: - 0.0 diff --git a/floris/turbine_library/turbine_previewer.py b/floris/turbine_library/turbine_previewer.py new file mode 100644 index 000000000..3d8374460 --- /dev/null +++ b/floris/turbine_library/turbine_previewer.py @@ -0,0 +1,863 @@ +# Copyright 2023 NREL + +# Licensed under the Apache License, Version 2.0 (the "License"); you may not +# use this file except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. + +# See https://floris.readthedocs.io for documentation + +from pathlib import Path + +import attrs +import matplotlib.pyplot as plt +import numpy as np +from attrs import define, field + +from floris.simulation import ( + Ct, + power, + Turbine, +) +from floris.type_dec import NDArrayFloat +from floris.utilities import ( + load_yaml, + round_nearest, + round_nearest_2_or_5, +) + + +INTERNAL_LIBRARY = Path(__file__).parent +DEFAULT_WIND_SPEEDS = np.linspace(0, 40, 81) + + +@define(auto_attribs=True) +class TurbineInterface: + turbine: Turbine = field(validator=attrs.validators.instance_of(Turbine)) + + @classmethod + def from_internal_library(cls, file_name: str): + """Loads the turbine definition from a YAML configuration file located in + ``floris/floris/turbine_library/``. + + Args: + file_`name : str | Path + T`he file name of the turbine configuration file. + + Returns: + (TurbineInterface): Creates a new ``TurbineInterface`` object. + """ + return cls(turbine=Turbine.from_dict(load_yaml(INTERNAL_LIBRARY / file_name))) + + @classmethod + def from_yaml(cls, file_path: str | Path): + """Loads the turbine definition from a YAML configuration file. + + Args: + file_path : str | Path + The full path and file name of the turbine configuration file. + + Returns: + (TurbineInterface): Creates a new ``TurbineInterface`` object. + """ + return cls(turbine=Turbine.from_dict(load_yaml(file_path))) + + @classmethod + def from_turbine_dict(cls, config_dict: dict): + """Loads the turbine definition from a dictionary. + + Args: + config_dict : dict + The ``Turbine`` configuration dictionary. + + Returns: + (`TurbineInterface`): Returns a ``TurbineInterface`` object. + """ + return cls(turbine=Turbine.from_dict(config_dict)) + + def power_curve( + self, + wind_speeds: NDArrayFloat = DEFAULT_WIND_SPEEDS, + ) -> tuple[NDArrayFloat, NDArrayFloat]: + """Produces a plot-ready power curve for the turbine for wind speed vs power (MW), assuming + no tilt or yaw effects. + + Args: + wind_speeds (NDArrayFloat, optional): A 1-D array of wind speeds, in m/s. Defaults to + 0 m/s -> 40 m/s, every 0.5 m/s. + + Returns: + (tuple[NDArrayFloat, NDArrayFloat]): Returns the wind speed array and the power array. + """ + shape = (1, wind_speeds.size, 1) + power_mw = power( + ref_density_cp_ct=np.full(shape, self.turbine.ref_density_cp_ct), + rotor_effective_velocities=wind_speeds.reshape(shape), + power_interp={self.turbine.turbine_type: self.turbine.power_interp}, + turbine_type_map=np.full(shape, self.turbine.turbine_type) + ).flatten() / 1e6 + return wind_speeds, power_mw + + def Cp_curve( + self, + wind_speeds: NDArrayFloat = DEFAULT_WIND_SPEEDS, + ) -> tuple[NDArrayFloat, NDArrayFloat]: + """Produces a plot-ready thrust curve for the turbine for wind speed vs power coefficient + assuming no tilt or yaw effects. + + Args: + wind_speeds : NDArrayFloat, optional + The wind speed conditions to produce the power curve for, by default 0 m/s -> 40 m/s, + every 0.5 m/s. + + Returns: + tuple[NDArrayFloat, NDArrayFloat] + Returns the wind speed array and the power coefficient array. + """ + cp_curve = self.turbine.fCp_interp(wind_speeds) + return wind_speeds, cp_curve + + def Ct_curve( + self, + wind_speeds: NDArrayFloat = DEFAULT_WIND_SPEEDS, + ) -> tuple[NDArrayFloat, NDArrayFloat]: + """Produces a plot-ready thrust curve for the turbine for wind speed vs thrust coefficient + assuming no tilt or yaw effects. + + Args: + wind_speeds (NDArrayFloat, optional): A 1-D array of wind speeds, in m/s. Defaults to + 0 m/s -> 40 m/s, every 0.5 m/s. + + Returns: + tuple[NDArrayFloat, NDArrayFloat] + Returns the wind speed array and the thrust coefficient array. + """ + shape = (1, wind_speeds.size, 1) + ct_curve = Ct( + velocities=wind_speeds.reshape(shape), + yaw_angle=np.zeros(shape), + tilt_angle=np.full(shape, self.turbine.ref_tilt_cp_ct), + ref_tilt_cp_ct=np.full(shape, self.turbine.ref_tilt_cp_ct), + fCt={self.turbine.turbine_type: self.turbine.fCt_interp}, + tilt_interp=[(self.turbine.turbine_type, self.turbine.fTilt_interp)], + correct_cp_ct_for_tilt=np.zeros(shape, dtype=bool), + turbine_type_map=np.full(shape, self.turbine.turbine_type), + ).flatten() + return wind_speeds, ct_curve + + def plot_power_curve( + self, + wind_speeds: NDArrayFloat = DEFAULT_WIND_SPEEDS, + fig_kwargs: dict = {}, + plot_kwargs = {}, + return_fig: bool = False + ) -> None | tuple[plt.Figure, plt.Axes]: + """Plots the power curve for a given set of wind speeds. + + Args: + wind_speeds (NDArrayFloat, optional): A 1-D array of wind speeds, in m/s. + Defaults to 0 m/s -> 40 m/s, every 0.5 m/s. + fig_kwargs (dict, optional): Any keywords arguments to be passed to ``plt.Figure()``. + Defaults to {}. + plot_kwargs (dict, optional): Any keyword arguments to be passed to ``plt.plot()``. + Defaults to {}. + return_fig (bool, optional): Indicator if the ``Figure`` and ``Axes`` objects should be + returned. Defaults to False. + + Returns: + None | tuple[plt.Figure, plt.Axes]: None, if :py:attr:`return_fig` is False, otherwise + a tuple of the Figure and Axes objects are returned. + """ + wind_speeds, power_mw = self.power_curve(wind_speeds=wind_speeds) + + # Set the figure defaults if none are provided + fig_kwargs.setdefault("dpi", 200) + fig_kwargs.setdefault("figsize", (4, 3)) + + fig = plt.figure(**fig_kwargs) + ax = fig.add_subplot(111) + + min_windspeed = 0 + max_windspeed = max(wind_speeds) + min_power = 0 + max_power = max(power_mw) + ax.plot(wind_speeds, power_mw, label=self.turbine.turbine_type, **plot_kwargs) + + ax.grid() + ax.set_axisbelow(True) + ax.legend() + + max_power = round_nearest_2_or_5(max_power) + ax.set_xlim(min_windspeed, max_windspeed) + ax.set_ylim(min_power, max_power) + + ax.set_xlabel("Wind Speed (m/s)") + ax.set_ylabel("Power (MW)") + + if return_fig: + return fig, ax + + fig.tight_layout() + + def plot_Cp_curve( + self, + wind_speeds: NDArrayFloat = DEFAULT_WIND_SPEEDS, + fig_kwargs: dict = {}, + plot_kwargs = {}, + return_fig: bool = False + ) -> None | tuple[plt.Figure, plt.Axes]: + """Plots the power coefficient curve for a given set of wind speeds. + + Args: + wind_speeds (NDArrayFloat, optional): A 1-D array of wind speeds, in m/s. Defaults to + 0 m/s -> 40 m/s, every 0.5 m/s. + fig_kwargs (dict, optional): Any keywords arguments to be passed to ``plt.Figure()``. + Defaults to {}. + plot_kwargs (dict, optional): Any keyword arguments to be passed to ``plt.plot()``. + Defaults to {}. + return_fig (bool, optional): Indicator if the ``Figure`` and ``Axes`` objects should be + returned. Defaults to False. + + Returns: + None | tuple[plt.Figure, plt.Axes]: None, if :py:attr:`return_fig` is False, otherwise + a tuple of the Figure and Axes objects are returned. + """ + wind_speeds, power_c = self.Cp_curve(wind_speeds=wind_speeds) + + # Set the figure defaults if none are provided + fig_kwargs.setdefault("dpi", 200) + fig_kwargs.setdefault("figsize", (4, 3)) + + fig = plt.figure(**fig_kwargs) + ax = fig.add_subplot(111) + + min_windspeed = 0 + max_windspeed = max(wind_speeds) + ax.plot(wind_speeds, power_c, label=self.turbine.turbine_type, **plot_kwargs) + + ax.grid() + ax.set_axisbelow(True) + ax.legend() + + ax.set_xlim(min_windspeed, max_windspeed) + ax.set_ylim(0, round_nearest(max(power_c) * 100, base=10) / 100) + + ax.set_xlabel("Wind Speed (m/s)") + ax.set_ylabel("Power Coefficient") + + if return_fig: + return fig, ax + + fig.tight_layout() + + def plot_Ct_curve( + self, + wind_speeds: NDArrayFloat = DEFAULT_WIND_SPEEDS, + fig_kwargs: dict = {}, + plot_kwargs = {}, + return_fig: bool = False + ) -> None | tuple[plt.Figure, plt.Axes]: + """Plots the thrust coefficient curve for a given set of wind speeds. + + Args: + wind_speeds (NDArrayFloat, optional): A 1-D array of wind speeds, in m/s. Defaults to + 0 m/s -> 40 m/s, every 0.5 m/s. + fig_kwargs (dict, optional): Any keywords arguments to be passed to ``plt.Figure()``. + Defaults to {}. + plot_kwargs (dict, optional): Any keyword arguments to be passed to ``plt.plot()``. + Defaults to {}. + return_fig (bool, optional): Indicator if the ``Figure`` and ``Axes`` objects should be + returned. Defaults to False. + + Returns: + None | tuple[plt.Figure, plt.Axes]: None, if :py:attr:`return_fig` is False, otherwise + a tuple of the Figure and Axes objects are returned. + """ + wind_speeds, thrust = self.Ct_curve(wind_speeds=wind_speeds) + + # Set the figure defaults if none are provided + fig_kwargs.setdefault("dpi", 200) + fig_kwargs.setdefault("figsize", (4, 3)) + + fig = plt.figure(**fig_kwargs) + ax = fig.add_subplot(111) + + min_windspeed = 0 + max_windspeed = max(wind_speeds) + ax.plot(wind_speeds, thrust, label=self.turbine.turbine_type, **plot_kwargs) + + ax.grid() + ax.set_axisbelow(True) + ax.legend() + + ax.set_xlim(min_windspeed, max_windspeed) + ax.set_ylim(0, round_nearest(max(thrust) * 100, base=10) / 100) + + ax.set_xlabel("Wind Speed (m/s)") + ax.set_ylabel("Thrust Coefficient") + + if return_fig: + return fig, ax + + fig.tight_layout() + + +@define(auto_attribs=True) +class TurbineLibrary: + turbine_map: dict[str: TurbineInterface] = field(factory=dict) + power_curves: dict[str, tuple[NDArrayFloat, NDArrayFloat]] = field(factory=dict) + Cp_curves: dict[str, tuple[NDArrayFloat, NDArrayFloat]] = field(factory=dict) + Ct_curves: dict[str, tuple[NDArrayFloat, NDArrayFloat]] = field(factory=dict) + + def load_internal_library(self, which: list[str] = [], exclude: list[str] = []) -> None: + """Loads all of the turbine configurations from ``floris/floris/turbine_libary``, + except any turbines defined in :py:attr:`exclude`. + + Args: + which (list[str], optional): A list of which file names to include from loading. + Defaults to []. + exclude (list[str], optional): A list of file names to exclude from loading. + Defaults to []. + """ + include = [el for el in INTERNAL_LIBRARY.iterdir() if el.suffix in (".yaml", ".yml")] + which = [INTERNAL_LIBRARY / el for el in which] if which != [] else include + exclude = [INTERNAL_LIBRARY / el for el in exclude] + include = set(which).intersection(include).difference(exclude) + for fn in include: + turbine_dict = load_yaml(fn) + self.turbine_map.update({ + turbine_dict["turbine_type"]: TurbineInterface.from_turbine_dict(turbine_dict) + }) + + def load_external_library( + self, + library_path: str | Path, + which: list[str] = [], + exclude: list[str] = [], + ) -> None: + """Loads all the turbine configurations from :py:attr:`library_path`, except the file names + defined in :py:attr:`exclude`, and adds each to ``turbine_map`` via a dictionary + update. + + Args: + library_path : str | Path + The external turbine library that should be used for loading the turbines. + which (list[str], optional): A list of which file names to include from loading. + Defaults to []. + exclude (list[str], optional): A list of file names to exclude from loading. + Defaults to []. + """ + library_path = Path(library_path).resolve() + include = [el for el in library_path.iterdir() if el.suffix in (".yaml", ".yml")] + which = [library_path / el for el in which] if which != [] else include + exclude = [library_path / el for el in exclude] + include = set(which).intersection(include).difference(exclude) + for fn in include: + turbine_dict = load_yaml(fn) + self.turbine_map.update({ + turbine_dict["turbine_type"]: TurbineInterface.from_turbine_dict(turbine_dict) + }) + + def compute_power_curves( + self, + wind_speeds: NDArrayFloat = DEFAULT_WIND_SPEEDS, + ) -> None: + """Computes the power curves for each turbine in ``turbine_map`` and sets the + ``power_curves`` attribute. + + Args: + wind_speeds (NDArrayFloat, optional): A 1-D array of wind speeds, in m/s. Defaults to + 0 m/s -> 40 m/s, every 0.5 m/s. + """ + self.power_curves = { + name: t.power_curve(wind_speeds) for name, t in self.turbine_map.items() + } + + def compute_Cp_curves( + self, + wind_speeds: NDArrayFloat = DEFAULT_WIND_SPEEDS, + ) -> None: + """Computes the power coefficient curves for each turbine in ``turbine_map`` and sets the + ``Ct_curves`` attribute. + + Args: + wind_speeds (NDArrayFloat, optional): A 1-D array of wind speeds, in m/s. Defaults to + 0 m/s -> 40 m/s, every 0.5 m/s. + """ + self.Cp_curves = { + name: t.Cp_curve(wind_speeds) for name, t in self.turbine_map.items() + } + + def compute_Ct_curves( + self, + wind_speeds: NDArrayFloat = DEFAULT_WIND_SPEEDS, + ) -> None: + """Computes the thrust curves for each turbine in ``turbine_map`` and sets the + ``Ct_curves`` attribute. + + Args: + wind_speeds (NDArrayFloat, optional): A 1-D array of wind speeds, in m/s. Defaults to + 0 m/s -> 40 m/s, every 0.5 m/s. + """ + self.Ct_curves = { + name: t.Ct_curve(wind_speeds) for name, t in self.turbine_map.items() + } + + def plot_power_curves( + self, + fig: plt.Figure | None = None, + ax: plt.Axes | None = None, + which: list[str] = [], + exclude: list[str] = [], + wind_speeds: NDArrayFloat = DEFAULT_WIND_SPEEDS, + fig_kwargs: dict = {}, + plot_kwargs = {}, + return_fig: bool = False, + show: bool = False, + ) -> None | tuple[plt.Figure, plt.Axes]: + """Plots each power curve in ``turbine_map`` in a single plot. + + Args: + fig (plt.figure, optional): A pre-made figure where the plot should exist. + ax (plt.Axes, optional): A pre-initialized axes object that should be used for the plot. + which (list[str], optional): A list of which turbine types/names to include. Defaults to + []. + exclude (list[str], optional): A list of turbine types/names names to exclude. Defaults + to []. + wind_speeds (NDArrayFloat, optional): A 1-D array of wind speeds, in m/s. Defaults to + 0 m/s -> 40 m/s, every 0.5 m/s. + fig_kwargs (dict, optional): Any keywords arguments to be passed to ``plt.Figure()``. + Defaults to {}. + plot_kwargs (dict, optional): Any keyword arguments to be passed to ``plt.plot()``. + Defaults to {}. + return_fig (bool, optional): Indicator if the ``Figure`` and ``Axes`` objects should be + returned. Defaults to False. + show (bool, optional): Indicator if the figure should be automatically displayed. + Defaults to False. + + Returns: + None | tuple[plt.Figure, plt.Axes]: None, if :py:attr:`return_fig` is False, otherwise + a tuple of the Figure and Axes objects are returned. + """ + if self.power_curves == {} or wind_speeds is not None: + self.compute_power_curves(wind_speeds=wind_speeds) + + which = [*self.turbine_map] if which == [] else which + + # Set the figure defaults if none are provided + if fig is None: + fig_kwargs.setdefault("dpi", 200) + fig_kwargs.setdefault("figsize", (4, 3)) + + fig = plt.figure(**fig_kwargs) + if ax is None: + ax = fig.add_subplot(111) + + min_windspeed = 0 + max_windspeed = 0 + min_power = 0 + max_power = 0 + for name, (ws, p) in self.power_curves.items(): + if name in exclude or name not in which: + continue + max_power = max(p.max(), max_power) + max_windspeed = max(ws.max(), max_windspeed) + ax.plot(ws, p, label=name, **plot_kwargs) + + ax.grid() + ax.set_axisbelow(True) + ax.legend() + + max_power = round_nearest(max_power, base=5) + ax.set_xlim(min_windspeed, max_windspeed) + ax.set_ylim(min_power, max_power) + + ax.set_xlabel("Wind Speed (m/s)") + ax.set_ylabel("Power (MW)") + + if return_fig: + return fig, ax + + if show: + fig.tight_layout() + + def plot_Cp_curves( + self, + fig: plt.Figure | None = None, + ax: plt.Axes | None = None, + which: list[str] = [], + exclude: list[str] = [], + wind_speeds: NDArrayFloat = DEFAULT_WIND_SPEEDS, + fig_kwargs: dict = {}, + plot_kwargs = {}, + return_fig: bool = False, + show: bool = False, + ) -> None | tuple[plt.Figure, plt.Axes]: + """Plots each power coefficient curve in ``turbine_map`` in a single plot. + + Args: + fig (plt.figure, optional): A pre-made figure where the plot should exist. + ax (plt.Axes, optional): A pre-initialized axes object that should be used for the plot. + which (list[str], optional): A list of which turbine types/names to include. Defaults to + []. + exclude (list[str], optional): A list of turbine types/names names to exclude. Defaults + to []. + wind_speeds (NDArrayFloat, optional): A 1-D array of wind speeds, in m/s. Defaults to + 0 m/s -> 40 m/s, every 0.5 m/s. + fig_kwargs (dict, optional): Any keywords arguments to be passed to ``plt.Figure()``. + Defaults to {}. + plot_kwargs (dict, optional): Any keyword arguments to be passed to ``plt.plot()``. + Defaults to {}. + return_fig (bool, optional): Indicator if the ``Figure`` and ``Axes`` objects should be + returned. Defaults to False. + show (bool, optional): Indicator if the figure should be automatically displayed. + Defaults to False. + + Returns: + None | tuple[plt.Figure, plt.Axes]: None, if :py:attr:`return_fig` is False, otherwise + a tuple of the Figure and Axes objects are returned. + """ + if self.Cp_curves == {} or wind_speeds is None: + self.compute_Cp_curves(wind_speeds=wind_speeds) + + which = [*self.turbine_map] if which == [] else which + + # Set the figure defaults if none are provided + if fig is None: + fig_kwargs.setdefault("dpi", 200) + fig_kwargs.setdefault("figsize", (4, 3)) + + fig = plt.figure(**fig_kwargs) + if ax is None: + ax = fig.add_subplot(111) + + min_windspeed = 0 + max_windspeed = 0 + max_power = 0 + for name, (ws, p) in self.Cp_curves.items(): + if name in exclude or name not in which: + continue + max_windspeed = max(ws.max(), max_windspeed) + max_power = max(p.max(), max_power) + ax.plot(ws, p, label=name, **plot_kwargs) + + ax.grid() + ax.set_axisbelow(True) + ax.legend() + + ax.set_xlim(min_windspeed, max_windspeed) + ax.set_ylim(0, round_nearest(max_power * 100, base=10) / 100) + + ax.set_xlabel("Wind Speed (m/s)") + ax.set_ylabel("Power Coefficient") + + if return_fig: + return fig, ax + + if show: + fig.tight_layout() + + def plot_Ct_curves( + self, + fig: plt.Figure | None = None, + ax: plt.Axes | None = None, + which: list[str] = [], + exclude: list[str] = [], + wind_speeds: NDArrayFloat = DEFAULT_WIND_SPEEDS, + fig_kwargs: dict = {}, + plot_kwargs = {}, + return_fig: bool = False, + show: bool = False, + ) -> None | tuple[plt.Figure, plt.Axes]: + """Plots each thrust coefficient curve in ``turbine_map`` in a single plot. + + Args: + fig (plt.figure, optional): A pre-made figure where the plot should exist. + ax (plt.Axes, optional): A pre-initialized axes object that should be used for the plot. + which (list[str], optional): A list of which turbine types/names to include. Defaults to + []. + exclude (list[str], optional): A list of turbine types/names names to exclude. Defaults + to []. + wind_speeds (NDArrayFloat, optional): A 1-D array of wind speeds, in m/s. Defaults to + 0 m/s -> 40 m/s, every 0.5 m/s. + fig_kwargs (dict, optional): Any keywords arguments to be passed to ``plt.Figure()``. + Defaults to {}. + plot_kwargs (dict, optional): Any keyword arguments to be passed to ``plt.plot()``. + Defaults to {}. + return_fig (bool, optional): Indicator if the ``Figure`` and ``Axes`` objects should be + returned. Defaults to False. + show (bool, optional): Indicator if the figure should be automatically displayed. + Defaults to False. + + Returns: + None | tuple[plt.Figure, plt.Axes]: None, if :py:attr:`return_fig` is False, otherwise + a tuple of the Figure and Axes objects are returned. + """ + if self.Ct_curves == {} or wind_speeds is None: + self.compute_Ct_curves(wind_speeds=wind_speeds) + + which = [*self.turbine_map] if which == [] else which + + # Set the figure defaults if none are provided + if fig is None: + fig_kwargs.setdefault("dpi", 200) + fig_kwargs.setdefault("figsize", (4, 3)) + + fig = plt.figure(**fig_kwargs) + if ax is None: + ax = fig.add_subplot(111) + + min_windspeed = 0 + max_windspeed = 0 + max_thrust = 0 + for name, (ws, t) in self.Ct_curves.items(): + if name in exclude or name not in which: + continue + max_windspeed = max(ws.max(), max_windspeed) + max_thrust = max(t.max(), max_thrust) + ax.plot(ws, t, label=name, **plot_kwargs) + + ax.grid() + ax.set_axisbelow(True) + ax.legend() + + ax.set_xlim(min_windspeed, max_windspeed) + ax.set_ylim(0, round_nearest(max_thrust * 100, base=10) / 100) + + ax.set_xlabel("Wind Speed (m/s)") + ax.set_ylabel("Thrust Coefficient") + + if return_fig: + return fig, ax + + if show: + fig.tight_layout() + + def plot_rotor_diameters( + self, + fig: plt.Figure | None = None, + ax: plt.Axes | None = None, + which: list[str] = [], + exclude: list[str] = [], + fig_kwargs: dict = {}, + bar_kwargs = {}, + return_fig: bool = False, + show: bool = False, + ) -> None | tuple[plt.Figure, plt.Axes]: + """Plots a bar chart of rotor diameters for each turbine in ``turbine_map``. + + Args: + fig (plt.figure, optional): A pre-made figure where the plot should exist. + ax (plt.Axes, optional): A pre-initialized axes object that should be used for the plot. + which (list[str], optional): A list of which turbine types/names to include. Defaults to + []. + exclude (list[str], optional): A list of turbine types/names names to exclude. Defaults + to []. + fig_kwargs (dict, optional): Any keywords arguments to be passed to ``plt.Figure()``. + Defaults to {}. + bar_kwargs (dict, optional): Any keyword arguments to be passed to ``plt.plot()``. + Defaults to {}. + return_fig (bool, optional): Indicator if the ``Figure`` and ``Axes`` objects should be + returned. Defaults to False. + show (bool, optional): Indicator if the figure should be automatically displayed. + Defaults to False. + + Returns: + None | tuple[plt.Figure, plt.Axes]: None, if :py:attr:`return_fig` is False, otherwise + a tuple of the Figure and Axes objects are returned. + """ + which = [*self.turbine_map] if which == [] else which + + # Set the figure defaults if none are provided + if fig is None: + fig_kwargs.setdefault("dpi", 200) + fig_kwargs.setdefault("figsize", (4, 3)) + + fig = plt.figure(**fig_kwargs) + if ax is None: + ax = fig.add_subplot(111) + + subset_map = { + name: t for name, t in self.turbine_map.items() + if name not in exclude or name in which + } + x = np.arange(len(subset_map)) + y = [ti.turbine.rotor_diameter for ti in subset_map.values()] + ix_sort = np.argsort(y) + y_sorted = np.array(y)[ix_sort] + ax.bar(x, y_sorted, **bar_kwargs) + + ax.grid(axis="y") + ax.set_axisbelow(True) + + ax.set_xlim(-0.5, len(x) - 0.5) + ax.set_ylim(0, round_nearest(max(y) / 10, base=5) * 10) + + ax.set_xticks(x) + ax.set_xticklabels(np.array([*subset_map])[ix_sort]) + ax.set_ylabel("Rotor Diameter (m)") + + if return_fig: + return fig, ax + + if show: + fig.tight_layout() + + def plot_hub_heights( + self, + fig: plt.Figure | None = None, + ax: plt.Axes | None = None, + which: list[str] = [], + exclude: list[str] = [], + fig_kwargs: dict = {}, + bar_kwargs = {}, + return_fig: bool = False, + show: bool = False, + ) -> None | tuple[plt.Figure, plt.Axes]: + """Plots a bar chart of hub heights for each turbine in ``turbine_map``. + + Args: + fig (plt.figure, optional): A pre-made figure where the plot should exist. + ax (plt.Axes, optional): A pre-initialized axes object that should be used for the plot. + which (list[str], optional): A list of which turbine types/names to include. Defaults to + []. + exclude (list[str], optional): A list of turbine types/names names to exclude. Defaults + to []. + fig_kwargs (dict, optional): Any keywords arguments to be passed to ``plt.Figure()``. + Defaults to {}. + bar_kwargs (dict, optional): Any keyword arguments to be passed to ``plt.plot()``. + Defaults to {}. + return_fig (bool, optional): Indicator if the ``Figure`` and ``Axes`` objects should be + returned. Defaults to False. + show (bool, optional): Indicator if the figure should be automatically displayed. + Defaults to False. + + Returns: + None | tuple[plt.Figure, plt.Axes]: None, if :py:attr:`return_fig` is False, otherwise + a tuple of the Figure and Axes objects are returned. + """ + which = [*self.turbine_map] if which == [] else which + + # Set the figure defaults if none are provided + if fig is None: + fig_kwargs.setdefault("dpi", 200) + fig_kwargs.setdefault("figsize", (4, 3)) + + fig = plt.figure(**fig_kwargs) + if ax is None: + ax = fig.add_subplot(111) + + subset_map = { + name: t for name, t in self.turbine_map.items() + if name not in exclude or name in which + } + x = np.arange(len(subset_map)) + y = [ti.turbine.hub_height for ti in subset_map.values()] + ix_sort = np.argsort(y) + y_sorted = np.array(y)[ix_sort] + ax.bar(x, y_sorted, **bar_kwargs) + + ax.grid(axis="y") + ax.set_axisbelow(True) + + ax.set_xlim(-0.5, len(x) - 0.5) + ax.set_ylim(0, round_nearest(max(y) / 10, base=5) * 10) + + ax.set_xticks(x) + ax.set_xticklabels(np.array([*subset_map])[ix_sort]) + ax.set_ylabel("Hub Height (m)") + + if return_fig: + return fig, ax + + if show: + fig.tight_layout() + + def plot_comparison( + self, + which: list[str] = [], + exclude: list[str] = [], + wind_speeds: NDArrayFloat = DEFAULT_WIND_SPEEDS, + fig_kwargs: dict = {}, + plot_kwargs = {}, + bar_kwargs = {}, + return_fig: bool = False + ) -> None | tuple[plt.Figure, list[plt.Axes]]: + """Plots each thrust curve in ``turbine_map`` in a single plot. + + Args: + which (list[str], optional): A list of which turbine types/names to include. Defaults to + []. + exclude (list[str], optional): A list of turbine types/names names to exclude. Defaults + to []. + wind_speeds (NDArrayFloat, optional): A 1-D array of wind speeds, in m/s. Defaults to + 0 m/s -> 40 m/s, every 0.5 m/s. + fig_kwargs (dict, optional): Any keywords arguments to be passed to ``plt.Figure()``. + Defaults to {}. + plot_kwargs (dict, optional): Any keyword arguments to be passed to ``plt.plot()``. + Defaults to {}. + bar_kwargs (dict, optional): Any keyword arguments to be passed to ``plt.bar()``. + Defaults to {}. + return_fig (bool, optional): Indicator if the ``Figure`` and ``Axes`` objects should be + returned. Defaults to False. + + Returns: + None | tuple[plt.Figure, list[plt.Axes]]: None, if :py:attr:`return_fig` is False, + otherwise a tuple of the Figure and Axes objects are returned. + """ + # Set the figure defaults if none are provided + fig_kwargs.setdefault("dpi", 200) + fig_kwargs.setdefault("figsize", (6, 5)) + + fig = plt.figure(**fig_kwargs) + ax1 = fig.add_subplot(321) + ax2 = fig.add_subplot(322) + ax3 = fig.add_subplot(323) + ax4 = fig.add_subplot(324) + ax5 = fig.add_subplot(325) + ax_list = [ax1, ax2, ax3, ax4, ax5] + + self.plot_power_curves( + fig, + ax1, + which=which, + exclude=exclude, + wind_speeds=wind_speeds, + plot_kwargs=plot_kwargs, + ) + self.plot_Cp_curves( + fig, + ax3, + which=which, + exclude=exclude, + wind_speeds=wind_speeds, + plot_kwargs=plot_kwargs, + ) + self.plot_Ct_curves( + fig, + ax5, + which=which, + exclude=exclude, + wind_speeds=wind_speeds, + plot_kwargs=plot_kwargs, + ) + self.plot_rotor_diameters(fig, ax2, which=which, exclude=exclude, bar_kwargs=bar_kwargs) + self.plot_hub_heights(fig, ax4, which=which, bar_kwargs=bar_kwargs) + + for ax in ax_list: + ax.tick_params(axis='both', which='major', labelsize=7) + ax.xaxis.label.set_size(7) + ax.yaxis.label.set_size(8) + + for ax in (ax1, ax3, ax5): + ax.legend(fontsize=6) + + if return_fig: + return fig, ax_list + + fig.tight_layout() diff --git a/floris/turbine_library/x_20MW.yaml b/floris/turbine_library/x_20MW.yaml index 037f7f5b0..79dcf0476 100644 --- a/floris/turbine_library/x_20MW.yaml +++ b/floris/turbine_library/x_20MW.yaml @@ -5,6 +5,8 @@ pP: 1.88 pT: 1.88 rotor_diameter: 252.0 TSR: 8.0 +ref_density_cp_ct: 1.225 +ref_tilt_cp_ct: 5.0 power_thrust_table: power: - 0.000000 diff --git a/floris/type_dec.py b/floris/type_dec.py index fcf4fe2c1..b67cd8681 100644 --- a/floris/type_dec.py +++ b/floris/type_dec.py @@ -14,6 +14,7 @@ from __future__ import annotations +import copy from pathlib import Path from typing import ( Any, @@ -37,6 +38,7 @@ NDArrayInt = npt.NDArray[np.int_] NDArrayFilter = Union[npt.NDArray[np.int_], npt.NDArray[np.bool_]] NDArrayObject = npt.NDArray[np.object_] +NDArrayBool = npt.NDArray[np.bool_] ### Custom callables for attrs objects and functions @@ -48,12 +50,12 @@ def floris_array_converter(data: Iterable) -> np.ndarray: raise TypeError(e.args[0] + f". Data given: {data}") return a -def attr_serializer(inst: type, field: Attribute, value: Any): +def _attr_serializer(inst: type, field: Attribute, value: Any): if isinstance(value, np.ndarray): return value.tolist() return value -def attr_floris_filter(inst: Attribute, value: Any) -> bool: +def _attr_floris_filter(inst: Attribute, value: Any) -> bool: if inst.init is False: return False if value is None: @@ -85,7 +87,6 @@ def iter_validator(iter_type, item_types: Union[Any, Tuple[Any]]) -> Callable: ) return validator - def convert_to_path(fn: str | Path) -> Path: """Converts an input string or pathlib.Path object to a fully resolved ``pathlib.Path`` object. @@ -113,7 +114,7 @@ def convert_to_path(fn: str | Path) -> Path: class FromDictMixin: """ A Mixin class to allow for kwargs overloading when a data class doesn't - have a specific parameter definied. This allows passing of larger dictionaries + have a specific parameter defined. This allows passing of larger dictionaries to a data class without throwing an error. """ @@ -130,6 +131,9 @@ def from_dict(cls, data: dict): cls The `attr`-defined class. """ + # Make a copy of the input dict to prevent any side effects + data = copy.deepcopy(data) + # Check for any inputs that aren't part of the class definition class_attr_names = [a.name for a in cls.__attrs_attrs__] extra_args = [d for d in data if d not in class_attr_names] @@ -150,20 +154,21 @@ def from_dict(cls, data: dict): if undefined: raise AttributeError( - f"The class defintion for {cls.__name__} " - "is missing the following inputs: {undefined}" + f"The class definition for {cls.__name__} " + f"is missing the following inputs: {undefined}" ) return cls(**kwargs) def as_dict(self) -> dict: - """Creates a JSON and YAML friendly dictionary that can be save for future reloading. + """Creates a YAML friendly dictionary that can be saved for future reloading. This dictionary will contain only `Python` types that can later be converted to their - proper `Turbine` formats. + proper formats. See `_attr_floris_filter` for detail on which attributes are + removed from the export. Returns: - dict: All key, vaue pais required for class recreation. + dict: All key, value pairs required for class recreation. """ - return attrs.asdict(self, filter=attr_floris_filter, value_serializer=attr_serializer) + return attrs.asdict(self, filter=_attr_floris_filter, value_serializer=_attr_serializer) # Avoids constant redefinition of the same attr.ib properties for model attributes diff --git a/floris/utilities.py b/floris/utilities.py index 276bf26b6..6e565d225 100644 --- a/floris/utilities.py +++ b/floris/utilities.py @@ -12,7 +12,10 @@ # See https://floris.readthedocs.io for documentation +from __future__ import annotations + import os +from math import ceil from typing import Tuple import numpy as np @@ -188,14 +191,54 @@ def wrap_360(x): return x % 360.0 -def wind_delta(wind_directions): +def wind_delta(wind_directions: NDArrayFloat | float): + """ + This function calculates the deviation from West (270) for a given wind direction or series + of wind directions. First, 270 is subtracted from the input wind direction, and then the + remainder after dividing by 360 is retained (modulo). The table below lists examples of + results. + + | Input | Result | + | ----- | ------ | + | 270.0 | 0.0 | + | 280.0 | 10.0 | + | 360.0 | 90.0 | + | 180.0 | 270.0 | + | -10.0 | 80.0 | + |-100.0 | 350.0 | + + Args: + wind_directions (NDArrayFloat | float): A single or series of wind directions. They can be + any number, negative or positive, but it is typically between 0 and 360. + + Returns: + NDArrayFloat | float: The delta between the given wind direction and 270 in positive + quantities between 0 and 360. The returned type is the same as wind_directions. """ - This is included as a function in order to facilitate testing. + + return (wind_directions - 270) % 360 + + +def rotate_coordinates_rel_west( + wind_directions, + coordinates, + x_center_of_rotation=None, + y_center_of_rotation=None +): """ - return ((wind_directions - 270) % 360 + 360) % 360 + This function rotates the given coordinates so that they are aligned with West (270) rather + than North (0). The rotation happens about the centroid of the coordinates. + Args: + wind_directions (NDArrayFloat): Series of wind directions to base the rotation. + coordinates (NDArrayFloat): Series of coordinates to rotate with shape (N coordinates, 3) + so that each element of the array coordinates[i] yields a three-component coordinate. + x_center_of_rotation (float, optional): The x-coordinate for the rotation center of the + input coordinates. Defaults to None. + y_center_of_rotation (float, optional): The y-coordinate for the rotational center of the + input coordinates. Defaults to None. + """ -def rotate_coordinates_rel_west(wind_directions, coordinates): # Calculate the difference in given wind direction from 270 / West wind_deviation_from_west = wind_delta(wind_directions) wind_deviation_from_west = np.reshape(wind_deviation_from_west, (len(wind_directions), 1, 1)) @@ -204,8 +247,10 @@ def rotate_coordinates_rel_west(wind_directions, coordinates): x_coordinates, y_coordinates, z_coordinates = coordinates.T # Find center of rotation - this is the center of box bounding all of the turbines - x_center_of_rotation = (np.min(x_coordinates) + np.max(x_coordinates)) / 2 - y_center_of_rotation = (np.min(y_coordinates) + np.max(y_coordinates)) / 2 + if x_center_of_rotation is None: + x_center_of_rotation = (np.min(x_coordinates) + np.max(x_coordinates)) / 2 + if y_center_of_rotation is None: + y_center_of_rotation = (np.min(y_coordinates) + np.max(y_coordinates)) / 2 # Rotate turbine coordinates about the center x_coord_offset = x_coordinates - x_center_of_rotation @@ -221,7 +266,67 @@ def rotate_coordinates_rel_west(wind_directions, coordinates): + y_center_of_rotation ) z_coord_rotated = np.ones_like(wind_deviation_from_west) * z_coordinates - return x_coord_rotated, y_coord_rotated, z_coord_rotated + return x_coord_rotated, y_coord_rotated, z_coord_rotated, x_center_of_rotation, \ + y_center_of_rotation + + +def reverse_rotate_coordinates_rel_west( + wind_directions: NDArrayFloat, + grid_x: NDArrayFloat, + grid_y: NDArrayFloat, + grid_z: NDArrayFloat, + x_center_of_rotation: float, + y_center_of_rotation: float +): + """ + This function reverses the rotation of the given grid so that the coordinates are aligned with + the original wind direction. The rotation happens about the centroid of the coordinates. + + Args: + wind_directions (NDArrayFloat): Series of wind directions to base the rotation. + coordinates (NDArrayFloat): Series of coordinates to rotate with shape (N coordinates, 3) + so that each element of the array coordinates[i] yields a three-component coordinate. + grid_x (NDArrayFloat): X-coordinates to be rotated. + grid_y (NDArrayFloat): Y-coordinates to be rotated. + grid_z (NDArrayFloat): Z-coordinates to be rotated. + x_center_of_rotation (float): The x-coordinate for the rotation center of the + input coordinates. + y_center_of_rotation (float): The y-coordinate for the rotational center of the + input coordinates. + """ + # Calculate the difference in given wind direction from 270 / West + # We are rotating in the other direction + wind_deviation_from_west = -1.0 * wind_delta(wind_directions) + + # Construct the arrays storing the turbine locations + grid_x_reversed = np.zeros_like(grid_x) + grid_y_reversed = np.zeros_like(grid_x) + grid_z_reversed = np.zeros_like(grid_x) + for wii, angle_rotation in enumerate(wind_deviation_from_west): + x_rot = grid_x[wii, :, :, :, :] + y_rot = grid_y[wii, :, :, :, :] + z_rot = grid_z[wii, :, :, :, :] + + # Rotate turbine coordinates about the center + x_rot_offset = x_rot - x_center_of_rotation + y_rot_offset = y_rot - y_center_of_rotation + x = ( + x_rot_offset * cosd(angle_rotation) + - y_rot_offset * sind(angle_rotation) + + x_center_of_rotation + ) + y = ( + x_rot_offset * sind(angle_rotation) + + y_rot_offset * cosd(angle_rotation) + + y_center_of_rotation + ) + z = z_rot # Nothing changed in this rotation + + grid_x_reversed[wii, :, :, :, :] = x + grid_y_reversed[wii, :, :, :, :] = y + grid_z_reversed[wii, :, :, :, :] = z + + return grid_x_reversed, grid_y_reversed, grid_z_reversed class Loader(yaml.SafeLoader): @@ -243,7 +348,31 @@ def include(self, node): Loader.add_constructor('!include', Loader.include) def load_yaml(filename, loader=Loader): - if isinstance(filename, dict): - return filename # filename already yaml dict with open(filename) as fid: return yaml.load(fid, loader) + + +def round_nearest_2_or_5(x: int | float) -> int: + """Rounds a number (with a 0.5 buffer) up to the nearest integer divisible by 2 or 5. + + Args: + x (int | float): The number to be rounded. + + Returns: + int: The rounded number. + """ + base_2 = 2 + base_5 = 5 + return min(base_2 * ceil((x + 0.5) / base_2), base_5 * ceil((x + 0.5) / base_5)) + + +def round_nearest(x: int | float, base: int = 5) -> int: + """Rounds a number (with a 0.5 buffer) up to the nearest integer divisible by 5. + + Args: + x (int | float): The number to be rounded. + + Returns: + int: The rounded number. + """ + return base * ceil((x + 0.5) / base) diff --git a/profiling/profiling.py b/profiling/profiling.py index 7dd103b43..b0432d991 100644 --- a/profiling/profiling.py +++ b/profiling/profiling.py @@ -33,7 +33,7 @@ def run_floris(): # if len(sys.argv) > 1: # floris = Floris(sys.argv[1]) # else: - # floris = Floris("example_input.json") + # floris = Floris("example_input.yaml") # floris.farm.flow_field.calculate_wake() # start = time.time() diff --git a/pyproject.toml b/pyproject.toml index 7eb79cc1d..39683f439 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -119,6 +119,7 @@ dummy-variable-rgx = "^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$" "floris/simulation/wake_deflection/jimenez.py" = ["F841"] "floris/simulation/wake_velocity/jensen.py" = ["F841"] "floris/simulation/wake_velocity/gauss.py" = ["F841"] +"floris/simulation/wake_velocity/empirical_gauss.py" = ["F841"] # I001 unsorted-imports: ignore because the import order is meaningful to navigate # import dependencies diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index 9457ae315..000000000 --- a/requirements.txt +++ /dev/null @@ -1,17 +0,0 @@ -# Requirements list for floris - -# simulation -attrs -pyyaml -numexpr -numpy -scipy - -# tools -matplotlib -pandas -scipy -shapely - -# utilities -coloredlogs diff --git a/setup.py b/setup.py index c2692d7d5..d3af38d21 100644 --- a/setup.py +++ b/setup.py @@ -45,13 +45,17 @@ ] # What packages are optional? -# To use: pip install -e ".[develop]" or pip install "floris[develop]" +# To use: +# pip install -e ".[docs,develop]" install both sets of extras in editable install +# pip install -e ".[develop]" installs only developer packages in editable install +# pip install "floris[develop]" installs developer packages in non-editable install EXTRAS = { "docs": { - "jupyter-book", + "jupyter-book<=0.13.3", "sphinx-book-theme", "sphinx-autodoc-typehints", "sphinxcontrib-autoyaml", + "sphinxcontrib.mermaid", }, "develop": { "pytest", diff --git a/tests/conftest.py b/tests/conftest.py index 8a07749e6..efa4fd13c 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -13,6 +13,8 @@ # See https://floris.readthedocs.io for documentation +import copy + import numpy as np import pytest @@ -20,6 +22,7 @@ Floris, FlowField, FlowFieldGrid, + PointsGrid, TurbineGrid, ) from floris.utilities import Vec3 @@ -144,6 +147,25 @@ def flow_field_grid_fixture(sample_inputs_fixture) -> FlowFieldGrid: grid_resolution=[3,2,2] ) +@pytest.fixture +def points_grid_fixture(sample_inputs_fixture) -> PointsGrid: + turbine_coordinates = [Vec3(c) for c in list(zip(X_COORDS, Y_COORDS, Z_COORDS))] + rotor_diameters = ROTOR_DIAMETER * np.ones( (N_WIND_DIRECTIONS, N_WIND_SPEEDS, N_TURBINES) ) + points_x = [0.0, 10.0] + points_y = [0.0, 0.0] + points_z = [1.0, 2.0] + return PointsGrid( + turbine_coordinates=turbine_coordinates, + reference_turbine_diameter=rotor_diameters, + wind_directions=np.array(WIND_DIRECTIONS), + wind_speeds=np.array(WIND_SPEEDS), + grid_resolution=None, + time_series=False, + points_x=points_x, + points_y=points_y, + points_z=points_z, + ) + @pytest.fixture def floris_fixture(): sample_inputs = SampleInputs() @@ -168,6 +190,7 @@ def __init__(self): "pT": 1.88, "generator_efficiency": 1.0, "ref_density_cp_ct": 1.225, + "ref_tilt_cp_ct": 5.0, "power_thrust_table": { "power": [ 0.000000, @@ -323,6 +346,21 @@ def __init__(self): "TSR": 8.0 } + self.turbine_floating = copy.deepcopy(self.turbine) + self.turbine_floating["floating_tilt_table"] = { + "tilt": [ + 5.0, + 5.0, + 5.0, + ], + "wind_speeds": [ + 0.0, + 25.0, + 50.0, + ], + } + self.turbine_floating["floating_correct_cp_ct_for_tilt"] = True + self.farm = { "layout_x": X_COORDS, "layout_y": Y_COORDS, @@ -361,6 +399,13 @@ def __init__(self): "bd": 0.0, "kd": 0.05, }, + "empirical_gauss": { + "horizontal_deflection_gain_D": 3.0, + "vertical_deflection_gain_D": -1, + "deflection_rate": 15, + "mixing_gain_deflection": 0.0, + "yaw_added_mixing_gain": 0.0 + }, }, "wake_velocity_parameters": { "gauss": { @@ -385,7 +430,14 @@ def __init__(self): "turbopark": { "A": 0.04, "sigma_max_rel": 4.0 - } + }, + "empirical_gauss": { + "wake_expansion_rates": [0.01, 0.005], + "breakpoints_D": [10], + "sigma_0_D": 0.28, + "smoothing_length_D": 2.0, + "mixing_gain_velocity": 2.0 + }, }, "wake_turbulence_parameters": { "crespo_hernandez": { @@ -394,6 +446,9 @@ def __init__(self): "ai": 0.8, "downstream": -0.32 }, + "wake_induced_mixing": { + "atmospheric_ti_gain": 0.0 + } }, "enable_secondary_steering": False, "enable_yaw_added_recovery": False, diff --git a/tests/data/input_full_v3.json b/tests/data/input_full_v3.json deleted file mode 100644 index efccc4e37..000000000 --- a/tests/data/input_full_v3.json +++ /dev/null @@ -1,274 +0,0 @@ -{ - "name": "test_input", - "description": "Single turbine for testing", - "floris_version": "v3.0.0", - - "logging": { - "console": { - "enable": false, - "level": "WARNING" - }, - "file": { - "enable": false, - "level": "WARNING" - } - }, - - "solver": { - "type": "turbine_grid", - "turbine_grid_points": 3 - }, - - "farm": { - "layout_x": [ - 0.0 - ], - "layout_y": [ - 0.0 - ], - "turbine_type": [ - "nrel_5MW" - ], - "turbine_definitions": [ - "!include nrel_5MW.yaml" - ] - }, - - "flow_field": { - "air_density": 1.225, - "reference_wind_height": 90.0, - "turbulence_intensity": 0.06, - "wind_directions": [ - 270.0 - ], - "wind_shear": 0.12, - "wind_speeds": [ - 8.0 - ], - "wind_veer": 0.0 - }, - - "wake": { - "model_strings": { - "combination_model": "sosfs", - "deflection_model": "gauss", - "turbulence_model": "crespo_hernandez", - "velocity_model": "cc" - }, - - "enable_secondary_steering": true, - "enable_yaw_added_recovery": true, - "enable_transverse_velocities": true, - - "wake_deflection_parameters": { - "gauss": { - "ad": 0.0, - "alpha": 0.58, - "bd": 0.0, - "beta": 0.077, - "dm": 1.0, - "ka": 0.38, - "kb": 0.004 - }, - "jimenez": { - "ad": 0.0, - "bd": 0.0, - "kd": 0.05 - } - }, - - "wake_velocity_parameters": { - "cc": { - "a_s": 0.179367259, - "b_s": 0.0118889215, - "c_s1": 0.0563691592, - "c_s2": 0.13290157, - "a_f": 3.11, - "b_f": -0.68, - "c_f": 2.41, - "alpha_mod": 1.0 - }, - "gauss": { - "alpha": 0.58, - "beta": 0.077, - "ka": 0.38, - "kb": 0.004 - }, - "jensen": { - "we": 0.05 - } - }, - - "wake_turbulence_parameters": { - "crespo_hernandez": { - "initial": 0.01, - "constant": 0.9, - "ai": 0.83, - "downstream": -0.25 - } - } - - - }, - - "turbine": { - "generator_efficiency": 1.0, - "hub_height": 90.0, - "pP": 1.88, - "pT": 1.88, - "rotor_diameter": 126.0, - "TSR": 8.0, - "power_thrust_table": { - "power": [ - 0.0, - 0.0, - 0.1780851, - 0.28907459, - 0.34902166, - 0.3847278, - 0.40605878, - 0.4202279, - 0.42882274, - 0.43387274, - 0.43622267, - 0.43684468, - 0.43657497, - 0.43651053, - 0.4365612, - 0.43651728, - 0.43590309, - 0.43467276, - 0.43322955, - 0.43003137, - 0.37655587, - 0.33328466, - 0.29700574, - 0.26420779, - 0.23839379, - 0.21459275, - 0.19382354, - 0.1756635, - 0.15970926, - 0.14561785, - 0.13287856, - 0.12130194, - 0.11219941, - 0.10311631, - 0.09545392, - 0.08813781, - 0.08186763, - 0.07585005, - 0.07071926, - 0.06557558, - 0.06148104, - 0.05755207, - 0.05413366, - 0.05097969, - 0.04806545, - 0.04536883, - 0.04287006, - 0.04055141 - ], - "thrust": [ - 1.19187945, - 1.17284634, - 1.09860817, - 1.02889592, - 0.97373036, - 0.92826162, - 0.89210543, - 0.86100905, - 0.835423, - 0.81237673, - 0.79225789, - 0.77584769, - 0.7629228, - 0.76156073, - 0.76261984, - 0.76169723, - 0.75232027, - 0.74026851, - 0.72987175, - 0.70701647, - 0.54054532, - 0.45509459, - 0.39343381, - 0.34250785, - 0.30487242, - 0.27164979, - 0.24361964, - 0.21973831, - 0.19918151, - 0.18131868, - 0.16537679, - 0.15103727, - 0.13998636, - 0.1289037, - 0.11970413, - 0.11087113, - 0.10339901, - 0.09617888, - 0.09009926, - 0.08395078, - 0.0791188, - 0.07448356, - 0.07050731, - 0.06684119, - 0.06345518, - 0.06032267, - 0.05741999, - 0.05472609 - ], - "wind_speed": [ - 2.0, - 2.5, - 3.0, - 3.5, - 4.0, - 4.5, - 5.0, - 5.5, - 6.0, - 6.5, - 7.0, - 7.5, - 8.0, - 8.5, - 9.0, - 9.5, - 10.0, - 10.5, - 11.0, - 11.5, - 12.0, - 12.5, - 13.0, - 13.5, - 14.0, - 14.5, - 15.0, - 15.5, - 16.0, - 16.5, - 17.0, - 17.5, - 18.0, - 18.5, - 19.0, - 19.5, - 20.0, - 20.5, - 21.0, - 21.5, - 22.0, - 22.5, - 23.0, - 23.5, - 24.0, - 24.5, - 25.0, - 25.5 - ] - } - } -} diff --git a/tests/data/input_full_v3.yaml b/tests/data/input_full_v3.yaml index 2a06234b0..5cace12df 100644 --- a/tests/data/input_full_v3.yaml +++ b/tests/data/input_full_v3.yaml @@ -39,7 +39,7 @@ wake: combination_model: sosfs deflection_model: gauss turbulence_model: crespo_hernandez - velocity_model: cc + velocity_model: gauss enable_secondary_steering: true enable_yaw_added_recovery: true diff --git a/tests/data/nrel_5MW.yaml b/tests/data/nrel_5MW.yaml deleted file mode 100644 index b4ac8c1c7..000000000 --- a/tests/data/nrel_5MW.yaml +++ /dev/null @@ -1,165 +0,0 @@ -turbine_type: 'nrel_5MW' -generator_efficiency: 1.0 -hub_height: 90.0 -pP: 1.88 -pT: 1.88 -rotor_diameter: 126.0 -TSR: 8.0 -ref_density_cp_ct: 1.225 -power_thrust_table: - power: - - 0.0 - - 0.000000 - - 0.000000 - - 0.178085 - - 0.289075 - - 0.349022 - - 0.384728 - - 0.406059 - - 0.420228 - - 0.428823 - - 0.433873 - - 0.436223 - - 0.436845 - - 0.436575 - - 0.436511 - - 0.436561 - - 0.436517 - - 0.435903 - - 0.434673 - - 0.433230 - - 0.430466 - - 0.378869 - - 0.335199 - - 0.297991 - - 0.266092 - - 0.238588 - - 0.214748 - - 0.193981 - - 0.175808 - - 0.159835 - - 0.145741 - - 0.133256 - - 0.122157 - - 0.112257 - - 0.103399 - - 0.095449 - - 0.088294 - - 0.081836 - - 0.075993 - - 0.070692 - - 0.065875 - - 0.061484 - - 0.057476 - - 0.053809 - - 0.050447 - - 0.047358 - - 0.044518 - - 0.041900 - - 0.039483 - - 0.0 - - 0.0 - thrust: - - 0.0 - - 0.0 - - 0.0 - - 0.99 - - 0.99 - - 0.97373036 - - 0.92826162 - - 0.89210543 - - 0.86100905 - - 0.835423 - - 0.81237673 - - 0.79225789 - - 0.77584769 - - 0.7629228 - - 0.76156073 - - 0.76261984 - - 0.76169723 - - 0.75232027 - - 0.74026851 - - 0.72987175 - - 0.70701647 - - 0.54054532 - - 0.45509459 - - 0.39343381 - - 0.34250785 - - 0.30487242 - - 0.27164979 - - 0.24361964 - - 0.21973831 - - 0.19918151 - - 0.18131868 - - 0.16537679 - - 0.15103727 - - 0.13998636 - - 0.1289037 - - 0.11970413 - - 0.11087113 - - 0.10339901 - - 0.09617888 - - 0.09009926 - - 0.08395078 - - 0.0791188 - - 0.07448356 - - 0.07050731 - - 0.06684119 - - 0.06345518 - - 0.06032267 - - 0.05741999 - - 0.05472609 - - 0.0 - - 0.0 - wind_speed: - - 0.0 - - 2.0 - - 2.5 - - 3.0 - - 3.5 - - 4.0 - - 4.5 - - 5.0 - - 5.5 - - 6.0 - - 6.5 - - 7.0 - - 7.5 - - 8.0 - - 8.5 - - 9.0 - - 9.5 - - 10.0 - - 10.5 - - 11.0 - - 11.5 - - 12.0 - - 12.5 - - 13.0 - - 13.5 - - 14.0 - - 14.5 - - 15.0 - - 15.5 - - 16.0 - - 16.5 - - 17.0 - - 17.5 - - 18.0 - - 18.5 - - 19.0 - - 19.5 - - 20.0 - - 20.5 - - 21.0 - - 21.5 - - 22.0 - - 22.5 - - 23.0 - - 23.5 - - 24.0 - - 24.5 - - 25.0 - - 25.01 - - 25.02 - - 50.0 diff --git a/tests/data/nrel_5MW.yaml b/tests/data/nrel_5MW.yaml new file mode 120000 index 000000000..9d69e225f --- /dev/null +++ b/tests/data/nrel_5MW.yaml @@ -0,0 +1 @@ +../../floris/turbine_library/nrel_5MW.yaml \ No newline at end of file diff --git a/tests/data/nrel_5MW_custom.yaml b/tests/data/nrel_5MW_custom.yaml index 27039a298..9e3ef6735 100644 --- a/tests/data/nrel_5MW_custom.yaml +++ b/tests/data/nrel_5MW_custom.yaml @@ -6,6 +6,7 @@ pT: 1.88 rotor_diameter: 126.0 TSR: 8.0 ref_density_cp_ct: 1.225 +ref_tilt_cp_ct: 5.0 power_thrust_table: power: - 0.0 diff --git a/tests/farm_unit_test.py b/tests/farm_unit_test.py index 4513e0e2d..53c340a20 100644 --- a/tests/farm_unit_test.py +++ b/tests/farm_unit_test.py @@ -12,7 +12,6 @@ # See https://floris.readthedocs.io for documentation -import logging from copy import deepcopy from pathlib import Path @@ -22,6 +21,7 @@ from floris.simulation import Farm from floris.utilities import load_yaml, Vec3 from tests.conftest import ( + N_TURBINES, N_WIND_DIRECTIONS, N_WIND_SPEEDS, SampleInputs, @@ -62,32 +62,114 @@ def test_asdict(sample_inputs_fixture: SampleInputs): farm = Farm.from_dict(sample_inputs_fixture.farm) farm.construct_hub_heights() farm.construct_coordinates() + farm.construct_turbine_ref_tilt_cp_cts() farm.set_yaw_angles(N_WIND_DIRECTIONS, N_WIND_SPEEDS) + farm.set_tilt_to_ref_tilt(N_WIND_DIRECTIONS, N_WIND_SPEEDS) dict1 = farm.as_dict() new_farm = farm.from_dict(dict1) new_farm.construct_hub_heights() new_farm.construct_coordinates() + new_farm.construct_turbine_ref_tilt_cp_cts() new_farm.set_yaw_angles(N_WIND_DIRECTIONS, N_WIND_SPEEDS) + new_farm.set_tilt_to_ref_tilt(N_WIND_DIRECTIONS, N_WIND_SPEEDS) dict2 = new_farm.as_dict() assert dict1 == dict2 +def test_check_turbine_type(sample_inputs_fixture: SampleInputs): + # 1 definition for multiple turbines in the farm + farm_data = deepcopy(sample_inputs_fixture.farm) + farm_data["turbine_type"] = ["nrel_5MW"] + farm_data["layout_x"] = np.arange(0, 500, 100) + farm_data["layout_y"] = np.zeros(5) + farm = Farm.from_dict(farm_data) + assert len(farm.turbine_type) == 1 + assert len(farm.turbine_definitions) == 5 + + # N definitions for M turbines + farm_data = deepcopy(sample_inputs_fixture.farm) + farm_data["turbine_type"] = ["nrel_5MW", "nrel_5MW"] + farm_data["layout_x"] = np.arange(0, 500, 100) + farm_data["layout_y"] = np.zeros(5) + with pytest.raises(ValueError): + Farm.from_dict(farm_data) + + # All list of strings from internal library + farm_data = deepcopy(sample_inputs_fixture.farm) + farm_data["turbine_type"] = ["nrel_5MW", "iea_10MW", "iea_15MW", "x_20MW", "nrel_5MW"] + farm_data["layout_x"] = np.arange(0, 500, 100) + farm_data["layout_y"] = np.zeros(5) + farm = Farm.from_dict(farm_data) + assert len(farm.turbine_type) == 5 + assert len(farm.turbine_definitions) == 5 + + # String not found in internal library + farm_data = deepcopy(sample_inputs_fixture.farm) + farm_data["turbine_type"] = ["asdf"] + farm_data["layout_x"] = np.arange(0, 500, 100) + farm_data["layout_y"] = np.zeros(5) + with pytest.raises(FileNotFoundError): + Farm.from_dict(farm_data) + + # All list of dicts from external library + farm_data = deepcopy(sample_inputs_fixture.farm) + external_library = Path(__file__).parent / "data" + turbine_def = load_yaml(external_library / "nrel_5MW_custom.yaml") + farm_data["turbine_type"] = [turbine_def] * 5 + farm_data["layout_x"] = np.arange(0, 500, 100) + farm_data["layout_y"] = np.zeros(5) + Farm.from_dict(farm_data) + assert len(farm.turbine_type) == 5 + assert len(farm.turbine_definitions) == 5 + + # Duplicate type found in external and internal library + farm_data = deepcopy(sample_inputs_fixture.farm) + external_library = Path(__file__).parent / "data" + farm_data["turbine_library_path"] = external_library + farm_data["turbine_type"] = ["nrel_5MW"] + with pytest.raises(ValueError): + Farm.from_dict(farm_data) + + # 1 turbine as string from internal library, 1 turbine as dict from external library + farm_data = deepcopy(sample_inputs_fixture.farm) + external_library = Path(__file__).parent / "data" + turbine_def = load_yaml(external_library / "nrel_5MW_custom.yaml") + farm_data["turbine_type"] = [turbine_def] * 5 + farm_data["layout_x"] = np.arange(0, 500, 100) + farm_data["layout_y"] = np.zeros(5) + farm_data["turbine_type"] = ["nrel_5MW", turbine_def, "nrel_5MW", turbine_def, "nrel_5MW"] + Farm.from_dict(farm_data) + assert len(farm.turbine_type) == 5 + assert len(farm.turbine_definitions) == 5 + + # 1 turbine as string from internal library, 1 turbine as string from external library + farm_data = deepcopy(sample_inputs_fixture.farm) + external_library = Path(__file__).parent / "data" + farm_data["turbine_library_path"] = external_library + farm_data["turbine_type"] = 4 * ["iea_10MW"] + ["nrel_5MW_custom"] + farm_data["layout_x"] = np.arange(0, 500, 100) + farm_data["layout_y"] = np.zeros(5) + Farm.from_dict(farm_data) + assert len(farm.turbine_type) == 5 + assert len(farm.turbine_definitions) == 5 + + def test_farm_external_library(sample_inputs_fixture: SampleInputs): external_library = Path(__file__).parent / "data" # Demonstrate a passing case farm_data = deepcopy(SampleInputs().farm) farm_data["turbine_library_path"] = external_library - farm_data["turbine_type"] = ["nrel_5MW_custom"] * len(farm_data["layout_x"]) + farm_data["turbine_type"] = ["nrel_5MW_custom"] * N_TURBINES farm = Farm.from_dict(farm_data) assert farm.turbine_library_path == external_library # Demonstrate a file not existing in the user library, but exists in the internal library, so # the loading is successful farm_data["turbine_library_path"] = external_library - farm_data["turbine_type"] = ["iea_10MW"] * len(farm_data["layout_x"]) + farm_data["turbine_type"] = ["iea_10MW"] * N_TURBINES farm = Farm.from_dict(farm_data) assert farm.turbine_definitions[0]["turbine_type"] == "iea_10MW" @@ -100,22 +182,13 @@ def test_farm_external_library(sample_inputs_fixture: SampleInputs): # and external turbine libraries farm_data = deepcopy(SampleInputs().farm) farm_data["turbine_library_path"] = external_library - farm_data["turbine_type"] = ["nrel_5MW"] * len(farm_data["layout_x"]) + farm_data["turbine_type"] = ["nrel_5MW"] * N_TURBINES with pytest.raises(ValueError): Farm.from_dict(farm_data) - -def test_farm_unique_loading(sample_inputs_fixture: SampleInputs, caplog): - # Setup the current location and the logging capture - ROOT = Path(__file__).parent - caplog.set_level(logging.WARNING) - - # Setup the turbine data - turbine = load_yaml(ROOT / "../floris/turbine_library/x_20MW.yaml") - farm_data = sample_inputs_fixture.farm - farm_data["turbine_type"] = [turbine, turbine, turbine] - _ = Farm.from_dict(farm_data) - - # The x_20MW turbine is missing air density, so a warning is logged, make sure this - # is only logged once, per the unique turbine checking - assert len(caplog.records) == 1 + # Demonstrate a failing case where there a turbine does not exist in either + farm_data = deepcopy(SampleInputs().farm) + farm_data["turbine_library_path"] = external_library + farm_data["turbine_type"] = ["FAKE_TURBINE"] * N_TURBINES + with pytest.raises(FileNotFoundError): + Farm.from_dict(farm_data) diff --git a/tests/floris_interface_test.py b/tests/floris_interface_test.py index aba95b74b..494576983 100644 --- a/tests/floris_interface_test.py +++ b/tests/floris_interface_test.py @@ -8,7 +8,6 @@ TEST_DATA = Path(__file__).resolve().parent / "data" YAML_INPUT = TEST_DATA / "input_full_v3.yaml" -JSON_INPUT = TEST_DATA / "input_full_v3.json" def test_read_yaml(): diff --git a/tests/floris_unit_test.py b/tests/floris_unit_test.py index 1733b9183..05c01f022 100644 --- a/tests/floris_unit_test.py +++ b/tests/floris_unit_test.py @@ -27,7 +27,6 @@ TEST_DATA = Path(__file__).resolve().parent / "data" YAML_INPUT = TEST_DATA / "input_full_v3.yaml" -JSON_INPUT = TEST_DATA / "input_full_v3.json" DICT_INPUT = yaml.load(open(YAML_INPUT, "r"), Loader=yaml.SafeLoader) diff --git a/tests/reg_tests/cumulative_curl_regression_test.py b/tests/reg_tests/cumulative_curl_regression_test.py index 0cbe680c5..d0fea7a01 100644 --- a/tests/reg_tests/cumulative_curl_regression_test.py +++ b/tests/reg_tests/cumulative_curl_regression_test.py @@ -20,6 +20,7 @@ Ct, Floris, power, + rotor_effective_velocity, ) from tests.conftest import ( assert_results_arrays, @@ -173,30 +174,53 @@ def test_regression_tandem(sample_inputs_fixture): velocities = floris.flow_field.u yaw_angles = floris.farm.yaw_angles + tilt_angles = floris.farm.tilt_angles + ref_tilt_cp_cts = ( + np.ones((n_wind_directions, n_wind_speeds, n_turbines)) + * floris.farm.ref_tilt_cp_cts + ) test_results = np.zeros((n_wind_directions, n_wind_speeds, n_turbines, 4)) farm_avg_velocities = average_velocity( velocities, ) + farm_eff_velocities = rotor_effective_velocity( + floris.flow_field.air_density, + floris.farm.ref_density_cp_cts, + velocities, + yaw_angles, + tilt_angles, + ref_tilt_cp_cts, + floris.farm.pPs, + floris.farm.pTs, + floris.farm.turbine_fTilts, + floris.farm.correct_cp_ct_for_tilt, + floris.farm.turbine_type_map, + ) farm_cts = Ct( velocities, yaw_angles, + tilt_angles, + ref_tilt_cp_cts, floris.farm.turbine_fCts, + floris.farm.turbine_fTilts, + floris.farm.correct_cp_ct_for_tilt, floris.farm.turbine_type_map, ) farm_powers = power( - floris.flow_field.air_density, floris.farm.ref_density_cp_cts, - velocities, - yaw_angles, - floris.farm.pPs, + farm_eff_velocities, floris.farm.turbine_power_interps, floris.farm.turbine_type_map, ) farm_axial_inductions = axial_induction( velocities, yaw_angles, + tilt_angles, + ref_tilt_cp_cts, floris.farm.turbine_fCts, + floris.farm.turbine_fTilts, + floris.farm.correct_cp_ct_for_tilt, floris.farm.turbine_type_map, ) for i in range(n_wind_directions): @@ -318,30 +342,53 @@ def test_regression_yaw(sample_inputs_fixture): velocities = floris.flow_field.u yaw_angles = floris.farm.yaw_angles + tilt_angles = floris.farm.tilt_angles + ref_tilt_cp_cts = ( + np.ones((n_wind_directions, n_wind_speeds, n_turbines)) + * floris.farm.ref_tilt_cp_cts + ) test_results = np.zeros((n_wind_directions, n_wind_speeds, n_turbines, 4)) farm_avg_velocities = average_velocity( velocities, ) + farm_eff_velocities = rotor_effective_velocity( + floris.flow_field.air_density, + floris.farm.ref_density_cp_cts, + velocities, + yaw_angles, + tilt_angles, + ref_tilt_cp_cts, + floris.farm.pPs, + floris.farm.pTs, + floris.farm.turbine_fTilts, + floris.farm.correct_cp_ct_for_tilt, + floris.farm.turbine_type_map, + ) farm_cts = Ct( velocities, yaw_angles, + tilt_angles, + ref_tilt_cp_cts, floris.farm.turbine_fCts, + floris.farm.turbine_fTilts, + floris.farm.correct_cp_ct_for_tilt, floris.farm.turbine_type_map, ) farm_powers = power( - floris.flow_field.air_density, floris.farm.ref_density_cp_cts, - velocities, - yaw_angles, - floris.farm.pPs, + farm_eff_velocities, floris.farm.turbine_power_interps, floris.farm.turbine_type_map, ) farm_axial_inductions = axial_induction( velocities, yaw_angles, + tilt_angles, + ref_tilt_cp_cts, floris.farm.turbine_fCts, + floris.farm.turbine_fTilts, + floris.farm.correct_cp_ct_for_tilt, floris.farm.turbine_type_map, ) for i in range(n_wind_directions): @@ -391,30 +438,53 @@ def test_regression_yaw_added_recovery(sample_inputs_fixture): velocities = floris.flow_field.u yaw_angles = floris.farm.yaw_angles + tilt_angles = floris.farm.tilt_angles + ref_tilt_cp_cts = ( + np.ones((n_wind_directions, n_wind_speeds, n_turbines)) + * floris.farm.ref_tilt_cp_cts + ) test_results = np.zeros((n_wind_directions, n_wind_speeds, n_turbines, 4)) farm_avg_velocities = average_velocity( velocities, ) + farm_eff_velocities = rotor_effective_velocity( + floris.flow_field.air_density, + floris.farm.ref_density_cp_cts, + velocities, + yaw_angles, + tilt_angles, + ref_tilt_cp_cts, + floris.farm.pPs, + floris.farm.pTs, + floris.farm.turbine_fTilts, + floris.farm.correct_cp_ct_for_tilt, + floris.farm.turbine_type_map, + ) farm_cts = Ct( velocities, yaw_angles, + tilt_angles, + ref_tilt_cp_cts, floris.farm.turbine_fCts, + floris.farm.turbine_fTilts, + floris.farm.correct_cp_ct_for_tilt, floris.farm.turbine_type_map, ) farm_powers = power( - floris.flow_field.air_density, floris.farm.ref_density_cp_cts, - velocities, - yaw_angles, - floris.farm.pPs, + farm_eff_velocities, floris.farm.turbine_power_interps, floris.farm.turbine_type_map, ) farm_axial_inductions = axial_induction( velocities, yaw_angles, + tilt_angles, + ref_tilt_cp_cts, floris.farm.turbine_fCts, + floris.farm.turbine_fTilts, + floris.farm.correct_cp_ct_for_tilt, floris.farm.turbine_type_map, ) for i in range(n_wind_directions): @@ -463,30 +533,53 @@ def test_regression_secondary_steering(sample_inputs_fixture): velocities = floris.flow_field.u yaw_angles = floris.farm.yaw_angles + tilt_angles = floris.farm.tilt_angles + ref_tilt_cp_cts = ( + np.ones((n_wind_directions, n_wind_speeds, n_turbines)) + * floris.farm.ref_tilt_cp_cts + ) test_results = np.zeros((n_wind_directions, n_wind_speeds, n_turbines, 4)) farm_avg_velocities = average_velocity( velocities, ) + farm_eff_velocities = rotor_effective_velocity( + floris.flow_field.air_density, + floris.farm.ref_density_cp_cts, + velocities, + yaw_angles, + tilt_angles, + ref_tilt_cp_cts, + floris.farm.pPs, + floris.farm.pTs, + floris.farm.turbine_fTilts, + floris.farm.correct_cp_ct_for_tilt, + floris.farm.turbine_type_map, + ) farm_cts = Ct( velocities, yaw_angles, + tilt_angles, + ref_tilt_cp_cts, floris.farm.turbine_fCts, + floris.farm.turbine_fTilts, + floris.farm.correct_cp_ct_for_tilt, floris.farm.turbine_type_map, ) farm_powers = power( - floris.flow_field.air_density, floris.farm.ref_density_cp_cts, - velocities, - yaw_angles, - floris.farm.pPs, + farm_eff_velocities, floris.farm.turbine_power_interps, floris.farm.turbine_type_map, ) farm_axial_inductions = axial_induction( velocities, yaw_angles, + tilt_angles, + ref_tilt_cp_cts, floris.farm.turbine_fCts, + floris.farm.turbine_fTilts, + floris.farm.correct_cp_ct_for_tilt, floris.farm.turbine_type_map, ) for i in range(n_wind_directions): @@ -543,13 +636,25 @@ def test_regression_small_grid_rotation(sample_inputs_fixture): # farm_avg_velocities = average_velocity(floris.flow_field.u) velocities = floris.flow_field.u yaw_angles = floris.farm.yaw_angles + tilt_angles = floris.farm.tilt_angles + ref_tilt_cp_cts = np.ones((1, 1, len(X))) * floris.farm.ref_tilt_cp_cts - farm_powers = power( + farm_eff_velocities = rotor_effective_velocity( floris.flow_field.air_density, floris.farm.ref_density_cp_cts, velocities, yaw_angles, + tilt_angles, + ref_tilt_cp_cts, floris.farm.pPs, + floris.farm.pTs, + floris.farm.turbine_fTilts, + floris.farm.correct_cp_ct_for_tilt, + floris.farm.turbine_type_map, + ) + farm_powers = power( + floris.farm.ref_density_cp_cts, + farm_eff_velocities, floris.farm.turbine_power_interps, floris.farm.turbine_type_map, ) diff --git a/tests/reg_tests/empirical_gauss_regression_test.py b/tests/reg_tests/empirical_gauss_regression_test.py new file mode 100644 index 000000000..4c207ddeb --- /dev/null +++ b/tests/reg_tests/empirical_gauss_regression_test.py @@ -0,0 +1,425 @@ +# Copyright 2022 NREL + +# Licensed under the Apache License, Version 2.0 (the "License"); you may not +# use this file except in compliance with the License. You may obtain a copy of +# the License at http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. + +# See https://floris.readthedocs.io for documentation + +import numpy as np + +from floris.simulation import ( + average_velocity, + axial_induction, + Ct, + Floris, + power, + rotor_effective_velocity, +) +from tests.conftest import ( + assert_results_arrays, + N_TURBINES, + N_WIND_DIRECTIONS, + N_WIND_SPEEDS, + print_test_values, +) + + +DEBUG = False +VELOCITY_MODEL = "empirical_gauss" +DEFLECTION_MODEL = "empirical_gauss" +TURBULENCE_MODEL = "wake_induced_mixing" + + +baseline = np.array( + [ + # 8 m/s + [ + [7.9736330, 0.7636044, 1691326.6483808, 0.2568973], + [5.1827276, 0.8807411, 441118.3637433, 0.3273306], + [4.9925898, 0.8926413, 385869.8808447, 0.3361718], + ], + # 9m/s + [ + [8.9703371, 0.7625570, 2407841.6718785, 0.2563594], + [5.8355012, 0.8438407, 650343.4078478, 0.3024150], + [5.6871296, 0.8514332, 598874.9374620, 0.3072782], + ], + # 10 m/s + [ + [9.9670412, 0.7529384, 3298067.1555604, 0.2514735], + [6.5341306, 0.8110034, 925882.5592972, 0.2826313], + [6.4005794, 0.8169593, 869713.2904634, 0.2860837], + ], + # 11 m/s + [ + [10.9637454, 0.7306256, 4363191.9880631, 0.2404936], + [7.3150380, 0.7819182, 1309551.0796815, 0.2665039], + [7.1452486, 0.7874908, 1219637.5477980, 0.2695064], + ], + ] +) + +yawed_baseline = np.array( + [ + # 8 m/s + [ + [7.9736330, 0.7606986, 1679924.0721706, 0.2549029], + [5.2892493, 0.8741162, 472289.7835635, 0.3225995], + [5.0661805, 0.8879895, 407013.1948403, 0.3326601], + ], + # 9 m/s + [ + [8.9703371, 0.7596552, 2391434.0080674, 0.2543734], + [5.9548519, 0.8377333, 691744.8624111, 0.2985883], + [5.7711008, 0.8471363, 628003.5991427, 0.3045110], + ], + # 10 m/s + [ + [9.9670412, 0.7500732, 3275671.6727516, 0.2495630], + [6.6618693, 0.8058635, 985338.0488503, 0.2796954], + [6.4905463, 0.8128125, 906166.1389747, 0.2836741], + ], + # 11 m/s + [ + [10.9637454, 0.7278454, 4333842.6695283, 0.2387424], + [7.4437653, 0.7776933, 1377719.8294419, 0.2642530], + [7.2350472, 0.7845435, 1267191.1878400, 0.2679136], + ], + ] +) + +# Note: compare the yawed vs non-yawed results. The upstream turbine +# power should be lower in the yawed case. The following turbine +# powers should higher in the yawed case. + + +def test_regression_tandem(sample_inputs_fixture): + """ + Tandem turbines + """ + sample_inputs_fixture.floris["wake"]["model_strings"]["velocity_model"] = VELOCITY_MODEL + sample_inputs_fixture.floris["wake"]["model_strings"]["deflection_model"] = DEFLECTION_MODEL + sample_inputs_fixture.floris["wake"]["model_strings"]["turbulence_model"] = TURBULENCE_MODEL + + floris = Floris.from_dict(sample_inputs_fixture.floris) + floris.initialize_domain() + floris.steady_state_atmospheric_condition() + + n_turbines = floris.farm.n_turbines + n_wind_speeds = floris.flow_field.n_wind_speeds + n_wind_directions = floris.flow_field.n_wind_directions + + velocities = floris.flow_field.u + yaw_angles = floris.farm.yaw_angles + tilt_angles = floris.farm.tilt_angles + ref_tilt_cp_cts = ( + np.ones((n_wind_directions, n_wind_speeds, n_turbines)) + * floris.farm.ref_tilt_cp_cts + ) + test_results = np.zeros((n_wind_directions, n_wind_speeds, n_turbines, 4)) + + farm_avg_velocities = average_velocity( + velocities, + ) + farm_eff_velocities = rotor_effective_velocity( + floris.flow_field.air_density, + floris.farm.ref_density_cp_cts, + velocities, + yaw_angles, + tilt_angles, + ref_tilt_cp_cts, + floris.farm.pPs, + floris.farm.pTs, + floris.farm.turbine_fTilts, + floris.farm.correct_cp_ct_for_tilt, + floris.farm.turbine_type_map, + ) + farm_cts = Ct( + velocities, + yaw_angles, + tilt_angles, + ref_tilt_cp_cts, + floris.farm.turbine_fCts, + floris.farm.turbine_fTilts, + floris.farm.correct_cp_ct_for_tilt, + floris.farm.turbine_type_map, + ) + farm_powers = power( + floris.farm.ref_density_cp_cts, + farm_eff_velocities, + floris.farm.turbine_power_interps, + floris.farm.turbine_type_map, + ) + farm_axial_inductions = axial_induction( + velocities, + yaw_angles, + tilt_angles, + ref_tilt_cp_cts, + floris.farm.turbine_fCts, + floris.farm.turbine_fTilts, + floris.farm.correct_cp_ct_for_tilt, + floris.farm.turbine_type_map, + ) + for i in range(n_wind_directions): + for j in range(n_wind_speeds): + for k in range(n_turbines): + test_results[i, j, k, 0] = farm_avg_velocities[i, j, k] + test_results[i, j, k, 1] = farm_cts[i, j, k] + test_results[i, j, k, 2] = farm_powers[i, j, k] + test_results[i, j, k, 3] = farm_axial_inductions[i, j, k] + + if DEBUG: + print_test_values( + farm_avg_velocities, + farm_cts, + farm_powers, + farm_axial_inductions, + ) + + assert_results_arrays(test_results[0], baseline) + + +def test_regression_rotation(sample_inputs_fixture): + """ + Turbines in tandem and rotated. + The result from 270 degrees should match the results from 360 degrees. + + Wind from the West (Left) + + ^ + | + y + + 1|1 3 + | + | + | + 0|0 2 + |----------| + 0 1 x-> + + + Wind from the North (Top), rotated + + ^ + | + y + + 1|3 2 + | + | + | + 0|1 0 + |----------| + 0 1 x-> + + In 270, turbines 2 and 3 are waked. In 360, turbines 0 and 2 are waked. + The test compares turbines 2 and 3 with 0 and 2 from 270 and 360. + """ + TURBINE_DIAMETER = 126.0 + + sample_inputs_fixture.floris["wake"]["model_strings"]["velocity_model"] = VELOCITY_MODEL + sample_inputs_fixture.floris["wake"]["model_strings"]["deflection_model"] = DEFLECTION_MODEL + sample_inputs_fixture.floris["wake"]["model_strings"]["turbulence_model"] = TURBULENCE_MODEL + sample_inputs_fixture.floris["farm"]["layout_x"] = [ + 0.0, + 0.0, + 5 * TURBINE_DIAMETER, + 5 * TURBINE_DIAMETER, + ] + sample_inputs_fixture.floris["farm"]["layout_y"] = [ + 0.0, + 5 * TURBINE_DIAMETER, + 0.0, + 5 * TURBINE_DIAMETER + ] + sample_inputs_fixture.floris["flow_field"]["wind_directions"] = [270.0, 360.0] + sample_inputs_fixture.floris["flow_field"]["wind_speeds"] = [8.0] + + floris = Floris.from_dict(sample_inputs_fixture.floris) + floris.initialize_domain() + floris.steady_state_atmospheric_condition() + + farm_avg_velocities = average_velocity(floris.flow_field.u) + + t0_270 = farm_avg_velocities[0, 0, 0] # upstream + t1_270 = farm_avg_velocities[0, 0, 1] # upstream + t2_270 = farm_avg_velocities[0, 0, 2] # waked + t3_270 = farm_avg_velocities[0, 0, 3] # waked + + t0_360 = farm_avg_velocities[1, 0, 0] # waked + t1_360 = farm_avg_velocities[1, 0, 1] # upstream + t2_360 = farm_avg_velocities[1, 0, 2] # waked + t3_360 = farm_avg_velocities[1, 0, 3] # upstream + + assert np.allclose(t0_270, t1_360) + assert np.allclose(t1_270, t3_360) + assert np.allclose(t2_270, t0_360) + assert np.allclose(t3_270, t2_360) + + +def test_regression_yaw(sample_inputs_fixture): + """ + Tandem turbines with the upstream turbine yawed + """ + sample_inputs_fixture.floris["wake"]["model_strings"]["velocity_model"] = VELOCITY_MODEL + sample_inputs_fixture.floris["wake"]["model_strings"]["deflection_model"] = DEFLECTION_MODEL + sample_inputs_fixture.floris["wake"]["model_strings"]["turbulence_model"] = TURBULENCE_MODEL + + floris = Floris.from_dict(sample_inputs_fixture.floris) + + yaw_angles = np.zeros((N_WIND_DIRECTIONS, N_WIND_SPEEDS, N_TURBINES)) + yaw_angles[:,:,0] = 5.0 + floris.farm.yaw_angles = yaw_angles + + floris.initialize_domain() + floris.steady_state_atmospheric_condition() + + n_turbines = floris.farm.n_turbines + n_wind_speeds = floris.flow_field.n_wind_speeds + n_wind_directions = floris.flow_field.n_wind_directions + + velocities = floris.flow_field.u + yaw_angles = floris.farm.yaw_angles + tilt_angles = floris.farm.tilt_angles + ref_tilt_cp_cts = ( + np.ones((n_wind_directions, n_wind_speeds, n_turbines)) + * floris.farm.ref_tilt_cp_cts + ) + test_results = np.zeros((n_wind_directions, n_wind_speeds, n_turbines, 4)) + + farm_avg_velocities = average_velocity( + velocities, + ) + farm_eff_velocities = rotor_effective_velocity( + floris.flow_field.air_density, + floris.farm.ref_density_cp_cts, + velocities, + yaw_angles, + tilt_angles, + ref_tilt_cp_cts, + floris.farm.pPs, + floris.farm.pTs, + floris.farm.turbine_fTilts, + floris.farm.correct_cp_ct_for_tilt, + floris.farm.turbine_type_map, + ) + farm_cts = Ct( + velocities, + yaw_angles, + tilt_angles, + ref_tilt_cp_cts, + floris.farm.turbine_fCts, + floris.farm.turbine_fTilts, + floris.farm.correct_cp_ct_for_tilt, + floris.farm.turbine_type_map, + ) + farm_powers = power( + floris.farm.ref_density_cp_cts, + farm_eff_velocities, + floris.farm.turbine_power_interps, + floris.farm.turbine_type_map, + ) + farm_axial_inductions = axial_induction( + velocities, + yaw_angles, + tilt_angles, + ref_tilt_cp_cts, + floris.farm.turbine_fCts, + floris.farm.turbine_fTilts, + floris.farm.correct_cp_ct_for_tilt, + floris.farm.turbine_type_map, + ) + for i in range(n_wind_directions): + for j in range(n_wind_speeds): + for k in range(n_turbines): + test_results[i, j, k, 0] = farm_avg_velocities[i, j, k] + test_results[i, j, k, 1] = farm_cts[i, j, k] + test_results[i, j, k, 2] = farm_powers[i, j, k] + test_results[i, j, k, 3] = farm_axial_inductions[i, j, k] + + if DEBUG: + print_test_values( + farm_avg_velocities, + farm_cts, + farm_powers, + farm_axial_inductions, + ) + + assert_results_arrays(test_results[0], yawed_baseline) + + +def test_regression_small_grid_rotation(sample_inputs_fixture): + """ + Where wake models are masked based on the x-location of a turbine, numerical precision + can cause masking to fail unexpectedly. For example, in the configuration here one of + the turbines has these delta x values; + + [[4.54747351e-13 4.54747351e-13 4.54747351e-13 4.54747351e-13 4.54747351e-13] + [4.54747351e-13 4.54747351e-13 4.54747351e-13 4.54747351e-13 4.54747351e-13] + [4.54747351e-13 4.54747351e-13 4.54747351e-13 4.54747351e-13 4.54747351e-13] + [4.54747351e-13 4.54747351e-13 4.54747351e-13 4.54747351e-13 4.54747351e-13] + [4.54747351e-13 4.54747351e-13 4.54747351e-13 4.54747351e-13 4.54747351e-13]] + + and therefore the masking statement is False when it should be True. This causes the current + turbine to be affected by its own wake. This test requires that at least in this particular + configuration the masking correctly filters grid points. + """ + sample_inputs_fixture.floris["wake"]["model_strings"]["velocity_model"] = VELOCITY_MODEL + sample_inputs_fixture.floris["wake"]["model_strings"]["deflection_model"] = DEFLECTION_MODEL + sample_inputs_fixture.floris["wake"]["model_strings"]["turbulence_model"] = TURBULENCE_MODEL + X, Y = np.meshgrid( + 6.0 * 126.0 * np.arange(0, 5, 1), + 6.0 * 126.0 * np.arange(0, 5, 1) + ) + X = X.flatten() + Y = Y.flatten() + + sample_inputs_fixture.floris["farm"]["layout_x"] = X + sample_inputs_fixture.floris["farm"]["layout_y"] = Y + + floris = Floris.from_dict(sample_inputs_fixture.floris) + floris.initialize_domain() + floris.steady_state_atmospheric_condition() + + # farm_avg_velocities = average_velocity(floris.flow_field.u) + velocities = floris.flow_field.u + yaw_angles = floris.farm.yaw_angles + tilt_angles = floris.farm.tilt_angles + ref_tilt_cp_cts = np.ones((1, 1, len(X))) * floris.farm.ref_tilt_cp_cts + + farm_eff_velocities = rotor_effective_velocity( + floris.flow_field.air_density, + floris.farm.ref_density_cp_cts, + velocities, + yaw_angles, + tilt_angles, + ref_tilt_cp_cts, + floris.farm.pPs, + floris.farm.pTs, + floris.farm.turbine_fTilts, + floris.farm.correct_cp_ct_for_tilt, + floris.farm.turbine_type_map, + ) + farm_powers = power( + floris.farm.ref_density_cp_cts, + farm_eff_velocities, + floris.farm.turbine_power_interps, + floris.farm.turbine_type_map, + ) + + # A "column" is oriented parallel to the wind direction + # Columns 1 - 4 should have the same power profile + # Column 5 is completely unwaked in this model + assert np.allclose(farm_powers[2,0,0:5], farm_powers[2,0,5:10]) + assert np.allclose(farm_powers[2,0,0:5], farm_powers[2,0,10:15]) + assert np.allclose(farm_powers[2,0,0:5], farm_powers[2,0,15:20]) + assert np.allclose(farm_powers[2,0,20], farm_powers[2,0,0]) + assert np.allclose(farm_powers[2,0,21], farm_powers[2,0,21:25]) diff --git a/tests/reg_tests/floris_interface_regression_test.py b/tests/reg_tests/floris_interface_regression_test.py index 9798e237c..3e8286c3e 100644 --- a/tests/reg_tests/floris_interface_regression_test.py +++ b/tests/reg_tests/floris_interface_regression_test.py @@ -20,6 +20,7 @@ Ct, power, ) +from floris.simulation.turbine import rotor_effective_velocity from floris.tools import FlorisInterface from tests.conftest import ( assert_results_arrays, @@ -86,30 +87,53 @@ def test_calculate_no_wake(sample_inputs_fixture): velocities = fi.floris.flow_field.u yaw_angles = fi.floris.farm.yaw_angles + tilt_angles = fi.floris.farm.tilt_angles + ref_tilt_cp_cts = ( + np.ones((n_wind_directions, n_wind_speeds, n_turbines)) + * fi.floris.farm.ref_tilt_cp_cts + ) test_results = np.zeros((n_wind_directions, n_wind_speeds, n_turbines, 4)) farm_avg_velocities = average_velocity( velocities, ) + farm_eff_velocities = rotor_effective_velocity( + fi.floris.flow_field.air_density, + fi.floris.farm.ref_density_cp_cts, + velocities, + yaw_angles, + tilt_angles, + ref_tilt_cp_cts, + fi.floris.farm.pPs, + fi.floris.farm.pTs, + fi.floris.farm.turbine_fTilts, + fi.floris.farm.correct_cp_ct_for_tilt, + fi.floris.farm.turbine_type_map, + ) farm_cts = Ct( velocities, yaw_angles, + tilt_angles, + ref_tilt_cp_cts, fi.floris.farm.turbine_fCts, + fi.floris.farm.turbine_fTilts, + fi.floris.farm.correct_cp_ct_for_tilt, fi.floris.farm.turbine_type_map, ) farm_powers = power( - fi.floris.flow_field.air_density, fi.floris.farm.ref_density_cp_cts, - velocities, - yaw_angles, - fi.floris.farm.pPs, + farm_eff_velocities, fi.floris.farm.turbine_power_interps, fi.floris.farm.turbine_type_map, ) farm_axial_inductions = axial_induction( velocities, yaw_angles, + tilt_angles, + ref_tilt_cp_cts, fi.floris.farm.turbine_fCts, + fi.floris.farm.turbine_fTilts, + fi.floris.farm.correct_cp_ct_for_tilt, fi.floris.farm.turbine_type_map, ) for i in range(n_wind_directions): diff --git a/tests/reg_tests/gauss_regression_test.py b/tests/reg_tests/gauss_regression_test.py index e0e5acdd6..20e71dc71 100644 --- a/tests/reg_tests/gauss_regression_test.py +++ b/tests/reg_tests/gauss_regression_test.py @@ -20,6 +20,7 @@ Ct, Floris, power, + rotor_effective_velocity, ) from tests.conftest import ( assert_results_arrays, @@ -264,30 +265,54 @@ def test_regression_tandem(sample_inputs_fixture): velocities = floris.flow_field.u yaw_angles = floris.farm.yaw_angles + tilt_angles = floris.farm.tilt_angles + ref_tilt_cp_cts = ( + np.ones((n_wind_directions, n_wind_speeds, n_turbines)) + * floris.farm.ref_tilt_cp_cts + ) + test_results = np.zeros((n_wind_directions, n_wind_speeds, n_turbines, 4)) farm_avg_velocities = average_velocity( velocities, ) + farm_eff_velocities = rotor_effective_velocity( + floris.flow_field.air_density, + floris.farm.ref_density_cp_cts, + velocities, + yaw_angles, + tilt_angles, + ref_tilt_cp_cts, + floris.farm.pPs, + floris.farm.pTs, + floris.farm.turbine_fTilts, + floris.farm.correct_cp_ct_for_tilt, + floris.farm.turbine_type_map, + ) farm_cts = Ct( velocities, yaw_angles, + tilt_angles, + ref_tilt_cp_cts, floris.farm.turbine_fCts, + floris.farm.turbine_fTilts, + floris.farm.correct_cp_ct_for_tilt, floris.farm.turbine_type_map, ) farm_powers = power( - floris.flow_field.air_density, floris.farm.ref_density_cp_cts, - velocities, - yaw_angles, - floris.farm.pPs, + farm_eff_velocities, floris.farm.turbine_power_interps, floris.farm.turbine_type_map, ) farm_axial_inductions = axial_induction( velocities, yaw_angles, + tilt_angles, + ref_tilt_cp_cts, floris.farm.turbine_fCts, + floris.farm.turbine_fTilts, + floris.farm.correct_cp_ct_for_tilt, floris.farm.turbine_type_map, ) for i in range(n_wind_directions): @@ -409,30 +434,53 @@ def test_regression_yaw(sample_inputs_fixture): velocities = floris.flow_field.u yaw_angles = floris.farm.yaw_angles + tilt_angles = floris.farm.tilt_angles + ref_tilt_cp_cts = ( + np.ones((n_wind_directions, n_wind_speeds, n_turbines)) + * floris.farm.ref_tilt_cp_cts + ) test_results = np.zeros((n_wind_directions, n_wind_speeds, n_turbines, 4)) farm_avg_velocities = average_velocity( velocities, ) + farm_eff_velocities = rotor_effective_velocity( + floris.flow_field.air_density, + floris.farm.ref_density_cp_cts, + velocities, + yaw_angles, + tilt_angles, + ref_tilt_cp_cts, + floris.farm.pPs, + floris.farm.pTs, + floris.farm.turbine_fTilts, + floris.farm.correct_cp_ct_for_tilt, + floris.farm.turbine_type_map, + ) farm_cts = Ct( velocities, yaw_angles, + tilt_angles, + ref_tilt_cp_cts, floris.farm.turbine_fCts, + floris.farm.turbine_fTilts, + floris.farm.correct_cp_ct_for_tilt, floris.farm.turbine_type_map, ) farm_powers = power( - floris.flow_field.air_density, floris.farm.ref_density_cp_cts, - velocities, - yaw_angles, - floris.farm.pPs, + farm_eff_velocities, floris.farm.turbine_power_interps, floris.farm.turbine_type_map, ) farm_axial_inductions = axial_induction( velocities, yaw_angles, + tilt_angles, + ref_tilt_cp_cts, floris.farm.turbine_fCts, + floris.farm.turbine_fTilts, + floris.farm.correct_cp_ct_for_tilt, floris.farm.turbine_type_map, ) for i in range(n_wind_directions): @@ -479,30 +527,53 @@ def test_regression_gch(sample_inputs_fixture): velocities = floris.flow_field.u yaw_angles = floris.farm.yaw_angles + tilt_angles = floris.farm.tilt_angles + ref_tilt_cp_cts = ( + np.ones((n_wind_directions, n_wind_speeds, n_turbines)) + * floris.farm.ref_tilt_cp_cts + ) test_results = np.zeros((n_wind_directions, n_wind_speeds, n_turbines, 4)) farm_avg_velocities = average_velocity( velocities, ) + farm_eff_velocities = rotor_effective_velocity( + floris.flow_field.air_density, + floris.farm.ref_density_cp_cts, + velocities, + yaw_angles, + tilt_angles, + ref_tilt_cp_cts, + floris.farm.pPs, + floris.farm.pTs, + floris.farm.turbine_fTilts, + floris.farm.correct_cp_ct_for_tilt, + floris.farm.turbine_type_map, + ) farm_cts = Ct( velocities, yaw_angles, + tilt_angles, + ref_tilt_cp_cts, floris.farm.turbine_fCts, + floris.farm.turbine_fTilts, + floris.farm.correct_cp_ct_for_tilt, floris.farm.turbine_type_map, ) farm_powers = power( - floris.flow_field.air_density, floris.farm.ref_density_cp_cts, - velocities, - yaw_angles, - floris.farm.pPs, + farm_eff_velocities, floris.farm.turbine_power_interps, floris.farm.turbine_type_map, ) farm_axial_inductions = axial_induction( velocities, yaw_angles, + tilt_angles, + ref_tilt_cp_cts, floris.farm.turbine_fCts, + floris.farm.turbine_fTilts, + floris.farm.correct_cp_ct_for_tilt, floris.farm.turbine_type_map, ) for i in range(n_wind_directions): @@ -545,30 +616,53 @@ def test_regression_gch(sample_inputs_fixture): velocities = floris.flow_field.u yaw_angles = floris.farm.yaw_angles + tilt_angles = floris.farm.tilt_angles + ref_tilt_cp_cts = ( + np.ones((n_wind_directions, n_wind_speeds, n_turbines)) + * floris.farm.ref_tilt_cp_cts + ) test_results = np.zeros((n_wind_directions, n_wind_speeds, n_turbines, 4)) farm_avg_velocities = average_velocity( velocities, ) + farm_eff_velocities = rotor_effective_velocity( + floris.flow_field.air_density, + floris.farm.ref_density_cp_cts, + velocities, + yaw_angles, + tilt_angles, + ref_tilt_cp_cts, + floris.farm.pPs, + floris.farm.pTs, + floris.farm.turbine_fTilts, + floris.farm.correct_cp_ct_for_tilt, + floris.farm.turbine_type_map, + ) farm_cts = Ct( velocities, yaw_angles, + tilt_angles, + ref_tilt_cp_cts, floris.farm.turbine_fCts, + floris.farm.turbine_fTilts, + floris.farm.correct_cp_ct_for_tilt, floris.farm.turbine_type_map, ) farm_powers = power( - floris.flow_field.air_density, floris.farm.ref_density_cp_cts, - velocities, - yaw_angles, - floris.farm.pPs, + farm_eff_velocities, floris.farm.turbine_power_interps, floris.farm.turbine_type_map, ) farm_axial_inductions = axial_induction( velocities, yaw_angles, + tilt_angles, + ref_tilt_cp_cts, floris.farm.turbine_fCts, + floris.farm.turbine_fTilts, + floris.farm.correct_cp_ct_for_tilt, floris.farm.turbine_type_map, ) for i in range(n_wind_directions): @@ -618,30 +712,53 @@ def test_regression_yaw_added_recovery(sample_inputs_fixture): velocities = floris.flow_field.u yaw_angles = floris.farm.yaw_angles + tilt_angles = floris.farm.tilt_angles + ref_tilt_cp_cts = ( + np.ones((n_wind_directions, n_wind_speeds, n_turbines)) + * floris.farm.ref_tilt_cp_cts + ) test_results = np.zeros((n_wind_directions, n_wind_speeds, n_turbines, 4)) farm_avg_velocities = average_velocity( velocities, ) + farm_eff_velocities = rotor_effective_velocity( + floris.flow_field.air_density, + floris.farm.ref_density_cp_cts, + velocities, + yaw_angles, + tilt_angles, + ref_tilt_cp_cts, + floris.farm.pPs, + floris.farm.pTs, + floris.farm.turbine_fTilts, + floris.farm.correct_cp_ct_for_tilt, + floris.farm.turbine_type_map, + ) farm_cts = Ct( velocities, yaw_angles, + tilt_angles, + ref_tilt_cp_cts, floris.farm.turbine_fCts, + floris.farm.turbine_fTilts, + floris.farm.correct_cp_ct_for_tilt, floris.farm.turbine_type_map, ) farm_powers = power( - floris.flow_field.air_density, floris.farm.ref_density_cp_cts, - velocities, - yaw_angles, - floris.farm.pPs, + farm_eff_velocities, floris.farm.turbine_power_interps, floris.farm.turbine_type_map, ) farm_axial_inductions = axial_induction( velocities, yaw_angles, + tilt_angles, + ref_tilt_cp_cts, floris.farm.turbine_fCts, + floris.farm.turbine_fTilts, + floris.farm.correct_cp_ct_for_tilt, floris.farm.turbine_type_map, ) for i in range(n_wind_directions): @@ -690,30 +807,53 @@ def test_regression_secondary_steering(sample_inputs_fixture): velocities = floris.flow_field.u yaw_angles = floris.farm.yaw_angles + tilt_angles = floris.farm.tilt_angles + ref_tilt_cp_cts = ( + np.ones((n_wind_directions, n_wind_speeds, n_turbines)) + * floris.farm.ref_tilt_cp_cts + ) test_results = np.zeros((n_wind_directions, n_wind_speeds, n_turbines, 4)) farm_avg_velocities = average_velocity( velocities, ) + farm_eff_velocities = rotor_effective_velocity( + floris.flow_field.air_density, + floris.farm.ref_density_cp_cts, + velocities, + yaw_angles, + tilt_angles, + ref_tilt_cp_cts, + floris.farm.pPs, + floris.farm.pTs, + floris.farm.turbine_fTilts, + floris.farm.correct_cp_ct_for_tilt, + floris.farm.turbine_type_map, + ) farm_cts = Ct( velocities, yaw_angles, + tilt_angles, + ref_tilt_cp_cts, floris.farm.turbine_fCts, + floris.farm.turbine_fTilts, + floris.farm.correct_cp_ct_for_tilt, floris.farm.turbine_type_map, ) farm_powers = power( - floris.flow_field.air_density, floris.farm.ref_density_cp_cts, - velocities, - yaw_angles, - floris.farm.pPs, + farm_eff_velocities, floris.farm.turbine_power_interps, floris.farm.turbine_type_map, ) farm_axial_inductions = axial_induction( velocities, yaw_angles, + tilt_angles, + ref_tilt_cp_cts, floris.farm.turbine_fCts, + floris.farm.turbine_fTilts, + floris.farm.correct_cp_ct_for_tilt, floris.farm.turbine_type_map, ) for i in range(n_wind_directions): @@ -770,13 +910,25 @@ def test_regression_small_grid_rotation(sample_inputs_fixture): # farm_avg_velocities = average_velocity(floris.flow_field.u) velocities = floris.flow_field.u yaw_angles = floris.farm.yaw_angles + tilt_angles = floris.farm.tilt_angles + ref_tilt_cp_cts = np.ones((1, 1, len(X))) * floris.farm.ref_tilt_cp_cts - farm_powers = power( + farm_eff_velocities = rotor_effective_velocity( floris.flow_field.air_density, floris.farm.ref_density_cp_cts, velocities, yaw_angles, + tilt_angles, + ref_tilt_cp_cts, floris.farm.pPs, + floris.farm.pTs, + floris.farm.turbine_fTilts, + floris.farm.correct_cp_ct_for_tilt, + floris.farm.turbine_type_map, + ) + farm_powers = power( + floris.farm.ref_density_cp_cts, + farm_eff_velocities, floris.farm.turbine_power_interps, floris.farm.turbine_type_map, ) diff --git a/tests/reg_tests/jensen_jimenez_regression_test.py b/tests/reg_tests/jensen_jimenez_regression_test.py index 0f69bc741..3e720edab 100644 --- a/tests/reg_tests/jensen_jimenez_regression_test.py +++ b/tests/reg_tests/jensen_jimenez_regression_test.py @@ -20,6 +20,7 @@ Ct, Floris, power, + rotor_effective_velocity, ) from tests.conftest import ( assert_results_arrays, @@ -115,30 +116,53 @@ def test_regression_tandem(sample_inputs_fixture): velocities = floris.flow_field.u yaw_angles = floris.farm.yaw_angles + tilt_angles = floris.farm.tilt_angles + ref_tilt_cp_cts = ( + np.ones((n_wind_directions, n_wind_speeds, n_turbines)) + * floris.farm.ref_tilt_cp_cts + ) test_results = np.zeros((n_wind_directions, n_wind_speeds, n_turbines, 4)) farm_avg_velocities = average_velocity( velocities, ) + farm_eff_velocities = rotor_effective_velocity( + floris.flow_field.air_density, + floris.farm.ref_density_cp_cts, + velocities, + yaw_angles, + tilt_angles, + ref_tilt_cp_cts, + floris.farm.pPs, + floris.farm.pTs, + floris.farm.turbine_fTilts, + floris.farm.correct_cp_ct_for_tilt, + floris.farm.turbine_type_map, + ) farm_cts = Ct( velocities, yaw_angles, + tilt_angles, + ref_tilt_cp_cts, floris.farm.turbine_fCts, + floris.farm.turbine_fTilts, + floris.farm.correct_cp_ct_for_tilt, floris.farm.turbine_type_map, ) farm_powers = power( - floris.flow_field.air_density, floris.farm.ref_density_cp_cts, - velocities, - yaw_angles, - floris.farm.pPs, + farm_eff_velocities, floris.farm.turbine_power_interps, floris.farm.turbine_type_map, ) farm_axial_inductions = axial_induction( velocities, yaw_angles, + tilt_angles, + ref_tilt_cp_cts, floris.farm.turbine_fCts, + floris.farm.turbine_fTilts, + floris.farm.correct_cp_ct_for_tilt, floris.farm.turbine_type_map, ) for i in range(n_wind_directions): @@ -260,30 +284,53 @@ def test_regression_yaw(sample_inputs_fixture): velocities = floris.flow_field.u yaw_angles = floris.farm.yaw_angles + tilt_angles = floris.farm.tilt_angles + ref_tilt_cp_cts = ( + np.ones((n_wind_directions, n_wind_speeds, n_turbines)) + * floris.farm.ref_tilt_cp_cts + ) test_results = np.zeros((n_wind_directions, n_wind_speeds, n_turbines, 4)) farm_avg_velocities = average_velocity( velocities, ) + farm_eff_velocities = rotor_effective_velocity( + floris.flow_field.air_density, + floris.farm.ref_density_cp_cts, + velocities, + yaw_angles, + tilt_angles, + ref_tilt_cp_cts, + floris.farm.pPs, + floris.farm.pTs, + floris.farm.turbine_fTilts, + floris.farm.correct_cp_ct_for_tilt, + floris.farm.turbine_type_map, + ) farm_cts = Ct( velocities, yaw_angles, + tilt_angles, + ref_tilt_cp_cts, floris.farm.turbine_fCts, + floris.farm.turbine_fTilts, + floris.farm.correct_cp_ct_for_tilt, floris.farm.turbine_type_map, ) farm_powers = power( - floris.flow_field.air_density, floris.farm.ref_density_cp_cts, - velocities, - yaw_angles, - floris.farm.pPs, + farm_eff_velocities, floris.farm.turbine_power_interps, floris.farm.turbine_type_map, ) farm_axial_inductions = axial_induction( velocities, yaw_angles, + tilt_angles, + ref_tilt_cp_cts, floris.farm.turbine_fCts, + floris.farm.turbine_fTilts, + floris.farm.correct_cp_ct_for_tilt, floris.farm.turbine_type_map, ) for i in range(n_wind_directions): @@ -340,13 +387,25 @@ def test_regression_small_grid_rotation(sample_inputs_fixture): # farm_avg_velocities = average_velocity(floris.flow_field.u) velocities = floris.flow_field.u yaw_angles = floris.farm.yaw_angles + tilt_angles = floris.farm.tilt_angles + ref_tilt_cp_cts = np.ones((1, 1, len(X))) * floris.farm.ref_tilt_cp_cts - farm_powers = power( + farm_eff_velocities = rotor_effective_velocity( floris.flow_field.air_density, floris.farm.ref_density_cp_cts, velocities, yaw_angles, + tilt_angles, + ref_tilt_cp_cts, floris.farm.pPs, + floris.farm.pTs, + floris.farm.turbine_fTilts, + floris.farm.correct_cp_ct_for_tilt, + floris.farm.turbine_type_map, + ) + farm_powers = power( + floris.farm.ref_density_cp_cts, + farm_eff_velocities, floris.farm.turbine_power_interps, floris.farm.turbine_type_map, ) diff --git a/tests/reg_tests/none_regression_test.py b/tests/reg_tests/none_regression_test.py index 51876ae8d..3a1b37d5e 100644 --- a/tests/reg_tests/none_regression_test.py +++ b/tests/reg_tests/none_regression_test.py @@ -21,6 +21,7 @@ Ct, Floris, power, + rotor_effective_velocity, ) from tests.conftest import ( assert_results_arrays, @@ -116,30 +117,53 @@ def test_regression_tandem(sample_inputs_fixture): velocities = floris.flow_field.u yaw_angles = floris.farm.yaw_angles + tilt_angles = floris.farm.tilt_angles + ref_tilt_cp_cts = ( + np.ones((n_wind_directions, n_wind_speeds, n_turbines)) + * floris.farm.ref_tilt_cp_cts + ) test_results = np.zeros((n_wind_directions, n_wind_speeds, n_turbines, 4)) farm_avg_velocities = average_velocity( velocities, ) + farm_eff_velocities = rotor_effective_velocity( + floris.flow_field.air_density, + floris.farm.ref_density_cp_cts, + velocities, + yaw_angles, + tilt_angles, + ref_tilt_cp_cts, + floris.farm.pPs, + floris.farm.pTs, + floris.farm.turbine_fTilts, + floris.farm.correct_cp_ct_for_tilt, + floris.farm.turbine_type_map, + ) farm_cts = Ct( velocities, yaw_angles, + tilt_angles, + ref_tilt_cp_cts, floris.farm.turbine_fCts, + floris.farm.turbine_fTilts, + floris.farm.correct_cp_ct_for_tilt, floris.farm.turbine_type_map, ) farm_powers = power( - floris.flow_field.air_density, floris.farm.ref_density_cp_cts, - velocities, - yaw_angles, - floris.farm.pPs, + farm_eff_velocities, floris.farm.turbine_power_interps, floris.farm.turbine_type_map, ) farm_axial_inductions = axial_induction( velocities, yaw_angles, + tilt_angles, + ref_tilt_cp_cts, floris.farm.turbine_fCts, + floris.farm.turbine_fTilts, + floris.farm.correct_cp_ct_for_tilt, floris.farm.turbine_type_map, ) for i in range(n_wind_directions): @@ -292,13 +316,25 @@ def test_regression_small_grid_rotation(sample_inputs_fixture): # farm_avg_velocities = average_velocity(floris.flow_field.u) velocities = floris.flow_field.u yaw_angles = floris.farm.yaw_angles + tilt_angles = floris.farm.tilt_angles + ref_tilt_cp_cts = np.ones((1, 1, len(X))) * floris.farm.ref_tilt_cp_cts - farm_powers = power( + farm_eff_velocities = rotor_effective_velocity( floris.flow_field.air_density, floris.farm.ref_density_cp_cts, velocities, yaw_angles, + tilt_angles, + ref_tilt_cp_cts, floris.farm.pPs, + floris.farm.pTs, + floris.farm.turbine_fTilts, + floris.farm.correct_cp_ct_for_tilt, + floris.farm.turbine_type_map, + ) + farm_powers = power( + floris.farm.ref_density_cp_cts, + farm_eff_velocities, floris.farm.turbine_power_interps, floris.farm.turbine_type_map, ) diff --git a/tests/reg_tests/turbopark_regression_test.py b/tests/reg_tests/turbopark_regression_test.py index 446a43806..d7726f519 100644 --- a/tests/reg_tests/turbopark_regression_test.py +++ b/tests/reg_tests/turbopark_regression_test.py @@ -20,6 +20,7 @@ Ct, Floris, power, + rotor_effective_velocity, ) from tests.conftest import ( assert_results_arrays, @@ -117,30 +118,53 @@ def test_regression_tandem(sample_inputs_fixture): velocities = floris.flow_field.u yaw_angles = floris.farm.yaw_angles + tilt_angles = floris.farm.tilt_angles + ref_tilt_cp_cts = ( + np.ones((n_wind_directions, n_wind_speeds, n_turbines)) + * floris.farm.ref_tilt_cp_cts + ) test_results = np.zeros((n_wind_directions, n_wind_speeds, n_turbines, 4)) farm_avg_velocities = average_velocity( velocities, ) + farm_eff_velocities = rotor_effective_velocity( + floris.flow_field.air_density, + floris.farm.ref_density_cp_cts, + velocities, + yaw_angles, + tilt_angles, + ref_tilt_cp_cts, + floris.farm.pPs, + floris.farm.pTs, + floris.farm.turbine_fTilts, + floris.farm.correct_cp_ct_for_tilt, + floris.farm.turbine_type_map, + ) farm_cts = Ct( velocities, yaw_angles, + tilt_angles, + ref_tilt_cp_cts, floris.farm.turbine_fCts, + floris.farm.turbine_fTilts, + floris.farm.correct_cp_ct_for_tilt, floris.farm.turbine_type_map, ) farm_powers = power( - floris.flow_field.air_density, floris.farm.ref_density_cp_cts, - velocities, - yaw_angles, - floris.farm.pPs, + farm_eff_velocities, floris.farm.turbine_power_interps, floris.farm.turbine_type_map, ) farm_axial_inductions = axial_induction( velocities, yaw_angles, + tilt_angles, + ref_tilt_cp_cts, floris.farm.turbine_fCts, + floris.farm.turbine_fTilts, + floris.farm.correct_cp_ct_for_tilt, floris.farm.turbine_type_map, ) for i in range(n_wind_directions): @@ -263,30 +287,53 @@ def test_regression_yaw(sample_inputs_fixture): velocities = floris.flow_field.u yaw_angles = floris.farm.yaw_angles + tilt_angles = floris.farm.tilt_angles + ref_tilt_cp_cts = ( + np.ones((n_wind_directions, n_wind_speeds, n_turbines)) + * floris.farm.ref_tilt_cp_cts + ) test_results = np.zeros((n_wind_directions, n_wind_speeds, n_turbines, 4)) farm_avg_velocities = average_velocity( velocities, ) + farm_eff_velocities = rotor_effective_velocity( + floris.flow_field.air_density, + floris.farm.ref_density_cp_cts, + velocities, + yaw_angles, + tilt_angles, + ref_tilt_cp_cts, + floris.farm.pPs, + floris.farm.pTs, + floris.farm.turbine_fTilts, + floris.farm.correct_cp_ct_for_tilt, + floris.farm.turbine_type_map, + ) farm_cts = Ct( velocities, yaw_angles, + tilt_angles, + ref_tilt_cp_cts, floris.farm.turbine_fCts, + floris.farm.turbine_fTilts, + floris.farm.correct_cp_ct_for_tilt, floris.farm.turbine_type_map, ) farm_powers = power( - floris.flow_field.air_density, floris.farm.ref_density_cp_cts, - velocities, - yaw_angles, - floris.farm.pPs, + farm_eff_velocities, floris.farm.turbine_power_interps, floris.farm.turbine_type_map, ) farm_axial_inductions = axial_induction( velocities, yaw_angles, + tilt_angles, + ref_tilt_cp_cts, floris.farm.turbine_fCts, + floris.farm.turbine_fTilts, + floris.farm.correct_cp_ct_for_tilt, floris.farm.turbine_type_map, ) for i in range(n_wind_directions): @@ -344,13 +391,25 @@ def test_regression_small_grid_rotation(sample_inputs_fixture): # farm_avg_velocities = average_velocity(floris.flow_field.u) velocities = floris.flow_field.u yaw_angles = floris.farm.yaw_angles + tilt_angles = floris.farm.tilt_angles + ref_tilt_cp_cts = np.ones((1, 1, len(X))) * floris.farm.ref_tilt_cp_cts - farm_powers = power( + farm_eff_velocities = rotor_effective_velocity( floris.flow_field.air_density, floris.farm.ref_density_cp_cts, velocities, yaw_angles, + tilt_angles, + ref_tilt_cp_cts, floris.farm.pPs, + floris.farm.pTs, + floris.farm.turbine_fTilts, + floris.farm.correct_cp_ct_for_tilt, + floris.farm.turbine_type_map, + ) + farm_powers = power( + floris.farm.ref_density_cp_cts, + farm_eff_velocities, floris.farm.turbine_power_interps, floris.farm.turbine_type_map, ) diff --git a/tests/turbine_unit_test.py b/tests/turbine_unit_test.py index a520c9cec..c832bd594 100644 --- a/tests/turbine_unit_test.py +++ b/tests/turbine_unit_test.py @@ -25,7 +25,13 @@ power, Turbine, ) -from floris.simulation.turbine import _filter_convert, PowerThrustTable +from floris.simulation.turbine import ( + _filter_convert, + _rotor_velocity_tilt_correction, + _rotor_velocity_yaw_correction, + compute_tilt_angles_for_floating_turbines, + PowerThrustTable, +) from tests.conftest import SampleInputs, WIND_SPEEDS @@ -174,7 +180,7 @@ def test_average_velocity(): # TODO: why do we use cube root - mean - cube (like rms) instead of a simple average (np.mean)? # Dimensions are (n wind directions, n wind speeds, n turbines, grid x, grid y) velocities = np.ones((1, 1, 1, 5, 5)) - assert average_velocity(velocities) == 1 + assert average_velocity(velocities, method="cubic-mean") == 1 # Constructs an array of shape 1 x 1 x 2 x 3 x 3 with finrst turbie all 1, second turbine all 2 velocities = np.stack( @@ -186,7 +192,10 @@ def test_average_velocity(): ) # Pull out the first wind speed for the test - np.testing.assert_array_equal(average_velocity(velocities)[0, 0], np.array([1, 2])) + np.testing.assert_array_equal( + average_velocity(velocities, method="cubic-mean")[0, 0], + np.array([1, 2]) + ) # Test boolean filter ix_filter = [True, False, True, False] @@ -204,7 +213,7 @@ def test_average_velocity(): # ), axis=2, ) - avg = average_velocity(velocities, ix_filter) + avg = average_velocity(velocities, ix_filter, method="cubic-mean") assert avg.shape == (1, 1, 2) # 1 wind direction, 1 wind speed, 2 turbines filtered # Pull out the first wind direction and wind speed for the comparison @@ -219,7 +228,7 @@ def test_average_velocity(): [i * np.ones((1, 1, 3, 3)) for i in range(1,5)], axis=2, ) - avg = average_velocity(velocities, INDEX_FILTER) + avg = average_velocity(velocities, INDEX_FILTER, method="cubic-mean") assert avg.shape == (1, 1, 2) # 1 wind direction, 1 wind speed, 2 turbines filtered # Pull out the first wind direction and wind speed for the comparison @@ -230,7 +239,9 @@ def test_ct(): N_TURBINES = 4 turbine_data = SampleInputs().turbine + turbine_floating_data = SampleInputs().turbine_floating turbine = Turbine.from_dict(turbine_data) + turbine_floating = Turbine.from_dict(turbine_floating_data) turbine_type_map = np.array(N_TURBINES * [turbine.turbine_type]) turbine_type_map = turbine_type_map[None, None, :] @@ -240,7 +251,11 @@ def test_ct(): thrust = Ct( velocities=wind_speed * np.ones((1, 1, 1, 3, 3)), yaw_angle=np.zeros((1, 1, 1)), - fCt=np.array([(turbine.turbine_type, turbine.fCt_interp)]), + tilt_angle=np.ones((1, 1, 1)) * 5.0, + ref_tilt_cp_ct=np.ones((1, 1, 1)) * 5.0, + fCt={turbine.turbine_type: turbine.fCt_interp}, + tilt_interp=np.array([(turbine.turbine_type, None)]), + correct_cp_ct_for_tilt=np.array([[[False]]]), turbine_type_map=turbine_type_map[:,:,0] ) @@ -252,7 +267,11 @@ def test_ct(): thrusts = Ct( velocities=np.ones((N_TURBINES, 3, 3)) * WIND_CONDITION_BROADCAST, # 3 x 4 x 4 x 3 x 3 yaw_angle=np.zeros((1, 1, N_TURBINES)), - fCt=np.array([(turbine.turbine_type, turbine.fCt_interp)]), + tilt_angle=np.ones((1, 1, N_TURBINES)) * 5.0, + ref_tilt_cp_ct=np.ones((1, 1, N_TURBINES)) * 5.0, + fCt={turbine.turbine_type: turbine.fCt_interp}, + tilt_interp=np.array([(turbine.turbine_type, None)]), + correct_cp_ct_for_tilt=np.array([[[False] * N_TURBINES]]), turbine_type_map=turbine_type_map, ix_filter=INDEX_FILTER, ) @@ -265,6 +284,24 @@ def test_ct(): turbine_data["power_thrust_table"]["thrust"][truth_index] ) + # Single floating turbine; note that 'tilt_interp' is not set to None + thrust = Ct( + velocities=wind_speed * np.ones((1, 1, 1, 3, 3)), + yaw_angle=np.zeros((1, 1, 1)), + tilt_angle=np.ones((1, 1, 1)) * 5.0, + ref_tilt_cp_ct=np.ones((1, 1, 1)) * 5.0, + fCt={turbine.turbine_type: turbine_floating.fCt_interp}, + tilt_interp=np.array([(turbine_floating.turbine_type, turbine_floating.fTilt_interp)]), + correct_cp_ct_for_tilt=np.array([[[True]]]), + turbine_type_map=turbine_type_map[:,:,0] + ) + + truth_index = turbine_floating_data["power_thrust_table"]["wind_speed"].index(wind_speed) + np.testing.assert_allclose( + thrust, + turbine_floating_data["power_thrust_table"]["thrust"][truth_index] + ) + def test_power(): N_TURBINES = 4 @@ -278,25 +315,21 @@ def test_power(): # Single turbine wind_speed = 10.0 p = power( - air_density=AIR_DENSITY, ref_density_cp_ct=AIR_DENSITY, - velocities=wind_speed * np.ones((1, 1, 1, 3, 3)), - yaw_angle=np.zeros((1, 1, 1)), - pP=turbine.pP * np.ones((1, 1, 1)), - power_interp=np.array([(turbine.turbine_type, turbine.fCp_interp)]), + rotor_effective_velocities=wind_speed * np.ones((1, 1, 1, 3, 3)), + power_interp={turbine.turbine_type: turbine.fCp_interp}, turbine_type_map=turbine_type_map[:,:,0] ) # calculate power again - effective_velocity_trurth = ((AIR_DENSITY/1.225)**(1/3)) * wind_speed - truth_index = turbine_data["power_thrust_table"]["wind_speed"].index(effective_velocity_trurth) + truth_index = turbine_data["power_thrust_table"]["wind_speed"].index(wind_speed) cp_truth = turbine_data["power_thrust_table"]["power"][truth_index] power_truth = ( 0.5 * turbine.rotor_area * cp_truth * turbine.generator_efficiency - * effective_velocity_trurth ** 3 + * wind_speed ** 3 ) np.testing.assert_allclose(p,cp_truth,power_truth ) @@ -306,7 +339,7 @@ def test_power(): # velocities=np.ones((N_TURBINES, 3, 3)) * WIND_CONDITION_BROADCAST, # 3 x 4 x 4 x 3 x 3 # yaw_angle=np.zeros((1, 1, N_TURBINES)), # pP=turbine.pP * np.ones((3, 4, N_TURBINES)), - # power_interp=np.array([(turbine.turbine_type, turbine.fCp_interp)]), + # power_interp={turbine.turbine_type: turbine.fCp_interp}, # turbine_type_map=turbine_type_map, # ix_filter=INDEX_FILTER, # ) @@ -334,7 +367,9 @@ def test_axial_induction(): N_TURBINES = 4 turbine_data = SampleInputs().turbine + turbine_floating_data = SampleInputs().turbine_floating turbine = Turbine.from_dict(turbine_data) + turbine_floating = Turbine.from_dict(turbine_floating_data) turbine_type_map = np.array(N_TURBINES * [turbine.turbine_type]) turbine_type_map = turbine_type_map[None, None, :] @@ -345,7 +380,11 @@ def test_axial_induction(): ai = axial_induction( velocities=wind_speed * np.ones((1, 1, 1, 3, 3)), yaw_angle=np.zeros((1, 1, 1)), - fCt=np.array([(turbine.turbine_type, turbine.fCt_interp)]), + tilt_angle=np.ones((1, 1, 1)) * 5.0, + ref_tilt_cp_ct=np.ones((1, 1, 1)) * 5.0, + fCt={turbine.turbine_type: turbine.fCt_interp}, + tilt_interp=np.array([(turbine.turbine_type, None)]), + correct_cp_ct_for_tilt=np.array([[[False]]]), turbine_type_map=turbine_type_map[0,0,0], ) np.testing.assert_allclose(ai, baseline_ai) @@ -354,7 +393,11 @@ def test_axial_induction(): ai = axial_induction( velocities=np.ones((N_TURBINES, 3, 3)) * WIND_CONDITION_BROADCAST, # 3 x 4 x 4 x 3 x 3 yaw_angle=np.zeros((1, 1, N_TURBINES)), - fCt=np.array([(turbine.turbine_type, turbine.fCt_interp)]), + tilt_angle=np.ones((1, 1, N_TURBINES)) * 5.0, + ref_tilt_cp_ct=np.ones((1, 1, N_TURBINES)) * 5.0, + fCt={turbine.turbine_type: turbine.fCt_interp}, + tilt_interp=np.array([(turbine.turbine_type, None)] * N_TURBINES), + correct_cp_ct_for_tilt=np.array([[[False] * N_TURBINES]]), turbine_type_map=turbine_type_map, ix_filter=INDEX_FILTER, ) @@ -364,6 +407,169 @@ def test_axial_induction(): # Test the 10 m/s wind speed to use the same baseline as above np.testing.assert_allclose(ai[0,2], baseline_ai) + # Single floating turbine; note that 'tilt_interp' is not set to None + ai = axial_induction( + velocities=wind_speed * np.ones((1, 1, 1, 3, 3)), + yaw_angle=np.zeros((1, 1, 1)), + tilt_angle=np.ones((1, 1, 1)) * 5.0, + ref_tilt_cp_ct=np.ones((1, 1, 1)) * 5.0, + fCt={turbine.turbine_type: turbine_floating.fCt_interp}, + tilt_interp=np.array([(turbine_floating.turbine_type, turbine_floating.fTilt_interp)]), + correct_cp_ct_for_tilt=np.array([[[True]]]), + turbine_type_map=turbine_type_map[0,0,0], + ) + np.testing.assert_allclose(ai, baseline_ai) + + +def test_rotor_velocity_yaw_correction(): + N_TURBINES = 4 + + wind_speed = average_velocity(10.0 * np.ones((1, 1, 1, 3, 3))) + wind_speed_N_TURBINES = average_velocity(10.0 * np.ones((1, 1, N_TURBINES, 3, 3))) + + # Test a single turbine for zero yaw + yaw_corrected_velocities = _rotor_velocity_yaw_correction( + pP=3.0, + yaw_angle=0.0, + rotor_effective_velocities=wind_speed, + ) + np.testing.assert_allclose(yaw_corrected_velocities, wind_speed) + + # Test a single turbine for non-zero yaw + yaw_corrected_velocities = _rotor_velocity_yaw_correction( + pP=3.0, + yaw_angle=60.0, + rotor_effective_velocities=wind_speed, + ) + np.testing.assert_allclose(yaw_corrected_velocities, 0.5 * wind_speed) + + # Test multiple turbines for zero yaw + yaw_corrected_velocities = _rotor_velocity_yaw_correction( + pP=3.0, + yaw_angle=np.zeros((1, 1, N_TURBINES)), + rotor_effective_velocities=wind_speed_N_TURBINES, + ) + np.testing.assert_allclose(yaw_corrected_velocities, wind_speed_N_TURBINES) + + # Test multiple turbines for non-zero yaw + yaw_corrected_velocities = _rotor_velocity_yaw_correction( + pP=3.0, + yaw_angle=np.ones((1, 1, N_TURBINES)) * 60.0, + rotor_effective_velocities=wind_speed_N_TURBINES, + ) + np.testing.assert_allclose(yaw_corrected_velocities, 0.5 * wind_speed_N_TURBINES) + + +def test_rotor_velocity_tilt_correction(): + N_TURBINES = 4 + + wind_speed = average_velocity(10.0 * np.ones((1, 1, 1, 3, 3))) + wind_speed_N_TURBINES = average_velocity(10.0 * np.ones((1, 1, N_TURBINES, 3, 3))) + + turbine_data = SampleInputs().turbine + turbine_floating_data = SampleInputs().turbine_floating + turbine = Turbine.from_dict(turbine_data) + turbine_floating = Turbine.from_dict(turbine_floating_data) + turbine_type_map = np.array(N_TURBINES * [turbine.turbine_type]) + turbine_type_map = turbine_type_map[None, None, :] + + # Test single non-floating turbine + tilt_corrected_velocities = _rotor_velocity_tilt_correction( + turbine_type_map=np.array([turbine_type_map[:, :, 0]]), + tilt_angle=5.0*np.ones((1, 1, 1)), + ref_tilt_cp_ct=np.array([turbine.ref_tilt_cp_ct]), + pT=np.array([turbine.pT]), + tilt_interp=np.array([(turbine.turbine_type, turbine.fTilt_interp)]), + correct_cp_ct_for_tilt=np.array([[[False]]]), + rotor_effective_velocities=wind_speed, + ) + + np.testing.assert_allclose(tilt_corrected_velocities, wind_speed) + + # Test multiple non-floating turbines + tilt_corrected_velocities = _rotor_velocity_tilt_correction( + turbine_type_map=turbine_type_map, + tilt_angle=5.0*np.ones((1, 1, N_TURBINES)), + ref_tilt_cp_ct=np.array([turbine.ref_tilt_cp_ct] * N_TURBINES), + pT=np.array([turbine.pT] * N_TURBINES), + tilt_interp=np.array([(turbine.turbine_type, turbine.fTilt_interp)] * N_TURBINES), + correct_cp_ct_for_tilt=np.array([[[False] * N_TURBINES]]), + rotor_effective_velocities=wind_speed_N_TURBINES, + ) + + np.testing.assert_allclose(tilt_corrected_velocities, wind_speed_N_TURBINES) + + # Test single floating turbine + tilt_corrected_velocities = _rotor_velocity_tilt_correction( + turbine_type_map=np.array([turbine_type_map[:, :, 0]]), + tilt_angle=5.0*np.ones((1, 1, 1)), + ref_tilt_cp_ct=np.array([turbine_floating.ref_tilt_cp_ct]), + pT=np.array([turbine_floating.pT]), + tilt_interp=np.array([(turbine_floating.turbine_type, turbine_floating.fTilt_interp)]), + correct_cp_ct_for_tilt=np.array([[[True]]]), + rotor_effective_velocities=wind_speed, + ) + + np.testing.assert_allclose(tilt_corrected_velocities, wind_speed) + + # Test multiple floating turbines + tilt_corrected_velocities = _rotor_velocity_tilt_correction( + turbine_type_map, + tilt_angle=5.0*np.ones((1, 1, N_TURBINES)), + ref_tilt_cp_ct=np.array([turbine_floating.ref_tilt_cp_ct] * N_TURBINES), + pT=np.array([turbine_floating.pT] * N_TURBINES), + tilt_interp=np.array( + [(turbine_floating.turbine_type, turbine_floating.fTilt_interp)] * N_TURBINES + ), + correct_cp_ct_for_tilt=np.array([[[True] * N_TURBINES]]), + rotor_effective_velocities=wind_speed_N_TURBINES, + ) + + np.testing.assert_allclose(tilt_corrected_velocities, wind_speed_N_TURBINES) + + +def test_compute_tilt_angles_for_floating_turbines(): + N_TURBINES = 4 + + wind_speed = 25.0 + rotor_effective_velocities = average_velocity(wind_speed * np.ones((1, 1, 1, 3, 3))) + rotor_effective_velocities_N_TURBINES = average_velocity( + wind_speed * np.ones((1, 1, N_TURBINES, 3, 3)) + ) + + turbine_floating_data = SampleInputs().turbine_floating + turbine_floating = Turbine.from_dict(turbine_floating_data) + turbine_type_map = np.array(N_TURBINES * [turbine_floating.turbine_type]) + turbine_type_map = turbine_type_map[None, None, :] + + # Single turbine + tilt = compute_tilt_angles_for_floating_turbines( + turbine_type_map=np.array([turbine_type_map[:, :, 0]]), + tilt_angle=5.0*np.ones((1, 1, 1)), + tilt_interp=np.array([(turbine_floating.turbine_type, turbine_floating.fTilt_interp)]), + rotor_effective_velocities=rotor_effective_velocities, + ) + + # calculate tilt again + truth_index = turbine_floating_data["floating_tilt_table"]["wind_speeds"].index(wind_speed) + tilt_truth = turbine_floating_data["floating_tilt_table"]["tilt"][truth_index] + np.testing.assert_allclose(tilt, tilt_truth) + + # Mulitple turbines + tilt_N_turbines = compute_tilt_angles_for_floating_turbines( + turbine_type_map=np.array(turbine_type_map), + tilt_angle=5.0*np.ones((1, 1, N_TURBINES)), + tilt_interp=np.array( + [(turbine_floating.turbine_type, turbine_floating.fTilt_interp)] * N_TURBINES + ), + rotor_effective_velocities=rotor_effective_velocities_N_TURBINES, + ) + + # calculate tilt again + truth_index = turbine_floating_data["floating_tilt_table"]["wind_speeds"].index(wind_speed) + tilt_truth = turbine_floating_data["floating_tilt_table"]["tilt"][truth_index] + np.testing.assert_allclose(tilt_N_turbines, [[[tilt_truth] * N_TURBINES]]) + def test_asdict(sample_inputs_fixture: SampleInputs): diff --git a/tests/type_dec_unit_test.py b/tests/type_dec_unit_test.py index c0f79a766..43bf5bc3a 100644 --- a/tests/type_dec_unit_test.py +++ b/tests/type_dec_unit_test.py @@ -33,6 +33,10 @@ class AttrsDemoClass(FromDictMixin): x: int = field(converter=int) y: float = field(converter=float, default=2.1) z: str = field(converter=str, default="z") + non_initd: float = field(init=False) + + def __attrs_post_init__(self): + self.non_initd = 1.1 liststr: List[str] = field( default=["qwerty", "asdf"], @@ -45,6 +49,13 @@ class AttrsDemoClass(FromDictMixin): ) +def test_as_dict(): + # Non-initialized attributes should not be exported + cls = AttrsDemoClass(w=0, x=1, liststr=["a", "b"]) + exported_dict = cls.as_dict() + assert "non_initd" not in exported_dict + + def test_FromDictMixin_defaults(): # Test that the defaults set in the class definition are actually used inputs = {"w": 0, "x": 1} diff --git a/tests/utilities_unit_test.py b/tests/utilities_unit_test.py index eeefc6f93..4ec7e9d3c 100644 --- a/tests/utilities_unit_test.py +++ b/tests/utilities_unit_test.py @@ -76,11 +76,13 @@ def test_wrap_360(): assert wrap_360(361.0) == 1.0 -def test_wind_deviation_from_west(): +def test_wind_delta(): assert wind_delta(270.0) == 0.0 assert wind_delta(280.0) == 10.0 assert wind_delta(360.0) == 90.0 assert wind_delta(180.0) == 270.0 + assert wind_delta(-10.0) == 80.0 + assert wind_delta(-100.0) == 350.0 def test_rotate_coordinates_rel_west(): @@ -89,7 +91,10 @@ def test_rotate_coordinates_rel_west(): # For 270, the coordinates should not change. wind_directions = np.array([270.0]) - x_rotated, y_rotated, z_rotated = rotate_coordinates_rel_west(wind_directions, coordinates) + x_rotated, y_rotated, z_rotated, _, _ = rotate_coordinates_rel_west( + wind_directions, + coordinates + ) np.testing.assert_array_equal( X_COORDS, x_rotated[0,0] ) np.testing.assert_array_equal( Y_COORDS, y_rotated[0,0] ) @@ -105,7 +110,10 @@ def test_rotate_coordinates_rel_west(): # NOTE: These adjustments are not general and will fail if the coordinates in # conftest change. wind_directions = np.array([360.0]) - x_rotated, y_rotated, z_rotated = rotate_coordinates_rel_west(wind_directions, coordinates) + x_rotated, y_rotated, z_rotated, _, _ = rotate_coordinates_rel_west( + wind_directions, + coordinates + ) np.testing.assert_almost_equal( Y_COORDS, x_rotated[0,0] - np.min(x_rotated[0,0])) np.testing.assert_almost_equal( X_COORDS, y_rotated[0,0] - np.min(y_rotated[0,0])) np.testing.assert_almost_equal( @@ -114,7 +122,10 @@ def test_rotate_coordinates_rel_west(): ) wind_directions = np.array([90.0]) - x_rotated, y_rotated, z_rotated = rotate_coordinates_rel_west(wind_directions, coordinates) + x_rotated, y_rotated, z_rotated, _, _ = rotate_coordinates_rel_west( + wind_directions, + coordinates + ) np.testing.assert_almost_equal( X_COORDS[-1:-4:-1], x_rotated[0,0] ) np.testing.assert_almost_equal( Y_COORDS, y_rotated[0,0] ) np.testing.assert_almost_equal( Z_COORDS, z_rotated[0,0] )